diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..7d093d5b --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,104 @@ + +name: "Release Stable Version" + +on: + workflow_dispatch: + inputs: + git_tag: + description: 'Git tag' + required: true + type: string + cu: + description: 'CUDA version' + required: true + type: string + default: "124" + python_minor: + description: 'Python minor version' + required: true + type: string + default: "11" + python_patch: + description: 'Python patch version' + required: true + type: string + default: "9" + + +jobs: + package_comfy_windows: + permissions: + contents: "write" + packages: "write" + pull-requests: "read" + runs-on: windows-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ inputs.git_tag }} + fetch-depth: 0 + persist-credentials: false + - uses: actions/cache/restore@v4 + id: cache + with: + path: | + cu${{ inputs.cu }}_python_deps.tar + update_comfyui_and_python_dependencies.bat + key: ${{ runner.os }}-build-cu${{ inputs.cu }}-${{ inputs.python_minor }} + - shell: bash + run: | + mv cu${{ inputs.cu }}_python_deps.tar ../ + mv update_comfyui_and_python_dependencies.bat ../ + cd .. + tar xf cu${{ inputs.cu }}_python_deps.tar + pwd + ls + + - shell: bash + run: | + cd .. + cp -r ComfyUI ComfyUI_copy + curl https://www.python.org/ftp/python/3.${{ inputs.python_minor }}.${{ inputs.python_patch }}/python-3.${{ inputs.python_minor }}.${{ inputs.python_patch }}-embed-amd64.zip -o python_embeded.zip + unzip python_embeded.zip -d python_embeded + cd python_embeded + echo ${{ env.MINOR_VERSION }} + echo 'import site' >> ./python3${{ inputs.python_minor }}._pth + curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py + ./python.exe get-pip.py + ./python.exe -s -m pip install ../cu${{ inputs.cu }}_python_deps/* + sed -i '1i../ComfyUI' ./python3${{ inputs.python_minor }}._pth + cd .. + + git clone https://github.com/comfyanonymous/taesd + cp taesd/*.pth ./ComfyUI_copy/models/vae_approx/ + + mkdir ComfyUI_windows_portable + mv python_embeded ComfyUI_windows_portable + mv ComfyUI_copy ComfyUI_windows_portable/ComfyUI + + cd ComfyUI_windows_portable + + mkdir update + cp -r ComfyUI/.ci/update_windows/* ./update/ + cp -r ComfyUI/.ci/windows_base_files/* ./ + cp ../update_comfyui_and_python_dependencies.bat ./update/ + + cd .. + + "C:\Program Files\7-Zip\7z.exe" a -t7z -m0=lzma2 -mx=8 -mfb=64 -md=32m -ms=on -mf=BCJ2 ComfyUI_windows_portable.7z ComfyUI_windows_portable + mv ComfyUI_windows_portable.7z ComfyUI/ComfyUI_windows_portable_nvidia.7z + + cd ComfyUI_windows_portable + python_embeded/python.exe -s ComfyUI/main.py --quick-test-for-ci --cpu + + ls + + - name: Upload binaries to release + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: ComfyUI_windows_portable_nvidia.7z + tag: ${{ inputs.git_tag }} + overwrite: true + prerelease: true + make_latest: false diff --git a/.github/workflows/stable-release.yml b/.github/workflows/stable-release.yml index 0bdd5a3b..9558e6e7 100644 --- a/.github/workflows/stable-release.yml +++ b/.github/workflows/stable-release.yml @@ -57,7 +57,7 @@ jobs: - shell: bash run: | cd .. - cp -r ComfyUI ComfyUI_copy + cp -r ${{ github.event.repository.name }} ComfyUI_copy curl https://www.python.org/ftp/python/3.${{ inputs.python_minor }}.${{ inputs.python_patch }}/python-3.${{ inputs.python_minor }}.${{ inputs.python_patch }}-embed-amd64.zip -o python_embeded.zip unzip python_embeded.zip -d python_embeded cd python_embeded @@ -86,7 +86,7 @@ jobs: cd .. "C:\Program Files\7-Zip\7z.exe" a -t7z -m0=lzma2 -mx=8 -mfb=64 -md=32m -ms=on -mf=BCJ2 ComfyUI_windows_portable.7z ComfyUI_windows_portable - mv ComfyUI_windows_portable.7z ComfyUI/ComfyUI_windows_portable_nvidia.7z + mv ComfyUI_windows_portable.7z ${{ github.event.repository.name }}/ComfyUI_windows_portable_nvidia.7z cd ComfyUI_windows_portable python_embeded/python.exe -s ComfyUI/main.py --quick-test-for-ci --cpu diff --git a/.github/workflows/test-workflows-windows-custom.yaml b/.github/workflows/test-workflows-windows-custom.yaml new file mode 100644 index 00000000..88bda079 --- /dev/null +++ b/.github/workflows/test-workflows-windows-custom.yaml @@ -0,0 +1,24 @@ +name: Use Custom Runner Target To Test ComfyUI Windows with Default Workflow +on: + workflow_dispatch: + inputs: + runs_on: + description: 'What runners to run this test on' + required: false + default: 'win' + +jobs: + test-action: + runs-on: ${{ inputs.runs_on }} + steps: + - name: Use ComfyUI GitHub Action + uses: comfy-org/comfy-action@monkeytest + with: + os: windows + cuda_version: 12.1 + workflow_filenames: 'default.json' + gcs_bucket_name: 'comfy-ci-results' + google_credentials: ${{ secrets.GCS_SERVICE_ACCOUNT_JSON }} + output_prefix: 'ComfyUI' + timeout: 50 + # api_endpoint: http://localhost:8080/upload-artifact diff --git a/.github/workflows/test-workflows-with-manual-input.yaml b/.github/workflows/test-workflows-with-manual-input.yaml new file mode 100644 index 00000000..3a5bdc81 --- /dev/null +++ b/.github/workflows/test-workflows-with-manual-input.yaml @@ -0,0 +1,91 @@ +name: Test ComfyUI Workflows Manual +on: + workflow_dispatch: + inputs: + os: + description: 'Operating System' + required: true + default: 'macos' + type: choice + options: + - macos + - linux + - win + runner_label: + description: 'Runner Label' + required: false + default: 'self-hosted' + type: string + python_version: + description: 'Python Version' + required: true + default: '3.9' + type: choice + options: + - '3.8' + - '3.9' + - '3.10' + - '3.11' + - '3.12' + - other + python_version_number: + description: 'Specify your own Python Version Number, e.g. 3.9.12' + required: false + default: '3.9' + type: string + cuda_version: + description: 'CUDA Version, currently only 12.1 is supported' + required: true + default: '12.1' + type: choice + options: + - '12.1' + torch_version: + description: 'Torch Version' + required: true + default: 'stable' + type: choice + options: + - stable + - preview + - other + torch_version_number: + description: 'Torch Version Number' + required: false + default: '2.3.1' + type: string + comfyui_flags: + description: 'ComfyUI Flags' + required: false + default: '--force-fp16' + type: string + workflow_filenames: + description: 'Workflow Filenames' + required: false + default: 'default.json,lora.json' + type: string + workflow_raw_json: + description: 'Workflow Raw JSON (Not yet supported)' + required: false + default: '' + type: string + + + + + +jobs: + test-default-workflow: + runs-on: ${{ inputs.runner_label }} + steps: + - name: Test Default Workflow + uses: comfy-org/comfy-action@main + with: + os: ${{ inputs.os }} + python_version: ${{ (contains(inputs.python_version, "other") && inputs.python_version_number != '' ) && inputs.python_version_number || inputs.python_version}} + cuda_version: ${{ inputs.cuda_version }} + torch_version: ${{ (contains(inputs.torch_version, "other") && inputs.torch_version_number != '' ) && inputs.torch_version_number || inputs.torch_version}} + workflow_filenames: "default.json,lora.json" + workflow_raw_json: ${{ inputs.workflow_raw_json }} + google_credentials: ${{ secrets.GCS_SERVICE_ACCOUNT_JSON }} + timeout: 50 \ No newline at end of file diff --git a/.github/workflows/update-frontend.yml b/.github/workflows/update-frontend.yml new file mode 100644 index 00000000..a45825ba --- /dev/null +++ b/.github/workflows/update-frontend.yml @@ -0,0 +1,57 @@ +name: Update Frontend Release + +on: + workflow_dispatch: + inputs: + version: + description: "Frontend version to update to (e.g., 1.0.0)" + required: true + type: string + +jobs: + update-frontend: + runs-on: ubuntu-latest + permissions: + contents: write + + steps: + - name: Checkout ComfyUI + uses: actions/checkout@v4 + - uses: actions/setup-python@v4 + with: + python-version: '3.10' + - name: Install requirements + run: | + python -m pip install --upgrade pip + pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu + pip install -r requirements.txt + pip install wait-for-it + # Frontend asset will be downloaded to ComfyUI/web_custom_versions/Comfy-Org_ComfyUI_frontend/{version} + - name: Start ComfyUI server + run: | + python main.py --cpu --front-end-version Comfy-Org/ComfyUI_frontend@${{ github.event.inputs.version }} 2>&1 | tee console_output.log & + wait-for-it --service 127.0.0.1:8188 -t 10 + - name: Configure Git + run: | + git config --global user.name "GitHub Action" + git config --global user.email "action@github.com" + # Replace existing frontend content with the new version and remove .js.map files + # See https://github.com/Comfy-Org/ComfyUI_frontend/issues/2145 for why we remove .js.map files + - name: Update frontend content + run: | + rm -rf web/ + cp -r web_custom_versions/Comfy-Org_ComfyUI_frontend/${{ github.event.inputs.version }} web/ + rm web/**/*.js.map + - name: Create Pull Request + uses: peter-evans/create-pull-request@v7 + with: + token: ${{ secrets.GITHUB_TOKEN }} + commit-message: "Update frontend to v${{ github.event.inputs.version }}" + title: "Frontend Update: v${{ github.event.inputs.version }}" + body: | + Automated PR to update frontend content to version ${{ github.event.inputs.version }} + + This PR was created automatically by the frontend update workflow. + branch: release-${{ github.event.inputs.version }} + base: master + labels: Frontend,dependencies diff --git a/.github/workflows/windows_release_package.yml b/.github/workflows/windows_release_package.yml index 11e724ba..5df0aff2 100644 --- a/.github/workflows/windows_release_package.yml +++ b/.github/workflows/windows_release_package.yml @@ -55,7 +55,7 @@ jobs: - shell: bash run: | cd .. - cp -r ComfyUI ComfyUI_copy + cp -r ComfyUI-Mirror ComfyUI_copy curl https://www.python.org/ftp/python/3.${{ inputs.python_minor }}.${{ inputs.python_patch }}/python-3.${{ inputs.python_minor }}.${{ inputs.python_patch }}-embed-amd64.zip -o python_embeded.zip unzip python_embeded.zip -d python_embeded cd python_embeded diff --git a/.github/workflows/workflows-matrix-test.yaml b/.github/workflows/workflows-matrix-test.yaml new file mode 100644 index 00000000..2d77d50f --- /dev/null +++ b/.github/workflows/workflows-matrix-test.yaml @@ -0,0 +1,105 @@ +name: Comfy CI Workflows Run +on: + push: + branches: + - master + paths-ignore: + - 'app/**' + - 'input/**' + - 'output/**' + - 'model/**' + - 'notebook/**' + - 'script_example/**' + - 'tests/**' + - 'tests-ui/**' + - '.github/**' + - '.ci/**' + - 'web/**' + workflow_dispatch: + +jobs: + test-stable: + strategy: + fail-fast: false + matrix: + os: [macos, linux, windows] + python_version: ["3.9", "3.10", "3.11", "3.12"] + cuda_version: ["12.1"] + torch_version: ["stable"] + include: + - os: macos + runner_label: [self-hosted, macOS, m2] + flags: "--use-pytorch-cross-attention" + - os: linux + runner_label: [self-hosted, Linux, t4] + flags: "" + - os: windows + runner_label: [self-hosted, win] + flags: "" + runs-on: ${{ matrix.runner_label }} + steps: + - name: Test Workflows + uses: comfy-org/comfy-action@main + with: + os: ${{ matrix.os }} + python_version: ${{ matrix.python_version }} + torch_version: ${{ matrix.torch_version }} + google_credentials: ${{ secrets.GCS_SERVICE_ACCOUNT_JSON }} + comfyui_flags: ${{ matrix.flags }} + output_prefix: 'ComfyUI' + timeout: 50 + use_prior_commit: 'true' + test-win-nightly: + strategy: + fail-fast: true + matrix: + os: [windows] + python_version: ["3.9", "3.10", "3.11", "3.12"] + cuda_version: ["12.1"] + torch_version: ["nightly"] + include: + - os: windows + runner_label: [self-hosted, win] + flags: "" + runs-on: ${{ matrix.runner_label }} + steps: + - name: Test Workflows + uses: comfy-org/comfy-action@main + with: + os: ${{ matrix.os }} + python_version: ${{ matrix.python_version }} + torch_version: ${{ matrix.torch_version }} + google_credentials: ${{ secrets.GCS_SERVICE_ACCOUNT_JSON }} + comfyui_flags: ${{ matrix.flags }} + output_prefix: 'ComfyUI' + timeout: 50 + use_prior_commit: 'true' + test-unix-nightly: + strategy: + fail-fast: false + matrix: + os: [macos, linux] + python_version: ["3.11"] + cuda_version: ["12.1"] + torch_version: ["nightly"] + include: + - os: macos + runner_label: [self-hosted, macOS, m2] + flags: "--use-pytorch-cross-attention" + - os: linux + runner_label: [self-hosted, Linux, t4] + flags: "" + + runs-on: ${{ matrix.runner_label }} + steps: + - name: Test Workflows + uses: comfy-org/comfy-action@main + with: + os: ${{ matrix.os }} + python_version: ${{ matrix.python_version }} + torch_version: ${{ matrix.torch_version }} + google_credentials: ${{ secrets.GCS_SERVICE_ACCOUNT_JSON }} + comfyui_flags: ${{ matrix.flags }} + output_prefix: 'ComfyUI' + timeout: 50 + use_prior_commit: 'true' diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..61e60736 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,10 @@ +{ + "workbench.colorCustomizations": { + "inlineChat.background": "#FFFFFF", + "inlineChatInput.background": "#FFFFFF", + "inlineChatInput.focusBorder": "#EFEFEF", + "inlineChat.regionHighlight": "#F0F0F0", + "titleBar.activeBackground": "#0D4A23", + "titleBar.activeForeground": "#F2FCF5" + } +} \ No newline at end of file diff --git a/web/assets/BaseViewTemplate-qOhVwbhN.js b/web/assets/BaseViewTemplate-qOhVwbhN.js deleted file mode 100644 index edf5ca11..00000000 --- a/web/assets/BaseViewTemplate-qOhVwbhN.js +++ /dev/null @@ -1,23 +0,0 @@ -import { d as defineComponent, o as openBlock, f as createElementBlock, J as renderSlot, T as normalizeClass } from "./index-BbhVsmQe.js"; -const _sfc_main = /* @__PURE__ */ defineComponent({ - __name: "BaseViewTemplate", - props: { - dark: { type: Boolean, default: false } - }, - setup(__props) { - const props = __props; - return (_ctx, _cache) => { - return openBlock(), createElementBlock("div", { - class: normalizeClass(["font-sans w-screen h-screen flex items-center justify-center pointer-events-auto overflow-auto", [ - props.dark ? "text-neutral-300 bg-neutral-900 dark-theme" : "text-neutral-900 bg-neutral-300" - ]]) - }, [ - renderSlot(_ctx.$slots, "default") - ], 2); - }; - } -}); -export { - _sfc_main as _ -}; -//# sourceMappingURL=BaseViewTemplate-qOhVwbhN.js.map diff --git a/web/assets/DownloadGitView-XzlZoglc.js b/web/assets/DownloadGitView-B-hPdn14.js similarity index 53% rename from web/assets/DownloadGitView-XzlZoglc.js rename to web/assets/DownloadGitView-B-hPdn14.js index 1f740682..6eb38d47 100644 --- a/web/assets/DownloadGitView-XzlZoglc.js +++ b/web/assets/DownloadGitView-B-hPdn14.js @@ -1,14 +1,15 @@ var __defProp = Object.defineProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); -import { d as defineComponent, o as openBlock, k as createBlock, M as withCtx, H as createBaseVNode, X as toDisplayString, N as createVNode, j as unref, l as script, bW as useRouter } from "./index-BbhVsmQe.js"; -import { _ as _sfc_main$1 } from "./BaseViewTemplate-qOhVwbhN.js"; -const _hoisted_1 = { class: "max-w-screen-sm flex flex-col gap-8 p-8 bg-[url('/assets/images/Git-Logo-White.svg')] bg-no-repeat bg-right-top bg-origin-padding" }; -const _hoisted_2 = { class: "mt-24 text-4xl font-bold text-red-500" }; -const _hoisted_3 = { class: "space-y-4" }; -const _hoisted_4 = { class: "text-xl" }; -const _hoisted_5 = { class: "text-xl" }; -const _hoisted_6 = { class: "text-m" }; -const _hoisted_7 = { class: "flex gap-4 flex-row-reverse" }; +import { a as defineComponent, o as openBlock, f as createElementBlock, z as createBaseVNode, a7 as toDisplayString, g as createVNode, y as unref, C as script, bX as useRouter } from "./index-DAOHvvrm.js"; +const _hoisted_1 = { class: "font-sans w-screen h-screen mx-0 grid place-items-center justify-center items-center text-neutral-900 bg-neutral-300 pointer-events-auto" }; +const _hoisted_2 = { class: "col-start-1 h-screen row-start-1 place-content-center mx-auto overflow-y-auto" }; +const _hoisted_3 = { class: "max-w-screen-sm flex flex-col gap-8 p-8 bg-[url('/assets/images/Git-Logo-White.svg')] bg-no-repeat bg-right-top bg-origin-padding" }; +const _hoisted_4 = { class: "mt-24 text-4xl font-bold text-red-500" }; +const _hoisted_5 = { class: "space-y-4" }; +const _hoisted_6 = { class: "text-xl" }; +const _hoisted_7 = { class: "text-xl" }; +const _hoisted_8 = { class: "text-m" }; +const _hoisted_9 = { class: "flex gap-4 flex-row-reverse" }; const _sfc_main = /* @__PURE__ */ defineComponent({ __name: "DownloadGitView", setup(__props) { @@ -21,16 +22,16 @@ const _sfc_main = /* @__PURE__ */ defineComponent({ router.push("install"); }, "skipGit"); return (_ctx, _cache) => { - return openBlock(), createBlock(_sfc_main$1, null, { - default: withCtx(() => [ - createBaseVNode("div", _hoisted_1, [ - createBaseVNode("h1", _hoisted_2, toDisplayString(_ctx.$t("downloadGit.title")), 1), - createBaseVNode("div", _hoisted_3, [ - createBaseVNode("p", _hoisted_4, toDisplayString(_ctx.$t("downloadGit.message")), 1), - createBaseVNode("p", _hoisted_5, toDisplayString(_ctx.$t("downloadGit.instructions")), 1), - createBaseVNode("p", _hoisted_6, toDisplayString(_ctx.$t("downloadGit.warning")), 1) + return openBlock(), createElementBlock("div", _hoisted_1, [ + createBaseVNode("div", _hoisted_2, [ + createBaseVNode("div", _hoisted_3, [ + createBaseVNode("h1", _hoisted_4, toDisplayString(_ctx.$t("downloadGit.title")), 1), + createBaseVNode("div", _hoisted_5, [ + createBaseVNode("p", _hoisted_6, toDisplayString(_ctx.$t("downloadGit.message")), 1), + createBaseVNode("p", _hoisted_7, toDisplayString(_ctx.$t("downloadGit.instructions")), 1), + createBaseVNode("p", _hoisted_8, toDisplayString(_ctx.$t("downloadGit.warning")), 1) ]), - createBaseVNode("div", _hoisted_7, [ + createBaseVNode("div", _hoisted_9, [ createVNode(unref(script), { label: _ctx.$t("downloadGit.gitWebsite"), icon: "pi pi-external-link", @@ -46,13 +47,12 @@ const _sfc_main = /* @__PURE__ */ defineComponent({ }, null, 8, ["label"]) ]) ]) - ]), - _: 1 - }); + ]) + ]); }; } }); export { _sfc_main as default }; -//# sourceMappingURL=DownloadGitView-XzlZoglc.js.map +//# sourceMappingURL=DownloadGitView-B-hPdn14.js.map diff --git a/web/assets/ExtensionPanel-C1yxn9cA.js b/web/assets/ExtensionPanel-BJ7mACDI.js similarity index 91% rename from web/assets/ExtensionPanel-C1yxn9cA.js rename to web/assets/ExtensionPanel-BJ7mACDI.js index 87cba620..799fde42 100644 --- a/web/assets/ExtensionPanel-C1yxn9cA.js +++ b/web/assets/ExtensionPanel-BJ7mACDI.js @@ -1,9 +1,8 @@ var __defProp = Object.defineProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); -import { d as defineComponent, ab as ref, cn as FilterMatchMode, cs as useExtensionStore, a as useSettingStore, m as onMounted, c as computed, o as openBlock, k as createBlock, M as withCtx, N as createVNode, co as SearchBox, j as unref, bZ as script, H as createBaseVNode, f as createElementBlock, E as renderList, X as toDisplayString, aE as createTextVNode, F as Fragment, l as script$1, I as createCommentVNode, aI as script$3, bO as script$4, c4 as script$5, cp as _sfc_main$1 } from "./index-BbhVsmQe.js"; -import { s as script$2, a as script$6 } from "./index-DIIs-Ju9.js"; -import "./index-BQjD3NM4.js"; -import "./index-VIBj2YvH.js"; +import { a as defineComponent, r as ref, cl as FilterMatchMode, cp as useExtensionStore, u as useSettingStore, aF as onMounted, p as computed, o as openBlock, v as createBlock, x as withCtx, g as createVNode, cm as SearchBox, y as unref, b_ as script, z as createBaseVNode, f as createElementBlock, P as renderList, a7 as toDisplayString, ax as createTextVNode, O as Fragment, C as script$1, h as createCommentVNode, aB as script$3, bw as script$4, c9 as script$5, cn as _sfc_main$1 } from "./index-DAOHvvrm.js"; +import { s as script$2, a as script$6 } from "./index-DqWMa5Pc.js"; +import "./index-CPVMarQJ.js"; const _hoisted_1 = { class: "flex justify-end" }; const _sfc_main = /* @__PURE__ */ defineComponent({ __name: "ExtensionPanel", @@ -180,4 +179,4 @@ const _sfc_main = /* @__PURE__ */ defineComponent({ export { _sfc_main as default }; -//# sourceMappingURL=ExtensionPanel-C1yxn9cA.js.map +//# sourceMappingURL=ExtensionPanel-BJ7mACDI.js.map diff --git a/web/assets/GraphView-CIRWBKTm.css b/web/assets/GraphView-CtisndV2.css similarity index 71% rename from web/assets/GraphView-CIRWBKTm.css rename to web/assets/GraphView-CtisndV2.css index 59d1b3d1..afbc581d 100644 --- a/web/assets/GraphView-CIRWBKTm.css +++ b/web/assets/GraphView-CtisndV2.css @@ -1,31 +1,90 @@ -.comfy-menu-hamburger[data-v-5661bed0] { - pointer-events: auto; - position: fixed; +.group-title-editor.node-title-editor[data-v-fe2de13a] { z-index: 9999; + padding: 0.25rem; +} +[data-v-fe2de13a] .editable-text { + width: 100%; + height: 100%; +} +[data-v-fe2de13a] .editable-text input { + width: 100%; + height: 100%; + /* Override the default font size */ + font-size: inherit; +} + +.side-bar-button-icon { + font-size: var(--sidebar-icon-size) !important; +} +.side-bar-button-selected .side-bar-button-icon { + font-size: var(--sidebar-icon-size) !important; + font-weight: bold; +} + +.side-bar-button[data-v-caa3ee9c] { + width: var(--sidebar-width); + height: var(--sidebar-width); + border-radius: 0; +} +.comfyui-body-left .side-bar-button.side-bar-button-selected[data-v-caa3ee9c], +.comfyui-body-left .side-bar-button.side-bar-button-selected[data-v-caa3ee9c]:hover { + border-left: 4px solid var(--p-button-text-primary-color); +} +.comfyui-body-right .side-bar-button.side-bar-button-selected[data-v-caa3ee9c], +.comfyui-body-right .side-bar-button.side-bar-button-selected[data-v-caa3ee9c]:hover { + border-right: 4px solid var(--p-button-text-primary-color); +} + +:root { + --sidebar-width: 64px; + --sidebar-icon-size: 1.5rem; +} +:root .small-sidebar { + --sidebar-width: 40px; + --sidebar-icon-size: 1rem; +} + +.side-tool-bar-container[data-v-7851c166] { + display: flex; + flex-direction: column; + align-items: center; + + pointer-events: auto; + + width: var(--sidebar-width); + height: 100%; + + background-color: var(--comfy-menu-secondary-bg); + color: var(--fg-color); + box-shadow: var(--bar-shadow); +} +.side-tool-bar-end[data-v-7851c166] { + align-self: flex-end; + margin-top: auto; } -[data-v-e50caa15] .p-splitter-gutter { +[data-v-95268c0b] .p-splitter-gutter { pointer-events: auto; } -[data-v-e50caa15] .p-splitter-gutter:hover,[data-v-e50caa15] .p-splitter-gutter[data-p-gutter-resizing='true'] { +[data-v-95268c0b] .p-splitter-gutter:hover,[data-v-95268c0b] .p-splitter-gutter[data-p-gutter-resizing='true'] { transition: background-color 0.2s ease 300ms; background-color: var(--p-primary-color); } -.side-bar-panel[data-v-e50caa15] { +.side-bar-panel[data-v-95268c0b] { background-color: var(--bg-color); pointer-events: auto; } -.bottom-panel[data-v-e50caa15] { +.bottom-panel[data-v-95268c0b] { background-color: var(--bg-color); pointer-events: auto; } -.splitter-overlay[data-v-e50caa15] { +.splitter-overlay[data-v-95268c0b] { pointer-events: none; border-style: none; background-color: transparent; } -.splitter-overlay-root[data-v-e50caa15] { +.splitter-overlay-root[data-v-95268c0b] { position: absolute; top: 0px; left: 0px; @@ -39,50 +98,7 @@ z-index: 999; } -.p-buttongroup-vertical[data-v-cf40dd39] { - display: flex; - flex-direction: column; - border-radius: var(--p-button-border-radius); - overflow: hidden; - border: 1px solid var(--p-panel-border-color); -} -.p-buttongroup-vertical .p-button[data-v-cf40dd39] { - margin: 0; - border-radius: 0; -} - -.node-tooltip[data-v-46859edf] { - background: var(--comfy-input-bg); - border-radius: 5px; - box-shadow: 0 0 5px rgba(0, 0, 0, 0.4); - color: var(--input-text); - font-family: sans-serif; - left: 0; - max-width: 30vw; - padding: 4px 8px; - position: absolute; - top: 0; - transform: translate(5px, calc(-100% - 5px)); - white-space: pre-wrap; - z-index: 99999; -} - -.group-title-editor.node-title-editor[data-v-12d3fd12] { - z-index: 9999; - padding: 0.25rem; -} -[data-v-12d3fd12] .editable-text { - width: 100%; - height: 100%; -} -[data-v-12d3fd12] .editable-text input { - width: 100%; - height: 100%; - /* Override the default font size */ - font-size: inherit; -} - -[data-v-5741c9ae] .highlight { +[data-v-d7cc0bce] .highlight { background-color: var(--p-primary-color); color: var(--p-primary-contrast-color); font-weight: bold; @@ -109,140 +125,124 @@ align-items: flex-start !important; } -.side-bar-button-icon { - font-size: var(--sidebar-icon-size) !important; -} -.side-bar-button-selected .side-bar-button-icon { - font-size: var(--sidebar-icon-size) !important; - font-weight: bold; +.node-tooltip[data-v-9ecc8adc] { + background: var(--comfy-input-bg); + border-radius: 5px; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.4); + color: var(--input-text); + font-family: sans-serif; + left: 0; + max-width: 30vw; + padding: 4px 8px; + position: absolute; + top: 0; + transform: translate(5px, calc(-100% - 5px)); + white-space: pre-wrap; + z-index: 99999; } -.side-bar-button[data-v-6ab4daa6] { - width: var(--sidebar-width); - height: var(--sidebar-width); +.p-buttongroup-vertical[data-v-94481f39] { + display: flex; + flex-direction: column; + border-radius: var(--p-button-border-radius); + overflow: hidden; + border: 1px solid var(--p-panel-border-color); +} +.p-buttongroup-vertical .p-button[data-v-94481f39] { + margin: 0; border-radius: 0; } -.comfyui-body-left .side-bar-button.side-bar-button-selected[data-v-6ab4daa6], -.comfyui-body-left .side-bar-button.side-bar-button-selected[data-v-6ab4daa6]:hover { - border-left: 4px solid var(--p-button-text-primary-color); + +.comfy-menu-hamburger[data-v-962c4073] { + pointer-events: auto; + position: fixed; + z-index: 9999; } -.comfyui-body-right .side-bar-button.side-bar-button-selected[data-v-6ab4daa6], -.comfyui-body-right .side-bar-button.side-bar-button-selected[data-v-6ab4daa6]:hover { - border-right: 4px solid var(--p-button-text-primary-color); + +.status-indicator[data-v-68bb6853] { + position: absolute; + font-weight: 700; + font-size: 1.5rem; + top: 50%; + left: 50%; + transform: translate(-50%, -50%) } -:root { - --sidebar-width: 64px; - --sidebar-icon-size: 1.5rem; +[data-v-dcfae321] .p-togglebutton::before { + display: none } -:root .small-sidebar { - --sidebar-width: 40px; - --sidebar-icon-size: 1rem; +[data-v-dcfae321] .p-togglebutton { + position: relative; + flex-shrink: 0; + border-radius: 0px; + background-color: transparent; + padding: 0px +} +[data-v-dcfae321] .p-togglebutton.p-togglebutton-checked { + border-bottom-width: 2px; + border-bottom-color: var(--p-button-text-primary-color) +} +[data-v-dcfae321] .p-togglebutton-checked .close-button,[data-v-dcfae321] .p-togglebutton:hover .close-button { + visibility: visible +} +[data-v-dcfae321] .p-togglebutton:hover .status-indicator { + display: none +} +[data-v-dcfae321] .p-togglebutton .close-button { + visibility: hidden } -.side-tool-bar-container[data-v-37d8d7b4] { - display: flex; - flex-direction: column; - align-items: center; - - pointer-events: auto; - - width: var(--sidebar-width); - height: 100%; - - background-color: var(--comfy-menu-secondary-bg); - color: var(--fg-color); - box-shadow: var(--bar-shadow); +.top-menubar[data-v-a2b12676] .p-menubar-item-link svg { + display: none; } -.side-tool-bar-end[data-v-37d8d7b4] { - align-self: flex-end; - margin-top: auto; +[data-v-a2b12676] .p-menubar-submenu.dropdown-direction-up { + top: auto; + bottom: 100%; + flex-direction: column-reverse; +} +.keybinding-tag[data-v-a2b12676] { + background: var(--p-content-hover-background); + border-color: var(--p-content-border-color); + border-style: solid; } -[data-v-b9328350] .p-inputtext { +[data-v-1163a5d2] .p-inputtext { border-top-left-radius: 0; border-bottom-left-radius: 0; } -.comfyui-queue-button[data-v-7f4f551b] .p-splitbutton-dropdown { +.comfyui-queue-button[data-v-d3897845] .p-splitbutton-dropdown { border-top-right-radius: 0; border-bottom-right-radius: 0; } -.actionbar[data-v-915e5456] { +.actionbar[data-v-6a1bcb8c] { pointer-events: all; position: fixed; z-index: 1000; } -.actionbar.is-docked[data-v-915e5456] { +.actionbar.is-docked[data-v-6a1bcb8c] { position: static; border-style: none; background-color: transparent; padding: 0px; } -.actionbar.is-dragging[data-v-915e5456] { +.actionbar.is-dragging[data-v-6a1bcb8c] { -webkit-user-select: none; -moz-user-select: none; user-select: none; } -[data-v-915e5456] .p-panel-content { +[data-v-6a1bcb8c] .p-panel-content { padding: 0.25rem; } -.is-docked[data-v-915e5456] .p-panel-content { +.is-docked[data-v-6a1bcb8c] .p-panel-content { padding: 0px; } -[data-v-915e5456] .p-panel-header { +[data-v-6a1bcb8c] .p-panel-header { display: none; } -.top-menubar[data-v-6fecd137] .p-menubar-item-link svg { - display: none; -} -[data-v-6fecd137] .p-menubar-submenu.dropdown-direction-up { - top: auto; - bottom: 100%; - flex-direction: column-reverse; -} -.keybinding-tag[data-v-6fecd137] { - background: var(--p-content-hover-background); - border-color: var(--p-content-border-color); - border-style: solid; -} - -.status-indicator[data-v-8d011a31] { - position: absolute; - font-weight: 700; - font-size: 1.5rem; - top: 50%; - left: 50%; - transform: translate(-50%, -50%) -} - -[data-v-d485c044] .p-togglebutton::before { - display: none -} -[data-v-d485c044] .p-togglebutton { - position: relative; - flex-shrink: 0; - border-radius: 0px; - background-color: transparent; - padding: 0px -} -[data-v-d485c044] .p-togglebutton.p-togglebutton-checked { - border-bottom-width: 2px; - border-bottom-color: var(--p-button-text-primary-color) -} -[data-v-d485c044] .p-togglebutton-checked .close-button,[data-v-d485c044] .p-togglebutton:hover .close-button { - visibility: visible -} -[data-v-d485c044] .p-togglebutton:hover .status-indicator { - display: none -} -[data-v-d485c044] .p-togglebutton .close-button { - visibility: hidden -} - -.comfyui-menu[data-v-878b63b8] { +.comfyui-menu[data-v-d792da31] { width: 100vw; background: var(--comfy-menu-bg); color: var(--fg-color); @@ -255,16 +255,16 @@ grid-column: 1/-1; max-height: 90vh; } -.comfyui-menu.dropzone[data-v-878b63b8] { +.comfyui-menu.dropzone[data-v-d792da31] { background: var(--p-highlight-background); } -.comfyui-menu.dropzone-active[data-v-878b63b8] { +.comfyui-menu.dropzone-active[data-v-d792da31] { background: var(--p-highlight-background-focus); } -[data-v-878b63b8] .p-menubar-item-label { +[data-v-d792da31] .p-menubar-item-label { line-height: revert; } -.comfyui-logo[data-v-878b63b8] { +.comfyui-logo[data-v-d792da31] { font-size: 1.2em; -webkit-user-select: none; -moz-user-select: none; diff --git a/web/assets/GraphView-BhIVbg_-.js b/web/assets/GraphView-DuMhaZbg.js similarity index 93% rename from web/assets/GraphView-BhIVbg_-.js rename to web/assets/GraphView-DuMhaZbg.js index 16be67b0..ffa4a28d 100644 --- a/web/assets/GraphView-BhIVbg_-.js +++ b/web/assets/GraphView-DuMhaZbg.js @@ -1,772 +1,614 @@ var __defProp = Object.defineProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); -import { d as defineComponent, u as useExecutionStore, c as computed, a as useSettingStore, b as useWorkflowStore, e as useTitle, o as openBlock, f as createElementBlock, g as useWorkspaceStore, w as watchEffect, h as app, r as resolveDirective, i as withDirectives, v as vShow, j as unref, k as createBlock, n as normalizeStyle, s as showNativeMenu, l as script$d, _ as _export_sfc, m as onMounted, p as onBeforeUnmount, B as BaseStyle, q as script$e, t as getWidth, x as getHeight, y as getOuterWidth, z as getOuterHeight, A as getVNodeProp, C as isArray, D as mergeProps, F as Fragment, E as renderList, G as resolveDynamicComponent, H as createBaseVNode, I as createCommentVNode, J as renderSlot, K as useSidebarTabStore, L as useBottomPanelStore, M as withCtx, N as createVNode, O as getAttribute, P as findSingle, Q as focus, R as equals, S as Ripple, T as normalizeClass, U as getOffset, V as script$f, W as script$g, X as toDisplayString, Y as script$h, Z as markRaw, $ as defineStore, a0 as shallowRef, a1 as useI18n, a2 as useCommandStore, a3 as LiteGraph, a4 as useColorPaletteStore, a5 as watch, a6 as useNodeDefStore, a7 as BadgePosition, a8 as LGraphBadge, a9 as _, aa as NodeBadgeMode, ab as ref, ac as useEventListener, ad as nextTick, ae as st, af as normalizeI18nKey, ag as LGraphGroup, ah as LGraphNode, ai as EditableText, aj as isNotEmpty, ak as UniqueComponentId, al as ZIndex, am as resolveFieldData, an as OverlayEventBus, ao as isEmpty, ap as addStyle, aq as relativePosition, ar as absolutePosition, as as ConnectedOverlayScrollHandler, at as isTouchDevice, au as findLastIndex, av as script$i, aw as script$j, ax as script$k, ay as script$l, az as script$m, aA as script$n, aB as resolveComponent, aC as Transition, aD as createSlots, aE as createTextVNode, aF as useNodeFrequencyStore, aG as useNodeBookmarkStore, aH as highlightQuery, aI as script$o, aJ as formatNumberWithSuffix, aK as NodeSourceType, aL as pushScopeId, aM as popScopeId, aN as NodePreview, aO as NodeSearchFilter, aP as script$p, aQ as SearchFilterChip, aR as useLitegraphService, aS as storeToRefs, aT as isRef, aU as toRaw, aV as LinkReleaseTriggerAction, aW as script$q, aX as useUserStore, aY as useDialogStore, aZ as SettingDialogHeader, a_ as SettingDialogContent, a$ as useKeybindingStore, b0 as Teleport, b1 as LinkMarkerShape, b2 as useModelToNodeStore, b3 as CanvasPointer, b4 as IS_CONTROL_WIDGET, b5 as updateControlWidgetLabel, b6 as useColorPaletteService, b7 as setStorageValue, b8 as api, b9 as usePragmaticDroppable, ba as LGraph, bb as LLink, bc as DragAndScale, bd as LGraphCanvas, be as ContextMenu, bf as ChangeTracker, bg as useWorkflowService, bh as ComfyNodeDefImpl, bi as ComfyModelDef, bj as script$r, bk as script$s, bl as script$t, bm as script$u, bn as script$v, bo as normalizeProps, bp as ToastEventBus, bq as setAttribute, br as TransitionGroup, bs as useToast, bt as useToastStore, bu as resolve, bv as nestedPosition, bw as script$w, bx as isPrintableCharacter, by as useQueueSettingsStore, bz as script$x, bA as useQueuePendingTaskCountStore, bB as useLocalStorage, bC as useDraggable, bD as watchDebounced, bE as inject, bF as useElementBounding, bG as lodashExports, bH as useEventBus, bI as script$z, bJ as guardReactiveProps, bK as useMenuItemStore, bL as usePragmaticDraggable, bM as withModifiers, bN as script$B, bO as script$C, bP as provide, bQ as script$D, bR as useDialogService, bS as LGraphEventMode, bT as useQueueStore, bU as i18n, bV as useModelStore } from "./index-BbhVsmQe.js"; -import { s as script$y } from "./index-BuE2B-Gw.js"; -import { s as script$A } from "./index-BQjD3NM4.js"; -import { u as useKeybindingService } from "./keybindingService-DohhteGb.js"; -import { u as useServerConfigStore } from "./serverConfigStore-CdBr6oWT.js"; -import "./index-VIBj2YvH.js"; -const DEFAULT_TITLE = "ComfyUI"; -const TITLE_SUFFIX = " - ComfyUI"; +import { d as defineStore, s as shallowRef, a as defineComponent, u as useSettingStore, r as ref, w as watch, L as LGraphGroup, b as app, c as LGraphNode, e as useEventListener, o as openBlock, f as createElementBlock, g as createVNode, E as EditableText, n as normalizeStyle, h as createCommentVNode, i as LiteGraph, _ as _export_sfc, B as BaseStyle, j as script$e, k as resolveComponent, m as mergeProps, l as renderSlot, p as computed, q as resolveDirective, t as withDirectives, v as createBlock, x as withCtx, y as unref, z as createBaseVNode, A as normalizeClass, C as script$f, D as useCommandStore, F as useDialogStore, S as SettingDialogHeader, G as SettingDialogContent, H as useI18n, I as useUserStore, J as onBeforeUnmount, K as resolveDynamicComponent, M as useWorkspaceStore, N as useKeybindingStore, O as Fragment, P as renderList, T as Teleport, Q as pushScopeId, R as popScopeId, U as script$g, V as getWidth, W as findSingle, X as getOuterHeight, Y as getOffset, Z as getOuterWidth, $ as getHeight, a0 as script$h, a1 as script$i, a2 as Ripple, a3 as getAttribute, a4 as focus, a5 as equals, a6 as useBottomPanelStore, a7 as toDisplayString, a8 as script$j, a9 as getVNodeProp, aa as isArray, ab as useSidebarTabStore, ac as vShow, ad as isNotEmpty, ae as UniqueComponentId, af as ZIndex, ag as resolveFieldData, ah as OverlayEventBus, ai as isEmpty, aj as addStyle, ak as relativePosition, al as absolutePosition, am as ConnectedOverlayScrollHandler, an as isTouchDevice, ao as findLastIndex, ap as script$k, aq as script$l, ar as script$m, as as script$n, at as script$o, au as script$p, av as Transition, aw as createSlots, ax as createTextVNode, ay as useNodeFrequencyStore, az as useNodeBookmarkStore, aA as highlightQuery, aB as script$q, aC as formatNumberWithSuffix, aD as NodeSourceType, aE as useNodeDefStore, aF as onMounted, aG as NodePreview, aH as NodeSearchFilter, aI as script$r, aJ as SearchFilterChip, aK as nextTick, aL as storeToRefs, aM as watchEffect, aN as isRef, aO as toRaw, aP as LinkReleaseTriggerAction, aQ as st, aR as normalizeI18nKey, aS as useColorPaletteStore, aT as BadgePosition, aU as LGraphBadge, aV as _, aW as NodeBadgeMode, aX as markRaw, aY as LinkMarkerShape, aZ as useModelToNodeStore, a_ as CanvasPointer, a$ as IS_CONTROL_WIDGET, b0 as updateControlWidgetLabel, b1 as useColorPaletteService, b2 as useWorkflowStore, b3 as setStorageValue, b4 as api, b5 as usePragmaticDroppable, b6 as ComfyNodeDefImpl, b7 as ComfyModelDef, b8 as LGraph, b9 as LLink, ba as DragAndScale, bb as LGraphCanvas, bc as ContextMenu, bd as ChangeTracker, be as useWorkflowService, bf as showNativeMenu, bg as script$s, bh as script$t, bi as script$u, bj as script$v, bk as script$w, bl as normalizeProps, bm as ToastEventBus, bn as setAttribute, bo as TransitionGroup, bp as useToast, bq as useToastStore, br as useExecutionStore, bs as useTitle, bt as usePragmaticDraggable, bu as withModifiers, bv as script$x, bw as script$y, bx as resolve, by as script$z, bz as script$A, bA as isPrintableCharacter, bB as guardReactiveProps, bC as useMenuItemStore, bD as script$D, bE as nestedPosition, bF as useQueueSettingsStore, bG as script$E, bH as useQueuePendingTaskCountStore, bI as useLocalStorage, bJ as useDraggable, bK as watchDebounced, bL as inject, bM as useElementBounding, bN as lodashExports, bO as useEventBus, bP as provide, bQ as script$F, bR as useDialogService, bS as LGraphEventMode, bT as useQueueStore, bU as KeyComboImpl, bV as i18n, bW as useModelStore } from "./index-DAOHvvrm.js"; +import { s as script$B, a as script$C } from "./index-CPVMarQJ.js"; +import { u as useServerConfigStore } from "./serverConfigStore-DCuqETVV.js"; +const useTitleEditorStore = defineStore("titleEditor", () => { + const titleEditorTarget = shallowRef(null); + return { + titleEditorTarget + }; +}); +const useCanvasStore = defineStore("canvas", () => { + const canvas = shallowRef(null); + return { + canvas + }; +}); const _sfc_main$t = /* @__PURE__ */ defineComponent({ - __name: "BrowserTabTitle", + __name: "TitleEditor", setup(__props) { - const executionStore = useExecutionStore(); - const executionText = computed( - () => executionStore.isIdle ? "" : `[${executionStore.executionProgress}%]` - ); const settingStore = useSettingStore(); - const betaMenuEnabled = computed( - () => settingStore.get("Comfy.UseNewMenu") !== "Disabled" - ); - const workflowStore = useWorkflowStore(); - const isUnsavedText = computed( - () => workflowStore.activeWorkflow?.isModified || !workflowStore.activeWorkflow?.isPersisted ? " *" : "" - ); - const workflowNameText = computed(() => { - const workflowName = workflowStore.activeWorkflow?.filename; - return workflowName ? isUnsavedText.value + workflowName + TITLE_SUFFIX : DEFAULT_TITLE; + const showInput = ref(false); + const editedTitle = ref(""); + const inputStyle = ref({ + position: "fixed", + left: "0px", + top: "0px", + width: "200px", + height: "20px", + fontSize: "12px" }); - const nodeExecutionTitle = computed( - () => executionStore.executingNode && executionStore.executingNodeProgress ? `${executionText.value}[${executionStore.executingNodeProgress}%] ${executionStore.executingNode.type}` : "" - ); - const workflowTitle = computed( - () => executionText.value + (betaMenuEnabled.value ? workflowNameText.value : DEFAULT_TITLE) - ); - const title = computed(() => nodeExecutionTitle.value || workflowTitle.value); - useTitle(title); - return (_ctx, _cache) => { - return openBlock(), createElementBlock("div"); - }; - } -}); -const _sfc_main$s = /* @__PURE__ */ defineComponent({ - __name: "MenuHamburger", - setup(__props) { - const workspaceState = useWorkspaceStore(); - const settingStore = useSettingStore(); - const exitFocusMode = /* @__PURE__ */ __name(() => { - workspaceState.focusMode = false; - }, "exitFocusMode"); - watchEffect(() => { - if (settingStore.get("Comfy.UseNewMenu") !== "Disabled") { - return; + const titleEditorStore = useTitleEditorStore(); + const canvasStore = useCanvasStore(); + const previousCanvasDraggable = ref(true); + const onEdit = /* @__PURE__ */ __name((newValue) => { + if (titleEditorStore.titleEditorTarget && newValue.trim() !== "") { + titleEditorStore.titleEditorTarget.title = newValue.trim(); + app.graph.setDirtyCanvas(true, true); } - if (workspaceState.focusMode) { - app.ui.menuContainer.style.display = "none"; - } else { - app.ui.menuContainer.style.display = "block"; + showInput.value = false; + titleEditorStore.titleEditorTarget = null; + canvasStore.canvas.allow_dragcanvas = previousCanvasDraggable.value; + }, "onEdit"); + watch( + () => titleEditorStore.titleEditorTarget, + (target) => { + if (target === null) { + return; + } + editedTitle.value = target.title; + showInput.value = true; + previousCanvasDraggable.value = canvasStore.canvas.allow_dragcanvas; + canvasStore.canvas.allow_dragcanvas = false; + if (target instanceof LGraphGroup) { + const group = target; + const [x, y] = group.pos; + const [w, h] = group.size; + const [left, top] = app.canvasPosToClientPos([x, y]); + inputStyle.value.left = `${left}px`; + inputStyle.value.top = `${top}px`; + const width = w * app.canvas.ds.scale; + const height = group.titleHeight * app.canvas.ds.scale; + inputStyle.value.width = `${width}px`; + inputStyle.value.height = `${height}px`; + const fontSize = group.font_size * app.canvas.ds.scale; + inputStyle.value.fontSize = `${fontSize}px`; + } else if (target instanceof LGraphNode) { + const node = target; + const [x, y] = node.getBounding(); + const canvasWidth = node.width; + const canvasHeight = LiteGraph.NODE_TITLE_HEIGHT; + const [left, top] = app.canvasPosToClientPos([x, y]); + inputStyle.value.left = `${left}px`; + inputStyle.value.top = `${top}px`; + const width = canvasWidth * app.canvas.ds.scale; + const height = canvasHeight * app.canvas.ds.scale; + inputStyle.value.width = `${width}px`; + inputStyle.value.height = `${height}px`; + const fontSize = 12 * app.canvas.ds.scale; + inputStyle.value.fontSize = `${fontSize}px`; + } } - }); - const menuSetting = computed(() => settingStore.get("Comfy.UseNewMenu")); - const positionCSS = computed( - () => ( - // 'Bottom' menuSetting shows the hamburger button in the bottom right corner - // 'Disabled', 'Top' menuSetting shows the hamburger button in the top right corner - menuSetting.value === "Bottom" ? { bottom: "0px", right: "0px" } : { top: "0px", right: "0px" } - ) ); - return (_ctx, _cache) => { - const _directive_tooltip = resolveDirective("tooltip"); - return withDirectives((openBlock(), createBlock(unref(script$d), { - class: "comfy-menu-hamburger", - style: normalizeStyle(positionCSS.value), - icon: "pi pi-bars", - severity: "secondary", - text: "", - size: "large", - onClick: exitFocusMode, - onContextmenu: unref(showNativeMenu) - }, null, 8, ["style", "onContextmenu"])), [ - [vShow, unref(workspaceState).focusMode], - [_directive_tooltip, { value: _ctx.$t("menu.showMenu"), showDelay: 300 }] - ]); - }; - } -}); -const MenuHamburger = /* @__PURE__ */ _export_sfc(_sfc_main$s, [["__scopeId", "data-v-5661bed0"]]); -const _sfc_main$r = /* @__PURE__ */ defineComponent({ - __name: "UnloadWindowConfirmDialog", - setup(__props) { - const settingStore = useSettingStore(); - const handleBeforeUnload = /* @__PURE__ */ __name((event) => { - if (settingStore.get("Comfy.Window.UnloadConfirmation")) { - event.preventDefault(); - return true; + const canvasEventHandler = /* @__PURE__ */ __name((event) => { + if (event.detail.subType === "group-double-click") { + if (!settingStore.get("Comfy.Group.DoubleClickTitleToEdit")) { + return; + } + const group = event.detail.group; + const [x, y] = group.pos; + const e = event.detail.originalEvent; + const relativeY = e.canvasY - y; + if (relativeY <= group.titleHeight) { + titleEditorStore.titleEditorTarget = group; + } + } else if (event.detail.subType === "node-double-click") { + if (!settingStore.get("Comfy.Node.DoubleClickTitleToEdit")) { + return; + } + const node = event.detail.node; + const [x, y] = node.pos; + const e = event.detail.originalEvent; + const relativeY = e.canvasY - y; + if (relativeY <= 0) { + titleEditorStore.titleEditorTarget = node; + } } - return void 0; - }, "handleBeforeUnload"); - onMounted(() => { - window.addEventListener("beforeunload", handleBeforeUnload); - }); - onBeforeUnmount(() => { - window.removeEventListener("beforeunload", handleBeforeUnload); - }); + }, "canvasEventHandler"); + useEventListener(document, "litegraph:canvas", canvasEventHandler); return (_ctx, _cache) => { - return openBlock(), createElementBlock("div"); + return showInput.value ? (openBlock(), createElementBlock("div", { + key: 0, + class: "group-title-editor node-title-editor", + style: normalizeStyle(inputStyle.value) + }, [ + createVNode(EditableText, { + isEditing: showInput.value, + modelValue: editedTitle.value, + onEdit + }, null, 8, ["isEditing", "modelValue"]) + ], 4)) : createCommentVNode("", true); }; } }); -var theme$7 = /* @__PURE__ */ __name(function theme(_ref) { +const TitleEditor = /* @__PURE__ */ _export_sfc(_sfc_main$t, [["__scopeId", "data-v-fe2de13a"]]); +var theme$8 = /* @__PURE__ */ __name(function theme(_ref) { var dt = _ref.dt; - return "\n.p-splitter {\n display: flex;\n flex-wrap: nowrap;\n border: 1px solid ".concat(dt("splitter.border.color"), ";\n background: ").concat(dt("splitter.background"), ";\n border-radius: ").concat(dt("border.radius.md"), ";\n color: ").concat(dt("splitter.color"), ";\n}\n\n.p-splitter-vertical {\n flex-direction: column;\n}\n\n.p-splitter-gutter {\n flex-grow: 0;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1;\n background: ").concat(dt("splitter.gutter.background"), ";\n}\n\n.p-splitter-gutter-handle {\n border-radius: ").concat(dt("splitter.handle.border.radius"), ";\n background: ").concat(dt("splitter.handle.background"), ";\n transition: outline-color ").concat(dt("splitter.transition.duration"), ", box-shadow ").concat(dt("splitter.transition.duration"), ";\n outline-color: transparent;\n}\n\n.p-splitter-gutter-handle:focus-visible {\n box-shadow: ").concat(dt("splitter.handle.focus.ring.shadow"), ";\n outline: ").concat(dt("splitter.handle.focus.ring.width"), " ").concat(dt("splitter.handle.focus.ring.style"), " ").concat(dt("splitter.handle.focus.ring.color"), ";\n outline-offset: ").concat(dt("splitter.handle.focus.ring.offset"), ";\n}\n\n.p-splitter-horizontal.p-splitter-resizing {\n cursor: col-resize;\n user-select: none;\n}\n\n.p-splitter-vertical.p-splitter-resizing {\n cursor: row-resize;\n user-select: none;\n}\n\n.p-splitter-horizontal > .p-splitter-gutter > .p-splitter-gutter-handle {\n height: ").concat(dt("splitter.handle.size"), ";\n width: 100%;\n}\n\n.p-splitter-vertical > .p-splitter-gutter > .p-splitter-gutter-handle {\n width: ").concat(dt("splitter.handle.size"), ";\n height: 100%;\n}\n\n.p-splitter-horizontal > .p-splitter-gutter {\n cursor: col-resize;\n}\n\n.p-splitter-vertical > .p-splitter-gutter {\n cursor: row-resize;\n}\n\n.p-splitterpanel {\n flex-grow: 1;\n overflow: hidden;\n}\n\n.p-splitterpanel-nested {\n display: flex;\n}\n\n.p-splitterpanel .p-splitter {\n flex-grow: 1;\n border: 0 none;\n}\n"); + return "\n.p-overlaybadge {\n position: relative;\n}\n\n.p-overlaybadge .p-badge {\n position: absolute;\n top: 0;\n right: 0;\n transform: translate(50%, -50%);\n transform-origin: 100% 0;\n margin: 0;\n outline-width: ".concat(dt("overlaybadge.outline.width"), ";\n outline-style: solid;\n outline-color: ").concat(dt("overlaybadge.outline.color"), ";\n}\n"); }, "theme"); -var classes$a = { - root: /* @__PURE__ */ __name(function root(_ref2) { - var props = _ref2.props; - return ["p-splitter p-component", "p-splitter-" + props.layout]; - }, "root"), - gutter: "p-splitter-gutter", - gutterHandle: "p-splitter-gutter-handle" -}; -var inlineStyles$4 = { - root: /* @__PURE__ */ __name(function root2(_ref3) { - var props = _ref3.props; - return [{ - display: "flex", - "flex-wrap": "nowrap" - }, props.layout === "vertical" ? { - "flex-direction": "column" - } : ""]; - }, "root") +var classes$b = { + root: "p-overlaybadge" }; -var SplitterStyle = BaseStyle.extend({ - name: "splitter", - theme: theme$7, - classes: classes$a, - inlineStyles: inlineStyles$4 +var OverlayBadgeStyle = BaseStyle.extend({ + name: "overlaybadge", + theme: theme$8, + classes: classes$b }); -var script$1$a = { - name: "BaseSplitter", +var script$1$b = { + name: "OverlayBadge", "extends": script$e, - props: { - layout: { - type: String, - "default": "horizontal" - }, - gutterSize: { - type: Number, - "default": 4 - }, - stateKey: { - type: String, - "default": null - }, - stateStorage: { - type: String, - "default": "session" - }, - step: { - type: Number, - "default": 5 - } - }, - style: SplitterStyle, + style: OverlayBadgeStyle, provide: /* @__PURE__ */ __name(function provide2() { return { - $pcSplitter: this, + $pcOverlayBadge: this, $parentInstance: this }; }, "provide") }; -function _toConsumableArray$2(r) { - return _arrayWithoutHoles$2(r) || _iterableToArray$2(r) || _unsupportedIterableToArray$2(r) || _nonIterableSpread$2(); -} -__name(_toConsumableArray$2, "_toConsumableArray$2"); -function _nonIterableSpread$2() { - throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); -} -__name(_nonIterableSpread$2, "_nonIterableSpread$2"); -function _unsupportedIterableToArray$2(r, a) { - if (r) { - if ("string" == typeof r) return _arrayLikeToArray$2(r, a); - var t = {}.toString.call(r).slice(8, -1); - return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$2(r, a) : void 0; +var script$d = { + name: "OverlayBadge", + "extends": script$1$b, + inheritAttrs: false, + components: { + Badge: script$e } +}; +function render$j(_ctx, _cache, $props, $setup, $data, $options) { + var _component_Badge = resolveComponent("Badge"); + return openBlock(), createElementBlock("div", mergeProps({ + "class": _ctx.cx("root") + }, _ctx.ptmi("root")), [renderSlot(_ctx.$slots, "default"), createVNode(_component_Badge, mergeProps(_ctx.$props, { + pt: _ctx.ptm("pcBadge") + }), null, 16, ["pt"])], 16); } -__name(_unsupportedIterableToArray$2, "_unsupportedIterableToArray$2"); -function _iterableToArray$2(r) { - if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); -} -__name(_iterableToArray$2, "_iterableToArray$2"); -function _arrayWithoutHoles$2(r) { - if (Array.isArray(r)) return _arrayLikeToArray$2(r); -} -__name(_arrayWithoutHoles$2, "_arrayWithoutHoles$2"); -function _arrayLikeToArray$2(r, a) { - (null == a || a > r.length) && (a = r.length); - for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; - return n; -} -__name(_arrayLikeToArray$2, "_arrayLikeToArray$2"); -var script$c = { - name: "Splitter", - "extends": script$1$a, - inheritAttrs: false, - emits: ["resizestart", "resizeend", "resize"], - dragging: false, - mouseMoveListener: null, - mouseUpListener: null, - touchMoveListener: null, - touchEndListener: null, - size: null, - gutterElement: null, - startPos: null, - prevPanelElement: null, - nextPanelElement: null, - nextPanelSize: null, - prevPanelSize: null, - panelSizes: null, - prevPanelIndex: null, - timer: null, - data: /* @__PURE__ */ __name(function data() { - return { - prevSize: null - }; - }, "data"), - mounted: /* @__PURE__ */ __name(function mounted() { - var _this = this; - if (this.panels && this.panels.length) { - var initialized = false; - if (this.isStateful()) { - initialized = this.restoreState(); - } - if (!initialized) { - var children = _toConsumableArray$2(this.$el.children).filter(function(child) { - return child.getAttribute("data-pc-name") === "splitterpanel"; - }); - var _panelSizes = []; - this.panels.map(function(panel, i) { - var panelInitialSize = panel.props && panel.props.size ? panel.props.size : null; - var panelSize = panelInitialSize || 100 / _this.panels.length; - _panelSizes[i] = panelSize; - children[i].style.flexBasis = "calc(" + panelSize + "% - " + (_this.panels.length - 1) * _this.gutterSize + "px)"; - }); - this.panelSizes = _panelSizes; - this.prevSize = parseFloat(_panelSizes[0]).toFixed(4); - } +__name(render$j, "render$j"); +script$d.render = render$j; +const _sfc_main$s = /* @__PURE__ */ defineComponent({ + __name: "SidebarIcon", + props: { + icon: String, + selected: Boolean, + tooltip: { + type: String, + default: "" + }, + class: { + type: String, + default: "" + }, + iconBadge: { + type: [String, Function], + default: "" } - }, "mounted"), - beforeUnmount: /* @__PURE__ */ __name(function beforeUnmount() { - this.clear(); - this.unbindMouseListeners(); - }, "beforeUnmount"), - methods: { - isSplitterPanel: /* @__PURE__ */ __name(function isSplitterPanel(child) { - return child.type.name === "SplitterPanel"; - }, "isSplitterPanel"), - onResizeStart: /* @__PURE__ */ __name(function onResizeStart(event, index, isKeyDown) { - this.gutterElement = event.currentTarget || event.target.parentElement; - this.size = this.horizontal ? getWidth(this.$el) : getHeight(this.$el); - if (!isKeyDown) { - this.dragging = true; - this.startPos = this.layout === "horizontal" ? event.pageX || event.changedTouches[0].pageX : event.pageY || event.changedTouches[0].pageY; - } - this.prevPanelElement = this.gutterElement.previousElementSibling; - this.nextPanelElement = this.gutterElement.nextElementSibling; - if (isKeyDown) { - this.prevPanelSize = this.horizontal ? getOuterWidth(this.prevPanelElement, true) : getOuterHeight(this.prevPanelElement, true); - this.nextPanelSize = this.horizontal ? getOuterWidth(this.nextPanelElement, true) : getOuterHeight(this.nextPanelElement, true); - } else { - this.prevPanelSize = 100 * (this.horizontal ? getOuterWidth(this.prevPanelElement, true) : getOuterHeight(this.prevPanelElement, true)) / this.size; - this.nextPanelSize = 100 * (this.horizontal ? getOuterWidth(this.nextPanelElement, true) : getOuterHeight(this.nextPanelElement, true)) / this.size; - } - this.prevPanelIndex = index; - this.$emit("resizestart", { - originalEvent: event, - sizes: this.panelSizes - }); - this.$refs.gutter[index].setAttribute("data-p-gutter-resizing", true); - this.$el.setAttribute("data-p-resizing", true); - }, "onResizeStart"), - onResize: /* @__PURE__ */ __name(function onResize(event, step, isKeyDown) { - var newPos, newPrevPanelSize, newNextPanelSize; - if (isKeyDown) { - if (this.horizontal) { - newPrevPanelSize = 100 * (this.prevPanelSize + step) / this.size; - newNextPanelSize = 100 * (this.nextPanelSize - step) / this.size; - } else { - newPrevPanelSize = 100 * (this.prevPanelSize - step) / this.size; - newNextPanelSize = 100 * (this.nextPanelSize + step) / this.size; - } - } else { - if (this.horizontal) newPos = event.pageX * 100 / this.size - this.startPos * 100 / this.size; - else newPos = event.pageY * 100 / this.size - this.startPos * 100 / this.size; - newPrevPanelSize = this.prevPanelSize + newPos; - newNextPanelSize = this.nextPanelSize - newPos; - } - if (this.validateResize(newPrevPanelSize, newNextPanelSize)) { - this.prevPanelElement.style.flexBasis = "calc(" + newPrevPanelSize + "% - " + (this.panels.length - 1) * this.gutterSize + "px)"; - this.nextPanelElement.style.flexBasis = "calc(" + newNextPanelSize + "% - " + (this.panels.length - 1) * this.gutterSize + "px)"; - this.panelSizes[this.prevPanelIndex] = newPrevPanelSize; - this.panelSizes[this.prevPanelIndex + 1] = newNextPanelSize; - this.prevSize = parseFloat(newPrevPanelSize).toFixed(4); - } - this.$emit("resize", { - originalEvent: event, - sizes: this.panelSizes - }); - }, "onResize"), - onResizeEnd: /* @__PURE__ */ __name(function onResizeEnd(event) { - if (this.isStateful()) { - this.saveState(); - } - this.$emit("resizeend", { - originalEvent: event, - sizes: this.panelSizes - }); - this.$refs.gutter.forEach(function(gutter) { - return gutter.setAttribute("data-p-gutter-resizing", false); - }); - this.$el.setAttribute("data-p-resizing", false); - this.clear(); - }, "onResizeEnd"), - repeat: /* @__PURE__ */ __name(function repeat(event, index, step) { - this.onResizeStart(event, index, true); - this.onResize(event, step, true); - }, "repeat"), - setTimer: /* @__PURE__ */ __name(function setTimer(event, index, step) { - var _this2 = this; - if (!this.timer) { - this.timer = setInterval(function() { - _this2.repeat(event, index, step); - }, 40); - } - }, "setTimer"), - clearTimer: /* @__PURE__ */ __name(function clearTimer() { - if (this.timer) { - clearInterval(this.timer); - this.timer = null; - } - }, "clearTimer"), - onGutterKeyUp: /* @__PURE__ */ __name(function onGutterKeyUp() { - this.clearTimer(); - this.onResizeEnd(); - }, "onGutterKeyUp"), - onGutterKeyDown: /* @__PURE__ */ __name(function onGutterKeyDown(event, index) { - switch (event.code) { - case "ArrowLeft": { - if (this.layout === "horizontal") { - this.setTimer(event, index, this.step * -1); - } - event.preventDefault(); - break; - } - case "ArrowRight": { - if (this.layout === "horizontal") { - this.setTimer(event, index, this.step); - } - event.preventDefault(); - break; - } - case "ArrowDown": { - if (this.layout === "vertical") { - this.setTimer(event, index, this.step * -1); - } - event.preventDefault(); - break; - } - case "ArrowUp": { - if (this.layout === "vertical") { - this.setTimer(event, index, this.step); + }, + emits: ["click"], + setup(__props, { emit: __emit }) { + const props = __props; + const emit = __emit; + const overlayValue = computed( + () => typeof props.iconBadge === "function" ? props.iconBadge() || "" : props.iconBadge + ); + const shouldShowBadge = computed(() => !!overlayValue.value); + return (_ctx, _cache) => { + const _directive_tooltip = resolveDirective("tooltip"); + return withDirectives((openBlock(), createBlock(unref(script$f), { + class: normalizeClass(props.class), + text: "", + pt: { + root: { + class: `side-bar-button ${props.selected ? "p-button-primary side-bar-button-selected" : "p-button-secondary"}`, + "aria-label": props.tooltip } - event.preventDefault(); - break; - } - } - }, "onGutterKeyDown"), - onGutterMouseDown: /* @__PURE__ */ __name(function onGutterMouseDown(event, index) { - this.onResizeStart(event, index); - this.bindMouseListeners(); - }, "onGutterMouseDown"), - onGutterTouchStart: /* @__PURE__ */ __name(function onGutterTouchStart(event, index) { - this.onResizeStart(event, index); - this.bindTouchListeners(); - event.preventDefault(); - }, "onGutterTouchStart"), - onGutterTouchMove: /* @__PURE__ */ __name(function onGutterTouchMove(event) { - this.onResize(event); - event.preventDefault(); - }, "onGutterTouchMove"), - onGutterTouchEnd: /* @__PURE__ */ __name(function onGutterTouchEnd(event) { - this.onResizeEnd(event); - this.unbindTouchListeners(); - event.preventDefault(); - }, "onGutterTouchEnd"), - bindMouseListeners: /* @__PURE__ */ __name(function bindMouseListeners() { - var _this3 = this; - if (!this.mouseMoveListener) { - this.mouseMoveListener = function(event) { - return _this3.onResize(event); - }; - document.addEventListener("mousemove", this.mouseMoveListener); - } - if (!this.mouseUpListener) { - this.mouseUpListener = function(event) { - _this3.onResizeEnd(event); - _this3.unbindMouseListeners(); - }; - document.addEventListener("mouseup", this.mouseUpListener); - } - }, "bindMouseListeners"), - bindTouchListeners: /* @__PURE__ */ __name(function bindTouchListeners() { - var _this4 = this; - if (!this.touchMoveListener) { - this.touchMoveListener = function(event) { - return _this4.onResize(event.changedTouches[0]); - }; - document.addEventListener("touchmove", this.touchMoveListener); - } - if (!this.touchEndListener) { - this.touchEndListener = function(event) { - _this4.resizeEnd(event); - _this4.unbindTouchListeners(); - }; - document.addEventListener("touchend", this.touchEndListener); - } - }, "bindTouchListeners"), - validateResize: /* @__PURE__ */ __name(function validateResize(newPrevPanelSize, newNextPanelSize) { - if (newPrevPanelSize > 100 || newPrevPanelSize < 0) return false; - if (newNextPanelSize > 100 || newNextPanelSize < 0) return false; - var prevPanelMinSize = getVNodeProp(this.panels[this.prevPanelIndex], "minSize"); - if (this.panels[this.prevPanelIndex].props && prevPanelMinSize && prevPanelMinSize > newPrevPanelSize) { - return false; - } - var newPanelMinSize = getVNodeProp(this.panels[this.prevPanelIndex + 1], "minSize"); - if (this.panels[this.prevPanelIndex + 1].props && newPanelMinSize && newPanelMinSize > newNextPanelSize) { - return false; - } - return true; - }, "validateResize"), - unbindMouseListeners: /* @__PURE__ */ __name(function unbindMouseListeners() { - if (this.mouseMoveListener) { - document.removeEventListener("mousemove", this.mouseMoveListener); - this.mouseMoveListener = null; - } - if (this.mouseUpListener) { - document.removeEventListener("mouseup", this.mouseUpListener); - this.mouseUpListener = null; - } - }, "unbindMouseListeners"), - unbindTouchListeners: /* @__PURE__ */ __name(function unbindTouchListeners() { - if (this.touchMoveListener) { - document.removeEventListener("touchmove", this.touchMoveListener); - this.touchMoveListener = null; - } - if (this.touchEndListener) { - document.removeEventListener("touchend", this.touchEndListener); - this.touchEndListener = null; - } - }, "unbindTouchListeners"), - clear: /* @__PURE__ */ __name(function clear() { - this.dragging = false; - this.size = null; - this.startPos = null; - this.prevPanelElement = null; - this.nextPanelElement = null; - this.prevPanelSize = null; - this.nextPanelSize = null; - this.gutterElement = null; - this.prevPanelIndex = null; - }, "clear"), - isStateful: /* @__PURE__ */ __name(function isStateful() { - return this.stateKey != null; - }, "isStateful"), - getStorage: /* @__PURE__ */ __name(function getStorage() { - switch (this.stateStorage) { - case "local": - return window.localStorage; - case "session": - return window.sessionStorage; - default: - throw new Error(this.stateStorage + ' is not a valid value for the state storage, supported values are "local" and "session".'); - } - }, "getStorage"), - saveState: /* @__PURE__ */ __name(function saveState() { - if (isArray(this.panelSizes)) { - this.getStorage().setItem(this.stateKey, JSON.stringify(this.panelSizes)); - } - }, "saveState"), - restoreState: /* @__PURE__ */ __name(function restoreState() { - var _this5 = this; - var storage = this.getStorage(); - var stateString = storage.getItem(this.stateKey); - if (stateString) { - this.panelSizes = JSON.parse(stateString); - var children = _toConsumableArray$2(this.$el.children).filter(function(child) { - return child.getAttribute("data-pc-name") === "splitterpanel"; - }); - children.forEach(function(child, i) { - child.style.flexBasis = "calc(" + _this5.panelSizes[i] + "% - " + (_this5.panels.length - 1) * _this5.gutterSize + "px)"; - }); - return true; - } - return false; - }, "restoreState") - }, - computed: { - panels: /* @__PURE__ */ __name(function panels() { - var _this6 = this; - var panels2 = []; - this.$slots["default"]().forEach(function(child) { - if (_this6.isSplitterPanel(child)) { - panels2.push(child); - } else if (child.children instanceof Array) { - child.children.forEach(function(nestedChild) { - if (_this6.isSplitterPanel(nestedChild)) { - panels2.push(nestedChild); - } - }); - } - }); - return panels2; - }, "panels"), - gutterStyle: /* @__PURE__ */ __name(function gutterStyle() { - if (this.horizontal) return { - width: this.gutterSize + "px" - }; - else return { - height: this.gutterSize + "px" - }; - }, "gutterStyle"), - horizontal: /* @__PURE__ */ __name(function horizontal() { - return this.layout === "horizontal"; - }, "horizontal"), - getPTOptions: /* @__PURE__ */ __name(function getPTOptions() { - var _this$$parentInstance; - return { - context: { - nested: (_this$$parentInstance = this.$parentInstance) === null || _this$$parentInstance === void 0 ? void 0 : _this$$parentInstance.nestedState - } - }; - }, "getPTOptions") + }, + onClick: _cache[0] || (_cache[0] = ($event) => emit("click", $event)) + }, { + icon: withCtx(() => [ + shouldShowBadge.value ? (openBlock(), createBlock(unref(script$d), { + key: 0, + value: overlayValue.value + }, { + default: withCtx(() => [ + createBaseVNode("i", { + class: normalizeClass(props.icon + " side-bar-button-icon") + }, null, 2) + ]), + _: 1 + }, 8, ["value"])) : (openBlock(), createElementBlock("i", { + key: 1, + class: normalizeClass(props.icon + " side-bar-button-icon") + }, null, 2)) + ]), + _: 1 + }, 8, ["class", "pt"])), [ + [_directive_tooltip, { value: props.tooltip, showDelay: 300, hideDelay: 300 }] + ]); + }; } -}; -var _hoisted_1$m = ["onMousedown", "onTouchstart", "onTouchmove", "onTouchend"]; -var _hoisted_2$j = ["aria-orientation", "aria-valuenow", "onKeydown"]; -function render$j(_ctx, _cache, $props, $setup, $data, $options) { - return openBlock(), createElementBlock("div", mergeProps({ - "class": _ctx.cx("root"), - style: _ctx.sx("root"), - "data-p-resizing": false - }, _ctx.ptmi("root", $options.getPTOptions)), [(openBlock(true), createElementBlock(Fragment, null, renderList($options.panels, function(panel, i) { - return openBlock(), createElementBlock(Fragment, { - key: i - }, [(openBlock(), createBlock(resolveDynamicComponent(panel), { - tabindex: "-1" - })), i !== $options.panels.length - 1 ? (openBlock(), createElementBlock("div", mergeProps({ - key: 0, - ref_for: true, - ref: "gutter", - "class": _ctx.cx("gutter"), - role: "separator", - tabindex: "-1", - onMousedown: /* @__PURE__ */ __name(function onMousedown($event) { - return $options.onGutterMouseDown($event, i); - }, "onMousedown"), - onTouchstart: /* @__PURE__ */ __name(function onTouchstart($event) { - return $options.onGutterTouchStart($event, i); - }, "onTouchstart"), - onTouchmove: /* @__PURE__ */ __name(function onTouchmove($event) { - return $options.onGutterTouchMove($event, i); - }, "onTouchmove"), - onTouchend: /* @__PURE__ */ __name(function onTouchend($event) { - return $options.onGutterTouchEnd($event, i); - }, "onTouchend"), - "data-p-gutter-resizing": false - }, _ctx.ptm("gutter")), [createBaseVNode("div", mergeProps({ - "class": _ctx.cx("gutterHandle"), - tabindex: "0", - style: [$options.gutterStyle], - "aria-orientation": _ctx.layout, - "aria-valuenow": $data.prevSize, - onKeyup: _cache[0] || (_cache[0] = function() { - return $options.onGutterKeyUp && $options.onGutterKeyUp.apply($options, arguments); - }), - onKeydown: /* @__PURE__ */ __name(function onKeydown2($event) { - return $options.onGutterKeyDown($event, i); - }, "onKeydown"), - ref_for: true - }, _ctx.ptm("gutterHandle")), null, 16, _hoisted_2$j)], 16, _hoisted_1$m)) : createCommentVNode("", true)], 64); - }), 128))], 16); -} -__name(render$j, "render$j"); -script$c.render = render$j; -var classes$9 = { - root: /* @__PURE__ */ __name(function root3(_ref) { - var instance = _ref.instance; - return ["p-splitterpanel", { - "p-splitterpanel-nested": instance.isNested - }]; - }, "root") -}; -var SplitterPanelStyle = BaseStyle.extend({ - name: "splitterpanel", - classes: classes$9 }); -var script$1$9 = { - name: "BaseSplitterPanel", - "extends": script$e, - props: { - size: { - type: Number, - "default": null - }, - minSize: { - type: Number, - "default": null - } - }, - style: SplitterPanelStyle, - provide: /* @__PURE__ */ __name(function provide3() { - return { - $pcSplitterPanel: this, - $parentInstance: this - }; - }, "provide") -}; -var script$b = { - name: "SplitterPanel", - "extends": script$1$9, - inheritAttrs: false, - data: /* @__PURE__ */ __name(function data2() { - return { - nestedState: null +const SidebarIcon = /* @__PURE__ */ _export_sfc(_sfc_main$s, [["__scopeId", "data-v-caa3ee9c"]]); +const _sfc_main$r = /* @__PURE__ */ defineComponent({ + __name: "SidebarThemeToggleIcon", + setup(__props) { + const settingStore = useSettingStore(); + const currentTheme = computed(() => settingStore.get("Comfy.ColorPalette")); + const icon = computed( + () => currentTheme.value !== "light" ? "pi pi-moon" : "pi pi-sun" + ); + const commandStore = useCommandStore(); + const toggleTheme = /* @__PURE__ */ __name(() => { + commandStore.execute("Comfy.ToggleTheme"); + }, "toggleTheme"); + return (_ctx, _cache) => { + return openBlock(), createBlock(SidebarIcon, { + icon: icon.value, + onClick: toggleTheme, + tooltip: _ctx.$t("sideToolbar.themeToggle"), + class: "comfy-vue-theme-toggle" + }, null, 8, ["icon", "tooltip"]); }; - }, "data"), - computed: { - isNested: /* @__PURE__ */ __name(function isNested() { - var _this = this; - return this.$slots["default"]().some(function(child) { - _this.nestedState = child.type.name === "Splitter" ? true : null; - return _this.nestedState; + } +}); +const _sfc_main$q = /* @__PURE__ */ defineComponent({ + __name: "SidebarSettingsToggleIcon", + setup(__props) { + const dialogStore = useDialogStore(); + const showSetting = /* @__PURE__ */ __name(() => { + dialogStore.showDialog({ + key: "global-settings", + headerComponent: SettingDialogHeader, + component: SettingDialogContent }); - }, "isNested"), - getPTOptions: /* @__PURE__ */ __name(function getPTOptions2() { - return { - context: { - nested: this.isNested - } - }; - }, "getPTOptions") + }, "showSetting"); + return (_ctx, _cache) => { + return openBlock(), createBlock(SidebarIcon, { + icon: "pi pi-cog", + class: "comfy-settings-btn", + onClick: showSetting, + tooltip: _ctx.$t("g.settings") + }, null, 8, ["tooltip"]); + }; + } +}); +const _sfc_main$p = /* @__PURE__ */ defineComponent({ + __name: "SidebarLogoutIcon", + setup(__props) { + const { t } = useI18n(); + const userStore = useUserStore(); + const tooltip = computed( + () => `${t("sideToolbar.logout")} (${userStore.currentUser?.username})` + ); + const logout = /* @__PURE__ */ __name(() => { + userStore.logout(); + window.location.reload(); + }, "logout"); + return (_ctx, _cache) => { + return openBlock(), createBlock(SidebarIcon, { + icon: "pi pi-sign-out", + tooltip: tooltip.value, + onClick: logout + }, null, 8, ["tooltip"]); + }; + } +}); +const _sfc_main$o = /* @__PURE__ */ defineComponent({ + __name: "ExtensionSlot", + props: { + extension: {} + }, + setup(__props) { + const props = __props; + const mountCustomExtension = /* @__PURE__ */ __name((extension, el) => { + extension.render(el); + }, "mountCustomExtension"); + onBeforeUnmount(() => { + if (props.extension.type === "custom" && props.extension.destroy) { + props.extension.destroy(); + } + }); + return (_ctx, _cache) => { + return _ctx.extension.type === "vue" ? (openBlock(), createBlock(resolveDynamicComponent(_ctx.extension.component), { key: 0 })) : (openBlock(), createElementBlock("div", { + key: 1, + ref: /* @__PURE__ */ __name((el) => { + if (el) + mountCustomExtension( + props.extension, + el + ); + }, "ref") + }, null, 512)); + }; } +}); +const _withScopeId$5 = /* @__PURE__ */ __name((n) => (pushScopeId("data-v-7851c166"), n = n(), popScopeId(), n), "_withScopeId$5"); +const _hoisted_1$n = { class: "side-tool-bar-end" }; +const _hoisted_2$k = { + key: 0, + class: "sidebar-content-container h-full overflow-y-auto overflow-x-hidden" }; -function render$i(_ctx, _cache, $props, $setup, $data, $options) { - return openBlock(), createElementBlock("div", mergeProps({ - ref: "container", - "class": _ctx.cx("root") - }, _ctx.ptmi("root", $options.getPTOptions)), [renderSlot(_ctx.$slots, "default")], 16); -} -__name(render$i, "render$i"); -script$b.render = render$i; -const _sfc_main$q = /* @__PURE__ */ defineComponent({ - __name: "LiteGraphCanvasSplitterOverlay", +const _sfc_main$n = /* @__PURE__ */ defineComponent({ + __name: "SideToolbar", setup(__props) { + const workspaceStore = useWorkspaceStore(); const settingStore = useSettingStore(); - const sidebarLocation = computed( - () => settingStore.get("Comfy.Sidebar.Location") - ); - const sidebarPanelVisible = computed( - () => useSidebarTabStore().activeSidebarTab !== null - ); - const bottomPanelVisible = computed( - () => useBottomPanelStore().bottomPanelVisible + const userStore = useUserStore(); + const teleportTarget = computed( + () => settingStore.get("Comfy.Sidebar.Location") === "left" ? ".comfyui-body-left" : ".comfyui-body-right" ); - const activeSidebarTabId = computed( - () => useSidebarTabStore().activeSidebarTabId + const isSmall = computed( + () => settingStore.get("Comfy.Sidebar.Size") === "small" ); + const tabs = computed(() => workspaceStore.getSidebarTabs()); + const selectedTab = computed(() => workspaceStore.sidebarTab.activeSidebarTab); + const onTabClick = /* @__PURE__ */ __name((item3) => { + workspaceStore.sidebarTab.toggleSidebarTab(item3.id); + }, "onTabClick"); + const keybindingStore = useKeybindingStore(); + const getTabTooltipSuffix = /* @__PURE__ */ __name((tab) => { + const keybinding = keybindingStore.getKeybindingByCommandId( + `Workspace.ToggleSidebarTab.${tab.id}` + ); + return keybinding ? ` (${keybinding.combo.toString()})` : ""; + }, "getTabTooltipSuffix"); return (_ctx, _cache) => { - return openBlock(), createBlock(unref(script$c), { - class: "splitter-overlay-root splitter-overlay", - "pt:gutter": sidebarPanelVisible.value ? "" : "hidden", - key: activeSidebarTabId.value, - stateKey: activeSidebarTabId.value, - stateStorage: "local" - }, { - default: withCtx(() => [ - sidebarLocation.value === "left" ? withDirectives((openBlock(), createBlock(unref(script$b), { - key: 0, - class: "side-bar-panel", - minSize: 10, - size: 20 - }, { - default: withCtx(() => [ - renderSlot(_ctx.$slots, "side-bar-panel", {}, void 0, true) - ]), - _: 3 - }, 512)), [ - [vShow, sidebarPanelVisible.value] - ]) : createCommentVNode("", true), - createVNode(unref(script$b), { size: 100 }, { - default: withCtx(() => [ - createVNode(unref(script$c), { - class: "splitter-overlay max-w-full", - layout: "vertical", - "pt:gutter": bottomPanelVisible.value ? "" : "hidden", - stateKey: "bottom-panel-splitter", - stateStorage: "local" - }, { - default: withCtx(() => [ - createVNode(unref(script$b), { class: "graph-canvas-panel relative" }, { - default: withCtx(() => [ - renderSlot(_ctx.$slots, "graph-canvas-panel", {}, void 0, true) - ]), - _: 3 - }), - withDirectives(createVNode(unref(script$b), { class: "bottom-panel" }, { - default: withCtx(() => [ - renderSlot(_ctx.$slots, "bottom-panel", {}, void 0, true) - ]), - _: 3 - }, 512), [ - [vShow, bottomPanelVisible.value] - ]) - ]), - _: 3 - }, 8, ["pt:gutter"]) - ]), - _: 3 - }), - sidebarLocation.value === "right" ? withDirectives((openBlock(), createBlock(unref(script$b), { - key: 1, - class: "side-bar-panel", - minSize: 10, - size: 20 - }, { - default: withCtx(() => [ - renderSlot(_ctx.$slots, "side-bar-panel", {}, void 0, true) - ]), - _: 3 - }, 512)), [ - [vShow, sidebarPanelVisible.value] - ]) : createCommentVNode("", true) - ]), - _: 3 - }, 8, ["pt:gutter", "stateKey"]); + return openBlock(), createElementBlock(Fragment, null, [ + (openBlock(), createBlock(Teleport, { to: teleportTarget.value }, [ + createBaseVNode("nav", { + class: normalizeClass("side-tool-bar-container" + (isSmall.value ? " small-sidebar" : "")) + }, [ + (openBlock(true), createElementBlock(Fragment, null, renderList(tabs.value, (tab) => { + return openBlock(), createBlock(SidebarIcon, { + key: tab.id, + icon: tab.icon, + iconBadge: tab.iconBadge, + tooltip: tab.tooltip + getTabTooltipSuffix(tab), + selected: tab.id === selectedTab.value?.id, + class: normalizeClass(tab.id + "-tab-button"), + onClick: /* @__PURE__ */ __name(($event) => onTabClick(tab), "onClick") + }, null, 8, ["icon", "iconBadge", "tooltip", "selected", "class", "onClick"]); + }), 128)), + createBaseVNode("div", _hoisted_1$n, [ + unref(userStore).isMultiUserServer ? (openBlock(), createBlock(_sfc_main$p, { key: 0 })) : createCommentVNode("", true), + createVNode(_sfc_main$r), + createVNode(_sfc_main$q) + ]) + ], 2) + ], 8, ["to"])), + selectedTab.value ? (openBlock(), createElementBlock("div", _hoisted_2$k, [ + createVNode(_sfc_main$o, { extension: selectedTab.value }, null, 8, ["extension"]) + ])) : createCommentVNode("", true) + ], 64); }; } }); -const LiteGraphCanvasSplitterOverlay = /* @__PURE__ */ _export_sfc(_sfc_main$q, [["__scopeId", "data-v-e50caa15"]]); -var classes$8 = { - root: /* @__PURE__ */ __name(function root4(_ref) { - var instance = _ref.instance, props = _ref.props; - return ["p-tab", { - "p-tab-active": instance.active, - "p-disabled": props.disabled +const SideToolbar = /* @__PURE__ */ _export_sfc(_sfc_main$n, [["__scopeId", "data-v-7851c166"]]); +var classes$a = { + root: "p-tablist", + content: /* @__PURE__ */ __name(function content(_ref) { + var instance = _ref.instance; + return ["p-tablist-content", { + "p-tablist-viewport": instance.$pcTabs.scrollable }]; - }, "root") + }, "content"), + tabList: "p-tablist-tab-list", + activeBar: "p-tablist-active-bar", + prevButton: "p-tablist-prev-button p-tablist-nav-button", + nextButton: "p-tablist-next-button p-tablist-nav-button" }; -var TabStyle = BaseStyle.extend({ - name: "tab", - classes: classes$8 +var TabListStyle = BaseStyle.extend({ + name: "tablist", + classes: classes$a }); -var script$1$8 = { - name: "BaseTab", - "extends": script$e, - props: { - value: { - type: [String, Number], - "default": void 0 +var script$1$a = { + name: "BaseTabList", + "extends": script$g, + props: {}, + style: TabListStyle, + provide: /* @__PURE__ */ __name(function provide3() { + return { + $pcTabList: this, + $parentInstance: this + }; + }, "provide") +}; +var script$c = { + name: "TabList", + "extends": script$1$a, + inheritAttrs: false, + inject: ["$pcTabs"], + data: /* @__PURE__ */ __name(function data() { + return { + isPrevButtonEnabled: false, + isNextButtonEnabled: true + }; + }, "data"), + resizeObserver: void 0, + watch: { + showNavigators: /* @__PURE__ */ __name(function showNavigators(newValue) { + newValue ? this.bindResizeObserver() : this.unbindResizeObserver(); + }, "showNavigators"), + activeValue: { + flush: "post", + handler: /* @__PURE__ */ __name(function handler() { + this.updateInkBar(); + }, "handler") + } + }, + mounted: /* @__PURE__ */ __name(function mounted() { + var _this = this; + this.$nextTick(function() { + _this.updateInkBar(); + }); + if (this.showNavigators) { + this.updateButtonState(); + this.bindResizeObserver(); + } + }, "mounted"), + updated: /* @__PURE__ */ __name(function updated() { + this.showNavigators && this.updateButtonState(); + }, "updated"), + beforeUnmount: /* @__PURE__ */ __name(function beforeUnmount() { + this.unbindResizeObserver(); + }, "beforeUnmount"), + methods: { + onScroll: /* @__PURE__ */ __name(function onScroll(event) { + this.showNavigators && this.updateButtonState(); + event.preventDefault(); + }, "onScroll"), + onPrevButtonClick: /* @__PURE__ */ __name(function onPrevButtonClick() { + var content2 = this.$refs.content; + var width = getWidth(content2); + var pos = content2.scrollLeft - width; + content2.scrollLeft = pos <= 0 ? 0 : pos; + }, "onPrevButtonClick"), + onNextButtonClick: /* @__PURE__ */ __name(function onNextButtonClick() { + var content2 = this.$refs.content; + var width = getWidth(content2) - this.getVisibleButtonWidths(); + var pos = content2.scrollLeft + width; + var lastPos = content2.scrollWidth - width; + content2.scrollLeft = pos >= lastPos ? lastPos : pos; + }, "onNextButtonClick"), + bindResizeObserver: /* @__PURE__ */ __name(function bindResizeObserver() { + var _this2 = this; + this.resizeObserver = new ResizeObserver(function() { + return _this2.updateButtonState(); + }); + this.resizeObserver.observe(this.$refs.list); + }, "bindResizeObserver"), + unbindResizeObserver: /* @__PURE__ */ __name(function unbindResizeObserver() { + var _this$resizeObserver; + (_this$resizeObserver = this.resizeObserver) === null || _this$resizeObserver === void 0 || _this$resizeObserver.unobserve(this.$refs.list); + this.resizeObserver = void 0; + }, "unbindResizeObserver"), + updateInkBar: /* @__PURE__ */ __name(function updateInkBar() { + var _this$$refs = this.$refs, content2 = _this$$refs.content, inkbar = _this$$refs.inkbar, tabs = _this$$refs.tabs; + var activeTab = findSingle(content2, '[data-pc-name="tab"][data-p-active="true"]'); + if (this.$pcTabs.isVertical()) { + inkbar.style.height = getOuterHeight(activeTab) + "px"; + inkbar.style.top = getOffset(activeTab).top - getOffset(tabs).top + "px"; + } else { + inkbar.style.width = getOuterWidth(activeTab) + "px"; + inkbar.style.left = getOffset(activeTab).left - getOffset(tabs).left + "px"; + } + }, "updateInkBar"), + updateButtonState: /* @__PURE__ */ __name(function updateButtonState() { + var _this$$refs2 = this.$refs, list = _this$$refs2.list, content2 = _this$$refs2.content; + var scrollLeft = content2.scrollLeft, scrollTop = content2.scrollTop, scrollWidth = content2.scrollWidth, scrollHeight = content2.scrollHeight, offsetWidth = content2.offsetWidth, offsetHeight = content2.offsetHeight; + var _ref = [getWidth(content2), getHeight(content2)], width = _ref[0], height = _ref[1]; + if (this.$pcTabs.isVertical()) { + this.isPrevButtonEnabled = scrollTop !== 0; + this.isNextButtonEnabled = list.offsetHeight >= offsetHeight && parseInt(scrollTop) !== scrollHeight - height; + } else { + this.isPrevButtonEnabled = scrollLeft !== 0; + this.isNextButtonEnabled = list.offsetWidth >= offsetWidth && parseInt(scrollLeft) !== scrollWidth - width; + } + }, "updateButtonState"), + getVisibleButtonWidths: /* @__PURE__ */ __name(function getVisibleButtonWidths() { + var _this$$refs3 = this.$refs, prevBtn = _this$$refs3.prevBtn, nextBtn = _this$$refs3.nextBtn; + return [prevBtn, nextBtn].reduce(function(acc, el) { + return el ? acc + getWidth(el) : acc; + }, 0); + }, "getVisibleButtonWidths") + }, + computed: { + templates: /* @__PURE__ */ __name(function templates() { + return this.$pcTabs.$slots; + }, "templates"), + activeValue: /* @__PURE__ */ __name(function activeValue() { + return this.$pcTabs.d_value; + }, "activeValue"), + showNavigators: /* @__PURE__ */ __name(function showNavigators2() { + return this.$pcTabs.scrollable && this.$pcTabs.showNavigators; + }, "showNavigators"), + prevButtonAriaLabel: /* @__PURE__ */ __name(function prevButtonAriaLabel() { + return this.$primevue.config.locale.aria ? this.$primevue.config.locale.aria.previous : void 0; + }, "prevButtonAriaLabel"), + nextButtonAriaLabel: /* @__PURE__ */ __name(function nextButtonAriaLabel() { + return this.$primevue.config.locale.aria ? this.$primevue.config.locale.aria.next : void 0; + }, "nextButtonAriaLabel") + }, + components: { + ChevronLeftIcon: script$h, + ChevronRightIcon: script$i + }, + directives: { + ripple: Ripple + } +}; +var _hoisted_1$m = ["aria-label", "tabindex"]; +var _hoisted_2$j = ["aria-orientation"]; +var _hoisted_3$g = ["aria-label", "tabindex"]; +function render$i(_ctx, _cache, $props, $setup, $data, $options) { + var _directive_ripple = resolveDirective("ripple"); + return openBlock(), createElementBlock("div", mergeProps({ + ref: "list", + "class": _ctx.cx("root") + }, _ctx.ptmi("root")), [$options.showNavigators && $data.isPrevButtonEnabled ? withDirectives((openBlock(), createElementBlock("button", mergeProps({ + key: 0, + ref: "prevButton", + "class": _ctx.cx("prevButton"), + "aria-label": $options.prevButtonAriaLabel, + tabindex: $options.$pcTabs.tabindex, + onClick: _cache[0] || (_cache[0] = function() { + return $options.onPrevButtonClick && $options.onPrevButtonClick.apply($options, arguments); + }) + }, _ctx.ptm("prevButton"), { + "data-pc-group-section": "navigator" + }), [(openBlock(), createBlock(resolveDynamicComponent($options.templates.previcon || "ChevronLeftIcon"), mergeProps({ + "aria-hidden": "true" + }, _ctx.ptm("prevIcon")), null, 16))], 16, _hoisted_1$m)), [[_directive_ripple]]) : createCommentVNode("", true), createBaseVNode("div", mergeProps({ + ref: "content", + "class": _ctx.cx("content"), + onScroll: _cache[1] || (_cache[1] = function() { + return $options.onScroll && $options.onScroll.apply($options, arguments); + }) + }, _ctx.ptm("content")), [createBaseVNode("div", mergeProps({ + ref: "tabs", + "class": _ctx.cx("tabList"), + role: "tablist", + "aria-orientation": $options.$pcTabs.orientation || "horizontal" + }, _ctx.ptm("tabList")), [renderSlot(_ctx.$slots, "default"), createBaseVNode("span", mergeProps({ + ref: "inkbar", + "class": _ctx.cx("activeBar"), + role: "presentation", + "aria-hidden": "true" + }, _ctx.ptm("activeBar")), null, 16)], 16, _hoisted_2$j)], 16), $options.showNavigators && $data.isNextButtonEnabled ? withDirectives((openBlock(), createElementBlock("button", mergeProps({ + key: 1, + ref: "nextButton", + "class": _ctx.cx("nextButton"), + "aria-label": $options.nextButtonAriaLabel, + tabindex: $options.$pcTabs.tabindex, + onClick: _cache[2] || (_cache[2] = function() { + return $options.onNextButtonClick && $options.onNextButtonClick.apply($options, arguments); + }) + }, _ctx.ptm("nextButton"), { + "data-pc-group-section": "navigator" + }), [(openBlock(), createBlock(resolveDynamicComponent($options.templates.nexticon || "ChevronRightIcon"), mergeProps({ + "aria-hidden": "true" + }, _ctx.ptm("nextIcon")), null, 16))], 16, _hoisted_3$g)), [[_directive_ripple]]) : createCommentVNode("", true)], 16); +} +__name(render$i, "render$i"); +script$c.render = render$i; +var classes$9 = { + root: /* @__PURE__ */ __name(function root(_ref) { + var instance = _ref.instance, props = _ref.props; + return ["p-tab", { + "p-tab-active": instance.active, + "p-disabled": props.disabled + }]; + }, "root") +}; +var TabStyle = BaseStyle.extend({ + name: "tab", + classes: classes$9 +}); +var script$1$9 = { + name: "BaseTab", + "extends": script$g, + props: { + value: { + type: [String, Number], + "default": void 0 }, disabled: { type: Boolean, @@ -789,9 +631,9 @@ var script$1$8 = { }; }, "provide") }; -var script$a = { +var script$b = { name: "Tab", - "extends": script$1$8, + "extends": script$1$9, inheritAttrs: false, inject: ["$pcTabs", "$pcTabList"], methods: { @@ -958,265 +800,29 @@ function render$h(_ctx, _cache, $props, $setup, $data, $options) { }); } __name(render$h, "render$h"); -script$a.render = render$h; -var classes$7 = { - root: "p-tablist", - content: /* @__PURE__ */ __name(function content(_ref) { - var instance = _ref.instance; - return ["p-tablist-content", { - "p-tablist-viewport": instance.$pcTabs.scrollable - }]; - }, "content"), - tabList: "p-tablist-tab-list", - activeBar: "p-tablist-active-bar", - prevButton: "p-tablist-prev-button p-tablist-nav-button", - nextButton: "p-tablist-next-button p-tablist-nav-button" -}; -var TabListStyle = BaseStyle.extend({ - name: "tablist", - classes: classes$7 -}); -var script$1$7 = { - name: "BaseTabList", - "extends": script$e, - props: {}, - style: TabListStyle, - provide: /* @__PURE__ */ __name(function provide5() { - return { - $pcTabList: this, - $parentInstance: this - }; - }, "provide") -}; -var script$9 = { - name: "TabList", - "extends": script$1$7, - inheritAttrs: false, - inject: ["$pcTabs"], - data: /* @__PURE__ */ __name(function data3() { - return { - isPrevButtonEnabled: false, - isNextButtonEnabled: true - }; - }, "data"), - resizeObserver: void 0, - watch: { - showNavigators: /* @__PURE__ */ __name(function showNavigators(newValue) { - newValue ? this.bindResizeObserver() : this.unbindResizeObserver(); - }, "showNavigators"), - activeValue: { - flush: "post", - handler: /* @__PURE__ */ __name(function handler() { - this.updateInkBar(); - }, "handler") - } - }, - mounted: /* @__PURE__ */ __name(function mounted2() { - var _this = this; - this.$nextTick(function() { - _this.updateInkBar(); - }); - if (this.showNavigators) { - this.updateButtonState(); - this.bindResizeObserver(); - } - }, "mounted"), - updated: /* @__PURE__ */ __name(function updated() { - this.showNavigators && this.updateButtonState(); - }, "updated"), - beforeUnmount: /* @__PURE__ */ __name(function beforeUnmount2() { - this.unbindResizeObserver(); - }, "beforeUnmount"), - methods: { - onScroll: /* @__PURE__ */ __name(function onScroll(event) { - this.showNavigators && this.updateButtonState(); - event.preventDefault(); - }, "onScroll"), - onPrevButtonClick: /* @__PURE__ */ __name(function onPrevButtonClick() { - var content2 = this.$refs.content; - var width = getWidth(content2); - var pos = content2.scrollLeft - width; - content2.scrollLeft = pos <= 0 ? 0 : pos; - }, "onPrevButtonClick"), - onNextButtonClick: /* @__PURE__ */ __name(function onNextButtonClick() { - var content2 = this.$refs.content; - var width = getWidth(content2) - this.getVisibleButtonWidths(); - var pos = content2.scrollLeft + width; - var lastPos = content2.scrollWidth - width; - content2.scrollLeft = pos >= lastPos ? lastPos : pos; - }, "onNextButtonClick"), - bindResizeObserver: /* @__PURE__ */ __name(function bindResizeObserver() { - var _this2 = this; - this.resizeObserver = new ResizeObserver(function() { - return _this2.updateButtonState(); - }); - this.resizeObserver.observe(this.$refs.list); - }, "bindResizeObserver"), - unbindResizeObserver: /* @__PURE__ */ __name(function unbindResizeObserver() { - var _this$resizeObserver; - (_this$resizeObserver = this.resizeObserver) === null || _this$resizeObserver === void 0 || _this$resizeObserver.unobserve(this.$refs.list); - this.resizeObserver = void 0; - }, "unbindResizeObserver"), - updateInkBar: /* @__PURE__ */ __name(function updateInkBar() { - var _this$$refs = this.$refs, content2 = _this$$refs.content, inkbar = _this$$refs.inkbar, tabs = _this$$refs.tabs; - var activeTab = findSingle(content2, '[data-pc-name="tab"][data-p-active="true"]'); - if (this.$pcTabs.isVertical()) { - inkbar.style.height = getOuterHeight(activeTab) + "px"; - inkbar.style.top = getOffset(activeTab).top - getOffset(tabs).top + "px"; - } else { - inkbar.style.width = getOuterWidth(activeTab) + "px"; - inkbar.style.left = getOffset(activeTab).left - getOffset(tabs).left + "px"; - } - }, "updateInkBar"), - updateButtonState: /* @__PURE__ */ __name(function updateButtonState() { - var _this$$refs2 = this.$refs, list = _this$$refs2.list, content2 = _this$$refs2.content; - var scrollLeft = content2.scrollLeft, scrollTop = content2.scrollTop, scrollWidth = content2.scrollWidth, scrollHeight = content2.scrollHeight, offsetWidth = content2.offsetWidth, offsetHeight = content2.offsetHeight; - var _ref = [getWidth(content2), getHeight(content2)], width = _ref[0], height = _ref[1]; - if (this.$pcTabs.isVertical()) { - this.isPrevButtonEnabled = scrollTop !== 0; - this.isNextButtonEnabled = list.offsetHeight >= offsetHeight && parseInt(scrollTop) !== scrollHeight - height; - } else { - this.isPrevButtonEnabled = scrollLeft !== 0; - this.isNextButtonEnabled = list.offsetWidth >= offsetWidth && parseInt(scrollLeft) !== scrollWidth - width; - } - }, "updateButtonState"), - getVisibleButtonWidths: /* @__PURE__ */ __name(function getVisibleButtonWidths() { - var _this$$refs3 = this.$refs, prevBtn = _this$$refs3.prevBtn, nextBtn = _this$$refs3.nextBtn; - return [prevBtn, nextBtn].reduce(function(acc, el) { - return el ? acc + getWidth(el) : acc; - }, 0); - }, "getVisibleButtonWidths") - }, - computed: { - templates: /* @__PURE__ */ __name(function templates() { - return this.$pcTabs.$slots; - }, "templates"), - activeValue: /* @__PURE__ */ __name(function activeValue() { - return this.$pcTabs.d_value; - }, "activeValue"), - showNavigators: /* @__PURE__ */ __name(function showNavigators2() { - return this.$pcTabs.scrollable && this.$pcTabs.showNavigators; - }, "showNavigators"), - prevButtonAriaLabel: /* @__PURE__ */ __name(function prevButtonAriaLabel() { - return this.$primevue.config.locale.aria ? this.$primevue.config.locale.aria.previous : void 0; - }, "prevButtonAriaLabel"), - nextButtonAriaLabel: /* @__PURE__ */ __name(function nextButtonAriaLabel() { - return this.$primevue.config.locale.aria ? this.$primevue.config.locale.aria.next : void 0; - }, "nextButtonAriaLabel") - }, - components: { - ChevronLeftIcon: script$f, - ChevronRightIcon: script$g - }, - directives: { - ripple: Ripple - } -}; -var _hoisted_1$l = ["aria-label", "tabindex"]; -var _hoisted_2$i = ["aria-orientation"]; -var _hoisted_3$g = ["aria-label", "tabindex"]; -function render$g(_ctx, _cache, $props, $setup, $data, $options) { - var _directive_ripple = resolveDirective("ripple"); - return openBlock(), createElementBlock("div", mergeProps({ - ref: "list", - "class": _ctx.cx("root") - }, _ctx.ptmi("root")), [$options.showNavigators && $data.isPrevButtonEnabled ? withDirectives((openBlock(), createElementBlock("button", mergeProps({ - key: 0, - ref: "prevButton", - "class": _ctx.cx("prevButton"), - "aria-label": $options.prevButtonAriaLabel, - tabindex: $options.$pcTabs.tabindex, - onClick: _cache[0] || (_cache[0] = function() { - return $options.onPrevButtonClick && $options.onPrevButtonClick.apply($options, arguments); - }) - }, _ctx.ptm("prevButton"), { - "data-pc-group-section": "navigator" - }), [(openBlock(), createBlock(resolveDynamicComponent($options.templates.previcon || "ChevronLeftIcon"), mergeProps({ - "aria-hidden": "true" - }, _ctx.ptm("prevIcon")), null, 16))], 16, _hoisted_1$l)), [[_directive_ripple]]) : createCommentVNode("", true), createBaseVNode("div", mergeProps({ - ref: "content", - "class": _ctx.cx("content"), - onScroll: _cache[1] || (_cache[1] = function() { - return $options.onScroll && $options.onScroll.apply($options, arguments); - }) - }, _ctx.ptm("content")), [createBaseVNode("div", mergeProps({ - ref: "tabs", - "class": _ctx.cx("tabList"), - role: "tablist", - "aria-orientation": $options.$pcTabs.orientation || "horizontal" - }, _ctx.ptm("tabList")), [renderSlot(_ctx.$slots, "default"), createBaseVNode("span", mergeProps({ - ref: "inkbar", - "class": _ctx.cx("activeBar"), - role: "presentation", - "aria-hidden": "true" - }, _ctx.ptm("activeBar")), null, 16)], 16, _hoisted_2$i)], 16), $options.showNavigators && $data.isNextButtonEnabled ? withDirectives((openBlock(), createElementBlock("button", mergeProps({ - key: 1, - ref: "nextButton", - "class": _ctx.cx("nextButton"), - "aria-label": $options.nextButtonAriaLabel, - tabindex: $options.$pcTabs.tabindex, - onClick: _cache[2] || (_cache[2] = function() { - return $options.onNextButtonClick && $options.onNextButtonClick.apply($options, arguments); - }) - }, _ctx.ptm("nextButton"), { - "data-pc-group-section": "navigator" - }), [(openBlock(), createBlock(resolveDynamicComponent($options.templates.nexticon || "ChevronRightIcon"), mergeProps({ - "aria-hidden": "true" - }, _ctx.ptm("nextIcon")), null, 16))], 16, _hoisted_3$g)), [[_directive_ripple]]) : createCommentVNode("", true)], 16); -} -__name(render$g, "render$g"); -script$9.render = render$g; -const _sfc_main$p = /* @__PURE__ */ defineComponent({ - __name: "ExtensionSlot", - props: { - extension: {} - }, - setup(__props) { - const props = __props; - const mountCustomExtension = /* @__PURE__ */ __name((extension, el) => { - extension.render(el); - }, "mountCustomExtension"); - onBeforeUnmount(() => { - if (props.extension.type === "custom" && props.extension.destroy) { - props.extension.destroy(); - } - }); - return (_ctx, _cache) => { - return _ctx.extension.type === "vue" ? (openBlock(), createBlock(resolveDynamicComponent(_ctx.extension.component), { key: 0 })) : (openBlock(), createElementBlock("div", { - key: 1, - ref: /* @__PURE__ */ __name((el) => { - if (el) - mountCustomExtension( - props.extension, - el - ); - }, "ref") - }, null, 512)); - }; - } -}); -const _hoisted_1$k = { class: "flex flex-col h-full" }; -const _hoisted_2$h = { class: "w-full flex justify-between" }; +script$b.render = render$h; +const _hoisted_1$l = { class: "flex flex-col h-full" }; +const _hoisted_2$i = { class: "w-full flex justify-between" }; const _hoisted_3$f = { class: "tabs-container" }; const _hoisted_4$5 = { class: "font-bold" }; const _hoisted_5$4 = { class: "flex-grow h-0" }; -const _sfc_main$o = /* @__PURE__ */ defineComponent({ +const _sfc_main$m = /* @__PURE__ */ defineComponent({ __name: "BottomPanel", setup(__props) { const bottomPanelStore = useBottomPanelStore(); return (_ctx, _cache) => { - return openBlock(), createElementBlock("div", _hoisted_1$k, [ - createVNode(unref(script$h), { + return openBlock(), createElementBlock("div", _hoisted_1$l, [ + createVNode(unref(script$j), { value: unref(bottomPanelStore).activeBottomPanelTabId, "onUpdate:value": _cache[1] || (_cache[1] = ($event) => unref(bottomPanelStore).activeBottomPanelTabId = $event) }, { default: withCtx(() => [ - createVNode(unref(script$9), { "pt:tabList": "border-none" }, { + createVNode(unref(script$c), { "pt:tabList": "border-none" }, { default: withCtx(() => [ - createBaseVNode("div", _hoisted_2$h, [ + createBaseVNode("div", _hoisted_2$i, [ createBaseVNode("div", _hoisted_3$f, [ (openBlock(true), createElementBlock(Fragment, null, renderList(unref(bottomPanelStore).bottomPanelTabs, (tab) => { - return openBlock(), createBlock(unref(script$a), { + return openBlock(), createBlock(unref(script$b), { key: tab.id, value: tab.id, class: "p-3 border-none" @@ -1228,7 +834,7 @@ const _sfc_main$o = /* @__PURE__ */ defineComponent({ }, 1032, ["value"]); }), 128)) ]), - createVNode(unref(script$d), { + createVNode(unref(script$f), { class: "justify-self-end", icon: "pi pi-times", severity: "secondary", @@ -1244,7 +850,7 @@ const _sfc_main$o = /* @__PURE__ */ defineComponent({ _: 1 }, 8, ["value"]), createBaseVNode("div", _hoisted_5$4, [ - unref(bottomPanelStore).bottomPanelVisible && unref(bottomPanelStore).activeBottomPanelTab ? (openBlock(), createBlock(_sfc_main$p, { + unref(bottomPanelStore).bottomPanelVisible && unref(bottomPanelStore).activeBottomPanelTab ? (openBlock(), createBlock(_sfc_main$o, { key: 0, extension: unref(bottomPanelStore).activeBottomPanelTab }, null, 8, ["extension"])) : createCommentVNode("", true) @@ -1253,508 +859,647 @@ const _sfc_main$o = /* @__PURE__ */ defineComponent({ }; } }); -const _hoisted_1$j = { - viewBox: "0 0 1024 1024", - width: "1.2em", - height: "1.2em" -}; -const _hoisted_2$g = /* @__PURE__ */ createBaseVNode("path", { - fill: "currentColor", - d: "M921.088 103.232L584.832 889.024L465.52 544.512L121.328 440.48zM1004.46.769c-6.096 0-13.52 1.728-22.096 5.36L27.708 411.2c-34.383 14.592-36.56 42.704-4.847 62.464l395.296 123.584l129.36 403.264c9.28 15.184 20.496 22.72 31.263 22.72c11.936 0 23.296-9.152 31.04-27.248l408.272-953.728C1029.148 16.368 1022.86.769 1004.46.769" -}, null, -1); -const _hoisted_3$e = [ - _hoisted_2$g -]; -function render$f(_ctx, _cache) { - return openBlock(), createElementBlock("svg", _hoisted_1$j, [..._hoisted_3$e]); -} -__name(render$f, "render$f"); -const __unplugin_components_1$2 = markRaw({ name: "simple-line-icons-cursor", render: render$f }); -const _hoisted_1$i = { - viewBox: "0 0 24 24", - width: "1.2em", - height: "1.2em" -}; -const _hoisted_2$f = /* @__PURE__ */ createBaseVNode("path", { - fill: "currentColor", - d: "M10.05 23q-.75 0-1.4-.337T7.575 21.7L1.2 12.375l.6-.575q.475-.475 1.125-.55t1.175.3L7 13.575V4q0-.425.288-.712T8 3t.713.288T9 4v13.425l-3.7-2.6l3.925 5.725q.125.2.35.325t.475.125H17q.825 0 1.413-.587T19 19V5q0-.425.288-.712T20 4t.713.288T21 5v14q0 1.65-1.175 2.825T17 23zM11 12V2q0-.425.288-.712T12 1t.713.288T13 2v10zm4 0V3q0-.425.288-.712T16 2t.713.288T17 3v9zm-2.85 4.5" -}, null, -1); -const _hoisted_3$d = [ - _hoisted_2$f -]; -function render$e(_ctx, _cache) { - return openBlock(), createElementBlock("svg", _hoisted_1$i, [..._hoisted_3$d]); -} -__name(render$e, "render$e"); -const __unplugin_components_0$2 = markRaw({ name: "material-symbols-pan-tool-outline", render: render$e }); -var theme$6 = /* @__PURE__ */ __name(function theme2(_ref) { - _ref.dt; - return "\n.p-buttongroup .p-button {\n margin: 0;\n}\n\n.p-buttongroup .p-button:not(:last-child),\n.p-buttongroup .p-button:not(:last-child):hover {\n border-right: 0 none;\n}\n\n.p-buttongroup .p-button:not(:first-of-type):not(:last-of-type) {\n border-radius: 0;\n}\n\n.p-buttongroup .p-button:first-of-type:not(:only-of-type) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.p-buttongroup .p-button:last-of-type:not(:only-of-type) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.p-buttongroup .p-button:focus {\n position: relative;\n z-index: 1;\n}\n"; +var theme$7 = /* @__PURE__ */ __name(function theme2(_ref) { + var dt = _ref.dt; + return "\n.p-splitter {\n display: flex;\n flex-wrap: nowrap;\n border: 1px solid ".concat(dt("splitter.border.color"), ";\n background: ").concat(dt("splitter.background"), ";\n border-radius: ").concat(dt("border.radius.md"), ";\n color: ").concat(dt("splitter.color"), ";\n}\n\n.p-splitter-vertical {\n flex-direction: column;\n}\n\n.p-splitter-gutter {\n flex-grow: 0;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1;\n background: ").concat(dt("splitter.gutter.background"), ";\n}\n\n.p-splitter-gutter-handle {\n border-radius: ").concat(dt("splitter.handle.border.radius"), ";\n background: ").concat(dt("splitter.handle.background"), ";\n transition: outline-color ").concat(dt("splitter.transition.duration"), ", box-shadow ").concat(dt("splitter.transition.duration"), ";\n outline-color: transparent;\n}\n\n.p-splitter-gutter-handle:focus-visible {\n box-shadow: ").concat(dt("splitter.handle.focus.ring.shadow"), ";\n outline: ").concat(dt("splitter.handle.focus.ring.width"), " ").concat(dt("splitter.handle.focus.ring.style"), " ").concat(dt("splitter.handle.focus.ring.color"), ";\n outline-offset: ").concat(dt("splitter.handle.focus.ring.offset"), ";\n}\n\n.p-splitter-horizontal.p-splitter-resizing {\n cursor: col-resize;\n user-select: none;\n}\n\n.p-splitter-vertical.p-splitter-resizing {\n cursor: row-resize;\n user-select: none;\n}\n\n.p-splitter-horizontal > .p-splitter-gutter > .p-splitter-gutter-handle {\n height: ").concat(dt("splitter.handle.size"), ";\n width: 100%;\n}\n\n.p-splitter-vertical > .p-splitter-gutter > .p-splitter-gutter-handle {\n width: ").concat(dt("splitter.handle.size"), ";\n height: 100%;\n}\n\n.p-splitter-horizontal > .p-splitter-gutter {\n cursor: col-resize;\n}\n\n.p-splitter-vertical > .p-splitter-gutter {\n cursor: row-resize;\n}\n\n.p-splitterpanel {\n flex-grow: 1;\n overflow: hidden;\n}\n\n.p-splitterpanel-nested {\n display: flex;\n}\n\n.p-splitterpanel .p-splitter {\n flex-grow: 1;\n border: 0 none;\n}\n"); }, "theme"); -var classes$6 = { - root: "p-buttongroup p-component" -}; -var ButtonGroupStyle = BaseStyle.extend({ - name: "buttongroup", - theme: theme$6, - classes: classes$6 -}); -var script$1$6 = { - name: "BaseButtonGroup", - "extends": script$e, - style: ButtonGroupStyle, - provide: /* @__PURE__ */ __name(function provide6() { - return { - $pcButtonGroup: this, - $parentInstance: this - }; - }, "provide") +var classes$8 = { + root: /* @__PURE__ */ __name(function root2(_ref2) { + var props = _ref2.props; + return ["p-splitter p-component", "p-splitter-" + props.layout]; + }, "root"), + gutter: "p-splitter-gutter", + gutterHandle: "p-splitter-gutter-handle" }; -var script$8 = { - name: "ButtonGroup", - "extends": script$1$6, - inheritAttrs: false +var inlineStyles$4 = { + root: /* @__PURE__ */ __name(function root3(_ref3) { + var props = _ref3.props; + return [{ + display: "flex", + "flex-wrap": "nowrap" + }, props.layout === "vertical" ? { + "flex-direction": "column" + } : ""]; + }, "root") }; -function render$d(_ctx, _cache, $props, $setup, $data, $options) { - return openBlock(), createElementBlock("span", mergeProps({ - "class": _ctx.cx("root"), - role: "group" - }, _ctx.ptmi("root")), [renderSlot(_ctx.$slots, "default")], 16); -} -__name(render$d, "render$d"); -script$8.render = render$d; -const useTitleEditorStore = defineStore("titleEditor", () => { - const titleEditorTarget = shallowRef(null); - return { - titleEditorTarget - }; +var SplitterStyle = BaseStyle.extend({ + name: "splitter", + theme: theme$7, + classes: classes$8, + inlineStyles: inlineStyles$4 }); -const useCanvasStore = defineStore("canvas", () => { - const canvas = shallowRef(null); - return { - canvas - }; -}); -const _sfc_main$n = /* @__PURE__ */ defineComponent({ - __name: "GraphCanvasMenu", - setup(__props) { - const { t } = useI18n(); - const commandStore = useCommandStore(); - const canvasStore = useCanvasStore(); - const settingStore = useSettingStore(); - const linkHidden = computed( - () => settingStore.get("Comfy.LinkRenderMode") === LiteGraph.HIDDEN_LINK - ); - let interval = null; - const repeat2 = /* @__PURE__ */ __name((command) => { - if (interval) return; - const cmd = /* @__PURE__ */ __name(() => commandStore.execute(command), "cmd"); - cmd(); - interval = window.setInterval(cmd, 100); - }, "repeat"); - const stopRepeat = /* @__PURE__ */ __name(() => { - if (interval) { - clearInterval(interval); - interval = null; - } - }, "stopRepeat"); - return (_ctx, _cache) => { - const _component_i_material_symbols58pan_tool_outline = __unplugin_components_0$2; - const _component_i_simple_line_icons58cursor = __unplugin_components_1$2; - const _directive_tooltip = resolveDirective("tooltip"); - return openBlock(), createBlock(unref(script$8), { class: "p-buttongroup-vertical absolute bottom-[10px] right-[10px] z-[1000] pointer-events-auto" }, { - default: withCtx(() => [ - withDirectives(createVNode(unref(script$d), { - severity: "secondary", - icon: "pi pi-plus", - onMousedown: _cache[0] || (_cache[0] = ($event) => repeat2("Comfy.Canvas.ZoomIn")), - onMouseup: stopRepeat - }, null, 512), [ - [ - _directive_tooltip, - unref(t)("graphCanvasMenu.zoomIn"), - void 0, - { left: true } - ] - ]), - withDirectives(createVNode(unref(script$d), { - severity: "secondary", - icon: "pi pi-minus", - onMousedown: _cache[1] || (_cache[1] = ($event) => repeat2("Comfy.Canvas.ZoomOut")), - onMouseup: stopRepeat - }, null, 512), [ - [ - _directive_tooltip, - unref(t)("graphCanvasMenu.zoomOut"), - void 0, - { left: true } - ] - ]), - withDirectives(createVNode(unref(script$d), { - severity: "secondary", - icon: "pi pi-expand", - onClick: _cache[2] || (_cache[2] = () => unref(commandStore).execute("Comfy.Canvas.FitView")) - }, null, 512), [ - [ - _directive_tooltip, - unref(t)("graphCanvasMenu.fitView"), - void 0, - { left: true } - ] - ]), - withDirectives((openBlock(), createBlock(unref(script$d), { - severity: "secondary", - onClick: _cache[3] || (_cache[3] = () => unref(commandStore).execute("Comfy.Canvas.ToggleLock")) - }, { - icon: withCtx(() => [ - unref(canvasStore).canvas?.read_only ? (openBlock(), createBlock(_component_i_material_symbols58pan_tool_outline, { key: 0 })) : (openBlock(), createBlock(_component_i_simple_line_icons58cursor, { key: 1 })) - ]), - _: 1 - })), [ - [ - _directive_tooltip, - unref(t)( - "graphCanvasMenu." + (unref(canvasStore).canvas?.read_only ? "panMode" : "selectMode") - ) + " (Space)", - void 0, - { left: true } - ] - ]), - withDirectives(createVNode(unref(script$d), { - severity: "secondary", - icon: linkHidden.value ? "pi pi-eye-slash" : "pi pi-eye", - onClick: _cache[4] || (_cache[4] = () => unref(commandStore).execute("Comfy.Canvas.ToggleLinkVisibility")), - "data-testid": "toggle-link-visibility-button" - }, null, 8, ["icon"]), [ - [ - _directive_tooltip, - unref(t)("graphCanvasMenu.toggleLinkVisibility"), - void 0, - { left: true } - ] - ]) - ]), - _: 1 - }); - }; - } -}); -const GraphCanvasMenu = /* @__PURE__ */ _export_sfc(_sfc_main$n, [["__scopeId", "data-v-cf40dd39"]]); -const _sfc_main$m = /* @__PURE__ */ defineComponent({ - __name: "NodeBadge", - setup(__props) { - const settingStore = useSettingStore(); - const colorPaletteStore = useColorPaletteStore(); - const nodeSourceBadgeMode = computed( - () => settingStore.get("Comfy.NodeBadge.NodeSourceBadgeMode") - ); - const nodeIdBadgeMode = computed( - () => settingStore.get("Comfy.NodeBadge.NodeIdBadgeMode") - ); - const nodeLifeCycleBadgeMode = computed( - () => settingStore.get("Comfy.NodeBadge.NodeLifeCycleBadgeMode") - ); - watch([nodeSourceBadgeMode, nodeIdBadgeMode, nodeLifeCycleBadgeMode], () => { - app.graph?.setDirtyCanvas(true, true); - }); - const nodeDefStore = useNodeDefStore(); - function badgeTextVisible(nodeDef, badgeMode) { - return !(badgeMode === NodeBadgeMode.None || nodeDef?.isCoreNode && badgeMode === NodeBadgeMode.HideBuiltIn); +var script$1$8 = { + name: "BaseSplitter", + "extends": script$g, + props: { + layout: { + type: String, + "default": "horizontal" + }, + gutterSize: { + type: Number, + "default": 4 + }, + stateKey: { + type: String, + "default": null + }, + stateStorage: { + type: String, + "default": "session" + }, + step: { + type: Number, + "default": 5 } - __name(badgeTextVisible, "badgeTextVisible"); - onMounted(() => { - app.registerExtension({ - name: "Comfy.NodeBadge", - nodeCreated(node) { - node.badgePosition = BadgePosition.TopRight; - const badge = computed(() => { - const nodeDef = nodeDefStore.fromLGraphNode(node); - return new LGraphBadge({ - text: _.truncate( - [ - badgeTextVisible(nodeDef, nodeIdBadgeMode.value) ? `#${node.id}` : "", - badgeTextVisible(nodeDef, nodeLifeCycleBadgeMode.value) ? nodeDef?.nodeLifeCycleBadgeText ?? "" : "", - badgeTextVisible(nodeDef, nodeSourceBadgeMode.value) ? nodeDef?.nodeSource?.badgeText ?? "" : "" - ].filter((s) => s.length > 0).join(" "), - { - length: 31 - } - ), - fgColor: colorPaletteStore.completedActivePalette.colors.litegraph_base.BADGE_FG_COLOR, - bgColor: colorPaletteStore.completedActivePalette.colors.litegraph_base.BADGE_BG_COLOR - }); - }); - node.badges.push(() => badge.value); - } - }); - }); - return (_ctx, _cache) => { - return openBlock(), createElementBlock("div"); + }, + style: SplitterStyle, + provide: /* @__PURE__ */ __name(function provide5() { + return { + $pcSplitter: this, + $parentInstance: this }; + }, "provide") +}; +function _toConsumableArray$2(r) { + return _arrayWithoutHoles$2(r) || _iterableToArray$2(r) || _unsupportedIterableToArray$2(r) || _nonIterableSpread$2(); +} +__name(_toConsumableArray$2, "_toConsumableArray$2"); +function _nonIterableSpread$2() { + throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); +} +__name(_nonIterableSpread$2, "_nonIterableSpread$2"); +function _unsupportedIterableToArray$2(r, a) { + if (r) { + if ("string" == typeof r) return _arrayLikeToArray$2(r, a); + var t = {}.toString.call(r).slice(8, -1); + return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$2(r, a) : void 0; } -}); -const _sfc_main$l = /* @__PURE__ */ defineComponent({ - __name: "NodeTooltip", - setup(__props) { - let idleTimeout; - const nodeDefStore = useNodeDefStore(); - const tooltipRef = ref(); - const tooltipText = ref(""); - const left = ref(); - const top = ref(); - const hideTooltip = /* @__PURE__ */ __name(() => tooltipText.value = null, "hideTooltip"); - const showTooltip = /* @__PURE__ */ __name(async (tooltip) => { - if (!tooltip) return; - left.value = app.canvas.mouse[0] + "px"; - top.value = app.canvas.mouse[1] + "px"; - tooltipText.value = tooltip; - await nextTick(); - const rect = tooltipRef.value.getBoundingClientRect(); - if (rect.right > window.innerWidth) { - left.value = app.canvas.mouse[0] - rect.width + "px"; - } - if (rect.top < 0) { - top.value = app.canvas.mouse[1] + rect.height + "px"; - } - }, "showTooltip"); - const onIdle = /* @__PURE__ */ __name(() => { - const { canvas } = app; - const node = canvas.node_over; - if (!node) return; - const ctor = node.constructor; - const nodeDef = nodeDefStore.nodeDefsByName[node.type]; - if (ctor.title_mode !== LiteGraph.NO_TITLE && canvas.graph_mouse[1] < node.pos[1]) { - return showTooltip(nodeDef.description); - } - if (node.flags?.collapsed) return; - const inputSlot = canvas.isOverNodeInput( - node, - canvas.graph_mouse[0], - canvas.graph_mouse[1], - [0, 0] - ); - if (inputSlot !== -1) { - const inputName = node.inputs[inputSlot].name; - const translatedTooltip = st( - `nodeDefs.${normalizeI18nKey(node.type)}.inputs.${normalizeI18nKey(inputName)}.tooltip`, - nodeDef.inputs.getInput(inputName)?.tooltip - ); - return showTooltip(translatedTooltip); - } - const outputSlot = canvas.isOverNodeOutput( - node, - canvas.graph_mouse[0], - canvas.graph_mouse[1], - [0, 0] - ); - if (outputSlot !== -1) { - const translatedTooltip = st( - `nodeDefs.${normalizeI18nKey(node.type)}.outputs.${outputSlot}.tooltip`, - nodeDef.outputs.all?.[outputSlot]?.tooltip - ); - return showTooltip(translatedTooltip); - } - const widget = app.canvas.getWidgetAtCursor(); - if (widget && !widget.element) { - const translatedTooltip = st( - `nodeDefs.${normalizeI18nKey(node.type)}.inputs.${normalizeI18nKey(widget.name)}.tooltip`, - nodeDef.inputs.getInput(widget.name)?.tooltip - ); - return showTooltip(widget.tooltip ?? translatedTooltip); - } - }, "onIdle"); - const onMouseMove = /* @__PURE__ */ __name((e) => { - hideTooltip(); - clearTimeout(idleTimeout); - if (e.target.nodeName !== "CANVAS") return; - idleTimeout = window.setTimeout(onIdle, 500); - }, "onMouseMove"); - useEventListener(window, "mousemove", onMouseMove); - useEventListener(window, "click", hideTooltip); - return (_ctx, _cache) => { - return tooltipText.value ? (openBlock(), createElementBlock("div", { - key: 0, - ref_key: "tooltipRef", - ref: tooltipRef, - class: "node-tooltip", - style: normalizeStyle({ left: left.value, top: top.value }) - }, toDisplayString(tooltipText.value), 5)) : createCommentVNode("", true); +} +__name(_unsupportedIterableToArray$2, "_unsupportedIterableToArray$2"); +function _iterableToArray$2(r) { + if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); +} +__name(_iterableToArray$2, "_iterableToArray$2"); +function _arrayWithoutHoles$2(r) { + if (Array.isArray(r)) return _arrayLikeToArray$2(r); +} +__name(_arrayWithoutHoles$2, "_arrayWithoutHoles$2"); +function _arrayLikeToArray$2(r, a) { + (null == a || a > r.length) && (a = r.length); + for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; + return n; +} +__name(_arrayLikeToArray$2, "_arrayLikeToArray$2"); +var script$a = { + name: "Splitter", + "extends": script$1$8, + inheritAttrs: false, + emits: ["resizestart", "resizeend", "resize"], + dragging: false, + mouseMoveListener: null, + mouseUpListener: null, + touchMoveListener: null, + touchEndListener: null, + size: null, + gutterElement: null, + startPos: null, + prevPanelElement: null, + nextPanelElement: null, + nextPanelSize: null, + prevPanelSize: null, + panelSizes: null, + prevPanelIndex: null, + timer: null, + data: /* @__PURE__ */ __name(function data2() { + return { + prevSize: null }; - } -}); -const NodeTooltip = /* @__PURE__ */ _export_sfc(_sfc_main$l, [["__scopeId", "data-v-46859edf"]]); -const _sfc_main$k = /* @__PURE__ */ defineComponent({ - __name: "TitleEditor", - setup(__props) { - const settingStore = useSettingStore(); - const showInput = ref(false); - const editedTitle = ref(""); - const inputStyle = ref({ - position: "fixed", - left: "0px", - top: "0px", - width: "200px", - height: "20px", - fontSize: "12px" - }); - const titleEditorStore = useTitleEditorStore(); - const canvasStore = useCanvasStore(); - const previousCanvasDraggable = ref(true); - const onEdit = /* @__PURE__ */ __name((newValue) => { - if (titleEditorStore.titleEditorTarget && newValue.trim() !== "") { - titleEditorStore.titleEditorTarget.title = newValue.trim(); - app.graph.setDirtyCanvas(true, true); + }, "data"), + mounted: /* @__PURE__ */ __name(function mounted2() { + var _this = this; + if (this.panels && this.panels.length) { + var initialized = false; + if (this.isStateful()) { + initialized = this.restoreState(); } - showInput.value = false; - titleEditorStore.titleEditorTarget = null; - canvasStore.canvas.allow_dragcanvas = previousCanvasDraggable.value; - }, "onEdit"); - watch( - () => titleEditorStore.titleEditorTarget, - (target) => { - if (target === null) { - return; - } - editedTitle.value = target.title; - showInput.value = true; - previousCanvasDraggable.value = canvasStore.canvas.allow_dragcanvas; - canvasStore.canvas.allow_dragcanvas = false; - if (target instanceof LGraphGroup) { - const group = target; - const [x, y] = group.pos; - const [w, h] = group.size; - const [left, top] = app.canvasPosToClientPos([x, y]); - inputStyle.value.left = `${left}px`; - inputStyle.value.top = `${top}px`; - const width = w * app.canvas.ds.scale; - const height = group.titleHeight * app.canvas.ds.scale; - inputStyle.value.width = `${width}px`; - inputStyle.value.height = `${height}px`; - const fontSize = group.font_size * app.canvas.ds.scale; - inputStyle.value.fontSize = `${fontSize}px`; - } else if (target instanceof LGraphNode) { - const node = target; - const [x, y] = node.getBounding(); - const canvasWidth = node.width; - const canvasHeight = LiteGraph.NODE_TITLE_HEIGHT; - const [left, top] = app.canvasPosToClientPos([x, y]); - inputStyle.value.left = `${left}px`; - inputStyle.value.top = `${top}px`; - const width = canvasWidth * app.canvas.ds.scale; - const height = canvasHeight * app.canvas.ds.scale; - inputStyle.value.width = `${width}px`; - inputStyle.value.height = `${height}px`; - const fontSize = 12 * app.canvas.ds.scale; - inputStyle.value.fontSize = `${fontSize}px`; - } + if (!initialized) { + var children = _toConsumableArray$2(this.$el.children).filter(function(child) { + return child.getAttribute("data-pc-name") === "splitterpanel"; + }); + var _panelSizes = []; + this.panels.map(function(panel, i) { + var panelInitialSize = panel.props && panel.props.size ? panel.props.size : null; + var panelSize = panelInitialSize || 100 / _this.panels.length; + _panelSizes[i] = panelSize; + children[i].style.flexBasis = "calc(" + panelSize + "% - " + (_this.panels.length - 1) * _this.gutterSize + "px)"; + }); + this.panelSizes = _panelSizes; + this.prevSize = parseFloat(_panelSizes[0]).toFixed(4); } - ); - const canvasEventHandler = /* @__PURE__ */ __name((event) => { - if (event.detail.subType === "group-double-click") { - if (!settingStore.get("Comfy.Group.DoubleClickTitleToEdit")) { - return; - } - const group = event.detail.group; - const [x, y] = group.pos; - const e = event.detail.originalEvent; - const relativeY = e.canvasY - y; - if (relativeY <= group.titleHeight) { - titleEditorStore.titleEditorTarget = group; - } - } else if (event.detail.subType === "node-double-click") { - if (!settingStore.get("Comfy.Node.DoubleClickTitleToEdit")) { - return; - } - const node = event.detail.node; - const [x, y] = node.pos; - const e = event.detail.originalEvent; - const relativeY = e.canvasY - y; - if (relativeY <= 0) { - titleEditorStore.titleEditorTarget = node; + } + }, "mounted"), + beforeUnmount: /* @__PURE__ */ __name(function beforeUnmount2() { + this.clear(); + this.unbindMouseListeners(); + }, "beforeUnmount"), + methods: { + isSplitterPanel: /* @__PURE__ */ __name(function isSplitterPanel(child) { + return child.type.name === "SplitterPanel"; + }, "isSplitterPanel"), + onResizeStart: /* @__PURE__ */ __name(function onResizeStart(event, index, isKeyDown) { + this.gutterElement = event.currentTarget || event.target.parentElement; + this.size = this.horizontal ? getWidth(this.$el) : getHeight(this.$el); + if (!isKeyDown) { + this.dragging = true; + this.startPos = this.layout === "horizontal" ? event.pageX || event.changedTouches[0].pageX : event.pageY || event.changedTouches[0].pageY; + } + this.prevPanelElement = this.gutterElement.previousElementSibling; + this.nextPanelElement = this.gutterElement.nextElementSibling; + if (isKeyDown) { + this.prevPanelSize = this.horizontal ? getOuterWidth(this.prevPanelElement, true) : getOuterHeight(this.prevPanelElement, true); + this.nextPanelSize = this.horizontal ? getOuterWidth(this.nextPanelElement, true) : getOuterHeight(this.nextPanelElement, true); + } else { + this.prevPanelSize = 100 * (this.horizontal ? getOuterWidth(this.prevPanelElement, true) : getOuterHeight(this.prevPanelElement, true)) / this.size; + this.nextPanelSize = 100 * (this.horizontal ? getOuterWidth(this.nextPanelElement, true) : getOuterHeight(this.nextPanelElement, true)) / this.size; + } + this.prevPanelIndex = index; + this.$emit("resizestart", { + originalEvent: event, + sizes: this.panelSizes + }); + this.$refs.gutter[index].setAttribute("data-p-gutter-resizing", true); + this.$el.setAttribute("data-p-resizing", true); + }, "onResizeStart"), + onResize: /* @__PURE__ */ __name(function onResize(event, step, isKeyDown) { + var newPos, newPrevPanelSize, newNextPanelSize; + if (isKeyDown) { + if (this.horizontal) { + newPrevPanelSize = 100 * (this.prevPanelSize + step) / this.size; + newNextPanelSize = 100 * (this.nextPanelSize - step) / this.size; + } else { + newPrevPanelSize = 100 * (this.prevPanelSize - step) / this.size; + newNextPanelSize = 100 * (this.nextPanelSize + step) / this.size; } + } else { + if (this.horizontal) newPos = event.pageX * 100 / this.size - this.startPos * 100 / this.size; + else newPos = event.pageY * 100 / this.size - this.startPos * 100 / this.size; + newPrevPanelSize = this.prevPanelSize + newPos; + newNextPanelSize = this.nextPanelSize - newPos; } - }, "canvasEventHandler"); - useEventListener(document, "litegraph:canvas", canvasEventHandler); - return (_ctx, _cache) => { - return showInput.value ? (openBlock(), createElementBlock("div", { - key: 0, - class: "group-title-editor node-title-editor", - style: normalizeStyle(inputStyle.value) - }, [ - createVNode(EditableText, { - isEditing: showInput.value, - modelValue: editedTitle.value, - onEdit - }, null, 8, ["isEditing", "modelValue"]) - ], 4)) : createCommentVNode("", true); - }; - } -}); -const TitleEditor = /* @__PURE__ */ _export_sfc(_sfc_main$k, [["__scopeId", "data-v-12d3fd12"]]); -const useSearchBoxStore = defineStore("searchBox", () => { - const visible = ref(false); - function toggleVisible() { - visible.value = !visible.value; - } - __name(toggleVisible, "toggleVisible"); - return { - visible, - toggleVisible - }; -}); -class ConnectingLinkImpl { - static { - __name(this, "ConnectingLinkImpl"); - } - constructor(node, slot, input, output, pos, afterRerouteId) { - this.node = node; - this.slot = slot; - this.input = input; - this.output = output; - this.pos = pos; - this.afterRerouteId = afterRerouteId; + if (this.validateResize(newPrevPanelSize, newNextPanelSize)) { + this.prevPanelElement.style.flexBasis = "calc(" + newPrevPanelSize + "% - " + (this.panels.length - 1) * this.gutterSize + "px)"; + this.nextPanelElement.style.flexBasis = "calc(" + newNextPanelSize + "% - " + (this.panels.length - 1) * this.gutterSize + "px)"; + this.panelSizes[this.prevPanelIndex] = newPrevPanelSize; + this.panelSizes[this.prevPanelIndex + 1] = newNextPanelSize; + this.prevSize = parseFloat(newPrevPanelSize).toFixed(4); + } + this.$emit("resize", { + originalEvent: event, + sizes: this.panelSizes + }); + }, "onResize"), + onResizeEnd: /* @__PURE__ */ __name(function onResizeEnd(event) { + if (this.isStateful()) { + this.saveState(); + } + this.$emit("resizeend", { + originalEvent: event, + sizes: this.panelSizes + }); + this.$refs.gutter.forEach(function(gutter) { + return gutter.setAttribute("data-p-gutter-resizing", false); + }); + this.$el.setAttribute("data-p-resizing", false); + this.clear(); + }, "onResizeEnd"), + repeat: /* @__PURE__ */ __name(function repeat(event, index, step) { + this.onResizeStart(event, index, true); + this.onResize(event, step, true); + }, "repeat"), + setTimer: /* @__PURE__ */ __name(function setTimer(event, index, step) { + var _this2 = this; + if (!this.timer) { + this.timer = setInterval(function() { + _this2.repeat(event, index, step); + }, 40); + } + }, "setTimer"), + clearTimer: /* @__PURE__ */ __name(function clearTimer() { + if (this.timer) { + clearInterval(this.timer); + this.timer = null; + } + }, "clearTimer"), + onGutterKeyUp: /* @__PURE__ */ __name(function onGutterKeyUp() { + this.clearTimer(); + this.onResizeEnd(); + }, "onGutterKeyUp"), + onGutterKeyDown: /* @__PURE__ */ __name(function onGutterKeyDown(event, index) { + switch (event.code) { + case "ArrowLeft": { + if (this.layout === "horizontal") { + this.setTimer(event, index, this.step * -1); + } + event.preventDefault(); + break; + } + case "ArrowRight": { + if (this.layout === "horizontal") { + this.setTimer(event, index, this.step); + } + event.preventDefault(); + break; + } + case "ArrowDown": { + if (this.layout === "vertical") { + this.setTimer(event, index, this.step * -1); + } + event.preventDefault(); + break; + } + case "ArrowUp": { + if (this.layout === "vertical") { + this.setTimer(event, index, this.step); + } + event.preventDefault(); + break; + } + } + }, "onGutterKeyDown"), + onGutterMouseDown: /* @__PURE__ */ __name(function onGutterMouseDown(event, index) { + this.onResizeStart(event, index); + this.bindMouseListeners(); + }, "onGutterMouseDown"), + onGutterTouchStart: /* @__PURE__ */ __name(function onGutterTouchStart(event, index) { + this.onResizeStart(event, index); + this.bindTouchListeners(); + event.preventDefault(); + }, "onGutterTouchStart"), + onGutterTouchMove: /* @__PURE__ */ __name(function onGutterTouchMove(event) { + this.onResize(event); + event.preventDefault(); + }, "onGutterTouchMove"), + onGutterTouchEnd: /* @__PURE__ */ __name(function onGutterTouchEnd(event) { + this.onResizeEnd(event); + this.unbindTouchListeners(); + event.preventDefault(); + }, "onGutterTouchEnd"), + bindMouseListeners: /* @__PURE__ */ __name(function bindMouseListeners() { + var _this3 = this; + if (!this.mouseMoveListener) { + this.mouseMoveListener = function(event) { + return _this3.onResize(event); + }; + document.addEventListener("mousemove", this.mouseMoveListener); + } + if (!this.mouseUpListener) { + this.mouseUpListener = function(event) { + _this3.onResizeEnd(event); + _this3.unbindMouseListeners(); + }; + document.addEventListener("mouseup", this.mouseUpListener); + } + }, "bindMouseListeners"), + bindTouchListeners: /* @__PURE__ */ __name(function bindTouchListeners() { + var _this4 = this; + if (!this.touchMoveListener) { + this.touchMoveListener = function(event) { + return _this4.onResize(event.changedTouches[0]); + }; + document.addEventListener("touchmove", this.touchMoveListener); + } + if (!this.touchEndListener) { + this.touchEndListener = function(event) { + _this4.resizeEnd(event); + _this4.unbindTouchListeners(); + }; + document.addEventListener("touchend", this.touchEndListener); + } + }, "bindTouchListeners"), + validateResize: /* @__PURE__ */ __name(function validateResize(newPrevPanelSize, newNextPanelSize) { + if (newPrevPanelSize > 100 || newPrevPanelSize < 0) return false; + if (newNextPanelSize > 100 || newNextPanelSize < 0) return false; + var prevPanelMinSize = getVNodeProp(this.panels[this.prevPanelIndex], "minSize"); + if (this.panels[this.prevPanelIndex].props && prevPanelMinSize && prevPanelMinSize > newPrevPanelSize) { + return false; + } + var newPanelMinSize = getVNodeProp(this.panels[this.prevPanelIndex + 1], "minSize"); + if (this.panels[this.prevPanelIndex + 1].props && newPanelMinSize && newPanelMinSize > newNextPanelSize) { + return false; + } + return true; + }, "validateResize"), + unbindMouseListeners: /* @__PURE__ */ __name(function unbindMouseListeners() { + if (this.mouseMoveListener) { + document.removeEventListener("mousemove", this.mouseMoveListener); + this.mouseMoveListener = null; + } + if (this.mouseUpListener) { + document.removeEventListener("mouseup", this.mouseUpListener); + this.mouseUpListener = null; + } + }, "unbindMouseListeners"), + unbindTouchListeners: /* @__PURE__ */ __name(function unbindTouchListeners() { + if (this.touchMoveListener) { + document.removeEventListener("touchmove", this.touchMoveListener); + this.touchMoveListener = null; + } + if (this.touchEndListener) { + document.removeEventListener("touchend", this.touchEndListener); + this.touchEndListener = null; + } + }, "unbindTouchListeners"), + clear: /* @__PURE__ */ __name(function clear() { + this.dragging = false; + this.size = null; + this.startPos = null; + this.prevPanelElement = null; + this.nextPanelElement = null; + this.prevPanelSize = null; + this.nextPanelSize = null; + this.gutterElement = null; + this.prevPanelIndex = null; + }, "clear"), + isStateful: /* @__PURE__ */ __name(function isStateful() { + return this.stateKey != null; + }, "isStateful"), + getStorage: /* @__PURE__ */ __name(function getStorage() { + switch (this.stateStorage) { + case "local": + return window.localStorage; + case "session": + return window.sessionStorage; + default: + throw new Error(this.stateStorage + ' is not a valid value for the state storage, supported values are "local" and "session".'); + } + }, "getStorage"), + saveState: /* @__PURE__ */ __name(function saveState() { + if (isArray(this.panelSizes)) { + this.getStorage().setItem(this.stateKey, JSON.stringify(this.panelSizes)); + } + }, "saveState"), + restoreState: /* @__PURE__ */ __name(function restoreState() { + var _this5 = this; + var storage = this.getStorage(); + var stateString = storage.getItem(this.stateKey); + if (stateString) { + this.panelSizes = JSON.parse(stateString); + var children = _toConsumableArray$2(this.$el.children).filter(function(child) { + return child.getAttribute("data-pc-name") === "splitterpanel"; + }); + children.forEach(function(child, i) { + child.style.flexBasis = "calc(" + _this5.panelSizes[i] + "% - " + (_this5.panels.length - 1) * _this5.gutterSize + "px)"; + }); + return true; + } + return false; + }, "restoreState") + }, + computed: { + panels: /* @__PURE__ */ __name(function panels() { + var _this6 = this; + var panels2 = []; + this.$slots["default"]().forEach(function(child) { + if (_this6.isSplitterPanel(child)) { + panels2.push(child); + } else if (child.children instanceof Array) { + child.children.forEach(function(nestedChild) { + if (_this6.isSplitterPanel(nestedChild)) { + panels2.push(nestedChild); + } + }); + } + }); + return panels2; + }, "panels"), + gutterStyle: /* @__PURE__ */ __name(function gutterStyle() { + if (this.horizontal) return { + width: this.gutterSize + "px" + }; + else return { + height: this.gutterSize + "px" + }; + }, "gutterStyle"), + horizontal: /* @__PURE__ */ __name(function horizontal() { + return this.layout === "horizontal"; + }, "horizontal"), + getPTOptions: /* @__PURE__ */ __name(function getPTOptions() { + var _this$$parentInstance; + return { + context: { + nested: (_this$$parentInstance = this.$parentInstance) === null || _this$$parentInstance === void 0 ? void 0 : _this$$parentInstance.nestedState + } + }; + }, "getPTOptions") } - static createFromPlainObject(obj) { - return new ConnectingLinkImpl( - obj.node, - obj.slot, - obj.input, - obj.output, - obj.pos, - obj.afterRerouteId - ); - } - get type() { - const result = this.input ? this.input.type : this.output?.type ?? null; - return result === -1 ? null : result; - } - /** - * Which slot type is release and need to be reconnected. - * - 'output' means we need a new node's outputs slot to connect with this link - */ - get releaseSlotType() { - return this.output ? "input" : "output"; - } - connectTo(newNode) { - const newNodeSlots = this.releaseSlotType === "output" ? newNode.outputs : newNode.inputs; - if (!newNodeSlots) return; - const newNodeSlot = newNodeSlots.findIndex( - (slot) => LiteGraph.isValidConnection(slot.type, this.type) - ); - if (newNodeSlot === -1) { - console.warn( - `Could not find slot with type ${this.type} on node ${newNode.title}. This should never happen` - ); - return; - } - if (this.releaseSlotType === "input") { - this.node.connect(this.slot, newNode, newNodeSlot, this.afterRerouteId); - } else { - newNode.connect(newNodeSlot, this.node, this.slot, this.afterRerouteId); +}; +var _hoisted_1$k = ["onMousedown", "onTouchstart", "onTouchmove", "onTouchend"]; +var _hoisted_2$h = ["aria-orientation", "aria-valuenow", "onKeydown"]; +function render$g(_ctx, _cache, $props, $setup, $data, $options) { + return openBlock(), createElementBlock("div", mergeProps({ + "class": _ctx.cx("root"), + style: _ctx.sx("root"), + "data-p-resizing": false + }, _ctx.ptmi("root", $options.getPTOptions)), [(openBlock(true), createElementBlock(Fragment, null, renderList($options.panels, function(panel, i) { + return openBlock(), createElementBlock(Fragment, { + key: i + }, [(openBlock(), createBlock(resolveDynamicComponent(panel), { + tabindex: "-1" + })), i !== $options.panels.length - 1 ? (openBlock(), createElementBlock("div", mergeProps({ + key: 0, + ref_for: true, + ref: "gutter", + "class": _ctx.cx("gutter"), + role: "separator", + tabindex: "-1", + onMousedown: /* @__PURE__ */ __name(function onMousedown($event) { + return $options.onGutterMouseDown($event, i); + }, "onMousedown"), + onTouchstart: /* @__PURE__ */ __name(function onTouchstart($event) { + return $options.onGutterTouchStart($event, i); + }, "onTouchstart"), + onTouchmove: /* @__PURE__ */ __name(function onTouchmove($event) { + return $options.onGutterTouchMove($event, i); + }, "onTouchmove"), + onTouchend: /* @__PURE__ */ __name(function onTouchend($event) { + return $options.onGutterTouchEnd($event, i); + }, "onTouchend"), + "data-p-gutter-resizing": false + }, _ctx.ptm("gutter")), [createBaseVNode("div", mergeProps({ + "class": _ctx.cx("gutterHandle"), + tabindex: "0", + style: [$options.gutterStyle], + "aria-orientation": _ctx.layout, + "aria-valuenow": $data.prevSize, + onKeyup: _cache[0] || (_cache[0] = function() { + return $options.onGutterKeyUp && $options.onGutterKeyUp.apply($options, arguments); + }), + onKeydown: /* @__PURE__ */ __name(function onKeydown2($event) { + return $options.onGutterKeyDown($event, i); + }, "onKeydown"), + ref_for: true + }, _ctx.ptm("gutterHandle")), null, 16, _hoisted_2$h)], 16, _hoisted_1$k)) : createCommentVNode("", true)], 64); + }), 128))], 16); +} +__name(render$g, "render$g"); +script$a.render = render$g; +var classes$7 = { + root: /* @__PURE__ */ __name(function root4(_ref) { + var instance = _ref.instance; + return ["p-splitterpanel", { + "p-splitterpanel-nested": instance.isNested + }]; + }, "root") +}; +var SplitterPanelStyle = BaseStyle.extend({ + name: "splitterpanel", + classes: classes$7 +}); +var script$1$7 = { + name: "BaseSplitterPanel", + "extends": script$g, + props: { + size: { + type: Number, + "default": null + }, + minSize: { + type: Number, + "default": null } + }, + style: SplitterPanelStyle, + provide: /* @__PURE__ */ __name(function provide6() { + return { + $pcSplitterPanel: this, + $parentInstance: this + }; + }, "provide") +}; +var script$9 = { + name: "SplitterPanel", + "extends": script$1$7, + inheritAttrs: false, + data: /* @__PURE__ */ __name(function data3() { + return { + nestedState: null + }; + }, "data"), + computed: { + isNested: /* @__PURE__ */ __name(function isNested() { + var _this = this; + return this.$slots["default"]().some(function(child) { + _this.nestedState = child.type.name === "Splitter" ? true : null; + return _this.nestedState; + }); + }, "isNested"), + getPTOptions: /* @__PURE__ */ __name(function getPTOptions2() { + return { + context: { + nested: this.isNested + } + }; + }, "getPTOptions") } +}; +function render$f(_ctx, _cache, $props, $setup, $data, $options) { + return openBlock(), createElementBlock("div", mergeProps({ + ref: "container", + "class": _ctx.cx("root") + }, _ctx.ptmi("root", $options.getPTOptions)), [renderSlot(_ctx.$slots, "default")], 16); } -var theme$5 = /* @__PURE__ */ __name(function theme3(_ref) { +__name(render$f, "render$f"); +script$9.render = render$f; +const _sfc_main$l = /* @__PURE__ */ defineComponent({ + __name: "LiteGraphCanvasSplitterOverlay", + setup(__props) { + const settingStore = useSettingStore(); + const sidebarLocation = computed( + () => settingStore.get("Comfy.Sidebar.Location") + ); + const sidebarPanelVisible = computed( + () => useSidebarTabStore().activeSidebarTab !== null + ); + const bottomPanelVisible = computed( + () => useBottomPanelStore().bottomPanelVisible + ); + const activeSidebarTabId = computed( + () => useSidebarTabStore().activeSidebarTabId + ); + return (_ctx, _cache) => { + return openBlock(), createBlock(unref(script$a), { + class: "splitter-overlay-root splitter-overlay", + "pt:gutter": sidebarPanelVisible.value ? "" : "hidden", + key: activeSidebarTabId.value, + stateKey: activeSidebarTabId.value, + stateStorage: "local" + }, { + default: withCtx(() => [ + sidebarLocation.value === "left" ? withDirectives((openBlock(), createBlock(unref(script$9), { + key: 0, + class: "side-bar-panel", + minSize: 10, + size: 20 + }, { + default: withCtx(() => [ + renderSlot(_ctx.$slots, "side-bar-panel", {}, void 0, true) + ]), + _: 3 + }, 512)), [ + [vShow, sidebarPanelVisible.value] + ]) : createCommentVNode("", true), + createVNode(unref(script$9), { size: 100 }, { + default: withCtx(() => [ + createVNode(unref(script$a), { + class: "splitter-overlay max-w-full", + layout: "vertical", + "pt:gutter": bottomPanelVisible.value ? "" : "hidden", + stateKey: "bottom-panel-splitter", + stateStorage: "local" + }, { + default: withCtx(() => [ + createVNode(unref(script$9), { class: "graph-canvas-panel relative" }, { + default: withCtx(() => [ + renderSlot(_ctx.$slots, "graph-canvas-panel", {}, void 0, true) + ]), + _: 3 + }), + withDirectives(createVNode(unref(script$9), { class: "bottom-panel" }, { + default: withCtx(() => [ + renderSlot(_ctx.$slots, "bottom-panel", {}, void 0, true) + ]), + _: 3 + }, 512), [ + [vShow, bottomPanelVisible.value] + ]) + ]), + _: 3 + }, 8, ["pt:gutter"]) + ]), + _: 3 + }), + sidebarLocation.value === "right" ? withDirectives((openBlock(), createBlock(unref(script$9), { + key: 1, + class: "side-bar-panel", + minSize: 10, + size: 20 + }, { + default: withCtx(() => [ + renderSlot(_ctx.$slots, "side-bar-panel", {}, void 0, true) + ]), + _: 3 + }, 512)), [ + [vShow, sidebarPanelVisible.value] + ]) : createCommentVNode("", true) + ]), + _: 3 + }, 8, ["pt:gutter", "stateKey"]); + }; + } +}); +const LiteGraphCanvasSplitterOverlay = /* @__PURE__ */ _export_sfc(_sfc_main$l, [["__scopeId", "data-v-95268c0b"]]); +var theme$6 = /* @__PURE__ */ __name(function theme3(_ref) { var dt = _ref.dt; return "\n.p-autocomplete {\n display: inline-flex;\n}\n\n.p-autocomplete-loader {\n position: absolute;\n top: 50%;\n margin-top: -0.5rem;\n right: ".concat(dt("autocomplete.padding.x"), ";\n}\n\n.p-autocomplete:has(.p-autocomplete-dropdown) .p-autocomplete-loader {\n right: calc(").concat(dt("autocomplete.dropdown.width"), " + ").concat(dt("autocomplete.padding.x"), ");\n}\n\n.p-autocomplete:has(.p-autocomplete-dropdown) .p-autocomplete-input {\n flex: 1 1 auto;\n width: 1%;\n}\n\n.p-autocomplete:has(.p-autocomplete-dropdown) .p-autocomplete-input,\n.p-autocomplete:has(.p-autocomplete-dropdown) .p-autocomplete-input-multiple {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.p-autocomplete-dropdown {\n cursor: pointer;\n display: inline-flex;\n cursor: pointer;\n user-select: none;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n position: relative;\n width: ").concat(dt("autocomplete.dropdown.width"), ";\n border-top-right-radius: ").concat(dt("autocomplete.dropdown.border.radius"), ";\n border-bottom-right-radius: ").concat(dt("autocomplete.dropdown.border.radius"), ";\n background: ").concat(dt("autocomplete.dropdown.background"), ";\n border: 1px solid ").concat(dt("autocomplete.dropdown.border.color"), ";\n border-left: 0 none;\n color: ").concat(dt("autocomplete.dropdown.color"), ";\n transition: background ").concat(dt("autocomplete.transition.duration"), ", color ").concat(dt("autocomplete.transition.duration"), ", border-color ").concat(dt("autocomplete.transition.duration"), ", outline-color ").concat(dt("autocomplete.transition.duration"), ", box-shadow ").concat(dt("autocomplete.transition.duration"), ";\n outline-color: transparent;\n}\n\n.p-autocomplete-dropdown:not(:disabled):hover {\n background: ").concat(dt("autocomplete.dropdown.hover.background"), ";\n border-color: ").concat(dt("autocomplete.dropdown.hover.border.color"), ";\n color: ").concat(dt("autocomplete.dropdown.hover.color"), ";\n}\n\n.p-autocomplete-dropdown:not(:disabled):active {\n background: ").concat(dt("autocomplete.dropdown.active.background"), ";\n border-color: ").concat(dt("autocomplete.dropdown.active.border.color"), ";\n color: ").concat(dt("autocomplete.dropdown.active.color"), ";\n}\n\n.p-autocomplete-dropdown:focus-visible {\n box-shadow: ").concat(dt("autocomplete.dropdown.focus.ring.shadow"), ";\n outline: ").concat(dt("autocomplete.dropdown.focus.ring.width"), " ").concat(dt("autocomplete.dropdown.focus.ring.style"), " ").concat(dt("autocomplete.dropdown.focus.ring.color"), ";\n outline-offset: ").concat(dt("autocomplete.dropdown.focus.ring.offset"), ";\n}\n\n.p-autocomplete .p-autocomplete-overlay {\n min-width: 100%;\n}\n\n.p-autocomplete-overlay {\n position: absolute;\n overflow: auto;\n top: 0;\n left: 0;\n background: ").concat(dt("autocomplete.overlay.background"), ";\n color: ").concat(dt("autocomplete.overlay.color"), ";\n border: 1px solid ").concat(dt("autocomplete.overlay.border.color"), ";\n border-radius: ").concat(dt("autocomplete.overlay.border.radius"), ";\n box-shadow: ").concat(dt("autocomplete.overlay.shadow"), ";\n}\n\n.p-autocomplete-list {\n margin: 0;\n padding: 0;\n list-style-type: none;\n display: flex;\n flex-direction: column;\n gap: ").concat(dt("autocomplete.list.gap"), ";\n padding: ").concat(dt("autocomplete.list.padding"), ";\n}\n\n.p-autocomplete-option {\n cursor: pointer;\n white-space: nowrap;\n position: relative;\n overflow: hidden;\n display: flex;\n align-items: center;\n padding: ").concat(dt("autocomplete.option.padding"), ";\n border: 0 none;\n color: ").concat(dt("autocomplete.option.color"), ";\n background: transparent;\n transition: background ").concat(dt("autocomplete.transition.duration"), ", color ").concat(dt("autocomplete.transition.duration"), ", border-color ").concat(dt("autocomplete.transition.duration"), ";\n border-radius: ").concat(dt("autocomplete.option.border.radius"), ";\n}\n\n.p-autocomplete-option:not(.p-autocomplete-option-selected):not(.p-disabled).p-focus {\n background: ").concat(dt("autocomplete.option.focus.background"), ";\n color: ").concat(dt("autocomplete.option.focus.color"), ";\n}\n\n.p-autocomplete-option-selected {\n background: ").concat(dt("autocomplete.option.selected.background"), ";\n color: ").concat(dt("autocomplete.option.selected.color"), ";\n}\n\n.p-autocomplete-option-selected.p-focus {\n background: ").concat(dt("autocomplete.option.selected.focus.background"), ";\n color: ").concat(dt("autocomplete.option.selected.focus.color"), ";\n}\n\n.p-autocomplete-option-group {\n margin: 0;\n padding: ").concat(dt("autocomplete.option.group.padding"), ";\n color: ").concat(dt("autocomplete.option.group.color"), ";\n background: ").concat(dt("autocomplete.option.group.background"), ";\n font-weight: ").concat(dt("autocomplete.option.group.font.weight"), ";\n}\n\n.p-autocomplete-input-multiple {\n margin: 0;\n list-style-type: none;\n cursor: text;\n overflow: hidden;\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n padding: calc(").concat(dt("autocomplete.padding.y"), " / 2) ").concat(dt("autocomplete.padding.x"), ";\n gap: calc(").concat(dt("autocomplete.padding.y"), " / 2);\n color: ").concat(dt("autocomplete.color"), ";\n background: ").concat(dt("autocomplete.background"), ";\n border: 1px solid ").concat(dt("autocomplete.border.color"), ";\n border-radius: ").concat(dt("autocomplete.border.radius"), ";\n width: 100%;\n transition: background ").concat(dt("autocomplete.transition.duration"), ", color ").concat(dt("autocomplete.transition.duration"), ", border-color ").concat(dt("autocomplete.transition.duration"), ", outline-color ").concat(dt("autocomplete.transition.duration"), ", box-shadow ").concat(dt("autocomplete.transition.duration"), ";\n outline-color: transparent;\n box-shadow: ").concat(dt("autocomplete.shadow"), ";\n}\n\n.p-autocomplete:not(.p-disabled):hover .p-autocomplete-input-multiple {\n border-color: ").concat(dt("autocomplete.hover.border.color"), ";\n}\n\n.p-autocomplete:not(.p-disabled).p-focus .p-autocomplete-input-multiple {\n border-color: ").concat(dt("autocomplete.focus.border.color"), ";\n box-shadow: ").concat(dt("autocomplete.focus.ring.shadow"), ";\n outline: ").concat(dt("autocomplete.focus.ring.width"), " ").concat(dt("autocomplete.focus.ring.style"), " ").concat(dt("autocomplete.focus.ring.color"), ";\n outline-offset: ").concat(dt("autocomplete.focus.ring.offset"), ";\n}\n\n.p-autocomplete.p-invalid .p-autocomplete-input-multiple {\n border-color: ").concat(dt("autocomplete.invalid.border.color"), ";\n}\n\n.p-variant-filled.p-autocomplete-input-multiple {\n background: ").concat(dt("autocomplete.filled.background"), ";\n}\n\n.p-autocomplete:not(.p-disabled).p-focus .p-variant-filled.p-autocomplete-input-multiple {\n background: ").concat(dt("autocomplete.filled.focus.background"), ";\n}\n\n.p-autocomplete.p-disabled .p-autocomplete-input-multiple {\n opacity: 1;\n background: ").concat(dt("autocomplete.disabled.background"), ";\n color: ").concat(dt("autocomplete.disabled.color"), ";\n}\n\n.p-autocomplete-chip.p-chip {\n padding-top: calc(").concat(dt("autocomplete.padding.y"), " / 2);\n padding-bottom: calc(").concat(dt("autocomplete.padding.y"), " / 2);\n border-radius: ").concat(dt("autocomplete.chip.border.radius"), ";\n}\n\n.p-autocomplete-input-multiple:has(.p-autocomplete-chip) {\n padding-left: calc(").concat(dt("autocomplete.padding.y"), " / 2);\n padding-right: calc(").concat(dt("autocomplete.padding.y"), " / 2);\n}\n\n.p-autocomplete-chip-item.p-focus .p-autocomplete-chip {\n background: ").concat(dt("inputchips.chip.focus.background"), ";\n color: ").concat(dt("inputchips.chip.focus.color"), ";\n}\n\n.p-autocomplete-input-chip {\n flex: 1 1 auto;\n display: inline-flex;\n padding-top: calc(").concat(dt("autocomplete.padding.y"), " / 2);\n padding-bottom: calc(").concat(dt("autocomplete.padding.y"), " / 2);\n}\n\n.p-autocomplete-input-chip input {\n border: 0 none;\n outline: 0 none;\n background: transparent;\n margin: 0;\n padding: 0;\n box-shadow: none;\n border-radius: 0;\n width: 100%;\n font-family: inherit;\n font-feature-settings: inherit;\n font-size: 1rem;\n color: inherit;\n}\n\n.p-autocomplete-input-chip input::placeholder {\n color: ").concat(dt("autocomplete.placeholder.color"), ";\n}\n\n.p-autocomplete-empty-message {\n padding: ").concat(dt("autocomplete.empty.message.padding"), ";\n}\n\n.p-autocomplete-fluid {\n display: flex;\n}\n\n.p-autocomplete-fluid:has(.p-autocomplete-dropdown) .p-autocomplete-input {\n width: 1%;\n}\n"); }, "theme"); @@ -1763,7 +1508,7 @@ var inlineStyles$3 = { position: "relative" } }; -var classes$5 = { +var classes$6 = { root: /* @__PURE__ */ __name(function root5(_ref2) { var instance = _ref2.instance, props = _ref2.props; return ["p-autocomplete p-component p-inputwrapper", { @@ -1809,13 +1554,13 @@ var classes$5 = { }; var AutoCompleteStyle = BaseStyle.extend({ name: "autocomplete", - theme: theme$5, - classes: classes$5, + theme: theme$6, + classes: classes$6, inlineStyles: inlineStyles$3 }); -var script$1$5 = { +var script$1$6 = { name: "BaseAutoComplete", - "extends": script$e, + "extends": script$g, props: { modelValue: null, suggestions: { @@ -2042,9 +1787,9 @@ function _arrayLikeToArray$1(r, a) { return n; } __name(_arrayLikeToArray$1, "_arrayLikeToArray$1"); -var script$7 = { +var script$8 = { name: "AutoComplete", - "extends": script$1$5, + "extends": script$1$6, inheritAttrs: false, emits: ["update:modelValue", "change", "focus", "blur", "item-select", "item-unselect", "option-select", "option-unselect", "dropdown-click", "clear", "complete", "before-show", "before-hide", "show", "hide"], inject: { @@ -2810,12 +2555,12 @@ var script$7 = { }, "hasFluid") }, components: { - InputText: script$i, - VirtualScroller: script$j, - Portal: script$k, - ChevronDownIcon: script$l, - SpinnerIcon: script$m, - Chip: script$n + InputText: script$k, + VirtualScroller: script$l, + Portal: script$m, + ChevronDownIcon: script$n, + SpinnerIcon: script$o, + Chip: script$p }, directives: { ripple: Ripple @@ -2873,15 +2618,15 @@ function _toPrimitive$4(t, r) { return ("string" === r ? String : Number)(t); } __name(_toPrimitive$4, "_toPrimitive$4"); -var _hoisted_1$h = ["aria-activedescendant"]; -var _hoisted_2$e = ["id", "aria-label", "aria-setsize", "aria-posinset"]; -var _hoisted_3$c = ["id", "placeholder", "tabindex", "disabled", "aria-label", "aria-labelledby", "aria-expanded", "aria-controls", "aria-activedescendant", "aria-invalid"]; +var _hoisted_1$j = ["aria-activedescendant"]; +var _hoisted_2$g = ["id", "aria-label", "aria-setsize", "aria-posinset"]; +var _hoisted_3$e = ["id", "placeholder", "tabindex", "disabled", "aria-label", "aria-labelledby", "aria-expanded", "aria-controls", "aria-activedescendant", "aria-invalid"]; var _hoisted_4$4 = ["disabled", "aria-expanded", "aria-controls"]; var _hoisted_5$3 = ["id"]; var _hoisted_6$2 = ["id", "aria-label"]; var _hoisted_7$1 = ["id"]; var _hoisted_8$1 = ["id", "aria-label", "aria-selected", "aria-disabled", "aria-setsize", "aria-posinset", "onClick", "onMousemove", "data-p-selected", "data-p-focus", "data-p-disabled"]; -function render$c(_ctx, _cache, $props, $setup, $data, $options) { +function render$e(_ctx, _cache, $props, $setup, $data, $options) { var _component_InputText = resolveComponent("InputText"); var _component_Chip = resolveComponent("Chip"); var _component_SpinnerIcon = resolveComponent("SpinnerIcon"); @@ -2986,7 +2731,7 @@ function render$c(_ctx, _cache, $props, $setup, $data, $options) { }), _: 2 }, 1032, ["class", "label", "removeIcon", "unstyled", "onRemove", "pt"])]; - })], 16, _hoisted_2$e); + })], 16, _hoisted_2$g); }), 128)), createBaseVNode("li", mergeProps({ "class": _ctx.cx("inputChip"), role: "option" @@ -3024,7 +2769,7 @@ function render$c(_ctx, _cache, $props, $setup, $data, $options) { onChange: _cache[4] || (_cache[4] = function() { return $options.onChange && $options.onChange.apply($options, arguments); }) - }, _ctx.ptm("input")), null, 16, _hoisted_3$c)], 16)], 16, _hoisted_1$h)) : createCommentVNode("", true), $data.searching || _ctx.loading ? renderSlot(_ctx.$slots, _ctx.$slots.loader ? "loader" : "loadingicon", { + }, _ctx.ptm("input")), null, 16, _hoisted_3$e)], 16)], 16, _hoisted_1$j)) : createCommentVNode("", true), $data.searching || _ctx.loading ? renderSlot(_ctx.$slots, _ctx.$slots.loader ? "loader" : "loadingicon", { key: 2, "class": normalizeClass(_ctx.cx("loader")) }, function() { @@ -3180,4162 +2925,4161 @@ function render$c(_ctx, _cache, $props, $setup, $data, $options) { _: 2 }, [_ctx.$slots.loader ? { name: "loader", - fn: withCtx(function(_ref2) { - var options = _ref2.options; - return [renderSlot(_ctx.$slots, "loader", { - options - })]; - }), - key: "0" - } : void 0]), 1040, ["style", "items", "disabled", "pt"]), renderSlot(_ctx.$slots, "footer", { - value: _ctx.modelValue, - suggestions: $options.visibleOptions - }), createBaseVNode("span", mergeProps({ - role: "status", - "aria-live": "polite", - "class": "p-hidden-accessible" - }, _ctx.ptm("hiddenSelectedMessage"), { - "data-p-hidden-accessible": true - }), toDisplayString($options.selectedMessageText), 17)], 16, _hoisted_5$3)) : createCommentVNode("", true)]; - }), - _: 3 - }, 16, ["onEnter", "onAfterEnter", "onLeave", "onAfterLeave"])]; - }), - _: 3 - }, 8, ["appendTo"])], 16); -} -__name(render$c, "render$c"); -script$7.render = render$c; -const _sfc_main$j = { - name: "AutoCompletePlus", - extends: script$7, - emits: ["focused-option-changed"], - mounted() { - if (typeof script$7.mounted === "function") { - script$7.mounted.call(this); - } - this.$watch( - () => this.focusedOptionIndex, - (newVal, oldVal) => { - this.$emit("focused-option-changed", newVal); - } - ); - } -}; -const _withScopeId$5 = /* @__PURE__ */ __name((n) => (pushScopeId("data-v-5741c9ae"), n = n(), popScopeId(), n), "_withScopeId$5"); -const _hoisted_1$g = { class: "option-container flex justify-between items-center px-2 py-0 cursor-pointer overflow-hidden w-full" }; -const _hoisted_2$d = { class: "option-display-name font-semibold flex flex-col" }; -const _hoisted_3$b = { key: 0 }; -const _hoisted_4$3 = /* @__PURE__ */ _withScopeId$5(() => /* @__PURE__ */ createBaseVNode("i", { class: "pi pi-bookmark-fill text-sm mr-1" }, null, -1)); -const _hoisted_5$2 = [ - _hoisted_4$3 -]; -const _hoisted_6$1 = ["innerHTML"]; -const _hoisted_7 = /* @__PURE__ */ _withScopeId$5(() => /* @__PURE__ */ createBaseVNode("span", null, " ", -1)); -const _hoisted_8 = ["innerHTML"]; -const _hoisted_9 = { - key: 0, - class: "option-category font-light text-sm text-gray-400 overflow-hidden text-ellipsis whitespace-nowrap" -}; -const _hoisted_10 = { class: "option-badges" }; -const _sfc_main$i = /* @__PURE__ */ defineComponent({ - __name: "NodeSearchItem", - props: { - nodeDef: {}, - currentQuery: {} - }, - setup(__props) { - const settingStore = useSettingStore(); - const showCategory = computed( - () => settingStore.get("Comfy.NodeSearchBoxImpl.ShowCategory") - ); - const showIdName = computed( - () => settingStore.get("Comfy.NodeSearchBoxImpl.ShowIdName") - ); - const showNodeFrequency = computed( - () => settingStore.get("Comfy.NodeSearchBoxImpl.ShowNodeFrequency") - ); - const nodeFrequencyStore = useNodeFrequencyStore(); - const nodeFrequency = computed( - () => nodeFrequencyStore.getNodeFrequency(props.nodeDef) - ); - const nodeBookmarkStore = useNodeBookmarkStore(); - const isBookmarked = computed( - () => nodeBookmarkStore.isBookmarked(props.nodeDef) - ); - const props = __props; - return (_ctx, _cache) => { - return openBlock(), createElementBlock("div", _hoisted_1$g, [ - createBaseVNode("div", _hoisted_2$d, [ - createBaseVNode("div", null, [ - isBookmarked.value ? (openBlock(), createElementBlock("span", _hoisted_3$b, _hoisted_5$2)) : createCommentVNode("", true), - createBaseVNode("span", { - innerHTML: unref(highlightQuery)(_ctx.nodeDef.display_name, _ctx.currentQuery) - }, null, 8, _hoisted_6$1), - _hoisted_7, - showIdName.value ? (openBlock(), createBlock(unref(script$o), { - key: 1, - severity: "secondary" - }, { - default: withCtx(() => [ - createBaseVNode("span", { - innerHTML: unref(highlightQuery)(_ctx.nodeDef.name, _ctx.currentQuery) - }, null, 8, _hoisted_8) - ]), - _: 1 - })) : createCommentVNode("", true) - ]), - showCategory.value ? (openBlock(), createElementBlock("div", _hoisted_9, toDisplayString(_ctx.nodeDef.category.replaceAll("/", " > ")), 1)) : createCommentVNode("", true) - ]), - createBaseVNode("div", _hoisted_10, [ - _ctx.nodeDef.experimental ? (openBlock(), createBlock(unref(script$o), { - key: 0, - value: _ctx.$t("g.experimental"), - severity: "primary" - }, null, 8, ["value"])) : createCommentVNode("", true), - _ctx.nodeDef.deprecated ? (openBlock(), createBlock(unref(script$o), { - key: 1, - value: _ctx.$t("g.deprecated"), - severity: "danger" - }, null, 8, ["value"])) : createCommentVNode("", true), - showNodeFrequency.value && nodeFrequency.value > 0 ? (openBlock(), createBlock(unref(script$o), { - key: 2, - value: unref(formatNumberWithSuffix)(nodeFrequency.value, { roundToInt: true }), - severity: "secondary" - }, null, 8, ["value"])) : createCommentVNode("", true), - _ctx.nodeDef.nodeSource.type !== unref(NodeSourceType).Unknown ? (openBlock(), createBlock(unref(script$n), { - key: 3, - class: "text-sm font-light" - }, { - default: withCtx(() => [ - createTextVNode(toDisplayString(_ctx.nodeDef.nodeSource.displayText), 1) - ]), - _: 1 - })) : createCommentVNode("", true) - ]) - ]); - }; - } -}); -const NodeSearchItem = /* @__PURE__ */ _export_sfc(_sfc_main$i, [["__scopeId", "data-v-5741c9ae"]]); -const _hoisted_1$f = { class: "comfy-vue-node-search-container flex justify-center items-center w-full min-w-96 pointer-events-auto" }; -const _hoisted_2$c = { - key: 0, - class: "comfy-vue-node-preview-container absolute left-[-350px] top-[50px]" -}; -const _hoisted_3$a = /* @__PURE__ */ createBaseVNode("h3", null, "Add node filter condition", -1); -const _hoisted_4$2 = { class: "_dialog-body" }; -const _sfc_main$h = /* @__PURE__ */ defineComponent({ - __name: "NodeSearchBox", - props: { - filters: {}, - searchLimit: { default: 64 } - }, - emits: ["addFilter", "removeFilter", "addNode"], - setup(__props, { emit: __emit }) { - const settingStore = useSettingStore(); - const { t } = useI18n(); - const enableNodePreview = computed( - () => settingStore.get("Comfy.NodeSearchBoxImpl.NodePreview") - ); - const props = __props; - const nodeSearchFilterVisible = ref(false); - const inputId = `comfy-vue-node-search-box-input-${Math.random()}`; - const suggestions2 = ref([]); - const hoveredSuggestion = ref(null); - const currentQuery = ref(""); - const placeholder = computed(() => { - return props.filters.length === 0 ? t("g.searchNodes") + "..." : ""; - }); - const nodeDefStore = useNodeDefStore(); - const nodeFrequencyStore = useNodeFrequencyStore(); - const search2 = /* @__PURE__ */ __name((query) => { - const queryIsEmpty = query === "" && props.filters.length === 0; - currentQuery.value = query; - suggestions2.value = queryIsEmpty ? nodeFrequencyStore.topNodeDefs : [ - ...nodeDefStore.nodeSearchService.searchNode(query, props.filters, { - limit: props.searchLimit - }) - ]; - }, "search"); - const emit = __emit; - let inputElement = null; - const reFocusInput = /* @__PURE__ */ __name(() => { - inputElement ??= document.getElementById(inputId); - if (inputElement) { - inputElement.blur(); - nextTick(() => inputElement?.focus()); - } - }, "reFocusInput"); - onMounted(reFocusInput); - const onAddFilter = /* @__PURE__ */ __name((filterAndValue) => { - nodeSearchFilterVisible.value = false; - emit("addFilter", filterAndValue); - reFocusInput(); - }, "onAddFilter"); - const onRemoveFilter = /* @__PURE__ */ __name((event, filterAndValue) => { - event.stopPropagation(); - event.preventDefault(); - emit("removeFilter", filterAndValue); - reFocusInput(); - }, "onRemoveFilter"); - const setHoverSuggestion = /* @__PURE__ */ __name((index) => { - if (index === -1) { - hoveredSuggestion.value = null; - return; - } - const value = suggestions2.value[index]; - hoveredSuggestion.value = value; - }, "setHoverSuggestion"); - return (_ctx, _cache) => { - return openBlock(), createElementBlock("div", _hoisted_1$f, [ - enableNodePreview.value ? (openBlock(), createElementBlock("div", _hoisted_2$c, [ - hoveredSuggestion.value ? (openBlock(), createBlock(NodePreview, { - nodeDef: hoveredSuggestion.value, - key: hoveredSuggestion.value?.name || "" - }, null, 8, ["nodeDef"])) : createCommentVNode("", true) - ])) : createCommentVNode("", true), - createVNode(unref(script$d), { - icon: "pi pi-filter", - severity: "secondary", - class: "filter-button z-10", - onClick: _cache[0] || (_cache[0] = ($event) => nodeSearchFilterVisible.value = true) - }), - createVNode(unref(script$p), { - visible: nodeSearchFilterVisible.value, - "onUpdate:visible": _cache[1] || (_cache[1] = ($event) => nodeSearchFilterVisible.value = $event), - class: "min-w-96" - }, { - header: withCtx(() => [ - _hoisted_3$a - ]), - default: withCtx(() => [ - createBaseVNode("div", _hoisted_4$2, [ - createVNode(NodeSearchFilter, { onAddFilter }) - ]) - ]), - _: 1 - }, 8, ["visible"]), - createVNode(_sfc_main$j, { - "model-value": props.filters, - class: "comfy-vue-node-search-box z-10 flex-grow", - scrollHeight: "40vh", - placeholder: placeholder.value, - "input-id": inputId, - "append-to": "self", - suggestions: suggestions2.value, - "min-length": 0, - delay: 100, - loading: !unref(nodeFrequencyStore).isLoaded, - onComplete: _cache[2] || (_cache[2] = ($event) => search2($event.query)), - onOptionSelect: _cache[3] || (_cache[3] = ($event) => emit("addNode", $event.value)), - onFocusedOptionChanged: _cache[4] || (_cache[4] = ($event) => setHoverSuggestion($event)), - "complete-on-focus": "", - "auto-option-focus": "", - "force-selection": "", - multiple: "", - optionLabel: "display_name" - }, { - option: withCtx(({ option: option2 }) => [ - createVNode(NodeSearchItem, { - nodeDef: option2, - currentQuery: currentQuery.value - }, null, 8, ["nodeDef", "currentQuery"]) - ]), - chip: withCtx(({ value }) => [ - (openBlock(), createBlock(SearchFilterChip, { - key: `${value[0].id}-${value[1]}`, - onRemove: /* @__PURE__ */ __name(($event) => onRemoveFilter($event, value), "onRemove"), - text: value[1], - badge: value[0].invokeSequence.toUpperCase(), - "badge-class": value[0].invokeSequence + "-badge" - }, null, 8, ["onRemove", "text", "badge", "badge-class"])) - ]), - _: 1 - }, 8, ["model-value", "placeholder", "suggestions", "loading"]) - ]); - }; - } -}); -const _sfc_main$g = /* @__PURE__ */ defineComponent({ - __name: "NodeSearchBoxPopover", - setup(__props) { - const settingStore = useSettingStore(); - const litegraphService = useLitegraphService(); - const { visible } = storeToRefs(useSearchBoxStore()); - const dismissable = ref(true); - const triggerEvent = ref(null); - const getNewNodeLocation = /* @__PURE__ */ __name(() => { - if (!triggerEvent.value) { - return litegraphService.getCanvasCenter(); - } - const originalEvent = triggerEvent.value.detail.originalEvent; - return [originalEvent.canvasX, originalEvent.canvasY]; - }, "getNewNodeLocation"); - const nodeFilters = ref([]); - const addFilter = /* @__PURE__ */ __name((filter) => { - nodeFilters.value.push(filter); - }, "addFilter"); - const removeFilter = /* @__PURE__ */ __name((filter) => { - nodeFilters.value = nodeFilters.value.filter( - (f) => toRaw(f) !== toRaw(filter) - ); - }, "removeFilter"); - const clearFilters = /* @__PURE__ */ __name(() => { - nodeFilters.value = []; - }, "clearFilters"); - const closeDialog = /* @__PURE__ */ __name(() => { - visible.value = false; - }, "closeDialog"); - const addNode = /* @__PURE__ */ __name((nodeDef) => { - const node = litegraphService.addNodeOnGraph(nodeDef, { - pos: getNewNodeLocation() - }); - const eventDetail = triggerEvent.value?.detail; - if (eventDetail && eventDetail.subType === "empty-release") { - eventDetail.linkReleaseContext.links.forEach((link) => { - ConnectingLinkImpl.createFromPlainObject(link).connectTo(node); - }); - } - window.setTimeout(() => { - closeDialog(); - }, 100); - }, "addNode"); - const newSearchBoxEnabled = computed( - () => settingStore.get("Comfy.NodeSearchBoxImpl") === "default" - ); - const showSearchBox = /* @__PURE__ */ __name((e) => { - const detail = e.detail; - if (newSearchBoxEnabled.value) { - if (detail.originalEvent?.pointerType === "touch") { - setTimeout(() => { - showNewSearchBox(e); - }, 128); - } else { - showNewSearchBox(e); - } - } else { - canvasStore.canvas.showSearchBox(detail.originalEvent); - } - }, "showSearchBox"); - const nodeDefStore = useNodeDefStore(); - const showNewSearchBox = /* @__PURE__ */ __name((e) => { - if (e.detail.subType === "empty-release") { - const links = e.detail.linkReleaseContext.links; - if (links.length === 0) { - console.warn("Empty release with no links! This should never happen"); - return; - } - const firstLink = ConnectingLinkImpl.createFromPlainObject(links[0]); - const filter = nodeDefStore.nodeSearchService.getFilterById( - firstLink.releaseSlotType - ); - const dataType = firstLink.type.toString(); - addFilter([filter, dataType]); - } - visible.value = true; - triggerEvent.value = e; - dismissable.value = false; - setTimeout(() => { - dismissable.value = true; - }, 300); - }, "showNewSearchBox"); - const showContextMenu = /* @__PURE__ */ __name((e) => { - if (e.detail.subType !== "empty-release") { - return; - } - const links = e.detail.linkReleaseContext.links; - if (links.length === 0) { - console.warn("Empty release with no links! This should never happen"); - return; - } - const firstLink = ConnectingLinkImpl.createFromPlainObject(links[0]); - const mouseEvent = e.detail.originalEvent; - const commonOptions = { - e: mouseEvent, - allow_searchbox: true, - showSearchBox: /* @__PURE__ */ __name(() => showSearchBox(e), "showSearchBox") - }; - const connectionOptions = firstLink.output ? { - nodeFrom: firstLink.node, - slotFrom: firstLink.output, - afterRerouteId: firstLink.afterRerouteId - } : { - nodeTo: firstLink.node, - slotTo: firstLink.input, - afterRerouteId: firstLink.afterRerouteId - }; - canvasStore.canvas.showConnectionMenu({ - ...connectionOptions, - ...commonOptions - }); - }, "showContextMenu"); - const canvasStore = useCanvasStore(); - watchEffect(() => { - if (canvasStore.canvas) { - LiteGraph.release_link_on_empty_shows_menu = false; - canvasStore.canvas.allow_searchbox = false; - } - }); - const canvasEventHandler = /* @__PURE__ */ __name((e) => { - if (e.detail.subType === "empty-double-click") { - showSearchBox(e); - } else if (e.detail.subType === "empty-release") { - handleCanvasEmptyRelease(e); - } else if (e.detail.subType === "group-double-click") { - const group = e.detail.group; - const [x, y] = group.pos; - const relativeY = e.detail.originalEvent.canvasY - y; - if (relativeY > group.titleHeight) { - showSearchBox(e); - } - } - }, "canvasEventHandler"); - const linkReleaseAction = computed(() => { - return settingStore.get("Comfy.LinkRelease.Action"); - }); - const linkReleaseActionShift = computed(() => { - return settingStore.get("Comfy.LinkRelease.ActionShift"); - }); - const handleCanvasEmptyRelease = /* @__PURE__ */ __name((e) => { - const detail = e.detail; - const shiftPressed = detail.originalEvent.shiftKey; - const action = shiftPressed ? linkReleaseActionShift.value : linkReleaseAction.value; - switch (action) { - case LinkReleaseTriggerAction.SEARCH_BOX: - showSearchBox(e); - break; - case LinkReleaseTriggerAction.CONTEXT_MENU: - showContextMenu(e); - break; - case LinkReleaseTriggerAction.NO_ACTION: - default: - break; - } - }, "handleCanvasEmptyRelease"); - useEventListener(document, "litegraph:canvas", canvasEventHandler); - return (_ctx, _cache) => { - return openBlock(), createElementBlock("div", null, [ - createVNode(unref(script$p), { - visible: unref(visible), - "onUpdate:visible": _cache[0] || (_cache[0] = ($event) => isRef(visible) ? visible.value = $event : null), - modal: "", - "dismissable-mask": dismissable.value, - onHide: clearFilters, - pt: { - root: { - class: "invisible-dialog-root", - role: "search" - }, - mask: { class: "node-search-box-dialog-mask" }, - transition: { - enterFromClass: "opacity-0 scale-75", - // 100ms is the duration of the transition in the dialog component - enterActiveClass: "transition-all duration-100 ease-out", - leaveActiveClass: "transition-all duration-100 ease-in", - leaveToClass: "opacity-0 scale-75" - } - } - }, { - container: withCtx(() => [ - createVNode(_sfc_main$h, { - filters: nodeFilters.value, - onAddFilter: addFilter, - onRemoveFilter: removeFilter, - onAddNode: addNode - }, null, 8, ["filters"]) - ]), - _: 1 - }, 8, ["visible", "dismissable-mask"]) - ]); - }; - } -}); -var theme$4 = /* @__PURE__ */ __name(function theme4(_ref) { - var dt = _ref.dt; - return "\n.p-overlaybadge {\n position: relative;\n}\n\n.p-overlaybadge .p-badge {\n position: absolute;\n top: 0;\n right: 0;\n transform: translate(50%, -50%);\n transform-origin: 100% 0;\n margin: 0;\n outline-width: ".concat(dt("overlaybadge.outline.width"), ";\n outline-style: solid;\n outline-color: ").concat(dt("overlaybadge.outline.color"), ";\n}\n"); -}, "theme"); -var classes$4 = { - root: "p-overlaybadge" -}; -var OverlayBadgeStyle = BaseStyle.extend({ - name: "overlaybadge", - theme: theme$4, - classes: classes$4 -}); -var script$1$4 = { - name: "OverlayBadge", - "extends": script$q, - style: OverlayBadgeStyle, - provide: /* @__PURE__ */ __name(function provide8() { - return { - $pcOverlayBadge: this, - $parentInstance: this - }; - }, "provide") -}; -var script$6 = { - name: "OverlayBadge", - "extends": script$1$4, - inheritAttrs: false, - components: { - Badge: script$q - } -}; -function render$b(_ctx, _cache, $props, $setup, $data, $options) { - var _component_Badge = resolveComponent("Badge"); - return openBlock(), createElementBlock("div", mergeProps({ - "class": _ctx.cx("root") - }, _ctx.ptmi("root")), [renderSlot(_ctx.$slots, "default"), createVNode(_component_Badge, mergeProps(_ctx.$props, { - pt: _ctx.ptm("pcBadge") - }), null, 16, ["pt"])], 16); -} -__name(render$b, "render$b"); -script$6.render = render$b; -const _sfc_main$f = /* @__PURE__ */ defineComponent({ - __name: "SidebarIcon", - props: { - icon: String, - selected: Boolean, - tooltip: { - type: String, - default: "" - }, - class: { - type: String, - default: "" - }, - iconBadge: { - type: [String, Function], - default: "" - } - }, - emits: ["click"], - setup(__props, { emit: __emit }) { - const props = __props; - const emit = __emit; - const overlayValue = computed( - () => typeof props.iconBadge === "function" ? props.iconBadge() || "" : props.iconBadge - ); - const shouldShowBadge = computed(() => !!overlayValue.value); - return (_ctx, _cache) => { - const _directive_tooltip = resolveDirective("tooltip"); - return withDirectives((openBlock(), createBlock(unref(script$d), { - class: normalizeClass(props.class), - text: "", - pt: { - root: { - class: `side-bar-button ${props.selected ? "p-button-primary side-bar-button-selected" : "p-button-secondary"}`, - "aria-label": props.tooltip - } - }, - onClick: _cache[0] || (_cache[0] = ($event) => emit("click", $event)) - }, { - icon: withCtx(() => [ - shouldShowBadge.value ? (openBlock(), createBlock(unref(script$6), { - key: 0, - value: overlayValue.value - }, { - default: withCtx(() => [ - createBaseVNode("i", { - class: normalizeClass(props.icon + " side-bar-button-icon") - }, null, 2) - ]), - _: 1 - }, 8, ["value"])) : (openBlock(), createElementBlock("i", { - key: 1, - class: normalizeClass(props.icon + " side-bar-button-icon") - }, null, 2)) - ]), - _: 1 - }, 8, ["class", "pt"])), [ - [_directive_tooltip, { value: props.tooltip, showDelay: 300, hideDelay: 300 }] - ]); - }; - } -}); -const SidebarIcon = /* @__PURE__ */ _export_sfc(_sfc_main$f, [["__scopeId", "data-v-6ab4daa6"]]); -const _sfc_main$e = /* @__PURE__ */ defineComponent({ - __name: "SidebarLogoutIcon", - setup(__props) { - const { t } = useI18n(); - const userStore = useUserStore(); - const tooltip = computed( - () => `${t("sideToolbar.logout")} (${userStore.currentUser?.username})` - ); - const logout = /* @__PURE__ */ __name(() => { - userStore.logout(); - window.location.reload(); - }, "logout"); - return (_ctx, _cache) => { - return openBlock(), createBlock(SidebarIcon, { - icon: "pi pi-sign-out", - tooltip: tooltip.value, - onClick: logout - }, null, 8, ["tooltip"]); - }; - } -}); -const _sfc_main$d = /* @__PURE__ */ defineComponent({ - __name: "SidebarSettingsToggleIcon", - setup(__props) { - const dialogStore = useDialogStore(); - const showSetting = /* @__PURE__ */ __name(() => { - dialogStore.showDialog({ - key: "global-settings", - headerComponent: SettingDialogHeader, - component: SettingDialogContent - }); - }, "showSetting"); - return (_ctx, _cache) => { - return openBlock(), createBlock(SidebarIcon, { - icon: "pi pi-cog", - class: "comfy-settings-btn", - onClick: showSetting, - tooltip: _ctx.$t("g.settings") - }, null, 8, ["tooltip"]); - }; - } -}); -const _sfc_main$c = /* @__PURE__ */ defineComponent({ - __name: "SidebarThemeToggleIcon", - setup(__props) { - const settingStore = useSettingStore(); - const currentTheme = computed(() => settingStore.get("Comfy.ColorPalette")); - const icon = computed( - () => currentTheme.value !== "light" ? "pi pi-moon" : "pi pi-sun" - ); - const commandStore = useCommandStore(); - const toggleTheme = /* @__PURE__ */ __name(() => { - commandStore.execute("Comfy.ToggleTheme"); - }, "toggleTheme"); - return (_ctx, _cache) => { - return openBlock(), createBlock(SidebarIcon, { - icon: icon.value, - onClick: toggleTheme, - tooltip: _ctx.$t("sideToolbar.themeToggle"), - class: "comfy-vue-theme-toggle" - }, null, 8, ["icon", "tooltip"]); - }; - } -}); -const _withScopeId$4 = /* @__PURE__ */ __name((n) => (pushScopeId("data-v-37d8d7b4"), n = n(), popScopeId(), n), "_withScopeId$4"); -const _hoisted_1$e = { class: "side-tool-bar-end" }; -const _hoisted_2$b = { - key: 0, - class: "sidebar-content-container h-full overflow-y-auto overflow-x-hidden" -}; -const _sfc_main$b = /* @__PURE__ */ defineComponent({ - __name: "SideToolbar", - setup(__props) { - const workspaceStore = useWorkspaceStore(); - const settingStore = useSettingStore(); - const userStore = useUserStore(); - const teleportTarget = computed( - () => settingStore.get("Comfy.Sidebar.Location") === "left" ? ".comfyui-body-left" : ".comfyui-body-right" - ); - const isSmall = computed( - () => settingStore.get("Comfy.Sidebar.Size") === "small" - ); - const tabs = computed(() => workspaceStore.getSidebarTabs()); - const selectedTab = computed(() => workspaceStore.sidebarTab.activeSidebarTab); - const onTabClick = /* @__PURE__ */ __name((item3) => { - workspaceStore.sidebarTab.toggleSidebarTab(item3.id); - }, "onTabClick"); - const keybindingStore = useKeybindingStore(); - const getTabTooltipSuffix = /* @__PURE__ */ __name((tab) => { - const keybinding = keybindingStore.getKeybindingByCommandId( - `Workspace.ToggleSidebarTab.${tab.id}` - ); - return keybinding ? ` (${keybinding.combo.toString()})` : ""; - }, "getTabTooltipSuffix"); - return (_ctx, _cache) => { - return openBlock(), createElementBlock(Fragment, null, [ - (openBlock(), createBlock(Teleport, { to: teleportTarget.value }, [ - createBaseVNode("nav", { - class: normalizeClass("side-tool-bar-container" + (isSmall.value ? " small-sidebar" : "")) - }, [ - (openBlock(true), createElementBlock(Fragment, null, renderList(tabs.value, (tab) => { - return openBlock(), createBlock(SidebarIcon, { - key: tab.id, - icon: tab.icon, - iconBadge: tab.iconBadge, - tooltip: tab.tooltip + getTabTooltipSuffix(tab), - selected: tab.id === selectedTab.value?.id, - class: normalizeClass(tab.id + "-tab-button"), - onClick: /* @__PURE__ */ __name(($event) => onTabClick(tab), "onClick") - }, null, 8, ["icon", "iconBadge", "tooltip", "selected", "class", "onClick"]); - }), 128)), - createBaseVNode("div", _hoisted_1$e, [ - unref(userStore).isMultiUserServer ? (openBlock(), createBlock(_sfc_main$e, { key: 0 })) : createCommentVNode("", true), - createVNode(_sfc_main$c), - createVNode(_sfc_main$d) - ]) - ], 2) - ], 8, ["to"])), - selectedTab.value ? (openBlock(), createElementBlock("div", _hoisted_2$b, [ - createVNode(_sfc_main$p, { extension: selectedTab.value }, null, 8, ["extension"]) - ])) : createCommentVNode("", true) - ], 64); - }; - } -}); -const SideToolbar = /* @__PURE__ */ _export_sfc(_sfc_main$b, [["__scopeId", "data-v-37d8d7b4"]]); -const CORE_SETTINGS = [ - { - id: "Comfy.Validation.Workflows", - name: "Validate workflows", - type: "boolean", - defaultValue: true - }, - { - id: "Comfy.NodeSearchBoxImpl", - category: ["Comfy", "Node Search Box", "Implementation"], - experimental: true, - name: "Node search box implementation", - type: "combo", - options: ["default", "litegraph (legacy)"], - defaultValue: "default" - }, - { - id: "Comfy.LinkRelease.Action", - category: ["LiteGraph", "LinkRelease", "Action"], - name: "Action on link release (No modifier)", - type: "combo", - options: Object.values(LinkReleaseTriggerAction), - defaultValue: LinkReleaseTriggerAction.CONTEXT_MENU - }, - { - id: "Comfy.LinkRelease.ActionShift", - category: ["LiteGraph", "LinkRelease", "ActionShift"], - name: "Action on link release (Shift)", - type: "combo", - options: Object.values(LinkReleaseTriggerAction), - defaultValue: LinkReleaseTriggerAction.SEARCH_BOX - }, - { - id: "Comfy.NodeSearchBoxImpl.NodePreview", - category: ["Comfy", "Node Search Box", "NodePreview"], - name: "Node preview", - tooltip: "Only applies to the default implementation", - type: "boolean", - defaultValue: true - }, - { - id: "Comfy.NodeSearchBoxImpl.ShowCategory", - category: ["Comfy", "Node Search Box", "ShowCategory"], - name: "Show node category in search results", - tooltip: "Only applies to the default implementation", - type: "boolean", - defaultValue: true - }, - { - id: "Comfy.NodeSearchBoxImpl.ShowIdName", - category: ["Comfy", "Node Search Box", "ShowIdName"], - name: "Show node id name in search results", - tooltip: "Only applies to the default implementation", - type: "boolean", - defaultValue: false - }, - { - id: "Comfy.NodeSearchBoxImpl.ShowNodeFrequency", - category: ["Comfy", "Node Search Box", "ShowNodeFrequency"], - name: "Show node frequency in search results", - tooltip: "Only applies to the default implementation", - type: "boolean", - defaultValue: false - }, - { - id: "Comfy.Sidebar.Location", - category: ["Appearance", "Sidebar", "Location"], - name: "Sidebar location", - type: "combo", - options: ["left", "right"], - defaultValue: "left" - }, - { - id: "Comfy.Sidebar.Size", - category: ["Appearance", "Sidebar", "Size"], - name: "Sidebar size", - type: "combo", - options: ["normal", "small"], - defaultValue: /* @__PURE__ */ __name(() => window.innerWidth < 1600 ? "small" : "normal", "defaultValue") - }, - { - id: "Comfy.TextareaWidget.FontSize", - category: ["Appearance", "Node Widget", "TextareaWidget", "FontSize"], - name: "Textarea widget font size", - type: "slider", - defaultValue: 10, - attrs: { - min: 8, - max: 24 - } - }, - { - id: "Comfy.TextareaWidget.Spellcheck", - category: ["Comfy", "Node Widget", "TextareaWidget", "Spellcheck"], - name: "Textarea widget spellcheck", - type: "boolean", - defaultValue: false - }, - { - id: "Comfy.Workflow.SortNodeIdOnSave", - name: "Sort node IDs when saving workflow", - type: "boolean", - defaultValue: false - }, - { - id: "Comfy.Graph.CanvasInfo", - category: ["LiteGraph", "Canvas", "CanvasInfo"], - name: "Show canvas info on bottom left corner (fps, etc.)", - type: "boolean", - defaultValue: true - }, - { - id: "Comfy.Node.ShowDeprecated", - name: "Show deprecated nodes in search", - tooltip: "Deprecated nodes are hidden by default in the UI, but remain functional in existing workflows that use them.", - type: "boolean", - defaultValue: false - }, - { - id: "Comfy.Node.ShowExperimental", - name: "Show experimental nodes in search", - tooltip: "Experimental nodes are marked as such in the UI and may be subject to significant changes or removal in future versions. Use with caution in production workflows", - type: "boolean", - defaultValue: true - }, - { - id: "Comfy.Node.Opacity", - category: ["Appearance", "Node", "Opacity"], - name: "Node opacity", - type: "slider", - defaultValue: 1, - attrs: { - min: 0.01, - max: 1, - step: 0.01 - } - }, - { - id: "Comfy.Workflow.ShowMissingNodesWarning", - name: "Show missing nodes warning", - type: "boolean", - defaultValue: true - }, - { - id: "Comfy.Workflow.ShowMissingModelsWarning", - name: "Show missing models warning", - type: "boolean", - defaultValue: false, - experimental: true - }, - { - id: "Comfy.Graph.ZoomSpeed", - category: ["LiteGraph", "Canvas", "ZoomSpeed"], - name: "Canvas zoom speed", - type: "slider", - defaultValue: 1.1, - attrs: { - min: 1.01, - max: 2.5, - step: 0.01 - } - }, - // Bookmarks are stored in the settings store. - // Bookmarks are in format of category/display_name. e.g. "conditioning/CLIPTextEncode" - { - id: "Comfy.NodeLibrary.Bookmarks", - name: "Node library bookmarks with display name (deprecated)", - type: "hidden", - defaultValue: [], - deprecated: true - }, - { - id: "Comfy.NodeLibrary.Bookmarks.V2", - name: "Node library bookmarks v2 with unique name", - type: "hidden", - defaultValue: [] - }, - // Stores mapping from bookmark folder name to its customization. - { - id: "Comfy.NodeLibrary.BookmarksCustomization", - name: "Node library bookmarks customization", - type: "hidden", - defaultValue: {} - }, - // Hidden setting used by the queue for how to fit images - { - id: "Comfy.Queue.ImageFit", - name: "Queue image fit", - type: "hidden", - defaultValue: "cover" - }, - { - id: "Comfy.GroupSelectedNodes.Padding", - category: ["LiteGraph", "Group", "Padding"], - name: "Group selected nodes padding", - type: "slider", - defaultValue: 10, - attrs: { - min: 0, - max: 100 - } - }, - { - id: "Comfy.Node.DoubleClickTitleToEdit", - category: ["LiteGraph", "Node", "DoubleClickTitleToEdit"], - name: "Double click node title to edit", - type: "boolean", - defaultValue: true - }, - { - id: "Comfy.Group.DoubleClickTitleToEdit", - category: ["LiteGraph", "Group", "DoubleClickTitleToEdit"], - name: "Double click group title to edit", - type: "boolean", - defaultValue: true - }, - { - id: "Comfy.Window.UnloadConfirmation", - name: "Show confirmation when closing window", - type: "boolean", - defaultValue: false - }, - { - id: "Comfy.TreeExplorer.ItemPadding", - category: ["Appearance", "Tree Explorer", "ItemPadding"], - name: "Tree explorer item padding", - type: "slider", - defaultValue: 2, - attrs: { - min: 0, - max: 8, - step: 1 - } - }, - { - id: "Comfy.ModelLibrary.AutoLoadAll", - name: "Automatically load all model folders", - tooltip: "If true, all folders will load as soon as you open the model library (this may cause delays while it loads). If false, root level model folders will only load once you click on them.", - type: "boolean", - defaultValue: false - }, - { - id: "Comfy.ModelLibrary.NameFormat", - name: "What name to display in the model library tree view", - tooltip: 'Select "filename" to render a simplified view of the raw filename (without directory or ".safetensors" extension) in the model list. Select "title" to display the configurable model metadata title.', - type: "combo", - options: ["filename", "title"], - defaultValue: "title" - }, - { - id: "Comfy.Locale", - name: "Language", - type: "combo", - options: [ - { value: "en", text: "English" }, - { value: "zh", text: "中文" }, - { value: "ru", text: "Русский" }, - { value: "ja", text: "日本語" }, - { value: "ko", text: "한국어" }, - { value: "fr", text: "Français" } - ], - defaultValue: /* @__PURE__ */ __name(() => navigator.language.split("-")[0] || "en", "defaultValue") - }, - { - id: "Comfy.NodeBadge.NodeSourceBadgeMode", - category: ["LiteGraph", "Node", "NodeSourceBadgeMode"], - name: "Node source badge mode", - type: "combo", - options: Object.values(NodeBadgeMode), - defaultValue: NodeBadgeMode.HideBuiltIn - }, - { - id: "Comfy.NodeBadge.NodeIdBadgeMode", - category: ["LiteGraph", "Node", "NodeIdBadgeMode"], - name: "Node ID badge mode", - type: "combo", - options: [NodeBadgeMode.None, NodeBadgeMode.ShowAll], - defaultValue: NodeBadgeMode.ShowAll - }, - { - id: "Comfy.NodeBadge.NodeLifeCycleBadgeMode", - category: ["LiteGraph", "Node", "NodeLifeCycleBadgeMode"], - name: "Node life cycle badge mode", - type: "combo", - options: [NodeBadgeMode.None, NodeBadgeMode.ShowAll], - defaultValue: NodeBadgeMode.ShowAll - }, - { - id: "Comfy.ConfirmClear", - category: ["Comfy", "Workflow", "ConfirmClear"], - name: "Require confirmation when clearing workflow", - type: "boolean", - defaultValue: true - }, - { - id: "Comfy.PromptFilename", - category: ["Comfy", "Workflow", "PromptFilename"], - name: "Prompt for filename when saving workflow", - type: "boolean", - defaultValue: true - }, - /** - * file format for preview - * - * format;quality - * - * ex) - * webp;50 -> webp, quality 50 - * jpeg;80 -> rgb, jpeg, quality 80 - * - * @type {string} - */ - { - id: "Comfy.PreviewFormat", - category: ["LiteGraph", "Node Widget", "PreviewFormat"], - name: "Preview image format", - tooltip: "When displaying a preview in the image widget, convert it to a lightweight image, e.g. webp, jpeg, webp;50, etc.", - type: "text", - defaultValue: "" - }, - { - id: "Comfy.DisableSliders", - category: ["LiteGraph", "Node Widget", "DisableSliders"], - name: "Disable node widget sliders", - type: "boolean", - defaultValue: false - }, - { - id: "Comfy.DisableFloatRounding", - category: ["LiteGraph", "Node Widget", "DisableFloatRounding"], - name: "Disable default float widget rounding.", - tooltip: "(requires page reload) Cannot disable round when round is set by the node in the backend.", - type: "boolean", - defaultValue: false - }, - { - id: "Comfy.FloatRoundingPrecision", - category: ["LiteGraph", "Node Widget", "FloatRoundingPrecision"], - name: "Float widget rounding decimal places [0 = auto].", - tooltip: "(requires page reload)", - type: "slider", - attrs: { - min: 0, - max: 6, - step: 1 - }, - defaultValue: 0 - }, - { - id: "Comfy.EnableTooltips", - category: ["LiteGraph", "Node", "EnableTooltips"], - name: "Enable Tooltips", - type: "boolean", - defaultValue: true - }, - { - id: "Comfy.DevMode", - name: "Enable dev mode options (API save, etc.)", - type: "boolean", - defaultValue: false, - onChange: /* @__PURE__ */ __name((value) => { - const element = document.getElementById("comfy-dev-save-api-button"); - if (element) { - element.style.display = value ? "flex" : "none"; - } - }, "onChange") - }, - { - id: "Comfy.UseNewMenu", - category: ["Comfy", "Menu", "UseNewMenu"], - defaultValue: "Top", - name: "Use new menu", - type: "combo", - options: ["Disabled", "Top", "Bottom"], - migrateDeprecatedValue: /* @__PURE__ */ __name((value) => { - if (value === "Floating") { - return "Top"; - } - return value; - }, "migrateDeprecatedValue") - }, - { - id: "Comfy.Workflow.WorkflowTabsPosition", - name: "Opened workflows position", - type: "combo", - options: ["Sidebar", "Topbar"], - defaultValue: "Topbar" - }, - { - id: "Comfy.Graph.CanvasMenu", - category: ["LiteGraph", "Canvas", "CanvasMenu"], - name: "Show graph canvas menu", - type: "boolean", - defaultValue: true - }, - { - id: "Comfy.QueueButton.BatchCountLimit", - name: "Batch count limit", - tooltip: "The maximum number of tasks added to the queue at one button click", - type: "number", - defaultValue: 100, - versionAdded: "1.3.5" - }, - { - id: "Comfy.Keybinding.UnsetBindings", - name: "Keybindings unset by the user", - type: "hidden", - defaultValue: [], - versionAdded: "1.3.7" - }, - { - id: "Comfy.Keybinding.NewBindings", - name: "Keybindings set by the user", - type: "hidden", - defaultValue: [], - versionAdded: "1.3.7" - }, - { - id: "Comfy.Extension.Disabled", - name: "Disabled extension names", - type: "hidden", - defaultValue: [], - versionAdded: "1.3.11" - }, - { - id: "Comfy.Validation.NodeDefs", - name: "Validate node definitions (slow)", - type: "boolean", - tooltip: "Recommended for node developers. This will validate all node definitions on startup.", - defaultValue: false, - versionAdded: "1.3.14" - }, - { - id: "Comfy.LinkRenderMode", - category: ["LiteGraph", "Graph", "LinkRenderMode"], - name: "Link Render Mode", - defaultValue: 2, - type: "combo", - options: [ - { value: LiteGraph.STRAIGHT_LINK, text: "Straight" }, - { value: LiteGraph.LINEAR_LINK, text: "Linear" }, - { value: LiteGraph.SPLINE_LINK, text: "Spline" }, - { value: LiteGraph.HIDDEN_LINK, text: "Hidden" } - ] - }, - { - id: "Comfy.Node.AutoSnapLinkToSlot", - category: ["LiteGraph", "Node", "AutoSnapLinkToSlot"], - name: "Auto snap link to node slot", - tooltip: "When dragging a link over a node, the link automatically snap to a viable input slot on the node", - type: "boolean", - defaultValue: true, - versionAdded: "1.3.29" - }, - { - id: "Comfy.Node.SnapHighlightsNode", - category: ["LiteGraph", "Node", "SnapHighlightsNode"], - name: "Snap highlights node", - tooltip: "When dragging a link over a node with viable input slot, highlight the node", - type: "boolean", - defaultValue: true, - versionAdded: "1.3.29" - }, - { - id: "Comfy.Node.BypassAllLinksOnDelete", - category: ["LiteGraph", "Node", "BypassAllLinksOnDelete"], - name: "Keep all links when deleting nodes", - tooltip: "When deleting a node, attempt to reconnect all of its input and output links (bypassing the deleted node)", - type: "boolean", - defaultValue: true, - versionAdded: "1.3.40" - }, - { - id: "Comfy.Node.MiddleClickRerouteNode", - category: ["LiteGraph", "Node", "MiddleClickRerouteNode"], - name: "Middle-click creates a new Reroute node", - type: "boolean", - defaultValue: true, - versionAdded: "1.3.42" - }, - { - id: "Comfy.RerouteBeta", - category: ["LiteGraph", "RerouteBeta"], - name: "Opt-in to the reroute beta test", - tooltip: "Enables the new native reroutes.\n\nReroutes can be added by holding alt and dragging from a link line, or on the link menu.\n\nDisabling this option is non-destructive - reroutes are hidden.", - experimental: true, - type: "boolean", - defaultValue: false, - versionAdded: "1.3.42" - }, - { - id: "Comfy.Graph.LinkMarkers", - category: ["LiteGraph", "Link", "LinkMarkers"], - name: "Link midpoint markers", - defaultValue: LinkMarkerShape.Circle, - type: "combo", - options: [ - { value: LinkMarkerShape.None, text: "None" }, - { value: LinkMarkerShape.Circle, text: "Circle" }, - { value: LinkMarkerShape.Arrow, text: "Arrow" } - ], - versionAdded: "1.3.42" - }, - { - id: "Comfy.DOMClippingEnabled", - category: ["LiteGraph", "Node", "DOMClippingEnabled"], - name: "Enable DOM element clipping (enabling may reduce performance)", - type: "boolean", - defaultValue: true - }, - { - id: "Comfy.Graph.CtrlShiftZoom", - category: ["LiteGraph", "Canvas", "CtrlShiftZoom"], - name: "Enable fast-zoom shortcut (Ctrl + Shift + Drag)", - type: "boolean", - defaultValue: true, - versionAdded: "1.4.0" - }, - { - id: "Comfy.Pointer.ClickDrift", - category: ["LiteGraph", "Pointer", "ClickDrift"], - name: "Pointer click drift (maximum distance)", - tooltip: "If the pointer moves more than this distance while holding a button down, it is considered dragging (rather than clicking).\n\nHelps prevent objects from being unintentionally nudged if the pointer is moved whilst clicking.", - experimental: true, - type: "slider", - attrs: { - min: 0, - max: 20, - step: 1 - }, - defaultValue: 6, - versionAdded: "1.4.3" - }, - { - id: "Comfy.Pointer.ClickBufferTime", - category: ["LiteGraph", "Pointer", "ClickBufferTime"], - name: "Pointer click drift delay", - tooltip: "After pressing a pointer button down, this is the maximum time (in milliseconds) that pointer movement can be ignored for.\n\nHelps prevent objects from being unintentionally nudged if the pointer is moved whilst clicking.", - experimental: true, - type: "slider", - attrs: { - min: 0, - max: 1e3, - step: 25 - }, - defaultValue: 150, - versionAdded: "1.4.3" - }, - { - id: "Comfy.Pointer.DoubleClickTime", - category: ["LiteGraph", "Pointer", "DoubleClickTime"], - name: "Double click interval (maximum)", - tooltip: "The maximum time in milliseconds between the two clicks of a double-click. Increasing this value may assist if double-clicks are sometimes not registered.", - type: "slider", - attrs: { - min: 100, - max: 1e3, - step: 50 - }, - defaultValue: 300, - versionAdded: "1.4.3" - }, - { - id: "Comfy.SnapToGrid.GridSize", - category: ["LiteGraph", "Canvas", "GridSize"], - name: "Snap to grid size", - type: "slider", - attrs: { - min: 1, - max: 500 - }, - tooltip: "When dragging and resizing nodes while holding shift they will be aligned to the grid, this controls the size of that grid.", - defaultValue: LiteGraph.CANVAS_GRID_SIZE - }, - // Keep the 'pysssss.SnapToGrid' setting id so we don't need to migrate setting values. - // Using a new setting id can cause existing users to lose their existing settings. - { - id: "pysssss.SnapToGrid", - category: ["LiteGraph", "Canvas", "AlwaysSnapToGrid"], - name: "Always snap to grid", - type: "boolean", - defaultValue: false, - versionAdded: "1.3.13" - }, - { - id: "Comfy.Server.ServerConfigValues", - name: "Server config values for frontend display", - tooltip: "Server config values used for frontend display only", - type: "hidden", - // Mapping from server config id to value. - defaultValue: {}, - versionAdded: "1.4.8" - }, - { - id: "Comfy.Server.LaunchArgs", - name: "Server launch arguments", - tooltip: "These are the actual arguments that are passed to the server when it is launched.", - type: "hidden", - defaultValue: {}, - versionAdded: "1.4.8" - }, - { - id: "Comfy.Queue.MaxHistoryItems", - name: "Queue history size", - tooltip: "The maximum number of tasks that show in the queue history.", - type: "slider", - attrs: { - min: 16, - max: 256, - step: 16 - }, - defaultValue: 64, - versionAdded: "1.4.12" - }, - { - id: "LiteGraph.Canvas.MaximumFps", - name: "Maxium FPS", - tooltip: "The maximum frames per second that the canvas is allowed to render. Caps GPU usage at the cost of smoothness. If 0, the screen refresh rate is used. Default: 0", - type: "slider", - attrs: { - min: 0, - max: 120 - }, - defaultValue: 0, - versionAdded: "1.5.1" - }, - { - id: "Comfy.EnableWorkflowViewRestore", - category: ["Comfy", "Workflow", "EnableWorkflowViewRestore"], - name: "Save and restore canvas position and zoom level in workflows", - type: "boolean", - defaultValue: true, - versionModified: "1.5.4" - }, - { - id: "Comfy.Workflow.ConfirmDelete", - name: "Show confirmation when deleting workflows", - type: "boolean", - defaultValue: true, - versionAdded: "1.5.6" - }, - { - id: "Comfy.ColorPalette", - name: "The active color palette id", - type: "hidden", - defaultValue: "dark", - versionModified: "1.6.7", - migrateDeprecatedValue(value) { - return value.startsWith("custom_") ? value.replace("custom_", "") : value; - } - }, - { - id: "Comfy.CustomColorPalettes", - name: "Custom color palettes", - type: "hidden", - defaultValue: {}, - versionModified: "1.6.7" - }, - { - id: "Comfy.WidgetControlMode", - category: ["Comfy", "Node Widget", "WidgetControlMode"], - name: "Widget control mode", - tooltip: "Controls when widget values are updated (randomize/increment/decrement), either before the prompt is queued or after.", - type: "combo", - defaultValue: "after", - options: ["before", "after"], - versionModified: "1.6.10" - } -]; -const _sfc_main$a = /* @__PURE__ */ defineComponent({ - __name: "GraphCanvas", - emits: ["ready"], - setup(__props, { emit: __emit }) { - const emit = __emit; - const canvasRef = ref(null); - const litegraphService = useLitegraphService(); - const settingStore = useSettingStore(); - const nodeDefStore = useNodeDefStore(); - const workspaceStore = useWorkspaceStore(); - const canvasStore = useCanvasStore(); - const modelToNodeStore = useModelToNodeStore(); - const betaMenuEnabled = computed( - () => settingStore.get("Comfy.UseNewMenu") !== "Disabled" - ); - const canvasMenuEnabled = computed( - () => settingStore.get("Comfy.Graph.CanvasMenu") - ); - const tooltipEnabled = computed(() => settingStore.get("Comfy.EnableTooltips")); - watchEffect(() => { - const canvasInfoEnabled = settingStore.get("Comfy.Graph.CanvasInfo"); - if (canvasStore.canvas) { - canvasStore.canvas.show_info = canvasInfoEnabled; - } - }); - watchEffect(() => { - const zoomSpeed = settingStore.get("Comfy.Graph.ZoomSpeed"); - if (canvasStore.canvas) { - canvasStore.canvas.zoom_speed = zoomSpeed; - } - }); - watchEffect(() => { - LiteGraph.snaps_for_comfy = settingStore.get("Comfy.Node.AutoSnapLinkToSlot"); - }); - watchEffect(() => { - LiteGraph.snap_highlights_node = settingStore.get( - "Comfy.Node.SnapHighlightsNode" - ); - }); - watchEffect(() => { - LGraphNode.keepAllLinksOnBypass = settingStore.get( - "Comfy.Node.BypassAllLinksOnDelete" - ); - }); - watchEffect(() => { - LiteGraph.middle_click_slot_add_default_node = settingStore.get( - "Comfy.Node.MiddleClickRerouteNode" - ); - }); - watchEffect(() => { - nodeDefStore.showDeprecated = settingStore.get("Comfy.Node.ShowDeprecated"); - }); - watchEffect(() => { - nodeDefStore.showExperimental = settingStore.get( - "Comfy.Node.ShowExperimental" - ); - }); - watchEffect(() => { - const spellcheckEnabled = settingStore.get("Comfy.TextareaWidget.Spellcheck"); - const textareas = document.querySelectorAll("textarea.comfy-multiline-input"); - textareas.forEach((textarea) => { - textarea.spellcheck = spellcheckEnabled; - textarea.focus(); - textarea.blur(); - }); - }); - watchEffect(() => { - const linkRenderMode = settingStore.get("Comfy.LinkRenderMode"); - if (canvasStore.canvas) { - canvasStore.canvas.links_render_mode = linkRenderMode; - canvasStore.canvas.setDirty( - /* fg */ - false, - /* bg */ - true - ); - } - }); - watchEffect(() => { - const linkMarkerShape = settingStore.get("Comfy.Graph.LinkMarkers"); - const { canvas } = canvasStore; - if (canvas) { - canvas.linkMarkerShape = linkMarkerShape; - canvas.setDirty(false, true); - } - }); - watchEffect(() => { - const reroutesEnabled = settingStore.get("Comfy.RerouteBeta"); - const { canvas } = canvasStore; - if (canvas) { - canvas.reroutesEnabled = reroutesEnabled; - canvas.setDirty(false, true); - } - }); - watchEffect(() => { - const maximumFps = settingStore.get("LiteGraph.Canvas.MaximumFps"); - const { canvas } = canvasStore; - if (canvas) canvas.maximumFps = maximumFps; - }); - watchEffect(() => { - CanvasPointer.doubleClickTime = settingStore.get( - "Comfy.Pointer.DoubleClickTime" - ); - }); - watchEffect(() => { - CanvasPointer.bufferTime = settingStore.get("Comfy.Pointer.ClickBufferTime"); - }); - watchEffect(() => { - CanvasPointer.maxClickDrift = settingStore.get("Comfy.Pointer.ClickDrift"); - }); - watchEffect(() => { - LiteGraph.CANVAS_GRID_SIZE = settingStore.get("Comfy.SnapToGrid.GridSize"); - }); - watchEffect(() => { - LiteGraph.alwaysSnapToGrid = settingStore.get("pysssss.SnapToGrid"); - }); - watch( - () => settingStore.get("Comfy.WidgetControlMode"), - () => { - if (!canvasStore.canvas) return; - for (const n of app.graph.nodes) { - if (!n.widgets) continue; - for (const w of n.widgets) { - if (w[IS_CONTROL_WIDGET]) { - updateControlWidgetLabel(w); - if (w.linkedWidgets) { - for (const l of w.linkedWidgets) { - updateControlWidgetLabel(l); - } - } - } - } - } - app.graph.setDirtyCanvas(true); - } - ); - const colorPaletteService = useColorPaletteService(); - const colorPaletteStore = useColorPaletteStore(); - watch( - [() => canvasStore.canvas, () => settingStore.get("Comfy.ColorPalette")], - ([canvas, currentPaletteId]) => { - if (!canvas) return; - colorPaletteService.loadColorPalette(currentPaletteId); - } - ); - watch( - () => colorPaletteStore.activePaletteId, - (newValue) => { - settingStore.set("Comfy.ColorPalette", newValue); - } - ); - const workflowStore = useWorkflowStore(); - const persistCurrentWorkflow = /* @__PURE__ */ __name(() => { - const workflow = JSON.stringify(app.serializeGraph()); - localStorage.setItem("workflow", workflow); - if (api.clientId) { - sessionStorage.setItem(`workflow:${api.clientId}`, workflow); - } - }, "persistCurrentWorkflow"); - watchEffect(() => { - if (workflowStore.activeWorkflow) { - const workflow = workflowStore.activeWorkflow; - setStorageValue("Comfy.PreviousWorkflow", workflow.key); - persistCurrentWorkflow(); - } - }); - api.addEventListener("graphChanged", persistCurrentWorkflow); - usePragmaticDroppable(() => canvasRef.value, { - onDrop: /* @__PURE__ */ __name((event) => { - const loc = event.location.current.input; - const dndData = event.source.data; - if (dndData.type === "tree-explorer-node") { - const node = dndData.data; - if (node.data instanceof ComfyNodeDefImpl) { - const nodeDef = node.data; - const pos = app.clientPosToCanvasPos([ - loc.clientX - 20, - loc.clientY - ]); - litegraphService.addNodeOnGraph(nodeDef, { pos }); - } else if (node.data instanceof ComfyModelDef) { - const model = node.data; - const pos = app.clientPosToCanvasPos([loc.clientX, loc.clientY]); - const nodeAtPos = app.graph.getNodeOnPos(pos[0], pos[1]); - let targetProvider = null; - let targetGraphNode = null; - if (nodeAtPos) { - const providers = modelToNodeStore.getAllNodeProviders( - model.directory - ); - for (const provider of providers) { - if (provider.nodeDef.name === nodeAtPos.comfyClass) { - targetGraphNode = nodeAtPos; - targetProvider = provider; - } - } - } - if (!targetGraphNode) { - const provider = modelToNodeStore.getNodeProvider(model.directory); - if (provider) { - targetGraphNode = litegraphService.addNodeOnGraph( - provider.nodeDef, - { - pos - } - ); - targetProvider = provider; - } - } - if (targetGraphNode) { - const widget = targetGraphNode.widgets.find( - (widget2) => widget2.name === targetProvider.key - ); - if (widget) { - widget.value = model.file_name; - } - } - } - } - }, "onDrop") - }); - const comfyAppReady = ref(false); - onMounted(async () => { - window["LiteGraph"] = LiteGraph; - window["LGraph"] = LGraph; - window["LLink"] = LLink; - window["LGraphNode"] = LGraphNode; - window["LGraphGroup"] = LGraphGroup; - window["DragAndScale"] = DragAndScale; - window["LGraphCanvas"] = LGraphCanvas; - window["ContextMenu"] = ContextMenu; - window["LGraphBadge"] = LGraphBadge; - app.vueAppReady = true; - workspaceStore.spinner = true; - ChangeTracker.init(app); - await settingStore.loadSettingValues(); - CORE_SETTINGS.forEach((setting) => { - settingStore.addSetting(setting); - }); - await app.setup(canvasRef.value); - canvasStore.canvas = app.canvas; - canvasStore.canvas.render_canvas_border = false; - workspaceStore.spinner = false; - window["app"] = app; - window["graph"] = app.graph; - comfyAppReady.value = true; - colorPaletteStore.customPalettes = settingStore.get( - "Comfy.CustomColorPalettes" - ); - watch( - () => settingStore.get("Comfy.Locale"), - async () => { - await useCommandStore().execute("Comfy.RefreshNodeDefinitions"); - useWorkflowService().reloadCurrentWorkflow(); - } - ); - emit("ready"); - }); - return (_ctx, _cache) => { - return openBlock(), createElementBlock(Fragment, null, [ - (openBlock(), createBlock(Teleport, { to: ".graph-canvas-container" }, [ - comfyAppReady.value && betaMenuEnabled.value && !unref(workspaceStore).focusMode ? (openBlock(), createBlock(LiteGraphCanvasSplitterOverlay, { key: 0 }, { - "side-bar-panel": withCtx(() => [ - createVNode(SideToolbar) - ]), - "bottom-panel": withCtx(() => [ - createVNode(_sfc_main$o) - ]), - "graph-canvas-panel": withCtx(() => [ - canvasMenuEnabled.value ? (openBlock(), createBlock(GraphCanvasMenu, { key: 0 })) : createCommentVNode("", true) - ]), - _: 1 - })) : createCommentVNode("", true), - createVNode(TitleEditor), - !betaMenuEnabled.value && canvasMenuEnabled.value ? (openBlock(), createBlock(GraphCanvasMenu, { key: 1 })) : createCommentVNode("", true), - createBaseVNode("canvas", { - ref_key: "canvasRef", - ref: canvasRef, - id: "graph-canvas", - tabindex: "1" - }, null, 512) - ])), - createVNode(_sfc_main$g), - tooltipEnabled.value ? (openBlock(), createBlock(NodeTooltip, { key: 0 })) : createCommentVNode("", true), - createVNode(_sfc_main$m) - ], 64); - }; - } -}); -function _typeof$3(o) { - "@babel/helpers - typeof"; - return _typeof$3 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o2) { - return typeof o2; - } : function(o2) { - return o2 && "function" == typeof Symbol && o2.constructor === Symbol && o2 !== Symbol.prototype ? "symbol" : typeof o2; - }, _typeof$3(o); -} -__name(_typeof$3, "_typeof$3"); -function _defineProperty$3(e, r, t) { - return (r = _toPropertyKey$3(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e; -} -__name(_defineProperty$3, "_defineProperty$3"); -function _toPropertyKey$3(t) { - var i = _toPrimitive$3(t, "string"); - return "symbol" == _typeof$3(i) ? i : i + ""; -} -__name(_toPropertyKey$3, "_toPropertyKey$3"); -function _toPrimitive$3(t, r) { - if ("object" != _typeof$3(t) || !t) return t; - var e = t[Symbol.toPrimitive]; - if (void 0 !== e) { - var i = e.call(t, r || "default"); - if ("object" != _typeof$3(i)) return i; - throw new TypeError("@@toPrimitive must return a primitive value."); - } - return ("string" === r ? String : Number)(t); -} -__name(_toPrimitive$3, "_toPrimitive$3"); -var theme$3 = /* @__PURE__ */ __name(function theme5(_ref) { - var dt = _ref.dt; - return "\n.p-toast {\n width: ".concat(dt("toast.width"), ";\n white-space: pre-line;\n word-break: break-word;\n}\n\n.p-toast-message {\n margin: 0 0 1rem 0;\n}\n\n.p-toast-message-icon {\n flex-shrink: 0;\n font-size: ").concat(dt("toast.icon.size"), ";\n width: ").concat(dt("toast.icon.size"), ";\n height: ").concat(dt("toast.icon.size"), ";\n}\n\n.p-toast-message-content {\n display: flex;\n align-items: flex-start;\n padding: ").concat(dt("toast.content.padding"), ";\n gap: ").concat(dt("toast.content.gap"), ";\n}\n\n.p-toast-message-text {\n flex: 1 1 auto;\n display: flex;\n flex-direction: column;\n gap: ").concat(dt("toast.text.gap"), ";\n}\n\n.p-toast-summary {\n font-weight: ").concat(dt("toast.summary.font.weight"), ";\n font-size: ").concat(dt("toast.summary.font.size"), ";\n}\n\n.p-toast-detail {\n font-weight: ").concat(dt("toast.detail.font.weight"), ";\n font-size: ").concat(dt("toast.detail.font.size"), ";\n}\n\n.p-toast-close-button {\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n position: relative;\n cursor: pointer;\n background: transparent;\n transition: background ").concat(dt("toast.transition.duration"), ", color ").concat(dt("toast.transition.duration"), ", outline-color ").concat(dt("toast.transition.duration"), ", box-shadow ").concat(dt("toast.transition.duration"), ";\n outline-color: transparent;\n color: inherit;\n width: ").concat(dt("toast.close.button.width"), ";\n height: ").concat(dt("toast.close.button.height"), ";\n border-radius: ").concat(dt("toast.close.button.border.radius"), ";\n margin: -25% 0 0 0;\n right: -25%;\n padding: 0;\n border: none;\n user-select: none;\n}\n\n.p-toast-message-info,\n.p-toast-message-success,\n.p-toast-message-warn,\n.p-toast-message-error,\n.p-toast-message-secondary,\n.p-toast-message-contrast {\n border-width: ").concat(dt("toast.border.width"), ";\n border-style: solid;\n backdrop-filter: blur(").concat(dt("toast.blur"), ");\n border-radius: ").concat(dt("toast.border.radius"), ";\n}\n\n.p-toast-close-icon {\n font-size: ").concat(dt("toast.close.icon.size"), ";\n width: ").concat(dt("toast.close.icon.size"), ";\n height: ").concat(dt("toast.close.icon.size"), ";\n}\n\n.p-toast-close-button:focus-visible {\n outline-width: ").concat(dt("focus.ring.width"), ";\n outline-style: ").concat(dt("focus.ring.style"), ";\n outline-offset: ").concat(dt("focus.ring.offset"), ";\n}\n\n.p-toast-message-info {\n background: ").concat(dt("toast.info.background"), ";\n border-color: ").concat(dt("toast.info.border.color"), ";\n color: ").concat(dt("toast.info.color"), ";\n box-shadow: ").concat(dt("toast.info.shadow"), ";\n}\n\n.p-toast-message-info .p-toast-detail {\n color: ").concat(dt("toast.info.detail.color"), ";\n}\n\n.p-toast-message-info .p-toast-close-button:focus-visible {\n outline-color: ").concat(dt("toast.info.close.button.focus.ring.color"), ";\n box-shadow: ").concat(dt("toast.info.close.button.focus.ring.shadow"), ";\n}\n\n.p-toast-message-info .p-toast-close-button:hover {\n background: ").concat(dt("toast.info.close.button.hover.background"), ";\n}\n\n.p-toast-message-success {\n background: ").concat(dt("toast.success.background"), ";\n border-color: ").concat(dt("toast.success.border.color"), ";\n color: ").concat(dt("toast.success.color"), ";\n box-shadow: ").concat(dt("toast.success.shadow"), ";\n}\n\n.p-toast-message-success .p-toast-detail {\n color: ").concat(dt("toast.success.detail.color"), ";\n}\n\n.p-toast-message-success .p-toast-close-button:focus-visible {\n outline-color: ").concat(dt("toast.success.close.button.focus.ring.color"), ";\n box-shadow: ").concat(dt("toast.success.close.button.focus.ring.shadow"), ";\n}\n\n.p-toast-message-success .p-toast-close-button:hover {\n background: ").concat(dt("toast.success.close.button.hover.background"), ";\n}\n\n.p-toast-message-warn {\n background: ").concat(dt("toast.warn.background"), ";\n border-color: ").concat(dt("toast.warn.border.color"), ";\n color: ").concat(dt("toast.warn.color"), ";\n box-shadow: ").concat(dt("toast.warn.shadow"), ";\n}\n\n.p-toast-message-warn .p-toast-detail {\n color: ").concat(dt("toast.warn.detail.color"), ";\n}\n\n.p-toast-message-warn .p-toast-close-button:focus-visible {\n outline-color: ").concat(dt("toast.warn.close.button.focus.ring.color"), ";\n box-shadow: ").concat(dt("toast.warn.close.button.focus.ring.shadow"), ";\n}\n\n.p-toast-message-warn .p-toast-close-button:hover {\n background: ").concat(dt("toast.warn.close.button.hover.background"), ";\n}\n\n.p-toast-message-error {\n background: ").concat(dt("toast.error.background"), ";\n border-color: ").concat(dt("toast.error.border.color"), ";\n color: ").concat(dt("toast.error.color"), ";\n box-shadow: ").concat(dt("toast.error.shadow"), ";\n}\n\n.p-toast-message-error .p-toast-detail {\n color: ").concat(dt("toast.error.detail.color"), ";\n}\n\n.p-toast-message-error .p-toast-close-button:focus-visible {\n outline-color: ").concat(dt("toast.error.close.button.focus.ring.color"), ";\n box-shadow: ").concat(dt("toast.error.close.button.focus.ring.shadow"), ";\n}\n\n.p-toast-message-error .p-toast-close-button:hover {\n background: ").concat(dt("toast.error.close.button.hover.background"), ";\n}\n\n.p-toast-message-secondary {\n background: ").concat(dt("toast.secondary.background"), ";\n border-color: ").concat(dt("toast.secondary.border.color"), ";\n color: ").concat(dt("toast.secondary.color"), ";\n box-shadow: ").concat(dt("toast.secondary.shadow"), ";\n}\n\n.p-toast-message-secondary .p-toast-detail {\n color: ").concat(dt("toast.secondary.detail.color"), ";\n}\n\n.p-toast-message-secondary .p-toast-close-button:focus-visible {\n outline-color: ").concat(dt("toast.secondary.close.button.focus.ring.color"), ";\n box-shadow: ").concat(dt("toast.secondary.close.button.focus.ring.shadow"), ";\n}\n\n.p-toast-message-secondary .p-toast-close-button:hover {\n background: ").concat(dt("toast.secondary.close.button.hover.background"), ";\n}\n\n.p-toast-message-contrast {\n background: ").concat(dt("toast.contrast.background"), ";\n border-color: ").concat(dt("toast.contrast.border.color"), ";\n color: ").concat(dt("toast.contrast.color"), ";\n box-shadow: ").concat(dt("toast.contrast.shadow"), ";\n}\n\n.p-toast-message-contrast .p-toast-detail {\n color: ").concat(dt("toast.contrast.detail.color"), ";\n}\n\n.p-toast-message-contrast .p-toast-close-button:focus-visible {\n outline-color: ").concat(dt("toast.contrast.close.button.focus.ring.color"), ";\n box-shadow: ").concat(dt("toast.contrast.close.button.focus.ring.shadow"), ";\n}\n\n.p-toast-message-contrast .p-toast-close-button:hover {\n background: ").concat(dt("toast.contrast.close.button.hover.background"), ";\n}\n\n.p-toast-top-center {\n transform: translateX(-50%);\n}\n\n.p-toast-bottom-center {\n transform: translateX(-50%);\n}\n\n.p-toast-center {\n min-width: 20vw;\n transform: translate(-50%, -50%);\n}\n\n.p-toast-message-enter-from {\n opacity: 0;\n transform: translateY(50%);\n}\n\n.p-toast-message-leave-from {\n max-height: 1000px;\n}\n\n.p-toast .p-toast-message.p-toast-message-leave-to {\n max-height: 0;\n opacity: 0;\n margin-bottom: 0;\n overflow: hidden;\n}\n\n.p-toast-message-enter-active {\n transition: transform 0.3s, opacity 0.3s;\n}\n\n.p-toast-message-leave-active {\n transition: max-height 0.45s cubic-bezier(0, 1, 0, 1), opacity 0.3s, margin-bottom 0.3s;\n}\n"); -}, "theme"); -var inlineStyles$2 = { - root: /* @__PURE__ */ __name(function root6(_ref2) { - var position = _ref2.position; - return { - position: "fixed", - top: position === "top-right" || position === "top-left" || position === "top-center" ? "20px" : position === "center" ? "50%" : null, - right: (position === "top-right" || position === "bottom-right") && "20px", - bottom: (position === "bottom-left" || position === "bottom-right" || position === "bottom-center") && "20px", - left: position === "top-left" || position === "bottom-left" ? "20px" : position === "center" || position === "top-center" || position === "bottom-center" ? "50%" : null - }; - }, "root") -}; -var classes$3 = { - root: /* @__PURE__ */ __name(function root7(_ref3) { - var props = _ref3.props; - return ["p-toast p-component p-toast-" + props.position]; - }, "root"), - message: /* @__PURE__ */ __name(function message(_ref4) { - var props = _ref4.props; - return ["p-toast-message", { - "p-toast-message-info": props.message.severity === "info" || props.message.severity === void 0, - "p-toast-message-warn": props.message.severity === "warn", - "p-toast-message-error": props.message.severity === "error", - "p-toast-message-success": props.message.severity === "success", - "p-toast-message-secondary": props.message.severity === "secondary", - "p-toast-message-contrast": props.message.severity === "contrast" - }]; - }, "message"), - messageContent: "p-toast-message-content", - messageIcon: /* @__PURE__ */ __name(function messageIcon(_ref5) { - var props = _ref5.props; - return ["p-toast-message-icon", _defineProperty$3(_defineProperty$3(_defineProperty$3(_defineProperty$3({}, props.infoIcon, props.message.severity === "info"), props.warnIcon, props.message.severity === "warn"), props.errorIcon, props.message.severity === "error"), props.successIcon, props.message.severity === "success")]; - }, "messageIcon"), - messageText: "p-toast-message-text", - summary: "p-toast-summary", - detail: "p-toast-detail", - closeButton: "p-toast-close-button", - closeIcon: "p-toast-close-icon" -}; -var ToastStyle = BaseStyle.extend({ - name: "toast", - theme: theme$3, - classes: classes$3, - inlineStyles: inlineStyles$2 -}); -var script$2$2 = { - name: "BaseToast", - "extends": script$e, - props: { - group: { - type: String, - "default": null - }, - position: { - type: String, - "default": "top-right" - }, - autoZIndex: { - type: Boolean, - "default": true - }, - baseZIndex: { - type: Number, - "default": 0 - }, - breakpoints: { - type: Object, - "default": null - }, - closeIcon: { - type: String, - "default": void 0 - }, - infoIcon: { - type: String, - "default": void 0 - }, - warnIcon: { - type: String, - "default": void 0 - }, - errorIcon: { - type: String, - "default": void 0 - }, - successIcon: { - type: String, - "default": void 0 - }, - closeButtonProps: { - type: null, - "default": null + fn: withCtx(function(_ref2) { + var options = _ref2.options; + return [renderSlot(_ctx.$slots, "loader", { + options + })]; + }), + key: "0" + } : void 0]), 1040, ["style", "items", "disabled", "pt"]), renderSlot(_ctx.$slots, "footer", { + value: _ctx.modelValue, + suggestions: $options.visibleOptions + }), createBaseVNode("span", mergeProps({ + role: "status", + "aria-live": "polite", + "class": "p-hidden-accessible" + }, _ctx.ptm("hiddenSelectedMessage"), { + "data-p-hidden-accessible": true + }), toDisplayString($options.selectedMessageText), 17)], 16, _hoisted_5$3)) : createCommentVNode("", true)]; + }), + _: 3 + }, 16, ["onEnter", "onAfterEnter", "onLeave", "onAfterLeave"])]; + }), + _: 3 + }, 8, ["appendTo"])], 16); +} +__name(render$e, "render$e"); +script$8.render = render$e; +const _sfc_main$k = { + name: "AutoCompletePlus", + extends: script$8, + emits: ["focused-option-changed"], + mounted() { + if (typeof script$8.mounted === "function") { + script$8.mounted.call(this); } + this.$watch( + () => this.focusedOptionIndex, + (newVal, oldVal) => { + this.$emit("focused-option-changed", newVal); + } + ); + } +}; +const _withScopeId$4 = /* @__PURE__ */ __name((n) => (pushScopeId("data-v-d7cc0bce"), n = n(), popScopeId(), n), "_withScopeId$4"); +const _hoisted_1$i = { class: "option-container flex justify-between items-center px-2 py-0 cursor-pointer overflow-hidden w-full" }; +const _hoisted_2$f = { class: "option-display-name font-semibold flex flex-col" }; +const _hoisted_3$d = { key: 0 }; +const _hoisted_4$3 = /* @__PURE__ */ _withScopeId$4(() => /* @__PURE__ */ createBaseVNode("i", { class: "pi pi-bookmark-fill text-sm mr-1" }, null, -1)); +const _hoisted_5$2 = [ + _hoisted_4$3 +]; +const _hoisted_6$1 = ["innerHTML"]; +const _hoisted_7 = /* @__PURE__ */ _withScopeId$4(() => /* @__PURE__ */ createBaseVNode("span", null, " ", -1)); +const _hoisted_8 = ["innerHTML"]; +const _hoisted_9 = { + key: 0, + class: "option-category font-light text-sm text-gray-400 overflow-hidden text-ellipsis whitespace-nowrap" +}; +const _hoisted_10 = { class: "option-badges" }; +const _sfc_main$j = /* @__PURE__ */ defineComponent({ + __name: "NodeSearchItem", + props: { + nodeDef: {}, + currentQuery: {} }, - style: ToastStyle, - provide: /* @__PURE__ */ __name(function provide9() { - return { - $pcToast: this, - $parentInstance: this + setup(__props) { + const settingStore = useSettingStore(); + const showCategory = computed( + () => settingStore.get("Comfy.NodeSearchBoxImpl.ShowCategory") + ); + const showIdName = computed( + () => settingStore.get("Comfy.NodeSearchBoxImpl.ShowIdName") + ); + const showNodeFrequency = computed( + () => settingStore.get("Comfy.NodeSearchBoxImpl.ShowNodeFrequency") + ); + const nodeFrequencyStore = useNodeFrequencyStore(); + const nodeFrequency = computed( + () => nodeFrequencyStore.getNodeFrequency(props.nodeDef) + ); + const nodeBookmarkStore = useNodeBookmarkStore(); + const isBookmarked = computed( + () => nodeBookmarkStore.isBookmarked(props.nodeDef) + ); + const props = __props; + return (_ctx, _cache) => { + return openBlock(), createElementBlock("div", _hoisted_1$i, [ + createBaseVNode("div", _hoisted_2$f, [ + createBaseVNode("div", null, [ + isBookmarked.value ? (openBlock(), createElementBlock("span", _hoisted_3$d, _hoisted_5$2)) : createCommentVNode("", true), + createBaseVNode("span", { + innerHTML: unref(highlightQuery)(_ctx.nodeDef.display_name, _ctx.currentQuery) + }, null, 8, _hoisted_6$1), + _hoisted_7, + showIdName.value ? (openBlock(), createBlock(unref(script$q), { + key: 1, + severity: "secondary" + }, { + default: withCtx(() => [ + createBaseVNode("span", { + innerHTML: unref(highlightQuery)(_ctx.nodeDef.name, _ctx.currentQuery) + }, null, 8, _hoisted_8) + ]), + _: 1 + })) : createCommentVNode("", true) + ]), + showCategory.value ? (openBlock(), createElementBlock("div", _hoisted_9, toDisplayString(_ctx.nodeDef.category.replaceAll("/", " > ")), 1)) : createCommentVNode("", true) + ]), + createBaseVNode("div", _hoisted_10, [ + _ctx.nodeDef.experimental ? (openBlock(), createBlock(unref(script$q), { + key: 0, + value: _ctx.$t("g.experimental"), + severity: "primary" + }, null, 8, ["value"])) : createCommentVNode("", true), + _ctx.nodeDef.deprecated ? (openBlock(), createBlock(unref(script$q), { + key: 1, + value: _ctx.$t("g.deprecated"), + severity: "danger" + }, null, 8, ["value"])) : createCommentVNode("", true), + showNodeFrequency.value && nodeFrequency.value > 0 ? (openBlock(), createBlock(unref(script$q), { + key: 2, + value: unref(formatNumberWithSuffix)(nodeFrequency.value, { roundToInt: true }), + severity: "secondary" + }, null, 8, ["value"])) : createCommentVNode("", true), + _ctx.nodeDef.nodeSource.type !== unref(NodeSourceType).Unknown ? (openBlock(), createBlock(unref(script$p), { + key: 3, + class: "text-sm font-light" + }, { + default: withCtx(() => [ + createTextVNode(toDisplayString(_ctx.nodeDef.nodeSource.displayText), 1) + ]), + _: 1 + })) : createCommentVNode("", true) + ]) + ]); }; - }, "provide") + } +}); +const NodeSearchItem = /* @__PURE__ */ _export_sfc(_sfc_main$j, [["__scopeId", "data-v-d7cc0bce"]]); +const _hoisted_1$h = { class: "comfy-vue-node-search-container flex justify-center items-center w-full min-w-96 pointer-events-auto" }; +const _hoisted_2$e = { + key: 0, + class: "comfy-vue-node-preview-container absolute left-[-350px] top-[50px]" }; -var script$1$3 = { - name: "ToastMessage", - hostName: "Toast", - "extends": script$e, - emits: ["close"], - closeTimeout: null, +const _hoisted_3$c = /* @__PURE__ */ createBaseVNode("h3", null, "Add node filter condition", -1); +const _hoisted_4$2 = { class: "_dialog-body" }; +const _sfc_main$i = /* @__PURE__ */ defineComponent({ + __name: "NodeSearchBox", props: { - message: { - type: null, - "default": null - }, - templates: { - type: Object, - "default": null - }, - closeIcon: { - type: String, - "default": null - }, - infoIcon: { - type: String, - "default": null - }, - warnIcon: { - type: String, - "default": null - }, - errorIcon: { - type: String, - "default": null - }, - successIcon: { - type: String, - "default": null - }, - closeButtonProps: { - type: null, - "default": null - } + filters: {}, + searchLimit: { default: 64 } }, - mounted: /* @__PURE__ */ __name(function mounted4() { - var _this = this; - if (this.message.life) { - this.closeTimeout = setTimeout(function() { - _this.close({ - message: _this.message, - type: "life-end" - }); - }, this.message.life); - } - }, "mounted"), - beforeUnmount: /* @__PURE__ */ __name(function beforeUnmount4() { - this.clearCloseTimeout(); - }, "beforeUnmount"), - methods: { - close: /* @__PURE__ */ __name(function close(params) { - this.$emit("close", params); - }, "close"), - onCloseClick: /* @__PURE__ */ __name(function onCloseClick() { - this.clearCloseTimeout(); - this.close({ - message: this.message, - type: "close" - }); - }, "onCloseClick"), - clearCloseTimeout: /* @__PURE__ */ __name(function clearCloseTimeout() { - if (this.closeTimeout) { - clearTimeout(this.closeTimeout); - this.closeTimeout = null; + emits: ["addFilter", "removeFilter", "addNode"], + setup(__props, { emit: __emit }) { + const settingStore = useSettingStore(); + const { t } = useI18n(); + const enableNodePreview = computed( + () => settingStore.get("Comfy.NodeSearchBoxImpl.NodePreview") + ); + const props = __props; + const nodeSearchFilterVisible = ref(false); + const inputId = `comfy-vue-node-search-box-input-${Math.random()}`; + const suggestions2 = ref([]); + const hoveredSuggestion = ref(null); + const currentQuery = ref(""); + const placeholder = computed(() => { + return props.filters.length === 0 ? t("g.searchNodes") + "..." : ""; + }); + const nodeDefStore = useNodeDefStore(); + const nodeFrequencyStore = useNodeFrequencyStore(); + const search2 = /* @__PURE__ */ __name((query) => { + const queryIsEmpty = query === "" && props.filters.length === 0; + currentQuery.value = query; + suggestions2.value = queryIsEmpty ? nodeFrequencyStore.topNodeDefs : [ + ...nodeDefStore.nodeSearchService.searchNode(query, props.filters, { + limit: props.searchLimit + }) + ]; + }, "search"); + const emit = __emit; + let inputElement = null; + const reFocusInput = /* @__PURE__ */ __name(() => { + inputElement ??= document.getElementById(inputId); + if (inputElement) { + inputElement.blur(); + nextTick(() => inputElement?.focus()); } - }, "clearCloseTimeout") - }, - computed: { - iconComponent: /* @__PURE__ */ __name(function iconComponent() { - return { - info: !this.infoIcon && script$r, - success: !this.successIcon && script$s, - warn: !this.warnIcon && script$t, - error: !this.errorIcon && script$u - }[this.message.severity]; - }, "iconComponent"), - closeAriaLabel: /* @__PURE__ */ __name(function closeAriaLabel() { - return this.$primevue.config.locale.aria ? this.$primevue.config.locale.aria.close : void 0; - }, "closeAriaLabel") - }, - components: { - TimesIcon: script$v, - InfoCircleIcon: script$r, - CheckIcon: script$s, - ExclamationTriangleIcon: script$t, - TimesCircleIcon: script$u - }, - directives: { - ripple: Ripple + }, "reFocusInput"); + onMounted(reFocusInput); + const onAddFilter = /* @__PURE__ */ __name((filterAndValue) => { + nodeSearchFilterVisible.value = false; + emit("addFilter", filterAndValue); + reFocusInput(); + }, "onAddFilter"); + const onRemoveFilter = /* @__PURE__ */ __name((event, filterAndValue) => { + event.stopPropagation(); + event.preventDefault(); + emit("removeFilter", filterAndValue); + reFocusInput(); + }, "onRemoveFilter"); + const setHoverSuggestion = /* @__PURE__ */ __name((index) => { + if (index === -1) { + hoveredSuggestion.value = null; + return; + } + const value = suggestions2.value[index]; + hoveredSuggestion.value = value; + }, "setHoverSuggestion"); + return (_ctx, _cache) => { + return openBlock(), createElementBlock("div", _hoisted_1$h, [ + enableNodePreview.value ? (openBlock(), createElementBlock("div", _hoisted_2$e, [ + hoveredSuggestion.value ? (openBlock(), createBlock(NodePreview, { + nodeDef: hoveredSuggestion.value, + key: hoveredSuggestion.value?.name || "" + }, null, 8, ["nodeDef"])) : createCommentVNode("", true) + ])) : createCommentVNode("", true), + createVNode(unref(script$f), { + icon: "pi pi-filter", + severity: "secondary", + class: "filter-button z-10", + onClick: _cache[0] || (_cache[0] = ($event) => nodeSearchFilterVisible.value = true) + }), + createVNode(unref(script$r), { + visible: nodeSearchFilterVisible.value, + "onUpdate:visible": _cache[1] || (_cache[1] = ($event) => nodeSearchFilterVisible.value = $event), + class: "min-w-96" + }, { + header: withCtx(() => [ + _hoisted_3$c + ]), + default: withCtx(() => [ + createBaseVNode("div", _hoisted_4$2, [ + createVNode(NodeSearchFilter, { onAddFilter }) + ]) + ]), + _: 1 + }, 8, ["visible"]), + createVNode(_sfc_main$k, { + "model-value": props.filters, + class: "comfy-vue-node-search-box z-10 flex-grow", + scrollHeight: "40vh", + placeholder: placeholder.value, + "input-id": inputId, + "append-to": "self", + suggestions: suggestions2.value, + "min-length": 0, + delay: 100, + loading: !unref(nodeFrequencyStore).isLoaded, + onComplete: _cache[2] || (_cache[2] = ($event) => search2($event.query)), + onOptionSelect: _cache[3] || (_cache[3] = ($event) => emit("addNode", $event.value)), + onFocusedOptionChanged: _cache[4] || (_cache[4] = ($event) => setHoverSuggestion($event)), + "complete-on-focus": "", + "auto-option-focus": "", + "force-selection": "", + multiple: "", + optionLabel: "display_name" + }, { + option: withCtx(({ option: option2 }) => [ + createVNode(NodeSearchItem, { + nodeDef: option2, + currentQuery: currentQuery.value + }, null, 8, ["nodeDef", "currentQuery"]) + ]), + chip: withCtx(({ value }) => [ + (openBlock(), createBlock(SearchFilterChip, { + key: `${value[0].id}-${value[1]}`, + onRemove: /* @__PURE__ */ __name(($event) => onRemoveFilter($event, value), "onRemove"), + text: value[1], + badge: value[0].invokeSequence.toUpperCase(), + "badge-class": value[0].invokeSequence + "-badge" + }, null, 8, ["onRemove", "text", "badge", "badge-class"])) + ]), + _: 1 + }, 8, ["model-value", "placeholder", "suggestions", "loading"]) + ]); + }; } -}; -function _typeof$1(o) { - "@babel/helpers - typeof"; - return _typeof$1 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o2) { - return typeof o2; - } : function(o2) { - return o2 && "function" == typeof Symbol && o2.constructor === Symbol && o2 !== Symbol.prototype ? "symbol" : typeof o2; - }, _typeof$1(o); -} -__name(_typeof$1, "_typeof$1"); -function ownKeys$1(e, r) { - var t = Object.keys(e); - if (Object.getOwnPropertySymbols) { - var o = Object.getOwnPropertySymbols(e); - r && (o = o.filter(function(r2) { - return Object.getOwnPropertyDescriptor(e, r2).enumerable; - })), t.push.apply(t, o); +}); +class ConnectingLinkImpl { + static { + __name(this, "ConnectingLinkImpl"); } - return t; -} -__name(ownKeys$1, "ownKeys$1"); -function _objectSpread$1(e) { - for (var r = 1; r < arguments.length; r++) { - var t = null != arguments[r] ? arguments[r] : {}; - r % 2 ? ownKeys$1(Object(t), true).forEach(function(r2) { - _defineProperty$1(e, r2, t[r2]); - }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$1(Object(t)).forEach(function(r2) { - Object.defineProperty(e, r2, Object.getOwnPropertyDescriptor(t, r2)); - }); + constructor(node, slot, input, output, pos, afterRerouteId) { + this.node = node; + this.slot = slot; + this.input = input; + this.output = output; + this.pos = pos; + this.afterRerouteId = afterRerouteId; } - return e; -} -__name(_objectSpread$1, "_objectSpread$1"); -function _defineProperty$1(e, r, t) { - return (r = _toPropertyKey$1(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e; -} -__name(_defineProperty$1, "_defineProperty$1"); -function _toPropertyKey$1(t) { - var i = _toPrimitive$1(t, "string"); - return "symbol" == _typeof$1(i) ? i : i + ""; -} -__name(_toPropertyKey$1, "_toPropertyKey$1"); -function _toPrimitive$1(t, r) { - if ("object" != _typeof$1(t) || !t) return t; - var e = t[Symbol.toPrimitive]; - if (void 0 !== e) { - var i = e.call(t, r || "default"); - if ("object" != _typeof$1(i)) return i; - throw new TypeError("@@toPrimitive must return a primitive value."); + static createFromPlainObject(obj) { + return new ConnectingLinkImpl( + obj.node, + obj.slot, + obj.input, + obj.output, + obj.pos, + obj.afterRerouteId + ); } - return ("string" === r ? String : Number)(t); -} -__name(_toPrimitive$1, "_toPrimitive$1"); -var _hoisted_1$d = ["aria-label"]; -function render$1$2(_ctx, _cache, $props, $setup, $data, $options) { - var _directive_ripple = resolveDirective("ripple"); - return openBlock(), createElementBlock("div", mergeProps({ - "class": [_ctx.cx("message"), $props.message.styleClass], - role: "alert", - "aria-live": "assertive", - "aria-atomic": "true" - }, _ctx.ptm("message")), [$props.templates.container ? (openBlock(), createBlock(resolveDynamicComponent($props.templates.container), { - key: 0, - message: $props.message, - closeCallback: $options.onCloseClick - }, null, 8, ["message", "closeCallback"])) : (openBlock(), createElementBlock("div", mergeProps({ - key: 1, - "class": [_ctx.cx("messageContent"), $props.message.contentStyleClass] - }, _ctx.ptm("messageContent")), [!$props.templates.message ? (openBlock(), createElementBlock(Fragment, { - key: 0 - }, [(openBlock(), createBlock(resolveDynamicComponent($props.templates.messageicon ? $props.templates.messageicon : $props.templates.icon ? $props.templates.icon : $options.iconComponent && $options.iconComponent.name ? $options.iconComponent : "span"), mergeProps({ - "class": _ctx.cx("messageIcon") - }, _ctx.ptm("messageIcon")), null, 16, ["class"])), createBaseVNode("div", mergeProps({ - "class": _ctx.cx("messageText") - }, _ctx.ptm("messageText")), [createBaseVNode("span", mergeProps({ - "class": _ctx.cx("summary") - }, _ctx.ptm("summary")), toDisplayString($props.message.summary), 17), createBaseVNode("div", mergeProps({ - "class": _ctx.cx("detail") - }, _ctx.ptm("detail")), toDisplayString($props.message.detail), 17)], 16)], 64)) : (openBlock(), createBlock(resolveDynamicComponent($props.templates.message), { - key: 1, - message: $props.message - }, null, 8, ["message"])), $props.message.closable !== false ? (openBlock(), createElementBlock("div", normalizeProps(mergeProps({ - key: 2 - }, _ctx.ptm("buttonContainer"))), [withDirectives((openBlock(), createElementBlock("button", mergeProps({ - "class": _ctx.cx("closeButton"), - type: "button", - "aria-label": $options.closeAriaLabel, - onClick: _cache[0] || (_cache[0] = function() { - return $options.onCloseClick && $options.onCloseClick.apply($options, arguments); - }), - autofocus: "" - }, _objectSpread$1(_objectSpread$1({}, $props.closeButtonProps), _ctx.ptm("closeButton"))), [(openBlock(), createBlock(resolveDynamicComponent($props.templates.closeicon || "TimesIcon"), mergeProps({ - "class": [_ctx.cx("closeIcon"), $props.closeIcon] - }, _ctx.ptm("closeIcon")), null, 16, ["class"]))], 16, _hoisted_1$d)), [[_directive_ripple]])], 16)) : createCommentVNode("", true)], 16))], 16); -} -__name(render$1$2, "render$1$2"); -script$1$3.render = render$1$2; -function _toConsumableArray(r) { - return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); -} -__name(_toConsumableArray, "_toConsumableArray"); -function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); -} -__name(_nonIterableSpread, "_nonIterableSpread"); -function _unsupportedIterableToArray(r, a) { - if (r) { - if ("string" == typeof r) return _arrayLikeToArray(r, a); - var t = {}.toString.call(r).slice(8, -1); - return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; + get type() { + const result = this.input ? this.input.type : this.output?.type ?? null; + return result === -1 ? null : result; } -} -__name(_unsupportedIterableToArray, "_unsupportedIterableToArray"); -function _iterableToArray(r) { - if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); -} -__name(_iterableToArray, "_iterableToArray"); -function _arrayWithoutHoles(r) { - if (Array.isArray(r)) return _arrayLikeToArray(r); -} -__name(_arrayWithoutHoles, "_arrayWithoutHoles"); -function _arrayLikeToArray(r, a) { - (null == a || a > r.length) && (a = r.length); - for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; - return n; -} -__name(_arrayLikeToArray, "_arrayLikeToArray"); -var messageIdx = 0; -var script$5 = { - name: "Toast", - "extends": script$2$2, - inheritAttrs: false, - emits: ["close", "life-end"], - data: /* @__PURE__ */ __name(function data5() { - return { - messages: [] - }; - }, "data"), - styleElement: null, - mounted: /* @__PURE__ */ __name(function mounted5() { - ToastEventBus.on("add", this.onAdd); - ToastEventBus.on("remove", this.onRemove); - ToastEventBus.on("remove-group", this.onRemoveGroup); - ToastEventBus.on("remove-all-groups", this.onRemoveAllGroups); - if (this.breakpoints) { - this.createStyle(); + /** + * Which slot type is release and need to be reconnected. + * - 'output' means we need a new node's outputs slot to connect with this link + */ + get releaseSlotType() { + return this.output ? "input" : "output"; + } + connectTo(newNode) { + const newNodeSlots = this.releaseSlotType === "output" ? newNode.outputs : newNode.inputs; + if (!newNodeSlots) return; + const newNodeSlot = newNodeSlots.findIndex( + (slot) => LiteGraph.isValidConnection(slot.type, this.type) + ); + if (newNodeSlot === -1) { + console.warn( + `Could not find slot with type ${this.type} on node ${newNode.title}. This should never happen` + ); + return; } - }, "mounted"), - beforeUnmount: /* @__PURE__ */ __name(function beforeUnmount5() { - this.destroyStyle(); - if (this.$refs.container && this.autoZIndex) { - ZIndex.clear(this.$refs.container); + if (this.releaseSlotType === "input") { + this.node.connect(this.slot, newNode, newNodeSlot, this.afterRerouteId); + } else { + newNode.connect(newNodeSlot, this.node, this.slot, this.afterRerouteId); } - ToastEventBus.off("add", this.onAdd); - ToastEventBus.off("remove", this.onRemove); - ToastEventBus.off("remove-group", this.onRemoveGroup); - ToastEventBus.off("remove-all-groups", this.onRemoveAllGroups); - }, "beforeUnmount"), - methods: { - add: /* @__PURE__ */ __name(function add(message2) { - if (message2.id == null) { - message2.id = messageIdx++; + } +} +const useSearchBoxStore = defineStore("searchBox", () => { + const visible = ref(false); + function toggleVisible() { + visible.value = !visible.value; + } + __name(toggleVisible, "toggleVisible"); + return { + visible, + toggleVisible + }; +}); +const _sfc_main$h = /* @__PURE__ */ defineComponent({ + __name: "NodeSearchBoxPopover", + setup(__props) { + const settingStore = useSettingStore(); + const { visible } = storeToRefs(useSearchBoxStore()); + const dismissable = ref(true); + const triggerEvent = ref(null); + const getNewNodeLocation = /* @__PURE__ */ __name(() => { + if (!triggerEvent.value) { + return app.getCanvasCenter(); } - this.messages = [].concat(_toConsumableArray(this.messages), [message2]); - }, "add"), - remove: /* @__PURE__ */ __name(function remove(params) { - var index = this.messages.findIndex(function(m) { - return m.id === params.message.id; - }); - if (index !== -1) { - this.messages.splice(index, 1); - this.$emit(params.type, { - message: params.message + const originalEvent = triggerEvent.value.detail.originalEvent; + return [originalEvent.canvasX, originalEvent.canvasY]; + }, "getNewNodeLocation"); + const nodeFilters = ref([]); + const addFilter = /* @__PURE__ */ __name((filter) => { + nodeFilters.value.push(filter); + }, "addFilter"); + const removeFilter = /* @__PURE__ */ __name((filter) => { + nodeFilters.value = nodeFilters.value.filter( + (f) => toRaw(f) !== toRaw(filter) + ); + }, "removeFilter"); + const clearFilters = /* @__PURE__ */ __name(() => { + nodeFilters.value = []; + }, "clearFilters"); + const closeDialog = /* @__PURE__ */ __name(() => { + visible.value = false; + }, "closeDialog"); + const addNode = /* @__PURE__ */ __name((nodeDef) => { + const node = app.addNodeOnGraph(nodeDef, { pos: getNewNodeLocation() }); + const eventDetail = triggerEvent.value?.detail; + if (eventDetail && eventDetail.subType === "empty-release") { + eventDetail.linkReleaseContext.links.forEach((link) => { + ConnectingLinkImpl.createFromPlainObject(link).connectTo(node); }); } - }, "remove"), - onAdd: /* @__PURE__ */ __name(function onAdd(message2) { - if (this.group == message2.group) { - this.add(message2); + window.setTimeout(() => { + closeDialog(); + }, 100); + }, "addNode"); + const newSearchBoxEnabled = computed( + () => settingStore.get("Comfy.NodeSearchBoxImpl") === "default" + ); + const showSearchBox = /* @__PURE__ */ __name((e) => { + const detail = e.detail; + if (newSearchBoxEnabled.value) { + if (detail.originalEvent?.pointerType === "touch") { + setTimeout(() => { + showNewSearchBox(e); + }, 128); + } else { + showNewSearchBox(e); + } + } else { + canvasStore.canvas.showSearchBox(detail.originalEvent); } - }, "onAdd"), - onRemove: /* @__PURE__ */ __name(function onRemove(message2) { - this.remove({ - message: message2, - type: "close" + }, "showSearchBox"); + const nodeDefStore = useNodeDefStore(); + const showNewSearchBox = /* @__PURE__ */ __name((e) => { + if (e.detail.subType === "empty-release") { + const links = e.detail.linkReleaseContext.links; + if (links.length === 0) { + console.warn("Empty release with no links! This should never happen"); + return; + } + const firstLink = ConnectingLinkImpl.createFromPlainObject(links[0]); + const filter = nodeDefStore.nodeSearchService.getFilterById( + firstLink.releaseSlotType + ); + const dataType = firstLink.type.toString(); + addFilter([filter, dataType]); + } + visible.value = true; + triggerEvent.value = e; + dismissable.value = false; + setTimeout(() => { + dismissable.value = true; + }, 300); + }, "showNewSearchBox"); + const showContextMenu = /* @__PURE__ */ __name((e) => { + if (e.detail.subType !== "empty-release") { + return; + } + const links = e.detail.linkReleaseContext.links; + if (links.length === 0) { + console.warn("Empty release with no links! This should never happen"); + return; + } + const firstLink = ConnectingLinkImpl.createFromPlainObject(links[0]); + const mouseEvent = e.detail.originalEvent; + const commonOptions = { + e: mouseEvent, + allow_searchbox: true, + showSearchBox: /* @__PURE__ */ __name(() => showSearchBox(e), "showSearchBox") + }; + const connectionOptions = firstLink.output ? { + nodeFrom: firstLink.node, + slotFrom: firstLink.output, + afterRerouteId: firstLink.afterRerouteId + } : { + nodeTo: firstLink.node, + slotTo: firstLink.input, + afterRerouteId: firstLink.afterRerouteId + }; + canvasStore.canvas.showConnectionMenu({ + ...connectionOptions, + ...commonOptions }); - }, "onRemove"), - onRemoveGroup: /* @__PURE__ */ __name(function onRemoveGroup(group) { - if (this.group === group) { - this.messages = []; + }, "showContextMenu"); + const canvasStore = useCanvasStore(); + watchEffect(() => { + if (canvasStore.canvas) { + LiteGraph.release_link_on_empty_shows_menu = false; + canvasStore.canvas.allow_searchbox = false; } - }, "onRemoveGroup"), - onRemoveAllGroups: /* @__PURE__ */ __name(function onRemoveAllGroups() { - this.messages = []; - }, "onRemoveAllGroups"), - onEnter: /* @__PURE__ */ __name(function onEnter() { - this.$refs.container.setAttribute(this.attributeSelector, ""); - if (this.autoZIndex) { - ZIndex.set("modal", this.$refs.container, this.baseZIndex || this.$primevue.config.zIndex.modal); + }); + const canvasEventHandler = /* @__PURE__ */ __name((e) => { + if (e.detail.subType === "empty-double-click") { + showSearchBox(e); + } else if (e.detail.subType === "empty-release") { + handleCanvasEmptyRelease(e); + } else if (e.detail.subType === "group-double-click") { + const group = e.detail.group; + const [x, y] = group.pos; + const relativeY = e.detail.originalEvent.canvasY - y; + if (relativeY > group.titleHeight) { + showSearchBox(e); + } + } + }, "canvasEventHandler"); + const linkReleaseAction = computed(() => { + return settingStore.get("Comfy.LinkRelease.Action"); + }); + const linkReleaseActionShift = computed(() => { + return settingStore.get("Comfy.LinkRelease.ActionShift"); + }); + const handleCanvasEmptyRelease = /* @__PURE__ */ __name((e) => { + const detail = e.detail; + const shiftPressed = detail.originalEvent.shiftKey; + const action = shiftPressed ? linkReleaseActionShift.value : linkReleaseAction.value; + switch (action) { + case LinkReleaseTriggerAction.SEARCH_BOX: + showSearchBox(e); + break; + case LinkReleaseTriggerAction.CONTEXT_MENU: + showContextMenu(e); + break; + case LinkReleaseTriggerAction.NO_ACTION: + default: + break; + } + }, "handleCanvasEmptyRelease"); + useEventListener(document, "litegraph:canvas", canvasEventHandler); + return (_ctx, _cache) => { + return openBlock(), createElementBlock("div", null, [ + createVNode(unref(script$r), { + visible: unref(visible), + "onUpdate:visible": _cache[0] || (_cache[0] = ($event) => isRef(visible) ? visible.value = $event : null), + modal: "", + "dismissable-mask": dismissable.value, + onHide: clearFilters, + pt: { + root: { + class: "invisible-dialog-root", + role: "search" + }, + mask: { class: "node-search-box-dialog-mask" }, + transition: { + enterFromClass: "opacity-0 scale-75", + // 100ms is the duration of the transition in the dialog component + enterActiveClass: "transition-all duration-100 ease-out", + leaveActiveClass: "transition-all duration-100 ease-in", + leaveToClass: "opacity-0 scale-75" + } + } + }, { + container: withCtx(() => [ + createVNode(_sfc_main$i, { + filters: nodeFilters.value, + onAddFilter: addFilter, + onRemoveFilter: removeFilter, + onAddNode: addNode + }, null, 8, ["filters"]) + ]), + _: 1 + }, 8, ["visible", "dismissable-mask"]) + ]); + }; + } +}); +const _sfc_main$g = /* @__PURE__ */ defineComponent({ + __name: "NodeTooltip", + setup(__props) { + let idleTimeout; + const nodeDefStore = useNodeDefStore(); + const tooltipRef = ref(); + const tooltipText = ref(""); + const left = ref(); + const top = ref(); + const hideTooltip = /* @__PURE__ */ __name(() => tooltipText.value = null, "hideTooltip"); + const showTooltip = /* @__PURE__ */ __name(async (tooltip) => { + if (!tooltip) return; + left.value = app.canvas.mouse[0] + "px"; + top.value = app.canvas.mouse[1] + "px"; + tooltipText.value = tooltip; + await nextTick(); + const rect = tooltipRef.value.getBoundingClientRect(); + if (rect.right > window.innerWidth) { + left.value = app.canvas.mouse[0] - rect.width + "px"; } - }, "onEnter"), - onLeave: /* @__PURE__ */ __name(function onLeave() { - var _this = this; - if (this.$refs.container && this.autoZIndex && isEmpty(this.messages)) { - setTimeout(function() { - ZIndex.clear(_this.$refs.container); - }, 200); + if (rect.top < 0) { + top.value = app.canvas.mouse[1] + rect.height + "px"; } - }, "onLeave"), - createStyle: /* @__PURE__ */ __name(function createStyle() { - if (!this.styleElement && !this.isUnstyled) { - var _this$$primevue; - this.styleElement = document.createElement("style"); - this.styleElement.type = "text/css"; - setAttribute(this.styleElement, "nonce", (_this$$primevue = this.$primevue) === null || _this$$primevue === void 0 || (_this$$primevue = _this$$primevue.config) === null || _this$$primevue === void 0 || (_this$$primevue = _this$$primevue.csp) === null || _this$$primevue === void 0 ? void 0 : _this$$primevue.nonce); - document.head.appendChild(this.styleElement); - var innerHTML = ""; - for (var breakpoint in this.breakpoints) { - var breakpointStyle = ""; - for (var styleProp in this.breakpoints[breakpoint]) { - breakpointStyle += styleProp + ":" + this.breakpoints[breakpoint][styleProp] + "!important;"; - } - innerHTML += "\n @media screen and (max-width: ".concat(breakpoint, ") {\n .p-toast[").concat(this.attributeSelector, "] {\n ").concat(breakpointStyle, "\n }\n }\n "); - } - this.styleElement.innerHTML = innerHTML; + }, "showTooltip"); + const onIdle = /* @__PURE__ */ __name(() => { + const { canvas } = app; + const node = canvas.node_over; + if (!node) return; + const ctor = node.constructor; + const nodeDef = nodeDefStore.nodeDefsByName[node.type]; + if (ctor.title_mode !== LiteGraph.NO_TITLE && canvas.graph_mouse[1] < node.pos[1]) { + return showTooltip(nodeDef.description); } - }, "createStyle"), - destroyStyle: /* @__PURE__ */ __name(function destroyStyle() { - if (this.styleElement) { - document.head.removeChild(this.styleElement); - this.styleElement = null; + if (node.flags?.collapsed) return; + const inputSlot = canvas.isOverNodeInput( + node, + canvas.graph_mouse[0], + canvas.graph_mouse[1], + [0, 0] + ); + if (inputSlot !== -1) { + const inputName = node.inputs[inputSlot].name; + const translatedTooltip = st( + `nodeDefs.${normalizeI18nKey(node.type)}.inputs.${normalizeI18nKey(inputName)}.tooltip`, + nodeDef.inputs.getInput(inputName)?.tooltip + ); + return showTooltip(translatedTooltip); } - }, "destroyStyle") - }, - computed: { - attributeSelector: /* @__PURE__ */ __name(function attributeSelector() { - return UniqueComponentId(); - }, "attributeSelector") - }, - components: { - ToastMessage: script$1$3, - Portal: script$k - } -}; -function _typeof$2(o) { - "@babel/helpers - typeof"; - return _typeof$2 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o2) { - return typeof o2; - } : function(o2) { - return o2 && "function" == typeof Symbol && o2.constructor === Symbol && o2 !== Symbol.prototype ? "symbol" : typeof o2; - }, _typeof$2(o); -} -__name(_typeof$2, "_typeof$2"); -function ownKeys$2(e, r) { - var t = Object.keys(e); - if (Object.getOwnPropertySymbols) { - var o = Object.getOwnPropertySymbols(e); - r && (o = o.filter(function(r2) { - return Object.getOwnPropertyDescriptor(e, r2).enumerable; - })), t.push.apply(t, o); + const outputSlot = canvas.isOverNodeOutput( + node, + canvas.graph_mouse[0], + canvas.graph_mouse[1], + [0, 0] + ); + if (outputSlot !== -1) { + const translatedTooltip = st( + `nodeDefs.${normalizeI18nKey(node.type)}.outputs.${outputSlot}.tooltip`, + nodeDef.outputs.all?.[outputSlot]?.tooltip + ); + return showTooltip(translatedTooltip); + } + const widget = app.canvas.getWidgetAtCursor(); + if (widget && !widget.element) { + const translatedTooltip = st( + `nodeDefs.${normalizeI18nKey(node.type)}.inputs.${normalizeI18nKey(widget.name)}.tooltip`, + nodeDef.inputs.getInput(widget.name)?.tooltip + ); + return showTooltip(widget.tooltip ?? translatedTooltip); + } + }, "onIdle"); + const onMouseMove = /* @__PURE__ */ __name((e) => { + hideTooltip(); + clearTimeout(idleTimeout); + if (e.target.nodeName !== "CANVAS") return; + idleTimeout = window.setTimeout(onIdle, 500); + }, "onMouseMove"); + useEventListener(window, "mousemove", onMouseMove); + useEventListener(window, "click", hideTooltip); + return (_ctx, _cache) => { + return tooltipText.value ? (openBlock(), createElementBlock("div", { + key: 0, + ref_key: "tooltipRef", + ref: tooltipRef, + class: "node-tooltip", + style: normalizeStyle({ left: left.value, top: top.value }) + }, toDisplayString(tooltipText.value), 5)) : createCommentVNode("", true); + }; } - return t; -} -__name(ownKeys$2, "ownKeys$2"); -function _objectSpread$2(e) { - for (var r = 1; r < arguments.length; r++) { - var t = null != arguments[r] ? arguments[r] : {}; - r % 2 ? ownKeys$2(Object(t), true).forEach(function(r2) { - _defineProperty$2(e, r2, t[r2]); - }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$2(Object(t)).forEach(function(r2) { - Object.defineProperty(e, r2, Object.getOwnPropertyDescriptor(t, r2)); +}); +const NodeTooltip = /* @__PURE__ */ _export_sfc(_sfc_main$g, [["__scopeId", "data-v-9ecc8adc"]]); +const _sfc_main$f = /* @__PURE__ */ defineComponent({ + __name: "NodeBadge", + setup(__props) { + const settingStore = useSettingStore(); + const colorPaletteStore = useColorPaletteStore(); + const nodeSourceBadgeMode = computed( + () => settingStore.get("Comfy.NodeBadge.NodeSourceBadgeMode") + ); + const nodeIdBadgeMode = computed( + () => settingStore.get("Comfy.NodeBadge.NodeIdBadgeMode") + ); + const nodeLifeCycleBadgeMode = computed( + () => settingStore.get("Comfy.NodeBadge.NodeLifeCycleBadgeMode") + ); + watch([nodeSourceBadgeMode, nodeIdBadgeMode, nodeLifeCycleBadgeMode], () => { + app.graph?.setDirtyCanvas(true, true); }); + const nodeDefStore = useNodeDefStore(); + function badgeTextVisible(nodeDef, badgeMode) { + return !(badgeMode === NodeBadgeMode.None || nodeDef?.isCoreNode && badgeMode === NodeBadgeMode.HideBuiltIn); + } + __name(badgeTextVisible, "badgeTextVisible"); + onMounted(() => { + app.registerExtension({ + name: "Comfy.NodeBadge", + nodeCreated(node) { + node.badgePosition = BadgePosition.TopRight; + const badge = computed(() => { + const nodeDef = nodeDefStore.fromLGraphNode(node); + return new LGraphBadge({ + text: _.truncate( + [ + badgeTextVisible(nodeDef, nodeIdBadgeMode.value) ? `#${node.id}` : "", + badgeTextVisible(nodeDef, nodeLifeCycleBadgeMode.value) ? nodeDef?.nodeLifeCycleBadgeText ?? "" : "", + badgeTextVisible(nodeDef, nodeSourceBadgeMode.value) ? nodeDef?.nodeSource?.badgeText ?? "" : "" + ].filter((s) => s.length > 0).join(" "), + { + length: 31 + } + ), + fgColor: colorPaletteStore.completedActivePalette.colors.litegraph_base.BADGE_FG_COLOR, + bgColor: colorPaletteStore.completedActivePalette.colors.litegraph_base.BADGE_BG_COLOR + }); + }); + node.badges.push(() => badge.value); + } + }); + }); + return (_ctx, _cache) => { + return openBlock(), createElementBlock("div"); + }; } - return e; -} -__name(_objectSpread$2, "_objectSpread$2"); -function _defineProperty$2(e, r, t) { - return (r = _toPropertyKey$2(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e; -} -__name(_defineProperty$2, "_defineProperty$2"); -function _toPropertyKey$2(t) { - var i = _toPrimitive$2(t, "string"); - return "symbol" == _typeof$2(i) ? i : i + ""; -} -__name(_toPropertyKey$2, "_toPropertyKey$2"); -function _toPrimitive$2(t, r) { - if ("object" != _typeof$2(t) || !t) return t; - var e = t[Symbol.toPrimitive]; - if (void 0 !== e) { - var i = e.call(t, r || "default"); - if ("object" != _typeof$2(i)) return i; - throw new TypeError("@@toPrimitive must return a primitive value."); - } - return ("string" === r ? String : Number)(t); +}); +const _hoisted_1$g = { + viewBox: "0 0 1024 1024", + width: "1.2em", + height: "1.2em" +}; +const _hoisted_2$d = /* @__PURE__ */ createBaseVNode("path", { + fill: "currentColor", + d: "M921.088 103.232L584.832 889.024L465.52 544.512L121.328 440.48zM1004.46.769c-6.096 0-13.52 1.728-22.096 5.36L27.708 411.2c-34.383 14.592-36.56 42.704-4.847 62.464l395.296 123.584l129.36 403.264c9.28 15.184 20.496 22.72 31.263 22.72c11.936 0 23.296-9.152 31.04-27.248l408.272-953.728C1029.148 16.368 1022.86.769 1004.46.769" +}, null, -1); +const _hoisted_3$b = [ + _hoisted_2$d +]; +function render$d(_ctx, _cache) { + return openBlock(), createElementBlock("svg", _hoisted_1$g, [..._hoisted_3$b]); } -__name(_toPrimitive$2, "_toPrimitive$2"); -function render$a(_ctx, _cache, $props, $setup, $data, $options) { - var _component_ToastMessage = resolveComponent("ToastMessage"); - var _component_Portal = resolveComponent("Portal"); - return openBlock(), createBlock(_component_Portal, null, { - "default": withCtx(function() { - return [createBaseVNode("div", mergeProps({ - ref: "container", - "class": _ctx.cx("root"), - style: _ctx.sx("root", true, { - position: _ctx.position - }) - }, _ctx.ptmi("root")), [createVNode(TransitionGroup, mergeProps({ - name: "p-toast-message", - tag: "div", - onEnter: $options.onEnter, - onLeave: $options.onLeave - }, _objectSpread$2({}, _ctx.ptm("transition"))), { - "default": withCtx(function() { - return [(openBlock(true), createElementBlock(Fragment, null, renderList($data.messages, function(msg) { - return openBlock(), createBlock(_component_ToastMessage, { - key: msg.id, - message: msg, - templates: _ctx.$slots, - closeIcon: _ctx.closeIcon, - infoIcon: _ctx.infoIcon, - warnIcon: _ctx.warnIcon, - errorIcon: _ctx.errorIcon, - successIcon: _ctx.successIcon, - closeButtonProps: _ctx.closeButtonProps, - unstyled: _ctx.unstyled, - onClose: _cache[0] || (_cache[0] = function($event) { - return $options.remove($event); - }), - pt: _ctx.pt - }, null, 8, ["message", "templates", "closeIcon", "infoIcon", "warnIcon", "errorIcon", "successIcon", "closeButtonProps", "unstyled", "pt"]); - }), 128))]; - }), - _: 1 - }, 16, ["onEnter", "onLeave"])], 16)]; - }), - _: 1 - }); +__name(render$d, "render$d"); +const __unplugin_components_1$2 = markRaw({ name: "simple-line-icons-cursor", render: render$d }); +const _hoisted_1$f = { + viewBox: "0 0 24 24", + width: "1.2em", + height: "1.2em" +}; +const _hoisted_2$c = /* @__PURE__ */ createBaseVNode("path", { + fill: "currentColor", + d: "M10.05 23q-.75 0-1.4-.337T7.575 21.7L1.2 12.375l.6-.575q.475-.475 1.125-.55t1.175.3L7 13.575V4q0-.425.288-.712T8 3t.713.288T9 4v13.425l-3.7-2.6l3.925 5.725q.125.2.35.325t.475.125H17q.825 0 1.413-.587T19 19V5q0-.425.288-.712T20 4t.713.288T21 5v14q0 1.65-1.175 2.825T17 23zM11 12V2q0-.425.288-.712T12 1t.713.288T13 2v10zm4 0V3q0-.425.288-.712T16 2t.713.288T17 3v9zm-2.85 4.5" +}, null, -1); +const _hoisted_3$a = [ + _hoisted_2$c +]; +function render$c(_ctx, _cache) { + return openBlock(), createElementBlock("svg", _hoisted_1$f, [..._hoisted_3$a]); } -__name(render$a, "render$a"); -script$5.render = render$a; -const _sfc_main$9 = /* @__PURE__ */ defineComponent({ - __name: "GlobalToast", +__name(render$c, "render$c"); +const __unplugin_components_0$2 = markRaw({ name: "material-symbols-pan-tool-outline", render: render$c }); +var theme$5 = /* @__PURE__ */ __name(function theme4(_ref) { + _ref.dt; + return "\n.p-buttongroup .p-button {\n margin: 0;\n}\n\n.p-buttongroup .p-button:not(:last-child),\n.p-buttongroup .p-button:not(:last-child):hover {\n border-right: 0 none;\n}\n\n.p-buttongroup .p-button:not(:first-of-type):not(:last-of-type) {\n border-radius: 0;\n}\n\n.p-buttongroup .p-button:first-of-type:not(:only-of-type) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.p-buttongroup .p-button:last-of-type:not(:only-of-type) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.p-buttongroup .p-button:focus {\n position: relative;\n z-index: 1;\n}\n"; +}, "theme"); +var classes$5 = { + root: "p-buttongroup p-component" +}; +var ButtonGroupStyle = BaseStyle.extend({ + name: "buttongroup", + theme: theme$5, + classes: classes$5 +}); +var script$1$5 = { + name: "BaseButtonGroup", + "extends": script$g, + style: ButtonGroupStyle, + provide: /* @__PURE__ */ __name(function provide8() { + return { + $pcButtonGroup: this, + $parentInstance: this + }; + }, "provide") +}; +var script$7 = { + name: "ButtonGroup", + "extends": script$1$5, + inheritAttrs: false +}; +function render$b(_ctx, _cache, $props, $setup, $data, $options) { + return openBlock(), createElementBlock("span", mergeProps({ + "class": _ctx.cx("root"), + role: "group" + }, _ctx.ptmi("root")), [renderSlot(_ctx.$slots, "default")], 16); +} +__name(render$b, "render$b"); +script$7.render = render$b; +const _sfc_main$e = /* @__PURE__ */ defineComponent({ + __name: "GraphCanvasMenu", setup(__props) { - const toast = useToast(); - const toastStore = useToastStore(); + const { t } = useI18n(); + const commandStore = useCommandStore(); + const canvasStore = useCanvasStore(); const settingStore = useSettingStore(); - watch( - () => toastStore.messagesToAdd, - (newMessages) => { - if (newMessages.length === 0) { - return; - } - newMessages.forEach((message2) => { - toast.add(message2); - }); - toastStore.messagesToAdd = []; - }, - { deep: true } - ); - watch( - () => toastStore.messagesToRemove, - (messagesToRemove) => { - if (messagesToRemove.length === 0) { - return; - } - messagesToRemove.forEach((message2) => { - toast.remove(message2); - }); - toastStore.messagesToRemove = []; - }, - { deep: true } + const linkHidden = computed( + () => settingStore.get("Comfy.LinkRenderMode") === LiteGraph.HIDDEN_LINK ); - watch( - () => toastStore.removeAllRequested, - (requested) => { - if (requested) { - toast.removeAllGroups(); - toastStore.removeAllRequested = false; - } + let interval = null; + const repeat2 = /* @__PURE__ */ __name((command) => { + if (interval) return; + const cmd = /* @__PURE__ */ __name(() => commandStore.execute(command), "cmd"); + cmd(); + interval = window.setInterval(cmd, 100); + }, "repeat"); + const stopRepeat = /* @__PURE__ */ __name(() => { + if (interval) { + clearInterval(interval); + interval = null; } - ); - function updateToastPosition() { - const styleElement = document.getElementById("dynamic-toast-style") || createStyleElement(); - const rect = document.querySelector(".graph-canvas-container").getBoundingClientRect(); - styleElement.textContent = ` - .p-toast.p-component.p-toast-top-right { - top: ${rect.top + 20}px !important; - right: ${window.innerWidth - (rect.left + rect.width) + 20}px !important; + }, "stopRepeat"); + return (_ctx, _cache) => { + const _component_i_material_symbols58pan_tool_outline = __unplugin_components_0$2; + const _component_i_simple_line_icons58cursor = __unplugin_components_1$2; + const _directive_tooltip = resolveDirective("tooltip"); + return openBlock(), createBlock(unref(script$7), { class: "p-buttongroup-vertical absolute bottom-[10px] right-[10px] z-[1000] pointer-events-auto" }, { + default: withCtx(() => [ + withDirectives(createVNode(unref(script$f), { + severity: "secondary", + icon: "pi pi-plus", + onMousedown: _cache[0] || (_cache[0] = ($event) => repeat2("Comfy.Canvas.ZoomIn")), + onMouseup: stopRepeat + }, null, 512), [ + [ + _directive_tooltip, + unref(t)("graphCanvasMenu.zoomIn"), + void 0, + { left: true } + ] + ]), + withDirectives(createVNode(unref(script$f), { + severity: "secondary", + icon: "pi pi-minus", + onMousedown: _cache[1] || (_cache[1] = ($event) => repeat2("Comfy.Canvas.ZoomOut")), + onMouseup: stopRepeat + }, null, 512), [ + [ + _directive_tooltip, + unref(t)("graphCanvasMenu.zoomOut"), + void 0, + { left: true } + ] + ]), + withDirectives(createVNode(unref(script$f), { + severity: "secondary", + icon: "pi pi-expand", + onClick: _cache[2] || (_cache[2] = () => unref(commandStore).execute("Comfy.Canvas.FitView")) + }, null, 512), [ + [ + _directive_tooltip, + unref(t)("graphCanvasMenu.fitView"), + void 0, + { left: true } + ] + ]), + withDirectives((openBlock(), createBlock(unref(script$f), { + severity: "secondary", + onClick: _cache[3] || (_cache[3] = () => unref(commandStore).execute("Comfy.Canvas.ToggleLock")) + }, { + icon: withCtx(() => [ + unref(canvasStore).canvas?.read_only ? (openBlock(), createBlock(_component_i_material_symbols58pan_tool_outline, { key: 0 })) : (openBlock(), createBlock(_component_i_simple_line_icons58cursor, { key: 1 })) + ]), + _: 1 + })), [ + [ + _directive_tooltip, + unref(t)( + "graphCanvasMenu." + (unref(canvasStore).canvas?.read_only ? "panMode" : "selectMode") + ) + " (Space)", + void 0, + { left: true } + ] + ]), + withDirectives(createVNode(unref(script$f), { + severity: "secondary", + icon: linkHidden.value ? "pi pi-eye-slash" : "pi pi-eye", + onClick: _cache[4] || (_cache[4] = () => unref(commandStore).execute("Comfy.Canvas.ToggleLinkVisibility")), + "data-testid": "toggle-link-visibility-button" + }, null, 8, ["icon"]), [ + [ + _directive_tooltip, + unref(t)("graphCanvasMenu.toggleLinkVisibility"), + void 0, + { left: true } + ] + ]) + ]), + _: 1 + }); + }; + } +}); +const GraphCanvasMenu = /* @__PURE__ */ _export_sfc(_sfc_main$e, [["__scopeId", "data-v-94481f39"]]); +const CORE_SETTINGS = [ + { + id: "Comfy.Validation.Workflows", + name: "Validate workflows", + type: "boolean", + defaultValue: true + }, + { + id: "Comfy.NodeSearchBoxImpl", + category: ["Comfy", "Node Search Box", "Implementation"], + experimental: true, + name: "Node search box implementation", + type: "combo", + options: ["default", "litegraph (legacy)"], + defaultValue: "default" + }, + { + id: "Comfy.LinkRelease.Action", + category: ["LiteGraph", "LinkRelease", "Action"], + name: "Action on link release (No modifier)", + type: "combo", + options: Object.values(LinkReleaseTriggerAction), + defaultValue: LinkReleaseTriggerAction.CONTEXT_MENU + }, + { + id: "Comfy.LinkRelease.ActionShift", + category: ["LiteGraph", "LinkRelease", "ActionShift"], + name: "Action on link release (Shift)", + type: "combo", + options: Object.values(LinkReleaseTriggerAction), + defaultValue: LinkReleaseTriggerAction.SEARCH_BOX + }, + { + id: "Comfy.NodeSearchBoxImpl.NodePreview", + category: ["Comfy", "Node Search Box", "NodePreview"], + name: "Node preview", + tooltip: "Only applies to the default implementation", + type: "boolean", + defaultValue: true + }, + { + id: "Comfy.NodeSearchBoxImpl.ShowCategory", + category: ["Comfy", "Node Search Box", "ShowCategory"], + name: "Show node category in search results", + tooltip: "Only applies to the default implementation", + type: "boolean", + defaultValue: true + }, + { + id: "Comfy.NodeSearchBoxImpl.ShowIdName", + category: ["Comfy", "Node Search Box", "ShowIdName"], + name: "Show node id name in search results", + tooltip: "Only applies to the default implementation", + type: "boolean", + defaultValue: false + }, + { + id: "Comfy.NodeSearchBoxImpl.ShowNodeFrequency", + category: ["Comfy", "Node Search Box", "ShowNodeFrequency"], + name: "Show node frequency in search results", + tooltip: "Only applies to the default implementation", + type: "boolean", + defaultValue: false + }, + { + id: "Comfy.Sidebar.Location", + category: ["Appearance", "Sidebar", "Location"], + name: "Sidebar location", + type: "combo", + options: ["left", "right"], + defaultValue: "left" + }, + { + id: "Comfy.Sidebar.Size", + category: ["Appearance", "Sidebar", "Size"], + name: "Sidebar size", + type: "combo", + options: ["normal", "small"], + defaultValue: /* @__PURE__ */ __name(() => window.innerWidth < 1600 ? "small" : "normal", "defaultValue") + }, + { + id: "Comfy.TextareaWidget.FontSize", + category: ["Appearance", "Node Widget", "TextareaWidget", "FontSize"], + name: "Textarea widget font size", + type: "slider", + defaultValue: 10, + attrs: { + min: 8, + max: 24 } - `; + }, + { + id: "Comfy.TextareaWidget.Spellcheck", + category: ["Comfy", "Node Widget", "TextareaWidget", "Spellcheck"], + name: "Textarea widget spellcheck", + type: "boolean", + defaultValue: false + }, + { + id: "Comfy.Workflow.SortNodeIdOnSave", + name: "Sort node IDs when saving workflow", + type: "boolean", + defaultValue: false + }, + { + id: "Comfy.Graph.CanvasInfo", + category: ["LiteGraph", "Canvas", "CanvasInfo"], + name: "Show canvas info on bottom left corner (fps, etc.)", + type: "boolean", + defaultValue: true + }, + { + id: "Comfy.Node.ShowDeprecated", + name: "Show deprecated nodes in search", + tooltip: "Deprecated nodes are hidden by default in the UI, but remain functional in existing workflows that use them.", + type: "boolean", + defaultValue: false + }, + { + id: "Comfy.Node.ShowExperimental", + name: "Show experimental nodes in search", + tooltip: "Experimental nodes are marked as such in the UI and may be subject to significant changes or removal in future versions. Use with caution in production workflows", + type: "boolean", + defaultValue: true + }, + { + id: "Comfy.Node.Opacity", + category: ["Appearance", "Node", "Opacity"], + name: "Node opacity", + type: "slider", + defaultValue: 1, + attrs: { + min: 0.01, + max: 1, + step: 0.01 } - __name(updateToastPosition, "updateToastPosition"); - function createStyleElement() { - const style = document.createElement("style"); - style.id = "dynamic-toast-style"; - document.head.appendChild(style); - return style; + }, + { + id: "Comfy.Workflow.ShowMissingNodesWarning", + name: "Show missing nodes warning", + type: "boolean", + defaultValue: true + }, + { + id: "Comfy.Workflow.ShowMissingModelsWarning", + name: "Show missing models warning", + type: "boolean", + defaultValue: false, + experimental: true + }, + { + id: "Comfy.Graph.ZoomSpeed", + category: ["LiteGraph", "Canvas", "ZoomSpeed"], + name: "Canvas zoom speed", + type: "slider", + defaultValue: 1.1, + attrs: { + min: 1.01, + max: 2.5, + step: 0.01 } - __name(createStyleElement, "createStyleElement"); - watch( - () => settingStore.get("Comfy.UseNewMenu"), - () => nextTick(updateToastPosition), - { immediate: true } - ); - watch( - () => settingStore.get("Comfy.Sidebar.Location"), - () => nextTick(updateToastPosition), - { immediate: true } - ); - return (_ctx, _cache) => { - return openBlock(), createBlock(unref(script$5)); - }; - } -}); -const _hoisted_1$c = { - viewBox: "0 0 24 24", - width: "1.2em", - height: "1.2em" -}; -const _hoisted_2$a = /* @__PURE__ */ createBaseVNode("path", { - fill: "none", - stroke: "currentColor", - "stroke-linecap": "round", - "stroke-linejoin": "round", - "stroke-width": "2", - d: "M6 4v16m4-16l10 8l-10 8z" -}, null, -1); -const _hoisted_3$9 = [ - _hoisted_2$a -]; -function render$9(_ctx, _cache) { - return openBlock(), createElementBlock("svg", _hoisted_1$c, [..._hoisted_3$9]); -} -__name(render$9, "render$9"); -const __unplugin_components_3 = markRaw({ name: "lucide-step-forward", render: render$9 }); -const _hoisted_1$b = { - viewBox: "0 0 24 24", - width: "1.2em", - height: "1.2em" -}; -const _hoisted_2$9 = /* @__PURE__ */ createBaseVNode("path", { - fill: "none", - stroke: "currentColor", - "stroke-linecap": "round", - "stroke-linejoin": "round", - "stroke-width": "2", - d: "m13 19l9-7l-9-7zM2 19l9-7l-9-7z" -}, null, -1); -const _hoisted_3$8 = [ - _hoisted_2$9 -]; -function render$8(_ctx, _cache) { - return openBlock(), createElementBlock("svg", _hoisted_1$b, [..._hoisted_3$8]); -} -__name(render$8, "render$8"); -const __unplugin_components_2 = markRaw({ name: "lucide-fast-forward", render: render$8 }); -const _hoisted_1$a = { - viewBox: "0 0 24 24", - width: "1.2em", - height: "1.2em" -}; -const _hoisted_2$8 = /* @__PURE__ */ createBaseVNode("path", { - fill: "none", - stroke: "currentColor", - "stroke-linecap": "round", - "stroke-linejoin": "round", - "stroke-width": "2", - d: "m6 3l14 9l-14 9z" -}, null, -1); -const _hoisted_3$7 = [ - _hoisted_2$8 -]; -function render$7(_ctx, _cache) { - return openBlock(), createElementBlock("svg", _hoisted_1$a, [..._hoisted_3$7]); -} -__name(render$7, "render$7"); -const __unplugin_components_1$1 = markRaw({ name: "lucide-play", render: render$7 }); -const _hoisted_1$9 = { - viewBox: "0 0 24 24", - width: "1.2em", - height: "1.2em" -}; -const _hoisted_2$7 = /* @__PURE__ */ createBaseVNode("g", { - fill: "none", - stroke: "currentColor", - "stroke-linecap": "round", - "stroke-linejoin": "round", - "stroke-width": "2" -}, [ - /* @__PURE__ */ createBaseVNode("path", { d: "M16 12H3m13 6H3m7-12H3m18 12V8a2 2 0 0 0-2-2h-5" }), - /* @__PURE__ */ createBaseVNode("path", { d: "m16 8l-2-2l2-2" }) -], -1); -const _hoisted_3$6 = [ - _hoisted_2$7 -]; -function render$6(_ctx, _cache) { - return openBlock(), createElementBlock("svg", _hoisted_1$9, [..._hoisted_3$6]); -} -__name(render$6, "render$6"); -const __unplugin_components_0$1 = markRaw({ name: "lucide-list-start", render: render$6 }); -var theme$2 = /* @__PURE__ */ __name(function theme6(_ref) { - var dt = _ref.dt; - return "\n.p-tieredmenu {\n background: ".concat(dt("tieredmenu.background"), ";\n color: ").concat(dt("tieredmenu.color"), ";\n border: 1px solid ").concat(dt("tieredmenu.border.color"), ";\n border-radius: ").concat(dt("tieredmenu.border.radius"), ";\n min-width: 12.5rem;\n}\n\n.p-tieredmenu-root-list,\n.p-tieredmenu-submenu {\n margin: 0;\n padding: ").concat(dt("tieredmenu.list.padding"), ";\n list-style: none;\n outline: 0 none;\n display: flex;\n flex-direction: column;\n gap: ").concat(dt("tieredmenu.list.gap"), ";\n}\n\n.p-tieredmenu-submenu {\n position: absolute;\n min-width: 100%;\n z-index: 1;\n background: ").concat(dt("tieredmenu.background"), ";\n color: ").concat(dt("tieredmenu.color"), ";\n border: 1px solid ").concat(dt("tieredmenu.border.color"), ";\n border-radius: ").concat(dt("tieredmenu.border.radius"), ";\n box-shadow: ").concat(dt("tieredmenu.shadow"), ";\n}\n\n.p-tieredmenu-item {\n position: relative;\n}\n\n.p-tieredmenu-item-content {\n transition: background ").concat(dt("tieredmenu.transition.duration"), ", color ").concat(dt("tieredmenu.transition.duration"), ";\n border-radius: ").concat(dt("tieredmenu.item.border.radius"), ";\n color: ").concat(dt("tieredmenu.item.color"), ";\n}\n\n.p-tieredmenu-item-link {\n cursor: pointer;\n display: flex;\n align-items: center;\n text-decoration: none;\n overflow: hidden;\n position: relative;\n color: inherit;\n padding: ").concat(dt("tieredmenu.item.padding"), ";\n gap: ").concat(dt("tieredmenu.item.gap"), ";\n user-select: none;\n outline: 0 none;\n}\n\n.p-tieredmenu-item-label {\n line-height: 1;\n}\n\n.p-tieredmenu-item-icon {\n color: ").concat(dt("tieredmenu.item.icon.color"), ";\n}\n\n.p-tieredmenu-submenu-icon {\n color: ").concat(dt("tieredmenu.submenu.icon.color"), ";\n margin-left: auto;\n font-size: ").concat(dt("tieredmenu.submenu.icon.size"), ";\n width: ").concat(dt("tieredmenu.submenu.icon.size"), ";\n height: ").concat(dt("tieredmenu.submenu.icon.size"), ";\n}\n\n.p-tieredmenu-item.p-focus > .p-tieredmenu-item-content {\n color: ").concat(dt("tieredmenu.item.focus.color"), ";\n background: ").concat(dt("tieredmenu.item.focus.background"), ";\n}\n\n.p-tieredmenu-item.p-focus > .p-tieredmenu-item-content .p-tieredmenu-item-icon {\n color: ").concat(dt("tieredmenu.item.icon.focus.color"), ";\n}\n\n.p-tieredmenu-item.p-focus > .p-tieredmenu-item-content .p-tieredmenu-submenu-icon {\n color: ").concat(dt("tieredmenu.submenu.icon.focus.color"), ";\n}\n\n.p-tieredmenu-item:not(.p-disabled) > .p-tieredmenu-item-content:hover {\n color: ").concat(dt("tieredmenu.item.focus.color"), ";\n background: ").concat(dt("tieredmenu.item.focus.background"), ";\n}\n\n.p-tieredmenu-item:not(.p-disabled) > .p-tieredmenu-item-content:hover .p-tieredmenu-item-icon {\n color: ").concat(dt("tieredmenu.item.icon.focus.color"), ";\n}\n\n.p-tieredmenu-item:not(.p-disabled) > .p-tieredmenu-item-content:hover .p-tieredmenu-submenu-icon {\n color: ").concat(dt("tieredmenu.submenu.icon.focus.color"), ";\n}\n\n.p-tieredmenu-item-active > .p-tieredmenu-item-content {\n color: ").concat(dt("tieredmenu.item.active.color"), ";\n background: ").concat(dt("tieredmenu.item.active.background"), ";\n}\n\n.p-tieredmenu-item-active > .p-tieredmenu-item-content .p-tieredmenu-item-icon {\n color: ").concat(dt("tieredmenu.item.icon.active.color"), ";\n}\n\n.p-tieredmenu-item-active > .p-tieredmenu-item-content .p-tieredmenu-submenu-icon {\n color: ").concat(dt("tieredmenu.submenu.icon.active.color"), ";\n}\n\n.p-tieredmenu-separator {\n border-top: 1px solid ").concat(dt("tieredmenu.separator.border.color"), ";\n}\n\n.p-tieredmenu-overlay {\n box-shadow: ").concat(dt("tieredmenu.shadow"), ";\n}\n\n.p-tieredmenu-enter-from,\n.p-tieredmenu-leave-active {\n opacity: 0;\n}\n\n.p-tieredmenu-enter-active {\n transition: opacity 250ms;\n}\n"); -}, "theme"); -var inlineStyles$1 = { - submenu: /* @__PURE__ */ __name(function submenu(_ref2) { - var instance = _ref2.instance, processedItem = _ref2.processedItem; - return { - display: instance.isItemActive(processedItem) ? "flex" : "none" - }; - }, "submenu") -}; -var classes$2 = { - root: /* @__PURE__ */ __name(function root8(_ref3) { - _ref3.instance; - var props = _ref3.props; - return ["p-tieredmenu p-component", { - "p-tieredmenu-overlay": props.popup - }]; - }, "root"), - start: "p-tieredmenu-start", - rootList: "p-tieredmenu-root-list", - item: /* @__PURE__ */ __name(function item(_ref4) { - var instance = _ref4.instance, processedItem = _ref4.processedItem; - return ["p-tieredmenu-item", { - "p-tieredmenu-item-active": instance.isItemActive(processedItem), - "p-focus": instance.isItemFocused(processedItem), - "p-disabled": instance.isItemDisabled(processedItem) - }]; - }, "item"), - itemContent: "p-tieredmenu-item-content", - itemLink: "p-tieredmenu-item-link", - itemIcon: "p-tieredmenu-item-icon", - itemLabel: "p-tieredmenu-item-label", - submenuIcon: "p-tieredmenu-submenu-icon", - submenu: "p-tieredmenu-submenu", - separator: "p-tieredmenu-separator", - end: "p-tieredmenu-end" -}; -var TieredMenuStyle = BaseStyle.extend({ - name: "tieredmenu", - theme: theme$2, - classes: classes$2, - inlineStyles: inlineStyles$1 -}); -var script$2$1 = { - name: "BaseTieredMenu", - "extends": script$e, - props: { - popup: { - type: Boolean, - "default": false - }, - model: { - type: Array, - "default": null - }, - appendTo: { - type: [String, Object], - "default": "body" - }, - autoZIndex: { - type: Boolean, - "default": true - }, - baseZIndex: { - type: Number, - "default": 0 - }, - disabled: { - type: Boolean, - "default": false - }, - tabindex: { - type: Number, - "default": 0 - }, - ariaLabelledby: { - type: String, - "default": null - }, - ariaLabel: { - type: String, - "default": null + }, + // Bookmarks are stored in the settings store. + // Bookmarks are in format of category/display_name. e.g. "conditioning/CLIPTextEncode" + { + id: "Comfy.NodeLibrary.Bookmarks", + name: "Node library bookmarks with display name (deprecated)", + type: "hidden", + defaultValue: [], + deprecated: true + }, + { + id: "Comfy.NodeLibrary.Bookmarks.V2", + name: "Node library bookmarks v2 with unique name", + type: "hidden", + defaultValue: [] + }, + // Stores mapping from bookmark folder name to its customization. + { + id: "Comfy.NodeLibrary.BookmarksCustomization", + name: "Node library bookmarks customization", + type: "hidden", + defaultValue: {} + }, + // Hidden setting used by the queue for how to fit images + { + id: "Comfy.Queue.ImageFit", + name: "Queue image fit", + type: "hidden", + defaultValue: "cover" + }, + { + id: "Comfy.GroupSelectedNodes.Padding", + category: ["LiteGraph", "Group", "Padding"], + name: "Group selected nodes padding", + type: "slider", + defaultValue: 10, + attrs: { + min: 0, + max: 100 + } + }, + { + id: "Comfy.Node.DoubleClickTitleToEdit", + category: ["LiteGraph", "Node", "DoubleClickTitleToEdit"], + name: "Double click node title to edit", + type: "boolean", + defaultValue: true + }, + { + id: "Comfy.Group.DoubleClickTitleToEdit", + category: ["LiteGraph", "Group", "DoubleClickTitleToEdit"], + name: "Double click group title to edit", + type: "boolean", + defaultValue: true + }, + { + id: "Comfy.Window.UnloadConfirmation", + name: "Show confirmation when closing window", + type: "boolean", + defaultValue: false + }, + { + id: "Comfy.TreeExplorer.ItemPadding", + category: ["Appearance", "Tree Explorer", "ItemPadding"], + name: "Tree explorer item padding", + type: "slider", + defaultValue: 2, + attrs: { + min: 0, + max: 8, + step: 1 } }, - style: TieredMenuStyle, - provide: /* @__PURE__ */ __name(function provide10() { - return { - $pcTieredMenu: this, - $parentInstance: this - }; - }, "provide") -}; -var script$1$2 = { - name: "TieredMenuSub", - hostName: "TieredMenu", - "extends": script$e, - emits: ["item-click", "item-mouseenter", "item-mousemove"], - container: null, - props: { - menuId: { - type: String, - "default": null - }, - focusedItemId: { - type: String, - "default": null - }, - items: { - type: Array, - "default": null - }, - visible: { - type: Boolean, - "default": false - }, - level: { - type: Number, - "default": 0 - }, - templates: { - type: Object, - "default": null - }, - activeItemPath: { - type: Object, - "default": null + { + id: "Comfy.ModelLibrary.AutoLoadAll", + name: "Automatically load all model folders", + tooltip: "If true, all folders will load as soon as you open the model library (this may cause delays while it loads). If false, root level model folders will only load once you click on them.", + type: "boolean", + defaultValue: false + }, + { + id: "Comfy.ModelLibrary.NameFormat", + name: "What name to display in the model library tree view", + tooltip: 'Select "filename" to render a simplified view of the raw filename (without directory or ".safetensors" extension) in the model list. Select "title" to display the configurable model metadata title.', + type: "combo", + options: ["filename", "title"], + defaultValue: "title" + }, + { + id: "Comfy.Locale", + name: "Language", + type: "combo", + options: [ + { value: "en", text: "English" }, + { value: "zh", text: "中文" }, + { value: "ru", text: "Русский" }, + { value: "ja", text: "日本語" }, + { value: "ko", text: "한국어" }, + { value: "fr", text: "Français" } + ], + defaultValue: /* @__PURE__ */ __name(() => navigator.language.split("-")[0] || "en", "defaultValue") + }, + { + id: "Comfy.NodeBadge.NodeSourceBadgeMode", + category: ["LiteGraph", "Node", "NodeSourceBadgeMode"], + name: "Node source badge mode", + type: "combo", + options: Object.values(NodeBadgeMode), + defaultValue: NodeBadgeMode.HideBuiltIn + }, + { + id: "Comfy.NodeBadge.NodeIdBadgeMode", + category: ["LiteGraph", "Node", "NodeIdBadgeMode"], + name: "Node ID badge mode", + type: "combo", + options: [NodeBadgeMode.None, NodeBadgeMode.ShowAll], + defaultValue: NodeBadgeMode.ShowAll + }, + { + id: "Comfy.NodeBadge.NodeLifeCycleBadgeMode", + category: ["LiteGraph", "Node", "NodeLifeCycleBadgeMode"], + name: "Node life cycle badge mode", + type: "combo", + options: [NodeBadgeMode.None, NodeBadgeMode.ShowAll], + defaultValue: NodeBadgeMode.ShowAll + }, + { + id: "Comfy.ConfirmClear", + category: ["Comfy", "Workflow", "ConfirmClear"], + name: "Require confirmation when clearing workflow", + type: "boolean", + defaultValue: true + }, + { + id: "Comfy.PromptFilename", + category: ["Comfy", "Workflow", "PromptFilename"], + name: "Prompt for filename when saving workflow", + type: "boolean", + defaultValue: true + }, + /** + * file format for preview + * + * format;quality + * + * ex) + * webp;50 -> webp, quality 50 + * jpeg;80 -> rgb, jpeg, quality 80 + * + * @type {string} + */ + { + id: "Comfy.PreviewFormat", + category: ["LiteGraph", "Node Widget", "PreviewFormat"], + name: "Preview image format", + tooltip: "When displaying a preview in the image widget, convert it to a lightweight image, e.g. webp, jpeg, webp;50, etc.", + type: "text", + defaultValue: "" + }, + { + id: "Comfy.DisableSliders", + category: ["LiteGraph", "Node Widget", "DisableSliders"], + name: "Disable node widget sliders", + type: "boolean", + defaultValue: false + }, + { + id: "Comfy.DisableFloatRounding", + category: ["LiteGraph", "Node Widget", "DisableFloatRounding"], + name: "Disable default float widget rounding.", + tooltip: "(requires page reload) Cannot disable round when round is set by the node in the backend.", + type: "boolean", + defaultValue: false + }, + { + id: "Comfy.FloatRoundingPrecision", + category: ["LiteGraph", "Node Widget", "FloatRoundingPrecision"], + name: "Float widget rounding decimal places [0 = auto].", + tooltip: "(requires page reload)", + type: "slider", + attrs: { + min: 0, + max: 6, + step: 1 + }, + defaultValue: 0 + }, + { + id: "Comfy.EnableTooltips", + category: ["LiteGraph", "Node", "EnableTooltips"], + name: "Enable Tooltips", + type: "boolean", + defaultValue: true + }, + { + id: "Comfy.DevMode", + name: "Enable dev mode options (API save, etc.)", + type: "boolean", + defaultValue: false, + onChange: /* @__PURE__ */ __name((value) => { + const element = document.getElementById("comfy-dev-save-api-button"); + if (element) { + element.style.display = value ? "flex" : "none"; + } + }, "onChange") + }, + { + id: "Comfy.UseNewMenu", + category: ["Comfy", "Menu", "UseNewMenu"], + defaultValue: "Top", + name: "Use new menu", + type: "combo", + options: ["Disabled", "Top", "Bottom"], + migrateDeprecatedValue: /* @__PURE__ */ __name((value) => { + if (value === "Floating") { + return "Top"; + } + return value; + }, "migrateDeprecatedValue") + }, + { + id: "Comfy.Workflow.WorkflowTabsPosition", + name: "Opened workflows position", + type: "combo", + options: ["Sidebar", "Topbar"], + defaultValue: "Topbar" + }, + { + id: "Comfy.Graph.CanvasMenu", + category: ["LiteGraph", "Canvas", "CanvasMenu"], + name: "Show graph canvas menu", + type: "boolean", + defaultValue: true + }, + { + id: "Comfy.QueueButton.BatchCountLimit", + name: "Batch count limit", + tooltip: "The maximum number of tasks added to the queue at one button click", + type: "number", + defaultValue: 100, + versionAdded: "1.3.5" + }, + { + id: "Comfy.Keybinding.UnsetBindings", + name: "Keybindings unset by the user", + type: "hidden", + defaultValue: [], + versionAdded: "1.3.7" + }, + { + id: "Comfy.Keybinding.NewBindings", + name: "Keybindings set by the user", + type: "hidden", + defaultValue: [], + versionAdded: "1.3.7" + }, + { + id: "Comfy.Extension.Disabled", + name: "Disabled extension names", + type: "hidden", + defaultValue: [], + versionAdded: "1.3.11" + }, + { + id: "Comfy.Validation.NodeDefs", + name: "Validate node definitions (slow)", + type: "boolean", + tooltip: "Recommended for node developers. This will validate all node definitions on startup.", + defaultValue: false, + versionAdded: "1.3.14" + }, + { + id: "Comfy.LinkRenderMode", + category: ["LiteGraph", "Graph", "LinkRenderMode"], + name: "Link Render Mode", + defaultValue: 2, + type: "combo", + options: [ + { value: LiteGraph.STRAIGHT_LINK, text: "Straight" }, + { value: LiteGraph.LINEAR_LINK, text: "Linear" }, + { value: LiteGraph.SPLINE_LINK, text: "Spline" }, + { value: LiteGraph.HIDDEN_LINK, text: "Hidden" } + ] + }, + { + id: "Comfy.Node.AutoSnapLinkToSlot", + category: ["LiteGraph", "Node", "AutoSnapLinkToSlot"], + name: "Auto snap link to node slot", + tooltip: "When dragging a link over a node, the link automatically snap to a viable input slot on the node", + type: "boolean", + defaultValue: true, + versionAdded: "1.3.29" + }, + { + id: "Comfy.Node.SnapHighlightsNode", + category: ["LiteGraph", "Node", "SnapHighlightsNode"], + name: "Snap highlights node", + tooltip: "When dragging a link over a node with viable input slot, highlight the node", + type: "boolean", + defaultValue: true, + versionAdded: "1.3.29" + }, + { + id: "Comfy.Node.BypassAllLinksOnDelete", + category: ["LiteGraph", "Node", "BypassAllLinksOnDelete"], + name: "Keep all links when deleting nodes", + tooltip: "When deleting a node, attempt to reconnect all of its input and output links (bypassing the deleted node)", + type: "boolean", + defaultValue: true, + versionAdded: "1.3.40" + }, + { + id: "Comfy.Node.MiddleClickRerouteNode", + category: ["LiteGraph", "Node", "MiddleClickRerouteNode"], + name: "Middle-click creates a new Reroute node", + type: "boolean", + defaultValue: true, + versionAdded: "1.3.42" + }, + { + id: "Comfy.RerouteBeta", + category: ["LiteGraph", "RerouteBeta"], + name: "Opt-in to the reroute beta test", + tooltip: "Enables the new native reroutes.\n\nReroutes can be added by holding alt and dragging from a link line, or on the link menu.\n\nDisabling this option is non-destructive - reroutes are hidden.", + experimental: true, + type: "boolean", + defaultValue: false, + versionAdded: "1.3.42" + }, + { + id: "Comfy.Graph.LinkMarkers", + category: ["LiteGraph", "Link", "LinkMarkers"], + name: "Link midpoint markers", + defaultValue: LinkMarkerShape.Circle, + type: "combo", + options: [ + { value: LinkMarkerShape.None, text: "None" }, + { value: LinkMarkerShape.Circle, text: "Circle" }, + { value: LinkMarkerShape.Arrow, text: "Arrow" } + ], + versionAdded: "1.3.42" + }, + { + id: "Comfy.DOMClippingEnabled", + category: ["LiteGraph", "Node", "DOMClippingEnabled"], + name: "Enable DOM element clipping (enabling may reduce performance)", + type: "boolean", + defaultValue: true + }, + { + id: "Comfy.Graph.CtrlShiftZoom", + category: ["LiteGraph", "Canvas", "CtrlShiftZoom"], + name: "Enable fast-zoom shortcut (Ctrl + Shift + Drag)", + type: "boolean", + defaultValue: true, + versionAdded: "1.4.0" + }, + { + id: "Comfy.Pointer.ClickDrift", + category: ["LiteGraph", "Pointer", "ClickDrift"], + name: "Pointer click drift (maximum distance)", + tooltip: "If the pointer moves more than this distance while holding a button down, it is considered dragging (rather than clicking).\n\nHelps prevent objects from being unintentionally nudged if the pointer is moved whilst clicking.", + experimental: true, + type: "slider", + attrs: { + min: 0, + max: 20, + step: 1 }, - tabindex: { - type: Number, - "default": 0 - } + defaultValue: 6, + versionAdded: "1.4.3" }, - methods: { - getItemId: /* @__PURE__ */ __name(function getItemId(processedItem) { - return "".concat(this.menuId, "_").concat(processedItem.key); - }, "getItemId"), - getItemKey: /* @__PURE__ */ __name(function getItemKey(processedItem) { - return this.getItemId(processedItem); - }, "getItemKey"), - getItemProp: /* @__PURE__ */ __name(function getItemProp(processedItem, name, params) { - return processedItem && processedItem.item ? resolve(processedItem.item[name], params) : void 0; - }, "getItemProp"), - getItemLabel: /* @__PURE__ */ __name(function getItemLabel(processedItem) { - return this.getItemProp(processedItem, "label"); - }, "getItemLabel"), - getItemLabelId: /* @__PURE__ */ __name(function getItemLabelId(processedItem) { - return "".concat(this.menuId, "_").concat(processedItem.key, "_label"); - }, "getItemLabelId"), - getPTOptions: /* @__PURE__ */ __name(function getPTOptions4(processedItem, index, key) { - return this.ptm(key, { - context: { - item: processedItem.item, - index, - active: this.isItemActive(processedItem), - focused: this.isItemFocused(processedItem), - disabled: this.isItemDisabled(processedItem) - } - }); - }, "getPTOptions"), - isItemActive: /* @__PURE__ */ __name(function isItemActive(processedItem) { - return this.activeItemPath.some(function(path) { - return path.key === processedItem.key; - }); - }, "isItemActive"), - isItemVisible: /* @__PURE__ */ __name(function isItemVisible(processedItem) { - return this.getItemProp(processedItem, "visible") !== false; - }, "isItemVisible"), - isItemDisabled: /* @__PURE__ */ __name(function isItemDisabled(processedItem) { - return this.getItemProp(processedItem, "disabled"); - }, "isItemDisabled"), - isItemFocused: /* @__PURE__ */ __name(function isItemFocused(processedItem) { - return this.focusedItemId === this.getItemId(processedItem); - }, "isItemFocused"), - isItemGroup: /* @__PURE__ */ __name(function isItemGroup(processedItem) { - return isNotEmpty(processedItem.items); - }, "isItemGroup"), - onEnter: /* @__PURE__ */ __name(function onEnter2() { - nestedPosition(this.container, this.level); - }, "onEnter"), - onItemClick: /* @__PURE__ */ __name(function onItemClick(event, processedItem) { - this.getItemProp(processedItem, "command", { - originalEvent: event, - item: processedItem.item - }); - this.$emit("item-click", { - originalEvent: event, - processedItem, - isFocus: true - }); - }, "onItemClick"), - onItemMouseEnter: /* @__PURE__ */ __name(function onItemMouseEnter(event, processedItem) { - this.$emit("item-mouseenter", { - originalEvent: event, - processedItem - }); - }, "onItemMouseEnter"), - onItemMouseMove: /* @__PURE__ */ __name(function onItemMouseMove(event, processedItem) { - this.$emit("item-mousemove", { - originalEvent: event, - processedItem - }); - }, "onItemMouseMove"), - getAriaSetSize: /* @__PURE__ */ __name(function getAriaSetSize() { - var _this = this; - return this.items.filter(function(processedItem) { - return _this.isItemVisible(processedItem) && !_this.getItemProp(processedItem, "separator"); - }).length; - }, "getAriaSetSize"), - getAriaPosInset: /* @__PURE__ */ __name(function getAriaPosInset2(index) { - var _this2 = this; - return index - this.items.slice(0, index).filter(function(processedItem) { - return _this2.isItemVisible(processedItem) && _this2.getItemProp(processedItem, "separator"); - }).length + 1; - }, "getAriaPosInset"), - getMenuItemProps: /* @__PURE__ */ __name(function getMenuItemProps(processedItem, index) { - return { - action: mergeProps({ - "class": this.cx("itemLink"), - tabindex: -1, - "aria-hidden": true - }, this.getPTOptions(processedItem, index, "itemLink")), - icon: mergeProps({ - "class": [this.cx("itemIcon"), this.getItemProp(processedItem, "icon")] - }, this.getPTOptions(processedItem, index, "itemIcon")), - label: mergeProps({ - "class": this.cx("itemLabel") - }, this.getPTOptions(processedItem, index, "itemLabel")), - submenuicon: mergeProps({ - "class": this.cx("submenuIcon") - }, this.getPTOptions(processedItem, index, "submenuIcon")) - }; - }, "getMenuItemProps"), - containerRef: /* @__PURE__ */ __name(function containerRef(el) { - this.container = el; - }, "containerRef") + { + id: "Comfy.Pointer.ClickBufferTime", + category: ["LiteGraph", "Pointer", "ClickBufferTime"], + name: "Pointer click drift delay", + tooltip: "After pressing a pointer button down, this is the maximum time (in milliseconds) that pointer movement can be ignored for.\n\nHelps prevent objects from being unintentionally nudged if the pointer is moved whilst clicking.", + experimental: true, + type: "slider", + attrs: { + min: 0, + max: 1e3, + step: 25 + }, + defaultValue: 150, + versionAdded: "1.4.3" }, - components: { - AngleRightIcon: script$w + { + id: "Comfy.Pointer.DoubleClickTime", + category: ["LiteGraph", "Pointer", "DoubleClickTime"], + name: "Double click interval (maximum)", + tooltip: "The maximum time in milliseconds between the two clicks of a double-click. Increasing this value may assist if double-clicks are sometimes not registered.", + type: "slider", + attrs: { + min: 100, + max: 1e3, + step: 50 + }, + defaultValue: 300, + versionAdded: "1.4.3" }, - directives: { - ripple: Ripple - } -}; -var _hoisted_1$1$2 = ["tabindex"]; -var _hoisted_2$6 = ["id", "aria-label", "aria-disabled", "aria-expanded", "aria-haspopup", "aria-level", "aria-setsize", "aria-posinset", "data-p-active", "data-p-focused", "data-p-disabled"]; -var _hoisted_3$5 = ["onClick", "onMouseenter", "onMousemove"]; -var _hoisted_4$1 = ["href", "target"]; -var _hoisted_5$1 = ["id"]; -var _hoisted_6 = ["id"]; -function render$1$1(_ctx, _cache, $props, $setup, $data, $options) { - var _component_AngleRightIcon = resolveComponent("AngleRightIcon"); - var _component_TieredMenuSub = resolveComponent("TieredMenuSub", true); - var _directive_ripple = resolveDirective("ripple"); - return openBlock(), createBlock(Transition, mergeProps({ - name: "p-tieredmenu", - onEnter: $options.onEnter - }, _ctx.ptm("menu.transition")), { - "default": withCtx(function() { - return [($props.level === 0 ? true : $props.visible) ? (openBlock(), createElementBlock("ul", mergeProps({ - key: 0, - ref: $options.containerRef, - "class": $props.level === 0 ? _ctx.cx("rootList") : _ctx.cx("submenu"), - tabindex: $props.tabindex - }, $props.level === 0 ? _ctx.ptm("rootList") : _ctx.ptm("submenu")), [(openBlock(true), createElementBlock(Fragment, null, renderList($props.items, function(processedItem, index) { - return openBlock(), createElementBlock(Fragment, { - key: $options.getItemKey(processedItem) - }, [$options.isItemVisible(processedItem) && !$options.getItemProp(processedItem, "separator") ? (openBlock(), createElementBlock("li", mergeProps({ - key: 0, - id: $options.getItemId(processedItem), - style: $options.getItemProp(processedItem, "style"), - "class": [_ctx.cx("item", { - processedItem - }), $options.getItemProp(processedItem, "class")], - role: "menuitem", - "aria-label": $options.getItemLabel(processedItem), - "aria-disabled": $options.isItemDisabled(processedItem) || void 0, - "aria-expanded": $options.isItemGroup(processedItem) ? $options.isItemActive(processedItem) : void 0, - "aria-haspopup": $options.isItemGroup(processedItem) && !$options.getItemProp(processedItem, "to") ? "menu" : void 0, - "aria-level": $props.level + 1, - "aria-setsize": $options.getAriaSetSize(), - "aria-posinset": $options.getAriaPosInset(index), - ref_for: true - }, $options.getPTOptions(processedItem, index, "item"), { - "data-p-active": $options.isItemActive(processedItem), - "data-p-focused": $options.isItemFocused(processedItem), - "data-p-disabled": $options.isItemDisabled(processedItem) - }), [createBaseVNode("div", mergeProps({ - "class": _ctx.cx("itemContent"), - onClick: /* @__PURE__ */ __name(function onClick2($event) { - return $options.onItemClick($event, processedItem); - }, "onClick"), - onMouseenter: /* @__PURE__ */ __name(function onMouseenter($event) { - return $options.onItemMouseEnter($event, processedItem); - }, "onMouseenter"), - onMousemove: /* @__PURE__ */ __name(function onMousemove($event) { - return $options.onItemMouseMove($event, processedItem); - }, "onMousemove"), - ref_for: true - }, $options.getPTOptions(processedItem, index, "itemContent")), [!$props.templates.item ? withDirectives((openBlock(), createElementBlock("a", mergeProps({ - key: 0, - href: $options.getItemProp(processedItem, "url"), - "class": _ctx.cx("itemLink"), - target: $options.getItemProp(processedItem, "target"), - tabindex: "-1", - ref_for: true - }, $options.getPTOptions(processedItem, index, "itemLink")), [$props.templates.itemicon ? (openBlock(), createBlock(resolveDynamicComponent($props.templates.itemicon), { - key: 0, - item: processedItem.item, - "class": normalizeClass(_ctx.cx("itemIcon")) - }, null, 8, ["item", "class"])) : $options.getItemProp(processedItem, "icon") ? (openBlock(), createElementBlock("span", mergeProps({ - key: 1, - "class": [_ctx.cx("itemIcon"), $options.getItemProp(processedItem, "icon")], - ref_for: true - }, $options.getPTOptions(processedItem, index, "itemIcon")), null, 16)) : createCommentVNode("", true), createBaseVNode("span", mergeProps({ - id: $options.getItemLabelId(processedItem), - "class": _ctx.cx("itemLabel"), - ref_for: true - }, $options.getPTOptions(processedItem, index, "itemLabel")), toDisplayString($options.getItemLabel(processedItem)), 17, _hoisted_5$1), $options.getItemProp(processedItem, "items") ? (openBlock(), createElementBlock(Fragment, { - key: 2 - }, [$props.templates.submenuicon ? (openBlock(), createBlock(resolveDynamicComponent($props.templates.submenuicon), mergeProps({ - key: 0, - "class": _ctx.cx("submenuIcon"), - active: $options.isItemActive(processedItem), - ref_for: true - }, $options.getPTOptions(processedItem, index, "submenuIcon")), null, 16, ["class", "active"])) : (openBlock(), createBlock(_component_AngleRightIcon, mergeProps({ - key: 1, - "class": _ctx.cx("submenuIcon"), - ref_for: true - }, $options.getPTOptions(processedItem, index, "submenuIcon")), null, 16, ["class"]))], 64)) : createCommentVNode("", true)], 16, _hoisted_4$1)), [[_directive_ripple]]) : (openBlock(), createBlock(resolveDynamicComponent($props.templates.item), { - key: 1, - item: processedItem.item, - hasSubmenu: $options.getItemProp(processedItem, "items"), - label: $options.getItemLabel(processedItem), - props: $options.getMenuItemProps(processedItem, index) - }, null, 8, ["item", "hasSubmenu", "label", "props"]))], 16, _hoisted_3$5), $options.isItemVisible(processedItem) && $options.isItemGroup(processedItem) ? (openBlock(), createBlock(_component_TieredMenuSub, { - key: 0, - id: $options.getItemId(processedItem) + "_list", - style: normalizeStyle(_ctx.sx("submenu", true, { - processedItem - })), - "aria-labelledby": $options.getItemLabelId(processedItem), - role: "menu", - menuId: $props.menuId, - focusedItemId: $props.focusedItemId, - items: processedItem.items, - templates: $props.templates, - activeItemPath: $props.activeItemPath, - level: $props.level + 1, - visible: $options.isItemActive(processedItem) && $options.isItemGroup(processedItem), - pt: _ctx.pt, - unstyled: _ctx.unstyled, - onItemClick: _cache[0] || (_cache[0] = function($event) { - return _ctx.$emit("item-click", $event); - }), - onItemMouseenter: _cache[1] || (_cache[1] = function($event) { - return _ctx.$emit("item-mouseenter", $event); - }), - onItemMousemove: _cache[2] || (_cache[2] = function($event) { - return _ctx.$emit("item-mousemove", $event); - }) - }, null, 8, ["id", "style", "aria-labelledby", "menuId", "focusedItemId", "items", "templates", "activeItemPath", "level", "visible", "pt", "unstyled"])) : createCommentVNode("", true)], 16, _hoisted_2$6)) : createCommentVNode("", true), $options.isItemVisible(processedItem) && $options.getItemProp(processedItem, "separator") ? (openBlock(), createElementBlock("li", mergeProps({ - key: 1, - id: $options.getItemId(processedItem), - style: $options.getItemProp(processedItem, "style"), - "class": [_ctx.cx("separator"), $options.getItemProp(processedItem, "class")], - role: "separator", - ref_for: true - }, _ctx.ptm("separator")), null, 16, _hoisted_6)) : createCommentVNode("", true)], 64); - }), 128))], 16, _hoisted_1$1$2)) : createCommentVNode("", true)]; - }), - _: 1 - }, 16, ["onEnter"]); -} -__name(render$1$1, "render$1$1"); -script$1$2.render = render$1$1; -var script$4 = { - name: "TieredMenu", - "extends": script$2$1, - inheritAttrs: false, - emits: ["focus", "blur", "before-show", "before-hide", "hide", "show"], - outsideClickListener: null, - scrollHandler: null, - resizeListener: null, - target: null, - container: null, - menubar: null, - searchTimeout: null, - searchValue: null, - data: /* @__PURE__ */ __name(function data6() { - return { - id: this.$attrs.id, - focused: false, - focusedItemInfo: { - index: -1, - level: 0, - parentKey: "" - }, - activeItemPath: [], - visible: !this.popup, - submenuVisible: false, - dirty: false - }; - }, "data"), - watch: { - "$attrs.id": /* @__PURE__ */ __name(function $attrsId2(newValue) { - this.id = newValue || UniqueComponentId(); - }, "$attrsId"), - activeItemPath: /* @__PURE__ */ __name(function activeItemPath(newPath) { - if (!this.popup) { - if (isNotEmpty(newPath)) { - this.bindOutsideClickListener(); - this.bindResizeListener(); - } else { - this.unbindOutsideClickListener(); - this.unbindResizeListener(); - } - } - }, "activeItemPath") + { + id: "Comfy.SnapToGrid.GridSize", + category: ["LiteGraph", "Canvas", "GridSize"], + name: "Snap to grid size", + type: "slider", + attrs: { + min: 1, + max: 500 + }, + tooltip: "When dragging and resizing nodes while holding shift they will be aligned to the grid, this controls the size of that grid.", + defaultValue: LiteGraph.CANVAS_GRID_SIZE + }, + // Keep the 'pysssss.SnapToGrid' setting id so we don't need to migrate setting values. + // Using a new setting id can cause existing users to lose their existing settings. + { + id: "pysssss.SnapToGrid", + category: ["LiteGraph", "Canvas", "AlwaysSnapToGrid"], + name: "Always snap to grid", + type: "boolean", + defaultValue: false, + versionAdded: "1.3.13" + }, + { + id: "Comfy.Server.ServerConfigValues", + name: "Server config values for frontend display", + tooltip: "Server config values used for frontend display only", + type: "hidden", + // Mapping from server config id to value. + defaultValue: {}, + versionAdded: "1.4.8" + }, + { + id: "Comfy.Server.LaunchArgs", + name: "Server launch arguments", + tooltip: "These are the actual arguments that are passed to the server when it is launched.", + type: "hidden", + defaultValue: {}, + versionAdded: "1.4.8" + }, + { + id: "Comfy.Queue.MaxHistoryItems", + name: "Queue history size", + tooltip: "The maximum number of tasks that show in the queue history.", + type: "slider", + attrs: { + min: 16, + max: 256, + step: 16 + }, + defaultValue: 64, + versionAdded: "1.4.12" + }, + { + id: "LiteGraph.Canvas.MaximumFps", + name: "Maxium FPS", + tooltip: "The maximum frames per second that the canvas is allowed to render. Caps GPU usage at the cost of smoothness. If 0, the screen refresh rate is used. Default: 0", + type: "slider", + attrs: { + min: 0, + max: 120 + }, + defaultValue: 0, + versionAdded: "1.5.1" }, - mounted: /* @__PURE__ */ __name(function mounted6() { - this.id = this.id || UniqueComponentId(); - }, "mounted"), - beforeUnmount: /* @__PURE__ */ __name(function beforeUnmount6() { - this.unbindOutsideClickListener(); - this.unbindResizeListener(); - if (this.scrollHandler) { - this.scrollHandler.destroy(); - this.scrollHandler = null; - } - if (this.container && this.autoZIndex) { - ZIndex.clear(this.container); - } - this.target = null; - this.container = null; - }, "beforeUnmount"), - methods: { - getItemProp: /* @__PURE__ */ __name(function getItemProp2(item3, name) { - return item3 ? resolve(item3[name]) : void 0; - }, "getItemProp"), - getItemLabel: /* @__PURE__ */ __name(function getItemLabel2(item3) { - return this.getItemProp(item3, "label"); - }, "getItemLabel"), - isItemDisabled: /* @__PURE__ */ __name(function isItemDisabled2(item3) { - return this.getItemProp(item3, "disabled"); - }, "isItemDisabled"), - isItemVisible: /* @__PURE__ */ __name(function isItemVisible2(item3) { - return this.getItemProp(item3, "visible") !== false; - }, "isItemVisible"), - isItemGroup: /* @__PURE__ */ __name(function isItemGroup2(item3) { - return isNotEmpty(this.getItemProp(item3, "items")); - }, "isItemGroup"), - isItemSeparator: /* @__PURE__ */ __name(function isItemSeparator(item3) { - return this.getItemProp(item3, "separator"); - }, "isItemSeparator"), - getProccessedItemLabel: /* @__PURE__ */ __name(function getProccessedItemLabel(processedItem) { - return processedItem ? this.getItemLabel(processedItem.item) : void 0; - }, "getProccessedItemLabel"), - isProccessedItemGroup: /* @__PURE__ */ __name(function isProccessedItemGroup(processedItem) { - return processedItem && isNotEmpty(processedItem.items); - }, "isProccessedItemGroup"), - toggle: /* @__PURE__ */ __name(function toggle(event) { - this.visible ? this.hide(event, true) : this.show(event); - }, "toggle"), - show: /* @__PURE__ */ __name(function show2(event, isFocus) { - if (this.popup) { - this.$emit("before-show"); - this.visible = true; - this.target = this.target || event.currentTarget; - this.relatedTarget = event.relatedTarget || null; - } - isFocus && focus(this.menubar); - }, "show"), - hide: /* @__PURE__ */ __name(function hide2(event, isFocus) { - if (this.popup) { - this.$emit("before-hide"); - this.visible = false; - } - this.activeItemPath = []; - this.focusedItemInfo = { - index: -1, - level: 0, - parentKey: "" - }; - isFocus && focus(this.relatedTarget || this.target || this.menubar); - this.dirty = false; - }, "hide"), - onFocus: /* @__PURE__ */ __name(function onFocus3(event) { - this.focused = true; - if (!this.popup) { - this.focusedItemInfo = this.focusedItemInfo.index !== -1 ? this.focusedItemInfo : { - index: this.findFirstFocusedItemIndex(), - level: 0, - parentKey: "" - }; - } - this.$emit("focus", event); - }, "onFocus"), - onBlur: /* @__PURE__ */ __name(function onBlur2(event) { - this.focused = false; - this.focusedItemInfo = { - index: -1, - level: 0, - parentKey: "" - }; - this.searchValue = ""; - this.dirty = false; - this.$emit("blur", event); - }, "onBlur"), - onKeyDown: /* @__PURE__ */ __name(function onKeyDown2(event) { - if (this.disabled) { - event.preventDefault(); - return; - } - var metaKey = event.metaKey || event.ctrlKey; - switch (event.code) { - case "ArrowDown": - this.onArrowDownKey(event); - break; - case "ArrowUp": - this.onArrowUpKey(event); - break; - case "ArrowLeft": - this.onArrowLeftKey(event); - break; - case "ArrowRight": - this.onArrowRightKey(event); - break; - case "Home": - this.onHomeKey(event); - break; - case "End": - this.onEndKey(event); - break; - case "Space": - this.onSpaceKey(event); - break; - case "Enter": - case "NumpadEnter": - this.onEnterKey(event); - break; - case "Escape": - this.onEscapeKey(event); - break; - case "Tab": - this.onTabKey(event); - break; - case "PageDown": - case "PageUp": - case "Backspace": - case "ShiftLeft": - case "ShiftRight": - break; - default: - if (!metaKey && isPrintableCharacter(event.key)) { - this.searchItems(event, event.key); - } - break; + { + id: "Comfy.EnableWorkflowViewRestore", + category: ["Comfy", "Workflow", "EnableWorkflowViewRestore"], + name: "Save and restore canvas position and zoom level in workflows", + type: "boolean", + defaultValue: true, + versionModified: "1.5.4" + }, + { + id: "Comfy.Workflow.ConfirmDelete", + name: "Show confirmation when deleting workflows", + type: "boolean", + defaultValue: true, + versionAdded: "1.5.6" + }, + { + id: "Comfy.ColorPalette", + name: "The active color palette id", + type: "hidden", + defaultValue: "dark", + versionModified: "1.6.7" + }, + { + id: "Comfy.CustomColorPalettes", + name: "Custom color palettes", + type: "hidden", + defaultValue: {}, + versionModified: "1.6.7" + }, + { + id: "Comfy.WidgetControlMode", + category: ["Comfy", "Node Widget", "WidgetControlMode"], + name: "Widget control mode", + tooltip: "Controls when widget values are updated (randomize/increment/decrement), either before the prompt is queued or after.", + type: "combo", + defaultValue: "after", + options: ["before", "after"], + versionModified: "1.6.10" + } +]; +const _sfc_main$d = /* @__PURE__ */ defineComponent({ + __name: "GraphCanvas", + emits: ["ready"], + setup(__props, { emit: __emit }) { + const emit = __emit; + const canvasRef = ref(null); + const settingStore = useSettingStore(); + const nodeDefStore = useNodeDefStore(); + const workspaceStore = useWorkspaceStore(); + const canvasStore = useCanvasStore(); + const modelToNodeStore = useModelToNodeStore(); + const betaMenuEnabled = computed( + () => settingStore.get("Comfy.UseNewMenu") !== "Disabled" + ); + const canvasMenuEnabled = computed( + () => settingStore.get("Comfy.Graph.CanvasMenu") + ); + const tooltipEnabled = computed(() => settingStore.get("Comfy.EnableTooltips")); + watchEffect(() => { + const canvasInfoEnabled = settingStore.get("Comfy.Graph.CanvasInfo"); + if (canvasStore.canvas) { + canvasStore.canvas.show_info = canvasInfoEnabled; } - }, "onKeyDown"), - onItemChange: /* @__PURE__ */ __name(function onItemChange(event) { - var processedItem = event.processedItem, isFocus = event.isFocus; - if (isEmpty(processedItem)) return; - var index = processedItem.index, key = processedItem.key, level = processedItem.level, parentKey = processedItem.parentKey, items = processedItem.items; - var grouped = isNotEmpty(items); - var activeItemPath3 = this.activeItemPath.filter(function(p) { - return p.parentKey !== parentKey && p.parentKey !== key; - }); - if (grouped) { - activeItemPath3.push(processedItem); - this.submenuVisible = true; + }); + watchEffect(() => { + const zoomSpeed = settingStore.get("Comfy.Graph.ZoomSpeed"); + if (canvasStore.canvas) { + canvasStore.canvas.zoom_speed = zoomSpeed; } - this.focusedItemInfo = { - index, - level, - parentKey - }; - this.activeItemPath = activeItemPath3; - grouped && (this.dirty = true); - isFocus && focus(this.menubar); - }, "onItemChange"), - onOverlayClick: /* @__PURE__ */ __name(function onOverlayClick2(event) { - OverlayEventBus.emit("overlay-click", { - originalEvent: event, - target: this.target + }); + watchEffect(() => { + LiteGraph.snaps_for_comfy = settingStore.get("Comfy.Node.AutoSnapLinkToSlot"); + }); + watchEffect(() => { + LiteGraph.snap_highlights_node = settingStore.get( + "Comfy.Node.SnapHighlightsNode" + ); + }); + watchEffect(() => { + LGraphNode.keepAllLinksOnBypass = settingStore.get( + "Comfy.Node.BypassAllLinksOnDelete" + ); + }); + watchEffect(() => { + LiteGraph.middle_click_slot_add_default_node = settingStore.get( + "Comfy.Node.MiddleClickRerouteNode" + ); + }); + watchEffect(() => { + nodeDefStore.showDeprecated = settingStore.get("Comfy.Node.ShowDeprecated"); + }); + watchEffect(() => { + nodeDefStore.showExperimental = settingStore.get( + "Comfy.Node.ShowExperimental" + ); + }); + watchEffect(() => { + const spellcheckEnabled = settingStore.get("Comfy.TextareaWidget.Spellcheck"); + const textareas = document.querySelectorAll("textarea.comfy-multiline-input"); + textareas.forEach((textarea) => { + textarea.spellcheck = spellcheckEnabled; + textarea.focus(); + textarea.blur(); }); - }, "onOverlayClick"), - onItemClick: /* @__PURE__ */ __name(function onItemClick2(event) { - var originalEvent = event.originalEvent, processedItem = event.processedItem; - var grouped = this.isProccessedItemGroup(processedItem); - var root11 = isEmpty(processedItem.parent); - var selected = this.isSelected(processedItem); - if (selected) { - var index = processedItem.index, key = processedItem.key, level = processedItem.level, parentKey = processedItem.parentKey; - this.activeItemPath = this.activeItemPath.filter(function(p) { - return key !== p.key && key.startsWith(p.key); - }); - this.focusedItemInfo = { - index, - level, - parentKey - }; - this.dirty = !root11; - focus(this.menubar); - } else { - if (grouped) { - this.onItemChange(event); - } else { - var rootProcessedItem = root11 ? processedItem : this.activeItemPath.find(function(p) { - return p.parentKey === ""; - }); - this.hide(originalEvent); - this.changeFocusedItemIndex(originalEvent, rootProcessedItem ? rootProcessedItem.index : -1); - focus(this.menubar); - } + }); + watchEffect(() => { + const linkRenderMode = settingStore.get("Comfy.LinkRenderMode"); + if (canvasStore.canvas) { + canvasStore.canvas.links_render_mode = linkRenderMode; + canvasStore.canvas.setDirty( + /* fg */ + false, + /* bg */ + true + ); } - }, "onItemClick"), - onItemMouseEnter: /* @__PURE__ */ __name(function onItemMouseEnter2(event) { - if (this.dirty) { - this.onItemChange(event); + }); + watchEffect(() => { + const linkMarkerShape = settingStore.get("Comfy.Graph.LinkMarkers"); + const { canvas } = canvasStore; + if (canvas) { + canvas.linkMarkerShape = linkMarkerShape; + canvas.setDirty(false, true); } - }, "onItemMouseEnter"), - onItemMouseMove: /* @__PURE__ */ __name(function onItemMouseMove2(event) { - if (this.focused) { - this.changeFocusedItemIndex(event, event.processedItem.index); + }); + watchEffect(() => { + const reroutesEnabled = settingStore.get("Comfy.RerouteBeta"); + const { canvas } = canvasStore; + if (canvas) { + canvas.reroutesEnabled = reroutesEnabled; + canvas.setDirty(false, true); } - }, "onItemMouseMove"), - onArrowDownKey: /* @__PURE__ */ __name(function onArrowDownKey2(event) { - var itemIndex = this.focusedItemInfo.index !== -1 ? this.findNextItemIndex(this.focusedItemInfo.index) : this.findFirstFocusedItemIndex(); - this.changeFocusedItemIndex(event, itemIndex); - event.preventDefault(); - }, "onArrowDownKey"), - onArrowUpKey: /* @__PURE__ */ __name(function onArrowUpKey2(event) { - if (event.altKey) { - if (this.focusedItemInfo.index !== -1) { - var processedItem = this.visibleItems[this.focusedItemInfo.index]; - var grouped = this.isProccessedItemGroup(processedItem); - !grouped && this.onItemChange({ - originalEvent: event, - processedItem - }); + }); + watchEffect(() => { + const maximumFps = settingStore.get("LiteGraph.Canvas.MaximumFps"); + const { canvas } = canvasStore; + if (canvas) canvas.maximumFps = maximumFps; + }); + watchEffect(() => { + CanvasPointer.doubleClickTime = settingStore.get( + "Comfy.Pointer.DoubleClickTime" + ); + }); + watchEffect(() => { + CanvasPointer.bufferTime = settingStore.get("Comfy.Pointer.ClickBufferTime"); + }); + watchEffect(() => { + CanvasPointer.maxClickDrift = settingStore.get("Comfy.Pointer.ClickDrift"); + }); + watchEffect(() => { + LiteGraph.CANVAS_GRID_SIZE = settingStore.get("Comfy.SnapToGrid.GridSize"); + }); + watchEffect(() => { + LiteGraph.alwaysSnapToGrid = settingStore.get("pysssss.SnapToGrid"); + }); + watch( + () => settingStore.get("Comfy.WidgetControlMode"), + () => { + if (!canvasStore.canvas) return; + for (const n of app.graph.nodes) { + if (!n.widgets) continue; + for (const w of n.widgets) { + if (w[IS_CONTROL_WIDGET]) { + updateControlWidgetLabel(w); + if (w.linkedWidgets) { + for (const l of w.linkedWidgets) { + updateControlWidgetLabel(l); + } + } + } + } } - this.popup && this.hide(event, true); - event.preventDefault(); - } else { - var itemIndex = this.focusedItemInfo.index !== -1 ? this.findPrevItemIndex(this.focusedItemInfo.index) : this.findLastFocusedItemIndex(); - this.changeFocusedItemIndex(event, itemIndex); - event.preventDefault(); + app.graph.setDirtyCanvas(true); } - }, "onArrowUpKey"), - onArrowLeftKey: /* @__PURE__ */ __name(function onArrowLeftKey3(event) { - var _this = this; - var processedItem = this.visibleItems[this.focusedItemInfo.index]; - var parentItem = this.activeItemPath.find(function(p) { - return p.key === processedItem.parentKey; - }); - var root11 = isEmpty(processedItem.parent); - if (!root11) { - this.focusedItemInfo = { - index: -1, - parentKey: parentItem ? parentItem.parentKey : "" - }; - this.searchValue = ""; - this.onArrowDownKey(event); + ); + watchEffect(() => { + if (!canvasStore.canvas) return; + if (canvasStore.canvas.state.draggingCanvas) { + canvasStore.canvas.canvas.style.cursor = "grabbing"; + return; } - this.activeItemPath = this.activeItemPath.filter(function(p) { - return p.parentKey !== _this.focusedItemInfo.parentKey; - }); - event.preventDefault(); - }, "onArrowLeftKey"), - onArrowRightKey: /* @__PURE__ */ __name(function onArrowRightKey3(event) { - var processedItem = this.visibleItems[this.focusedItemInfo.index]; - var grouped = this.isProccessedItemGroup(processedItem); - if (grouped) { - this.onItemChange({ - originalEvent: event, - processedItem - }); - this.focusedItemInfo = { - index: -1, - parentKey: processedItem.key - }; - this.searchValue = ""; - this.onArrowDownKey(event); + if (canvasStore.canvas.state.readOnly) { + canvasStore.canvas.canvas.style.cursor = "grab"; + return; } - event.preventDefault(); - }, "onArrowRightKey"), - onHomeKey: /* @__PURE__ */ __name(function onHomeKey3(event) { - this.changeFocusedItemIndex(event, this.findFirstItemIndex()); - event.preventDefault(); - }, "onHomeKey"), - onEndKey: /* @__PURE__ */ __name(function onEndKey3(event) { - this.changeFocusedItemIndex(event, this.findLastItemIndex()); - event.preventDefault(); - }, "onEndKey"), - onEnterKey: /* @__PURE__ */ __name(function onEnterKey3(event) { - if (this.focusedItemInfo.index !== -1) { - var element = findSingle(this.menubar, 'li[id="'.concat("".concat(this.focusedItemId), '"]')); - var anchorElement = element && findSingle(element, '[data-pc-section="itemlink"]'); - anchorElement ? anchorElement.click() : element && element.click(); - if (!this.popup) { - var processedItem = this.visibleItems[this.focusedItemInfo.index]; - var grouped = this.isProccessedItemGroup(processedItem); - !grouped && (this.focusedItemInfo.index = this.findFirstFocusedItemIndex()); + canvasStore.canvas.canvas.style.cursor = "default"; + }); + const colorPaletteService = useColorPaletteService(); + watchEffect(() => { + if (!canvasStore.canvas) return; + colorPaletteService.loadColorPalette(settingStore.get("Comfy.ColorPalette")); + }); + const workflowStore = useWorkflowStore(); + const persistCurrentWorkflow = /* @__PURE__ */ __name(() => { + const workflow = JSON.stringify(app.serializeGraph()); + localStorage.setItem("workflow", workflow); + if (api.clientId) { + sessionStorage.setItem(`workflow:${api.clientId}`, workflow); + } + }, "persistCurrentWorkflow"); + watchEffect(() => { + if (workflowStore.activeWorkflow) { + const workflow = workflowStore.activeWorkflow; + setStorageValue("Comfy.PreviousWorkflow", workflow.key); + persistCurrentWorkflow(); + } + }); + api.addEventListener("graphChanged", persistCurrentWorkflow); + usePragmaticDroppable(() => canvasRef.value, { + onDrop: /* @__PURE__ */ __name((event) => { + const loc = event.location.current.input; + const dndData = event.source.data; + if (dndData.type === "tree-explorer-node") { + const node = dndData.data; + if (node.data instanceof ComfyNodeDefImpl) { + const nodeDef = node.data; + const pos = app.clientPosToCanvasPos([ + loc.clientX - 20, + loc.clientY + ]); + app.addNodeOnGraph(nodeDef, { pos }); + } else if (node.data instanceof ComfyModelDef) { + const model = node.data; + const pos = app.clientPosToCanvasPos([loc.clientX, loc.clientY]); + const nodeAtPos = app.graph.getNodeOnPos(pos[0], pos[1]); + let targetProvider = null; + let targetGraphNode = null; + if (nodeAtPos) { + const providers = modelToNodeStore.getAllNodeProviders( + model.directory + ); + for (const provider of providers) { + if (provider.nodeDef.name === nodeAtPos.comfyClass) { + targetGraphNode = nodeAtPos; + targetProvider = provider; + } + } + } + if (!targetGraphNode) { + const provider = modelToNodeStore.getNodeProvider(model.directory); + if (provider) { + targetGraphNode = app.addNodeOnGraph(provider.nodeDef, { + pos + }); + targetProvider = provider; + } + } + if (targetGraphNode) { + const widget = targetGraphNode.widgets.find( + (widget2) => widget2.name === targetProvider.key + ); + if (widget) { + widget.value = model.file_name; + } + } + } + } + }, "onDrop") + }); + const comfyAppReady = ref(false); + onMounted(async () => { + window["LiteGraph"] = LiteGraph; + window["LGraph"] = LGraph; + window["LLink"] = LLink; + window["LGraphNode"] = LGraphNode; + window["LGraphGroup"] = LGraphGroup; + window["DragAndScale"] = DragAndScale; + window["LGraphCanvas"] = LGraphCanvas; + window["ContextMenu"] = ContextMenu; + window["LGraphBadge"] = LGraphBadge; + app.vueAppReady = true; + workspaceStore.spinner = true; + ChangeTracker.init(app); + await settingStore.loadSettingValues(); + CORE_SETTINGS.forEach((setting) => { + settingStore.addSetting(setting); + }); + await app.setup(canvasRef.value); + canvasStore.canvas = app.canvas; + canvasStore.canvas.render_canvas_border = false; + workspaceStore.spinner = false; + window["app"] = app; + window["graph"] = app.graph; + comfyAppReady.value = true; + const colorPaletteStore = useColorPaletteStore(); + colorPaletteStore.customPalettes = settingStore.get( + "Comfy.CustomColorPalettes" + ); + watch( + () => settingStore.get("Comfy.Locale"), + async () => { + await useCommandStore().execute("Comfy.RefreshNodeDefinitions"); + useWorkflowService().reloadCurrentWorkflow(); } + ); + emit("ready"); + }); + return (_ctx, _cache) => { + return openBlock(), createElementBlock(Fragment, null, [ + (openBlock(), createBlock(Teleport, { to: ".graph-canvas-container" }, [ + comfyAppReady.value && betaMenuEnabled.value && !unref(workspaceStore).focusMode ? (openBlock(), createBlock(LiteGraphCanvasSplitterOverlay, { key: 0 }, { + "side-bar-panel": withCtx(() => [ + createVNode(SideToolbar) + ]), + "bottom-panel": withCtx(() => [ + createVNode(_sfc_main$m) + ]), + "graph-canvas-panel": withCtx(() => [ + canvasMenuEnabled.value ? (openBlock(), createBlock(GraphCanvasMenu, { key: 0 })) : createCommentVNode("", true) + ]), + _: 1 + })) : createCommentVNode("", true), + createVNode(TitleEditor), + !betaMenuEnabled.value && canvasMenuEnabled.value ? (openBlock(), createBlock(GraphCanvasMenu, { key: 1 })) : createCommentVNode("", true), + createBaseVNode("canvas", { + ref_key: "canvasRef", + ref: canvasRef, + id: "graph-canvas", + tabindex: "1" + }, null, 512) + ])), + createVNode(_sfc_main$h), + tooltipEnabled.value ? (openBlock(), createBlock(NodeTooltip, { key: 0 })) : createCommentVNode("", true), + createVNode(_sfc_main$f) + ], 64); + }; + } +}); +const _sfc_main$c = /* @__PURE__ */ defineComponent({ + __name: "MenuHamburger", + setup(__props) { + const workspaceState = useWorkspaceStore(); + const settingStore = useSettingStore(); + const exitFocusMode = /* @__PURE__ */ __name(() => { + workspaceState.focusMode = false; + }, "exitFocusMode"); + watchEffect(() => { + if (settingStore.get("Comfy.UseNewMenu") !== "Disabled") { + return; } - event.preventDefault(); - }, "onEnterKey"), - onSpaceKey: /* @__PURE__ */ __name(function onSpaceKey(event) { - this.onEnterKey(event); - }, "onSpaceKey"), - onEscapeKey: /* @__PURE__ */ __name(function onEscapeKey2(event) { - if (this.popup || this.focusedItemInfo.level !== 0) { - var _focusedItemInfo = this.focusedItemInfo; - this.hide(event, false); - this.focusedItemInfo = { - index: Number(_focusedItemInfo.parentKey.split("_")[0]), - level: 0, - parentKey: "" - }; - this.popup && focus(this.target); + if (workspaceState.focusMode) { + app.ui.menuContainer.style.display = "none"; + } else { + app.ui.menuContainer.style.display = "block"; } - event.preventDefault(); - }, "onEscapeKey"), - onTabKey: /* @__PURE__ */ __name(function onTabKey2(event) { - if (this.focusedItemInfo.index !== -1) { - var processedItem = this.visibleItems[this.focusedItemInfo.index]; - var grouped = this.isProccessedItemGroup(processedItem); - !grouped && this.onItemChange({ - originalEvent: event, - processedItem + }); + const menuSetting = computed(() => settingStore.get("Comfy.UseNewMenu")); + const positionCSS = computed( + () => ( + // 'Bottom' menuSetting shows the hamburger button in the bottom right corner + // 'Disabled', 'Top' menuSetting shows the hamburger button in the top right corner + menuSetting.value === "Bottom" ? { bottom: "0px", right: "0px" } : { top: "0px", right: "0px" } + ) + ); + return (_ctx, _cache) => { + const _directive_tooltip = resolveDirective("tooltip"); + return withDirectives((openBlock(), createBlock(unref(script$f), { + class: "comfy-menu-hamburger", + style: normalizeStyle(positionCSS.value), + icon: "pi pi-bars", + severity: "secondary", + text: "", + size: "large", + onClick: exitFocusMode, + onContextmenu: unref(showNativeMenu) + }, null, 8, ["style", "onContextmenu"])), [ + [vShow, unref(workspaceState).focusMode], + [_directive_tooltip, { value: _ctx.$t("menu.showMenu"), showDelay: 300 }] + ]); + }; + } +}); +const MenuHamburger = /* @__PURE__ */ _export_sfc(_sfc_main$c, [["__scopeId", "data-v-962c4073"]]); +function _typeof$3(o) { + "@babel/helpers - typeof"; + return _typeof$3 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o2) { + return typeof o2; + } : function(o2) { + return o2 && "function" == typeof Symbol && o2.constructor === Symbol && o2 !== Symbol.prototype ? "symbol" : typeof o2; + }, _typeof$3(o); +} +__name(_typeof$3, "_typeof$3"); +function _defineProperty$3(e, r, t) { + return (r = _toPropertyKey$3(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e; +} +__name(_defineProperty$3, "_defineProperty$3"); +function _toPropertyKey$3(t) { + var i = _toPrimitive$3(t, "string"); + return "symbol" == _typeof$3(i) ? i : i + ""; +} +__name(_toPropertyKey$3, "_toPropertyKey$3"); +function _toPrimitive$3(t, r) { + if ("object" != _typeof$3(t) || !t) return t; + var e = t[Symbol.toPrimitive]; + if (void 0 !== e) { + var i = e.call(t, r || "default"); + if ("object" != _typeof$3(i)) return i; + throw new TypeError("@@toPrimitive must return a primitive value."); + } + return ("string" === r ? String : Number)(t); +} +__name(_toPrimitive$3, "_toPrimitive$3"); +var theme$4 = /* @__PURE__ */ __name(function theme5(_ref) { + var dt = _ref.dt; + return "\n.p-toast {\n width: ".concat(dt("toast.width"), ";\n white-space: pre-line;\n word-break: break-word;\n}\n\n.p-toast-message {\n margin: 0 0 1rem 0;\n}\n\n.p-toast-message-icon {\n flex-shrink: 0;\n font-size: ").concat(dt("toast.icon.size"), ";\n width: ").concat(dt("toast.icon.size"), ";\n height: ").concat(dt("toast.icon.size"), ";\n}\n\n.p-toast-message-content {\n display: flex;\n align-items: flex-start;\n padding: ").concat(dt("toast.content.padding"), ";\n gap: ").concat(dt("toast.content.gap"), ";\n}\n\n.p-toast-message-text {\n flex: 1 1 auto;\n display: flex;\n flex-direction: column;\n gap: ").concat(dt("toast.text.gap"), ";\n}\n\n.p-toast-summary {\n font-weight: ").concat(dt("toast.summary.font.weight"), ";\n font-size: ").concat(dt("toast.summary.font.size"), ";\n}\n\n.p-toast-detail {\n font-weight: ").concat(dt("toast.detail.font.weight"), ";\n font-size: ").concat(dt("toast.detail.font.size"), ";\n}\n\n.p-toast-close-button {\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n position: relative;\n cursor: pointer;\n background: transparent;\n transition: background ").concat(dt("toast.transition.duration"), ", color ").concat(dt("toast.transition.duration"), ", outline-color ").concat(dt("toast.transition.duration"), ", box-shadow ").concat(dt("toast.transition.duration"), ";\n outline-color: transparent;\n color: inherit;\n width: ").concat(dt("toast.close.button.width"), ";\n height: ").concat(dt("toast.close.button.height"), ";\n border-radius: ").concat(dt("toast.close.button.border.radius"), ";\n margin: -25% 0 0 0;\n right: -25%;\n padding: 0;\n border: none;\n user-select: none;\n}\n\n.p-toast-message-info,\n.p-toast-message-success,\n.p-toast-message-warn,\n.p-toast-message-error,\n.p-toast-message-secondary,\n.p-toast-message-contrast {\n border-width: ").concat(dt("toast.border.width"), ";\n border-style: solid;\n backdrop-filter: blur(").concat(dt("toast.blur"), ");\n border-radius: ").concat(dt("toast.border.radius"), ";\n}\n\n.p-toast-close-icon {\n font-size: ").concat(dt("toast.close.icon.size"), ";\n width: ").concat(dt("toast.close.icon.size"), ";\n height: ").concat(dt("toast.close.icon.size"), ";\n}\n\n.p-toast-close-button:focus-visible {\n outline-width: ").concat(dt("focus.ring.width"), ";\n outline-style: ").concat(dt("focus.ring.style"), ";\n outline-offset: ").concat(dt("focus.ring.offset"), ";\n}\n\n.p-toast-message-info {\n background: ").concat(dt("toast.info.background"), ";\n border-color: ").concat(dt("toast.info.border.color"), ";\n color: ").concat(dt("toast.info.color"), ";\n box-shadow: ").concat(dt("toast.info.shadow"), ";\n}\n\n.p-toast-message-info .p-toast-detail {\n color: ").concat(dt("toast.info.detail.color"), ";\n}\n\n.p-toast-message-info .p-toast-close-button:focus-visible {\n outline-color: ").concat(dt("toast.info.close.button.focus.ring.color"), ";\n box-shadow: ").concat(dt("toast.info.close.button.focus.ring.shadow"), ";\n}\n\n.p-toast-message-info .p-toast-close-button:hover {\n background: ").concat(dt("toast.info.close.button.hover.background"), ";\n}\n\n.p-toast-message-success {\n background: ").concat(dt("toast.success.background"), ";\n border-color: ").concat(dt("toast.success.border.color"), ";\n color: ").concat(dt("toast.success.color"), ";\n box-shadow: ").concat(dt("toast.success.shadow"), ";\n}\n\n.p-toast-message-success .p-toast-detail {\n color: ").concat(dt("toast.success.detail.color"), ";\n}\n\n.p-toast-message-success .p-toast-close-button:focus-visible {\n outline-color: ").concat(dt("toast.success.close.button.focus.ring.color"), ";\n box-shadow: ").concat(dt("toast.success.close.button.focus.ring.shadow"), ";\n}\n\n.p-toast-message-success .p-toast-close-button:hover {\n background: ").concat(dt("toast.success.close.button.hover.background"), ";\n}\n\n.p-toast-message-warn {\n background: ").concat(dt("toast.warn.background"), ";\n border-color: ").concat(dt("toast.warn.border.color"), ";\n color: ").concat(dt("toast.warn.color"), ";\n box-shadow: ").concat(dt("toast.warn.shadow"), ";\n}\n\n.p-toast-message-warn .p-toast-detail {\n color: ").concat(dt("toast.warn.detail.color"), ";\n}\n\n.p-toast-message-warn .p-toast-close-button:focus-visible {\n outline-color: ").concat(dt("toast.warn.close.button.focus.ring.color"), ";\n box-shadow: ").concat(dt("toast.warn.close.button.focus.ring.shadow"), ";\n}\n\n.p-toast-message-warn .p-toast-close-button:hover {\n background: ").concat(dt("toast.warn.close.button.hover.background"), ";\n}\n\n.p-toast-message-error {\n background: ").concat(dt("toast.error.background"), ";\n border-color: ").concat(dt("toast.error.border.color"), ";\n color: ").concat(dt("toast.error.color"), ";\n box-shadow: ").concat(dt("toast.error.shadow"), ";\n}\n\n.p-toast-message-error .p-toast-detail {\n color: ").concat(dt("toast.error.detail.color"), ";\n}\n\n.p-toast-message-error .p-toast-close-button:focus-visible {\n outline-color: ").concat(dt("toast.error.close.button.focus.ring.color"), ";\n box-shadow: ").concat(dt("toast.error.close.button.focus.ring.shadow"), ";\n}\n\n.p-toast-message-error .p-toast-close-button:hover {\n background: ").concat(dt("toast.error.close.button.hover.background"), ";\n}\n\n.p-toast-message-secondary {\n background: ").concat(dt("toast.secondary.background"), ";\n border-color: ").concat(dt("toast.secondary.border.color"), ";\n color: ").concat(dt("toast.secondary.color"), ";\n box-shadow: ").concat(dt("toast.secondary.shadow"), ";\n}\n\n.p-toast-message-secondary .p-toast-detail {\n color: ").concat(dt("toast.secondary.detail.color"), ";\n}\n\n.p-toast-message-secondary .p-toast-close-button:focus-visible {\n outline-color: ").concat(dt("toast.secondary.close.button.focus.ring.color"), ";\n box-shadow: ").concat(dt("toast.secondary.close.button.focus.ring.shadow"), ";\n}\n\n.p-toast-message-secondary .p-toast-close-button:hover {\n background: ").concat(dt("toast.secondary.close.button.hover.background"), ";\n}\n\n.p-toast-message-contrast {\n background: ").concat(dt("toast.contrast.background"), ";\n border-color: ").concat(dt("toast.contrast.border.color"), ";\n color: ").concat(dt("toast.contrast.color"), ";\n box-shadow: ").concat(dt("toast.contrast.shadow"), ";\n}\n\n.p-toast-message-contrast .p-toast-detail {\n color: ").concat(dt("toast.contrast.detail.color"), ";\n}\n\n.p-toast-message-contrast .p-toast-close-button:focus-visible {\n outline-color: ").concat(dt("toast.contrast.close.button.focus.ring.color"), ";\n box-shadow: ").concat(dt("toast.contrast.close.button.focus.ring.shadow"), ";\n}\n\n.p-toast-message-contrast .p-toast-close-button:hover {\n background: ").concat(dt("toast.contrast.close.button.hover.background"), ";\n}\n\n.p-toast-top-center {\n transform: translateX(-50%);\n}\n\n.p-toast-bottom-center {\n transform: translateX(-50%);\n}\n\n.p-toast-center {\n min-width: 20vw;\n transform: translate(-50%, -50%);\n}\n\n.p-toast-message-enter-from {\n opacity: 0;\n transform: translateY(50%);\n}\n\n.p-toast-message-leave-from {\n max-height: 1000px;\n}\n\n.p-toast .p-toast-message.p-toast-message-leave-to {\n max-height: 0;\n opacity: 0;\n margin-bottom: 0;\n overflow: hidden;\n}\n\n.p-toast-message-enter-active {\n transition: transform 0.3s, opacity 0.3s;\n}\n\n.p-toast-message-leave-active {\n transition: max-height 0.45s cubic-bezier(0, 1, 0, 1), opacity 0.3s, margin-bottom 0.3s;\n}\n"); +}, "theme"); +var inlineStyles$2 = { + root: /* @__PURE__ */ __name(function root6(_ref2) { + var position = _ref2.position; + return { + position: "fixed", + top: position === "top-right" || position === "top-left" || position === "top-center" ? "20px" : position === "center" ? "50%" : null, + right: (position === "top-right" || position === "bottom-right") && "20px", + bottom: (position === "bottom-left" || position === "bottom-right" || position === "bottom-center") && "20px", + left: position === "top-left" || position === "bottom-left" ? "20px" : position === "center" || position === "top-center" || position === "bottom-center" ? "50%" : null + }; + }, "root") +}; +var classes$4 = { + root: /* @__PURE__ */ __name(function root7(_ref3) { + var props = _ref3.props; + return ["p-toast p-component p-toast-" + props.position]; + }, "root"), + message: /* @__PURE__ */ __name(function message(_ref4) { + var props = _ref4.props; + return ["p-toast-message", { + "p-toast-message-info": props.message.severity === "info" || props.message.severity === void 0, + "p-toast-message-warn": props.message.severity === "warn", + "p-toast-message-error": props.message.severity === "error", + "p-toast-message-success": props.message.severity === "success", + "p-toast-message-secondary": props.message.severity === "secondary", + "p-toast-message-contrast": props.message.severity === "contrast" + }]; + }, "message"), + messageContent: "p-toast-message-content", + messageIcon: /* @__PURE__ */ __name(function messageIcon(_ref5) { + var props = _ref5.props; + return ["p-toast-message-icon", _defineProperty$3(_defineProperty$3(_defineProperty$3(_defineProperty$3({}, props.infoIcon, props.message.severity === "info"), props.warnIcon, props.message.severity === "warn"), props.errorIcon, props.message.severity === "error"), props.successIcon, props.message.severity === "success")]; + }, "messageIcon"), + messageText: "p-toast-message-text", + summary: "p-toast-summary", + detail: "p-toast-detail", + closeButton: "p-toast-close-button", + closeIcon: "p-toast-close-icon" +}; +var ToastStyle = BaseStyle.extend({ + name: "toast", + theme: theme$4, + classes: classes$4, + inlineStyles: inlineStyles$2 +}); +var script$2$2 = { + name: "BaseToast", + "extends": script$g, + props: { + group: { + type: String, + "default": null + }, + position: { + type: String, + "default": "top-right" + }, + autoZIndex: { + type: Boolean, + "default": true + }, + baseZIndex: { + type: Number, + "default": 0 + }, + breakpoints: { + type: Object, + "default": null + }, + closeIcon: { + type: String, + "default": void 0 + }, + infoIcon: { + type: String, + "default": void 0 + }, + warnIcon: { + type: String, + "default": void 0 + }, + errorIcon: { + type: String, + "default": void 0 + }, + successIcon: { + type: String, + "default": void 0 + }, + closeButtonProps: { + type: null, + "default": null + } + }, + style: ToastStyle, + provide: /* @__PURE__ */ __name(function provide9() { + return { + $pcToast: this, + $parentInstance: this + }; + }, "provide") +}; +var script$1$4 = { + name: "ToastMessage", + hostName: "Toast", + "extends": script$g, + emits: ["close"], + closeTimeout: null, + props: { + message: { + type: null, + "default": null + }, + templates: { + type: Object, + "default": null + }, + closeIcon: { + type: String, + "default": null + }, + infoIcon: { + type: String, + "default": null + }, + warnIcon: { + type: String, + "default": null + }, + errorIcon: { + type: String, + "default": null + }, + successIcon: { + type: String, + "default": null + }, + closeButtonProps: { + type: null, + "default": null + } + }, + mounted: /* @__PURE__ */ __name(function mounted4() { + var _this = this; + if (this.message.life) { + this.closeTimeout = setTimeout(function() { + _this.close({ + message: _this.message, + type: "life-end" }); - } - this.hide(); - }, "onTabKey"), - onEnter: /* @__PURE__ */ __name(function onEnter3(el) { - if (this.autoZIndex) { - ZIndex.set("menu", el, this.baseZIndex + this.$primevue.config.zIndex.menu); - } - addStyle(el, { - position: "absolute", - top: "0", - left: "0" + }, this.message.life); + } + }, "mounted"), + beforeUnmount: /* @__PURE__ */ __name(function beforeUnmount4() { + this.clearCloseTimeout(); + }, "beforeUnmount"), + methods: { + close: /* @__PURE__ */ __name(function close(params) { + this.$emit("close", params); + }, "close"), + onCloseClick: /* @__PURE__ */ __name(function onCloseClick() { + this.clearCloseTimeout(); + this.close({ + message: this.message, + type: "close" }); - this.alignOverlay(); - focus(this.menubar); - this.scrollInView(); - }, "onEnter"), - onAfterEnter: /* @__PURE__ */ __name(function onAfterEnter() { - this.bindOutsideClickListener(); - this.bindScrollListener(); - this.bindResizeListener(); - this.$emit("show"); - }, "onAfterEnter"), - onLeave: /* @__PURE__ */ __name(function onLeave2() { - this.unbindOutsideClickListener(); - this.unbindScrollListener(); - this.unbindResizeListener(); - this.$emit("hide"); - this.container = null; - this.dirty = false; - }, "onLeave"), - onAfterLeave: /* @__PURE__ */ __name(function onAfterLeave(el) { - if (this.autoZIndex) { - ZIndex.clear(el); + }, "onCloseClick"), + clearCloseTimeout: /* @__PURE__ */ __name(function clearCloseTimeout() { + if (this.closeTimeout) { + clearTimeout(this.closeTimeout); + this.closeTimeout = null; + } + }, "clearCloseTimeout") + }, + computed: { + iconComponent: /* @__PURE__ */ __name(function iconComponent() { + return { + info: !this.infoIcon && script$s, + success: !this.successIcon && script$t, + warn: !this.warnIcon && script$u, + error: !this.errorIcon && script$v + }[this.message.severity]; + }, "iconComponent"), + closeAriaLabel: /* @__PURE__ */ __name(function closeAriaLabel() { + return this.$primevue.config.locale.aria ? this.$primevue.config.locale.aria.close : void 0; + }, "closeAriaLabel") + }, + components: { + TimesIcon: script$w, + InfoCircleIcon: script$s, + CheckIcon: script$t, + ExclamationTriangleIcon: script$u, + TimesCircleIcon: script$v + }, + directives: { + ripple: Ripple + } +}; +function _typeof$1(o) { + "@babel/helpers - typeof"; + return _typeof$1 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o2) { + return typeof o2; + } : function(o2) { + return o2 && "function" == typeof Symbol && o2.constructor === Symbol && o2 !== Symbol.prototype ? "symbol" : typeof o2; + }, _typeof$1(o); +} +__name(_typeof$1, "_typeof$1"); +function ownKeys$1(e, r) { + var t = Object.keys(e); + if (Object.getOwnPropertySymbols) { + var o = Object.getOwnPropertySymbols(e); + r && (o = o.filter(function(r2) { + return Object.getOwnPropertyDescriptor(e, r2).enumerable; + })), t.push.apply(t, o); + } + return t; +} +__name(ownKeys$1, "ownKeys$1"); +function _objectSpread$1(e) { + for (var r = 1; r < arguments.length; r++) { + var t = null != arguments[r] ? arguments[r] : {}; + r % 2 ? ownKeys$1(Object(t), true).forEach(function(r2) { + _defineProperty$1(e, r2, t[r2]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$1(Object(t)).forEach(function(r2) { + Object.defineProperty(e, r2, Object.getOwnPropertyDescriptor(t, r2)); + }); + } + return e; +} +__name(_objectSpread$1, "_objectSpread$1"); +function _defineProperty$1(e, r, t) { + return (r = _toPropertyKey$1(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e; +} +__name(_defineProperty$1, "_defineProperty$1"); +function _toPropertyKey$1(t) { + var i = _toPrimitive$1(t, "string"); + return "symbol" == _typeof$1(i) ? i : i + ""; +} +__name(_toPropertyKey$1, "_toPropertyKey$1"); +function _toPrimitive$1(t, r) { + if ("object" != _typeof$1(t) || !t) return t; + var e = t[Symbol.toPrimitive]; + if (void 0 !== e) { + var i = e.call(t, r || "default"); + if ("object" != _typeof$1(i)) return i; + throw new TypeError("@@toPrimitive must return a primitive value."); + } + return ("string" === r ? String : Number)(t); +} +__name(_toPrimitive$1, "_toPrimitive$1"); +var _hoisted_1$e = ["aria-label"]; +function render$1$3(_ctx, _cache, $props, $setup, $data, $options) { + var _directive_ripple = resolveDirective("ripple"); + return openBlock(), createElementBlock("div", mergeProps({ + "class": [_ctx.cx("message"), $props.message.styleClass], + role: "alert", + "aria-live": "assertive", + "aria-atomic": "true" + }, _ctx.ptm("message")), [$props.templates.container ? (openBlock(), createBlock(resolveDynamicComponent($props.templates.container), { + key: 0, + message: $props.message, + closeCallback: $options.onCloseClick + }, null, 8, ["message", "closeCallback"])) : (openBlock(), createElementBlock("div", mergeProps({ + key: 1, + "class": [_ctx.cx("messageContent"), $props.message.contentStyleClass] + }, _ctx.ptm("messageContent")), [!$props.templates.message ? (openBlock(), createElementBlock(Fragment, { + key: 0 + }, [(openBlock(), createBlock(resolveDynamicComponent($props.templates.messageicon ? $props.templates.messageicon : $props.templates.icon ? $props.templates.icon : $options.iconComponent && $options.iconComponent.name ? $options.iconComponent : "span"), mergeProps({ + "class": _ctx.cx("messageIcon") + }, _ctx.ptm("messageIcon")), null, 16, ["class"])), createBaseVNode("div", mergeProps({ + "class": _ctx.cx("messageText") + }, _ctx.ptm("messageText")), [createBaseVNode("span", mergeProps({ + "class": _ctx.cx("summary") + }, _ctx.ptm("summary")), toDisplayString($props.message.summary), 17), createBaseVNode("div", mergeProps({ + "class": _ctx.cx("detail") + }, _ctx.ptm("detail")), toDisplayString($props.message.detail), 17)], 16)], 64)) : (openBlock(), createBlock(resolveDynamicComponent($props.templates.message), { + key: 1, + message: $props.message + }, null, 8, ["message"])), $props.message.closable !== false ? (openBlock(), createElementBlock("div", normalizeProps(mergeProps({ + key: 2 + }, _ctx.ptm("buttonContainer"))), [withDirectives((openBlock(), createElementBlock("button", mergeProps({ + "class": _ctx.cx("closeButton"), + type: "button", + "aria-label": $options.closeAriaLabel, + onClick: _cache[0] || (_cache[0] = function() { + return $options.onCloseClick && $options.onCloseClick.apply($options, arguments); + }), + autofocus: "" + }, _objectSpread$1(_objectSpread$1({}, $props.closeButtonProps), _ctx.ptm("closeButton"))), [(openBlock(), createBlock(resolveDynamicComponent($props.templates.closeicon || "TimesIcon"), mergeProps({ + "class": [_ctx.cx("closeIcon"), $props.closeIcon] + }, _ctx.ptm("closeIcon")), null, 16, ["class"]))], 16, _hoisted_1$e)), [[_directive_ripple]])], 16)) : createCommentVNode("", true)], 16))], 16); +} +__name(render$1$3, "render$1$3"); +script$1$4.render = render$1$3; +function _toConsumableArray(r) { + return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); +} +__name(_toConsumableArray, "_toConsumableArray"); +function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); +} +__name(_nonIterableSpread, "_nonIterableSpread"); +function _unsupportedIterableToArray(r, a) { + if (r) { + if ("string" == typeof r) return _arrayLikeToArray(r, a); + var t = {}.toString.call(r).slice(8, -1); + return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; + } +} +__name(_unsupportedIterableToArray, "_unsupportedIterableToArray"); +function _iterableToArray(r) { + if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); +} +__name(_iterableToArray, "_iterableToArray"); +function _arrayWithoutHoles(r) { + if (Array.isArray(r)) return _arrayLikeToArray(r); +} +__name(_arrayWithoutHoles, "_arrayWithoutHoles"); +function _arrayLikeToArray(r, a) { + (null == a || a > r.length) && (a = r.length); + for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; + return n; +} +__name(_arrayLikeToArray, "_arrayLikeToArray"); +var messageIdx = 0; +var script$6 = { + name: "Toast", + "extends": script$2$2, + inheritAttrs: false, + emits: ["close", "life-end"], + data: /* @__PURE__ */ __name(function data5() { + return { + messages: [] + }; + }, "data"), + styleElement: null, + mounted: /* @__PURE__ */ __name(function mounted5() { + ToastEventBus.on("add", this.onAdd); + ToastEventBus.on("remove", this.onRemove); + ToastEventBus.on("remove-group", this.onRemoveGroup); + ToastEventBus.on("remove-all-groups", this.onRemoveAllGroups); + if (this.breakpoints) { + this.createStyle(); + } + }, "mounted"), + beforeUnmount: /* @__PURE__ */ __name(function beforeUnmount5() { + this.destroyStyle(); + if (this.$refs.container && this.autoZIndex) { + ZIndex.clear(this.$refs.container); + } + ToastEventBus.off("add", this.onAdd); + ToastEventBus.off("remove", this.onRemove); + ToastEventBus.off("remove-group", this.onRemoveGroup); + ToastEventBus.off("remove-all-groups", this.onRemoveAllGroups); + }, "beforeUnmount"), + methods: { + add: /* @__PURE__ */ __name(function add(message2) { + if (message2.id == null) { + message2.id = messageIdx++; } - }, "onAfterLeave"), - alignOverlay: /* @__PURE__ */ __name(function alignOverlay2() { - absolutePosition(this.container, this.target); - var targetWidth = getOuterWidth(this.target); - if (targetWidth > getOuterWidth(this.container)) { - this.container.style.minWidth = getOuterWidth(this.target) + "px"; + this.messages = [].concat(_toConsumableArray(this.messages), [message2]); + }, "add"), + remove: /* @__PURE__ */ __name(function remove(params) { + var index = this.messages.findIndex(function(m) { + return m.id === params.message.id; + }); + if (index !== -1) { + this.messages.splice(index, 1); + this.$emit(params.type, { + message: params.message + }); } - }, "alignOverlay"), - bindOutsideClickListener: /* @__PURE__ */ __name(function bindOutsideClickListener2() { - var _this2 = this; - if (!this.outsideClickListener) { - this.outsideClickListener = function(event) { - var isOutsideContainer = _this2.container && !_this2.container.contains(event.target); - var isOutsideTarget = _this2.popup ? !(_this2.target && (_this2.target === event.target || _this2.target.contains(event.target))) : true; - if (isOutsideContainer && isOutsideTarget) { - _this2.hide(); - } - }; - document.addEventListener("click", this.outsideClickListener); + }, "remove"), + onAdd: /* @__PURE__ */ __name(function onAdd(message2) { + if (this.group == message2.group) { + this.add(message2); } - }, "bindOutsideClickListener"), - unbindOutsideClickListener: /* @__PURE__ */ __name(function unbindOutsideClickListener2() { - if (this.outsideClickListener) { - document.removeEventListener("click", this.outsideClickListener); - this.outsideClickListener = null; + }, "onAdd"), + onRemove: /* @__PURE__ */ __name(function onRemove(message2) { + this.remove({ + message: message2, + type: "close" + }); + }, "onRemove"), + onRemoveGroup: /* @__PURE__ */ __name(function onRemoveGroup(group) { + if (this.group === group) { + this.messages = []; } - }, "unbindOutsideClickListener"), - bindScrollListener: /* @__PURE__ */ __name(function bindScrollListener2() { - var _this3 = this; - if (!this.scrollHandler) { - this.scrollHandler = new ConnectedOverlayScrollHandler(this.target, function(event) { - _this3.hide(event, true); - }); + }, "onRemoveGroup"), + onRemoveAllGroups: /* @__PURE__ */ __name(function onRemoveAllGroups() { + this.messages = []; + }, "onRemoveAllGroups"), + onEnter: /* @__PURE__ */ __name(function onEnter() { + this.$refs.container.setAttribute(this.attributeSelector, ""); + if (this.autoZIndex) { + ZIndex.set("modal", this.$refs.container, this.baseZIndex || this.$primevue.config.zIndex.modal); } - this.scrollHandler.bindScrollListener(); - }, "bindScrollListener"), - unbindScrollListener: /* @__PURE__ */ __name(function unbindScrollListener2() { - if (this.scrollHandler) { - this.scrollHandler.unbindScrollListener(); + }, "onEnter"), + onLeave: /* @__PURE__ */ __name(function onLeave() { + var _this = this; + if (this.$refs.container && this.autoZIndex && isEmpty(this.messages)) { + setTimeout(function() { + ZIndex.clear(_this.$refs.container); + }, 200); } - }, "unbindScrollListener"), - bindResizeListener: /* @__PURE__ */ __name(function bindResizeListener2() { - var _this4 = this; - if (!this.resizeListener) { - this.resizeListener = function(event) { - if (!isTouchDevice()) { - _this4.hide(event, true); + }, "onLeave"), + createStyle: /* @__PURE__ */ __name(function createStyle() { + if (!this.styleElement && !this.isUnstyled) { + var _this$$primevue; + this.styleElement = document.createElement("style"); + this.styleElement.type = "text/css"; + setAttribute(this.styleElement, "nonce", (_this$$primevue = this.$primevue) === null || _this$$primevue === void 0 || (_this$$primevue = _this$$primevue.config) === null || _this$$primevue === void 0 || (_this$$primevue = _this$$primevue.csp) === null || _this$$primevue === void 0 ? void 0 : _this$$primevue.nonce); + document.head.appendChild(this.styleElement); + var innerHTML = ""; + for (var breakpoint in this.breakpoints) { + var breakpointStyle = ""; + for (var styleProp in this.breakpoints[breakpoint]) { + breakpointStyle += styleProp + ":" + this.breakpoints[breakpoint][styleProp] + "!important;"; } - }; - window.addEventListener("resize", this.resizeListener); + innerHTML += "\n @media screen and (max-width: ".concat(breakpoint, ") {\n .p-toast[").concat(this.attributeSelector, "] {\n ").concat(breakpointStyle, "\n }\n }\n "); + } + this.styleElement.innerHTML = innerHTML; } - }, "bindResizeListener"), - unbindResizeListener: /* @__PURE__ */ __name(function unbindResizeListener2() { - if (this.resizeListener) { - window.removeEventListener("resize", this.resizeListener); - this.resizeListener = null; + }, "createStyle"), + destroyStyle: /* @__PURE__ */ __name(function destroyStyle() { + if (this.styleElement) { + document.head.removeChild(this.styleElement); + this.styleElement = null; } - }, "unbindResizeListener"), - isItemMatched: /* @__PURE__ */ __name(function isItemMatched(processedItem) { - var _this$getProccessedIt; - return this.isValidItem(processedItem) && ((_this$getProccessedIt = this.getProccessedItemLabel(processedItem)) === null || _this$getProccessedIt === void 0 ? void 0 : _this$getProccessedIt.toLocaleLowerCase().startsWith(this.searchValue.toLocaleLowerCase())); - }, "isItemMatched"), - isValidItem: /* @__PURE__ */ __name(function isValidItem(processedItem) { - return !!processedItem && !this.isItemDisabled(processedItem.item) && !this.isItemSeparator(processedItem.item) && this.isItemVisible(processedItem.item); - }, "isValidItem"), - isValidSelectedItem: /* @__PURE__ */ __name(function isValidSelectedItem(processedItem) { - return this.isValidItem(processedItem) && this.isSelected(processedItem); - }, "isValidSelectedItem"), - isSelected: /* @__PURE__ */ __name(function isSelected2(processedItem) { - return this.activeItemPath.some(function(p) { - return p.key === processedItem.key; - }); - }, "isSelected"), - findFirstItemIndex: /* @__PURE__ */ __name(function findFirstItemIndex() { - var _this5 = this; - return this.visibleItems.findIndex(function(processedItem) { - return _this5.isValidItem(processedItem); - }); - }, "findFirstItemIndex"), - findLastItemIndex: /* @__PURE__ */ __name(function findLastItemIndex() { - var _this6 = this; - return findLastIndex(this.visibleItems, function(processedItem) { - return _this6.isValidItem(processedItem); - }); - }, "findLastItemIndex"), - findNextItemIndex: /* @__PURE__ */ __name(function findNextItemIndex(index) { - var _this7 = this; - var matchedItemIndex = index < this.visibleItems.length - 1 ? this.visibleItems.slice(index + 1).findIndex(function(processedItem) { - return _this7.isValidItem(processedItem); - }) : -1; - return matchedItemIndex > -1 ? matchedItemIndex + index + 1 : index; - }, "findNextItemIndex"), - findPrevItemIndex: /* @__PURE__ */ __name(function findPrevItemIndex(index) { - var _this8 = this; - var matchedItemIndex = index > 0 ? findLastIndex(this.visibleItems.slice(0, index), function(processedItem) { - return _this8.isValidItem(processedItem); - }) : -1; - return matchedItemIndex > -1 ? matchedItemIndex : index; - }, "findPrevItemIndex"), - findSelectedItemIndex: /* @__PURE__ */ __name(function findSelectedItemIndex() { - var _this9 = this; - return this.visibleItems.findIndex(function(processedItem) { - return _this9.isValidSelectedItem(processedItem); - }); - }, "findSelectedItemIndex"), - findFirstFocusedItemIndex: /* @__PURE__ */ __name(function findFirstFocusedItemIndex() { - var selectedIndex = this.findSelectedItemIndex(); - return selectedIndex < 0 ? this.findFirstItemIndex() : selectedIndex; - }, "findFirstFocusedItemIndex"), - findLastFocusedItemIndex: /* @__PURE__ */ __name(function findLastFocusedItemIndex() { - var selectedIndex = this.findSelectedItemIndex(); - return selectedIndex < 0 ? this.findLastItemIndex() : selectedIndex; - }, "findLastFocusedItemIndex"), - searchItems: /* @__PURE__ */ __name(function searchItems(event, _char) { - var _this10 = this; - this.searchValue = (this.searchValue || "") + _char; - var itemIndex = -1; - var matched = false; - if (this.focusedItemInfo.index !== -1) { - itemIndex = this.visibleItems.slice(this.focusedItemInfo.index).findIndex(function(processedItem) { - return _this10.isItemMatched(processedItem); + }, "destroyStyle") + }, + computed: { + attributeSelector: /* @__PURE__ */ __name(function attributeSelector() { + return UniqueComponentId(); + }, "attributeSelector") + }, + components: { + ToastMessage: script$1$4, + Portal: script$m + } +}; +function _typeof$2(o) { + "@babel/helpers - typeof"; + return _typeof$2 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o2) { + return typeof o2; + } : function(o2) { + return o2 && "function" == typeof Symbol && o2.constructor === Symbol && o2 !== Symbol.prototype ? "symbol" : typeof o2; + }, _typeof$2(o); +} +__name(_typeof$2, "_typeof$2"); +function ownKeys$2(e, r) { + var t = Object.keys(e); + if (Object.getOwnPropertySymbols) { + var o = Object.getOwnPropertySymbols(e); + r && (o = o.filter(function(r2) { + return Object.getOwnPropertyDescriptor(e, r2).enumerable; + })), t.push.apply(t, o); + } + return t; +} +__name(ownKeys$2, "ownKeys$2"); +function _objectSpread$2(e) { + for (var r = 1; r < arguments.length; r++) { + var t = null != arguments[r] ? arguments[r] : {}; + r % 2 ? ownKeys$2(Object(t), true).forEach(function(r2) { + _defineProperty$2(e, r2, t[r2]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$2(Object(t)).forEach(function(r2) { + Object.defineProperty(e, r2, Object.getOwnPropertyDescriptor(t, r2)); + }); + } + return e; +} +__name(_objectSpread$2, "_objectSpread$2"); +function _defineProperty$2(e, r, t) { + return (r = _toPropertyKey$2(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e; +} +__name(_defineProperty$2, "_defineProperty$2"); +function _toPropertyKey$2(t) { + var i = _toPrimitive$2(t, "string"); + return "symbol" == _typeof$2(i) ? i : i + ""; +} +__name(_toPropertyKey$2, "_toPropertyKey$2"); +function _toPrimitive$2(t, r) { + if ("object" != _typeof$2(t) || !t) return t; + var e = t[Symbol.toPrimitive]; + if (void 0 !== e) { + var i = e.call(t, r || "default"); + if ("object" != _typeof$2(i)) return i; + throw new TypeError("@@toPrimitive must return a primitive value."); + } + return ("string" === r ? String : Number)(t); +} +__name(_toPrimitive$2, "_toPrimitive$2"); +function render$a(_ctx, _cache, $props, $setup, $data, $options) { + var _component_ToastMessage = resolveComponent("ToastMessage"); + var _component_Portal = resolveComponent("Portal"); + return openBlock(), createBlock(_component_Portal, null, { + "default": withCtx(function() { + return [createBaseVNode("div", mergeProps({ + ref: "container", + "class": _ctx.cx("root"), + style: _ctx.sx("root", true, { + position: _ctx.position + }) + }, _ctx.ptmi("root")), [createVNode(TransitionGroup, mergeProps({ + name: "p-toast-message", + tag: "div", + onEnter: $options.onEnter, + onLeave: $options.onLeave + }, _objectSpread$2({}, _ctx.ptm("transition"))), { + "default": withCtx(function() { + return [(openBlock(true), createElementBlock(Fragment, null, renderList($data.messages, function(msg) { + return openBlock(), createBlock(_component_ToastMessage, { + key: msg.id, + message: msg, + templates: _ctx.$slots, + closeIcon: _ctx.closeIcon, + infoIcon: _ctx.infoIcon, + warnIcon: _ctx.warnIcon, + errorIcon: _ctx.errorIcon, + successIcon: _ctx.successIcon, + closeButtonProps: _ctx.closeButtonProps, + unstyled: _ctx.unstyled, + onClose: _cache[0] || (_cache[0] = function($event) { + return $options.remove($event); + }), + pt: _ctx.pt + }, null, 8, ["message", "templates", "closeIcon", "infoIcon", "warnIcon", "errorIcon", "successIcon", "closeButtonProps", "unstyled", "pt"]); + }), 128))]; + }), + _: 1 + }, 16, ["onEnter", "onLeave"])], 16)]; + }), + _: 1 + }); +} +__name(render$a, "render$a"); +script$6.render = render$a; +const _sfc_main$b = /* @__PURE__ */ defineComponent({ + __name: "GlobalToast", + setup(__props) { + const toast = useToast(); + const toastStore = useToastStore(); + const settingStore = useSettingStore(); + watch( + () => toastStore.messagesToAdd, + (newMessages) => { + if (newMessages.length === 0) { + return; + } + newMessages.forEach((message2) => { + toast.add(message2); }); - itemIndex = itemIndex === -1 ? this.visibleItems.slice(0, this.focusedItemInfo.index).findIndex(function(processedItem) { - return _this10.isItemMatched(processedItem); - }) : itemIndex + this.focusedItemInfo.index; - } else { - itemIndex = this.visibleItems.findIndex(function(processedItem) { - return _this10.isItemMatched(processedItem); + toastStore.messagesToAdd = []; + }, + { deep: true } + ); + watch( + () => toastStore.messagesToRemove, + (messagesToRemove) => { + if (messagesToRemove.length === 0) { + return; + } + messagesToRemove.forEach((message2) => { + toast.remove(message2); }); + toastStore.messagesToRemove = []; + }, + { deep: true } + ); + watch( + () => toastStore.removeAllRequested, + (requested) => { + if (requested) { + toast.removeAllGroups(); + toastStore.removeAllRequested = false; + } } - if (itemIndex !== -1) { - matched = true; - } - if (itemIndex === -1 && this.focusedItemInfo.index === -1) { - itemIndex = this.findFirstFocusedItemIndex(); + ); + function updateToastPosition() { + const styleElement = document.getElementById("dynamic-toast-style") || createStyleElement(); + const rect = document.querySelector(".graph-canvas-container").getBoundingClientRect(); + styleElement.textContent = ` + .p-toast.p-component.p-toast-top-right { + top: ${rect.top + 20}px !important; + right: ${window.innerWidth - (rect.left + rect.width) + 20}px !important; + } + `; + } + __name(updateToastPosition, "updateToastPosition"); + function createStyleElement() { + const style = document.createElement("style"); + style.id = "dynamic-toast-style"; + document.head.appendChild(style); + return style; + } + __name(createStyleElement, "createStyleElement"); + watch( + () => settingStore.get("Comfy.UseNewMenu"), + () => nextTick(updateToastPosition), + { immediate: true } + ); + watch( + () => settingStore.get("Comfy.Sidebar.Location"), + () => nextTick(updateToastPosition), + { immediate: true } + ); + return (_ctx, _cache) => { + return openBlock(), createBlock(unref(script$6)); + }; + } +}); +const _sfc_main$a = /* @__PURE__ */ defineComponent({ + __name: "UnloadWindowConfirmDialog", + setup(__props) { + const settingStore = useSettingStore(); + const handleBeforeUnload = /* @__PURE__ */ __name((event) => { + if (settingStore.get("Comfy.Window.UnloadConfirmation")) { + event.preventDefault(); + return true; } - if (itemIndex !== -1) { - this.changeFocusedItemIndex(event, itemIndex); + return void 0; + }, "handleBeforeUnload"); + onMounted(() => { + window.addEventListener("beforeunload", handleBeforeUnload); + }); + onBeforeUnmount(() => { + window.removeEventListener("beforeunload", handleBeforeUnload); + }); + return (_ctx, _cache) => { + return openBlock(), createElementBlock("div"); + }; + } +}); +const DEFAULT_TITLE = "ComfyUI"; +const TITLE_SUFFIX = " - ComfyUI"; +const _sfc_main$9 = /* @__PURE__ */ defineComponent({ + __name: "BrowserTabTitle", + setup(__props) { + const executionStore = useExecutionStore(); + const executionText = computed( + () => executionStore.isIdle ? "" : `[${executionStore.executionProgress}%]` + ); + const settingStore = useSettingStore(); + const betaMenuEnabled = computed( + () => settingStore.get("Comfy.UseNewMenu") !== "Disabled" + ); + const workflowStore = useWorkflowStore(); + const isUnsavedText = computed( + () => workflowStore.activeWorkflow?.isModified || !workflowStore.activeWorkflow?.isPersisted ? " *" : "" + ); + const workflowNameText = computed(() => { + const workflowName = workflowStore.activeWorkflow?.filename; + return workflowName ? isUnsavedText.value + workflowName + TITLE_SUFFIX : DEFAULT_TITLE; + }); + const nodeExecutionTitle = computed( + () => executionStore.executingNode && executionStore.executingNodeProgress ? `${executionText.value}[${executionStore.executingNodeProgress}%] ${executionStore.executingNode.type}` : "" + ); + const workflowTitle = computed( + () => executionText.value + (betaMenuEnabled.value ? workflowNameText.value : DEFAULT_TITLE) + ); + const title = computed(() => nodeExecutionTitle.value || workflowTitle.value); + useTitle(title); + return (_ctx, _cache) => { + return openBlock(), createElementBlock("div"); + }; + } +}); +const _withScopeId$3 = /* @__PURE__ */ __name((n) => (pushScopeId("data-v-68bb6853"), n = n(), popScopeId(), n), "_withScopeId$3"); +const _hoisted_1$d = { class: "workflow-label text-sm max-w-[150px] truncate inline-block" }; +const _hoisted_2$b = { class: "relative" }; +const _hoisted_3$9 = { + key: 0, + class: "status-indicator" +}; +const _sfc_main$8 = /* @__PURE__ */ defineComponent({ + __name: "WorkflowTab", + props: { + class: {}, + workflowOption: {} + }, + setup(__props) { + const props = __props; + const workspaceStore = useWorkspaceStore(); + const workflowStore = useWorkflowStore(); + const workflowTabRef = ref(null); + const closeWorkflows = /* @__PURE__ */ __name(async (options) => { + for (const opt of options) { + if (!await useWorkflowService().closeWorkflow(opt.workflow, { + warnIfUnsaved: !workspaceStore.shiftDown + })) { + break; + } } - if (this.searchTimeout) { - clearTimeout(this.searchTimeout); + }, "closeWorkflows"); + const onCloseWorkflow = /* @__PURE__ */ __name((option2) => { + closeWorkflows([option2]); + }, "onCloseWorkflow"); + const tabGetter = /* @__PURE__ */ __name(() => workflowTabRef.value, "tabGetter"); + usePragmaticDraggable(tabGetter, { + getInitialData: /* @__PURE__ */ __name(() => { + return { + workflowKey: props.workflowOption.workflow.key + }; + }, "getInitialData") + }); + usePragmaticDroppable(tabGetter, { + getData: /* @__PURE__ */ __name(() => { + return { + workflowKey: props.workflowOption.workflow.key + }; + }, "getData"), + onDrop: /* @__PURE__ */ __name((e) => { + const fromIndex = workflowStore.openWorkflows.findIndex( + (wf) => wf.key === e.source.data.workflowKey + ); + const toIndex = workflowStore.openWorkflows.findIndex( + (wf) => wf.key === e.location.current.dropTargets[0]?.data.workflowKey + ); + if (fromIndex !== toIndex) { + workflowStore.reorderWorkflows(fromIndex, toIndex); + } + }, "onDrop") + }); + return (_ctx, _cache) => { + const _directive_tooltip = resolveDirective("tooltip"); + return openBlock(), createElementBlock("div", mergeProps({ + class: "flex p-2 gap-2 workflow-tab", + ref_key: "workflowTabRef", + ref: workflowTabRef + }, _ctx.$attrs), [ + withDirectives((openBlock(), createElementBlock("span", _hoisted_1$d, [ + createTextVNode(toDisplayString(_ctx.workflowOption.workflow.filename), 1) + ])), [ + [ + _directive_tooltip, + _ctx.workflowOption.workflow.key, + void 0, + { bottom: true } + ] + ]), + createBaseVNode("div", _hoisted_2$b, [ + !unref(workspaceStore).shiftDown && (_ctx.workflowOption.workflow.isModified || !_ctx.workflowOption.workflow.isPersisted) ? (openBlock(), createElementBlock("span", _hoisted_3$9, "•")) : createCommentVNode("", true), + createVNode(unref(script$f), { + class: "close-button p-0 w-auto", + icon: "pi pi-times", + text: "", + severity: "secondary", + size: "small", + onClick: _cache[0] || (_cache[0] = withModifiers(($event) => onCloseWorkflow(_ctx.workflowOption), ["stop"])) + }) + ]) + ], 16); + }; + } +}); +const WorkflowTab = /* @__PURE__ */ _export_sfc(_sfc_main$8, [["__scopeId", "data-v-68bb6853"]]); +const _sfc_main$7 = /* @__PURE__ */ defineComponent({ + __name: "WorkflowTabs", + props: { + class: {} + }, + setup(__props) { + const props = __props; + const { t } = useI18n(); + const workspaceStore = useWorkspaceStore(); + const workflowStore = useWorkflowStore(); + const workflowService = useWorkflowService(); + const rightClickedTab = ref(null); + const menu = ref(); + const workflowToOption = /* @__PURE__ */ __name((workflow) => ({ + value: workflow.path, + workflow + }), "workflowToOption"); + const options = computed( + () => workflowStore.openWorkflows.map(workflowToOption) + ); + const selectedWorkflow = computed( + () => workflowStore.activeWorkflow ? workflowToOption(workflowStore.activeWorkflow) : null + ); + const onWorkflowChange = /* @__PURE__ */ __name((option2) => { + if (!option2) { + return; } - this.searchTimeout = setTimeout(function() { - _this10.searchValue = ""; - _this10.searchTimeout = null; - }, 500); - return matched; - }, "searchItems"), - changeFocusedItemIndex: /* @__PURE__ */ __name(function changeFocusedItemIndex(event, index) { - if (this.focusedItemInfo.index !== index) { - this.focusedItemInfo.index = index; - this.scrollInView(); + if (selectedWorkflow.value?.value === option2.value) { + return; } - }, "changeFocusedItemIndex"), - scrollInView: /* @__PURE__ */ __name(function scrollInView3() { - var index = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : -1; - var id2 = index !== -1 ? "".concat(this.id, "_").concat(index) : this.focusedItemId; - var element = findSingle(this.menubar, 'li[id="'.concat(id2, '"]')); - if (element) { - element.scrollIntoView && element.scrollIntoView({ - block: "nearest", - inline: "start" - }); + workflowService.openWorkflow(option2.workflow); + }, "onWorkflowChange"); + const closeWorkflows = /* @__PURE__ */ __name(async (options2) => { + for (const opt of options2) { + if (!await workflowService.closeWorkflow(opt.workflow, { + warnIfUnsaved: !workspaceStore.shiftDown + })) { + break; + } } - }, "scrollInView"), - createProcessedItems: /* @__PURE__ */ __name(function createProcessedItems(items) { - var _this11 = this; - var level = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 0; - var parent = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {}; - var parentKey = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : ""; - var processedItems3 = []; - items && items.forEach(function(item3, index) { - var key = (parentKey !== "" ? parentKey + "_" : "") + index; - var newItem = { - item: item3, - index, - level, - key, - parent, - parentKey - }; - newItem["items"] = _this11.createProcessedItems(item3.items, level + 1, newItem, key); - processedItems3.push(newItem); - }); - return processedItems3; - }, "createProcessedItems"), - containerRef: /* @__PURE__ */ __name(function containerRef2(el) { - this.container = el; - }, "containerRef"), - menubarRef: /* @__PURE__ */ __name(function menubarRef(el) { - this.menubar = el ? el.$el : void 0; - }, "menubarRef") - }, - computed: { - processedItems: /* @__PURE__ */ __name(function processedItems() { - return this.createProcessedItems(this.model || []); - }, "processedItems"), - visibleItems: /* @__PURE__ */ __name(function visibleItems() { - var _this12 = this; - var processedItem = this.activeItemPath.find(function(p) { - return p.key === _this12.focusedItemInfo.parentKey; - }); - return processedItem ? processedItem.items : this.processedItems; - }, "visibleItems"), - focusedItemId: /* @__PURE__ */ __name(function focusedItemId() { - return this.focusedItemInfo.index !== -1 ? "".concat(this.id).concat(isNotEmpty(this.focusedItemInfo.parentKey) ? "_" + this.focusedItemInfo.parentKey : "", "_").concat(this.focusedItemInfo.index) : null; - }, "focusedItemId") - }, - components: { - TieredMenuSub: script$1$2, - Portal: script$k - } -}; -var _hoisted_1$8 = ["id"]; -function render$5(_ctx, _cache, $props, $setup, $data, $options) { - var _component_TieredMenuSub = resolveComponent("TieredMenuSub"); - var _component_Portal = resolveComponent("Portal"); - return openBlock(), createBlock(_component_Portal, { - appendTo: _ctx.appendTo, - disabled: !_ctx.popup - }, { - "default": withCtx(function() { - return [createVNode(Transition, mergeProps({ - name: "p-connected-overlay", - onEnter: $options.onEnter, - onAfterEnter: $options.onAfterEnter, - onLeave: $options.onLeave, - onAfterLeave: $options.onAfterLeave - }, _ctx.ptm("transition")), { - "default": withCtx(function() { - return [$data.visible ? (openBlock(), createElementBlock("div", mergeProps({ - key: 0, - ref: $options.containerRef, - id: $data.id, - "class": _ctx.cx("root"), - onClick: _cache[0] || (_cache[0] = function() { - return $options.onOverlayClick && $options.onOverlayClick.apply($options, arguments); - }) - }, _ctx.ptmi("root")), [_ctx.$slots.start ? (openBlock(), createElementBlock("div", mergeProps({ - key: 0, - "class": _ctx.cx("start") - }, _ctx.ptm("start")), [renderSlot(_ctx.$slots, "start")], 16)) : createCommentVNode("", true), createVNode(_component_TieredMenuSub, { - ref: $options.menubarRef, - id: $data.id + "_list", - tabindex: !_ctx.disabled ? _ctx.tabindex : -1, - role: "menubar", - "aria-label": _ctx.ariaLabel, - "aria-labelledby": _ctx.ariaLabelledby, - "aria-disabled": _ctx.disabled || void 0, - "aria-orientation": "vertical", - "aria-activedescendant": $data.focused ? $options.focusedItemId : void 0, - menuId: $data.id, - focusedItemId: $data.focused ? $options.focusedItemId : void 0, - items: $options.processedItems, - templates: _ctx.$slots, - activeItemPath: $data.activeItemPath, - level: 0, - visible: $data.submenuVisible, - pt: _ctx.pt, - unstyled: _ctx.unstyled, - onFocus: $options.onFocus, - onBlur: $options.onBlur, - onKeydown: $options.onKeyDown, - onItemClick: $options.onItemClick, - onItemMouseenter: $options.onItemMouseEnter, - onItemMousemove: $options.onItemMouseMove - }, null, 8, ["id", "tabindex", "aria-label", "aria-labelledby", "aria-disabled", "aria-activedescendant", "menuId", "focusedItemId", "items", "templates", "activeItemPath", "visible", "pt", "unstyled", "onFocus", "onBlur", "onKeydown", "onItemClick", "onItemMouseenter", "onItemMousemove"]), _ctx.$slots.end ? (openBlock(), createElementBlock("div", mergeProps({ - key: 1, - "class": _ctx.cx("end") - }, _ctx.ptm("end")), [renderSlot(_ctx.$slots, "end")], 16)) : createCommentVNode("", true)], 16, _hoisted_1$8)) : createCommentVNode("", true)]; + }, "closeWorkflows"); + const onCloseWorkflow = /* @__PURE__ */ __name((option2) => { + closeWorkflows([option2]); + }, "onCloseWorkflow"); + const showContextMenu = /* @__PURE__ */ __name((event, option2) => { + rightClickedTab.value = option2; + menu.value.show(event); + }, "showContextMenu"); + const contextMenuItems = computed(() => { + const tab = rightClickedTab.value; + if (!tab) return []; + const index = options.value.findIndex((v) => v.workflow === tab.workflow); + return [ + { + label: t("tabMenu.duplicateTab"), + command: /* @__PURE__ */ __name(() => { + workflowService.duplicateWorkflow(tab.workflow); + }, "command") + }, + { + separator: true + }, + { + label: t("tabMenu.closeTab"), + command: /* @__PURE__ */ __name(() => onCloseWorkflow(tab), "command") + }, + { + label: t("tabMenu.closeTabsToLeft"), + command: /* @__PURE__ */ __name(() => closeWorkflows(options.value.slice(0, index)), "command"), + disabled: index <= 0 + }, + { + label: t("tabMenu.closeTabsToRight"), + command: /* @__PURE__ */ __name(() => closeWorkflows(options.value.slice(index + 1)), "command"), + disabled: index === options.value.length - 1 + }, + { + label: t("tabMenu.closeOtherTabs"), + command: /* @__PURE__ */ __name(() => closeWorkflows([ + ...options.value.slice(index + 1), + ...options.value.slice(0, index) + ]), "command"), + disabled: options.value.length <= 1 + } + ]; + }); + const commandStore = useCommandStore(); + return (_ctx, _cache) => { + return openBlock(), createElementBlock(Fragment, null, [ + createVNode(unref(script$x), { + class: normalizeClass(["workflow-tabs bg-transparent inline", props.class]), + modelValue: selectedWorkflow.value, + "onUpdate:modelValue": onWorkflowChange, + options: options.value, + optionLabel: "label", + dataKey: "value" + }, { + option: withCtx(({ option: option2 }) => [ + createVNode(WorkflowTab, { + onContextmenu: /* @__PURE__ */ __name(($event) => showContextMenu($event, option2), "onContextmenu"), + onMouseup: withModifiers(($event) => onCloseWorkflow(option2), ["middle"]), + "workflow-option": option2 + }, null, 8, ["onContextmenu", "onMouseup", "workflow-option"]) + ]), + _: 1 + }, 8, ["class", "modelValue", "options"]), + createVNode(unref(script$f), { + class: "new-blank-workflow-button", + icon: "pi pi-plus", + text: "", + severity: "secondary", + onClick: _cache[0] || (_cache[0] = () => unref(commandStore).execute("Comfy.NewBlankWorkflow")) }), - _: 3 - }, 16, ["onEnter", "onAfterEnter", "onLeave", "onAfterLeave"])]; - }), - _: 3 - }, 8, ["appendTo", "disabled"]); -} -__name(render$5, "render$5"); -script$4.render = render$5; -var theme$1 = /* @__PURE__ */ __name(function theme7(_ref) { + createVNode(unref(script$y), { + ref_key: "menu", + ref: menu, + model: contextMenuItems.value + }, null, 8, ["model"]) + ], 64); + }; + } +}); +const WorkflowTabs = /* @__PURE__ */ _export_sfc(_sfc_main$7, [["__scopeId", "data-v-dcfae321"]]); +var theme$3 = /* @__PURE__ */ __name(function theme6(_ref) { var dt = _ref.dt; - return "\n.p-splitbutton {\n display: inline-flex;\n position: relative;\n border-radius: ".concat(dt("splitbutton.border.radius"), ";\n}\n\n.p-splitbutton-button {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n border-right: 0 none;\n}\n\n.p-splitbutton-button:focus-visible,\n.p-splitbutton-dropdown:focus-visible {\n z-index: 1;\n}\n\n.p-splitbutton-button:not(:disabled):hover,\n.p-splitbutton-button:not(:disabled):active {\n border-right: 0 none;\n}\n\n.p-splitbutton-dropdown {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.p-splitbutton .p-menu {\n min-width: 100%;\n}\n\n.p-splitbutton-fluid {\n display: flex;\n}\n\n.p-splitbutton-rounded .p-splitbutton-dropdown {\n border-top-right-radius: ").concat(dt("splitbutton.rounded.border.radius"), ";\n border-bottom-right-radius: ").concat(dt("splitbutton.rounded.border.radius"), ";\n}\n\n.p-splitbutton-rounded .p-splitbutton-button {\n border-top-left-radius: ").concat(dt("splitbutton.rounded.border.radius"), ";\n border-bottom-left-radius: ").concat(dt("splitbutton.rounded.border.radius"), ";\n}\n\n.p-splitbutton-raised {\n box-shadow: ").concat(dt("splitbutton.raised.shadow"), ";\n}\n"); + return "\n.p-menubar {\n display: flex;\n align-items: center;\n background: ".concat(dt("menubar.background"), ";\n border: 1px solid ").concat(dt("menubar.border.color"), ";\n border-radius: ").concat(dt("menubar.border.radius"), ";\n color: ").concat(dt("menubar.color"), ";\n padding: ").concat(dt("menubar.padding"), ";\n gap: ").concat(dt("menubar.gap"), ";\n}\n\n.p-menubar-start,\n.p-megamenu-end {\n display: flex;\n align-items: center;\n}\n\n.p-menubar-root-list,\n.p-menubar-submenu {\n display: flex;\n margin: 0;\n padding: 0;\n list-style: none;\n outline: 0 none;\n}\n\n.p-menubar-root-list {\n align-items: center;\n flex-wrap: wrap;\n gap: ").concat(dt("menubar.gap"), ";\n}\n\n.p-menubar-root-list > .p-menubar-item > .p-menubar-item-content {\n border-radius: ").concat(dt("menubar.base.item.border.radius"), ";\n}\n\n.p-menubar-root-list > .p-menubar-item > .p-menubar-item-content > .p-menubar-item-link {\n padding: ").concat(dt("menubar.base.item.padding"), ";\n}\n\n.p-menubar-item-content {\n transition: background ").concat(dt("menubar.transition.duration"), ", color ").concat(dt("menubar.transition.duration"), ";\n border-radius: ").concat(dt("menubar.item.border.radius"), ";\n color: ").concat(dt("menubar.item.color"), ";\n}\n\n.p-menubar-item-link {\n cursor: pointer;\n display: flex;\n align-items: center;\n text-decoration: none;\n overflow: hidden;\n position: relative;\n color: inherit;\n padding: ").concat(dt("menubar.item.padding"), ";\n gap: ").concat(dt("menubar.item.gap"), ";\n user-select: none;\n outline: 0 none;\n}\n\n.p-menubar-item-label {\n line-height: 1;\n}\n\n.p-menubar-item-icon {\n color: ").concat(dt("menubar.item.icon.color"), ";\n}\n\n.p-menubar-submenu-icon {\n color: ").concat(dt("menubar.submenu.icon.color"), ";\n margin-left: auto;\n font-size: ").concat(dt("menubar.submenu.icon.size"), ";\n width: ").concat(dt("menubar.submenu.icon.size"), ";\n height: ").concat(dt("menubar.submenu.icon.size"), ";\n}\n\n.p-menubar-item.p-focus > .p-menubar-item-content {\n color: ").concat(dt("menubar.item.focus.color"), ";\n background: ").concat(dt("menubar.item.focus.background"), ";\n}\n\n.p-menubar-item.p-focus > .p-menubar-item-content .p-menubar-item-icon {\n color: ").concat(dt("menubar.item.icon.focus.color"), ";\n}\n\n.p-menubar-item.p-focus > .p-menubar-item-content .p-menubar-submenu-icon {\n color: ").concat(dt("menubar.submenu.icon.focus.color"), ";\n}\n\n.p-menubar-item:not(.p-disabled) > .p-menubar-item-content:hover {\n color: ").concat(dt("menubar.item.focus.color"), ";\n background: ").concat(dt("menubar.item.focus.background"), ";\n}\n\n.p-menubar-item:not(.p-disabled) > .p-menubar-item-content:hover .p-menubar-item-icon {\n color: ").concat(dt("menubar.item.icon.focus.color"), ";\n}\n\n.p-menubar-item:not(.p-disabled) > .p-menubar-item-content:hover .p-menubar-submenu-icon {\n color: ").concat(dt("menubar.submenu.icon.focus.color"), ";\n}\n\n.p-menubar-item-active > .p-menubar-item-content {\n color: ").concat(dt("menubar.item.active.color"), ";\n background: ").concat(dt("menubar.item.active.background"), ";\n}\n\n.p-menubar-item-active > .p-menubar-item-content .p-menubar-item-icon {\n color: ").concat(dt("menubar.item.icon.active.color"), ";\n}\n\n.p-menubar-item-active > .p-menubar-item-content .p-menubar-submenu-icon {\n color: ").concat(dt("menubar.submenu.icon.active.color"), ";\n}\n\n.p-menubar-submenu {\n display: none;\n position: absolute;\n min-width: 12.5rem;\n z-index: 1;\n background: ").concat(dt("menubar.submenu.background"), ";\n border: 1px solid ").concat(dt("menubar.submenu.border.color"), ";\n border-radius: ").concat(dt("menubar.border.radius"), ";\n box-shadow: ").concat(dt("menubar.submenu.shadow"), ";\n color: ").concat(dt("menubar.submenu.color"), ";\n flex-direction: column;\n padding: ").concat(dt("menubar.submenu.padding"), ";\n gap: ").concat(dt("menubar.submenu.gap"), ";\n}\n\n.p-menubar-submenu .p-menubar-separator {\n border-top: 1px solid ").concat(dt("menubar.separator.border.color"), ";\n}\n\n.p-menubar-submenu .p-menubar-item {\n position: relative;\n}\n\n .p-menubar-submenu > .p-menubar-item-active > .p-menubar-submenu {\n display: block;\n left: 100%;\n top: 0;\n}\n\n.p-menubar-end {\n margin-left: auto;\n align-self: center;\n}\n\n.p-menubar-button {\n display: none;\n justify-content: center;\n align-items: center;\n cursor: pointer;\n width: ").concat(dt("menubar.mobile.button.size"), ";\n height: ").concat(dt("menubar.mobile.button.size"), ";\n position: relative;\n color: ").concat(dt("menubar.mobile.button.color"), ";\n border: 0 none;\n background: transparent;\n border-radius: ").concat(dt("menubar.mobile.button.border.radius"), ";\n transition: background ").concat(dt("menubar.transition.duration"), ", color ").concat(dt("menubar.transition.duration"), ", outline-color ").concat(dt("menubar.transition.duration"), ";\n outline-color: transparent;\n}\n\n.p-menubar-button:hover {\n color: ").concat(dt("menubar.mobile.button.hover.color"), ";\n background: ").concat(dt("menubar.mobile.button.hover.background"), ";\n}\n\n.p-menubar-button:focus-visible {\n box-shadow: ").concat(dt("menubar.mobile.button.focus.ring.shadow"), ";\n outline: ").concat(dt("menubar.mobile.button.focus.ring.width"), " ").concat(dt("menubar.mobile.button.focus.ring.style"), " ").concat(dt("menubar.mobile.button.focus.ring.color"), ";\n outline-offset: ").concat(dt("menubar.mobile.button.focus.ring.offset"), ";\n}\n\n.p-menubar-mobile {\n position: relative;\n}\n\n.p-menubar-mobile .p-menubar-button {\n display: flex;\n}\n\n.p-menubar-mobile .p-menubar-root-list {\n position: absolute;\n display: none;\n width: 100%;\n padding: ").concat(dt("menubar.submenu.padding"), ";\n background: ").concat(dt("menubar.submenu.background"), ";\n border: 1px solid ").concat(dt("menubar.submenu.border.color"), ";\n box-shadow: ").concat(dt("menubar.submenu.shadow"), ";\n}\n\n.p-menubar-mobile .p-menubar-root-list > .p-menubar-item > .p-menubar-item-content {\n border-radius: ").concat(dt("menubar.item.border.radius"), ";\n}\n\n.p-menubar-mobile .p-menubar-root-list > .p-menubar-item > .p-menubar-item-content > .p-menubar-item-link {\n padding: ").concat(dt("menubar.item.padding"), ";\n}\n\n.p-menubar-mobile-active .p-menubar-root-list {\n display: flex;\n flex-direction: column;\n top: 100%;\n left: 0;\n z-index: 1;\n}\n\n.p-menubar-mobile .p-menubar-root-list .p-menubar-item {\n width: 100%;\n position: static;\n}\n\n.p-menubar-mobile .p-menubar-root-list .p-menubar-separator {\n border-top: 1px solid ").concat(dt("menubar.separator.border.color"), ";\n}\n\n.p-menubar-mobile .p-menubar-root-list > .p-menubar-item > .p-menubar-item-content .p-menubar-submenu-icon {\n margin-left: auto;\n transition: transform 0.2s;\n}\n\n.p-menubar-mobile .p-menubar-root-list > .p-menubar-item-active > .p-menubar-item-content .p-menubar-submenu-icon {\n transform: rotate(-180deg);\n}\n\n.p-menubar-mobile .p-menubar-submenu .p-menubar-submenu-icon {\n transition: transform 0.2s;\n transform: rotate(90deg);\n}\n\n.p-menubar-mobile .p-menubar-item-active > .p-menubar-item-content .p-menubar-submenu-icon {\n transform: rotate(-90deg);\n}\n\n.p-menubar-mobile .p-menubar-submenu {\n width: 100%;\n position: static;\n box-shadow: none;\n border: 0 none;\n padding-left: ").concat(dt("menubar.submenu.mobile.indent"), ";\n}\n"); }, "theme"); -var classes$1 = { - root: /* @__PURE__ */ __name(function root9(_ref2) { - var instance = _ref2.instance, props = _ref2.props; - return ["p-splitbutton p-component", { - "p-splitbutton-raised": props.raised, - "p-splitbutton-rounded": props.rounded, - "p-splitbutton-fluid": instance.hasFluid +var inlineStyles$1 = { + submenu: /* @__PURE__ */ __name(function submenu(_ref2) { + var instance = _ref2.instance, processedItem = _ref2.processedItem; + return { + display: instance.isItemActive(processedItem) ? "flex" : "none" + }; + }, "submenu") +}; +var classes$3 = { + root: /* @__PURE__ */ __name(function root8(_ref3) { + var instance = _ref3.instance; + return ["p-menubar p-component", { + "p-menubar-mobile": instance.queryMatches, + "p-menubar-mobile-active": instance.mobileActive }]; }, "root"), - pcButton: "p-splitbutton-button", - pcDropdown: "p-splitbutton-dropdown" + start: "p-menubar-start", + button: "p-menubar-button", + rootList: "p-menubar-root-list", + item: /* @__PURE__ */ __name(function item(_ref4) { + var instance = _ref4.instance, processedItem = _ref4.processedItem; + return ["p-menubar-item", { + "p-menubar-item-active": instance.isItemActive(processedItem), + "p-focus": instance.isItemFocused(processedItem), + "p-disabled": instance.isItemDisabled(processedItem) + }]; + }, "item"), + itemContent: "p-menubar-item-content", + itemLink: "p-menubar-item-link", + itemIcon: "p-menubar-item-icon", + itemLabel: "p-menubar-item-label", + submenuIcon: "p-menubar-submenu-icon", + submenu: "p-menubar-submenu", + separator: "p-menubar-separator", + end: "p-menubar-end" }; -var SplitButtonStyle = BaseStyle.extend({ - name: "splitbutton", - theme: theme$1, - classes: classes$1 +var MenubarStyle = BaseStyle.extend({ + name: "menubar", + theme: theme$3, + classes: classes$3, + inlineStyles: inlineStyles$1 }); -var script$1$1 = { - name: "BaseSplitButton", - "extends": script$e, +var script$2$1 = { + name: "BaseMenubar", + "extends": script$g, props: { - label: { - type: String, - "default": null - }, - icon: { - type: String, - "default": null - }, model: { type: Array, "default": null }, - autoZIndex: { - type: Boolean, - "default": true - }, - baseZIndex: { - type: Number, - "default": 0 - }, - appendTo: { - type: [String, Object], - "default": "body" - }, - disabled: { - type: Boolean, - "default": false - }, - fluid: { - type: Boolean, - "default": null - }, - "class": { - type: null, - "default": null - }, - style: { - type: null, - "default": null - }, buttonProps: { type: null, "default": null }, - menuButtonProps: { - type: null, - "default": null - }, - menuButtonIcon: { + breakpoint: { type: String, - "default": void 0 + "default": "960px" }, - dropdownIcon: { + ariaLabelledby: { type: String, - "default": void 0 + "default": null }, - severity: { + ariaLabel: { type: String, "default": null + } + }, + style: MenubarStyle, + provide: /* @__PURE__ */ __name(function provide10() { + return { + $pcMenubar: this, + $parentInstance: this + }; + }, "provide") +}; +var script$1$3 = { + name: "MenubarSub", + hostName: "Menubar", + "extends": script$g, + emits: ["item-mouseenter", "item-click", "item-mousemove"], + props: { + items: { + type: Array, + "default": null }, - raised: { + root: { type: Boolean, "default": false }, - rounded: { + popup: { type: Boolean, "default": false }, - text: { + mobileActive: { type: Boolean, "default": false }, - outlined: { - type: Boolean, - "default": false + templates: { + type: Object, + "default": null }, - size: { + level: { + type: Number, + "default": 0 + }, + menuId: { type: String, "default": null }, - plain: { - type: Boolean, - "default": false - } - }, - style: SplitButtonStyle, - provide: /* @__PURE__ */ __name(function provide11() { - return { - $pcSplitButton: this, - $parentInstance: this - }; - }, "provide") -}; -var script$3 = { - name: "SplitButton", - "extends": script$1$1, - inheritAttrs: false, - emits: ["click"], - inject: { - $pcFluid: { + focusedItemId: { + type: String, + "default": null + }, + activeItemPath: { + type: Object, "default": null } }, - data: /* @__PURE__ */ __name(function data7() { - return { - id: this.$attrs.id, - isExpanded: false - }; - }, "data"), - watch: { - "$attrs.id": /* @__PURE__ */ __name(function $attrsId3(newValue) { - this.id = newValue || UniqueComponentId(); - }, "$attrsId") - }, - mounted: /* @__PURE__ */ __name(function mounted7() { - var _this = this; - this.id = this.id || UniqueComponentId(); - this.$watch("$refs.menu.visible", function(newValue) { - _this.isExpanded = newValue; - }); - }, "mounted"), + list: null, methods: { - onDropdownButtonClick: /* @__PURE__ */ __name(function onDropdownButtonClick(event) { - if (event) { - event.preventDefault(); - } - this.$refs.menu.toggle({ - currentTarget: this.$el, - relatedTarget: this.$refs.button.$el + getItemId: /* @__PURE__ */ __name(function getItemId(processedItem) { + return "".concat(this.menuId, "_").concat(processedItem.key); + }, "getItemId"), + getItemKey: /* @__PURE__ */ __name(function getItemKey(processedItem) { + return this.getItemId(processedItem); + }, "getItemKey"), + getItemProp: /* @__PURE__ */ __name(function getItemProp(processedItem, name, params) { + return processedItem && processedItem.item ? resolve(processedItem.item[name], params) : void 0; + }, "getItemProp"), + getItemLabel: /* @__PURE__ */ __name(function getItemLabel(processedItem) { + return this.getItemProp(processedItem, "label"); + }, "getItemLabel"), + getItemLabelId: /* @__PURE__ */ __name(function getItemLabelId(processedItem) { + return "".concat(this.menuId, "_").concat(processedItem.key, "_label"); + }, "getItemLabelId"), + getPTOptions: /* @__PURE__ */ __name(function getPTOptions4(processedItem, index, key) { + return this.ptm(key, { + context: { + item: processedItem.item, + index, + active: this.isItemActive(processedItem), + focused: this.isItemFocused(processedItem), + disabled: this.isItemDisabled(processedItem), + level: this.level + } }); - this.isExpanded = this.$refs.menu.visible; - }, "onDropdownButtonClick"), - onDropdownKeydown: /* @__PURE__ */ __name(function onDropdownKeydown(event) { - if (event.code === "ArrowDown" || event.code === "ArrowUp") { - this.onDropdownButtonClick(); - event.preventDefault(); - } - }, "onDropdownKeydown"), - onDefaultButtonClick: /* @__PURE__ */ __name(function onDefaultButtonClick(event) { - if (this.isExpanded) { - this.$refs.menu.hide(event); - } - this.$emit("click", event); - }, "onDefaultButtonClick") + }, "getPTOptions"), + isItemActive: /* @__PURE__ */ __name(function isItemActive(processedItem) { + return this.activeItemPath.some(function(path) { + return path.key === processedItem.key; + }); + }, "isItemActive"), + isItemVisible: /* @__PURE__ */ __name(function isItemVisible(processedItem) { + return this.getItemProp(processedItem, "visible") !== false; + }, "isItemVisible"), + isItemDisabled: /* @__PURE__ */ __name(function isItemDisabled(processedItem) { + return this.getItemProp(processedItem, "disabled"); + }, "isItemDisabled"), + isItemFocused: /* @__PURE__ */ __name(function isItemFocused(processedItem) { + return this.focusedItemId === this.getItemId(processedItem); + }, "isItemFocused"), + isItemGroup: /* @__PURE__ */ __name(function isItemGroup(processedItem) { + return isNotEmpty(processedItem.items); + }, "isItemGroup"), + onItemClick: /* @__PURE__ */ __name(function onItemClick(event, processedItem) { + this.getItemProp(processedItem, "command", { + originalEvent: event, + item: processedItem.item + }); + this.$emit("item-click", { + originalEvent: event, + processedItem, + isFocus: true + }); + }, "onItemClick"), + onItemMouseEnter: /* @__PURE__ */ __name(function onItemMouseEnter(event, processedItem) { + this.$emit("item-mouseenter", { + originalEvent: event, + processedItem + }); + }, "onItemMouseEnter"), + onItemMouseMove: /* @__PURE__ */ __name(function onItemMouseMove(event, processedItem) { + this.$emit("item-mousemove", { + originalEvent: event, + processedItem + }); + }, "onItemMouseMove"), + getAriaPosInset: /* @__PURE__ */ __name(function getAriaPosInset2(index) { + return index - this.calculateAriaSetSize.slice(0, index).length + 1; + }, "getAriaPosInset"), + getMenuItemProps: /* @__PURE__ */ __name(function getMenuItemProps(processedItem, index) { + return { + action: mergeProps({ + "class": this.cx("itemLink"), + tabindex: -1, + "aria-hidden": true + }, this.getPTOptions(processedItem, index, "itemLink")), + icon: mergeProps({ + "class": [this.cx("itemIcon"), this.getItemProp(processedItem, "icon")] + }, this.getPTOptions(processedItem, index, "itemIcon")), + label: mergeProps({ + "class": this.cx("itemLabel") + }, this.getPTOptions(processedItem, index, "itemLabel")), + submenuicon: mergeProps({ + "class": this.cx("submenuIcon") + }, this.getPTOptions(processedItem, index, "submenuIcon")) + }; + }, "getMenuItemProps") }, computed: { - containerClass: /* @__PURE__ */ __name(function containerClass() { - return [this.cx("root"), this["class"]]; - }, "containerClass"), - hasFluid: /* @__PURE__ */ __name(function hasFluid2() { - return isEmpty(this.fluid) ? !!this.$pcFluid : this.fluid; - }, "hasFluid") + calculateAriaSetSize: /* @__PURE__ */ __name(function calculateAriaSetSize() { + var _this = this; + return this.items.filter(function(processedItem) { + return _this.isItemVisible(processedItem) && _this.getItemProp(processedItem, "separator"); + }); + }, "calculateAriaSetSize"), + getAriaSetSize: /* @__PURE__ */ __name(function getAriaSetSize() { + var _this2 = this; + return this.items.filter(function(processedItem) { + return _this2.isItemVisible(processedItem) && !_this2.getItemProp(processedItem, "separator"); + }).length; + }, "getAriaSetSize") }, components: { - PVSButton: script$d, - PVSMenu: script$4, - ChevronDownIcon: script$l + AngleRightIcon: script$z, + AngleDownIcon: script$A + }, + directives: { + ripple: Ripple } }; -var _hoisted_1$7 = ["data-p-severity"]; -function render$4(_ctx, _cache, $props, $setup, $data, $options) { - var _component_PVSButton = resolveComponent("PVSButton"); - var _component_PVSMenu = resolveComponent("PVSMenu"); - return openBlock(), createElementBlock("div", mergeProps({ - "class": $options.containerClass, - style: _ctx.style - }, _ctx.ptmi("root"), { - "data-p-severity": _ctx.severity - }), [createVNode(_component_PVSButton, mergeProps({ - type: "button", - "class": _ctx.cx("pcButton"), - label: _ctx.label, - disabled: _ctx.disabled, - severity: _ctx.severity, - text: _ctx.text, - icon: _ctx.icon, - outlined: _ctx.outlined, - size: _ctx.size, - fluid: _ctx.fluid, - "aria-label": _ctx.label, - onClick: $options.onDefaultButtonClick - }, _ctx.buttonProps, { - pt: _ctx.ptm("pcButton"), - unstyled: _ctx.unstyled - }), createSlots({ - "default": withCtx(function() { - return [renderSlot(_ctx.$slots, "default")]; - }), - _: 2 - }, [_ctx.$slots.icon ? { - name: "icon", - fn: withCtx(function(slotProps) { - return [renderSlot(_ctx.$slots, "icon", { - "class": normalizeClass(slotProps["class"]) - }, function() { - return [createBaseVNode("span", mergeProps({ - "class": [_ctx.icon, slotProps["class"]] - }, _ctx.ptm("pcButton")["icon"], { - "data-pc-section": "buttonicon" - }), null, 16)]; - })]; - }), - key: "0" - } : void 0]), 1040, ["class", "label", "disabled", "severity", "text", "icon", "outlined", "size", "fluid", "aria-label", "onClick", "pt", "unstyled"]), createVNode(_component_PVSButton, mergeProps({ - ref: "button", - type: "button", - "class": _ctx.cx("pcDropdown"), - disabled: _ctx.disabled, - "aria-haspopup": "true", - "aria-expanded": $data.isExpanded, - "aria-controls": $data.id + "_overlay", - onClick: $options.onDropdownButtonClick, - onKeydown: $options.onDropdownKeydown, - severity: _ctx.severity, - text: _ctx.text, - outlined: _ctx.outlined, - size: _ctx.size, - unstyled: _ctx.unstyled - }, _ctx.menuButtonProps, { - pt: _ctx.ptm("pcDropdown") - }), { - icon: withCtx(function(slotProps) { - return [renderSlot(_ctx.$slots, _ctx.$slots.dropdownicon ? "dropdownicon" : "menubuttonicon", { - "class": normalizeClass(slotProps["class"]) - }, function() { - return [(openBlock(), createBlock(resolveDynamicComponent(_ctx.menuButtonIcon || _ctx.dropdownIcon ? "span" : "ChevronDownIcon"), mergeProps({ - "class": [_ctx.dropdownIcon || _ctx.menuButtonIcon, slotProps["class"]] - }, _ctx.ptm("pcDropdown")["icon"], { - "data-pc-section": "menubuttonicon" - }), null, 16, ["class"]))]; - })]; - }), - _: 3 - }, 16, ["class", "disabled", "aria-expanded", "aria-controls", "onClick", "onKeydown", "severity", "text", "outlined", "size", "unstyled", "pt"]), createVNode(_component_PVSMenu, { - ref: "menu", - id: $data.id + "_overlay", - model: _ctx.model, - popup: true, - autoZIndex: _ctx.autoZIndex, - baseZIndex: _ctx.baseZIndex, - appendTo: _ctx.appendTo, - unstyled: _ctx.unstyled, - pt: _ctx.ptm("pcMenu") - }, createSlots({ - _: 2 - }, [_ctx.$slots.menuitemicon ? { - name: "itemicon", - fn: withCtx(function(slotProps) { - return [renderSlot(_ctx.$slots, "menuitemicon", { - item: slotProps.item, - "class": normalizeClass(slotProps["class"]) - })]; - }), - key: "0" - } : void 0, _ctx.$slots.item ? { - name: "item", - fn: withCtx(function(slotProps) { - return [renderSlot(_ctx.$slots, "item", { - item: slotProps.item, - hasSubmenu: slotProps.hasSubmenu, - label: slotProps.label, - props: slotProps.props - })]; - }), - key: "1" - } : void 0]), 1032, ["id", "model", "autoZIndex", "baseZIndex", "appendTo", "unstyled", "pt"])], 16, _hoisted_1$7); +var _hoisted_1$1$2 = ["id", "aria-label", "aria-disabled", "aria-expanded", "aria-haspopup", "aria-level", "aria-setsize", "aria-posinset", "data-p-active", "data-p-focused", "data-p-disabled"]; +var _hoisted_2$a = ["onClick", "onMouseenter", "onMousemove"]; +var _hoisted_3$8 = ["href", "target"]; +var _hoisted_4$1 = ["id"]; +var _hoisted_5$1 = ["id"]; +function render$1$2(_ctx, _cache, $props, $setup, $data, $options) { + var _component_MenubarSub = resolveComponent("MenubarSub", true); + var _directive_ripple = resolveDirective("ripple"); + return openBlock(), createElementBlock("ul", mergeProps({ + "class": $props.level === 0 ? _ctx.cx("rootList") : _ctx.cx("submenu") + }, $props.level === 0 ? _ctx.ptm("rootList") : _ctx.ptm("submenu")), [(openBlock(true), createElementBlock(Fragment, null, renderList($props.items, function(processedItem, index) { + return openBlock(), createElementBlock(Fragment, { + key: $options.getItemKey(processedItem) + }, [$options.isItemVisible(processedItem) && !$options.getItemProp(processedItem, "separator") ? (openBlock(), createElementBlock("li", mergeProps({ + key: 0, + id: $options.getItemId(processedItem), + style: $options.getItemProp(processedItem, "style"), + "class": [_ctx.cx("item", { + processedItem + }), $options.getItemProp(processedItem, "class")], + role: "menuitem", + "aria-label": $options.getItemLabel(processedItem), + "aria-disabled": $options.isItemDisabled(processedItem) || void 0, + "aria-expanded": $options.isItemGroup(processedItem) ? $options.isItemActive(processedItem) : void 0, + "aria-haspopup": $options.isItemGroup(processedItem) && !$options.getItemProp(processedItem, "to") ? "menu" : void 0, + "aria-level": $props.level + 1, + "aria-setsize": $options.getAriaSetSize, + "aria-posinset": $options.getAriaPosInset(index), + ref_for: true + }, $options.getPTOptions(processedItem, index, "item"), { + "data-p-active": $options.isItemActive(processedItem), + "data-p-focused": $options.isItemFocused(processedItem), + "data-p-disabled": $options.isItemDisabled(processedItem) + }), [createBaseVNode("div", mergeProps({ + "class": _ctx.cx("itemContent"), + onClick: /* @__PURE__ */ __name(function onClick2($event) { + return $options.onItemClick($event, processedItem); + }, "onClick"), + onMouseenter: /* @__PURE__ */ __name(function onMouseenter($event) { + return $options.onItemMouseEnter($event, processedItem); + }, "onMouseenter"), + onMousemove: /* @__PURE__ */ __name(function onMousemove($event) { + return $options.onItemMouseMove($event, processedItem); + }, "onMousemove"), + ref_for: true + }, $options.getPTOptions(processedItem, index, "itemContent")), [!$props.templates.item ? withDirectives((openBlock(), createElementBlock("a", mergeProps({ + key: 0, + href: $options.getItemProp(processedItem, "url"), + "class": _ctx.cx("itemLink"), + target: $options.getItemProp(processedItem, "target"), + tabindex: "-1", + ref_for: true + }, $options.getPTOptions(processedItem, index, "itemLink")), [$props.templates.itemicon ? (openBlock(), createBlock(resolveDynamicComponent($props.templates.itemicon), { + key: 0, + item: processedItem.item, + "class": normalizeClass(_ctx.cx("itemIcon")) + }, null, 8, ["item", "class"])) : $options.getItemProp(processedItem, "icon") ? (openBlock(), createElementBlock("span", mergeProps({ + key: 1, + "class": [_ctx.cx("itemIcon"), $options.getItemProp(processedItem, "icon")], + ref_for: true + }, $options.getPTOptions(processedItem, index, "itemIcon")), null, 16)) : createCommentVNode("", true), createBaseVNode("span", mergeProps({ + id: $options.getItemLabelId(processedItem), + "class": _ctx.cx("itemLabel"), + ref_for: true + }, $options.getPTOptions(processedItem, index, "itemLabel")), toDisplayString($options.getItemLabel(processedItem)), 17, _hoisted_4$1), $options.getItemProp(processedItem, "items") ? (openBlock(), createElementBlock(Fragment, { + key: 2 + }, [$props.templates.submenuicon ? (openBlock(), createBlock(resolveDynamicComponent($props.templates.submenuicon), { + key: 0, + root: $props.root, + active: $options.isItemActive(processedItem), + "class": normalizeClass(_ctx.cx("submenuIcon")) + }, null, 8, ["root", "active", "class"])) : (openBlock(), createBlock(resolveDynamicComponent($props.root ? "AngleDownIcon" : "AngleRightIcon"), mergeProps({ + key: 1, + "class": _ctx.cx("submenuIcon"), + ref_for: true + }, $options.getPTOptions(processedItem, index, "submenuIcon")), null, 16, ["class"]))], 64)) : createCommentVNode("", true)], 16, _hoisted_3$8)), [[_directive_ripple]]) : (openBlock(), createBlock(resolveDynamicComponent($props.templates.item), { + key: 1, + item: processedItem.item, + root: $props.root, + hasSubmenu: $options.getItemProp(processedItem, "items"), + label: $options.getItemLabel(processedItem), + props: $options.getMenuItemProps(processedItem, index) + }, null, 8, ["item", "root", "hasSubmenu", "label", "props"]))], 16, _hoisted_2$a), $options.isItemVisible(processedItem) && $options.isItemGroup(processedItem) ? (openBlock(), createBlock(_component_MenubarSub, { + key: 0, + id: $options.getItemId(processedItem) + "_list", + menuId: $props.menuId, + role: "menu", + style: normalizeStyle(_ctx.sx("submenu", true, { + processedItem + })), + focusedItemId: $props.focusedItemId, + items: processedItem.items, + mobileActive: $props.mobileActive, + activeItemPath: $props.activeItemPath, + templates: $props.templates, + level: $props.level + 1, + "aria-labelledby": $options.getItemLabelId(processedItem), + pt: _ctx.pt, + unstyled: _ctx.unstyled, + onItemClick: _cache[0] || (_cache[0] = function($event) { + return _ctx.$emit("item-click", $event); + }), + onItemMouseenter: _cache[1] || (_cache[1] = function($event) { + return _ctx.$emit("item-mouseenter", $event); + }), + onItemMousemove: _cache[2] || (_cache[2] = function($event) { + return _ctx.$emit("item-mousemove", $event); + }) + }, null, 8, ["id", "menuId", "style", "focusedItemId", "items", "mobileActive", "activeItemPath", "templates", "level", "aria-labelledby", "pt", "unstyled"])) : createCommentVNode("", true)], 16, _hoisted_1$1$2)) : createCommentVNode("", true), $options.isItemVisible(processedItem) && $options.getItemProp(processedItem, "separator") ? (openBlock(), createElementBlock("li", mergeProps({ + key: 1, + id: $options.getItemId(processedItem), + "class": [_ctx.cx("separator"), $options.getItemProp(processedItem, "class")], + style: $options.getItemProp(processedItem, "style"), + role: "separator", + ref_for: true + }, _ctx.ptm("separator")), null, 16, _hoisted_5$1)) : createCommentVNode("", true)], 64); + }), 128))], 16); } -__name(render$4, "render$4"); -script$3.render = render$4; -const minQueueCount = 1; -const _sfc_main$8 = /* @__PURE__ */ defineComponent({ - __name: "BatchCountEdit", - props: { - class: { default: "" } +__name(render$1$2, "render$1$2"); +script$1$3.render = render$1$2; +var script$5 = { + name: "Menubar", + "extends": script$2$1, + inheritAttrs: false, + emits: ["focus", "blur"], + matchMediaListener: null, + data: /* @__PURE__ */ __name(function data6() { + return { + id: this.$attrs.id, + mobileActive: false, + focused: false, + focusedItemInfo: { + index: -1, + level: 0, + parentKey: "" + }, + activeItemPath: [], + dirty: false, + query: null, + queryMatches: false + }; + }, "data"), + watch: { + "$attrs.id": /* @__PURE__ */ __name(function $attrsId2(newValue) { + this.id = newValue || UniqueComponentId(); + }, "$attrsId"), + activeItemPath: /* @__PURE__ */ __name(function activeItemPath(newPath) { + if (isNotEmpty(newPath)) { + this.bindOutsideClickListener(); + this.bindResizeListener(); + } else { + this.unbindOutsideClickListener(); + this.unbindResizeListener(); + } + }, "activeItemPath") }, - setup(__props) { - const props = __props; - const queueSettingsStore = useQueueSettingsStore(); - const { batchCount } = storeToRefs(queueSettingsStore); - const settingStore = useSettingStore(); - const maxQueueCount = computed( - () => settingStore.get("Comfy.QueueButton.BatchCountLimit") - ); - const handleClick = /* @__PURE__ */ __name((increment) => { - let newCount; - if (increment) { - const originalCount = batchCount.value - 1; - newCount = Math.min(originalCount * 2, maxQueueCount.value); + outsideClickListener: null, + container: null, + menubar: null, + mounted: /* @__PURE__ */ __name(function mounted6() { + this.id = this.id || UniqueComponentId(); + this.bindMatchMediaListener(); + }, "mounted"), + beforeUnmount: /* @__PURE__ */ __name(function beforeUnmount6() { + this.mobileActive = false; + this.unbindOutsideClickListener(); + this.unbindResizeListener(); + this.unbindMatchMediaListener(); + if (this.container) { + ZIndex.clear(this.container); + } + this.container = null; + }, "beforeUnmount"), + methods: { + getItemProp: /* @__PURE__ */ __name(function getItemProp2(item3, name) { + return item3 ? resolve(item3[name]) : void 0; + }, "getItemProp"), + getItemLabel: /* @__PURE__ */ __name(function getItemLabel2(item3) { + return this.getItemProp(item3, "label"); + }, "getItemLabel"), + isItemDisabled: /* @__PURE__ */ __name(function isItemDisabled2(item3) { + return this.getItemProp(item3, "disabled"); + }, "isItemDisabled"), + isItemVisible: /* @__PURE__ */ __name(function isItemVisible2(item3) { + return this.getItemProp(item3, "visible") !== false; + }, "isItemVisible"), + isItemGroup: /* @__PURE__ */ __name(function isItemGroup2(item3) { + return isNotEmpty(this.getItemProp(item3, "items")); + }, "isItemGroup"), + isItemSeparator: /* @__PURE__ */ __name(function isItemSeparator(item3) { + return this.getItemProp(item3, "separator"); + }, "isItemSeparator"), + getProccessedItemLabel: /* @__PURE__ */ __name(function getProccessedItemLabel(processedItem) { + return processedItem ? this.getItemLabel(processedItem.item) : void 0; + }, "getProccessedItemLabel"), + isProccessedItemGroup: /* @__PURE__ */ __name(function isProccessedItemGroup(processedItem) { + return processedItem && isNotEmpty(processedItem.items); + }, "isProccessedItemGroup"), + toggle: /* @__PURE__ */ __name(function toggle(event) { + var _this = this; + if (this.mobileActive) { + this.mobileActive = false; + ZIndex.clear(this.menubar); + this.hide(); } else { - const originalCount = batchCount.value + 1; - newCount = Math.floor(originalCount / 2); + this.mobileActive = true; + ZIndex.set("menu", this.menubar, this.$primevue.config.zIndex.menu); + setTimeout(function() { + _this.show(); + }, 1); + } + this.bindOutsideClickListener(); + event.preventDefault(); + }, "toggle"), + show: /* @__PURE__ */ __name(function show2() { + focus(this.menubar); + }, "show"), + hide: /* @__PURE__ */ __name(function hide2(event, isFocus) { + var _this2 = this; + if (this.mobileActive) { + this.mobileActive = false; + setTimeout(function() { + focus(_this2.$refs.menubutton); + }, 0); + } + this.activeItemPath = []; + this.focusedItemInfo = { + index: -1, + level: 0, + parentKey: "" + }; + isFocus && focus(this.menubar); + this.dirty = false; + }, "hide"), + onFocus: /* @__PURE__ */ __name(function onFocus3(event) { + this.focused = true; + this.focusedItemInfo = this.focusedItemInfo.index !== -1 ? this.focusedItemInfo : { + index: this.findFirstFocusedItemIndex(), + level: 0, + parentKey: "" + }; + this.$emit("focus", event); + }, "onFocus"), + onBlur: /* @__PURE__ */ __name(function onBlur2(event) { + this.focused = false; + this.focusedItemInfo = { + index: -1, + level: 0, + parentKey: "" + }; + this.searchValue = ""; + this.dirty = false; + this.$emit("blur", event); + }, "onBlur"), + onKeyDown: /* @__PURE__ */ __name(function onKeyDown2(event) { + var metaKey = event.metaKey || event.ctrlKey; + switch (event.code) { + case "ArrowDown": + this.onArrowDownKey(event); + break; + case "ArrowUp": + this.onArrowUpKey(event); + break; + case "ArrowLeft": + this.onArrowLeftKey(event); + break; + case "ArrowRight": + this.onArrowRightKey(event); + break; + case "Home": + this.onHomeKey(event); + break; + case "End": + this.onEndKey(event); + break; + case "Space": + this.onSpaceKey(event); + break; + case "Enter": + case "NumpadEnter": + this.onEnterKey(event); + break; + case "Escape": + this.onEscapeKey(event); + break; + case "Tab": + this.onTabKey(event); + break; + case "PageDown": + case "PageUp": + case "Backspace": + case "ShiftLeft": + case "ShiftRight": + break; + default: + if (!metaKey && isPrintableCharacter(event.key)) { + this.searchItems(event, event.key); + } + break; + } + }, "onKeyDown"), + onItemChange: /* @__PURE__ */ __name(function onItemChange(event) { + var processedItem = event.processedItem, isFocus = event.isFocus; + if (isEmpty(processedItem)) return; + var index = processedItem.index, key = processedItem.key, level = processedItem.level, parentKey = processedItem.parentKey, items = processedItem.items; + var grouped = isNotEmpty(items); + var activeItemPath3 = this.activeItemPath.filter(function(p) { + return p.parentKey !== parentKey && p.parentKey !== key; + }); + grouped && activeItemPath3.push(processedItem); + this.focusedItemInfo = { + index, + level, + parentKey + }; + this.activeItemPath = activeItemPath3; + grouped && (this.dirty = true); + isFocus && focus(this.menubar); + }, "onItemChange"), + onItemClick: /* @__PURE__ */ __name(function onItemClick2(event) { + var originalEvent = event.originalEvent, processedItem = event.processedItem; + var grouped = this.isProccessedItemGroup(processedItem); + var root12 = isEmpty(processedItem.parent); + var selected = this.isSelected(processedItem); + if (selected) { + var index = processedItem.index, key = processedItem.key, level = processedItem.level, parentKey = processedItem.parentKey; + this.activeItemPath = this.activeItemPath.filter(function(p) { + return key !== p.key && key.startsWith(p.key); + }); + this.focusedItemInfo = { + index, + level, + parentKey + }; + this.dirty = !root12; + focus(this.menubar); + } else { + if (grouped) { + this.onItemChange(event); + } else { + var rootProcessedItem = root12 ? processedItem : this.activeItemPath.find(function(p) { + return p.parentKey === ""; + }); + this.hide(originalEvent); + this.changeFocusedItemIndex(originalEvent, rootProcessedItem ? rootProcessedItem.index : -1); + this.mobileActive = false; + focus(this.menubar); + } + } + }, "onItemClick"), + onItemMouseEnter: /* @__PURE__ */ __name(function onItemMouseEnter2(event) { + if (this.dirty) { + this.onItemChange(event); } - batchCount.value = newCount; - }, "handleClick"); - return (_ctx, _cache) => { - const _directive_tooltip = resolveDirective("tooltip"); - return withDirectives((openBlock(), createElementBlock("div", { - class: normalizeClass(["batch-count", props.class]) - }, [ - createVNode(unref(script$x), { - class: "w-14", - modelValue: unref(batchCount), - "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => isRef(batchCount) ? batchCount.value = $event : null), - min: minQueueCount, - max: maxQueueCount.value, - fluid: "", - showButtons: "", - pt: { - incrementButton: { - class: "w-6", - onmousedown: /* @__PURE__ */ __name(() => { - handleClick(true); - }, "onmousedown") - }, - decrementButton: { - class: "w-6", - onmousedown: /* @__PURE__ */ __name(() => { - handleClick(false); - }, "onmousedown") - } - } - }, null, 8, ["modelValue", "max", "pt"]) - ], 2)), [ - [ - _directive_tooltip, - _ctx.$t("menu.batchCount"), - void 0, - { bottom: true } - ] - ]); - }; - } -}); -const BatchCountEdit = /* @__PURE__ */ _export_sfc(_sfc_main$8, [["__scopeId", "data-v-b9328350"]]); -const _withScopeId$3 = /* @__PURE__ */ __name((n) => (pushScopeId("data-v-7f4f551b"), n = n(), popScopeId(), n), "_withScopeId$3"); -const _hoisted_1$6 = { class: "queue-button-group flex" }; -const _sfc_main$7 = /* @__PURE__ */ defineComponent({ - __name: "ComfyQueueButton", - setup(__props) { - const workspaceStore = useWorkspaceStore(); - const queueCountStore = storeToRefs(useQueuePendingTaskCountStore()); - const { mode: queueMode } = storeToRefs(useQueueSettingsStore()); - const { t } = useI18n(); - const queueModeMenuItemLookup = computed(() => ({ - disabled: { - key: "disabled", - label: t("menu.queue"), - tooltip: t("menu.disabledTooltip"), - command: /* @__PURE__ */ __name(() => { - queueMode.value = "disabled"; - }, "command") - }, - instant: { - key: "instant", - label: `${t("menu.queue")} (${t("menu.instant")})`, - tooltip: t("menu.instantTooltip"), - command: /* @__PURE__ */ __name(() => { - queueMode.value = "instant"; - }, "command") - }, - change: { - key: "change", - label: `${t("menu.queue")} (${t("menu.onChange")})`, - tooltip: t("menu.onChangeTooltip"), - command: /* @__PURE__ */ __name(() => { - queueMode.value = "change"; - }, "command") + }, "onItemMouseEnter"), + onItemMouseMove: /* @__PURE__ */ __name(function onItemMouseMove2(event) { + if (this.focused) { + this.changeFocusedItemIndex(event, event.processedItem.index); } - })); - const activeQueueModeMenuItem = computed( - () => queueModeMenuItemLookup.value[queueMode.value] - ); - const queueModeMenuItems = computed( - () => Object.values(queueModeMenuItemLookup.value) - ); - const executingPrompt = computed(() => !!queueCountStore.count.value); - const hasPendingTasks = computed(() => queueCountStore.count.value > 1); - const commandStore = useCommandStore(); - const queuePrompt = /* @__PURE__ */ __name((e) => { - const commandId = e.shiftKey ? "Comfy.QueuePromptFront" : "Comfy.QueuePrompt"; - commandStore.execute(commandId); - }, "queuePrompt"); - return (_ctx, _cache) => { - const _component_i_lucide58list_start = __unplugin_components_0$1; - const _component_i_lucide58play = __unplugin_components_1$1; - const _component_i_lucide58fast_forward = __unplugin_components_2; - const _component_i_lucide58step_forward = __unplugin_components_3; - const _directive_tooltip = resolveDirective("tooltip"); - return openBlock(), createElementBlock("div", _hoisted_1$6, [ - withDirectives((openBlock(), createBlock(unref(script$3), { - class: "comfyui-queue-button", - label: activeQueueModeMenuItem.value.label, - severity: "primary", - size: "small", - onClick: queuePrompt, - model: queueModeMenuItems.value, - "data-testid": "queue-button" - }, { - icon: withCtx(() => [ - unref(workspaceStore).shiftDown ? (openBlock(), createBlock(_component_i_lucide58list_start, { key: 0 })) : unref(queueMode) === "disabled" ? (openBlock(), createBlock(_component_i_lucide58play, { key: 1 })) : unref(queueMode) === "instant" ? (openBlock(), createBlock(_component_i_lucide58fast_forward, { key: 2 })) : unref(queueMode) === "change" ? (openBlock(), createBlock(_component_i_lucide58step_forward, { key: 3 })) : createCommentVNode("", true) - ]), - item: withCtx(({ item: item3 }) => [ - withDirectives(createVNode(unref(script$d), { - label: item3.label, - icon: item3.icon, - severity: item3.key === unref(queueMode) ? "primary" : "secondary", - size: "small", - text: "" - }, null, 8, ["label", "icon", "severity"]), [ - [_directive_tooltip, item3.tooltip] - ]) - ]), - _: 1 - }, 8, ["label", "model"])), [ - [ - _directive_tooltip, - unref(workspaceStore).shiftDown ? _ctx.$t("menu.queueWorkflowFront") : _ctx.$t("menu.queueWorkflow"), - void 0, - { bottom: true } - ] - ]), - createVNode(BatchCountEdit), - createVNode(unref(script$8), { class: "execution-actions flex flex-nowrap" }, { - default: withCtx(() => [ - withDirectives(createVNode(unref(script$d), { - icon: "pi pi-times", - severity: executingPrompt.value ? "danger" : "secondary", - disabled: !executingPrompt.value, - text: "", - onClick: _cache[0] || (_cache[0] = () => unref(commandStore).execute("Comfy.Interrupt")) - }, null, 8, ["severity", "disabled"]), [ - [ - _directive_tooltip, - _ctx.$t("menu.interrupt"), - void 0, - { bottom: true } - ] - ]), - withDirectives(createVNode(unref(script$d), { - icon: "pi pi-stop", - severity: hasPendingTasks.value ? "danger" : "secondary", - disabled: !hasPendingTasks.value, - text: "", - onClick: _cache[1] || (_cache[1] = () => unref(commandStore).execute("Comfy.ClearPendingTasks")) - }, null, 8, ["severity", "disabled"]), [ - [ - _directive_tooltip, - _ctx.$t("sideToolbar.queueTab.clearPendingTasks"), - void 0, - { bottom: true } - ] - ]) - ]), - _: 1 - }) - ]); - }; - } -}); -const ComfyQueueButton = /* @__PURE__ */ _export_sfc(_sfc_main$7, [["__scopeId", "data-v-7f4f551b"]]); -const overlapThreshold = 20; -const _sfc_main$6 = /* @__PURE__ */ defineComponent({ - __name: "ComfyActionbar", - setup(__props) { - const settingsStore = useSettingStore(); - const visible = computed( - () => settingsStore.get("Comfy.UseNewMenu") !== "Disabled" - ); - const panelRef = ref(null); - const dragHandleRef = ref(null); - const isDocked = useLocalStorage("Comfy.MenuPosition.Docked", false); - const storedPosition = useLocalStorage("Comfy.MenuPosition.Floating", { - x: 0, - y: 0 - }); - const { - x, - y, - style, - isDragging - } = useDraggable(panelRef, { - initialValue: { x: 0, y: 0 }, - handle: dragHandleRef, - containerElement: document.body - }); - watchDebounced( - [x, y], - ([newX, newY]) => { - storedPosition.value = { x: newX, y: newY }; - }, - { debounce: 300 } - ); - const setInitialPosition = /* @__PURE__ */ __name(() => { - if (x.value !== 0 || y.value !== 0) { - return; + }, "onItemMouseMove"), + menuButtonClick: /* @__PURE__ */ __name(function menuButtonClick(event) { + this.toggle(event); + }, "menuButtonClick"), + menuButtonKeydown: /* @__PURE__ */ __name(function menuButtonKeydown(event) { + (event.code === "Enter" || event.code === "NumpadEnter" || event.code === "Space") && this.menuButtonClick(event); + }, "menuButtonKeydown"), + onArrowDownKey: /* @__PURE__ */ __name(function onArrowDownKey2(event) { + var processedItem = this.visibleItems[this.focusedItemInfo.index]; + var root12 = processedItem ? isEmpty(processedItem.parent) : null; + if (root12) { + var grouped = this.isProccessedItemGroup(processedItem); + if (grouped) { + this.onItemChange({ + originalEvent: event, + processedItem + }); + this.focusedItemInfo = { + index: -1, + parentKey: processedItem.key + }; + this.onArrowRightKey(event); + } + } else { + var itemIndex = this.focusedItemInfo.index !== -1 ? this.findNextItemIndex(this.focusedItemInfo.index) : this.findFirstFocusedItemIndex(); + this.changeFocusedItemIndex(event, itemIndex); + } + event.preventDefault(); + }, "onArrowDownKey"), + onArrowUpKey: /* @__PURE__ */ __name(function onArrowUpKey2(event) { + var _this3 = this; + var processedItem = this.visibleItems[this.focusedItemInfo.index]; + var root12 = isEmpty(processedItem.parent); + if (root12) { + var grouped = this.isProccessedItemGroup(processedItem); + if (grouped) { + this.onItemChange({ + originalEvent: event, + processedItem + }); + this.focusedItemInfo = { + index: -1, + parentKey: processedItem.key + }; + var itemIndex = this.findLastItemIndex(); + this.changeFocusedItemIndex(event, itemIndex); + } + } else { + var parentItem = this.activeItemPath.find(function(p) { + return p.key === processedItem.parentKey; + }); + if (this.focusedItemInfo.index === 0) { + this.focusedItemInfo = { + index: -1, + parentKey: parentItem ? parentItem.parentKey : "" + }; + this.searchValue = ""; + this.onArrowLeftKey(event); + this.activeItemPath = this.activeItemPath.filter(function(p) { + return p.parentKey !== _this3.focusedItemInfo.parentKey; + }); + } else { + var _itemIndex = this.focusedItemInfo.index !== -1 ? this.findPrevItemIndex(this.focusedItemInfo.index) : this.findLastFocusedItemIndex(); + this.changeFocusedItemIndex(event, _itemIndex); + } } - if (storedPosition.value.x !== 0 || storedPosition.value.y !== 0) { - x.value = storedPosition.value.x; - y.value = storedPosition.value.y; - captureLastDragState(); - return; + event.preventDefault(); + }, "onArrowUpKey"), + onArrowLeftKey: /* @__PURE__ */ __name(function onArrowLeftKey3(event) { + var _this4 = this; + var processedItem = this.visibleItems[this.focusedItemInfo.index]; + var parentItem = processedItem ? this.activeItemPath.find(function(p) { + return p.key === processedItem.parentKey; + }) : null; + if (parentItem) { + this.onItemChange({ + originalEvent: event, + processedItem: parentItem + }); + this.activeItemPath = this.activeItemPath.filter(function(p) { + return p.parentKey !== _this4.focusedItemInfo.parentKey; + }); + event.preventDefault(); + } else { + var itemIndex = this.focusedItemInfo.index !== -1 ? this.findPrevItemIndex(this.focusedItemInfo.index) : this.findLastFocusedItemIndex(); + this.changeFocusedItemIndex(event, itemIndex); + event.preventDefault(); } - if (panelRef.value) { - const screenWidth = window.innerWidth; - const screenHeight = window.innerHeight; - const menuWidth = panelRef.value.offsetWidth; - const menuHeight = panelRef.value.offsetHeight; - if (menuWidth === 0 || menuHeight === 0) { - return; + }, "onArrowLeftKey"), + onArrowRightKey: /* @__PURE__ */ __name(function onArrowRightKey3(event) { + var processedItem = this.visibleItems[this.focusedItemInfo.index]; + var parentItem = processedItem ? this.activeItemPath.find(function(p) { + return p.key === processedItem.parentKey; + }) : null; + if (parentItem) { + var grouped = this.isProccessedItemGroup(processedItem); + if (grouped) { + this.onItemChange({ + originalEvent: event, + processedItem + }); + this.focusedItemInfo = { + index: -1, + parentKey: processedItem.key + }; + this.onArrowDownKey(event); } - x.value = (screenWidth - menuWidth) / 2; - y.value = screenHeight - menuHeight - 10; - captureLastDragState(); + } else { + var itemIndex = this.focusedItemInfo.index !== -1 ? this.findNextItemIndex(this.focusedItemInfo.index) : this.findFirstFocusedItemIndex(); + this.changeFocusedItemIndex(event, itemIndex); + event.preventDefault(); } - }, "setInitialPosition"); - onMounted(setInitialPosition); - watch(visible, (newVisible) => { - if (newVisible) { - nextTick(setInitialPosition); + }, "onArrowRightKey"), + onHomeKey: /* @__PURE__ */ __name(function onHomeKey3(event) { + this.changeFocusedItemIndex(event, this.findFirstItemIndex()); + event.preventDefault(); + }, "onHomeKey"), + onEndKey: /* @__PURE__ */ __name(function onEndKey3(event) { + this.changeFocusedItemIndex(event, this.findLastItemIndex()); + event.preventDefault(); + }, "onEndKey"), + onEnterKey: /* @__PURE__ */ __name(function onEnterKey3(event) { + if (this.focusedItemInfo.index !== -1) { + var element = findSingle(this.menubar, 'li[id="'.concat("".concat(this.focusedItemId), '"]')); + var anchorElement = element && findSingle(element, 'a[data-pc-section="itemlink"]'); + anchorElement ? anchorElement.click() : element && element.click(); + var processedItem = this.visibleItems[this.focusedItemInfo.index]; + var grouped = this.isProccessedItemGroup(processedItem); + !grouped && (this.focusedItemInfo.index = this.findFirstFocusedItemIndex()); } - }); - const lastDragState = ref({ - x: x.value, - y: y.value, - windowWidth: window.innerWidth, - windowHeight: window.innerHeight - }); - const captureLastDragState = /* @__PURE__ */ __name(() => { - lastDragState.value = { - x: x.value, - y: y.value, - windowWidth: window.innerWidth, - windowHeight: window.innerHeight - }; - }, "captureLastDragState"); - watch( - isDragging, - (newIsDragging) => { - if (!newIsDragging) { - captureLastDragState(); - } - }, - { immediate: true } - ); - const adjustMenuPosition = /* @__PURE__ */ __name(() => { - if (panelRef.value) { - const screenWidth = window.innerWidth; - const screenHeight = window.innerHeight; - const menuWidth = panelRef.value.offsetWidth; - const menuHeight = panelRef.value.offsetHeight; - const distanceLeft = lastDragState.value.x; - const distanceRight = lastDragState.value.windowWidth - (lastDragState.value.x + menuWidth); - const distanceTop = lastDragState.value.y; - const distanceBottom = lastDragState.value.windowHeight - (lastDragState.value.y + menuHeight); - const distances = [ - { edge: "left", distance: distanceLeft }, - { edge: "right", distance: distanceRight }, - { edge: "top", distance: distanceTop }, - { edge: "bottom", distance: distanceBottom } - ]; - const closestEdge = distances.reduce( - (min, curr) => curr.distance < min.distance ? curr : min - ); - const verticalRatio = lastDragState.value.y / lastDragState.value.windowHeight; - const horizontalRatio = lastDragState.value.x / lastDragState.value.windowWidth; - if (closestEdge.edge === "left") { - x.value = closestEdge.distance; - y.value = verticalRatio * screenHeight; - } else if (closestEdge.edge === "right") { - x.value = screenWidth - menuWidth - closestEdge.distance; - y.value = verticalRatio * screenHeight; - } else if (closestEdge.edge === "top") { - x.value = horizontalRatio * screenWidth; - y.value = closestEdge.distance; - } else { - x.value = horizontalRatio * screenWidth; - y.value = screenHeight - menuHeight - closestEdge.distance; - } - x.value = lodashExports.clamp(x.value, 0, screenWidth - menuWidth); - y.value = lodashExports.clamp(y.value, 0, screenHeight - menuHeight); + event.preventDefault(); + }, "onEnterKey"), + onSpaceKey: /* @__PURE__ */ __name(function onSpaceKey(event) { + this.onEnterKey(event); + }, "onSpaceKey"), + onEscapeKey: /* @__PURE__ */ __name(function onEscapeKey2(event) { + if (this.focusedItemInfo.level !== 0) { + var _focusedItemInfo = this.focusedItemInfo; + this.hide(event, false); + this.focusedItemInfo = { + index: Number(_focusedItemInfo.parentKey.split("_")[0]), + level: 0, + parentKey: "" + }; + } + event.preventDefault(); + }, "onEscapeKey"), + onTabKey: /* @__PURE__ */ __name(function onTabKey2(event) { + if (this.focusedItemInfo.index !== -1) { + var processedItem = this.visibleItems[this.focusedItemInfo.index]; + var grouped = this.isProccessedItemGroup(processedItem); + !grouped && this.onItemChange({ + originalEvent: event, + processedItem + }); + } + this.hide(); + }, "onTabKey"), + bindOutsideClickListener: /* @__PURE__ */ __name(function bindOutsideClickListener2() { + var _this5 = this; + if (!this.outsideClickListener) { + this.outsideClickListener = function(event) { + var isOutsideContainer = _this5.container && !_this5.container.contains(event.target); + var isOutsideTarget = !(_this5.target && (_this5.target === event.target || _this5.target.contains(event.target))); + if (isOutsideContainer && isOutsideTarget) { + _this5.hide(); + } + }; + document.addEventListener("click", this.outsideClickListener); + } + }, "bindOutsideClickListener"), + unbindOutsideClickListener: /* @__PURE__ */ __name(function unbindOutsideClickListener2() { + if (this.outsideClickListener) { + document.removeEventListener("click", this.outsideClickListener); + this.outsideClickListener = null; + } + }, "unbindOutsideClickListener"), + bindResizeListener: /* @__PURE__ */ __name(function bindResizeListener2() { + var _this6 = this; + if (!this.resizeListener) { + this.resizeListener = function(event) { + if (!isTouchDevice()) { + _this6.hide(event, true); + } + _this6.mobileActive = false; + }; + window.addEventListener("resize", this.resizeListener); + } + }, "bindResizeListener"), + unbindResizeListener: /* @__PURE__ */ __name(function unbindResizeListener2() { + if (this.resizeListener) { + window.removeEventListener("resize", this.resizeListener); + this.resizeListener = null; + } + }, "unbindResizeListener"), + bindMatchMediaListener: /* @__PURE__ */ __name(function bindMatchMediaListener() { + var _this7 = this; + if (!this.matchMediaListener) { + var query = matchMedia("(max-width: ".concat(this.breakpoint, ")")); + this.query = query; + this.queryMatches = query.matches; + this.matchMediaListener = function() { + _this7.queryMatches = query.matches; + _this7.mobileActive = false; + }; + this.query.addEventListener("change", this.matchMediaListener); + } + }, "bindMatchMediaListener"), + unbindMatchMediaListener: /* @__PURE__ */ __name(function unbindMatchMediaListener() { + if (this.matchMediaListener) { + this.query.removeEventListener("change", this.matchMediaListener); + this.matchMediaListener = null; + } + }, "unbindMatchMediaListener"), + isItemMatched: /* @__PURE__ */ __name(function isItemMatched(processedItem) { + var _this$getProccessedIt; + return this.isValidItem(processedItem) && ((_this$getProccessedIt = this.getProccessedItemLabel(processedItem)) === null || _this$getProccessedIt === void 0 ? void 0 : _this$getProccessedIt.toLocaleLowerCase().startsWith(this.searchValue.toLocaleLowerCase())); + }, "isItemMatched"), + isValidItem: /* @__PURE__ */ __name(function isValidItem(processedItem) { + return !!processedItem && !this.isItemDisabled(processedItem.item) && !this.isItemSeparator(processedItem.item) && this.isItemVisible(processedItem.item); + }, "isValidItem"), + isValidSelectedItem: /* @__PURE__ */ __name(function isValidSelectedItem(processedItem) { + return this.isValidItem(processedItem) && this.isSelected(processedItem); + }, "isValidSelectedItem"), + isSelected: /* @__PURE__ */ __name(function isSelected2(processedItem) { + return this.activeItemPath.some(function(p) { + return p.key === processedItem.key; + }); + }, "isSelected"), + findFirstItemIndex: /* @__PURE__ */ __name(function findFirstItemIndex() { + var _this8 = this; + return this.visibleItems.findIndex(function(processedItem) { + return _this8.isValidItem(processedItem); + }); + }, "findFirstItemIndex"), + findLastItemIndex: /* @__PURE__ */ __name(function findLastItemIndex() { + var _this9 = this; + return findLastIndex(this.visibleItems, function(processedItem) { + return _this9.isValidItem(processedItem); + }); + }, "findLastItemIndex"), + findNextItemIndex: /* @__PURE__ */ __name(function findNextItemIndex(index) { + var _this10 = this; + var matchedItemIndex = index < this.visibleItems.length - 1 ? this.visibleItems.slice(index + 1).findIndex(function(processedItem) { + return _this10.isValidItem(processedItem); + }) : -1; + return matchedItemIndex > -1 ? matchedItemIndex + index + 1 : index; + }, "findNextItemIndex"), + findPrevItemIndex: /* @__PURE__ */ __name(function findPrevItemIndex(index) { + var _this11 = this; + var matchedItemIndex = index > 0 ? findLastIndex(this.visibleItems.slice(0, index), function(processedItem) { + return _this11.isValidItem(processedItem); + }) : -1; + return matchedItemIndex > -1 ? matchedItemIndex : index; + }, "findPrevItemIndex"), + findSelectedItemIndex: /* @__PURE__ */ __name(function findSelectedItemIndex() { + var _this12 = this; + return this.visibleItems.findIndex(function(processedItem) { + return _this12.isValidSelectedItem(processedItem); + }); + }, "findSelectedItemIndex"), + findFirstFocusedItemIndex: /* @__PURE__ */ __name(function findFirstFocusedItemIndex() { + var selectedIndex = this.findSelectedItemIndex(); + return selectedIndex < 0 ? this.findFirstItemIndex() : selectedIndex; + }, "findFirstFocusedItemIndex"), + findLastFocusedItemIndex: /* @__PURE__ */ __name(function findLastFocusedItemIndex() { + var selectedIndex = this.findSelectedItemIndex(); + return selectedIndex < 0 ? this.findLastItemIndex() : selectedIndex; + }, "findLastFocusedItemIndex"), + searchItems: /* @__PURE__ */ __name(function searchItems(event, _char) { + var _this13 = this; + this.searchValue = (this.searchValue || "") + _char; + var itemIndex = -1; + var matched = false; + if (this.focusedItemInfo.index !== -1) { + itemIndex = this.visibleItems.slice(this.focusedItemInfo.index).findIndex(function(processedItem) { + return _this13.isItemMatched(processedItem); + }); + itemIndex = itemIndex === -1 ? this.visibleItems.slice(0, this.focusedItemInfo.index).findIndex(function(processedItem) { + return _this13.isItemMatched(processedItem); + }) : itemIndex + this.focusedItemInfo.index; + } else { + itemIndex = this.visibleItems.findIndex(function(processedItem) { + return _this13.isItemMatched(processedItem); + }); } - }, "adjustMenuPosition"); - useEventListener(window, "resize", adjustMenuPosition); - const topMenuRef = inject("topMenuRef"); - const topMenuBounds = useElementBounding(topMenuRef); - const isOverlappingWithTopMenu = computed(() => { - if (!panelRef.value) { - return false; + if (itemIndex !== -1) { + matched = true; } - const { height } = panelRef.value.getBoundingClientRect(); - const actionbarBottom = y.value + height; - const topMenuBottom = topMenuBounds.bottom.value; - const overlapPixels = Math.min(actionbarBottom, topMenuBottom) - Math.max(y.value, topMenuBounds.top.value); - return overlapPixels > overlapThreshold; - }); - watch(isDragging, (newIsDragging) => { - if (!newIsDragging) { - isDocked.value = isOverlappingWithTopMenu.value; - } else { - isDocked.value = false; + if (itemIndex === -1 && this.focusedItemInfo.index === -1) { + itemIndex = this.findFirstFocusedItemIndex(); } - }); - const eventBus = useEventBus("topMenu"); - watch([isDragging, isOverlappingWithTopMenu], ([dragging, overlapping]) => { - eventBus.emit("updateHighlight", { - isDragging: dragging, - isOverlapping: overlapping + if (itemIndex !== -1) { + this.changeFocusedItemIndex(event, itemIndex); + } + if (this.searchTimeout) { + clearTimeout(this.searchTimeout); + } + this.searchTimeout = setTimeout(function() { + _this13.searchValue = ""; + _this13.searchTimeout = null; + }, 500); + return matched; + }, "searchItems"), + changeFocusedItemIndex: /* @__PURE__ */ __name(function changeFocusedItemIndex(event, index) { + if (this.focusedItemInfo.index !== index) { + this.focusedItemInfo.index = index; + this.scrollInView(); + } + }, "changeFocusedItemIndex"), + scrollInView: /* @__PURE__ */ __name(function scrollInView3() { + var index = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : -1; + var id2 = index !== -1 ? "".concat(this.id, "_").concat(index) : this.focusedItemId; + var element = findSingle(this.menubar, 'li[id="'.concat(id2, '"]')); + if (element) { + element.scrollIntoView && element.scrollIntoView({ + block: "nearest", + inline: "start" + }); + } + }, "scrollInView"), + createProcessedItems: /* @__PURE__ */ __name(function createProcessedItems(items) { + var _this14 = this; + var level = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 0; + var parent = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {}; + var parentKey = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : ""; + var processedItems3 = []; + items && items.forEach(function(item3, index) { + var key = (parentKey !== "" ? parentKey + "_" : "") + index; + var newItem = { + item: item3, + index, + level, + key, + parent, + parentKey + }; + newItem["items"] = _this14.createProcessedItems(item3.items, level + 1, newItem, key); + processedItems3.push(newItem); + }); + return processedItems3; + }, "createProcessedItems"), + containerRef: /* @__PURE__ */ __name(function containerRef(el) { + this.container = el; + }, "containerRef"), + menubarRef: /* @__PURE__ */ __name(function menubarRef(el) { + this.menubar = el ? el.$el : void 0; + }, "menubarRef") + }, + computed: { + processedItems: /* @__PURE__ */ __name(function processedItems() { + return this.createProcessedItems(this.model || []); + }, "processedItems"), + visibleItems: /* @__PURE__ */ __name(function visibleItems() { + var _this15 = this; + var processedItem = this.activeItemPath.find(function(p) { + return p.key === _this15.focusedItemInfo.parentKey; }); + return processedItem ? processedItem.items : this.processedItems; + }, "visibleItems"), + focusedItemId: /* @__PURE__ */ __name(function focusedItemId() { + return this.focusedItemInfo.index !== -1 ? "".concat(this.id).concat(isNotEmpty(this.focusedItemInfo.parentKey) ? "_" + this.focusedItemInfo.parentKey : "", "_").concat(this.focusedItemInfo.index) : null; + }, "focusedItemId") + }, + components: { + MenubarSub: script$1$3, + BarsIcon: script$B + } +}; +function _typeof(o) { + "@babel/helpers - typeof"; + return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o2) { + return typeof o2; + } : function(o2) { + return o2 && "function" == typeof Symbol && o2.constructor === Symbol && o2 !== Symbol.prototype ? "symbol" : typeof o2; + }, _typeof(o); +} +__name(_typeof, "_typeof"); +function ownKeys(e, r) { + var t = Object.keys(e); + if (Object.getOwnPropertySymbols) { + var o = Object.getOwnPropertySymbols(e); + r && (o = o.filter(function(r2) { + return Object.getOwnPropertyDescriptor(e, r2).enumerable; + })), t.push.apply(t, o); + } + return t; +} +__name(ownKeys, "ownKeys"); +function _objectSpread(e) { + for (var r = 1; r < arguments.length; r++) { + var t = null != arguments[r] ? arguments[r] : {}; + r % 2 ? ownKeys(Object(t), true).forEach(function(r2) { + _defineProperty(e, r2, t[r2]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function(r2) { + Object.defineProperty(e, r2, Object.getOwnPropertyDescriptor(t, r2)); }); + } + return e; +} +__name(_objectSpread, "_objectSpread"); +function _defineProperty(e, r, t) { + return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e; +} +__name(_defineProperty, "_defineProperty"); +function _toPropertyKey(t) { + var i = _toPrimitive(t, "string"); + return "symbol" == _typeof(i) ? i : i + ""; +} +__name(_toPropertyKey, "_toPropertyKey"); +function _toPrimitive(t, r) { + if ("object" != _typeof(t) || !t) return t; + var e = t[Symbol.toPrimitive]; + if (void 0 !== e) { + var i = e.call(t, r || "default"); + if ("object" != _typeof(i)) return i; + throw new TypeError("@@toPrimitive must return a primitive value."); + } + return ("string" === r ? String : Number)(t); +} +__name(_toPrimitive, "_toPrimitive"); +var _hoisted_1$c = ["aria-haspopup", "aria-expanded", "aria-controls", "aria-label"]; +function render$9(_ctx, _cache, $props, $setup, $data, $options) { + var _component_BarsIcon = resolveComponent("BarsIcon"); + var _component_MenubarSub = resolveComponent("MenubarSub"); + return openBlock(), createElementBlock("div", mergeProps({ + ref: $options.containerRef, + "class": _ctx.cx("root") + }, _ctx.ptmi("root")), [_ctx.$slots.start ? (openBlock(), createElementBlock("div", mergeProps({ + key: 0, + "class": _ctx.cx("start") + }, _ctx.ptm("start")), [renderSlot(_ctx.$slots, "start")], 16)) : createCommentVNode("", true), renderSlot(_ctx.$slots, _ctx.$slots.button ? "button" : "menubutton", { + id: $data.id, + "class": normalizeClass(_ctx.cx("button")), + toggleCallback: /* @__PURE__ */ __name(function toggleCallback(event) { + return $options.menuButtonClick(event); + }, "toggleCallback") + }, function() { + var _ctx$$primevue$config; + return [_ctx.model && _ctx.model.length > 0 ? (openBlock(), createElementBlock("a", mergeProps({ + key: 0, + ref: "menubutton", + role: "button", + tabindex: "0", + "class": _ctx.cx("button"), + "aria-haspopup": _ctx.model.length && _ctx.model.length > 0 ? true : false, + "aria-expanded": $data.mobileActive, + "aria-controls": $data.id, + "aria-label": (_ctx$$primevue$config = _ctx.$primevue.config.locale.aria) === null || _ctx$$primevue$config === void 0 ? void 0 : _ctx$$primevue$config.navigation, + onClick: _cache[0] || (_cache[0] = function($event) { + return $options.menuButtonClick($event); + }), + onKeydown: _cache[1] || (_cache[1] = function($event) { + return $options.menuButtonKeydown($event); + }) + }, _objectSpread(_objectSpread({}, _ctx.buttonProps), _ctx.ptm("button"))), [renderSlot(_ctx.$slots, _ctx.$slots.buttonicon ? "buttonicon" : "menubuttonicon", {}, function() { + return [createVNode(_component_BarsIcon, normalizeProps(guardReactiveProps(_ctx.ptm("buttonicon"))), null, 16)]; + })], 16, _hoisted_1$c)) : createCommentVNode("", true)]; + }), createVNode(_component_MenubarSub, { + ref: $options.menubarRef, + id: $data.id + "_list", + role: "menubar", + items: $options.processedItems, + templates: _ctx.$slots, + root: true, + mobileActive: $data.mobileActive, + tabindex: "0", + "aria-activedescendant": $data.focused ? $options.focusedItemId : void 0, + menuId: $data.id, + focusedItemId: $data.focused ? $options.focusedItemId : void 0, + activeItemPath: $data.activeItemPath, + level: 0, + "aria-labelledby": _ctx.ariaLabelledby, + "aria-label": _ctx.ariaLabel, + pt: _ctx.pt, + unstyled: _ctx.unstyled, + onFocus: $options.onFocus, + onBlur: $options.onBlur, + onKeydown: $options.onKeyDown, + onItemClick: $options.onItemClick, + onItemMouseenter: $options.onItemMouseEnter, + onItemMousemove: $options.onItemMouseMove + }, null, 8, ["id", "items", "templates", "mobileActive", "aria-activedescendant", "menuId", "focusedItemId", "activeItemPath", "aria-labelledby", "aria-label", "pt", "unstyled", "onFocus", "onBlur", "onKeydown", "onItemClick", "onItemMouseenter", "onItemMousemove"]), _ctx.$slots.end ? (openBlock(), createElementBlock("div", mergeProps({ + key: 1, + "class": _ctx.cx("end") + }, _ctx.ptm("end")), [renderSlot(_ctx.$slots, "end")], 16)) : createCommentVNode("", true)], 16); +} +__name(render$9, "render$9"); +script$5.render = render$9; +const _withScopeId$2 = /* @__PURE__ */ __name((n) => (pushScopeId("data-v-a2b12676"), n = n(), popScopeId(), n), "_withScopeId$2"); +const _hoisted_1$b = ["href"]; +const _hoisted_2$9 = { class: "p-menubar-item-label" }; +const _hoisted_3$7 = { + key: 1, + class: "ml-auto border border-surface rounded text-muted text-xs p-1 keybinding-tag" +}; +const _sfc_main$6 = /* @__PURE__ */ defineComponent({ + __name: "CommandMenubar", + setup(__props) { + const settingStore = useSettingStore(); + const dropdownDirection = computed( + () => settingStore.get("Comfy.UseNewMenu") === "Top" ? "down" : "up" + ); + const menuItemsStore = useMenuItemStore(); + const { t } = useI18n(); + const translateMenuItem = /* @__PURE__ */ __name((item3) => { + const label = typeof item3.label === "function" ? item3.label() : item3.label; + const translatedLabel = label ? t(`menuLabels.${normalizeI18nKey(label)}`, label) : void 0; + return { + ...item3, + label: translatedLabel, + items: item3.items?.map(translateMenuItem) + }; + }, "translateMenuItem"); + const translatedItems = computed( + () => menuItemsStore.menuItems.map(translateMenuItem) + ); return (_ctx, _cache) => { - return openBlock(), createBlock(unref(script$y), { - class: normalizeClass(["actionbar w-fit", { "is-dragging": unref(isDragging), "is-docked": unref(isDocked) }]), - style: normalizeStyle(unref(style)) + return openBlock(), createBlock(unref(script$5), { + model: translatedItems.value, + class: "top-menubar border-none p-0 bg-transparent", + pt: { + rootList: "gap-0 flex-nowrap w-auto", + submenu: `dropdown-direction-${dropdownDirection.value}`, + item: "relative" + } }, { - default: withCtx(() => [ - createBaseVNode("div", { - class: "actionbar-content flex items-center", - ref_key: "panelRef", - ref: panelRef - }, [ - createBaseVNode("span", { - class: "drag-handle cursor-move mr-2 p-0!", - ref_key: "dragHandleRef", - ref: dragHandleRef - }, null, 512), - createVNode(ComfyQueueButton) - ], 512) + item: withCtx(({ item: item3, props }) => [ + createBaseVNode("a", mergeProps({ class: "p-menubar-item-link" }, props.action, { + href: item3.url, + target: "_blank" + }), [ + item3.icon ? (openBlock(), createElementBlock("span", { + key: 0, + class: normalizeClass(["p-menubar-item-icon", item3.icon]) + }, null, 2)) : createCommentVNode("", true), + createBaseVNode("span", _hoisted_2$9, toDisplayString(item3.label), 1), + item3?.comfyCommand?.keybinding ? (openBlock(), createElementBlock("span", _hoisted_3$7, toDisplayString(item3.comfyCommand.keybinding.combo.toString()), 1)) : createCommentVNode("", true) + ], 16, _hoisted_1$b) ]), _: 1 - }, 8, ["style", "class"]); + }, 8, ["model", "pt"]); }; } }); -const Actionbar = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["__scopeId", "data-v-915e5456"]]); -const _hoisted_1$5 = { +const CommandMenubar = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["__scopeId", "data-v-a2b12676"]]); +var theme$2 = /* @__PURE__ */ __name(function theme7(_ref) { + var dt = _ref.dt; + return "\n.p-panel {\n border: 1px solid ".concat(dt("panel.border.color"), ";\n border-radius: ").concat(dt("panel.border.radius"), ";\n background: ").concat(dt("panel.background"), ";\n color: ").concat(dt("panel.color"), ";\n}\n\n.p-panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: ").concat(dt("panel.header.padding"), ";\n background: ").concat(dt("panel.header.background"), ";\n color: ").concat(dt("panel.header.color"), ";\n border-style: solid;\n border-width: ").concat(dt("panel.header.border.width"), ";\n border-color: ").concat(dt("panel.header.border.color"), ";\n border-radius: ").concat(dt("panel.header.border.radius"), ";\n}\n\n.p-panel-toggleable .p-panel-header {\n padding: ").concat(dt("panel.toggleable.header.padding"), ";\n}\n\n.p-panel-title {\n line-height: 1;\n font-weight: ").concat(dt("panel.title.font.weight"), ";\n}\n\n.p-panel-content {\n padding: ").concat(dt("panel.content.padding"), ";\n}\n\n.p-panel-footer {\n padding: ").concat(dt("panel.footer.padding"), ";\n}\n"); +}, "theme"); +var classes$2 = { + root: /* @__PURE__ */ __name(function root9(_ref2) { + var props = _ref2.props; + return ["p-panel p-component", { + "p-panel-toggleable": props.toggleable + }]; + }, "root"), + header: "p-panel-header", + title: "p-panel-title", + headerActions: "p-panel-header-actions", + pcToggleButton: "p-panel-toggle-button", + contentContainer: "p-panel-content-container", + content: "p-panel-content", + footer: "p-panel-footer" +}; +var PanelStyle = BaseStyle.extend({ + name: "panel", + theme: theme$2, + classes: classes$2 +}); +var script$1$2 = { + name: "BasePanel", + "extends": script$g, + props: { + header: String, + toggleable: Boolean, + collapsed: Boolean, + toggleButtonProps: { + type: Object, + "default": /* @__PURE__ */ __name(function _default() { + return { + severity: "secondary", + text: true, + rounded: true + }; + }, "_default") + } + }, + style: PanelStyle, + provide: /* @__PURE__ */ __name(function provide11() { + return { + $pcPanel: this, + $parentInstance: this + }; + }, "provide") +}; +var script$4 = { + name: "Panel", + "extends": script$1$2, + inheritAttrs: false, + emits: ["update:collapsed", "toggle"], + data: /* @__PURE__ */ __name(function data7() { + return { + id: this.$attrs.id, + d_collapsed: this.collapsed + }; + }, "data"), + watch: { + "$attrs.id": /* @__PURE__ */ __name(function $attrsId3(newValue) { + this.id = newValue || UniqueComponentId(); + }, "$attrsId"), + collapsed: /* @__PURE__ */ __name(function collapsed(newValue) { + this.d_collapsed = newValue; + }, "collapsed") + }, + mounted: /* @__PURE__ */ __name(function mounted7() { + this.id = this.id || UniqueComponentId(); + }, "mounted"), + methods: { + toggle: /* @__PURE__ */ __name(function toggle2(event) { + this.d_collapsed = !this.d_collapsed; + this.$emit("update:collapsed", this.d_collapsed); + this.$emit("toggle", { + originalEvent: event, + value: this.d_collapsed + }); + }, "toggle"), + onKeyDown: /* @__PURE__ */ __name(function onKeyDown3(event) { + if (event.code === "Enter" || event.code === "NumpadEnter" || event.code === "Space") { + this.toggle(event); + event.preventDefault(); + } + }, "onKeyDown") + }, + computed: { + buttonAriaLabel: /* @__PURE__ */ __name(function buttonAriaLabel() { + return this.toggleButtonProps && this.toggleButtonProps.ariaLabel ? this.toggleButtonProps.ariaLabel : this.header; + }, "buttonAriaLabel") + }, + components: { + PlusIcon: script$C, + MinusIcon: script$D, + Button: script$f + }, + directives: { + ripple: Ripple + } +}; +var _hoisted_1$a = ["id"]; +var _hoisted_2$8 = ["id", "aria-labelledby"]; +function render$8(_ctx, _cache, $props, $setup, $data, $options) { + var _component_Button = resolveComponent("Button"); + return openBlock(), createElementBlock("div", mergeProps({ + "class": _ctx.cx("root") + }, _ctx.ptmi("root")), [createBaseVNode("div", mergeProps({ + "class": _ctx.cx("header") + }, _ctx.ptm("header")), [renderSlot(_ctx.$slots, "header", { + id: $data.id + "_header", + "class": normalizeClass(_ctx.cx("title")) + }, function() { + return [_ctx.header ? (openBlock(), createElementBlock("span", mergeProps({ + key: 0, + id: $data.id + "_header", + "class": _ctx.cx("title") + }, _ctx.ptm("title")), toDisplayString(_ctx.header), 17, _hoisted_1$a)) : createCommentVNode("", true)]; + }), createBaseVNode("div", mergeProps({ + "class": _ctx.cx("headerActions") + }, _ctx.ptm("headerActions")), [renderSlot(_ctx.$slots, "icons"), _ctx.toggleable ? (openBlock(), createBlock(_component_Button, mergeProps({ + key: 0, + id: $data.id + "_header", + "class": _ctx.cx("pcToggleButton"), + "aria-label": $options.buttonAriaLabel, + "aria-controls": $data.id + "_content", + "aria-expanded": !$data.d_collapsed, + unstyled: _ctx.unstyled, + onClick: $options.toggle, + onKeydown: $options.onKeyDown + }, _ctx.toggleButtonProps, { + pt: _ctx.ptm("pcToggleButton") + }), { + icon: withCtx(function(slotProps) { + return [renderSlot(_ctx.$slots, _ctx.$slots.toggleicon ? "toggleicon" : "togglericon", { + collapsed: $data.d_collapsed + }, function() { + return [(openBlock(), createBlock(resolveDynamicComponent($data.d_collapsed ? "PlusIcon" : "MinusIcon"), mergeProps({ + "class": slotProps["class"] + }, _ctx.ptm("pcToggleButton")["icon"]), null, 16, ["class"]))]; + })]; + }), + _: 3 + }, 16, ["id", "class", "aria-label", "aria-controls", "aria-expanded", "unstyled", "onClick", "onKeydown", "pt"])) : createCommentVNode("", true)], 16)], 16), createVNode(Transition, mergeProps({ + name: "p-toggleable-content" + }, _ctx.ptm("transition")), { + "default": withCtx(function() { + return [withDirectives(createBaseVNode("div", mergeProps({ + id: $data.id + "_content", + "class": _ctx.cx("contentContainer"), + role: "region", + "aria-labelledby": $data.id + "_header" + }, _ctx.ptm("contentContainer")), [createBaseVNode("div", mergeProps({ + "class": _ctx.cx("content") + }, _ctx.ptm("content")), [renderSlot(_ctx.$slots, "default")], 16), _ctx.$slots.footer ? (openBlock(), createElementBlock("div", mergeProps({ + key: 0, + "class": _ctx.cx("footer") + }, _ctx.ptm("footer")), [renderSlot(_ctx.$slots, "footer")], 16)) : createCommentVNode("", true)], 16, _hoisted_2$8), [[vShow, !$data.d_collapsed]])]; + }), + _: 3 + }, 16)], 16); +} +__name(render$8, "render$8"); +script$4.render = render$8; +const _hoisted_1$9 = { + viewBox: "0 0 24 24", + width: "1.2em", + height: "1.2em" +}; +const _hoisted_2$7 = /* @__PURE__ */ createBaseVNode("path", { + fill: "none", + stroke: "currentColor", + "stroke-linecap": "round", + "stroke-linejoin": "round", + "stroke-width": "2", + d: "M6 4v16m4-16l10 8l-10 8z" +}, null, -1); +const _hoisted_3$6 = [ + _hoisted_2$7 +]; +function render$7(_ctx, _cache) { + return openBlock(), createElementBlock("svg", _hoisted_1$9, [..._hoisted_3$6]); +} +__name(render$7, "render$7"); +const __unplugin_components_3 = markRaw({ name: "lucide-step-forward", render: render$7 }); +const _hoisted_1$8 = { + viewBox: "0 0 24 24", + width: "1.2em", + height: "1.2em" +}; +const _hoisted_2$6 = /* @__PURE__ */ createBaseVNode("path", { + fill: "none", + stroke: "currentColor", + "stroke-linecap": "round", + "stroke-linejoin": "round", + "stroke-width": "2", + d: "m13 19l9-7l-9-7zM2 19l9-7l-9-7z" +}, null, -1); +const _hoisted_3$5 = [ + _hoisted_2$6 +]; +function render$6(_ctx, _cache) { + return openBlock(), createElementBlock("svg", _hoisted_1$8, [..._hoisted_3$5]); +} +__name(render$6, "render$6"); +const __unplugin_components_2 = markRaw({ name: "lucide-fast-forward", render: render$6 }); +const _hoisted_1$7 = { viewBox: "0 0 24 24", width: "1.2em", height: "1.2em" }; const _hoisted_2$5 = /* @__PURE__ */ createBaseVNode("path", { - fill: "currentColor", - d: "M5 21q-.825 0-1.412-.587T3 19V5q0-.825.588-1.412T5 3h14q.825 0 1.413.588T21 5v14q0 .825-.587 1.413T19 21zm0-5v3h14v-3zm0-2h14V5H5zm0 2v3z" + fill: "none", + stroke: "currentColor", + "stroke-linecap": "round", + "stroke-linejoin": "round", + "stroke-width": "2", + d: "m6 3l14 9l-14 9z" }, null, -1); const _hoisted_3$4 = [ _hoisted_2$5 ]; -function render$3(_ctx, _cache) { - return openBlock(), createElementBlock("svg", _hoisted_1$5, [..._hoisted_3$4]); +function render$5(_ctx, _cache) { + return openBlock(), createElementBlock("svg", _hoisted_1$7, [..._hoisted_3$4]); } -__name(render$3, "render$3"); -const __unplugin_components_1 = markRaw({ name: "material-symbols-dock-to-bottom-outline", render: render$3 }); -const _hoisted_1$4 = { +__name(render$5, "render$5"); +const __unplugin_components_1$1 = markRaw({ name: "lucide-play", render: render$5 }); +const _hoisted_1$6 = { viewBox: "0 0 24 24", width: "1.2em", height: "1.2em" }; -const _hoisted_2$4 = /* @__PURE__ */ createBaseVNode("path", { - fill: "currentColor", - d: "M5 21q-.825 0-1.412-.587T3 19V5q0-.825.588-1.412T5 3h14q.825 0 1.413.588T21 5v14q0 .825-.587 1.413T19 21zm0-7h14V5H5z" -}, null, -1); +const _hoisted_2$4 = /* @__PURE__ */ createBaseVNode("g", { + fill: "none", + stroke: "currentColor", + "stroke-linecap": "round", + "stroke-linejoin": "round", + "stroke-width": "2" +}, [ + /* @__PURE__ */ createBaseVNode("path", { d: "M16 12H3m13 6H3m7-12H3m18 12V8a2 2 0 0 0-2-2h-5" }), + /* @__PURE__ */ createBaseVNode("path", { d: "m16 8l-2-2l2-2" }) +], -1); const _hoisted_3$3 = [ _hoisted_2$4 ]; -function render$2(_ctx, _cache) { - return openBlock(), createElementBlock("svg", _hoisted_1$4, [..._hoisted_3$3]); +function render$4(_ctx, _cache) { + return openBlock(), createElementBlock("svg", _hoisted_1$6, [..._hoisted_3$3]); } -__name(render$2, "render$2"); -const __unplugin_components_0 = markRaw({ name: "material-symbols-dock-to-bottom", render: render$2 }); -const _sfc_main$5 = /* @__PURE__ */ defineComponent({ - __name: "BottomPanelToggleButton", - setup(__props) { - const bottomPanelStore = useBottomPanelStore(); - return (_ctx, _cache) => { - const _component_i_material_symbols58dock_to_bottom = __unplugin_components_0; - const _component_i_material_symbols58dock_to_bottom_outline = __unplugin_components_1; - const _directive_tooltip = resolveDirective("tooltip"); - return withDirectives((openBlock(), createBlock(unref(script$d), { - severity: "secondary", - text: "", - onClick: unref(bottomPanelStore).toggleBottomPanel - }, { - icon: withCtx(() => [ - unref(bottomPanelStore).bottomPanelVisible ? (openBlock(), createBlock(_component_i_material_symbols58dock_to_bottom, { key: 0 })) : (openBlock(), createBlock(_component_i_material_symbols58dock_to_bottom_outline, { key: 1 })) - ]), - _: 1 - }, 8, ["onClick"])), [ - [vShow, unref(bottomPanelStore).bottomPanelTabs.length > 0], - [_directive_tooltip, { value: _ctx.$t("menu.toggleBottomPanel"), showDelay: 300 }] - ]); - }; - } -}); -var theme8 = /* @__PURE__ */ __name(function theme9(_ref) { +__name(render$4, "render$4"); +const __unplugin_components_0$1 = markRaw({ name: "lucide-list-start", render: render$4 }); +var theme$1 = /* @__PURE__ */ __name(function theme8(_ref) { var dt = _ref.dt; - return "\n.p-menubar {\n display: flex;\n align-items: center;\n background: ".concat(dt("menubar.background"), ";\n border: 1px solid ").concat(dt("menubar.border.color"), ";\n border-radius: ").concat(dt("menubar.border.radius"), ";\n color: ").concat(dt("menubar.color"), ";\n padding: ").concat(dt("menubar.padding"), ";\n gap: ").concat(dt("menubar.gap"), ";\n}\n\n.p-menubar-start,\n.p-megamenu-end {\n display: flex;\n align-items: center;\n}\n\n.p-menubar-root-list,\n.p-menubar-submenu {\n display: flex;\n margin: 0;\n padding: 0;\n list-style: none;\n outline: 0 none;\n}\n\n.p-menubar-root-list {\n align-items: center;\n flex-wrap: wrap;\n gap: ").concat(dt("menubar.gap"), ";\n}\n\n.p-menubar-root-list > .p-menubar-item > .p-menubar-item-content {\n border-radius: ").concat(dt("menubar.base.item.border.radius"), ";\n}\n\n.p-menubar-root-list > .p-menubar-item > .p-menubar-item-content > .p-menubar-item-link {\n padding: ").concat(dt("menubar.base.item.padding"), ";\n}\n\n.p-menubar-item-content {\n transition: background ").concat(dt("menubar.transition.duration"), ", color ").concat(dt("menubar.transition.duration"), ";\n border-radius: ").concat(dt("menubar.item.border.radius"), ";\n color: ").concat(dt("menubar.item.color"), ";\n}\n\n.p-menubar-item-link {\n cursor: pointer;\n display: flex;\n align-items: center;\n text-decoration: none;\n overflow: hidden;\n position: relative;\n color: inherit;\n padding: ").concat(dt("menubar.item.padding"), ";\n gap: ").concat(dt("menubar.item.gap"), ";\n user-select: none;\n outline: 0 none;\n}\n\n.p-menubar-item-label {\n line-height: 1;\n}\n\n.p-menubar-item-icon {\n color: ").concat(dt("menubar.item.icon.color"), ";\n}\n\n.p-menubar-submenu-icon {\n color: ").concat(dt("menubar.submenu.icon.color"), ";\n margin-left: auto;\n font-size: ").concat(dt("menubar.submenu.icon.size"), ";\n width: ").concat(dt("menubar.submenu.icon.size"), ";\n height: ").concat(dt("menubar.submenu.icon.size"), ";\n}\n\n.p-menubar-item.p-focus > .p-menubar-item-content {\n color: ").concat(dt("menubar.item.focus.color"), ";\n background: ").concat(dt("menubar.item.focus.background"), ";\n}\n\n.p-menubar-item.p-focus > .p-menubar-item-content .p-menubar-item-icon {\n color: ").concat(dt("menubar.item.icon.focus.color"), ";\n}\n\n.p-menubar-item.p-focus > .p-menubar-item-content .p-menubar-submenu-icon {\n color: ").concat(dt("menubar.submenu.icon.focus.color"), ";\n}\n\n.p-menubar-item:not(.p-disabled) > .p-menubar-item-content:hover {\n color: ").concat(dt("menubar.item.focus.color"), ";\n background: ").concat(dt("menubar.item.focus.background"), ";\n}\n\n.p-menubar-item:not(.p-disabled) > .p-menubar-item-content:hover .p-menubar-item-icon {\n color: ").concat(dt("menubar.item.icon.focus.color"), ";\n}\n\n.p-menubar-item:not(.p-disabled) > .p-menubar-item-content:hover .p-menubar-submenu-icon {\n color: ").concat(dt("menubar.submenu.icon.focus.color"), ";\n}\n\n.p-menubar-item-active > .p-menubar-item-content {\n color: ").concat(dt("menubar.item.active.color"), ";\n background: ").concat(dt("menubar.item.active.background"), ";\n}\n\n.p-menubar-item-active > .p-menubar-item-content .p-menubar-item-icon {\n color: ").concat(dt("menubar.item.icon.active.color"), ";\n}\n\n.p-menubar-item-active > .p-menubar-item-content .p-menubar-submenu-icon {\n color: ").concat(dt("menubar.submenu.icon.active.color"), ";\n}\n\n.p-menubar-submenu {\n display: none;\n position: absolute;\n min-width: 12.5rem;\n z-index: 1;\n background: ").concat(dt("menubar.submenu.background"), ";\n border: 1px solid ").concat(dt("menubar.submenu.border.color"), ";\n border-radius: ").concat(dt("menubar.border.radius"), ";\n box-shadow: ").concat(dt("menubar.submenu.shadow"), ";\n color: ").concat(dt("menubar.submenu.color"), ";\n flex-direction: column;\n padding: ").concat(dt("menubar.submenu.padding"), ";\n gap: ").concat(dt("menubar.submenu.gap"), ";\n}\n\n.p-menubar-submenu .p-menubar-separator {\n border-top: 1px solid ").concat(dt("menubar.separator.border.color"), ";\n}\n\n.p-menubar-submenu .p-menubar-item {\n position: relative;\n}\n\n .p-menubar-submenu > .p-menubar-item-active > .p-menubar-submenu {\n display: block;\n left: 100%;\n top: 0;\n}\n\n.p-menubar-end {\n margin-left: auto;\n align-self: center;\n}\n\n.p-menubar-button {\n display: none;\n justify-content: center;\n align-items: center;\n cursor: pointer;\n width: ").concat(dt("menubar.mobile.button.size"), ";\n height: ").concat(dt("menubar.mobile.button.size"), ";\n position: relative;\n color: ").concat(dt("menubar.mobile.button.color"), ";\n border: 0 none;\n background: transparent;\n border-radius: ").concat(dt("menubar.mobile.button.border.radius"), ";\n transition: background ").concat(dt("menubar.transition.duration"), ", color ").concat(dt("menubar.transition.duration"), ", outline-color ").concat(dt("menubar.transition.duration"), ";\n outline-color: transparent;\n}\n\n.p-menubar-button:hover {\n color: ").concat(dt("menubar.mobile.button.hover.color"), ";\n background: ").concat(dt("menubar.mobile.button.hover.background"), ";\n}\n\n.p-menubar-button:focus-visible {\n box-shadow: ").concat(dt("menubar.mobile.button.focus.ring.shadow"), ";\n outline: ").concat(dt("menubar.mobile.button.focus.ring.width"), " ").concat(dt("menubar.mobile.button.focus.ring.style"), " ").concat(dt("menubar.mobile.button.focus.ring.color"), ";\n outline-offset: ").concat(dt("menubar.mobile.button.focus.ring.offset"), ";\n}\n\n.p-menubar-mobile {\n position: relative;\n}\n\n.p-menubar-mobile .p-menubar-button {\n display: flex;\n}\n\n.p-menubar-mobile .p-menubar-root-list {\n position: absolute;\n display: none;\n width: 100%;\n padding: ").concat(dt("menubar.submenu.padding"), ";\n background: ").concat(dt("menubar.submenu.background"), ";\n border: 1px solid ").concat(dt("menubar.submenu.border.color"), ";\n box-shadow: ").concat(dt("menubar.submenu.shadow"), ";\n}\n\n.p-menubar-mobile .p-menubar-root-list > .p-menubar-item > .p-menubar-item-content {\n border-radius: ").concat(dt("menubar.item.border.radius"), ";\n}\n\n.p-menubar-mobile .p-menubar-root-list > .p-menubar-item > .p-menubar-item-content > .p-menubar-item-link {\n padding: ").concat(dt("menubar.item.padding"), ";\n}\n\n.p-menubar-mobile-active .p-menubar-root-list {\n display: flex;\n flex-direction: column;\n top: 100%;\n left: 0;\n z-index: 1;\n}\n\n.p-menubar-mobile .p-menubar-root-list .p-menubar-item {\n width: 100%;\n position: static;\n}\n\n.p-menubar-mobile .p-menubar-root-list .p-menubar-separator {\n border-top: 1px solid ").concat(dt("menubar.separator.border.color"), ";\n}\n\n.p-menubar-mobile .p-menubar-root-list > .p-menubar-item > .p-menubar-item-content .p-menubar-submenu-icon {\n margin-left: auto;\n transition: transform 0.2s;\n}\n\n.p-menubar-mobile .p-menubar-root-list > .p-menubar-item-active > .p-menubar-item-content .p-menubar-submenu-icon {\n transform: rotate(-180deg);\n}\n\n.p-menubar-mobile .p-menubar-submenu .p-menubar-submenu-icon {\n transition: transform 0.2s;\n transform: rotate(90deg);\n}\n\n.p-menubar-mobile .p-menubar-item-active > .p-menubar-item-content .p-menubar-submenu-icon {\n transform: rotate(-90deg);\n}\n\n.p-menubar-mobile .p-menubar-submenu {\n width: 100%;\n position: static;\n box-shadow: none;\n border: 0 none;\n padding-left: ").concat(dt("menubar.submenu.mobile.indent"), ";\n}\n"); + return "\n.p-tieredmenu {\n background: ".concat(dt("tieredmenu.background"), ";\n color: ").concat(dt("tieredmenu.color"), ";\n border: 1px solid ").concat(dt("tieredmenu.border.color"), ";\n border-radius: ").concat(dt("tieredmenu.border.radius"), ";\n min-width: 12.5rem;\n}\n\n.p-tieredmenu-root-list,\n.p-tieredmenu-submenu {\n margin: 0;\n padding: ").concat(dt("tieredmenu.list.padding"), ";\n list-style: none;\n outline: 0 none;\n display: flex;\n flex-direction: column;\n gap: ").concat(dt("tieredmenu.list.gap"), ";\n}\n\n.p-tieredmenu-submenu {\n position: absolute;\n min-width: 100%;\n z-index: 1;\n background: ").concat(dt("tieredmenu.background"), ";\n color: ").concat(dt("tieredmenu.color"), ";\n border: 1px solid ").concat(dt("tieredmenu.border.color"), ";\n border-radius: ").concat(dt("tieredmenu.border.radius"), ";\n box-shadow: ").concat(dt("tieredmenu.shadow"), ";\n}\n\n.p-tieredmenu-item {\n position: relative;\n}\n\n.p-tieredmenu-item-content {\n transition: background ").concat(dt("tieredmenu.transition.duration"), ", color ").concat(dt("tieredmenu.transition.duration"), ";\n border-radius: ").concat(dt("tieredmenu.item.border.radius"), ";\n color: ").concat(dt("tieredmenu.item.color"), ";\n}\n\n.p-tieredmenu-item-link {\n cursor: pointer;\n display: flex;\n align-items: center;\n text-decoration: none;\n overflow: hidden;\n position: relative;\n color: inherit;\n padding: ").concat(dt("tieredmenu.item.padding"), ";\n gap: ").concat(dt("tieredmenu.item.gap"), ";\n user-select: none;\n outline: 0 none;\n}\n\n.p-tieredmenu-item-label {\n line-height: 1;\n}\n\n.p-tieredmenu-item-icon {\n color: ").concat(dt("tieredmenu.item.icon.color"), ";\n}\n\n.p-tieredmenu-submenu-icon {\n color: ").concat(dt("tieredmenu.submenu.icon.color"), ";\n margin-left: auto;\n font-size: ").concat(dt("tieredmenu.submenu.icon.size"), ";\n width: ").concat(dt("tieredmenu.submenu.icon.size"), ";\n height: ").concat(dt("tieredmenu.submenu.icon.size"), ";\n}\n\n.p-tieredmenu-item.p-focus > .p-tieredmenu-item-content {\n color: ").concat(dt("tieredmenu.item.focus.color"), ";\n background: ").concat(dt("tieredmenu.item.focus.background"), ";\n}\n\n.p-tieredmenu-item.p-focus > .p-tieredmenu-item-content .p-tieredmenu-item-icon {\n color: ").concat(dt("tieredmenu.item.icon.focus.color"), ";\n}\n\n.p-tieredmenu-item.p-focus > .p-tieredmenu-item-content .p-tieredmenu-submenu-icon {\n color: ").concat(dt("tieredmenu.submenu.icon.focus.color"), ";\n}\n\n.p-tieredmenu-item:not(.p-disabled) > .p-tieredmenu-item-content:hover {\n color: ").concat(dt("tieredmenu.item.focus.color"), ";\n background: ").concat(dt("tieredmenu.item.focus.background"), ";\n}\n\n.p-tieredmenu-item:not(.p-disabled) > .p-tieredmenu-item-content:hover .p-tieredmenu-item-icon {\n color: ").concat(dt("tieredmenu.item.icon.focus.color"), ";\n}\n\n.p-tieredmenu-item:not(.p-disabled) > .p-tieredmenu-item-content:hover .p-tieredmenu-submenu-icon {\n color: ").concat(dt("tieredmenu.submenu.icon.focus.color"), ";\n}\n\n.p-tieredmenu-item-active > .p-tieredmenu-item-content {\n color: ").concat(dt("tieredmenu.item.active.color"), ";\n background: ").concat(dt("tieredmenu.item.active.background"), ";\n}\n\n.p-tieredmenu-item-active > .p-tieredmenu-item-content .p-tieredmenu-item-icon {\n color: ").concat(dt("tieredmenu.item.icon.active.color"), ";\n}\n\n.p-tieredmenu-item-active > .p-tieredmenu-item-content .p-tieredmenu-submenu-icon {\n color: ").concat(dt("tieredmenu.submenu.icon.active.color"), ";\n}\n\n.p-tieredmenu-separator {\n border-top: 1px solid ").concat(dt("tieredmenu.separator.border.color"), ";\n}\n\n.p-tieredmenu-overlay {\n box-shadow: ").concat(dt("tieredmenu.shadow"), ";\n}\n\n.p-tieredmenu-enter-from,\n.p-tieredmenu-leave-active {\n opacity: 0;\n}\n\n.p-tieredmenu-enter-active {\n transition: opacity 250ms;\n}\n"); }, "theme"); var inlineStyles = { submenu: /* @__PURE__ */ __name(function submenu2(_ref2) { @@ -7345,55 +7089,70 @@ var inlineStyles = { }; }, "submenu") }; -var classes = { +var classes$1 = { root: /* @__PURE__ */ __name(function root10(_ref3) { - var instance = _ref3.instance; - return ["p-menubar p-component", { - "p-menubar-mobile": instance.queryMatches, - "p-menubar-mobile-active": instance.mobileActive + _ref3.instance; + var props = _ref3.props; + return ["p-tieredmenu p-component", { + "p-tieredmenu-overlay": props.popup }]; }, "root"), - start: "p-menubar-start", - button: "p-menubar-button", - rootList: "p-menubar-root-list", + start: "p-tieredmenu-start", + rootList: "p-tieredmenu-root-list", item: /* @__PURE__ */ __name(function item2(_ref4) { var instance = _ref4.instance, processedItem = _ref4.processedItem; - return ["p-menubar-item", { - "p-menubar-item-active": instance.isItemActive(processedItem), + return ["p-tieredmenu-item", { + "p-tieredmenu-item-active": instance.isItemActive(processedItem), "p-focus": instance.isItemFocused(processedItem), "p-disabled": instance.isItemDisabled(processedItem) }]; }, "item"), - itemContent: "p-menubar-item-content", - itemLink: "p-menubar-item-link", - itemIcon: "p-menubar-item-icon", - itemLabel: "p-menubar-item-label", - submenuIcon: "p-menubar-submenu-icon", - submenu: "p-menubar-submenu", - separator: "p-menubar-separator", - end: "p-menubar-end" + itemContent: "p-tieredmenu-item-content", + itemLink: "p-tieredmenu-item-link", + itemIcon: "p-tieredmenu-item-icon", + itemLabel: "p-tieredmenu-item-label", + submenuIcon: "p-tieredmenu-submenu-icon", + submenu: "p-tieredmenu-submenu", + separator: "p-tieredmenu-separator", + end: "p-tieredmenu-end" }; -var MenubarStyle = BaseStyle.extend({ - name: "menubar", - theme: theme8, - classes, +var TieredMenuStyle = BaseStyle.extend({ + name: "tieredmenu", + theme: theme$1, + classes: classes$1, inlineStyles }); var script$2 = { - name: "BaseMenubar", - "extends": script$e, + name: "BaseTieredMenu", + "extends": script$g, props: { + popup: { + type: Boolean, + "default": false + }, model: { type: Array, "default": null }, - buttonProps: { - type: null, - "default": null + appendTo: { + type: [String, Object], + "default": "body" }, - breakpoint: { - type: String, - "default": "960px" + autoZIndex: { + type: Boolean, + "default": true + }, + baseZIndex: { + type: Number, + "default": 0 + }, + disabled: { + type: Boolean, + "default": false + }, + tabindex: { + type: Number, + "default": 0 }, ariaLabelledby: { type: String, @@ -7404,58 +7163,54 @@ var script$2 = { "default": null } }, - style: MenubarStyle, + style: TieredMenuStyle, provide: /* @__PURE__ */ __name(function provide12() { return { - $pcMenubar: this, + $pcTieredMenu: this, $parentInstance: this }; }, "provide") }; -var script$1 = { - name: "MenubarSub", - hostName: "Menubar", - "extends": script$e, - emits: ["item-mouseenter", "item-click", "item-mousemove"], +var script$1$1 = { + name: "TieredMenuSub", + hostName: "TieredMenu", + "extends": script$g, + emits: ["item-click", "item-mouseenter", "item-mousemove"], + container: null, props: { - items: { - type: Array, + menuId: { + type: String, "default": null }, - root: { - type: Boolean, - "default": false + focusedItemId: { + type: String, + "default": null }, - popup: { - type: Boolean, - "default": false + items: { + type: Array, + "default": null }, - mobileActive: { + visible: { type: Boolean, "default": false }, - templates: { - type: Object, - "default": null - }, level: { type: Number, "default": 0 }, - menuId: { - type: String, - "default": null - }, - focusedItemId: { - type: String, + templates: { + type: Object, "default": null }, activeItemPath: { type: Object, "default": null + }, + tabindex: { + type: Number, + "default": 0 } }, - list: null, methods: { getItemId: /* @__PURE__ */ __name(function getItemId2(processedItem) { return "".concat(this.menuId, "_").concat(processedItem.key); @@ -7479,8 +7234,7 @@ var script$1 = { index, active: this.isItemActive(processedItem), focused: this.isItemFocused(processedItem), - disabled: this.isItemDisabled(processedItem), - level: this.level + disabled: this.isItemDisabled(processedItem) } }); }, "getPTOptions"), @@ -7501,203 +7255,221 @@ var script$1 = { isItemGroup: /* @__PURE__ */ __name(function isItemGroup3(processedItem) { return isNotEmpty(processedItem.items); }, "isItemGroup"), - onItemClick: /* @__PURE__ */ __name(function onItemClick3(event, processedItem) { - this.getItemProp(processedItem, "command", { - originalEvent: event, - item: processedItem.item - }); - this.$emit("item-click", { - originalEvent: event, - processedItem, - isFocus: true - }); - }, "onItemClick"), - onItemMouseEnter: /* @__PURE__ */ __name(function onItemMouseEnter3(event, processedItem) { - this.$emit("item-mouseenter", { - originalEvent: event, - processedItem - }); - }, "onItemMouseEnter"), - onItemMouseMove: /* @__PURE__ */ __name(function onItemMouseMove3(event, processedItem) { - this.$emit("item-mousemove", { - originalEvent: event, - processedItem - }); - }, "onItemMouseMove"), - getAriaPosInset: /* @__PURE__ */ __name(function getAriaPosInset3(index) { - return index - this.calculateAriaSetSize.slice(0, index).length + 1; - }, "getAriaPosInset"), - getMenuItemProps: /* @__PURE__ */ __name(function getMenuItemProps2(processedItem, index) { - return { - action: mergeProps({ - "class": this.cx("itemLink"), - tabindex: -1, - "aria-hidden": true - }, this.getPTOptions(processedItem, index, "itemLink")), - icon: mergeProps({ - "class": [this.cx("itemIcon"), this.getItemProp(processedItem, "icon")] - }, this.getPTOptions(processedItem, index, "itemIcon")), - label: mergeProps({ - "class": this.cx("itemLabel") - }, this.getPTOptions(processedItem, index, "itemLabel")), - submenuicon: mergeProps({ - "class": this.cx("submenuIcon") - }, this.getPTOptions(processedItem, index, "submenuIcon")) - }; - }, "getMenuItemProps") - }, - computed: { - calculateAriaSetSize: /* @__PURE__ */ __name(function calculateAriaSetSize() { - var _this = this; - return this.items.filter(function(processedItem) { - return _this.isItemVisible(processedItem) && _this.getItemProp(processedItem, "separator"); - }); - }, "calculateAriaSetSize"), - getAriaSetSize: /* @__PURE__ */ __name(function getAriaSetSize2() { - var _this2 = this; - return this.items.filter(function(processedItem) { - return _this2.isItemVisible(processedItem) && !_this2.getItemProp(processedItem, "separator"); - }).length; - }, "getAriaSetSize") - }, - components: { - AngleRightIcon: script$w, - AngleDownIcon: script$z - }, - directives: { - ripple: Ripple - } -}; -var _hoisted_1$1$1 = ["id", "aria-label", "aria-disabled", "aria-expanded", "aria-haspopup", "aria-level", "aria-setsize", "aria-posinset", "data-p-active", "data-p-focused", "data-p-disabled"]; -var _hoisted_2$3 = ["onClick", "onMouseenter", "onMousemove"]; -var _hoisted_3$2 = ["href", "target"]; -var _hoisted_4 = ["id"]; -var _hoisted_5 = ["id"]; -function render$1(_ctx, _cache, $props, $setup, $data, $options) { - var _component_MenubarSub = resolveComponent("MenubarSub", true); - var _directive_ripple = resolveDirective("ripple"); - return openBlock(), createElementBlock("ul", mergeProps({ - "class": $props.level === 0 ? _ctx.cx("rootList") : _ctx.cx("submenu") - }, $props.level === 0 ? _ctx.ptm("rootList") : _ctx.ptm("submenu")), [(openBlock(true), createElementBlock(Fragment, null, renderList($props.items, function(processedItem, index) { - return openBlock(), createElementBlock(Fragment, { - key: $options.getItemKey(processedItem) - }, [$options.isItemVisible(processedItem) && !$options.getItemProp(processedItem, "separator") ? (openBlock(), createElementBlock("li", mergeProps({ - key: 0, - id: $options.getItemId(processedItem), - style: $options.getItemProp(processedItem, "style"), - "class": [_ctx.cx("item", { - processedItem - }), $options.getItemProp(processedItem, "class")], - role: "menuitem", - "aria-label": $options.getItemLabel(processedItem), - "aria-disabled": $options.isItemDisabled(processedItem) || void 0, - "aria-expanded": $options.isItemGroup(processedItem) ? $options.isItemActive(processedItem) : void 0, - "aria-haspopup": $options.isItemGroup(processedItem) && !$options.getItemProp(processedItem, "to") ? "menu" : void 0, - "aria-level": $props.level + 1, - "aria-setsize": $options.getAriaSetSize, - "aria-posinset": $options.getAriaPosInset(index), - ref_for: true - }, $options.getPTOptions(processedItem, index, "item"), { - "data-p-active": $options.isItemActive(processedItem), - "data-p-focused": $options.isItemFocused(processedItem), - "data-p-disabled": $options.isItemDisabled(processedItem) - }), [createBaseVNode("div", mergeProps({ - "class": _ctx.cx("itemContent"), - onClick: /* @__PURE__ */ __name(function onClick2($event) { - return $options.onItemClick($event, processedItem); - }, "onClick"), - onMouseenter: /* @__PURE__ */ __name(function onMouseenter($event) { - return $options.onItemMouseEnter($event, processedItem); - }, "onMouseenter"), - onMousemove: /* @__PURE__ */ __name(function onMousemove($event) { - return $options.onItemMouseMove($event, processedItem); - }, "onMousemove"), - ref_for: true - }, $options.getPTOptions(processedItem, index, "itemContent")), [!$props.templates.item ? withDirectives((openBlock(), createElementBlock("a", mergeProps({ - key: 0, - href: $options.getItemProp(processedItem, "url"), - "class": _ctx.cx("itemLink"), - target: $options.getItemProp(processedItem, "target"), - tabindex: "-1", - ref_for: true - }, $options.getPTOptions(processedItem, index, "itemLink")), [$props.templates.itemicon ? (openBlock(), createBlock(resolveDynamicComponent($props.templates.itemicon), { - key: 0, - item: processedItem.item, - "class": normalizeClass(_ctx.cx("itemIcon")) - }, null, 8, ["item", "class"])) : $options.getItemProp(processedItem, "icon") ? (openBlock(), createElementBlock("span", mergeProps({ - key: 1, - "class": [_ctx.cx("itemIcon"), $options.getItemProp(processedItem, "icon")], - ref_for: true - }, $options.getPTOptions(processedItem, index, "itemIcon")), null, 16)) : createCommentVNode("", true), createBaseVNode("span", mergeProps({ - id: $options.getItemLabelId(processedItem), - "class": _ctx.cx("itemLabel"), - ref_for: true - }, $options.getPTOptions(processedItem, index, "itemLabel")), toDisplayString($options.getItemLabel(processedItem)), 17, _hoisted_4), $options.getItemProp(processedItem, "items") ? (openBlock(), createElementBlock(Fragment, { - key: 2 - }, [$props.templates.submenuicon ? (openBlock(), createBlock(resolveDynamicComponent($props.templates.submenuicon), { - key: 0, - root: $props.root, - active: $options.isItemActive(processedItem), - "class": normalizeClass(_ctx.cx("submenuIcon")) - }, null, 8, ["root", "active", "class"])) : (openBlock(), createBlock(resolveDynamicComponent($props.root ? "AngleDownIcon" : "AngleRightIcon"), mergeProps({ - key: 1, - "class": _ctx.cx("submenuIcon"), - ref_for: true - }, $options.getPTOptions(processedItem, index, "submenuIcon")), null, 16, ["class"]))], 64)) : createCommentVNode("", true)], 16, _hoisted_3$2)), [[_directive_ripple]]) : (openBlock(), createBlock(resolveDynamicComponent($props.templates.item), { - key: 1, - item: processedItem.item, - root: $props.root, - hasSubmenu: $options.getItemProp(processedItem, "items"), - label: $options.getItemLabel(processedItem), - props: $options.getMenuItemProps(processedItem, index) - }, null, 8, ["item", "root", "hasSubmenu", "label", "props"]))], 16, _hoisted_2$3), $options.isItemVisible(processedItem) && $options.isItemGroup(processedItem) ? (openBlock(), createBlock(_component_MenubarSub, { - key: 0, - id: $options.getItemId(processedItem) + "_list", - menuId: $props.menuId, - role: "menu", - style: normalizeStyle(_ctx.sx("submenu", true, { - processedItem - })), - focusedItemId: $props.focusedItemId, - items: processedItem.items, - mobileActive: $props.mobileActive, - activeItemPath: $props.activeItemPath, - templates: $props.templates, - level: $props.level + 1, - "aria-labelledby": $options.getItemLabelId(processedItem), - pt: _ctx.pt, - unstyled: _ctx.unstyled, - onItemClick: _cache[0] || (_cache[0] = function($event) { - return _ctx.$emit("item-click", $event); - }), - onItemMouseenter: _cache[1] || (_cache[1] = function($event) { - return _ctx.$emit("item-mouseenter", $event); - }), - onItemMousemove: _cache[2] || (_cache[2] = function($event) { - return _ctx.$emit("item-mousemove", $event); - }) - }, null, 8, ["id", "menuId", "style", "focusedItemId", "items", "mobileActive", "activeItemPath", "templates", "level", "aria-labelledby", "pt", "unstyled"])) : createCommentVNode("", true)], 16, _hoisted_1$1$1)) : createCommentVNode("", true), $options.isItemVisible(processedItem) && $options.getItemProp(processedItem, "separator") ? (openBlock(), createElementBlock("li", mergeProps({ - key: 1, - id: $options.getItemId(processedItem), - "class": [_ctx.cx("separator"), $options.getItemProp(processedItem, "class")], - style: $options.getItemProp(processedItem, "style"), - role: "separator", - ref_for: true - }, _ctx.ptm("separator")), null, 16, _hoisted_5)) : createCommentVNode("", true)], 64); - }), 128))], 16); + onEnter: /* @__PURE__ */ __name(function onEnter2() { + nestedPosition(this.container, this.level); + }, "onEnter"), + onItemClick: /* @__PURE__ */ __name(function onItemClick3(event, processedItem) { + this.getItemProp(processedItem, "command", { + originalEvent: event, + item: processedItem.item + }); + this.$emit("item-click", { + originalEvent: event, + processedItem, + isFocus: true + }); + }, "onItemClick"), + onItemMouseEnter: /* @__PURE__ */ __name(function onItemMouseEnter3(event, processedItem) { + this.$emit("item-mouseenter", { + originalEvent: event, + processedItem + }); + }, "onItemMouseEnter"), + onItemMouseMove: /* @__PURE__ */ __name(function onItemMouseMove3(event, processedItem) { + this.$emit("item-mousemove", { + originalEvent: event, + processedItem + }); + }, "onItemMouseMove"), + getAriaSetSize: /* @__PURE__ */ __name(function getAriaSetSize2() { + var _this = this; + return this.items.filter(function(processedItem) { + return _this.isItemVisible(processedItem) && !_this.getItemProp(processedItem, "separator"); + }).length; + }, "getAriaSetSize"), + getAriaPosInset: /* @__PURE__ */ __name(function getAriaPosInset3(index) { + var _this2 = this; + return index - this.items.slice(0, index).filter(function(processedItem) { + return _this2.isItemVisible(processedItem) && _this2.getItemProp(processedItem, "separator"); + }).length + 1; + }, "getAriaPosInset"), + getMenuItemProps: /* @__PURE__ */ __name(function getMenuItemProps2(processedItem, index) { + return { + action: mergeProps({ + "class": this.cx("itemLink"), + tabindex: -1, + "aria-hidden": true + }, this.getPTOptions(processedItem, index, "itemLink")), + icon: mergeProps({ + "class": [this.cx("itemIcon"), this.getItemProp(processedItem, "icon")] + }, this.getPTOptions(processedItem, index, "itemIcon")), + label: mergeProps({ + "class": this.cx("itemLabel") + }, this.getPTOptions(processedItem, index, "itemLabel")), + submenuicon: mergeProps({ + "class": this.cx("submenuIcon") + }, this.getPTOptions(processedItem, index, "submenuIcon")) + }; + }, "getMenuItemProps"), + containerRef: /* @__PURE__ */ __name(function containerRef2(el) { + this.container = el; + }, "containerRef") + }, + components: { + AngleRightIcon: script$z + }, + directives: { + ripple: Ripple + } +}; +var _hoisted_1$1$1 = ["tabindex"]; +var _hoisted_2$3 = ["id", "aria-label", "aria-disabled", "aria-expanded", "aria-haspopup", "aria-level", "aria-setsize", "aria-posinset", "data-p-active", "data-p-focused", "data-p-disabled"]; +var _hoisted_3$2 = ["onClick", "onMouseenter", "onMousemove"]; +var _hoisted_4 = ["href", "target"]; +var _hoisted_5 = ["id"]; +var _hoisted_6 = ["id"]; +function render$1$1(_ctx, _cache, $props, $setup, $data, $options) { + var _component_AngleRightIcon = resolveComponent("AngleRightIcon"); + var _component_TieredMenuSub = resolveComponent("TieredMenuSub", true); + var _directive_ripple = resolveDirective("ripple"); + return openBlock(), createBlock(Transition, mergeProps({ + name: "p-tieredmenu", + onEnter: $options.onEnter + }, _ctx.ptm("menu.transition")), { + "default": withCtx(function() { + return [($props.level === 0 ? true : $props.visible) ? (openBlock(), createElementBlock("ul", mergeProps({ + key: 0, + ref: $options.containerRef, + "class": $props.level === 0 ? _ctx.cx("rootList") : _ctx.cx("submenu"), + tabindex: $props.tabindex + }, $props.level === 0 ? _ctx.ptm("rootList") : _ctx.ptm("submenu")), [(openBlock(true), createElementBlock(Fragment, null, renderList($props.items, function(processedItem, index) { + return openBlock(), createElementBlock(Fragment, { + key: $options.getItemKey(processedItem) + }, [$options.isItemVisible(processedItem) && !$options.getItemProp(processedItem, "separator") ? (openBlock(), createElementBlock("li", mergeProps({ + key: 0, + id: $options.getItemId(processedItem), + style: $options.getItemProp(processedItem, "style"), + "class": [_ctx.cx("item", { + processedItem + }), $options.getItemProp(processedItem, "class")], + role: "menuitem", + "aria-label": $options.getItemLabel(processedItem), + "aria-disabled": $options.isItemDisabled(processedItem) || void 0, + "aria-expanded": $options.isItemGroup(processedItem) ? $options.isItemActive(processedItem) : void 0, + "aria-haspopup": $options.isItemGroup(processedItem) && !$options.getItemProp(processedItem, "to") ? "menu" : void 0, + "aria-level": $props.level + 1, + "aria-setsize": $options.getAriaSetSize(), + "aria-posinset": $options.getAriaPosInset(index), + ref_for: true + }, $options.getPTOptions(processedItem, index, "item"), { + "data-p-active": $options.isItemActive(processedItem), + "data-p-focused": $options.isItemFocused(processedItem), + "data-p-disabled": $options.isItemDisabled(processedItem) + }), [createBaseVNode("div", mergeProps({ + "class": _ctx.cx("itemContent"), + onClick: /* @__PURE__ */ __name(function onClick2($event) { + return $options.onItemClick($event, processedItem); + }, "onClick"), + onMouseenter: /* @__PURE__ */ __name(function onMouseenter($event) { + return $options.onItemMouseEnter($event, processedItem); + }, "onMouseenter"), + onMousemove: /* @__PURE__ */ __name(function onMousemove($event) { + return $options.onItemMouseMove($event, processedItem); + }, "onMousemove"), + ref_for: true + }, $options.getPTOptions(processedItem, index, "itemContent")), [!$props.templates.item ? withDirectives((openBlock(), createElementBlock("a", mergeProps({ + key: 0, + href: $options.getItemProp(processedItem, "url"), + "class": _ctx.cx("itemLink"), + target: $options.getItemProp(processedItem, "target"), + tabindex: "-1", + ref_for: true + }, $options.getPTOptions(processedItem, index, "itemLink")), [$props.templates.itemicon ? (openBlock(), createBlock(resolveDynamicComponent($props.templates.itemicon), { + key: 0, + item: processedItem.item, + "class": normalizeClass(_ctx.cx("itemIcon")) + }, null, 8, ["item", "class"])) : $options.getItemProp(processedItem, "icon") ? (openBlock(), createElementBlock("span", mergeProps({ + key: 1, + "class": [_ctx.cx("itemIcon"), $options.getItemProp(processedItem, "icon")], + ref_for: true + }, $options.getPTOptions(processedItem, index, "itemIcon")), null, 16)) : createCommentVNode("", true), createBaseVNode("span", mergeProps({ + id: $options.getItemLabelId(processedItem), + "class": _ctx.cx("itemLabel"), + ref_for: true + }, $options.getPTOptions(processedItem, index, "itemLabel")), toDisplayString($options.getItemLabel(processedItem)), 17, _hoisted_5), $options.getItemProp(processedItem, "items") ? (openBlock(), createElementBlock(Fragment, { + key: 2 + }, [$props.templates.submenuicon ? (openBlock(), createBlock(resolveDynamicComponent($props.templates.submenuicon), mergeProps({ + key: 0, + "class": _ctx.cx("submenuIcon"), + active: $options.isItemActive(processedItem), + ref_for: true + }, $options.getPTOptions(processedItem, index, "submenuIcon")), null, 16, ["class", "active"])) : (openBlock(), createBlock(_component_AngleRightIcon, mergeProps({ + key: 1, + "class": _ctx.cx("submenuIcon"), + ref_for: true + }, $options.getPTOptions(processedItem, index, "submenuIcon")), null, 16, ["class"]))], 64)) : createCommentVNode("", true)], 16, _hoisted_4)), [[_directive_ripple]]) : (openBlock(), createBlock(resolveDynamicComponent($props.templates.item), { + key: 1, + item: processedItem.item, + hasSubmenu: $options.getItemProp(processedItem, "items"), + label: $options.getItemLabel(processedItem), + props: $options.getMenuItemProps(processedItem, index) + }, null, 8, ["item", "hasSubmenu", "label", "props"]))], 16, _hoisted_3$2), $options.isItemVisible(processedItem) && $options.isItemGroup(processedItem) ? (openBlock(), createBlock(_component_TieredMenuSub, { + key: 0, + id: $options.getItemId(processedItem) + "_list", + style: normalizeStyle(_ctx.sx("submenu", true, { + processedItem + })), + "aria-labelledby": $options.getItemLabelId(processedItem), + role: "menu", + menuId: $props.menuId, + focusedItemId: $props.focusedItemId, + items: processedItem.items, + templates: $props.templates, + activeItemPath: $props.activeItemPath, + level: $props.level + 1, + visible: $options.isItemActive(processedItem) && $options.isItemGroup(processedItem), + pt: _ctx.pt, + unstyled: _ctx.unstyled, + onItemClick: _cache[0] || (_cache[0] = function($event) { + return _ctx.$emit("item-click", $event); + }), + onItemMouseenter: _cache[1] || (_cache[1] = function($event) { + return _ctx.$emit("item-mouseenter", $event); + }), + onItemMousemove: _cache[2] || (_cache[2] = function($event) { + return _ctx.$emit("item-mousemove", $event); + }) + }, null, 8, ["id", "style", "aria-labelledby", "menuId", "focusedItemId", "items", "templates", "activeItemPath", "level", "visible", "pt", "unstyled"])) : createCommentVNode("", true)], 16, _hoisted_2$3)) : createCommentVNode("", true), $options.isItemVisible(processedItem) && $options.getItemProp(processedItem, "separator") ? (openBlock(), createElementBlock("li", mergeProps({ + key: 1, + id: $options.getItemId(processedItem), + style: $options.getItemProp(processedItem, "style"), + "class": [_ctx.cx("separator"), $options.getItemProp(processedItem, "class")], + role: "separator", + ref_for: true + }, _ctx.ptm("separator")), null, 16, _hoisted_6)) : createCommentVNode("", true)], 64); + }), 128))], 16, _hoisted_1$1$1)) : createCommentVNode("", true)]; + }), + _: 1 + }, 16, ["onEnter"]); } -__name(render$1, "render$1"); -script$1.render = render$1; -var script = { - name: "Menubar", +__name(render$1$1, "render$1$1"); +script$1$1.render = render$1$1; +var script$3 = { + name: "TieredMenu", "extends": script$2, inheritAttrs: false, - emits: ["focus", "blur"], - matchMediaListener: null, + emits: ["focus", "blur", "before-show", "before-hide", "hide", "show"], + outsideClickListener: null, + scrollHandler: null, + resizeListener: null, + target: null, + container: null, + menubar: null, + searchTimeout: null, + searchValue: null, data: /* @__PURE__ */ __name(function data8() { return { id: this.$attrs.id, - mobileActive: false, focused: false, focusedItemInfo: { index: -1, @@ -7705,9 +7477,9 @@ var script = { parentKey: "" }, activeItemPath: [], - dirty: false, - query: null, - queryMatches: false + visible: !this.popup, + submenuVisible: false, + dirty: false }; }, "data"), watch: { @@ -7715,30 +7487,31 @@ var script = { this.id = newValue || UniqueComponentId(); }, "$attrsId"), activeItemPath: /* @__PURE__ */ __name(function activeItemPath2(newPath) { - if (isNotEmpty(newPath)) { - this.bindOutsideClickListener(); - this.bindResizeListener(); - } else { - this.unbindOutsideClickListener(); - this.unbindResizeListener(); + if (!this.popup) { + if (isNotEmpty(newPath)) { + this.bindOutsideClickListener(); + this.bindResizeListener(); + } else { + this.unbindOutsideClickListener(); + this.unbindResizeListener(); + } } }, "activeItemPath") }, - outsideClickListener: null, - container: null, - menubar: null, mounted: /* @__PURE__ */ __name(function mounted8() { this.id = this.id || UniqueComponentId(); - this.bindMatchMediaListener(); }, "mounted"), beforeUnmount: /* @__PURE__ */ __name(function beforeUnmount7() { - this.mobileActive = false; this.unbindOutsideClickListener(); this.unbindResizeListener(); - this.unbindMatchMediaListener(); - if (this.container) { + if (this.scrollHandler) { + this.scrollHandler.destroy(); + this.scrollHandler = null; + } + if (this.container && this.autoZIndex) { ZIndex.clear(this.container); } + this.target = null; this.container = null; }, "beforeUnmount"), methods: { @@ -7761,37 +7534,27 @@ var script = { return this.getItemProp(item3, "separator"); }, "isItemSeparator"), getProccessedItemLabel: /* @__PURE__ */ __name(function getProccessedItemLabel2(processedItem) { - return processedItem ? this.getItemLabel(processedItem.item) : void 0; - }, "getProccessedItemLabel"), - isProccessedItemGroup: /* @__PURE__ */ __name(function isProccessedItemGroup2(processedItem) { - return processedItem && isNotEmpty(processedItem.items); - }, "isProccessedItemGroup"), - toggle: /* @__PURE__ */ __name(function toggle2(event) { - var _this = this; - if (this.mobileActive) { - this.mobileActive = false; - ZIndex.clear(this.menubar); - this.hide(); - } else { - this.mobileActive = true; - ZIndex.set("menu", this.menubar, this.$primevue.config.zIndex.menu); - setTimeout(function() { - _this.show(); - }, 1); - } - this.bindOutsideClickListener(); - event.preventDefault(); + return processedItem ? this.getItemLabel(processedItem.item) : void 0; + }, "getProccessedItemLabel"), + isProccessedItemGroup: /* @__PURE__ */ __name(function isProccessedItemGroup2(processedItem) { + return processedItem && isNotEmpty(processedItem.items); + }, "isProccessedItemGroup"), + toggle: /* @__PURE__ */ __name(function toggle3(event) { + this.visible ? this.hide(event, true) : this.show(event); }, "toggle"), - show: /* @__PURE__ */ __name(function show3() { - focus(this.menubar); + show: /* @__PURE__ */ __name(function show3(event, isFocus) { + if (this.popup) { + this.$emit("before-show"); + this.visible = true; + this.target = this.target || event.currentTarget; + this.relatedTarget = event.relatedTarget || null; + } + isFocus && focus(this.menubar); }, "show"), hide: /* @__PURE__ */ __name(function hide3(event, isFocus) { - var _this2 = this; - if (this.mobileActive) { - this.mobileActive = false; - setTimeout(function() { - focus(_this2.$refs.menubutton); - }, 0); + if (this.popup) { + this.$emit("before-hide"); + this.visible = false; } this.activeItemPath = []; this.focusedItemInfo = { @@ -7799,16 +7562,18 @@ var script = { level: 0, parentKey: "" }; - isFocus && focus(this.menubar); + isFocus && focus(this.relatedTarget || this.target || this.menubar); this.dirty = false; }, "hide"), onFocus: /* @__PURE__ */ __name(function onFocus4(event) { this.focused = true; - this.focusedItemInfo = this.focusedItemInfo.index !== -1 ? this.focusedItemInfo : { - index: this.findFirstFocusedItemIndex(), - level: 0, - parentKey: "" - }; + if (!this.popup) { + this.focusedItemInfo = this.focusedItemInfo.index !== -1 ? this.focusedItemInfo : { + index: this.findFirstFocusedItemIndex(), + level: 0, + parentKey: "" + }; + } this.$emit("focus", event); }, "onFocus"), onBlur: /* @__PURE__ */ __name(function onBlur3(event) { @@ -7822,7 +7587,11 @@ var script = { this.dirty = false; this.$emit("blur", event); }, "onBlur"), - onKeyDown: /* @__PURE__ */ __name(function onKeyDown3(event) { + onKeyDown: /* @__PURE__ */ __name(function onKeyDown4(event) { + if (this.disabled) { + event.preventDefault(); + return; + } var metaKey = event.metaKey || event.ctrlKey; switch (event.code) { case "ArrowDown": @@ -7877,7 +7646,10 @@ var script = { var activeItemPath3 = this.activeItemPath.filter(function(p) { return p.parentKey !== parentKey && p.parentKey !== key; }); - grouped && activeItemPath3.push(processedItem); + if (grouped) { + activeItemPath3.push(processedItem); + this.submenuVisible = true; + } this.focusedItemInfo = { index, level, @@ -7887,10 +7659,16 @@ var script = { grouped && (this.dirty = true); isFocus && focus(this.menubar); }, "onItemChange"), + onOverlayClick: /* @__PURE__ */ __name(function onOverlayClick2(event) { + OverlayEventBus.emit("overlay-click", { + originalEvent: event, + target: this.target + }); + }, "onOverlayClick"), onItemClick: /* @__PURE__ */ __name(function onItemClick4(event) { var originalEvent = event.originalEvent, processedItem = event.processedItem; var grouped = this.isProccessedItemGroup(processedItem); - var root11 = isEmpty(processedItem.parent); + var root12 = isEmpty(processedItem.parent); var selected = this.isSelected(processedItem); if (selected) { var index = processedItem.index, key = processedItem.key, level = processedItem.level, parentKey = processedItem.parentKey; @@ -7902,18 +7680,17 @@ var script = { level, parentKey }; - this.dirty = !root11; + this.dirty = !root12; focus(this.menubar); } else { if (grouped) { this.onItemChange(event); } else { - var rootProcessedItem = root11 ? processedItem : this.activeItemPath.find(function(p) { + var rootProcessedItem = root12 ? processedItem : this.activeItemPath.find(function(p) { return p.parentKey === ""; }); this.hide(originalEvent); this.changeFocusedItemIndex(originalEvent, rootProcessedItem ? rootProcessedItem.index : -1); - this.mobileActive = false; focus(this.menubar); } } @@ -7928,117 +7705,65 @@ var script = { this.changeFocusedItemIndex(event, event.processedItem.index); } }, "onItemMouseMove"), - menuButtonClick: /* @__PURE__ */ __name(function menuButtonClick(event) { - this.toggle(event); - }, "menuButtonClick"), - menuButtonKeydown: /* @__PURE__ */ __name(function menuButtonKeydown(event) { - (event.code === "Enter" || event.code === "NumpadEnter" || event.code === "Space") && this.menuButtonClick(event); - }, "menuButtonKeydown"), onArrowDownKey: /* @__PURE__ */ __name(function onArrowDownKey3(event) { - var processedItem = this.visibleItems[this.focusedItemInfo.index]; - var root11 = processedItem ? isEmpty(processedItem.parent) : null; - if (root11) { - var grouped = this.isProccessedItemGroup(processedItem); - if (grouped) { - this.onItemChange({ - originalEvent: event, - processedItem - }); - this.focusedItemInfo = { - index: -1, - parentKey: processedItem.key - }; - this.onArrowRightKey(event); - } - } else { - var itemIndex = this.focusedItemInfo.index !== -1 ? this.findNextItemIndex(this.focusedItemInfo.index) : this.findFirstFocusedItemIndex(); - this.changeFocusedItemIndex(event, itemIndex); - } + var itemIndex = this.focusedItemInfo.index !== -1 ? this.findNextItemIndex(this.focusedItemInfo.index) : this.findFirstFocusedItemIndex(); + this.changeFocusedItemIndex(event, itemIndex); event.preventDefault(); }, "onArrowDownKey"), onArrowUpKey: /* @__PURE__ */ __name(function onArrowUpKey3(event) { - var _this3 = this; - var processedItem = this.visibleItems[this.focusedItemInfo.index]; - var root11 = isEmpty(processedItem.parent); - if (root11) { - var grouped = this.isProccessedItemGroup(processedItem); - if (grouped) { - this.onItemChange({ + if (event.altKey) { + if (this.focusedItemInfo.index !== -1) { + var processedItem = this.visibleItems[this.focusedItemInfo.index]; + var grouped = this.isProccessedItemGroup(processedItem); + !grouped && this.onItemChange({ originalEvent: event, processedItem }); - this.focusedItemInfo = { - index: -1, - parentKey: processedItem.key - }; - var itemIndex = this.findLastItemIndex(); - this.changeFocusedItemIndex(event, itemIndex); } + this.popup && this.hide(event, true); + event.preventDefault(); } else { - var parentItem = this.activeItemPath.find(function(p) { - return p.key === processedItem.parentKey; - }); - if (this.focusedItemInfo.index === 0) { - this.focusedItemInfo = { - index: -1, - parentKey: parentItem ? parentItem.parentKey : "" - }; - this.searchValue = ""; - this.onArrowLeftKey(event); - this.activeItemPath = this.activeItemPath.filter(function(p) { - return p.parentKey !== _this3.focusedItemInfo.parentKey; - }); - } else { - var _itemIndex = this.focusedItemInfo.index !== -1 ? this.findPrevItemIndex(this.focusedItemInfo.index) : this.findLastFocusedItemIndex(); - this.changeFocusedItemIndex(event, _itemIndex); - } + var itemIndex = this.focusedItemInfo.index !== -1 ? this.findPrevItemIndex(this.focusedItemInfo.index) : this.findLastFocusedItemIndex(); + this.changeFocusedItemIndex(event, itemIndex); + event.preventDefault(); } - event.preventDefault(); }, "onArrowUpKey"), onArrowLeftKey: /* @__PURE__ */ __name(function onArrowLeftKey4(event) { - var _this4 = this; + var _this = this; var processedItem = this.visibleItems[this.focusedItemInfo.index]; - var parentItem = processedItem ? this.activeItemPath.find(function(p) { + var parentItem = this.activeItemPath.find(function(p) { return p.key === processedItem.parentKey; - }) : null; - if (parentItem) { - this.onItemChange({ - originalEvent: event, - processedItem: parentItem - }); - this.activeItemPath = this.activeItemPath.filter(function(p) { - return p.parentKey !== _this4.focusedItemInfo.parentKey; - }); - event.preventDefault(); - } else { - var itemIndex = this.focusedItemInfo.index !== -1 ? this.findPrevItemIndex(this.focusedItemInfo.index) : this.findLastFocusedItemIndex(); - this.changeFocusedItemIndex(event, itemIndex); - event.preventDefault(); + }); + var root12 = isEmpty(processedItem.parent); + if (!root12) { + this.focusedItemInfo = { + index: -1, + parentKey: parentItem ? parentItem.parentKey : "" + }; + this.searchValue = ""; + this.onArrowDownKey(event); } + this.activeItemPath = this.activeItemPath.filter(function(p) { + return p.parentKey !== _this.focusedItemInfo.parentKey; + }); + event.preventDefault(); }, "onArrowLeftKey"), onArrowRightKey: /* @__PURE__ */ __name(function onArrowRightKey4(event) { var processedItem = this.visibleItems[this.focusedItemInfo.index]; - var parentItem = processedItem ? this.activeItemPath.find(function(p) { - return p.key === processedItem.parentKey; - }) : null; - if (parentItem) { - var grouped = this.isProccessedItemGroup(processedItem); - if (grouped) { - this.onItemChange({ - originalEvent: event, - processedItem - }); - this.focusedItemInfo = { - index: -1, - parentKey: processedItem.key - }; - this.onArrowDownKey(event); - } - } else { - var itemIndex = this.focusedItemInfo.index !== -1 ? this.findNextItemIndex(this.focusedItemInfo.index) : this.findFirstFocusedItemIndex(); - this.changeFocusedItemIndex(event, itemIndex); - event.preventDefault(); + var grouped = this.isProccessedItemGroup(processedItem); + if (grouped) { + this.onItemChange({ + originalEvent: event, + processedItem + }); + this.focusedItemInfo = { + index: -1, + parentKey: processedItem.key + }; + this.searchValue = ""; + this.onArrowDownKey(event); } + event.preventDefault(); }, "onArrowRightKey"), onHomeKey: /* @__PURE__ */ __name(function onHomeKey4(event) { this.changeFocusedItemIndex(event, this.findFirstItemIndex()); @@ -8051,11 +7776,13 @@ var script = { onEnterKey: /* @__PURE__ */ __name(function onEnterKey4(event) { if (this.focusedItemInfo.index !== -1) { var element = findSingle(this.menubar, 'li[id="'.concat("".concat(this.focusedItemId), '"]')); - var anchorElement = element && findSingle(element, 'a[data-pc-section="itemlink"]'); + var anchorElement = element && findSingle(element, '[data-pc-section="itemlink"]'); anchorElement ? anchorElement.click() : element && element.click(); - var processedItem = this.visibleItems[this.focusedItemInfo.index]; - var grouped = this.isProccessedItemGroup(processedItem); - !grouped && (this.focusedItemInfo.index = this.findFirstFocusedItemIndex()); + if (!this.popup) { + var processedItem = this.visibleItems[this.focusedItemInfo.index]; + var grouped = this.isProccessedItemGroup(processedItem); + !grouped && (this.focusedItemInfo.index = this.findFirstFocusedItemIndex()); + } } event.preventDefault(); }, "onEnterKey"), @@ -8063,7 +7790,7 @@ var script = { this.onEnterKey(event); }, "onSpaceKey"), onEscapeKey: /* @__PURE__ */ __name(function onEscapeKey3(event) { - if (this.focusedItemInfo.level !== 0) { + if (this.popup || this.focusedItemInfo.level !== 0) { var _focusedItemInfo = this.focusedItemInfo; this.hide(event, false); this.focusedItemInfo = { @@ -8071,6 +7798,7 @@ var script = { level: 0, parentKey: "" }; + this.popup && focus(this.target); } event.preventDefault(); }, "onEscapeKey"), @@ -8085,14 +7813,53 @@ var script = { } this.hide(); }, "onTabKey"), + onEnter: /* @__PURE__ */ __name(function onEnter3(el) { + if (this.autoZIndex) { + ZIndex.set("menu", el, this.baseZIndex + this.$primevue.config.zIndex.menu); + } + addStyle(el, { + position: "absolute", + top: "0", + left: "0" + }); + this.alignOverlay(); + focus(this.menubar); + this.scrollInView(); + }, "onEnter"), + onAfterEnter: /* @__PURE__ */ __name(function onAfterEnter() { + this.bindOutsideClickListener(); + this.bindScrollListener(); + this.bindResizeListener(); + this.$emit("show"); + }, "onAfterEnter"), + onLeave: /* @__PURE__ */ __name(function onLeave2() { + this.unbindOutsideClickListener(); + this.unbindScrollListener(); + this.unbindResizeListener(); + this.$emit("hide"); + this.container = null; + this.dirty = false; + }, "onLeave"), + onAfterLeave: /* @__PURE__ */ __name(function onAfterLeave(el) { + if (this.autoZIndex) { + ZIndex.clear(el); + } + }, "onAfterLeave"), + alignOverlay: /* @__PURE__ */ __name(function alignOverlay2() { + absolutePosition(this.container, this.target); + var targetWidth = getOuterWidth(this.target); + if (targetWidth > getOuterWidth(this.container)) { + this.container.style.minWidth = getOuterWidth(this.target) + "px"; + } + }, "alignOverlay"), bindOutsideClickListener: /* @__PURE__ */ __name(function bindOutsideClickListener3() { - var _this5 = this; + var _this2 = this; if (!this.outsideClickListener) { this.outsideClickListener = function(event) { - var isOutsideContainer = _this5.container && !_this5.container.contains(event.target); - var isOutsideTarget = !(_this5.target && (_this5.target === event.target || _this5.target.contains(event.target))); + var isOutsideContainer = _this2.container && !_this2.container.contains(event.target); + var isOutsideTarget = _this2.popup ? !(_this2.target && (_this2.target === event.target || _this2.target.contains(event.target))) : true; if (isOutsideContainer && isOutsideTarget) { - _this5.hide(); + _this2.hide(); } }; document.addEventListener("click", this.outsideClickListener); @@ -8104,14 +7871,27 @@ var script = { this.outsideClickListener = null; } }, "unbindOutsideClickListener"), + bindScrollListener: /* @__PURE__ */ __name(function bindScrollListener2() { + var _this3 = this; + if (!this.scrollHandler) { + this.scrollHandler = new ConnectedOverlayScrollHandler(this.target, function(event) { + _this3.hide(event, true); + }); + } + this.scrollHandler.bindScrollListener(); + }, "bindScrollListener"), + unbindScrollListener: /* @__PURE__ */ __name(function unbindScrollListener2() { + if (this.scrollHandler) { + this.scrollHandler.unbindScrollListener(); + } + }, "unbindScrollListener"), bindResizeListener: /* @__PURE__ */ __name(function bindResizeListener3() { - var _this6 = this; + var _this4 = this; if (!this.resizeListener) { this.resizeListener = function(event) { if (!isTouchDevice()) { - _this6.hide(event, true); + _this4.hide(event, true); } - _this6.mobileActive = false; }; window.addEventListener("resize", this.resizeListener); } @@ -8122,25 +7902,6 @@ var script = { this.resizeListener = null; } }, "unbindResizeListener"), - bindMatchMediaListener: /* @__PURE__ */ __name(function bindMatchMediaListener() { - var _this7 = this; - if (!this.matchMediaListener) { - var query = matchMedia("(max-width: ".concat(this.breakpoint, ")")); - this.query = query; - this.queryMatches = query.matches; - this.matchMediaListener = function() { - _this7.queryMatches = query.matches; - _this7.mobileActive = false; - }; - this.query.addEventListener("change", this.matchMediaListener); - } - }, "bindMatchMediaListener"), - unbindMatchMediaListener: /* @__PURE__ */ __name(function unbindMatchMediaListener() { - if (this.matchMediaListener) { - this.query.removeEventListener("change", this.matchMediaListener); - this.matchMediaListener = null; - } - }, "unbindMatchMediaListener"), isItemMatched: /* @__PURE__ */ __name(function isItemMatched2(processedItem) { var _this$getProccessedIt; return this.isValidItem(processedItem) && ((_this$getProccessedIt = this.getProccessedItemLabel(processedItem)) === null || _this$getProccessedIt === void 0 ? void 0 : _this$getProccessedIt.toLocaleLowerCase().startsWith(this.searchValue.toLocaleLowerCase())); @@ -8157,35 +7918,35 @@ var script = { }); }, "isSelected"), findFirstItemIndex: /* @__PURE__ */ __name(function findFirstItemIndex2() { - var _this8 = this; + var _this5 = this; return this.visibleItems.findIndex(function(processedItem) { - return _this8.isValidItem(processedItem); + return _this5.isValidItem(processedItem); }); }, "findFirstItemIndex"), findLastItemIndex: /* @__PURE__ */ __name(function findLastItemIndex2() { - var _this9 = this; + var _this6 = this; return findLastIndex(this.visibleItems, function(processedItem) { - return _this9.isValidItem(processedItem); + return _this6.isValidItem(processedItem); }); }, "findLastItemIndex"), findNextItemIndex: /* @__PURE__ */ __name(function findNextItemIndex2(index) { - var _this10 = this; + var _this7 = this; var matchedItemIndex = index < this.visibleItems.length - 1 ? this.visibleItems.slice(index + 1).findIndex(function(processedItem) { - return _this10.isValidItem(processedItem); + return _this7.isValidItem(processedItem); }) : -1; return matchedItemIndex > -1 ? matchedItemIndex + index + 1 : index; }, "findNextItemIndex"), findPrevItemIndex: /* @__PURE__ */ __name(function findPrevItemIndex2(index) { - var _this11 = this; + var _this8 = this; var matchedItemIndex = index > 0 ? findLastIndex(this.visibleItems.slice(0, index), function(processedItem) { - return _this11.isValidItem(processedItem); + return _this8.isValidItem(processedItem); }) : -1; return matchedItemIndex > -1 ? matchedItemIndex : index; }, "findPrevItemIndex"), findSelectedItemIndex: /* @__PURE__ */ __name(function findSelectedItemIndex2() { - var _this12 = this; + var _this9 = this; return this.visibleItems.findIndex(function(processedItem) { - return _this12.isValidSelectedItem(processedItem); + return _this9.isValidSelectedItem(processedItem); }); }, "findSelectedItemIndex"), findFirstFocusedItemIndex: /* @__PURE__ */ __name(function findFirstFocusedItemIndex2() { @@ -8197,20 +7958,20 @@ var script = { return selectedIndex < 0 ? this.findLastItemIndex() : selectedIndex; }, "findLastFocusedItemIndex"), searchItems: /* @__PURE__ */ __name(function searchItems2(event, _char) { - var _this13 = this; + var _this10 = this; this.searchValue = (this.searchValue || "") + _char; var itemIndex = -1; var matched = false; if (this.focusedItemInfo.index !== -1) { itemIndex = this.visibleItems.slice(this.focusedItemInfo.index).findIndex(function(processedItem) { - return _this13.isItemMatched(processedItem); + return _this10.isItemMatched(processedItem); }); itemIndex = itemIndex === -1 ? this.visibleItems.slice(0, this.focusedItemInfo.index).findIndex(function(processedItem) { - return _this13.isItemMatched(processedItem); + return _this10.isItemMatched(processedItem); }) : itemIndex + this.focusedItemInfo.index; } else { itemIndex = this.visibleItems.findIndex(function(processedItem) { - return _this13.isItemMatched(processedItem); + return _this10.isItemMatched(processedItem); }); } if (itemIndex !== -1) { @@ -8225,467 +7986,861 @@ var script = { if (this.searchTimeout) { clearTimeout(this.searchTimeout); } - this.searchTimeout = setTimeout(function() { - _this13.searchValue = ""; - _this13.searchTimeout = null; - }, 500); - return matched; - }, "searchItems"), - changeFocusedItemIndex: /* @__PURE__ */ __name(function changeFocusedItemIndex2(event, index) { - if (this.focusedItemInfo.index !== index) { - this.focusedItemInfo.index = index; - this.scrollInView(); + this.searchTimeout = setTimeout(function() { + _this10.searchValue = ""; + _this10.searchTimeout = null; + }, 500); + return matched; + }, "searchItems"), + changeFocusedItemIndex: /* @__PURE__ */ __name(function changeFocusedItemIndex2(event, index) { + if (this.focusedItemInfo.index !== index) { + this.focusedItemInfo.index = index; + this.scrollInView(); + } + }, "changeFocusedItemIndex"), + scrollInView: /* @__PURE__ */ __name(function scrollInView4() { + var index = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : -1; + var id2 = index !== -1 ? "".concat(this.id, "_").concat(index) : this.focusedItemId; + var element = findSingle(this.menubar, 'li[id="'.concat(id2, '"]')); + if (element) { + element.scrollIntoView && element.scrollIntoView({ + block: "nearest", + inline: "start" + }); + } + }, "scrollInView"), + createProcessedItems: /* @__PURE__ */ __name(function createProcessedItems2(items) { + var _this11 = this; + var level = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 0; + var parent = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {}; + var parentKey = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : ""; + var processedItems3 = []; + items && items.forEach(function(item3, index) { + var key = (parentKey !== "" ? parentKey + "_" : "") + index; + var newItem = { + item: item3, + index, + level, + key, + parent, + parentKey + }; + newItem["items"] = _this11.createProcessedItems(item3.items, level + 1, newItem, key); + processedItems3.push(newItem); + }); + return processedItems3; + }, "createProcessedItems"), + containerRef: /* @__PURE__ */ __name(function containerRef3(el) { + this.container = el; + }, "containerRef"), + menubarRef: /* @__PURE__ */ __name(function menubarRef2(el) { + this.menubar = el ? el.$el : void 0; + }, "menubarRef") + }, + computed: { + processedItems: /* @__PURE__ */ __name(function processedItems2() { + return this.createProcessedItems(this.model || []); + }, "processedItems"), + visibleItems: /* @__PURE__ */ __name(function visibleItems2() { + var _this12 = this; + var processedItem = this.activeItemPath.find(function(p) { + return p.key === _this12.focusedItemInfo.parentKey; + }); + return processedItem ? processedItem.items : this.processedItems; + }, "visibleItems"), + focusedItemId: /* @__PURE__ */ __name(function focusedItemId2() { + return this.focusedItemInfo.index !== -1 ? "".concat(this.id).concat(isNotEmpty(this.focusedItemInfo.parentKey) ? "_" + this.focusedItemInfo.parentKey : "", "_").concat(this.focusedItemInfo.index) : null; + }, "focusedItemId") + }, + components: { + TieredMenuSub: script$1$1, + Portal: script$m + } +}; +var _hoisted_1$5 = ["id"]; +function render$3(_ctx, _cache, $props, $setup, $data, $options) { + var _component_TieredMenuSub = resolveComponent("TieredMenuSub"); + var _component_Portal = resolveComponent("Portal"); + return openBlock(), createBlock(_component_Portal, { + appendTo: _ctx.appendTo, + disabled: !_ctx.popup + }, { + "default": withCtx(function() { + return [createVNode(Transition, mergeProps({ + name: "p-connected-overlay", + onEnter: $options.onEnter, + onAfterEnter: $options.onAfterEnter, + onLeave: $options.onLeave, + onAfterLeave: $options.onAfterLeave + }, _ctx.ptm("transition")), { + "default": withCtx(function() { + return [$data.visible ? (openBlock(), createElementBlock("div", mergeProps({ + key: 0, + ref: $options.containerRef, + id: $data.id, + "class": _ctx.cx("root"), + onClick: _cache[0] || (_cache[0] = function() { + return $options.onOverlayClick && $options.onOverlayClick.apply($options, arguments); + }) + }, _ctx.ptmi("root")), [_ctx.$slots.start ? (openBlock(), createElementBlock("div", mergeProps({ + key: 0, + "class": _ctx.cx("start") + }, _ctx.ptm("start")), [renderSlot(_ctx.$slots, "start")], 16)) : createCommentVNode("", true), createVNode(_component_TieredMenuSub, { + ref: $options.menubarRef, + id: $data.id + "_list", + tabindex: !_ctx.disabled ? _ctx.tabindex : -1, + role: "menubar", + "aria-label": _ctx.ariaLabel, + "aria-labelledby": _ctx.ariaLabelledby, + "aria-disabled": _ctx.disabled || void 0, + "aria-orientation": "vertical", + "aria-activedescendant": $data.focused ? $options.focusedItemId : void 0, + menuId: $data.id, + focusedItemId: $data.focused ? $options.focusedItemId : void 0, + items: $options.processedItems, + templates: _ctx.$slots, + activeItemPath: $data.activeItemPath, + level: 0, + visible: $data.submenuVisible, + pt: _ctx.pt, + unstyled: _ctx.unstyled, + onFocus: $options.onFocus, + onBlur: $options.onBlur, + onKeydown: $options.onKeyDown, + onItemClick: $options.onItemClick, + onItemMouseenter: $options.onItemMouseEnter, + onItemMousemove: $options.onItemMouseMove + }, null, 8, ["id", "tabindex", "aria-label", "aria-labelledby", "aria-disabled", "aria-activedescendant", "menuId", "focusedItemId", "items", "templates", "activeItemPath", "visible", "pt", "unstyled", "onFocus", "onBlur", "onKeydown", "onItemClick", "onItemMouseenter", "onItemMousemove"]), _ctx.$slots.end ? (openBlock(), createElementBlock("div", mergeProps({ + key: 1, + "class": _ctx.cx("end") + }, _ctx.ptm("end")), [renderSlot(_ctx.$slots, "end")], 16)) : createCommentVNode("", true)], 16, _hoisted_1$5)) : createCommentVNode("", true)]; + }), + _: 3 + }, 16, ["onEnter", "onAfterEnter", "onLeave", "onAfterLeave"])]; + }), + _: 3 + }, 8, ["appendTo", "disabled"]); +} +__name(render$3, "render$3"); +script$3.render = render$3; +var theme9 = /* @__PURE__ */ __name(function theme10(_ref) { + var dt = _ref.dt; + return "\n.p-splitbutton {\n display: inline-flex;\n position: relative;\n border-radius: ".concat(dt("splitbutton.border.radius"), ";\n}\n\n.p-splitbutton-button {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n border-right: 0 none;\n}\n\n.p-splitbutton-button:focus-visible,\n.p-splitbutton-dropdown:focus-visible {\n z-index: 1;\n}\n\n.p-splitbutton-button:not(:disabled):hover,\n.p-splitbutton-button:not(:disabled):active {\n border-right: 0 none;\n}\n\n.p-splitbutton-dropdown {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.p-splitbutton .p-menu {\n min-width: 100%;\n}\n\n.p-splitbutton-fluid {\n display: flex;\n}\n\n.p-splitbutton-rounded .p-splitbutton-dropdown {\n border-top-right-radius: ").concat(dt("splitbutton.rounded.border.radius"), ";\n border-bottom-right-radius: ").concat(dt("splitbutton.rounded.border.radius"), ";\n}\n\n.p-splitbutton-rounded .p-splitbutton-button {\n border-top-left-radius: ").concat(dt("splitbutton.rounded.border.radius"), ";\n border-bottom-left-radius: ").concat(dt("splitbutton.rounded.border.radius"), ";\n}\n\n.p-splitbutton-raised {\n box-shadow: ").concat(dt("splitbutton.raised.shadow"), ";\n}\n"); +}, "theme"); +var classes = { + root: /* @__PURE__ */ __name(function root11(_ref2) { + var instance = _ref2.instance, props = _ref2.props; + return ["p-splitbutton p-component", { + "p-splitbutton-raised": props.raised, + "p-splitbutton-rounded": props.rounded, + "p-splitbutton-fluid": instance.hasFluid + }]; + }, "root"), + pcButton: "p-splitbutton-button", + pcDropdown: "p-splitbutton-dropdown" +}; +var SplitButtonStyle = BaseStyle.extend({ + name: "splitbutton", + theme: theme9, + classes +}); +var script$1 = { + name: "BaseSplitButton", + "extends": script$g, + props: { + label: { + type: String, + "default": null + }, + icon: { + type: String, + "default": null + }, + model: { + type: Array, + "default": null + }, + autoZIndex: { + type: Boolean, + "default": true + }, + baseZIndex: { + type: Number, + "default": 0 + }, + appendTo: { + type: [String, Object], + "default": "body" + }, + disabled: { + type: Boolean, + "default": false + }, + fluid: { + type: Boolean, + "default": null + }, + "class": { + type: null, + "default": null + }, + style: { + type: null, + "default": null + }, + buttonProps: { + type: null, + "default": null + }, + menuButtonProps: { + type: null, + "default": null + }, + menuButtonIcon: { + type: String, + "default": void 0 + }, + dropdownIcon: { + type: String, + "default": void 0 + }, + severity: { + type: String, + "default": null + }, + raised: { + type: Boolean, + "default": false + }, + rounded: { + type: Boolean, + "default": false + }, + text: { + type: Boolean, + "default": false + }, + outlined: { + type: Boolean, + "default": false + }, + size: { + type: String, + "default": null + }, + plain: { + type: Boolean, + "default": false + } + }, + style: SplitButtonStyle, + provide: /* @__PURE__ */ __name(function provide13() { + return { + $pcSplitButton: this, + $parentInstance: this + }; + }, "provide") +}; +var script = { + name: "SplitButton", + "extends": script$1, + inheritAttrs: false, + emits: ["click"], + inject: { + $pcFluid: { + "default": null + } + }, + data: /* @__PURE__ */ __name(function data9() { + return { + id: this.$attrs.id, + isExpanded: false + }; + }, "data"), + watch: { + "$attrs.id": /* @__PURE__ */ __name(function $attrsId5(newValue) { + this.id = newValue || UniqueComponentId(); + }, "$attrsId") + }, + mounted: /* @__PURE__ */ __name(function mounted9() { + var _this = this; + this.id = this.id || UniqueComponentId(); + this.$watch("$refs.menu.visible", function(newValue) { + _this.isExpanded = newValue; + }); + }, "mounted"), + methods: { + onDropdownButtonClick: /* @__PURE__ */ __name(function onDropdownButtonClick(event) { + if (event) { + event.preventDefault(); + } + this.$refs.menu.toggle({ + currentTarget: this.$el, + relatedTarget: this.$refs.button.$el + }); + this.isExpanded = this.$refs.menu.visible; + }, "onDropdownButtonClick"), + onDropdownKeydown: /* @__PURE__ */ __name(function onDropdownKeydown(event) { + if (event.code === "ArrowDown" || event.code === "ArrowUp") { + this.onDropdownButtonClick(); + event.preventDefault(); } - }, "changeFocusedItemIndex"), - scrollInView: /* @__PURE__ */ __name(function scrollInView4() { - var index = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : -1; - var id2 = index !== -1 ? "".concat(this.id, "_").concat(index) : this.focusedItemId; - var element = findSingle(this.menubar, 'li[id="'.concat(id2, '"]')); - if (element) { - element.scrollIntoView && element.scrollIntoView({ - block: "nearest", - inline: "start" - }); + }, "onDropdownKeydown"), + onDefaultButtonClick: /* @__PURE__ */ __name(function onDefaultButtonClick(event) { + if (this.isExpanded) { + this.$refs.menu.hide(event); } - }, "scrollInView"), - createProcessedItems: /* @__PURE__ */ __name(function createProcessedItems2(items) { - var _this14 = this; - var level = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 0; - var parent = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {}; - var parentKey = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : ""; - var processedItems3 = []; - items && items.forEach(function(item3, index) { - var key = (parentKey !== "" ? parentKey + "_" : "") + index; - var newItem = { - item: item3, - index, - level, - key, - parent, - parentKey - }; - newItem["items"] = _this14.createProcessedItems(item3.items, level + 1, newItem, key); - processedItems3.push(newItem); - }); - return processedItems3; - }, "createProcessedItems"), - containerRef: /* @__PURE__ */ __name(function containerRef3(el) { - this.container = el; - }, "containerRef"), - menubarRef: /* @__PURE__ */ __name(function menubarRef2(el) { - this.menubar = el ? el.$el : void 0; - }, "menubarRef") + this.$emit("click", event); + }, "onDefaultButtonClick") }, computed: { - processedItems: /* @__PURE__ */ __name(function processedItems2() { - return this.createProcessedItems(this.model || []); - }, "processedItems"), - visibleItems: /* @__PURE__ */ __name(function visibleItems2() { - var _this15 = this; - var processedItem = this.activeItemPath.find(function(p) { - return p.key === _this15.focusedItemInfo.parentKey; - }); - return processedItem ? processedItem.items : this.processedItems; - }, "visibleItems"), - focusedItemId: /* @__PURE__ */ __name(function focusedItemId2() { - return this.focusedItemInfo.index !== -1 ? "".concat(this.id).concat(isNotEmpty(this.focusedItemInfo.parentKey) ? "_" + this.focusedItemInfo.parentKey : "", "_").concat(this.focusedItemInfo.index) : null; - }, "focusedItemId") + containerClass: /* @__PURE__ */ __name(function containerClass() { + return [this.cx("root"), this["class"]]; + }, "containerClass"), + hasFluid: /* @__PURE__ */ __name(function hasFluid2() { + return isEmpty(this.fluid) ? !!this.$pcFluid : this.fluid; + }, "hasFluid") }, components: { - MenubarSub: script$1, - BarsIcon: script$A + PVSButton: script$f, + PVSMenu: script$3, + ChevronDownIcon: script$n } }; -function _typeof(o) { - "@babel/helpers - typeof"; - return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o2) { - return typeof o2; - } : function(o2) { - return o2 && "function" == typeof Symbol && o2.constructor === Symbol && o2 !== Symbol.prototype ? "symbol" : typeof o2; - }, _typeof(o); -} -__name(_typeof, "_typeof"); -function ownKeys(e, r) { - var t = Object.keys(e); - if (Object.getOwnPropertySymbols) { - var o = Object.getOwnPropertySymbols(e); - r && (o = o.filter(function(r2) { - return Object.getOwnPropertyDescriptor(e, r2).enumerable; - })), t.push.apply(t, o); - } - return t; -} -__name(ownKeys, "ownKeys"); -function _objectSpread(e) { - for (var r = 1; r < arguments.length; r++) { - var t = null != arguments[r] ? arguments[r] : {}; - r % 2 ? ownKeys(Object(t), true).forEach(function(r2) { - _defineProperty(e, r2, t[r2]); - }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function(r2) { - Object.defineProperty(e, r2, Object.getOwnPropertyDescriptor(t, r2)); - }); - } - return e; -} -__name(_objectSpread, "_objectSpread"); -function _defineProperty(e, r, t) { - return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e; -} -__name(_defineProperty, "_defineProperty"); -function _toPropertyKey(t) { - var i = _toPrimitive(t, "string"); - return "symbol" == _typeof(i) ? i : i + ""; -} -__name(_toPropertyKey, "_toPropertyKey"); -function _toPrimitive(t, r) { - if ("object" != _typeof(t) || !t) return t; - var e = t[Symbol.toPrimitive]; - if (void 0 !== e) { - var i = e.call(t, r || "default"); - if ("object" != _typeof(i)) return i; - throw new TypeError("@@toPrimitive must return a primitive value."); - } - return ("string" === r ? String : Number)(t); -} -__name(_toPrimitive, "_toPrimitive"); -var _hoisted_1$3 = ["aria-haspopup", "aria-expanded", "aria-controls", "aria-label"]; -function render(_ctx, _cache, $props, $setup, $data, $options) { - var _component_BarsIcon = resolveComponent("BarsIcon"); - var _component_MenubarSub = resolveComponent("MenubarSub"); +var _hoisted_1$4 = ["data-p-severity"]; +function render$2(_ctx, _cache, $props, $setup, $data, $options) { + var _component_PVSButton = resolveComponent("PVSButton"); + var _component_PVSMenu = resolveComponent("PVSMenu"); return openBlock(), createElementBlock("div", mergeProps({ - ref: $options.containerRef, - "class": _ctx.cx("root") - }, _ctx.ptmi("root")), [_ctx.$slots.start ? (openBlock(), createElementBlock("div", mergeProps({ - key: 0, - "class": _ctx.cx("start") - }, _ctx.ptm("start")), [renderSlot(_ctx.$slots, "start")], 16)) : createCommentVNode("", true), renderSlot(_ctx.$slots, _ctx.$slots.button ? "button" : "menubutton", { - id: $data.id, - "class": normalizeClass(_ctx.cx("button")), - toggleCallback: /* @__PURE__ */ __name(function toggleCallback(event) { - return $options.menuButtonClick(event); - }, "toggleCallback") - }, function() { - var _ctx$$primevue$config; - return [_ctx.model && _ctx.model.length > 0 ? (openBlock(), createElementBlock("a", mergeProps({ - key: 0, - ref: "menubutton", - role: "button", - tabindex: "0", - "class": _ctx.cx("button"), - "aria-haspopup": _ctx.model.length && _ctx.model.length > 0 ? true : false, - "aria-expanded": $data.mobileActive, - "aria-controls": $data.id, - "aria-label": (_ctx$$primevue$config = _ctx.$primevue.config.locale.aria) === null || _ctx$$primevue$config === void 0 ? void 0 : _ctx$$primevue$config.navigation, - onClick: _cache[0] || (_cache[0] = function($event) { - return $options.menuButtonClick($event); - }), - onKeydown: _cache[1] || (_cache[1] = function($event) { - return $options.menuButtonKeydown($event); - }) - }, _objectSpread(_objectSpread({}, _ctx.buttonProps), _ctx.ptm("button"))), [renderSlot(_ctx.$slots, _ctx.$slots.buttonicon ? "buttonicon" : "menubuttonicon", {}, function() { - return [createVNode(_component_BarsIcon, normalizeProps(guardReactiveProps(_ctx.ptm("buttonicon"))), null, 16)]; - })], 16, _hoisted_1$3)) : createCommentVNode("", true)]; - }), createVNode(_component_MenubarSub, { - ref: $options.menubarRef, - id: $data.id + "_list", - role: "menubar", - items: $options.processedItems, - templates: _ctx.$slots, - root: true, - mobileActive: $data.mobileActive, - tabindex: "0", - "aria-activedescendant": $data.focused ? $options.focusedItemId : void 0, - menuId: $data.id, - focusedItemId: $data.focused ? $options.focusedItemId : void 0, - activeItemPath: $data.activeItemPath, - level: 0, - "aria-labelledby": _ctx.ariaLabelledby, - "aria-label": _ctx.ariaLabel, - pt: _ctx.pt, + "class": $options.containerClass, + style: _ctx.style + }, _ctx.ptmi("root"), { + "data-p-severity": _ctx.severity + }), [createVNode(_component_PVSButton, mergeProps({ + type: "button", + "class": _ctx.cx("pcButton"), + label: _ctx.label, + disabled: _ctx.disabled, + severity: _ctx.severity, + text: _ctx.text, + icon: _ctx.icon, + outlined: _ctx.outlined, + size: _ctx.size, + fluid: _ctx.fluid, + "aria-label": _ctx.label, + onClick: $options.onDefaultButtonClick + }, _ctx.buttonProps, { + pt: _ctx.ptm("pcButton"), + unstyled: _ctx.unstyled + }), createSlots({ + "default": withCtx(function() { + return [renderSlot(_ctx.$slots, "default")]; + }), + _: 2 + }, [_ctx.$slots.icon ? { + name: "icon", + fn: withCtx(function(slotProps) { + return [renderSlot(_ctx.$slots, "icon", { + "class": normalizeClass(slotProps["class"]) + }, function() { + return [createBaseVNode("span", mergeProps({ + "class": [_ctx.icon, slotProps["class"]] + }, _ctx.ptm("pcButton")["icon"], { + "data-pc-section": "buttonicon" + }), null, 16)]; + })]; + }), + key: "0" + } : void 0]), 1040, ["class", "label", "disabled", "severity", "text", "icon", "outlined", "size", "fluid", "aria-label", "onClick", "pt", "unstyled"]), createVNode(_component_PVSButton, mergeProps({ + ref: "button", + type: "button", + "class": _ctx.cx("pcDropdown"), + disabled: _ctx.disabled, + "aria-haspopup": "true", + "aria-expanded": $data.isExpanded, + "aria-controls": $data.id + "_overlay", + onClick: $options.onDropdownButtonClick, + onKeydown: $options.onDropdownKeydown, + severity: _ctx.severity, + text: _ctx.text, + outlined: _ctx.outlined, + size: _ctx.size, + unstyled: _ctx.unstyled + }, _ctx.menuButtonProps, { + pt: _ctx.ptm("pcDropdown") + }), { + icon: withCtx(function(slotProps) { + return [renderSlot(_ctx.$slots, _ctx.$slots.dropdownicon ? "dropdownicon" : "menubuttonicon", { + "class": normalizeClass(slotProps["class"]) + }, function() { + return [(openBlock(), createBlock(resolveDynamicComponent(_ctx.menuButtonIcon || _ctx.dropdownIcon ? "span" : "ChevronDownIcon"), mergeProps({ + "class": [_ctx.dropdownIcon || _ctx.menuButtonIcon, slotProps["class"]] + }, _ctx.ptm("pcDropdown")["icon"], { + "data-pc-section": "menubuttonicon" + }), null, 16, ["class"]))]; + })]; + }), + _: 3 + }, 16, ["class", "disabled", "aria-expanded", "aria-controls", "onClick", "onKeydown", "severity", "text", "outlined", "size", "unstyled", "pt"]), createVNode(_component_PVSMenu, { + ref: "menu", + id: $data.id + "_overlay", + model: _ctx.model, + popup: true, + autoZIndex: _ctx.autoZIndex, + baseZIndex: _ctx.baseZIndex, + appendTo: _ctx.appendTo, unstyled: _ctx.unstyled, - onFocus: $options.onFocus, - onBlur: $options.onBlur, - onKeydown: $options.onKeyDown, - onItemClick: $options.onItemClick, - onItemMouseenter: $options.onItemMouseEnter, - onItemMousemove: $options.onItemMouseMove - }, null, 8, ["id", "items", "templates", "mobileActive", "aria-activedescendant", "menuId", "focusedItemId", "activeItemPath", "aria-labelledby", "aria-label", "pt", "unstyled", "onFocus", "onBlur", "onKeydown", "onItemClick", "onItemMouseenter", "onItemMousemove"]), _ctx.$slots.end ? (openBlock(), createElementBlock("div", mergeProps({ - key: 1, - "class": _ctx.cx("end") - }, _ctx.ptm("end")), [renderSlot(_ctx.$slots, "end")], 16)) : createCommentVNode("", true)], 16); + pt: _ctx.ptm("pcMenu") + }, createSlots({ + _: 2 + }, [_ctx.$slots.menuitemicon ? { + name: "itemicon", + fn: withCtx(function(slotProps) { + return [renderSlot(_ctx.$slots, "menuitemicon", { + item: slotProps.item, + "class": normalizeClass(slotProps["class"]) + })]; + }), + key: "0" + } : void 0, _ctx.$slots.item ? { + name: "item", + fn: withCtx(function(slotProps) { + return [renderSlot(_ctx.$slots, "item", { + item: slotProps.item, + hasSubmenu: slotProps.hasSubmenu, + label: slotProps.label, + props: slotProps.props + })]; + }), + key: "1" + } : void 0]), 1032, ["id", "model", "autoZIndex", "baseZIndex", "appendTo", "unstyled", "pt"])], 16, _hoisted_1$4); } -__name(render, "render"); -script.render = render; -const _withScopeId$2 = /* @__PURE__ */ __name((n) => (pushScopeId("data-v-6fecd137"), n = n(), popScopeId(), n), "_withScopeId$2"); -const _hoisted_1$2 = ["href"]; -const _hoisted_2$2 = { class: "p-menubar-item-label" }; -const _hoisted_3$1 = { - key: 1, - class: "ml-auto border border-surface rounded text-muted text-xs p-1 keybinding-tag" -}; -const _sfc_main$4 = /* @__PURE__ */ defineComponent({ - __name: "CommandMenubar", +__name(render$2, "render$2"); +script.render = render$2; +const minQueueCount = 1; +const _sfc_main$5 = /* @__PURE__ */ defineComponent({ + __name: "BatchCountEdit", + props: { + class: { default: "" } + }, setup(__props) { + const props = __props; + const queueSettingsStore = useQueueSettingsStore(); + const { batchCount } = storeToRefs(queueSettingsStore); const settingStore = useSettingStore(); - const dropdownDirection = computed( - () => settingStore.get("Comfy.UseNewMenu") === "Top" ? "down" : "up" + const maxQueueCount = computed( + () => settingStore.get("Comfy.QueueButton.BatchCountLimit") ); - const menuItemsStore = useMenuItemStore(); + const handleClick = /* @__PURE__ */ __name((increment) => { + let newCount; + if (increment) { + const originalCount = batchCount.value - 1; + newCount = Math.min(originalCount * 2, maxQueueCount.value); + } else { + const originalCount = batchCount.value + 1; + newCount = Math.floor(originalCount / 2); + } + batchCount.value = newCount; + }, "handleClick"); + return (_ctx, _cache) => { + const _directive_tooltip = resolveDirective("tooltip"); + return withDirectives((openBlock(), createElementBlock("div", { + class: normalizeClass(["batch-count", props.class]) + }, [ + createVNode(unref(script$E), { + class: "w-14", + modelValue: unref(batchCount), + "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => isRef(batchCount) ? batchCount.value = $event : null), + min: minQueueCount, + max: maxQueueCount.value, + fluid: "", + showButtons: "", + pt: { + incrementButton: { + class: "w-6", + onmousedown: /* @__PURE__ */ __name(() => { + handleClick(true); + }, "onmousedown") + }, + decrementButton: { + class: "w-6", + onmousedown: /* @__PURE__ */ __name(() => { + handleClick(false); + }, "onmousedown") + } + } + }, null, 8, ["modelValue", "max", "pt"]) + ], 2)), [ + [ + _directive_tooltip, + _ctx.$t("menu.batchCount"), + void 0, + { bottom: true } + ] + ]); + }; + } +}); +const BatchCountEdit = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["__scopeId", "data-v-1163a5d2"]]); +const _withScopeId$1 = /* @__PURE__ */ __name((n) => (pushScopeId("data-v-d3897845"), n = n(), popScopeId(), n), "_withScopeId$1"); +const _hoisted_1$3 = { class: "queue-button-group flex" }; +const _sfc_main$4 = /* @__PURE__ */ defineComponent({ + __name: "ComfyQueueButton", + setup(__props) { + const workspaceStore = useWorkspaceStore(); + const queueCountStore = storeToRefs(useQueuePendingTaskCountStore()); + const { mode: queueMode } = storeToRefs(useQueueSettingsStore()); const { t } = useI18n(); - const translateMenuItem = /* @__PURE__ */ __name((item3) => { - const label = typeof item3.label === "function" ? item3.label() : item3.label; - const translatedLabel = label ? t(`menuLabels.${normalizeI18nKey(label)}`, label) : void 0; - return { - ...item3, - label: translatedLabel, - items: item3.items?.map(translateMenuItem) - }; - }, "translateMenuItem"); - const translatedItems = computed( - () => menuItemsStore.menuItems.map(translateMenuItem) + const queueModeMenuItemLookup = computed(() => ({ + disabled: { + key: "disabled", + label: t("menu.queue"), + tooltip: t("menu.disabledTooltip"), + command: /* @__PURE__ */ __name(() => { + queueMode.value = "disabled"; + }, "command") + }, + instant: { + key: "instant", + label: `${t("menu.queue")} (${t("menu.instant")})`, + tooltip: t("menu.instantTooltip"), + command: /* @__PURE__ */ __name(() => { + queueMode.value = "instant"; + }, "command") + }, + change: { + key: "change", + label: `${t("menu.queue")} (${t("menu.onChange")})`, + tooltip: t("menu.onChangeTooltip"), + command: /* @__PURE__ */ __name(() => { + queueMode.value = "change"; + }, "command") + } + })); + const activeQueueModeMenuItem = computed( + () => queueModeMenuItemLookup.value[queueMode.value] + ); + const queueModeMenuItems = computed( + () => Object.values(queueModeMenuItemLookup.value) ); + const executingPrompt = computed(() => !!queueCountStore.count.value); + const hasPendingTasks = computed(() => queueCountStore.count.value > 1); + const commandStore = useCommandStore(); + const queuePrompt = /* @__PURE__ */ __name((e) => { + const commandId = e.shiftKey ? "Comfy.QueuePromptFront" : "Comfy.QueuePrompt"; + commandStore.execute(commandId); + }, "queuePrompt"); return (_ctx, _cache) => { - return openBlock(), createBlock(unref(script), { - model: translatedItems.value, - class: "top-menubar border-none p-0 bg-transparent", - pt: { - rootList: "gap-0 flex-nowrap w-auto", - submenu: `dropdown-direction-${dropdownDirection.value}`, - item: "relative" - } - }, { - item: withCtx(({ item: item3, props }) => [ - createBaseVNode("a", mergeProps({ class: "p-menubar-item-link" }, props.action, { - href: item3.url, - target: "_blank" - }), [ - item3.icon ? (openBlock(), createElementBlock("span", { - key: 0, - class: normalizeClass(["p-menubar-item-icon", item3.icon]) - }, null, 2)) : createCommentVNode("", true), - createBaseVNode("span", _hoisted_2$2, toDisplayString(item3.label), 1), - item3?.comfyCommand?.keybinding ? (openBlock(), createElementBlock("span", _hoisted_3$1, toDisplayString(item3.comfyCommand.keybinding.combo.toString()), 1)) : createCommentVNode("", true) - ], 16, _hoisted_1$2) + const _component_i_lucide58list_start = __unplugin_components_0$1; + const _component_i_lucide58play = __unplugin_components_1$1; + const _component_i_lucide58fast_forward = __unplugin_components_2; + const _component_i_lucide58step_forward = __unplugin_components_3; + const _directive_tooltip = resolveDirective("tooltip"); + return openBlock(), createElementBlock("div", _hoisted_1$3, [ + withDirectives((openBlock(), createBlock(unref(script), { + class: "comfyui-queue-button", + label: activeQueueModeMenuItem.value.label, + severity: "primary", + size: "small", + onClick: queuePrompt, + model: queueModeMenuItems.value, + "data-testid": "queue-button" + }, { + icon: withCtx(() => [ + unref(workspaceStore).shiftDown ? (openBlock(), createBlock(_component_i_lucide58list_start, { key: 0 })) : unref(queueMode) === "disabled" ? (openBlock(), createBlock(_component_i_lucide58play, { key: 1 })) : unref(queueMode) === "instant" ? (openBlock(), createBlock(_component_i_lucide58fast_forward, { key: 2 })) : unref(queueMode) === "change" ? (openBlock(), createBlock(_component_i_lucide58step_forward, { key: 3 })) : createCommentVNode("", true) + ]), + item: withCtx(({ item: item3 }) => [ + withDirectives(createVNode(unref(script$f), { + label: item3.label, + icon: item3.icon, + severity: item3.key === unref(queueMode) ? "primary" : "secondary", + size: "small", + text: "" + }, null, 8, ["label", "icon", "severity"]), [ + [_directive_tooltip, item3.tooltip] + ]) + ]), + _: 1 + }, 8, ["label", "model"])), [ + [ + _directive_tooltip, + unref(workspaceStore).shiftDown ? _ctx.$t("menu.queueWorkflowFront") : _ctx.$t("menu.queueWorkflow"), + void 0, + { bottom: true } + ] ]), - _: 1 - }, 8, ["model", "pt"]); + createVNode(BatchCountEdit), + createVNode(unref(script$7), { class: "execution-actions flex flex-nowrap" }, { + default: withCtx(() => [ + withDirectives(createVNode(unref(script$f), { + icon: "pi pi-times", + severity: executingPrompt.value ? "danger" : "secondary", + disabled: !executingPrompt.value, + text: "", + onClick: _cache[0] || (_cache[0] = () => unref(commandStore).execute("Comfy.Interrupt")) + }, null, 8, ["severity", "disabled"]), [ + [ + _directive_tooltip, + _ctx.$t("menu.interrupt"), + void 0, + { bottom: true } + ] + ]), + withDirectives(createVNode(unref(script$f), { + icon: "pi pi-stop", + severity: hasPendingTasks.value ? "danger" : "secondary", + disabled: !hasPendingTasks.value, + text: "", + onClick: _cache[1] || (_cache[1] = () => unref(commandStore).execute("Comfy.ClearPendingTasks")) + }, null, 8, ["severity", "disabled"]), [ + [ + _directive_tooltip, + _ctx.$t("sideToolbar.queueTab.clearPendingTasks"), + void 0, + { bottom: true } + ] + ]) + ]), + _: 1 + }) + ]); }; } }); -const CommandMenubar = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["__scopeId", "data-v-6fecd137"]]); -const _withScopeId$1 = /* @__PURE__ */ __name((n) => (pushScopeId("data-v-8d011a31"), n = n(), popScopeId(), n), "_withScopeId$1"); -const _hoisted_1$1 = { class: "workflow-label text-sm max-w-[150px] truncate inline-block" }; -const _hoisted_2$1 = { class: "relative" }; -const _hoisted_3 = { - key: 0, - class: "status-indicator" -}; +const ComfyQueueButton = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["__scopeId", "data-v-d3897845"]]); +const overlapThreshold = 20; const _sfc_main$3 = /* @__PURE__ */ defineComponent({ - __name: "WorkflowTab", - props: { - class: {}, - workflowOption: {} - }, + __name: "ComfyActionbar", setup(__props) { - const props = __props; - const workspaceStore = useWorkspaceStore(); - const workflowStore = useWorkflowStore(); - const workflowTabRef = ref(null); - const closeWorkflows = /* @__PURE__ */ __name(async (options) => { - for (const opt of options) { - if (!await useWorkflowService().closeWorkflow(opt.workflow, { - warnIfUnsaved: !workspaceStore.shiftDown - })) { - break; + const settingsStore = useSettingStore(); + const visible = computed( + () => settingsStore.get("Comfy.UseNewMenu") !== "Disabled" + ); + const panelRef = ref(null); + const dragHandleRef = ref(null); + const isDocked = useLocalStorage("Comfy.MenuPosition.Docked", false); + const storedPosition = useLocalStorage("Comfy.MenuPosition.Floating", { + x: 0, + y: 0 + }); + const { + x, + y, + style, + isDragging + } = useDraggable(panelRef, { + initialValue: { x: 0, y: 0 }, + handle: dragHandleRef, + containerElement: document.body + }); + watchDebounced( + [x, y], + ([newX, newY]) => { + storedPosition.value = { x: newX, y: newY }; + }, + { debounce: 300 } + ); + const setInitialPosition = /* @__PURE__ */ __name(() => { + if (x.value !== 0 || y.value !== 0) { + return; + } + if (storedPosition.value.x !== 0 || storedPosition.value.y !== 0) { + x.value = storedPosition.value.x; + y.value = storedPosition.value.y; + captureLastDragState(); + return; + } + if (panelRef.value) { + const screenWidth = window.innerWidth; + const screenHeight = window.innerHeight; + const menuWidth = panelRef.value.offsetWidth; + const menuHeight = panelRef.value.offsetHeight; + if (menuWidth === 0 || menuHeight === 0) { + return; } + x.value = (screenWidth - menuWidth) / 2; + y.value = screenHeight - menuHeight - 10; + captureLastDragState(); + } + }, "setInitialPosition"); + onMounted(setInitialPosition); + watch(visible, (newVisible) => { + if (newVisible) { + nextTick(setInitialPosition); } - }, "closeWorkflows"); - const onCloseWorkflow = /* @__PURE__ */ __name((option2) => { - closeWorkflows([option2]); - }, "onCloseWorkflow"); - const tabGetter = /* @__PURE__ */ __name(() => workflowTabRef.value, "tabGetter"); - usePragmaticDraggable(tabGetter, { - getInitialData: /* @__PURE__ */ __name(() => { - return { - workflowKey: props.workflowOption.workflow.key - }; - }, "getInitialData") }); - usePragmaticDroppable(tabGetter, { - getData: /* @__PURE__ */ __name(() => { - return { - workflowKey: props.workflowOption.workflow.key - }; - }, "getData"), - onDrop: /* @__PURE__ */ __name((e) => { - const fromIndex = workflowStore.openWorkflows.findIndex( - (wf) => wf.key === e.source.data.workflowKey - ); - const toIndex = workflowStore.openWorkflows.findIndex( - (wf) => wf.key === e.location.current.dropTargets[0]?.data.workflowKey + const lastDragState = ref({ + x: x.value, + y: y.value, + windowWidth: window.innerWidth, + windowHeight: window.innerHeight + }); + const captureLastDragState = /* @__PURE__ */ __name(() => { + lastDragState.value = { + x: x.value, + y: y.value, + windowWidth: window.innerWidth, + windowHeight: window.innerHeight + }; + }, "captureLastDragState"); + watch( + isDragging, + (newIsDragging) => { + if (!newIsDragging) { + captureLastDragState(); + } + }, + { immediate: true } + ); + const adjustMenuPosition = /* @__PURE__ */ __name(() => { + if (panelRef.value) { + const screenWidth = window.innerWidth; + const screenHeight = window.innerHeight; + const menuWidth = panelRef.value.offsetWidth; + const menuHeight = panelRef.value.offsetHeight; + const distanceLeft = lastDragState.value.x; + const distanceRight = lastDragState.value.windowWidth - (lastDragState.value.x + menuWidth); + const distanceTop = lastDragState.value.y; + const distanceBottom = lastDragState.value.windowHeight - (lastDragState.value.y + menuHeight); + const distances = [ + { edge: "left", distance: distanceLeft }, + { edge: "right", distance: distanceRight }, + { edge: "top", distance: distanceTop }, + { edge: "bottom", distance: distanceBottom } + ]; + const closestEdge = distances.reduce( + (min, curr) => curr.distance < min.distance ? curr : min ); - if (fromIndex !== toIndex) { - workflowStore.reorderWorkflows(fromIndex, toIndex); + const verticalRatio = lastDragState.value.y / lastDragState.value.windowHeight; + const horizontalRatio = lastDragState.value.x / lastDragState.value.windowWidth; + if (closestEdge.edge === "left") { + x.value = closestEdge.distance; + y.value = verticalRatio * screenHeight; + } else if (closestEdge.edge === "right") { + x.value = screenWidth - menuWidth - closestEdge.distance; + y.value = verticalRatio * screenHeight; + } else if (closestEdge.edge === "top") { + x.value = horizontalRatio * screenWidth; + y.value = closestEdge.distance; + } else { + x.value = horizontalRatio * screenWidth; + y.value = screenHeight - menuHeight - closestEdge.distance; } - }, "onDrop") + x.value = lodashExports.clamp(x.value, 0, screenWidth - menuWidth); + y.value = lodashExports.clamp(y.value, 0, screenHeight - menuHeight); + } + }, "adjustMenuPosition"); + useEventListener(window, "resize", adjustMenuPosition); + const topMenuRef = inject("topMenuRef"); + const topMenuBounds = useElementBounding(topMenuRef); + const isOverlappingWithTopMenu = computed(() => { + if (!panelRef.value) { + return false; + } + const { height } = panelRef.value.getBoundingClientRect(); + const actionbarBottom = y.value + height; + const topMenuBottom = topMenuBounds.bottom.value; + const overlapPixels = Math.min(actionbarBottom, topMenuBottom) - Math.max(y.value, topMenuBounds.top.value); + return overlapPixels > overlapThreshold; }); - return (_ctx, _cache) => { - const _directive_tooltip = resolveDirective("tooltip"); - return openBlock(), createElementBlock("div", mergeProps({ - class: "flex p-2 gap-2 workflow-tab", - ref_key: "workflowTabRef", - ref: workflowTabRef - }, _ctx.$attrs), [ - withDirectives((openBlock(), createElementBlock("span", _hoisted_1$1, [ - createTextVNode(toDisplayString(_ctx.workflowOption.workflow.filename), 1) - ])), [ - [ - _directive_tooltip, - _ctx.workflowOption.workflow.key, - void 0, - { bottom: true } - ] + watch(isDragging, (newIsDragging) => { + if (!newIsDragging) { + isDocked.value = isOverlappingWithTopMenu.value; + } else { + isDocked.value = false; + } + }); + const eventBus = useEventBus("topMenu"); + watch([isDragging, isOverlappingWithTopMenu], ([dragging, overlapping]) => { + eventBus.emit("updateHighlight", { + isDragging: dragging, + isOverlapping: overlapping + }); + }); + return (_ctx, _cache) => { + return openBlock(), createBlock(unref(script$4), { + class: normalizeClass(["actionbar w-fit", { "is-dragging": unref(isDragging), "is-docked": unref(isDocked) }]), + style: normalizeStyle(unref(style)) + }, { + default: withCtx(() => [ + createBaseVNode("div", { + class: "actionbar-content flex items-center", + ref_key: "panelRef", + ref: panelRef + }, [ + createBaseVNode("span", { + class: "drag-handle cursor-move mr-2 p-0!", + ref_key: "dragHandleRef", + ref: dragHandleRef + }, null, 512), + createVNode(ComfyQueueButton) + ], 512) ]), - createBaseVNode("div", _hoisted_2$1, [ - !unref(workspaceStore).shiftDown && (_ctx.workflowOption.workflow.isModified || !_ctx.workflowOption.workflow.isPersisted) ? (openBlock(), createElementBlock("span", _hoisted_3, "•")) : createCommentVNode("", true), - createVNode(unref(script$d), { - class: "close-button p-0 w-auto", - icon: "pi pi-times", - text: "", - severity: "secondary", - size: "small", - onClick: _cache[0] || (_cache[0] = withModifiers(($event) => onCloseWorkflow(_ctx.workflowOption), ["stop"])) - }) - ]) - ], 16); + _: 1 + }, 8, ["style", "class"]); }; } }); -const WorkflowTab = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["__scopeId", "data-v-8d011a31"]]); +const Actionbar = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["__scopeId", "data-v-6a1bcb8c"]]); +const _hoisted_1$2 = { + viewBox: "0 0 24 24", + width: "1.2em", + height: "1.2em" +}; +const _hoisted_2$2 = /* @__PURE__ */ createBaseVNode("path", { + fill: "currentColor", + d: "M5 21q-.825 0-1.412-.587T3 19V5q0-.825.588-1.412T5 3h14q.825 0 1.413.588T21 5v14q0 .825-.587 1.413T19 21zm0-5v3h14v-3zm0-2h14V5H5zm0 2v3z" +}, null, -1); +const _hoisted_3$1 = [ + _hoisted_2$2 +]; +function render$1(_ctx, _cache) { + return openBlock(), createElementBlock("svg", _hoisted_1$2, [..._hoisted_3$1]); +} +__name(render$1, "render$1"); +const __unplugin_components_1 = markRaw({ name: "material-symbols-dock-to-bottom-outline", render: render$1 }); +const _hoisted_1$1 = { + viewBox: "0 0 24 24", + width: "1.2em", + height: "1.2em" +}; +const _hoisted_2$1 = /* @__PURE__ */ createBaseVNode("path", { + fill: "currentColor", + d: "M5 21q-.825 0-1.412-.587T3 19V5q0-.825.588-1.412T5 3h14q.825 0 1.413.588T21 5v14q0 .825-.587 1.413T19 21zm0-7h14V5H5z" +}, null, -1); +const _hoisted_3 = [ + _hoisted_2$1 +]; +function render(_ctx, _cache) { + return openBlock(), createElementBlock("svg", _hoisted_1$1, [..._hoisted_3]); +} +__name(render, "render"); +const __unplugin_components_0 = markRaw({ name: "material-symbols-dock-to-bottom", render }); const _sfc_main$2 = /* @__PURE__ */ defineComponent({ - __name: "WorkflowTabs", - props: { - class: {} - }, + __name: "BottomPanelToggleButton", setup(__props) { - const props = __props; - const { t } = useI18n(); - const workspaceStore = useWorkspaceStore(); - const workflowStore = useWorkflowStore(); - const workflowService = useWorkflowService(); - const rightClickedTab = ref(null); - const menu = ref(); - const workflowToOption = /* @__PURE__ */ __name((workflow) => ({ - value: workflow.path, - workflow - }), "workflowToOption"); - const options = computed( - () => workflowStore.openWorkflows.map(workflowToOption) - ); - const selectedWorkflow = computed( - () => workflowStore.activeWorkflow ? workflowToOption(workflowStore.activeWorkflow) : null - ); - const onWorkflowChange = /* @__PURE__ */ __name((option2) => { - if (!option2) { - return; - } - if (selectedWorkflow.value?.value === option2.value) { - return; - } - workflowService.openWorkflow(option2.workflow); - }, "onWorkflowChange"); - const closeWorkflows = /* @__PURE__ */ __name(async (options2) => { - for (const opt of options2) { - if (!await workflowService.closeWorkflow(opt.workflow, { - warnIfUnsaved: !workspaceStore.shiftDown - })) { - break; - } - } - }, "closeWorkflows"); - const onCloseWorkflow = /* @__PURE__ */ __name((option2) => { - closeWorkflows([option2]); - }, "onCloseWorkflow"); - const showContextMenu = /* @__PURE__ */ __name((event, option2) => { - rightClickedTab.value = option2; - menu.value.show(event); - }, "showContextMenu"); - const contextMenuItems = computed(() => { - const tab = rightClickedTab.value; - if (!tab) return []; - const index = options.value.findIndex((v) => v.workflow === tab.workflow); - return [ - { - label: t("tabMenu.duplicateTab"), - command: /* @__PURE__ */ __name(() => { - workflowService.duplicateWorkflow(tab.workflow); - }, "command") - }, - { - separator: true - }, - { - label: t("tabMenu.closeTab"), - command: /* @__PURE__ */ __name(() => onCloseWorkflow(tab), "command") - }, - { - label: t("tabMenu.closeTabsToLeft"), - command: /* @__PURE__ */ __name(() => closeWorkflows(options.value.slice(0, index)), "command"), - disabled: index <= 0 - }, - { - label: t("tabMenu.closeTabsToRight"), - command: /* @__PURE__ */ __name(() => closeWorkflows(options.value.slice(index + 1)), "command"), - disabled: index === options.value.length - 1 - }, - { - label: t("tabMenu.closeOtherTabs"), - command: /* @__PURE__ */ __name(() => closeWorkflows([ - ...options.value.slice(index + 1), - ...options.value.slice(0, index) - ]), "command"), - disabled: options.value.length <= 1 - } - ]; - }); - const commandStore = useCommandStore(); + const bottomPanelStore = useBottomPanelStore(); return (_ctx, _cache) => { - return openBlock(), createElementBlock(Fragment, null, [ - createVNode(unref(script$B), { - class: normalizeClass(["workflow-tabs bg-transparent inline", props.class]), - modelValue: selectedWorkflow.value, - "onUpdate:modelValue": onWorkflowChange, - options: options.value, - optionLabel: "label", - dataKey: "value" - }, { - option: withCtx(({ option: option2 }) => [ - createVNode(WorkflowTab, { - onContextmenu: /* @__PURE__ */ __name(($event) => showContextMenu($event, option2), "onContextmenu"), - onMouseup: withModifiers(($event) => onCloseWorkflow(option2), ["middle"]), - "workflow-option": option2 - }, null, 8, ["onContextmenu", "onMouseup", "workflow-option"]) - ]), - _: 1 - }, 8, ["class", "modelValue", "options"]), - createVNode(unref(script$d), { - class: "new-blank-workflow-button", - icon: "pi pi-plus", - text: "", - severity: "secondary", - onClick: _cache[0] || (_cache[0] = () => unref(commandStore).execute("Comfy.NewBlankWorkflow")) - }), - createVNode(unref(script$C), { - ref_key: "menu", - ref: menu, - model: contextMenuItems.value - }, null, 8, ["model"]) - ], 64); + const _component_i_material_symbols58dock_to_bottom = __unplugin_components_0; + const _component_i_material_symbols58dock_to_bottom_outline = __unplugin_components_1; + const _directive_tooltip = resolveDirective("tooltip"); + return withDirectives((openBlock(), createBlock(unref(script$f), { + severity: "secondary", + text: "", + onClick: unref(bottomPanelStore).toggleBottomPanel + }, { + icon: withCtx(() => [ + unref(bottomPanelStore).bottomPanelVisible ? (openBlock(), createBlock(_component_i_material_symbols58dock_to_bottom, { key: 0 })) : (openBlock(), createBlock(_component_i_material_symbols58dock_to_bottom_outline, { key: 1 })) + ]), + _: 1 + }, 8, ["onClick"])), [ + [vShow, unref(bottomPanelStore).bottomPanelTabs.length > 0], + [_directive_tooltip, { value: _ctx.$t("menu.toggleBottomPanel"), showDelay: 300 }] + ]); }; } }); -const WorkflowTabs = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__scopeId", "data-v-d485c044"]]); -const _withScopeId = /* @__PURE__ */ __name((n) => (pushScopeId("data-v-878b63b8"), n = n(), popScopeId(), n), "_withScopeId"); +const _withScopeId = /* @__PURE__ */ __name((n) => (pushScopeId("data-v-d792da31"), n = n(), popScopeId(), n), "_withScopeId"); const _hoisted_1 = /* @__PURE__ */ _withScopeId(() => /* @__PURE__ */ createBaseVNode("h1", { class: "comfyui-logo mx-2" }, "ComfyUI", -1)); const _hoisted_2 = { class: "flex-grow" }; const _sfc_main$1 = /* @__PURE__ */ defineComponent({ @@ -8729,7 +8884,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({ }, [ _hoisted_1, createVNode(CommandMenubar), - createVNode(unref(script$D), { + createVNode(unref(script$F), { layout: "vertical", class: "mx-2" }), @@ -8742,8 +8897,8 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({ ref: menuRight }, null, 512), createVNode(Actionbar), - createVNode(_sfc_main$5), - withDirectives(createVNode(unref(script$d), { + createVNode(_sfc_main$2), + withDirectives(createVNode(unref(script$f), { icon: "pi pi-bars", severity: "secondary", text: "", @@ -8759,7 +8914,37 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({ }; } }); -const TopMenubar = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-878b63b8"]]); +const TopMenubar = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-d792da31"]]); +function setupAutoQueueHandler() { + const queueCountStore = useQueuePendingTaskCountStore(); + const queueSettingsStore = useQueueSettingsStore(); + let graphHasChanged = false; + let internalCount = 0; + api.addEventListener("graphChanged", () => { + if (queueSettingsStore.mode === "change") { + if (internalCount) { + graphHasChanged = true; + } else { + graphHasChanged = false; + app.queuePrompt(0, queueSettingsStore.batchCount); + internalCount++; + } + } + }); + queueCountStore.$subscribe( + () => { + internalCount = queueCountStore.count; + if (!internalCount && !app.lastExecutionError) { + if (queueSettingsStore.mode === "instant" || queueSettingsStore.mode === "change" && graphHasChanged) { + graphHasChanged = false; + app.queuePrompt(0, queueSettingsStore.batchCount); + } + } + }, + { detached: true } + ); +} +__name(setupAutoQueueHandler, "setupAutoQueueHandler"); var LatentPreviewMethod = /* @__PURE__ */ ((LatentPreviewMethod2) => { LatentPreviewMethod2["NoPreviews"] = "none"; LatentPreviewMethod2["Auto"] = "auto"; @@ -9239,9 +9424,8 @@ const SERVER_CONFIG_ITEMS = [ ]; function useCoreCommands() { const workflowService = useWorkflowService(); - const workflowStore = useWorkflowStore(); const dialogService = useDialogService(); - const getTracker = /* @__PURE__ */ __name(() => workflowStore.activeWorkflow?.changeTracker, "getTracker"); + const getTracker = /* @__PURE__ */ __name(() => useWorkflowStore()?.activeWorkflow?.changeTracker, "getTracker"); const getSelectedNodes = /* @__PURE__ */ __name(() => { const selectedNodes = app.canvas.selected_nodes; const result = []; @@ -9715,49 +9899,47 @@ function useCoreCommands() { function: /* @__PURE__ */ __name(() => { dialogService.showSettingsDialog("about"); }, "function") - }, - { - id: "Comfy.DuplicateWorkflow", - icon: "pi pi-clone", - label: "Duplicate Current Workflow", - versionAdded: "1.6.15", - function: /* @__PURE__ */ __name(() => { - workflowService.duplicateWorkflow(workflowStore.activeWorkflow); - }, "function") } ]; } __name(useCoreCommands, "useCoreCommands"); -function setupAutoQueueHandler() { - const queueCountStore = useQueuePendingTaskCountStore(); - const queueSettingsStore = useQueueSettingsStore(); - let graphHasChanged = false; - let internalCount = 0; - api.addEventListener("graphChanged", () => { - if (queueSettingsStore.mode === "change") { - if (internalCount) { - graphHasChanged = true; - } else { - graphHasChanged = false; - app.queuePrompt(0, queueSettingsStore.batchCount); - internalCount++; - } +const useKeybindingService = /* @__PURE__ */ __name(() => { + const keybindingStore = useKeybindingStore(); + const commandStore = useCommandStore(); + const keybindHandler = /* @__PURE__ */ __name(async function(event) { + const keyCombo = KeyComboImpl.fromEvent(event); + if (keyCombo.isModifier) { + return; } - }); - queueCountStore.$subscribe( - () => { - internalCount = queueCountStore.count; - if (!internalCount && !app.lastExecutionError) { - if (queueSettingsStore.mode === "instant" || queueSettingsStore.mode === "change" && graphHasChanged) { - graphHasChanged = false; - app.queuePrompt(0, queueSettingsStore.batchCount); + const target = event.composedPath()[0]; + if (!keyCombo.hasModifier && (target.tagName === "TEXTAREA" || target.tagName === "INPUT" || target.tagName === "SPAN" && target.classList.contains("property_value"))) { + return; + } + const keybinding = keybindingStore.getKeybinding(keyCombo); + if (keybinding && keybinding.targetSelector !== "#graph-canvas") { + event.preventDefault(); + await commandStore.execute(keybinding.commandId); + return; + } + if (event.ctrlKey || event.altKey || event.metaKey) { + return; + } + if (event.key === "Escape") { + const modals = document.querySelectorAll(".comfy-modal"); + for (const modal of modals) { + const modalDisplay = window.getComputedStyle(modal).getPropertyValue("display"); + if (modalDisplay !== "none") { + modal.style.display = "none"; + break; } } - }, - { detached: true } - ); -} -__name(setupAutoQueueHandler, "setupAutoQueueHandler"); + for (const d of document.querySelectorAll("dialog")) d.close(); + } + }, "keybindHandler"); + return { + keybindHandler + }; +}, "useKeybindingService"); const _sfc_main = /* @__PURE__ */ defineComponent({ __name: "GraphView", setup(__props) { @@ -9766,9 +9948,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({ const toast = useToast(); const settingStore = useSettingStore(); const executionStore = useExecutionStore(); - const theme10 = computed(() => settingStore.get("Comfy.ColorPalette")); + const theme11 = computed(() => settingStore.get("Comfy.ColorPalette")); watch( - theme10, + theme11, (newTheme) => { const DARK_THEME_CLASS = "dark-theme"; const isDarkTheme = newTheme !== "light"; @@ -9818,7 +10000,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({ const coreCommands = useCoreCommands(); useCommandStore().registerCommands(coreCommands); useMenuItemStore().registerCoreMenuCommands(); - useKeybindingService().registerCoreKeybindings(); + useKeybindingStore().loadCoreKeybindings(); useSidebarTabStore().registerCoreSidebarTabs(); useBottomPanelStore().registerCoreBottomPanelTabs(); app.extensionManager = useWorkspaceStore(); @@ -9864,7 +10046,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({ const onGraphReady = /* @__PURE__ */ __name(() => { requestIdleCallback( () => { - useKeybindingService().registerUserKeybindings(); + useKeybindingStore().loadUserKeybindings(); useServerConfigStore().loadServerConfig( SERVER_CONFIG_ITEMS, settingStore.get("Comfy.Server.ServerConfigValues") @@ -9879,10 +10061,10 @@ const _sfc_main = /* @__PURE__ */ defineComponent({ return (_ctx, _cache) => { return openBlock(), createElementBlock(Fragment, null, [ createVNode(TopMenubar), - createVNode(_sfc_main$a, { onReady: onGraphReady }), + createVNode(_sfc_main$d, { onReady: onGraphReady }), + createVNode(_sfc_main$b), + createVNode(_sfc_main$a), createVNode(_sfc_main$9), - createVNode(_sfc_main$r), - createVNode(_sfc_main$t), createVNode(MenuHamburger) ], 64); }; @@ -9891,4 +10073,4 @@ const _sfc_main = /* @__PURE__ */ defineComponent({ export { _sfc_main as default }; -//# sourceMappingURL=GraphView-BhIVbg_-.js.map +//# sourceMappingURL=GraphView-DuMhaZbg.js.map diff --git a/web/assets/InstallView-ZoxdV0Ib.js b/web/assets/InstallView-BOZ1nhez.js similarity index 73% rename from web/assets/InstallView-ZoxdV0Ib.js rename to web/assets/InstallView-BOZ1nhez.js index 172bf132..b1bdcf5e 100644 --- a/web/assets/InstallView-ZoxdV0Ib.js +++ b/web/assets/InstallView-BOZ1nhez.js @@ -1,9 +1,156 @@ var __defProp = Object.defineProperty; var __name = (target, value2) => __defProp(target, "name", { value: value2, configurable: true }); -import { B as BaseStyle, q as script$6, o as openBlock, f as createElementBlock, D as mergeProps, c1 as findIndexInList, c2 as find, aB as resolveComponent, k as createBlock, G as resolveDynamicComponent, M as withCtx, H as createBaseVNode, X as toDisplayString, J as renderSlot, I as createCommentVNode, T as normalizeClass, P as findSingle, F as Fragment, aC as Transition, i as withDirectives, v as vShow, ak as UniqueComponentId, d as defineComponent, ab as ref, c3 as useModel, N as createVNode, j as unref, c4 as script$7, bQ as script$8, bM as withModifiers, aP as script$9, a1 as useI18n, c as computed, aI as script$a, aE as createTextVNode, c0 as electronAPI, m as onMounted, r as resolveDirective, av as script$b, c5 as script$c, c6 as script$d, l as script$e, bZ as script$f, c7 as MigrationItems, w as watchEffect, E as renderList, c8 as script$g, bW as useRouter, aL as pushScopeId, aM as popScopeId, aU as toRaw, _ as _export_sfc } from "./index-BbhVsmQe.js"; -import { _ as _sfc_main$5 } from "./BaseViewTemplate-qOhVwbhN.js"; +import { B as BaseStyle, U as script$7, ae as UniqueComponentId, o as openBlock, f as createElementBlock, m as mergeProps, l as renderSlot, h as createCommentVNode, c2 as findIndexInList, c3 as find, k as resolveComponent, v as createBlock, K as resolveDynamicComponent, x as withCtx, z as createBaseVNode, a7 as toDisplayString, A as normalizeClass, W as findSingle, O as Fragment, av as Transition, t as withDirectives, ac as vShow, a as defineComponent, H as useI18n, c4 as useModel, r as ref, aF as onMounted, q as resolveDirective, g as createVNode, y as unref, ap as script$8, c5 as script$9, c6 as script$a, C as script$b, ax as createTextVNode, b_ as script$c, c1 as electronAPI, c7 as MigrationItems, p as computed, aM as watchEffect, P as renderList, bu as withModifiers, c8 as script$d, c9 as script$e, bQ as script$f, aI as script$g, aB as script$h, bX as useRouter, Q as pushScopeId, R as popScopeId, aO as toRaw, _ as _export_sfc } from "./index-DAOHvvrm.js"; +var theme = /* @__PURE__ */ __name(function theme2(_ref) { + var dt = _ref.dt; + return "\n.p-steplist {\n position: relative;\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin: 0;\n padding: 0;\n list-style-type: none;\n overflow-x: auto;\n}\n\n.p-step {\n position: relative;\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n gap: ".concat(dt("stepper.step.gap"), ";\n padding: ").concat(dt("stepper.step.padding"), ";\n}\n\n.p-step:last-of-type {\n flex: initial;\n}\n\n.p-step-header {\n border: 0 none;\n display: inline-flex;\n align-items: center;\n text-decoration: none;\n cursor: pointer;\n transition: background ").concat(dt("stepper.transition.duration"), ", color ").concat(dt("stepper.transition.duration"), ", border-color ").concat(dt("stepper.transition.duration"), ", outline-color ").concat(dt("stepper.transition.duration"), ", box-shadow ").concat(dt("stepper.transition.duration"), ";\n border-radius: ").concat(dt("stepper.step.header.border.radius"), ";\n outline-color: transparent;\n background: transparent;\n padding: ").concat(dt("stepper.step.header.padding"), ";\n gap: ").concat(dt("stepper.step.header.gap"), ";\n}\n\n.p-step-header:focus-visible {\n box-shadow: ").concat(dt("stepper.step.header.focus.ring.shadow"), ";\n outline: ").concat(dt("stepper.step.header.focus.ring.width"), " ").concat(dt("stepper.step.header.focus.ring.style"), " ").concat(dt("stepper.step.header.focus.ring.color"), ";\n outline-offset: ").concat(dt("stepper.step.header.focus.ring.offset"), ";\n}\n\n.p-stepper.p-stepper-readonly .p-step {\n cursor: auto;\n}\n\n.p-step-title {\n display: block;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 100%;\n color: ").concat(dt("stepper.step.title.color"), ";\n font-weight: ").concat(dt("stepper.step.title.font.weight"), ";\n transition: background ").concat(dt("stepper.transition.duration"), ", color ").concat(dt("stepper.transition.duration"), ", border-color ").concat(dt("stepper.transition.duration"), ", box-shadow ").concat(dt("stepper.transition.duration"), ", outline-color ").concat(dt("stepper.transition.duration"), ";\n}\n\n.p-step-number {\n display: flex;\n align-items: center;\n justify-content: center;\n color: ").concat(dt("stepper.step.number.color"), ";\n border: 2px solid ").concat(dt("stepper.step.number.border.color"), ";\n background: ").concat(dt("stepper.step.number.background"), ";\n min-width: ").concat(dt("stepper.step.number.size"), ";\n height: ").concat(dt("stepper.step.number.size"), ";\n line-height: ").concat(dt("stepper.step.number.size"), ";\n font-size: ").concat(dt("stepper.step.number.font.size"), ";\n z-index: 1;\n border-radius: ").concat(dt("stepper.step.number.border.radius"), ";\n position: relative;\n font-weight: ").concat(dt("stepper.step.number.font.weight"), ';\n}\n\n.p-step-number::after {\n content: " ";\n position: absolute;\n width: 100%;\n height: 100%;\n border-radius: ').concat(dt("stepper.step.number.border.radius"), ";\n box-shadow: ").concat(dt("stepper.step.number.shadow"), ";\n}\n\n.p-step-active .p-step-header {\n cursor: default;\n}\n\n.p-step-active .p-step-number {\n background: ").concat(dt("stepper.step.number.active.background"), ";\n border-color: ").concat(dt("stepper.step.number.active.border.color"), ";\n color: ").concat(dt("stepper.step.number.active.color"), ";\n}\n\n.p-step-active .p-step-title {\n color: ").concat(dt("stepper.step.title.active.color"), ";\n}\n\n.p-step:not(.p-disabled):focus-visible {\n outline: ").concat(dt("focus.ring.width"), " ").concat(dt("focus.ring.style"), " ").concat(dt("focus.ring.color"), ";\n outline-offset: ").concat(dt("focus.ring.offset"), ";\n}\n\n.p-step:has(~ .p-step-active) .p-stepper-separator {\n background: ").concat(dt("stepper.separator.active.background"), ";\n}\n\n.p-stepper-separator {\n flex: 1 1 0;\n background: ").concat(dt("stepper.separator.background"), ";\n width: 100%;\n height: ").concat(dt("stepper.separator.size"), ";\n transition: background ").concat(dt("stepper.transition.duration"), ", color ").concat(dt("stepper.transition.duration"), ", border-color ").concat(dt("stepper.transition.duration"), ", box-shadow ").concat(dt("stepper.transition.duration"), ", outline-color ").concat(dt("stepper.transition.duration"), ";\n}\n\n.p-steppanels {\n padding: ").concat(dt("stepper.steppanels.padding"), ";\n}\n\n.p-steppanel {\n background: ").concat(dt("stepper.steppanel.background"), ";\n color: ").concat(dt("stepper.steppanel.color"), ";\n}\n\n.p-stepper:has(.p-stepitem) {\n display: flex;\n flex-direction: column;\n}\n\n.p-stepitem {\n display: flex;\n flex-direction: column;\n flex: initial;\n}\n\n.p-stepitem.p-stepitem-active {\n flex: 1 1 auto;\n}\n\n.p-stepitem .p-step {\n flex: initial;\n}\n\n.p-stepitem .p-steppanel-content {\n width: 100%;\n padding: ").concat(dt("stepper.steppanel.padding"), ";\n}\n\n.p-stepitem .p-steppanel {\n display: flex;\n flex: 1 1 auto;\n}\n\n.p-stepitem .p-stepper-separator {\n flex: 0 0 auto;\n width: ").concat(dt("stepper.separator.size"), ";\n height: auto;\n margin: ").concat(dt("stepper.separator.margin"), ";\n position: relative;\n left: calc(-1 * ").concat(dt("stepper.separator.size"), ");\n}\n\n.p-stepitem:has(~ .p-stepitem-active) .p-stepper-separator {\n background: ").concat(dt("stepper.separator.active.background"), ";\n}\n\n.p-stepitem:last-of-type .p-steppanel {\n padding-inline-start: ").concat(dt("stepper.step.number.size"), ";\n}\n"); +}, "theme"); var classes$4 = { - root: /* @__PURE__ */ __name(function root(_ref) { + root: /* @__PURE__ */ __name(function root(_ref2) { + var props = _ref2.props; + return ["p-stepper p-component", { + "p-readonly": props.linear + }]; + }, "root"), + separator: "p-stepper-separator" +}; +var StepperStyle = BaseStyle.extend({ + name: "stepper", + theme, + classes: classes$4 +}); +var script$1$4 = { + name: "BaseStepper", + "extends": script$7, + props: { + value: { + type: [String, Number], + "default": void 0 + }, + linear: { + type: Boolean, + "default": false + } + }, + style: StepperStyle, + provide: /* @__PURE__ */ __name(function provide() { + return { + $pcStepper: this, + $parentInstance: this + }; + }, "provide") +}; +var script$6 = { + name: "Stepper", + "extends": script$1$4, + inheritAttrs: false, + emits: ["update:value"], + data: /* @__PURE__ */ __name(function data() { + return { + id: this.$attrs.id, + d_value: this.value + }; + }, "data"), + watch: { + "$attrs.id": /* @__PURE__ */ __name(function $attrsId(newValue) { + this.id = newValue || UniqueComponentId(); + }, "$attrsId"), + value: /* @__PURE__ */ __name(function value(newValue) { + this.d_value = newValue; + }, "value") + }, + mounted: /* @__PURE__ */ __name(function mounted() { + this.id = this.id || UniqueComponentId(); + }, "mounted"), + methods: { + updateValue: /* @__PURE__ */ __name(function updateValue(newValue) { + if (this.d_value !== newValue) { + this.d_value = newValue; + this.$emit("update:value", newValue); + } + }, "updateValue"), + isStepActive: /* @__PURE__ */ __name(function isStepActive(value2) { + return this.d_value === value2; + }, "isStepActive"), + isStepDisabled: /* @__PURE__ */ __name(function isStepDisabled() { + return this.linear; + }, "isStepDisabled") + } +}; +function render$5(_ctx, _cache, $props, $setup, $data, $options) { + return openBlock(), createElementBlock("div", mergeProps({ + "class": _ctx.cx("root"), + role: "tablist" + }, _ctx.ptmi("root")), [_ctx.$slots.start ? renderSlot(_ctx.$slots, "start", { + key: 0 + }) : createCommentVNode("", true), renderSlot(_ctx.$slots, "default"), _ctx.$slots.end ? renderSlot(_ctx.$slots, "end", { + key: 1 + }) : createCommentVNode("", true)], 16); +} +__name(render$5, "render$5"); +script$6.render = render$5; +var classes$3 = { + root: "p-steplist" +}; +var StepListStyle = BaseStyle.extend({ + name: "steplist", + classes: classes$3 +}); +var script$1$3 = { + name: "BaseStepList", + "extends": script$7, + style: StepListStyle, + provide: /* @__PURE__ */ __name(function provide2() { + return { + $pcStepList: this, + $parentInstance: this + }; + }, "provide") +}; +var script$5 = { + name: "StepList", + "extends": script$1$3, + inheritAttrs: false +}; +function render$4(_ctx, _cache, $props, $setup, $data, $options) { + return openBlock(), createElementBlock("div", mergeProps({ + "class": _ctx.cx("root") + }, _ctx.ptmi("root")), [renderSlot(_ctx.$slots, "default")], 16); +} +__name(render$4, "render$4"); +script$5.render = render$4; +var classes$2 = { + root: "p-steppanels" +}; +var StepPanelsStyle = BaseStyle.extend({ + name: "steppanels", + classes: classes$2 +}); +var script$1$2 = { + name: "BaseStepPanels", + "extends": script$7, + style: StepPanelsStyle, + provide: /* @__PURE__ */ __name(function provide3() { + return { + $pcStepPanels: this, + $parentInstance: this + }; + }, "provide") +}; +var script$4 = { + name: "StepPanels", + "extends": script$1$2, + inheritAttrs: false +}; +function render$3(_ctx, _cache, $props, $setup, $data, $options) { + return openBlock(), createElementBlock("div", mergeProps({ + "class": _ctx.cx("root") + }, _ctx.ptmi("root")), [renderSlot(_ctx.$slots, "default")], 16); +} +__name(render$3, "render$3"); +script$4.render = render$3; +var classes$1 = { + root: /* @__PURE__ */ __name(function root2(_ref) { var instance = _ref.instance; return ["p-step", { "p-step-active": instance.active, @@ -16,23 +163,23 @@ var classes$4 = { }; var StepStyle = BaseStyle.extend({ name: "step", - classes: classes$4 + classes: classes$1 }); -var script$2$2 = { +var script$2$1 = { name: "StepperSeparator", hostName: "Stepper", - "extends": script$6 + "extends": script$7 }; -function render$1$2(_ctx, _cache, $props, $setup, $data, $options) { +function render$1$1(_ctx, _cache, $props, $setup, $data, $options) { return openBlock(), createElementBlock("span", mergeProps({ "class": _ctx.cx("separator") }, _ctx.ptm("separator")), null, 16); } -__name(render$1$2, "render$1$2"); -script$2$2.render = render$1$2; -var script$1$4 = { +__name(render$1$1, "render$1$1"); +script$2$1.render = render$1$1; +var script$1$1 = { name: "BaseStep", - "extends": script$6, + "extends": script$7, props: { value: { type: [String, Number], @@ -52,16 +199,16 @@ var script$1$4 = { } }, style: StepStyle, - provide: /* @__PURE__ */ __name(function provide() { + provide: /* @__PURE__ */ __name(function provide4() { return { $pcStep: this, $parentInstance: this }; }, "provide") }; -var script$5 = { +var script$3 = { name: "Step", - "extends": script$1$4, + "extends": script$1$1, inheritAttrs: false, inject: { $pcStepper: { @@ -74,12 +221,12 @@ var script$5 = { "default": null } }, - data: /* @__PURE__ */ __name(function data() { + data: /* @__PURE__ */ __name(function data2() { return { isSeparatorVisible: false }; }, "data"), - mounted: /* @__PURE__ */ __name(function mounted() { + mounted: /* @__PURE__ */ __name(function mounted2() { if (this.$el && this.$pcStepList) { var index = findIndexInList(this.$el, find(this.$pcStepper.$el, '[data-pc-name="step"]')); var stepLen = find(this.$pcStepper.$el, '[data-pc-name="step"]').length; @@ -108,7 +255,7 @@ var script$5 = { var _this$$pcStepItem; return !!this.$pcStepItem ? (_this$$pcStepItem = this.$pcStepItem) === null || _this$$pcStepItem === void 0 ? void 0 : _this$$pcStepItem.value : this.value; }, "activeValue"), - isStepDisabled: /* @__PURE__ */ __name(function isStepDisabled() { + isStepDisabled: /* @__PURE__ */ __name(function isStepDisabled2() { return !this.active && (this.$pcStepper.isStepDisabled() || this.disabled); }, "isStepDisabled"), id: /* @__PURE__ */ __name(function id() { @@ -142,11 +289,11 @@ var script$5 = { }, "a11yAttrs") }, components: { - StepperSeparator: script$2$2 + StepperSeparator: script$2$1 } }; var _hoisted_1$5 = ["id", "tabindex", "aria-controls", "disabled"]; -function render$4(_ctx, _cache, $props, $setup, $data, $options) { +function render$2(_ctx, _cache, $props, $setup, $data, $options) { var _component_StepperSeparator = resolveComponent("StepperSeparator"); return !_ctx.asChild ? (openBlock(), createBlock(resolveDynamicComponent(_ctx.as), mergeProps({ key: 0, @@ -186,40 +333,10 @@ function render$4(_ctx, _cache, $props, $setup, $data, $options) { activateCallback: $options.onStepClick }); } -__name(render$4, "render$4"); -script$5.render = render$4; -var classes$3 = { - root: "p-steplist" -}; -var StepListStyle = BaseStyle.extend({ - name: "steplist", - classes: classes$3 -}); -var script$1$3 = { - name: "BaseStepList", - "extends": script$6, - style: StepListStyle, - provide: /* @__PURE__ */ __name(function provide2() { - return { - $pcStepList: this, - $parentInstance: this - }; - }, "provide") -}; -var script$4 = { - name: "StepList", - "extends": script$1$3, - inheritAttrs: false -}; -function render$3(_ctx, _cache, $props, $setup, $data, $options) { - return openBlock(), createElementBlock("div", mergeProps({ - "class": _ctx.cx("root") - }, _ctx.ptmi("root")), [renderSlot(_ctx.$slots, "default")], 16); -} -__name(render$3, "render$3"); -script$4.render = render$3; -var classes$2 = { - root: /* @__PURE__ */ __name(function root2(_ref) { +__name(render$2, "render$2"); +script$3.render = render$2; +var classes = { + root: /* @__PURE__ */ __name(function root3(_ref) { var instance = _ref.instance; return ["p-steppanel", { "p-steppanel-active": instance.isVertical && instance.active @@ -229,23 +346,23 @@ var classes$2 = { }; var StepPanelStyle = BaseStyle.extend({ name: "steppanel", - classes: classes$2 + classes }); -var script$2$1 = { +var script$2 = { name: "StepperSeparator", hostName: "Stepper", - "extends": script$6 + "extends": script$7 }; -function render$1$1(_ctx, _cache, $props, $setup, $data, $options) { +function render$1(_ctx, _cache, $props, $setup, $data, $options) { return openBlock(), createElementBlock("span", mergeProps({ "class": _ctx.cx("separator") }, _ctx.ptm("separator")), null, 16); } -__name(render$1$1, "render$1$1"); -script$2$1.render = render$1$1; -var script$1$2 = { +__name(render$1, "render$1"); +script$2.render = render$1; +var script$1 = { name: "BaseStepPanel", - "extends": script$6, + "extends": script$7, props: { value: { type: [String, Number], @@ -261,16 +378,16 @@ var script$1$2 = { } }, style: StepPanelStyle, - provide: /* @__PURE__ */ __name(function provide3() { + provide: /* @__PURE__ */ __name(function provide5() { return { $pcStepPanel: this, $parentInstance: this }; }, "provide") }; -var script$3 = { +var script = { name: "StepPanel", - "extends": script$1$2, + "extends": script$1, inheritAttrs: false, inject: { $pcStepper: { @@ -283,12 +400,12 @@ var script$3 = { "default": null } }, - data: /* @__PURE__ */ __name(function data2() { + data: /* @__PURE__ */ __name(function data3() { return { isSeparatorVisible: false }; }, "data"), - mounted: /* @__PURE__ */ __name(function mounted2() { + mounted: /* @__PURE__ */ __name(function mounted3() { if (this.$el) { var _this$$pcStepItem, _this$$pcStepList; var stepElements = find(this.$pcStepper.$el, '[data-pc-name="step"]'); @@ -306,7 +423,7 @@ var script$3 = { } }); }, "getPTOptions"), - updateValue: /* @__PURE__ */ __name(function updateValue(val) { + updateValue: /* @__PURE__ */ __name(function updateValue2(val) { this.$pcStepper.updateValue(val); }, "updateValue") }, @@ -342,10 +459,10 @@ var script$3 = { }, "a11yAttrs") }, components: { - StepperSeparator: script$2$1 + StepperSeparator: script$2 } }; -function render$2(_ctx, _cache, $props, $setup, $data, $options) { +function render(_ctx, _cache, $props, $setup, $data, $options) { var _component_StepperSeparator = resolveComponent("StepperSeparator"); return $options.isVertical ? (openBlock(), createElementBlock(Fragment, { key: 0 @@ -410,412 +527,27 @@ function render$2(_ctx, _cache, $props, $setup, $data, $options) { }, "activateCallback") }) : createCommentVNode("", true)], 64)); } -__name(render$2, "render$2"); -script$3.render = render$2; -var classes$1 = { - root: "p-steppanels" -}; -var StepPanelsStyle = BaseStyle.extend({ - name: "steppanels", - classes: classes$1 -}); -var script$1$1 = { - name: "BaseStepPanels", - "extends": script$6, - style: StepPanelsStyle, - provide: /* @__PURE__ */ __name(function provide4() { - return { - $pcStepPanels: this, - $parentInstance: this - }; - }, "provide") -}; -var script$2 = { - name: "StepPanels", - "extends": script$1$1, - inheritAttrs: false -}; -function render$1(_ctx, _cache, $props, $setup, $data, $options) { - return openBlock(), createElementBlock("div", mergeProps({ - "class": _ctx.cx("root") - }, _ctx.ptmi("root")), [renderSlot(_ctx.$slots, "default")], 16); -} -__name(render$1, "render$1"); -script$2.render = render$1; -var theme = /* @__PURE__ */ __name(function theme2(_ref) { - var dt = _ref.dt; - return "\n.p-steplist {\n position: relative;\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin: 0;\n padding: 0;\n list-style-type: none;\n overflow-x: auto;\n}\n\n.p-step {\n position: relative;\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n gap: ".concat(dt("stepper.step.gap"), ";\n padding: ").concat(dt("stepper.step.padding"), ";\n}\n\n.p-step:last-of-type {\n flex: initial;\n}\n\n.p-step-header {\n border: 0 none;\n display: inline-flex;\n align-items: center;\n text-decoration: none;\n cursor: pointer;\n transition: background ").concat(dt("stepper.transition.duration"), ", color ").concat(dt("stepper.transition.duration"), ", border-color ").concat(dt("stepper.transition.duration"), ", outline-color ").concat(dt("stepper.transition.duration"), ", box-shadow ").concat(dt("stepper.transition.duration"), ";\n border-radius: ").concat(dt("stepper.step.header.border.radius"), ";\n outline-color: transparent;\n background: transparent;\n padding: ").concat(dt("stepper.step.header.padding"), ";\n gap: ").concat(dt("stepper.step.header.gap"), ";\n}\n\n.p-step-header:focus-visible {\n box-shadow: ").concat(dt("stepper.step.header.focus.ring.shadow"), ";\n outline: ").concat(dt("stepper.step.header.focus.ring.width"), " ").concat(dt("stepper.step.header.focus.ring.style"), " ").concat(dt("stepper.step.header.focus.ring.color"), ";\n outline-offset: ").concat(dt("stepper.step.header.focus.ring.offset"), ";\n}\n\n.p-stepper.p-stepper-readonly .p-step {\n cursor: auto;\n}\n\n.p-step-title {\n display: block;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 100%;\n color: ").concat(dt("stepper.step.title.color"), ";\n font-weight: ").concat(dt("stepper.step.title.font.weight"), ";\n transition: background ").concat(dt("stepper.transition.duration"), ", color ").concat(dt("stepper.transition.duration"), ", border-color ").concat(dt("stepper.transition.duration"), ", box-shadow ").concat(dt("stepper.transition.duration"), ", outline-color ").concat(dt("stepper.transition.duration"), ";\n}\n\n.p-step-number {\n display: flex;\n align-items: center;\n justify-content: center;\n color: ").concat(dt("stepper.step.number.color"), ";\n border: 2px solid ").concat(dt("stepper.step.number.border.color"), ";\n background: ").concat(dt("stepper.step.number.background"), ";\n min-width: ").concat(dt("stepper.step.number.size"), ";\n height: ").concat(dt("stepper.step.number.size"), ";\n line-height: ").concat(dt("stepper.step.number.size"), ";\n font-size: ").concat(dt("stepper.step.number.font.size"), ";\n z-index: 1;\n border-radius: ").concat(dt("stepper.step.number.border.radius"), ";\n position: relative;\n font-weight: ").concat(dt("stepper.step.number.font.weight"), ';\n}\n\n.p-step-number::after {\n content: " ";\n position: absolute;\n width: 100%;\n height: 100%;\n border-radius: ').concat(dt("stepper.step.number.border.radius"), ";\n box-shadow: ").concat(dt("stepper.step.number.shadow"), ";\n}\n\n.p-step-active .p-step-header {\n cursor: default;\n}\n\n.p-step-active .p-step-number {\n background: ").concat(dt("stepper.step.number.active.background"), ";\n border-color: ").concat(dt("stepper.step.number.active.border.color"), ";\n color: ").concat(dt("stepper.step.number.active.color"), ";\n}\n\n.p-step-active .p-step-title {\n color: ").concat(dt("stepper.step.title.active.color"), ";\n}\n\n.p-step:not(.p-disabled):focus-visible {\n outline: ").concat(dt("focus.ring.width"), " ").concat(dt("focus.ring.style"), " ").concat(dt("focus.ring.color"), ";\n outline-offset: ").concat(dt("focus.ring.offset"), ";\n}\n\n.p-step:has(~ .p-step-active) .p-stepper-separator {\n background: ").concat(dt("stepper.separator.active.background"), ";\n}\n\n.p-stepper-separator {\n flex: 1 1 0;\n background: ").concat(dt("stepper.separator.background"), ";\n width: 100%;\n height: ").concat(dt("stepper.separator.size"), ";\n transition: background ").concat(dt("stepper.transition.duration"), ", color ").concat(dt("stepper.transition.duration"), ", border-color ").concat(dt("stepper.transition.duration"), ", box-shadow ").concat(dt("stepper.transition.duration"), ", outline-color ").concat(dt("stepper.transition.duration"), ";\n}\n\n.p-steppanels {\n padding: ").concat(dt("stepper.steppanels.padding"), ";\n}\n\n.p-steppanel {\n background: ").concat(dt("stepper.steppanel.background"), ";\n color: ").concat(dt("stepper.steppanel.color"), ";\n}\n\n.p-stepper:has(.p-stepitem) {\n display: flex;\n flex-direction: column;\n}\n\n.p-stepitem {\n display: flex;\n flex-direction: column;\n flex: initial;\n}\n\n.p-stepitem.p-stepitem-active {\n flex: 1 1 auto;\n}\n\n.p-stepitem .p-step {\n flex: initial;\n}\n\n.p-stepitem .p-steppanel-content {\n width: 100%;\n padding: ").concat(dt("stepper.steppanel.padding"), ";\n}\n\n.p-stepitem .p-steppanel {\n display: flex;\n flex: 1 1 auto;\n}\n\n.p-stepitem .p-stepper-separator {\n flex: 0 0 auto;\n width: ").concat(dt("stepper.separator.size"), ";\n height: auto;\n margin: ").concat(dt("stepper.separator.margin"), ";\n position: relative;\n left: calc(-1 * ").concat(dt("stepper.separator.size"), ");\n}\n\n.p-stepitem:has(~ .p-stepitem-active) .p-stepper-separator {\n background: ").concat(dt("stepper.separator.active.background"), ";\n}\n\n.p-stepitem:last-of-type .p-steppanel {\n padding-inline-start: ").concat(dt("stepper.step.number.size"), ";\n}\n"); -}, "theme"); -var classes = { - root: /* @__PURE__ */ __name(function root3(_ref2) { - var props = _ref2.props; - return ["p-stepper p-component", { - "p-readonly": props.linear - }]; - }, "root"), - separator: "p-stepper-separator" -}; -var StepperStyle = BaseStyle.extend({ - name: "stepper", - theme, - classes -}); -var script$1 = { - name: "BaseStepper", - "extends": script$6, - props: { - value: { - type: [String, Number], - "default": void 0 - }, - linear: { - type: Boolean, - "default": false - } - }, - style: StepperStyle, - provide: /* @__PURE__ */ __name(function provide5() { - return { - $pcStepper: this, - $parentInstance: this - }; - }, "provide") -}; -var script = { - name: "Stepper", - "extends": script$1, - inheritAttrs: false, - emits: ["update:value"], - data: /* @__PURE__ */ __name(function data3() { - return { - id: this.$attrs.id, - d_value: this.value - }; - }, "data"), - watch: { - "$attrs.id": /* @__PURE__ */ __name(function $attrsId(newValue) { - this.id = newValue || UniqueComponentId(); - }, "$attrsId"), - value: /* @__PURE__ */ __name(function value(newValue) { - this.d_value = newValue; - }, "value") - }, - mounted: /* @__PURE__ */ __name(function mounted3() { - this.id = this.id || UniqueComponentId(); - }, "mounted"), - methods: { - updateValue: /* @__PURE__ */ __name(function updateValue2(newValue) { - if (this.d_value !== newValue) { - this.d_value = newValue; - this.$emit("update:value", newValue); - } - }, "updateValue"), - isStepActive: /* @__PURE__ */ __name(function isStepActive(value2) { - return this.d_value === value2; - }, "isStepActive"), - isStepDisabled: /* @__PURE__ */ __name(function isStepDisabled2() { - return this.linear; - }, "isStepDisabled") - } -}; -function render(_ctx, _cache, $props, $setup, $data, $options) { - return openBlock(), createElementBlock("div", mergeProps({ - "class": _ctx.cx("root"), - role: "tablist" - }, _ctx.ptmi("root")), [_ctx.$slots.start ? renderSlot(_ctx.$slots, "start", { - key: 0 - }) : createCommentVNode("", true), renderSlot(_ctx.$slots, "default"), _ctx.$slots.end ? renderSlot(_ctx.$slots, "end", { - key: 1 - }) : createCommentVNode("", true)], 16); -} -__name(render, "render"); -script.render = render; -const _hoisted_1$4 = { class: "flex flex-col gap-6 w-[600px]" }; -const _hoisted_2$4 = { class: "flex flex-col gap-4" }; -const _hoisted_3$4 = { class: "text-2xl font-semibold text-neutral-100" }; -const _hoisted_4$4 = { class: "text-neutral-400 my-0" }; -const _hoisted_5$3 = { class: "flex flex-col bg-neutral-800 p-4 rounded-lg" }; -const _hoisted_6$3 = { class: "flex items-center gap-4" }; -const _hoisted_7$3 = { class: "flex-1" }; -const _hoisted_8$3 = { class: "text-lg font-medium text-neutral-100" }; -const _hoisted_9$3 = { class: "text-sm text-neutral-400 mt-1" }; -const _hoisted_10$3 = { class: "flex items-center gap-4" }; -const _hoisted_11$3 = { class: "flex-1" }; -const _hoisted_12$3 = { class: "text-lg font-medium text-neutral-100" }; -const _hoisted_13$2 = { class: "text-sm text-neutral-400 mt-1" }; -const _hoisted_14$2 = { class: "text-neutral-300" }; -const _hoisted_15$2 = { class: "font-medium mb-2" }; -const _hoisted_16$2 = { class: "list-disc pl-6 space-y-1" }; -const _hoisted_17$2 = { class: "font-medium mt-4 mb-2" }; -const _hoisted_18$2 = { class: "list-disc pl-6 space-y-1" }; -const _sfc_main$4 = /* @__PURE__ */ defineComponent({ - __name: "DesktopSettingsConfiguration", - props: { - "autoUpdate": { required: true }, - "autoUpdateModifiers": {}, - "allowMetrics": { required: true }, - "allowMetricsModifiers": {} - }, - emits: ["update:autoUpdate", "update:allowMetrics"], - setup(__props) { - const showDialog = ref(false); - const autoUpdate = useModel(__props, "autoUpdate"); - const allowMetrics = useModel(__props, "allowMetrics"); - const showMetricsInfo = /* @__PURE__ */ __name(() => { - showDialog.value = true; - }, "showMetricsInfo"); - return (_ctx, _cache) => { - return openBlock(), createElementBlock("div", _hoisted_1$4, [ - createBaseVNode("div", _hoisted_2$4, [ - createBaseVNode("h2", _hoisted_3$4, toDisplayString(_ctx.$t("install.desktopAppSettings")), 1), - createBaseVNode("p", _hoisted_4$4, toDisplayString(_ctx.$t("install.desktopAppSettingsDescription")), 1) - ]), - createBaseVNode("div", _hoisted_5$3, [ - createBaseVNode("div", _hoisted_6$3, [ - createBaseVNode("div", _hoisted_7$3, [ - createBaseVNode("h3", _hoisted_8$3, toDisplayString(_ctx.$t("install.settings.autoUpdate")), 1), - createBaseVNode("p", _hoisted_9$3, toDisplayString(_ctx.$t("install.settings.autoUpdateDescription")), 1) - ]), - createVNode(unref(script$7), { - modelValue: autoUpdate.value, - "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => autoUpdate.value = $event) - }, null, 8, ["modelValue"]) - ]), - createVNode(unref(script$8)), - createBaseVNode("div", _hoisted_10$3, [ - createBaseVNode("div", _hoisted_11$3, [ - createBaseVNode("h3", _hoisted_12$3, toDisplayString(_ctx.$t("install.settings.allowMetrics")), 1), - createBaseVNode("p", _hoisted_13$2, toDisplayString(_ctx.$t("install.settings.allowMetricsDescription")), 1), - createBaseVNode("a", { - href: "#", - class: "text-sm text-blue-400 hover:text-blue-300 mt-1 inline-block", - onClick: withModifiers(showMetricsInfo, ["prevent"]) - }, toDisplayString(_ctx.$t("install.settings.learnMoreAboutData")), 1) - ]), - createVNode(unref(script$7), { - modelValue: allowMetrics.value, - "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => allowMetrics.value = $event) - }, null, 8, ["modelValue"]) - ]) - ]), - createVNode(unref(script$9), { - visible: showDialog.value, - "onUpdate:visible": _cache[2] || (_cache[2] = ($event) => showDialog.value = $event), - modal: "", - header: _ctx.$t("install.settings.dataCollectionDialog.title") - }, { - default: withCtx(() => [ - createBaseVNode("div", _hoisted_14$2, [ - createBaseVNode("h4", _hoisted_15$2, toDisplayString(_ctx.$t("install.settings.dataCollectionDialog.whatWeCollect")), 1), - createBaseVNode("ul", _hoisted_16$2, [ - createBaseVNode("li", null, toDisplayString(_ctx.$t("install.settings.dataCollectionDialog.errorReports")), 1), - createBaseVNode("li", null, toDisplayString(_ctx.$t("install.settings.dataCollectionDialog.systemInfo")), 1) - ]), - createBaseVNode("h4", _hoisted_17$2, toDisplayString(_ctx.$t("install.settings.dataCollectionDialog.whatWeDoNotCollect")), 1), - createBaseVNode("ul", _hoisted_18$2, [ - createBaseVNode("li", null, toDisplayString(_ctx.$t("install.settings.dataCollectionDialog.personalInformation")), 1), - createBaseVNode("li", null, toDisplayString(_ctx.$t("install.settings.dataCollectionDialog.workflowContents")), 1), - createBaseVNode("li", null, toDisplayString(_ctx.$t("install.settings.dataCollectionDialog.fileSystemInformation")), 1), - createBaseVNode("li", null, toDisplayString(_ctx.$t( - "install.settings.dataCollectionDialog.customNodeConfigurations" - )), 1) - ]) - ]) - ]), - _: 1 - }, 8, ["visible", "header"]) - ]); - }; - } -}); -const _imports_0 = "" + new URL("images/nvidia-logo.svg", import.meta.url).href; -const _imports_1 = "" + new URL("images/apple-mps-logo.png", import.meta.url).href; -const _imports_2 = "" + new URL("images/manual-configuration.svg", import.meta.url).href; -const _hoisted_1$3 = { class: "flex flex-col gap-6 w-[600px] h-[30rem] select-none" }; -const _hoisted_2$3 = { class: "grow flex flex-col gap-4 text-neutral-300" }; -const _hoisted_3$3 = { class: "text-2xl font-semibold text-neutral-100" }; -const _hoisted_4$3 = { class: "m-1 text-neutral-400" }; -const _hoisted_5$2 = /* @__PURE__ */ createBaseVNode("img", { - class: "m-12", - alt: "NVIDIA logo", - width: "196", - height: "32", - src: _imports_0 -}, null, -1); -const _hoisted_6$2 = [ - _hoisted_5$2 -]; -const _hoisted_7$2 = /* @__PURE__ */ createBaseVNode("img", { - class: "rounded-lg hover-brighten", - alt: "Apple Metal Performance Shaders Logo", - width: "292", - ratio: "", - src: _imports_1 -}, null, -1); -const _hoisted_8$2 = [ - _hoisted_7$2 -]; -const _hoisted_9$2 = /* @__PURE__ */ createBaseVNode("img", { - class: "m-12", - alt: "Manual configuration", - width: "196", - src: _imports_2 -}, null, -1); -const _hoisted_10$2 = [ - _hoisted_9$2 -]; -const _hoisted_11$2 = { - key: 0, - class: "m-1" -}; -const _hoisted_12$2 = { - key: 1, - class: "m-1" -}; -const _hoisted_13$1 = { - key: 2, - class: "text-neutral-300" -}; -const _hoisted_14$1 = { class: "m-1" }; -const _hoisted_15$1 = { key: 3 }; -const _hoisted_16$1 = { class: "m-1" }; -const _hoisted_17$1 = { class: "m-1" }; -const _hoisted_18$1 = { - for: "cpu-mode", - class: "select-none" -}; -const _sfc_main$3 = /* @__PURE__ */ defineComponent({ - __name: "GpuPicker", - props: { - "device": { - required: true - }, - "deviceModifiers": {} - }, - emits: ["update:device"], - setup(__props) { - const { t } = useI18n(); - const cpuMode = computed({ - get: /* @__PURE__ */ __name(() => selected.value === "cpu", "get"), - set: /* @__PURE__ */ __name((value2) => { - selected.value = value2 ? "cpu" : null; - }, "set") - }); - const selected = useModel(__props, "device"); - const electron = electronAPI(); - const platform = electron.getPlatform(); - const pickGpu = /* @__PURE__ */ __name((value2) => { - const newValue = selected.value === value2 ? null : value2; - selected.value = newValue; - }, "pickGpu"); - return (_ctx, _cache) => { - return openBlock(), createElementBlock("div", _hoisted_1$3, [ - createBaseVNode("div", _hoisted_2$3, [ - createBaseVNode("h2", _hoisted_3$3, toDisplayString(_ctx.$t("install.gpuSelection.selectGpu")), 1), - createBaseVNode("p", _hoisted_4$3, toDisplayString(_ctx.$t("install.gpuSelection.selectGpuDescription")) + ": ", 1), - createBaseVNode("div", { - class: normalizeClass(["flex gap-2 text-center transition-opacity", { selected: selected.value }]) - }, [ - unref(platform) !== "darwin" ? (openBlock(), createElementBlock("div", { - key: 0, - class: normalizeClass(["gpu-button", { selected: selected.value === "nvidia" }]), - role: "button", - onClick: _cache[0] || (_cache[0] = ($event) => pickGpu("nvidia")) - }, _hoisted_6$2, 2)) : createCommentVNode("", true), - unref(platform) === "darwin" ? (openBlock(), createElementBlock("div", { - key: 1, - class: normalizeClass(["gpu-button", { selected: selected.value === "mps" }]), - role: "button", - onClick: _cache[1] || (_cache[1] = ($event) => pickGpu("mps")) - }, _hoisted_8$2, 2)) : createCommentVNode("", true), - createBaseVNode("div", { - class: normalizeClass(["gpu-button", { selected: selected.value === "unsupported" }]), - role: "button", - onClick: _cache[2] || (_cache[2] = ($event) => pickGpu("unsupported")) - }, _hoisted_10$2, 2) - ], 2), - selected.value === "nvidia" ? (openBlock(), createElementBlock("p", _hoisted_11$2, [ - createVNode(unref(script$a), { - icon: "pi pi-check", - severity: "success", - value: "CUDA" - }), - createTextVNode(" " + toDisplayString(_ctx.$t("install.gpuSelection.nvidiaDescription")), 1) - ])) : createCommentVNode("", true), - selected.value === "mps" ? (openBlock(), createElementBlock("p", _hoisted_12$2, [ - createVNode(unref(script$a), { - icon: "pi pi-check", - severity: "success", - value: "MPS" - }), - createTextVNode(" " + toDisplayString(_ctx.$t("install.gpuSelection.mpsDescription")), 1) - ])) : createCommentVNode("", true), - selected.value === "unsupported" ? (openBlock(), createElementBlock("div", _hoisted_13$1, [ - createBaseVNode("p", _hoisted_14$1, [ - createVNode(unref(script$a), { - icon: "pi pi-exclamation-triangle", - severity: "warn", - value: unref(t)("icon.exclamation-triangle") - }, null, 8, ["value"]), - createTextVNode(" " + toDisplayString(_ctx.$t("install.gpuSelection.customSkipsPython")), 1) - ]), - createBaseVNode("ul", null, [ - createBaseVNode("li", null, [ - createBaseVNode("strong", null, toDisplayString(_ctx.$t("install.gpuSelection.customComfyNeedsPython")), 1) - ]), - createBaseVNode("li", null, toDisplayString(_ctx.$t("install.gpuSelection.customManualVenv")), 1), - createBaseVNode("li", null, toDisplayString(_ctx.$t("install.gpuSelection.customInstallRequirements")), 1), - createBaseVNode("li", null, toDisplayString(_ctx.$t("install.gpuSelection.customMayNotWork")), 1) - ]) - ])) : createCommentVNode("", true), - selected.value === "cpu" ? (openBlock(), createElementBlock("div", _hoisted_15$1, [ - createBaseVNode("p", _hoisted_16$1, [ - createVNode(unref(script$a), { - icon: "pi pi-exclamation-triangle", - severity: "warn", - value: unref(t)("icon.exclamation-triangle") - }, null, 8, ["value"]), - createTextVNode(" " + toDisplayString(_ctx.$t("install.gpuSelection.cpuModeDescription")), 1) - ]), - createBaseVNode("p", _hoisted_17$1, toDisplayString(_ctx.$t("install.gpuSelection.cpuModeDescription2")), 1) - ])) : createCommentVNode("", true) - ]), - createBaseVNode("div", { - class: normalizeClass(["transition-opacity flex gap-3 h-0", { - "opacity-40": selected.value && selected.value !== "cpu" - }]) - }, [ - createVNode(unref(script$7), { - modelValue: cpuMode.value, - "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => cpuMode.value = $event), - inputId: "cpu-mode", - class: "-translate-y-40" - }, null, 8, ["modelValue"]), - createBaseVNode("label", _hoisted_18$1, toDisplayString(_ctx.$t("install.gpuSelection.enableCpuMode")), 1) - ], 2) - ]); - }; - } -}); -const _hoisted_1$2 = { class: "flex flex-col gap-6 w-[600px]" }; -const _hoisted_2$2 = { class: "flex flex-col gap-4" }; -const _hoisted_3$2 = { class: "text-2xl font-semibold text-neutral-100" }; -const _hoisted_4$2 = { class: "text-neutral-400 my-0" }; -const _hoisted_5$1 = { class: "flex gap-2" }; -const _hoisted_6$1 = { class: "bg-neutral-800 p-4 rounded-lg" }; -const _hoisted_7$1 = { class: "text-lg font-medium mt-0 mb-3 text-neutral-100" }; -const _hoisted_8$1 = { class: "flex flex-col gap-2" }; -const _hoisted_9$1 = { class: "flex items-center gap-2" }; -const _hoisted_10$1 = /* @__PURE__ */ createBaseVNode("i", { class: "pi pi-folder text-neutral-400" }, null, -1); -const _hoisted_11$1 = /* @__PURE__ */ createBaseVNode("span", { class: "text-neutral-400" }, "App Data:", -1); -const _hoisted_12$1 = { class: "text-neutral-200" }; -const _hoisted_13 = { class: "pi pi-info-circle" }; -const _hoisted_14 = { class: "flex items-center gap-2" }; -const _hoisted_15 = /* @__PURE__ */ createBaseVNode("i", { class: "pi pi-desktop text-neutral-400" }, null, -1); -const _hoisted_16 = /* @__PURE__ */ createBaseVNode("span", { class: "text-neutral-400" }, "App Path:", -1); -const _hoisted_17 = { class: "text-neutral-200" }; -const _hoisted_18 = { class: "pi pi-info-circle" }; -const _sfc_main$2 = /* @__PURE__ */ defineComponent({ +__name(render, "render"); +script.render = render; +const _hoisted_1$4 = { class: "flex flex-col gap-6 w-[600px]" }; +const _hoisted_2$4 = { class: "flex flex-col gap-4" }; +const _hoisted_3$4 = { class: "text-2xl font-semibold text-neutral-100" }; +const _hoisted_4$4 = { class: "text-neutral-400 my-0" }; +const _hoisted_5$4 = { class: "flex gap-2" }; +const _hoisted_6$3 = { class: "bg-neutral-800 p-4 rounded-lg" }; +const _hoisted_7$3 = { class: "text-lg font-medium mt-0 mb-3 text-neutral-100" }; +const _hoisted_8$3 = { class: "flex flex-col gap-2" }; +const _hoisted_9$3 = { class: "flex items-center gap-2" }; +const _hoisted_10$3 = /* @__PURE__ */ createBaseVNode("i", { class: "pi pi-folder text-neutral-400" }, null, -1); +const _hoisted_11$3 = /* @__PURE__ */ createBaseVNode("span", { class: "text-neutral-400" }, "App Data:", -1); +const _hoisted_12$3 = { class: "text-neutral-200" }; +const _hoisted_13$2 = { class: "pi pi-info-circle" }; +const _hoisted_14$2 = { class: "flex items-center gap-2" }; +const _hoisted_15$2 = /* @__PURE__ */ createBaseVNode("i", { class: "pi pi-desktop text-neutral-400" }, null, -1); +const _hoisted_16$2 = /* @__PURE__ */ createBaseVNode("span", { class: "text-neutral-400" }, "App Path:", -1); +const _hoisted_17$2 = { class: "text-neutral-200" }; +const _hoisted_18$2 = { class: "pi pi-info-circle" }; +const _sfc_main$4 = /* @__PURE__ */ defineComponent({ __name: "InstallLocationPicker", props: { "installPath": { required: true }, @@ -874,14 +606,14 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({ }, "browsePath"); return (_ctx, _cache) => { const _directive_tooltip = resolveDirective("tooltip"); - return openBlock(), createElementBlock("div", _hoisted_1$2, [ - createBaseVNode("div", _hoisted_2$2, [ - createBaseVNode("h2", _hoisted_3$2, toDisplayString(_ctx.$t("install.chooseInstallationLocation")), 1), - createBaseVNode("p", _hoisted_4$2, toDisplayString(_ctx.$t("install.installLocationDescription")), 1), - createBaseVNode("div", _hoisted_5$1, [ - createVNode(unref(script$d), { class: "flex-1" }, { + return openBlock(), createElementBlock("div", _hoisted_1$4, [ + createBaseVNode("div", _hoisted_2$4, [ + createBaseVNode("h2", _hoisted_3$4, toDisplayString(_ctx.$t("install.chooseInstallationLocation")), 1), + createBaseVNode("p", _hoisted_4$4, toDisplayString(_ctx.$t("install.installLocationDescription")), 1), + createBaseVNode("div", _hoisted_5$4, [ + createVNode(unref(script$a), { class: "flex-1" }, { default: withCtx(() => [ - createVNode(unref(script$b), { + createVNode(unref(script$8), { modelValue: installPath.value, "onUpdate:modelValue": [ _cache[0] || (_cache[0] = ($event) => installPath.value = $event), @@ -889,19 +621,19 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({ ], class: normalizeClass(["w-full", { "p-invalid": pathError.value }]) }, null, 8, ["modelValue", "class"]), - withDirectives(createVNode(unref(script$c), { class: "pi pi-info-circle" }, null, 512), [ + withDirectives(createVNode(unref(script$9), { class: "pi pi-info-circle" }, null, 512), [ [_directive_tooltip, _ctx.$t("install.installLocationTooltip")] ]) ]), _: 1 }), - createVNode(unref(script$e), { + createVNode(unref(script$b), { icon: "pi pi-folder", onClick: browsePath, class: "w-12" }) ]), - pathError.value ? (openBlock(), createBlock(unref(script$f), { + pathError.value ? (openBlock(), createBlock(unref(script$c), { key: 0, severity: "error", class: "whitespace-pre-line" @@ -911,7 +643,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({ ]), _: 1 })) : createCommentVNode("", true), - pathExists.value ? (openBlock(), createBlock(unref(script$f), { + pathExists.value ? (openBlock(), createBlock(unref(script$c), { key: 1, severity: "warn" }, { @@ -921,22 +653,22 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({ _: 1 })) : createCommentVNode("", true) ]), - createBaseVNode("div", _hoisted_6$1, [ - createBaseVNode("h3", _hoisted_7$1, toDisplayString(_ctx.$t("install.systemLocations")), 1), - createBaseVNode("div", _hoisted_8$1, [ - createBaseVNode("div", _hoisted_9$1, [ - _hoisted_10$1, - _hoisted_11$1, - createBaseVNode("span", _hoisted_12$1, toDisplayString(appData.value), 1), - withDirectives(createBaseVNode("span", _hoisted_13, null, 512), [ + createBaseVNode("div", _hoisted_6$3, [ + createBaseVNode("h3", _hoisted_7$3, toDisplayString(_ctx.$t("install.systemLocations")), 1), + createBaseVNode("div", _hoisted_8$3, [ + createBaseVNode("div", _hoisted_9$3, [ + _hoisted_10$3, + _hoisted_11$3, + createBaseVNode("span", _hoisted_12$3, toDisplayString(appData.value), 1), + withDirectives(createBaseVNode("span", _hoisted_13$2, null, 512), [ [_directive_tooltip, _ctx.$t("install.appDataLocationTooltip")] ]) ]), - createBaseVNode("div", _hoisted_14, [ - _hoisted_15, - _hoisted_16, - createBaseVNode("span", _hoisted_17, toDisplayString(appPath.value), 1), - withDirectives(createBaseVNode("span", _hoisted_18, null, 512), [ + createBaseVNode("div", _hoisted_14$2, [ + _hoisted_15$2, + _hoisted_16$2, + createBaseVNode("span", _hoisted_17$2, toDisplayString(appPath.value), 1), + withDirectives(createBaseVNode("span", _hoisted_18$2, null, 512), [ [_directive_tooltip, _ctx.$t("install.appPathLocationTooltip")] ]) ]) @@ -946,25 +678,25 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({ }; } }); -const _hoisted_1$1 = { class: "flex flex-col gap-6 w-[600px]" }; -const _hoisted_2$1 = { class: "flex flex-col gap-4" }; -const _hoisted_3$1 = { class: "text-2xl font-semibold text-neutral-100" }; -const _hoisted_4$1 = { class: "text-neutral-400 my-0" }; -const _hoisted_5 = { class: "flex gap-2" }; -const _hoisted_6 = { +const _hoisted_1$3 = { class: "flex flex-col gap-6 w-[600px]" }; +const _hoisted_2$3 = { class: "flex flex-col gap-4" }; +const _hoisted_3$3 = { class: "text-2xl font-semibold text-neutral-100" }; +const _hoisted_4$3 = { class: "text-neutral-400 my-0" }; +const _hoisted_5$3 = { class: "flex gap-2" }; +const _hoisted_6$2 = { key: 0, class: "flex flex-col gap-4 bg-neutral-800 p-4 rounded-lg" }; -const _hoisted_7 = { class: "text-lg mt-0 font-medium text-neutral-100" }; -const _hoisted_8 = { class: "flex flex-col gap-3" }; -const _hoisted_9 = ["onClick"]; -const _hoisted_10 = ["for"]; -const _hoisted_11 = { class: "text-sm text-neutral-400 my-1" }; -const _hoisted_12 = { +const _hoisted_7$2 = { class: "text-lg mt-0 font-medium text-neutral-100" }; +const _hoisted_8$2 = { class: "flex flex-col gap-3" }; +const _hoisted_9$2 = ["onClick"]; +const _hoisted_10$2 = ["for"]; +const _hoisted_11$2 = { class: "text-sm text-neutral-400 my-1" }; +const _hoisted_12$2 = { key: 1, class: "text-neutral-400 italic" }; -const _sfc_main$1 = /* @__PURE__ */ defineComponent({ +const _sfc_main$3 = /* @__PURE__ */ defineComponent({ __name: "MigrationPicker", props: { "sourcePath": { required: false }, @@ -1020,12 +752,12 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({ migrationItemIds.value = migrationItems.value.filter((item) => item.selected).map((item) => item.id); }); return (_ctx, _cache) => { - return openBlock(), createElementBlock("div", _hoisted_1$1, [ - createBaseVNode("div", _hoisted_2$1, [ - createBaseVNode("h2", _hoisted_3$1, toDisplayString(_ctx.$t("install.migrateFromExistingInstallation")), 1), - createBaseVNode("p", _hoisted_4$1, toDisplayString(_ctx.$t("install.migrationSourcePathDescription")), 1), - createBaseVNode("div", _hoisted_5, [ - createVNode(unref(script$b), { + return openBlock(), createElementBlock("div", _hoisted_1$3, [ + createBaseVNode("div", _hoisted_2$3, [ + createBaseVNode("h2", _hoisted_3$3, toDisplayString(_ctx.$t("install.migrateFromExistingInstallation")), 1), + createBaseVNode("p", _hoisted_4$3, toDisplayString(_ctx.$t("install.migrationSourcePathDescription")), 1), + createBaseVNode("div", _hoisted_5$3, [ + createVNode(unref(script$8), { modelValue: sourcePath.value, "onUpdate:modelValue": [ _cache[0] || (_cache[0] = ($event) => sourcePath.value = $event), @@ -1034,13 +766,13 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({ placeholder: "Select existing ComfyUI installation (optional)", class: normalizeClass(["flex-1", { "p-invalid": pathError.value }]) }, null, 8, ["modelValue", "class"]), - createVNode(unref(script$e), { + createVNode(unref(script$b), { icon: "pi pi-folder", onClick: browsePath, class: "w-12" }) ]), - pathError.value ? (openBlock(), createBlock(unref(script$f), { + pathError.value ? (openBlock(), createBlock(unref(script$c), { key: 0, severity: "error" }, { @@ -1050,16 +782,16 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({ _: 1 })) : createCommentVNode("", true) ]), - isValidSource.value ? (openBlock(), createElementBlock("div", _hoisted_6, [ - createBaseVNode("h3", _hoisted_7, toDisplayString(_ctx.$t("install.selectItemsToMigrate")), 1), - createBaseVNode("div", _hoisted_8, [ + isValidSource.value ? (openBlock(), createElementBlock("div", _hoisted_6$2, [ + createBaseVNode("h3", _hoisted_7$2, toDisplayString(_ctx.$t("install.selectItemsToMigrate")), 1), + createBaseVNode("div", _hoisted_8$2, [ (openBlock(true), createElementBlock(Fragment, null, renderList(migrationItems.value, (item) => { return openBlock(), createElementBlock("div", { key: item.id, class: "flex items-center gap-3 p-2 hover:bg-neutral-700 rounded", onClick: /* @__PURE__ */ __name(($event) => item.selected = !item.selected, "onClick") }, [ - createVNode(unref(script$g), { + createVNode(unref(script$d), { modelValue: item.selected, "onUpdate:modelValue": /* @__PURE__ */ __name(($event) => item.selected = $event, "onUpdate:modelValue"), inputId: item.id, @@ -1071,22 +803,290 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({ createBaseVNode("label", { for: item.id, class: "text-neutral-200 font-medium" - }, toDisplayString(item.label), 9, _hoisted_10), - createBaseVNode("p", _hoisted_11, toDisplayString(item.description), 1) + }, toDisplayString(item.label), 9, _hoisted_10$2), + createBaseVNode("p", _hoisted_11$2, toDisplayString(item.description), 1) ]) - ], 8, _hoisted_9); + ], 8, _hoisted_9$2); }), 128)) ]) - ])) : (openBlock(), createElementBlock("div", _hoisted_12, toDisplayString(_ctx.$t("install.migrationOptional")), 1)) + ])) : (openBlock(), createElementBlock("div", _hoisted_12$2, toDisplayString(_ctx.$t("install.migrationOptional")), 1)) + ]); + }; + } +}); +const _hoisted_1$2 = { class: "flex flex-col gap-6 w-[600px]" }; +const _hoisted_2$2 = { class: "flex flex-col gap-4" }; +const _hoisted_3$2 = { class: "text-2xl font-semibold text-neutral-100" }; +const _hoisted_4$2 = { class: "text-neutral-400 my-0" }; +const _hoisted_5$2 = { class: "flex flex-col bg-neutral-800 p-4 rounded-lg" }; +const _hoisted_6$1 = { class: "flex items-center gap-4" }; +const _hoisted_7$1 = { class: "flex-1" }; +const _hoisted_8$1 = { class: "text-lg font-medium text-neutral-100" }; +const _hoisted_9$1 = { class: "text-sm text-neutral-400 mt-1" }; +const _hoisted_10$1 = { class: "flex items-center gap-4" }; +const _hoisted_11$1 = { class: "flex-1" }; +const _hoisted_12$1 = { class: "text-lg font-medium text-neutral-100" }; +const _hoisted_13$1 = { class: "text-sm text-neutral-400 mt-1" }; +const _hoisted_14$1 = { class: "text-neutral-300" }; +const _hoisted_15$1 = { class: "font-medium mb-2" }; +const _hoisted_16$1 = { class: "list-disc pl-6 space-y-1" }; +const _hoisted_17$1 = { class: "font-medium mt-4 mb-2" }; +const _hoisted_18$1 = { class: "list-disc pl-6 space-y-1" }; +const _sfc_main$2 = /* @__PURE__ */ defineComponent({ + __name: "DesktopSettingsConfiguration", + props: { + "autoUpdate": { required: true }, + "autoUpdateModifiers": {}, + "allowMetrics": { required: true }, + "allowMetricsModifiers": {} + }, + emits: ["update:autoUpdate", "update:allowMetrics"], + setup(__props) { + const showDialog = ref(false); + const autoUpdate = useModel(__props, "autoUpdate"); + const allowMetrics = useModel(__props, "allowMetrics"); + const showMetricsInfo = /* @__PURE__ */ __name(() => { + showDialog.value = true; + }, "showMetricsInfo"); + return (_ctx, _cache) => { + return openBlock(), createElementBlock("div", _hoisted_1$2, [ + createBaseVNode("div", _hoisted_2$2, [ + createBaseVNode("h2", _hoisted_3$2, toDisplayString(_ctx.$t("install.desktopAppSettings")), 1), + createBaseVNode("p", _hoisted_4$2, toDisplayString(_ctx.$t("install.desktopAppSettingsDescription")), 1) + ]), + createBaseVNode("div", _hoisted_5$2, [ + createBaseVNode("div", _hoisted_6$1, [ + createBaseVNode("div", _hoisted_7$1, [ + createBaseVNode("h3", _hoisted_8$1, toDisplayString(_ctx.$t("install.settings.autoUpdate")), 1), + createBaseVNode("p", _hoisted_9$1, toDisplayString(_ctx.$t("install.settings.autoUpdateDescription")), 1) + ]), + createVNode(unref(script$e), { + modelValue: autoUpdate.value, + "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => autoUpdate.value = $event) + }, null, 8, ["modelValue"]) + ]), + createVNode(unref(script$f)), + createBaseVNode("div", _hoisted_10$1, [ + createBaseVNode("div", _hoisted_11$1, [ + createBaseVNode("h3", _hoisted_12$1, toDisplayString(_ctx.$t("install.settings.allowMetrics")), 1), + createBaseVNode("p", _hoisted_13$1, toDisplayString(_ctx.$t("install.settings.allowMetricsDescription")), 1), + createBaseVNode("a", { + href: "#", + class: "text-sm text-blue-400 hover:text-blue-300 mt-1 inline-block", + onClick: withModifiers(showMetricsInfo, ["prevent"]) + }, toDisplayString(_ctx.$t("install.settings.learnMoreAboutData")), 1) + ]), + createVNode(unref(script$e), { + modelValue: allowMetrics.value, + "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => allowMetrics.value = $event) + }, null, 8, ["modelValue"]) + ]) + ]), + createVNode(unref(script$g), { + visible: showDialog.value, + "onUpdate:visible": _cache[2] || (_cache[2] = ($event) => showDialog.value = $event), + modal: "", + header: _ctx.$t("install.settings.dataCollectionDialog.title") + }, { + default: withCtx(() => [ + createBaseVNode("div", _hoisted_14$1, [ + createBaseVNode("h4", _hoisted_15$1, toDisplayString(_ctx.$t("install.settings.dataCollectionDialog.whatWeCollect")), 1), + createBaseVNode("ul", _hoisted_16$1, [ + createBaseVNode("li", null, toDisplayString(_ctx.$t("install.settings.dataCollectionDialog.errorReports")), 1), + createBaseVNode("li", null, toDisplayString(_ctx.$t("install.settings.dataCollectionDialog.systemInfo")), 1) + ]), + createBaseVNode("h4", _hoisted_17$1, toDisplayString(_ctx.$t("install.settings.dataCollectionDialog.whatWeDoNotCollect")), 1), + createBaseVNode("ul", _hoisted_18$1, [ + createBaseVNode("li", null, toDisplayString(_ctx.$t("install.settings.dataCollectionDialog.personalInformation")), 1), + createBaseVNode("li", null, toDisplayString(_ctx.$t("install.settings.dataCollectionDialog.workflowContents")), 1), + createBaseVNode("li", null, toDisplayString(_ctx.$t("install.settings.dataCollectionDialog.fileSystemInformation")), 1), + createBaseVNode("li", null, toDisplayString(_ctx.$t( + "install.settings.dataCollectionDialog.customNodeConfigurations" + )), 1) + ]) + ]) + ]), + _: 1 + }, 8, ["visible", "header"]) + ]); + }; + } +}); +const _imports_0 = "" + new URL("images/nvidia-logo.svg", import.meta.url).href; +const _imports_1 = "" + new URL("images/apple-mps-logo.png", import.meta.url).href; +const _imports_2 = "" + new URL("images/manual-configuration.svg", import.meta.url).href; +const _hoisted_1$1 = { class: "flex flex-col gap-6 w-[600px] h-[30rem] select-none" }; +const _hoisted_2$1 = { class: "grow flex flex-col gap-4 text-neutral-300" }; +const _hoisted_3$1 = { class: "text-2xl font-semibold text-neutral-100" }; +const _hoisted_4$1 = { class: "m-1 text-neutral-400" }; +const _hoisted_5$1 = /* @__PURE__ */ createBaseVNode("img", { + class: "m-12", + alt: "NVIDIA logo", + width: "196", + height: "32", + src: _imports_0 +}, null, -1); +const _hoisted_6 = [ + _hoisted_5$1 +]; +const _hoisted_7 = /* @__PURE__ */ createBaseVNode("img", { + class: "rounded-lg hover-brighten", + alt: "Apple Metal Performance Shaders Logo", + width: "292", + ratio: "", + src: _imports_1 +}, null, -1); +const _hoisted_8 = [ + _hoisted_7 +]; +const _hoisted_9 = /* @__PURE__ */ createBaseVNode("img", { + class: "m-12", + alt: "Manual configuration", + width: "196", + src: _imports_2 +}, null, -1); +const _hoisted_10 = [ + _hoisted_9 +]; +const _hoisted_11 = { + key: 0, + class: "m-1" +}; +const _hoisted_12 = { + key: 1, + class: "m-1" +}; +const _hoisted_13 = { + key: 2, + class: "text-neutral-300" +}; +const _hoisted_14 = { class: "m-1" }; +const _hoisted_15 = { key: 3 }; +const _hoisted_16 = { class: "m-1" }; +const _hoisted_17 = { class: "m-1" }; +const _hoisted_18 = { + for: "cpu-mode", + class: "select-none" +}; +const _sfc_main$1 = /* @__PURE__ */ defineComponent({ + __name: "GpuPicker", + props: { + "device": { + required: true + }, + "deviceModifiers": {} + }, + emits: ["update:device"], + setup(__props) { + const { t } = useI18n(); + const cpuMode = computed({ + get: /* @__PURE__ */ __name(() => selected.value === "cpu", "get"), + set: /* @__PURE__ */ __name((value2) => { + selected.value = value2 ? "cpu" : null; + }, "set") + }); + const selected = useModel(__props, "device"); + const electron = electronAPI(); + const platform = electron.getPlatform(); + const pickGpu = /* @__PURE__ */ __name((value2) => { + const newValue = selected.value === value2 ? null : value2; + selected.value = newValue; + }, "pickGpu"); + return (_ctx, _cache) => { + return openBlock(), createElementBlock("div", _hoisted_1$1, [ + createBaseVNode("div", _hoisted_2$1, [ + createBaseVNode("h2", _hoisted_3$1, toDisplayString(_ctx.$t("install.gpuSelection.selectGpu")), 1), + createBaseVNode("p", _hoisted_4$1, toDisplayString(_ctx.$t("install.gpuSelection.selectGpuDescription")) + ": ", 1), + createBaseVNode("div", { + class: normalizeClass(["flex gap-2 text-center transition-opacity", { selected: selected.value }]) + }, [ + unref(platform) !== "darwin" ? (openBlock(), createElementBlock("div", { + key: 0, + class: normalizeClass(["gpu-button", { selected: selected.value === "nvidia" }]), + role: "button", + onClick: _cache[0] || (_cache[0] = ($event) => pickGpu("nvidia")) + }, _hoisted_6, 2)) : createCommentVNode("", true), + unref(platform) === "darwin" ? (openBlock(), createElementBlock("div", { + key: 1, + class: normalizeClass(["gpu-button", { selected: selected.value === "mps" }]), + role: "button", + onClick: _cache[1] || (_cache[1] = ($event) => pickGpu("mps")) + }, _hoisted_8, 2)) : createCommentVNode("", true), + createBaseVNode("div", { + class: normalizeClass(["gpu-button", { selected: selected.value === "unsupported" }]), + role: "button", + onClick: _cache[2] || (_cache[2] = ($event) => pickGpu("unsupported")) + }, _hoisted_10, 2) + ], 2), + selected.value === "nvidia" ? (openBlock(), createElementBlock("p", _hoisted_11, [ + createVNode(unref(script$h), { + icon: "pi pi-check", + severity: "success", + value: "CUDA" + }), + createTextVNode(" " + toDisplayString(_ctx.$t("install.gpuSelection.nvidiaDescription")), 1) + ])) : createCommentVNode("", true), + selected.value === "mps" ? (openBlock(), createElementBlock("p", _hoisted_12, [ + createVNode(unref(script$h), { + icon: "pi pi-check", + severity: "success", + value: "MPS" + }), + createTextVNode(" " + toDisplayString(_ctx.$t("install.gpuSelection.mpsDescription")), 1) + ])) : createCommentVNode("", true), + selected.value === "unsupported" ? (openBlock(), createElementBlock("div", _hoisted_13, [ + createBaseVNode("p", _hoisted_14, [ + createVNode(unref(script$h), { + icon: "pi pi-exclamation-triangle", + severity: "warn", + value: unref(t)("icon.exclamation-triangle") + }, null, 8, ["value"]), + createTextVNode(" " + toDisplayString(_ctx.$t("install.gpuSelection.customSkipsPython")), 1) + ]), + createBaseVNode("ul", null, [ + createBaseVNode("li", null, [ + createBaseVNode("strong", null, toDisplayString(_ctx.$t("install.gpuSelection.customComfyNeedsPython")), 1) + ]), + createBaseVNode("li", null, toDisplayString(_ctx.$t("install.gpuSelection.customManualVenv")), 1), + createBaseVNode("li", null, toDisplayString(_ctx.$t("install.gpuSelection.customInstallRequirements")), 1), + createBaseVNode("li", null, toDisplayString(_ctx.$t("install.gpuSelection.customMayNotWork")), 1) + ]) + ])) : createCommentVNode("", true), + selected.value === "cpu" ? (openBlock(), createElementBlock("div", _hoisted_15, [ + createBaseVNode("p", _hoisted_16, [ + createVNode(unref(script$h), { + icon: "pi pi-exclamation-triangle", + severity: "warn", + value: unref(t)("icon.exclamation-triangle") + }, null, 8, ["value"]), + createTextVNode(" " + toDisplayString(_ctx.$t("install.gpuSelection.cpuModeDescription")), 1) + ]), + createBaseVNode("p", _hoisted_17, toDisplayString(_ctx.$t("install.gpuSelection.cpuModeDescription2")), 1) + ])) : createCommentVNode("", true) + ]), + createBaseVNode("div", { + class: normalizeClass(["transition-opacity flex gap-3 h-0", { + "opacity-40": selected.value && selected.value !== "cpu" + }]) + }, [ + createVNode(unref(script$e), { + modelValue: cpuMode.value, + "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => cpuMode.value = $event), + inputId: "cpu-mode", + class: "-translate-y-40" + }, null, 8, ["modelValue"]), + createBaseVNode("label", _hoisted_18, toDisplayString(_ctx.$t("install.gpuSelection.enableCpuMode")), 1) + ], 2) ]); }; } }); -const _withScopeId = /* @__PURE__ */ __name((n) => (pushScopeId("data-v-de33872d"), n = n(), popScopeId(), n), "_withScopeId"); -const _hoisted_1 = { class: "flex pt-6 justify-end" }; -const _hoisted_2 = { class: "flex pt-6 justify-between" }; +const _withScopeId = /* @__PURE__ */ __name((n) => (pushScopeId("data-v-eeee4af8"), n = n(), popScopeId(), n), "_withScopeId"); +const _hoisted_1 = { class: "font-sans flex flex-col items-center h-screen m-0 text-neutral-300 bg-neutral-900 dark-theme pointer-events-auto" }; +const _hoisted_2 = { class: "flex pt-6 justify-end" }; const _hoisted_3 = { class: "flex pt-6 justify-between" }; const _hoisted_4 = { class: "flex pt-6 justify-between" }; +const _hoisted_5 = { class: "flex pt-6 justify-between" }; const _sfc_main = /* @__PURE__ */ defineComponent({ __name: "InstallView", setup(__props) { @@ -1126,163 +1126,160 @@ const _sfc_main = /* @__PURE__ */ defineComponent({ device.value = detectedGpu; }); return (_ctx, _cache) => { - return openBlock(), createBlock(_sfc_main$5, { dark: "" }, { - default: withCtx(() => [ - createVNode(unref(script), { - class: "h-full p-8 2xl:p-16", - value: "0", - "onUpdate:value": setHighestStep - }, { - default: withCtx(() => [ - createVNode(unref(script$4), { class: "select-none" }, { - default: withCtx(() => [ - createVNode(unref(script$5), { value: "0" }, { - default: withCtx(() => [ - createTextVNode(toDisplayString(_ctx.$t("install.gpu")), 1) - ]), - _: 1 - }), - createVNode(unref(script$5), { - value: "1", - disabled: noGpu.value - }, { - default: withCtx(() => [ - createTextVNode(toDisplayString(_ctx.$t("install.installLocation")), 1) - ]), - _: 1 - }, 8, ["disabled"]), - createVNode(unref(script$5), { - value: "2", - disabled: noGpu.value || hasError.value || highestStep.value < 1 - }, { - default: withCtx(() => [ - createTextVNode(toDisplayString(_ctx.$t("install.migration")), 1) - ]), - _: 1 - }, 8, ["disabled"]), - createVNode(unref(script$5), { - value: "3", - disabled: noGpu.value || hasError.value || highestStep.value < 2 - }, { - default: withCtx(() => [ - createTextVNode(toDisplayString(_ctx.$t("install.desktopSettings")), 1) - ]), - _: 1 - }, 8, ["disabled"]) - ]), - _: 1 - }), - createVNode(unref(script$2), null, { - default: withCtx(() => [ - createVNode(unref(script$3), { value: "0" }, { - default: withCtx(({ activateCallback }) => [ - createVNode(_sfc_main$3, { - device: device.value, - "onUpdate:device": _cache[0] || (_cache[0] = ($event) => device.value = $event) - }, null, 8, ["device"]), - createBaseVNode("div", _hoisted_1, [ - createVNode(unref(script$e), { - label: _ctx.$t("g.next"), - icon: "pi pi-arrow-right", - iconPos: "right", - onClick: /* @__PURE__ */ __name(($event) => activateCallback("1"), "onClick"), - disabled: typeof device.value !== "string" - }, null, 8, ["label", "onClick", "disabled"]) - ]) - ]), - _: 1 - }), - createVNode(unref(script$3), { value: "1" }, { - default: withCtx(({ activateCallback }) => [ - createVNode(_sfc_main$2, { - installPath: installPath.value, - "onUpdate:installPath": _cache[1] || (_cache[1] = ($event) => installPath.value = $event), - pathError: pathError.value, - "onUpdate:pathError": _cache[2] || (_cache[2] = ($event) => pathError.value = $event) - }, null, 8, ["installPath", "pathError"]), - createBaseVNode("div", _hoisted_2, [ - createVNode(unref(script$e), { - label: _ctx.$t("g.back"), - severity: "secondary", - icon: "pi pi-arrow-left", - onClick: /* @__PURE__ */ __name(($event) => activateCallback("0"), "onClick") - }, null, 8, ["label", "onClick"]), - createVNode(unref(script$e), { - label: _ctx.$t("g.next"), - icon: "pi pi-arrow-right", - iconPos: "right", - onClick: /* @__PURE__ */ __name(($event) => activateCallback("2"), "onClick"), - disabled: pathError.value !== "" - }, null, 8, ["label", "onClick", "disabled"]) - ]) - ]), - _: 1 - }), - createVNode(unref(script$3), { value: "2" }, { - default: withCtx(({ activateCallback }) => [ - createVNode(_sfc_main$1, { - sourcePath: migrationSourcePath.value, - "onUpdate:sourcePath": _cache[3] || (_cache[3] = ($event) => migrationSourcePath.value = $event), - migrationItemIds: migrationItemIds.value, - "onUpdate:migrationItemIds": _cache[4] || (_cache[4] = ($event) => migrationItemIds.value = $event) - }, null, 8, ["sourcePath", "migrationItemIds"]), - createBaseVNode("div", _hoisted_3, [ - createVNode(unref(script$e), { - label: _ctx.$t("g.back"), - severity: "secondary", - icon: "pi pi-arrow-left", - onClick: /* @__PURE__ */ __name(($event) => activateCallback("1"), "onClick") - }, null, 8, ["label", "onClick"]), - createVNode(unref(script$e), { - label: _ctx.$t("g.next"), - icon: "pi pi-arrow-right", - iconPos: "right", - onClick: /* @__PURE__ */ __name(($event) => activateCallback("3"), "onClick") - }, null, 8, ["label", "onClick"]) - ]) - ]), - _: 1 - }), - createVNode(unref(script$3), { value: "3" }, { - default: withCtx(({ activateCallback }) => [ - createVNode(_sfc_main$4, { - autoUpdate: autoUpdate.value, - "onUpdate:autoUpdate": _cache[5] || (_cache[5] = ($event) => autoUpdate.value = $event), - allowMetrics: allowMetrics.value, - "onUpdate:allowMetrics": _cache[6] || (_cache[6] = ($event) => allowMetrics.value = $event) - }, null, 8, ["autoUpdate", "allowMetrics"]), - createBaseVNode("div", _hoisted_4, [ - createVNode(unref(script$e), { - label: _ctx.$t("g.back"), - severity: "secondary", - icon: "pi pi-arrow-left", - onClick: /* @__PURE__ */ __name(($event) => activateCallback("2"), "onClick") - }, null, 8, ["label", "onClick"]), - createVNode(unref(script$e), { - label: _ctx.$t("g.install"), - icon: "pi pi-check", - iconPos: "right", - disabled: hasError.value, - onClick: _cache[7] || (_cache[7] = ($event) => install()) - }, null, 8, ["label", "disabled"]) - ]) - ]), - _: 1 - }) - ]), - _: 1 - }) - ]), - _: 1 - }) - ]), - _: 1 - }); + return openBlock(), createElementBlock("div", _hoisted_1, [ + createVNode(unref(script$6), { + class: "stepper", + value: "0", + "onUpdate:value": setHighestStep + }, { + default: withCtx(() => [ + createVNode(unref(script$5), { class: "select-none" }, { + default: withCtx(() => [ + createVNode(unref(script$3), { value: "0" }, { + default: withCtx(() => [ + createTextVNode(toDisplayString(_ctx.$t("install.gpu")), 1) + ]), + _: 1 + }), + createVNode(unref(script$3), { + value: "1", + disabled: noGpu.value + }, { + default: withCtx(() => [ + createTextVNode(toDisplayString(_ctx.$t("install.installLocation")), 1) + ]), + _: 1 + }, 8, ["disabled"]), + createVNode(unref(script$3), { + value: "2", + disabled: noGpu.value || hasError.value || highestStep.value < 1 + }, { + default: withCtx(() => [ + createTextVNode(toDisplayString(_ctx.$t("install.migration")), 1) + ]), + _: 1 + }, 8, ["disabled"]), + createVNode(unref(script$3), { + value: "3", + disabled: noGpu.value || hasError.value || highestStep.value < 2 + }, { + default: withCtx(() => [ + createTextVNode(toDisplayString(_ctx.$t("install.desktopSettings")), 1) + ]), + _: 1 + }, 8, ["disabled"]) + ]), + _: 1 + }), + createVNode(unref(script$4), null, { + default: withCtx(() => [ + createVNode(unref(script), { value: "0" }, { + default: withCtx(({ activateCallback }) => [ + createVNode(_sfc_main$1, { + device: device.value, + "onUpdate:device": _cache[0] || (_cache[0] = ($event) => device.value = $event) + }, null, 8, ["device"]), + createBaseVNode("div", _hoisted_2, [ + createVNode(unref(script$b), { + label: _ctx.$t("g.next"), + icon: "pi pi-arrow-right", + iconPos: "right", + onClick: /* @__PURE__ */ __name(($event) => activateCallback("1"), "onClick"), + disabled: typeof device.value !== "string" + }, null, 8, ["label", "onClick", "disabled"]) + ]) + ]), + _: 1 + }), + createVNode(unref(script), { value: "1" }, { + default: withCtx(({ activateCallback }) => [ + createVNode(_sfc_main$4, { + installPath: installPath.value, + "onUpdate:installPath": _cache[1] || (_cache[1] = ($event) => installPath.value = $event), + pathError: pathError.value, + "onUpdate:pathError": _cache[2] || (_cache[2] = ($event) => pathError.value = $event) + }, null, 8, ["installPath", "pathError"]), + createBaseVNode("div", _hoisted_3, [ + createVNode(unref(script$b), { + label: _ctx.$t("g.back"), + severity: "secondary", + icon: "pi pi-arrow-left", + onClick: /* @__PURE__ */ __name(($event) => activateCallback("0"), "onClick") + }, null, 8, ["label", "onClick"]), + createVNode(unref(script$b), { + label: _ctx.$t("g.next"), + icon: "pi pi-arrow-right", + iconPos: "right", + onClick: /* @__PURE__ */ __name(($event) => activateCallback("2"), "onClick"), + disabled: pathError.value !== "" + }, null, 8, ["label", "onClick", "disabled"]) + ]) + ]), + _: 1 + }), + createVNode(unref(script), { value: "2" }, { + default: withCtx(({ activateCallback }) => [ + createVNode(_sfc_main$3, { + sourcePath: migrationSourcePath.value, + "onUpdate:sourcePath": _cache[3] || (_cache[3] = ($event) => migrationSourcePath.value = $event), + migrationItemIds: migrationItemIds.value, + "onUpdate:migrationItemIds": _cache[4] || (_cache[4] = ($event) => migrationItemIds.value = $event) + }, null, 8, ["sourcePath", "migrationItemIds"]), + createBaseVNode("div", _hoisted_4, [ + createVNode(unref(script$b), { + label: _ctx.$t("g.back"), + severity: "secondary", + icon: "pi pi-arrow-left", + onClick: /* @__PURE__ */ __name(($event) => activateCallback("1"), "onClick") + }, null, 8, ["label", "onClick"]), + createVNode(unref(script$b), { + label: _ctx.$t("g.next"), + icon: "pi pi-arrow-right", + iconPos: "right", + onClick: /* @__PURE__ */ __name(($event) => activateCallback("3"), "onClick") + }, null, 8, ["label", "onClick"]) + ]) + ]), + _: 1 + }), + createVNode(unref(script), { value: "3" }, { + default: withCtx(({ activateCallback }) => [ + createVNode(_sfc_main$2, { + autoUpdate: autoUpdate.value, + "onUpdate:autoUpdate": _cache[5] || (_cache[5] = ($event) => autoUpdate.value = $event), + allowMetrics: allowMetrics.value, + "onUpdate:allowMetrics": _cache[6] || (_cache[6] = ($event) => allowMetrics.value = $event) + }, null, 8, ["autoUpdate", "allowMetrics"]), + createBaseVNode("div", _hoisted_5, [ + createVNode(unref(script$b), { + label: _ctx.$t("g.back"), + severity: "secondary", + icon: "pi pi-arrow-left", + onClick: /* @__PURE__ */ __name(($event) => activateCallback("2"), "onClick") + }, null, 8, ["label", "onClick"]), + createVNode(unref(script$b), { + label: _ctx.$t("g.install"), + icon: "pi pi-check", + iconPos: "right", + disabled: hasError.value, + onClick: _cache[7] || (_cache[7] = ($event) => install()) + }, null, 8, ["label", "disabled"]) + ]) + ]), + _: 1 + }) + ]), + _: 1 + }) + ]), + _: 1 + }) + ]); }; } }); -const InstallView = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-de33872d"]]); +const InstallView = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-eeee4af8"]]); export { InstallView as default }; -//# sourceMappingURL=InstallView-ZoxdV0Ib.js.map +//# sourceMappingURL=InstallView-BOZ1nhez.js.map diff --git a/web/assets/InstallView-CwQdoH-C.css b/web/assets/InstallView-Cfq1m4as.css similarity index 91% rename from web/assets/InstallView-CwQdoH-C.css rename to web/assets/InstallView-Cfq1m4as.css index df578778..7277a862 100644 --- a/web/assets/InstallView-CwQdoH-C.css +++ b/web/assets/InstallView-Cfq1m4as.css @@ -74,6 +74,9 @@ div.selected { text-align: center; } -[data-v-de33872d] .p-steppanel { - background-color: transparent +[data-v-eeee4af8] .p-steppanel { + background-color: transparent; +} +.stepper[data-v-eeee4af8] { + margin-top: max(1rem, max(0px, calc((100vh - 42rem) * 0.5))); } diff --git a/web/assets/KeybindingPanel-COhe3VgH.js b/web/assets/KeybindingPanel-BkAdqLwN.js similarity index 88% rename from web/assets/KeybindingPanel-COhe3VgH.js rename to web/assets/KeybindingPanel-BkAdqLwN.js index 79702656..30c81311 100644 --- a/web/assets/KeybindingPanel-COhe3VgH.js +++ b/web/assets/KeybindingPanel-BkAdqLwN.js @@ -1,10 +1,8 @@ var __defProp = Object.defineProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); -import { d as defineComponent, c as computed, o as openBlock, f as createElementBlock, F as Fragment, E as renderList, N as createVNode, M as withCtx, aE as createTextVNode, X as toDisplayString, j as unref, aI as script, I as createCommentVNode, ab as ref, cn as FilterMatchMode, a$ as useKeybindingStore, a2 as useCommandStore, a1 as useI18n, af as normalizeI18nKey, w as watchEffect, bs as useToast, r as resolveDirective, k as createBlock, co as SearchBox, H as createBaseVNode, l as script$2, av as script$4, bM as withModifiers, bZ as script$5, aP as script$6, i as withDirectives, cp as _sfc_main$2, aL as pushScopeId, aM as popScopeId, cq as KeyComboImpl, cr as KeybindingImpl, _ as _export_sfc } from "./index-BbhVsmQe.js"; -import { s as script$1, a as script$3 } from "./index-DIIs-Ju9.js"; -import { u as useKeybindingService } from "./keybindingService-DohhteGb.js"; -import "./index-BQjD3NM4.js"; -import "./index-VIBj2YvH.js"; +import { a as defineComponent, p as computed, o as openBlock, f as createElementBlock, O as Fragment, P as renderList, g as createVNode, x as withCtx, ax as createTextVNode, a7 as toDisplayString, y as unref, aB as script, h as createCommentVNode, r as ref, cl as FilterMatchMode, N as useKeybindingStore, D as useCommandStore, H as useI18n, aR as normalizeI18nKey, aM as watchEffect, bp as useToast, q as resolveDirective, v as createBlock, cm as SearchBox, z as createBaseVNode, C as script$2, ap as script$4, bu as withModifiers, b_ as script$5, aI as script$6, t as withDirectives, cn as _sfc_main$2, Q as pushScopeId, R as popScopeId, bU as KeyComboImpl, co as KeybindingImpl, _ as _export_sfc } from "./index-DAOHvvrm.js"; +import { s as script$1, a as script$3 } from "./index-DqWMa5Pc.js"; +import "./index-CPVMarQJ.js"; const _hoisted_1$1 = { key: 0, class: "px-2" @@ -37,7 +35,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({ }; } }); -const _withScopeId = /* @__PURE__ */ __name((n) => (pushScopeId("data-v-2554ab36"), n = n(), popScopeId(), n), "_withScopeId"); +const _withScopeId = /* @__PURE__ */ __name((n) => (pushScopeId("data-v-108bdfe7"), n = n(), popScopeId(), n), "_withScopeId"); const _hoisted_1 = { class: "actions invisible flex flex-row" }; const _hoisted_2 = ["title"]; const _hoisted_3 = { key: 1 }; @@ -48,7 +46,6 @@ const _sfc_main = /* @__PURE__ */ defineComponent({ global: { value: "", matchMode: FilterMatchMode.CONTAINS } }); const keybindingStore = useKeybindingStore(); - const keybindingService = useKeybindingService(); const commandStore = useCommandStore(); const { t } = useI18n(); const commandsData = computed(() => { @@ -93,7 +90,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({ function removeKeybinding(commandData) { if (commandData.keybinding) { keybindingStore.unsetKeybinding(commandData.keybinding); - keybindingService.persistUserKeybindings(); + keybindingStore.persistUserKeybindings(); } } __name(removeKeybinding, "removeKeybinding"); @@ -117,7 +114,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({ }) ); if (updated) { - keybindingService.persistUserKeybindings(); + keybindingStore.persistUserKeybindings(); } } cancelEdit(); @@ -126,7 +123,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({ const toast = useToast(); async function resetKeybindings() { keybindingStore.resetKeybindings(); - await keybindingService.persistUserKeybindings(); + await keybindingStore.persistUserKeybindings(); toast.add({ severity: "info", summary: "Info", @@ -277,8 +274,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({ }; } }); -const KeybindingPanel = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-2554ab36"]]); +const KeybindingPanel = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-108bdfe7"]]); export { KeybindingPanel as default }; -//# sourceMappingURL=KeybindingPanel-COhe3VgH.js.map +//# sourceMappingURL=KeybindingPanel-BkAdqLwN.js.map diff --git a/web/assets/KeybindingPanel-DG93MIeP.css b/web/assets/KeybindingPanel-DG93MIeP.css new file mode 100644 index 00000000..95e35c8d --- /dev/null +++ b/web/assets/KeybindingPanel-DG93MIeP.css @@ -0,0 +1,8 @@ + +[data-v-108bdfe7] .p-datatable-tbody > tr > td { + padding: 0.25rem; + min-height: 2rem +} +[data-v-108bdfe7] .p-datatable-row-selected .actions,[data-v-108bdfe7] .p-datatable-selectable-row:hover .actions { + visibility: visible +} diff --git a/web/assets/KeybindingPanel-DvrUYZ4S.css b/web/assets/KeybindingPanel-DvrUYZ4S.css deleted file mode 100644 index 8f714bcd..00000000 --- a/web/assets/KeybindingPanel-DvrUYZ4S.css +++ /dev/null @@ -1,8 +0,0 @@ - -[data-v-2554ab36] .p-datatable-tbody > tr > td { - padding: 0.25rem; - min-height: 2rem -} -[data-v-2554ab36] .p-datatable-row-selected .actions,[data-v-2554ab36] .p-datatable-selectable-row:hover .actions { - visibility: visible -} diff --git a/web/assets/ManualConfigurationView-B6ecEClB.css b/web/assets/ManualConfigurationView-B6ecEClB.css deleted file mode 100644 index 06a5cc3e..00000000 --- a/web/assets/ManualConfigurationView-B6ecEClB.css +++ /dev/null @@ -1,7 +0,0 @@ - -:root { - --p-tag-gap: 0.5rem; -} -.comfy-installer { - margin-top: max(1rem, max(0px, calc((100vh - 42rem) * 0.5))); -} diff --git a/web/assets/ManualConfigurationView-CYxSElYw.js b/web/assets/ManualConfigurationView-CYxSElYw.js deleted file mode 100644 index 8aca1034..00000000 --- a/web/assets/ManualConfigurationView-CYxSElYw.js +++ /dev/null @@ -1,75 +0,0 @@ -var __defProp = Object.defineProperty; -var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); -import { d as defineComponent, a1 as useI18n, ab as ref, m as onMounted, o as openBlock, k as createBlock, M as withCtx, H as createBaseVNode, X as toDisplayString, N as createVNode, j as unref, aI as script, l as script$2, c0 as electronAPI } from "./index-BbhVsmQe.js"; -import { s as script$1 } from "./index-BuE2B-Gw.js"; -import { _ as _sfc_main$1 } from "./BaseViewTemplate-qOhVwbhN.js"; -import "./index-VIBj2YvH.js"; -const _hoisted_1 = { class: "comfy-installer grow flex flex-col gap-4 text-neutral-300 max-w-110" }; -const _hoisted_2 = { class: "text-2xl font-semibold text-neutral-100" }; -const _hoisted_3 = { class: "m-1 text-neutral-300" }; -const _hoisted_4 = { class: "ml-2" }; -const _hoisted_5 = { class: "m-1 mb-4" }; -const _hoisted_6 = { class: "m-0" }; -const _hoisted_7 = { class: "m-1" }; -const _hoisted_8 = { class: "font-mono" }; -const _hoisted_9 = { class: "m-1" }; -const _sfc_main = /* @__PURE__ */ defineComponent({ - __name: "ManualConfigurationView", - setup(__props) { - const { t } = useI18n(); - const electron = electronAPI(); - const basePath = ref(null); - const sep = ref("/"); - const restartApp = /* @__PURE__ */ __name((message) => electron.restartApp(message), "restartApp"); - onMounted(async () => { - basePath.value = await electron.getBasePath(); - if (basePath.value.indexOf("/") === -1) sep.value = "\\"; - }); - return (_ctx, _cache) => { - return openBlock(), createBlock(_sfc_main$1, { dark: "" }, { - default: withCtx(() => [ - createBaseVNode("div", _hoisted_1, [ - createBaseVNode("h2", _hoisted_2, toDisplayString(_ctx.$t("install.manualConfiguration.title")), 1), - createBaseVNode("p", _hoisted_3, [ - createVNode(unref(script), { - icon: "pi pi-exclamation-triangle", - severity: "warn", - value: unref(t)("icon.exclamation-triangle") - }, null, 8, ["value"]), - createBaseVNode("strong", _hoisted_4, toDisplayString(_ctx.$t("install.gpuSelection.customComfyNeedsPython")), 1) - ]), - createBaseVNode("div", null, [ - createBaseVNode("p", _hoisted_5, toDisplayString(_ctx.$t("install.manualConfiguration.requirements")) + ": ", 1), - createBaseVNode("ul", _hoisted_6, [ - createBaseVNode("li", null, toDisplayString(_ctx.$t("install.gpuSelection.customManualVenv")), 1), - createBaseVNode("li", null, toDisplayString(_ctx.$t("install.gpuSelection.customInstallRequirements")), 1) - ]) - ]), - createBaseVNode("p", _hoisted_7, toDisplayString(_ctx.$t("install.manualConfiguration.createVenv")) + ":", 1), - createVNode(unref(script$1), { - header: unref(t)("install.manualConfiguration.virtualEnvironmentPath") - }, { - default: withCtx(() => [ - createBaseVNode("span", _hoisted_8, toDisplayString(`${basePath.value}${sep.value}.venv${sep.value}`), 1) - ]), - _: 1 - }, 8, ["header"]), - createBaseVNode("p", _hoisted_9, toDisplayString(_ctx.$t("install.manualConfiguration.restartWhenFinished")), 1), - createVNode(unref(script$2), { - class: "place-self-end", - label: unref(t)("menuLabels.Restart"), - severity: "warn", - icon: "pi pi-refresh", - onClick: _cache[0] || (_cache[0] = ($event) => restartApp("Manual configuration complete")) - }, null, 8, ["label"]) - ]) - ]), - _: 1 - }); - }; - } -}); -export { - _sfc_main as default -}; -//# sourceMappingURL=ManualConfigurationView-CYxSElYw.js.map diff --git a/web/assets/NotSupportedView-Cjt5Fiwh.js b/web/assets/NotSupportedView-Cjt5Fiwh.js new file mode 100644 index 00000000..1d0fa6b9 --- /dev/null +++ b/web/assets/NotSupportedView-Cjt5Fiwh.js @@ -0,0 +1,83 @@ +var __defProp = Object.defineProperty; +var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); +import { a as defineComponent, bX as useRouter, q as resolveDirective, o as openBlock, f as createElementBlock, z as createBaseVNode, a7 as toDisplayString, g as createVNode, y as unref, C as script, t as withDirectives } from "./index-DAOHvvrm.js"; +const _imports_0 = "" + new URL("images/sad_girl.png", import.meta.url).href; +const _hoisted_1 = { class: "font-sans w-screen h-screen flex items-center justify-around m-0 text-neutral-900 bg-neutral-300 pointer-events-auto" }; +const _hoisted_2 = { class: "sad-container" }; +const _hoisted_3 = /* @__PURE__ */ createBaseVNode("img", { + class: "sad-girl", + src: _imports_0, + alt: "Sad girl illustration" +}, null, -1); +const _hoisted_4 = { class: "no-drag sad-text flex items-center" }; +const _hoisted_5 = { class: "flex flex-col gap-8 p-8 min-w-110" }; +const _hoisted_6 = { class: "text-4xl font-bold text-red-500" }; +const _hoisted_7 = { class: "space-y-4" }; +const _hoisted_8 = { class: "text-xl" }; +const _hoisted_9 = { class: "list-disc list-inside space-y-1 text-neutral-800" }; +const _hoisted_10 = { class: "flex gap-4" }; +const _sfc_main = /* @__PURE__ */ defineComponent({ + __name: "NotSupportedView", + setup(__props) { + const openDocs = /* @__PURE__ */ __name(() => { + window.open( + "https://github.com/Comfy-Org/desktop#currently-supported-platforms", + "_blank" + ); + }, "openDocs"); + const reportIssue = /* @__PURE__ */ __name(() => { + window.open("https://forum.comfy.org/c/v1-feedback/", "_blank"); + }, "reportIssue"); + const router = useRouter(); + const continueToInstall = /* @__PURE__ */ __name(() => { + router.push("/install"); + }, "continueToInstall"); + return (_ctx, _cache) => { + const _directive_tooltip = resolveDirective("tooltip"); + return openBlock(), createElementBlock("div", _hoisted_1, [ + createBaseVNode("div", _hoisted_2, [ + _hoisted_3, + createBaseVNode("div", _hoisted_4, [ + createBaseVNode("div", _hoisted_5, [ + createBaseVNode("h1", _hoisted_6, toDisplayString(_ctx.$t("notSupported.title")), 1), + createBaseVNode("div", _hoisted_7, [ + createBaseVNode("p", _hoisted_8, toDisplayString(_ctx.$t("notSupported.message")), 1), + createBaseVNode("ul", _hoisted_9, [ + createBaseVNode("li", null, toDisplayString(_ctx.$t("notSupported.supportedDevices.macos")), 1), + createBaseVNode("li", null, toDisplayString(_ctx.$t("notSupported.supportedDevices.windows")), 1) + ]) + ]), + createBaseVNode("div", _hoisted_10, [ + createVNode(unref(script), { + label: _ctx.$t("notSupported.learnMore"), + icon: "pi pi-github", + onClick: openDocs, + severity: "secondary" + }, null, 8, ["label"]), + createVNode(unref(script), { + label: _ctx.$t("notSupported.reportIssue"), + icon: "pi pi-flag", + onClick: reportIssue, + severity: "secondary" + }, null, 8, ["label"]), + withDirectives(createVNode(unref(script), { + label: _ctx.$t("notSupported.continue"), + icon: "pi pi-arrow-right", + iconPos: "right", + onClick: continueToInstall, + severity: "danger" + }, null, 8, ["label"]), [ + [_directive_tooltip, _ctx.$t("notSupported.continueTooltip")] + ]) + ]) + ]) + ]) + ]) + ]); + }; + } +}); +export { + _sfc_main as default +}; +//# sourceMappingURL=NotSupportedView-Cjt5Fiwh.js.map diff --git a/web/assets/NotSupportedView-sBtNsodN.js b/web/assets/NotSupportedView-sBtNsodN.js deleted file mode 100644 index 2b2a3524..00000000 --- a/web/assets/NotSupportedView-sBtNsodN.js +++ /dev/null @@ -1,86 +0,0 @@ -var __defProp = Object.defineProperty; -var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); -import { d as defineComponent, bW as useRouter, r as resolveDirective, o as openBlock, k as createBlock, M as withCtx, H as createBaseVNode, X as toDisplayString, N as createVNode, j as unref, l as script, i as withDirectives } from "./index-BbhVsmQe.js"; -import { _ as _sfc_main$1 } from "./BaseViewTemplate-qOhVwbhN.js"; -const _imports_0 = "" + new URL("images/sad_girl.png", import.meta.url).href; -const _hoisted_1 = { class: "sad-container" }; -const _hoisted_2 = /* @__PURE__ */ createBaseVNode("img", { - class: "sad-girl", - src: _imports_0, - alt: "Sad girl illustration" -}, null, -1); -const _hoisted_3 = { class: "no-drag sad-text flex items-center" }; -const _hoisted_4 = { class: "flex flex-col gap-8 p-8 min-w-110" }; -const _hoisted_5 = { class: "text-4xl font-bold text-red-500" }; -const _hoisted_6 = { class: "space-y-4" }; -const _hoisted_7 = { class: "text-xl" }; -const _hoisted_8 = { class: "list-disc list-inside space-y-1 text-neutral-800" }; -const _hoisted_9 = { class: "flex gap-4" }; -const _sfc_main = /* @__PURE__ */ defineComponent({ - __name: "NotSupportedView", - setup(__props) { - const openDocs = /* @__PURE__ */ __name(() => { - window.open( - "https://github.com/Comfy-Org/desktop#currently-supported-platforms", - "_blank" - ); - }, "openDocs"); - const reportIssue = /* @__PURE__ */ __name(() => { - window.open("https://forum.comfy.org/c/v1-feedback/", "_blank"); - }, "reportIssue"); - const router = useRouter(); - const continueToInstall = /* @__PURE__ */ __name(() => { - router.push("/install"); - }, "continueToInstall"); - return (_ctx, _cache) => { - const _directive_tooltip = resolveDirective("tooltip"); - return openBlock(), createBlock(_sfc_main$1, null, { - default: withCtx(() => [ - createBaseVNode("div", _hoisted_1, [ - _hoisted_2, - createBaseVNode("div", _hoisted_3, [ - createBaseVNode("div", _hoisted_4, [ - createBaseVNode("h1", _hoisted_5, toDisplayString(_ctx.$t("notSupported.title")), 1), - createBaseVNode("div", _hoisted_6, [ - createBaseVNode("p", _hoisted_7, toDisplayString(_ctx.$t("notSupported.message")), 1), - createBaseVNode("ul", _hoisted_8, [ - createBaseVNode("li", null, toDisplayString(_ctx.$t("notSupported.supportedDevices.macos")), 1), - createBaseVNode("li", null, toDisplayString(_ctx.$t("notSupported.supportedDevices.windows")), 1) - ]) - ]), - createBaseVNode("div", _hoisted_9, [ - createVNode(unref(script), { - label: _ctx.$t("notSupported.learnMore"), - icon: "pi pi-github", - onClick: openDocs, - severity: "secondary" - }, null, 8, ["label"]), - createVNode(unref(script), { - label: _ctx.$t("notSupported.reportIssue"), - icon: "pi pi-flag", - onClick: reportIssue, - severity: "secondary" - }, null, 8, ["label"]), - withDirectives(createVNode(unref(script), { - label: _ctx.$t("notSupported.continue"), - icon: "pi pi-arrow-right", - iconPos: "right", - onClick: continueToInstall, - severity: "danger" - }, null, 8, ["label"]), [ - [_directive_tooltip, _ctx.$t("notSupported.continueTooltip")] - ]) - ]) - ]) - ]) - ]) - ]), - _: 1 - }); - }; - } -}); -export { - _sfc_main as default -}; -//# sourceMappingURL=NotSupportedView-sBtNsodN.js.map diff --git a/web/assets/ServerConfigPanel-BHbwCDu2.js b/web/assets/ServerConfigPanel-C47nStyv.js similarity index 91% rename from web/assets/ServerConfigPanel-BHbwCDu2.js rename to web/assets/ServerConfigPanel-C47nStyv.js index fdc53a53..71a447a8 100644 --- a/web/assets/ServerConfigPanel-BHbwCDu2.js +++ b/web/assets/ServerConfigPanel-C47nStyv.js @@ -1,7 +1,7 @@ var __defProp = Object.defineProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); -import { H as createBaseVNode, o as openBlock, f as createElementBlock, Z as markRaw, d as defineComponent, a as useSettingStore, aS as storeToRefs, a5 as watch, cO as useCopyToClipboard, a1 as useI18n, k as createBlock, M as withCtx, j as unref, bZ as script, X as toDisplayString, E as renderList, F as Fragment, N as createVNode, l as script$1, I as createCommentVNode, bQ as script$2, cP as FormItem, cp as _sfc_main$1, c0 as electronAPI } from "./index-BbhVsmQe.js"; -import { u as useServerConfigStore } from "./serverConfigStore-CdBr6oWT.js"; +import { z as createBaseVNode, o as openBlock, f as createElementBlock, aX as markRaw, a as defineComponent, u as useSettingStore, aL as storeToRefs, w as watch, cL as useCopyToClipboard, H as useI18n, v as createBlock, x as withCtx, y as unref, b_ as script, a7 as toDisplayString, P as renderList, O as Fragment, g as createVNode, C as script$1, h as createCommentVNode, bQ as script$2, cM as FormItem, cn as _sfc_main$1, c1 as electronAPI } from "./index-DAOHvvrm.js"; +import { u as useServerConfigStore } from "./serverConfigStore-DCuqETVV.js"; const _hoisted_1$1 = { viewBox: "0 0 24 24", width: "1.2em", @@ -155,4 +155,4 @@ const _sfc_main = /* @__PURE__ */ defineComponent({ export { _sfc_main as default }; -//# sourceMappingURL=ServerConfigPanel-BHbwCDu2.js.map +//# sourceMappingURL=ServerConfigPanel-C47nStyv.js.map diff --git a/web/assets/ServerStartView-BA9I3WCH.js b/web/assets/ServerStartView-BA9I3WCH.js deleted file mode 100644 index 927592c1..00000000 --- a/web/assets/ServerStartView-BA9I3WCH.js +++ /dev/null @@ -1,98 +0,0 @@ -var __defProp = Object.defineProperty; -var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); -import { d as defineComponent, a1 as useI18n, ab as ref, b_ as ProgressStatus, m as onMounted, o as openBlock, k as createBlock, M as withCtx, H as createBaseVNode, aE as createTextVNode, X as toDisplayString, j as unref, f as createElementBlock, I as createCommentVNode, N as createVNode, l as script, i as withDirectives, v as vShow, b$ as BaseTerminal, aL as pushScopeId, aM as popScopeId, c0 as electronAPI, _ as _export_sfc } from "./index-BbhVsmQe.js"; -import { _ as _sfc_main$1 } from "./BaseViewTemplate-qOhVwbhN.js"; -const _withScopeId = /* @__PURE__ */ __name((n) => (pushScopeId("data-v-42c1131d"), n = n(), popScopeId(), n), "_withScopeId"); -const _hoisted_1 = { class: "text-2xl font-bold" }; -const _hoisted_2 = { key: 0 }; -const _hoisted_3 = { - key: 0, - class: "flex flex-col items-center gap-4" -}; -const _hoisted_4 = { class: "flex items-center my-4 gap-2" }; -const _sfc_main = /* @__PURE__ */ defineComponent({ - __name: "ServerStartView", - setup(__props) { - const electron = electronAPI(); - const { t } = useI18n(); - const status = ref(ProgressStatus.INITIAL_STATE); - const electronVersion = ref(""); - let xterm; - const terminalVisible = ref(true); - const updateProgress = /* @__PURE__ */ __name(({ status: newStatus }) => { - status.value = newStatus; - if (newStatus === ProgressStatus.ERROR) terminalVisible.value = false; - else xterm?.clear(); - }, "updateProgress"); - const terminalCreated = /* @__PURE__ */ __name(({ terminal, useAutoSize }, root) => { - xterm = terminal; - useAutoSize(root, true, true); - electron.onLogMessage((message) => { - terminal.write(message); - }); - terminal.options.cursorBlink = false; - terminal.options.disableStdin = true; - terminal.options.cursorInactiveStyle = "block"; - }, "terminalCreated"); - const reinstall = /* @__PURE__ */ __name(() => electron.reinstall(), "reinstall"); - const reportIssue = /* @__PURE__ */ __name(() => { - window.open("https://forum.comfy.org/c/v1-feedback/", "_blank"); - }, "reportIssue"); - const openLogs = /* @__PURE__ */ __name(() => electron.openLogsFolder(), "openLogs"); - onMounted(async () => { - electron.sendReady(); - electron.onProgressUpdate(updateProgress); - electronVersion.value = await electron.getElectronVersion(); - }); - return (_ctx, _cache) => { - return openBlock(), createBlock(_sfc_main$1, { - dark: "", - class: "flex-col" - }, { - default: withCtx(() => [ - createBaseVNode("h2", _hoisted_1, [ - createTextVNode(toDisplayString(unref(t)(`serverStart.process.${status.value}`)) + " ", 1), - status.value === unref(ProgressStatus).ERROR ? (openBlock(), createElementBlock("span", _hoisted_2, " v" + toDisplayString(electronVersion.value), 1)) : createCommentVNode("", true) - ]), - status.value === unref(ProgressStatus).ERROR ? (openBlock(), createElementBlock("div", _hoisted_3, [ - createBaseVNode("div", _hoisted_4, [ - createVNode(unref(script), { - icon: "pi pi-flag", - severity: "secondary", - label: unref(t)("serverStart.reportIssue"), - onClick: reportIssue - }, null, 8, ["label"]), - createVNode(unref(script), { - icon: "pi pi-file", - severity: "secondary", - label: unref(t)("serverStart.openLogs"), - onClick: openLogs - }, null, 8, ["label"]), - createVNode(unref(script), { - icon: "pi pi-refresh", - label: unref(t)("serverStart.reinstall"), - onClick: reinstall - }, null, 8, ["label"]) - ]), - !terminalVisible.value ? (openBlock(), createBlock(unref(script), { - key: 0, - icon: "pi pi-search", - severity: "secondary", - label: unref(t)("serverStart.showTerminal"), - onClick: _cache[0] || (_cache[0] = ($event) => terminalVisible.value = true) - }, null, 8, ["label"])) : createCommentVNode("", true) - ])) : createCommentVNode("", true), - withDirectives(createVNode(BaseTerminal, { onCreated: terminalCreated }, null, 512), [ - [vShow, terminalVisible.value] - ]) - ]), - _: 1 - }); - }; - } -}); -const ServerStartView = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-42c1131d"]]); -export { - ServerStartView as default -}; -//# sourceMappingURL=ServerStartView-BA9I3WCH.js.map diff --git a/web/assets/ServerStartView-CnyN4Ib6.css b/web/assets/ServerStartView-BHqjjHcl.css similarity index 64% rename from web/assets/ServerStartView-CnyN4Ib6.css rename to web/assets/ServerStartView-BHqjjHcl.css index 60a63414..50d444d7 100644 --- a/web/assets/ServerStartView-CnyN4Ib6.css +++ b/web/assets/ServerStartView-BHqjjHcl.css @@ -1,5 +1,5 @@ -[data-v-42c1131d] .xterm-helper-textarea { +[data-v-c0d3157e] .xterm-helper-textarea { /* Hide this as it moves all over when uv is running */ display: none; } diff --git a/web/assets/ServerStartView-C3YAc4Lp.js b/web/assets/ServerStartView-C3YAc4Lp.js new file mode 100644 index 00000000..a7d02d0c --- /dev/null +++ b/web/assets/ServerStartView-C3YAc4Lp.js @@ -0,0 +1,92 @@ +var __defProp = Object.defineProperty; +var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); +import { a as defineComponent, H as useI18n, r as ref, b$ as ProgressStatus, aF as onMounted, o as openBlock, f as createElementBlock, z as createBaseVNode, ax as createTextVNode, a7 as toDisplayString, y as unref, h as createCommentVNode, g as createVNode, C as script, v as createBlock, t as withDirectives, ac as vShow, c0 as BaseTerminal, Q as pushScopeId, R as popScopeId, c1 as electronAPI, _ as _export_sfc } from "./index-DAOHvvrm.js"; +const _withScopeId = /* @__PURE__ */ __name((n) => (pushScopeId("data-v-c0d3157e"), n = n(), popScopeId(), n), "_withScopeId"); +const _hoisted_1 = { class: "font-sans flex flex-col justify-center items-center h-screen m-0 text-neutral-300 bg-neutral-900 dark-theme pointer-events-auto" }; +const _hoisted_2 = { class: "text-2xl font-bold" }; +const _hoisted_3 = { key: 0 }; +const _hoisted_4 = { + key: 0, + class: "flex flex-col items-center gap-4" +}; +const _hoisted_5 = { class: "flex items-center my-4 gap-2" }; +const _sfc_main = /* @__PURE__ */ defineComponent({ + __name: "ServerStartView", + setup(__props) { + const electron = electronAPI(); + const { t } = useI18n(); + const status = ref(ProgressStatus.INITIAL_STATE); + const electronVersion = ref(""); + let xterm; + const terminalVisible = ref(true); + const updateProgress = /* @__PURE__ */ __name(({ status: newStatus }) => { + status.value = newStatus; + if (newStatus === ProgressStatus.ERROR) terminalVisible.value = false; + else xterm?.clear(); + }, "updateProgress"); + const terminalCreated = /* @__PURE__ */ __name(({ terminal, useAutoSize }, root) => { + xterm = terminal; + useAutoSize(root, true, true); + electron.onLogMessage((message) => { + terminal.write(message); + }); + terminal.options.cursorBlink = false; + terminal.options.disableStdin = true; + terminal.options.cursorInactiveStyle = "block"; + }, "terminalCreated"); + const reinstall = /* @__PURE__ */ __name(() => electron.reinstall(), "reinstall"); + const reportIssue = /* @__PURE__ */ __name(() => { + window.open("https://forum.comfy.org/c/v1-feedback/", "_blank"); + }, "reportIssue"); + const openLogs = /* @__PURE__ */ __name(() => electron.openLogsFolder(), "openLogs"); + onMounted(async () => { + electron.sendReady(); + electron.onProgressUpdate(updateProgress); + electronVersion.value = await electron.getElectronVersion(); + }); + return (_ctx, _cache) => { + return openBlock(), createElementBlock("div", _hoisted_1, [ + createBaseVNode("h2", _hoisted_2, [ + createTextVNode(toDisplayString(unref(t)(`serverStart.process.${status.value}`)) + " ", 1), + status.value === unref(ProgressStatus).ERROR ? (openBlock(), createElementBlock("span", _hoisted_3, " v" + toDisplayString(electronVersion.value), 1)) : createCommentVNode("", true) + ]), + status.value === unref(ProgressStatus).ERROR ? (openBlock(), createElementBlock("div", _hoisted_4, [ + createBaseVNode("div", _hoisted_5, [ + createVNode(unref(script), { + icon: "pi pi-flag", + severity: "secondary", + label: unref(t)("serverStart.reportIssue"), + onClick: reportIssue + }, null, 8, ["label"]), + createVNode(unref(script), { + icon: "pi pi-file", + severity: "secondary", + label: unref(t)("serverStart.openLogs"), + onClick: openLogs + }, null, 8, ["label"]), + createVNode(unref(script), { + icon: "pi pi-refresh", + label: unref(t)("serverStart.reinstall"), + onClick: reinstall + }, null, 8, ["label"]) + ]), + !terminalVisible.value ? (openBlock(), createBlock(unref(script), { + key: 0, + icon: "pi pi-search", + severity: "secondary", + label: unref(t)("serverStart.showTerminal"), + onClick: _cache[0] || (_cache[0] = ($event) => terminalVisible.value = true) + }, null, 8, ["label"])) : createCommentVNode("", true) + ])) : createCommentVNode("", true), + withDirectives(createVNode(BaseTerminal, { onCreated: terminalCreated }, null, 512), [ + [vShow, terminalVisible.value] + ]) + ]); + }; + } +}); +const ServerStartView = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-c0d3157e"]]); +export { + ServerStartView as default +}; +//# sourceMappingURL=ServerStartView-C3YAc4Lp.js.map diff --git a/web/assets/UserSelectView-Bpmnopou.js b/web/assets/UserSelectView-Bpmnopou.js deleted file mode 100644 index fc3ecc17..00000000 --- a/web/assets/UserSelectView-Bpmnopou.js +++ /dev/null @@ -1,102 +0,0 @@ -var __defProp = Object.defineProperty; -var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); -import { d as defineComponent, aX as useUserStore, bW as useRouter, ab as ref, c as computed, m as onMounted, o as openBlock, k as createBlock, M as withCtx, H as createBaseVNode, X as toDisplayString, N as createVNode, bX as withKeys, j as unref, av as script, bQ as script$1, bY as script$2, bZ as script$3, aE as createTextVNode, I as createCommentVNode, l as script$4 } from "./index-BbhVsmQe.js"; -import { _ as _sfc_main$1 } from "./BaseViewTemplate-qOhVwbhN.js"; -const _hoisted_1 = { - id: "comfy-user-selection", - class: "min-w-84 relative rounded-lg bg-[var(--comfy-menu-bg)] p-5 px-10 shadow-lg" -}; -const _hoisted_2 = /* @__PURE__ */ createBaseVNode("h1", { class: "my-2.5 mb-7 font-normal" }, "ComfyUI", -1); -const _hoisted_3 = { class: "flex w-full flex-col items-center" }; -const _hoisted_4 = { class: "flex w-full flex-col gap-2" }; -const _hoisted_5 = { for: "new-user-input" }; -const _hoisted_6 = { class: "flex w-full flex-col gap-2" }; -const _hoisted_7 = { for: "existing-user-select" }; -const _hoisted_8 = { class: "mt-5" }; -const _sfc_main = /* @__PURE__ */ defineComponent({ - __name: "UserSelectView", - setup(__props) { - const userStore = useUserStore(); - const router = useRouter(); - const selectedUser = ref(null); - const newUsername = ref(""); - const loginError = ref(""); - const createNewUser = computed(() => newUsername.value.trim() !== ""); - const newUserExistsError = computed(() => { - return userStore.users.find((user) => user.username === newUsername.value) ? `User "${newUsername.value}" already exists` : ""; - }); - const error = computed(() => newUserExistsError.value || loginError.value); - const login = /* @__PURE__ */ __name(async () => { - try { - const user = createNewUser.value ? await userStore.createUser(newUsername.value) : selectedUser.value; - if (!user) { - throw new Error("No user selected"); - } - userStore.login(user); - router.push("/"); - } catch (err) { - loginError.value = err.message ?? JSON.stringify(err); - } - }, "login"); - onMounted(async () => { - if (!userStore.initialized) { - await userStore.initialize(); - } - }); - return (_ctx, _cache) => { - return openBlock(), createBlock(_sfc_main$1, { dark: "" }, { - default: withCtx(() => [ - createBaseVNode("main", _hoisted_1, [ - _hoisted_2, - createBaseVNode("div", _hoisted_3, [ - createBaseVNode("div", _hoisted_4, [ - createBaseVNode("label", _hoisted_5, toDisplayString(_ctx.$t("userSelect.newUser")) + ":", 1), - createVNode(unref(script), { - id: "new-user-input", - modelValue: newUsername.value, - "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => newUsername.value = $event), - placeholder: _ctx.$t("userSelect.enterUsername"), - onKeyup: withKeys(login, ["enter"]) - }, null, 8, ["modelValue", "placeholder"]) - ]), - createVNode(unref(script$1)), - createBaseVNode("div", _hoisted_6, [ - createBaseVNode("label", _hoisted_7, toDisplayString(_ctx.$t("userSelect.existingUser")) + ":", 1), - createVNode(unref(script$2), { - modelValue: selectedUser.value, - "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => selectedUser.value = $event), - class: "w-full", - inputId: "existing-user-select", - options: unref(userStore).users, - "option-label": "username", - placeholder: _ctx.$t("userSelect.selectUser"), - disabled: createNewUser.value - }, null, 8, ["modelValue", "options", "placeholder", "disabled"]), - error.value ? (openBlock(), createBlock(unref(script$3), { - key: 0, - severity: "error" - }, { - default: withCtx(() => [ - createTextVNode(toDisplayString(error.value), 1) - ]), - _: 1 - })) : createCommentVNode("", true) - ]), - createBaseVNode("footer", _hoisted_8, [ - createVNode(unref(script$4), { - label: _ctx.$t("userSelect.next"), - onClick: login - }, null, 8, ["label"]) - ]) - ]) - ]) - ]), - _: 1 - }); - }; - } -}); -export { - _sfc_main as default -}; -//# sourceMappingURL=UserSelectView-Bpmnopou.js.map diff --git a/web/assets/UserSelectView-CWbNeIJX.js b/web/assets/UserSelectView-CWbNeIJX.js new file mode 100644 index 00000000..444f5f3e --- /dev/null +++ b/web/assets/UserSelectView-CWbNeIJX.js @@ -0,0 +1,99 @@ +var __defProp = Object.defineProperty; +var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); +import { a as defineComponent, I as useUserStore, bX as useRouter, r as ref, p as computed, aF as onMounted, o as openBlock, f as createElementBlock, z as createBaseVNode, a7 as toDisplayString, g as createVNode, bY as withKeys, y as unref, ap as script, bQ as script$1, bZ as script$2, v as createBlock, x as withCtx, ax as createTextVNode, b_ as script$3, h as createCommentVNode, C as script$4 } from "./index-DAOHvvrm.js"; +const _hoisted_1 = { + id: "comfy-user-selection", + class: "font-sans flex flex-col items-center h-screen m-0 text-neutral-300 bg-neutral-900 dark-theme pointer-events-auto" +}; +const _hoisted_2 = { class: "mt-[5vh] 2xl:mt-[20vh] min-w-84 relative rounded-lg bg-[var(--comfy-menu-bg)] p-5 px-10 shadow-lg" }; +const _hoisted_3 = /* @__PURE__ */ createBaseVNode("h1", { class: "my-2.5 mb-7 font-normal" }, "ComfyUI", -1); +const _hoisted_4 = { class: "flex w-full flex-col items-center" }; +const _hoisted_5 = { class: "flex w-full flex-col gap-2" }; +const _hoisted_6 = { for: "new-user-input" }; +const _hoisted_7 = { class: "flex w-full flex-col gap-2" }; +const _hoisted_8 = { for: "existing-user-select" }; +const _hoisted_9 = { class: "mt-5" }; +const _sfc_main = /* @__PURE__ */ defineComponent({ + __name: "UserSelectView", + setup(__props) { + const userStore = useUserStore(); + const router = useRouter(); + const selectedUser = ref(null); + const newUsername = ref(""); + const loginError = ref(""); + const createNewUser = computed(() => newUsername.value.trim() !== ""); + const newUserExistsError = computed(() => { + return userStore.users.find((user) => user.username === newUsername.value) ? `User "${newUsername.value}" already exists` : ""; + }); + const error = computed(() => newUserExistsError.value || loginError.value); + const login = /* @__PURE__ */ __name(async () => { + try { + const user = createNewUser.value ? await userStore.createUser(newUsername.value) : selectedUser.value; + if (!user) { + throw new Error("No user selected"); + } + userStore.login(user); + router.push("/"); + } catch (err) { + loginError.value = err.message ?? JSON.stringify(err); + } + }, "login"); + onMounted(async () => { + if (!userStore.initialized) { + await userStore.initialize(); + } + }); + return (_ctx, _cache) => { + return openBlock(), createElementBlock("div", _hoisted_1, [ + createBaseVNode("main", _hoisted_2, [ + _hoisted_3, + createBaseVNode("div", _hoisted_4, [ + createBaseVNode("div", _hoisted_5, [ + createBaseVNode("label", _hoisted_6, toDisplayString(_ctx.$t("userSelect.newUser")) + ":", 1), + createVNode(unref(script), { + id: "new-user-input", + modelValue: newUsername.value, + "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => newUsername.value = $event), + placeholder: _ctx.$t("userSelect.enterUsername"), + onKeyup: withKeys(login, ["enter"]) + }, null, 8, ["modelValue", "placeholder"]) + ]), + createVNode(unref(script$1)), + createBaseVNode("div", _hoisted_7, [ + createBaseVNode("label", _hoisted_8, toDisplayString(_ctx.$t("userSelect.existingUser")) + ":", 1), + createVNode(unref(script$2), { + modelValue: selectedUser.value, + "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => selectedUser.value = $event), + class: "w-full", + inputId: "existing-user-select", + options: unref(userStore).users, + "option-label": "username", + placeholder: _ctx.$t("userSelect.selectUser"), + disabled: createNewUser.value + }, null, 8, ["modelValue", "options", "placeholder", "disabled"]), + error.value ? (openBlock(), createBlock(unref(script$3), { + key: 0, + severity: "error" + }, { + default: withCtx(() => [ + createTextVNode(toDisplayString(error.value), 1) + ]), + _: 1 + })) : createCommentVNode("", true) + ]), + createBaseVNode("footer", _hoisted_9, [ + createVNode(unref(script$4), { + label: _ctx.$t("userSelect.next"), + onClick: login + }, null, 8, ["label"]) + ]) + ]) + ]) + ]); + }; + } +}); +export { + _sfc_main as default +}; +//# sourceMappingURL=UserSelectView-CWbNeIJX.js.map diff --git a/web/assets/WelcomeView-BC1IzhL3.js b/web/assets/WelcomeView-BC1IzhL3.js new file mode 100644 index 00000000..ce1994ba --- /dev/null +++ b/web/assets/WelcomeView-BC1IzhL3.js @@ -0,0 +1,37 @@ +var __defProp = Object.defineProperty; +var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); +import { a as defineComponent, bX as useRouter, o as openBlock, f as createElementBlock, z as createBaseVNode, a7 as toDisplayString, g as createVNode, y as unref, C as script, Q as pushScopeId, R as popScopeId, _ as _export_sfc } from "./index-DAOHvvrm.js"; +const _withScopeId = /* @__PURE__ */ __name((n) => (pushScopeId("data-v-c4d014c5"), n = n(), popScopeId(), n), "_withScopeId"); +const _hoisted_1 = { class: "font-sans flex flex-col justify-center items-center h-screen m-0 text-neutral-300 bg-neutral-900 dark-theme pointer-events-auto" }; +const _hoisted_2 = { class: "flex flex-col items-center justify-center gap-8 p-8" }; +const _hoisted_3 = { class: "animated-gradient-text text-glow select-none" }; +const _sfc_main = /* @__PURE__ */ defineComponent({ + __name: "WelcomeView", + setup(__props) { + const router = useRouter(); + const navigateTo = /* @__PURE__ */ __name((path) => { + router.push(path); + }, "navigateTo"); + return (_ctx, _cache) => { + return openBlock(), createElementBlock("div", _hoisted_1, [ + createBaseVNode("div", _hoisted_2, [ + createBaseVNode("h1", _hoisted_3, toDisplayString(_ctx.$t("welcome.title")), 1), + createVNode(unref(script), { + label: _ctx.$t("welcome.getStarted"), + icon: "pi pi-arrow-right", + iconPos: "right", + size: "large", + rounded: "", + onClick: _cache[0] || (_cache[0] = ($event) => navigateTo("/install")), + class: "p-4 text-lg fade-in-up" + }, null, 8, ["label"]) + ]) + ]); + }; + } +}); +const WelcomeView = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-c4d014c5"]]); +export { + WelcomeView as default +}; +//# sourceMappingURL=WelcomeView-BC1IzhL3.js.map diff --git a/web/assets/WelcomeView-Brz3-luE.css b/web/assets/WelcomeView-BD34JMsC.css similarity index 68% rename from web/assets/WelcomeView-Brz3-luE.css rename to web/assets/WelcomeView-BD34JMsC.css index 522f3438..43c9f933 100644 --- a/web/assets/WelcomeView-Brz3-luE.css +++ b/web/assets/WelcomeView-BD34JMsC.css @@ -1,5 +1,5 @@ -.animated-gradient-text[data-v-7dfaf74c] { +.animated-gradient-text[data-v-c4d014c5] { font-weight: 700; font-size: clamp(2rem, 8vw, 4rem); background: linear-gradient(to right, #12c2e9, #c471ed, #f64f59, #12c2e9); @@ -7,12 +7,12 @@ background-clip: text; -webkit-background-clip: text; -webkit-text-fill-color: transparent; - animation: gradient-7dfaf74c 8s linear infinite; + animation: gradient-c4d014c5 8s linear infinite; } -.text-glow[data-v-7dfaf74c] { +.text-glow[data-v-c4d014c5] { filter: drop-shadow(0 0 8px rgba(255, 255, 255, 0.3)); } -@keyframes gradient-7dfaf74c { +@keyframes gradient-c4d014c5 { 0% { background-position: 0% center; } @@ -20,11 +20,11 @@ background-position: 300% center; } } -.fade-in-up[data-v-7dfaf74c] { - animation: fadeInUp-7dfaf74c 1.5s ease-out; +.fade-in-up[data-v-c4d014c5] { + animation: fadeInUp-c4d014c5 1.5s ease-out; animation-fill-mode: both; } -@keyframes fadeInUp-7dfaf74c { +@keyframes fadeInUp-c4d014c5 { 0% { opacity: 0; transform: translateY(20px); diff --git a/web/assets/WelcomeView-Cg-dprpV.js b/web/assets/WelcomeView-Cg-dprpV.js deleted file mode 100644 index 5fc71b0a..00000000 --- a/web/assets/WelcomeView-Cg-dprpV.js +++ /dev/null @@ -1,40 +0,0 @@ -var __defProp = Object.defineProperty; -var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); -import { d as defineComponent, bW as useRouter, o as openBlock, k as createBlock, M as withCtx, H as createBaseVNode, X as toDisplayString, N as createVNode, j as unref, l as script, aL as pushScopeId, aM as popScopeId, _ as _export_sfc } from "./index-BbhVsmQe.js"; -import { _ as _sfc_main$1 } from "./BaseViewTemplate-qOhVwbhN.js"; -const _withScopeId = /* @__PURE__ */ __name((n) => (pushScopeId("data-v-7dfaf74c"), n = n(), popScopeId(), n), "_withScopeId"); -const _hoisted_1 = { class: "flex flex-col items-center justify-center gap-8 p-8" }; -const _hoisted_2 = { class: "animated-gradient-text text-glow select-none" }; -const _sfc_main = /* @__PURE__ */ defineComponent({ - __name: "WelcomeView", - setup(__props) { - const router = useRouter(); - const navigateTo = /* @__PURE__ */ __name((path) => { - router.push(path); - }, "navigateTo"); - return (_ctx, _cache) => { - return openBlock(), createBlock(_sfc_main$1, { dark: "" }, { - default: withCtx(() => [ - createBaseVNode("div", _hoisted_1, [ - createBaseVNode("h1", _hoisted_2, toDisplayString(_ctx.$t("welcome.title")), 1), - createVNode(unref(script), { - label: _ctx.$t("welcome.getStarted"), - icon: "pi pi-arrow-right", - iconPos: "right", - size: "large", - rounded: "", - onClick: _cache[0] || (_cache[0] = ($event) => navigateTo("/install")), - class: "p-4 text-lg fade-in-up" - }, null, 8, ["label"]) - ]) - ]), - _: 1 - }); - }; - } -}); -const WelcomeView = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-7dfaf74c"]]); -export { - WelcomeView as default -}; -//# sourceMappingURL=WelcomeView-Cg-dprpV.js.map diff --git a/web/assets/index-BuE2B-Gw.js b/web/assets/index-BuE2B-Gw.js deleted file mode 100644 index 5e0eb48d..00000000 --- a/web/assets/index-BuE2B-Gw.js +++ /dev/null @@ -1,173 +0,0 @@ -var __defProp = Object.defineProperty; -var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); -import { B as BaseStyle, q as script$2, ak as UniqueComponentId, c9 as script$4, l as script$5, S as Ripple, aB as resolveComponent, o as openBlock, f as createElementBlock, D as mergeProps, H as createBaseVNode, J as renderSlot, T as normalizeClass, X as toDisplayString, I as createCommentVNode, k as createBlock, M as withCtx, G as resolveDynamicComponent, N as createVNode, aC as Transition, i as withDirectives, v as vShow } from "./index-BbhVsmQe.js"; -import { s as script$3 } from "./index-VIBj2YvH.js"; -var theme = /* @__PURE__ */ __name(function theme2(_ref) { - var dt = _ref.dt; - return "\n.p-panel {\n border: 1px solid ".concat(dt("panel.border.color"), ";\n border-radius: ").concat(dt("panel.border.radius"), ";\n background: ").concat(dt("panel.background"), ";\n color: ").concat(dt("panel.color"), ";\n}\n\n.p-panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: ").concat(dt("panel.header.padding"), ";\n background: ").concat(dt("panel.header.background"), ";\n color: ").concat(dt("panel.header.color"), ";\n border-style: solid;\n border-width: ").concat(dt("panel.header.border.width"), ";\n border-color: ").concat(dt("panel.header.border.color"), ";\n border-radius: ").concat(dt("panel.header.border.radius"), ";\n}\n\n.p-panel-toggleable .p-panel-header {\n padding: ").concat(dt("panel.toggleable.header.padding"), ";\n}\n\n.p-panel-title {\n line-height: 1;\n font-weight: ").concat(dt("panel.title.font.weight"), ";\n}\n\n.p-panel-content {\n padding: ").concat(dt("panel.content.padding"), ";\n}\n\n.p-panel-footer {\n padding: ").concat(dt("panel.footer.padding"), ";\n}\n"); -}, "theme"); -var classes = { - root: /* @__PURE__ */ __name(function root(_ref2) { - var props = _ref2.props; - return ["p-panel p-component", { - "p-panel-toggleable": props.toggleable - }]; - }, "root"), - header: "p-panel-header", - title: "p-panel-title", - headerActions: "p-panel-header-actions", - pcToggleButton: "p-panel-toggle-button", - contentContainer: "p-panel-content-container", - content: "p-panel-content", - footer: "p-panel-footer" -}; -var PanelStyle = BaseStyle.extend({ - name: "panel", - theme, - classes -}); -var script$1 = { - name: "BasePanel", - "extends": script$2, - props: { - header: String, - toggleable: Boolean, - collapsed: Boolean, - toggleButtonProps: { - type: Object, - "default": /* @__PURE__ */ __name(function _default() { - return { - severity: "secondary", - text: true, - rounded: true - }; - }, "_default") - } - }, - style: PanelStyle, - provide: /* @__PURE__ */ __name(function provide() { - return { - $pcPanel: this, - $parentInstance: this - }; - }, "provide") -}; -var script = { - name: "Panel", - "extends": script$1, - inheritAttrs: false, - emits: ["update:collapsed", "toggle"], - data: /* @__PURE__ */ __name(function data() { - return { - id: this.$attrs.id, - d_collapsed: this.collapsed - }; - }, "data"), - watch: { - "$attrs.id": /* @__PURE__ */ __name(function $attrsId(newValue) { - this.id = newValue || UniqueComponentId(); - }, "$attrsId"), - collapsed: /* @__PURE__ */ __name(function collapsed(newValue) { - this.d_collapsed = newValue; - }, "collapsed") - }, - mounted: /* @__PURE__ */ __name(function mounted() { - this.id = this.id || UniqueComponentId(); - }, "mounted"), - methods: { - toggle: /* @__PURE__ */ __name(function toggle(event) { - this.d_collapsed = !this.d_collapsed; - this.$emit("update:collapsed", this.d_collapsed); - this.$emit("toggle", { - originalEvent: event, - value: this.d_collapsed - }); - }, "toggle"), - onKeyDown: /* @__PURE__ */ __name(function onKeyDown(event) { - if (event.code === "Enter" || event.code === "NumpadEnter" || event.code === "Space") { - this.toggle(event); - event.preventDefault(); - } - }, "onKeyDown") - }, - computed: { - buttonAriaLabel: /* @__PURE__ */ __name(function buttonAriaLabel() { - return this.toggleButtonProps && this.toggleButtonProps.ariaLabel ? this.toggleButtonProps.ariaLabel : this.header; - }, "buttonAriaLabel") - }, - components: { - PlusIcon: script$3, - MinusIcon: script$4, - Button: script$5 - }, - directives: { - ripple: Ripple - } -}; -var _hoisted_1 = ["id"]; -var _hoisted_2 = ["id", "aria-labelledby"]; -function render(_ctx, _cache, $props, $setup, $data, $options) { - var _component_Button = resolveComponent("Button"); - return openBlock(), createElementBlock("div", mergeProps({ - "class": _ctx.cx("root") - }, _ctx.ptmi("root")), [createBaseVNode("div", mergeProps({ - "class": _ctx.cx("header") - }, _ctx.ptm("header")), [renderSlot(_ctx.$slots, "header", { - id: $data.id + "_header", - "class": normalizeClass(_ctx.cx("title")) - }, function() { - return [_ctx.header ? (openBlock(), createElementBlock("span", mergeProps({ - key: 0, - id: $data.id + "_header", - "class": _ctx.cx("title") - }, _ctx.ptm("title")), toDisplayString(_ctx.header), 17, _hoisted_1)) : createCommentVNode("", true)]; - }), createBaseVNode("div", mergeProps({ - "class": _ctx.cx("headerActions") - }, _ctx.ptm("headerActions")), [renderSlot(_ctx.$slots, "icons"), _ctx.toggleable ? (openBlock(), createBlock(_component_Button, mergeProps({ - key: 0, - id: $data.id + "_header", - "class": _ctx.cx("pcToggleButton"), - "aria-label": $options.buttonAriaLabel, - "aria-controls": $data.id + "_content", - "aria-expanded": !$data.d_collapsed, - unstyled: _ctx.unstyled, - onClick: $options.toggle, - onKeydown: $options.onKeyDown - }, _ctx.toggleButtonProps, { - pt: _ctx.ptm("pcToggleButton") - }), { - icon: withCtx(function(slotProps) { - return [renderSlot(_ctx.$slots, _ctx.$slots.toggleicon ? "toggleicon" : "togglericon", { - collapsed: $data.d_collapsed - }, function() { - return [(openBlock(), createBlock(resolveDynamicComponent($data.d_collapsed ? "PlusIcon" : "MinusIcon"), mergeProps({ - "class": slotProps["class"] - }, _ctx.ptm("pcToggleButton")["icon"]), null, 16, ["class"]))]; - })]; - }), - _: 3 - }, 16, ["id", "class", "aria-label", "aria-controls", "aria-expanded", "unstyled", "onClick", "onKeydown", "pt"])) : createCommentVNode("", true)], 16)], 16), createVNode(Transition, mergeProps({ - name: "p-toggleable-content" - }, _ctx.ptm("transition")), { - "default": withCtx(function() { - return [withDirectives(createBaseVNode("div", mergeProps({ - id: $data.id + "_content", - "class": _ctx.cx("contentContainer"), - role: "region", - "aria-labelledby": $data.id + "_header" - }, _ctx.ptm("contentContainer")), [createBaseVNode("div", mergeProps({ - "class": _ctx.cx("content") - }, _ctx.ptm("content")), [renderSlot(_ctx.$slots, "default")], 16), _ctx.$slots.footer ? (openBlock(), createElementBlock("div", mergeProps({ - key: 0, - "class": _ctx.cx("footer") - }, _ctx.ptm("footer")), [renderSlot(_ctx.$slots, "footer")], 16)) : createCommentVNode("", true)], 16, _hoisted_2), [[vShow, !$data.d_collapsed]])]; - }), - _: 3 - }, 16)], 16); -} -__name(render, "render"); -script.render = render; -export { - script as s -}; -//# sourceMappingURL=index-BuE2B-Gw.js.map diff --git a/web/assets/index-DmMtlpqz.css b/web/assets/index-BvKz5b2m.css similarity index 95% rename from web/assets/index-DmMtlpqz.css rename to web/assets/index-BvKz5b2m.css index dbcdad37..b384d51a 100644 --- a/web/assets/index-DmMtlpqz.css +++ b/web/assets/index-BvKz5b2m.css @@ -1,2068 +1,1957 @@ -/* this CSS contains only the basic CSS needed to run the app and use it */ -.lgraphcanvas { - /*cursor: crosshair;*/ - user-select: none; - -moz-user-select: none; - -webkit-user-select: none; - outline: none; - font-family: Tahoma, sans-serif; +.no-results-placeholder[data-v-a1e982e0] .p-card { + background-color: var(--surface-ground); + text-align: center; + box-shadow: unset; +} +.no-results-placeholder h3[data-v-a1e982e0] { + color: var(--text-color); + margin-bottom: 0.5rem; +} +.no-results-placeholder p[data-v-a1e982e0] { + color: var(--text-color-secondary); + margin-bottom: 1rem; } -.lgraphcanvas * { - box-sizing: border-box; +.comfy-missing-nodes[data-v-05a7c5eb] { + max-height: 300px; + overflow-y: auto; +} +.node-hint[data-v-05a7c5eb] { + margin-left: 0.5rem; + font-style: italic; + color: var(--text-color-secondary); +} +[data-v-05a7c5eb] .p-button { + margin-left: auto; } -.litegraph.litecontextmenu { - font-family: Tahoma, sans-serif; - position: fixed; - top: 100px; - left: 100px; - min-width: 100px; - color: #aaf; - padding: 0; - box-shadow: 0 0 10px black !important; - background-color: #2e2e2e !important; - z-index: 10; - max-height: -webkit-fill-available; +.comfy-missing-models[data-v-8528eb79] { + max-height: 300px; overflow-y: auto; } -/* Enable scrolling overflow in Firefox */ -@supports not (max-height: -webkit-fill-available) { - .litegraph.litecontextmenu { - max-height: 80vh; - overflow-y: scroll; - } +[data-v-a4c03005] .i-badge { + + --tw-bg-opacity: 1; + + background-color: rgb(150 206 76 / var(--tw-bg-opacity)); + + --tw-text-opacity: 1; + + color: rgb(255 255 255 / var(--tw-text-opacity)) } +[data-v-a4c03005] .o-badge { -.litegraph.litecontextmenu.dark { - background-color: #000 !important; + --tw-bg-opacity: 1; + + background-color: rgb(239 68 68 / var(--tw-bg-opacity)); + + --tw-text-opacity: 1; + + color: rgb(255 255 255 / var(--tw-text-opacity)) } +[data-v-a4c03005] .c-badge { -.litegraph.litecontextmenu .litemenu-title img { - margin-top: 2px; - margin-left: 2px; - margin-right: 4px; + --tw-bg-opacity: 1; + + background-color: rgb(66 153 225 / var(--tw-bg-opacity)); + + --tw-text-opacity: 1; + + color: rgb(255 255 255 / var(--tw-text-opacity)) } +[data-v-a4c03005] .s-badge { -.litegraph.litecontextmenu .litemenu-entry { - margin: 2px; - padding: 2px; + --tw-bg-opacity: 1; + + background-color: rgb(234 179 8 / var(--tw-bg-opacity)) } -.litegraph.litecontextmenu .litemenu-entry.submenu { - background-color: #2e2e2e !important; +[data-v-f6f8d5f4] .p-inputtext { + --p-form-field-padding-x: 0.625rem; +} +.p-button.p-inputicon[data-v-f6f8d5f4] { + width: auto; + border-style: none; + padding: 0px; } -.litegraph.litecontextmenu.dark .litemenu-entry.submenu { - background-color: #000 !important; +.form-input[data-v-483361ac] .input-slider .p-inputnumber input, +.form-input[data-v-483361ac] .input-slider .slider-part { + + width: 5rem } +.form-input[data-v-483361ac] .p-inputtext, +.form-input[data-v-483361ac] .p-select { -.litegraph .litemenubar ul { - font-family: Tahoma, sans-serif; - margin: 0; - padding: 0; + width: 11rem } -.litegraph .litemenubar li { - font-size: 14px; - color: #999; - display: inline-block; - min-width: 50px; - padding-left: 10px; - padding-right: 10px; - user-select: none; - -moz-user-select: none; - -webkit-user-select: none; - cursor: pointer; +.settings-tab-panels { + padding-top: 0px !important; } -.litegraph .litemenubar li:hover { - background-color: #777; - color: #eee; +.settings-container[data-v-ff1d3379] { + display: flex; + height: 70vh; + width: 60vw; + max-width: 1024px; + overflow: hidden; +} +@media (max-width: 768px) { +.settings-container[data-v-ff1d3379] { + flex-direction: column; + height: auto; +} +.settings-sidebar[data-v-ff1d3379] { + width: 100%; +} +.settings-content[data-v-ff1d3379] { + height: 350px; +} } -.litegraph .litegraph .litemenubar-panel { +/* Show a separator line above the Keybinding tab */ +/* This indicates the start of custom setting panels */ +.settings-sidebar[data-v-ff1d3379] .p-listbox-option[aria-label='Keybinding'] { + position: relative; +} +.settings-sidebar[data-v-ff1d3379] .p-listbox-option[aria-label='Keybinding']::before { position: absolute; - top: 5px; - left: 5px; - min-width: 100px; - background-color: #444; - box-shadow: 0 0 3px black; - padding: 4px; - border-bottom: 2px solid #aaf; - z-index: 10; + top: 0px; + left: 0px; + width: 100%; + --tw-content: ''; + content: var(--tw-content); + border-top: 1px solid var(--p-divider-border-color); } -.litegraph .litemenu-entry, -.litemenu-title { - font-size: 12px; - color: #aaa; - padding: 0 0 0 4px; - margin: 2px; - padding-left: 2px; - -moz-user-select: none; - -webkit-user-select: none; - user-select: none; - cursor: pointer; +.pi-cog[data-v-43089afc] { + font-size: 1.25rem; + margin-right: 0.5rem; } - -.litegraph .litemenu-entry .icon { - display: inline-block; - width: 12px; - height: 12px; - margin: 2px; - vertical-align: top; +.version-tag[data-v-43089afc] { + margin-left: 0.5rem; } -.litegraph .litemenu-entry.checked .icon { - background-color: #aaf; +.comfy-error-report[data-v-5c200f18] { + display: flex; + flex-direction: column; + gap: 1rem; } - -.litegraph .litemenu-entry .more { - float: right; - padding-right: 5px; +.action-container[data-v-5c200f18] { + display: flex; + gap: 1rem; + justify-content: flex-end; } - -.litegraph .litemenu-entry.disabled { - opacity: 0.5; - cursor: default; +.wrapper-pre[data-v-5c200f18] { + white-space: pre-wrap; + word-wrap: break-word; } -.litegraph .litemenu-entry.separator { - display: block; - border-top: 1px solid #333; - border-bottom: 1px solid #666; - width: 100%; - height: 0px; - margin: 3px 0 2px 0; - background-color: transparent; - padding: 0 !important; - cursor: default !important; +.p-card[data-v-ad8e454e] { + --p-card-body-padding: 10px 0 0 0; + overflow: hidden; +} +[data-v-ad8e454e] .p-card-subtitle { + text-align: center; } -.litegraph .litemenu-entry.has_submenu { - border-right: 2px solid cyan; +.prompt-dialog-content[data-v-abaaab2c] { + white-space: pre-wrap; +} +.mdi.rotate270::before { + transform: rotate(270deg); } -.litegraph .litemenu-title { - color: #dde; - background-color: #111; +/* Generic */ +.comfyui-button { + display: flex; + align-items: center; + gap: 0.5em; + cursor: pointer; + border: none; + border-radius: 4px; + padding: 4px 8px; + box-sizing: border-box; margin: 0; - padding: 2px; - cursor: default; + transition: box-shadow 0.1s; } -.litegraph .litemenu-entry:hover:not(.disabled):not(.separator) { - background-color: #444 !important; - color: #eee; - transition: all 0.2s; +.comfyui-button:active { + box-shadow: inset 1px 1px 10px rgba(0, 0, 0, 0.5); } -.litegraph .litemenu-entry .property_name { - display: inline-block; - text-align: left; - min-width: 80px; - min-height: 1.2em; +.comfyui-button:disabled { + opacity: 0.5; + cursor: not-allowed; } - -.litegraph .litemenu-entry .property_value { - display: inline-block; - background-color: rgba(0, 0, 0, 0.5); - text-align: right; - min-width: 80px; - min-height: 1.2em; - vertical-align: middle; - padding-right: 10px; +.primary .comfyui-button, +.primary.comfyui-button { + background-color: var(--primary-bg) !important; + color: var(--primary-fg) !important; } -.litegraph.litesearchbox { - font-family: Tahoma, sans-serif; - position: absolute; - background-color: rgba(0, 0, 0, 0.5); - padding-top: 4px; +.primary .comfyui-button:not(:disabled):hover, +.primary.comfyui-button:not(:disabled):hover { + background-color: var(--primary-hover-bg) !important; + color: var(--primary-hover-fg) !important; } -.litegraph.litesearchbox input, -.litegraph.litesearchbox select { - margin-top: 3px; - min-width: 60px; - min-height: 1.5em; - background-color: black; - border: 0; - color: white; - padding-left: 10px; - margin-right: 5px; - max-width: 300px; +/* Popup */ +.comfyui-popup { + position: absolute; + left: var(--left); + right: var(--right); + top: var(--top); + bottom: var(--bottom); + z-index: 2000; + max-height: calc(100vh - var(--limit) - 10px); + box-shadow: 3px 3px 5px 0px rgba(0, 0, 0, 0.3); } -.litegraph.litesearchbox .name { - display: inline-block; - min-width: 60px; - min-height: 1.5em; - padding-left: 10px; +.comfyui-popup:not(.open) { + display: none; } -.litegraph.litesearchbox .helper { - overflow: auto; - max-height: 200px; - margin-top: 2px; +.comfyui-popup.right.open { + border-top-left-radius: 4px; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; + overflow: hidden; +} +/* Split button */ +.comfyui-split-button { + position: relative; + display: flex; } -.litegraph.lite-search-item { - font-family: Tahoma, sans-serif; - background-color: rgba(0, 0, 0, 0.5); - color: white; - padding-top: 2px; +.comfyui-split-primary { + flex: auto; } -.litegraph.lite-search-item.not_in_filter { - /*background-color: rgba(50, 50, 50, 0.5);*/ - /*color: #999;*/ - color: #b99; - font-style: italic; +.comfyui-split-primary .comfyui-button { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-right: 1px solid var(--comfy-menu-bg); + width: 100%; } -.litegraph.lite-search-item.generic_type { - /*background-color: rgba(50, 50, 50, 0.5);*/ - /*color: #DD9;*/ - color: #999; - font-style: italic; +.comfyui-split-arrow .comfyui-button { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + padding-left: 2px; + padding-right: 2px; } -.litegraph.lite-search-item:hover, -.litegraph.lite-search-item.selected { - cursor: pointer; - background-color: white; - color: black; +.comfyui-split-button-popup { + white-space: nowrap; + background-color: var(--content-bg); + color: var(--content-fg); + display: flex; + flex-direction: column; + overflow: auto; } -.litegraph.lite-search-item-type { - display: inline-block; - background: rgba(0, 0, 0, 0.2); - margin-left: 5px; - font-size: 14px; - padding: 2px 5px; - position: relative; - top: -2px; - opacity: 0.8; - border-radius: 4px; +.comfyui-split-button-popup.hover { + z-index: 2001; +} +.comfyui-split-button-popup > .comfyui-button { + border: none; + background-color: transparent; + color: var(--fg-color); + padding: 8px 12px 8px 8px; } -/* DIALOGs ******/ +.comfyui-split-button-popup > .comfyui-button:not(:disabled):hover { + background-color: var(--comfy-input-bg); +} -.litegraph .dialog { - position: absolute; - top: 50%; - left: 50%; - margin-top: -150px; - margin-left: -200px; +/* Button group */ +.comfyui-button-group { + display: flex; + border-radius: 4px; + overflow: hidden; +} - background-color: #2a2a2a; +.comfyui-button-group:empty { + display: none; +} +.comfyui-button-group > .comfyui-button, +.comfyui-button-group > .comfyui-button-wrapper > .comfyui-button { + padding: 4px 10px; + border-radius: 0; +} - min-width: 400px; - min-height: 200px; - box-shadow: 0 0 4px #111; - border-radius: 6px; +/* Menu */ +.comfyui-menu .mdi::before { + font-size: 18px; } -.litegraph .dialog.settings { - left: 10px; - top: 10px; - height: calc(100% - 20px); - margin: auto; - max-width: 50%; +.comfyui-menu .comfyui-button { + background: var(--comfy-input-bg); + color: var(--fg-color); + white-space: nowrap; } -.litegraph .dialog.centered { - top: 50px; - left: 50%; - position: absolute; - transform: translateX(-50%); - min-width: 600px; - min-height: 300px; - height: calc(100% - 100px); - margin: auto; +.comfyui-menu .comfyui-button:not(:disabled):hover { + background: var(--border-color); + color: var(--content-fg); } -.litegraph .dialog .close { - float: right; - margin: 4px; - margin-right: 10px; - cursor: pointer; - font-size: 1.4em; +.comfyui-menu .comfyui-split-button-popup > .comfyui-button { + border-radius: 0; + background-color: transparent; } -.litegraph .dialog .close:hover { - color: white; +.comfyui-menu .comfyui-split-button-popup > .comfyui-button:not(:disabled):hover { + background-color: var(--comfy-input-bg); } -.litegraph .dialog .dialog-header { - color: #aaa; - border-bottom: 1px solid #161616; - height: 40px; +.comfyui-menu .comfyui-split-button-popup.left { + border-top-right-radius: 4px; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; } -.litegraph .dialog .dialog-footer { - height: 50px; - padding: 10px; - border-top: 1px solid #1a1a1a; + +.comfyui-menu .comfyui-button.popup-open { + background-color: var(--content-bg); + color: var(--content-fg); } -.litegraph .dialog .dialog-header .dialog-title { - font: 20px "Arial"; - margin: 4px; - padding: 4px 10px; - display: inline-block; +.comfyui-menu-push { + margin-left: -0.8em; + flex: auto; } -.litegraph .dialog .dialog-content, -.litegraph .dialog .dialog-alt-content { - height: calc(100% - 90px); - width: 100%; - min-height: 100px; - display: inline-block; - color: #aaa; - /*background-color: black;*/ - overflow: auto; +/** Send to workflow widget selection dialog */ +.comfy-widget-selection-dialog { + border: none; } -.litegraph .dialog .dialog-content h3 { - margin: 10px; +.comfy-widget-selection-dialog div { + color: var(--fg-color); + font-family: Arial, Helvetica, sans-serif; } -.litegraph .dialog .dialog-content .connections { - flex-direction: row; +.comfy-widget-selection-dialog h2 { + margin-top: 0; } -.litegraph .dialog .dialog-content .connections .connections_side { - width: calc(50% - 5px); - min-height: 100px; - background-color: black; +.comfy-widget-selection-dialog section { + width: -moz-fit-content; + width: fit-content; display: flex; + flex-direction: column; } -.litegraph .dialog .node_type { - font-size: 1.2em; - display: block; - margin: 10px; +.comfy-widget-selection-item { + display: flex; + gap: 10px; + align-items: center; } -.litegraph .dialog .node_desc { - opacity: 0.5; - display: block; - margin: 10px; +.comfy-widget-selection-item span { + margin-right: auto; } -.litegraph .dialog .separator { - display: block; - width: calc(100% - 4px); - height: 1px; - border-top: 1px solid #000; - border-bottom: 1px solid #333; - margin: 10px 2px; - padding: 0; +.comfy-widget-selection-item span::before { + content: '#' attr(data-id); + opacity: 0.5; + margin-right: 5px; } -.litegraph .dialog .property { - margin-bottom: 2px; - padding: 4px; +.comfy-modal .comfy-widget-selection-item button { + font-size: 1em; } -.litegraph .dialog .property:hover { - background: #545454; +/***** Responsive *****/ +.lg.comfyui-menu .lt-lg-show { + display: none !important; } - -.litegraph .dialog .property_name { - color: #737373; - display: inline-block; - text-align: left; - vertical-align: top; - width: 160px; - padding-left: 4px; - overflow: hidden; - margin-right: 6px; -} - -.litegraph .dialog .property:hover .property_name { - color: white; +.comfyui-menu:not(.lg) .nlg-hide { + display: none !important; } - -.litegraph .dialog .property_value { - display: inline-block; - text-align: right; - color: #aaa; - background-color: #1a1a1a; - /*width: calc( 100% - 122px );*/ - max-width: calc(100% - 162px); - min-width: 200px; - max-height: 300px; - min-height: 20px; - padding: 4px; - padding-right: 12px; - overflow: hidden; - cursor: pointer; - border-radius: 3px; +/** Large screen */ +.lg.comfyui-menu>.comfyui-menu-mobile-collapse .comfyui-button span, +.lg.comfyui-menu>.comfyui-menu-mobile-collapse.comfyui-button span { + display: none; } - -.litegraph .dialog .property_value:hover { - color: white; +.lg.comfyui-menu>.comfyui-menu-mobile-collapse .comfyui-popup .comfyui-button span { + display: unset; } -.litegraph .dialog .property.boolean .property_value { - padding-right: 30px; - color: #a88; - /*width: auto; - float: right;*/ +/** Non large screen */ +.lt-lg.comfyui-menu { + flex-wrap: wrap; } -.litegraph .dialog .property.boolean.bool-on .property_name { - color: #8a8; -} -.litegraph .dialog .property.boolean.bool-on .property_value { - color: #8a8; +.lt-lg.comfyui-menu > *:not(.comfyui-menu-mobile-collapse) { + order: 1; } -.litegraph .dialog .btn { - border: 0; - border-radius: 4px; - padding: 4px 20px; - margin-left: 0px; - background-color: #060606; - color: #8e8e8e; +.lt-lg.comfyui-menu > .comfyui-menu-mobile-collapse { + order: 9999; + width: 100%; } -.litegraph .dialog .btn:hover { - background-color: #111; - color: #fff; +.comfyui-body-bottom .lt-lg.comfyui-menu > .comfyui-menu-mobile-collapse { + order: -1; } -.litegraph .dialog .btn.delete:hover { - background-color: #f33; - color: black; +.comfyui-body-bottom .lt-lg.comfyui-menu > .comfyui-menu-button { + top: unset; + bottom: 4px; } -.litegraph .subgraph_property { - padding: 4px; +.lt-lg.comfyui-menu > .comfyui-menu-mobile-collapse.comfyui-button-group { + flex-wrap: wrap; } -.litegraph .subgraph_property:hover { - background-color: #333; +.lt-lg.comfyui-menu > .comfyui-menu-mobile-collapse .comfyui-button, +.lt-lg.comfyui-menu > .comfyui-menu-mobile-collapse.comfyui-button { + padding: 10px; } - -.litegraph .subgraph_property.extra { - margin-top: 8px; +.lt-lg.comfyui-menu > .comfyui-menu-mobile-collapse .comfyui-button, +.lt-lg.comfyui-menu > .comfyui-menu-mobile-collapse .comfyui-button-wrapper { + width: 100%; } -.litegraph .subgraph_property span.name { - font-size: 1.3em; - padding-left: 4px; +.lt-lg.comfyui-menu > .comfyui-menu-mobile-collapse .comfyui-popup { + position: static; + background-color: var(--comfy-input-bg); + max-width: unset; + max-height: 50vh; + overflow: auto; } -.litegraph .subgraph_property span.type { - opacity: 0.5; - margin-right: 20px; - padding-left: 4px; +.lt-lg.comfyui-menu:not(.expanded) > .comfyui-menu-mobile-collapse { + display: none; } -.litegraph .subgraph_property span.label { - display: inline-block; - width: 60px; - padding: 0px 10px; +.lt-lg .comfyui-menu-button { + position: absolute; + top: 4px; + right: 8px; } -.litegraph .subgraph_property input { - width: 140px; - color: #999; - background-color: #1a1a1a; - border-radius: 4px; - border: 0; - margin-right: 10px; - padding: 4px; - padding-left: 10px; +.lt-lg.comfyui-menu > .comfyui-menu-mobile-collapse .comfyui-view-list-popup { + border-radius: 0; } -.litegraph .subgraph_property button { - background-color: #1c1c1c; - color: #aaa; - border: 0; - border-radius: 2px; - padding: 4px 10px; - cursor: pointer; +.lt-lg.comfyui-menu .comfyui-workflows-popup { + width: 100vw; } -.litegraph .subgraph_property.extra { - color: #ccc; +/** Small */ +.lt-md .comfyui-workflows-button-inner { + width: unset !important; } - -.litegraph .subgraph_property.extra input { - background-color: #111; +.lt-md .comfyui-workflows-label { + display: none; } -.litegraph .bullet_icon { - margin-left: 10px; - border-radius: 10px; - width: 12px; - height: 12px; - background-color: #666; - display: inline-block; - margin-top: 2px; - margin-right: 4px; - transition: background-color 0.1s ease 0s; - -moz-transition: background-color 0.1s ease 0s; +/** Extra small */ +.lt-sm .comfyui-interrupt-button { + margin-right: 45px; } - -.litegraph .bullet_icon:hover { - background-color: #698; - cursor: pointer; +.comfyui-body-bottom .lt-sm.comfyui-menu > .comfyui-menu-button{ + bottom: 41px; } -/* OLD */ +/** + * Copyright (c) 2014 The xterm.js authors. All rights reserved. + * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License) + * https://github.com/chjj/term.js + * @license MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * Originally forked from (with the author's permission): + * Fabrice Bellard's javascript vt100 for jslinux: + * http://bellard.org/jslinux/ + * Copyright (c) 2011 Fabrice Bellard + * The original design remains. The terminal itself + * has been extended to include xterm CSI codes, among + * other features. + */ -.graphcontextmenu { - padding: 4px; - min-width: 100px; -} +/** + * Default styles for xterm.js + */ -.graphcontextmenu-title { - color: #dde; - background-color: #222; - margin: 0; - padding: 2px; - cursor: default; +.xterm { + cursor: text; + position: relative; + -moz-user-select: none; + user-select: none; + -ms-user-select: none; + -webkit-user-select: none; } -.graphmenu-entry { - box-sizing: border-box; - margin: 2px; - padding-left: 20px; - user-select: none; - -moz-user-select: none; - -webkit-user-select: none; - transition: all linear 0.3s; +.xterm.focus, +.xterm:focus { + outline: none; } -.graphmenu-entry.event, -.litemenu-entry.event { - border-left: 8px solid orange; - padding-left: 12px; +.xterm .xterm-helpers { + position: absolute; + top: 0; + /** + * The z-index of the helpers must be higher than the canvases in order for + * IMEs to appear on top. + */ + z-index: 5; } -.graphmenu-entry.disabled { - opacity: 0.3; +.xterm .xterm-helper-textarea { + padding: 0; + border: 0; + margin: 0; + /* Move textarea out of the screen to the far left, so that the cursor is not visible */ + position: absolute; + opacity: 0; + left: -9999em; + top: 0; + width: 0; + height: 0; + z-index: -5; + /** Prevent wrapping so the IME appears against the textarea at the correct position */ + white-space: nowrap; + overflow: hidden; + resize: none; } -.graphmenu-entry.submenu { - border-right: 2px solid #eee; +.xterm .composition-view { + /* TODO: Composition position got messed up somewhere */ + background: #000; + color: #FFF; + display: none; + position: absolute; + white-space: nowrap; + z-index: 1; } -.graphmenu-entry:hover { - background-color: #555; +.xterm .composition-view.active { + display: block; } -.graphmenu-entry.separator { - background-color: #111; - border-bottom: 1px solid #666; - height: 1px; - width: calc(100% - 20px); - -moz-width: calc(100% - 20px); - -webkit-width: calc(100% - 20px); +.xterm .xterm-viewport { + /* On OS X this is required in order for the scroll bar to appear fully opaque */ + background-color: #000; + overflow-y: scroll; + cursor: default; + position: absolute; + right: 0; + left: 0; + top: 0; + bottom: 0; } -.graphmenu-entry .property_name { - display: inline-block; - text-align: left; - min-width: 80px; - min-height: 1.2em; +.xterm .xterm-screen { + position: relative; } -.graphmenu-entry .property_value, -.litemenu-entry .property_value { - display: inline-block; - background-color: rgba(0, 0, 0, 0.5); - text-align: right; - min-width: 80px; - min-height: 1.2em; - vertical-align: middle; - padding-right: 10px; +.xterm .xterm-screen canvas { + position: absolute; + left: 0; + top: 0; } -.graphdialog { - position: absolute; - top: 10px; - left: 10px; - min-height: 2em; - background-color: #333; - font-size: 1.2em; - box-shadow: 0 0 10px black !important; - z-index: 10; +.xterm .xterm-scroll-area { + visibility: hidden; } -.graphdialog.rounded { - border-radius: 12px; - padding-right: 2px; +.xterm-char-measure-element { + display: inline-block; + visibility: hidden; + position: absolute; + top: 0; + left: -9999em; + line-height: normal; } -.graphdialog .name { - display: inline-block; - min-width: 60px; - min-height: 1.5em; - padding-left: 10px; +.xterm.enable-mouse-events { + /* When mouse events are enabled (eg. tmux), revert to the standard pointer cursor */ + cursor: default; } -.graphdialog input, -.graphdialog textarea, -.graphdialog select { - margin: 3px; - min-width: 60px; - min-height: 1.5em; - background-color: black; - border: 0; - color: white; - padding-left: 10px; - outline: none; +.xterm.xterm-cursor-pointer, +.xterm .xterm-cursor-pointer { + cursor: pointer; } -.graphdialog textarea { - min-height: 150px; +.xterm.column-select.focus { + /* Column selection mode */ + cursor: crosshair; } -.graphdialog button { - margin-top: 3px; - vertical-align: top; - background-color: #999; - border: 0; +.xterm .xterm-accessibility:not(.debug), +.xterm .xterm-message { + position: absolute; + left: 0; + top: 0; + bottom: 0; + right: 0; + z-index: 10; + color: transparent; + pointer-events: none; } -.graphdialog button.rounded, -.graphdialog input.rounded { - border-radius: 0 12px 12px 0; +.xterm .xterm-accessibility-tree:not(.debug) *::-moz-selection { + color: transparent; } -.graphdialog .helper { - overflow: auto; - max-height: 200px; +.xterm .xterm-accessibility-tree:not(.debug) *::selection { + color: transparent; } -.graphdialog .help-item { - padding-left: 10px; +.xterm .xterm-accessibility-tree { + -webkit-user-select: text; + -moz-user-select: text; + user-select: text; + white-space: pre; } -.graphdialog .help-item:hover, -.graphdialog .help-item.selected { - cursor: pointer; - background-color: white; - color: black; +.xterm .live-region { + position: absolute; + left: -9999px; + width: 1px; + height: 1px; + overflow: hidden; } -.litegraph .dialog { - min-height: 0; -} -.litegraph .dialog .dialog-content { - display: block; +.xterm-dim { + /* Dim should not apply to background, so the opacity of the foreground color is applied + * explicitly in the generated class and reset to 1 here */ + opacity: 1 !important; } -.litegraph .dialog .dialog-content .subgraph_property { - padding: 5px; + +.xterm-underline-1 { text-decoration: underline; } +.xterm-underline-2 { -webkit-text-decoration: double underline; text-decoration: double underline; } +.xterm-underline-3 { -webkit-text-decoration: wavy underline; text-decoration: wavy underline; } +.xterm-underline-4 { -webkit-text-decoration: dotted underline; text-decoration: dotted underline; } +.xterm-underline-5 { -webkit-text-decoration: dashed underline; text-decoration: dashed underline; } + +.xterm-overline { + text-decoration: overline; } -.litegraph .dialog .dialog-footer { - margin: 0; + +.xterm-overline.xterm-underline-1 { text-decoration: overline underline; } +.xterm-overline.xterm-underline-2 { -webkit-text-decoration: overline double underline; text-decoration: overline double underline; } +.xterm-overline.xterm-underline-3 { -webkit-text-decoration: overline wavy underline; text-decoration: overline wavy underline; } +.xterm-overline.xterm-underline-4 { -webkit-text-decoration: overline dotted underline; text-decoration: overline dotted underline; } +.xterm-overline.xterm-underline-5 { -webkit-text-decoration: overline dashed underline; text-decoration: overline dashed underline; } + +.xterm-strikethrough { + text-decoration: line-through; } -.litegraph .dialog .dialog-footer .subgraph_property { - margin-top: 0; - display: flex; - align-items: center; - padding: 5px; + +.xterm-screen .xterm-decoration-container .xterm-decoration { + z-index: 6; + position: absolute; } -.litegraph .dialog .dialog-footer .subgraph_property .name { - flex: 1; + +.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer { + z-index: 7; } -.litegraph .graphdialog { - display: flex; - align-items: center; - border-radius: 20px; - padding: 4px 10px; - position: fixed; + +.xterm-decoration-overview-ruler { + z-index: 8; + position: absolute; + top: 0; + right: 0; + pointer-events: none; } -.litegraph .graphdialog .name { - padding: 0; - min-height: 0; - font-size: 16px; - vertical-align: middle; + +.xterm-decoration-top { + z-index: 2; + position: relative; } -.litegraph .graphdialog .value { - font-size: 16px; - min-height: 0; - margin: 0 10px; - padding: 2px 5px; + +[data-v-4f7907e3] .p-terminal .xterm { + overflow-x: auto; } -.litegraph .graphdialog input[type="checkbox"] { - width: 16px; - height: 16px; +[data-v-4f7907e3] .p-terminal .xterm-screen { + background-color: black; + overflow-y: hidden; } -.litegraph .graphdialog button { - padding: 4px 18px; - border-radius: 20px; - cursor: pointer; + +[data-v-b7201572] .p-terminal .xterm { + overflow-x: auto; } -@font-face { - font-family: 'primeicons'; - font-display: block; - src: url('./primeicons-DMOk5skT.eot'); - src: url('./primeicons-DMOk5skT.eot?#iefix') format('embedded-opentype'), url('./primeicons-C6QP2o4f.woff2') format('woff2'), url('./primeicons-WjwUDZjB.woff') format('woff'), url('./primeicons-MpK4pl85.ttf') format('truetype'), url('./primeicons-Dr5RGzOO.svg?#primeicons') format('svg'); - font-weight: normal; - font-style: normal; +[data-v-b7201572] .p-terminal .xterm-screen { + background-color: black; + overflow-y: hidden; } -.pi { - font-family: 'primeicons'; - speak: none; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; - display: inline-block; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; +[data-v-36dec989] .p-terminal .xterm { + overflow-x: auto; } - -.pi:before { - --webkit-backface-visibility:hidden; - backface-visibility: hidden; +[data-v-36dec989] .p-terminal .xterm-screen { + background-color: black; + overflow-y: hidden; } -.pi-fw { - width: 1.28571429em; - text-align: center; +.editable-text[data-v-d670c40f] { + display: inline; } - -.pi-spin { - animation: fa-spin 2s infinite linear; +.editable-text input[data-v-d670c40f] { + width: 100%; + box-sizing: border-box; } -@media (prefers-reduced-motion: reduce) { - .pi-spin { - animation-delay: -1ms; - animation-duration: 1ms; - animation-iteration-count: 1; - transition-delay: 0s; - transition-duration: 0s; - } +.tree-node[data-v-d8fc59be] { + width: 100%; + display: flex; + align-items: center; + justify-content: space-between; } - -@keyframes fa-spin { - 0% { - transform: rotate(0deg); - } - 100% { - transform: rotate(359deg); - } +.leaf-count-badge[data-v-d8fc59be] { + margin-left: 0.5rem; } - -.pi-folder-plus:before { - content: "\ea05"; +.node-content[data-v-d8fc59be] { + display: flex; + align-items: center; + flex-grow: 1; } - -.pi-receipt:before { - content: "\ea06"; +.leaf-label[data-v-d8fc59be] { + margin-left: 0.5rem; } - -.pi-asterisk:before { - content: "\ea07"; +[data-v-d8fc59be] .editable-text span { + word-break: break-all; } -.pi-face-smile:before { - content: "\ea08"; +[data-v-82fb18cb] .tree-explorer-node-label { + width: 100%; + display: flex; + align-items: center; + margin-left: var(--p-tree-node-gap); + flex-grow: 1; } -.pi-pinterest:before { - content: "\ea09"; +/* + * The following styles are necessary to avoid layout shift when dragging nodes over folders. + * By setting the position to relative on the parent and using an absolutely positioned pseudo-element, + * we can create a visual indicator for the drop target without affecting the layout of other elements. + */ +[data-v-82fb18cb] .p-tree-node-content:has(.tree-folder) { + position: relative; } - -.pi-expand:before { - content: "\ea0a"; +[data-v-82fb18cb] .p-tree-node-content:has(.tree-folder.can-drop)::after { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + border: 1px solid var(--p-content-color); + pointer-events: none; } -.pi-pen-to-square:before { - content: "\ea0b"; +[data-v-100ab5c6] .p-toolbar-end .p-button { + padding-top: 0.25rem; + padding-bottom: 0.25rem } - -.pi-wave-pulse:before { - content: "\ea0c"; +@media (min-width: 1536px) { +[data-v-100ab5c6] .p-toolbar-end .p-button { + padding-top: 0.5rem; + padding-bottom: 0.5rem } - -.pi-turkish-lira:before { - content: "\ea0d"; } -.pi-spinner-dotted:before { - content: "\ea0e"; +.model_preview[data-v-32e6c4d9] { + background-color: var(--comfy-menu-bg); + font-family: 'Open Sans', sans-serif; + color: var(--descrip-text); + border: 1px solid var(--descrip-text); + min-width: 300px; + max-width: 500px; + width: -moz-fit-content; + width: fit-content; + height: -moz-fit-content; + height: fit-content; + z-index: 9999; + border-radius: 12px; + overflow: hidden; + font-size: 12px; + padding: 10px; } - -.pi-crown:before { - content: "\ea0f"; +.model_preview_image[data-v-32e6c4d9] { + margin: auto; + width: -moz-fit-content; + width: fit-content; } - -.pi-pause-circle:before { - content: "\ea10"; +.model_preview_image img[data-v-32e6c4d9] { + max-width: 100%; + max-height: 150px; + -o-object-fit: contain; + object-fit: contain; } - -.pi-warehouse:before { - content: "\ea11"; +.model_preview_title[data-v-32e6c4d9] { + font-weight: bold; + text-align: center; + font-size: 14px; } - -.pi-objects-column:before { - content: "\ea12"; +.model_preview_top_container[data-v-32e6c4d9] { + text-align: center; + line-height: 0.5; } - -.pi-clipboard:before { - content: "\ea13"; +.model_preview_filename[data-v-32e6c4d9], +.model_preview_author[data-v-32e6c4d9], +.model_preview_architecture[data-v-32e6c4d9] { + display: inline-block; + text-align: center; + margin: 5px; + font-size: 10px; } - -.pi-play-circle:before { - content: "\ea14"; +.model_preview_prefix[data-v-32e6c4d9] { + font-weight: bold; } -.pi-venus:before { - content: "\ea15"; +.model-lib-model-icon-container[data-v-09176779] { + display: inline-block; + position: relative; + left: 0; + height: 1.5rem; + vertical-align: top; + width: 0px; } - -.pi-cart-minus:before { - content: "\ea16"; +.model-lib-model-icon[data-v-09176779] { + background-size: cover; + background-position: center; + display: inline-block; + position: relative; + left: -2.2rem; + top: -0.1rem; + height: 1.7rem; + width: 1.7rem; + vertical-align: top; } -.pi-file-plus:before { - content: "\ea17"; +[data-v-31a92a0f] .pi-fake-spacer { + height: 1px; + width: 16px; } -.pi-microchip:before { - content: "\ea18"; +.slot_row[data-v-3f708b1e] { + padding: 2px; } -.pi-twitch:before { - content: "\ea19"; +/* Original N-Sidebar styles */ +._sb_dot[data-v-3f708b1e] { + width: 8px; + height: 8px; + border-radius: 50%; + background-color: grey; } - -.pi-building-columns:before { - content: "\ea1a"; +.node_header[data-v-3f708b1e] { + line-height: 1; + padding: 8px 13px 7px; + margin-bottom: 5px; + font-size: 15px; + text-wrap: nowrap; + overflow: hidden; + display: flex; + align-items: center; } - -.pi-file-check:before { - content: "\ea1b"; +.headdot[data-v-3f708b1e] { + width: 10px; + height: 10px; + float: inline-start; + margin-right: 8px; } - -.pi-microchip-ai:before { - content: "\ea1c"; +.IMAGE[data-v-3f708b1e] { + background-color: #64b5f6; } - -.pi-trophy:before { - content: "\ea1d"; +.VAE[data-v-3f708b1e] { + background-color: #ff6e6e; } - -.pi-barcode:before { - content: "\ea1e"; +.LATENT[data-v-3f708b1e] { + background-color: #ff9cf9; } - -.pi-file-arrow-up:before { - content: "\ea1f"; +.MASK[data-v-3f708b1e] { + background-color: #81c784; } - -.pi-mars:before { - content: "\ea20"; +.CONDITIONING[data-v-3f708b1e] { + background-color: #ffa931; } - -.pi-tiktok:before { - content: "\ea21"; +.CLIP[data-v-3f708b1e] { + background-color: #ffd500; } - -.pi-arrow-up-right-and-arrow-down-left-from-center:before { - content: "\ea22"; +.MODEL[data-v-3f708b1e] { + background-color: #b39ddb; } - -.pi-ethereum:before { - content: "\ea23"; +.CONTROL_NET[data-v-3f708b1e] { + background-color: #a5d6a7; } - -.pi-list-check:before { - content: "\ea24"; +._sb_node_preview[data-v-3f708b1e] { + background-color: var(--comfy-menu-bg); + font-family: 'Open Sans', sans-serif; + font-size: small; + color: var(--descrip-text); + border: 1px solid var(--descrip-text); + min-width: 300px; + width: -moz-min-content; + width: min-content; + height: -moz-fit-content; + height: fit-content; + z-index: 9999; + border-radius: 12px; + overflow: hidden; + font-size: 12px; + padding-bottom: 10px; +} +._sb_node_preview ._sb_description[data-v-3f708b1e] { + margin: 10px; + padding: 6px; + background: var(--border-color); + border-radius: 5px; + font-style: italic; + font-weight: 500; + font-size: 0.9rem; + word-break: break-word; } +._sb_table[data-v-3f708b1e] { + display: grid; -.pi-thumbtack:before { - content: "\ea25"; -} - -.pi-arrow-down-left-and-arrow-up-right-to-center:before { - content: "\ea26"; + grid-column-gap: 10px; + /* Spazio tra le colonne */ + width: 100%; + /* Imposta la larghezza della tabella al 100% del contenitore */ } - -.pi-equals:before { - content: "\ea27"; +._sb_row[data-v-3f708b1e] { + display: grid; + grid-template-columns: 10px 1fr 1fr 1fr 10px; + grid-column-gap: 10px; + align-items: center; + padding-left: 9px; + padding-right: 9px; } - -.pi-lightbulb:before { - content: "\ea28"; +._sb_row_string[data-v-3f708b1e] { + grid-template-columns: 10px 1fr 1fr 10fr 1fr; } - -.pi-star-half:before { - content: "\ea29"; +._sb_col[data-v-3f708b1e] { + border: 0px solid #000; + display: flex; + align-items: flex-end; + flex-direction: row-reverse; + flex-wrap: nowrap; + align-content: flex-start; + justify-content: flex-end; } - -.pi-address-book:before { - content: "\ea2a"; +._sb_inherit[data-v-3f708b1e] { + display: inherit; } - -.pi-chart-scatter:before { - content: "\ea2b"; +._long_field[data-v-3f708b1e] { + background: var(--bg-color); + border: 2px solid var(--border-color); + margin: 5px 5px 0 5px; + border-radius: 10px; + line-height: 1.7; + text-wrap: nowrap; } - -.pi-indian-rupee:before { - content: "\ea2c"; +._sb_arrow[data-v-3f708b1e] { + color: var(--fg-color); } - -.pi-star-half-fill:before { - content: "\ea2d"; +._sb_preview_badge[data-v-3f708b1e] { + text-align: center; + background: var(--comfy-input-bg); + font-weight: bold; + color: var(--error-text); } -.pi-cart-arrow-down:before { - content: "\ea2e"; +.node-lib-node-container[data-v-20bd95eb] { + height: 100%; + width: 100% } -.pi-calendar-clock:before { - content: "\ea2f"; +.p-selectbutton .p-button[data-v-29268946] { + padding: 0.5rem; } - -.pi-sort-up-fill:before { - content: "\ea30"; +.p-selectbutton .p-button .pi[data-v-29268946] { + font-size: 1.5rem; } - -.pi-sparkles:before { - content: "\ea31"; +.field[data-v-29268946] { + display: flex; + flex-direction: column; + gap: 0.5rem; } - -.pi-bullseye:before { - content: "\ea32"; +.color-picker-container[data-v-29268946] { + display: flex; + align-items: center; + gap: 0.5rem; } -.pi-sort-down-fill:before { - content: "\ea33"; -} +._content[data-v-87bfb8bc] { -.pi-graduation-cap:before { - content: "\ea34"; -} + display: flex; -.pi-hammer:before { - content: "\ea35"; + flex-direction: column } +._content[data-v-87bfb8bc] > :not([hidden]) ~ :not([hidden]) { -.pi-bell-slash:before { - content: "\ea36"; -} + --tw-space-y-reverse: 0; -.pi-gauge:before { - content: "\ea37"; -} + margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse))); -.pi-shop:before { - content: "\ea38"; + margin-bottom: calc(0.5rem * var(--tw-space-y-reverse)) } +._footer[data-v-87bfb8bc] { -.pi-headphones:before { - content: "\ea39"; -} + display: flex; -.pi-eraser:before { - content: "\ea04"; -} + flex-direction: column; -.pi-stopwatch:before { - content: "\ea01"; -} + align-items: flex-end; -.pi-verified:before { - content: "\ea02"; + padding-top: 1rem } -.pi-delete-left:before { - content: "\ea03"; +.comfy-image-wrap[data-v-ffe66146] { + display: contents; } - -.pi-hourglass:before { - content: "\e9fe"; +.comfy-image-blur[data-v-ffe66146] { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + -o-object-fit: cover; + object-fit: cover; } - -.pi-truck:before { - content: "\ea00"; +.comfy-image-main[data-v-ffe66146] { + width: 100%; + height: 100%; + -o-object-fit: cover; + object-fit: cover; + -o-object-position: center; + object-position: center; + z-index: 1; } - -.pi-wrench:before { - content: "\e9ff"; +.contain .comfy-image-wrap[data-v-ffe66146] { + position: relative; + width: 100%; + height: 100%; } - -.pi-microphone:before { - content: "\e9fa"; +.contain .comfy-image-main[data-v-ffe66146] { + -o-object-fit: contain; + object-fit: contain; + -webkit-backdrop-filter: blur(10px); + backdrop-filter: blur(10px); + position: absolute; } - -.pi-megaphone:before { - content: "\e9fb"; +.broken-image-placeholder[data-v-ffe66146] { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; + margin: 2rem; } - -.pi-arrow-right-arrow-left:before { - content: "\e9fc"; +.broken-image-placeholder i[data-v-ffe66146] { + font-size: 3rem; + margin-bottom: 0.5rem; } -.pi-bitcoin:before { - content: "\e9fd"; +.result-container[data-v-62b7731e] { + width: 100%; + height: 100%; + aspect-ratio: 1 / 1; + overflow: hidden; + position: relative; + display: flex; + justify-content: center; + align-items: center; } - -.pi-file-edit:before { - content: "\e9f6"; +.preview-mask[data-v-62b7731e] { + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + display: flex; + align-items: center; + justify-content: center; + opacity: 0; + transition: opacity 0.3s ease; + z-index: 1; } - -.pi-language:before { - content: "\e9f7"; +.result-container:hover .preview-mask[data-v-62b7731e] { + opacity: 1; } -.pi-file-export:before { - content: "\e9f8"; +.task-result-preview[data-v-919a0259] { + aspect-ratio: 1 / 1; + overflow: hidden; + display: flex; + justify-content: center; + align-items: center; + width: 100%; + height: 100%; } - -.pi-file-import:before { - content: "\e9f9"; +.task-result-preview i[data-v-919a0259], +.task-result-preview span[data-v-919a0259] { + font-size: 2rem; } - -.pi-file-word:before { - content: "\e9f1"; +.task-item[data-v-919a0259] { + display: flex; + flex-direction: column; + border-radius: 4px; + overflow: hidden; + position: relative; } - -.pi-gift:before { - content: "\e9f2"; +.task-item-details[data-v-919a0259] { + position: absolute; + bottom: 0; + padding: 0.6rem; + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; + z-index: 1; } - -.pi-cart-plus:before { - content: "\e9f3"; +.task-node-link[data-v-919a0259] { + padding: 2px; } -.pi-thumbs-down-fill:before { - content: "\e9f4"; +/* In dark mode, transparent background color for tags is not ideal for tags that +are floating on top of images. */ +.tag-wrapper[data-v-919a0259] { + background-color: var(--p-primary-contrast-color); + border-radius: 6px; + display: inline-flex; } - -.pi-thumbs-up-fill:before { - content: "\e9f5"; +.node-name-tag[data-v-919a0259] { + word-break: break-all; } - -.pi-arrows-alt:before { - content: "\e9f0"; +.status-tag-group[data-v-919a0259] { + display: flex; + flex-direction: column; } - -.pi-calculator:before { - content: "\e9ef"; -} - -.pi-sort-alt-slash:before { - content: "\e9ee"; +.progress-preview-img[data-v-919a0259] { + width: 100%; + height: 100%; + -o-object-fit: cover; + object-fit: cover; + -o-object-position: center; + object-position: center; } -.pi-arrows-h:before { - content: "\e9ec"; +/* PrimeVue's galleria teleports the fullscreen gallery out of subtree so we +cannot use scoped style here. */ +img.galleria-image { + max-width: 100vw; + max-height: 100vh; + -o-object-fit: contain; + object-fit: contain; } - -.pi-arrows-v:before { - content: "\e9ed"; +.p-galleria-close-button { + /* Set z-index so the close button doesn't get hidden behind the image when image is large */ + z-index: 1; } -.pi-pound:before { - content: "\e9eb"; +.scroll-container[data-v-375f3c50] { + height: 100%; + overflow-y: auto; } - -.pi-prime:before { - content: "\e9ea"; +.scroll-container[data-v-375f3c50]::-webkit-scrollbar { + width: 1px; } - -.pi-chart-pie:before { - content: "\e9e9"; +.scroll-container[data-v-375f3c50]::-webkit-scrollbar-thumb { + background-color: transparent; } - -.pi-reddit:before { - content: "\e9e8"; +.queue-grid[data-v-375f3c50] { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); + padding: 0.5rem; + gap: 0.5rem; } -.pi-code:before { - content: "\e9e7"; +.global-dialog .p-dialog-header { + padding: 0.5rem } - -.pi-sync:before { - content: "\e9e6"; +@media (min-width: 1536px) { +.global-dialog .p-dialog-header { + padding: var(--p-dialog-header-padding) } - -.pi-shopping-bag:before { - content: "\e9e5"; } - -.pi-server:before { - content: "\e9e4"; +.global-dialog .p-dialog-header { + padding-bottom: 0px } - -.pi-database:before { - content: "\e9e3"; +.global-dialog .p-dialog-content { + padding: 0.5rem } - -.pi-hashtag:before { - content: "\e9e2"; +@media (min-width: 1536px) { +.global-dialog .p-dialog-content { + padding: var(--p-dialog-content-padding) } - -.pi-bookmark-fill:before { - content: "\e9df"; } - -.pi-filter-fill:before { - content: "\e9e0"; +.global-dialog .p-dialog-content { + padding-top: 0px } +/* this CSS contains only the basic CSS needed to run the app and use it */ -.pi-heart-fill:before { - content: "\e9e1"; +.lgraphcanvas { + /*cursor: crosshair;*/ + user-select: none; + -moz-user-select: none; + -webkit-user-select: none; + outline: none; + font-family: Tahoma, sans-serif; } -.pi-flag-fill:before { - content: "\e9de"; +.lgraphcanvas * { + box-sizing: border-box; } -.pi-circle:before { - content: "\e9dc"; +.litegraph.litecontextmenu { + font-family: Tahoma, sans-serif; + position: fixed; + top: 100px; + left: 100px; + min-width: 100px; + color: #aaf; + padding: 0; + box-shadow: 0 0 10px black !important; + background-color: #2e2e2e !important; + z-index: 10; } -.pi-circle-fill:before { - content: "\e9dd"; +.litegraph.litecontextmenu.dark { + background-color: #000 !important; } -.pi-bolt:before { - content: "\e9db"; +.litegraph.litecontextmenu .litemenu-title img { + margin-top: 2px; + margin-left: 2px; + margin-right: 4px; } -.pi-history:before { - content: "\e9da"; +.litegraph.litecontextmenu .litemenu-entry { + margin: 2px; + padding: 2px; } -.pi-box:before { - content: "\e9d9"; +.litegraph.litecontextmenu .litemenu-entry.submenu { + background-color: #2e2e2e !important; } -.pi-at:before { - content: "\e9d8"; +.litegraph.litecontextmenu.dark .litemenu-entry.submenu { + background-color: #000 !important; } -.pi-arrow-up-right:before { - content: "\e9d4"; +.litegraph .litemenubar ul { + font-family: Tahoma, sans-serif; + margin: 0; + padding: 0; } -.pi-arrow-up-left:before { - content: "\e9d5"; +.litegraph .litemenubar li { + font-size: 14px; + color: #999; + display: inline-block; + min-width: 50px; + padding-left: 10px; + padding-right: 10px; + user-select: none; + -moz-user-select: none; + -webkit-user-select: none; + cursor: pointer; } -.pi-arrow-down-left:before { - content: "\e9d6"; +.litegraph .litemenubar li:hover { + background-color: #777; + color: #eee; } -.pi-arrow-down-right:before { - content: "\e9d7"; +.litegraph .litegraph .litemenubar-panel { + position: absolute; + top: 5px; + left: 5px; + min-width: 100px; + background-color: #444; + box-shadow: 0 0 3px black; + padding: 4px; + border-bottom: 2px solid #aaf; + z-index: 10; } -.pi-telegram:before { - content: "\e9d3"; +.litegraph .litemenu-entry, +.litemenu-title { + font-size: 12px; + color: #aaa; + padding: 0 0 0 4px; + margin: 2px; + padding-left: 2px; + -moz-user-select: none; + -webkit-user-select: none; + user-select: none; + cursor: pointer; } -.pi-stop-circle:before { - content: "\e9d2"; +.litegraph .litemenu-entry .icon { + display: inline-block; + width: 12px; + height: 12px; + margin: 2px; + vertical-align: top; } -.pi-stop:before { - content: "\e9d1"; +.litegraph .litemenu-entry.checked .icon { + background-color: #aaf; } -.pi-whatsapp:before { - content: "\e9d0"; +.litegraph .litemenu-entry .more { + float: right; + padding-right: 5px; } -.pi-building:before { - content: "\e9cf"; +.litegraph .litemenu-entry.disabled { + opacity: 0.5; + cursor: default; } -.pi-qrcode:before { - content: "\e9ce"; +.litegraph .litemenu-entry.separator { + display: block; + border-top: 1px solid #333; + border-bottom: 1px solid #666; + width: 100%; + height: 0px; + margin: 3px 0 2px 0; + background-color: transparent; + padding: 0 !important; + cursor: default !important; } -.pi-car:before { - content: "\e9cd"; +.litegraph .litemenu-entry.has_submenu { + border-right: 2px solid cyan; } -.pi-instagram:before { - content: "\e9cc"; +.litegraph .litemenu-title { + color: #dde; + background-color: #111; + margin: 0; + padding: 2px; + cursor: default; } -.pi-linkedin:before { - content: "\e9cb"; +.litegraph .litemenu-entry:hover:not(.disabled):not(.separator) { + background-color: #444 !important; + color: #eee; + transition: all 0.2s; } -.pi-send:before { - content: "\e9ca"; +.litegraph .litemenu-entry .property_name { + display: inline-block; + text-align: left; + min-width: 80px; + min-height: 1.2em; } -.pi-slack:before { - content: "\e9c9"; +.litegraph .litemenu-entry .property_value { + display: inline-block; + background-color: rgba(0, 0, 0, 0.5); + text-align: right; + min-width: 80px; + min-height: 1.2em; + vertical-align: middle; + padding-right: 10px; } -.pi-sun:before { - content: "\e9c8"; +.litegraph.litesearchbox { + font-family: Tahoma, sans-serif; + position: absolute; + background-color: rgba(0, 0, 0, 0.5); + padding-top: 4px; } -.pi-moon:before { - content: "\e9c7"; +.litegraph.litesearchbox input, +.litegraph.litesearchbox select { + margin-top: 3px; + min-width: 60px; + min-height: 1.5em; + background-color: black; + border: 0; + color: white; + padding-left: 10px; + margin-right: 5px; + max-width: 300px; } -.pi-vimeo:before { - content: "\e9c6"; +.litegraph.litesearchbox .name { + display: inline-block; + min-width: 60px; + min-height: 1.5em; + padding-left: 10px; } -.pi-youtube:before { - content: "\e9c5"; +.litegraph.litesearchbox .helper { + overflow: auto; + max-height: 200px; + margin-top: 2px; } -.pi-flag:before { - content: "\e9c4"; +.litegraph.lite-search-item { + font-family: Tahoma, sans-serif; + background-color: rgba(0, 0, 0, 0.5); + color: white; + padding-top: 2px; } -.pi-wallet:before { - content: "\e9c3"; +.litegraph.lite-search-item.not_in_filter { + /*background-color: rgba(50, 50, 50, 0.5);*/ + /*color: #999;*/ + color: #b99; + font-style: italic; } -.pi-map:before { - content: "\e9c2"; +.litegraph.lite-search-item.generic_type { + /*background-color: rgba(50, 50, 50, 0.5);*/ + /*color: #DD9;*/ + color: #999; + font-style: italic; } -.pi-link:before { - content: "\e9c1"; +.litegraph.lite-search-item:hover, +.litegraph.lite-search-item.selected { + cursor: pointer; + background-color: white; + color: black; } -.pi-credit-card:before { - content: "\e9bf"; +.litegraph.lite-search-item-type { + display: inline-block; + background: rgba(0, 0, 0, 0.2); + margin-left: 5px; + font-size: 14px; + padding: 2px 5px; + position: relative; + top: -2px; + opacity: 0.8; + border-radius: 4px; } -.pi-discord:before { - content: "\e9c0"; -} +/* DIALOGs ******/ -.pi-percentage:before { - content: "\e9be"; -} +.litegraph .dialog { + position: absolute; + top: 50%; + left: 50%; + margin-top: -150px; + margin-left: -200px; -.pi-euro:before { - content: "\e9bd"; -} + background-color: #2a2a2a; -.pi-book:before { - content: "\e9ba"; + min-width: 400px; + min-height: 200px; + box-shadow: 0 0 4px #111; + border-radius: 6px; } -.pi-shield:before { - content: "\e9b9"; +.litegraph .dialog.settings { + left: 10px; + top: 10px; + height: calc(100% - 20px); + margin: auto; + max-width: 50%; } -.pi-paypal:before { - content: "\e9bb"; +.litegraph .dialog.centered { + top: 50px; + left: 50%; + position: absolute; + transform: translateX(-50%); + min-width: 600px; + min-height: 300px; + height: calc(100% - 100px); + margin: auto; } -.pi-amazon:before { - content: "\e9bc"; +.litegraph .dialog .close { + float: right; + margin: 4px; + margin-right: 10px; + cursor: pointer; + font-size: 1.4em; } -.pi-phone:before { - content: "\e9b8"; +.litegraph .dialog .close:hover { + color: white; } -.pi-filter-slash:before { - content: "\e9b7"; +.litegraph .dialog .dialog-header { + color: #aaa; + border-bottom: 1px solid #161616; + height: 40px; } - -.pi-facebook:before { - content: "\e9b4"; +.litegraph .dialog .dialog-footer { + height: 50px; + padding: 10px; + border-top: 1px solid #1a1a1a; } -.pi-github:before { - content: "\e9b5"; +.litegraph .dialog .dialog-header .dialog-title { + font: 20px "Arial"; + margin: 4px; + padding: 4px 10px; + display: inline-block; } -.pi-twitter:before { - content: "\e9b6"; +.litegraph .dialog .dialog-content, +.litegraph .dialog .dialog-alt-content { + height: calc(100% - 90px); + width: 100%; + min-height: 100px; + display: inline-block; + color: #aaa; + /*background-color: black;*/ + overflow: auto; } -.pi-step-backward-alt:before { - content: "\e9ac"; +.litegraph .dialog .dialog-content h3 { + margin: 10px; } -.pi-step-forward-alt:before { - content: "\e9ad"; +.litegraph .dialog .dialog-content .connections { + flex-direction: row; } -.pi-forward:before { - content: "\e9ae"; +.litegraph .dialog .dialog-content .connections .connections_side { + width: calc(50% - 5px); + min-height: 100px; + background-color: black; + display: flex; } -.pi-backward:before { - content: "\e9af"; +.litegraph .dialog .node_type { + font-size: 1.2em; + display: block; + margin: 10px; } -.pi-fast-backward:before { - content: "\e9b0"; +.litegraph .dialog .node_desc { + opacity: 0.5; + display: block; + margin: 10px; } -.pi-fast-forward:before { - content: "\e9b1"; +.litegraph .dialog .separator { + display: block; + width: calc(100% - 4px); + height: 1px; + border-top: 1px solid #000; + border-bottom: 1px solid #333; + margin: 10px 2px; + padding: 0; } -.pi-pause:before { - content: "\e9b2"; +.litegraph .dialog .property { + margin-bottom: 2px; + padding: 4px; } -.pi-play:before { - content: "\e9b3"; +.litegraph .dialog .property:hover { + background: #545454; } -.pi-compass:before { - content: "\e9ab"; +.litegraph .dialog .property_name { + color: #737373; + display: inline-block; + text-align: left; + vertical-align: top; + width: 160px; + padding-left: 4px; + overflow: hidden; + margin-right: 6px; } -.pi-id-card:before { - content: "\e9aa"; +.litegraph .dialog .property:hover .property_name { + color: white; } -.pi-ticket:before { - content: "\e9a9"; +.litegraph .dialog .property_value { + display: inline-block; + text-align: right; + color: #aaa; + background-color: #1a1a1a; + /*width: calc( 100% - 122px );*/ + max-width: calc(100% - 162px); + min-width: 200px; + max-height: 300px; + min-height: 20px; + padding: 4px; + padding-right: 12px; + overflow: hidden; + cursor: pointer; + border-radius: 3px; } -.pi-file-o:before { - content: "\e9a8"; +.litegraph .dialog .property_value:hover { + color: white; } -.pi-reply:before { - content: "\e9a7"; +.litegraph .dialog .property.boolean .property_value { + padding-right: 30px; + color: #a88; + /*width: auto; + float: right;*/ } -.pi-directions-alt:before { - content: "\e9a5"; +.litegraph .dialog .property.boolean.bool-on .property_name { + color: #8a8; +} +.litegraph .dialog .property.boolean.bool-on .property_value { + color: #8a8; } -.pi-directions:before { - content: "\e9a6"; +.litegraph .dialog .btn { + border: 0; + border-radius: 4px; + padding: 4px 20px; + margin-left: 0px; + background-color: #060606; + color: #8e8e8e; } -.pi-thumbs-up:before { - content: "\e9a3"; +.litegraph .dialog .btn:hover { + background-color: #111; + color: #fff; } -.pi-thumbs-down:before { - content: "\e9a4"; +.litegraph .dialog .btn.delete:hover { + background-color: #f33; + color: black; } -.pi-sort-numeric-down-alt:before { - content: "\e996"; +.litegraph .subgraph_property { + padding: 4px; } -.pi-sort-numeric-up-alt:before { - content: "\e997"; +.litegraph .subgraph_property:hover { + background-color: #333; } -.pi-sort-alpha-down-alt:before { - content: "\e998"; +.litegraph .subgraph_property.extra { + margin-top: 8px; } -.pi-sort-alpha-up-alt:before { - content: "\e999"; +.litegraph .subgraph_property span.name { + font-size: 1.3em; + padding-left: 4px; } -.pi-sort-numeric-down:before { - content: "\e99a"; +.litegraph .subgraph_property span.type { + opacity: 0.5; + margin-right: 20px; + padding-left: 4px; } -.pi-sort-numeric-up:before { - content: "\e99b"; +.litegraph .subgraph_property span.label { + display: inline-block; + width: 60px; + padding: 0px 10px; } -.pi-sort-alpha-down:before { - content: "\e99c"; +.litegraph .subgraph_property input { + width: 140px; + color: #999; + background-color: #1a1a1a; + border-radius: 4px; + border: 0; + margin-right: 10px; + padding: 4px; + padding-left: 10px; } -.pi-sort-alpha-up:before { - content: "\e99d"; +.litegraph .subgraph_property button { + background-color: #1c1c1c; + color: #aaa; + border: 0; + border-radius: 2px; + padding: 4px 10px; + cursor: pointer; } -.pi-sort-alt:before { - content: "\e99e"; +.litegraph .subgraph_property.extra { + color: #ccc; } -.pi-sort-amount-up:before { - content: "\e99f"; +.litegraph .subgraph_property.extra input { + background-color: #111; } -.pi-sort-amount-down:before { - content: "\e9a0"; +.litegraph .bullet_icon { + margin-left: 10px; + border-radius: 10px; + width: 12px; + height: 12px; + background-color: #666; + display: inline-block; + margin-top: 2px; + margin-right: 4px; + transition: background-color 0.1s ease 0s; + -moz-transition: background-color 0.1s ease 0s; } -.pi-sort-amount-down-alt:before { - content: "\e9a1"; +.litegraph .bullet_icon:hover { + background-color: #698; + cursor: pointer; } -.pi-sort-amount-up-alt:before { - content: "\e9a2"; -} +/* OLD */ -.pi-palette:before { - content: "\e995"; +.graphcontextmenu { + padding: 4px; + min-width: 100px; } -.pi-undo:before { - content: "\e994"; +.graphcontextmenu-title { + color: #dde; + background-color: #222; + margin: 0; + padding: 2px; + cursor: default; } -.pi-desktop:before { - content: "\e993"; +.graphmenu-entry { + box-sizing: border-box; + margin: 2px; + padding-left: 20px; + user-select: none; + -moz-user-select: none; + -webkit-user-select: none; + transition: all linear 0.3s; } -.pi-sliders-v:before { - content: "\e991"; +.graphmenu-entry.event, +.litemenu-entry.event { + border-left: 8px solid orange; + padding-left: 12px; } -.pi-sliders-h:before { - content: "\e992"; +.graphmenu-entry.disabled { + opacity: 0.3; } -.pi-search-plus:before { - content: "\e98f"; +.graphmenu-entry.submenu { + border-right: 2px solid #eee; } -.pi-search-minus:before { - content: "\e990"; +.graphmenu-entry:hover { + background-color: #555; } -.pi-file-excel:before { - content: "\e98e"; +.graphmenu-entry.separator { + background-color: #111; + border-bottom: 1px solid #666; + height: 1px; + width: calc(100% - 20px); + -moz-width: calc(100% - 20px); + -webkit-width: calc(100% - 20px); } -.pi-file-pdf:before { - content: "\e98d"; +.graphmenu-entry .property_name { + display: inline-block; + text-align: left; + min-width: 80px; + min-height: 1.2em; } -.pi-check-square:before { - content: "\e98c"; +.graphmenu-entry .property_value, +.litemenu-entry .property_value { + display: inline-block; + background-color: rgba(0, 0, 0, 0.5); + text-align: right; + min-width: 80px; + min-height: 1.2em; + vertical-align: middle; + padding-right: 10px; } -.pi-chart-line:before { - content: "\e98b"; +.graphdialog { + position: absolute; + top: 10px; + left: 10px; + min-height: 2em; + background-color: #333; + font-size: 1.2em; + box-shadow: 0 0 10px black !important; + z-index: 10; } -.pi-user-edit:before { - content: "\e98a"; +.graphdialog.rounded { + border-radius: 12px; + padding-right: 2px; } -.pi-exclamation-circle:before { - content: "\e989"; +.graphdialog .name { + display: inline-block; + min-width: 60px; + min-height: 1.5em; + padding-left: 10px; } -.pi-android:before { - content: "\e985"; +.graphdialog input, +.graphdialog textarea, +.graphdialog select { + margin: 3px; + min-width: 60px; + min-height: 1.5em; + background-color: black; + border: 0; + color: white; + padding-left: 10px; + outline: none; } -.pi-google:before { - content: "\e986"; +.graphdialog textarea { + min-height: 150px; } -.pi-apple:before { - content: "\e987"; +.graphdialog button { + margin-top: 3px; + vertical-align: top; + background-color: #999; + border: 0; } -.pi-microsoft:before { - content: "\e988"; +.graphdialog button.rounded, +.graphdialog input.rounded { + border-radius: 0 12px 12px 0; } -.pi-heart:before { - content: "\e984"; +.graphdialog .helper { + overflow: auto; + max-height: 200px; } -.pi-mobile:before { - content: "\e982"; +.graphdialog .help-item { + padding-left: 10px; } -.pi-tablet:before { - content: "\e983"; +.graphdialog .help-item:hover, +.graphdialog .help-item.selected { + cursor: pointer; + background-color: white; + color: black; } -.pi-key:before { - content: "\e981"; +.litegraph .dialog { + min-height: 0; } - -.pi-shopping-cart:before { - content: "\e980"; +.litegraph .dialog .dialog-content { + display: block; } - -.pi-comments:before { - content: "\e97e"; +.litegraph .dialog .dialog-content .subgraph_property { + padding: 5px; } - -.pi-comment:before { - content: "\e97f"; +.litegraph .dialog .dialog-footer { + margin: 0; } - -.pi-briefcase:before { - content: "\e97d"; +.litegraph .dialog .dialog-footer .subgraph_property { + margin-top: 0; + display: flex; + align-items: center; + padding: 5px; } - -.pi-bell:before { - content: "\e97c"; +.litegraph .dialog .dialog-footer .subgraph_property .name { + flex: 1; } - -.pi-paperclip:before { - content: "\e97b"; -} - -.pi-share-alt:before { - content: "\e97a"; -} - -.pi-envelope:before { - content: "\e979"; -} - -.pi-volume-down:before { - content: "\e976"; -} - -.pi-volume-up:before { - content: "\e977"; -} - -.pi-volume-off:before { - content: "\e978"; -} - -.pi-eject:before { - content: "\e975"; -} - -.pi-money-bill:before { - content: "\e974"; -} - -.pi-images:before { - content: "\e973"; -} - -.pi-image:before { - content: "\e972"; -} - -.pi-sign-in:before { - content: "\e970"; -} - -.pi-sign-out:before { - content: "\e971"; -} - -.pi-wifi:before { - content: "\e96f"; -} - -.pi-sitemap:before { - content: "\e96e"; -} - -.pi-chart-bar:before { - content: "\e96d"; -} - -.pi-camera:before { - content: "\e96c"; -} - -.pi-dollar:before { - content: "\e96b"; -} - -.pi-lock-open:before { - content: "\e96a"; -} - -.pi-table:before { - content: "\e969"; -} - -.pi-map-marker:before { - content: "\e968"; -} - -.pi-list:before { - content: "\e967"; -} - -.pi-eye-slash:before { - content: "\e965"; -} - -.pi-eye:before { - content: "\e966"; -} - -.pi-folder-open:before { - content: "\e964"; -} - -.pi-folder:before { - content: "\e963"; -} - -.pi-video:before { - content: "\e962"; -} - -.pi-inbox:before { - content: "\e961"; -} - -.pi-lock:before { - content: "\e95f"; -} - -.pi-unlock:before { - content: "\e960"; -} - -.pi-tags:before { - content: "\e95d"; -} - -.pi-tag:before { - content: "\e95e"; -} - -.pi-power-off:before { - content: "\e95c"; -} - -.pi-save:before { - content: "\e95b"; -} - -.pi-question-circle:before { - content: "\e959"; -} - -.pi-question:before { - content: "\e95a"; -} - -.pi-copy:before { - content: "\e957"; -} - -.pi-file:before { - content: "\e958"; -} - -.pi-clone:before { - content: "\e955"; -} - -.pi-calendar-times:before { - content: "\e952"; +.litegraph .graphdialog { + display: flex; + align-items: center; + border-radius: 20px; + padding: 4px 10px; + position: fixed; } - -.pi-calendar-minus:before { - content: "\e953"; +.litegraph .graphdialog .name { + padding: 0; + min-height: 0; + font-size: 16px; + vertical-align: middle; } - -.pi-calendar-plus:before { - content: "\e954"; +.litegraph .graphdialog .value { + font-size: 16px; + min-height: 0; + margin: 0 10px; + padding: 2px 5px; } - -.pi-ellipsis-v:before { - content: "\e950"; +.litegraph .graphdialog input[type="checkbox"] { + width: 16px; + height: 16px; } - -.pi-ellipsis-h:before { - content: "\e951"; +.litegraph .graphdialog button { + padding: 4px 18px; + border-radius: 20px; + cursor: pointer; } +@layer primevue, tailwind-utilities; -.pi-bookmark:before { - content: "\e94e"; -} +@layer tailwind-utilities { + .container{ + width: 100%; + } + @media (min-width: 640px){ -.pi-globe:before { - content: "\e94f"; -} + .container{ + max-width: 640px; + } + } + @media (min-width: 768px){ -.pi-replay:before { - content: "\e94d"; -} + .container{ + max-width: 768px; + } + } + @media (min-width: 1024px){ -.pi-filter:before { - content: "\e94c"; -} + .container{ + max-width: 1024px; + } + } + @media (min-width: 1280px){ -.pi-print:before { - content: "\e94b"; -} + .container{ + max-width: 1280px; + } + } + @media (min-width: 1536px){ -.pi-align-right:before { - content: "\e946"; -} + .container{ + max-width: 1536px; + } + } + @media (min-width: 1800px){ -.pi-align-left:before { - content: "\e947"; -} + .container{ + max-width: 1800px; + } + } + @media (min-width: 2500px){ -.pi-align-center:before { - content: "\e948"; -} - -.pi-align-justify:before { - content: "\e949"; -} - -.pi-cog:before { - content: "\e94a"; -} - -.pi-cloud-download:before { - content: "\e943"; -} - -.pi-cloud-upload:before { - content: "\e944"; -} - -.pi-cloud:before { - content: "\e945"; -} - -.pi-pencil:before { - content: "\e942"; -} - -.pi-users:before { - content: "\e941"; -} - -.pi-clock:before { - content: "\e940"; -} - -.pi-user-minus:before { - content: "\e93e"; -} - -.pi-user-plus:before { - content: "\e93f"; -} - -.pi-trash:before { - content: "\e93d"; -} - -.pi-external-link:before { - content: "\e93c"; -} - -.pi-window-maximize:before { - content: "\e93b"; -} - -.pi-window-minimize:before { - content: "\e93a"; -} - -.pi-refresh:before { - content: "\e938"; -} - -.pi-user:before { - content: "\e939"; -} - -.pi-exclamation-triangle:before { - content: "\e922"; -} - -.pi-calendar:before { - content: "\e927"; -} - -.pi-chevron-circle-left:before { - content: "\e928"; -} - -.pi-chevron-circle-down:before { - content: "\e929"; -} - -.pi-chevron-circle-right:before { - content: "\e92a"; -} - -.pi-chevron-circle-up:before { - content: "\e92b"; -} - -.pi-angle-double-down:before { - content: "\e92c"; -} - -.pi-angle-double-left:before { - content: "\e92d"; -} - -.pi-angle-double-right:before { - content: "\e92e"; -} - -.pi-angle-double-up:before { - content: "\e92f"; -} - -.pi-angle-down:before { - content: "\e930"; -} - -.pi-angle-left:before { - content: "\e931"; -} - -.pi-angle-right:before { - content: "\e932"; -} - -.pi-angle-up:before { - content: "\e933"; -} - -.pi-upload:before { - content: "\e934"; -} - -.pi-download:before { - content: "\e956"; -} - -.pi-ban:before { - content: "\e935"; -} - -.pi-star-fill:before { - content: "\e936"; -} - -.pi-star:before { - content: "\e937"; -} - -.pi-chevron-left:before { - content: "\e900"; -} - -.pi-chevron-right:before { - content: "\e901"; -} - -.pi-chevron-down:before { - content: "\e902"; -} - -.pi-chevron-up:before { - content: "\e903"; -} - -.pi-caret-left:before { - content: "\e904"; -} - -.pi-caret-right:before { - content: "\e905"; -} - -.pi-caret-down:before { - content: "\e906"; -} - -.pi-caret-up:before { - content: "\e907"; -} - -.pi-search:before { - content: "\e908"; -} - -.pi-check:before { - content: "\e909"; -} - -.pi-check-circle:before { - content: "\e90a"; -} - -.pi-times:before { - content: "\e90b"; -} - -.pi-times-circle:before { - content: "\e90c"; -} - -.pi-plus:before { - content: "\e90d"; -} - -.pi-plus-circle:before { - content: "\e90e"; -} - -.pi-minus:before { - content: "\e90f"; -} - -.pi-minus-circle:before { - content: "\e910"; -} - -.pi-circle-on:before { - content: "\e911"; -} - -.pi-circle-off:before { - content: "\e912"; -} - -.pi-sort-down:before { - content: "\e913"; -} - -.pi-sort-up:before { - content: "\e914"; -} - -.pi-sort:before { - content: "\e915"; -} - -.pi-step-backward:before { - content: "\e916"; -} - -.pi-step-forward:before { - content: "\e917"; -} - -.pi-th-large:before { - content: "\e918"; -} - -.pi-arrow-down:before { - content: "\e919"; -} - -.pi-arrow-left:before { - content: "\e91a"; -} - -.pi-arrow-right:before { - content: "\e91b"; -} - -.pi-arrow-up:before { - content: "\e91c"; -} - -.pi-bars:before { - content: "\e91d"; -} - -.pi-arrow-circle-down:before { - content: "\e91e"; -} - -.pi-arrow-circle-left:before { - content: "\e91f"; -} - -.pi-arrow-circle-right:before { - content: "\e920"; -} - -.pi-arrow-circle-up:before { - content: "\e921"; -} - -.pi-info:before { - content: "\e923"; -} - -.pi-info-circle:before { - content: "\e924"; -} - -.pi-home:before { - content: "\e925"; -} - -.pi-spinner:before { - content: "\e926"; -} -@layer primevue, tailwind-utilities; - -@layer tailwind-utilities { - .container{ - width: 100%; - } - @media (min-width: 640px){ - - .container{ - max-width: 640px; - } - } - @media (min-width: 768px){ - - .container{ - max-width: 768px; - } - } - @media (min-width: 1024px){ - - .container{ - max-width: 1024px; - } - } - @media (min-width: 1280px){ - - .container{ - max-width: 1280px; - } - } - @media (min-width: 1536px){ - - .container{ - max-width: 1536px; - } - } - @media (min-width: 1800px){ - - .container{ - max-width: 1800px; - } - } - @media (min-width: 2500px){ - - .container{ - max-width: 2500px; - } - } - @media (min-width: 3200px){ + .container{ + max-width: 2500px; + } + } + @media (min-width: 3200px){ .container{ max-width: 3200px; @@ -2131,6 +2020,12 @@ .z-\[1000\]{ z-index: 1000; } + .col-start-1{ + grid-column-start: 1; + } + .row-start-1{ + grid-row-start: 1; + } .m-0{ margin: 0px; } @@ -2143,6 +2038,10 @@ .m-2{ margin: 0.5rem; } + .mx-0{ + margin-left: 0px; + margin-right: 0px; + } .mx-1{ margin-left: 0.25rem; margin-right: 0.25rem; @@ -2155,6 +2054,10 @@ margin-left: 1.5rem; margin-right: 1.5rem; } + .mx-auto{ + margin-left: auto; + margin-right: auto; + } .my-0{ margin-top: 0px; margin-bottom: 0px; @@ -2223,6 +2126,9 @@ .mt-5{ margin-top: 1.25rem; } + .mt-\[5vh\]{ + margin-top: 5vh; + } .block{ display: block; } @@ -2262,9 +2168,6 @@ .h-64{ height: 16rem; } - .h-96{ - height: 26rem; - } .h-\[22px\]{ height: 22px; } @@ -2319,9 +2222,6 @@ .w-64{ width: 16rem; } - .w-8{ - width: 2rem; - } .w-\[22px\]{ width: 22px; } @@ -2430,8 +2330,14 @@ .flex-nowrap{ flex-wrap: nowrap; } - .content-center{ - align-content: center; + .place-content-center{ + place-content: center; + } + .place-items-center{ + place-items: center; + } + .content-around{ + align-content: space-around; } .items-center{ align-items: center; @@ -2487,9 +2393,6 @@ .justify-self-end{ justify-self: end; } - .overflow-auto{ - overflow: auto; - } .overflow-hidden{ overflow: hidden; } @@ -2848,2064 +2751,2163 @@ .duration-300{ transition-duration: 300ms; } - .ease-in{ - transition-timing-function: cubic-bezier(0.4, 0, 1, 1); + .ease-in{ + transition-timing-function: cubic-bezier(0.4, 0, 1, 1); + } + .ease-in-out{ + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + } + .ease-out{ + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); + } + .content-\[\'\'\]{ + --tw-content: ''; + content: var(--tw-content); + } +} + +:root { + --fg-color: #000; + --bg-color: #fff; + --comfy-menu-bg: #353535; + --comfy-menu-secondary-bg: #292929; + --comfy-input-bg: #222; + --input-text: #ddd; + --descrip-text: #999; + --drag-text: #ccc; + --error-text: #ff4444; + --border-color: #4e4e4e; + --tr-even-bg-color: #222; + --tr-odd-bg-color: #353535; + --primary-bg: #236692; + --primary-fg: #ffffff; + --primary-hover-bg: #3485bb; + --primary-hover-fg: #ffffff; + --content-bg: #e0e0e0; + --content-fg: #000; + --content-hover-bg: #adadad; + --content-hover-fg: #000; +} + +@media (prefers-color-scheme: dark) { + :root { + --fg-color: #fff; + --bg-color: #202020; + --content-bg: #4e4e4e; + --content-fg: #fff; + --content-hover-bg: #222; + --content-hover-fg: #fff; + } +} + +body { + width: 100vw; + height: 100vh; + margin: 0; + overflow: hidden; + grid-template-columns: auto 1fr auto; + grid-template-rows: auto 1fr auto; + background: var(--bg-color) var(--bg-img); + color: var(--fg-color); + min-height: -webkit-fill-available; + max-height: -webkit-fill-available; + min-width: -webkit-fill-available; + max-width: -webkit-fill-available; + font-family: Arial, sans-serif; +} + +/** + +------------------+------------------+------------------+ + | | + | .comfyui-body- | + | top | + | (spans all cols) | + | | + +------------------+------------------+------------------+ + | | | | + | .comfyui-body- | #graph-canvas | .comfyui-body- | + | left | | right | + | | | | + | | | | + +------------------+------------------+------------------+ + | | + | .comfyui-body- | + | bottom | + | (spans all cols) | + | | + +------------------+------------------+------------------+ +*/ + +.comfyui-body-top { + order: -5; + /* Span across all columns */ + grid-column: 1/-1; + /* Position at the first row */ + grid-row: 1; + /* Top menu bar dropdown needs to be above of graph canvas splitter overlay which is z-index: 999 */ + /* Top menu bar z-index needs to be higher than bottom menu bar z-index as by default + pysssss's image feed is located at body-bottom, and it can overlap with the queue button, which + is located in body-top. */ + z-index: 1001; + display: flex; + flex-direction: column; +} + +.comfyui-body-left { + order: -4; + /* Position in the first column */ + grid-column: 1; + /* Position below the top element */ + grid-row: 2; + z-index: 10; + display: flex; +} + +.graph-canvas-container { + width: 100%; + height: 100%; + order: -3; + grid-column: 2; + grid-row: 2; + position: relative; + overflow: hidden; +} + +#graph-canvas { + width: 100%; + height: 100%; + touch-action: none; +} + +.comfyui-body-right { + order: -2; + z-index: 10; + grid-column: 3; + grid-row: 2; +} + +.comfyui-body-bottom { + order: 4; + /* Span across all columns */ + grid-column: 1/-1; + grid-row: 3; + /* Bottom menu bar dropdown needs to be above of graph canvas splitter overlay which is z-index: 999 */ + z-index: 1000; + display: flex; + flex-direction: column; +} + +.comfy-multiline-input { + background-color: var(--comfy-input-bg); + color: var(--input-text); + overflow: hidden; + overflow-y: auto; + padding: 2px; + resize: none; + border: none; + box-sizing: border-box; + font-size: var(--comfy-textarea-font-size); +} + +.comfy-markdown { + /* We assign the textarea and the Tiptap editor to the same CSS grid area to stack them on top of one another. */ + display: grid; +} + +.comfy-markdown > textarea { + grid-area: 1 / 1 / 2 / 2; +} + +.comfy-markdown .tiptap { + grid-area: 1 / 1 / 2 / 2; + background-color: var(--comfy-input-bg); + color: var(--input-text); + overflow: hidden; + overflow-y: auto; + resize: none; + border: none; + box-sizing: border-box; + font-size: var(--comfy-textarea-font-size); + height: 100%; + padding: 0.5em; +} + +.comfy-markdown.editing .tiptap { + display: none; +} + +.comfy-markdown .tiptap :first-child { + margin-top: 0; +} + +.comfy-markdown .tiptap :last-child { + margin-bottom: 0; +} + +.comfy-markdown .tiptap blockquote { + border-left: medium solid; + margin-left: 1em; + padding-left: 0.5em; +} + +.comfy-markdown .tiptap pre { + border: thin dotted; + border-radius: 0.5em; + margin: 0.5em; + padding: 0.5em; +} + +.comfy-markdown .tiptap table { + border-collapse: collapse; +} + +.comfy-markdown .tiptap th { + text-align: left; + background: var(--comfy-menu-bg); +} + +.comfy-markdown .tiptap th, +.comfy-markdown .tiptap td { + padding: 0.5em; + border: thin solid; +} + +.comfy-modal { + display: none; /* Hidden by default */ + position: fixed; /* Stay in place */ + z-index: 100; /* Sit on top */ + padding: 30px 30px 10px 30px; + background-color: var(--comfy-menu-bg); /* Modal background */ + color: var(--error-text); + box-shadow: 0 0 20px #888888; + border-radius: 10px; + top: 50%; + left: 50%; + max-width: 80vw; + max-height: 80vh; + transform: translate(-50%, -50%); + overflow: hidden; + justify-content: center; + font-family: monospace; + font-size: 15px; +} + +.comfy-modal-content { + display: flex; + flex-direction: column; +} + +.comfy-modal p { + overflow: auto; + white-space: pre-line; /* This will respect line breaks */ + margin-bottom: 20px; /* Add some margin between the text and the close button*/ +} + +.comfy-modal select, +.comfy-modal input[type='button'], +.comfy-modal input[type='checkbox'] { + margin: 3px 3px 3px 4px; +} + +.comfy-menu { + font-size: 15px; + position: absolute; + top: 50%; + right: 0; + text-align: center; + z-index: 999; + width: 190px; + display: flex; + flex-direction: column; + align-items: center; + color: var(--descrip-text); + background-color: var(--comfy-menu-bg); + font-family: sans-serif; + padding: 10px; + border-radius: 0 8px 8px 8px; + box-shadow: 3px 3px 8px rgba(0, 0, 0, 0.4); +} + +.comfy-menu-header { + display: flex; +} + +.comfy-menu-actions { + display: flex; + gap: 3px; + align-items: center; + height: 20px; + position: relative; + top: -1px; + font-size: 22px; +} + +.comfy-menu .comfy-menu-actions button { + background-color: rgba(0, 0, 0, 0); + padding: 0; + border: none; + cursor: pointer; + font-size: inherit; +} + +.comfy-menu .comfy-menu-actions .comfy-settings-btn { + font-size: 0.6em; +} + +button.comfy-close-menu-btn { + font-size: 1em; + line-height: 12px; + color: #ccc; + position: relative; + top: -1px; +} + +.comfy-menu-queue-size { + flex: auto; +} + +.comfy-menu button, +.comfy-modal button { + font-size: 20px; +} + +.comfy-menu-btns { + margin-bottom: 10px; + width: 100%; +} + +.comfy-menu-btns button { + font-size: 10px; + width: 50%; + color: var(--descrip-text) !important; +} + +.comfy-menu > button { + width: 100%; +} + +.comfy-btn, +.comfy-menu > button, +.comfy-menu-btns button, +.comfy-menu .comfy-list button, +.comfy-modal button { + color: var(--input-text); + background-color: var(--comfy-input-bg); + border-radius: 8px; + border-color: var(--border-color); + border-style: solid; + margin-top: 2px; +} + +.comfy-btn:hover:not(:disabled), +.comfy-menu > button:hover, +.comfy-menu-btns button:hover, +.comfy-menu .comfy-list button:hover, +.comfy-modal button:hover, +.comfy-menu-actions button:hover { + filter: brightness(1.2); + will-change: transform; + cursor: pointer; +} + +span.drag-handle { + width: 10px; + height: 20px; + display: inline-block; + overflow: hidden; + line-height: 5px; + padding: 3px 4px; + cursor: move; + vertical-align: middle; + margin-top: -0.4em; + margin-left: -0.2em; + font-size: 12px; + font-family: sans-serif; + letter-spacing: 2px; + color: var(--drag-text); + text-shadow: 1px 0 1px black; + touch-action: none; +} + +span.drag-handle::after { + content: '.. .. ..'; +} + +.comfy-queue-btn { + width: 100%; +} + +.comfy-list { + color: var(--descrip-text); + background-color: var(--comfy-menu-bg); + margin-bottom: 10px; + border-color: var(--border-color); + border-style: solid; +} + +.comfy-list-items { + overflow-y: scroll; + max-height: 100px; + min-height: 25px; + background-color: var(--comfy-input-bg); + padding: 5px; +} + +.comfy-list h4 { + min-width: 160px; + margin: 0; + padding: 3px; + font-weight: normal; +} + +.comfy-list-items button { + font-size: 10px; +} + +.comfy-list-actions { + margin: 5px; + display: flex; + gap: 5px; + justify-content: center; +} + +.comfy-list-actions button { + font-size: 12px; +} + +button.comfy-queue-btn { + margin: 6px 0 !important; +} + +.comfy-modal.comfy-settings, +.comfy-modal.comfy-manage-templates { + text-align: center; + font-family: sans-serif; + color: var(--descrip-text); + z-index: 99; +} + +.comfy-modal.comfy-settings input[type='range'] { + vertical-align: middle; +} + +.comfy-modal.comfy-settings input[type='range'] + input[type='number'] { + width: 3.5em; +} + +.comfy-modal input, +.comfy-modal select { + color: var(--input-text); + background-color: var(--comfy-input-bg); + border-radius: 8px; + border-color: var(--border-color); + border-style: solid; + font-size: inherit; +} + +.comfy-tooltip-indicator { + text-decoration: underline; + text-decoration-style: dashed; +} + +@media only screen and (max-height: 850px) { + .comfy-menu { + top: 0 !important; + bottom: 0 !important; + left: auto !important; + right: 0 !important; + border-radius: 0; + } + + .comfy-menu span.drag-handle { + display: none; } - .ease-in-out{ - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + + .comfy-menu-queue-size { + flex: unset; } - .ease-out{ - transition-timing-function: cubic-bezier(0, 0, 0.2, 1); + + .comfy-menu-header { + justify-content: space-between; } - .content-\[\'\'\]{ - --tw-content: ''; - content: var(--tw-content); + .comfy-menu-actions { + gap: 10px; + font-size: 28px; } } -:root { - --fg-color: #000; - --bg-color: #fff; - --comfy-menu-bg: #353535; - --comfy-menu-secondary-bg: #292929; - --comfy-input-bg: #222; - --input-text: #ddd; - --descrip-text: #999; - --drag-text: #ccc; - --error-text: #ff4444; - --border-color: #4e4e4e; - --tr-even-bg-color: #222; - --tr-odd-bg-color: #353535; - --primary-bg: #236692; - --primary-fg: #ffffff; - --primary-hover-bg: #3485bb; - --primary-hover-fg: #ffffff; - --content-bg: #e0e0e0; - --content-fg: #000; - --content-hover-bg: #adadad; - --content-hover-fg: #000; +/* Input popup */ + +.graphdialog { + min-height: 1em; + background-color: var(--comfy-menu-bg); } -@media (prefers-color-scheme: dark) { - :root { - --fg-color: #fff; - --bg-color: #202020; - --content-bg: #4e4e4e; - --content-fg: #fff; - --content-hover-bg: #222; - --content-hover-fg: #fff; - } +.graphdialog .name { + font-size: 14px; + font-family: sans-serif; + color: var(--descrip-text); } -body { - width: 100vw; - height: 100vh; - margin: 0; - overflow: hidden; - grid-template-columns: auto 1fr auto; - grid-template-rows: auto 1fr auto; - background: var(--bg-color) var(--bg-img); - color: var(--fg-color); - min-height: -webkit-fill-available; - max-height: -webkit-fill-available; - min-width: -webkit-fill-available; - max-width: -webkit-fill-available; +.graphdialog button { + margin-top: unset; + vertical-align: unset; + height: 1.6em; + padding-right: 8px; +} + +.graphdialog input, +.graphdialog textarea, +.graphdialog select { + background-color: var(--comfy-input-bg); + border: 2px solid; + border-color: var(--border-color); + color: var(--input-text); + border-radius: 12px 0 0 12px; +} + +/* Dialogs */ + +dialog { + box-shadow: 0 0 20px #888888; +} + +dialog::backdrop { + background: rgba(0, 0, 0, 0.5); +} + +.comfy-dialog.comfyui-dialog.comfy-modal { + top: 0; + left: 0; + right: 0; + bottom: 0; + transform: none; +} + +.comfy-dialog.comfy-modal { font-family: Arial, sans-serif; + border-color: var(--bg-color); + box-shadow: none; + border: 2px solid var(--border-color); } -/** - +------------------+------------------+------------------+ - | | - | .comfyui-body- | - | top | - | (spans all cols) | - | | - +------------------+------------------+------------------+ - | | | | - | .comfyui-body- | #graph-canvas | .comfyui-body- | - | left | | right | - | | | | - | | | | - +------------------+------------------+------------------+ - | | - | .comfyui-body- | - | bottom | - | (spans all cols) | - | | - +------------------+------------------+------------------+ -*/ +.comfy-dialog .comfy-modal-content { + flex-direction: row; + flex-wrap: wrap; + gap: 10px; + color: var(--fg-color); +} -.comfyui-body-top { - order: -5; - /* Span across all columns */ - grid-column: 1/-1; - /* Position at the first row */ - grid-row: 1; - /* Top menu bar dropdown needs to be above of graph canvas splitter overlay which is z-index: 999 */ - /* Top menu bar z-index needs to be higher than bottom menu bar z-index as by default - pysssss's image feed is located at body-bottom, and it can overlap with the queue button, which - is located in body-top. */ - z-index: 1001; - display: flex; - flex-direction: column; +.comfy-dialog .comfy-modal-content h3 { + margin-top: 0; +} + +.comfy-dialog .comfy-modal-content > p { + width: 100%; +} + +.comfy-dialog .comfy-modal-content > .comfyui-button { + flex: 1; + justify-content: center; +} + +#comfy-settings-dialog { + padding: 0; + width: 41rem; +} + +#comfy-settings-dialog tr > td:first-child { + text-align: right; +} + +#comfy-settings-dialog tbody button, +#comfy-settings-dialog table > button { + background-color: var(--bg-color); + border: 1px var(--border-color) solid; + border-radius: 0; + color: var(--input-text); + font-size: 1rem; + padding: 0.5rem; +} + +#comfy-settings-dialog button:hover { + background-color: var(--tr-odd-bg-color); +} + +/* General CSS for tables */ + +.comfy-table { + border-collapse: collapse; + color: var(--input-text); + font-family: Arial, sans-serif; + width: 100%; } -.comfyui-body-left { - order: -4; - /* Position in the first column */ - grid-column: 1; - /* Position below the top element */ - grid-row: 2; - z-index: 10; - display: flex; +.comfy-table caption { + position: sticky; + top: 0; + background-color: var(--bg-color); + color: var(--input-text); + font-size: 1rem; + font-weight: bold; + padding: 8px; + text-align: center; + border-bottom: 1px solid var(--border-color); } -.graph-canvas-container { - width: 100%; +.comfy-table caption .comfy-btn { + position: absolute; + top: -2px; + right: 0; + bottom: 0; + cursor: pointer; + border: none; height: 100%; - order: -3; - grid-column: 2; - grid-row: 2; - position: relative; - overflow: hidden; + border-radius: 0; + aspect-ratio: 1/1; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + font-size: 20px; } -#graph-canvas { - width: 100%; - height: 100%; - touch-action: none; +.comfy-table caption .comfy-btn:focus { + outline: none; } -.comfyui-body-right { - order: -2; - z-index: 10; - grid-column: 3; - grid-row: 2; +.comfy-table tr:nth-child(even) { + background-color: var(--tr-even-bg-color); } -.comfyui-body-bottom { - order: 4; - /* Span across all columns */ - grid-column: 1/-1; - grid-row: 3; - /* Bottom menu bar dropdown needs to be above of graph canvas splitter overlay which is z-index: 999 */ - z-index: 1000; - display: flex; - flex-direction: column; +.comfy-table tr:nth-child(odd) { + background-color: var(--tr-odd-bg-color); } -.comfy-multiline-input { - background-color: var(--comfy-input-bg); - color: var(--input-text); - overflow: hidden; - overflow-y: auto; - padding: 2px; - resize: none; - border: none; - box-sizing: border-box; - font-size: var(--comfy-textarea-font-size); +.comfy-table td, +.comfy-table th { + border: 1px solid var(--border-color); + padding: 8px; } -.comfy-markdown { - /* We assign the textarea and the Tiptap editor to the same CSS grid area to stack them on top of one another. */ - display: grid; +/* Context menu */ + +.litegraph .dialog { + z-index: 1; + font-family: Arial, sans-serif; } -.comfy-markdown > textarea { - grid-area: 1 / 1 / 2 / 2; +.litegraph .litemenu-entry.has_submenu { + position: relative; + padding-right: 20px; } -.comfy-markdown .tiptap { - grid-area: 1 / 1 / 2 / 2; - background-color: var(--comfy-input-bg); - color: var(--input-text); - overflow: hidden; - overflow-y: auto; - resize: none; - border: none; - box-sizing: border-box; - font-size: var(--comfy-textarea-font-size); - height: 100%; - padding: 0.5em; +.litemenu-entry.has_submenu::after { + content: '>'; + position: absolute; + top: 0; + right: 2px; } -.comfy-markdown.editing .tiptap { - display: none; +.litegraph.litecontextmenu, +.litegraph.litecontextmenu.dark { + z-index: 9999 !important; + background-color: var(--comfy-menu-bg) !important; } -.comfy-markdown .tiptap :first-child { - margin-top: 0; +.litegraph.litecontextmenu + .litemenu-entry:hover:not(.disabled):not(.separator) { + background-color: var(--comfy-menu-hover-bg, var(--border-color)) !important; + color: var(--fg-color); } -.comfy-markdown .tiptap :last-child { - margin-bottom: 0; +.litegraph.litecontextmenu .litemenu-entry.submenu, +.litegraph.litecontextmenu.dark .litemenu-entry.submenu { + background-color: var(--comfy-menu-bg) !important; + color: var(--input-text); } -.comfy-markdown .tiptap blockquote { - border-left: medium solid; - margin-left: 1em; - padding-left: 0.5em; +.litegraph.litecontextmenu input { + background-color: var(--comfy-input-bg) !important; + color: var(--input-text) !important; } -.comfy-markdown .tiptap pre { - border: thin dotted; - border-radius: 0.5em; - margin: 0.5em; - padding: 0.5em; +.comfy-context-menu-filter { + box-sizing: border-box; + border: 1px solid #999; + margin: 0 0 5px 5px; + width: calc(100% - 10px); } -.comfy-markdown .tiptap table { - border-collapse: collapse; +.comfy-img-preview { + pointer-events: none; + overflow: hidden; + display: flex; + flex-wrap: wrap; + align-content: flex-start; + justify-content: center; } -.comfy-markdown .tiptap th { - text-align: left; - background: var(--comfy-menu-bg); +.comfy-img-preview img { + -o-object-fit: contain; + object-fit: contain; + width: var(--comfy-img-preview-width); + height: var(--comfy-img-preview-height); } -.comfy-markdown .tiptap th, -.comfy-markdown .tiptap td { - padding: 0.5em; - border: thin solid; +.comfy-missing-nodes li button { + font-size: 12px; + margin-left: 5px; } -.comfy-modal { - display: none; /* Hidden by default */ - position: fixed; /* Stay in place */ - z-index: 100; /* Sit on top */ - padding: 30px 30px 10px 30px; - background-color: var(--comfy-menu-bg); /* Modal background */ - color: var(--error-text); - box-shadow: 0 0 20px #888888; - border-radius: 10px; - top: 50%; - left: 50%; - max-width: 80vw; - max-height: 80vh; - transform: translate(-50%, -50%); +/* Search box */ + +.litegraph.litesearchbox { + z-index: 9999 !important; + background-color: var(--comfy-menu-bg) !important; overflow: hidden; - justify-content: center; - font-family: monospace; - font-size: 15px; + display: block; } -.comfy-modal-content { - display: flex; - flex-direction: column; +.litegraph.litesearchbox input, +.litegraph.litesearchbox select { + background-color: var(--comfy-input-bg) !important; + color: var(--input-text); } -.comfy-modal p { - overflow: auto; - white-space: pre-line; /* This will respect line breaks */ - margin-bottom: 20px; /* Add some margin between the text and the close button*/ +.litegraph.lite-search-item { + color: var(--input-text); + background-color: var(--comfy-input-bg); + filter: brightness(80%); + will-change: transform; + padding-left: 0.2em; } -.comfy-modal select, -.comfy-modal input[type='button'], -.comfy-modal input[type='checkbox'] { - margin: 3px 3px 3px 4px; +.litegraph.lite-search-item.generic_type { + color: var(--input-text); + filter: brightness(50%); + will-change: transform; } -.comfy-menu { - font-size: 15px; - position: absolute; - top: 50%; - right: 0; - text-align: center; - z-index: 999; - width: 190px; - display: flex; - flex-direction: column; - align-items: center; - color: var(--descrip-text); - background-color: var(--comfy-menu-bg); - font-family: sans-serif; - padding: 10px; - border-radius: 0 8px 8px 8px; - box-shadow: 3px 3px 8px rgba(0, 0, 0, 0.4); +@media only screen and (max-width: 450px) { + #comfy-settings-dialog .comfy-table tbody { + display: grid; + } + #comfy-settings-dialog .comfy-table tr { + display: grid; + } + #comfy-settings-dialog tr > td:first-child { + text-align: center; + border-bottom: none; + padding-bottom: 0; + } + #comfy-settings-dialog tr > td:not(:first-child) { + text-align: center; + border-top: none; + } +} + +audio.comfy-audio.empty-audio-widget { + display: none; } -.comfy-menu-header { - display: flex; +#vue-app { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; } -.comfy-menu-actions { - display: flex; - gap: 3px; - align-items: center; - height: 20px; - position: relative; - top: -1px; - font-size: 22px; +/* Set auto complete panel's width as it is not accessible within vue-root */ +.p-autocomplete-overlay { + max-width: 25vw; } -.comfy-menu .comfy-menu-actions button { - background-color: rgba(0, 0, 0, 0); - padding: 0; - border: none; - cursor: pointer; - font-size: inherit; +.p-tree-node-content { + padding: var(--comfy-tree-explorer-item-padding) !important; } -.comfy-menu .comfy-menu-actions .comfy-settings-btn { - font-size: 0.6em; +.hover\:bg-neutral-700:hover{ + --tw-bg-opacity: 1; + background-color: rgb(64 64 64 / var(--tw-bg-opacity)); } -button.comfy-close-menu-btn { - font-size: 1em; - line-height: 12px; - color: #ccc; - position: relative; - top: -1px; +.hover\:bg-opacity-75:hover{ + --tw-bg-opacity: 0.75; } -.comfy-menu-queue-size { - flex: auto; +.hover\:text-blue-300:hover{ + --tw-text-opacity: 1; + color: rgb(144 205 244 / var(--tw-text-opacity)); } -.comfy-menu button, -.comfy-modal button { - font-size: 20px; +.hover\:opacity-100:hover{ + opacity: 1; } -.comfy-menu-btns { - margin-bottom: 10px; - width: 100%; +@media (min-width: 768px){ + + .md\:flex{ + display: flex; + } + + .md\:hidden{ + display: none; + } } -.comfy-menu-btns button { - font-size: 10px; - width: 50%; - color: var(--descrip-text) !important; +@media (min-width: 1536px){ + + .\32xl\:mx-4{ + margin-left: 1rem; + margin-right: 1rem; + } + + .\32xl\:mt-\[20vh\]{ + margin-top: 20vh; + } + + .\32xl\:w-64{ + width: 16rem; + } + + .\32xl\:max-w-full{ + max-width: 100%; + } + + .\32xl\:p-4{ + padding: 1rem; + } + + .\32xl\:p-\[var\(--p-dialog-content-padding\)\]{ + padding: var(--p-dialog-content-padding); + } + + .\32xl\:p-\[var\(--p-dialog-header-padding\)\]{ + padding: var(--p-dialog-header-padding); + } + + .\32xl\:px-4{ + padding-left: 1rem; + padding-right: 1rem; + } } -.comfy-menu > button { - width: 100%; +@media (prefers-color-scheme: dark){ + + .dark\:bg-gray-800{ + --tw-bg-opacity: 1; + background-color: rgb(45 55 72 / var(--tw-bg-opacity)); + } +} +@font-face { + font-family: 'primeicons'; + font-display: block; + src: url('./primeicons-DMOk5skT.eot'); + src: url('./primeicons-DMOk5skT.eot?#iefix') format('embedded-opentype'), url('./primeicons-C6QP2o4f.woff2') format('woff2'), url('./primeicons-WjwUDZjB.woff') format('woff'), url('./primeicons-MpK4pl85.ttf') format('truetype'), url('./primeicons-Dr5RGzOO.svg?#primeicons') format('svg'); + font-weight: normal; + font-style: normal; } -.comfy-btn, -.comfy-menu > button, -.comfy-menu-btns button, -.comfy-menu .comfy-list button, -.comfy-modal button { - color: var(--input-text); - background-color: var(--comfy-input-bg); - border-radius: 8px; - border-color: var(--border-color); - border-style: solid; - margin-top: 2px; +.pi { + font-family: 'primeicons'; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + display: inline-block; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } -.comfy-btn:hover:not(:disabled), -.comfy-menu > button:hover, -.comfy-menu-btns button:hover, -.comfy-menu .comfy-list button:hover, -.comfy-modal button:hover, -.comfy-menu-actions button:hover { - filter: brightness(1.2); - will-change: transform; - cursor: pointer; +.pi:before { + --webkit-backface-visibility:hidden; + backface-visibility: hidden; } -span.drag-handle { - width: 10px; - height: 20px; - display: inline-block; - overflow: hidden; - line-height: 5px; - padding: 3px 4px; - cursor: move; - vertical-align: middle; - margin-top: -0.4em; - margin-left: -0.2em; - font-size: 12px; - font-family: sans-serif; - letter-spacing: 2px; - color: var(--drag-text); - text-shadow: 1px 0 1px black; - touch-action: none; +.pi-fw { + width: 1.28571429em; + text-align: center; } -span.drag-handle::after { - content: '.. .. ..'; +.pi-spin { + animation: fa-spin 2s infinite linear; } -.comfy-queue-btn { - width: 100%; +@media (prefers-reduced-motion: reduce) { + .pi-spin { + animation-delay: -1ms; + animation-duration: 1ms; + animation-iteration-count: 1; + transition-delay: 0s; + transition-duration: 0s; + } } -.comfy-list { - color: var(--descrip-text); - background-color: var(--comfy-menu-bg); - margin-bottom: 10px; - border-color: var(--border-color); - border-style: solid; +@keyframes fa-spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(359deg); + } } -.comfy-list-items { - overflow-y: scroll; - max-height: 100px; - min-height: 25px; - background-color: var(--comfy-input-bg); - padding: 5px; +.pi-folder-plus:before { + content: "\ea05"; } -.comfy-list h4 { - min-width: 160px; - margin: 0; - padding: 3px; - font-weight: normal; +.pi-receipt:before { + content: "\ea06"; } -.comfy-list-items button { - font-size: 10px; +.pi-asterisk:before { + content: "\ea07"; } -.comfy-list-actions { - margin: 5px; - display: flex; - gap: 5px; - justify-content: center; +.pi-face-smile:before { + content: "\ea08"; } -.comfy-list-actions button { - font-size: 12px; +.pi-pinterest:before { + content: "\ea09"; } -button.comfy-queue-btn { - margin: 6px 0 !important; +.pi-expand:before { + content: "\ea0a"; } -.comfy-modal.comfy-settings, -.comfy-modal.comfy-manage-templates { - text-align: center; - font-family: sans-serif; - color: var(--descrip-text); - z-index: 99; +.pi-pen-to-square:before { + content: "\ea0b"; } -.comfy-modal.comfy-settings input[type='range'] { - vertical-align: middle; +.pi-wave-pulse:before { + content: "\ea0c"; } -.comfy-modal.comfy-settings input[type='range'] + input[type='number'] { - width: 3.5em; +.pi-turkish-lira:before { + content: "\ea0d"; +} + +.pi-spinner-dotted:before { + content: "\ea0e"; +} + +.pi-crown:before { + content: "\ea0f"; } -.comfy-modal input, -.comfy-modal select { - color: var(--input-text); - background-color: var(--comfy-input-bg); - border-radius: 8px; - border-color: var(--border-color); - border-style: solid; - font-size: inherit; +.pi-pause-circle:before { + content: "\ea10"; } -.comfy-tooltip-indicator { - text-decoration: underline; - text-decoration-style: dashed; +.pi-warehouse:before { + content: "\ea11"; } -@media only screen and (max-height: 850px) { - .comfy-menu { - top: 0 !important; - bottom: 0 !important; - left: auto !important; - right: 0 !important; - border-radius: 0; - } - - .comfy-menu span.drag-handle { - display: none; - } +.pi-objects-column:before { + content: "\ea12"; +} - .comfy-menu-queue-size { - flex: unset; - } +.pi-clipboard:before { + content: "\ea13"; +} - .comfy-menu-header { - justify-content: space-between; - } - .comfy-menu-actions { - gap: 10px; - font-size: 28px; - } +.pi-play-circle:before { + content: "\ea14"; } -/* Input popup */ +.pi-venus:before { + content: "\ea15"; +} -.graphdialog { - min-height: 1em; - background-color: var(--comfy-menu-bg); +.pi-cart-minus:before { + content: "\ea16"; } -.graphdialog .name { - font-size: 14px; - font-family: sans-serif; - color: var(--descrip-text); +.pi-file-plus:before { + content: "\ea17"; } -.graphdialog button { - margin-top: unset; - vertical-align: unset; - height: 1.6em; - padding-right: 8px; +.pi-microchip:before { + content: "\ea18"; } -.graphdialog input, -.graphdialog textarea, -.graphdialog select { - background-color: var(--comfy-input-bg); - border: 2px solid; - border-color: var(--border-color); - color: var(--input-text); - border-radius: 12px 0 0 12px; +.pi-twitch:before { + content: "\ea19"; } -/* Dialogs */ +.pi-building-columns:before { + content: "\ea1a"; +} -dialog { - box-shadow: 0 0 20px #888888; +.pi-file-check:before { + content: "\ea1b"; } -dialog::backdrop { - background: rgba(0, 0, 0, 0.5); +.pi-microchip-ai:before { + content: "\ea1c"; } -.comfy-dialog.comfyui-dialog.comfy-modal { - top: 0; - left: 0; - right: 0; - bottom: 0; - transform: none; +.pi-trophy:before { + content: "\ea1d"; } -.comfy-dialog.comfy-modal { - font-family: Arial, sans-serif; - border-color: var(--bg-color); - box-shadow: none; - border: 2px solid var(--border-color); +.pi-barcode:before { + content: "\ea1e"; } -.comfy-dialog .comfy-modal-content { - flex-direction: row; - flex-wrap: wrap; - gap: 10px; - color: var(--fg-color); +.pi-file-arrow-up:before { + content: "\ea1f"; } -.comfy-dialog .comfy-modal-content h3 { - margin-top: 0; +.pi-mars:before { + content: "\ea20"; } -.comfy-dialog .comfy-modal-content > p { - width: 100%; +.pi-tiktok:before { + content: "\ea21"; } -.comfy-dialog .comfy-modal-content > .comfyui-button { - flex: 1; - justify-content: center; +.pi-arrow-up-right-and-arrow-down-left-from-center:before { + content: "\ea22"; } -#comfy-settings-dialog { - padding: 0; - width: 41rem; +.pi-ethereum:before { + content: "\ea23"; } -#comfy-settings-dialog tr > td:first-child { - text-align: right; +.pi-list-check:before { + content: "\ea24"; } -#comfy-settings-dialog tbody button, -#comfy-settings-dialog table > button { - background-color: var(--bg-color); - border: 1px var(--border-color) solid; - border-radius: 0; - color: var(--input-text); - font-size: 1rem; - padding: 0.5rem; +.pi-thumbtack:before { + content: "\ea25"; } -#comfy-settings-dialog button:hover { - background-color: var(--tr-odd-bg-color); +.pi-arrow-down-left-and-arrow-up-right-to-center:before { + content: "\ea26"; } -/* General CSS for tables */ +.pi-equals:before { + content: "\ea27"; +} -.comfy-table { - border-collapse: collapse; - color: var(--input-text); - font-family: Arial, sans-serif; - width: 100%; +.pi-lightbulb:before { + content: "\ea28"; } -.comfy-table caption { - position: sticky; - top: 0; - background-color: var(--bg-color); - color: var(--input-text); - font-size: 1rem; - font-weight: bold; - padding: 8px; - text-align: center; - border-bottom: 1px solid var(--border-color); +.pi-star-half:before { + content: "\ea29"; } -.comfy-table caption .comfy-btn { - position: absolute; - top: -2px; - right: 0; - bottom: 0; - cursor: pointer; - border: none; - height: 100%; - border-radius: 0; - aspect-ratio: 1/1; - -webkit-user-select: none; - -moz-user-select: none; - user-select: none; - font-size: 20px; +.pi-address-book:before { + content: "\ea2a"; } -.comfy-table caption .comfy-btn:focus { - outline: none; +.pi-chart-scatter:before { + content: "\ea2b"; } -.comfy-table tr:nth-child(even) { - background-color: var(--tr-even-bg-color); +.pi-indian-rupee:before { + content: "\ea2c"; } -.comfy-table tr:nth-child(odd) { - background-color: var(--tr-odd-bg-color); +.pi-star-half-fill:before { + content: "\ea2d"; } -.comfy-table td, -.comfy-table th { - border: 1px solid var(--border-color); - padding: 8px; +.pi-cart-arrow-down:before { + content: "\ea2e"; } -/* Context menu */ +.pi-calendar-clock:before { + content: "\ea2f"; +} -.litegraph .dialog { - z-index: 1; - font-family: Arial, sans-serif; +.pi-sort-up-fill:before { + content: "\ea30"; } -.litegraph .litemenu-entry.has_submenu { - position: relative; - padding-right: 20px; +.pi-sparkles:before { + content: "\ea31"; } -.litemenu-entry.has_submenu::after { - content: '>'; - position: absolute; - top: 0; - right: 2px; +.pi-bullseye:before { + content: "\ea32"; } -.litegraph.litecontextmenu, -.litegraph.litecontextmenu.dark { - z-index: 9999 !important; - background-color: var(--comfy-menu-bg) !important; +.pi-sort-down-fill:before { + content: "\ea33"; } -.litegraph.litecontextmenu - .litemenu-entry:hover:not(.disabled):not(.separator) { - background-color: var(--comfy-menu-hover-bg, var(--border-color)) !important; - color: var(--fg-color); +.pi-graduation-cap:before { + content: "\ea34"; } -.litegraph.litecontextmenu .litemenu-entry.submenu, -.litegraph.litecontextmenu.dark .litemenu-entry.submenu { - background-color: var(--comfy-menu-bg) !important; - color: var(--input-text); +.pi-hammer:before { + content: "\ea35"; } -.litegraph.litecontextmenu input { - background-color: var(--comfy-input-bg) !important; - color: var(--input-text) !important; +.pi-bell-slash:before { + content: "\ea36"; } -.comfy-context-menu-filter { - box-sizing: border-box; - border: 1px solid #999; - margin: 0 0 5px 5px; - width: calc(100% - 10px); +.pi-gauge:before { + content: "\ea37"; } -.comfy-img-preview { - pointer-events: none; - overflow: hidden; - display: flex; - flex-wrap: wrap; - align-content: flex-start; - justify-content: center; +.pi-shop:before { + content: "\ea38"; } -.comfy-img-preview img { - -o-object-fit: contain; - object-fit: contain; - width: var(--comfy-img-preview-width); - height: var(--comfy-img-preview-height); +.pi-headphones:before { + content: "\ea39"; } -.comfy-missing-nodes li button { - font-size: 12px; - margin-left: 5px; +.pi-eraser:before { + content: "\ea04"; } -/* Search box */ +.pi-stopwatch:before { + content: "\ea01"; +} -.litegraph.litesearchbox { - z-index: 9999 !important; - background-color: var(--comfy-menu-bg) !important; - overflow: hidden; - display: block; +.pi-verified:before { + content: "\ea02"; } -.litegraph.litesearchbox input, -.litegraph.litesearchbox select { - background-color: var(--comfy-input-bg) !important; - color: var(--input-text); +.pi-delete-left:before { + content: "\ea03"; } -.litegraph.lite-search-item { - color: var(--input-text); - background-color: var(--comfy-input-bg); - filter: brightness(80%); - will-change: transform; - padding-left: 0.2em; +.pi-hourglass:before { + content: "\e9fe"; } -.litegraph.lite-search-item.generic_type { - color: var(--input-text); - filter: brightness(50%); - will-change: transform; +.pi-truck:before { + content: "\ea00"; } -@media only screen and (max-width: 450px) { - #comfy-settings-dialog .comfy-table tbody { - display: grid; - } - #comfy-settings-dialog .comfy-table tr { - display: grid; - } - #comfy-settings-dialog tr > td:first-child { - text-align: center; - border-bottom: none; - padding-bottom: 0; - } - #comfy-settings-dialog tr > td:not(:first-child) { - text-align: center; - border-top: none; - } +.pi-wrench:before { + content: "\e9ff"; } -audio.comfy-audio.empty-audio-widget { - display: none; +.pi-microphone:before { + content: "\e9fa"; } -#vue-app { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - pointer-events: none; +.pi-megaphone:before { + content: "\e9fb"; } -/* Set auto complete panel's width as it is not accessible within vue-root */ -.p-autocomplete-overlay { - max-width: 25vw; +.pi-arrow-right-arrow-left:before { + content: "\e9fc"; } -.p-tree-node-content { - padding: var(--comfy-tree-explorer-item-padding) !important; +.pi-bitcoin:before { + content: "\e9fd"; } -.hover\:bg-neutral-700:hover{ - --tw-bg-opacity: 1; - background-color: rgb(64 64 64 / var(--tw-bg-opacity)); +.pi-file-edit:before { + content: "\e9f6"; } -.hover\:bg-opacity-75:hover{ - --tw-bg-opacity: 0.75; +.pi-language:before { + content: "\e9f7"; } -.hover\:text-blue-300:hover{ - --tw-text-opacity: 1; - color: rgb(144 205 244 / var(--tw-text-opacity)); +.pi-file-export:before { + content: "\e9f8"; } -.hover\:opacity-100:hover{ - opacity: 1; +.pi-file-import:before { + content: "\e9f9"; } -@media (min-width: 768px){ +.pi-file-word:before { + content: "\e9f1"; +} - .md\:flex{ - display: flex; - } +.pi-gift:before { + content: "\e9f2"; +} - .md\:hidden{ - display: none; - } +.pi-cart-plus:before { + content: "\e9f3"; } -@media (min-width: 1536px){ +.pi-thumbs-down-fill:before { + content: "\e9f4"; +} - .\32xl\:mx-4{ - margin-left: 1rem; - margin-right: 1rem; - } +.pi-thumbs-up-fill:before { + content: "\e9f5"; +} - .\32xl\:w-64{ - width: 16rem; - } +.pi-arrows-alt:before { + content: "\e9f0"; +} - .\32xl\:max-w-full{ - max-width: 100%; - } +.pi-calculator:before { + content: "\e9ef"; +} - .\32xl\:p-16{ - padding: 4rem; - } +.pi-sort-alt-slash:before { + content: "\e9ee"; +} - .\32xl\:p-4{ - padding: 1rem; - } +.pi-arrows-h:before { + content: "\e9ec"; +} - .\32xl\:p-\[var\(--p-dialog-content-padding\)\]{ - padding: var(--p-dialog-content-padding); - } +.pi-arrows-v:before { + content: "\e9ed"; +} - .\32xl\:p-\[var\(--p-dialog-header-padding\)\]{ - padding: var(--p-dialog-header-padding); - } +.pi-pound:before { + content: "\e9eb"; +} - .\32xl\:px-4{ - padding-left: 1rem; - padding-right: 1rem; - } +.pi-prime:before { + content: "\e9ea"; } -@media (prefers-color-scheme: dark){ +.pi-chart-pie:before { + content: "\e9e9"; +} - .dark\:bg-gray-800{ - --tw-bg-opacity: 1; - background-color: rgb(45 55 72 / var(--tw-bg-opacity)); - } +.pi-reddit:before { + content: "\e9e8"; } -.global-dialog .p-dialog-header { - padding: 0.5rem +.pi-code:before { + content: "\e9e7"; } -@media (min-width: 1536px) { -.global-dialog .p-dialog-header { - padding: var(--p-dialog-header-padding) + +.pi-sync:before { + content: "\e9e6"; } + +.pi-shopping-bag:before { + content: "\e9e5"; } -.global-dialog .p-dialog-header { - padding-bottom: 0px + +.pi-server:before { + content: "\e9e4"; } -.global-dialog .p-dialog-content { - padding: 0.5rem + +.pi-database:before { + content: "\e9e3"; } -@media (min-width: 1536px) { -.global-dialog .p-dialog-content { - padding: var(--p-dialog-content-padding) + +.pi-hashtag:before { + content: "\e9e2"; } + +.pi-bookmark-fill:before { + content: "\e9df"; } -.global-dialog .p-dialog-content { - padding-top: 0px + +.pi-filter-fill:before { + content: "\e9e0"; } -.prompt-dialog-content[data-v-3df70997] { - white-space: pre-wrap; +.pi-heart-fill:before { + content: "\e9e1"; } -.no-results-placeholder[data-v-f2b77816] .p-card { - background-color: var(--surface-ground); - text-align: center; - box-shadow: unset; +.pi-flag-fill:before { + content: "\e9de"; } -.no-results-placeholder h3[data-v-f2b77816] { - color: var(--text-color); - margin-bottom: 0.5rem; + +.pi-circle:before { + content: "\e9dc"; } -.no-results-placeholder p[data-v-f2b77816] { - color: var(--text-color-secondary); - margin-bottom: 1rem; + +.pi-circle-fill:before { + content: "\e9dd"; } -.comfy-error-report[data-v-ddf3e2da] { - display: flex; - flex-direction: column; - gap: 1rem; +.pi-bolt:before { + content: "\e9db"; } -.action-container[data-v-ddf3e2da] { - display: flex; - gap: 1rem; - justify-content: flex-end; + +.pi-history:before { + content: "\e9da"; +} + +.pi-box:before { + content: "\e9d9"; } -.wrapper-pre[data-v-ddf3e2da] { - white-space: pre-wrap; - word-wrap: break-word; + +.pi-at:before { + content: "\e9d8"; } -.comfy-missing-nodes[data-v-425cc3ac] { - max-height: 300px; - overflow-y: auto; +.pi-arrow-up-right:before { + content: "\e9d4"; } -.node-hint[data-v-425cc3ac] { - margin-left: 0.5rem; - font-style: italic; - color: var(--text-color-secondary); + +.pi-arrow-up-left:before { + content: "\e9d5"; } -[data-v-425cc3ac] .p-button { - margin-left: auto; + +.pi-arrow-down-left:before { + content: "\e9d6"; } -.comfy-missing-models[data-v-ebf9fccc] { - max-height: 300px; - overflow-y: auto; +.pi-arrow-down-right:before { + content: "\e9d7"; } -[data-v-53692f7e] .i-badge { +.pi-telegram:before { + content: "\e9d3"; +} - --tw-bg-opacity: 1; +.pi-stop-circle:before { + content: "\e9d2"; +} - background-color: rgb(150 206 76 / var(--tw-bg-opacity)); +.pi-stop:before { + content: "\e9d1"; +} - --tw-text-opacity: 1; +.pi-whatsapp:before { + content: "\e9d0"; +} - color: rgb(255 255 255 / var(--tw-text-opacity)) +.pi-building:before { + content: "\e9cf"; } -[data-v-53692f7e] .o-badge { - --tw-bg-opacity: 1; +.pi-qrcode:before { + content: "\e9ce"; +} - background-color: rgb(239 68 68 / var(--tw-bg-opacity)); +.pi-car:before { + content: "\e9cd"; +} - --tw-text-opacity: 1; +.pi-instagram:before { + content: "\e9cc"; +} - color: rgb(255 255 255 / var(--tw-text-opacity)) +.pi-linkedin:before { + content: "\e9cb"; } -[data-v-53692f7e] .c-badge { - --tw-bg-opacity: 1; +.pi-send:before { + content: "\e9ca"; +} - background-color: rgb(66 153 225 / var(--tw-bg-opacity)); +.pi-slack:before { + content: "\e9c9"; +} - --tw-text-opacity: 1; +.pi-sun:before { + content: "\e9c8"; +} - color: rgb(255 255 255 / var(--tw-text-opacity)) +.pi-moon:before { + content: "\e9c7"; } -[data-v-53692f7e] .s-badge { - --tw-bg-opacity: 1; +.pi-vimeo:before { + content: "\e9c6"; +} - background-color: rgb(234 179 8 / var(--tw-bg-opacity)) +.pi-youtube:before { + content: "\e9c5"; } -[data-v-ba13476b] .p-inputtext { - --p-form-field-padding-x: 0.625rem; +.pi-flag:before { + content: "\e9c4"; } -.p-button.p-inputicon[data-v-ba13476b] { - width: auto; - border-style: none; - padding: 0px; + +.pi-wallet:before { + content: "\e9c3"; } -.form-input[data-v-e4e3022d] .input-slider .p-inputnumber input, -.form-input[data-v-e4e3022d] .input-slider .slider-part { +.pi-map:before { + content: "\e9c2"; +} - width: 5rem +.pi-link:before { + content: "\e9c1"; } -.form-input[data-v-e4e3022d] .p-inputtext, -.form-input[data-v-e4e3022d] .p-select { - width: 11rem +.pi-credit-card:before { + content: "\e9bf"; } -.settings-tab-panels { - padding-top: 0px !important; +.pi-discord:before { + content: "\e9c0"; } -.settings-container[data-v-67f71ae9] { - display: flex; - height: 70vh; - width: 60vw; - max-width: 1024px; - overflow: hidden; +.pi-percentage:before { + content: "\e9be"; } -@media (max-width: 768px) { -.settings-container[data-v-67f71ae9] { - flex-direction: column; - height: auto; - width: 80vw; + +.pi-euro:before { + content: "\e9bd"; } -.settings-sidebar[data-v-67f71ae9] { - width: 100%; + +.pi-book:before { + content: "\e9ba"; } -.settings-content[data-v-67f71ae9] { - height: 350px; + +.pi-shield:before { + content: "\e9b9"; } + +.pi-paypal:before { + content: "\e9bb"; } -/* Show a separator line above the Keybinding tab */ -/* This indicates the start of custom setting panels */ -.settings-sidebar[data-v-67f71ae9] .p-listbox-option[aria-label='Keybinding'] { - position: relative; +.pi-amazon:before { + content: "\e9bc"; } -.settings-sidebar[data-v-67f71ae9] .p-listbox-option[aria-label='Keybinding']::before { - position: absolute; - top: 0px; - left: 0px; - width: 100%; - --tw-content: ''; - content: var(--tw-content); - border-top: 1px solid var(--p-divider-border-color); + +.pi-phone:before { + content: "\e9b8"; } -.pi-cog[data-v-43089afc] { - font-size: 1.25rem; - margin-right: 0.5rem; +.pi-filter-slash:before { + content: "\e9b7"; } -.version-tag[data-v-43089afc] { - margin-left: 0.5rem; + +.pi-facebook:before { + content: "\e9b4"; } -.p-card[data-v-d65acb9a] { - --p-card-body-padding: 10px 0 0 0; - overflow: hidden; +.pi-github:before { + content: "\e9b5"; } -[data-v-d65acb9a] .p-card-subtitle { - text-align: center; + +.pi-twitter:before { + content: "\e9b6"; } -.carousel[data-v-2d616ed7] { - width: 66vw; +.pi-step-backward-alt:before { + content: "\e9ac"; } -/** - * Copyright (c) 2014 The xterm.js authors. All rights reserved. - * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License) - * https://github.com/chjj/term.js - * @license MIT - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * Originally forked from (with the author's permission): - * Fabrice Bellard's javascript vt100 for jslinux: - * http://bellard.org/jslinux/ - * Copyright (c) 2011 Fabrice Bellard - * The original design remains. The terminal itself - * has been extended to include xterm CSI codes, among - * other features. - */ -/** - * Default styles for xterm.js - */ +.pi-step-forward-alt:before { + content: "\e9ad"; +} -.xterm { - cursor: text; - position: relative; - -moz-user-select: none; - user-select: none; - -ms-user-select: none; - -webkit-user-select: none; +.pi-forward:before { + content: "\e9ae"; } -.xterm.focus, -.xterm:focus { - outline: none; +.pi-backward:before { + content: "\e9af"; } -.xterm .xterm-helpers { - position: absolute; - top: 0; - /** - * The z-index of the helpers must be higher than the canvases in order for - * IMEs to appear on top. - */ - z-index: 5; +.pi-fast-backward:before { + content: "\e9b0"; } -.xterm .xterm-helper-textarea { - padding: 0; - border: 0; - margin: 0; - /* Move textarea out of the screen to the far left, so that the cursor is not visible */ - position: absolute; - opacity: 0; - left: -9999em; - top: 0; - width: 0; - height: 0; - z-index: -5; - /** Prevent wrapping so the IME appears against the textarea at the correct position */ - white-space: nowrap; - overflow: hidden; - resize: none; +.pi-fast-forward:before { + content: "\e9b1"; } -.xterm .composition-view { - /* TODO: Composition position got messed up somewhere */ - background: #000; - color: #FFF; - display: none; - position: absolute; - white-space: nowrap; - z-index: 1; +.pi-pause:before { + content: "\e9b2"; } -.xterm .composition-view.active { - display: block; +.pi-play:before { + content: "\e9b3"; +} + +.pi-compass:before { + content: "\e9ab"; } -.xterm .xterm-viewport { - /* On OS X this is required in order for the scroll bar to appear fully opaque */ - background-color: #000; - overflow-y: scroll; - cursor: default; - position: absolute; - right: 0; - left: 0; - top: 0; - bottom: 0; +.pi-id-card:before { + content: "\e9aa"; } -.xterm .xterm-screen { - position: relative; +.pi-ticket:before { + content: "\e9a9"; } -.xterm .xterm-screen canvas { - position: absolute; - left: 0; - top: 0; +.pi-file-o:before { + content: "\e9a8"; } -.xterm .xterm-scroll-area { - visibility: hidden; +.pi-reply:before { + content: "\e9a7"; } -.xterm-char-measure-element { - display: inline-block; - visibility: hidden; - position: absolute; - top: 0; - left: -9999em; - line-height: normal; +.pi-directions-alt:before { + content: "\e9a5"; } -.xterm.enable-mouse-events { - /* When mouse events are enabled (eg. tmux), revert to the standard pointer cursor */ - cursor: default; +.pi-directions:before { + content: "\e9a6"; } -.xterm.xterm-cursor-pointer, -.xterm .xterm-cursor-pointer { - cursor: pointer; +.pi-thumbs-up:before { + content: "\e9a3"; } -.xterm.column-select.focus { - /* Column selection mode */ - cursor: crosshair; +.pi-thumbs-down:before { + content: "\e9a4"; } -.xterm .xterm-accessibility:not(.debug), -.xterm .xterm-message { - position: absolute; - left: 0; - top: 0; - bottom: 0; - right: 0; - z-index: 10; - color: transparent; - pointer-events: none; +.pi-sort-numeric-down-alt:before { + content: "\e996"; } -.xterm .xterm-accessibility-tree:not(.debug) *::-moz-selection { - color: transparent; +.pi-sort-numeric-up-alt:before { + content: "\e997"; } -.xterm .xterm-accessibility-tree:not(.debug) *::selection { - color: transparent; +.pi-sort-alpha-down-alt:before { + content: "\e998"; } -.xterm .xterm-accessibility-tree { - -webkit-user-select: text; - -moz-user-select: text; - user-select: text; - white-space: pre; +.pi-sort-alpha-up-alt:before { + content: "\e999"; } -.xterm .live-region { - position: absolute; - left: -9999px; - width: 1px; - height: 1px; - overflow: hidden; +.pi-sort-numeric-down:before { + content: "\e99a"; } -.xterm-dim { - /* Dim should not apply to background, so the opacity of the foreground color is applied - * explicitly in the generated class and reset to 1 here */ - opacity: 1 !important; +.pi-sort-numeric-up:before { + content: "\e99b"; } -.xterm-underline-1 { text-decoration: underline; } -.xterm-underline-2 { -webkit-text-decoration: double underline; text-decoration: double underline; } -.xterm-underline-3 { -webkit-text-decoration: wavy underline; text-decoration: wavy underline; } -.xterm-underline-4 { -webkit-text-decoration: dotted underline; text-decoration: dotted underline; } -.xterm-underline-5 { -webkit-text-decoration: dashed underline; text-decoration: dashed underline; } - -.xterm-overline { - text-decoration: overline; +.pi-sort-alpha-down:before { + content: "\e99c"; } -.xterm-overline.xterm-underline-1 { text-decoration: overline underline; } -.xterm-overline.xterm-underline-2 { -webkit-text-decoration: overline double underline; text-decoration: overline double underline; } -.xterm-overline.xterm-underline-3 { -webkit-text-decoration: overline wavy underline; text-decoration: overline wavy underline; } -.xterm-overline.xterm-underline-4 { -webkit-text-decoration: overline dotted underline; text-decoration: overline dotted underline; } -.xterm-overline.xterm-underline-5 { -webkit-text-decoration: overline dashed underline; text-decoration: overline dashed underline; } +.pi-sort-alpha-up:before { + content: "\e99d"; +} -.xterm-strikethrough { - text-decoration: line-through; +.pi-sort-alt:before { + content: "\e99e"; } -.xterm-screen .xterm-decoration-container .xterm-decoration { - z-index: 6; - position: absolute; +.pi-sort-amount-up:before { + content: "\e99f"; } -.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer { - z-index: 7; +.pi-sort-amount-down:before { + content: "\e9a0"; } -.xterm-decoration-overview-ruler { - z-index: 8; - position: absolute; - top: 0; - right: 0; - pointer-events: none; +.pi-sort-amount-down-alt:before { + content: "\e9a1"; } -.xterm-decoration-top { - z-index: 2; - position: relative; +.pi-sort-amount-up-alt:before { + content: "\e9a2"; } -[data-v-250ab9af] .p-terminal .xterm { - overflow-x: auto; +.pi-palette:before { + content: "\e995"; } -[data-v-250ab9af] .p-terminal .xterm-screen { - background-color: black; - overflow-y: hidden; + +.pi-undo:before { + content: "\e994"; } -[data-v-6187144a] .p-terminal .xterm { - overflow-x: auto; +.pi-desktop:before { + content: "\e993"; } -[data-v-6187144a] .p-terminal .xterm-screen { - background-color: black; - overflow-y: hidden; + +.pi-sliders-v:before { + content: "\e991"; } -[data-v-b27b58f4] .p-terminal .xterm { - overflow-x: auto; +.pi-sliders-h:before { + content: "\e992"; } -[data-v-b27b58f4] .p-terminal .xterm-screen { - background-color: black; - overflow-y: hidden; + +.pi-search-plus:before { + content: "\e98f"; } -.mdi.rotate270::before { - transform: rotate(270deg); + +.pi-search-minus:before { + content: "\e990"; } -/* Generic */ -.comfyui-button { - display: flex; - align-items: center; - gap: 0.5em; - cursor: pointer; - border: none; - border-radius: 4px; - padding: 4px 8px; - box-sizing: border-box; - margin: 0; - transition: box-shadow 0.1s; +.pi-file-excel:before { + content: "\e98e"; } -.comfyui-button:active { - box-shadow: inset 1px 1px 10px rgba(0, 0, 0, 0.5); +.pi-file-pdf:before { + content: "\e98d"; } -.comfyui-button:disabled { - opacity: 0.5; - cursor: not-allowed; +.pi-check-square:before { + content: "\e98c"; } -.primary .comfyui-button, -.primary.comfyui-button { - background-color: var(--primary-bg) !important; - color: var(--primary-fg) !important; + +.pi-chart-line:before { + content: "\e98b"; } -.primary .comfyui-button:not(:disabled):hover, -.primary.comfyui-button:not(:disabled):hover { - background-color: var(--primary-hover-bg) !important; - color: var(--primary-hover-fg) !important; +.pi-user-edit:before { + content: "\e98a"; } -/* Popup */ -.comfyui-popup { - position: absolute; - left: var(--left); - right: var(--right); - top: var(--top); - bottom: var(--bottom); - z-index: 2000; - max-height: calc(100vh - var(--limit) - 10px); - box-shadow: 3px 3px 5px 0px rgba(0, 0, 0, 0.3); +.pi-exclamation-circle:before { + content: "\e989"; } -.comfyui-popup:not(.open) { - display: none; +.pi-android:before { + content: "\e985"; } -.comfyui-popup.right.open { - border-top-left-radius: 4px; - border-bottom-right-radius: 4px; - border-bottom-left-radius: 4px; - overflow: hidden; +.pi-google:before { + content: "\e986"; } -/* Split button */ -.comfyui-split-button { - position: relative; - display: flex; + +.pi-apple:before { + content: "\e987"; } -.comfyui-split-primary { - flex: auto; +.pi-microsoft:before { + content: "\e988"; } -.comfyui-split-primary .comfyui-button { - border-top-right-radius: 0; - border-bottom-right-radius: 0; - border-right: 1px solid var(--comfy-menu-bg); - width: 100%; +.pi-heart:before { + content: "\e984"; } -.comfyui-split-arrow .comfyui-button { - border-top-left-radius: 0; - border-bottom-left-radius: 0; - padding-left: 2px; - padding-right: 2px; +.pi-mobile:before { + content: "\e982"; } -.comfyui-split-button-popup { - white-space: nowrap; - background-color: var(--content-bg); - color: var(--content-fg); - display: flex; - flex-direction: column; - overflow: auto; +.pi-tablet:before { + content: "\e983"; } -.comfyui-split-button-popup.hover { - z-index: 2001; +.pi-key:before { + content: "\e981"; } -.comfyui-split-button-popup > .comfyui-button { - border: none; - background-color: transparent; - color: var(--fg-color); - padding: 8px 12px 8px 8px; + +.pi-shopping-cart:before { + content: "\e980"; } -.comfyui-split-button-popup > .comfyui-button:not(:disabled):hover { - background-color: var(--comfy-input-bg); +.pi-comments:before { + content: "\e97e"; } -/* Button group */ -.comfyui-button-group { - display: flex; - border-radius: 4px; - overflow: hidden; +.pi-comment:before { + content: "\e97f"; } -.comfyui-button-group:empty { - display: none; +.pi-briefcase:before { + content: "\e97d"; } -.comfyui-button-group > .comfyui-button, -.comfyui-button-group > .comfyui-button-wrapper > .comfyui-button { - padding: 4px 10px; - border-radius: 0; + +.pi-bell:before { + content: "\e97c"; } -/* Menu */ -.comfyui-menu .mdi::before { - font-size: 18px; +.pi-paperclip:before { + content: "\e97b"; } -.comfyui-menu .comfyui-button { - background: var(--comfy-input-bg); - color: var(--fg-color); - white-space: nowrap; +.pi-share-alt:before { + content: "\e97a"; } -.comfyui-menu .comfyui-button:not(:disabled):hover { - background: var(--border-color); - color: var(--content-fg); +.pi-envelope:before { + content: "\e979"; } -.comfyui-menu .comfyui-split-button-popup > .comfyui-button { - border-radius: 0; - background-color: transparent; +.pi-volume-down:before { + content: "\e976"; } -.comfyui-menu .comfyui-split-button-popup > .comfyui-button:not(:disabled):hover { - background-color: var(--comfy-input-bg); +.pi-volume-up:before { + content: "\e977"; } -.comfyui-menu .comfyui-split-button-popup.left { - border-top-right-radius: 4px; - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; +.pi-volume-off:before { + content: "\e978"; } -.comfyui-menu .comfyui-button.popup-open { - background-color: var(--content-bg); - color: var(--content-fg); +.pi-eject:before { + content: "\e975"; } -.comfyui-menu-push { - margin-left: -0.8em; - flex: auto; +.pi-money-bill:before { + content: "\e974"; } -/** Send to workflow widget selection dialog */ -.comfy-widget-selection-dialog { - border: none; +.pi-images:before { + content: "\e973"; } -.comfy-widget-selection-dialog div { - color: var(--fg-color); - font-family: Arial, Helvetica, sans-serif; +.pi-image:before { + content: "\e972"; } -.comfy-widget-selection-dialog h2 { - margin-top: 0; +.pi-sign-in:before { + content: "\e970"; } -.comfy-widget-selection-dialog section { - width: -moz-fit-content; - width: fit-content; - display: flex; - flex-direction: column; +.pi-sign-out:before { + content: "\e971"; } -.comfy-widget-selection-item { - display: flex; - gap: 10px; - align-items: center; +.pi-wifi:before { + content: "\e96f"; } -.comfy-widget-selection-item span { - margin-right: auto; +.pi-sitemap:before { + content: "\e96e"; } -.comfy-widget-selection-item span::before { - content: '#' attr(data-id); - opacity: 0.5; - margin-right: 5px; +.pi-chart-bar:before { + content: "\e96d"; } -.comfy-modal .comfy-widget-selection-item button { - font-size: 1em; +.pi-camera:before { + content: "\e96c"; } -/***** Responsive *****/ -.lg.comfyui-menu .lt-lg-show { - display: none !important; +.pi-dollar:before { + content: "\e96b"; } -.comfyui-menu:not(.lg) .nlg-hide { - display: none !important; + +.pi-lock-open:before { + content: "\e96a"; } -/** Large screen */ -.lg.comfyui-menu>.comfyui-menu-mobile-collapse .comfyui-button span, -.lg.comfyui-menu>.comfyui-menu-mobile-collapse.comfyui-button span { - display: none; + +.pi-table:before { + content: "\e969"; } -.lg.comfyui-menu>.comfyui-menu-mobile-collapse .comfyui-popup .comfyui-button span { - display: unset; + +.pi-map-marker:before { + content: "\e968"; } -/** Non large screen */ -.lt-lg.comfyui-menu { - flex-wrap: wrap; +.pi-list:before { + content: "\e967"; } -.lt-lg.comfyui-menu > *:not(.comfyui-menu-mobile-collapse) { - order: 1; +.pi-eye-slash:before { + content: "\e965"; } -.lt-lg.comfyui-menu > .comfyui-menu-mobile-collapse { - order: 9999; - width: 100%; +.pi-eye:before { + content: "\e966"; } -.comfyui-body-bottom .lt-lg.comfyui-menu > .comfyui-menu-mobile-collapse { - order: -1; +.pi-folder-open:before { + content: "\e964"; } -.comfyui-body-bottom .lt-lg.comfyui-menu > .comfyui-menu-button { - top: unset; - bottom: 4px; +.pi-folder:before { + content: "\e963"; } -.lt-lg.comfyui-menu > .comfyui-menu-mobile-collapse.comfyui-button-group { - flex-wrap: wrap; +.pi-video:before { + content: "\e962"; } -.lt-lg.comfyui-menu > .comfyui-menu-mobile-collapse .comfyui-button, -.lt-lg.comfyui-menu > .comfyui-menu-mobile-collapse.comfyui-button { - padding: 10px; +.pi-inbox:before { + content: "\e961"; } -.lt-lg.comfyui-menu > .comfyui-menu-mobile-collapse .comfyui-button, -.lt-lg.comfyui-menu > .comfyui-menu-mobile-collapse .comfyui-button-wrapper { - width: 100%; + +.pi-lock:before { + content: "\e95f"; } -.lt-lg.comfyui-menu > .comfyui-menu-mobile-collapse .comfyui-popup { - position: static; - background-color: var(--comfy-input-bg); - max-width: unset; - max-height: 50vh; - overflow: auto; +.pi-unlock:before { + content: "\e960"; } -.lt-lg.comfyui-menu:not(.expanded) > .comfyui-menu-mobile-collapse { - display: none; +.pi-tags:before { + content: "\e95d"; } -.lt-lg .comfyui-menu-button { - position: absolute; - top: 4px; - right: 8px; +.pi-tag:before { + content: "\e95e"; } -.lt-lg.comfyui-menu > .comfyui-menu-mobile-collapse .comfyui-view-list-popup { - border-radius: 0; +.pi-power-off:before { + content: "\e95c"; } -.lt-lg.comfyui-menu .comfyui-workflows-popup { - width: 100vw; +.pi-save:before { + content: "\e95b"; } -/** Small */ -.lt-md .comfyui-workflows-button-inner { - width: unset !important; +.pi-question-circle:before { + content: "\e959"; } -.lt-md .comfyui-workflows-label { - display: none; + +.pi-question:before { + content: "\e95a"; } -/** Extra small */ -.lt-sm .comfyui-interrupt-button { - margin-right: 45px; +.pi-copy:before { + content: "\e957"; } -.comfyui-body-bottom .lt-sm.comfyui-menu > .comfyui-menu-button{ - bottom: 41px; + +.pi-file:before { + content: "\e958"; } +.pi-clone:before { + content: "\e955"; +} -.editable-text[data-v-d670c40f] { - display: inline; +.pi-calendar-times:before { + content: "\e952"; } -.editable-text input[data-v-d670c40f] { - width: 100%; - box-sizing: border-box; + +.pi-calendar-minus:before { + content: "\e953"; } -.tree-node[data-v-a6457774] { - width: 100%; - display: flex; - align-items: center; - justify-content: space-between; +.pi-calendar-plus:before { + content: "\e954"; } -.leaf-count-badge[data-v-a6457774] { - margin-left: 0.5rem; + +.pi-ellipsis-v:before { + content: "\e950"; } -.node-content[data-v-a6457774] { - display: flex; - align-items: center; - flex-grow: 1; + +.pi-ellipsis-h:before { + content: "\e951"; } -.leaf-label[data-v-a6457774] { - margin-left: 0.5rem; + +.pi-bookmark:before { + content: "\e94e"; } -[data-v-a6457774] .editable-text span { - word-break: break-all; + +.pi-globe:before { + content: "\e94f"; } -[data-v-31d518da] .tree-explorer-node-label { - width: 100%; - display: flex; - align-items: center; - margin-left: var(--p-tree-node-gap); - flex-grow: 1; +.pi-replay:before { + content: "\e94d"; } -/* - * The following styles are necessary to avoid layout shift when dragging nodes over folders. - * By setting the position to relative on the parent and using an absolutely positioned pseudo-element, - * we can create a visual indicator for the drop target without affecting the layout of other elements. - */ -[data-v-31d518da] .p-tree-node-content:has(.tree-folder) { - position: relative; +.pi-filter:before { + content: "\e94c"; } -[data-v-31d518da] .p-tree-node-content:has(.tree-folder.can-drop)::after { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - border: 1px solid var(--p-content-color); - pointer-events: none; + +.pi-print:before { + content: "\e94b"; } -[data-v-9159c070] .p-toolbar-end .p-button { - padding-top: 0.25rem; - padding-bottom: 0.25rem +.pi-align-right:before { + content: "\e946"; } -@media (min-width: 1536px) { -[data-v-9159c070] .p-toolbar-end .p-button { - padding-top: 0.5rem; - padding-bottom: 0.5rem + +.pi-align-left:before { + content: "\e947"; } + +.pi-align-center:before { + content: "\e948"; } -.model_preview[data-v-32e6c4d9] { - background-color: var(--comfy-menu-bg); - font-family: 'Open Sans', sans-serif; - color: var(--descrip-text); - border: 1px solid var(--descrip-text); - min-width: 300px; - max-width: 500px; - width: -moz-fit-content; - width: fit-content; - height: -moz-fit-content; - height: fit-content; - z-index: 9999; - border-radius: 12px; - overflow: hidden; - font-size: 12px; - padding: 10px; +.pi-align-justify:before { + content: "\e949"; } -.model_preview_image[data-v-32e6c4d9] { - margin: auto; - width: -moz-fit-content; - width: fit-content; + +.pi-cog:before { + content: "\e94a"; } -.model_preview_image img[data-v-32e6c4d9] { - max-width: 100%; - max-height: 150px; - -o-object-fit: contain; - object-fit: contain; + +.pi-cloud-download:before { + content: "\e943"; } -.model_preview_title[data-v-32e6c4d9] { - font-weight: bold; - text-align: center; - font-size: 14px; + +.pi-cloud-upload:before { + content: "\e944"; } -.model_preview_top_container[data-v-32e6c4d9] { - text-align: center; - line-height: 0.5; + +.pi-cloud:before { + content: "\e945"; } -.model_preview_filename[data-v-32e6c4d9], -.model_preview_author[data-v-32e6c4d9], -.model_preview_architecture[data-v-32e6c4d9] { - display: inline-block; - text-align: center; - margin: 5px; - font-size: 10px; + +.pi-pencil:before { + content: "\e942"; } -.model_preview_prefix[data-v-32e6c4d9] { - font-weight: bold; + +.pi-users:before { + content: "\e941"; } -.model-lib-model-icon-container[data-v-b45ea43e] { - display: inline-block; - position: relative; - left: 0; - height: 1.5rem; - vertical-align: top; - width: 0px; +.pi-clock:before { + content: "\e940"; } -.model-lib-model-icon[data-v-b45ea43e] { - background-size: cover; - background-position: center; - display: inline-block; - position: relative; - left: -2.2rem; - top: -0.1rem; - height: 1.7rem; - width: 1.7rem; - vertical-align: top; + +.pi-user-minus:before { + content: "\e93e"; } -[data-v-0bb2ac55] .pi-fake-spacer { - height: 1px; - width: 16px; +.pi-user-plus:before { + content: "\e93f"; } -._content[data-v-c4279e6b] { +.pi-trash:before { + content: "\e93d"; +} - display: flex; +.pi-external-link:before { + content: "\e93c"; +} - flex-direction: column +.pi-window-maximize:before { + content: "\e93b"; } -._content[data-v-c4279e6b] > :not([hidden]) ~ :not([hidden]) { - --tw-space-y-reverse: 0; +.pi-window-minimize:before { + content: "\e93a"; +} - margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse))); +.pi-refresh:before { + content: "\e938"; +} + +.pi-user:before { + content: "\e939"; +} - margin-bottom: calc(0.5rem * var(--tw-space-y-reverse)) +.pi-exclamation-triangle:before { + content: "\e922"; } -._footer[data-v-c4279e6b] { - display: flex; +.pi-calendar:before { + content: "\e927"; +} - flex-direction: column; +.pi-chevron-circle-left:before { + content: "\e928"; +} - align-items: flex-end; +.pi-chevron-circle-down:before { + content: "\e929"; +} - padding-top: 1rem +.pi-chevron-circle-right:before { + content: "\e92a"; } -.slot_row[data-v-d9792337] { - padding: 2px; +.pi-chevron-circle-up:before { + content: "\e92b"; } -/* Original N-Sidebar styles */ -._sb_dot[data-v-d9792337] { - width: 8px; - height: 8px; - border-radius: 50%; - background-color: grey; +.pi-angle-double-down:before { + content: "\e92c"; } -.node_header[data-v-d9792337] { - line-height: 1; - padding: 8px 13px 7px; - margin-bottom: 5px; - font-size: 15px; - text-wrap: nowrap; - overflow: hidden; - display: flex; - align-items: center; + +.pi-angle-double-left:before { + content: "\e92d"; } -.headdot[data-v-d9792337] { - width: 10px; - height: 10px; - float: inline-start; - margin-right: 8px; + +.pi-angle-double-right:before { + content: "\e92e"; } -.IMAGE[data-v-d9792337] { - background-color: #64b5f6; + +.pi-angle-double-up:before { + content: "\e92f"; } -.VAE[data-v-d9792337] { - background-color: #ff6e6e; + +.pi-angle-down:before { + content: "\e930"; } -.LATENT[data-v-d9792337] { - background-color: #ff9cf9; + +.pi-angle-left:before { + content: "\e931"; } -.MASK[data-v-d9792337] { - background-color: #81c784; + +.pi-angle-right:before { + content: "\e932"; } -.CONDITIONING[data-v-d9792337] { - background-color: #ffa931; + +.pi-angle-up:before { + content: "\e933"; } -.CLIP[data-v-d9792337] { - background-color: #ffd500; + +.pi-upload:before { + content: "\e934"; } -.MODEL[data-v-d9792337] { - background-color: #b39ddb; + +.pi-download:before { + content: "\e956"; } -.CONTROL_NET[data-v-d9792337] { - background-color: #a5d6a7; + +.pi-ban:before { + content: "\e935"; } -._sb_node_preview[data-v-d9792337] { - background-color: var(--comfy-menu-bg); - font-family: 'Open Sans', sans-serif; - font-size: small; - color: var(--descrip-text); - border: 1px solid var(--descrip-text); - min-width: 300px; - width: -moz-min-content; - width: min-content; - height: -moz-fit-content; - height: fit-content; - z-index: 9999; - border-radius: 12px; - overflow: hidden; - font-size: 12px; - padding-bottom: 10px; + +.pi-star-fill:before { + content: "\e936"; } -._sb_node_preview ._sb_description[data-v-d9792337] { - margin: 10px; - padding: 6px; - background: var(--border-color); - border-radius: 5px; - font-style: italic; - font-weight: 500; - font-size: 0.9rem; - word-break: break-word; + +.pi-star:before { + content: "\e937"; } -._sb_table[data-v-d9792337] { - display: grid; - grid-column-gap: 10px; - /* Spazio tra le colonne */ - width: 100%; - /* Imposta la larghezza della tabella al 100% del contenitore */ +.pi-chevron-left:before { + content: "\e900"; } -._sb_row[data-v-d9792337] { - display: grid; - grid-template-columns: 10px 1fr 1fr 1fr 10px; - grid-column-gap: 10px; - align-items: center; - padding-left: 9px; - padding-right: 9px; + +.pi-chevron-right:before { + content: "\e901"; } -._sb_row_string[data-v-d9792337] { - grid-template-columns: 10px 1fr 1fr 10fr 1fr; + +.pi-chevron-down:before { + content: "\e902"; } -._sb_col[data-v-d9792337] { - border: 0px solid #000; - display: flex; - align-items: flex-end; - flex-direction: row-reverse; - flex-wrap: nowrap; - align-content: flex-start; - justify-content: flex-end; + +.pi-chevron-up:before { + content: "\e903"; } -._sb_inherit[data-v-d9792337] { - display: inherit; + +.pi-caret-left:before { + content: "\e904"; } -._long_field[data-v-d9792337] { - background: var(--bg-color); - border: 2px solid var(--border-color); - margin: 5px 5px 0 5px; - border-radius: 10px; - line-height: 1.7; - text-wrap: nowrap; + +.pi-caret-right:before { + content: "\e905"; } -._sb_arrow[data-v-d9792337] { - color: var(--fg-color); + +.pi-caret-down:before { + content: "\e906"; } -._sb_preview_badge[data-v-d9792337] { - text-align: center; - background: var(--comfy-input-bg); - font-weight: bold; - color: var(--error-text); + +.pi-caret-up:before { + content: "\e907"; } -.node-lib-node-container[data-v-da9a8962] { - height: 100%; - width: 100% +.pi-search:before { + content: "\e908"; } -.p-selectbutton .p-button[data-v-4b8adc78] { - padding: 0.5rem; +.pi-check:before { + content: "\e909"; } -.p-selectbutton .p-button .pi[data-v-4b8adc78] { - font-size: 1.5rem; + +.pi-check-circle:before { + content: "\e90a"; } -.field[data-v-4b8adc78] { - display: flex; - flex-direction: column; - gap: 0.5rem; + +.pi-times:before { + content: "\e90b"; } -.color-picker-container[data-v-4b8adc78] { - display: flex; - align-items: center; - gap: 0.5rem; + +.pi-times-circle:before { + content: "\e90c"; } -.scroll-container[data-v-ad33a347] { - height: 100%; - overflow-y: auto; +.pi-plus:before { + content: "\e90d"; +} - /* Firefox */ - scrollbar-width: none; -&[data-v-ad33a347]::-webkit-scrollbar { - width: 1px; +.pi-plus-circle:before { + content: "\e90e"; } -&[data-v-ad33a347]::-webkit-scrollbar-thumb { - background-color: transparent; + +.pi-minus:before { + content: "\e90f"; } + +.pi-minus-circle:before { + content: "\e910"; } -.comfy-image-wrap[data-v-ffe66146] { - display: contents; +.pi-circle-on:before { + content: "\e911"; } -.comfy-image-blur[data-v-ffe66146] { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - -o-object-fit: cover; - object-fit: cover; + +.pi-circle-off:before { + content: "\e912"; } -.comfy-image-main[data-v-ffe66146] { - width: 100%; - height: 100%; - -o-object-fit: cover; - object-fit: cover; - -o-object-position: center; - object-position: center; - z-index: 1; + +.pi-sort-down:before { + content: "\e913"; } -.contain .comfy-image-wrap[data-v-ffe66146] { - position: relative; - width: 100%; - height: 100%; + +.pi-sort-up:before { + content: "\e914"; } -.contain .comfy-image-main[data-v-ffe66146] { - -o-object-fit: contain; - object-fit: contain; - -webkit-backdrop-filter: blur(10px); - backdrop-filter: blur(10px); - position: absolute; + +.pi-sort:before { + content: "\e915"; } -.broken-image-placeholder[data-v-ffe66146] { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - width: 100%; - height: 100%; - margin: 2rem; + +.pi-step-backward:before { + content: "\e916"; } -.broken-image-placeholder i[data-v-ffe66146] { - font-size: 3rem; - margin-bottom: 0.5rem; + +.pi-step-forward:before { + content: "\e917"; } -/* PrimeVue's galleria teleports the fullscreen gallery out of subtree so we -cannot use scoped style here. */ -img.galleria-image { - max-width: 100vw; - max-height: 100vh; - -o-object-fit: contain; - object-fit: contain; +.pi-th-large:before { + content: "\e918"; } -.p-galleria-close-button { - /* Set z-index so the close button doesn't get hidden behind the image when image is large */ - z-index: 1; + +.pi-arrow-down:before { + content: "\e919"; } -.result-container[data-v-61515e14] { - width: 100%; - height: 100%; - aspect-ratio: 1 / 1; - overflow: hidden; - position: relative; - display: flex; - justify-content: center; - align-items: center; +.pi-arrow-left:before { + content: "\e91a"; } -.preview-mask[data-v-61515e14] { - position: absolute; - left: 50%; - top: 50%; - transform: translate(-50%, -50%); - display: flex; - align-items: center; - justify-content: center; - opacity: 0; - transition: opacity 0.3s ease; - z-index: 1; + +.pi-arrow-right:before { + content: "\e91b"; } -.result-container:hover .preview-mask[data-v-61515e14] { - opacity: 1; + +.pi-arrow-up:before { + content: "\e91c"; } -.task-result-preview[data-v-b676a511] { - aspect-ratio: 1 / 1; - overflow: hidden; - display: flex; - justify-content: center; - align-items: center; - width: 100%; - height: 100%; +.pi-bars:before { + content: "\e91d"; } -.task-result-preview i[data-v-b676a511], -.task-result-preview span[data-v-b676a511] { - font-size: 2rem; + +.pi-arrow-circle-down:before { + content: "\e91e"; } -.task-item[data-v-b676a511] { - display: flex; - flex-direction: column; - border-radius: 4px; - overflow: hidden; - position: relative; + +.pi-arrow-circle-left:before { + content: "\e91f"; } -.task-item-details[data-v-b676a511] { - position: absolute; - bottom: 0; - padding: 0.6rem; - display: flex; - justify-content: space-between; - align-items: center; - width: 100%; - z-index: 1; + +.pi-arrow-circle-right:before { + content: "\e920"; } -.task-node-link[data-v-b676a511] { - padding: 2px; + +.pi-arrow-circle-up:before { + content: "\e921"; } -/* In dark mode, transparent background color for tags is not ideal for tags that -are floating on top of images. */ -.tag-wrapper[data-v-b676a511] { - background-color: var(--p-primary-contrast-color); - border-radius: 6px; - display: inline-flex; +.pi-info:before { + content: "\e923"; } -.node-name-tag[data-v-b676a511] { - word-break: break-all; + +.pi-info-circle:before { + content: "\e924"; } -.status-tag-group[data-v-b676a511] { - display: flex; - flex-direction: column; + +.pi-home:before { + content: "\e925"; } -.progress-preview-img[data-v-b676a511] { - width: 100%; - height: 100%; - -o-object-fit: cover; - object-fit: cover; - -o-object-position: center; - object-position: center; + +.pi-spinner:before { + content: "\e926"; } diff --git a/web/assets/index-CCg06AEp.js b/web/assets/index-CNFX5znr.js similarity index 99% rename from web/assets/index-CCg06AEp.js rename to web/assets/index-CNFX5znr.js index b7ae7d70..e120272c 100644 --- a/web/assets/index-CCg06AEp.js +++ b/web/assets/index-CNFX5znr.js @@ -1,6 +1,6 @@ var __defProp = Object.defineProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); -import { ca as ComfyDialog, cb as $el, cc as ComfyApp, h as app, a3 as LiteGraph, bd as LGraphCanvas, cd as useExtensionService, ce as processDynamicPrompt, cf as isElectron, c0 as electronAPI, bR as useDialogService, cg as t, ch as DraggableList, bt as useToastStore, ah as LGraphNode, ci as applyTextReplacements, cj as ComfyWidgets, ck as addValueControlWidgets, a6 as useNodeDefStore, cl as serialise, cm as deserialiseAndCreate, b8 as api, a as useSettingStore, ag as LGraphGroup, ad as nextTick } from "./index-BbhVsmQe.js"; +import { ca as ComfyDialog, cb as $el, cc as ComfyApp, b as app, i as LiteGraph, bb as LGraphCanvas, c as LGraphNode, cd as applyTextReplacements, ce as ComfyWidgets, cf as addValueControlWidgets, aE as useNodeDefStore, cg as DraggableList, bq as useToastStore, bR as useDialogService, ch as t, ci as serialise, cj as deserialiseAndCreate, b4 as api, u as useSettingStore, L as LGraphGroup, ck as isElectron, c1 as electronAPI, aK as nextTick } from "./index-DAOHvvrm.js"; class ClipspaceDialog extends ComfyDialog { static { __name(this, "ClipspaceDialog"); @@ -284,15 +284,27 @@ const ext$1 = { } }; app.registerExtension(ext$1); -useExtensionService().registerExtension({ +function stripComments(str) { + return str.replace(/\/\*[\s\S]*?\*\/|\/\/.*/g, ""); +} +__name(stripComments, "stripComments"); +app.registerExtension({ name: "Comfy.DynamicPrompts", nodeCreated(node) { if (node.widgets) { const widgets = node.widgets.filter((n) => n.dynamicPrompts); for (const widget of widgets) { widget.serializeValue = (workflowNode, widgetIndex) => { - if (typeof widget.value !== "string") return widget.value; - const prompt = processDynamicPrompt(widget.value); + let prompt = stripComments(widget.value); + while (prompt.replace("\\{", "").includes("{") && prompt.replace("\\}", "").includes("}")) { + const startIndex = prompt.replace("\\{", "00").indexOf("{"); + const endIndex = prompt.replace("\\}", "00").indexOf("}"); + const optionsString = prompt.substring(startIndex + 1, endIndex); + const options = optionsString.split("|"); + const randomIndex = Math.floor(Math.random() * options.length); + const randomOption = options[randomIndex]; + prompt = prompt.substring(0, startIndex) + randomOption + prompt.substring(endIndex + 1); + } if (workflowNode?.widgets_values) workflowNode.widgets_values[widgetIndex] = prompt; return prompt; @@ -418,803 +430,207 @@ app.registerExtension({ window.addEventListener("keydown", editAttention); } }); -(async () => { - if (!isElectron()) return; - const electronAPI$1 = electronAPI(); - const desktopAppVersion = await electronAPI$1.getElectronVersion(); - const onChangeRestartApp = /* @__PURE__ */ __name((newValue, oldValue) => { - if (oldValue !== void 0 && newValue !== oldValue) { - electronAPI$1.restartApp("Restart ComfyUI to apply changes.", 1500); +const CONVERTED_TYPE = "converted-widget"; +const VALID_TYPES = [ + "STRING", + "combo", + "number", + "toggle", + "BOOLEAN", + "text", + "string" +]; +const CONFIG = Symbol(); +const GET_CONFIG = Symbol(); +const TARGET = Symbol(); +const replacePropertyName = "Run widget replace on values"; +class PrimitiveNode extends LGraphNode { + static { + __name(this, "PrimitiveNode"); + } + controlValues; + lastType; + static category; + constructor(title) { + super(title); + this.addOutput("connect to widget input", "*"); + this.serialize_widgets = true; + this.isVirtualNode = true; + if (!this.properties || !(replacePropertyName in this.properties)) { + this.addProperty(replacePropertyName, false, "boolean"); } - }, "onChangeRestartApp"); - app.registerExtension({ - name: "Comfy.ElectronAdapter", - settings: [ - { - id: "Comfy-Desktop.AutoUpdate", - category: ["Comfy-Desktop", "General", "AutoUpdate"], - name: "Automatically check for updates", - type: "boolean", - defaultValue: true, - onChange: onChangeRestartApp - }, - { - id: "Comfy-Desktop.SendStatistics", - category: ["Comfy-Desktop", "General", "Send Statistics"], - name: "Send anonymous crash reports", - type: "boolean", - defaultValue: true, - onChange: onChangeRestartApp - } - ], - commands: [ - { - id: "Comfy-Desktop.Folders.OpenLogsFolder", - label: "Open Logs Folder", - icon: "pi pi-folder-open", - function() { - electronAPI$1.openLogsFolder(); - } - }, - { - id: "Comfy-Desktop.Folders.OpenModelsFolder", - label: "Open Models Folder", - icon: "pi pi-folder-open", - function() { - electronAPI$1.openModelsFolder(); - } - }, - { - id: "Comfy-Desktop.Folders.OpenOutputsFolder", - label: "Open Outputs Folder", - icon: "pi pi-folder-open", - function() { - electronAPI$1.openOutputsFolder(); - } - }, - { - id: "Comfy-Desktop.Folders.OpenInputsFolder", - label: "Open Inputs Folder", - icon: "pi pi-folder-open", - function() { - electronAPI$1.openInputsFolder(); - } - }, - { - id: "Comfy-Desktop.Folders.OpenCustomNodesFolder", - label: "Open Custom Nodes Folder", - icon: "pi pi-folder-open", - function() { - electronAPI$1.openCustomNodesFolder(); - } - }, - { - id: "Comfy-Desktop.Folders.OpenModelConfig", - label: "Open extra_model_paths.yaml", - icon: "pi pi-file", - function() { - electronAPI$1.openModelConfig(); - } - }, - { - id: "Comfy-Desktop.OpenDevTools", - label: "Open DevTools", - icon: "pi pi-code", - function() { - electronAPI$1.openDevTools(); - } - }, - { - id: "Comfy-Desktop.OpenFeedbackPage", - label: "Feedback", - icon: "pi pi-envelope", - function() { - window.open("https://forum.comfy.org/c/v1-feedback/", "_blank"); - } - }, - { - id: "Comfy-Desktop.OpenUserGuide", - label: "Desktop User Guide", - icon: "pi pi-book", - function() { - window.open("https://comfyorg.notion.site/", "_blank"); - } - }, - { - id: "Comfy-Desktop.Reinstall", - label: "Reinstall", - icon: "pi pi-refresh", - async function() { - const proceed = await useDialogService().confirm({ - message: t("desktopMenu.confirmReinstall"), - title: t("desktopMenu.reinstall"), - type: "reinstall" - }); - if (proceed) electronAPI$1.reinstall(); - } - }, - { - id: "Comfy-Desktop.Restart", - label: "Restart", - icon: "pi pi-refresh", - function() { - electronAPI$1.restartApp(); + } + applyToGraph(extraLinks = []) { + if (!this.outputs[0].links?.length) return; + function get_links(node) { + let links2 = []; + for (const l of node.outputs[0].links) { + const linkInfo = app.graph.links[l]; + const n = node.graph.getNodeById(linkInfo.target_id); + if (n.type == "Reroute") { + links2 = links2.concat(get_links(n)); + } else { + links2.push(l); } } - ], - menuCommands: [ - { - path: ["Help"], - commands: [ - "Comfy-Desktop.OpenUserGuide", - "Comfy-Desktop.OpenFeedbackPage" - ] - }, - { - path: ["Help"], - commands: ["Comfy-Desktop.OpenDevTools"] - }, - { - path: ["Help", "Open Folder"], - commands: [ - "Comfy-Desktop.Folders.OpenLogsFolder", - "Comfy-Desktop.Folders.OpenModelsFolder", - "Comfy-Desktop.Folders.OpenOutputsFolder", - "Comfy-Desktop.Folders.OpenInputsFolder", - "Comfy-Desktop.Folders.OpenCustomNodesFolder", - "Comfy-Desktop.Folders.OpenModelConfig" - ] - }, - { - path: ["Help"], - commands: ["Comfy-Desktop.Reinstall"] - } - ], - aboutPageBadges: [ - { - label: "ComfyUI_desktop v" + desktopAppVersion, - url: "https://github.com/Comfy-Org/electron", - icon: "pi pi-github" - } - ] - }); -})(); -const ORDER = Symbol(); -const PREFIX$1 = "workflow"; -const SEPARATOR$1 = ">"; -function merge(target, source) { - if (typeof target === "object" && typeof source === "object") { - for (const key in source) { - const sv = source[key]; - if (typeof sv === "object") { - let tv = target[key]; - if (!tv) tv = target[key] = {}; - merge(tv, source[key]); + return links2; + } + __name(get_links, "get_links"); + let links = [ + ...get_links(this).map((l) => app.graph.links[l]), + ...extraLinks + ]; + let v = this.widgets?.[0].value; + if (v && this.properties[replacePropertyName]) { + v = applyTextReplacements(app, v); + } + for (const linkInfo of links) { + const node = this.graph.getNodeById(linkInfo.target_id); + const input = node.inputs[linkInfo.target_slot]; + let widget; + if (input.widget[TARGET]) { + widget = input.widget[TARGET]; } else { - target[key] = sv; + const widgetName = input.widget.name; + if (widgetName) { + widget = node.widgets.find((w) => w.name === widgetName); + } + } + if (widget) { + widget.value = v; + if (widget.callback) { + widget.callback( + widget.value, + app.canvas, + node, + app.canvas.graph_mouse, + {} + ); + } } } } - return target; -} -__name(merge, "merge"); -class ManageGroupDialog extends ComfyDialog { - static { - __name(this, "ManageGroupDialog"); - } - tabs; - selectedNodeIndex; - selectedTab = "Inputs"; - selectedGroup; - modifications = {}; - nodeItems; - app; - groupNodeType; - groupNodeDef; - groupData; - innerNodesList; - widgetsPage; - inputsPage; - outputsPage; - draggable; - get selectedNodeInnerIndex() { - return +this.nodeItems[this.selectedNodeIndex].dataset.nodeindex; - } - constructor(app2) { - super(); - this.app = app2; - this.element = $el("dialog.comfy-group-manage", { - parent: document.body - }); + refreshComboInNode() { + const widget = this.widgets?.[0]; + if (widget?.type === "combo") { + widget.options.values = this.outputs[0].widget[GET_CONFIG]()[0]; + if (!widget.options.values.includes(widget.value)) { + widget.value = widget.options.values[0]; + widget.callback(widget.value); + } + } } - changeTab(tab) { - this.tabs[this.selectedTab].tab.classList.remove("active"); - this.tabs[this.selectedTab].page.classList.remove("active"); - this.tabs[tab].tab.classList.add("active"); - this.tabs[tab].page.classList.add("active"); - this.selectedTab = tab; + onAfterGraphConfigured() { + if (this.outputs[0].links?.length && !this.widgets?.length) { + if (!this.#onFirstConnection()) return; + if (this.widgets) { + for (let i = 0; i < this.widgets_values.length; i++) { + const w = this.widgets[i]; + if (w) { + w.value = this.widgets_values[i]; + } + } + } + this.#mergeWidgetConfig(); + } } - changeNode(index, force) { - if (!force && this.selectedNodeIndex === index) return; - if (this.selectedNodeIndex != null) { - this.nodeItems[this.selectedNodeIndex].classList.remove("selected"); + onConnectionsChange(_, index, connected) { + if (app.configuringGraph) { + return; } - this.nodeItems[index].classList.add("selected"); - this.selectedNodeIndex = index; - if (!this.buildInputsPage() && this.selectedTab === "Inputs") { - this.changeTab("Widgets"); + const links = this.outputs[0].links; + if (connected) { + if (links?.length && !this.widgets?.length) { + this.#onFirstConnection(); + } + } else { + this.#mergeWidgetConfig(); + if (!links?.length) { + this.onLastDisconnect(); + } } - if (!this.buildWidgetsPage() && this.selectedTab === "Widgets") { - this.changeTab("Outputs"); + } + onConnectOutput(slot, type, input, target_node, target_slot) { + if (!input.widget) { + if (!(input.type in ComfyWidgets)) return false; } - if (!this.buildOutputsPage() && this.selectedTab === "Outputs") { - this.changeTab("Inputs"); + if (this.outputs[slot].links?.length) { + const valid = this.#isValidConnection(input); + if (valid) { + this.applyToGraph([{ target_id: target_node.id, target_slot }]); + } + return valid; } - this.changeTab(this.selectedTab); - } - getGroupData() { - this.groupNodeType = LiteGraph.registered_node_types[`${PREFIX$1}${SEPARATOR$1}` + this.selectedGroup]; - this.groupNodeDef = this.groupNodeType.nodeData; - this.groupData = GroupNodeHandler.getGroupData(this.groupNodeType); } - changeGroup(group, reset = true) { - this.selectedGroup = group; - this.getGroupData(); - const nodes = this.groupData.nodeData.nodes; - this.nodeItems = nodes.map( - (n, i) => $el( - "li.draggable-item", - { - dataset: { - nodeindex: n.index + "" - }, - onclick: /* @__PURE__ */ __name(() => { - this.changeNode(i); - }, "onclick") - }, - [ - $el("span.drag-handle"), - $el( - "div", - { - textContent: n.title ?? n.type - }, - n.title ? $el("span", { - textContent: n.type - }) : [] - ) - ] - ) - ); - this.innerNodesList.replaceChildren(...this.nodeItems); - if (reset) { - this.selectedNodeIndex = null; - this.changeNode(0); + #onFirstConnection(recreating) { + if (!this.outputs[0].links) { + this.onLastDisconnect(); + return; + } + const linkId = this.outputs[0].links[0]; + const link = this.graph.links[linkId]; + if (!link) return; + const theirNode = this.graph.getNodeById(link.target_id); + if (!theirNode || !theirNode.inputs) return; + const input = theirNode.inputs[link.target_slot]; + if (!input) return; + let widget; + if (!input.widget) { + if (!(input.type in ComfyWidgets)) return; + widget = { name: input.name, [GET_CONFIG]: () => [input.type, {}] }; } else { - const items = this.draggable.getAllItems(); - let index = items.findIndex((item) => item.classList.contains("selected")); - if (index === -1) index = this.selectedNodeIndex; - this.changeNode(index, true); + widget = input.widget; } - const ordered = [...nodes]; - this.draggable?.dispose(); - this.draggable = new DraggableList(this.innerNodesList, "li"); - this.draggable.addEventListener( - "dragend", - ({ detail: { oldPosition, newPosition } }) => { - if (oldPosition === newPosition) return; - ordered.splice(newPosition, 0, ordered.splice(oldPosition, 1)[0]); - for (let i = 0; i < ordered.length; i++) { - this.storeModification({ - nodeIndex: ordered[i].index, - section: ORDER, - prop: "order", - value: i - }); - } - } + const config = widget[GET_CONFIG]?.(); + if (!config) return; + const { type } = getWidgetType(config); + this.outputs[0].type = type; + this.outputs[0].name = type; + this.outputs[0].widget = widget; + this.#createWidget( + widget[CONFIG] ?? config, + theirNode, + widget.name, + recreating, + widget[TARGET] ); } - storeModification(props) { - const { nodeIndex, section, prop, value } = props; - const groupMod = this.modifications[this.selectedGroup] ??= {}; - const nodesMod = groupMod.nodes ??= {}; - const nodeMod = nodesMod[nodeIndex ?? this.selectedNodeInnerIndex] ??= {}; - const typeMod = nodeMod[section] ??= {}; - if (typeof value === "object") { - const objMod = typeMod[prop] ??= {}; - Object.assign(objMod, value); + #createWidget(inputData, node, widgetName, recreating, targetWidget) { + let type = inputData[0]; + if (type instanceof Array) { + type = "COMBO"; + } + const [oldWidth, oldHeight] = this.size; + let widget; + if (type in ComfyWidgets) { + widget = (ComfyWidgets[type](this, "value", inputData, app) || {}).widget; } else { - typeMod[prop] = value; + widget = this.addWidget(type, "value", null, () => { + }, {}); } - } - getEditElement(section, prop, value, placeholder, checked, checkable = true) { - if (value === placeholder) value = ""; - const mods = this.modifications[this.selectedGroup]?.nodes?.[this.selectedNodeInnerIndex]?.[section]?.[prop]; - if (mods) { - if (mods.name != null) { - value = mods.name; + if (targetWidget) { + widget.value = targetWidget.value; + } else if (node?.widgets && widget) { + const theirWidget = node.widgets.find((w) => w.name === widgetName); + if (theirWidget) { + widget.value = theirWidget.value; } - if (mods.visible != null) { - checked = mods.visible; - } - } - return $el("div", [ - $el("input", { - value, - placeholder, - type: "text", - onchange: /* @__PURE__ */ __name((e) => { - this.storeModification({ - section, - prop, - value: { name: e.target.value } - }); - }, "onchange") - }), - $el("label", { textContent: "Visible" }, [ - $el("input", { - type: "checkbox", - checked, - disabled: !checkable, - onchange: /* @__PURE__ */ __name((e) => { - this.storeModification({ - section, - prop, - value: { visible: !!e.target.checked } - }); - }, "onchange") - }) - ]) - ]); - } - buildWidgetsPage() { - const widgets = this.groupData.oldToNewWidgetMap[this.selectedNodeInnerIndex]; - const items = Object.keys(widgets ?? {}); - const type = app.graph.extra.groupNodes[this.selectedGroup]; - const config = type.config?.[this.selectedNodeInnerIndex]?.input; - this.widgetsPage.replaceChildren( - ...items.map((oldName) => { - return this.getEditElement( - "input", - oldName, - widgets[oldName], - oldName, - config?.[oldName]?.visible !== false - ); - }) - ); - return !!items.length; - } - buildInputsPage() { - const inputs = this.groupData.nodeInputs[this.selectedNodeInnerIndex]; - const items = Object.keys(inputs ?? {}); - const type = app.graph.extra.groupNodes[this.selectedGroup]; - const config = type.config?.[this.selectedNodeInnerIndex]?.input; - this.inputsPage.replaceChildren( - ...items.map((oldName) => { - let value = inputs[oldName]; - if (!value) { - return; - } - return this.getEditElement( - "input", - oldName, - value, - oldName, - config?.[oldName]?.visible !== false - ); - }).filter(Boolean) - ); - return !!items.length; - } - buildOutputsPage() { - const nodes = this.groupData.nodeData.nodes; - const innerNodeDef = this.groupData.getNodeDef( - nodes[this.selectedNodeInnerIndex] - ); - const outputs = innerNodeDef?.output ?? []; - const groupOutputs = this.groupData.oldToNewOutputMap[this.selectedNodeInnerIndex]; - const type = app.graph.extra.groupNodes[this.selectedGroup]; - const config = type.config?.[this.selectedNodeInnerIndex]?.output; - const node = this.groupData.nodeData.nodes[this.selectedNodeInnerIndex]; - const checkable = node.type !== "PrimitiveNode"; - this.outputsPage.replaceChildren( - ...outputs.map((type2, slot) => { - const groupOutputIndex = groupOutputs?.[slot]; - const oldName = innerNodeDef.output_name?.[slot] ?? type2; - let value = config?.[slot]?.name; - const visible = config?.[slot]?.visible || groupOutputIndex != null; - if (!value || value === oldName) { - value = ""; - } - return this.getEditElement( - "output", - slot, - value, - oldName, - visible, - checkable - ); - }).filter(Boolean) - ); - return !!outputs.length; - } - show(type) { - const groupNodes = Object.keys(app.graph.extra?.groupNodes ?? {}).sort( - (a, b) => a.localeCompare(b) - ); - this.innerNodesList = $el( - "ul.comfy-group-manage-list-items" - ); - this.widgetsPage = $el("section.comfy-group-manage-node-page"); - this.inputsPage = $el("section.comfy-group-manage-node-page"); - this.outputsPage = $el("section.comfy-group-manage-node-page"); - const pages = $el("div", [ - this.widgetsPage, - this.inputsPage, - this.outputsPage - ]); - this.tabs = [ - ["Inputs", this.inputsPage], - ["Widgets", this.widgetsPage], - ["Outputs", this.outputsPage] - ].reduce((p, [name, page]) => { - p[name] = { - tab: $el("a", { - onclick: /* @__PURE__ */ __name(() => { - this.changeTab(name); - }, "onclick"), - textContent: name - }), - page - }; - return p; - }, {}); - const outer = $el("div.comfy-group-manage-outer", [ - $el("header", [ - $el("h2", "Group Nodes"), - $el( - "select", - { - onchange: /* @__PURE__ */ __name((e) => { - this.changeGroup(e.target.value); - }, "onchange") - }, - groupNodes.map( - (g) => $el("option", { - textContent: g, - selected: `${PREFIX$1}${SEPARATOR$1}${g}` === type, - value: g - }) - ) - ) - ]), - $el("main", [ - $el("section.comfy-group-manage-list", this.innerNodesList), - $el("section.comfy-group-manage-node", [ - $el( - "header", - Object.values(this.tabs).map((t2) => t2.tab) - ), - pages - ]) - ]), - $el("footer", [ - $el( - "button.comfy-btn", - { - onclick: /* @__PURE__ */ __name((e) => { - const node = app.graph.nodes.find( - (n) => n.type === `${PREFIX$1}${SEPARATOR$1}` + this.selectedGroup - ); - if (node) { - useToastStore().addAlert( - "This group node is in use in the current workflow, please first remove these." - ); - return; - } - if (confirm( - `Are you sure you want to remove the node: "${this.selectedGroup}"` - )) { - delete app.graph.extra.groupNodes[this.selectedGroup]; - LiteGraph.unregisterNodeType( - `${PREFIX$1}${SEPARATOR$1}` + this.selectedGroup - ); - } - this.show(); - }, "onclick") - }, - "Delete Group Node" - ), - $el( - "button.comfy-btn", - { - onclick: /* @__PURE__ */ __name(async () => { - let nodesByType; - let recreateNodes = []; - const types = {}; - for (const g in this.modifications) { - const type2 = app.graph.extra.groupNodes[g]; - let config = type2.config ??= {}; - let nodeMods = this.modifications[g]?.nodes; - if (nodeMods) { - const keys = Object.keys(nodeMods); - if (nodeMods[keys[0]][ORDER]) { - const orderedNodes = []; - const orderedMods = {}; - const orderedConfig = {}; - for (const n of keys) { - const order = nodeMods[n][ORDER].order; - orderedNodes[order] = type2.nodes[+n]; - orderedMods[order] = nodeMods[n]; - orderedNodes[order].index = order; - } - for (const l of type2.links) { - if (l[0] != null) l[0] = type2.nodes[l[0]].index; - if (l[2] != null) l[2] = type2.nodes[l[2]].index; - } - if (type2.external) { - for (const ext2 of type2.external) { - ext2[0] = type2.nodes[ext2[0]]; - } - } - for (const id2 of keys) { - if (config[id2]) { - orderedConfig[type2.nodes[id2].index] = config[id2]; - } - delete config[id2]; - } - type2.nodes = orderedNodes; - nodeMods = orderedMods; - type2.config = config = orderedConfig; - } - merge(config, nodeMods); - } - types[g] = type2; - if (!nodesByType) { - nodesByType = app.graph.nodes.reduce((p, n) => { - p[n.type] ??= []; - p[n.type].push(n); - return p; - }, {}); - } - const nodes = nodesByType[`${PREFIX$1}${SEPARATOR$1}` + g]; - if (nodes) recreateNodes.push(...nodes); - } - await GroupNodeConfig.registerFromWorkflow(types, {}); - for (const node of recreateNodes) { - node.recreate(); - } - this.modifications = {}; - this.app.graph.setDirtyCanvas(true, true); - this.changeGroup(this.selectedGroup, false); - }, "onclick") - }, - "Save" - ), - $el( - "button.comfy-btn", - { onclick: /* @__PURE__ */ __name(() => this.element.close(), "onclick") }, - "Close" - ) - ]) - ]); - this.element.replaceChildren(outer); - this.changeGroup( - type ? groupNodes.find((g) => `${PREFIX$1}${SEPARATOR$1}${g}` === type) ?? groupNodes[0] : groupNodes[0] - ); - this.element.showModal(); - this.element.addEventListener("close", () => { - this.draggable?.dispose(); - this.element.remove(); - }); - } -} -window.comfyAPI = window.comfyAPI || {}; -window.comfyAPI.groupNodeManage = window.comfyAPI.groupNodeManage || {}; -window.comfyAPI.groupNodeManage.ManageGroupDialog = ManageGroupDialog; -const CONVERTED_TYPE = "converted-widget"; -const VALID_TYPES = [ - "STRING", - "combo", - "number", - "toggle", - "BOOLEAN", - "text", - "string" -]; -const CONFIG = Symbol(); -const GET_CONFIG = Symbol(); -const TARGET = Symbol(); -const replacePropertyName = "Run widget replace on values"; -class PrimitiveNode extends LGraphNode { - static { - __name(this, "PrimitiveNode"); - } - controlValues; - lastType; - static category; - constructor(title) { - super(title); - this.addOutput("connect to widget input", "*"); - this.serialize_widgets = true; - this.isVirtualNode = true; - if (!this.properties || !(replacePropertyName in this.properties)) { - this.addProperty(replacePropertyName, false, "boolean"); - } - } - applyToGraph(extraLinks = []) { - if (!this.outputs[0].links?.length) return; - function get_links(node) { - let links2 = []; - for (const l of node.outputs[0].links) { - const linkInfo = app.graph.links[l]; - const n = node.graph.getNodeById(linkInfo.target_id); - if (n.type == "Reroute") { - links2 = links2.concat(get_links(n)); - } else { - links2.push(l); - } - } - return links2; - } - __name(get_links, "get_links"); - let links = [ - ...get_links(this).map((l) => app.graph.links[l]), - ...extraLinks - ]; - let v = this.widgets?.[0].value; - if (v && this.properties[replacePropertyName]) { - v = applyTextReplacements(app, v); - } - for (const linkInfo of links) { - const node = this.graph.getNodeById(linkInfo.target_id); - const input = node.inputs[linkInfo.target_slot]; - let widget; - if (input.widget[TARGET]) { - widget = input.widget[TARGET]; - } else { - const widgetName = input.widget.name; - if (widgetName) { - widget = node.widgets.find((w) => w.name === widgetName); - } - } - if (widget) { - widget.value = v; - if (widget.callback) { - widget.callback( - widget.value, - app.canvas, - node, - app.canvas.graph_mouse, - {} - ); - } - } - } - } - refreshComboInNode() { - const widget = this.widgets?.[0]; - if (widget?.type === "combo") { - widget.options.values = this.outputs[0].widget[GET_CONFIG]()[0]; - if (!widget.options.values.includes(widget.value)) { - widget.value = widget.options.values[0]; - widget.callback(widget.value); - } - } - } - onAfterGraphConfigured() { - if (this.outputs[0].links?.length && !this.widgets?.length) { - if (!this.#onFirstConnection()) return; - if (this.widgets) { - for (let i = 0; i < this.widgets_values.length; i++) { - const w = this.widgets[i]; - if (w) { - w.value = this.widgets_values[i]; - } - } - } - this.#mergeWidgetConfig(); - } - } - onConnectionsChange(_, index, connected) { - if (app.configuringGraph) { - return; - } - const links = this.outputs[0].links; - if (connected) { - if (links?.length && !this.widgets?.length) { - this.#onFirstConnection(); - } - } else { - this.#mergeWidgetConfig(); - if (!links?.length) { - this.onLastDisconnect(); - } - } - } - onConnectOutput(slot, type, input, target_node, target_slot) { - if (!input.widget) { - if (!(input.type in ComfyWidgets)) return false; - } - if (this.outputs[slot].links?.length) { - const valid = this.#isValidConnection(input); - if (valid) { - this.applyToGraph([{ target_id: target_node.id, target_slot }]); - } - return valid; - } - } - #onFirstConnection(recreating) { - if (!this.outputs[0].links) { - this.onLastDisconnect(); - return; - } - const linkId = this.outputs[0].links[0]; - const link = this.graph.links[linkId]; - if (!link) return; - const theirNode = this.graph.getNodeById(link.target_id); - if (!theirNode || !theirNode.inputs) return; - const input = theirNode.inputs[link.target_slot]; - if (!input) return; - let widget; - if (!input.widget) { - if (!(input.type in ComfyWidgets)) return; - widget = { name: input.name, [GET_CONFIG]: () => [input.type, {}] }; - } else { - widget = input.widget; - } - const config = widget[GET_CONFIG]?.(); - if (!config) return; - const { type } = getWidgetType(config); - this.outputs[0].type = type; - this.outputs[0].name = type; - this.outputs[0].widget = widget; - this.#createWidget( - widget[CONFIG] ?? config, - theirNode, - widget.name, - recreating, - widget[TARGET] - ); - } - #createWidget(inputData, node, widgetName, recreating, targetWidget) { - let type = inputData[0]; - if (type instanceof Array) { - type = "COMBO"; - } - const [oldWidth, oldHeight] = this.size; - let widget; - if (type in ComfyWidgets) { - widget = (ComfyWidgets[type](this, "value", inputData, app) || {}).widget; - } else { - widget = this.addWidget(type, "value", null, () => { - }, {}); - } - if (targetWidget) { - widget.value = targetWidget.value; - } else if (node?.widgets && widget) { - const theirWidget = node.widgets.find((w) => w.name === widgetName); - if (theirWidget) { - widget.value = theirWidget.value; - } - } - if (!inputData?.[1]?.control_after_generate && (widget.type === "number" || widget.type === "combo")) { - let control_value = this.widgets_values?.[1]; - if (!control_value) { - control_value = "fixed"; - } - addValueControlWidgets( - this, - widget, - control_value, - void 0, - inputData - ); - let filter = this.widgets_values?.[2]; - if (filter && this.widgets.length === 3) { - this.widgets[2].value = filter; + } + if (!inputData?.[1]?.control_after_generate && (widget.type === "number" || widget.type === "combo")) { + let control_value = this.widgets_values?.[1]; + if (!control_value) { + control_value = "fixed"; + } + addValueControlWidgets( + this, + widget, + control_value, + void 0, + inputData + ); + let filter = this.widgets_values?.[2]; + if (filter && this.widgets.length === 3) { + this.widgets[2].value = filter; } } const controlValues = this.controlValues; @@ -1494,7 +910,7 @@ function mergeIfValid(output, config2, forceUpdate, recreateWidget, config1) { }, "getCustomConfig"); const isNumber = config1[0] === "INT" || config1[0] === "FLOAT"; for (const k of keys.values()) { - if (k !== "default" && k !== "forceInput" && k !== "defaultInput" && k !== "control_after_generate" && k !== "multiline" && k !== "tooltip" && k !== "dynamicPrompts") { + if (k !== "default" && k !== "forceInput" && k !== "defaultInput" && k !== "control_after_generate" && k !== "multiline" && k !== "tooltip") { let v1 = config1[1][k]; let v2 = config2[1]?.[k]; if (v1 === v2 || !v1 && !v2) continue; @@ -1799,45 +1215,480 @@ window.comfyAPI.widgetInputs.getWidgetConfig = getWidgetConfig; window.comfyAPI.widgetInputs.convertToInput = convertToInput; window.comfyAPI.widgetInputs.setWidgetConfig = setWidgetConfig; window.comfyAPI.widgetInputs.mergeIfValid = mergeIfValid; -const GROUP = Symbol(); -const PREFIX = "workflow"; -const SEPARATOR = ">"; -const Workflow = { - InUse: { - Free: 0, - Registered: 1, - InWorkflow: 2 - }, - isInUseGroupNode(name) { - const id2 = `${PREFIX}${SEPARATOR}${name}`; - if (app.graph.extra?.groupNodes?.[name]) { - if (app.graph.nodes.find((n) => n.type === id2)) { - return Workflow.InUse.InWorkflow; +const ORDER = Symbol(); +const PREFIX$1 = "workflow"; +const SEPARATOR$1 = ">"; +function merge(target, source) { + if (typeof target === "object" && typeof source === "object") { + for (const key in source) { + const sv = source[key]; + if (typeof sv === "object") { + let tv = target[key]; + if (!tv) tv = target[key] = {}; + merge(tv, source[key]); } else { - return Workflow.InUse.Registered; + target[key] = sv; } } - return Workflow.InUse.Free; - }, - storeGroupNode(name, data) { - let extra = app.graph.extra; - if (!extra) app.graph.extra = extra = {}; - let groupNodes = extra.groupNodes; - if (!groupNodes) extra.groupNodes = groupNodes = {}; - groupNodes[name] = data; } -}; -class GroupNodeBuilder { + return target; +} +__name(merge, "merge"); +class ManageGroupDialog extends ComfyDialog { static { - __name(this, "GroupNodeBuilder"); + __name(this, "ManageGroupDialog"); } - nodes; - nodeData; - constructor(nodes) { - this.nodes = nodes; + tabs; + selectedNodeIndex; + selectedTab = "Inputs"; + selectedGroup; + modifications = {}; + nodeItems; + app; + groupNodeType; + groupNodeDef; + groupData; + innerNodesList; + widgetsPage; + inputsPage; + outputsPage; + draggable; + get selectedNodeInnerIndex() { + return +this.nodeItems[this.selectedNodeIndex].dataset.nodeindex; } - async build() { - const name = await this.getName(); + constructor(app2) { + super(); + this.app = app2; + this.element = $el("dialog.comfy-group-manage", { + parent: document.body + }); + } + changeTab(tab) { + this.tabs[this.selectedTab].tab.classList.remove("active"); + this.tabs[this.selectedTab].page.classList.remove("active"); + this.tabs[tab].tab.classList.add("active"); + this.tabs[tab].page.classList.add("active"); + this.selectedTab = tab; + } + changeNode(index, force) { + if (!force && this.selectedNodeIndex === index) return; + if (this.selectedNodeIndex != null) { + this.nodeItems[this.selectedNodeIndex].classList.remove("selected"); + } + this.nodeItems[index].classList.add("selected"); + this.selectedNodeIndex = index; + if (!this.buildInputsPage() && this.selectedTab === "Inputs") { + this.changeTab("Widgets"); + } + if (!this.buildWidgetsPage() && this.selectedTab === "Widgets") { + this.changeTab("Outputs"); + } + if (!this.buildOutputsPage() && this.selectedTab === "Outputs") { + this.changeTab("Inputs"); + } + this.changeTab(this.selectedTab); + } + getGroupData() { + this.groupNodeType = LiteGraph.registered_node_types[`${PREFIX$1}${SEPARATOR$1}` + this.selectedGroup]; + this.groupNodeDef = this.groupNodeType.nodeData; + this.groupData = GroupNodeHandler.getGroupData(this.groupNodeType); + } + changeGroup(group, reset = true) { + this.selectedGroup = group; + this.getGroupData(); + const nodes = this.groupData.nodeData.nodes; + this.nodeItems = nodes.map( + (n, i) => $el( + "li.draggable-item", + { + dataset: { + nodeindex: n.index + "" + }, + onclick: /* @__PURE__ */ __name(() => { + this.changeNode(i); + }, "onclick") + }, + [ + $el("span.drag-handle"), + $el( + "div", + { + textContent: n.title ?? n.type + }, + n.title ? $el("span", { + textContent: n.type + }) : [] + ) + ] + ) + ); + this.innerNodesList.replaceChildren(...this.nodeItems); + if (reset) { + this.selectedNodeIndex = null; + this.changeNode(0); + } else { + const items = this.draggable.getAllItems(); + let index = items.findIndex((item) => item.classList.contains("selected")); + if (index === -1) index = this.selectedNodeIndex; + this.changeNode(index, true); + } + const ordered = [...nodes]; + this.draggable?.dispose(); + this.draggable = new DraggableList(this.innerNodesList, "li"); + this.draggable.addEventListener( + "dragend", + ({ detail: { oldPosition, newPosition } }) => { + if (oldPosition === newPosition) return; + ordered.splice(newPosition, 0, ordered.splice(oldPosition, 1)[0]); + for (let i = 0; i < ordered.length; i++) { + this.storeModification({ + nodeIndex: ordered[i].index, + section: ORDER, + prop: "order", + value: i + }); + } + } + ); + } + storeModification(props) { + const { nodeIndex, section, prop, value } = props; + const groupMod = this.modifications[this.selectedGroup] ??= {}; + const nodesMod = groupMod.nodes ??= {}; + const nodeMod = nodesMod[nodeIndex ?? this.selectedNodeInnerIndex] ??= {}; + const typeMod = nodeMod[section] ??= {}; + if (typeof value === "object") { + const objMod = typeMod[prop] ??= {}; + Object.assign(objMod, value); + } else { + typeMod[prop] = value; + } + } + getEditElement(section, prop, value, placeholder, checked, checkable = true) { + if (value === placeholder) value = ""; + const mods = this.modifications[this.selectedGroup]?.nodes?.[this.selectedNodeInnerIndex]?.[section]?.[prop]; + if (mods) { + if (mods.name != null) { + value = mods.name; + } + if (mods.visible != null) { + checked = mods.visible; + } + } + return $el("div", [ + $el("input", { + value, + placeholder, + type: "text", + onchange: /* @__PURE__ */ __name((e) => { + this.storeModification({ + section, + prop, + value: { name: e.target.value } + }); + }, "onchange") + }), + $el("label", { textContent: "Visible" }, [ + $el("input", { + type: "checkbox", + checked, + disabled: !checkable, + onchange: /* @__PURE__ */ __name((e) => { + this.storeModification({ + section, + prop, + value: { visible: !!e.target.checked } + }); + }, "onchange") + }) + ]) + ]); + } + buildWidgetsPage() { + const widgets = this.groupData.oldToNewWidgetMap[this.selectedNodeInnerIndex]; + const items = Object.keys(widgets ?? {}); + const type = app.graph.extra.groupNodes[this.selectedGroup]; + const config = type.config?.[this.selectedNodeInnerIndex]?.input; + this.widgetsPage.replaceChildren( + ...items.map((oldName) => { + return this.getEditElement( + "input", + oldName, + widgets[oldName], + oldName, + config?.[oldName]?.visible !== false + ); + }) + ); + return !!items.length; + } + buildInputsPage() { + const inputs = this.groupData.nodeInputs[this.selectedNodeInnerIndex]; + const items = Object.keys(inputs ?? {}); + const type = app.graph.extra.groupNodes[this.selectedGroup]; + const config = type.config?.[this.selectedNodeInnerIndex]?.input; + this.inputsPage.replaceChildren( + ...items.map((oldName) => { + let value = inputs[oldName]; + if (!value) { + return; + } + return this.getEditElement( + "input", + oldName, + value, + oldName, + config?.[oldName]?.visible !== false + ); + }).filter(Boolean) + ); + return !!items.length; + } + buildOutputsPage() { + const nodes = this.groupData.nodeData.nodes; + const innerNodeDef = this.groupData.getNodeDef( + nodes[this.selectedNodeInnerIndex] + ); + const outputs = innerNodeDef?.output ?? []; + const groupOutputs = this.groupData.oldToNewOutputMap[this.selectedNodeInnerIndex]; + const type = app.graph.extra.groupNodes[this.selectedGroup]; + const config = type.config?.[this.selectedNodeInnerIndex]?.output; + const node = this.groupData.nodeData.nodes[this.selectedNodeInnerIndex]; + const checkable = node.type !== "PrimitiveNode"; + this.outputsPage.replaceChildren( + ...outputs.map((type2, slot) => { + const groupOutputIndex = groupOutputs?.[slot]; + const oldName = innerNodeDef.output_name?.[slot] ?? type2; + let value = config?.[slot]?.name; + const visible = config?.[slot]?.visible || groupOutputIndex != null; + if (!value || value === oldName) { + value = ""; + } + return this.getEditElement( + "output", + slot, + value, + oldName, + visible, + checkable + ); + }).filter(Boolean) + ); + return !!outputs.length; + } + show(type) { + const groupNodes = Object.keys(app.graph.extra?.groupNodes ?? {}).sort( + (a, b) => a.localeCompare(b) + ); + this.innerNodesList = $el( + "ul.comfy-group-manage-list-items" + ); + this.widgetsPage = $el("section.comfy-group-manage-node-page"); + this.inputsPage = $el("section.comfy-group-manage-node-page"); + this.outputsPage = $el("section.comfy-group-manage-node-page"); + const pages = $el("div", [ + this.widgetsPage, + this.inputsPage, + this.outputsPage + ]); + this.tabs = [ + ["Inputs", this.inputsPage], + ["Widgets", this.widgetsPage], + ["Outputs", this.outputsPage] + ].reduce((p, [name, page]) => { + p[name] = { + tab: $el("a", { + onclick: /* @__PURE__ */ __name(() => { + this.changeTab(name); + }, "onclick"), + textContent: name + }), + page + }; + return p; + }, {}); + const outer = $el("div.comfy-group-manage-outer", [ + $el("header", [ + $el("h2", "Group Nodes"), + $el( + "select", + { + onchange: /* @__PURE__ */ __name((e) => { + this.changeGroup(e.target.value); + }, "onchange") + }, + groupNodes.map( + (g) => $el("option", { + textContent: g, + selected: `${PREFIX$1}${SEPARATOR$1}${g}` === type, + value: g + }) + ) + ) + ]), + $el("main", [ + $el("section.comfy-group-manage-list", this.innerNodesList), + $el("section.comfy-group-manage-node", [ + $el( + "header", + Object.values(this.tabs).map((t2) => t2.tab) + ), + pages + ]) + ]), + $el("footer", [ + $el( + "button.comfy-btn", + { + onclick: /* @__PURE__ */ __name((e) => { + const node = app.graph.nodes.find( + (n) => n.type === `${PREFIX$1}${SEPARATOR$1}` + this.selectedGroup + ); + if (node) { + useToastStore().addAlert( + "This group node is in use in the current workflow, please first remove these." + ); + return; + } + if (confirm( + `Are you sure you want to remove the node: "${this.selectedGroup}"` + )) { + delete app.graph.extra.groupNodes[this.selectedGroup]; + LiteGraph.unregisterNodeType( + `${PREFIX$1}${SEPARATOR$1}` + this.selectedGroup + ); + } + this.show(); + }, "onclick") + }, + "Delete Group Node" + ), + $el( + "button.comfy-btn", + { + onclick: /* @__PURE__ */ __name(async () => { + let nodesByType; + let recreateNodes = []; + const types = {}; + for (const g in this.modifications) { + const type2 = app.graph.extra.groupNodes[g]; + let config = type2.config ??= {}; + let nodeMods = this.modifications[g]?.nodes; + if (nodeMods) { + const keys = Object.keys(nodeMods); + if (nodeMods[keys[0]][ORDER]) { + const orderedNodes = []; + const orderedMods = {}; + const orderedConfig = {}; + for (const n of keys) { + const order = nodeMods[n][ORDER].order; + orderedNodes[order] = type2.nodes[+n]; + orderedMods[order] = nodeMods[n]; + orderedNodes[order].index = order; + } + for (const l of type2.links) { + if (l[0] != null) l[0] = type2.nodes[l[0]].index; + if (l[2] != null) l[2] = type2.nodes[l[2]].index; + } + if (type2.external) { + for (const ext2 of type2.external) { + ext2[0] = type2.nodes[ext2[0]]; + } + } + for (const id2 of keys) { + if (config[id2]) { + orderedConfig[type2.nodes[id2].index] = config[id2]; + } + delete config[id2]; + } + type2.nodes = orderedNodes; + nodeMods = orderedMods; + type2.config = config = orderedConfig; + } + merge(config, nodeMods); + } + types[g] = type2; + if (!nodesByType) { + nodesByType = app.graph.nodes.reduce((p, n) => { + p[n.type] ??= []; + p[n.type].push(n); + return p; + }, {}); + } + const nodes = nodesByType[`${PREFIX$1}${SEPARATOR$1}` + g]; + if (nodes) recreateNodes.push(...nodes); + } + await GroupNodeConfig.registerFromWorkflow(types, {}); + for (const node of recreateNodes) { + node.recreate(); + } + this.modifications = {}; + this.app.graph.setDirtyCanvas(true, true); + this.changeGroup(this.selectedGroup, false); + }, "onclick") + }, + "Save" + ), + $el( + "button.comfy-btn", + { onclick: /* @__PURE__ */ __name(() => this.element.close(), "onclick") }, + "Close" + ) + ]) + ]); + this.element.replaceChildren(outer); + this.changeGroup( + type ? groupNodes.find((g) => `${PREFIX$1}${SEPARATOR$1}${g}` === type) ?? groupNodes[0] : groupNodes[0] + ); + this.element.showModal(); + this.element.addEventListener("close", () => { + this.draggable?.dispose(); + this.element.remove(); + }); + } +} +window.comfyAPI = window.comfyAPI || {}; +window.comfyAPI.groupNodeManage = window.comfyAPI.groupNodeManage || {}; +window.comfyAPI.groupNodeManage.ManageGroupDialog = ManageGroupDialog; +const GROUP = Symbol(); +const PREFIX = "workflow"; +const SEPARATOR = ">"; +const Workflow = { + InUse: { + Free: 0, + Registered: 1, + InWorkflow: 2 + }, + isInUseGroupNode(name) { + const id2 = `${PREFIX}${SEPARATOR}${name}`; + if (app.graph.extra?.groupNodes?.[name]) { + if (app.graph.nodes.find((n) => n.type === id2)) { + return Workflow.InUse.InWorkflow; + } else { + return Workflow.InUse.Registered; + } + } + return Workflow.InUse.Free; + }, + storeGroupNode(name, data) { + let extra = app.graph.extra; + if (!extra) app.graph.extra = extra = {}; + let groupNodes = extra.groupNodes; + if (!groupNodes) extra.groupNodes = groupNodes = {}; + groupNodes[name] = data; + } +}; +class GroupNodeBuilder { + static { + __name(this, "GroupNodeBuilder"); + } + nodes; + nodeData; + constructor(nodes) { + this.nodes = nodes; + } + async build() { + const name = await this.getName(); if (!name) return; this.sortNodes(); this.nodeData = this.getNodeData(); @@ -1845,7 +1696,7 @@ class GroupNodeBuilder { return { name, nodeData: this.nodeData }; } async getName() { - const name = await useDialogService().prompt({ + const name = await useDialogService().showPromptDialog({ title: t("groupNode.create"), message: t("groupNode.enterName"), defaultValue: "" @@ -3267,49634 +3118,49476 @@ app.registerExtension({ }); } }); -/** - * @license - * Copyright 2010-2024 Three.js Authors - * SPDX-License-Identifier: MIT - */ -const REVISION = "170"; -const MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 }; -const TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 }; -const CullFaceNone = 0; -const CullFaceBack = 1; -const CullFaceFront = 2; -const CullFaceFrontBack = 3; -const BasicShadowMap = 0; -const PCFShadowMap = 1; -const PCFSoftShadowMap = 2; -const VSMShadowMap = 3; -const FrontSide = 0; -const BackSide = 1; -const DoubleSide = 2; -const NoBlending = 0; -const NormalBlending = 1; -const AdditiveBlending = 2; -const SubtractiveBlending = 3; -const MultiplyBlending = 4; -const CustomBlending = 5; -const AddEquation = 100; -const SubtractEquation = 101; -const ReverseSubtractEquation = 102; -const MinEquation = 103; -const MaxEquation = 104; -const ZeroFactor = 200; -const OneFactor = 201; -const SrcColorFactor = 202; -const OneMinusSrcColorFactor = 203; -const SrcAlphaFactor = 204; -const OneMinusSrcAlphaFactor = 205; -const DstAlphaFactor = 206; -const OneMinusDstAlphaFactor = 207; -const DstColorFactor = 208; -const OneMinusDstColorFactor = 209; -const SrcAlphaSaturateFactor = 210; -const ConstantColorFactor = 211; -const OneMinusConstantColorFactor = 212; -const ConstantAlphaFactor = 213; -const OneMinusConstantAlphaFactor = 214; -const NeverDepth = 0; -const AlwaysDepth = 1; -const LessDepth = 2; -const LessEqualDepth = 3; -const EqualDepth = 4; -const GreaterEqualDepth = 5; -const GreaterDepth = 6; -const NotEqualDepth = 7; -const MultiplyOperation = 0; -const MixOperation = 1; -const AddOperation = 2; -const NoToneMapping = 0; -const LinearToneMapping = 1; -const ReinhardToneMapping = 2; -const CineonToneMapping = 3; -const ACESFilmicToneMapping = 4; -const CustomToneMapping = 5; -const AgXToneMapping = 6; -const NeutralToneMapping = 7; -const AttachedBindMode = "attached"; -const DetachedBindMode = "detached"; -const UVMapping = 300; -const CubeReflectionMapping = 301; -const CubeRefractionMapping = 302; -const EquirectangularReflectionMapping = 303; -const EquirectangularRefractionMapping = 304; -const CubeUVReflectionMapping = 306; -const RepeatWrapping = 1e3; -const ClampToEdgeWrapping = 1001; -const MirroredRepeatWrapping = 1002; -const NearestFilter = 1003; -const NearestMipmapNearestFilter = 1004; -const NearestMipMapNearestFilter = 1004; -const NearestMipmapLinearFilter = 1005; -const NearestMipMapLinearFilter = 1005; -const LinearFilter = 1006; -const LinearMipmapNearestFilter = 1007; -const LinearMipMapNearestFilter = 1007; -const LinearMipmapLinearFilter = 1008; -const LinearMipMapLinearFilter = 1008; -const UnsignedByteType = 1009; -const ByteType = 1010; -const ShortType = 1011; -const UnsignedShortType = 1012; -const IntType = 1013; -const UnsignedIntType = 1014; -const FloatType = 1015; -const HalfFloatType = 1016; -const UnsignedShort4444Type = 1017; -const UnsignedShort5551Type = 1018; -const UnsignedInt248Type = 1020; -const UnsignedInt5999Type = 35902; -const AlphaFormat = 1021; -const RGBFormat = 1022; -const RGBAFormat = 1023; -const LuminanceFormat = 1024; -const LuminanceAlphaFormat = 1025; -const DepthFormat = 1026; -const DepthStencilFormat = 1027; -const RedFormat = 1028; -const RedIntegerFormat = 1029; -const RGFormat = 1030; -const RGIntegerFormat = 1031; -const RGBIntegerFormat = 1032; -const RGBAIntegerFormat = 1033; -const RGB_S3TC_DXT1_Format = 33776; -const RGBA_S3TC_DXT1_Format = 33777; -const RGBA_S3TC_DXT3_Format = 33778; -const RGBA_S3TC_DXT5_Format = 33779; -const RGB_PVRTC_4BPPV1_Format = 35840; -const RGB_PVRTC_2BPPV1_Format = 35841; -const RGBA_PVRTC_4BPPV1_Format = 35842; -const RGBA_PVRTC_2BPPV1_Format = 35843; -const RGB_ETC1_Format = 36196; -const RGB_ETC2_Format = 37492; -const RGBA_ETC2_EAC_Format = 37496; -const RGBA_ASTC_4x4_Format = 37808; -const RGBA_ASTC_5x4_Format = 37809; -const RGBA_ASTC_5x5_Format = 37810; -const RGBA_ASTC_6x5_Format = 37811; -const RGBA_ASTC_6x6_Format = 37812; -const RGBA_ASTC_8x5_Format = 37813; -const RGBA_ASTC_8x6_Format = 37814; -const RGBA_ASTC_8x8_Format = 37815; -const RGBA_ASTC_10x5_Format = 37816; -const RGBA_ASTC_10x6_Format = 37817; -const RGBA_ASTC_10x8_Format = 37818; -const RGBA_ASTC_10x10_Format = 37819; -const RGBA_ASTC_12x10_Format = 37820; -const RGBA_ASTC_12x12_Format = 37821; -const RGBA_BPTC_Format = 36492; -const RGB_BPTC_SIGNED_Format = 36494; -const RGB_BPTC_UNSIGNED_Format = 36495; -const RED_RGTC1_Format = 36283; -const SIGNED_RED_RGTC1_Format = 36284; -const RED_GREEN_RGTC2_Format = 36285; -const SIGNED_RED_GREEN_RGTC2_Format = 36286; -const LoopOnce = 2200; -const LoopRepeat = 2201; -const LoopPingPong = 2202; -const InterpolateDiscrete = 2300; -const InterpolateLinear = 2301; -const InterpolateSmooth = 2302; -const ZeroCurvatureEnding = 2400; -const ZeroSlopeEnding = 2401; -const WrapAroundEnding = 2402; -const NormalAnimationBlendMode = 2500; -const AdditiveAnimationBlendMode = 2501; -const TrianglesDrawMode = 0; -const TriangleStripDrawMode = 1; -const TriangleFanDrawMode = 2; -const BasicDepthPacking = 3200; -const RGBADepthPacking = 3201; -const RGBDepthPacking = 3202; -const RGDepthPacking = 3203; -const TangentSpaceNormalMap = 0; -const ObjectSpaceNormalMap = 1; -const NoColorSpace = ""; -const SRGBColorSpace = "srgb"; -const LinearSRGBColorSpace = "srgb-linear"; -const LinearTransfer = "linear"; -const SRGBTransfer = "srgb"; -const ZeroStencilOp = 0; -const KeepStencilOp = 7680; -const ReplaceStencilOp = 7681; -const IncrementStencilOp = 7682; -const DecrementStencilOp = 7683; -const IncrementWrapStencilOp = 34055; -const DecrementWrapStencilOp = 34056; -const InvertStencilOp = 5386; -const NeverStencilFunc = 512; -const LessStencilFunc = 513; -const EqualStencilFunc = 514; -const LessEqualStencilFunc = 515; -const GreaterStencilFunc = 516; -const NotEqualStencilFunc = 517; -const GreaterEqualStencilFunc = 518; -const AlwaysStencilFunc = 519; -const NeverCompare = 512; -const LessCompare = 513; -const EqualCompare = 514; -const LessEqualCompare = 515; -const GreaterCompare = 516; -const NotEqualCompare = 517; -const GreaterEqualCompare = 518; -const AlwaysCompare = 519; -const StaticDrawUsage = 35044; -const DynamicDrawUsage = 35048; -const StreamDrawUsage = 35040; -const StaticReadUsage = 35045; -const DynamicReadUsage = 35049; -const StreamReadUsage = 35041; -const StaticCopyUsage = 35046; -const DynamicCopyUsage = 35050; -const StreamCopyUsage = 35042; -const GLSL1 = "100"; -const GLSL3 = "300 es"; -const WebGLCoordinateSystem = 2e3; -const WebGPUCoordinateSystem = 2001; -class EventDispatcher { - static { - __name(this, "EventDispatcher"); - } - addEventListener(type, listener) { - if (this._listeners === void 0) this._listeners = {}; - const listeners = this._listeners; - if (listeners[type] === void 0) { - listeners[type] = []; - } - if (listeners[type].indexOf(listener) === -1) { - listeners[type].push(listener); - } - } - hasEventListener(type, listener) { - if (this._listeners === void 0) return false; - const listeners = this._listeners; - return listeners[type] !== void 0 && listeners[type].indexOf(listener) !== -1; - } - removeEventListener(type, listener) { - if (this._listeners === void 0) return; - const listeners = this._listeners; - const listenerArray = listeners[type]; - if (listenerArray !== void 0) { - const index = listenerArray.indexOf(listener); - if (index !== -1) { - listenerArray.splice(index, 1); - } - } - } - dispatchEvent(event) { - if (this._listeners === void 0) return; - const listeners = this._listeners; - const listenerArray = listeners[event.type]; - if (listenerArray !== void 0) { - event.target = this; - const array = listenerArray.slice(0); - for (let i = 0, l = array.length; i < l; i++) { - array[i].call(this, event); - } - event.target = null; - } +function dataURLToBlob(dataURL) { + const parts = dataURL.split(";base64,"); + const contentType = parts[0].split(":")[1]; + const byteString = atob(parts[1]); + const arrayBuffer = new ArrayBuffer(byteString.length); + const uint8Array = new Uint8Array(arrayBuffer); + for (let i = 0; i < byteString.length; i++) { + uint8Array[i] = byteString.charCodeAt(i); } + return new Blob([arrayBuffer], { type: contentType }); } -const _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"]; -let _seed = 1234567; -const DEG2RAD = Math.PI / 180; -const RAD2DEG = 180 / Math.PI; -function generateUUID() { - const d0 = Math.random() * 4294967295 | 0; - const d1 = Math.random() * 4294967295 | 0; - const d2 = Math.random() * 4294967295 | 0; - const d3 = Math.random() * 4294967295 | 0; - const uuid = _lut[d0 & 255] + _lut[d0 >> 8 & 255] + _lut[d0 >> 16 & 255] + _lut[d0 >> 24 & 255] + "-" + _lut[d1 & 255] + _lut[d1 >> 8 & 255] + "-" + _lut[d1 >> 16 & 15 | 64] + _lut[d1 >> 24 & 255] + "-" + _lut[d2 & 63 | 128] + _lut[d2 >> 8 & 255] + "-" + _lut[d2 >> 16 & 255] + _lut[d2 >> 24 & 255] + _lut[d3 & 255] + _lut[d3 >> 8 & 255] + _lut[d3 >> 16 & 255] + _lut[d3 >> 24 & 255]; - return uuid.toLowerCase(); -} -__name(generateUUID, "generateUUID"); -function clamp(value, min, max2) { - return Math.max(min, Math.min(max2, value)); +__name(dataURLToBlob, "dataURLToBlob"); +function loadedImageToBlob(image) { + const canvas = document.createElement("canvas"); + canvas.width = image.width; + canvas.height = image.height; + const ctx = canvas.getContext("2d"); + ctx.drawImage(image, 0, 0); + const dataURL = canvas.toDataURL("image/png", 1); + const blob = dataURLToBlob(dataURL); + return blob; } -__name(clamp, "clamp"); -function euclideanModulo(n, m) { - return (n % m + m) % m; +__name(loadedImageToBlob, "loadedImageToBlob"); +function loadImage(imagePath) { + return new Promise((resolve, reject) => { + const image = new Image(); + image.onload = function() { + resolve(image); + }; + image.src = imagePath; + }); } -__name(euclideanModulo, "euclideanModulo"); -function mapLinear(x, a1, a2, b1, b22) { - return b1 + (x - a1) * (b22 - b1) / (a2 - a1); +__name(loadImage, "loadImage"); +async function uploadMask(filepath, formData) { + await api.fetchApi("/upload/mask", { + method: "POST", + body: formData + }).then((response) => { + }).catch((error) => { + console.error("Error:", error); + }); + ComfyApp.clipspace.imgs[ComfyApp.clipspace["selectedIndex"]] = new Image(); + ComfyApp.clipspace.imgs[ComfyApp.clipspace["selectedIndex"]].src = api.apiURL( + "/view?" + new URLSearchParams(filepath).toString() + app.getPreviewFormatParam() + app.getRandParam() + ); + if (ComfyApp.clipspace.images) + ComfyApp.clipspace.images[ComfyApp.clipspace["selectedIndex"]] = filepath; + ClipspaceDialog.invalidatePreview(); } -__name(mapLinear, "mapLinear"); -function inverseLerp(x, y, value) { - if (x !== y) { - return (value - x) / (y - x); - } else { - return 0; +__name(uploadMask, "uploadMask"); +function prepare_mask(image, maskCanvas, maskCtx, maskColor) { + maskCtx.drawImage(image, 0, 0, maskCanvas.width, maskCanvas.height); + const maskData = maskCtx.getImageData( + 0, + 0, + maskCanvas.width, + maskCanvas.height + ); + for (let i = 0; i < maskData.data.length; i += 4) { + if (maskData.data[i + 3] == 255) maskData.data[i + 3] = 0; + else maskData.data[i + 3] = 255; + maskData.data[i] = maskColor.r; + maskData.data[i + 1] = maskColor.g; + maskData.data[i + 2] = maskColor.b; } + maskCtx.globalCompositeOperation = "source-over"; + maskCtx.putImageData(maskData, 0, 0); } -__name(inverseLerp, "inverseLerp"); -function lerp(x, y, t2) { - return (1 - t2) * x + t2 * y; -} -__name(lerp, "lerp"); -function damp(x, y, lambda, dt) { - return lerp(x, y, 1 - Math.exp(-lambda * dt)); -} -__name(damp, "damp"); -function pingpong(x, length = 1) { - return length - Math.abs(euclideanModulo(x, length * 2) - length); -} -__name(pingpong, "pingpong"); -function smoothstep(x, min, max2) { - if (x <= min) return 0; - if (x >= max2) return 1; - x = (x - min) / (max2 - min); - return x * x * (3 - 2 * x); -} -__name(smoothstep, "smoothstep"); -function smootherstep(x, min, max2) { - if (x <= min) return 0; - if (x >= max2) return 1; - x = (x - min) / (max2 - min); - return x * x * x * (x * (x * 6 - 15) + 10); -} -__name(smootherstep, "smootherstep"); -function randInt(low, high) { - return low + Math.floor(Math.random() * (high - low + 1)); -} -__name(randInt, "randInt"); -function randFloat(low, high) { - return low + Math.random() * (high - low); -} -__name(randFloat, "randFloat"); -function randFloatSpread(range) { - return range * (0.5 - Math.random()); -} -__name(randFloatSpread, "randFloatSpread"); -function seededRandom(s) { - if (s !== void 0) _seed = s; - let t2 = _seed += 1831565813; - t2 = Math.imul(t2 ^ t2 >>> 15, t2 | 1); - t2 ^= t2 + Math.imul(t2 ^ t2 >>> 7, t2 | 61); - return ((t2 ^ t2 >>> 14) >>> 0) / 4294967296; -} -__name(seededRandom, "seededRandom"); -function degToRad(degrees) { - return degrees * DEG2RAD; -} -__name(degToRad, "degToRad"); -function radToDeg(radians) { - return radians * RAD2DEG; -} -__name(radToDeg, "radToDeg"); -function isPowerOfTwo(value) { - return (value & value - 1) === 0 && value !== 0; -} -__name(isPowerOfTwo, "isPowerOfTwo"); -function ceilPowerOfTwo(value) { - return Math.pow(2, Math.ceil(Math.log(value) / Math.LN2)); -} -__name(ceilPowerOfTwo, "ceilPowerOfTwo"); -function floorPowerOfTwo(value) { - return Math.pow(2, Math.floor(Math.log(value) / Math.LN2)); -} -__name(floorPowerOfTwo, "floorPowerOfTwo"); -function setQuaternionFromProperEuler(q, a, b, c, order) { - const cos = Math.cos; - const sin = Math.sin; - const c2 = cos(b / 2); - const s2 = sin(b / 2); - const c13 = cos((a + c) / 2); - const s13 = sin((a + c) / 2); - const c1_3 = cos((a - c) / 2); - const s1_3 = sin((a - c) / 2); - const c3_1 = cos((c - a) / 2); - const s3_1 = sin((c - a) / 2); - switch (order) { - case "XYX": - q.set(c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13); - break; - case "YZY": - q.set(s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13); - break; - case "ZXZ": - q.set(s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13); - break; - case "XZX": - q.set(c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13); - break; - case "YXY": - q.set(s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13); - break; - case "ZYZ": - q.set(s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13); - break; - default: - console.warn("THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: " + order); +__name(prepare_mask, "prepare_mask"); +var PointerType = /* @__PURE__ */ ((PointerType2) => { + PointerType2["Arc"] = "arc"; + PointerType2["Rect"] = "rect"; + return PointerType2; +})(PointerType || {}); +var CompositionOperation$1 = /* @__PURE__ */ ((CompositionOperation2) => { + CompositionOperation2["SourceOver"] = "source-over"; + CompositionOperation2["DestinationOut"] = "destination-out"; + return CompositionOperation2; +})(CompositionOperation$1 || {}); +class MaskEditorDialogOld extends ComfyDialog { + static { + __name(this, "MaskEditorDialogOld"); } -} -__name(setQuaternionFromProperEuler, "setQuaternionFromProperEuler"); -function denormalize(value, array) { - switch (array.constructor) { - case Float32Array: - return value; - case Uint32Array: - return value / 4294967295; - case Uint16Array: - return value / 65535; - case Uint8Array: - return value / 255; - case Int32Array: - return Math.max(value / 2147483647, -1); - case Int16Array: - return Math.max(value / 32767, -1); - case Int8Array: - return Math.max(value / 127, -1); - default: - throw new Error("Invalid component type."); + static instance = null; + static mousedown_x = null; + static mousedown_y = null; + brush; + maskCtx; + maskCanvas; + brush_size_slider; + brush_opacity_slider; + colorButton; + saveButton; + zoom_ratio; + pan_x; + pan_y; + imgCanvas; + last_display_style; + is_visible; + image; + handler_registered; + brush_slider_input; + cursorX; + cursorY; + mousedown_pan_x; + mousedown_pan_y; + last_pressure; + pointer_type; + brush_pointer_type_select; + static getInstance() { + if (!MaskEditorDialogOld.instance) { + MaskEditorDialogOld.instance = new MaskEditorDialogOld(); + } + return MaskEditorDialogOld.instance; } -} -__name(denormalize, "denormalize"); -function normalize(value, array) { - switch (array.constructor) { - case Float32Array: - return value; - case Uint32Array: - return Math.round(value * 4294967295); - case Uint16Array: - return Math.round(value * 65535); - case Uint8Array: - return Math.round(value * 255); - case Int32Array: - return Math.round(value * 2147483647); - case Int16Array: - return Math.round(value * 32767); - case Int8Array: - return Math.round(value * 127); - default: - throw new Error("Invalid component type."); - } -} -__name(normalize, "normalize"); -const MathUtils = { - DEG2RAD, - RAD2DEG, - generateUUID, - clamp, - euclideanModulo, - mapLinear, - inverseLerp, - lerp, - damp, - pingpong, - smoothstep, - smootherstep, - randInt, - randFloat, - randFloatSpread, - seededRandom, - degToRad, - radToDeg, - isPowerOfTwo, - ceilPowerOfTwo, - floorPowerOfTwo, - setQuaternionFromProperEuler, - normalize, - denormalize -}; -class Vector2 { - static { - __name(this, "Vector2"); + is_layout_created = false; + constructor() { + super(); + this.element = $el("div.comfy-modal", { parent: document.body }, [ + $el("div.comfy-modal-content", [...this.createButtons()]) + ]); } - constructor(x = 0, y = 0) { - Vector2.prototype.isVector2 = true; - this.x = x; - this.y = y; + createButtons() { + return []; } - get width() { - return this.x; + createButton(name, callback) { + var button = document.createElement("button"); + button.style.pointerEvents = "auto"; + button.innerText = name; + button.addEventListener("click", callback); + return button; } - set width(value) { - this.x = value; + createLeftButton(name, callback) { + var button = this.createButton(name, callback); + button.style.cssFloat = "left"; + button.style.marginRight = "4px"; + return button; } - get height() { - return this.y; + createRightButton(name, callback) { + var button = this.createButton(name, callback); + button.style.cssFloat = "right"; + button.style.marginLeft = "4px"; + return button; } - set height(value) { - this.y = value; + createLeftSlider(self2, name, callback) { + const divElement = document.createElement("div"); + divElement.id = "maskeditor-slider"; + divElement.style.cssFloat = "left"; + divElement.style.fontFamily = "sans-serif"; + divElement.style.marginRight = "4px"; + divElement.style.color = "var(--input-text)"; + divElement.style.backgroundColor = "var(--comfy-input-bg)"; + divElement.style.borderRadius = "8px"; + divElement.style.borderColor = "var(--border-color)"; + divElement.style.borderStyle = "solid"; + divElement.style.fontSize = "15px"; + divElement.style.height = "25px"; + divElement.style.padding = "1px 6px"; + divElement.style.display = "flex"; + divElement.style.position = "relative"; + divElement.style.top = "2px"; + divElement.style.pointerEvents = "auto"; + self2.brush_slider_input = document.createElement("input"); + self2.brush_slider_input.setAttribute("type", "range"); + self2.brush_slider_input.setAttribute("min", "1"); + self2.brush_slider_input.setAttribute("max", "100"); + self2.brush_slider_input.setAttribute("value", "10"); + const labelElement = document.createElement("label"); + labelElement.textContent = name; + divElement.appendChild(labelElement); + divElement.appendChild(self2.brush_slider_input); + self2.brush_slider_input.addEventListener("change", callback); + return divElement; } - set(x, y) { - this.x = x; - this.y = y; - return this; + createOpacitySlider(self2, name, callback) { + const divElement = document.createElement("div"); + divElement.id = "maskeditor-opacity-slider"; + divElement.style.cssFloat = "left"; + divElement.style.fontFamily = "sans-serif"; + divElement.style.marginRight = "4px"; + divElement.style.color = "var(--input-text)"; + divElement.style.backgroundColor = "var(--comfy-input-bg)"; + divElement.style.borderRadius = "8px"; + divElement.style.borderColor = "var(--border-color)"; + divElement.style.borderStyle = "solid"; + divElement.style.fontSize = "15px"; + divElement.style.height = "25px"; + divElement.style.padding = "1px 6px"; + divElement.style.display = "flex"; + divElement.style.position = "relative"; + divElement.style.top = "2px"; + divElement.style.pointerEvents = "auto"; + self2.opacity_slider_input = document.createElement("input"); + self2.opacity_slider_input.setAttribute("type", "range"); + self2.opacity_slider_input.setAttribute("min", "0.1"); + self2.opacity_slider_input.setAttribute("max", "1.0"); + self2.opacity_slider_input.setAttribute("step", "0.01"); + self2.opacity_slider_input.setAttribute("value", "0.7"); + const labelElement = document.createElement("label"); + labelElement.textContent = name; + divElement.appendChild(labelElement); + divElement.appendChild(self2.opacity_slider_input); + self2.opacity_slider_input.addEventListener("input", callback); + return divElement; } - setScalar(scalar) { - this.x = scalar; - this.y = scalar; - return this; + createPointerTypeSelect(self2) { + const divElement = document.createElement("div"); + divElement.id = "maskeditor-pointer-type"; + divElement.style.cssFloat = "left"; + divElement.style.fontFamily = "sans-serif"; + divElement.style.marginRight = "4px"; + divElement.style.color = "var(--input-text)"; + divElement.style.backgroundColor = "var(--comfy-input-bg)"; + divElement.style.borderRadius = "8px"; + divElement.style.borderColor = "var(--border-color)"; + divElement.style.borderStyle = "solid"; + divElement.style.fontSize = "15px"; + divElement.style.height = "25px"; + divElement.style.padding = "1px 6px"; + divElement.style.display = "flex"; + divElement.style.position = "relative"; + divElement.style.top = "2px"; + divElement.style.pointerEvents = "auto"; + const labelElement = document.createElement("label"); + labelElement.textContent = "Pointer Type:"; + const selectElement = document.createElement("select"); + selectElement.style.borderRadius = "0"; + selectElement.style.borderColor = "transparent"; + selectElement.style.borderStyle = "unset"; + selectElement.style.fontSize = "0.9em"; + const optionArc = document.createElement("option"); + optionArc.value = "arc"; + optionArc.text = "Circle"; + optionArc.selected = true; + const optionRect = document.createElement("option"); + optionRect.value = "rect"; + optionRect.text = "Square"; + selectElement.appendChild(optionArc); + selectElement.appendChild(optionRect); + selectElement.addEventListener("change", (event) => { + const target = event.target; + self2.pointer_type = target.value; + this.setBrushBorderRadius(self2); + }); + divElement.appendChild(labelElement); + divElement.appendChild(selectElement); + return divElement; } - setX(x) { - this.x = x; - return this; + setBrushBorderRadius(self2) { + if (self2.pointer_type === "rect") { + this.brush.style.borderRadius = "0%"; + this.brush.style.MozBorderRadius = "0%"; + this.brush.style.WebkitBorderRadius = "0%"; + } else { + this.brush.style.borderRadius = "50%"; + this.brush.style.MozBorderRadius = "50%"; + this.brush.style.WebkitBorderRadius = "50%"; + } } - setY(y) { - this.y = y; - return this; + setlayout(imgCanvas, maskCanvas) { + const self2 = this; + self2.pointer_type = "arc"; + var bottom_panel = document.createElement("div"); + bottom_panel.style.position = "absolute"; + bottom_panel.style.bottom = "0px"; + bottom_panel.style.left = "20px"; + bottom_panel.style.right = "20px"; + bottom_panel.style.height = "50px"; + bottom_panel.style.pointerEvents = "none"; + var brush = document.createElement("div"); + brush.id = "brush"; + brush.style.backgroundColor = "transparent"; + brush.style.outline = "1px dashed black"; + brush.style.boxShadow = "0 0 0 1px white"; + brush.style.position = "absolute"; + brush.style.zIndex = "8889"; + brush.style.pointerEvents = "none"; + this.brush = brush; + this.setBrushBorderRadius(self2); + this.element.appendChild(imgCanvas); + this.element.appendChild(maskCanvas); + this.element.appendChild(bottom_panel); + document.body.appendChild(brush); + var clearButton = this.createLeftButton("Clear", () => { + self2.maskCtx.clearRect( + 0, + 0, + self2.maskCanvas.width, + self2.maskCanvas.height + ); + }); + this.brush_size_slider = this.createLeftSlider( + self2, + "Thickness", + (event) => { + self2.brush_size = event.target.value; + self2.updateBrushPreview(self2); + } + ); + this.brush_opacity_slider = this.createOpacitySlider( + self2, + "Opacity", + (event) => { + self2.brush_opacity = event.target.value; + if (self2.brush_color_mode !== "negative") { + self2.maskCanvas.style.opacity = self2.brush_opacity.toString(); + } + } + ); + this.brush_pointer_type_select = this.createPointerTypeSelect(self2); + this.colorButton = this.createLeftButton(this.getColorButtonText(), () => { + if (self2.brush_color_mode === "black") { + self2.brush_color_mode = "white"; + } else if (self2.brush_color_mode === "white") { + self2.brush_color_mode = "negative"; + } else { + self2.brush_color_mode = "black"; + } + self2.updateWhenBrushColorModeChanged(); + }); + var cancelButton = this.createRightButton("Cancel", () => { + document.removeEventListener("keydown", MaskEditorDialogOld.handleKeyDown); + self2.close(); + }); + this.saveButton = this.createRightButton("Save", () => { + document.removeEventListener("keydown", MaskEditorDialogOld.handleKeyDown); + self2.save(); + }); + this.element.appendChild(imgCanvas); + this.element.appendChild(maskCanvas); + this.element.appendChild(bottom_panel); + bottom_panel.appendChild(clearButton); + bottom_panel.appendChild(this.saveButton); + bottom_panel.appendChild(cancelButton); + bottom_panel.appendChild(this.brush_size_slider); + bottom_panel.appendChild(this.brush_opacity_slider); + bottom_panel.appendChild(this.brush_pointer_type_select); + bottom_panel.appendChild(this.colorButton); + imgCanvas.style.position = "absolute"; + maskCanvas.style.position = "absolute"; + imgCanvas.style.top = "200"; + imgCanvas.style.left = "0"; + maskCanvas.style.top = imgCanvas.style.top; + maskCanvas.style.left = imgCanvas.style.left; + const maskCanvasStyle = this.getMaskCanvasStyle(); + maskCanvas.style.mixBlendMode = maskCanvasStyle.mixBlendMode; + maskCanvas.style.opacity = maskCanvasStyle.opacity.toString(); } - setComponent(index, value) { - switch (index) { - case 0: - this.x = value; - break; - case 1: - this.y = value; - break; - default: - throw new Error("index is out of range: " + index); + async show() { + this.zoom_ratio = 1; + this.pan_x = 0; + this.pan_y = 0; + if (!this.is_layout_created) { + const imgCanvas = document.createElement("canvas"); + const maskCanvas = document.createElement("canvas"); + imgCanvas.id = "imageCanvas"; + maskCanvas.id = "maskCanvas"; + this.setlayout(imgCanvas, maskCanvas); + this.imgCanvas = imgCanvas; + this.maskCanvas = maskCanvas; + this.maskCtx = maskCanvas.getContext("2d", { willReadFrequently: true }); + this.setEventHandler(maskCanvas); + this.is_layout_created = true; + const self2 = this; + const observer = new MutationObserver(function(mutations) { + mutations.forEach(function(mutation) { + if (mutation.type === "attributes" && mutation.attributeName === "style") { + if (self2.last_display_style && self2.last_display_style != "none" && self2.element.style.display == "none") { + self2.brush.style.display = "none"; + ComfyApp.onClipspaceEditorClosed(); + } + self2.last_display_style = self2.element.style.display; + } + }); + }); + const config = { attributes: true }; + observer.observe(this.element, config); } - return this; - } - getComponent(index) { - switch (index) { - case 0: - return this.x; - case 1: - return this.y; - default: - throw new Error("index is out of range: " + index); + document.addEventListener("keydown", MaskEditorDialogOld.handleKeyDown); + if (ComfyApp.clipspace_return_node) { + this.saveButton.innerText = "Save to node"; + } else { + this.saveButton.innerText = "Save"; } + this.saveButton.disabled = false; + this.element.style.display = "block"; + this.element.style.width = "85%"; + this.element.style.margin = "0 7.5%"; + this.element.style.height = "100vh"; + this.element.style.top = "50%"; + this.element.style.left = "42%"; + this.element.style.zIndex = "8888"; + await this.setImages(this.imgCanvas); + this.is_visible = true; } - clone() { - return new this.constructor(this.x, this.y); - } - copy(v) { - this.x = v.x; - this.y = v.y; - return this; - } - add(v) { - this.x += v.x; - this.y += v.y; - return this; + isOpened() { + return this.element.style.display == "block"; } - addScalar(s) { - this.x += s; - this.y += s; - return this; + invalidateCanvas(orig_image, mask_image) { + this.imgCanvas.width = orig_image.width; + this.imgCanvas.height = orig_image.height; + this.maskCanvas.width = orig_image.width; + this.maskCanvas.height = orig_image.height; + let imgCtx = this.imgCanvas.getContext("2d", { willReadFrequently: true }); + let maskCtx = this.maskCanvas.getContext("2d", { + willReadFrequently: true + }); + imgCtx.drawImage(orig_image, 0, 0, orig_image.width, orig_image.height); + prepare_mask(mask_image, this.maskCanvas, maskCtx, this.getMaskColor()); } - addVectors(a, b) { - this.x = a.x + b.x; - this.y = a.y + b.y; - return this; + async setImages(imgCanvas) { + let self2 = this; + const imgCtx = imgCanvas.getContext("2d", { willReadFrequently: true }); + const maskCtx = this.maskCtx; + const maskCanvas = this.maskCanvas; + imgCtx.clearRect(0, 0, this.imgCanvas.width, this.imgCanvas.height); + maskCtx.clearRect(0, 0, this.maskCanvas.width, this.maskCanvas.height); + const filepath = ComfyApp.clipspace.images; + const alpha_url = new URL( + ComfyApp.clipspace.imgs[ComfyApp.clipspace["selectedIndex"]].src + ); + alpha_url.searchParams.delete("channel"); + alpha_url.searchParams.delete("preview"); + alpha_url.searchParams.set("channel", "a"); + let mask_image = await loadImage(alpha_url); + const rgb_url = new URL( + ComfyApp.clipspace.imgs[ComfyApp.clipspace["selectedIndex"]].src + ); + rgb_url.searchParams.delete("channel"); + rgb_url.searchParams.set("channel", "rgb"); + this.image = new Image(); + this.image.onload = function() { + maskCanvas.width = self2.image.width; + maskCanvas.height = self2.image.height; + self2.invalidateCanvas(self2.image, mask_image); + self2.initializeCanvasPanZoom(); + }; + this.image.src = rgb_url.toString(); } - addScaledVector(v, s) { - this.x += v.x * s; - this.y += v.y * s; - return this; + initializeCanvasPanZoom() { + let drawWidth = this.image.width; + let drawHeight = this.image.height; + let width = this.element.clientWidth; + let height = this.element.clientHeight; + if (this.image.width > width) { + drawWidth = width; + drawHeight = drawWidth / this.image.width * this.image.height; + } + if (drawHeight > height) { + drawHeight = height; + drawWidth = drawHeight / this.image.height * this.image.width; + } + this.zoom_ratio = drawWidth / this.image.width; + const canvasX = (width - drawWidth) / 2; + const canvasY = (height - drawHeight) / 2; + this.pan_x = canvasX; + this.pan_y = canvasY; + this.invalidatePanZoom(); } - sub(v) { - this.x -= v.x; - this.y -= v.y; - return this; + invalidatePanZoom() { + let raw_width = this.image.width * this.zoom_ratio; + let raw_height = this.image.height * this.zoom_ratio; + if (this.pan_x + raw_width < 10) { + this.pan_x = 10 - raw_width; + } + if (this.pan_y + raw_height < 10) { + this.pan_y = 10 - raw_height; + } + let width = `${raw_width}px`; + let height = `${raw_height}px`; + let left = `${this.pan_x}px`; + let top = `${this.pan_y}px`; + this.maskCanvas.style.width = width; + this.maskCanvas.style.height = height; + this.maskCanvas.style.left = left; + this.maskCanvas.style.top = top; + this.imgCanvas.style.width = width; + this.imgCanvas.style.height = height; + this.imgCanvas.style.left = left; + this.imgCanvas.style.top = top; } - subScalar(s) { - this.x -= s; - this.y -= s; - return this; + setEventHandler(maskCanvas) { + const self2 = this; + if (!this.handler_registered) { + maskCanvas.addEventListener("contextmenu", (event) => { + event.preventDefault(); + }); + this.element.addEventListener( + "wheel", + (event) => this.handleWheelEvent(self2, event) + ); + this.element.addEventListener( + "pointermove", + (event) => this.pointMoveEvent(self2, event) + ); + this.element.addEventListener( + "touchmove", + (event) => this.pointMoveEvent(self2, event) + ); + this.element.addEventListener("dragstart", (event) => { + if (event.ctrlKey) { + event.preventDefault(); + } + }); + maskCanvas.addEventListener( + "pointerdown", + (event) => this.handlePointerDown(self2, event) + ); + maskCanvas.addEventListener( + "pointermove", + (event) => this.draw_move(self2, event) + ); + maskCanvas.addEventListener( + "touchmove", + (event) => this.draw_move(self2, event) + ); + maskCanvas.addEventListener("pointerover", (event) => { + this.brush.style.display = "block"; + }); + maskCanvas.addEventListener("pointerleave", (event) => { + this.brush.style.display = "none"; + }); + document.addEventListener( + "pointerup", + MaskEditorDialogOld.handlePointerUp + ); + this.handler_registered = true; + } } - subVectors(a, b) { - this.x = a.x - b.x; - this.y = a.y - b.y; - return this; - } - multiply(v) { - this.x *= v.x; - this.y *= v.y; - return this; - } - multiplyScalar(scalar) { - this.x *= scalar; - this.y *= scalar; - return this; - } - divide(v) { - this.x /= v.x; - this.y /= v.y; - return this; - } - divideScalar(scalar) { - return this.multiplyScalar(1 / scalar); - } - applyMatrix3(m) { - const x = this.x, y = this.y; - const e = m.elements; - this.x = e[0] * x + e[3] * y + e[6]; - this.y = e[1] * x + e[4] * y + e[7]; - return this; - } - min(v) { - this.x = Math.min(this.x, v.x); - this.y = Math.min(this.y, v.y); - return this; - } - max(v) { - this.x = Math.max(this.x, v.x); - this.y = Math.max(this.y, v.y); - return this; - } - clamp(min, max2) { - this.x = Math.max(min.x, Math.min(max2.x, this.x)); - this.y = Math.max(min.y, Math.min(max2.y, this.y)); - return this; - } - clampScalar(minVal, maxVal) { - this.x = Math.max(minVal, Math.min(maxVal, this.x)); - this.y = Math.max(minVal, Math.min(maxVal, this.y)); - return this; - } - clampLength(min, max2) { - const length = this.length(); - return this.divideScalar(length || 1).multiplyScalar(Math.max(min, Math.min(max2, length))); - } - floor() { - this.x = Math.floor(this.x); - this.y = Math.floor(this.y); - return this; - } - ceil() { - this.x = Math.ceil(this.x); - this.y = Math.ceil(this.y); - return this; - } - round() { - this.x = Math.round(this.x); - this.y = Math.round(this.y); - return this; - } - roundToZero() { - this.x = Math.trunc(this.x); - this.y = Math.trunc(this.y); - return this; - } - negate() { - this.x = -this.x; - this.y = -this.y; - return this; - } - dot(v) { - return this.x * v.x + this.y * v.y; - } - cross(v) { - return this.x * v.y - this.y * v.x; - } - lengthSq() { - return this.x * this.x + this.y * this.y; - } - length() { - return Math.sqrt(this.x * this.x + this.y * this.y); - } - manhattanLength() { - return Math.abs(this.x) + Math.abs(this.y); - } - normalize() { - return this.divideScalar(this.length() || 1); - } - angle() { - const angle = Math.atan2(-this.y, -this.x) + Math.PI; - return angle; - } - angleTo(v) { - const denominator = Math.sqrt(this.lengthSq() * v.lengthSq()); - if (denominator === 0) return Math.PI / 2; - const theta = this.dot(v) / denominator; - return Math.acos(clamp(theta, -1, 1)); - } - distanceTo(v) { - return Math.sqrt(this.distanceToSquared(v)); - } - distanceToSquared(v) { - const dx = this.x - v.x, dy = this.y - v.y; - return dx * dx + dy * dy; + getMaskCanvasStyle() { + if (this.brush_color_mode === "negative") { + return { + mixBlendMode: "difference", + opacity: "1" + }; + } else { + return { + mixBlendMode: "initial", + opacity: this.brush_opacity + }; + } } - manhattanDistanceTo(v) { - return Math.abs(this.x - v.x) + Math.abs(this.y - v.y); + getMaskColor() { + if (this.brush_color_mode === "black") { + return { r: 0, g: 0, b: 0 }; + } + if (this.brush_color_mode === "white") { + return { r: 255, g: 255, b: 255 }; + } + if (this.brush_color_mode === "negative") { + return { r: 255, g: 255, b: 255 }; + } + return { r: 0, g: 0, b: 0 }; } - setLength(length) { - return this.normalize().multiplyScalar(length); + getMaskFillStyle() { + const maskColor = this.getMaskColor(); + return "rgb(" + maskColor.r + "," + maskColor.g + "," + maskColor.b + ")"; } - lerp(v, alpha) { - this.x += (v.x - this.x) * alpha; - this.y += (v.y - this.y) * alpha; - return this; + getColorButtonText() { + let colorCaption = "unknown"; + if (this.brush_color_mode === "black") { + colorCaption = "black"; + } else if (this.brush_color_mode === "white") { + colorCaption = "white"; + } else if (this.brush_color_mode === "negative") { + colorCaption = "negative"; + } + return "Color: " + colorCaption; } - lerpVectors(v1, v2, alpha) { - this.x = v1.x + (v2.x - v1.x) * alpha; - this.y = v1.y + (v2.y - v1.y) * alpha; - return this; + updateWhenBrushColorModeChanged() { + this.colorButton.innerText = this.getColorButtonText(); + const maskCanvasStyle = this.getMaskCanvasStyle(); + this.maskCanvas.style.mixBlendMode = maskCanvasStyle.mixBlendMode; + this.maskCanvas.style.opacity = maskCanvasStyle.opacity.toString(); + const maskColor = this.getMaskColor(); + const maskData = this.maskCtx.getImageData( + 0, + 0, + this.maskCanvas.width, + this.maskCanvas.height + ); + for (let i = 0; i < maskData.data.length; i += 4) { + maskData.data[i] = maskColor.r; + maskData.data[i + 1] = maskColor.g; + maskData.data[i + 2] = maskColor.b; + } + this.maskCtx.putImageData(maskData, 0, 0); } - equals(v) { - return v.x === this.x && v.y === this.y; + brush_opacity = 0.7; + brush_size = 10; + brush_color_mode = "black"; + drawing_mode = false; + lastx = -1; + lasty = -1; + lasttime = 0; + static handleKeyDown(event) { + const self2 = MaskEditorDialogOld.instance; + if (event.key === "]") { + self2.brush_size = Math.min(self2.brush_size + 2, 100); + self2.brush_slider_input.value = self2.brush_size; + } else if (event.key === "[") { + self2.brush_size = Math.max(self2.brush_size - 2, 1); + self2.brush_slider_input.value = self2.brush_size; + } else if (event.key === "Enter") { + self2.save(); + } + self2.updateBrushPreview(self2); } - fromArray(array, offset = 0) { - this.x = array[offset]; - this.y = array[offset + 1]; - return this; + static handlePointerUp(event) { + event.preventDefault(); + this.mousedown_x = null; + this.mousedown_y = null; + MaskEditorDialogOld.instance.drawing_mode = false; } - toArray(array = [], offset = 0) { - array[offset] = this.x; - array[offset + 1] = this.y; - return array; + updateBrushPreview(self2) { + const brush = self2.brush; + var centerX = self2.cursorX; + var centerY = self2.cursorY; + brush.style.width = self2.brush_size * 2 * this.zoom_ratio + "px"; + brush.style.height = self2.brush_size * 2 * this.zoom_ratio + "px"; + brush.style.left = centerX - self2.brush_size * this.zoom_ratio + "px"; + brush.style.top = centerY - self2.brush_size * this.zoom_ratio + "px"; } - fromBufferAttribute(attribute, index) { - this.x = attribute.getX(index); - this.y = attribute.getY(index); - return this; + handleWheelEvent(self2, event) { + event.preventDefault(); + if (event.ctrlKey) { + if (event.deltaY < 0) { + this.zoom_ratio = Math.min(10, this.zoom_ratio + 0.2); + } else { + this.zoom_ratio = Math.max(0.2, this.zoom_ratio - 0.2); + } + this.invalidatePanZoom(); + } else { + if (event.deltaY < 0) this.brush_size = Math.min(this.brush_size + 2, 100); + else this.brush_size = Math.max(this.brush_size - 2, 1); + this.brush_slider_input.value = this.brush_size.toString(); + this.updateBrushPreview(this); + } } - rotateAround(center, angle) { - const c = Math.cos(angle), s = Math.sin(angle); - const x = this.x - center.x; - const y = this.y - center.y; - this.x = x * c - y * s + center.x; - this.y = x * s + y * c + center.y; - return this; + pointMoveEvent(self2, event) { + this.cursorX = event.pageX; + this.cursorY = event.pageY; + self2.updateBrushPreview(self2); + if (event.ctrlKey) { + event.preventDefault(); + self2.pan_move(self2, event); + } + let left_button_down = window.TouchEvent && event instanceof TouchEvent || event.buttons == 1; + if (event.shiftKey && left_button_down) { + self2.drawing_mode = false; + const y = event.clientY; + let delta = (self2.zoom_lasty - y) * 5e-3; + self2.zoom_ratio = Math.max( + Math.min(10, self2.last_zoom_ratio - delta), + 0.2 + ); + this.invalidatePanZoom(); + return; + } } - random() { - this.x = Math.random(); - this.y = Math.random(); - return this; + pan_move(self2, event) { + if (event.buttons == 1) { + if (MaskEditorDialogOld.mousedown_x) { + let deltaX = MaskEditorDialogOld.mousedown_x - event.clientX; + let deltaY = MaskEditorDialogOld.mousedown_y - event.clientY; + self2.pan_x = this.mousedown_pan_x - deltaX; + self2.pan_y = this.mousedown_pan_y - deltaY; + self2.invalidatePanZoom(); + } + } } - *[Symbol.iterator]() { - yield this.x; - yield this.y; + draw_move(self2, event) { + if (event.ctrlKey || event.shiftKey) { + return; + } + event.preventDefault(); + this.cursorX = event.pageX; + this.cursorY = event.pageY; + self2.updateBrushPreview(self2); + let left_button_down = window.TouchEvent && event instanceof TouchEvent || event.buttons == 1; + let right_button_down = [2, 5, 32].includes(event.buttons); + if (!event.altKey && left_button_down) { + var diff = performance.now() - self2.lasttime; + const maskRect = self2.maskCanvas.getBoundingClientRect(); + var x = event.offsetX; + var y = event.offsetY; + if (event.offsetX == null) { + x = event.targetTouches[0].clientX - maskRect.left; + } + if (event.offsetY == null) { + y = event.targetTouches[0].clientY - maskRect.top; + } + x /= self2.zoom_ratio; + y /= self2.zoom_ratio; + var brush_size = this.brush_size; + if (event instanceof PointerEvent && event.pointerType == "pen") { + brush_size *= event.pressure; + this.last_pressure = event.pressure; + } else if (window.TouchEvent && event instanceof TouchEvent && diff < 20) { + brush_size *= this.last_pressure; + } else { + brush_size = this.brush_size; + } + if (diff > 20 && !this.drawing_mode) + requestAnimationFrame(() => { + self2.init_shape( + self2, + "source-over" + /* SourceOver */ + ); + self2.draw_shape(self2, x, y, brush_size); + self2.lastx = x; + self2.lasty = y; + }); + else + requestAnimationFrame(() => { + self2.init_shape( + self2, + "source-over" + /* SourceOver */ + ); + var dx = x - self2.lastx; + var dy = y - self2.lasty; + var distance = Math.sqrt(dx * dx + dy * dy); + var directionX = dx / distance; + var directionY = dy / distance; + for (var i = 0; i < distance; i += 5) { + var px2 = self2.lastx + directionX * i; + var py2 = self2.lasty + directionY * i; + self2.draw_shape(self2, px2, py2, brush_size); + } + self2.lastx = x; + self2.lasty = y; + }); + self2.lasttime = performance.now(); + } else if (event.altKey && left_button_down || right_button_down) { + const maskRect = self2.maskCanvas.getBoundingClientRect(); + const x2 = (event.offsetX || event.targetTouches[0].clientX - maskRect.left) / self2.zoom_ratio; + const y2 = (event.offsetY || event.targetTouches[0].clientY - maskRect.top) / self2.zoom_ratio; + var brush_size = this.brush_size; + if (event instanceof PointerEvent && event.pointerType == "pen") { + brush_size *= event.pressure; + this.last_pressure = event.pressure; + } else if (window.TouchEvent && event instanceof TouchEvent && diff < 20) { + brush_size *= this.last_pressure; + } else { + brush_size = this.brush_size; + } + if (diff > 20 && !this.drawing_mode) + requestAnimationFrame(() => { + self2.init_shape( + self2, + "destination-out" + /* DestinationOut */ + ); + self2.draw_shape(self2, x2, y2, brush_size); + self2.lastx = x2; + self2.lasty = y2; + }); + else + requestAnimationFrame(() => { + self2.init_shape( + self2, + "destination-out" + /* DestinationOut */ + ); + var dx = x2 - self2.lastx; + var dy = y2 - self2.lasty; + var distance = Math.sqrt(dx * dx + dy * dy); + var directionX = dx / distance; + var directionY = dy / distance; + for (var i = 0; i < distance; i += 5) { + var px2 = self2.lastx + directionX * i; + var py2 = self2.lasty + directionY * i; + self2.draw_shape(self2, px2, py2, brush_size); + } + self2.lastx = x2; + self2.lasty = y2; + }); + self2.lasttime = performance.now(); + } } -} -class Matrix3 { - static { - __name(this, "Matrix3"); + handlePointerDown(self2, event) { + if (event.ctrlKey) { + if (event.buttons == 1) { + MaskEditorDialogOld.mousedown_x = event.clientX; + MaskEditorDialogOld.mousedown_y = event.clientY; + this.mousedown_pan_x = this.pan_x; + this.mousedown_pan_y = this.pan_y; + } + return; + } + var brush_size = this.brush_size; + if (event instanceof PointerEvent && event.pointerType == "pen") { + brush_size *= event.pressure; + this.last_pressure = event.pressure; + } + if ([0, 2, 5].includes(event.button)) { + self2.drawing_mode = true; + event.preventDefault(); + if (event.shiftKey) { + self2.zoom_lasty = event.clientY; + self2.last_zoom_ratio = self2.zoom_ratio; + return; + } + const maskRect = self2.maskCanvas.getBoundingClientRect(); + const x = (event.offsetX || event.targetTouches[0].clientX - maskRect.left) / self2.zoom_ratio; + const y = (event.offsetY || event.targetTouches[0].clientY - maskRect.top) / self2.zoom_ratio; + if (!event.altKey && event.button == 0) { + self2.init_shape( + self2, + "source-over" + /* SourceOver */ + ); + } else { + self2.init_shape( + self2, + "destination-out" + /* DestinationOut */ + ); + } + self2.draw_shape(self2, x, y, brush_size); + self2.lastx = x; + self2.lasty = y; + self2.lasttime = performance.now(); + } } - constructor(n11, n12, n13, n21, n22, n23, n31, n32, n33) { - Matrix3.prototype.isMatrix3 = true; - this.elements = [ - 1, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 1 - ]; - if (n11 !== void 0) { - this.set(n11, n12, n13, n21, n22, n23, n31, n32, n33); + init_shape(self2, compositionOperation) { + self2.maskCtx.beginPath(); + if (compositionOperation == "source-over") { + self2.maskCtx.fillStyle = this.getMaskFillStyle(); + self2.maskCtx.globalCompositeOperation = "source-over"; + } else if (compositionOperation == "destination-out") { + self2.maskCtx.globalCompositeOperation = "destination-out"; } } - set(n11, n12, n13, n21, n22, n23, n31, n32, n33) { - const te2 = this.elements; - te2[0] = n11; - te2[1] = n21; - te2[2] = n31; - te2[3] = n12; - te2[4] = n22; - te2[5] = n32; - te2[6] = n13; - te2[7] = n23; - te2[8] = n33; - return this; + draw_shape(self2, x, y, brush_size) { + if (self2.pointer_type === "rect") { + self2.maskCtx.rect( + x - brush_size, + y - brush_size, + brush_size * 2, + brush_size * 2 + ); + } else { + self2.maskCtx.arc(x, y, brush_size, 0, Math.PI * 2, false); + } + self2.maskCtx.fill(); } - identity() { - this.set( - 1, + async save() { + const backupCanvas = document.createElement("canvas"); + const backupCtx = backupCanvas.getContext("2d", { + willReadFrequently: true + }); + backupCanvas.width = this.image.width; + backupCanvas.height = this.image.height; + backupCtx.clearRect(0, 0, backupCanvas.width, backupCanvas.height); + backupCtx.drawImage( + this.maskCanvas, 0, 0, + this.maskCanvas.width, + this.maskCanvas.height, 0, - 1, 0, + backupCanvas.width, + backupCanvas.height + ); + const backupData = backupCtx.getImageData( 0, 0, - 1 + backupCanvas.width, + backupCanvas.height ); - return this; - } - copy(m) { - const te2 = this.elements; - const me = m.elements; - te2[0] = me[0]; - te2[1] = me[1]; - te2[2] = me[2]; - te2[3] = me[3]; - te2[4] = me[4]; - te2[5] = me[5]; - te2[6] = me[6]; - te2[7] = me[7]; - te2[8] = me[8]; - return this; + for (let i = 0; i < backupData.data.length; i += 4) { + if (backupData.data[i + 3] == 255) backupData.data[i + 3] = 0; + else backupData.data[i + 3] = 255; + backupData.data[i] = 0; + backupData.data[i + 1] = 0; + backupData.data[i + 2] = 0; + } + backupCtx.globalCompositeOperation = "source-over"; + backupCtx.putImageData(backupData, 0, 0); + const formData = new FormData(); + const filename = "clipspace-mask-" + performance.now() + ".png"; + const item = { + filename, + subfolder: "clipspace", + type: "input" + }; + if (ComfyApp.clipspace.images) ComfyApp.clipspace.images[0] = item; + if (ComfyApp.clipspace.widgets) { + const index = ComfyApp.clipspace.widgets.findIndex( + (obj) => obj.name === "image" + ); + if (index >= 0) ComfyApp.clipspace.widgets[index].value = item; + } + const dataURL = backupCanvas.toDataURL(); + const blob = dataURLToBlob(dataURL); + let original_url = new URL(this.image.src); + const original_ref = { + filename: original_url.searchParams.get("filename") + }; + let original_subfolder = original_url.searchParams.get("subfolder"); + if (original_subfolder) original_ref.subfolder = original_subfolder; + let original_type = original_url.searchParams.get("type"); + if (original_type) original_ref.type = original_type; + formData.append("image", blob, filename); + formData.append("original_ref", JSON.stringify(original_ref)); + formData.append("type", "input"); + formData.append("subfolder", "clipspace"); + this.saveButton.innerText = "Saving..."; + this.saveButton.disabled = true; + await uploadMask(item, formData); + ComfyApp.onClipspaceEditorSave(); + this.close(); } - extractBasis(xAxis, yAxis, zAxis) { - xAxis.setFromMatrix3Column(this, 0); - yAxis.setFromMatrix3Column(this, 1); - zAxis.setFromMatrix3Column(this, 2); - return this; +} +window.comfyAPI = window.comfyAPI || {}; +window.comfyAPI.maskEditorOld = window.comfyAPI.maskEditorOld || {}; +window.comfyAPI.maskEditorOld.MaskEditorDialogOld = MaskEditorDialogOld; +var styles = ` + #maskEditorContainer { + display: fixed; } - setFromMatrix4(m) { - const me = m.elements; - this.set( - me[0], - me[4], - me[8], - me[1], - me[5], - me[9], - me[2], - me[6], - me[10] - ); - return this; + #maskEditor_brush { + position: absolute; + backgroundColor: transparent; + z-index: 8889; + pointer-events: none; + border-radius: 50%; + overflow: visible; + outline: 1px dashed black; + box-shadow: 0 0 0 1px white; } - multiply(m) { - return this.multiplyMatrices(this, m); + #maskEditor_brushPreviewGradient { + position: absolute; + width: 100%; + height: 100%; + border-radius: 50%; + display: none; } - premultiply(m) { - return this.multiplyMatrices(m, this); + #maskEditor { + display: block; + width: 100%; + height: 100vh; + left: 0; + z-index: 8888; + position: fixed; + background: rgba(50,50,50,0.75); + backdrop-filter: blur(10px); + overflow: hidden; + user-select: none; } - multiplyMatrices(a, b) { - const ae = a.elements; - const be = b.elements; - const te2 = this.elements; - const a11 = ae[0], a12 = ae[3], a13 = ae[6]; - const a21 = ae[1], a22 = ae[4], a23 = ae[7]; - const a31 = ae[2], a32 = ae[5], a33 = ae[8]; - const b11 = be[0], b12 = be[3], b13 = be[6]; - const b21 = be[1], b22 = be[4], b23 = be[7]; - const b31 = be[2], b32 = be[5], b33 = be[8]; - te2[0] = a11 * b11 + a12 * b21 + a13 * b31; - te2[3] = a11 * b12 + a12 * b22 + a13 * b32; - te2[6] = a11 * b13 + a12 * b23 + a13 * b33; - te2[1] = a21 * b11 + a22 * b21 + a23 * b31; - te2[4] = a21 * b12 + a22 * b22 + a23 * b32; - te2[7] = a21 * b13 + a22 * b23 + a23 * b33; - te2[2] = a31 * b11 + a32 * b21 + a33 * b31; - te2[5] = a31 * b12 + a32 * b22 + a33 * b32; - te2[8] = a31 * b13 + a32 * b23 + a33 * b33; - return this; + #maskEditor_sidePanelContainer { + height: 100%; + width: 220px; + z-index: 8888; + display: flex; + flex-direction: column; } - multiplyScalar(s) { - const te2 = this.elements; - te2[0] *= s; - te2[3] *= s; - te2[6] *= s; - te2[1] *= s; - te2[4] *= s; - te2[7] *= s; - te2[2] *= s; - te2[5] *= s; - te2[8] *= s; - return this; + #maskEditor_sidePanel { + background: var(--comfy-menu-bg); + height: 100%; + display: flex; + align-items: center; + overflow-y: hidden; + width: 220px; } - determinant() { - const te2 = this.elements; - const a = te2[0], b = te2[1], c = te2[2], d = te2[3], e = te2[4], f = te2[5], g = te2[6], h = te2[7], i = te2[8]; - return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g; + #maskEditor_sidePanelShortcuts { + display: flex; + flex-direction: row; + width: 200px; + margin-top: 10px; + gap: 10px; + justify-content: center; } - invert() { - const te2 = this.elements, n11 = te2[0], n21 = te2[1], n31 = te2[2], n12 = te2[3], n22 = te2[4], n32 = te2[5], n13 = te2[6], n23 = te2[7], n33 = te2[8], t11 = n33 * n22 - n32 * n23, t12 = n32 * n13 - n33 * n12, t13 = n23 * n12 - n22 * n13, det = n11 * t11 + n21 * t12 + n31 * t13; - if (det === 0) return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0); - const detInv = 1 / det; - te2[0] = t11 * detInv; - te2[1] = (n31 * n23 - n33 * n21) * detInv; - te2[2] = (n32 * n21 - n31 * n22) * detInv; - te2[3] = t12 * detInv; - te2[4] = (n33 * n11 - n31 * n13) * detInv; - te2[5] = (n31 * n12 - n32 * n11) * detInv; - te2[6] = t13 * detInv; - te2[7] = (n21 * n13 - n23 * n11) * detInv; - te2[8] = (n22 * n11 - n21 * n12) * detInv; - return this; + .maskEditor_sidePanelIconButton { + width: 40px; + height: 40px; + pointer-events: auto; + display: flex; + justify-content: center; + align-items: center; + transition: background-color 0.1s; } - transpose() { - let tmp2; - const m = this.elements; - tmp2 = m[1]; - m[1] = m[3]; - m[3] = tmp2; - tmp2 = m[2]; - m[2] = m[6]; - m[6] = tmp2; - tmp2 = m[5]; - m[5] = m[7]; - m[7] = tmp2; - return this; + .maskEditor_sidePanelIconButton:hover { + background-color: rgba(0, 0, 0, 0.2); } - getNormalMatrix(matrix4) { - return this.setFromMatrix4(matrix4).invert().transpose(); + #maskEditor_sidePanelBrushSettings { + display: flex; + flex-direction: column; + gap: 10px; + width: 200px; + padding: 10px; } - transposeIntoArray(r) { - const m = this.elements; - r[0] = m[0]; - r[1] = m[3]; - r[2] = m[6]; - r[3] = m[1]; - r[4] = m[4]; - r[5] = m[7]; - r[6] = m[2]; - r[7] = m[5]; - r[8] = m[8]; - return this; + .maskEditor_sidePanelTitle { + text-align: center; + font-size: 15px; + font-family: sans-serif; + color: var(--descrip-text); + margin-top: 10px; } - setUvTransform(tx, ty, sx, sy, rotation, cx, cy) { - const c = Math.cos(rotation); - const s = Math.sin(rotation); - this.set( - sx * c, - sx * s, - -sx * (c * cx + s * cy) + cx + tx, - -sy * s, - sy * c, - -sy * (-s * cx + c * cy) + cy + ty, - 0, - 0, - 1 - ); - return this; + #maskEditor_sidePanelBrushShapeContainer { + display: flex; + width: 180px; + height: 50px; + border: 1px solid var(--border-color); + pointer-events: auto; + background: rgba(0, 0, 0, 0.2); } - // - scale(sx, sy) { - this.premultiply(_m3.makeScale(sx, sy)); - return this; + #maskEditor_sidePanelBrushShapeCircle { + width: 35px; + height: 35px; + border-radius: 50%; + border: 1px solid var(--border-color); + pointer-events: auto; + transition: background 0.1s; + margin-left: 7.5px; } - rotate(theta) { - this.premultiply(_m3.makeRotation(-theta)); - return this; + .maskEditor_sidePanelBrushRange { + width: 180px; + -webkit-appearance: none; + appearance: none; + background: transparent; + cursor: pointer; } - translate(tx, ty) { - this.premultiply(_m3.makeTranslation(tx, ty)); - return this; + .maskEditor_sidePanelBrushRange::-webkit-slider-thumb { + height: 20px; + width: 20px; + border-radius: 50%; + cursor: grab; + margin-top: -8px; + background: var(--p-surface-700); + border: 1px solid var(--border-color); } - // for 2D Transforms - makeTranslation(x, y) { - if (x.isVector2) { - this.set( - 1, - 0, - x.x, - 0, - 1, - x.y, - 0, - 0, - 1 - ); - } else { - this.set( - 1, - 0, - x, - 0, - 1, - y, - 0, - 0, - 1 - ); - } - return this; + .maskEditor_sidePanelBrushRange::-moz-range-thumb { + height: 20px; + width: 20px; + border-radius: 50%; + cursor: grab; + background: var(--p-surface-800); + border: 1px solid var(--border-color); } - makeRotation(theta) { - const c = Math.cos(theta); - const s = Math.sin(theta); - this.set( - c, - -s, - 0, - s, - c, - 0, - 0, - 0, - 1 - ); - return this; + .maskEditor_sidePanelBrushRange::-webkit-slider-runnable-track { + background: var(--p-surface-700); + height: 3px; } - makeScale(x, y) { - this.set( - x, - 0, - 0, - 0, - y, - 0, - 0, - 0, - 1 - ); - return this; + .maskEditor_sidePanelBrushRange::-moz-range-track { + background: var(--p-surface-700); + height: 3px; } - // - equals(matrix) { - const te2 = this.elements; - const me = matrix.elements; - for (let i = 0; i < 9; i++) { - if (te2[i] !== me[i]) return false; - } - return true; + + #maskEditor_sidePanelBrushShapeSquare { + width: 35px; + height: 35px; + margin: 5px; + border: 1px solid var(--border-color); + pointer-events: auto; + transition: background 0.1s; } - fromArray(array, offset = 0) { - for (let i = 0; i < 9; i++) { - this.elements[i] = array[i + offset]; - } - return this; + + .maskEditor_brushShape_dark { + background: transparent; } - toArray(array = [], offset = 0) { - const te2 = this.elements; - array[offset] = te2[0]; - array[offset + 1] = te2[1]; - array[offset + 2] = te2[2]; - array[offset + 3] = te2[3]; - array[offset + 4] = te2[4]; - array[offset + 5] = te2[5]; - array[offset + 6] = te2[6]; - array[offset + 7] = te2[7]; - array[offset + 8] = te2[8]; - return array; + + .maskEditor_brushShape_dark:hover { + background: var(--p-surface-900); } - clone() { - return new this.constructor().fromArray(this.elements); + + .maskEditor_brushShape_light { + background: transparent; } -} -const _m3 = /* @__PURE__ */ new Matrix3(); -function arrayNeedsUint32(array) { - for (let i = array.length - 1; i >= 0; --i) { - if (array[i] >= 65535) return true; + + .maskEditor_brushShape_light:hover { + background: var(--comfy-menu-bg); } - return false; -} -__name(arrayNeedsUint32, "arrayNeedsUint32"); -const TYPED_ARRAYS = { - Int8Array, - Uint8Array, - Uint8ClampedArray, - Int16Array, - Uint16Array, - Int32Array, - Uint32Array, - Float32Array, - Float64Array -}; -function getTypedArray(type, buffer) { - return new TYPED_ARRAYS[type](buffer); -} -__name(getTypedArray, "getTypedArray"); -function createElementNS(name) { - return document.createElementNS("http://www.w3.org/1999/xhtml", name); -} -__name(createElementNS, "createElementNS"); -function createCanvasElement() { - const canvas = createElementNS("canvas"); - canvas.style.display = "block"; - return canvas; -} -__name(createCanvasElement, "createCanvasElement"); -const _cache = {}; -function warnOnce(message) { - if (message in _cache) return; - _cache[message] = true; - console.warn(message); -} -__name(warnOnce, "warnOnce"); -function probeAsync(gl, sync, interval) { - return new Promise(function(resolve, reject) { - function probe() { - switch (gl.clientWaitSync(sync, gl.SYNC_FLUSH_COMMANDS_BIT, 0)) { - case gl.WAIT_FAILED: - reject(); - break; - case gl.TIMEOUT_EXPIRED: - setTimeout(probe, interval); - break; - default: - resolve(); - } - } - __name(probe, "probe"); - setTimeout(probe, interval); - }); -} -__name(probeAsync, "probeAsync"); -function toNormalizedProjectionMatrix(projectionMatrix) { - const m = projectionMatrix.elements; - m[2] = 0.5 * m[2] + 0.5 * m[3]; - m[6] = 0.5 * m[6] + 0.5 * m[7]; - m[10] = 0.5 * m[10] + 0.5 * m[11]; - m[14] = 0.5 * m[14] + 0.5 * m[15]; -} -__name(toNormalizedProjectionMatrix, "toNormalizedProjectionMatrix"); -function toReversedProjectionMatrix(projectionMatrix) { - const m = projectionMatrix.elements; - const isPerspectiveMatrix = m[11] === -1; - if (isPerspectiveMatrix) { - m[10] = -m[10] - 1; - m[14] = -m[14]; - } else { - m[10] = -m[10]; - m[14] = -m[14] + 1; + + #maskEditor_sidePanelImageLayerSettings { + display: flex; + flex-direction: column; + gap: 10px; + width: 200px; + align-items: center; } -} -__name(toReversedProjectionMatrix, "toReversedProjectionMatrix"); -const ColorManagement = { - enabled: true, - workingColorSpace: LinearSRGBColorSpace, - /** - * Implementations of supported color spaces. - * - * Required: - * - primaries: chromaticity coordinates [ rx ry gx gy bx by ] - * - whitePoint: reference white [ x y ] - * - transfer: transfer function (pre-defined) - * - toXYZ: Matrix3 RGB to XYZ transform - * - fromXYZ: Matrix3 XYZ to RGB transform - * - luminanceCoefficients: RGB luminance coefficients - * - * Optional: - * - outputColorSpaceConfig: { drawingBufferColorSpace: ColorSpace } - * - workingColorSpaceConfig: { unpackColorSpace: ColorSpace } - * - * Reference: - * - https://www.russellcottrell.com/photo/matrixCalculator.htm - */ - spaces: {}, - convert: /* @__PURE__ */ __name(function(color, sourceColorSpace, targetColorSpace) { - if (this.enabled === false || sourceColorSpace === targetColorSpace || !sourceColorSpace || !targetColorSpace) { - return color; - } - if (this.spaces[sourceColorSpace].transfer === SRGBTransfer) { - color.r = SRGBToLinear(color.r); - color.g = SRGBToLinear(color.g); - color.b = SRGBToLinear(color.b); - } - if (this.spaces[sourceColorSpace].primaries !== this.spaces[targetColorSpace].primaries) { - color.applyMatrix3(this.spaces[sourceColorSpace].toXYZ); - color.applyMatrix3(this.spaces[targetColorSpace].fromXYZ); - } - if (this.spaces[targetColorSpace].transfer === SRGBTransfer) { - color.r = LinearToSRGB(color.r); - color.g = LinearToSRGB(color.g); - color.b = LinearToSRGB(color.b); - } - return color; - }, "convert"), - fromWorkingColorSpace: /* @__PURE__ */ __name(function(color, targetColorSpace) { - return this.convert(color, this.workingColorSpace, targetColorSpace); - }, "fromWorkingColorSpace"), - toWorkingColorSpace: /* @__PURE__ */ __name(function(color, sourceColorSpace) { - return this.convert(color, sourceColorSpace, this.workingColorSpace); - }, "toWorkingColorSpace"), - getPrimaries: /* @__PURE__ */ __name(function(colorSpace) { - return this.spaces[colorSpace].primaries; - }, "getPrimaries"), - getTransfer: /* @__PURE__ */ __name(function(colorSpace) { - if (colorSpace === NoColorSpace) return LinearTransfer; - return this.spaces[colorSpace].transfer; - }, "getTransfer"), - getLuminanceCoefficients: /* @__PURE__ */ __name(function(target, colorSpace = this.workingColorSpace) { - return target.fromArray(this.spaces[colorSpace].luminanceCoefficients); - }, "getLuminanceCoefficients"), - define: /* @__PURE__ */ __name(function(colorSpaces) { - Object.assign(this.spaces, colorSpaces); - }, "define"), - // Internal APIs - _getMatrix: /* @__PURE__ */ __name(function(targetMatrix, sourceColorSpace, targetColorSpace) { - return targetMatrix.copy(this.spaces[sourceColorSpace].toXYZ).multiply(this.spaces[targetColorSpace].fromXYZ); - }, "_getMatrix"), - _getDrawingBufferColorSpace: /* @__PURE__ */ __name(function(colorSpace) { - return this.spaces[colorSpace].outputColorSpaceConfig.drawingBufferColorSpace; - }, "_getDrawingBufferColorSpace"), - _getUnpackColorSpace: /* @__PURE__ */ __name(function(colorSpace = this.workingColorSpace) { - return this.spaces[colorSpace].workingColorSpaceConfig.unpackColorSpace; - }, "_getUnpackColorSpace") -}; -function SRGBToLinear(c) { - return c < 0.04045 ? c * 0.0773993808 : Math.pow(c * 0.9478672986 + 0.0521327014, 2.4); -} -__name(SRGBToLinear, "SRGBToLinear"); -function LinearToSRGB(c) { - return c < 31308e-7 ? c * 12.92 : 1.055 * Math.pow(c, 0.41666) - 0.055; -} -__name(LinearToSRGB, "LinearToSRGB"); -const REC709_PRIMARIES = [0.64, 0.33, 0.3, 0.6, 0.15, 0.06]; -const REC709_LUMINANCE_COEFFICIENTS = [0.2126, 0.7152, 0.0722]; -const D65 = [0.3127, 0.329]; -const LINEAR_REC709_TO_XYZ = /* @__PURE__ */ new Matrix3().set( - 0.4123908, - 0.3575843, - 0.1804808, - 0.212639, - 0.7151687, - 0.0721923, - 0.0193308, - 0.1191948, - 0.9505322 -); -const XYZ_TO_LINEAR_REC709 = /* @__PURE__ */ new Matrix3().set( - 3.2409699, - -1.5373832, - -0.4986108, - -0.9692436, - 1.8759675, - 0.0415551, - 0.0556301, - -0.203977, - 1.0569715 -); -ColorManagement.define({ - [LinearSRGBColorSpace]: { - primaries: REC709_PRIMARIES, - whitePoint: D65, - transfer: LinearTransfer, - toXYZ: LINEAR_REC709_TO_XYZ, - fromXYZ: XYZ_TO_LINEAR_REC709, - luminanceCoefficients: REC709_LUMINANCE_COEFFICIENTS, - workingColorSpaceConfig: { unpackColorSpace: SRGBColorSpace }, - outputColorSpaceConfig: { drawingBufferColorSpace: SRGBColorSpace } - }, - [SRGBColorSpace]: { - primaries: REC709_PRIMARIES, - whitePoint: D65, - transfer: SRGBTransfer, - toXYZ: LINEAR_REC709_TO_XYZ, - fromXYZ: XYZ_TO_LINEAR_REC709, - luminanceCoefficients: REC709_LUMINANCE_COEFFICIENTS, - outputColorSpaceConfig: { drawingBufferColorSpace: SRGBColorSpace } - } -}); -let _canvas; -class ImageUtils { - static { - __name(this, "ImageUtils"); + .maskEditor_sidePanelLayer { + display: flex; + width: 200px; + height: 50px; } - static getDataURL(image) { - if (/^data:/i.test(image.src)) { - return image.src; - } - if (typeof HTMLCanvasElement === "undefined") { - return image.src; - } - let canvas; - if (image instanceof HTMLCanvasElement) { - canvas = image; - } else { - if (_canvas === void 0) _canvas = createElementNS("canvas"); - _canvas.width = image.width; - _canvas.height = image.height; - const context = _canvas.getContext("2d"); - if (image instanceof ImageData) { - context.putImageData(image, 0, 0); - } else { - context.drawImage(image, 0, 0, image.width, image.height); - } - canvas = _canvas; - } - if (canvas.width > 2048 || canvas.height > 2048) { - console.warn("THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons", image); - return canvas.toDataURL("image/jpeg", 0.6); - } else { - return canvas.toDataURL("image/png"); - } + .maskEditor_sidePanelLayerVisibilityContainer { + width: 50px; + height: 50px; + border-radius: 8px; + display: flex; + justify-content: center; + align-items: center; } - static sRGBToLinear(image) { - if (typeof HTMLImageElement !== "undefined" && image instanceof HTMLImageElement || typeof HTMLCanvasElement !== "undefined" && image instanceof HTMLCanvasElement || typeof ImageBitmap !== "undefined" && image instanceof ImageBitmap) { - const canvas = createElementNS("canvas"); - canvas.width = image.width; - canvas.height = image.height; - const context = canvas.getContext("2d"); - context.drawImage(image, 0, 0, image.width, image.height); - const imageData = context.getImageData(0, 0, image.width, image.height); - const data = imageData.data; - for (let i = 0; i < data.length; i++) { - data[i] = SRGBToLinear(data[i] / 255) * 255; - } - context.putImageData(imageData, 0, 0); - return canvas; - } else if (image.data) { - const data = image.data.slice(0); - for (let i = 0; i < data.length; i++) { - if (data instanceof Uint8Array || data instanceof Uint8ClampedArray) { - data[i] = Math.floor(SRGBToLinear(data[i] / 255) * 255); - } else { - data[i] = SRGBToLinear(data[i]); - } - } - return { - data, - width: image.width, - height: image.height - }; - } else { - console.warn("THREE.ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied."); - return image; - } + .maskEditor_sidePanelVisibilityToggle { + width: 12px; + height: 12px; + border-radius: 50%; + pointer-events: auto; } -} -let _sourceId = 0; -class Source { - static { - __name(this, "Source"); + .maskEditor_sidePanelLayerIconContainer { + width: 60px; + height: 50px; + border-radius: 8px; + display: flex; + justify-content: center; + align-items: center; + fill: var(--input-text); } - constructor(data = null) { - this.isSource = true; - Object.defineProperty(this, "id", { value: _sourceId++ }); - this.uuid = generateUUID(); - this.data = data; - this.dataReady = true; - this.version = 0; + .maskEditor_sidePanelLayerIconContainer svg { + width: 30px; + height: 30px; } - set needsUpdate(value) { - if (value === true) this.version++; + #maskEditor_sidePanelMaskLayerBlendingContainer { + width: 80px; + height: 50px; + border-radius: 8px; + display: flex; + justify-content: center; + align-items: center; } - toJSON(meta) { - const isRootObject = meta === void 0 || typeof meta === "string"; - if (!isRootObject && meta.images[this.uuid] !== void 0) { - return meta.images[this.uuid]; - } - const output = { - uuid: this.uuid, - url: "" - }; - const data = this.data; - if (data !== null) { - let url; - if (Array.isArray(data)) { - url = []; - for (let i = 0, l = data.length; i < l; i++) { - if (data[i].isDataTexture) { - url.push(serializeImage(data[i].image)); - } else { - url.push(serializeImage(data[i])); - } - } - } else { - url = serializeImage(data); - } - output.url = url; - } - if (!isRootObject) { - meta.images[this.uuid] = output; - } - return output; + #maskEditor_sidePanelMaskLayerBlendingSelect { + width: 80px; + height: 30px; + border: 1px solid var(--border-color); + background-color: rgba(0, 0, 0, 0.2); + color: var(--input-text); + font-family: sans-serif; + font-size: 15px; + pointer-events: auto; + transition: background-color border 0.1s; } -} -function serializeImage(image) { - if (typeof HTMLImageElement !== "undefined" && image instanceof HTMLImageElement || typeof HTMLCanvasElement !== "undefined" && image instanceof HTMLCanvasElement || typeof ImageBitmap !== "undefined" && image instanceof ImageBitmap) { - return ImageUtils.getDataURL(image); - } else { - if (image.data) { - return { - data: Array.from(image.data), - width: image.width, - height: image.height, - type: image.data.constructor.name - }; - } else { - console.warn("THREE.Texture: Unable to serialize Texture."); - return {}; - } + #maskEditor_sidePanelClearCanvasButton:hover { + background-color: var(--p-overlaybadge-outline-color); + border: none; } -} -__name(serializeImage, "serializeImage"); -let _textureId = 0; -class Texture extends EventDispatcher { - static { - __name(this, "Texture"); + #maskEditor_sidePanelClearCanvasButton { + width: 180px; + height: 30px; + border: none; + background: rgba(0, 0, 0, 0.2); + border: 1px solid var(--border-color); + color: var(--input-text); + font-family: sans-serif; + font-size: 15px; + pointer-events: auto; + transition: background-color 0.1s; } - constructor(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) { - super(); - this.isTexture = true; - Object.defineProperty(this, "id", { value: _textureId++ }); - this.uuid = generateUUID(); - this.name = ""; - this.source = new Source(image); - this.mipmaps = []; - this.mapping = mapping; - this.channel = 0; - this.wrapS = wrapS; - this.wrapT = wrapT; - this.magFilter = magFilter; - this.minFilter = minFilter; - this.anisotropy = anisotropy; - this.format = format; - this.internalFormat = null; - this.type = type; - this.offset = new Vector2(0, 0); - this.repeat = new Vector2(1, 1); - this.center = new Vector2(0, 0); - this.rotation = 0; - this.matrixAutoUpdate = true; - this.matrix = new Matrix3(); - this.generateMipmaps = true; - this.premultiplyAlpha = false; - this.flipY = true; - this.unpackAlignment = 4; - this.colorSpace = colorSpace; - this.userData = {}; - this.version = 0; - this.onUpdate = null; - this.isRenderTargetTexture = false; - this.pmremVersion = 0; + #maskEditor_sidePanelClearCanvasButton:hover { + background-color: var(--p-overlaybadge-outline-color); } - get image() { - return this.source.data; + #maskEditor_sidePanelHorizontalButtonContainer { + display: flex; + gap: 10px; + height: 40px; } - set image(value = null) { - this.source.data = value; + .maskEditor_sidePanelBigButton { + width: 85px; + height: 30px; + border: none; + background: rgba(0, 0, 0, 0.2); + border: 1px solid var(--border-color); + color: var(--input-text); + font-family: sans-serif; + font-size: 15px; + pointer-events: auto; + transition: background-color border 0.1s; } - updateMatrix() { - this.matrix.setUvTransform(this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y); + .maskEditor_sidePanelBigButton:hover { + background-color: var(--p-overlaybadge-outline-color); + border: none; } - clone() { - return new this.constructor().copy(this); + #maskEditor_toolPanel { + height: 100%; + width: var(--sidebar-width); + z-index: 8888; + background: var(--comfy-menu-bg); + display: flex; + flex-direction: column; } - copy(source) { - this.name = source.name; - this.source = source.source; - this.mipmaps = source.mipmaps.slice(0); - this.mapping = source.mapping; - this.channel = source.channel; - this.wrapS = source.wrapS; - this.wrapT = source.wrapT; - this.magFilter = source.magFilter; - this.minFilter = source.minFilter; - this.anisotropy = source.anisotropy; - this.format = source.format; - this.internalFormat = source.internalFormat; - this.type = source.type; - this.offset.copy(source.offset); - this.repeat.copy(source.repeat); - this.center.copy(source.center); - this.rotation = source.rotation; - this.matrixAutoUpdate = source.matrixAutoUpdate; - this.matrix.copy(source.matrix); - this.generateMipmaps = source.generateMipmaps; - this.premultiplyAlpha = source.premultiplyAlpha; - this.flipY = source.flipY; - this.unpackAlignment = source.unpackAlignment; - this.colorSpace = source.colorSpace; - this.userData = JSON.parse(JSON.stringify(source.userData)); - this.needsUpdate = true; - return this; + .maskEditor_toolPanelContainer { + width: var(--sidebar-width); + height: var(--sidebar-width); + display: flex; + justify-content: center; + align-items: center; + position: relative; + transition: background-color 0.2s; } - toJSON(meta) { - const isRootObject = meta === void 0 || typeof meta === "string"; - if (!isRootObject && meta.textures[this.uuid] !== void 0) { - return meta.textures[this.uuid]; - } - const output = { - metadata: { - version: 4.6, - type: "Texture", - generator: "Texture.toJSON" - }, - uuid: this.uuid, - name: this.name, - image: this.source.toJSON(meta).uuid, - mapping: this.mapping, - channel: this.channel, - repeat: [this.repeat.x, this.repeat.y], - offset: [this.offset.x, this.offset.y], - center: [this.center.x, this.center.y], - rotation: this.rotation, - wrap: [this.wrapS, this.wrapT], - format: this.format, - internalFormat: this.internalFormat, - type: this.type, - colorSpace: this.colorSpace, - minFilter: this.minFilter, - magFilter: this.magFilter, - anisotropy: this.anisotropy, - flipY: this.flipY, - generateMipmaps: this.generateMipmaps, - premultiplyAlpha: this.premultiplyAlpha, - unpackAlignment: this.unpackAlignment - }; - if (Object.keys(this.userData).length > 0) output.userData = this.userData; - if (!isRootObject) { - meta.textures[this.uuid] = output; - } - return output; + .maskEditor_toolPanelContainerSelected svg { + fill: var(--p-button-text-primary-color) !important; } - dispose() { - this.dispatchEvent({ type: "dispose" }); + .maskEditor_toolPanelContainerSelected .maskEditor_toolPanelIndicator { + display: block; } - transformUv(uv) { - if (this.mapping !== UVMapping) return uv; - uv.applyMatrix3(this.matrix); - if (uv.x < 0 || uv.x > 1) { - switch (this.wrapS) { - case RepeatWrapping: - uv.x = uv.x - Math.floor(uv.x); - break; - case ClampToEdgeWrapping: - uv.x = uv.x < 0 ? 0 : 1; - break; - case MirroredRepeatWrapping: - if (Math.abs(Math.floor(uv.x) % 2) === 1) { - uv.x = Math.ceil(uv.x) - uv.x; - } else { - uv.x = uv.x - Math.floor(uv.x); - } - break; - } - } - if (uv.y < 0 || uv.y > 1) { - switch (this.wrapT) { - case RepeatWrapping: - uv.y = uv.y - Math.floor(uv.y); - break; - case ClampToEdgeWrapping: - uv.y = uv.y < 0 ? 0 : 1; - break; - case MirroredRepeatWrapping: - if (Math.abs(Math.floor(uv.y) % 2) === 1) { - uv.y = Math.ceil(uv.y) - uv.y; - } else { - uv.y = uv.y - Math.floor(uv.y); - } - break; - } - } - if (this.flipY) { - uv.y = 1 - uv.y; - } - return uv; + .maskEditor_toolPanelContainer svg { + width: 75%; + aspect-ratio: 1/1; + fill: var(--p-button-text-secondary-color); } - set needsUpdate(value) { - if (value === true) { - this.version++; - this.source.needsUpdate = true; - } + + .maskEditor_toolPanelContainerDark:hover { + background-color: var(--p-surface-800); } - set needsPMREMUpdate(value) { - if (value === true) { - this.pmremVersion++; - } + + .maskEditor_toolPanelContainerLight:hover { + background-color: var(--p-surface-300); } -} -Texture.DEFAULT_IMAGE = null; -Texture.DEFAULT_MAPPING = UVMapping; -Texture.DEFAULT_ANISOTROPY = 1; -class Vector4 { - static { - __name(this, "Vector4"); + + .maskEditor_toolPanelIndicator { + display: none; + height: 100%; + width: 4px; + position: absolute; + left: 0; + background: var(--p-button-text-primary-color); } - constructor(x = 0, y = 0, z = 0, w = 1) { - Vector4.prototype.isVector4 = true; - this.x = x; - this.y = y; - this.z = z; - this.w = w; - } - get width() { - return this.z; - } - set width(value) { - this.z = value; - } - get height() { - return this.w; + #maskEditor_sidePanelPaintBucketSettings { + display: flex; + flex-direction: column; + gap: 10px; + width: 200px; + padding: 10px; } - set height(value) { - this.w = value; + #canvasBackground { + background: white; + width: 100%; + height: 100%; } - set(x, y, z, w) { - this.x = x; - this.y = y; - this.z = z; - this.w = w; - return this; + #maskEditor_sidePanelButtonsContainer { + display: flex; + flex-direction: column; + gap: 10px; + margin-top: 10px; } - setScalar(scalar) { - this.x = scalar; - this.y = scalar; - this.z = scalar; - this.w = scalar; - return this; + .maskEditor_sidePanelSeparator { + width: 200px; + height: 2px; + background: var(--border-color); + margin-top: 5px; + margin-bottom: 5px; } - setX(x) { - this.x = x; - return this; + #maskEditor_pointerZone { + width: calc(100% - var(--sidebar-width) - 220px); + height: 100%; } - setY(y) { - this.y = y; - return this; + #maskEditor_uiContainer { + width: 100%; + height: 100%; + position: absolute; + z-index: 8888; + display: flex; + flex-direction: column; } - setZ(z) { - this.z = z; - return this; + #maskEditorCanvasContainer { + position: absolute; + width: 1000px; + height: 667px; + left: 359px; + top: 280px; } - setW(w) { - this.w = w; - return this; + #imageCanvas { + width: 100%; + height: 100%; } - setComponent(index, value) { - switch (index) { - case 0: - this.x = value; - break; - case 1: - this.y = value; - break; - case 2: - this.z = value; - break; - case 3: - this.w = value; - break; - default: - throw new Error("index is out of range: " + index); - } - return this; + #maskCanvas { + width: 100%; + height: 100%; } - getComponent(index) { - switch (index) { - case 0: - return this.x; - case 1: - return this.y; - case 2: - return this.z; - case 3: - return this.w; - default: - throw new Error("index is out of range: " + index); - } + #maskEditor_uiHorizontalContainer { + width: 100%; + height: 100%; + display: flex; } - clone() { - return new this.constructor(this.x, this.y, this.z, this.w); + #maskEditor_topBar { + display: flex; + height: 44px; + align-items: center; + background: var(--comfy-menu-bg); } - copy(v) { - this.x = v.x; - this.y = v.y; - this.z = v.z; - this.w = v.w !== void 0 ? v.w : 1; - return this; + #maskEditor_topBarTitle { + margin: 0; + margin-left: 0.5rem; + margin-right: 0.5rem; + font-size: 1.2em; } - add(v) { - this.x += v.x; - this.y += v.y; - this.z += v.z; - this.w += v.w; - return this; + #maskEditor_topBarButtonContainer { + display: flex; + gap: 10px; + margin-right: 0.5rem; + position: absolute; + right: 0; + width: 200px; } - addScalar(s) { - this.x += s; - this.y += s; - this.z += s; - this.w += s; - return this; + #maskEditor_topBarShortcutsContainer { + display: flex; + gap: 10px; + margin-left: 5px; } - addVectors(a, b) { - this.x = a.x + b.x; - this.y = a.y + b.y; - this.z = a.z + b.z; - this.w = a.w + b.w; - return this; + + .maskEditor_topPanelIconButton_dark { + width: 50px; + height: 30px; + pointer-events: auto; + display: flex; + justify-content: center; + align-items: center; + transition: background-color 0.1s; + background: var(--p-surface-800); + border: 1px solid var(--p-form-field-border-color); + border-radius: 10px; } - addScaledVector(v, s) { - this.x += v.x * s; - this.y += v.y * s; - this.z += v.z * s; - this.w += v.w * s; - return this; + + .maskEditor_topPanelIconButton_dark:hover { + background-color: var(--p-surface-900); } - sub(v) { - this.x -= v.x; - this.y -= v.y; - this.z -= v.z; - this.w -= v.w; - return this; + + .maskEditor_topPanelIconButton_dark svg { + width: 25px; + height: 25px; + pointer-events: none; + fill: var(--input-text); } - subScalar(s) { - this.x -= s; - this.y -= s; - this.z -= s; - this.w -= s; - return this; + + .maskEditor_topPanelIconButton_light { + width: 50px; + height: 30px; + pointer-events: auto; + display: flex; + justify-content: center; + align-items: center; + transition: background-color 0.1s; + background: var(--comfy-menu-bg); + border: 1px solid var(--p-form-field-border-color); + border-radius: 10px; } - subVectors(a, b) { - this.x = a.x - b.x; - this.y = a.y - b.y; - this.z = a.z - b.z; - this.w = a.w - b.w; - return this; + + .maskEditor_topPanelIconButton_light:hover { + background-color: var(--p-surface-300); } - multiply(v) { - this.x *= v.x; - this.y *= v.y; - this.z *= v.z; - this.w *= v.w; - return this; + + .maskEditor_topPanelIconButton_light svg { + width: 25px; + height: 25px; + pointer-events: none; + fill: var(--input-text); } - multiplyScalar(scalar) { - this.x *= scalar; - this.y *= scalar; - this.z *= scalar; - this.w *= scalar; - return this; + + .maskEditor_topPanelButton_dark { + height: 30px; + background: var(--p-surface-800); + border: 1px solid var(--p-form-field-border-color); + border-radius: 10px; + color: var(--input-text); + font-family: sans-serif; + pointer-events: auto; + transition: 0.1s; + width: 60px; } - applyMatrix4(m) { - const x = this.x, y = this.y, z = this.z, w = this.w; - const e = m.elements; - this.x = e[0] * x + e[4] * y + e[8] * z + e[12] * w; - this.y = e[1] * x + e[5] * y + e[9] * z + e[13] * w; - this.z = e[2] * x + e[6] * y + e[10] * z + e[14] * w; - this.w = e[3] * x + e[7] * y + e[11] * z + e[15] * w; - return this; + + .maskEditor_topPanelButton_dark:hover { + background-color: var(--p-surface-900); } - divide(v) { - this.x /= v.x; - this.y /= v.y; - this.z /= v.z; - this.w /= v.w; - return this; + + .maskEditor_topPanelButton_light { + height: 30px; + background: var(--comfy-menu-bg); + border: 1px solid var(--p-form-field-border-color); + border-radius: 10px; + color: var(--input-text); + font-family: sans-serif; + pointer-events: auto; + transition: 0.1s; + width: 60px; } - divideScalar(scalar) { - return this.multiplyScalar(1 / scalar); + + .maskEditor_topPanelButton_light:hover { + background-color: var(--p-surface-300); } - setAxisAngleFromQuaternion(q) { - this.w = 2 * Math.acos(q.w); - const s = Math.sqrt(1 - q.w * q.w); - if (s < 1e-4) { - this.x = 1; - this.y = 0; - this.z = 0; - } else { - this.x = q.x / s; - this.y = q.y / s; - this.z = q.z / s; - } - return this; + + + #maskEditor_sidePanelColorSelectSettings { + flex-direction: column; } - setAxisAngleFromRotationMatrix(m) { - let angle, x, y, z; - const epsilon = 0.01, epsilon2 = 0.1, te2 = m.elements, m11 = te2[0], m12 = te2[4], m13 = te2[8], m21 = te2[1], m22 = te2[5], m23 = te2[9], m31 = te2[2], m32 = te2[6], m33 = te2[10]; - if (Math.abs(m12 - m21) < epsilon && Math.abs(m13 - m31) < epsilon && Math.abs(m23 - m32) < epsilon) { - if (Math.abs(m12 + m21) < epsilon2 && Math.abs(m13 + m31) < epsilon2 && Math.abs(m23 + m32) < epsilon2 && Math.abs(m11 + m22 + m33 - 3) < epsilon2) { - this.set(1, 0, 0, 0); - return this; - } - angle = Math.PI; - const xx = (m11 + 1) / 2; - const yy = (m22 + 1) / 2; - const zz = (m33 + 1) / 2; - const xy = (m12 + m21) / 4; - const xz = (m13 + m31) / 4; - const yz = (m23 + m32) / 4; - if (xx > yy && xx > zz) { - if (xx < epsilon) { - x = 0; - y = 0.707106781; - z = 0.707106781; - } else { - x = Math.sqrt(xx); - y = xy / x; - z = xz / x; - } - } else if (yy > zz) { - if (yy < epsilon) { - x = 0.707106781; - y = 0; - z = 0.707106781; - } else { - y = Math.sqrt(yy); - x = xy / y; - z = yz / y; - } - } else { - if (zz < epsilon) { - x = 0.707106781; - y = 0.707106781; - z = 0; - } else { - z = Math.sqrt(zz); - x = xz / z; - y = yz / z; - } - } - this.set(x, y, z, angle); - return this; - } - let s = Math.sqrt((m32 - m23) * (m32 - m23) + (m13 - m31) * (m13 - m31) + (m21 - m12) * (m21 - m12)); - if (Math.abs(s) < 1e-3) s = 1; - this.x = (m32 - m23) / s; - this.y = (m13 - m31) / s; - this.z = (m21 - m12) / s; - this.w = Math.acos((m11 + m22 + m33 - 1) / 2); - return this; + + .maskEditor_sidePanel_paintBucket_Container { + width: 180px; + display: flex; + flex-direction: column; + position: relative; } - setFromMatrixPosition(m) { - const e = m.elements; - this.x = e[12]; - this.y = e[13]; - this.z = e[14]; - this.w = e[15]; - return this; + + .maskEditor_sidePanel_colorSelect_Container { + display: flex; + width: 180px; + align-items: center; + gap: 5px; + height: 30px; } - min(v) { - this.x = Math.min(this.x, v.x); - this.y = Math.min(this.y, v.y); - this.z = Math.min(this.z, v.z); - this.w = Math.min(this.w, v.w); - return this; + + #maskEditor_sidePanelVisibilityToggle { + position: absolute; + right: 0; } - max(v) { - this.x = Math.max(this.x, v.x); - this.y = Math.max(this.y, v.y); - this.z = Math.max(this.z, v.z); - this.w = Math.max(this.w, v.w); - return this; + + #maskEditor_sidePanelColorSelectMethodSelect { + position: absolute; + right: 0; + height: 30px; + border-radius: 0; + border: 1px solid var(--border-color); + background: rgba(0,0,0,0.2); } - clamp(min, max2) { - this.x = Math.max(min.x, Math.min(max2.x, this.x)); - this.y = Math.max(min.y, Math.min(max2.y, this.y)); - this.z = Math.max(min.z, Math.min(max2.z, this.z)); - this.w = Math.max(min.w, Math.min(max2.w, this.w)); - return this; + + #maskEditor_sidePanelVisibilityToggle { + position: absolute; + right: 0; } - clampScalar(minVal, maxVal) { - this.x = Math.max(minVal, Math.min(maxVal, this.x)); - this.y = Math.max(minVal, Math.min(maxVal, this.y)); - this.z = Math.max(minVal, Math.min(maxVal, this.z)); - this.w = Math.max(minVal, Math.min(maxVal, this.w)); - return this; + + .maskEditor_sidePanel_colorSelect_tolerance_container { + display: flex; + flex-direction: column; + gap: 10px; + margin-bottom: 10px; } - clampLength(min, max2) { - const length = this.length(); - return this.divideScalar(length || 1).multiplyScalar(Math.max(min, Math.min(max2, length))); + + .maskEditor_sidePanelContainerColumn { + display: flex; + flex-direction: column; + gap: 12px; } - floor() { - this.x = Math.floor(this.x); - this.y = Math.floor(this.y); - this.z = Math.floor(this.z); - this.w = Math.floor(this.w); - return this; + + .maskEditor_sidePanelContainerRow { + display: flex; + flex-direction: row; + gap: 10px; + align-items: center; + min-height: 24px; + position: relative; } - ceil() { - this.x = Math.ceil(this.x); - this.y = Math.ceil(this.y); - this.z = Math.ceil(this.z); - this.w = Math.ceil(this.w); - return this; + + .maskEditor_accent_bg_dark { + background: var(--p-surface-800); } - round() { - this.x = Math.round(this.x); - this.y = Math.round(this.y); - this.z = Math.round(this.z); - this.w = Math.round(this.w); - return this; + + .maskEditor_accent_bg_very_dark { + background: var(--p-surface-900); } - roundToZero() { - this.x = Math.trunc(this.x); - this.y = Math.trunc(this.y); - this.z = Math.trunc(this.z); - this.w = Math.trunc(this.w); - return this; + + .maskEditor_accent_bg_light { + background: var(--p-surface-300); } - negate() { - this.x = -this.x; - this.y = -this.y; - this.z = -this.z; - this.w = -this.w; - return this; + + .maskEditor_accent_bg_very_light { + background: var(--comfy-menu-bg); } - dot(v) { - return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w; + + #maskEditor_paintBucketSettings { + display: none; } - lengthSq() { - return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w; + + #maskEditor_colorSelectSettings { + display: none; } - length() { - return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w); + + .maskEditor_sidePanelToggleContainer { + cursor: pointer; + display: inline-block; + position: absolute; + right: 0; } - manhattanLength() { - return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z) + Math.abs(this.w); + + .maskEditor_toggle_bg_dark { + background: var(--p-surface-700); } - normalize() { - return this.divideScalar(this.length() || 1); + + .maskEditor_toggle_bg_light { + background: var(--p-surface-300); } - setLength(length) { - return this.normalize().multiplyScalar(length); + + .maskEditor_sidePanelToggleSwitch { + display: inline-block; + border-radius: 16px; + width: 40px; + height: 24px; + position: relative; + vertical-align: middle; + transition: background 0.25s; } - lerp(v, alpha) { - this.x += (v.x - this.x) * alpha; - this.y += (v.y - this.y) * alpha; - this.z += (v.z - this.z) * alpha; - this.w += (v.w - this.w) * alpha; - return this; + .maskEditor_sidePanelToggleSwitch:before, .maskEditor_sidePanelToggleSwitch:after { + content: ""; } - lerpVectors(v1, v2, alpha) { - this.x = v1.x + (v2.x - v1.x) * alpha; - this.y = v1.y + (v2.y - v1.y) * alpha; - this.z = v1.z + (v2.z - v1.z) * alpha; - this.w = v1.w + (v2.w - v1.w) * alpha; - return this; + .maskEditor_sidePanelToggleSwitch:before { + display: block; + background: linear-gradient(to bottom, #fff 0%, #eee 100%); + border-radius: 50%; + width: 16px; + height: 16px; + position: absolute; + top: 4px; + left: 4px; + transition: ease 0.2s; } - equals(v) { - return v.x === this.x && v.y === this.y && v.z === this.z && v.w === this.w; + .maskEditor_sidePanelToggleContainer:hover .maskEditor_sidePanelToggleSwitch:before { + background: linear-gradient(to bottom, #fff 0%, #fff 100%); } - fromArray(array, offset = 0) { - this.x = array[offset]; - this.y = array[offset + 1]; - this.z = array[offset + 2]; - this.w = array[offset + 3]; - return this; + .maskEditor_sidePanelToggleCheckbox:checked + .maskEditor_sidePanelToggleSwitch { + background: var(--p-button-text-primary-color); } - toArray(array = [], offset = 0) { - array[offset] = this.x; - array[offset + 1] = this.y; - array[offset + 2] = this.z; - array[offset + 3] = this.w; - return array; + .maskEditor_sidePanelToggleCheckbox:checked + .maskEditor_toggle_bg_dark:before { + background: var(--p-surface-900); } - fromBufferAttribute(attribute, index) { - this.x = attribute.getX(index); - this.y = attribute.getY(index); - this.z = attribute.getZ(index); - this.w = attribute.getW(index); - return this; + .maskEditor_sidePanelToggleCheckbox:checked + .maskEditor_toggle_bg_light:before { + background: var(--comfy-menu-bg); } - random() { - this.x = Math.random(); - this.y = Math.random(); - this.z = Math.random(); - this.w = Math.random(); - return this; + .maskEditor_sidePanelToggleCheckbox:checked + .maskEditor_sidePanelToggleSwitch:before { + left: 20px; } - *[Symbol.iterator]() { - yield this.x; - yield this.y; - yield this.z; - yield this.w; + + .maskEditor_sidePanelToggleCheckbox { + position: absolute; + visibility: hidden; } -} -class RenderTarget extends EventDispatcher { - static { - __name(this, "RenderTarget"); + + .maskEditor_sidePanelDropdown_dark { + border: 1px solid var(--p-form-field-border-color); + background: var(--p-surface-900); + height: 24px; + padding-left: 5px; + padding-right: 5px; + border-radius: 6px; + transition: background 0.1s; } - constructor(width = 1, height = 1, options = {}) { - super(); - this.isRenderTarget = true; - this.width = width; - this.height = height; - this.depth = 1; - this.scissor = new Vector4(0, 0, width, height); - this.scissorTest = false; - this.viewport = new Vector4(0, 0, width, height); - const image = { width, height, depth: 1 }; - options = Object.assign({ - generateMipmaps: false, - internalFormat: null, - minFilter: LinearFilter, - depthBuffer: true, - stencilBuffer: false, - resolveDepthBuffer: true, - resolveStencilBuffer: true, - depthTexture: null, - samples: 0, - count: 1 - }, options); - const texture = new Texture(image, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.colorSpace); - texture.flipY = false; - texture.generateMipmaps = options.generateMipmaps; - texture.internalFormat = options.internalFormat; - this.textures = []; - const count = options.count; - for (let i = 0; i < count; i++) { - this.textures[i] = texture.clone(); - this.textures[i].isRenderTargetTexture = true; - } - this.depthBuffer = options.depthBuffer; - this.stencilBuffer = options.stencilBuffer; - this.resolveDepthBuffer = options.resolveDepthBuffer; - this.resolveStencilBuffer = options.resolveStencilBuffer; - this.depthTexture = options.depthTexture; - this.samples = options.samples; + + .maskEditor_sidePanelDropdown_dark option { + background: var(--p-surface-900); } - get texture() { - return this.textures[0]; + + .maskEditor_sidePanelDropdown_dark:focus { + outline: 1px solid var(--p-button-text-primary-color); } - set texture(value) { - this.textures[0] = value; + + .maskEditor_sidePanelDropdown_dark option:hover { + background: white; } - setSize(width, height, depth = 1) { - if (this.width !== width || this.height !== height || this.depth !== depth) { - this.width = width; - this.height = height; - this.depth = depth; - for (let i = 0, il = this.textures.length; i < il; i++) { - this.textures[i].image.width = width; - this.textures[i].image.height = height; - this.textures[i].image.depth = depth; - } - this.dispose(); - } - this.viewport.set(0, 0, width, height); - this.scissor.set(0, 0, width, height); + .maskEditor_sidePanelDropdown_dark option:active { + background: var(--p-highlight-background); } - clone() { - return new this.constructor().copy(this); + + .maskEditor_sidePanelDropdown_light { + border: 1px solid var(--p-form-field-border-color); + background: var(--comfy-menu-bg); + height: 24px; + padding-left: 5px; + padding-right: 5px; + border-radius: 6px; + transition: background 0.1s; } - copy(source) { - this.width = source.width; - this.height = source.height; - this.depth = source.depth; - this.scissor.copy(source.scissor); - this.scissorTest = source.scissorTest; - this.viewport.copy(source.viewport); - this.textures.length = 0; - for (let i = 0, il = source.textures.length; i < il; i++) { - this.textures[i] = source.textures[i].clone(); - this.textures[i].isRenderTargetTexture = true; - } - const image = Object.assign({}, source.texture.image); - this.texture.source = new Source(image); - this.depthBuffer = source.depthBuffer; - this.stencilBuffer = source.stencilBuffer; - this.resolveDepthBuffer = source.resolveDepthBuffer; - this.resolveStencilBuffer = source.resolveStencilBuffer; - if (source.depthTexture !== null) this.depthTexture = source.depthTexture.clone(); - this.samples = source.samples; - return this; + + .maskEditor_sidePanelDropdown_light option { + background: var(--comfy-menu-bg); } - dispose() { - this.dispatchEvent({ type: "dispose" }); + + .maskEditor_sidePanelDropdown_light:focus { + outline: 1px solid var(--p-surface-300); } -} -class WebGLRenderTarget extends RenderTarget { - static { - __name(this, "WebGLRenderTarget"); + + .maskEditor_sidePanelDropdown_light option:hover { + background: white; } - constructor(width = 1, height = 1, options = {}) { - super(width, height, options); - this.isWebGLRenderTarget = true; + .maskEditor_sidePanelDropdown_light option:active { + background: var(--p-surface-300); } -} -class DataArrayTexture extends Texture { - static { - __name(this, "DataArrayTexture"); + + .maskEditor_layerRow { + height: 50px; + width: 200px; + border-radius: 10px; } - constructor(data = null, width = 1, height = 1, depth = 1) { - super(null); - this.isDataArrayTexture = true; - this.image = { data, width, height, depth }; - this.magFilter = NearestFilter; - this.minFilter = NearestFilter; - this.wrapR = ClampToEdgeWrapping; - this.generateMipmaps = false; - this.flipY = false; - this.unpackAlignment = 1; - this.layerUpdates = /* @__PURE__ */ new Set(); + + .maskEditor_sidePanelLayerPreviewContainer { + width: 40px; + height: 30px; } - addLayerUpdate(layerIndex) { - this.layerUpdates.add(layerIndex); + + .maskEditor_sidePanelLayerPreviewContainer > svg{ + width: 100%; + height: 100%; + object-fit: contain; + fill: var(--p-surface-100); } - clearLayerUpdates() { - this.layerUpdates.clear(); + + #maskEditor_sidePanelImageLayerImage { + width: 100%; + height: 100%; + object-fit: contain; } -} -class WebGLArrayRenderTarget extends WebGLRenderTarget { - static { - __name(this, "WebGLArrayRenderTarget"); + + .maskEditor_sidePanelSubTitle { + text-align: left; + font-size: 12px; + font-family: sans-serif; + color: var(--descrip-text); } - constructor(width = 1, height = 1, depth = 1, options = {}) { - super(width, height, options); - this.isWebGLArrayRenderTarget = true; - this.depth = depth; - this.texture = new DataArrayTexture(null, width, height, depth); - this.texture.isRenderTargetTexture = true; + + .maskEditor_containerDropdown { + position: absolute; + right: 0; } -} -class Data3DTexture extends Texture { - static { - __name(this, "Data3DTexture"); + + .maskEditor_sidePanelLayerCheckbox { + margin-left: 15px; } - constructor(data = null, width = 1, height = 1, depth = 1) { - super(null); - this.isData3DTexture = true; - this.image = { data, width, height, depth }; - this.magFilter = NearestFilter; - this.minFilter = NearestFilter; - this.wrapR = ClampToEdgeWrapping; - this.generateMipmaps = false; - this.flipY = false; - this.unpackAlignment = 1; + + .maskEditor_toolPanelZoomIndicator { + width: var(--sidebar-width); + height: var(--sidebar-width); + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 5px; + color: var(--p-button-text-secondary-color); + position: absolute; + bottom: 0; + transition: background-color 0.2s; } -} -class WebGL3DRenderTarget extends WebGLRenderTarget { - static { - __name(this, "WebGL3DRenderTarget"); + + #maskEditor_toolPanelDimensionsText { + font-size: 12px; } - constructor(width = 1, height = 1, depth = 1, options = {}) { - super(width, height, options); - this.isWebGL3DRenderTarget = true; - this.depth = depth; - this.texture = new Data3DTexture(null, width, height, depth); - this.texture.isRenderTargetTexture = true; + + #maskEditor_topBarSaveButton { + background: var(--p-primary-color) !important; + color: var(--p-button-primary-color) !important; } -} -class Quaternion { + + #maskEditor_topBarSaveButton:hover { + background: var(--p-primary-hover-color) !important; + } + +`; +var styleSheet = document.createElement("style"); +styleSheet.type = "text/css"; +styleSheet.innerText = styles; +document.head.appendChild(styleSheet); +var BrushShape = /* @__PURE__ */ ((BrushShape2) => { + BrushShape2["Arc"] = "arc"; + BrushShape2["Rect"] = "rect"; + return BrushShape2; +})(BrushShape || {}); +var Tools = /* @__PURE__ */ ((Tools2) => { + Tools2["Pen"] = "pen"; + Tools2["Eraser"] = "eraser"; + Tools2["PaintBucket"] = "paintBucket"; + Tools2["ColorSelect"] = "colorSelect"; + return Tools2; +})(Tools || {}); +var CompositionOperation = /* @__PURE__ */ ((CompositionOperation2) => { + CompositionOperation2["SourceOver"] = "source-over"; + CompositionOperation2["DestinationOut"] = "destination-out"; + return CompositionOperation2; +})(CompositionOperation || {}); +var MaskBlendMode = /* @__PURE__ */ ((MaskBlendMode2) => { + MaskBlendMode2["Black"] = "black"; + MaskBlendMode2["White"] = "white"; + MaskBlendMode2["Negative"] = "negative"; + return MaskBlendMode2; +})(MaskBlendMode || {}); +var ColorComparisonMethod = /* @__PURE__ */ ((ColorComparisonMethod2) => { + ColorComparisonMethod2["Simple"] = "simple"; + ColorComparisonMethod2["HSL"] = "hsl"; + ColorComparisonMethod2["LAB"] = "lab"; + return ColorComparisonMethod2; +})(ColorComparisonMethod || {}); +class MaskEditorDialog extends ComfyDialog { static { - __name(this, "Quaternion"); + __name(this, "MaskEditorDialog"); } - constructor(x = 0, y = 0, z = 0, w = 1) { - this.isQuaternion = true; - this._x = x; - this._y = y; - this._z = z; - this._w = w; + static instance = null; + //new + uiManager; + toolManager; + panAndZoomManager; + brushTool; + paintBucketTool; + colorSelectTool; + canvasHistory; + messageBroker; + keyboardManager; + rootElement; + imageURL; + isLayoutCreated = false; + isOpen = false; + //variables needed? + last_display_style = null; + constructor() { + super(); + this.rootElement = $el( + "div.maskEditor_hidden", + { parent: document.body }, + [] + ); + this.element = this.rootElement; } - static slerpFlat(dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t2) { - let x0 = src0[srcOffset0 + 0], y0 = src0[srcOffset0 + 1], z0 = src0[srcOffset0 + 2], w0 = src0[srcOffset0 + 3]; - const x1 = src1[srcOffset1 + 0], y1 = src1[srcOffset1 + 1], z1 = src1[srcOffset1 + 2], w1 = src1[srcOffset1 + 3]; - if (t2 === 0) { - dst[dstOffset + 0] = x0; - dst[dstOffset + 1] = y0; - dst[dstOffset + 2] = z0; - dst[dstOffset + 3] = w0; - return; - } - if (t2 === 1) { - dst[dstOffset + 0] = x1; - dst[dstOffset + 1] = y1; - dst[dstOffset + 2] = z1; - dst[dstOffset + 3] = w1; - return; + static getInstance() { + if (!ComfyApp.clipspace || !ComfyApp.clipspace.imgs) { + throw new Error("No clipspace images found"); } - if (w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1) { - let s = 1 - t2; - const cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1, dir = cos >= 0 ? 1 : -1, sqrSin = 1 - cos * cos; - if (sqrSin > Number.EPSILON) { - const sin = Math.sqrt(sqrSin), len = Math.atan2(sin, cos * dir); - s = Math.sin(s * len) / sin; - t2 = Math.sin(t2 * len) / sin; - } - const tDir = t2 * dir; - x0 = x0 * s + x1 * tDir; - y0 = y0 * s + y1 * tDir; - z0 = z0 * s + z1 * tDir; - w0 = w0 * s + w1 * tDir; - if (s === 1 - t2) { - const f = 1 / Math.sqrt(x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0); - x0 *= f; - y0 *= f; - z0 *= f; - w0 *= f; - } + const currentSrc = ComfyApp.clipspace.imgs[ComfyApp.clipspace["selectedIndex"]].src; + if (!MaskEditorDialog.instance || currentSrc !== MaskEditorDialog.instance.imageURL) { + MaskEditorDialog.instance = new MaskEditorDialog(); } - dst[dstOffset] = x0; - dst[dstOffset + 1] = y0; - dst[dstOffset + 2] = z0; - dst[dstOffset + 3] = w0; - } - static multiplyQuaternionsFlat(dst, dstOffset, src0, srcOffset0, src1, srcOffset1) { - const x0 = src0[srcOffset0]; - const y0 = src0[srcOffset0 + 1]; - const z0 = src0[srcOffset0 + 2]; - const w0 = src0[srcOffset0 + 3]; - const x1 = src1[srcOffset1]; - const y1 = src1[srcOffset1 + 1]; - const z1 = src1[srcOffset1 + 2]; - const w1 = src1[srcOffset1 + 3]; - dst[dstOffset] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1; - dst[dstOffset + 1] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1; - dst[dstOffset + 2] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1; - dst[dstOffset + 3] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1; - return dst; + return MaskEditorDialog.instance; } - get x() { - return this._x; + async show() { + this.cleanup(); + if (!this.isLayoutCreated) { + this.messageBroker = new MessageBroker(); + this.canvasHistory = new CanvasHistory(this, 20); + this.paintBucketTool = new PaintBucketTool(this); + this.brushTool = new BrushTool(this); + this.panAndZoomManager = new PanAndZoomManager(this); + this.toolManager = new ToolManager(this); + this.keyboardManager = new KeyboardManager(this); + this.uiManager = new UIManager(this.rootElement, this); + this.colorSelectTool = new ColorSelectTool(this); + const self2 = this; + const observer = new MutationObserver(function(mutations) { + mutations.forEach(function(mutation) { + if (mutation.type === "attributes" && mutation.attributeName === "style") { + if (self2.last_display_style && self2.last_display_style != "none" && self2.element.style.display == "none") { + ComfyApp.onClipspaceEditorClosed(); + } + self2.last_display_style = self2.element.style.display; + } + }); + }); + const config = { attributes: true }; + observer.observe(this.rootElement, config); + this.isLayoutCreated = true; + await this.uiManager.setlayout(); + } + this.rootElement.id = "maskEditor"; + this.rootElement.style.display = "flex"; + this.element.style.display = "flex"; + await this.uiManager.initUI(); + this.paintBucketTool.initPaintBucketTool(); + this.colorSelectTool.initColorSelectTool(); + await this.canvasHistory.saveInitialState(); + this.isOpen = true; + if (ComfyApp.clipspace && ComfyApp.clipspace.imgs) { + this.uiManager.setSidebarImage(); + } + this.keyboardManager.addListeners(); } - set x(value) { - this._x = value; - this._onChangeCallback(); + cleanup() { + const maskEditors = document.querySelectorAll('[id^="maskEditor"]'); + maskEditors.forEach((element) => element.remove()); + const brushElements = document.querySelectorAll("#maskEditor_brush"); + brushElements.forEach((element) => element.remove()); } - get y() { - return this._y; + isOpened() { + return this.isOpen; } - set y(value) { - this._y = value; - this._onChangeCallback(); + async save() { + const backupCanvas = document.createElement("canvas"); + const imageCanvas = this.uiManager.getImgCanvas(); + const maskCanvas = this.uiManager.getMaskCanvas(); + const image = this.uiManager.getImage(); + const backupCtx = backupCanvas.getContext("2d", { + willReadFrequently: true + }); + backupCanvas.width = imageCanvas.width; + backupCanvas.height = imageCanvas.height; + if (!backupCtx) { + return; + } + const maskImageLoaded = new Promise((resolve, reject) => { + const maskImage = new Image(); + maskImage.src = maskCanvas.toDataURL(); + maskImage.onload = () => { + resolve(); + }; + maskImage.onerror = (error) => { + reject(error); + }; + }); + try { + await maskImageLoaded; + } catch (error) { + console.error("Error loading mask image:", error); + return; + } + backupCtx.clearRect(0, 0, backupCanvas.width, backupCanvas.height); + backupCtx.drawImage( + maskCanvas, + 0, + 0, + maskCanvas.width, + maskCanvas.height, + 0, + 0, + backupCanvas.width, + backupCanvas.height + ); + let maskHasContent = false; + const maskData = backupCtx.getImageData( + 0, + 0, + backupCanvas.width, + backupCanvas.height + ); + for (let i = 0; i < maskData.data.length; i += 4) { + if (maskData.data[i + 3] !== 0) { + maskHasContent = true; + break; + } + } + const backupData = backupCtx.getImageData( + 0, + 0, + backupCanvas.width, + backupCanvas.height + ); + let backupHasContent = false; + for (let i = 0; i < backupData.data.length; i += 4) { + if (backupData.data[i + 3] !== 0) { + backupHasContent = true; + break; + } + } + if (maskHasContent && !backupHasContent) { + console.error("Mask appears to be empty"); + alert("Cannot save empty mask"); + return; + } + for (let i = 0; i < backupData.data.length; i += 4) { + const alpha = backupData.data[i + 3]; + backupData.data[i] = 0; + backupData.data[i + 1] = 0; + backupData.data[i + 2] = 0; + backupData.data[i + 3] = 255 - alpha; + } + backupCtx.globalCompositeOperation = "source-over"; + backupCtx.putImageData(backupData, 0, 0); + const formData = new FormData(); + const filename = "clipspace-mask-" + performance.now() + ".png"; + const item = { + filename, + subfolder: "clipspace", + type: "input" + }; + if (ComfyApp?.clipspace?.widgets?.length) { + const index = ComfyApp.clipspace.widgets.findIndex( + (obj) => obj?.name === "image" + ); + if (index >= 0 && item !== void 0) { + try { + ComfyApp.clipspace.widgets[index].value = item; + } catch (err2) { + console.warn("Failed to set widget value:", err2); + } + } + } + const dataURL = backupCanvas.toDataURL(); + const blob = this.dataURLToBlob(dataURL); + let original_url = new URL(image.src); + this.uiManager.setBrushOpacity(0); + const filenameRef = original_url.searchParams.get("filename"); + if (!filenameRef) { + throw new Error("filename parameter is required"); + } + const original_ref = { + filename: filenameRef + }; + let original_subfolder = original_url.searchParams.get("subfolder"); + if (original_subfolder) original_ref.subfolder = original_subfolder; + let original_type = original_url.searchParams.get("type"); + if (original_type) original_ref.type = original_type; + formData.append("image", blob, filename); + formData.append("original_ref", JSON.stringify(original_ref)); + formData.append("type", "input"); + formData.append("subfolder", "clipspace"); + this.uiManager.setSaveButtonText("Saving"); + this.uiManager.setSaveButtonEnabled(false); + this.keyboardManager.removeListeners(); + const maxRetries = 3; + let attempt = 0; + let success = false; + while (attempt < maxRetries && !success) { + try { + await this.uploadMask(item, formData); + success = true; + } catch (error) { + console.error(`Upload attempt ${attempt + 1} failed:`, error); + attempt++; + if (attempt < maxRetries) { + console.log("Retrying upload..."); + } else { + console.log("Max retries reached. Upload failed."); + } + } + } + if (success) { + ComfyApp.onClipspaceEditorSave(); + this.close(); + this.isOpen = false; + } else { + this.uiManager.setSaveButtonText("Save"); + this.uiManager.setSaveButtonEnabled(true); + this.keyboardManager.addListeners(); + } } - get z() { - return this._z; + getMessageBroker() { + return this.messageBroker; } - set z(value) { - this._z = value; - this._onChangeCallback(); + // Helper function to convert a data URL to a Blob object + dataURLToBlob(dataURL) { + const parts = dataURL.split(";base64,"); + const contentType = parts[0].split(":")[1]; + const byteString = atob(parts[1]); + const arrayBuffer = new ArrayBuffer(byteString.length); + const uint8Array = new Uint8Array(arrayBuffer); + for (let i = 0; i < byteString.length; i++) { + uint8Array[i] = byteString.charCodeAt(i); + } + return new Blob([arrayBuffer], { type: contentType }); } - get w() { - return this._w; + async uploadMask(filepath, formData, retries = 3) { + if (retries <= 0) { + throw new Error("Max retries reached"); + return; + } + await api.fetchApi("/upload/mask", { + method: "POST", + body: formData + }).then((response) => { + if (!response.ok) { + console.log("Failed to upload mask:", response); + this.uploadMask(filepath, formData, 2); + } + }).catch((error) => { + console.error("Error:", error); + }); + try { + const selectedIndex = ComfyApp.clipspace?.selectedIndex; + if (ComfyApp.clipspace?.imgs && selectedIndex !== void 0) { + const newImage = new Image(); + newImage.src = api.apiURL( + "/view?" + new URLSearchParams(filepath).toString() + app.getPreviewFormatParam() + app.getRandParam() + ); + ComfyApp.clipspace.imgs[selectedIndex] = newImage; + if (ComfyApp.clipspace.images) { + ComfyApp.clipspace.images[selectedIndex] = filepath; + } + } + } catch (err2) { + console.warn("Failed to update clipspace image:", err2); + } + ClipspaceDialog.invalidatePreview(); } - set w(value) { - this._w = value; - this._onChangeCallback(); +} +class CanvasHistory { + static { + __name(this, "CanvasHistory"); } - set(x, y, z, w) { - this._x = x; - this._y = y; - this._z = z; - this._w = w; - this._onChangeCallback(); - return this; + maskEditor; + messageBroker; + canvas; + ctx; + states = []; + currentStateIndex = -1; + maxStates = 20; + initialized = false; + constructor(maskEditor, maxStates = 20) { + this.maskEditor = maskEditor; + this.messageBroker = maskEditor.getMessageBroker(); + this.maxStates = maxStates; + this.createListeners(); } - clone() { - return new this.constructor(this._x, this._y, this._z, this._w); + async pullCanvas() { + this.canvas = await this.messageBroker.pull("maskCanvas"); + this.ctx = await this.messageBroker.pull("maskCtx"); } - copy(quaternion) { - this._x = quaternion.x; - this._y = quaternion.y; - this._z = quaternion.z; - this._w = quaternion.w; - this._onChangeCallback(); - return this; + createListeners() { + this.messageBroker.subscribe("saveState", () => this.saveState()); + this.messageBroker.subscribe("undo", () => this.undo()); + this.messageBroker.subscribe("redo", () => this.redo()); } - setFromEuler(euler, update = true) { - const x = euler._x, y = euler._y, z = euler._z, order = euler._order; - const cos = Math.cos; - const sin = Math.sin; - const c1 = cos(x / 2); - const c2 = cos(y / 2); - const c3 = cos(z / 2); - const s1 = sin(x / 2); - const s2 = sin(y / 2); - const s3 = sin(z / 2); - switch (order) { - case "XYZ": - this._x = s1 * c2 * c3 + c1 * s2 * s3; - this._y = c1 * s2 * c3 - s1 * c2 * s3; - this._z = c1 * c2 * s3 + s1 * s2 * c3; - this._w = c1 * c2 * c3 - s1 * s2 * s3; - break; - case "YXZ": - this._x = s1 * c2 * c3 + c1 * s2 * s3; - this._y = c1 * s2 * c3 - s1 * c2 * s3; - this._z = c1 * c2 * s3 - s1 * s2 * c3; - this._w = c1 * c2 * c3 + s1 * s2 * s3; - break; - case "ZXY": - this._x = s1 * c2 * c3 - c1 * s2 * s3; - this._y = c1 * s2 * c3 + s1 * c2 * s3; - this._z = c1 * c2 * s3 + s1 * s2 * c3; - this._w = c1 * c2 * c3 - s1 * s2 * s3; - break; - case "ZYX": - this._x = s1 * c2 * c3 - c1 * s2 * s3; - this._y = c1 * s2 * c3 + s1 * c2 * s3; - this._z = c1 * c2 * s3 - s1 * s2 * c3; - this._w = c1 * c2 * c3 + s1 * s2 * s3; - break; - case "YZX": - this._x = s1 * c2 * c3 + c1 * s2 * s3; - this._y = c1 * s2 * c3 + s1 * c2 * s3; - this._z = c1 * c2 * s3 - s1 * s2 * c3; - this._w = c1 * c2 * c3 - s1 * s2 * s3; - break; - case "XZY": - this._x = s1 * c2 * c3 - c1 * s2 * s3; - this._y = c1 * s2 * c3 - s1 * c2 * s3; - this._z = c1 * c2 * s3 + s1 * s2 * c3; - this._w = c1 * c2 * c3 + s1 * s2 * s3; - break; - default: - console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: " + order); + clearStates() { + this.states = []; + this.currentStateIndex = -1; + this.initialized = false; + } + async saveInitialState() { + await this.pullCanvas(); + if (!this.canvas.width || !this.canvas.height) { + requestAnimationFrame(() => this.saveInitialState()); + return; } - if (update === true) this._onChangeCallback(); - return this; + this.clearStates(); + const state = this.ctx.getImageData( + 0, + 0, + this.canvas.width, + this.canvas.height + ); + this.states.push(state); + this.currentStateIndex = 0; + this.initialized = true; } - setFromAxisAngle(axis, angle) { - const halfAngle = angle / 2, s = Math.sin(halfAngle); - this._x = axis.x * s; - this._y = axis.y * s; - this._z = axis.z * s; - this._w = Math.cos(halfAngle); - this._onChangeCallback(); - return this; + saveState() { + if (!this.initialized || this.currentStateIndex === -1) { + this.saveInitialState(); + return; + } + this.states = this.states.slice(0, this.currentStateIndex + 1); + const state = this.ctx.getImageData( + 0, + 0, + this.canvas.width, + this.canvas.height + ); + this.states.push(state); + this.currentStateIndex++; + if (this.states.length > this.maxStates) { + this.states.shift(); + this.currentStateIndex--; + } } - setFromRotationMatrix(m) { - const te2 = m.elements, m11 = te2[0], m12 = te2[4], m13 = te2[8], m21 = te2[1], m22 = te2[5], m23 = te2[9], m31 = te2[2], m32 = te2[6], m33 = te2[10], trace = m11 + m22 + m33; - if (trace > 0) { - const s = 0.5 / Math.sqrt(trace + 1); - this._w = 0.25 / s; - this._x = (m32 - m23) * s; - this._y = (m13 - m31) * s; - this._z = (m21 - m12) * s; - } else if (m11 > m22 && m11 > m33) { - const s = 2 * Math.sqrt(1 + m11 - m22 - m33); - this._w = (m32 - m23) / s; - this._x = 0.25 * s; - this._y = (m12 + m21) / s; - this._z = (m13 + m31) / s; - } else if (m22 > m33) { - const s = 2 * Math.sqrt(1 + m22 - m11 - m33); - this._w = (m13 - m31) / s; - this._x = (m12 + m21) / s; - this._y = 0.25 * s; - this._z = (m23 + m32) / s; + undo() { + if (this.states.length > 1 && this.currentStateIndex > 0) { + this.currentStateIndex--; + this.restoreState(this.states[this.currentStateIndex]); } else { - const s = 2 * Math.sqrt(1 + m33 - m11 - m22); - this._w = (m21 - m12) / s; - this._x = (m13 + m31) / s; - this._y = (m23 + m32) / s; - this._z = 0.25 * s; + alert("No more undo states available"); } - this._onChangeCallback(); - return this; } - setFromUnitVectors(vFrom, vTo) { - let r = vFrom.dot(vTo) + 1; - if (r < Number.EPSILON) { - r = 0; - if (Math.abs(vFrom.x) > Math.abs(vFrom.z)) { - this._x = -vFrom.y; - this._y = vFrom.x; - this._z = 0; - this._w = r; - } else { - this._x = 0; - this._y = -vFrom.z; - this._z = vFrom.y; - this._w = r; - } + redo() { + if (this.states.length > 1 && this.currentStateIndex < this.states.length - 1) { + this.currentStateIndex++; + this.restoreState(this.states[this.currentStateIndex]); } else { - this._x = vFrom.y * vTo.z - vFrom.z * vTo.y; - this._y = vFrom.z * vTo.x - vFrom.x * vTo.z; - this._z = vFrom.x * vTo.y - vFrom.y * vTo.x; - this._w = r; + alert("No more redo states available"); } - return this.normalize(); } - angleTo(q) { - return 2 * Math.acos(Math.abs(clamp(this.dot(q), -1, 1))); + restoreState(state) { + if (state && this.initialized) { + this.ctx.putImageData(state, 0, 0); + } } - rotateTowards(q, step) { - const angle = this.angleTo(q); - if (angle === 0) return this; - const t2 = Math.min(1, step / angle); - this.slerp(q, t2); - return this; +} +class PaintBucketTool { + static { + __name(this, "PaintBucketTool"); } - identity() { - return this.set(0, 0, 0, 1); + maskEditor; + messageBroker; + canvas; + ctx; + width = null; + height = null; + imageData = null; + data = null; + tolerance = 5; + constructor(maskEditor) { + this.maskEditor = maskEditor; + this.messageBroker = maskEditor.getMessageBroker(); + this.createListeners(); + this.addPullTopics(); } - invert() { - return this.conjugate(); + initPaintBucketTool() { + this.pullCanvas(); } - conjugate() { - this._x *= -1; - this._y *= -1; - this._z *= -1; - this._onChangeCallback(); - return this; + async pullCanvas() { + this.canvas = await this.messageBroker.pull("maskCanvas"); + this.ctx = await this.messageBroker.pull("maskCtx"); } - dot(v) { - return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w; + createListeners() { + this.messageBroker.subscribe( + "setPaintBucketTolerance", + (tolerance) => this.setTolerance(tolerance) + ); + this.messageBroker.subscribe( + "paintBucketFill", + (point) => this.floodFill(point) + ); + this.messageBroker.subscribe("invert", () => this.invertMask()); } - lengthSq() { - return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w; + addPullTopics() { + this.messageBroker.createPullTopic( + "getTolerance", + async () => this.tolerance + ); } - length() { - return Math.sqrt(this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w); + getPixel(x, y) { + return this.data[(y * this.width + x) * 4 + 3]; } - normalize() { - let l = this.length(); - if (l === 0) { - this._x = 0; - this._y = 0; - this._z = 0; - this._w = 1; + setPixel(x, y, alpha, color) { + const index = (y * this.width + x) * 4; + this.data[index] = color.r; + this.data[index + 1] = color.g; + this.data[index + 2] = color.b; + this.data[index + 3] = alpha; + } + shouldProcessPixel(currentAlpha, targetAlpha, tolerance, isFillMode) { + if (currentAlpha === -1) return false; + if (isFillMode) { + return currentAlpha !== 255 && Math.abs(currentAlpha - targetAlpha) <= tolerance; } else { - l = 1 / l; - this._x = this._x * l; - this._y = this._y * l; - this._z = this._z * l; - this._w = this._w * l; + return currentAlpha === 255 || Math.abs(currentAlpha - targetAlpha) <= tolerance; } - this._onChangeCallback(); - return this; - } - multiply(q) { - return this.multiplyQuaternions(this, q); - } - premultiply(q) { - return this.multiplyQuaternions(q, this); - } - multiplyQuaternions(a, b) { - const qax = a._x, qay = a._y, qaz = a._z, qaw = a._w; - const qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w; - this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby; - this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz; - this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx; - this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz; - this._onChangeCallback(); - return this; } - slerp(qb, t2) { - if (t2 === 0) return this; - if (t2 === 1) return this.copy(qb); - const x = this._x, y = this._y, z = this._z, w = this._w; - let cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z; - if (cosHalfTheta < 0) { - this._w = -qb._w; - this._x = -qb._x; - this._y = -qb._y; - this._z = -qb._z; - cosHalfTheta = -cosHalfTheta; - } else { - this.copy(qb); + async floodFill(point) { + let startX = Math.floor(point.x); + let startY = Math.floor(point.y); + this.width = this.canvas.width; + this.height = this.canvas.height; + if (startX < 0 || startX >= this.width || startY < 0 || startY >= this.height) { + return; } - if (cosHalfTheta >= 1) { - this._w = w; - this._x = x; - this._y = y; - this._z = z; - return this; + this.imageData = this.ctx.getImageData(0, 0, this.width, this.height); + this.data = this.imageData.data; + const targetAlpha = this.getPixel(startX, startY); + const isFillMode = targetAlpha !== 255; + if (targetAlpha === -1) return; + const maskColor = await this.messageBroker.pull("getMaskColor"); + const stack = []; + const visited = new Uint8Array(this.width * this.height); + if (this.shouldProcessPixel( + targetAlpha, + targetAlpha, + this.tolerance, + isFillMode + )) { + stack.push([startX, startY]); } - const sqrSinHalfTheta = 1 - cosHalfTheta * cosHalfTheta; - if (sqrSinHalfTheta <= Number.EPSILON) { - const s = 1 - t2; - this._w = s * w + t2 * this._w; - this._x = s * x + t2 * this._x; - this._y = s * y + t2 * this._y; - this._z = s * z + t2 * this._z; - this.normalize(); - return this; + while (stack.length > 0) { + const [x, y] = stack.pop(); + const visitedIndex = y * this.width + x; + if (visited[visitedIndex]) continue; + const currentAlpha = this.getPixel(x, y); + if (!this.shouldProcessPixel( + currentAlpha, + targetAlpha, + this.tolerance, + isFillMode + )) { + continue; + } + visited[visitedIndex] = 1; + this.setPixel(x, y, isFillMode ? 255 : 0, maskColor); + const checkNeighbor = /* @__PURE__ */ __name((nx, ny) => { + if (nx < 0 || nx >= this.width || ny < 0 || ny >= this.height) return; + if (!visited[ny * this.width + nx]) { + const alpha = this.getPixel(nx, ny); + if (this.shouldProcessPixel( + alpha, + targetAlpha, + this.tolerance, + isFillMode + )) { + stack.push([nx, ny]); + } + } + }, "checkNeighbor"); + checkNeighbor(x - 1, y); + checkNeighbor(x + 1, y); + checkNeighbor(x, y - 1); + checkNeighbor(x, y + 1); } - const sinHalfTheta = Math.sqrt(sqrSinHalfTheta); - const halfTheta = Math.atan2(sinHalfTheta, cosHalfTheta); - const ratioA = Math.sin((1 - t2) * halfTheta) / sinHalfTheta, ratioB = Math.sin(t2 * halfTheta) / sinHalfTheta; - this._w = w * ratioA + this._w * ratioB; - this._x = x * ratioA + this._x * ratioB; - this._y = y * ratioA + this._y * ratioB; - this._z = z * ratioA + this._z * ratioB; - this._onChangeCallback(); - return this; + this.ctx.putImageData(this.imageData, 0, 0); + this.imageData = null; + this.data = null; } - slerpQuaternions(qa, qb, t2) { - return this.copy(qa).slerp(qb, t2); + setTolerance(tolerance) { + this.tolerance = tolerance; } - random() { - const theta1 = 2 * Math.PI * Math.random(); - const theta2 = 2 * Math.PI * Math.random(); - const x0 = Math.random(); - const r1 = Math.sqrt(1 - x0); - const r2 = Math.sqrt(x0); - return this.set( - r1 * Math.sin(theta1), - r1 * Math.cos(theta1), - r2 * Math.sin(theta2), - r2 * Math.cos(theta2) + getTolerance() { + return this.tolerance; + } + //invert mask + invertMask() { + const imageData = this.ctx.getImageData( + 0, + 0, + this.canvas.width, + this.canvas.height ); + const data = imageData.data; + let maskR = 0, maskG = 0, maskB = 0; + for (let i = 0; i < data.length; i += 4) { + if (data[i + 3] > 0) { + maskR = data[i]; + maskG = data[i + 1]; + maskB = data[i + 2]; + break; + } + } + for (let i = 0; i < data.length; i += 4) { + const alpha = data[i + 3]; + data[i + 3] = 255 - alpha; + if (alpha === 0) { + data[i] = maskR; + data[i + 1] = maskG; + data[i + 2] = maskB; + } + } + this.ctx.putImageData(imageData, 0, 0); + this.messageBroker.publish("saveState"); } - equals(quaternion) { - return quaternion._x === this._x && quaternion._y === this._y && quaternion._z === this._z && quaternion._w === this._w; +} +class ColorSelectTool { + static { + __name(this, "ColorSelectTool"); } - fromArray(array, offset = 0) { - this._x = array[offset]; - this._y = array[offset + 1]; - this._z = array[offset + 2]; - this._w = array[offset + 3]; - this._onChangeCallback(); - return this; + maskEditor; + messageBroker; + width = null; + height = null; + canvas; + maskCTX; + imageCTX; + maskData = null; + imageData = null; + tolerance = 20; + livePreview = false; + lastPoint = null; + colorComparisonMethod = "simple"; + applyWholeImage = false; + maskBoundry = false; + maskTolerance = 0; + constructor(maskEditor) { + this.maskEditor = maskEditor; + this.messageBroker = maskEditor.getMessageBroker(); + this.createListeners(); + this.addPullTopics(); } - toArray(array = [], offset = 0) { - array[offset] = this._x; - array[offset + 1] = this._y; - array[offset + 2] = this._z; - array[offset + 3] = this._w; - return array; + async initColorSelectTool() { + await this.pullCanvas(); } - fromBufferAttribute(attribute, index) { - this._x = attribute.getX(index); - this._y = attribute.getY(index); - this._z = attribute.getZ(index); - this._w = attribute.getW(index); - this._onChangeCallback(); - return this; + async pullCanvas() { + this.canvas = await this.messageBroker.pull("imgCanvas"); + this.maskCTX = await this.messageBroker.pull("maskCtx"); + this.imageCTX = await this.messageBroker.pull("imageCtx"); } - toJSON() { - return this.toArray(); + createListeners() { + this.messageBroker.subscribe( + "colorSelectFill", + (point) => this.fillColorSelection(point) + ); + this.messageBroker.subscribe( + "setColorSelectTolerance", + (tolerance) => this.setTolerance(tolerance) + ); + this.messageBroker.subscribe( + "setLivePreview", + (livePreview) => this.setLivePreview(livePreview) + ); + this.messageBroker.subscribe( + "setColorComparisonMethod", + (method) => this.setComparisonMethod(method) + ); + this.messageBroker.subscribe("clearLastPoint", () => this.clearLastPoint()); + this.messageBroker.subscribe( + "setWholeImage", + (applyWholeImage) => this.setApplyWholeImage(applyWholeImage) + ); + this.messageBroker.subscribe( + "setMaskBoundary", + (maskBoundry) => this.setMaskBoundary(maskBoundry) + ); + this.messageBroker.subscribe( + "setMaskTolerance", + (maskTolerance) => this.setMaskTolerance(maskTolerance) + ); } - _onChange(callback) { - this._onChangeCallback = callback; - return this; + async addPullTopics() { + this.messageBroker.createPullTopic( + "getLivePreview", + async () => this.livePreview + ); } - _onChangeCallback() { + getPixel(x, y) { + const index = (y * this.width + x) * 4; + return { + r: this.imageData[index], + g: this.imageData[index + 1], + b: this.imageData[index + 2] + }; } - *[Symbol.iterator]() { - yield this._x; - yield this._y; - yield this._z; - yield this._w; + getMaskAlpha(x, y) { + return this.maskData[(y * this.width + x) * 4 + 3]; } -} -class Vector3 { - static { - __name(this, "Vector3"); + isPixelInRange(pixel, target) { + switch (this.colorComparisonMethod) { + case "simple": + return this.isPixelInRangeSimple(pixel, target); + case "hsl": + return this.isPixelInRangeHSL(pixel, target); + case "lab": + return this.isPixelInRangeLab(pixel, target); + default: + return this.isPixelInRangeSimple(pixel, target); + } } - constructor(x = 0, y = 0, z = 0) { - Vector3.prototype.isVector3 = true; - this.x = x; - this.y = y; - this.z = z; + isPixelInRangeSimple(pixel, target) { + const distance = Math.sqrt( + Math.pow(pixel.r - target.r, 2) + Math.pow(pixel.g - target.g, 2) + Math.pow(pixel.b - target.b, 2) + ); + return distance <= this.tolerance; } - set(x, y, z) { - if (z === void 0) z = this.z; - this.x = x; - this.y = y; - this.z = z; - return this; + isPixelInRangeHSL(pixel, target) { + const pixelHSL = this.rgbToHSL(pixel.r, pixel.g, pixel.b); + const targetHSL = this.rgbToHSL(target.r, target.g, target.b); + const hueDiff = Math.abs(pixelHSL.h - targetHSL.h); + const satDiff = Math.abs(pixelHSL.s - targetHSL.s); + const lightDiff = Math.abs(pixelHSL.l - targetHSL.l); + const distance = Math.sqrt( + Math.pow(hueDiff / 360 * 255, 2) + Math.pow(satDiff / 100 * 255, 2) + Math.pow(lightDiff / 100 * 255, 2) + ); + return distance <= this.tolerance; } - setScalar(scalar) { - this.x = scalar; - this.y = scalar; - this.z = scalar; - return this; + rgbToHSL(r, g, b) { + r /= 255; + g /= 255; + b /= 255; + const max2 = Math.max(r, g, b); + const min = Math.min(r, g, b); + let h = 0, s = 0, l = (max2 + min) / 2; + if (max2 !== min) { + const d = max2 - min; + s = l > 0.5 ? d / (2 - max2 - min) : d / (max2 + min); + switch (max2) { + case r: + h = (g - b) / d + (g < b ? 6 : 0); + break; + case g: + h = (b - r) / d + 2; + break; + case b: + h = (r - g) / d + 4; + break; + } + h /= 6; + } + return { + h: h * 360, + s: s * 100, + l: l * 100 + }; } - setX(x) { - this.x = x; - return this; + isPixelInRangeLab(pixel, target) { + const pixelLab = this.rgbToLab(pixel); + const targetLab = this.rgbToLab(target); + const deltaE = Math.sqrt( + Math.pow(pixelLab.l - targetLab.l, 2) + Math.pow(pixelLab.a - targetLab.a, 2) + Math.pow(pixelLab.b - targetLab.b, 2) + ); + const normalizedDeltaE = deltaE / 100 * 255; + return normalizedDeltaE <= this.tolerance; } - setY(y) { - this.y = y; - return this; + rgbToLab(rgb) { + let r = rgb.r / 255; + let g = rgb.g / 255; + let b = rgb.b / 255; + r = r > 0.04045 ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92; + g = g > 0.04045 ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92; + b = b > 0.04045 ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92; + r *= 100; + g *= 100; + b *= 100; + const x = r * 0.4124 + g * 0.3576 + b * 0.1805; + const y = r * 0.2126 + g * 0.7152 + b * 0.0722; + const z = r * 0.0193 + g * 0.1192 + b * 0.9505; + const xn = 95.047; + const yn = 100; + const zn = 108.883; + const xyz = [x / xn, y / yn, z / zn]; + for (let i = 0; i < xyz.length; i++) { + xyz[i] = xyz[i] > 8856e-6 ? Math.pow(xyz[i], 1 / 3) : 7.787 * xyz[i] + 16 / 116; + } + return { + l: 116 * xyz[1] - 16, + a: 500 * (xyz[0] - xyz[1]), + b: 200 * (xyz[1] - xyz[2]) + }; } - setZ(z) { - this.z = z; - return this; + setPixel(x, y, alpha, color) { + const index = (y * this.width + x) * 4; + this.maskData[index] = color.r; + this.maskData[index + 1] = color.g; + this.maskData[index + 2] = color.b; + this.maskData[index + 3] = alpha; } - setComponent(index, value) { - switch (index) { - case 0: - this.x = value; - break; - case 1: - this.y = value; - break; - case 2: - this.z = value; - break; - default: - throw new Error("index is out of range: " + index); + async fillColorSelection(point) { + this.width = this.canvas.width; + this.height = this.canvas.height; + this.lastPoint = point; + const maskData = this.maskCTX.getImageData(0, 0, this.width, this.height); + this.maskData = maskData.data; + this.imageData = this.imageCTX.getImageData( + 0, + 0, + this.width, + this.height + ).data; + if (this.applyWholeImage) { + const targetPixel = this.getPixel( + Math.floor(point.x), + Math.floor(point.y) + ); + const maskColor = await this.messageBroker.pull("getMaskColor"); + const width = this.width; + const height = this.height; + const CHUNK_SIZE = 1e4; + for (let i = 0; i < width * height; i += CHUNK_SIZE) { + const endIndex = Math.min(i + CHUNK_SIZE, width * height); + for (let pixelIndex = i; pixelIndex < endIndex; pixelIndex++) { + const x = pixelIndex % width; + const y = Math.floor(pixelIndex / width); + if (this.isPixelInRange(this.getPixel(x, y), targetPixel)) { + this.setPixel(x, y, 255, maskColor); + } + } + await new Promise((resolve) => setTimeout(resolve, 0)); + } + } else { + let startX = Math.floor(point.x); + let startY = Math.floor(point.y); + if (startX < 0 || startX >= this.width || startY < 0 || startY >= this.height) { + return; + } + const pixel = this.getPixel(startX, startY); + const stack = []; + const visited = new Uint8Array(this.width * this.height); + stack.push([startX, startY]); + const maskColor = await this.messageBroker.pull("getMaskColor"); + while (stack.length > 0) { + const [x, y] = stack.pop(); + const visitedIndex = y * this.width + x; + if (visited[visitedIndex] || !this.isPixelInRange(this.getPixel(x, y), pixel)) { + continue; + } + visited[visitedIndex] = 1; + this.setPixel(x, y, 255, maskColor); + if (x > 0 && !visited[y * this.width + (x - 1)] && this.isPixelInRange(this.getPixel(x - 1, y), pixel)) { + if (!this.maskBoundry || 255 - this.getMaskAlpha(x - 1, y) > this.maskTolerance) { + stack.push([x - 1, y]); + } + } + if (x < this.width - 1 && !visited[y * this.width + (x + 1)] && this.isPixelInRange(this.getPixel(x + 1, y), pixel)) { + if (!this.maskBoundry || 255 - this.getMaskAlpha(x + 1, y) > this.maskTolerance) { + stack.push([x + 1, y]); + } + } + if (y > 0 && !visited[(y - 1) * this.width + x] && this.isPixelInRange(this.getPixel(x, y - 1), pixel)) { + if (!this.maskBoundry || 255 - this.getMaskAlpha(x, y - 1) > this.maskTolerance) { + stack.push([x, y - 1]); + } + } + if (y < this.height - 1 && !visited[(y + 1) * this.width + x] && this.isPixelInRange(this.getPixel(x, y + 1), pixel)) { + if (!this.maskBoundry || 255 - this.getMaskAlpha(x, y + 1) > this.maskTolerance) { + stack.push([x, y + 1]); + } + } + } } - return this; + this.maskCTX.putImageData(maskData, 0, 0); + this.messageBroker.publish("saveState"); + this.maskData = null; + this.imageData = null; } - getComponent(index) { - switch (index) { - case 0: - return this.x; - case 1: - return this.y; - case 2: - return this.z; - default: - throw new Error("index is out of range: " + index); + setTolerance(tolerance) { + this.tolerance = tolerance; + if (this.lastPoint && this.livePreview) { + this.messageBroker.publish("undo"); + this.fillColorSelection(this.lastPoint); } } - clone() { - return new this.constructor(this.x, this.y, this.z); + setLivePreview(livePreview) { + this.livePreview = livePreview; } - copy(v) { - this.x = v.x; - this.y = v.y; - this.z = v.z; - return this; + setComparisonMethod(method) { + this.colorComparisonMethod = method; + if (this.lastPoint && this.livePreview) { + this.messageBroker.publish("undo"); + this.fillColorSelection(this.lastPoint); + } } - add(v) { - this.x += v.x; - this.y += v.y; - this.z += v.z; - return this; + clearLastPoint() { + this.lastPoint = null; } - addScalar(s) { - this.x += s; - this.y += s; - this.z += s; - return this; + setApplyWholeImage(applyWholeImage) { + this.applyWholeImage = applyWholeImage; } - addVectors(a, b) { - this.x = a.x + b.x; - this.y = a.y + b.y; - this.z = a.z + b.z; - return this; + setMaskBoundary(maskBoundry) { + this.maskBoundry = maskBoundry; } - addScaledVector(v, s) { - this.x += v.x * s; - this.y += v.y * s; - this.z += v.z * s; - return this; - } - sub(v) { - this.x -= v.x; - this.y -= v.y; - this.z -= v.z; - return this; - } - subScalar(s) { - this.x -= s; - this.y -= s; - this.z -= s; - return this; + setMaskTolerance(maskTolerance) { + this.maskTolerance = maskTolerance; } - subVectors(a, b) { - this.x = a.x - b.x; - this.y = a.y - b.y; - this.z = a.z - b.z; - return this; +} +class BrushTool { + static { + __name(this, "BrushTool"); } - multiply(v) { - this.x *= v.x; - this.y *= v.y; - this.z *= v.z; - return this; + brushSettings; + //this saves the current brush settings + maskBlendMode; + isDrawing = false; + isDrawingLine = false; + lineStartPoint = null; + smoothingPrecision = 10; + smoothingCordsArray = []; + smoothingLastDrawTime; + maskCtx = null; + initialDraw = true; + brushStrokeCanvas = null; + brushStrokeCtx = null; + //brush adjustment + isBrushAdjusting = false; + brushPreviewGradient = null; + initialPoint = null; + useDominantAxis = false; + brushAdjustmentSpeed = 1; + maskEditor; + messageBroker; + constructor(maskEditor) { + this.maskEditor = maskEditor; + this.messageBroker = maskEditor.getMessageBroker(); + this.createListeners(); + this.addPullTopics(); + this.useDominantAxis = app.extensionManager.setting.get( + "Comfy.MaskEditor.UseDominantAxis" + ); + this.brushAdjustmentSpeed = app.extensionManager.setting.get( + "Comfy.MaskEditor.BrushAdjustmentSpeed" + ); + this.brushSettings = { + size: 10, + opacity: 100, + hardness: 1, + type: "arc" + /* Arc */ + }; + this.maskBlendMode = "black"; } - multiplyScalar(scalar) { - this.x *= scalar; - this.y *= scalar; - this.z *= scalar; - return this; + createListeners() { + this.messageBroker.subscribe( + "setBrushSize", + (size) => this.setBrushSize(size) + ); + this.messageBroker.subscribe( + "setBrushOpacity", + (opacity) => this.setBrushOpacity(opacity) + ); + this.messageBroker.subscribe( + "setBrushHardness", + (hardness) => this.setBrushHardness(hardness) + ); + this.messageBroker.subscribe( + "setBrushShape", + (type) => this.setBrushType(type) + ); + this.messageBroker.subscribe( + "setBrushSmoothingPrecision", + (precision) => this.setBrushSmoothingPrecision(precision) + ); + this.messageBroker.subscribe( + "brushAdjustmentStart", + (event) => this.startBrushAdjustment(event) + ); + this.messageBroker.subscribe( + "brushAdjustment", + (event) => this.handleBrushAdjustment(event) + ); + this.messageBroker.subscribe( + "drawStart", + (event) => this.startDrawing(event) + ); + this.messageBroker.subscribe( + "draw", + (event) => this.handleDrawing(event) + ); + this.messageBroker.subscribe( + "drawEnd", + (event) => this.drawEnd(event) + ); } - multiplyVectors(a, b) { - this.x = a.x * b.x; - this.y = a.y * b.y; - this.z = a.z * b.z; - return this; + addPullTopics() { + this.messageBroker.createPullTopic( + "brushSize", + async () => this.brushSettings.size + ); + this.messageBroker.createPullTopic( + "brushOpacity", + async () => this.brushSettings.opacity + ); + this.messageBroker.createPullTopic( + "brushHardness", + async () => this.brushSettings.hardness + ); + this.messageBroker.createPullTopic( + "brushType", + async () => this.brushSettings.type + ); + this.messageBroker.createPullTopic( + "maskBlendMode", + async () => this.maskBlendMode + ); + this.messageBroker.createPullTopic( + "brushSettings", + async () => this.brushSettings + ); } - applyEuler(euler) { - return this.applyQuaternion(_quaternion$4.setFromEuler(euler)); + async createBrushStrokeCanvas() { + if (this.brushStrokeCanvas !== null) { + return; + } + const maskCanvas = await this.messageBroker.pull("maskCanvas"); + const canvas = document.createElement("canvas"); + canvas.width = maskCanvas.width; + canvas.height = maskCanvas.height; + this.brushStrokeCanvas = canvas; + this.brushStrokeCtx = canvas.getContext("2d"); } - applyAxisAngle(axis, angle) { - return this.applyQuaternion(_quaternion$4.setFromAxisAngle(axis, angle)); + async startDrawing(event) { + this.isDrawing = true; + let compositionOp; + let currentTool = await this.messageBroker.pull("currentTool"); + let coords = { x: event.offsetX, y: event.offsetY }; + let coords_canvas = await this.messageBroker.pull("screenToCanvas", coords); + await this.createBrushStrokeCanvas(); + if (currentTool === "eraser" || event.buttons == 2) { + compositionOp = "destination-out"; + } else { + compositionOp = "source-over"; + } + if (event.shiftKey && this.lineStartPoint) { + this.isDrawingLine = true; + this.drawLine(this.lineStartPoint, coords_canvas, compositionOp); + } else { + this.isDrawingLine = false; + this.init_shape(compositionOp); + this.draw_shape(coords_canvas); + } + this.lineStartPoint = coords_canvas; + this.smoothingCordsArray = [coords_canvas]; + this.smoothingLastDrawTime = /* @__PURE__ */ new Date(); } - applyMatrix3(m) { - const x = this.x, y = this.y, z = this.z; - const e = m.elements; - this.x = e[0] * x + e[3] * y + e[6] * z; - this.y = e[1] * x + e[4] * y + e[7] * z; - this.z = e[2] * x + e[5] * y + e[8] * z; - return this; + async handleDrawing(event) { + var diff = performance.now() - this.smoothingLastDrawTime.getTime(); + let coords = { x: event.offsetX, y: event.offsetY }; + let coords_canvas = await this.messageBroker.pull("screenToCanvas", coords); + let currentTool = await this.messageBroker.pull("currentTool"); + if (diff > 20 && !this.isDrawing) + requestAnimationFrame(() => { + this.init_shape( + "source-over" + /* SourceOver */ + ); + this.draw_shape(coords_canvas); + this.smoothingCordsArray.push(coords_canvas); + }); + else + requestAnimationFrame(() => { + if (currentTool === "eraser" || event.buttons == 2) { + this.init_shape( + "destination-out" + /* DestinationOut */ + ); + } else { + this.init_shape( + "source-over" + /* SourceOver */ + ); + } + this.drawWithBetterSmoothing(coords_canvas); + }); + this.smoothingLastDrawTime = /* @__PURE__ */ new Date(); } - applyNormalMatrix(m) { - return this.applyMatrix3(m).normalize(); + async drawEnd(event) { + const coords = { x: event.offsetX, y: event.offsetY }; + const coords_canvas = await this.messageBroker.pull( + "screenToCanvas", + coords + ); + if (this.isDrawing) { + this.isDrawing = false; + this.messageBroker.publish("saveState"); + this.lineStartPoint = coords_canvas; + this.initialDraw = true; + } } - applyMatrix4(m) { - const x = this.x, y = this.y, z = this.z; - const e = m.elements; - const w = 1 / (e[3] * x + e[7] * y + e[11] * z + e[15]); - this.x = (e[0] * x + e[4] * y + e[8] * z + e[12]) * w; - this.y = (e[1] * x + e[5] * y + e[9] * z + e[13]) * w; - this.z = (e[2] * x + e[6] * y + e[10] * z + e[14]) * w; - return this; + drawWithBetterSmoothing(point) { + if (!this.smoothingCordsArray) { + this.smoothingCordsArray = []; + } + const opacityConstant = 1 / (1 + Math.exp(3)); + const interpolatedOpacity = 1 / (1 + Math.exp(-6 * (this.brushSettings.opacity - 0.5))) - opacityConstant; + this.smoothingCordsArray.push(point); + const POINTS_NR = 5; + if (this.smoothingCordsArray.length < POINTS_NR) { + return; + } + let totalLength = 0; + const points = this.smoothingCordsArray; + const len = points.length - 1; + let dx, dy; + for (let i = 0; i < len; i++) { + dx = points[i + 1].x - points[i].x; + dy = points[i + 1].y - points[i].y; + totalLength += Math.sqrt(dx * dx + dy * dy); + } + const distanceBetweenPoints = this.brushSettings.size / this.smoothingPrecision * 6; + const stepNr = Math.ceil(totalLength / distanceBetweenPoints); + let interpolatedPoints = points; + if (stepNr > 0) { + interpolatedPoints = this.generateEquidistantPoints( + this.smoothingCordsArray, + distanceBetweenPoints + // Distance between interpolated points + ); + } + if (!this.initialDraw) { + const spliceIndex = interpolatedPoints.findIndex( + (point2) => point2.x === this.smoothingCordsArray[2].x && point2.y === this.smoothingCordsArray[2].y + ); + if (spliceIndex !== -1) { + interpolatedPoints = interpolatedPoints.slice(spliceIndex + 1); + } + } + for (const point2 of interpolatedPoints) { + this.draw_shape(point2, interpolatedOpacity); + } + if (!this.initialDraw) { + this.smoothingCordsArray = this.smoothingCordsArray.slice(2); + } else { + this.initialDraw = false; + } } - applyQuaternion(q) { - const vx = this.x, vy = this.y, vz = this.z; - const qx = q.x, qy = q.y, qz = q.z, qw = q.w; - const tx = 2 * (qy * vz - qz * vy); - const ty = 2 * (qz * vx - qx * vz); - const tz = 2 * (qx * vy - qy * vx); - this.x = vx + qw * tx + qy * tz - qz * ty; - this.y = vy + qw * ty + qz * tx - qx * tz; - this.z = vz + qw * tz + qx * ty - qy * tx; - return this; + async drawLine(p1, p2, compositionOp) { + const brush_size = await this.messageBroker.pull("brushSize"); + const distance = Math.sqrt((p2.x - p1.x) ** 2 + (p2.y - p1.y) ** 2); + const steps = Math.ceil( + distance / (brush_size / this.smoothingPrecision * 4) + ); + const interpolatedOpacity = 1 / (1 + Math.exp(-6 * (this.brushSettings.opacity - 0.5))) - 1 / (1 + Math.exp(3)); + this.init_shape(compositionOp); + for (let i = 0; i <= steps; i++) { + const t2 = i / steps; + const x = p1.x + (p2.x - p1.x) * t2; + const y = p1.y + (p2.y - p1.y) * t2; + const point = { x, y }; + this.draw_shape(point, interpolatedOpacity); + } } - project(camera) { - return this.applyMatrix4(camera.matrixWorldInverse).applyMatrix4(camera.projectionMatrix); + //brush adjustment + async startBrushAdjustment(event) { + event.preventDefault(); + const coords = { x: event.offsetX, y: event.offsetY }; + let coords_canvas = await this.messageBroker.pull("screenToCanvas", coords); + this.messageBroker.publish("setBrushPreviewGradientVisibility", true); + this.initialPoint = coords_canvas; + this.isBrushAdjusting = true; + return; } - unproject(camera) { - return this.applyMatrix4(camera.projectionMatrixInverse).applyMatrix4(camera.matrixWorld); + async handleBrushAdjustment(event) { + const coords = { x: event.offsetX, y: event.offsetY }; + const brushDeadZone = 5; + let coords_canvas = await this.messageBroker.pull("screenToCanvas", coords); + const delta_x = coords_canvas.x - this.initialPoint.x; + const delta_y = coords_canvas.y - this.initialPoint.y; + const effectiveDeltaX = Math.abs(delta_x) < brushDeadZone ? 0 : delta_x; + const effectiveDeltaY = Math.abs(delta_y) < brushDeadZone ? 0 : delta_y; + let finalDeltaX = effectiveDeltaX; + let finalDeltaY = effectiveDeltaY; + console.log(this.useDominantAxis); + if (this.useDominantAxis) { + const ratio = Math.abs(effectiveDeltaX) / Math.abs(effectiveDeltaY); + const threshold = 2; + if (ratio > threshold) { + finalDeltaY = 0; + } else if (ratio < 1 / threshold) { + finalDeltaX = 0; + } + } + const cappedDeltaX = Math.max(-100, Math.min(100, finalDeltaX)); + const cappedDeltaY = Math.max(-100, Math.min(100, finalDeltaY)); + const sizeDelta = cappedDeltaX / 40; + const hardnessDelta = cappedDeltaY / 800; + const newSize = Math.max( + 1, + Math.min( + 100, + this.brushSettings.size + cappedDeltaX / 35 * this.brushAdjustmentSpeed + ) + ); + const newHardness = Math.max( + 0, + Math.min( + 1, + this.brushSettings.hardness - cappedDeltaY / 4e3 * this.brushAdjustmentSpeed + ) + ); + this.brushSettings.size = newSize; + this.brushSettings.hardness = newHardness; + this.messageBroker.publish("updateBrushPreview"); } - transformDirection(m) { - const x = this.x, y = this.y, z = this.z; - const e = m.elements; - this.x = e[0] * x + e[4] * y + e[8] * z; - this.y = e[1] * x + e[5] * y + e[9] * z; - this.z = e[2] * x + e[6] * y + e[10] * z; - return this.normalize(); + //helper functions + async draw_shape(point, overrideOpacity) { + const brushSettings = this.brushSettings; + const maskCtx = this.maskCtx || await this.messageBroker.pull("maskCtx"); + const brushType = await this.messageBroker.pull("brushType"); + const maskColor = await this.messageBroker.pull("getMaskColor"); + const size = brushSettings.size; + const sliderOpacity = brushSettings.opacity; + const opacity = overrideOpacity == void 0 ? sliderOpacity : overrideOpacity; + const hardness = brushSettings.hardness; + const x = point.x; + const y = point.y; + const extendedSize = size * (2 - hardness); + let gradient = maskCtx.createRadialGradient(x, y, 0, x, y, extendedSize); + const isErasing = maskCtx.globalCompositeOperation === "destination-out"; + if (hardness === 1) { + console.log(sliderOpacity, opacity); + gradient.addColorStop( + 0, + isErasing ? `rgba(255, 255, 255, ${opacity})` : `rgba(${maskColor.r}, ${maskColor.g}, ${maskColor.b}, ${opacity})` + ); + gradient.addColorStop( + 1, + isErasing ? `rgba(255, 255, 255, ${opacity})` : `rgba(${maskColor.r}, ${maskColor.g}, ${maskColor.b}, ${opacity})` + ); + } else { + let softness = 1 - hardness; + let innerStop = Math.max(0, hardness - softness); + let outerStop = size / extendedSize; + if (isErasing) { + gradient.addColorStop(0, `rgba(255, 255, 255, ${opacity})`); + gradient.addColorStop(innerStop, `rgba(255, 255, 255, ${opacity})`); + gradient.addColorStop(outerStop, `rgba(255, 255, 255, ${opacity / 2})`); + gradient.addColorStop(1, `rgba(255, 255, 255, 0)`); + } else { + gradient.addColorStop( + 0, + `rgba(${maskColor.r}, ${maskColor.g}, ${maskColor.b}, ${opacity})` + ); + gradient.addColorStop( + innerStop, + `rgba(${maskColor.r}, ${maskColor.g}, ${maskColor.b}, ${opacity})` + ); + gradient.addColorStop( + outerStop, + `rgba(${maskColor.r}, ${maskColor.g}, ${maskColor.b}, ${opacity / 2})` + ); + gradient.addColorStop( + 1, + `rgba(${maskColor.r}, ${maskColor.g}, ${maskColor.b}, 0)` + ); + } + } + maskCtx.fillStyle = gradient; + maskCtx.beginPath(); + if (brushType === "rect") { + maskCtx.rect( + x - extendedSize, + y - extendedSize, + extendedSize * 2, + extendedSize * 2 + ); + } else { + maskCtx.arc(x, y, extendedSize, 0, Math.PI * 2, false); + } + maskCtx.fill(); } - divide(v) { - this.x /= v.x; - this.y /= v.y; - this.z /= v.z; - return this; + async init_shape(compositionOperation) { + const maskBlendMode = await this.messageBroker.pull("maskBlendMode"); + const maskCtx = this.maskCtx || await this.messageBroker.pull("maskCtx"); + maskCtx.beginPath(); + if (compositionOperation == "source-over") { + maskCtx.fillStyle = maskBlendMode; + maskCtx.globalCompositeOperation = "source-over"; + } else if (compositionOperation == "destination-out") { + maskCtx.globalCompositeOperation = "destination-out"; + } } - divideScalar(scalar) { - return this.multiplyScalar(1 / scalar); + calculateCubicSplinePoints(points, numSegments = 10) { + const result = []; + const xCoords = points.map((p) => p.x); + const yCoords = points.map((p) => p.y); + const xDerivatives = this.calculateSplineCoefficients(xCoords); + const yDerivatives = this.calculateSplineCoefficients(yCoords); + for (let i = 0; i < points.length - 1; i++) { + const p0 = points[i]; + const p1 = points[i + 1]; + const d0x = xDerivatives[i]; + const d1x = xDerivatives[i + 1]; + const d0y = yDerivatives[i]; + const d1y = yDerivatives[i + 1]; + for (let t2 = 0; t2 <= numSegments; t2++) { + const t_normalized = t2 / numSegments; + const h00 = 2 * t_normalized ** 3 - 3 * t_normalized ** 2 + 1; + const h10 = t_normalized ** 3 - 2 * t_normalized ** 2 + t_normalized; + const h01 = -2 * t_normalized ** 3 + 3 * t_normalized ** 2; + const h11 = t_normalized ** 3 - t_normalized ** 2; + const x = h00 * p0.x + h10 * d0x + h01 * p1.x + h11 * d1x; + const y = h00 * p0.y + h10 * d0y + h01 * p1.y + h11 * d1y; + result.push({ x, y }); + } + } + return result; } - min(v) { - this.x = Math.min(this.x, v.x); - this.y = Math.min(this.y, v.y); - this.z = Math.min(this.z, v.z); - return this; + generateEvenlyDistributedPoints(splinePoints, numPoints) { + const distances = [0]; + for (let i = 1; i < splinePoints.length; i++) { + const dx = splinePoints[i].x - splinePoints[i - 1].x; + const dy = splinePoints[i].y - splinePoints[i - 1].y; + const dist = Math.hypot(dx, dy); + distances.push(distances[i - 1] + dist); + } + const totalLength = distances[distances.length - 1]; + const interval = totalLength / (numPoints - 1); + const result = []; + let currentIndex = 0; + for (let i = 0; i < numPoints; i++) { + const targetDistance = i * interval; + while (currentIndex < distances.length - 1 && distances[currentIndex + 1] < targetDistance) { + currentIndex++; + } + const t2 = (targetDistance - distances[currentIndex]) / (distances[currentIndex + 1] - distances[currentIndex]); + const x = splinePoints[currentIndex].x + t2 * (splinePoints[currentIndex + 1].x - splinePoints[currentIndex].x); + const y = splinePoints[currentIndex].y + t2 * (splinePoints[currentIndex + 1].y - splinePoints[currentIndex].y); + result.push({ x, y }); + } + return result; } - max(v) { - this.x = Math.max(this.x, v.x); - this.y = Math.max(this.y, v.y); - this.z = Math.max(this.z, v.z); - return this; - } - clamp(min, max2) { - this.x = Math.max(min.x, Math.min(max2.x, this.x)); - this.y = Math.max(min.y, Math.min(max2.y, this.y)); - this.z = Math.max(min.z, Math.min(max2.z, this.z)); - return this; - } - clampScalar(minVal, maxVal) { - this.x = Math.max(minVal, Math.min(maxVal, this.x)); - this.y = Math.max(minVal, Math.min(maxVal, this.y)); - this.z = Math.max(minVal, Math.min(maxVal, this.z)); - return this; - } - clampLength(min, max2) { - const length = this.length(); - return this.divideScalar(length || 1).multiplyScalar(Math.max(min, Math.min(max2, length))); - } - floor() { - this.x = Math.floor(this.x); - this.y = Math.floor(this.y); - this.z = Math.floor(this.z); - return this; - } - ceil() { - this.x = Math.ceil(this.x); - this.y = Math.ceil(this.y); - this.z = Math.ceil(this.z); - return this; - } - round() { - this.x = Math.round(this.x); - this.y = Math.round(this.y); - this.z = Math.round(this.z); - return this; - } - roundToZero() { - this.x = Math.trunc(this.x); - this.y = Math.trunc(this.y); - this.z = Math.trunc(this.z); - return this; - } - negate() { - this.x = -this.x; - this.y = -this.y; - this.z = -this.z; - return this; - } - dot(v) { - return this.x * v.x + this.y * v.y + this.z * v.z; - } - // TODO lengthSquared? - lengthSq() { - return this.x * this.x + this.y * this.y + this.z * this.z; - } - length() { - return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z); - } - manhattanLength() { - return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z); - } - normalize() { - return this.divideScalar(this.length() || 1); - } - setLength(length) { - return this.normalize().multiplyScalar(length); - } - lerp(v, alpha) { - this.x += (v.x - this.x) * alpha; - this.y += (v.y - this.y) * alpha; - this.z += (v.z - this.z) * alpha; - return this; - } - lerpVectors(v1, v2, alpha) { - this.x = v1.x + (v2.x - v1.x) * alpha; - this.y = v1.y + (v2.y - v1.y) * alpha; - this.z = v1.z + (v2.z - v1.z) * alpha; - return this; - } - cross(v) { - return this.crossVectors(this, v); - } - crossVectors(a, b) { - const ax = a.x, ay = a.y, az = a.z; - const bx = b.x, by = b.y, bz = b.z; - this.x = ay * bz - az * by; - this.y = az * bx - ax * bz; - this.z = ax * by - ay * bx; - return this; - } - projectOnVector(v) { - const denominator = v.lengthSq(); - if (denominator === 0) return this.set(0, 0, 0); - const scalar = v.dot(this) / denominator; - return this.copy(v).multiplyScalar(scalar); - } - projectOnPlane(planeNormal) { - _vector$c.copy(this).projectOnVector(planeNormal); - return this.sub(_vector$c); - } - reflect(normal) { - return this.sub(_vector$c.copy(normal).multiplyScalar(2 * this.dot(normal))); - } - angleTo(v) { - const denominator = Math.sqrt(this.lengthSq() * v.lengthSq()); - if (denominator === 0) return Math.PI / 2; - const theta = this.dot(v) / denominator; - return Math.acos(clamp(theta, -1, 1)); - } - distanceTo(v) { - return Math.sqrt(this.distanceToSquared(v)); - } - distanceToSquared(v) { - const dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z; - return dx * dx + dy * dy + dz * dz; - } - manhattanDistanceTo(v) { - return Math.abs(this.x - v.x) + Math.abs(this.y - v.y) + Math.abs(this.z - v.z); - } - setFromSpherical(s) { - return this.setFromSphericalCoords(s.radius, s.phi, s.theta); - } - setFromSphericalCoords(radius, phi, theta) { - const sinPhiRadius = Math.sin(phi) * radius; - this.x = sinPhiRadius * Math.sin(theta); - this.y = Math.cos(phi) * radius; - this.z = sinPhiRadius * Math.cos(theta); - return this; - } - setFromCylindrical(c) { - return this.setFromCylindricalCoords(c.radius, c.theta, c.y); - } - setFromCylindricalCoords(radius, theta, y) { - this.x = radius * Math.sin(theta); - this.y = y; - this.z = radius * Math.cos(theta); - return this; - } - setFromMatrixPosition(m) { - const e = m.elements; - this.x = e[12]; - this.y = e[13]; - this.z = e[14]; - return this; - } - setFromMatrixScale(m) { - const sx = this.setFromMatrixColumn(m, 0).length(); - const sy = this.setFromMatrixColumn(m, 1).length(); - const sz = this.setFromMatrixColumn(m, 2).length(); - this.x = sx; - this.y = sy; - this.z = sz; - return this; - } - setFromMatrixColumn(m, index) { - return this.fromArray(m.elements, index * 4); - } - setFromMatrix3Column(m, index) { - return this.fromArray(m.elements, index * 3); + generateEquidistantPoints(points, distance) { + const result = []; + const cumulativeDistances = [0]; + for (let i = 1; i < points.length; i++) { + const dx = points[i].x - points[i - 1].x; + const dy = points[i].y - points[i - 1].y; + const dist = Math.hypot(dx, dy); + cumulativeDistances[i] = cumulativeDistances[i - 1] + dist; + } + const totalLength = cumulativeDistances[cumulativeDistances.length - 1]; + const numPoints = Math.floor(totalLength / distance); + for (let i = 0; i <= numPoints; i++) { + const targetDistance = i * distance; + let idx = 0; + while (idx < cumulativeDistances.length - 1 && cumulativeDistances[idx + 1] < targetDistance) { + idx++; + } + if (idx >= points.length - 1) { + result.push(points[points.length - 1]); + continue; + } + const d0 = cumulativeDistances[idx]; + const d1 = cumulativeDistances[idx + 1]; + const t2 = (targetDistance - d0) / (d1 - d0); + const x = points[idx].x + t2 * (points[idx + 1].x - points[idx].x); + const y = points[idx].y + t2 * (points[idx + 1].y - points[idx].y); + result.push({ x, y }); + } + return result; } - setFromEuler(e) { - this.x = e._x; - this.y = e._y; - this.z = e._z; - return this; + calculateSplineCoefficients(values) { + const n = values.length - 1; + const matrix = new Array(n + 1).fill(0).map(() => new Array(n + 1).fill(0)); + const rhs = new Array(n + 1).fill(0); + for (let i = 1; i < n; i++) { + matrix[i][i - 1] = 1; + matrix[i][i] = 4; + matrix[i][i + 1] = 1; + rhs[i] = 3 * (values[i + 1] - values[i - 1]); + } + matrix[0][0] = 2; + matrix[0][1] = 1; + matrix[n][n - 1] = 1; + matrix[n][n] = 2; + rhs[0] = 3 * (values[1] - values[0]); + rhs[n] = 3 * (values[n] - values[n - 1]); + for (let i = 1; i <= n; i++) { + const m = matrix[i][i - 1] / matrix[i - 1][i - 1]; + matrix[i][i] -= m * matrix[i - 1][i]; + rhs[i] -= m * rhs[i - 1]; + } + const solution = new Array(n + 1); + solution[n] = rhs[n] / matrix[n][n]; + for (let i = n - 1; i >= 0; i--) { + solution[i] = (rhs[i] - matrix[i][i + 1] * solution[i + 1]) / matrix[i][i]; + } + return solution; } - setFromColor(c) { - this.x = c.r; - this.y = c.g; - this.z = c.b; - return this; + setBrushSize(size) { + this.brushSettings.size = size; } - equals(v) { - return v.x === this.x && v.y === this.y && v.z === this.z; + setBrushOpacity(opacity) { + this.brushSettings.opacity = opacity; } - fromArray(array, offset = 0) { - this.x = array[offset]; - this.y = array[offset + 1]; - this.z = array[offset + 2]; - return this; + setBrushHardness(hardness) { + this.brushSettings.hardness = hardness; } - toArray(array = [], offset = 0) { - array[offset] = this.x; - array[offset + 1] = this.y; - array[offset + 2] = this.z; - return array; + setBrushType(type) { + this.brushSettings.type = type; } - fromBufferAttribute(attribute, index) { - this.x = attribute.getX(index); - this.y = attribute.getY(index); - this.z = attribute.getZ(index); - return this; + setBrushSmoothingPrecision(precision) { + this.smoothingPrecision = precision; } - random() { - this.x = Math.random(); - this.y = Math.random(); - this.z = Math.random(); - return this; +} +class UIManager { + static { + __name(this, "UIManager"); } - randomDirection() { - const theta = Math.random() * Math.PI * 2; - const u = Math.random() * 2 - 1; - const c = Math.sqrt(1 - u * u); - this.x = c * Math.cos(theta); - this.y = u; - this.z = c * Math.sin(theta); - return this; + rootElement; + brush; + brushPreviewGradient; + maskCtx; + imageCtx; + maskCanvas; + imgCanvas; + brushSettingsHTML; + paintBucketSettingsHTML; + colorSelectSettingsHTML; + maskOpacitySlider; + brushHardnessSlider; + brushSizeSlider; + brushOpacitySlider; + sidebarImage; + saveButton; + toolPanel; + sidePanel; + pointerZone; + canvasBackground; + canvasContainer; + image; + imageURL; + darkMode = true; + maskEditor; + messageBroker; + mask_opacity = 1; + maskBlendMode = "black"; + zoomTextHTML; + dimensionsTextHTML; + constructor(rootElement, maskEditor) { + this.rootElement = rootElement; + this.maskEditor = maskEditor; + this.messageBroker = maskEditor.getMessageBroker(); + this.addListeners(); + this.addPullTopics(); } - *[Symbol.iterator]() { - yield this.x; - yield this.y; - yield this.z; + addListeners() { + this.messageBroker.subscribe( + "updateBrushPreview", + async () => this.updateBrushPreview() + ); + this.messageBroker.subscribe( + "paintBucketCursor", + (isPaintBucket) => this.handlePaintBucketCursor(isPaintBucket) + ); + this.messageBroker.subscribe( + "panCursor", + (isPan) => this.handlePanCursor(isPan) + ); + this.messageBroker.subscribe( + "setBrushVisibility", + (isVisible) => this.setBrushVisibility(isVisible) + ); + this.messageBroker.subscribe( + "setBrushPreviewGradientVisibility", + (isVisible) => this.setBrushPreviewGradientVisibility(isVisible) + ); + this.messageBroker.subscribe("updateCursor", () => this.updateCursor()); + this.messageBroker.subscribe( + "setZoomText", + (text) => this.setZoomText(text) + ); } -} -const _vector$c = /* @__PURE__ */ new Vector3(); -const _quaternion$4 = /* @__PURE__ */ new Quaternion(); -class Box3 { - static { - __name(this, "Box3"); + addPullTopics() { + this.messageBroker.createPullTopic( + "maskCanvas", + async () => this.maskCanvas + ); + this.messageBroker.createPullTopic("maskCtx", async () => this.maskCtx); + this.messageBroker.createPullTopic("imageCtx", async () => this.imageCtx); + this.messageBroker.createPullTopic("imgCanvas", async () => this.imgCanvas); + this.messageBroker.createPullTopic( + "screenToCanvas", + async (coords) => this.screenToCanvas(coords) + ); + this.messageBroker.createPullTopic( + "getCanvasContainer", + async () => this.canvasContainer + ); + this.messageBroker.createPullTopic( + "getMaskColor", + async () => this.getMaskColor() + ); } - constructor(min = new Vector3(Infinity, Infinity, Infinity), max2 = new Vector3(-Infinity, -Infinity, -Infinity)) { - this.isBox3 = true; - this.min = min; - this.max = max2; + async setlayout() { + this.detectLightMode(); + var user_ui = await this.createUI(); + var canvasContainer = this.createBackgroundUI(); + var brush = await this.createBrush(); + await this.setBrushBorderRadius(); + this.setBrushOpacity(1); + this.rootElement.appendChild(canvasContainer); + this.rootElement.appendChild(user_ui); + document.body.appendChild(brush); } - set(min, max2) { - this.min.copy(min); - this.max.copy(max2); - return this; + async createUI() { + var ui_container = document.createElement("div"); + ui_container.id = "maskEditor_uiContainer"; + var top_bar = await this.createTopBar(); + var ui_horizontal_container = document.createElement("div"); + ui_horizontal_container.id = "maskEditor_uiHorizontalContainer"; + var side_panel_container = await this.createSidePanel(); + var pointer_zone = this.createPointerZone(); + var tool_panel = this.createToolPanel(); + ui_horizontal_container.appendChild(tool_panel); + ui_horizontal_container.appendChild(pointer_zone); + ui_horizontal_container.appendChild(side_panel_container); + ui_container.appendChild(top_bar); + ui_container.appendChild(ui_horizontal_container); + return ui_container; } - setFromArray(array) { - this.makeEmpty(); - for (let i = 0, il = array.length; i < il; i += 3) { - this.expandByPoint(_vector$b.fromArray(array, i)); + createBackgroundUI() { + const canvasContainer = document.createElement("div"); + canvasContainer.id = "maskEditorCanvasContainer"; + const imgCanvas = document.createElement("canvas"); + imgCanvas.id = "imageCanvas"; + const maskCanvas = document.createElement("canvas"); + maskCanvas.id = "maskCanvas"; + const canvas_background = document.createElement("div"); + canvas_background.id = "canvasBackground"; + canvasContainer.appendChild(imgCanvas); + canvasContainer.appendChild(maskCanvas); + canvasContainer.appendChild(canvas_background); + this.imgCanvas = imgCanvas; + this.maskCanvas = maskCanvas; + this.canvasContainer = canvasContainer; + this.canvasBackground = canvas_background; + let maskCtx = maskCanvas.getContext("2d", { willReadFrequently: true }); + if (maskCtx) { + this.maskCtx = maskCtx; } - return this; - } - setFromBufferAttribute(attribute) { - this.makeEmpty(); - for (let i = 0, il = attribute.count; i < il; i++) { - this.expandByPoint(_vector$b.fromBufferAttribute(attribute, i)); + let imgCtx = imgCanvas.getContext("2d", { willReadFrequently: true }); + if (imgCtx) { + this.imageCtx = imgCtx; } - return this; + this.setEventHandler(); + this.imgCanvas.style.position = "absolute"; + this.maskCanvas.style.position = "absolute"; + this.imgCanvas.style.top = "200"; + this.imgCanvas.style.left = "0"; + this.maskCanvas.style.top = this.imgCanvas.style.top; + this.maskCanvas.style.left = this.imgCanvas.style.left; + const maskCanvasStyle = this.getMaskCanvasStyle(); + this.maskCanvas.style.mixBlendMode = maskCanvasStyle.mixBlendMode; + this.maskCanvas.style.opacity = maskCanvasStyle.opacity.toString(); + return canvasContainer; } - setFromPoints(points) { - this.makeEmpty(); - for (let i = 0, il = points.length; i < il; i++) { - this.expandByPoint(points[i]); + async setBrushBorderRadius() { + const brushSettings = await this.messageBroker.pull("brushSettings"); + if (brushSettings.type === "rect") { + this.brush.style.borderRadius = "0%"; + this.brush.style.MozBorderRadius = "0%"; + this.brush.style.WebkitBorderRadius = "0%"; + } else { + this.brush.style.borderRadius = "50%"; + this.brush.style.MozBorderRadius = "50%"; + this.brush.style.WebkitBorderRadius = "50%"; } - return this; - } - setFromCenterAndSize(center, size) { - const halfSize = _vector$b.copy(size).multiplyScalar(0.5); - this.min.copy(center).sub(halfSize); - this.max.copy(center).add(halfSize); - return this; - } - setFromObject(object, precise = false) { - this.makeEmpty(); - return this.expandByObject(object, precise); - } - clone() { - return new this.constructor().copy(this); - } - copy(box) { - this.min.copy(box.min); - this.max.copy(box.max); - return this; - } - makeEmpty() { - this.min.x = this.min.y = this.min.z = Infinity; - this.max.x = this.max.y = this.max.z = -Infinity; - return this; - } - isEmpty() { - return this.max.x < this.min.x || this.max.y < this.min.y || this.max.z < this.min.z; - } - getCenter(target) { - return this.isEmpty() ? target.set(0, 0, 0) : target.addVectors(this.min, this.max).multiplyScalar(0.5); } - getSize(target) { - return this.isEmpty() ? target.set(0, 0, 0) : target.subVectors(this.max, this.min); + async initUI() { + this.saveButton.innerText = "Save"; + this.saveButton.disabled = false; + await this.setImages(this.imgCanvas); } - expandByPoint(point) { - this.min.min(point); - this.max.max(point); - return this; + async createSidePanel() { + const side_panel = this.createContainer(true); + side_panel.id = "maskEditor_sidePanel"; + const brush_settings = await this.createBrushSettings(); + brush_settings.id = "maskEditor_brushSettings"; + this.brushSettingsHTML = brush_settings; + const paint_bucket_settings = await this.createPaintBucketSettings(); + paint_bucket_settings.id = "maskEditor_paintBucketSettings"; + this.paintBucketSettingsHTML = paint_bucket_settings; + const color_select_settings = await this.createColorSelectSettings(); + color_select_settings.id = "maskEditor_colorSelectSettings"; + this.colorSelectSettingsHTML = color_select_settings; + const image_layer_settings = await this.createImageLayerSettings(); + const separator = this.createSeparator(); + side_panel.appendChild(brush_settings); + side_panel.appendChild(paint_bucket_settings); + side_panel.appendChild(color_select_settings); + side_panel.appendChild(separator); + side_panel.appendChild(image_layer_settings); + return side_panel; } - expandByVector(vector) { - this.min.sub(vector); - this.max.add(vector); - return this; - } - expandByScalar(scalar) { - this.min.addScalar(-scalar); - this.max.addScalar(scalar); - return this; - } - expandByObject(object, precise = false) { - object.updateWorldMatrix(false, false); - const geometry = object.geometry; - if (geometry !== void 0) { - const positionAttribute = geometry.getAttribute("position"); - if (precise === true && positionAttribute !== void 0 && object.isInstancedMesh !== true) { - for (let i = 0, l = positionAttribute.count; i < l; i++) { - if (object.isMesh === true) { - object.getVertexPosition(i, _vector$b); - } else { - _vector$b.fromBufferAttribute(positionAttribute, i); - } - _vector$b.applyMatrix4(object.matrixWorld); - this.expandByPoint(_vector$b); - } - } else { - if (object.boundingBox !== void 0) { - if (object.boundingBox === null) { - object.computeBoundingBox(); - } - _box$4.copy(object.boundingBox); - } else { - if (geometry.boundingBox === null) { - geometry.computeBoundingBox(); - } - _box$4.copy(geometry.boundingBox); - } - _box$4.applyMatrix4(object.matrixWorld); - this.union(_box$4); + async createBrushSettings() { + const shapeColor = this.darkMode ? "maskEditor_brushShape_dark" : "maskEditor_brushShape_light"; + const brush_settings_container = this.createContainer(true); + const brush_settings_title = this.createHeadline("Brush Settings"); + const brush_shape_outer_container = this.createContainer(true); + const brush_shape_title = this.createContainerTitle("Brush Shape"); + const brush_shape_container = this.createContainer(false); + const accentColor = this.darkMode ? "maskEditor_accent_bg_dark" : "maskEditor_accent_bg_light"; + brush_shape_container.classList.add(accentColor); + brush_shape_container.classList.add("maskEditor_layerRow"); + const circle_shape = document.createElement("div"); + circle_shape.id = "maskEditor_sidePanelBrushShapeCircle"; + circle_shape.classList.add(shapeColor); + circle_shape.style.background = "var(--p-button-text-primary-color)"; + circle_shape.addEventListener("click", () => { + this.messageBroker.publish( + "setBrushShape", + "arc" + /* Arc */ + ); + this.setBrushBorderRadius(); + circle_shape.style.background = "var(--p-button-text-primary-color)"; + square_shape.style.background = ""; + }); + const square_shape = document.createElement("div"); + square_shape.id = "maskEditor_sidePanelBrushShapeSquare"; + square_shape.classList.add(shapeColor); + square_shape.style.background = ""; + square_shape.addEventListener("click", () => { + this.messageBroker.publish( + "setBrushShape", + "rect" + /* Rect */ + ); + this.setBrushBorderRadius(); + square_shape.style.background = "var(--p-button-text-primary-color)"; + circle_shape.style.background = ""; + }); + brush_shape_container.appendChild(circle_shape); + brush_shape_container.appendChild(square_shape); + brush_shape_outer_container.appendChild(brush_shape_title); + brush_shape_outer_container.appendChild(brush_shape_container); + const thicknesSliderObj = this.createSlider( + "Thickness", + 1, + 100, + 1, + 10, + (event, value) => { + this.messageBroker.publish("setBrushSize", parseInt(value)); + this.updateBrushPreview(); } - } - const children = object.children; - for (let i = 0, l = children.length; i < l; i++) { - this.expandByObject(children[i], precise); - } - return this; - } - containsPoint(point) { - return point.x >= this.min.x && point.x <= this.max.x && point.y >= this.min.y && point.y <= this.max.y && point.z >= this.min.z && point.z <= this.max.z; - } - containsBox(box) { - return this.min.x <= box.min.x && box.max.x <= this.max.x && this.min.y <= box.min.y && box.max.y <= this.max.y && this.min.z <= box.min.z && box.max.z <= this.max.z; - } - getParameter(point, target) { - return target.set( - (point.x - this.min.x) / (this.max.x - this.min.x), - (point.y - this.min.y) / (this.max.y - this.min.y), - (point.z - this.min.z) / (this.max.z - this.min.z) ); - } - intersectsBox(box) { - return box.max.x >= this.min.x && box.min.x <= this.max.x && box.max.y >= this.min.y && box.min.y <= this.max.y && box.max.z >= this.min.z && box.min.z <= this.max.z; - } - intersectsSphere(sphere) { - this.clampPoint(sphere.center, _vector$b); - return _vector$b.distanceToSquared(sphere.center) <= sphere.radius * sphere.radius; - } - intersectsPlane(plane) { - let min, max2; - if (plane.normal.x > 0) { - min = plane.normal.x * this.min.x; - max2 = plane.normal.x * this.max.x; - } else { - min = plane.normal.x * this.max.x; - max2 = plane.normal.x * this.min.x; - } - if (plane.normal.y > 0) { - min += plane.normal.y * this.min.y; - max2 += plane.normal.y * this.max.y; - } else { - min += plane.normal.y * this.max.y; - max2 += plane.normal.y * this.min.y; - } - if (plane.normal.z > 0) { - min += plane.normal.z * this.min.z; - max2 += plane.normal.z * this.max.z; - } else { - min += plane.normal.z * this.max.z; - max2 += plane.normal.z * this.min.z; - } - return min <= -plane.constant && max2 >= -plane.constant; - } - intersectsTriangle(triangle) { - if (this.isEmpty()) { - return false; - } - this.getCenter(_center); - _extents.subVectors(this.max, _center); - _v0$3.subVectors(triangle.a, _center); - _v1$7.subVectors(triangle.b, _center); - _v2$4.subVectors(triangle.c, _center); - _f0.subVectors(_v1$7, _v0$3); - _f1.subVectors(_v2$4, _v1$7); - _f2.subVectors(_v0$3, _v2$4); - let axes = [ - 0, - -_f0.z, - _f0.y, - 0, - -_f1.z, - _f1.y, + this.brushSizeSlider = thicknesSliderObj.slider; + const opacitySliderObj = this.createSlider( + "Opacity", 0, - -_f2.z, - _f2.y, - _f0.z, + 1, + 0.01, + 0.7, + (event, value) => { + this.messageBroker.publish("setBrushOpacity", parseFloat(value)); + this.updateBrushPreview(); + } + ); + this.brushOpacitySlider = opacitySliderObj.slider; + const hardnessSliderObj = this.createSlider( + "Hardness", 0, - -_f0.x, - _f1.z, + 1, + 0.01, + 1, + (event, value) => { + this.messageBroker.publish("setBrushHardness", parseFloat(value)); + this.updateBrushPreview(); + } + ); + this.brushHardnessSlider = hardnessSliderObj.slider; + const brushSmoothingPrecisionSliderObj = this.createSlider( + "Smoothing Precision", + 1, + 100, + 1, + 10, + (event, value) => { + this.messageBroker.publish( + "setBrushSmoothingPrecision", + parseInt(value) + ); + } + ); + brush_settings_container.appendChild(brush_settings_title); + brush_settings_container.appendChild(brush_shape_outer_container); + brush_settings_container.appendChild(thicknesSliderObj.container); + brush_settings_container.appendChild(opacitySliderObj.container); + brush_settings_container.appendChild(hardnessSliderObj.container); + brush_settings_container.appendChild( + brushSmoothingPrecisionSliderObj.container + ); + return brush_settings_container; + } + async createPaintBucketSettings() { + const paint_bucket_settings_container = this.createContainer(true); + const paint_bucket_settings_title = this.createHeadline( + "Paint Bucket Settings" + ); + const tolerance = await this.messageBroker.pull("getTolerance"); + const paintBucketToleranceSliderObj = this.createSlider( + "Tolerance", 0, - -_f1.x, - _f2.z, + 255, + 1, + tolerance, + (event, value) => { + this.messageBroker.publish("setPaintBucketTolerance", parseInt(value)); + } + ); + paint_bucket_settings_container.appendChild(paint_bucket_settings_title); + paint_bucket_settings_container.appendChild( + paintBucketToleranceSliderObj.container + ); + return paint_bucket_settings_container; + } + async createColorSelectSettings() { + const color_select_settings_container = this.createContainer(true); + const color_select_settings_title = this.createHeadline( + "Color Select Settings" + ); + var tolerance = await this.messageBroker.pull("getTolerance"); + const colorSelectToleranceSliderObj = this.createSlider( + "Tolerance", 0, - -_f2.x, - -_f0.y, - _f0.x, + 255, + 1, + tolerance, + (event, value) => { + this.messageBroker.publish("setColorSelectTolerance", parseInt(value)); + } + ); + const livePreviewToggle = this.createToggle( + "Live Preview", + (event, value) => { + this.messageBroker.publish("setLivePreview", value); + } + ); + const wholeImageToggle = this.createToggle( + "Apply to Whole Image", + (event, value) => { + this.messageBroker.publish("setWholeImage", value); + } + ); + const methodOptions = Object.values(ColorComparisonMethod); + const methodSelect = this.createDropdown( + "Method", + methodOptions, + (event, value) => { + this.messageBroker.publish("setColorComparisonMethod", value); + } + ); + const maskBoundaryToggle = this.createToggle( + "Stop at mask", + (event, value) => { + this.messageBroker.publish("setMaskBoundary", value); + } + ); + const maskToleranceSliderObj = this.createSlider( + "Mask Tolerance", 0, - -_f1.y, - _f1.x, + 255, + 1, 0, - -_f2.y, - _f2.x, - 0 - ]; - if (!satForAxes(axes, _v0$3, _v1$7, _v2$4, _extents)) { - return false; - } - axes = [1, 0, 0, 0, 1, 0, 0, 0, 1]; - if (!satForAxes(axes, _v0$3, _v1$7, _v2$4, _extents)) { - return false; - } - _triangleNormal.crossVectors(_f0, _f1); - axes = [_triangleNormal.x, _triangleNormal.y, _triangleNormal.z]; - return satForAxes(axes, _v0$3, _v1$7, _v2$4, _extents); + (event, value) => { + this.messageBroker.publish("setMaskTolerance", parseInt(value)); + } + ); + color_select_settings_container.appendChild(color_select_settings_title); + color_select_settings_container.appendChild( + colorSelectToleranceSliderObj.container + ); + color_select_settings_container.appendChild(livePreviewToggle); + color_select_settings_container.appendChild(wholeImageToggle); + color_select_settings_container.appendChild(methodSelect); + color_select_settings_container.appendChild(maskBoundaryToggle); + color_select_settings_container.appendChild( + maskToleranceSliderObj.container + ); + return color_select_settings_container; } - clampPoint(point, target) { - return target.copy(point).clamp(this.min, this.max); + async createImageLayerSettings() { + const accentColor = this.darkMode ? "maskEditor_accent_bg_dark" : "maskEditor_accent_bg_light"; + const image_layer_settings_container = this.createContainer(true); + const image_layer_settings_title = this.createHeadline("Layers"); + const mask_layer_title = this.createContainerTitle("Mask Layer"); + const mask_layer_container = this.createContainer(false); + mask_layer_container.classList.add(accentColor); + mask_layer_container.classList.add("maskEditor_layerRow"); + const mask_layer_visibility_checkbox = document.createElement("input"); + mask_layer_visibility_checkbox.setAttribute("type", "checkbox"); + mask_layer_visibility_checkbox.checked = true; + mask_layer_visibility_checkbox.classList.add( + "maskEditor_sidePanelLayerCheckbox" + ); + mask_layer_visibility_checkbox.addEventListener("change", (event) => { + if (!event.target.checked) { + this.maskCanvas.style.opacity = "0"; + } else { + this.maskCanvas.style.opacity = String(this.mask_opacity); + } + }); + var mask_layer_image_container = document.createElement("div"); + mask_layer_image_container.classList.add( + "maskEditor_sidePanelLayerPreviewContainer" + ); + mask_layer_image_container.innerHTML = ' '; + var blending_options = ["black", "white", "negative"]; + const sidePanelDropdownAccent = this.darkMode ? "maskEditor_sidePanelDropdown_dark" : "maskEditor_sidePanelDropdown_light"; + var mask_layer_dropdown = document.createElement("select"); + mask_layer_dropdown.classList.add(sidePanelDropdownAccent); + mask_layer_dropdown.classList.add(sidePanelDropdownAccent); + blending_options.forEach((option) => { + var option_element = document.createElement("option"); + option_element.value = option; + option_element.innerText = option; + mask_layer_dropdown.appendChild(option_element); + if (option == this.maskBlendMode) { + option_element.selected = true; + } + }); + mask_layer_dropdown.addEventListener("change", (event) => { + const selectedValue = event.target.value; + this.maskBlendMode = selectedValue; + this.updateMaskColor(); + }); + mask_layer_container.appendChild(mask_layer_visibility_checkbox); + mask_layer_container.appendChild(mask_layer_image_container); + mask_layer_container.appendChild(mask_layer_dropdown); + const mask_layer_opacity_sliderObj = this.createSlider( + "Mask Opacity", + 0, + 1, + 0.01, + this.mask_opacity, + (event, value) => { + this.mask_opacity = parseFloat(value); + this.maskCanvas.style.opacity = String(this.mask_opacity); + if (this.mask_opacity == 0) { + mask_layer_visibility_checkbox.checked = false; + } else { + mask_layer_visibility_checkbox.checked = true; + } + } + ); + this.maskOpacitySlider = mask_layer_opacity_sliderObj.slider; + const image_layer_title = this.createContainerTitle("Image Layer"); + const image_layer_container = this.createContainer(false); + image_layer_container.classList.add(accentColor); + image_layer_container.classList.add("maskEditor_layerRow"); + const image_layer_visibility_checkbox = document.createElement("input"); + image_layer_visibility_checkbox.setAttribute("type", "checkbox"); + image_layer_visibility_checkbox.classList.add( + "maskEditor_sidePanelLayerCheckbox" + ); + image_layer_visibility_checkbox.checked = true; + image_layer_visibility_checkbox.addEventListener("change", (event) => { + if (!event.target.checked) { + this.imgCanvas.style.opacity = "0"; + } else { + this.imgCanvas.style.opacity = "1"; + } + }); + const image_layer_image_container = document.createElement("div"); + image_layer_image_container.classList.add( + "maskEditor_sidePanelLayerPreviewContainer" + ); + const image_layer_image = document.createElement("img"); + image_layer_image.id = "maskEditor_sidePanelImageLayerImage"; + image_layer_image.src = ComfyApp.clipspace?.imgs?.[ComfyApp.clipspace?.selectedIndex ?? 0]?.src ?? ""; + this.sidebarImage = image_layer_image; + image_layer_image_container.appendChild(image_layer_image); + image_layer_container.appendChild(image_layer_visibility_checkbox); + image_layer_container.appendChild(image_layer_image_container); + image_layer_settings_container.appendChild(image_layer_settings_title); + image_layer_settings_container.appendChild(mask_layer_title); + image_layer_settings_container.appendChild(mask_layer_container); + image_layer_settings_container.appendChild( + mask_layer_opacity_sliderObj.container + ); + image_layer_settings_container.appendChild(image_layer_title); + image_layer_settings_container.appendChild(image_layer_container); + return image_layer_settings_container; } - distanceToPoint(point) { - return this.clampPoint(point, _vector$b).distanceTo(point); + createHeadline(title) { + var headline = document.createElement("h3"); + headline.classList.add("maskEditor_sidePanelTitle"); + headline.innerText = title; + return headline; } - getBoundingSphere(target) { - if (this.isEmpty()) { - target.makeEmpty(); + createContainer(flexDirection) { + var container = document.createElement("div"); + if (flexDirection) { + container.classList.add("maskEditor_sidePanelContainerColumn"); } else { - this.getCenter(target.center); - target.radius = this.getSize(_vector$b).length() * 0.5; + container.classList.add("maskEditor_sidePanelContainerRow"); } - return target; - } - intersect(box) { - this.min.max(box.min); - this.max.min(box.max); - if (this.isEmpty()) this.makeEmpty(); - return this; - } - union(box) { - this.min.min(box.min); - this.max.max(box.max); - return this; + return container; } - applyMatrix4(matrix) { - if (this.isEmpty()) return this; - _points[0].set(this.min.x, this.min.y, this.min.z).applyMatrix4(matrix); - _points[1].set(this.min.x, this.min.y, this.max.z).applyMatrix4(matrix); - _points[2].set(this.min.x, this.max.y, this.min.z).applyMatrix4(matrix); - _points[3].set(this.min.x, this.max.y, this.max.z).applyMatrix4(matrix); - _points[4].set(this.max.x, this.min.y, this.min.z).applyMatrix4(matrix); - _points[5].set(this.max.x, this.min.y, this.max.z).applyMatrix4(matrix); - _points[6].set(this.max.x, this.max.y, this.min.z).applyMatrix4(matrix); - _points[7].set(this.max.x, this.max.y, this.max.z).applyMatrix4(matrix); - this.setFromPoints(_points); - return this; + createContainerTitle(title) { + var container_title = document.createElement("span"); + container_title.classList.add("maskEditor_sidePanelSubTitle"); + container_title.innerText = title; + return container_title; } - translate(offset) { - this.min.add(offset); - this.max.add(offset); - return this; + createSlider(title, min, max2, step, value, callback) { + var slider_container = this.createContainer(true); + var slider_title = this.createContainerTitle(title); + var slider = document.createElement("input"); + slider.classList.add("maskEditor_sidePanelBrushRange"); + slider.setAttribute("type", "range"); + slider.setAttribute("min", String(min)); + slider.setAttribute("max", String(max2)); + slider.setAttribute("step", String(step)); + slider.setAttribute("value", String(value)); + slider.addEventListener("input", (event) => { + callback(event, event.target.value); + }); + slider_container.appendChild(slider_title); + slider_container.appendChild(slider); + return { container: slider_container, slider }; } - equals(box) { - return box.min.equals(this.min) && box.max.equals(this.max); + createToggle(title, callback) { + var outer_Container = this.createContainer(false); + var toggle_title = this.createContainerTitle(title); + var toggle_container = document.createElement("label"); + toggle_container.classList.add("maskEditor_sidePanelToggleContainer"); + var toggle_checkbox = document.createElement("input"); + toggle_checkbox.setAttribute("type", "checkbox"); + toggle_checkbox.classList.add("maskEditor_sidePanelToggleCheckbox"); + toggle_checkbox.addEventListener("change", (event) => { + callback(event, event.target.checked); + }); + var toggleAccentColor = this.darkMode ? "maskEditor_toggle_bg_dark" : "maskEditor_toggle_bg_light"; + var toggle_switch = document.createElement("div"); + toggle_switch.classList.add("maskEditor_sidePanelToggleSwitch"); + toggle_switch.classList.add(toggleAccentColor); + toggle_container.appendChild(toggle_checkbox); + toggle_container.appendChild(toggle_switch); + outer_Container.appendChild(toggle_title); + outer_Container.appendChild(toggle_container); + return outer_Container; } -} -const _points = [ - /* @__PURE__ */ new Vector3(), - /* @__PURE__ */ new Vector3(), - /* @__PURE__ */ new Vector3(), - /* @__PURE__ */ new Vector3(), - /* @__PURE__ */ new Vector3(), - /* @__PURE__ */ new Vector3(), - /* @__PURE__ */ new Vector3(), - /* @__PURE__ */ new Vector3() -]; -const _vector$b = /* @__PURE__ */ new Vector3(); -const _box$4 = /* @__PURE__ */ new Box3(); -const _v0$3 = /* @__PURE__ */ new Vector3(); -const _v1$7 = /* @__PURE__ */ new Vector3(); -const _v2$4 = /* @__PURE__ */ new Vector3(); -const _f0 = /* @__PURE__ */ new Vector3(); -const _f1 = /* @__PURE__ */ new Vector3(); -const _f2 = /* @__PURE__ */ new Vector3(); -const _center = /* @__PURE__ */ new Vector3(); -const _extents = /* @__PURE__ */ new Vector3(); -const _triangleNormal = /* @__PURE__ */ new Vector3(); -const _testAxis = /* @__PURE__ */ new Vector3(); -function satForAxes(axes, v0, v1, v2, extents) { - for (let i = 0, j = axes.length - 3; i <= j; i += 3) { - _testAxis.fromArray(axes, i); - const r = extents.x * Math.abs(_testAxis.x) + extents.y * Math.abs(_testAxis.y) + extents.z * Math.abs(_testAxis.z); - const p0 = v0.dot(_testAxis); - const p1 = v1.dot(_testAxis); - const p2 = v2.dot(_testAxis); - if (Math.max(-Math.max(p0, p1, p2), Math.min(p0, p1, p2)) > r) { - return false; - } - } - return true; -} -__name(satForAxes, "satForAxes"); -const _box$3 = /* @__PURE__ */ new Box3(); -const _v1$6 = /* @__PURE__ */ new Vector3(); -const _v2$3 = /* @__PURE__ */ new Vector3(); -class Sphere { - static { - __name(this, "Sphere"); - } - constructor(center = new Vector3(), radius = -1) { - this.isSphere = true; - this.center = center; - this.radius = radius; - } - set(center, radius) { - this.center.copy(center); - this.radius = radius; - return this; + createDropdown(title, options, callback) { + const sidePanelDropdownAccent = this.darkMode ? "maskEditor_sidePanelDropdown_dark" : "maskEditor_sidePanelDropdown_light"; + var dropdown_container = this.createContainer(false); + var dropdown_title = this.createContainerTitle(title); + var dropdown = document.createElement("select"); + dropdown.classList.add(sidePanelDropdownAccent); + dropdown.classList.add("maskEditor_containerDropdown"); + options.forEach((option) => { + var option_element = document.createElement("option"); + option_element.value = option; + option_element.innerText = option; + dropdown.appendChild(option_element); + }); + dropdown.addEventListener("change", (event) => { + callback(event, event.target.value); + }); + dropdown_container.appendChild(dropdown_title); + dropdown_container.appendChild(dropdown); + return dropdown_container; } - setFromPoints(points, optionalCenter) { - const center = this.center; - if (optionalCenter !== void 0) { - center.copy(optionalCenter); - } else { - _box$3.setFromPoints(points).getCenter(center); - } - let maxRadiusSq = 0; - for (let i = 0, il = points.length; i < il; i++) { - maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(points[i])); - } - this.radius = Math.sqrt(maxRadiusSq); - return this; + createSeparator() { + var separator = document.createElement("div"); + separator.classList.add("maskEditor_sidePanelSeparator"); + return separator; } - copy(sphere) { - this.center.copy(sphere.center); - this.radius = sphere.radius; - return this; + //---------------- + async createTopBar() { + const buttonAccentColor = this.darkMode ? "maskEditor_topPanelButton_dark" : "maskEditor_topPanelButton_light"; + const iconButtonAccentColor = this.darkMode ? "maskEditor_topPanelIconButton_dark" : "maskEditor_topPanelIconButton_light"; + var top_bar = document.createElement("div"); + top_bar.id = "maskEditor_topBar"; + var top_bar_title_container = document.createElement("div"); + top_bar_title_container.id = "maskEditor_topBarTitleContainer"; + var top_bar_title = document.createElement("h1"); + top_bar_title.id = "maskEditor_topBarTitle"; + top_bar_title.innerText = "ComfyUI"; + top_bar_title_container.appendChild(top_bar_title); + var top_bar_shortcuts_container = document.createElement("div"); + top_bar_shortcuts_container.id = "maskEditor_topBarShortcutsContainer"; + var top_bar_undo_button = document.createElement("div"); + top_bar_undo_button.id = "maskEditor_topBarUndoButton"; + top_bar_undo_button.classList.add(iconButtonAccentColor); + top_bar_undo_button.innerHTML = ' '; + top_bar_undo_button.addEventListener("click", () => { + this.messageBroker.publish("undo"); + }); + var top_bar_redo_button = document.createElement("div"); + top_bar_redo_button.id = "maskEditor_topBarRedoButton"; + top_bar_redo_button.classList.add(iconButtonAccentColor); + top_bar_redo_button.innerHTML = ' '; + top_bar_redo_button.addEventListener("click", () => { + this.messageBroker.publish("redo"); + }); + var top_bar_invert_button = document.createElement("button"); + top_bar_invert_button.id = "maskEditor_topBarInvertButton"; + top_bar_invert_button.classList.add(buttonAccentColor); + top_bar_invert_button.innerText = "Invert"; + top_bar_invert_button.addEventListener("click", () => { + this.messageBroker.publish("invert"); + }); + var top_bar_clear_button = document.createElement("button"); + top_bar_clear_button.id = "maskEditor_topBarClearButton"; + top_bar_clear_button.classList.add(buttonAccentColor); + top_bar_clear_button.innerText = "Clear"; + top_bar_clear_button.addEventListener("click", () => { + this.maskCtx.clearRect( + 0, + 0, + this.maskCanvas.width, + this.maskCanvas.height + ); + this.messageBroker.publish("saveState"); + }); + var top_bar_save_button = document.createElement("button"); + top_bar_save_button.id = "maskEditor_topBarSaveButton"; + top_bar_save_button.classList.add(buttonAccentColor); + top_bar_save_button.innerText = "Save"; + this.saveButton = top_bar_save_button; + top_bar_save_button.addEventListener("click", () => { + this.maskEditor.save(); + }); + var top_bar_cancel_button = document.createElement("button"); + top_bar_cancel_button.id = "maskEditor_topBarCancelButton"; + top_bar_cancel_button.classList.add(buttonAccentColor); + top_bar_cancel_button.innerText = "Cancel"; + top_bar_cancel_button.addEventListener("click", () => { + this.maskEditor.close(); + }); + top_bar_shortcuts_container.appendChild(top_bar_undo_button); + top_bar_shortcuts_container.appendChild(top_bar_redo_button); + top_bar_shortcuts_container.appendChild(top_bar_invert_button); + top_bar_shortcuts_container.appendChild(top_bar_clear_button); + top_bar_shortcuts_container.appendChild(top_bar_save_button); + top_bar_shortcuts_container.appendChild(top_bar_cancel_button); + top_bar.appendChild(top_bar_title_container); + top_bar.appendChild(top_bar_shortcuts_container); + return top_bar; } - isEmpty() { - return this.radius < 0; + createToolPanel() { + var tool_panel = document.createElement("div"); + tool_panel.id = "maskEditor_toolPanel"; + this.toolPanel = tool_panel; + var toolPanelHoverAccent = this.darkMode ? "maskEditor_toolPanelContainerDark" : "maskEditor_toolPanelContainerLight"; + var toolElements = []; + var toolPanel_brushToolContainer = document.createElement("div"); + toolPanel_brushToolContainer.classList.add("maskEditor_toolPanelContainer"); + toolPanel_brushToolContainer.classList.add( + "maskEditor_toolPanelContainerSelected" + ); + toolPanel_brushToolContainer.classList.add(toolPanelHoverAccent); + toolPanel_brushToolContainer.innerHTML = ` + + + + + `; + toolElements.push(toolPanel_brushToolContainer); + toolPanel_brushToolContainer.addEventListener("click", () => { + this.messageBroker.publish( + "setTool", + "pen" + /* Pen */ + ); + for (let toolElement of toolElements) { + if (toolElement != toolPanel_brushToolContainer) { + toolElement.classList.remove("maskEditor_toolPanelContainerSelected"); + } else { + toolElement.classList.add("maskEditor_toolPanelContainerSelected"); + this.brushSettingsHTML.style.display = "flex"; + this.colorSelectSettingsHTML.style.display = "none"; + this.paintBucketSettingsHTML.style.display = "none"; + } + } + this.messageBroker.publish( + "setTool", + "pen" + /* Pen */ + ); + this.pointerZone.style.cursor = "none"; + }); + var toolPanel_brushToolIndicator = document.createElement("div"); + toolPanel_brushToolIndicator.classList.add("maskEditor_toolPanelIndicator"); + toolPanel_brushToolContainer.appendChild(toolPanel_brushToolIndicator); + var toolPanel_eraserToolContainer = document.createElement("div"); + toolPanel_eraserToolContainer.classList.add("maskEditor_toolPanelContainer"); + toolPanel_eraserToolContainer.classList.add(toolPanelHoverAccent); + toolPanel_eraserToolContainer.innerHTML = ` + + + + + + + + `; + toolElements.push(toolPanel_eraserToolContainer); + toolPanel_eraserToolContainer.addEventListener("click", () => { + this.messageBroker.publish( + "setTool", + "eraser" + /* Eraser */ + ); + for (let toolElement of toolElements) { + if (toolElement != toolPanel_eraserToolContainer) { + toolElement.classList.remove("maskEditor_toolPanelContainerSelected"); + } else { + toolElement.classList.add("maskEditor_toolPanelContainerSelected"); + this.brushSettingsHTML.style.display = "flex"; + this.colorSelectSettingsHTML.style.display = "none"; + this.paintBucketSettingsHTML.style.display = "none"; + } + } + this.messageBroker.publish( + "setTool", + "eraser" + /* Eraser */ + ); + this.pointerZone.style.cursor = "none"; + }); + var toolPanel_eraserToolIndicator = document.createElement("div"); + toolPanel_eraserToolIndicator.classList.add("maskEditor_toolPanelIndicator"); + toolPanel_eraserToolContainer.appendChild(toolPanel_eraserToolIndicator); + var toolPanel_paintBucketToolContainer = document.createElement("div"); + toolPanel_paintBucketToolContainer.classList.add( + "maskEditor_toolPanelContainer" + ); + toolPanel_paintBucketToolContainer.classList.add(toolPanelHoverAccent); + toolPanel_paintBucketToolContainer.innerHTML = ` + + + + + + `; + toolElements.push(toolPanel_paintBucketToolContainer); + toolPanel_paintBucketToolContainer.addEventListener("click", () => { + this.messageBroker.publish( + "setTool", + "paintBucket" + /* PaintBucket */ + ); + for (let toolElement of toolElements) { + if (toolElement != toolPanel_paintBucketToolContainer) { + toolElement.classList.remove("maskEditor_toolPanelContainerSelected"); + } else { + toolElement.classList.add("maskEditor_toolPanelContainerSelected"); + this.brushSettingsHTML.style.display = "none"; + this.colorSelectSettingsHTML.style.display = "none"; + this.paintBucketSettingsHTML.style.display = "flex"; + } + } + this.messageBroker.publish( + "setTool", + "paintBucket" + /* PaintBucket */ + ); + this.pointerZone.style.cursor = "url('/cursor/paintBucket.png') 30 25, auto"; + this.brush.style.opacity = "0"; + }); + var toolPanel_paintBucketToolIndicator = document.createElement("div"); + toolPanel_paintBucketToolIndicator.classList.add( + "maskEditor_toolPanelIndicator" + ); + toolPanel_paintBucketToolContainer.appendChild( + toolPanel_paintBucketToolIndicator + ); + var toolPanel_colorSelectToolContainer = document.createElement("div"); + toolPanel_colorSelectToolContainer.classList.add( + "maskEditor_toolPanelContainer" + ); + toolPanel_colorSelectToolContainer.classList.add(toolPanelHoverAccent); + toolPanel_colorSelectToolContainer.innerHTML = ` + + + + `; + toolElements.push(toolPanel_colorSelectToolContainer); + toolPanel_colorSelectToolContainer.addEventListener("click", () => { + this.messageBroker.publish("setTool", "colorSelect"); + for (let toolElement of toolElements) { + if (toolElement != toolPanel_colorSelectToolContainer) { + toolElement.classList.remove("maskEditor_toolPanelContainerSelected"); + } else { + toolElement.classList.add("maskEditor_toolPanelContainerSelected"); + this.brushSettingsHTML.style.display = "none"; + this.paintBucketSettingsHTML.style.display = "none"; + this.colorSelectSettingsHTML.style.display = "flex"; + } + } + this.messageBroker.publish( + "setTool", + "colorSelect" + /* ColorSelect */ + ); + this.pointerZone.style.cursor = "url('/cursor/colorSelect.png') 15 25, auto"; + this.brush.style.opacity = "0"; + }); + var toolPanel_colorSelectToolIndicator = document.createElement("div"); + toolPanel_colorSelectToolIndicator.classList.add( + "maskEditor_toolPanelIndicator" + ); + toolPanel_colorSelectToolContainer.appendChild( + toolPanel_colorSelectToolIndicator + ); + var toolPanel_zoomIndicator = document.createElement("div"); + toolPanel_zoomIndicator.classList.add("maskEditor_toolPanelZoomIndicator"); + toolPanel_zoomIndicator.classList.add(toolPanelHoverAccent); + var toolPanel_zoomText = document.createElement("span"); + toolPanel_zoomText.id = "maskEditor_toolPanelZoomText"; + toolPanel_zoomText.innerText = "100%"; + this.zoomTextHTML = toolPanel_zoomText; + var toolPanel_DimensionsText = document.createElement("span"); + toolPanel_DimensionsText.id = "maskEditor_toolPanelDimensionsText"; + toolPanel_DimensionsText.innerText = " "; + this.dimensionsTextHTML = toolPanel_DimensionsText; + toolPanel_zoomIndicator.appendChild(toolPanel_zoomText); + toolPanel_zoomIndicator.appendChild(toolPanel_DimensionsText); + toolPanel_zoomIndicator.addEventListener("click", () => { + this.messageBroker.publish("resetZoom"); + }); + tool_panel.appendChild(toolPanel_brushToolContainer); + tool_panel.appendChild(toolPanel_eraserToolContainer); + tool_panel.appendChild(toolPanel_paintBucketToolContainer); + tool_panel.appendChild(toolPanel_colorSelectToolContainer); + tool_panel.appendChild(toolPanel_zoomIndicator); + return tool_panel; } - makeEmpty() { - this.center.set(0, 0, 0); - this.radius = -1; - return this; + createPointerZone() { + const pointer_zone = document.createElement("div"); + pointer_zone.id = "maskEditor_pointerZone"; + this.pointerZone = pointer_zone; + pointer_zone.addEventListener("pointerdown", (event) => { + this.messageBroker.publish("pointerDown", event); + }); + pointer_zone.addEventListener("pointermove", (event) => { + this.messageBroker.publish("pointerMove", event); + }); + pointer_zone.addEventListener("pointerup", (event) => { + this.messageBroker.publish("pointerUp", event); + }); + pointer_zone.addEventListener("pointerleave", (event) => { + this.brush.style.opacity = "0"; + this.pointerZone.style.cursor = ""; + }); + pointer_zone.addEventListener("touchstart", (event) => { + this.messageBroker.publish("handleTouchStart", event); + }); + pointer_zone.addEventListener("touchmove", (event) => { + this.messageBroker.publish("handleTouchMove", event); + }); + pointer_zone.addEventListener("touchend", (event) => { + this.messageBroker.publish("handleTouchEnd", event); + }); + pointer_zone.addEventListener( + "wheel", + (event) => this.messageBroker.publish("wheel", event) + ); + pointer_zone.addEventListener( + "pointerenter", + async (event) => { + this.updateCursor(); + } + ); + return pointer_zone; } - containsPoint(point) { - return point.distanceToSquared(this.center) <= this.radius * this.radius; + async screenToCanvas(clientPoint) { + const zoomRatio = await this.messageBroker.pull("zoomRatio"); + const canvasRect = this.maskCanvas.getBoundingClientRect(); + const offsetX = clientPoint.x - canvasRect.left + this.toolPanel.clientWidth; + const offsetY = clientPoint.y - canvasRect.top + 44; + const x = offsetX / zoomRatio; + const y = offsetY / zoomRatio; + return { x, y }; } - distanceToPoint(point) { - return point.distanceTo(this.center) - this.radius; + setEventHandler() { + this.maskCanvas.addEventListener("contextmenu", (event) => { + event.preventDefault(); + }); + this.rootElement.addEventListener("contextmenu", (event) => { + event.preventDefault(); + }); + this.rootElement.addEventListener("dragstart", (event) => { + if (event.ctrlKey) { + event.preventDefault(); + } + }); } - intersectsSphere(sphere) { - const radiusSum = this.radius + sphere.radius; - return sphere.center.distanceToSquared(this.center) <= radiusSum * radiusSum; + async createBrush() { + var brush = document.createElement("div"); + const brushSettings = await this.messageBroker.pull("brushSettings"); + brush.id = "maskEditor_brush"; + var brush_preview_gradient = document.createElement("div"); + brush_preview_gradient.id = "maskEditor_brushPreviewGradient"; + brush.appendChild(brush_preview_gradient); + this.brush = brush; + this.brushPreviewGradient = brush_preview_gradient; + return brush; } - intersectsBox(box) { - return box.intersectsSphere(this); + async setImages(imgCanvas) { + const imgCtx = imgCanvas.getContext("2d", { willReadFrequently: true }); + const maskCtx = this.maskCtx; + const maskCanvas = this.maskCanvas; + imgCtx.clearRect(0, 0, this.imgCanvas.width, this.imgCanvas.height); + maskCtx.clearRect(0, 0, this.maskCanvas.width, this.maskCanvas.height); + const alpha_url = new URL( + ComfyApp.clipspace?.imgs?.[ComfyApp.clipspace?.selectedIndex ?? 0]?.src ?? "" + ); + alpha_url.searchParams.delete("channel"); + alpha_url.searchParams.delete("preview"); + alpha_url.searchParams.set("channel", "a"); + let mask_image = await this.loadImage(alpha_url); + if (!ComfyApp.clipspace?.imgs?.[ComfyApp.clipspace?.selectedIndex ?? 0]?.src) { + throw new Error( + "Unable to access image source - clipspace or image is null" + ); + } + const rgb_url = new URL( + ComfyApp.clipspace.imgs[ComfyApp.clipspace.selectedIndex].src + ); + this.imageURL = rgb_url; + console.log(rgb_url); + rgb_url.searchParams.delete("channel"); + rgb_url.searchParams.set("channel", "rgb"); + this.image = new Image(); + this.image = await new Promise((resolve, reject) => { + const img = new Image(); + img.onload = () => resolve(img); + img.onerror = reject; + img.src = rgb_url.toString(); + }); + maskCanvas.width = this.image.width; + maskCanvas.height = this.image.height; + this.dimensionsTextHTML.innerText = `${this.image.width}x${this.image.height}`; + await this.invalidateCanvas(this.image, mask_image); + this.messageBroker.publish("initZoomPan", [this.image, this.rootElement]); } - intersectsPlane(plane) { - return Math.abs(plane.distanceToPoint(this.center)) <= this.radius; + async invalidateCanvas(orig_image, mask_image) { + this.imgCanvas.width = orig_image.width; + this.imgCanvas.height = orig_image.height; + this.maskCanvas.width = orig_image.width; + this.maskCanvas.height = orig_image.height; + let imgCtx = this.imgCanvas.getContext("2d", { willReadFrequently: true }); + let maskCtx = this.maskCanvas.getContext("2d", { + willReadFrequently: true + }); + imgCtx.drawImage(orig_image, 0, 0, orig_image.width, orig_image.height); + await this.prepare_mask( + mask_image, + this.maskCanvas, + maskCtx, + await this.getMaskColor() + ); } - clampPoint(point, target) { - const deltaLengthSq = this.center.distanceToSquared(point); - target.copy(point); - if (deltaLengthSq > this.radius * this.radius) { - target.sub(this.center).normalize(); - target.multiplyScalar(this.radius).add(this.center); + async prepare_mask(image, maskCanvas, maskCtx, maskColor) { + maskCtx.drawImage(image, 0, 0, maskCanvas.width, maskCanvas.height); + const maskData = maskCtx.getImageData( + 0, + 0, + maskCanvas.width, + maskCanvas.height + ); + for (let i = 0; i < maskData.data.length; i += 4) { + const alpha = maskData.data[i + 3]; + maskData.data[i] = maskColor.r; + maskData.data[i + 1] = maskColor.g; + maskData.data[i + 2] = maskColor.b; + maskData.data[i + 3] = 255 - alpha; } - return target; + maskCtx.globalCompositeOperation = "source-over"; + maskCtx.putImageData(maskData, 0, 0); } - getBoundingBox(target) { - if (this.isEmpty()) { - target.makeEmpty(); - return target; + async updateMaskColor() { + const maskCanvasStyle = this.getMaskCanvasStyle(); + this.maskCanvas.style.mixBlendMode = maskCanvasStyle.mixBlendMode; + this.maskCanvas.style.opacity = maskCanvasStyle.opacity.toString(); + const maskColor = await this.getMaskColor(); + this.maskCtx.fillStyle = `rgb(${maskColor.r}, ${maskColor.g}, ${maskColor.b})`; + this.setCanvasBackground(); + const maskData = this.maskCtx.getImageData( + 0, + 0, + this.maskCanvas.width, + this.maskCanvas.height + ); + for (let i = 0; i < maskData.data.length; i += 4) { + maskData.data[i] = maskColor.r; + maskData.data[i + 1] = maskColor.g; + maskData.data[i + 2] = maskColor.b; } - target.set(this.center, this.center); - target.expandByScalar(this.radius); - return target; + this.maskCtx.putImageData(maskData, 0, 0); } - applyMatrix4(matrix) { - this.center.applyMatrix4(matrix); - this.radius = this.radius * matrix.getMaxScaleOnAxis(); - return this; + getMaskCanvasStyle() { + if (this.maskBlendMode === "negative") { + return { + mixBlendMode: "difference", + opacity: "1" + }; + } else { + return { + mixBlendMode: "initial", + opacity: this.mask_opacity + }; + } } - translate(offset) { - this.center.add(offset); - return this; + detectLightMode() { + this.darkMode = document.body.classList.contains("dark-theme"); } - expandByPoint(point) { - if (this.isEmpty()) { - this.center.copy(point); - this.radius = 0; - return this; - } - _v1$6.subVectors(point, this.center); - const lengthSq = _v1$6.lengthSq(); - if (lengthSq > this.radius * this.radius) { - const length = Math.sqrt(lengthSq); - const delta = (length - this.radius) * 0.5; - this.center.addScaledVector(_v1$6, delta / length); - this.radius += delta; + loadImage(imagePath) { + return new Promise((resolve, reject) => { + const image = new Image(); + image.onload = function() { + resolve(image); + }; + image.onerror = function(error) { + reject(error); + }; + image.src = imagePath.href; + }); + } + async updateBrushPreview() { + const cursorPoint = await this.messageBroker.pull("cursorPoint"); + const pan_offset = await this.messageBroker.pull("panOffset"); + const brushSettings = await this.messageBroker.pull("brushSettings"); + const zoom_ratio = await this.messageBroker.pull("zoomRatio"); + const centerX = cursorPoint.x + pan_offset.x; + const centerY = cursorPoint.y + pan_offset.y; + const brush = this.brush; + const hardness = brushSettings.hardness; + const extendedSize = brushSettings.size * (2 - hardness) * 2 * zoom_ratio; + this.brushSizeSlider.value = String(brushSettings.size); + this.brushHardnessSlider.value = String(hardness); + brush.style.width = extendedSize + "px"; + brush.style.height = extendedSize + "px"; + brush.style.left = centerX - extendedSize / 2 + "px"; + brush.style.top = centerY - extendedSize / 2 + "px"; + if (hardness === 1) { + this.brushPreviewGradient.style.background = "rgba(255, 0, 0, 0.5)"; + return; } - return this; + const opacityStop = hardness / 4 + 0.25; + this.brushPreviewGradient.style.background = ` + radial-gradient( + circle, + rgba(255, 0, 0, 0.5) 0%, + rgba(255, 0, 0, ${opacityStop}) ${hardness * 100}%, + rgba(255, 0, 0, 0) 100% + ) + `; } - union(sphere) { - if (sphere.isEmpty()) { - return this; + getMaskBlendMode() { + return this.maskBlendMode; + } + setSidebarImage() { + this.sidebarImage.src = this.imageURL.href; + } + async getMaskColor() { + if (this.maskBlendMode === "black") { + return { r: 0, g: 0, b: 0 }; } - if (this.isEmpty()) { - this.copy(sphere); - return this; + if (this.maskBlendMode === "white") { + return { r: 255, g: 255, b: 255 }; } - if (this.center.equals(sphere.center) === true) { - this.radius = Math.max(this.radius, sphere.radius); - } else { - _v2$3.subVectors(sphere.center, this.center).setLength(sphere.radius); - this.expandByPoint(_v1$6.copy(sphere.center).add(_v2$3)); - this.expandByPoint(_v1$6.copy(sphere.center).sub(_v2$3)); + if (this.maskBlendMode === "negative") { + return { r: 255, g: 255, b: 255 }; } - return this; + return { r: 0, g: 0, b: 0 }; } - equals(sphere) { - return sphere.center.equals(this.center) && sphere.radius === this.radius; + async getMaskFillStyle() { + const maskColor = await this.getMaskColor(); + return "rgb(" + maskColor.r + "," + maskColor.g + "," + maskColor.b + ")"; } - clone() { - return new this.constructor().copy(this); + async setCanvasBackground() { + if (this.maskBlendMode === "white") { + this.canvasBackground.style.background = "black"; + } else { + this.canvasBackground.style.background = "white"; + } } -} -const _vector$a = /* @__PURE__ */ new Vector3(); -const _segCenter = /* @__PURE__ */ new Vector3(); -const _segDir = /* @__PURE__ */ new Vector3(); -const _diff = /* @__PURE__ */ new Vector3(); -const _edge1 = /* @__PURE__ */ new Vector3(); -const _edge2 = /* @__PURE__ */ new Vector3(); -const _normal$1 = /* @__PURE__ */ new Vector3(); -class Ray { - static { - __name(this, "Ray"); + getMaskCanvas() { + return this.maskCanvas; } - constructor(origin = new Vector3(), direction = new Vector3(0, 0, -1)) { - this.origin = origin; - this.direction = direction; + getImgCanvas() { + return this.imgCanvas; } - set(origin, direction) { - this.origin.copy(origin); - this.direction.copy(direction); - return this; + getImage() { + return this.image; } - copy(ray) { - this.origin.copy(ray.origin); - this.direction.copy(ray.direction); - return this; + setBrushOpacity(opacity) { + this.brush.style.opacity = String(opacity); } - at(t2, target) { - return target.copy(this.origin).addScaledVector(this.direction, t2); + setSaveButtonEnabled(enabled) { + this.saveButton.disabled = !enabled; } - lookAt(v) { - this.direction.copy(v).sub(this.origin).normalize(); - return this; + setSaveButtonText(text) { + this.saveButton.innerText = text; } - recast(t2) { - this.origin.copy(this.at(t2, _vector$a)); - return this; + handlePaintBucketCursor(isPaintBucket) { + if (isPaintBucket) { + this.pointerZone.style.cursor = "url('/cursor/paintBucket.png') 30 25, auto"; + } else { + this.pointerZone.style.cursor = "none"; + } } - closestPointToPoint(point, target) { - target.subVectors(point, this.origin); - const directionDistance = target.dot(this.direction); - if (directionDistance < 0) { - return target.copy(this.origin); + handlePanCursor(isPanning) { + if (isPanning) { + this.pointerZone.style.cursor = "grabbing"; + } else { + this.pointerZone.style.cursor = "none"; } - return target.copy(this.origin).addScaledVector(this.direction, directionDistance); } - distanceToPoint(point) { - return Math.sqrt(this.distanceSqToPoint(point)); + setBrushVisibility(visible) { + this.brush.style.opacity = visible ? "1" : "0"; } - distanceSqToPoint(point) { - const directionDistance = _vector$a.subVectors(point, this.origin).dot(this.direction); - if (directionDistance < 0) { - return this.origin.distanceToSquared(point); - } - _vector$a.copy(this.origin).addScaledVector(this.direction, directionDistance); - return _vector$a.distanceToSquared(point); + setBrushPreviewGradientVisibility(visible) { + this.brushPreviewGradient.style.display = visible ? "block" : "none"; } - distanceSqToSegment(v0, v1, optionalPointOnRay, optionalPointOnSegment) { - _segCenter.copy(v0).add(v1).multiplyScalar(0.5); - _segDir.copy(v1).sub(v0).normalize(); - _diff.copy(this.origin).sub(_segCenter); - const segExtent = v0.distanceTo(v1) * 0.5; - const a01 = -this.direction.dot(_segDir); - const b0 = _diff.dot(this.direction); - const b1 = -_diff.dot(_segDir); - const c = _diff.lengthSq(); - const det = Math.abs(1 - a01 * a01); - let s0, s1, sqrDist, extDet; - if (det > 0) { - s0 = a01 * b1 - b0; - s1 = a01 * b0 - b1; - extDet = segExtent * det; - if (s0 >= 0) { - if (s1 >= -extDet) { - if (s1 <= extDet) { - const invDet = 1 / det; - s0 *= invDet; - s1 *= invDet; - sqrDist = s0 * (s0 + a01 * s1 + 2 * b0) + s1 * (a01 * s0 + s1 + 2 * b1) + c; - } else { - s1 = segExtent; - s0 = Math.max(0, -(a01 * s1 + b0)); - sqrDist = -s0 * s0 + s1 * (s1 + 2 * b1) + c; - } - } else { - s1 = -segExtent; - s0 = Math.max(0, -(a01 * s1 + b0)); - sqrDist = -s0 * s0 + s1 * (s1 + 2 * b1) + c; - } - } else { - if (s1 <= -extDet) { - s0 = Math.max(0, -(-a01 * segExtent + b0)); - s1 = s0 > 0 ? -segExtent : Math.min(Math.max(-segExtent, -b1), segExtent); - sqrDist = -s0 * s0 + s1 * (s1 + 2 * b1) + c; - } else if (s1 <= extDet) { - s0 = 0; - s1 = Math.min(Math.max(-segExtent, -b1), segExtent); - sqrDist = s1 * (s1 + 2 * b1) + c; - } else { - s0 = Math.max(0, -(a01 * segExtent + b0)); - s1 = s0 > 0 ? segExtent : Math.min(Math.max(-segExtent, -b1), segExtent); - sqrDist = -s0 * s0 + s1 * (s1 + 2 * b1) + c; - } - } + async updateCursor() { + const currentTool = await this.messageBroker.pull("currentTool"); + if (currentTool === "paintBucket") { + this.pointerZone.style.cursor = "url('/cursor/paintBucket.png') 30 25, auto"; + this.setBrushOpacity(0); + } else if (currentTool === "colorSelect") { + this.pointerZone.style.cursor = "url('/cursor/colorSelect.png') 15 25, auto"; + this.setBrushOpacity(0); } else { - s1 = a01 > 0 ? -segExtent : segExtent; - s0 = Math.max(0, -(a01 * s1 + b0)); - sqrDist = -s0 * s0 + s1 * (s1 + 2 * b1) + c; - } - if (optionalPointOnRay) { - optionalPointOnRay.copy(this.origin).addScaledVector(this.direction, s0); - } - if (optionalPointOnSegment) { - optionalPointOnSegment.copy(_segCenter).addScaledVector(_segDir, s1); + this.pointerZone.style.cursor = "none"; + this.setBrushOpacity(1); } - return sqrDist; + this.updateBrushPreview(); + this.setBrushPreviewGradientVisibility(false); } - intersectSphere(sphere, target) { - _vector$a.subVectors(sphere.center, this.origin); - const tca = _vector$a.dot(this.direction); - const d2 = _vector$a.dot(_vector$a) - tca * tca; - const radius2 = sphere.radius * sphere.radius; - if (d2 > radius2) return null; - const thc = Math.sqrt(radius2 - d2); - const t0 = tca - thc; - const t1 = tca + thc; - if (t1 < 0) return null; - if (t0 < 0) return this.at(t1, target); - return this.at(t0, target); + setZoomText(zoomText) { + this.zoomTextHTML.innerText = zoomText; } - intersectsSphere(sphere) { - return this.distanceSqToPoint(sphere.center) <= sphere.radius * sphere.radius; + setDimensionsText(dimensionsText) { + this.dimensionsTextHTML.innerText = dimensionsText; } - distanceToPlane(plane) { - const denominator = plane.normal.dot(this.direction); - if (denominator === 0) { - if (plane.distanceToPoint(this.origin) === 0) { - return 0; - } - return null; - } - const t2 = -(this.origin.dot(plane.normal) + plane.constant) / denominator; - return t2 >= 0 ? t2 : null; +} +class ToolManager { + static { + __name(this, "ToolManager"); } - intersectPlane(plane, target) { - const t2 = this.distanceToPlane(plane); - if (t2 === null) { - return null; - } - return this.at(t2, target); + maskEditor; + messageBroker; + mouseDownPoint = null; + currentTool = "pen"; + isAdjustingBrush = false; + // is user adjusting brush size or hardness with alt + right mouse button + constructor(maskEditor) { + this.maskEditor = maskEditor; + this.messageBroker = maskEditor.getMessageBroker(); + this.addListeners(); + this.addPullTopics(); } - intersectsPlane(plane) { - const distToPoint = plane.distanceToPoint(this.origin); - if (distToPoint === 0) { - return true; - } - const denominator = plane.normal.dot(this.direction); - if (denominator * distToPoint < 0) { - return true; - } - return false; + addListeners() { + this.messageBroker.subscribe("setTool", async (tool) => { + this.setTool(tool); + }); + this.messageBroker.subscribe("pointerDown", async (event) => { + this.handlePointerDown(event); + }); + this.messageBroker.subscribe("pointerMove", async (event) => { + this.handlePointerMove(event); + }); + this.messageBroker.subscribe("pointerUp", async (event) => { + this.handlePointerUp(event); + }); + this.messageBroker.subscribe("wheel", async (event) => { + this.handleWheelEvent(event); + }); } - intersectBox(box, target) { - let tmin, tmax, tymin, tymax, tzmin, tzmax; - const invdirx = 1 / this.direction.x, invdiry = 1 / this.direction.y, invdirz = 1 / this.direction.z; - const origin = this.origin; - if (invdirx >= 0) { - tmin = (box.min.x - origin.x) * invdirx; - tmax = (box.max.x - origin.x) * invdirx; - } else { - tmin = (box.max.x - origin.x) * invdirx; - tmax = (box.min.x - origin.x) * invdirx; - } - if (invdiry >= 0) { - tymin = (box.min.y - origin.y) * invdiry; - tymax = (box.max.y - origin.y) * invdiry; - } else { - tymin = (box.max.y - origin.y) * invdiry; - tymax = (box.min.y - origin.y) * invdiry; - } - if (tmin > tymax || tymin > tmax) return null; - if (tymin > tmin || isNaN(tmin)) tmin = tymin; - if (tymax < tmax || isNaN(tmax)) tmax = tymax; - if (invdirz >= 0) { - tzmin = (box.min.z - origin.z) * invdirz; - tzmax = (box.max.z - origin.z) * invdirz; - } else { - tzmin = (box.max.z - origin.z) * invdirz; - tzmax = (box.min.z - origin.z) * invdirz; + async addPullTopics() { + this.messageBroker.createPullTopic( + "currentTool", + async () => this.getCurrentTool() + ); + } + //tools + setTool(tool) { + this.currentTool = tool; + if (tool != "colorSelect") { + this.messageBroker.publish("clearLastPoint"); } - if (tmin > tzmax || tzmin > tmax) return null; - if (tzmin > tmin || tmin !== tmin) tmin = tzmin; - if (tzmax < tmax || tmax !== tmax) tmax = tzmax; - if (tmax < 0) return null; - return this.at(tmin >= 0 ? tmin : tmax, target); } - intersectsBox(box) { - return this.intersectBox(box, _vector$a) !== null; + getCurrentTool() { + return this.currentTool; } - intersectTriangle(a, b, c, backfaceCulling, target) { - _edge1.subVectors(b, a); - _edge2.subVectors(c, a); - _normal$1.crossVectors(_edge1, _edge2); - let DdN = this.direction.dot(_normal$1); - let sign2; - if (DdN > 0) { - if (backfaceCulling) return null; - sign2 = 1; - } else if (DdN < 0) { - sign2 = -1; - DdN = -DdN; - } else { - return null; + async handlePointerDown(event) { + event.preventDefault(); + if (event.pointerType == "touch") return; + var isSpacePressed = await this.messageBroker.pull("isKeyPressed", " "); + if (event.buttons === 4 || event.buttons === 1 && isSpacePressed) { + this.messageBroker.publish("panStart", event); + this.messageBroker.publish("setBrushVisibility", false); + return; } - _diff.subVectors(this.origin, a); - const DdQxE2 = sign2 * this.direction.dot(_edge2.crossVectors(_diff, _edge2)); - if (DdQxE2 < 0) { - return null; + if (this.currentTool === "paintBucket" && event.button === 0) { + const offset = { x: event.offsetX, y: event.offsetY }; + const coords_canvas = await this.messageBroker.pull( + "screenToCanvas", + offset + ); + this.messageBroker.publish("paintBucketFill", coords_canvas); + this.messageBroker.publish("saveState"); + return; } - const DdE1xQ = sign2 * this.direction.dot(_edge1.cross(_diff)); - if (DdE1xQ < 0) { - return null; + if (this.currentTool === "colorSelect" && event.button === 0) { + const offset = { x: event.offsetX, y: event.offsetY }; + const coords_canvas = await this.messageBroker.pull( + "screenToCanvas", + offset + ); + this.messageBroker.publish("colorSelectFill", coords_canvas); + return; } - if (DdQxE2 + DdE1xQ > DdN) { - return null; + if (event.altKey && event.button === 2) { + this.isAdjustingBrush = true; + this.messageBroker.publish("brushAdjustmentStart", event); + return; } - const QdN = -sign2 * _diff.dot(_normal$1); - if (QdN < 0) { - return null; + var isDrawingTool = [ + "pen", + "eraser" + /* Eraser */ + ].includes(this.currentTool); + if ([0, 2].includes(event.button) && isDrawingTool) { + this.messageBroker.publish("drawStart", event); + return; } - return this.at(QdN / DdN, target); } - applyMatrix4(matrix4) { - this.origin.applyMatrix4(matrix4); - this.direction.transformDirection(matrix4); - return this; + async handlePointerMove(event) { + event.preventDefault(); + if (event.pointerType == "touch") return; + const newCursorPoint = { x: event.clientX, y: event.clientY }; + this.messageBroker.publish("cursorPoint", newCursorPoint); + var isSpacePressed = await this.messageBroker.pull("isKeyPressed", " "); + this.messageBroker.publish("updateBrushPreview"); + if (event.buttons === 4 || event.buttons === 1 && isSpacePressed) { + this.messageBroker.publish("panMove", event); + return; + } + var isDrawingTool = [ + "pen", + "eraser" + /* Eraser */ + ].includes(this.currentTool); + if (!isDrawingTool) return; + if (this.isAdjustingBrush && (this.currentTool === "pen" || this.currentTool === "eraser") && event.altKey && event.buttons === 2) { + this.messageBroker.publish("brushAdjustment", event); + return; + } + if (event.buttons == 1 || event.buttons == 2) { + this.messageBroker.publish("draw", event); + return; + } } - equals(ray) { - return ray.origin.equals(this.origin) && ray.direction.equals(this.direction); + handlePointerUp(event) { + this.messageBroker.publish("panCursor", false); + if (event.pointerType === "touch") return; + this.messageBroker.publish("updateCursor"); + this.isAdjustingBrush = false; + this.messageBroker.publish("drawEnd", event); + this.mouseDownPoint = null; } - clone() { - return new this.constructor().copy(this); + handleWheelEvent(event) { + this.messageBroker.publish("zoom", event); + const newCursorPoint = { x: event.clientX, y: event.clientY }; + this.messageBroker.publish("cursorPoint", newCursorPoint); } } -class Matrix4 { +class PanAndZoomManager { static { - __name(this, "Matrix4"); + __name(this, "PanAndZoomManager"); } - constructor(n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44) { - Matrix4.prototype.isMatrix4 = true; - this.elements = [ - 1, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 1 - ]; - if (n11 !== void 0) { - this.set(n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44); - } - } - set(n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44) { - const te2 = this.elements; - te2[0] = n11; - te2[4] = n12; - te2[8] = n13; - te2[12] = n14; - te2[1] = n21; - te2[5] = n22; - te2[9] = n23; - te2[13] = n24; - te2[2] = n31; - te2[6] = n32; - te2[10] = n33; - te2[14] = n34; - te2[3] = n41; - te2[7] = n42; - te2[11] = n43; - te2[15] = n44; - return this; + maskEditor; + messageBroker; + DOUBLE_TAP_DELAY = 300; + lastTwoFingerTap = 0; + isTouchZooming = false; + lastTouchZoomDistance = 0; + lastTouchMidPoint = { x: 0, y: 0 }; + lastTouchPoint = { x: 0, y: 0 }; + zoom_ratio = 1; + interpolatedZoomRatio = 1; + pan_offset = { x: 0, y: 0 }; + mouseDownPoint = null; + initialPan = { x: 0, y: 0 }; + canvasContainer = null; + maskCanvas = null; + rootElement = null; + image = null; + imageRootWidth = 0; + imageRootHeight = 0; + cursorPoint = { x: 0, y: 0 }; + constructor(maskEditor) { + this.maskEditor = maskEditor; + this.messageBroker = maskEditor.getMessageBroker(); + this.addListeners(); + this.addPullTopics(); } - identity() { - this.set( - 1, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 1 + addListeners() { + this.messageBroker.subscribe( + "initZoomPan", + async (args) => { + await this.initializeCanvasPanZoom(args[0], args[1]); + } ); - return this; - } - clone() { - return new Matrix4().fromArray(this.elements); - } - copy(m) { - const te2 = this.elements; - const me = m.elements; - te2[0] = me[0]; - te2[1] = me[1]; - te2[2] = me[2]; - te2[3] = me[3]; - te2[4] = me[4]; - te2[5] = me[5]; - te2[6] = me[6]; - te2[7] = me[7]; - te2[8] = me[8]; - te2[9] = me[9]; - te2[10] = me[10]; - te2[11] = me[11]; - te2[12] = me[12]; - te2[13] = me[13]; - te2[14] = me[14]; - te2[15] = me[15]; - return this; - } - copyPosition(m) { - const te2 = this.elements, me = m.elements; - te2[12] = me[12]; - te2[13] = me[13]; - te2[14] = me[14]; - return this; - } - setFromMatrix3(m) { - const me = m.elements; - this.set( - me[0], - me[3], - me[6], - 0, - me[1], - me[4], - me[7], - 0, - me[2], - me[5], - me[8], - 0, - 0, - 0, - 0, - 1 + this.messageBroker.subscribe("panStart", async (event) => { + this.handlePanStart(event); + }); + this.messageBroker.subscribe("panMove", async (event) => { + this.handlePanMove(event); + }); + this.messageBroker.subscribe("zoom", async (event) => { + this.zoom(event); + }); + this.messageBroker.subscribe("cursorPoint", async (point) => { + this.updateCursorPosition(point); + }); + this.messageBroker.subscribe( + "handleTouchStart", + async (event) => { + this.handleTouchStart(event); + } ); - return this; - } - extractBasis(xAxis, yAxis, zAxis) { - xAxis.setFromMatrixColumn(this, 0); - yAxis.setFromMatrixColumn(this, 1); - zAxis.setFromMatrixColumn(this, 2); - return this; - } - makeBasis(xAxis, yAxis, zAxis) { - this.set( - xAxis.x, - yAxis.x, - zAxis.x, - 0, - xAxis.y, - yAxis.y, - zAxis.y, - 0, - xAxis.z, - yAxis.z, - zAxis.z, - 0, - 0, - 0, - 0, - 1 + this.messageBroker.subscribe( + "handleTouchMove", + async (event) => { + this.handleTouchMove(event); + } ); - return this; + this.messageBroker.subscribe( + "handleTouchEnd", + async (event) => { + this.handleTouchEnd(event); + } + ); + this.messageBroker.subscribe("resetZoom", async () => { + if (this.interpolatedZoomRatio === 1) return; + await this.smoothResetView(); + }); } - extractRotation(m) { - const te2 = this.elements; - const me = m.elements; - const scaleX = 1 / _v1$5.setFromMatrixColumn(m, 0).length(); - const scaleY = 1 / _v1$5.setFromMatrixColumn(m, 1).length(); - const scaleZ = 1 / _v1$5.setFromMatrixColumn(m, 2).length(); - te2[0] = me[0] * scaleX; - te2[1] = me[1] * scaleX; - te2[2] = me[2] * scaleX; - te2[3] = 0; - te2[4] = me[4] * scaleY; - te2[5] = me[5] * scaleY; - te2[6] = me[6] * scaleY; - te2[7] = 0; - te2[8] = me[8] * scaleZ; - te2[9] = me[9] * scaleZ; - te2[10] = me[10] * scaleZ; - te2[11] = 0; - te2[12] = 0; - te2[13] = 0; - te2[14] = 0; - te2[15] = 1; - return this; + addPullTopics() { + this.messageBroker.createPullTopic( + "cursorPoint", + async () => this.cursorPoint + ); + this.messageBroker.createPullTopic("zoomRatio", async () => this.zoom_ratio); + this.messageBroker.createPullTopic("panOffset", async () => this.pan_offset); } - makeRotationFromEuler(euler) { - const te2 = this.elements; - const x = euler.x, y = euler.y, z = euler.z; - const a = Math.cos(x), b = Math.sin(x); - const c = Math.cos(y), d = Math.sin(y); - const e = Math.cos(z), f = Math.sin(z); - if (euler.order === "XYZ") { - const ae = a * e, af = a * f, be = b * e, bf = b * f; - te2[0] = c * e; - te2[4] = -c * f; - te2[8] = d; - te2[1] = af + be * d; - te2[5] = ae - bf * d; - te2[9] = -b * c; - te2[2] = bf - ae * d; - te2[6] = be + af * d; - te2[10] = a * c; - } else if (euler.order === "YXZ") { - const ce = c * e, cf = c * f, de = d * e, df = d * f; - te2[0] = ce + df * b; - te2[4] = de * b - cf; - te2[8] = a * d; - te2[1] = a * f; - te2[5] = a * e; - te2[9] = -b; - te2[2] = cf * b - de; - te2[6] = df + ce * b; - te2[10] = a * c; - } else if (euler.order === "ZXY") { - const ce = c * e, cf = c * f, de = d * e, df = d * f; - te2[0] = ce - df * b; - te2[4] = -a * f; - te2[8] = de + cf * b; - te2[1] = cf + de * b; - te2[5] = a * e; - te2[9] = df - ce * b; - te2[2] = -a * d; - te2[6] = b; - te2[10] = a * c; - } else if (euler.order === "ZYX") { - const ae = a * e, af = a * f, be = b * e, bf = b * f; - te2[0] = c * e; - te2[4] = be * d - af; - te2[8] = ae * d + bf; - te2[1] = c * f; - te2[5] = bf * d + ae; - te2[9] = af * d - be; - te2[2] = -d; - te2[6] = b * c; - te2[10] = a * c; - } else if (euler.order === "YZX") { - const ac = a * c, ad = a * d, bc = b * c, bd = b * d; - te2[0] = c * e; - te2[4] = bd - ac * f; - te2[8] = bc * f + ad; - te2[1] = f; - te2[5] = a * e; - te2[9] = -b * e; - te2[2] = -d * e; - te2[6] = ad * f + bc; - te2[10] = ac - bd * f; - } else if (euler.order === "XZY") { - const ac = a * c, ad = a * d, bc = b * c, bd = b * d; - te2[0] = c * e; - te2[4] = -f; - te2[8] = d * e; - te2[1] = ac * f + bd; - te2[5] = a * e; - te2[9] = ad * f - bc; - te2[2] = bc * f - ad; - te2[6] = b * e; - te2[10] = bd * f + ac; + handleTouchStart(event) { + event.preventDefault(); + if (event.touches[0].touchType === "stylus") return; + this.messageBroker.publish("setBrushVisibility", false); + if (event.touches.length === 2) { + const currentTime = (/* @__PURE__ */ new Date()).getTime(); + const tapTimeDiff = currentTime - this.lastTwoFingerTap; + if (tapTimeDiff < this.DOUBLE_TAP_DELAY) { + this.handleDoubleTap(); + this.lastTwoFingerTap = 0; + } else { + this.lastTwoFingerTap = currentTime; + this.isTouchZooming = true; + this.lastTouchZoomDistance = this.getTouchDistance(event.touches); + const midpoint = this.getTouchMidpoint(event.touches); + this.lastTouchMidPoint = midpoint; + } + } else if (event.touches.length === 1) { + this.lastTouchPoint = { + x: event.touches[0].clientX, + y: event.touches[0].clientY + }; } - te2[3] = 0; - te2[7] = 0; - te2[11] = 0; - te2[12] = 0; - te2[13] = 0; - te2[14] = 0; - te2[15] = 1; - return this; } - makeRotationFromQuaternion(q) { - return this.compose(_zero, q, _one); + async handleTouchMove(event) { + event.preventDefault(); + if (event.touches[0].touchType === "stylus") return; + this.lastTwoFingerTap = 0; + if (this.isTouchZooming && event.touches.length === 2) { + const newDistance = this.getTouchDistance(event.touches); + const zoomFactor = newDistance / this.lastTouchZoomDistance; + const oldZoom = this.zoom_ratio; + this.zoom_ratio = Math.max( + 0.2, + Math.min(10, this.zoom_ratio * zoomFactor) + ); + const newZoom = this.zoom_ratio; + const midpoint = this.getTouchMidpoint(event.touches); + if (this.lastTouchMidPoint) { + const deltaX = midpoint.x - this.lastTouchMidPoint.x; + const deltaY = midpoint.y - this.lastTouchMidPoint.y; + this.pan_offset.x += deltaX; + this.pan_offset.y += deltaY; + } + if (this.maskCanvas === null) { + this.maskCanvas = await this.messageBroker.pull("maskCanvas"); + } + const rect = this.maskCanvas.getBoundingClientRect(); + const touchX = midpoint.x - rect.left; + const touchY = midpoint.y - rect.top; + const scaleFactor = newZoom / oldZoom; + this.pan_offset.x += touchX - touchX * scaleFactor; + this.pan_offset.y += touchY - touchY * scaleFactor; + this.invalidatePanZoom(); + this.lastTouchZoomDistance = newDistance; + this.lastTouchMidPoint = midpoint; + } else if (event.touches.length === 1) { + this.handleSingleTouchPan(event.touches[0]); + } } - lookAt(eye, target, up) { - const te2 = this.elements; - _z.subVectors(eye, target); - if (_z.lengthSq() === 0) { - _z.z = 1; + handleTouchEnd(event) { + event.preventDefault(); + if (event.touches.length === 0 && event.touches[0].touchType === "stylus") { + return; } - _z.normalize(); - _x.crossVectors(up, _z); - if (_x.lengthSq() === 0) { - if (Math.abs(up.z) === 1) { - _z.x += 1e-4; - } else { - _z.z += 1e-4; - } - _z.normalize(); - _x.crossVectors(up, _z); + this.isTouchZooming = false; + this.lastTouchMidPoint = { x: 0, y: 0 }; + if (event.touches.length === 0) { + this.lastTouchPoint = { x: 0, y: 0 }; + } else if (event.touches.length === 1) { + this.lastTouchPoint = { + x: event.touches[0].clientX, + y: event.touches[0].clientY + }; } - _x.normalize(); - _y.crossVectors(_z, _x); - te2[0] = _x.x; - te2[4] = _y.x; - te2[8] = _z.x; - te2[1] = _x.y; - te2[5] = _y.y; - te2[9] = _z.y; - te2[2] = _x.z; - te2[6] = _y.z; - te2[10] = _z.z; - return this; } - multiply(m) { - return this.multiplyMatrices(this, m); + getTouchDistance(touches) { + const dx = touches[0].clientX - touches[1].clientX; + const dy = touches[0].clientY - touches[1].clientY; + return Math.sqrt(dx * dx + dy * dy); } - premultiply(m) { - return this.multiplyMatrices(m, this); + getTouchMidpoint(touches) { + return { + x: (touches[0].clientX + touches[1].clientX) / 2, + y: (touches[0].clientY + touches[1].clientY) / 2 + }; } - multiplyMatrices(a, b) { - const ae = a.elements; - const be = b.elements; - const te2 = this.elements; - const a11 = ae[0], a12 = ae[4], a13 = ae[8], a14 = ae[12]; - const a21 = ae[1], a22 = ae[5], a23 = ae[9], a24 = ae[13]; - const a31 = ae[2], a32 = ae[6], a33 = ae[10], a34 = ae[14]; - const a41 = ae[3], a42 = ae[7], a43 = ae[11], a44 = ae[15]; - const b11 = be[0], b12 = be[4], b13 = be[8], b14 = be[12]; - const b21 = be[1], b22 = be[5], b23 = be[9], b24 = be[13]; - const b31 = be[2], b32 = be[6], b33 = be[10], b34 = be[14]; - const b41 = be[3], b42 = be[7], b43 = be[11], b44 = be[15]; - te2[0] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41; - te2[4] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42; - te2[8] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43; - te2[12] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44; - te2[1] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41; - te2[5] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42; - te2[9] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43; - te2[13] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44; - te2[2] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41; - te2[6] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42; - te2[10] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43; - te2[14] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44; - te2[3] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41; - te2[7] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42; - te2[11] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43; - te2[15] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44; - return this; + async handleSingleTouchPan(touch) { + if (this.lastTouchPoint === null) { + this.lastTouchPoint = { x: touch.clientX, y: touch.clientY }; + return; + } + const deltaX = touch.clientX - this.lastTouchPoint.x; + const deltaY = touch.clientY - this.lastTouchPoint.y; + this.pan_offset.x += deltaX; + this.pan_offset.y += deltaY; + await this.invalidatePanZoom(); + this.lastTouchPoint = { x: touch.clientX, y: touch.clientY }; } - multiplyScalar(s) { - const te2 = this.elements; - te2[0] *= s; - te2[4] *= s; - te2[8] *= s; - te2[12] *= s; - te2[1] *= s; - te2[5] *= s; - te2[9] *= s; - te2[13] *= s; - te2[2] *= s; - te2[6] *= s; - te2[10] *= s; - te2[14] *= s; - te2[3] *= s; - te2[7] *= s; - te2[11] *= s; - te2[15] *= s; - return this; + updateCursorPosition(clientPoint) { + var cursorX = clientPoint.x - this.pan_offset.x; + var cursorY = clientPoint.y - this.pan_offset.y; + this.cursorPoint = { x: cursorX, y: cursorY }; } - determinant() { - const te2 = this.elements; - const n11 = te2[0], n12 = te2[4], n13 = te2[8], n14 = te2[12]; - const n21 = te2[1], n22 = te2[5], n23 = te2[9], n24 = te2[13]; - const n31 = te2[2], n32 = te2[6], n33 = te2[10], n34 = te2[14]; - const n41 = te2[3], n42 = te2[7], n43 = te2[11], n44 = te2[15]; - return n41 * (+n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34) + n42 * (+n11 * n23 * n34 - n11 * n24 * n33 + n14 * n21 * n33 - n13 * n21 * n34 + n13 * n24 * n31 - n14 * n23 * n31) + n43 * (+n11 * n24 * n32 - n11 * n22 * n34 - n14 * n21 * n32 + n12 * n21 * n34 + n14 * n22 * n31 - n12 * n24 * n31) + n44 * (-n13 * n22 * n31 - n11 * n23 * n32 + n11 * n22 * n33 + n13 * n21 * n32 - n12 * n21 * n33 + n12 * n23 * n31); + //prob redundant + handleDoubleTap() { + this.messageBroker.publish("undo"); } - transpose() { - const te2 = this.elements; - let tmp2; - tmp2 = te2[1]; - te2[1] = te2[4]; - te2[4] = tmp2; - tmp2 = te2[2]; - te2[2] = te2[8]; - te2[8] = tmp2; - tmp2 = te2[6]; - te2[6] = te2[9]; - te2[9] = tmp2; - tmp2 = te2[3]; - te2[3] = te2[12]; - te2[12] = tmp2; - tmp2 = te2[7]; - te2[7] = te2[13]; - te2[13] = tmp2; - tmp2 = te2[11]; - te2[11] = te2[14]; - te2[14] = tmp2; - return this; + async zoom(event) { + const cursorPoint = { x: event.clientX, y: event.clientY }; + const oldZoom = this.zoom_ratio; + const zoomFactor = event.deltaY < 0 ? 1.1 : 0.9; + this.zoom_ratio = Math.max( + 0.2, + Math.min(10, this.zoom_ratio * zoomFactor) + ); + const newZoom = this.zoom_ratio; + const maskCanvas = await this.messageBroker.pull("maskCanvas"); + const rect = maskCanvas.getBoundingClientRect(); + const mouseX = cursorPoint.x - rect.left; + const mouseY = cursorPoint.y - rect.top; + console.log(oldZoom, newZoom); + const scaleFactor = newZoom / oldZoom; + this.pan_offset.x += mouseX - mouseX * scaleFactor; + this.pan_offset.y += mouseY - mouseY * scaleFactor; + await this.invalidatePanZoom(); + const newImageWidth = maskCanvas.clientWidth; + const zoomRatio = newImageWidth / this.imageRootWidth; + this.interpolatedZoomRatio = zoomRatio; + this.messageBroker.publish("setZoomText", `${Math.round(zoomRatio * 100)}%`); + this.updateCursorPosition(cursorPoint); + requestAnimationFrame(() => { + this.messageBroker.publish("updateBrushPreview"); + }); } - setPosition(x, y, z) { - const te2 = this.elements; - if (x.isVector3) { - te2[12] = x.x; - te2[13] = x.y; - te2[14] = x.z; + async smoothResetView(duration = 500) { + const startZoom = this.zoom_ratio; + const startPan = { ...this.pan_offset }; + const sidePanelWidth = 220; + const toolPanelWidth = 64; + const topBarHeight = 44; + const availableWidth = this.rootElement.clientWidth - sidePanelWidth - toolPanelWidth; + const availableHeight = this.rootElement.clientHeight - topBarHeight; + const zoomRatioWidth = availableWidth / this.image.width; + const zoomRatioHeight = availableHeight / this.image.height; + const targetZoom = Math.min(zoomRatioWidth, zoomRatioHeight); + const aspectRatio = this.image.width / this.image.height; + let finalWidth = 0; + let finalHeight = 0; + const targetPan = { x: toolPanelWidth, y: topBarHeight }; + if (zoomRatioHeight > zoomRatioWidth) { + finalWidth = availableWidth; + finalHeight = finalWidth / aspectRatio; + targetPan.y = (availableHeight - finalHeight) / 2 + topBarHeight; } else { - te2[12] = x; - te2[13] = y; - te2[14] = z; + finalHeight = availableHeight; + finalWidth = finalHeight * aspectRatio; + targetPan.x = (availableWidth - finalWidth) / 2 + toolPanelWidth; } - return this; - } - invert() { - const te2 = this.elements, n11 = te2[0], n21 = te2[1], n31 = te2[2], n41 = te2[3], n12 = te2[4], n22 = te2[5], n32 = te2[6], n42 = te2[7], n13 = te2[8], n23 = te2[9], n33 = te2[10], n43 = te2[11], n14 = te2[12], n24 = te2[13], n34 = te2[14], n44 = te2[15], t11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44, t12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44, t13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44, t14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34; - const det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14; - if (det === 0) return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); - const detInv = 1 / det; - te2[0] = t11 * detInv; - te2[1] = (n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44) * detInv; - te2[2] = (n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44) * detInv; - te2[3] = (n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43) * detInv; - te2[4] = t12 * detInv; - te2[5] = (n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44) * detInv; - te2[6] = (n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44) * detInv; - te2[7] = (n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43) * detInv; - te2[8] = t13 * detInv; - te2[9] = (n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44) * detInv; - te2[10] = (n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44) * detInv; - te2[11] = (n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43) * detInv; - te2[12] = t14 * detInv; - te2[13] = (n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34) * detInv; - te2[14] = (n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34) * detInv; - te2[15] = (n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33) * detInv; - return this; - } - scale(v) { - const te2 = this.elements; - const x = v.x, y = v.y, z = v.z; - te2[0] *= x; - te2[4] *= y; - te2[8] *= z; - te2[1] *= x; - te2[5] *= y; - te2[9] *= z; - te2[2] *= x; - te2[6] *= y; - te2[10] *= z; - te2[3] *= x; - te2[7] *= y; - te2[11] *= z; - return this; - } - getMaxScaleOnAxis() { - const te2 = this.elements; - const scaleXSq = te2[0] * te2[0] + te2[1] * te2[1] + te2[2] * te2[2]; - const scaleYSq = te2[4] * te2[4] + te2[5] * te2[5] + te2[6] * te2[6]; - const scaleZSq = te2[8] * te2[8] + te2[9] * te2[9] + te2[10] * te2[10]; - return Math.sqrt(Math.max(scaleXSq, scaleYSq, scaleZSq)); - } - makeTranslation(x, y, z) { - if (x.isVector3) { - this.set( - 1, - 0, - 0, - x.x, - 0, - 1, - 0, - x.y, - 0, - 0, - 1, - x.z, - 0, - 0, - 0, - 1 + const startTime = performance.now(); + const animate = /* @__PURE__ */ __name((currentTime) => { + const elapsed = currentTime - startTime; + const progress = Math.min(elapsed / duration, 1); + const eased = 1 - Math.pow(1 - progress, 3); + const currentZoom = startZoom + (targetZoom - startZoom) * eased; + this.zoom_ratio = currentZoom; + this.pan_offset.x = startPan.x + (targetPan.x - startPan.x) * eased; + this.pan_offset.y = startPan.y + (targetPan.y - startPan.y) * eased; + this.invalidatePanZoom(); + const interpolatedZoomRatio = startZoom + (1 - startZoom) * eased; + this.messageBroker.publish( + "setZoomText", + `${Math.round(interpolatedZoomRatio * 100)}%` ); + if (progress < 1) { + requestAnimationFrame(animate); + } + }, "animate"); + requestAnimationFrame(animate); + this.interpolatedZoomRatio = 1; + } + async initializeCanvasPanZoom(image, rootElement) { + let sidePanelWidth = 220; + const toolPanelWidth = 64; + let topBarHeight = 44; + this.rootElement = rootElement; + let availableWidth = rootElement.clientWidth - sidePanelWidth - toolPanelWidth; + let availableHeight = rootElement.clientHeight - topBarHeight; + let zoomRatioWidth = availableWidth / image.width; + let zoomRatioHeight = availableHeight / image.height; + let aspectRatio = image.width / image.height; + let finalWidth = 0; + let finalHeight = 0; + let pan_offset = { x: toolPanelWidth, y: topBarHeight }; + if (zoomRatioHeight > zoomRatioWidth) { + finalWidth = availableWidth; + finalHeight = finalWidth / aspectRatio; + pan_offset.y = (availableHeight - finalHeight) / 2 + topBarHeight; } else { - this.set( - 1, - 0, - 0, - x, - 0, - 1, - 0, - y, - 0, - 0, - 1, - z, - 0, - 0, - 0, - 1 - ); + finalHeight = availableHeight; + finalWidth = finalHeight * aspectRatio; + pan_offset.x = (availableWidth - finalWidth) / 2 + toolPanelWidth; } - return this; + if (this.image === null) { + this.image = image; + } + this.imageRootWidth = finalWidth; + this.imageRootHeight = finalHeight; + this.zoom_ratio = Math.min(zoomRatioWidth, zoomRatioHeight); + this.pan_offset = pan_offset; + await this.invalidatePanZoom(); } - makeRotationX(theta) { - const c = Math.cos(theta), s = Math.sin(theta); - this.set( - 1, - 0, - 0, - 0, - 0, - c, - -s, - 0, - 0, - s, - c, - 0, - 0, - 0, - 0, - 1 - ); - return this; + async invalidatePanZoom() { + if (!this.image?.width || !this.image?.height || !this.pan_offset || !this.zoom_ratio) { + console.warn("Missing required properties for pan/zoom"); + return; + } + const raw_width = this.image.width * this.zoom_ratio; + const raw_height = this.image.height * this.zoom_ratio; + this.canvasContainer ??= await this.messageBroker?.pull("getCanvasContainer"); + if (!this.canvasContainer) return; + Object.assign(this.canvasContainer.style, { + width: `${raw_width}px`, + height: `${raw_height}px`, + left: `${this.pan_offset.x}px`, + top: `${this.pan_offset.y}px` + }); } - makeRotationY(theta) { - const c = Math.cos(theta), s = Math.sin(theta); - this.set( - c, - 0, - s, - 0, - 0, - 1, - 0, - 0, - -s, - 0, - c, - 0, - 0, - 0, - 0, - 1 - ); - return this; + handlePanStart(event) { + let coords_canvas = this.messageBroker.pull("screenToCanvas", { + x: event.offsetX, + y: event.offsetY + }); + this.mouseDownPoint = { x: event.clientX, y: event.clientY }; + this.messageBroker.publish("panCursor", true); + this.initialPan = this.pan_offset; + return; } - makeRotationZ(theta) { - const c = Math.cos(theta), s = Math.sin(theta); - this.set( - c, - -s, - 0, - 0, - s, - c, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 1 - ); - return this; + handlePanMove(event) { + if (this.mouseDownPoint === null) throw new Error("mouseDownPoint is null"); + let deltaX = this.mouseDownPoint.x - event.clientX; + let deltaY = this.mouseDownPoint.y - event.clientY; + let pan_x = this.initialPan.x - deltaX; + let pan_y = this.initialPan.y - deltaY; + this.pan_offset = { x: pan_x, y: pan_y }; + this.invalidatePanZoom(); } - makeRotationAxis(axis, angle) { - const c = Math.cos(angle); - const s = Math.sin(angle); - const t2 = 1 - c; - const x = axis.x, y = axis.y, z = axis.z; - const tx = t2 * x, ty = t2 * y; - this.set( - tx * x + c, - tx * y - s * z, - tx * z + s * y, - 0, - tx * y + s * z, - ty * y + c, - ty * z - s * x, - 0, - tx * z - s * y, - ty * z + s * x, - t2 * z * z + c, - 0, - 0, - 0, - 0, - 1 - ); - return this; +} +class MessageBroker { + static { + __name(this, "MessageBroker"); } - makeScale(x, y, z) { - this.set( - x, - 0, - 0, - 0, - 0, - y, - 0, - 0, - 0, - 0, - z, - 0, - 0, - 0, - 0, - 1 - ); - return this; + pushTopics = {}; + pullTopics = {}; + constructor() { + this.registerListeners(); } - makeShear(xy, xz, yx, yz, zx, zy) { - this.set( - 1, - yx, - zx, - 0, - xy, - 1, - zy, - 0, - xz, - yz, - 1, - 0, - 0, - 0, - 0, - 1 - ); - return this; + // Push + registerListeners() { + this.createPushTopic("panStart"); + this.createPushTopic("paintBucketFill"); + this.createPushTopic("saveState"); + this.createPushTopic("brushAdjustmentStart"); + this.createPushTopic("drawStart"); + this.createPushTopic("panMove"); + this.createPushTopic("updateBrushPreview"); + this.createPushTopic("brushAdjustment"); + this.createPushTopic("draw"); + this.createPushTopic("paintBucketCursor"); + this.createPushTopic("panCursor"); + this.createPushTopic("drawEnd"); + this.createPushTopic("zoom"); + this.createPushTopic("undo"); + this.createPushTopic("redo"); + this.createPushTopic("cursorPoint"); + this.createPushTopic("panOffset"); + this.createPushTopic("zoomRatio"); + this.createPushTopic("getMaskCanvas"); + this.createPushTopic("getCanvasContainer"); + this.createPushTopic("screenToCanvas"); + this.createPushTopic("isKeyPressed"); + this.createPushTopic("isCombinationPressed"); + this.createPushTopic("setPaintBucketTolerance"); + this.createPushTopic("setBrushSize"); + this.createPushTopic("setBrushHardness"); + this.createPushTopic("setBrushOpacity"); + this.createPushTopic("setBrushShape"); + this.createPushTopic("initZoomPan"); + this.createPushTopic("setTool"); + this.createPushTopic("pointerDown"); + this.createPushTopic("pointerMove"); + this.createPushTopic("pointerUp"); + this.createPushTopic("wheel"); + this.createPushTopic("initPaintBucketTool"); + this.createPushTopic("setBrushVisibility"); + this.createPushTopic("setBrushPreviewGradientVisibility"); + this.createPushTopic("handleTouchStart"); + this.createPushTopic("handleTouchMove"); + this.createPushTopic("handleTouchEnd"); + this.createPushTopic("colorSelectFill"); + this.createPushTopic("setColorSelectTolerance"); + this.createPushTopic("setLivePreview"); + this.createPushTopic("updateCursor"); + this.createPushTopic("setColorComparisonMethod"); + this.createPushTopic("clearLastPoint"); + this.createPushTopic("setWholeImage"); + this.createPushTopic("setMaskBoundary"); + this.createPushTopic("setMaskTolerance"); + this.createPushTopic("setBrushSmoothingPrecision"); + this.createPushTopic("setZoomText"); + this.createPushTopic("resetZoom"); + this.createPushTopic("invert"); } - compose(position, quaternion, scale) { - const te2 = this.elements; - const x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w; - const x2 = x + x, y2 = y + y, z2 = z + z; - const xx = x * x2, xy = x * y2, xz = x * z2; - const yy = y * y2, yz = y * z2, zz = z * z2; - const wx = w * x2, wy = w * y2, wz = w * z2; - const sx = scale.x, sy = scale.y, sz = scale.z; - te2[0] = (1 - (yy + zz)) * sx; - te2[1] = (xy + wz) * sx; - te2[2] = (xz - wy) * sx; - te2[3] = 0; - te2[4] = (xy - wz) * sy; - te2[5] = (1 - (xx + zz)) * sy; - te2[6] = (yz + wx) * sy; - te2[7] = 0; - te2[8] = (xz + wy) * sz; - te2[9] = (yz - wx) * sz; - te2[10] = (1 - (xx + yy)) * sz; - te2[11] = 0; - te2[12] = position.x; - te2[13] = position.y; - te2[14] = position.z; - te2[15] = 1; - return this; + /** + * Creates a new push topic (listener is notified) + * + * @param {string} topicName - The name of the topic to create. + * @throws {Error} If the topic already exists. + */ + createPushTopic(topicName) { + if (this.topicExists(this.pushTopics, topicName)) { + throw new Error("Topic already exists"); + } + this.pushTopics[topicName] = []; } - decompose(position, quaternion, scale) { - const te2 = this.elements; - let sx = _v1$5.set(te2[0], te2[1], te2[2]).length(); - const sy = _v1$5.set(te2[4], te2[5], te2[6]).length(); - const sz = _v1$5.set(te2[8], te2[9], te2[10]).length(); - const det = this.determinant(); - if (det < 0) sx = -sx; - position.x = te2[12]; - position.y = te2[13]; - position.z = te2[14]; - _m1$4.copy(this); - const invSX = 1 / sx; - const invSY = 1 / sy; - const invSZ = 1 / sz; - _m1$4.elements[0] *= invSX; - _m1$4.elements[1] *= invSX; - _m1$4.elements[2] *= invSX; - _m1$4.elements[4] *= invSY; - _m1$4.elements[5] *= invSY; - _m1$4.elements[6] *= invSY; - _m1$4.elements[8] *= invSZ; - _m1$4.elements[9] *= invSZ; - _m1$4.elements[10] *= invSZ; - quaternion.setFromRotationMatrix(_m1$4); - scale.x = sx; - scale.y = sy; - scale.z = sz; - return this; + /** + * Subscribe a callback function to the given topic. + * + * @param {string} topicName - The name of the topic to subscribe to. + * @param {Callback} callback - The callback function to be subscribed. + * @throws {Error} If the topic does not exist. + */ + subscribe(topicName, callback) { + if (!this.topicExists(this.pushTopics, topicName)) { + throw new Error(`Topic "${topicName}" does not exist!`); + } + this.pushTopics[topicName].push(callback); } - makePerspective(left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem) { - const te2 = this.elements; - const x = 2 * near / (right - left); - const y = 2 * near / (top - bottom); - const a = (right + left) / (right - left); - const b = (top + bottom) / (top - bottom); - let c, d; - if (coordinateSystem === WebGLCoordinateSystem) { - c = -(far + near) / (far - near); - d = -2 * far * near / (far - near); - } else if (coordinateSystem === WebGPUCoordinateSystem) { - c = -far / (far - near); - d = -far * near / (far - near); - } else { - throw new Error("THREE.Matrix4.makePerspective(): Invalid coordinate system: " + coordinateSystem); + /** + * Removes a callback function from the list of subscribers for a given topic. + * + * @param {string} topicName - The name of the topic to unsubscribe from. + * @param {Callback} callback - The callback function to remove from the subscribers list. + * @throws {Error} If the topic does not exist in the list of topics. + */ + unsubscribe(topicName, callback) { + if (!this.topicExists(this.pushTopics, topicName)) { + throw new Error("Topic does not exist"); + } + const index = this.pushTopics[topicName].indexOf(callback); + if (index > -1) { + this.pushTopics[topicName].splice(index, 1); } - te2[0] = x; - te2[4] = 0; - te2[8] = a; - te2[12] = 0; - te2[1] = 0; - te2[5] = y; - te2[9] = b; - te2[13] = 0; - te2[2] = 0; - te2[6] = 0; - te2[10] = c; - te2[14] = d; - te2[3] = 0; - te2[7] = 0; - te2[11] = -1; - te2[15] = 0; - return this; } - makeOrthographic(left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem) { - const te2 = this.elements; - const w = 1 / (right - left); - const h = 1 / (top - bottom); - const p = 1 / (far - near); - const x = (right + left) * w; - const y = (top + bottom) * h; - let z, zInv; - if (coordinateSystem === WebGLCoordinateSystem) { - z = (far + near) * p; - zInv = -2 * p; - } else if (coordinateSystem === WebGPUCoordinateSystem) { - z = near * p; - zInv = -1 * p; - } else { - throw new Error("THREE.Matrix4.makeOrthographic(): Invalid coordinate system: " + coordinateSystem); + /** + * Publishes data to a specified topic with variable number of arguments. + * @param {string} topicName - The name of the topic to publish to. + * @param {...any[]} args - Variable number of arguments to pass to subscribers + * @throws {Error} If the specified topic does not exist. + */ + publish(topicName, ...args) { + if (!this.topicExists(this.pushTopics, topicName)) { + throw new Error(`Topic "${topicName}" does not exist!`); } - te2[0] = 2 * w; - te2[4] = 0; - te2[8] = 0; - te2[12] = -x; - te2[1] = 0; - te2[5] = 2 * h; - te2[9] = 0; - te2[13] = -y; - te2[2] = 0; - te2[6] = 0; - te2[10] = zInv; - te2[14] = -z; - te2[3] = 0; - te2[7] = 0; - te2[11] = 0; - te2[15] = 1; - return this; + this.pushTopics[topicName].forEach((callback) => { + callback(...args); + }); } - equals(matrix) { - const te2 = this.elements; - const me = matrix.elements; - for (let i = 0; i < 16; i++) { - if (te2[i] !== me[i]) return false; + // Pull + /** + * Creates a new pull topic (listener must request data) + * + * @param {string} topicName - The name of the topic to create. + * @param {() => Promise} callBack - The callback function to be called when data is requested. + * @throws {Error} If the topic already exists. + */ + createPullTopic(topicName, callBack) { + if (this.topicExists(this.pullTopics, topicName)) { + throw new Error("Topic already exists"); } - return true; + this.pullTopics[topicName] = callBack; } - fromArray(array, offset = 0) { - for (let i = 0; i < 16; i++) { - this.elements[i] = array[i + offset]; + /** + * Requests data from a specified pull topic. + * @param {string} topicName - The name of the topic to request data from. + * @returns {Promise} - The data from the pull topic. + * @throws {Error} If the specified topic does not exist. + */ + async pull(topicName, data) { + if (!this.topicExists(this.pullTopics, topicName)) { + throw new Error("Topic does not exist"); + } + const callBack = this.pullTopics[topicName]; + try { + const result = await callBack(data); + return result; + } catch (error) { + console.error(`Error pulling data from topic "${topicName}":`, error); + throw error; } - return this; } - toArray(array = [], offset = 0) { - const te2 = this.elements; - array[offset] = te2[0]; - array[offset + 1] = te2[1]; - array[offset + 2] = te2[2]; - array[offset + 3] = te2[3]; - array[offset + 4] = te2[4]; - array[offset + 5] = te2[5]; - array[offset + 6] = te2[6]; - array[offset + 7] = te2[7]; - array[offset + 8] = te2[8]; - array[offset + 9] = te2[9]; - array[offset + 10] = te2[10]; - array[offset + 11] = te2[11]; - array[offset + 12] = te2[12]; - array[offset + 13] = te2[13]; - array[offset + 14] = te2[14]; - array[offset + 15] = te2[15]; - return array; + // Helper Methods + /** + * Checks if a topic exists in the given topics object. + * @param {Record} topics - The topics object to check. + * @param {string} topicName - The name of the topic to check. + * @returns {boolean} - True if the topic exists, false otherwise. + */ + topicExists(topics, topicName) { + return topics.hasOwnProperty(topicName); } } -const _v1$5 = /* @__PURE__ */ new Vector3(); -const _m1$4 = /* @__PURE__ */ new Matrix4(); -const _zero = /* @__PURE__ */ new Vector3(0, 0, 0); -const _one = /* @__PURE__ */ new Vector3(1, 1, 1); -const _x = /* @__PURE__ */ new Vector3(); -const _y = /* @__PURE__ */ new Vector3(); -const _z = /* @__PURE__ */ new Vector3(); -const _matrix$2 = /* @__PURE__ */ new Matrix4(); -const _quaternion$3 = /* @__PURE__ */ new Quaternion(); -class Euler { +class KeyboardManager { static { - __name(this, "Euler"); - } - constructor(x = 0, y = 0, z = 0, order = Euler.DEFAULT_ORDER) { - this.isEuler = true; - this._x = x; - this._y = y; - this._z = z; - this._order = order; - } - get x() { - return this._x; + __name(this, "KeyboardManager"); } - set x(value) { - this._x = value; - this._onChangeCallback(); + keysDown = []; + maskEditor; + messageBroker; + constructor(maskEditor) { + this.maskEditor = maskEditor; + this.messageBroker = maskEditor.getMessageBroker(); + this.addPullTopics(); } - get y() { - return this._y; + addPullTopics() { + this.messageBroker.createPullTopic( + "isKeyPressed", + (key) => Promise.resolve(this.isKeyDown(key)) + ); } - set y(value) { - this._y = value; - this._onChangeCallback(); + addListeners() { + document.addEventListener("keydown", (event) => this.handleKeyDown(event)); + document.addEventListener("keyup", (event) => this.handleKeyUp(event)); + window.addEventListener("blur", () => this.clearKeys()); } - get z() { - return this._z; + removeListeners() { + document.removeEventListener( + "keydown", + (event) => this.handleKeyDown(event) + ); + document.removeEventListener("keyup", (event) => this.handleKeyUp(event)); } - set z(value) { - this._z = value; - this._onChangeCallback(); + clearKeys() { + this.keysDown = []; } - get order() { - return this._order; + handleKeyDown(event) { + if (!this.keysDown.includes(event.key)) { + this.keysDown.push(event.key); + } } - set order(value) { - this._order = value; - this._onChangeCallback(); + handleKeyUp(event) { + this.keysDown = this.keysDown.filter((key) => key !== event.key); } - set(x, y, z, order = this._order) { - this._x = x; - this._y = y; - this._z = z; - this._order = order; - this._onChangeCallback(); - return this; + isKeyDown(key) { + return this.keysDown.includes(key); } - clone() { - return new this.constructor(this._x, this._y, this._z, this._order); + // combinations + undoCombinationPressed() { + const combination = ["ctrl", "z"]; + const keysDownLower = this.keysDown.map((key) => key.toLowerCase()); + const result = combination.every((key) => keysDownLower.includes(key)); + if (result) this.messageBroker.publish("undo"); + return result; } - copy(euler) { - this._x = euler._x; - this._y = euler._y; - this._z = euler._z; - this._order = euler._order; - this._onChangeCallback(); - return this; + redoCombinationPressed() { + const combination = ["ctrl", "shift", "z"]; + const keysDownLower = this.keysDown.map((key) => key.toLowerCase()); + const result = combination.every((key) => keysDownLower.includes(key)); + if (result) this.messageBroker.publish("redo"); + return result; } - setFromRotationMatrix(m, order = this._order, update = true) { - const te2 = m.elements; - const m11 = te2[0], m12 = te2[4], m13 = te2[8]; - const m21 = te2[1], m22 = te2[5], m23 = te2[9]; - const m31 = te2[2], m32 = te2[6], m33 = te2[10]; - switch (order) { - case "XYZ": - this._y = Math.asin(clamp(m13, -1, 1)); - if (Math.abs(m13) < 0.9999999) { - this._x = Math.atan2(-m23, m33); - this._z = Math.atan2(-m12, m11); - } else { - this._x = Math.atan2(m32, m22); - this._z = 0; - } - break; - case "YXZ": - this._x = Math.asin(-clamp(m23, -1, 1)); - if (Math.abs(m23) < 0.9999999) { - this._y = Math.atan2(m13, m33); - this._z = Math.atan2(m21, m22); - } else { - this._y = Math.atan2(-m31, m11); - this._z = 0; - } - break; - case "ZXY": - this._x = Math.asin(clamp(m32, -1, 1)); - if (Math.abs(m32) < 0.9999999) { - this._y = Math.atan2(-m31, m33); - this._z = Math.atan2(-m12, m22); - } else { - this._y = 0; - this._z = Math.atan2(m21, m11); - } - break; - case "ZYX": - this._y = Math.asin(-clamp(m31, -1, 1)); - if (Math.abs(m31) < 0.9999999) { - this._x = Math.atan2(m32, m33); - this._z = Math.atan2(m21, m11); - } else { - this._x = 0; - this._z = Math.atan2(-m12, m22); - } - break; - case "YZX": - this._z = Math.asin(clamp(m21, -1, 1)); - if (Math.abs(m21) < 0.9999999) { - this._x = Math.atan2(-m23, m22); - this._y = Math.atan2(-m31, m11); - } else { - this._x = 0; - this._y = Math.atan2(m13, m33); +} +app.registerExtension({ + name: "Comfy.MaskEditor", + settings: [ + { + id: "Comfy.MaskEditor.UseNewEditor", + category: ["Mask Editor", "NewEditor"], + name: "Use new mask editor", + tooltip: "Switch to the new mask editor interface", + type: "boolean", + defaultValue: true, + experimental: true + }, + { + id: "Comfy.MaskEditor.BrushAdjustmentSpeed", + category: ["Mask Editor", "BrushAdjustment", "Sensitivity"], + name: "Brush adjustment speed multiplier", + tooltip: "Controls how quickly the brush size and hardness change when adjusting. Higher values mean faster changes.", + experimental: true, + type: "slider", + attrs: { + min: 0.1, + max: 2, + step: 0.1 + }, + defaultValue: 1, + versionAdded: "1.0.0" + }, + { + id: "Comfy.MaskEditor.UseDominantAxis", + category: ["Mask Editor", "BrushAdjustment", "UseDominantAxis"], + name: "Lock brush adjustment to dominant axis", + tooltip: "When enabled, brush adjustments will only affect size OR hardness based on which direction you move more", + type: "boolean", + defaultValue: true, + experimental: true + } + ], + init(app2) { + function openMaskEditor() { + const useNewEditor = app2.extensionManager.setting.get( + "Comfy.MaskEditor.UseNewEditor" + ); + if (useNewEditor) { + const dlg = MaskEditorDialog.getInstance(); + if (dlg?.isOpened && !dlg.isOpened()) { + dlg.show(); } - break; - case "XZY": - this._z = Math.asin(-clamp(m12, -1, 1)); - if (Math.abs(m12) < 0.9999999) { - this._x = Math.atan2(m32, m22); - this._y = Math.atan2(m13, m11); - } else { - this._x = Math.atan2(-m23, m33); - this._y = 0; + } else { + const dlg = MaskEditorDialogOld.getInstance(); + if (dlg?.isOpened && !dlg.isOpened()) { + dlg.show(); } - break; - default: - console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: " + order); + } } - this._order = order; - if (update === true) this._onChangeCallback(); - return this; - } - setFromQuaternion(q, order, update) { - _matrix$2.makeRotationFromQuaternion(q); - return this.setFromRotationMatrix(_matrix$2, order, update); - } - setFromVector3(v, order = this._order) { - return this.set(v.x, v.y, v.z, order); - } - reorder(newOrder) { - _quaternion$3.setFromEuler(this); - return this.setFromQuaternion(_quaternion$3, newOrder); - } - equals(euler) { - return euler._x === this._x && euler._y === this._y && euler._z === this._z && euler._order === this._order; - } - fromArray(array) { - this._x = array[0]; - this._y = array[1]; - this._z = array[2]; - if (array[3] !== void 0) this._order = array[3]; - this._onChangeCallback(); - return this; - } - toArray(array = [], offset = 0) { - array[offset] = this._x; - array[offset + 1] = this._y; - array[offset + 2] = this._z; - array[offset + 3] = this._order; - return array; - } - _onChange(callback) { - this._onChangeCallback = callback; - return this; - } - _onChangeCallback() { - } - *[Symbol.iterator]() { - yield this._x; - yield this._y; - yield this._z; - yield this._order; + __name(openMaskEditor, "openMaskEditor"); + ; + ComfyApp.open_maskeditor = openMaskEditor; + const context_predicate = /* @__PURE__ */ __name(() => { + return !!(ComfyApp.clipspace && ComfyApp.clipspace.imgs && ComfyApp.clipspace.imgs.length > 0); + }, "context_predicate"); + ClipspaceDialog.registerButton( + "MaskEditor", + context_predicate, + openMaskEditor + ); } -} -Euler.DEFAULT_ORDER = "XYZ"; -class Layers { +}); +const id = "Comfy.NodeTemplates"; +const file = "comfy.templates.json"; +class ManageTemplates extends ComfyDialog { static { - __name(this, "Layers"); + __name(this, "ManageTemplates"); } + templates; + draggedEl; + saveVisualCue; + emptyImg; + importInput; constructor() { - this.mask = 1 | 0; - } - set(channel) { - this.mask = (1 << channel | 0) >>> 0; - } - enable(channel) { - this.mask |= 1 << channel | 0; - } - enableAll() { - this.mask = 4294967295 | 0; + super(); + this.load().then((v) => { + this.templates = v; + }); + this.element.classList.add("comfy-manage-templates"); + this.draggedEl = null; + this.saveVisualCue = null; + this.emptyImg = new Image(); + this.emptyImg.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs="; + this.importInput = $el("input", { + type: "file", + accept: ".json", + multiple: true, + style: { display: "none" }, + parent: document.body, + onchange: /* @__PURE__ */ __name(() => this.importAll(), "onchange") + }); } - toggle(channel) { - this.mask ^= 1 << channel | 0; + createButtons() { + const btns = super.createButtons(); + btns[0].textContent = "Close"; + btns[0].onclick = (e) => { + clearTimeout(this.saveVisualCue); + this.close(); + }; + btns.unshift( + $el("button", { + type: "button", + textContent: "Export", + onclick: /* @__PURE__ */ __name(() => this.exportAll(), "onclick") + }) + ); + btns.unshift( + $el("button", { + type: "button", + textContent: "Import", + onclick: /* @__PURE__ */ __name(() => { + this.importInput.click(); + }, "onclick") + }) + ); + return btns; } - disable(channel) { - this.mask &= ~(1 << channel | 0); + async load() { + let templates = []; + const res = await api.getUserData(file); + if (res.status === 200) { + try { + templates = await res.json(); + } catch (error) { + } + } else if (res.status !== 404) { + console.error(res.status + " " + res.statusText); + } + return templates ?? []; } - disableAll() { - this.mask = 0; + async store() { + const templates = JSON.stringify(this.templates, void 0, 4); + try { + await api.storeUserData(file, templates, { stringify: false }); + } catch (error) { + console.error(error); + useToastStore().addAlert(error.message); + } } - test(layers) { - return (this.mask & layers.mask) !== 0; - } - isEnabled(channel) { - return (this.mask & (1 << channel | 0)) !== 0; - } -} -let _object3DId = 0; -const _v1$4 = /* @__PURE__ */ new Vector3(); -const _q1 = /* @__PURE__ */ new Quaternion(); -const _m1$3 = /* @__PURE__ */ new Matrix4(); -const _target = /* @__PURE__ */ new Vector3(); -const _position$3 = /* @__PURE__ */ new Vector3(); -const _scale$2 = /* @__PURE__ */ new Vector3(); -const _quaternion$2 = /* @__PURE__ */ new Quaternion(); -const _xAxis = /* @__PURE__ */ new Vector3(1, 0, 0); -const _yAxis = /* @__PURE__ */ new Vector3(0, 1, 0); -const _zAxis = /* @__PURE__ */ new Vector3(0, 0, 1); -const _addedEvent = { type: "added" }; -const _removedEvent = { type: "removed" }; -const _childaddedEvent = { type: "childadded", child: null }; -const _childremovedEvent = { type: "childremoved", child: null }; -class Object3D extends EventDispatcher { - static { - __name(this, "Object3D"); - } - constructor() { - super(); - this.isObject3D = true; - Object.defineProperty(this, "id", { value: _object3DId++ }); - this.uuid = generateUUID(); - this.name = ""; - this.type = "Object3D"; - this.parent = null; - this.children = []; - this.up = Object3D.DEFAULT_UP.clone(); - const position = new Vector3(); - const rotation = new Euler(); - const quaternion = new Quaternion(); - const scale = new Vector3(1, 1, 1); - function onRotationChange() { - quaternion.setFromEuler(rotation, false); + async importAll() { + for (const file2 of this.importInput.files) { + if (file2.type === "application/json" || file2.name.endsWith(".json")) { + const reader = new FileReader(); + reader.onload = async () => { + const importFile = JSON.parse(reader.result); + if (importFile?.templates) { + for (const template of importFile.templates) { + if (template?.name && template?.data) { + this.templates.push(template); + } + } + await this.store(); + } + }; + await reader.readAsText(file2); + } } - __name(onRotationChange, "onRotationChange"); - function onQuaternionChange() { - rotation.setFromQuaternion(quaternion, void 0, false); + this.importInput.value = null; + this.close(); + } + exportAll() { + if (this.templates.length == 0) { + useToastStore().addAlert("No templates to export."); + return; } - __name(onQuaternionChange, "onQuaternionChange"); - rotation._onChange(onRotationChange); - quaternion._onChange(onQuaternionChange); - Object.defineProperties(this, { - position: { - configurable: true, - enumerable: true, - value: position - }, - rotation: { - configurable: true, - enumerable: true, - value: rotation - }, - quaternion: { - configurable: true, - enumerable: true, - value: quaternion - }, - scale: { - configurable: true, - enumerable: true, - value: scale - }, - modelViewMatrix: { - value: new Matrix4() - }, - normalMatrix: { - value: new Matrix3() - } + const json = JSON.stringify({ templates: this.templates }, null, 2); + const blob = new Blob([json], { type: "application/json" }); + const url = URL.createObjectURL(blob); + const a = $el("a", { + href: url, + download: "node_templates.json", + style: { display: "none" }, + parent: document.body }); - this.matrix = new Matrix4(); - this.matrixWorld = new Matrix4(); - this.matrixAutoUpdate = Object3D.DEFAULT_MATRIX_AUTO_UPDATE; - this.matrixWorldAutoUpdate = Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE; - this.matrixWorldNeedsUpdate = false; - this.layers = new Layers(); - this.visible = true; - this.castShadow = false; - this.receiveShadow = false; - this.frustumCulled = true; - this.renderOrder = 0; - this.animations = []; - this.userData = {}; - } - onBeforeShadow() { - } - onAfterShadow() { - } - onBeforeRender() { - } - onAfterRender() { - } - applyMatrix4(matrix) { - if (this.matrixAutoUpdate) this.updateMatrix(); - this.matrix.premultiply(matrix); - this.matrix.decompose(this.position, this.quaternion, this.scale); - } - applyQuaternion(q) { - this.quaternion.premultiply(q); - return this; - } - setRotationFromAxisAngle(axis, angle) { - this.quaternion.setFromAxisAngle(axis, angle); - } - setRotationFromEuler(euler) { - this.quaternion.setFromEuler(euler, true); - } - setRotationFromMatrix(m) { - this.quaternion.setFromRotationMatrix(m); - } - setRotationFromQuaternion(q) { - this.quaternion.copy(q); - } - rotateOnAxis(axis, angle) { - _q1.setFromAxisAngle(axis, angle); - this.quaternion.multiply(_q1); - return this; - } - rotateOnWorldAxis(axis, angle) { - _q1.setFromAxisAngle(axis, angle); - this.quaternion.premultiply(_q1); - return this; - } - rotateX(angle) { - return this.rotateOnAxis(_xAxis, angle); - } - rotateY(angle) { - return this.rotateOnAxis(_yAxis, angle); - } - rotateZ(angle) { - return this.rotateOnAxis(_zAxis, angle); - } - translateOnAxis(axis, distance) { - _v1$4.copy(axis).applyQuaternion(this.quaternion); - this.position.add(_v1$4.multiplyScalar(distance)); - return this; - } - translateX(distance) { - return this.translateOnAxis(_xAxis, distance); - } - translateY(distance) { - return this.translateOnAxis(_yAxis, distance); - } - translateZ(distance) { - return this.translateOnAxis(_zAxis, distance); - } - localToWorld(vector) { - this.updateWorldMatrix(true, false); - return vector.applyMatrix4(this.matrixWorld); + a.click(); + setTimeout(function() { + a.remove(); + window.URL.revokeObjectURL(url); + }, 0); } - worldToLocal(vector) { - this.updateWorldMatrix(true, false); - return vector.applyMatrix4(_m1$3.copy(this.matrixWorld).invert()); + show() { + super.show( + $el( + "div", + {}, + this.templates.flatMap((t2, i) => { + let nameInput; + return [ + $el( + "div", + { + dataset: { id: i.toString() }, + className: "templateManagerRow", + style: { + display: "grid", + gridTemplateColumns: "1fr auto", + border: "1px dashed transparent", + gap: "5px", + backgroundColor: "var(--comfy-menu-bg)" + }, + ondragstart: /* @__PURE__ */ __name((e) => { + this.draggedEl = e.currentTarget; + e.currentTarget.style.opacity = "0.6"; + e.currentTarget.style.border = "1px dashed yellow"; + e.dataTransfer.effectAllowed = "move"; + e.dataTransfer.setDragImage(this.emptyImg, 0, 0); + }, "ondragstart"), + ondragend: /* @__PURE__ */ __name((e) => { + e.target.style.opacity = "1"; + e.currentTarget.style.border = "1px dashed transparent"; + e.currentTarget.removeAttribute("draggable"); + this.element.querySelectorAll(".templateManagerRow").forEach((el, i2) => { + var prev_i = Number.parseInt(el.dataset.id); + if (el == this.draggedEl && prev_i != i2) { + this.templates.splice( + i2, + 0, + this.templates.splice(prev_i, 1)[0] + ); + } + el.dataset.id = i2.toString(); + }); + this.store(); + }, "ondragend"), + ondragover: /* @__PURE__ */ __name((e) => { + e.preventDefault(); + if (e.currentTarget == this.draggedEl) return; + let rect = e.currentTarget.getBoundingClientRect(); + if (e.clientY > rect.top + rect.height / 2) { + e.currentTarget.parentNode.insertBefore( + this.draggedEl, + e.currentTarget.nextSibling + ); + } else { + e.currentTarget.parentNode.insertBefore( + this.draggedEl, + e.currentTarget + ); + } + }, "ondragover") + }, + [ + $el( + "label", + { + textContent: "Name: ", + style: { + cursor: "grab" + }, + onmousedown: /* @__PURE__ */ __name((e) => { + if (e.target.localName == "label") + e.currentTarget.parentNode.draggable = "true"; + }, "onmousedown") + }, + [ + $el("input", { + value: t2.name, + dataset: { name: t2.name }, + style: { + transitionProperty: "background-color", + transitionDuration: "0s" + }, + onchange: /* @__PURE__ */ __name((e) => { + clearTimeout(this.saveVisualCue); + var el = e.target; + var row = el.parentNode.parentNode; + this.templates[row.dataset.id].name = el.value.trim() || "untitled"; + this.store(); + el.style.backgroundColor = "rgb(40, 95, 40)"; + el.style.transitionDuration = "0s"; + this.saveVisualCue = setTimeout(function() { + el.style.transitionDuration = ".7s"; + el.style.backgroundColor = "var(--comfy-input-bg)"; + }, 15); + }, "onchange"), + onkeypress: /* @__PURE__ */ __name((e) => { + var el = e.target; + clearTimeout(this.saveVisualCue); + el.style.transitionDuration = "0s"; + el.style.backgroundColor = "var(--comfy-input-bg)"; + }, "onkeypress"), + $: /* @__PURE__ */ __name((el) => nameInput = el, "$") + }) + ] + ), + $el("div", {}, [ + $el("button", { + textContent: "Export", + style: { + fontSize: "12px", + fontWeight: "normal" + }, + onclick: /* @__PURE__ */ __name((e) => { + const json = JSON.stringify({ templates: [t2] }, null, 2); + const blob = new Blob([json], { + type: "application/json" + }); + const url = URL.createObjectURL(blob); + const a = $el("a", { + href: url, + download: (nameInput.value || t2.name) + ".json", + style: { display: "none" }, + parent: document.body + }); + a.click(); + setTimeout(function() { + a.remove(); + window.URL.revokeObjectURL(url); + }, 0); + }, "onclick") + }), + $el("button", { + textContent: "Delete", + style: { + fontSize: "12px", + color: "red", + fontWeight: "normal" + }, + onclick: /* @__PURE__ */ __name((e) => { + const item = e.target.parentNode.parentNode; + item.parentNode.removeChild(item); + this.templates.splice(item.dataset.id * 1, 1); + this.store(); + var that = this; + setTimeout(function() { + that.element.querySelectorAll(".templateManagerRow").forEach((el, i2) => { + el.dataset.id = i2.toString(); + }); + }, 0); + }, "onclick") + }) + ]) + ] + ) + ]; + }) + ) + ); } - lookAt(x, y, z) { - if (x.isVector3) { - _target.copy(x); - } else { - _target.set(x, y, z); - } - const parent = this.parent; - this.updateWorldMatrix(true, false); - _position$3.setFromMatrixPosition(this.matrixWorld); - if (this.isCamera || this.isLight) { - _m1$3.lookAt(_position$3, _target, this.up); - } else { - _m1$3.lookAt(_target, _position$3, this.up); - } - this.quaternion.setFromRotationMatrix(_m1$3); - if (parent) { - _m1$3.extractRotation(parent.matrixWorld); - _q1.setFromRotationMatrix(_m1$3); - this.quaternion.premultiply(_q1.invert()); - } +} +app.registerExtension({ + name: id, + setup() { + const manage = new ManageTemplates(); + const clipboardAction = /* @__PURE__ */ __name(async (cb) => { + const old = localStorage.getItem("litegrapheditor_clipboard"); + await cb(); + localStorage.setItem("litegrapheditor_clipboard", old); + }, "clipboardAction"); + const orig = LGraphCanvas.prototype.getCanvasMenuOptions; + LGraphCanvas.prototype.getCanvasMenuOptions = function() { + const options = orig.apply(this, arguments); + options.push(null); + options.push({ + content: `Save Selected as Template`, + disabled: !Object.keys(app.canvas.selected_nodes || {}).length, + callback: /* @__PURE__ */ __name(async () => { + const name = await useDialogService().showPromptDialog({ + title: t("nodeTemplates.saveAsTemplate"), + message: t("nodeTemplates.enterName"), + defaultValue: "" + }); + if (!name?.trim()) return; + clipboardAction(() => { + app.canvas.copyToClipboard(); + let data = localStorage.getItem("litegrapheditor_clipboard"); + data = JSON.parse(data); + const nodeIds = Object.keys(app.canvas.selected_nodes); + for (let i = 0; i < nodeIds.length; i++) { + const node = app.graph.getNodeById(nodeIds[i]); + const nodeData = node?.constructor.nodeData; + let groupData = GroupNodeHandler.getGroupData(node); + if (groupData) { + groupData = groupData.nodeData; + if (!data.groupNodes) { + data.groupNodes = {}; + } + data.groupNodes[nodeData.name] = groupData; + data.nodes[i].type = nodeData.name; + } + } + manage.templates.push({ + name, + data: JSON.stringify(data) + }); + manage.store(); + }); + }, "callback") + }); + const subItems = manage.templates.map((t2) => { + return { + content: t2.name, + callback: /* @__PURE__ */ __name(() => { + clipboardAction(async () => { + const data = JSON.parse(t2.data); + await GroupNodeConfig.registerFromWorkflow(data.groupNodes, {}); + if (!data.reroutes) { + deserialiseAndCreate(t2.data, app.canvas); + } else { + localStorage.setItem("litegrapheditor_clipboard", t2.data); + app.canvas.pasteFromClipboard(); + } + }); + }, "callback") + }; + }); + subItems.push(null, { + content: "Manage", + callback: /* @__PURE__ */ __name(() => manage.show(), "callback") + }); + options.push({ + content: "Node Templates", + submenu: { + options: subItems + } + }); + return options; + }; } - add(object) { - if (arguments.length > 1) { - for (let i = 0; i < arguments.length; i++) { - this.add(arguments[i]); +}); +app.registerExtension({ + name: "Comfy.NoteNode", + registerCustomNodes() { + class NoteNode extends LGraphNode { + static { + __name(this, "NoteNode"); } - return this; - } - if (object === this) { - console.error("THREE.Object3D.add: object can't be added as a child of itself.", object); - return this; - } - if (object && object.isObject3D) { - object.removeFromParent(); - object.parent = this; - this.children.push(object); - object.dispatchEvent(_addedEvent); - _childaddedEvent.child = object; - this.dispatchEvent(_childaddedEvent); - _childaddedEvent.child = null; - } else { - console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.", object); - } - return this; - } - remove(object) { - if (arguments.length > 1) { - for (let i = 0; i < arguments.length; i++) { - this.remove(arguments[i]); + static category; + color = LGraphCanvas.node_colors.yellow.color; + bgcolor = LGraphCanvas.node_colors.yellow.bgcolor; + groupcolor = LGraphCanvas.node_colors.yellow.groupcolor; + isVirtualNode; + collapsable; + title_mode; + constructor(title) { + super(title); + if (!this.properties) { + this.properties = { text: "" }; + } + ComfyWidgets.MARKDOWN( + // Should we extends LGraphNode? Yesss + this, + "", + ["", { default: this.properties.text }], + app + ); + this.serialize_widgets = true; + this.isVirtualNode = true; } - return this; } - const index = this.children.indexOf(object); - if (index !== -1) { - object.parent = null; - this.children.splice(index, 1); - object.dispatchEvent(_removedEvent); - _childremovedEvent.child = object; - this.dispatchEvent(_childremovedEvent); - _childremovedEvent.child = null; - } - return this; - } - removeFromParent() { - const parent = this.parent; - if (parent !== null) { - parent.remove(this); - } - return this; - } - clear() { - return this.remove(...this.children); - } - attach(object) { - this.updateWorldMatrix(true, false); - _m1$3.copy(this.matrixWorld).invert(); - if (object.parent !== null) { - object.parent.updateWorldMatrix(true, false); - _m1$3.multiply(object.parent.matrixWorld); - } - object.applyMatrix4(_m1$3); - object.removeFromParent(); - object.parent = this; - this.children.push(object); - object.updateWorldMatrix(false, true); - object.dispatchEvent(_addedEvent); - _childaddedEvent.child = object; - this.dispatchEvent(_childaddedEvent); - _childaddedEvent.child = null; - return this; - } - getObjectById(id2) { - return this.getObjectByProperty("id", id2); - } - getObjectByName(name) { - return this.getObjectByProperty("name", name); + LiteGraph.registerNodeType( + "Note", + Object.assign(NoteNode, { + title_mode: LiteGraph.NORMAL_TITLE, + title: "Note", + collapsable: true + }) + ); + NoteNode.category = "utils"; } - getObjectByProperty(name, value) { - if (this[name] === value) return this; - for (let i = 0, l = this.children.length; i < l; i++) { - const child = this.children[i]; - const object = child.getObjectByProperty(name, value); - if (object !== void 0) { - return object; +}); +app.registerExtension({ + name: "Comfy.RerouteNode", + registerCustomNodes(app2) { + class RerouteNode extends LGraphNode { + static { + __name(this, "RerouteNode"); } - } - return void 0; - } - getObjectsByProperty(name, value, result = []) { - if (this[name] === value) result.push(this); - const children = this.children; - for (let i = 0, l = children.length; i < l; i++) { - children[i].getObjectsByProperty(name, value, result); - } - return result; - } - getWorldPosition(target) { - this.updateWorldMatrix(true, false); - return target.setFromMatrixPosition(this.matrixWorld); - } - getWorldQuaternion(target) { - this.updateWorldMatrix(true, false); - this.matrixWorld.decompose(_position$3, target, _scale$2); - return target; - } - getWorldScale(target) { - this.updateWorldMatrix(true, false); - this.matrixWorld.decompose(_position$3, _quaternion$2, target); - return target; - } - getWorldDirection(target) { - this.updateWorldMatrix(true, false); - const e = this.matrixWorld.elements; - return target.set(e[8], e[9], e[10]).normalize(); - } - raycast() { - } - traverse(callback) { - callback(this); - const children = this.children; - for (let i = 0, l = children.length; i < l; i++) { - children[i].traverse(callback); - } - } - traverseVisible(callback) { - if (this.visible === false) return; - callback(this); - const children = this.children; - for (let i = 0, l = children.length; i < l; i++) { - children[i].traverseVisible(callback); - } - } - traverseAncestors(callback) { - const parent = this.parent; - if (parent !== null) { - callback(parent); - parent.traverseAncestors(callback); - } - } - updateMatrix() { - this.matrix.compose(this.position, this.quaternion, this.scale); - this.matrixWorldNeedsUpdate = true; - } - updateMatrixWorld(force) { - if (this.matrixAutoUpdate) this.updateMatrix(); - if (this.matrixWorldNeedsUpdate || force) { - if (this.matrixWorldAutoUpdate === true) { - if (this.parent === null) { - this.matrixWorld.copy(this.matrix); - } else { - this.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix); + static category; + static defaultVisibility = false; + constructor(title) { + super(title); + if (!this.properties) { + this.properties = {}; } - } - this.matrixWorldNeedsUpdate = false; - force = true; - } - const children = this.children; - for (let i = 0, l = children.length; i < l; i++) { - const child = children[i]; - child.updateMatrixWorld(force); - } - } - updateWorldMatrix(updateParents, updateChildren) { - const parent = this.parent; - if (updateParents === true && parent !== null) { - parent.updateWorldMatrix(true, false); - } - if (this.matrixAutoUpdate) this.updateMatrix(); - if (this.matrixWorldAutoUpdate === true) { - if (this.parent === null) { - this.matrixWorld.copy(this.matrix); - } else { - this.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix); - } - } - if (updateChildren === true) { - const children = this.children; - for (let i = 0, l = children.length; i < l; i++) { - const child = children[i]; - child.updateWorldMatrix(false, true); - } - } - } - toJSON(meta) { - const isRootObject = meta === void 0 || typeof meta === "string"; - const output = {}; - if (isRootObject) { - meta = { - geometries: {}, - materials: {}, - textures: {}, - images: {}, - shapes: {}, - skeletons: {}, - animations: {}, - nodes: {} - }; - output.metadata = { - version: 4.6, - type: "Object", - generator: "Object3D.toJSON" - }; - } - const object = {}; - object.uuid = this.uuid; - object.type = this.type; - if (this.name !== "") object.name = this.name; - if (this.castShadow === true) object.castShadow = true; - if (this.receiveShadow === true) object.receiveShadow = true; - if (this.visible === false) object.visible = false; - if (this.frustumCulled === false) object.frustumCulled = false; - if (this.renderOrder !== 0) object.renderOrder = this.renderOrder; - if (Object.keys(this.userData).length > 0) object.userData = this.userData; - object.layers = this.layers.mask; - object.matrix = this.matrix.toArray(); - object.up = this.up.toArray(); - if (this.matrixAutoUpdate === false) object.matrixAutoUpdate = false; - if (this.isInstancedMesh) { - object.type = "InstancedMesh"; - object.count = this.count; - object.instanceMatrix = this.instanceMatrix.toJSON(); - if (this.instanceColor !== null) object.instanceColor = this.instanceColor.toJSON(); - } - if (this.isBatchedMesh) { - object.type = "BatchedMesh"; - object.perObjectFrustumCulled = this.perObjectFrustumCulled; - object.sortObjects = this.sortObjects; - object.drawRanges = this._drawRanges; - object.reservedRanges = this._reservedRanges; - object.visibility = this._visibility; - object.active = this._active; - object.bounds = this._bounds.map((bound) => ({ - boxInitialized: bound.boxInitialized, - boxMin: bound.box.min.toArray(), - boxMax: bound.box.max.toArray(), - sphereInitialized: bound.sphereInitialized, - sphereRadius: bound.sphere.radius, - sphereCenter: bound.sphere.center.toArray() - })); - object.maxInstanceCount = this._maxInstanceCount; - object.maxVertexCount = this._maxVertexCount; - object.maxIndexCount = this._maxIndexCount; - object.geometryInitialized = this._geometryInitialized; - object.geometryCount = this._geometryCount; - object.matricesTexture = this._matricesTexture.toJSON(meta); - if (this._colorsTexture !== null) object.colorsTexture = this._colorsTexture.toJSON(meta); - if (this.boundingSphere !== null) { - object.boundingSphere = { - center: object.boundingSphere.center.toArray(), - radius: object.boundingSphere.radius + this.properties.showOutputText = RerouteNode.defaultVisibility; + this.properties.horizontal = false; + this.addInput("", "*"); + this.addOutput(this.properties.showOutputText ? "*" : "", "*"); + this.onAfterGraphConfigured = function() { + requestAnimationFrame(() => { + this.onConnectionsChange(LiteGraph.INPUT, null, true, null); + }); }; - } - if (this.boundingBox !== null) { - object.boundingBox = { - min: object.boundingBox.min.toArray(), - max: object.boundingBox.max.toArray() + this.onConnectionsChange = (type, index, connected, link_info) => { + if (app2.configuringGraph) return; + this.applyOrientation(); + if (connected && type === LiteGraph.OUTPUT) { + const types = new Set( + this.outputs[0].links.map((l) => app2.graph.links[l].type).filter((t2) => t2 !== "*") + ); + if (types.size > 1) { + const linksToDisconnect = []; + for (let i = 0; i < this.outputs[0].links.length - 1; i++) { + const linkId = this.outputs[0].links[i]; + const link = app2.graph.links[linkId]; + linksToDisconnect.push(link); + } + for (const link of linksToDisconnect) { + const node = app2.graph.getNodeById(link.target_id); + node.disconnectInput(link.target_slot); + } + } + } + let currentNode = this; + let updateNodes = []; + let inputType = null; + let inputNode = null; + while (currentNode) { + updateNodes.unshift(currentNode); + const linkId = currentNode.inputs[0].link; + if (linkId !== null) { + const link = app2.graph.links[linkId]; + if (!link) return; + const node = app2.graph.getNodeById(link.origin_id); + const type2 = node.constructor.type; + if (type2 === "Reroute") { + if (node === this) { + currentNode.disconnectInput(link.target_slot); + currentNode = null; + } else { + currentNode = node; + } + } else { + inputNode = currentNode; + inputType = node.outputs[link.origin_slot]?.type ?? null; + break; + } + } else { + currentNode = null; + break; + } + } + const nodes = [this]; + let outputType = null; + while (nodes.length) { + currentNode = nodes.pop(); + const outputs = (currentNode.outputs ? currentNode.outputs[0].links : []) || []; + if (outputs.length) { + for (const linkId of outputs) { + const link = app2.graph.links[linkId]; + if (!link) continue; + const node = app2.graph.getNodeById(link.target_id); + const type2 = node.constructor.type; + if (type2 === "Reroute") { + nodes.push(node); + updateNodes.push(node); + } else { + const nodeOutType = node.inputs && node.inputs[link?.target_slot] && node.inputs[link.target_slot].type ? node.inputs[link.target_slot].type : null; + if (inputType && !LiteGraph.isValidConnection(inputType, nodeOutType)) { + node.disconnectInput(link.target_slot); + } else { + outputType = nodeOutType; + } + } + } + } else { + } + } + const displayType = inputType || outputType || "*"; + const color = LGraphCanvas.link_type_colors[displayType]; + let widgetConfig; + let targetWidget; + let widgetType; + for (const node of updateNodes) { + node.outputs[0].type = inputType || "*"; + node.__outputType = displayType; + node.outputs[0].name = node.properties.showOutputText ? displayType : ""; + node.size = node.computeSize(); + node.applyOrientation(); + for (const l of node.outputs[0].links || []) { + const link = app2.graph.links[l]; + if (link) { + link.color = color; + if (app2.configuringGraph) continue; + const targetNode = app2.graph.getNodeById(link.target_id); + const targetInput = targetNode.inputs?.[link.target_slot]; + if (targetInput?.widget) { + const config = getWidgetConfig(targetInput); + if (!widgetConfig) { + widgetConfig = config[1] ?? {}; + widgetType = config[0]; + } + if (!targetWidget) { + targetWidget = targetNode.widgets?.find( + (w) => w.name === targetInput.widget.name + ); + } + const merged = mergeIfValid(targetInput, [ + config[0], + widgetConfig + ]); + if (merged.customConfig) { + widgetConfig = merged.customConfig; + } + } + } + } + } + for (const node of updateNodes) { + if (widgetConfig && outputType) { + node.inputs[0].widget = { name: "value" }; + setWidgetConfig( + node.inputs[0], + [widgetType ?? displayType, widgetConfig], + targetWidget + ); + } else { + setWidgetConfig(node.inputs[0], null); + } + } + if (inputNode) { + const link = app2.graph.links[inputNode.inputs[0].link]; + if (link) { + link.color = color; + } + } }; + this.clone = function() { + const cloned = RerouteNode.prototype.clone.apply(this); + cloned.removeOutput(0); + cloned.addOutput(this.properties.showOutputText ? "*" : "", "*"); + cloned.size = cloned.computeSize(); + return cloned; + }; + this.isVirtualNode = true; } - } - function serialize(library, element) { - if (library[element.uuid] === void 0) { - library[element.uuid] = element.toJSON(meta); + getExtraMenuOptions(_, options) { + options.unshift( + { + content: (this.properties.showOutputText ? "Hide" : "Show") + " Type", + callback: /* @__PURE__ */ __name(() => { + this.properties.showOutputText = !this.properties.showOutputText; + if (this.properties.showOutputText) { + this.outputs[0].name = this.__outputType || this.outputs[0].type; + } else { + this.outputs[0].name = ""; + } + this.size = this.computeSize(); + this.applyOrientation(); + app2.graph.setDirtyCanvas(true, true); + }, "callback") + }, + { + content: (RerouteNode.defaultVisibility ? "Hide" : "Show") + " Type By Default", + callback: /* @__PURE__ */ __name(() => { + RerouteNode.setDefaultTextVisibility( + !RerouteNode.defaultVisibility + ); + }, "callback") + }, + { + // naming is inverted with respect to LiteGraphNode.horizontal + // LiteGraphNode.horizontal == true means that + // each slot in the inputs and outputs are laid out horizontally, + // which is the opposite of the visual orientation of the inputs and outputs as a node + content: "Set " + (this.properties.horizontal ? "Horizontal" : "Vertical"), + callback: /* @__PURE__ */ __name(() => { + this.properties.horizontal = !this.properties.horizontal; + this.applyOrientation(); + }, "callback") + } + ); + return []; } - return element.uuid; - } - __name(serialize, "serialize"); - if (this.isScene) { - if (this.background) { - if (this.background.isColor) { - object.background = this.background.toJSON(); - } else if (this.background.isTexture) { - object.background = this.background.toJSON(meta).uuid; + applyOrientation() { + this.horizontal = this.properties.horizontal; + if (this.horizontal) { + this.inputs[0].pos = [this.size[0] / 2, 0]; + } else { + delete this.inputs[0].pos; } + app2.graph.setDirtyCanvas(true, true); } - if (this.environment && this.environment.isTexture && this.environment.isRenderTargetTexture !== true) { - object.environment = this.environment.toJSON(meta).uuid; + computeSize() { + return [ + this.properties.showOutputText && this.outputs && this.outputs.length ? Math.max( + 75, + LiteGraph.NODE_TEXT_SIZE * this.outputs[0].name.length * 0.6 + 40 + ) : 75, + 26 + ]; } - } else if (this.isMesh || this.isLine || this.isPoints) { - object.geometry = serialize(meta.geometries, this.geometry); - const parameters = this.geometry.parameters; - if (parameters !== void 0 && parameters.shapes !== void 0) { - const shapes = parameters.shapes; - if (Array.isArray(shapes)) { - for (let i = 0, l = shapes.length; i < l; i++) { - const shape = shapes[i]; - serialize(meta.shapes, shape); - } + static setDefaultTextVisibility(visible) { + RerouteNode.defaultVisibility = visible; + if (visible) { + localStorage["Comfy.RerouteNode.DefaultVisibility"] = "true"; } else { - serialize(meta.shapes, shapes); + delete localStorage["Comfy.RerouteNode.DefaultVisibility"]; } } } - if (this.isSkinnedMesh) { - object.bindMode = this.bindMode; - object.bindMatrix = this.bindMatrix.toArray(); - if (this.skeleton !== void 0) { - serialize(meta.skeletons, this.skeleton); - object.skeleton = this.skeleton.uuid; - } + RerouteNode.setDefaultTextVisibility( + !!localStorage["Comfy.RerouteNode.DefaultVisibility"] + ); + LiteGraph.registerNodeType( + "Reroute", + Object.assign(RerouteNode, { + title_mode: LiteGraph.NO_TITLE, + title: "Reroute", + collapsable: false + }) + ); + RerouteNode.category = "utils"; + } +}); +app.registerExtension({ + name: "Comfy.SaveImageExtraOutput", + async beforeRegisterNodeDef(nodeType, nodeData, app2) { + if (nodeData.name === "SaveImage" || nodeData.name === "SaveAnimatedWEBP") { + const onNodeCreated = nodeType.prototype.onNodeCreated; + nodeType.prototype.onNodeCreated = function() { + const r = onNodeCreated ? onNodeCreated.apply(this, arguments) : void 0; + const widget = this.widgets.find((w) => w.name === "filename_prefix"); + widget.serializeValue = () => { + return applyTextReplacements(app2, widget.value); + }; + return r; + }; + } else { + const onNodeCreated = nodeType.prototype.onNodeCreated; + nodeType.prototype.onNodeCreated = function() { + const r = onNodeCreated ? onNodeCreated.apply(this, arguments) : void 0; + if (!this.properties || !("Node name for S&R" in this.properties)) { + this.addProperty("Node name for S&R", this.constructor.type, "string"); + } + return r; + }; } - if (this.material !== void 0) { - if (Array.isArray(this.material)) { - const uuids = []; - for (let i = 0, l = this.material.length; i < l; i++) { - uuids.push(serialize(meta.materials, this.material[i])); + } +}); +let touchZooming; +let touchCount = 0; +app.registerExtension({ + name: "Comfy.SimpleTouchSupport", + setup() { + let touchDist; + let touchTime; + let lastTouch; + let lastScale; + function getMultiTouchPos(e) { + return Math.hypot( + e.touches[0].clientX - e.touches[1].clientX, + e.touches[0].clientY - e.touches[1].clientY + ); + } + __name(getMultiTouchPos, "getMultiTouchPos"); + function getMultiTouchCenter(e) { + return { + clientX: (e.touches[0].clientX + e.touches[1].clientX) / 2, + clientY: (e.touches[0].clientY + e.touches[1].clientY) / 2 + }; + } + __name(getMultiTouchCenter, "getMultiTouchCenter"); + app.canvasEl.parentElement.addEventListener( + "touchstart", + (e) => { + touchCount++; + lastTouch = null; + lastScale = null; + if (e.touches?.length === 1) { + touchTime = /* @__PURE__ */ new Date(); + lastTouch = e.touches[0]; + } else { + touchTime = null; + if (e.touches?.length === 2) { + lastScale = app.canvas.ds.scale; + lastTouch = getMultiTouchCenter(e); + touchDist = getMultiTouchPos(e); + app.canvas.pointer.isDown = false; + } } - object.material = uuids; - } else { - object.material = serialize(meta.materials, this.material); + }, + true + ); + app.canvasEl.parentElement.addEventListener("touchend", (e) => { + touchCount--; + if (e.touches?.length !== 1) touchZooming = false; + if (touchTime && !e.touches?.length) { + if ((/* @__PURE__ */ new Date()).getTime() - touchTime > 600) { + if (e.target === app.canvasEl) { + app.canvasEl.dispatchEvent( + new PointerEvent("pointerdown", { + button: 2, + clientX: e.changedTouches[0].clientX, + clientY: e.changedTouches[0].clientY + }) + ); + e.preventDefault(); + } + } + touchTime = null; } - } - if (this.children.length > 0) { - object.children = []; - for (let i = 0; i < this.children.length; i++) { - object.children.push(this.children[i].toJSON(meta).object); + }); + app.canvasEl.parentElement.addEventListener( + "touchmove", + (e) => { + touchTime = null; + if (e.touches?.length === 2 && lastTouch && !e.ctrlKey && !e.shiftKey) { + e.preventDefault(); + app.canvas.pointer.isDown = false; + touchZooming = true; + LiteGraph.closeAllContextMenus(window); + app.canvas.search_box?.close(); + const newTouchDist = getMultiTouchPos(e); + const center = getMultiTouchCenter(e); + let scale = lastScale * newTouchDist / touchDist; + const newX = (center.clientX - lastTouch.clientX) / scale; + const newY = (center.clientY - lastTouch.clientY) / scale; + if (scale < app.canvas.ds.min_scale) { + scale = app.canvas.ds.min_scale; + } else if (scale > app.canvas.ds.max_scale) { + scale = app.canvas.ds.max_scale; + } + const oldScale = app.canvas.ds.scale; + app.canvas.ds.scale = scale; + if (Math.abs(app.canvas.ds.scale - 1) < 0.01) { + app.canvas.ds.scale = 1; + } + const newScale = app.canvas.ds.scale; + const convertScaleToOffset = /* @__PURE__ */ __name((scale2) => [ + center.clientX / scale2 - app.canvas.ds.offset[0], + center.clientY / scale2 - app.canvas.ds.offset[1] + ], "convertScaleToOffset"); + var oldCenter = convertScaleToOffset(oldScale); + var newCenter = convertScaleToOffset(newScale); + app.canvas.ds.offset[0] += newX + newCenter[0] - oldCenter[0]; + app.canvas.ds.offset[1] += newY + newCenter[1] - oldCenter[1]; + lastTouch.clientX = center.clientX; + lastTouch.clientY = center.clientY; + app.canvas.setDirty(true, true); + } + }, + true + ); + } +}); +const processMouseDown = LGraphCanvas.prototype.processMouseDown; +LGraphCanvas.prototype.processMouseDown = function(e) { + if (touchZooming || touchCount) { + return; + } + app.canvas.pointer.isDown = false; + return processMouseDown.apply(this, arguments); +}; +const processMouseMove = LGraphCanvas.prototype.processMouseMove; +LGraphCanvas.prototype.processMouseMove = function(e) { + if (touchZooming || touchCount > 1) { + return; + } + return processMouseMove.apply(this, arguments); +}; +app.registerExtension({ + name: "Comfy.SlotDefaults", + suggestionsNumber: null, + init() { + LiteGraph.search_filter_enabled = true; + LiteGraph.middle_click_slot_add_default_node = true; + this.suggestionsNumber = app.ui.settings.addSetting({ + id: "Comfy.NodeSuggestions.number", + category: ["Comfy", "Node Search Box", "NodeSuggestions"], + name: "Number of nodes suggestions", + tooltip: "Only for litegraph searchbox/context menu", + type: "slider", + attrs: { + min: 1, + max: 100, + step: 1 + }, + defaultValue: 5, + onChange: /* @__PURE__ */ __name((newVal, oldVal) => { + this.setDefaults(newVal); + }, "onChange") + }); + }, + slot_types_default_out: {}, + slot_types_default_in: {}, + async beforeRegisterNodeDef(nodeType, nodeData, app2) { + var nodeId = nodeData.name; + const inputs = nodeData["input"]?.["required"]; + for (const inputKey in inputs) { + var input = inputs[inputKey]; + if (typeof input[0] !== "string") continue; + var type = input[0]; + if (type in ComfyWidgets) { + var customProperties = input[1]; + if (!customProperties?.forceInput) continue; + } + if (!(type in this.slot_types_default_out)) { + this.slot_types_default_out[type] = ["Reroute"]; + } + if (this.slot_types_default_out[type].includes(nodeId)) continue; + this.slot_types_default_out[type].push(nodeId); + const lowerType = type.toLocaleLowerCase(); + if (!(lowerType in LiteGraph.registered_slot_in_types)) { + LiteGraph.registered_slot_in_types[lowerType] = { nodes: [] }; } + LiteGraph.registered_slot_in_types[lowerType].nodes.push( + // @ts-expect-error ComfyNode + nodeType.comfyClass + ); } - if (this.animations.length > 0) { - object.animations = []; - for (let i = 0; i < this.animations.length; i++) { - const animation = this.animations[i]; - object.animations.push(serialize(meta.animations, animation)); + var outputs = nodeData["output"] ?? []; + for (const el of outputs) { + const type2 = el; + if (!(type2 in this.slot_types_default_in)) { + this.slot_types_default_in[type2] = ["Reroute"]; + } + this.slot_types_default_in[type2].push(nodeId); + if (!(type2 in LiteGraph.registered_slot_out_types)) { + LiteGraph.registered_slot_out_types[type2] = { nodes: [] }; + } + LiteGraph.registered_slot_out_types[type2].nodes.push(nodeType.comfyClass); + if (!LiteGraph.slot_types_out.includes(type2)) { + LiteGraph.slot_types_out.push(type2); } } - if (isRootObject) { - const geometries = extractFromCache(meta.geometries); - const materials = extractFromCache(meta.materials); - const textures = extractFromCache(meta.textures); - const images = extractFromCache(meta.images); - const shapes = extractFromCache(meta.shapes); - const skeletons = extractFromCache(meta.skeletons); - const animations = extractFromCache(meta.animations); - const nodes = extractFromCache(meta.nodes); - if (geometries.length > 0) output.geometries = geometries; - if (materials.length > 0) output.materials = materials; - if (textures.length > 0) output.textures = textures; - if (images.length > 0) output.images = images; - if (shapes.length > 0) output.shapes = shapes; - if (skeletons.length > 0) output.skeletons = skeletons; - if (animations.length > 0) output.animations = animations; - if (nodes.length > 0) output.nodes = nodes; + var maxNum = this.suggestionsNumber.value; + this.setDefaults(maxNum); + }, + setDefaults(maxNum) { + LiteGraph.slot_types_default_out = {}; + LiteGraph.slot_types_default_in = {}; + for (const type in this.slot_types_default_out) { + LiteGraph.slot_types_default_out[type] = this.slot_types_default_out[type].slice(0, maxNum); } - output.object = object; - return output; - function extractFromCache(cache) { - const values = []; - for (const key in cache) { - const data = cache[key]; - delete data.metadata; - values.push(data); - } - return values; + for (const type in this.slot_types_default_in) { + LiteGraph.slot_types_default_in[type] = this.slot_types_default_in[type].slice(0, maxNum); } - __name(extractFromCache, "extractFromCache"); } - clone(recursive) { - return new this.constructor().copy(this, recursive); - } - copy(source, recursive = true) { - this.name = source.name; - this.up.copy(source.up); - this.position.copy(source.position); - this.rotation.order = source.rotation.order; - this.quaternion.copy(source.quaternion); - this.scale.copy(source.scale); - this.matrix.copy(source.matrix); - this.matrixWorld.copy(source.matrixWorld); - this.matrixAutoUpdate = source.matrixAutoUpdate; - this.matrixWorldAutoUpdate = source.matrixWorldAutoUpdate; - this.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate; - this.layers.mask = source.layers.mask; - this.visible = source.visible; - this.castShadow = source.castShadow; - this.receiveShadow = source.receiveShadow; - this.frustumCulled = source.frustumCulled; - this.renderOrder = source.renderOrder; - this.animations = source.animations.slice(); - this.userData = JSON.parse(JSON.stringify(source.userData)); - if (recursive === true) { - for (let i = 0; i < source.children.length; i++) { - const child = source.children[i]; - this.add(child.clone()); - } +}); +app.registerExtension({ + name: "Comfy.UploadImage", + beforeRegisterNodeDef(nodeType, nodeData) { + if (nodeData?.input?.required?.image?.[1]?.image_upload === true) { + nodeData.input.required.upload = ["IMAGEUPLOAD"]; } - return this; - } -} -Object3D.DEFAULT_UP = /* @__PURE__ */ new Vector3(0, 1, 0); -Object3D.DEFAULT_MATRIX_AUTO_UPDATE = true; -Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE = true; -const _v0$2 = /* @__PURE__ */ new Vector3(); -const _v1$3 = /* @__PURE__ */ new Vector3(); -const _v2$2 = /* @__PURE__ */ new Vector3(); -const _v3$2 = /* @__PURE__ */ new Vector3(); -const _vab = /* @__PURE__ */ new Vector3(); -const _vac = /* @__PURE__ */ new Vector3(); -const _vbc = /* @__PURE__ */ new Vector3(); -const _vap = /* @__PURE__ */ new Vector3(); -const _vbp = /* @__PURE__ */ new Vector3(); -const _vcp = /* @__PURE__ */ new Vector3(); -const _v40 = /* @__PURE__ */ new Vector4(); -const _v41 = /* @__PURE__ */ new Vector4(); -const _v42 = /* @__PURE__ */ new Vector4(); -class Triangle { - static { - __name(this, "Triangle"); - } - constructor(a = new Vector3(), b = new Vector3(), c = new Vector3()) { - this.a = a; - this.b = b; - this.c = c; } - static getNormal(a, b, c, target) { - target.subVectors(c, b); - _v0$2.subVectors(a, b); - target.cross(_v0$2); - const targetLengthSq = target.lengthSq(); - if (targetLengthSq > 0) { - return target.multiplyScalar(1 / Math.sqrt(targetLengthSq)); - } - return target.set(0, 0, 0); +}); +const WEBCAM_READY = Symbol(); +app.registerExtension({ + name: "Comfy.WebcamCapture", + getCustomWidgets(app2) { + return { + WEBCAM(node, inputName) { + let res; + node[WEBCAM_READY] = new Promise((resolve) => res = resolve); + const container = document.createElement("div"); + container.style.background = "rgba(0,0,0,0.25)"; + container.style.textAlign = "center"; + const video = document.createElement("video"); + video.style.height = video.style.width = "100%"; + const loadVideo = /* @__PURE__ */ __name(async () => { + try { + const stream = await navigator.mediaDevices.getUserMedia({ + video: true, + audio: false + }); + container.replaceChildren(video); + setTimeout(() => res(video), 500); + video.addEventListener("loadedmetadata", () => res(video), false); + video.srcObject = stream; + video.play(); + } catch (error) { + const label = document.createElement("div"); + label.style.color = "red"; + label.style.overflow = "auto"; + label.style.maxHeight = "100%"; + label.style.whiteSpace = "pre-wrap"; + if (window.isSecureContext) { + label.textContent = "Unable to load webcam, please ensure access is granted:\n" + error.message; + } else { + label.textContent = "Unable to load webcam. A secure context is required, if you are not accessing ComfyUI on localhost (127.0.0.1) you will have to enable TLS (https)\n\n" + error.message; + } + container.replaceChildren(label); + } + }, "loadVideo"); + loadVideo(); + return { widget: node.addDOMWidget(inputName, "WEBCAM", container) }; + } + }; + }, + nodeCreated(node) { + if (node.type, node.constructor.comfyClass !== "WebcamCapture") return; + let video; + const camera = node.widgets.find((w2) => w2.name === "image"); + const w = node.widgets.find((w2) => w2.name === "width"); + const h = node.widgets.find((w2) => w2.name === "height"); + const captureOnQueue = node.widgets.find( + (w2) => w2.name === "capture_on_queue" + ); + const canvas = document.createElement("canvas"); + const capture = /* @__PURE__ */ __name(() => { + canvas.width = w.value; + canvas.height = h.value; + const ctx = canvas.getContext("2d"); + ctx.drawImage(video, 0, 0, w.value, h.value); + const data = canvas.toDataURL("image/png"); + const img = new Image(); + img.onload = () => { + node.imgs = [img]; + app.graph.setDirtyCanvas(true); + requestAnimationFrame(() => { + node.setSizeForImage?.(); + }); + }; + img.src = data; + }, "capture"); + const btn = node.addWidget( + "button", + "waiting for camera...", + "capture", + capture + ); + btn.disabled = true; + btn.serializeValue = () => void 0; + camera.serializeValue = async () => { + if (captureOnQueue.value) { + capture(); + } else if (!node.imgs?.length) { + const err2 = `No webcam image captured`; + useToastStore().addAlert(err2); + throw new Error(err2); + } + const blob = await new Promise((r) => canvas.toBlob(r)); + const name = `${+/* @__PURE__ */ new Date()}.png`; + const file2 = new File([blob], name); + const body = new FormData(); + body.append("image", file2); + body.append("subfolder", "webcam"); + body.append("type", "temp"); + const resp = await api.fetchApi("/upload/image", { + method: "POST", + body + }); + if (resp.status !== 200) { + const err2 = `Error uploading camera image: ${resp.status} - ${resp.statusText}`; + useToastStore().addAlert(err2); + throw new Error(err2); + } + return `webcam/${name} [temp]`; + }; + node[WEBCAM_READY].then((v) => { + video = v; + if (!w.value) { + w.value = video.videoWidth || 640; + h.value = video.videoHeight || 480; + } + btn.disabled = false; + btn.label = "capture"; + }); } - // static/instance method to calculate barycentric coordinates - // based on: http://www.blackpawn.com/texts/pointinpoly/default.html - static getBarycoord(point, a, b, c, target) { - _v0$2.subVectors(c, a); - _v1$3.subVectors(b, a); - _v2$2.subVectors(point, a); - const dot00 = _v0$2.dot(_v0$2); - const dot01 = _v0$2.dot(_v1$3); - const dot02 = _v0$2.dot(_v2$2); - const dot11 = _v1$3.dot(_v1$3); - const dot12 = _v1$3.dot(_v2$2); - const denom = dot00 * dot11 - dot01 * dot01; - if (denom === 0) { - target.set(0, 0, 0); - return null; - } - const invDenom = 1 / denom; - const u = (dot11 * dot02 - dot01 * dot12) * invDenom; - const v = (dot00 * dot12 - dot01 * dot02) * invDenom; - return target.set(1 - u - v, v, u); +}); +function splitFilePath$1(path) { + const folder_separator = path.lastIndexOf("/"); + if (folder_separator === -1) { + return ["", path]; } - static containsPoint(point, a, b, c) { - if (this.getBarycoord(point, a, b, c, _v3$2) === null) { - return false; + return [ + path.substring(0, folder_separator), + path.substring(folder_separator + 1) + ]; +} +__name(splitFilePath$1, "splitFilePath$1"); +function getResourceURL$1(subfolder, filename, type = "input") { + const params = [ + "filename=" + encodeURIComponent(filename), + "type=" + type, + "subfolder=" + subfolder, + app.getRandParam().substring(1) + ].join("&"); + return `/view?${params}`; +} +__name(getResourceURL$1, "getResourceURL$1"); +async function uploadFile$1(audioWidget, audioUIWidget, file2, updateNode, pasted = false) { + try { + const body = new FormData(); + body.append("image", file2); + if (pasted) body.append("subfolder", "pasted"); + const resp = await api.fetchApi("/upload/image", { + method: "POST", + body + }); + if (resp.status === 200) { + const data = await resp.json(); + let path = data.name; + if (data.subfolder) path = data.subfolder + "/" + path; + if (!audioWidget.options.values.includes(path)) { + audioWidget.options.values.push(path); + } + if (updateNode) { + audioUIWidget.element.src = api.apiURL( + getResourceURL$1(...splitFilePath$1(path)) + ); + audioWidget.value = path; + } + } else { + useToastStore().addAlert(resp.status + " - " + resp.statusText); } - return _v3$2.x >= 0 && _v3$2.y >= 0 && _v3$2.x + _v3$2.y <= 1; + } catch (error) { + useToastStore().addAlert(error); } - static getInterpolation(point, p1, p2, p3, v1, v2, v3, target) { - if (this.getBarycoord(point, p1, p2, p3, _v3$2) === null) { - target.x = 0; - target.y = 0; - if ("z" in target) target.z = 0; - if ("w" in target) target.w = 0; - return null; +} +__name(uploadFile$1, "uploadFile$1"); +app.registerExtension({ + name: "Comfy.AudioWidget", + async beforeRegisterNodeDef(nodeType, nodeData) { + if ( + // @ts-expect-error ComfyNode + ["LoadAudio", "SaveAudio", "PreviewAudio"].includes(nodeType.comfyClass) + ) { + nodeData.input.required.audioUI = ["AUDIO_UI"]; } - target.setScalar(0); - target.addScaledVector(v1, _v3$2.x); - target.addScaledVector(v2, _v3$2.y); - target.addScaledVector(v3, _v3$2.z); - return target; - } - static getInterpolatedAttribute(attr, i1, i2, i3, barycoord, target) { - _v40.setScalar(0); - _v41.setScalar(0); - _v42.setScalar(0); - _v40.fromBufferAttribute(attr, i1); - _v41.fromBufferAttribute(attr, i2); - _v42.fromBufferAttribute(attr, i3); - target.setScalar(0); - target.addScaledVector(_v40, barycoord.x); - target.addScaledVector(_v41, barycoord.y); - target.addScaledVector(_v42, barycoord.z); - return target; - } - static isFrontFacing(a, b, c, direction) { - _v0$2.subVectors(c, b); - _v1$3.subVectors(a, b); - return _v0$2.cross(_v1$3).dot(direction) < 0 ? true : false; - } - set(a, b, c) { - this.a.copy(a); - this.b.copy(b); - this.c.copy(c); - return this; - } - setFromPointsAndIndices(points, i0, i1, i2) { - this.a.copy(points[i0]); - this.b.copy(points[i1]); - this.c.copy(points[i2]); - return this; - } - setFromAttributeAndIndices(attribute, i0, i1, i2) { - this.a.fromBufferAttribute(attribute, i0); - this.b.fromBufferAttribute(attribute, i1); - this.c.fromBufferAttribute(attribute, i2); - return this; - } - clone() { - return new this.constructor().copy(this); - } - copy(triangle) { - this.a.copy(triangle.a); - this.b.copy(triangle.b); - this.c.copy(triangle.c); - return this; - } - getArea() { - _v0$2.subVectors(this.c, this.b); - _v1$3.subVectors(this.a, this.b); - return _v0$2.cross(_v1$3).length() * 0.5; - } - getMidpoint(target) { - return target.addVectors(this.a, this.b).add(this.c).multiplyScalar(1 / 3); - } - getNormal(target) { - return Triangle.getNormal(this.a, this.b, this.c, target); - } - getPlane(target) { - return target.setFromCoplanarPoints(this.a, this.b, this.c); - } - getBarycoord(point, target) { - return Triangle.getBarycoord(point, this.a, this.b, this.c, target); - } - getInterpolation(point, v1, v2, v3, target) { - return Triangle.getInterpolation(point, this.a, this.b, this.c, v1, v2, v3, target); - } - containsPoint(point) { - return Triangle.containsPoint(point, this.a, this.b, this.c); - } - isFrontFacing(direction) { - return Triangle.isFrontFacing(this.a, this.b, this.c, direction); - } - intersectsBox(box) { - return box.intersectsTriangle(this); - } - closestPointToPoint(p, target) { - const a = this.a, b = this.b, c = this.c; - let v, w; - _vab.subVectors(b, a); - _vac.subVectors(c, a); - _vap.subVectors(p, a); - const d1 = _vab.dot(_vap); - const d2 = _vac.dot(_vap); - if (d1 <= 0 && d2 <= 0) { - return target.copy(a); - } - _vbp.subVectors(p, b); - const d3 = _vab.dot(_vbp); - const d4 = _vac.dot(_vbp); - if (d3 >= 0 && d4 <= d3) { - return target.copy(b); - } - const vc = d1 * d4 - d3 * d2; - if (vc <= 0 && d1 >= 0 && d3 <= 0) { - v = d1 / (d1 - d3); - return target.copy(a).addScaledVector(_vab, v); - } - _vcp.subVectors(p, c); - const d5 = _vab.dot(_vcp); - const d6 = _vac.dot(_vcp); - if (d6 >= 0 && d5 <= d6) { - return target.copy(c); - } - const vb = d5 * d2 - d1 * d6; - if (vb <= 0 && d2 >= 0 && d6 <= 0) { - w = d2 / (d2 - d6); - return target.copy(a).addScaledVector(_vac, w); - } - const va = d3 * d6 - d5 * d4; - if (va <= 0 && d4 - d3 >= 0 && d5 - d6 >= 0) { - _vbc.subVectors(c, b); - w = (d4 - d3) / (d4 - d3 + (d5 - d6)); - return target.copy(b).addScaledVector(_vbc, w); - } - const denom = 1 / (va + vb + vc); - v = vb * denom; - w = vc * denom; - return target.copy(a).addScaledVector(_vab, v).addScaledVector(_vac, w); - } - equals(triangle) { - return triangle.a.equals(this.a) && triangle.b.equals(this.b) && triangle.c.equals(this.c); - } -} -const _colorKeywords = { - "aliceblue": 15792383, - "antiquewhite": 16444375, - "aqua": 65535, - "aquamarine": 8388564, - "azure": 15794175, - "beige": 16119260, - "bisque": 16770244, - "black": 0, - "blanchedalmond": 16772045, - "blue": 255, - "blueviolet": 9055202, - "brown": 10824234, - "burlywood": 14596231, - "cadetblue": 6266528, - "chartreuse": 8388352, - "chocolate": 13789470, - "coral": 16744272, - "cornflowerblue": 6591981, - "cornsilk": 16775388, - "crimson": 14423100, - "cyan": 65535, - "darkblue": 139, - "darkcyan": 35723, - "darkgoldenrod": 12092939, - "darkgray": 11119017, - "darkgreen": 25600, - "darkgrey": 11119017, - "darkkhaki": 12433259, - "darkmagenta": 9109643, - "darkolivegreen": 5597999, - "darkorange": 16747520, - "darkorchid": 10040012, - "darkred": 9109504, - "darksalmon": 15308410, - "darkseagreen": 9419919, - "darkslateblue": 4734347, - "darkslategray": 3100495, - "darkslategrey": 3100495, - "darkturquoise": 52945, - "darkviolet": 9699539, - "deeppink": 16716947, - "deepskyblue": 49151, - "dimgray": 6908265, - "dimgrey": 6908265, - "dodgerblue": 2003199, - "firebrick": 11674146, - "floralwhite": 16775920, - "forestgreen": 2263842, - "fuchsia": 16711935, - "gainsboro": 14474460, - "ghostwhite": 16316671, - "gold": 16766720, - "goldenrod": 14329120, - "gray": 8421504, - "green": 32768, - "greenyellow": 11403055, - "grey": 8421504, - "honeydew": 15794160, - "hotpink": 16738740, - "indianred": 13458524, - "indigo": 4915330, - "ivory": 16777200, - "khaki": 15787660, - "lavender": 15132410, - "lavenderblush": 16773365, - "lawngreen": 8190976, - "lemonchiffon": 16775885, - "lightblue": 11393254, - "lightcoral": 15761536, - "lightcyan": 14745599, - "lightgoldenrodyellow": 16448210, - "lightgray": 13882323, - "lightgreen": 9498256, - "lightgrey": 13882323, - "lightpink": 16758465, - "lightsalmon": 16752762, - "lightseagreen": 2142890, - "lightskyblue": 8900346, - "lightslategray": 7833753, - "lightslategrey": 7833753, - "lightsteelblue": 11584734, - "lightyellow": 16777184, - "lime": 65280, - "limegreen": 3329330, - "linen": 16445670, - "magenta": 16711935, - "maroon": 8388608, - "mediumaquamarine": 6737322, - "mediumblue": 205, - "mediumorchid": 12211667, - "mediumpurple": 9662683, - "mediumseagreen": 3978097, - "mediumslateblue": 8087790, - "mediumspringgreen": 64154, - "mediumturquoise": 4772300, - "mediumvioletred": 13047173, - "midnightblue": 1644912, - "mintcream": 16121850, - "mistyrose": 16770273, - "moccasin": 16770229, - "navajowhite": 16768685, - "navy": 128, - "oldlace": 16643558, - "olive": 8421376, - "olivedrab": 7048739, - "orange": 16753920, - "orangered": 16729344, - "orchid": 14315734, - "palegoldenrod": 15657130, - "palegreen": 10025880, - "paleturquoise": 11529966, - "palevioletred": 14381203, - "papayawhip": 16773077, - "peachpuff": 16767673, - "peru": 13468991, - "pink": 16761035, - "plum": 14524637, - "powderblue": 11591910, - "purple": 8388736, - "rebeccapurple": 6697881, - "red": 16711680, - "rosybrown": 12357519, - "royalblue": 4286945, - "saddlebrown": 9127187, - "salmon": 16416882, - "sandybrown": 16032864, - "seagreen": 3050327, - "seashell": 16774638, - "sienna": 10506797, - "silver": 12632256, - "skyblue": 8900331, - "slateblue": 6970061, - "slategray": 7372944, - "slategrey": 7372944, - "snow": 16775930, - "springgreen": 65407, - "steelblue": 4620980, - "tan": 13808780, - "teal": 32896, - "thistle": 14204888, - "tomato": 16737095, - "turquoise": 4251856, - "violet": 15631086, - "wheat": 16113331, - "white": 16777215, - "whitesmoke": 16119285, - "yellow": 16776960, - "yellowgreen": 10145074 -}; -const _hslA = { h: 0, s: 0, l: 0 }; -const _hslB = { h: 0, s: 0, l: 0 }; -function hue2rgb(p, q, t2) { - if (t2 < 0) t2 += 1; - if (t2 > 1) t2 -= 1; - if (t2 < 1 / 6) return p + (q - p) * 6 * t2; - if (t2 < 1 / 2) return q; - if (t2 < 2 / 3) return p + (q - p) * 6 * (2 / 3 - t2); - return p; -} -__name(hue2rgb, "hue2rgb"); -class Color { - static { - __name(this, "Color"); - } - constructor(r, g, b) { - this.isColor = true; - this.r = 1; - this.g = 1; - this.b = 1; - return this.set(r, g, b); - } - set(r, g, b) { - if (g === void 0 && b === void 0) { - const value = r; - if (value && value.isColor) { - this.copy(value); - } else if (typeof value === "number") { - this.setHex(value); - } else if (typeof value === "string") { - this.setStyle(value); - } - } else { - this.setRGB(r, g, b); - } - return this; - } - setScalar(scalar) { - this.r = scalar; - this.g = scalar; - this.b = scalar; - return this; - } - setHex(hex, colorSpace = SRGBColorSpace) { - hex = Math.floor(hex); - this.r = (hex >> 16 & 255) / 255; - this.g = (hex >> 8 & 255) / 255; - this.b = (hex & 255) / 255; - ColorManagement.toWorkingColorSpace(this, colorSpace); - return this; - } - setRGB(r, g, b, colorSpace = ColorManagement.workingColorSpace) { - this.r = r; - this.g = g; - this.b = b; - ColorManagement.toWorkingColorSpace(this, colorSpace); - return this; - } - setHSL(h, s, l, colorSpace = ColorManagement.workingColorSpace) { - h = euclideanModulo(h, 1); - s = clamp(s, 0, 1); - l = clamp(l, 0, 1); - if (s === 0) { - this.r = this.g = this.b = l; - } else { - const p = l <= 0.5 ? l * (1 + s) : l + s - l * s; - const q = 2 * l - p; - this.r = hue2rgb(q, p, h + 1 / 3); - this.g = hue2rgb(q, p, h); - this.b = hue2rgb(q, p, h - 1 / 3); - } - ColorManagement.toWorkingColorSpace(this, colorSpace); - return this; - } - setStyle(style, colorSpace = SRGBColorSpace) { - function handleAlpha(string) { - if (string === void 0) return; - if (parseFloat(string) < 1) { - console.warn("THREE.Color: Alpha component of " + style + " will be ignored."); - } - } - __name(handleAlpha, "handleAlpha"); - let m; - if (m = /^(\w+)\(([^\)]*)\)/.exec(style)) { - let color; - const name = m[1]; - const components = m[2]; - switch (name) { - case "rgb": - case "rgba": - if (color = /^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(components)) { - handleAlpha(color[4]); - return this.setRGB( - Math.min(255, parseInt(color[1], 10)) / 255, - Math.min(255, parseInt(color[2], 10)) / 255, - Math.min(255, parseInt(color[3], 10)) / 255, - colorSpace - ); - } - if (color = /^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(components)) { - handleAlpha(color[4]); - return this.setRGB( - Math.min(100, parseInt(color[1], 10)) / 100, - Math.min(100, parseInt(color[2], 10)) / 100, - Math.min(100, parseInt(color[3], 10)) / 100, - colorSpace - ); + }, + getCustomWidgets() { + return { + AUDIO_UI(node, inputName) { + const audio = document.createElement("audio"); + audio.controls = true; + audio.classList.add("comfy-audio"); + audio.setAttribute("name", "media"); + const audioUIWidget = node.addDOMWidget( + inputName, + /* name=*/ + "audioUI", + audio, + { + serialize: false } - break; - case "hsl": - case "hsla": - if (color = /^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(components)) { - handleAlpha(color[4]); - return this.setHSL( - parseFloat(color[1]) / 360, - parseFloat(color[2]) / 100, - parseFloat(color[3]) / 100, - colorSpace + ); + const isOutputNode = node.constructor.nodeData.output_node; + if (isOutputNode) { + audioUIWidget.element.classList.add("empty-audio-widget"); + const onExecuted = node.onExecuted; + node.onExecuted = function(message) { + onExecuted?.apply(this, arguments); + const audios = message.audio; + if (!audios) return; + const audio2 = audios[0]; + audioUIWidget.element.src = api.apiURL( + getResourceURL$1(audio2.subfolder, audio2.filename, audio2.type) ); - } - break; - default: - console.warn("THREE.Color: Unknown color model " + style); + audioUIWidget.element.classList.remove("empty-audio-widget"); + }; + } + return { widget: audioUIWidget }; } - } else if (m = /^\#([A-Fa-f\d]+)$/.exec(style)) { - const hex = m[1]; - const size = hex.length; - if (size === 3) { - return this.setRGB( - parseInt(hex.charAt(0), 16) / 15, - parseInt(hex.charAt(1), 16) / 15, - parseInt(hex.charAt(2), 16) / 15, - colorSpace + }; + }, + onNodeOutputsUpdated(nodeOutputs) { + for (const [nodeId, output] of Object.entries(nodeOutputs)) { + const node = app.graph.getNodeById(nodeId); + if ("audio" in output) { + const audioUIWidget = node.widgets.find( + (w) => w.name === "audioUI" ); - } else if (size === 6) { - return this.setHex(parseInt(hex, 16), colorSpace); - } else { - console.warn("THREE.Color: Invalid hex color " + style); + const audio = output.audio[0]; + audioUIWidget.element.src = api.apiURL( + getResourceURL$1(audio.subfolder, audio.filename, audio.type) + ); + audioUIWidget.element.classList.remove("empty-audio-widget"); } - } else if (style && style.length > 0) { - return this.setColorName(style, colorSpace); } - return this; } - setColorName(style, colorSpace = SRGBColorSpace) { - const hex = _colorKeywords[style.toLowerCase()]; - if (hex !== void 0) { - this.setHex(hex, colorSpace); - } else { - console.warn("THREE.Color: Unknown color " + style); +}); +app.registerExtension({ + name: "Comfy.UploadAudio", + async beforeRegisterNodeDef(nodeType, nodeData) { + if (nodeData?.input?.required?.audio?.[1]?.audio_upload === true) { + nodeData.input.required.upload = ["AUDIOUPLOAD"]; } - return this; + }, + getCustomWidgets() { + return { + AUDIOUPLOAD(node, inputName) { + const audioWidget = node.widgets.find( + (w) => w.name === "audio" + ); + const audioUIWidget = node.widgets.find( + (w) => w.name === "audioUI" + ); + const onAudioWidgetUpdate = /* @__PURE__ */ __name(() => { + audioUIWidget.element.src = api.apiURL( + getResourceURL$1(...splitFilePath$1(audioWidget.value)) + ); + }, "onAudioWidgetUpdate"); + if (audioWidget.value) { + onAudioWidgetUpdate(); + } + audioWidget.callback = onAudioWidgetUpdate; + const onGraphConfigured = node.onGraphConfigured; + node.onGraphConfigured = function() { + onGraphConfigured?.apply(this, arguments); + if (audioWidget.value) { + onAudioWidgetUpdate(); + } + }; + const fileInput = document.createElement("input"); + fileInput.type = "file"; + fileInput.accept = "audio/*"; + fileInput.style.display = "none"; + fileInput.onchange = () => { + if (fileInput.files.length) { + uploadFile$1(audioWidget, audioUIWidget, fileInput.files[0], true); + } + }; + const uploadWidget = node.addWidget( + "button", + inputName, + /* value=*/ + "", + () => { + fileInput.click(); + }, + { serialize: false } + ); + uploadWidget.label = "choose file to upload"; + return { widget: uploadWidget }; + } + }; } - clone() { - return new this.constructor(this.r, this.g, this.b); - } - copy(color) { - this.r = color.r; - this.g = color.g; - this.b = color.b; - return this; - } - copySRGBToLinear(color) { - this.r = SRGBToLinear(color.r); - this.g = SRGBToLinear(color.g); - this.b = SRGBToLinear(color.b); - return this; - } - copyLinearToSRGB(color) { - this.r = LinearToSRGB(color.r); - this.g = LinearToSRGB(color.g); - this.b = LinearToSRGB(color.b); - return this; - } - convertSRGBToLinear() { - this.copySRGBToLinear(this); - return this; - } - convertLinearToSRGB() { - this.copyLinearToSRGB(this); - return this; +}); +(async () => { + if (!isElectron()) return; + const electronAPI$1 = electronAPI(); + const desktopAppVersion = await electronAPI$1.getElectronVersion(); + const onChangeRestartApp = /* @__PURE__ */ __name((newValue, oldValue) => { + if (oldValue !== void 0 && newValue !== oldValue) { + electronAPI$1.restartApp("Restart ComfyUI to apply changes.", 1500); + } + }, "onChangeRestartApp"); + app.registerExtension({ + name: "Comfy.ElectronAdapter", + settings: [ + { + id: "Comfy-Desktop.AutoUpdate", + category: ["Comfy-Desktop", "General", "AutoUpdate"], + name: "Automatically check for updates", + type: "boolean", + defaultValue: true, + onChange: onChangeRestartApp + }, + { + id: "Comfy-Desktop.SendStatistics", + category: ["Comfy-Desktop", "General", "Send Statistics"], + name: "Send anonymous crash reports", + type: "boolean", + defaultValue: true, + onChange: onChangeRestartApp + } + ], + commands: [ + { + id: "Comfy-Desktop.Folders.OpenLogsFolder", + label: "Open Logs Folder", + icon: "pi pi-folder-open", + function() { + electronAPI$1.openLogsFolder(); + } + }, + { + id: "Comfy-Desktop.Folders.OpenModelsFolder", + label: "Open Models Folder", + icon: "pi pi-folder-open", + function() { + electronAPI$1.openModelsFolder(); + } + }, + { + id: "Comfy-Desktop.Folders.OpenOutputsFolder", + label: "Open Outputs Folder", + icon: "pi pi-folder-open", + function() { + electronAPI$1.openOutputsFolder(); + } + }, + { + id: "Comfy-Desktop.Folders.OpenInputsFolder", + label: "Open Inputs Folder", + icon: "pi pi-folder-open", + function() { + electronAPI$1.openInputsFolder(); + } + }, + { + id: "Comfy-Desktop.Folders.OpenCustomNodesFolder", + label: "Open Custom Nodes Folder", + icon: "pi pi-folder-open", + function() { + electronAPI$1.openCustomNodesFolder(); + } + }, + { + id: "Comfy-Desktop.Folders.OpenModelConfig", + label: "Open extra_model_paths.yaml", + icon: "pi pi-file", + function() { + electronAPI$1.openModelConfig(); + } + }, + { + id: "Comfy-Desktop.OpenDevTools", + label: "Open DevTools", + icon: "pi pi-code", + function() { + electronAPI$1.openDevTools(); + } + }, + { + id: "Comfy-Desktop.OpenFeedbackPage", + label: "Feedback", + icon: "pi pi-envelope", + function() { + window.open("https://forum.comfy.org/c/v1-feedback/", "_blank"); + } + }, + { + id: "Comfy-Desktop.OpenUserGuide", + label: "Desktop User Guide", + icon: "pi pi-book", + function() { + window.open("https://comfyorg.notion.site/", "_blank"); + } + }, + { + id: "Comfy-Desktop.Reinstall", + label: "Reinstall", + icon: "pi pi-refresh", + async function() { + const proceed = await useDialogService().showConfirmationDialog({ + message: t("desktopMenu.confirmReinstall"), + title: t("desktopMenu.reinstall"), + type: "reinstall" + }); + if (proceed) electronAPI$1.reinstall(); + } + }, + { + id: "Comfy-Desktop.Restart", + label: "Restart", + icon: "pi pi-refresh", + function() { + electronAPI$1.restartApp(); + } + } + ], + menuCommands: [ + { + path: ["Help"], + commands: [ + "Comfy-Desktop.OpenUserGuide", + "Comfy-Desktop.OpenFeedbackPage" + ] + }, + { + path: ["Help"], + commands: ["Comfy-Desktop.OpenDevTools"] + }, + { + path: ["Help", "Open Folder"], + commands: [ + "Comfy-Desktop.Folders.OpenLogsFolder", + "Comfy-Desktop.Folders.OpenModelsFolder", + "Comfy-Desktop.Folders.OpenOutputsFolder", + "Comfy-Desktop.Folders.OpenInputsFolder", + "Comfy-Desktop.Folders.OpenCustomNodesFolder", + "Comfy-Desktop.Folders.OpenModelConfig" + ] + }, + { + path: ["Help"], + commands: ["Comfy-Desktop.Reinstall"] + } + ], + aboutPageBadges: [ + { + label: "ComfyUI_desktop v" + desktopAppVersion, + url: "https://github.com/Comfy-Org/electron", + icon: "pi pi-github" + } + ] + }); +})(); +/** + * @license + * Copyright 2010-2024 Three.js Authors + * SPDX-License-Identifier: MIT + */ +const REVISION = "170"; +const MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 }; +const TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 }; +const CullFaceNone = 0; +const CullFaceBack = 1; +const CullFaceFront = 2; +const CullFaceFrontBack = 3; +const BasicShadowMap = 0; +const PCFShadowMap = 1; +const PCFSoftShadowMap = 2; +const VSMShadowMap = 3; +const FrontSide = 0; +const BackSide = 1; +const DoubleSide = 2; +const NoBlending = 0; +const NormalBlending = 1; +const AdditiveBlending = 2; +const SubtractiveBlending = 3; +const MultiplyBlending = 4; +const CustomBlending = 5; +const AddEquation = 100; +const SubtractEquation = 101; +const ReverseSubtractEquation = 102; +const MinEquation = 103; +const MaxEquation = 104; +const ZeroFactor = 200; +const OneFactor = 201; +const SrcColorFactor = 202; +const OneMinusSrcColorFactor = 203; +const SrcAlphaFactor = 204; +const OneMinusSrcAlphaFactor = 205; +const DstAlphaFactor = 206; +const OneMinusDstAlphaFactor = 207; +const DstColorFactor = 208; +const OneMinusDstColorFactor = 209; +const SrcAlphaSaturateFactor = 210; +const ConstantColorFactor = 211; +const OneMinusConstantColorFactor = 212; +const ConstantAlphaFactor = 213; +const OneMinusConstantAlphaFactor = 214; +const NeverDepth = 0; +const AlwaysDepth = 1; +const LessDepth = 2; +const LessEqualDepth = 3; +const EqualDepth = 4; +const GreaterEqualDepth = 5; +const GreaterDepth = 6; +const NotEqualDepth = 7; +const MultiplyOperation = 0; +const MixOperation = 1; +const AddOperation = 2; +const NoToneMapping = 0; +const LinearToneMapping = 1; +const ReinhardToneMapping = 2; +const CineonToneMapping = 3; +const ACESFilmicToneMapping = 4; +const CustomToneMapping = 5; +const AgXToneMapping = 6; +const NeutralToneMapping = 7; +const AttachedBindMode = "attached"; +const DetachedBindMode = "detached"; +const UVMapping = 300; +const CubeReflectionMapping = 301; +const CubeRefractionMapping = 302; +const EquirectangularReflectionMapping = 303; +const EquirectangularRefractionMapping = 304; +const CubeUVReflectionMapping = 306; +const RepeatWrapping = 1e3; +const ClampToEdgeWrapping = 1001; +const MirroredRepeatWrapping = 1002; +const NearestFilter = 1003; +const NearestMipmapNearestFilter = 1004; +const NearestMipMapNearestFilter = 1004; +const NearestMipmapLinearFilter = 1005; +const NearestMipMapLinearFilter = 1005; +const LinearFilter = 1006; +const LinearMipmapNearestFilter = 1007; +const LinearMipMapNearestFilter = 1007; +const LinearMipmapLinearFilter = 1008; +const LinearMipMapLinearFilter = 1008; +const UnsignedByteType = 1009; +const ByteType = 1010; +const ShortType = 1011; +const UnsignedShortType = 1012; +const IntType = 1013; +const UnsignedIntType = 1014; +const FloatType = 1015; +const HalfFloatType = 1016; +const UnsignedShort4444Type = 1017; +const UnsignedShort5551Type = 1018; +const UnsignedInt248Type = 1020; +const UnsignedInt5999Type = 35902; +const AlphaFormat = 1021; +const RGBFormat = 1022; +const RGBAFormat = 1023; +const LuminanceFormat = 1024; +const LuminanceAlphaFormat = 1025; +const DepthFormat = 1026; +const DepthStencilFormat = 1027; +const RedFormat = 1028; +const RedIntegerFormat = 1029; +const RGFormat = 1030; +const RGIntegerFormat = 1031; +const RGBIntegerFormat = 1032; +const RGBAIntegerFormat = 1033; +const RGB_S3TC_DXT1_Format = 33776; +const RGBA_S3TC_DXT1_Format = 33777; +const RGBA_S3TC_DXT3_Format = 33778; +const RGBA_S3TC_DXT5_Format = 33779; +const RGB_PVRTC_4BPPV1_Format = 35840; +const RGB_PVRTC_2BPPV1_Format = 35841; +const RGBA_PVRTC_4BPPV1_Format = 35842; +const RGBA_PVRTC_2BPPV1_Format = 35843; +const RGB_ETC1_Format = 36196; +const RGB_ETC2_Format = 37492; +const RGBA_ETC2_EAC_Format = 37496; +const RGBA_ASTC_4x4_Format = 37808; +const RGBA_ASTC_5x4_Format = 37809; +const RGBA_ASTC_5x5_Format = 37810; +const RGBA_ASTC_6x5_Format = 37811; +const RGBA_ASTC_6x6_Format = 37812; +const RGBA_ASTC_8x5_Format = 37813; +const RGBA_ASTC_8x6_Format = 37814; +const RGBA_ASTC_8x8_Format = 37815; +const RGBA_ASTC_10x5_Format = 37816; +const RGBA_ASTC_10x6_Format = 37817; +const RGBA_ASTC_10x8_Format = 37818; +const RGBA_ASTC_10x10_Format = 37819; +const RGBA_ASTC_12x10_Format = 37820; +const RGBA_ASTC_12x12_Format = 37821; +const RGBA_BPTC_Format = 36492; +const RGB_BPTC_SIGNED_Format = 36494; +const RGB_BPTC_UNSIGNED_Format = 36495; +const RED_RGTC1_Format = 36283; +const SIGNED_RED_RGTC1_Format = 36284; +const RED_GREEN_RGTC2_Format = 36285; +const SIGNED_RED_GREEN_RGTC2_Format = 36286; +const LoopOnce = 2200; +const LoopRepeat = 2201; +const LoopPingPong = 2202; +const InterpolateDiscrete = 2300; +const InterpolateLinear = 2301; +const InterpolateSmooth = 2302; +const ZeroCurvatureEnding = 2400; +const ZeroSlopeEnding = 2401; +const WrapAroundEnding = 2402; +const NormalAnimationBlendMode = 2500; +const AdditiveAnimationBlendMode = 2501; +const TrianglesDrawMode = 0; +const TriangleStripDrawMode = 1; +const TriangleFanDrawMode = 2; +const BasicDepthPacking = 3200; +const RGBADepthPacking = 3201; +const RGBDepthPacking = 3202; +const RGDepthPacking = 3203; +const TangentSpaceNormalMap = 0; +const ObjectSpaceNormalMap = 1; +const NoColorSpace = ""; +const SRGBColorSpace = "srgb"; +const LinearSRGBColorSpace = "srgb-linear"; +const LinearTransfer = "linear"; +const SRGBTransfer = "srgb"; +const ZeroStencilOp = 0; +const KeepStencilOp = 7680; +const ReplaceStencilOp = 7681; +const IncrementStencilOp = 7682; +const DecrementStencilOp = 7683; +const IncrementWrapStencilOp = 34055; +const DecrementWrapStencilOp = 34056; +const InvertStencilOp = 5386; +const NeverStencilFunc = 512; +const LessStencilFunc = 513; +const EqualStencilFunc = 514; +const LessEqualStencilFunc = 515; +const GreaterStencilFunc = 516; +const NotEqualStencilFunc = 517; +const GreaterEqualStencilFunc = 518; +const AlwaysStencilFunc = 519; +const NeverCompare = 512; +const LessCompare = 513; +const EqualCompare = 514; +const LessEqualCompare = 515; +const GreaterCompare = 516; +const NotEqualCompare = 517; +const GreaterEqualCompare = 518; +const AlwaysCompare = 519; +const StaticDrawUsage = 35044; +const DynamicDrawUsage = 35048; +const StreamDrawUsage = 35040; +const StaticReadUsage = 35045; +const DynamicReadUsage = 35049; +const StreamReadUsage = 35041; +const StaticCopyUsage = 35046; +const DynamicCopyUsage = 35050; +const StreamCopyUsage = 35042; +const GLSL1 = "100"; +const GLSL3 = "300 es"; +const WebGLCoordinateSystem = 2e3; +const WebGPUCoordinateSystem = 2001; +class EventDispatcher { + static { + __name(this, "EventDispatcher"); } - getHex(colorSpace = SRGBColorSpace) { - ColorManagement.fromWorkingColorSpace(_color$1.copy(this), colorSpace); - return Math.round(clamp(_color$1.r * 255, 0, 255)) * 65536 + Math.round(clamp(_color$1.g * 255, 0, 255)) * 256 + Math.round(clamp(_color$1.b * 255, 0, 255)); + addEventListener(type, listener) { + if (this._listeners === void 0) this._listeners = {}; + const listeners = this._listeners; + if (listeners[type] === void 0) { + listeners[type] = []; + } + if (listeners[type].indexOf(listener) === -1) { + listeners[type].push(listener); + } } - getHexString(colorSpace = SRGBColorSpace) { - return ("000000" + this.getHex(colorSpace).toString(16)).slice(-6); + hasEventListener(type, listener) { + if (this._listeners === void 0) return false; + const listeners = this._listeners; + return listeners[type] !== void 0 && listeners[type].indexOf(listener) !== -1; } - getHSL(target, colorSpace = ColorManagement.workingColorSpace) { - ColorManagement.fromWorkingColorSpace(_color$1.copy(this), colorSpace); - const r = _color$1.r, g = _color$1.g, b = _color$1.b; - const max2 = Math.max(r, g, b); - const min = Math.min(r, g, b); - let hue, saturation; - const lightness = (min + max2) / 2; - if (min === max2) { - hue = 0; - saturation = 0; - } else { - const delta = max2 - min; - saturation = lightness <= 0.5 ? delta / (max2 + min) : delta / (2 - max2 - min); - switch (max2) { - case r: - hue = (g - b) / delta + (g < b ? 6 : 0); - break; - case g: - hue = (b - r) / delta + 2; - break; - case b: - hue = (r - g) / delta + 4; - break; + removeEventListener(type, listener) { + if (this._listeners === void 0) return; + const listeners = this._listeners; + const listenerArray = listeners[type]; + if (listenerArray !== void 0) { + const index = listenerArray.indexOf(listener); + if (index !== -1) { + listenerArray.splice(index, 1); } - hue /= 6; } - target.h = hue; - target.s = saturation; - target.l = lightness; - return target; } - getRGB(target, colorSpace = ColorManagement.workingColorSpace) { - ColorManagement.fromWorkingColorSpace(_color$1.copy(this), colorSpace); - target.r = _color$1.r; - target.g = _color$1.g; - target.b = _color$1.b; - return target; - } - getStyle(colorSpace = SRGBColorSpace) { - ColorManagement.fromWorkingColorSpace(_color$1.copy(this), colorSpace); - const r = _color$1.r, g = _color$1.g, b = _color$1.b; - if (colorSpace !== SRGBColorSpace) { - return `color(${colorSpace} ${r.toFixed(3)} ${g.toFixed(3)} ${b.toFixed(3)})`; + dispatchEvent(event) { + if (this._listeners === void 0) return; + const listeners = this._listeners; + const listenerArray = listeners[event.type]; + if (listenerArray !== void 0) { + event.target = this; + const array = listenerArray.slice(0); + for (let i = 0, l = array.length; i < l; i++) { + array[i].call(this, event); + } + event.target = null; } - return `rgb(${Math.round(r * 255)},${Math.round(g * 255)},${Math.round(b * 255)})`; } - offsetHSL(h, s, l) { - this.getHSL(_hslA); - return this.setHSL(_hslA.h + h, _hslA.s + s, _hslA.l + l); - } - add(color) { - this.r += color.r; - this.g += color.g; - this.b += color.b; - return this; +} +const _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"]; +let _seed = 1234567; +const DEG2RAD = Math.PI / 180; +const RAD2DEG = 180 / Math.PI; +function generateUUID() { + const d0 = Math.random() * 4294967295 | 0; + const d1 = Math.random() * 4294967295 | 0; + const d2 = Math.random() * 4294967295 | 0; + const d3 = Math.random() * 4294967295 | 0; + const uuid = _lut[d0 & 255] + _lut[d0 >> 8 & 255] + _lut[d0 >> 16 & 255] + _lut[d0 >> 24 & 255] + "-" + _lut[d1 & 255] + _lut[d1 >> 8 & 255] + "-" + _lut[d1 >> 16 & 15 | 64] + _lut[d1 >> 24 & 255] + "-" + _lut[d2 & 63 | 128] + _lut[d2 >> 8 & 255] + "-" + _lut[d2 >> 16 & 255] + _lut[d2 >> 24 & 255] + _lut[d3 & 255] + _lut[d3 >> 8 & 255] + _lut[d3 >> 16 & 255] + _lut[d3 >> 24 & 255]; + return uuid.toLowerCase(); +} +__name(generateUUID, "generateUUID"); +function clamp(value, min, max2) { + return Math.max(min, Math.min(max2, value)); +} +__name(clamp, "clamp"); +function euclideanModulo(n, m) { + return (n % m + m) % m; +} +__name(euclideanModulo, "euclideanModulo"); +function mapLinear(x, a1, a2, b1, b22) { + return b1 + (x - a1) * (b22 - b1) / (a2 - a1); +} +__name(mapLinear, "mapLinear"); +function inverseLerp(x, y, value) { + if (x !== y) { + return (value - x) / (y - x); + } else { + return 0; } - addColors(color1, color2) { - this.r = color1.r + color2.r; - this.g = color1.g + color2.g; - this.b = color1.b + color2.b; +} +__name(inverseLerp, "inverseLerp"); +function lerp(x, y, t2) { + return (1 - t2) * x + t2 * y; +} +__name(lerp, "lerp"); +function damp(x, y, lambda, dt) { + return lerp(x, y, 1 - Math.exp(-lambda * dt)); +} +__name(damp, "damp"); +function pingpong(x, length = 1) { + return length - Math.abs(euclideanModulo(x, length * 2) - length); +} +__name(pingpong, "pingpong"); +function smoothstep(x, min, max2) { + if (x <= min) return 0; + if (x >= max2) return 1; + x = (x - min) / (max2 - min); + return x * x * (3 - 2 * x); +} +__name(smoothstep, "smoothstep"); +function smootherstep(x, min, max2) { + if (x <= min) return 0; + if (x >= max2) return 1; + x = (x - min) / (max2 - min); + return x * x * x * (x * (x * 6 - 15) + 10); +} +__name(smootherstep, "smootherstep"); +function randInt(low, high) { + return low + Math.floor(Math.random() * (high - low + 1)); +} +__name(randInt, "randInt"); +function randFloat(low, high) { + return low + Math.random() * (high - low); +} +__name(randFloat, "randFloat"); +function randFloatSpread(range) { + return range * (0.5 - Math.random()); +} +__name(randFloatSpread, "randFloatSpread"); +function seededRandom(s) { + if (s !== void 0) _seed = s; + let t2 = _seed += 1831565813; + t2 = Math.imul(t2 ^ t2 >>> 15, t2 | 1); + t2 ^= t2 + Math.imul(t2 ^ t2 >>> 7, t2 | 61); + return ((t2 ^ t2 >>> 14) >>> 0) / 4294967296; +} +__name(seededRandom, "seededRandom"); +function degToRad(degrees) { + return degrees * DEG2RAD; +} +__name(degToRad, "degToRad"); +function radToDeg(radians) { + return radians * RAD2DEG; +} +__name(radToDeg, "radToDeg"); +function isPowerOfTwo(value) { + return (value & value - 1) === 0 && value !== 0; +} +__name(isPowerOfTwo, "isPowerOfTwo"); +function ceilPowerOfTwo(value) { + return Math.pow(2, Math.ceil(Math.log(value) / Math.LN2)); +} +__name(ceilPowerOfTwo, "ceilPowerOfTwo"); +function floorPowerOfTwo(value) { + return Math.pow(2, Math.floor(Math.log(value) / Math.LN2)); +} +__name(floorPowerOfTwo, "floorPowerOfTwo"); +function setQuaternionFromProperEuler(q, a, b, c, order) { + const cos = Math.cos; + const sin = Math.sin; + const c2 = cos(b / 2); + const s2 = sin(b / 2); + const c13 = cos((a + c) / 2); + const s13 = sin((a + c) / 2); + const c1_3 = cos((a - c) / 2); + const s1_3 = sin((a - c) / 2); + const c3_1 = cos((c - a) / 2); + const s3_1 = sin((c - a) / 2); + switch (order) { + case "XYX": + q.set(c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13); + break; + case "YZY": + q.set(s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13); + break; + case "ZXZ": + q.set(s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13); + break; + case "XZX": + q.set(c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13); + break; + case "YXY": + q.set(s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13); + break; + case "ZYZ": + q.set(s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13); + break; + default: + console.warn("THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: " + order); + } +} +__name(setQuaternionFromProperEuler, "setQuaternionFromProperEuler"); +function denormalize(value, array) { + switch (array.constructor) { + case Float32Array: + return value; + case Uint32Array: + return value / 4294967295; + case Uint16Array: + return value / 65535; + case Uint8Array: + return value / 255; + case Int32Array: + return Math.max(value / 2147483647, -1); + case Int16Array: + return Math.max(value / 32767, -1); + case Int8Array: + return Math.max(value / 127, -1); + default: + throw new Error("Invalid component type."); + } +} +__name(denormalize, "denormalize"); +function normalize(value, array) { + switch (array.constructor) { + case Float32Array: + return value; + case Uint32Array: + return Math.round(value * 4294967295); + case Uint16Array: + return Math.round(value * 65535); + case Uint8Array: + return Math.round(value * 255); + case Int32Array: + return Math.round(value * 2147483647); + case Int16Array: + return Math.round(value * 32767); + case Int8Array: + return Math.round(value * 127); + default: + throw new Error("Invalid component type."); + } +} +__name(normalize, "normalize"); +const MathUtils = { + DEG2RAD, + RAD2DEG, + generateUUID, + clamp, + euclideanModulo, + mapLinear, + inverseLerp, + lerp, + damp, + pingpong, + smoothstep, + smootherstep, + randInt, + randFloat, + randFloatSpread, + seededRandom, + degToRad, + radToDeg, + isPowerOfTwo, + ceilPowerOfTwo, + floorPowerOfTwo, + setQuaternionFromProperEuler, + normalize, + denormalize +}; +class Vector2 { + static { + __name(this, "Vector2"); + } + constructor(x = 0, y = 0) { + Vector2.prototype.isVector2 = true; + this.x = x; + this.y = y; + } + get width() { + return this.x; + } + set width(value) { + this.x = value; + } + get height() { + return this.y; + } + set height(value) { + this.y = value; + } + set(x, y) { + this.x = x; + this.y = y; + return this; + } + setScalar(scalar) { + this.x = scalar; + this.y = scalar; + return this; + } + setX(x) { + this.x = x; + return this; + } + setY(y) { + this.y = y; + return this; + } + setComponent(index, value) { + switch (index) { + case 0: + this.x = value; + break; + case 1: + this.y = value; + break; + default: + throw new Error("index is out of range: " + index); + } + return this; + } + getComponent(index) { + switch (index) { + case 0: + return this.x; + case 1: + return this.y; + default: + throw new Error("index is out of range: " + index); + } + } + clone() { + return new this.constructor(this.x, this.y); + } + copy(v) { + this.x = v.x; + this.y = v.y; + return this; + } + add(v) { + this.x += v.x; + this.y += v.y; return this; } addScalar(s) { - this.r += s; - this.g += s; - this.b += s; + this.x += s; + this.y += s; return this; } - sub(color) { - this.r = Math.max(0, this.r - color.r); - this.g = Math.max(0, this.g - color.g); - this.b = Math.max(0, this.b - color.b); + addVectors(a, b) { + this.x = a.x + b.x; + this.y = a.y + b.y; return this; } - multiply(color) { - this.r *= color.r; - this.g *= color.g; - this.b *= color.b; + addScaledVector(v, s) { + this.x += v.x * s; + this.y += v.y * s; return this; } - multiplyScalar(s) { - this.r *= s; - this.g *= s; - this.b *= s; + sub(v) { + this.x -= v.x; + this.y -= v.y; return this; } - lerp(color, alpha) { - this.r += (color.r - this.r) * alpha; - this.g += (color.g - this.g) * alpha; - this.b += (color.b - this.b) * alpha; + subScalar(s) { + this.x -= s; + this.y -= s; return this; } - lerpColors(color1, color2, alpha) { - this.r = color1.r + (color2.r - color1.r) * alpha; - this.g = color1.g + (color2.g - color1.g) * alpha; - this.b = color1.b + (color2.b - color1.b) * alpha; + subVectors(a, b) { + this.x = a.x - b.x; + this.y = a.y - b.y; return this; } - lerpHSL(color, alpha) { - this.getHSL(_hslA); - color.getHSL(_hslB); - const h = lerp(_hslA.h, _hslB.h, alpha); - const s = lerp(_hslA.s, _hslB.s, alpha); - const l = lerp(_hslA.l, _hslB.l, alpha); - this.setHSL(h, s, l); + multiply(v) { + this.x *= v.x; + this.y *= v.y; return this; } - setFromVector3(v) { - this.r = v.x; - this.g = v.y; - this.b = v.z; + multiplyScalar(scalar) { + this.x *= scalar; + this.y *= scalar; + return this; + } + divide(v) { + this.x /= v.x; + this.y /= v.y; return this; } + divideScalar(scalar) { + return this.multiplyScalar(1 / scalar); + } applyMatrix3(m) { - const r = this.r, g = this.g, b = this.b; + const x = this.x, y = this.y; const e = m.elements; - this.r = e[0] * r + e[3] * g + e[6] * b; - this.g = e[1] * r + e[4] * g + e[7] * b; - this.b = e[2] * r + e[5] * g + e[8] * b; + this.x = e[0] * x + e[3] * y + e[6]; + this.y = e[1] * x + e[4] * y + e[7]; return this; } - equals(c) { - return c.r === this.r && c.g === this.g && c.b === this.b; + min(v) { + this.x = Math.min(this.x, v.x); + this.y = Math.min(this.y, v.y); + return this; } - fromArray(array, offset = 0) { - this.r = array[offset]; - this.g = array[offset + 1]; - this.b = array[offset + 2]; + max(v) { + this.x = Math.max(this.x, v.x); + this.y = Math.max(this.y, v.y); return this; } - toArray(array = [], offset = 0) { - array[offset] = this.r; - array[offset + 1] = this.g; - array[offset + 2] = this.b; - return array; + clamp(min, max2) { + this.x = Math.max(min.x, Math.min(max2.x, this.x)); + this.y = Math.max(min.y, Math.min(max2.y, this.y)); + return this; } - fromBufferAttribute(attribute, index) { - this.r = attribute.getX(index); - this.g = attribute.getY(index); - this.b = attribute.getZ(index); + clampScalar(minVal, maxVal) { + this.x = Math.max(minVal, Math.min(maxVal, this.x)); + this.y = Math.max(minVal, Math.min(maxVal, this.y)); return this; } - toJSON() { - return this.getHex(); + clampLength(min, max2) { + const length = this.length(); + return this.divideScalar(length || 1).multiplyScalar(Math.max(min, Math.min(max2, length))); } - *[Symbol.iterator]() { - yield this.r; - yield this.g; - yield this.b; + floor() { + this.x = Math.floor(this.x); + this.y = Math.floor(this.y); + return this; } -} -const _color$1 = /* @__PURE__ */ new Color(); -Color.NAMES = _colorKeywords; -let _materialId = 0; -class Material extends EventDispatcher { - static { - __name(this, "Material"); + ceil() { + this.x = Math.ceil(this.x); + this.y = Math.ceil(this.y); + return this; } - static get type() { - return "Material"; + round() { + this.x = Math.round(this.x); + this.y = Math.round(this.y); + return this; } - get type() { - return this.constructor.type; + roundToZero() { + this.x = Math.trunc(this.x); + this.y = Math.trunc(this.y); + return this; } - set type(_value) { + negate() { + this.x = -this.x; + this.y = -this.y; + return this; } - constructor() { - super(); - this.isMaterial = true; - Object.defineProperty(this, "id", { value: _materialId++ }); - this.uuid = generateUUID(); - this.name = ""; - this.blending = NormalBlending; - this.side = FrontSide; - this.vertexColors = false; - this.opacity = 1; - this.transparent = false; - this.alphaHash = false; - this.blendSrc = SrcAlphaFactor; - this.blendDst = OneMinusSrcAlphaFactor; - this.blendEquation = AddEquation; - this.blendSrcAlpha = null; - this.blendDstAlpha = null; - this.blendEquationAlpha = null; - this.blendColor = new Color(0, 0, 0); - this.blendAlpha = 0; - this.depthFunc = LessEqualDepth; - this.depthTest = true; - this.depthWrite = true; - this.stencilWriteMask = 255; - this.stencilFunc = AlwaysStencilFunc; - this.stencilRef = 0; - this.stencilFuncMask = 255; - this.stencilFail = KeepStencilOp; - this.stencilZFail = KeepStencilOp; - this.stencilZPass = KeepStencilOp; - this.stencilWrite = false; - this.clippingPlanes = null; - this.clipIntersection = false; - this.clipShadows = false; - this.shadowSide = null; - this.colorWrite = true; - this.precision = null; - this.polygonOffset = false; - this.polygonOffsetFactor = 0; - this.polygonOffsetUnits = 0; - this.dithering = false; - this.alphaToCoverage = false; - this.premultipliedAlpha = false; - this.forceSinglePass = false; - this.visible = true; - this.toneMapped = true; - this.userData = {}; - this.version = 0; - this._alphaTest = 0; + dot(v) { + return this.x * v.x + this.y * v.y; } - get alphaTest() { - return this._alphaTest; + cross(v) { + return this.x * v.y - this.y * v.x; } - set alphaTest(value) { - if (this._alphaTest > 0 !== value > 0) { - this.version++; - } - this._alphaTest = value; + lengthSq() { + return this.x * this.x + this.y * this.y; } - // onBeforeRender and onBeforeCompile only supported in WebGLRenderer - onBeforeRender() { + length() { + return Math.sqrt(this.x * this.x + this.y * this.y); } - onBeforeCompile() { + manhattanLength() { + return Math.abs(this.x) + Math.abs(this.y); } - customProgramCacheKey() { - return this.onBeforeCompile.toString(); + normalize() { + return this.divideScalar(this.length() || 1); } - setValues(values) { - if (values === void 0) return; - for (const key in values) { - const newValue = values[key]; - if (newValue === void 0) { - console.warn(`THREE.Material: parameter '${key}' has value of undefined.`); - continue; - } - const currentValue = this[key]; - if (currentValue === void 0) { - console.warn(`THREE.Material: '${key}' is not a property of THREE.${this.type}.`); - continue; - } - if (currentValue && currentValue.isColor) { - currentValue.set(newValue); - } else if (currentValue && currentValue.isVector3 && (newValue && newValue.isVector3)) { - currentValue.copy(newValue); - } else { - this[key] = newValue; - } - } + angle() { + const angle = Math.atan2(-this.y, -this.x) + Math.PI; + return angle; } - toJSON(meta) { - const isRootObject = meta === void 0 || typeof meta === "string"; - if (isRootObject) { - meta = { - textures: {}, - images: {} - }; - } - const data = { - metadata: { - version: 4.6, - type: "Material", - generator: "Material.toJSON" - } - }; - data.uuid = this.uuid; - data.type = this.type; - if (this.name !== "") data.name = this.name; - if (this.color && this.color.isColor) data.color = this.color.getHex(); - if (this.roughness !== void 0) data.roughness = this.roughness; - if (this.metalness !== void 0) data.metalness = this.metalness; - if (this.sheen !== void 0) data.sheen = this.sheen; - if (this.sheenColor && this.sheenColor.isColor) data.sheenColor = this.sheenColor.getHex(); - if (this.sheenRoughness !== void 0) data.sheenRoughness = this.sheenRoughness; - if (this.emissive && this.emissive.isColor) data.emissive = this.emissive.getHex(); - if (this.emissiveIntensity !== void 0 && this.emissiveIntensity !== 1) data.emissiveIntensity = this.emissiveIntensity; - if (this.specular && this.specular.isColor) data.specular = this.specular.getHex(); - if (this.specularIntensity !== void 0) data.specularIntensity = this.specularIntensity; - if (this.specularColor && this.specularColor.isColor) data.specularColor = this.specularColor.getHex(); - if (this.shininess !== void 0) data.shininess = this.shininess; - if (this.clearcoat !== void 0) data.clearcoat = this.clearcoat; - if (this.clearcoatRoughness !== void 0) data.clearcoatRoughness = this.clearcoatRoughness; - if (this.clearcoatMap && this.clearcoatMap.isTexture) { - data.clearcoatMap = this.clearcoatMap.toJSON(meta).uuid; - } - if (this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture) { - data.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON(meta).uuid; - } - if (this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture) { - data.clearcoatNormalMap = this.clearcoatNormalMap.toJSON(meta).uuid; - data.clearcoatNormalScale = this.clearcoatNormalScale.toArray(); - } - if (this.dispersion !== void 0) data.dispersion = this.dispersion; - if (this.iridescence !== void 0) data.iridescence = this.iridescence; - if (this.iridescenceIOR !== void 0) data.iridescenceIOR = this.iridescenceIOR; - if (this.iridescenceThicknessRange !== void 0) data.iridescenceThicknessRange = this.iridescenceThicknessRange; - if (this.iridescenceMap && this.iridescenceMap.isTexture) { - data.iridescenceMap = this.iridescenceMap.toJSON(meta).uuid; - } - if (this.iridescenceThicknessMap && this.iridescenceThicknessMap.isTexture) { - data.iridescenceThicknessMap = this.iridescenceThicknessMap.toJSON(meta).uuid; - } - if (this.anisotropy !== void 0) data.anisotropy = this.anisotropy; - if (this.anisotropyRotation !== void 0) data.anisotropyRotation = this.anisotropyRotation; - if (this.anisotropyMap && this.anisotropyMap.isTexture) { - data.anisotropyMap = this.anisotropyMap.toJSON(meta).uuid; - } - if (this.map && this.map.isTexture) data.map = this.map.toJSON(meta).uuid; - if (this.matcap && this.matcap.isTexture) data.matcap = this.matcap.toJSON(meta).uuid; - if (this.alphaMap && this.alphaMap.isTexture) data.alphaMap = this.alphaMap.toJSON(meta).uuid; - if (this.lightMap && this.lightMap.isTexture) { - data.lightMap = this.lightMap.toJSON(meta).uuid; - data.lightMapIntensity = this.lightMapIntensity; - } - if (this.aoMap && this.aoMap.isTexture) { - data.aoMap = this.aoMap.toJSON(meta).uuid; - data.aoMapIntensity = this.aoMapIntensity; - } - if (this.bumpMap && this.bumpMap.isTexture) { - data.bumpMap = this.bumpMap.toJSON(meta).uuid; - data.bumpScale = this.bumpScale; - } - if (this.normalMap && this.normalMap.isTexture) { - data.normalMap = this.normalMap.toJSON(meta).uuid; - data.normalMapType = this.normalMapType; - data.normalScale = this.normalScale.toArray(); - } - if (this.displacementMap && this.displacementMap.isTexture) { - data.displacementMap = this.displacementMap.toJSON(meta).uuid; - data.displacementScale = this.displacementScale; - data.displacementBias = this.displacementBias; - } - if (this.roughnessMap && this.roughnessMap.isTexture) data.roughnessMap = this.roughnessMap.toJSON(meta).uuid; - if (this.metalnessMap && this.metalnessMap.isTexture) data.metalnessMap = this.metalnessMap.toJSON(meta).uuid; - if (this.emissiveMap && this.emissiveMap.isTexture) data.emissiveMap = this.emissiveMap.toJSON(meta).uuid; - if (this.specularMap && this.specularMap.isTexture) data.specularMap = this.specularMap.toJSON(meta).uuid; - if (this.specularIntensityMap && this.specularIntensityMap.isTexture) data.specularIntensityMap = this.specularIntensityMap.toJSON(meta).uuid; - if (this.specularColorMap && this.specularColorMap.isTexture) data.specularColorMap = this.specularColorMap.toJSON(meta).uuid; - if (this.envMap && this.envMap.isTexture) { - data.envMap = this.envMap.toJSON(meta).uuid; - if (this.combine !== void 0) data.combine = this.combine; - } - if (this.envMapRotation !== void 0) data.envMapRotation = this.envMapRotation.toArray(); - if (this.envMapIntensity !== void 0) data.envMapIntensity = this.envMapIntensity; - if (this.reflectivity !== void 0) data.reflectivity = this.reflectivity; - if (this.refractionRatio !== void 0) data.refractionRatio = this.refractionRatio; - if (this.gradientMap && this.gradientMap.isTexture) { - data.gradientMap = this.gradientMap.toJSON(meta).uuid; - } - if (this.transmission !== void 0) data.transmission = this.transmission; - if (this.transmissionMap && this.transmissionMap.isTexture) data.transmissionMap = this.transmissionMap.toJSON(meta).uuid; - if (this.thickness !== void 0) data.thickness = this.thickness; - if (this.thicknessMap && this.thicknessMap.isTexture) data.thicknessMap = this.thicknessMap.toJSON(meta).uuid; - if (this.attenuationDistance !== void 0 && this.attenuationDistance !== Infinity) data.attenuationDistance = this.attenuationDistance; - if (this.attenuationColor !== void 0) data.attenuationColor = this.attenuationColor.getHex(); - if (this.size !== void 0) data.size = this.size; - if (this.shadowSide !== null) data.shadowSide = this.shadowSide; - if (this.sizeAttenuation !== void 0) data.sizeAttenuation = this.sizeAttenuation; - if (this.blending !== NormalBlending) data.blending = this.blending; - if (this.side !== FrontSide) data.side = this.side; - if (this.vertexColors === true) data.vertexColors = true; - if (this.opacity < 1) data.opacity = this.opacity; - if (this.transparent === true) data.transparent = true; - if (this.blendSrc !== SrcAlphaFactor) data.blendSrc = this.blendSrc; - if (this.blendDst !== OneMinusSrcAlphaFactor) data.blendDst = this.blendDst; - if (this.blendEquation !== AddEquation) data.blendEquation = this.blendEquation; - if (this.blendSrcAlpha !== null) data.blendSrcAlpha = this.blendSrcAlpha; - if (this.blendDstAlpha !== null) data.blendDstAlpha = this.blendDstAlpha; - if (this.blendEquationAlpha !== null) data.blendEquationAlpha = this.blendEquationAlpha; - if (this.blendColor && this.blendColor.isColor) data.blendColor = this.blendColor.getHex(); - if (this.blendAlpha !== 0) data.blendAlpha = this.blendAlpha; - if (this.depthFunc !== LessEqualDepth) data.depthFunc = this.depthFunc; - if (this.depthTest === false) data.depthTest = this.depthTest; - if (this.depthWrite === false) data.depthWrite = this.depthWrite; - if (this.colorWrite === false) data.colorWrite = this.colorWrite; - if (this.stencilWriteMask !== 255) data.stencilWriteMask = this.stencilWriteMask; - if (this.stencilFunc !== AlwaysStencilFunc) data.stencilFunc = this.stencilFunc; - if (this.stencilRef !== 0) data.stencilRef = this.stencilRef; - if (this.stencilFuncMask !== 255) data.stencilFuncMask = this.stencilFuncMask; - if (this.stencilFail !== KeepStencilOp) data.stencilFail = this.stencilFail; - if (this.stencilZFail !== KeepStencilOp) data.stencilZFail = this.stencilZFail; - if (this.stencilZPass !== KeepStencilOp) data.stencilZPass = this.stencilZPass; - if (this.stencilWrite === true) data.stencilWrite = this.stencilWrite; - if (this.rotation !== void 0 && this.rotation !== 0) data.rotation = this.rotation; - if (this.polygonOffset === true) data.polygonOffset = true; - if (this.polygonOffsetFactor !== 0) data.polygonOffsetFactor = this.polygonOffsetFactor; - if (this.polygonOffsetUnits !== 0) data.polygonOffsetUnits = this.polygonOffsetUnits; - if (this.linewidth !== void 0 && this.linewidth !== 1) data.linewidth = this.linewidth; - if (this.dashSize !== void 0) data.dashSize = this.dashSize; - if (this.gapSize !== void 0) data.gapSize = this.gapSize; - if (this.scale !== void 0) data.scale = this.scale; - if (this.dithering === true) data.dithering = true; - if (this.alphaTest > 0) data.alphaTest = this.alphaTest; - if (this.alphaHash === true) data.alphaHash = true; - if (this.alphaToCoverage === true) data.alphaToCoverage = true; - if (this.premultipliedAlpha === true) data.premultipliedAlpha = true; - if (this.forceSinglePass === true) data.forceSinglePass = true; - if (this.wireframe === true) data.wireframe = true; - if (this.wireframeLinewidth > 1) data.wireframeLinewidth = this.wireframeLinewidth; - if (this.wireframeLinecap !== "round") data.wireframeLinecap = this.wireframeLinecap; - if (this.wireframeLinejoin !== "round") data.wireframeLinejoin = this.wireframeLinejoin; - if (this.flatShading === true) data.flatShading = true; - if (this.visible === false) data.visible = false; - if (this.toneMapped === false) data.toneMapped = false; - if (this.fog === false) data.fog = false; - if (Object.keys(this.userData).length > 0) data.userData = this.userData; - function extractFromCache(cache) { - const values = []; - for (const key in cache) { - const data2 = cache[key]; - delete data2.metadata; - values.push(data2); - } - return values; - } - __name(extractFromCache, "extractFromCache"); - if (isRootObject) { - const textures = extractFromCache(meta.textures); - const images = extractFromCache(meta.images); - if (textures.length > 0) data.textures = textures; - if (images.length > 0) data.images = images; - } - return data; - } - clone() { - return new this.constructor().copy(this); + angleTo(v) { + const denominator = Math.sqrt(this.lengthSq() * v.lengthSq()); + if (denominator === 0) return Math.PI / 2; + const theta = this.dot(v) / denominator; + return Math.acos(clamp(theta, -1, 1)); } - copy(source) { - this.name = source.name; - this.blending = source.blending; - this.side = source.side; - this.vertexColors = source.vertexColors; - this.opacity = source.opacity; - this.transparent = source.transparent; - this.blendSrc = source.blendSrc; - this.blendDst = source.blendDst; - this.blendEquation = source.blendEquation; - this.blendSrcAlpha = source.blendSrcAlpha; - this.blendDstAlpha = source.blendDstAlpha; - this.blendEquationAlpha = source.blendEquationAlpha; - this.blendColor.copy(source.blendColor); - this.blendAlpha = source.blendAlpha; - this.depthFunc = source.depthFunc; - this.depthTest = source.depthTest; - this.depthWrite = source.depthWrite; - this.stencilWriteMask = source.stencilWriteMask; - this.stencilFunc = source.stencilFunc; - this.stencilRef = source.stencilRef; - this.stencilFuncMask = source.stencilFuncMask; - this.stencilFail = source.stencilFail; - this.stencilZFail = source.stencilZFail; - this.stencilZPass = source.stencilZPass; - this.stencilWrite = source.stencilWrite; - const srcPlanes = source.clippingPlanes; - let dstPlanes = null; - if (srcPlanes !== null) { - const n = srcPlanes.length; - dstPlanes = new Array(n); - for (let i = 0; i !== n; ++i) { - dstPlanes[i] = srcPlanes[i].clone(); - } - } - this.clippingPlanes = dstPlanes; - this.clipIntersection = source.clipIntersection; - this.clipShadows = source.clipShadows; - this.shadowSide = source.shadowSide; - this.colorWrite = source.colorWrite; - this.precision = source.precision; - this.polygonOffset = source.polygonOffset; - this.polygonOffsetFactor = source.polygonOffsetFactor; - this.polygonOffsetUnits = source.polygonOffsetUnits; - this.dithering = source.dithering; - this.alphaTest = source.alphaTest; - this.alphaHash = source.alphaHash; - this.alphaToCoverage = source.alphaToCoverage; - this.premultipliedAlpha = source.premultipliedAlpha; - this.forceSinglePass = source.forceSinglePass; - this.visible = source.visible; - this.toneMapped = source.toneMapped; - this.userData = JSON.parse(JSON.stringify(source.userData)); - return this; + distanceTo(v) { + return Math.sqrt(this.distanceToSquared(v)); } - dispose() { - this.dispatchEvent({ type: "dispose" }); + distanceToSquared(v) { + const dx = this.x - v.x, dy = this.y - v.y; + return dx * dx + dy * dy; } - set needsUpdate(value) { - if (value === true) this.version++; + manhattanDistanceTo(v) { + return Math.abs(this.x - v.x) + Math.abs(this.y - v.y); } - onBuild() { - console.warn("Material: onBuild() has been removed."); + setLength(length) { + return this.normalize().multiplyScalar(length); } -} -class MeshBasicMaterial extends Material { - static { - __name(this, "MeshBasicMaterial"); + lerp(v, alpha) { + this.x += (v.x - this.x) * alpha; + this.y += (v.y - this.y) * alpha; + return this; } - static get type() { - return "MeshBasicMaterial"; + lerpVectors(v1, v2, alpha) { + this.x = v1.x + (v2.x - v1.x) * alpha; + this.y = v1.y + (v2.y - v1.y) * alpha; + return this; } - constructor(parameters) { - super(); - this.isMeshBasicMaterial = true; - this.color = new Color(16777215); - this.map = null; - this.lightMap = null; - this.lightMapIntensity = 1; - this.aoMap = null; - this.aoMapIntensity = 1; - this.specularMap = null; - this.alphaMap = null; - this.envMap = null; - this.envMapRotation = new Euler(); - this.combine = MultiplyOperation; - this.reflectivity = 1; - this.refractionRatio = 0.98; - this.wireframe = false; - this.wireframeLinewidth = 1; - this.wireframeLinecap = "round"; - this.wireframeLinejoin = "round"; - this.fog = true; - this.setValues(parameters); + equals(v) { + return v.x === this.x && v.y === this.y; } - copy(source) { - super.copy(source); - this.color.copy(source.color); - this.map = source.map; - this.lightMap = source.lightMap; - this.lightMapIntensity = source.lightMapIntensity; - this.aoMap = source.aoMap; - this.aoMapIntensity = source.aoMapIntensity; - this.specularMap = source.specularMap; - this.alphaMap = source.alphaMap; - this.envMap = source.envMap; - this.envMapRotation.copy(source.envMapRotation); - this.combine = source.combine; - this.reflectivity = source.reflectivity; - this.refractionRatio = source.refractionRatio; - this.wireframe = source.wireframe; - this.wireframeLinewidth = source.wireframeLinewidth; - this.wireframeLinecap = source.wireframeLinecap; - this.wireframeLinejoin = source.wireframeLinejoin; - this.fog = source.fog; + fromArray(array, offset = 0) { + this.x = array[offset]; + this.y = array[offset + 1]; return this; } -} -const _tables = /* @__PURE__ */ _generateTables(); -function _generateTables() { - const buffer = new ArrayBuffer(4); - const floatView = new Float32Array(buffer); - const uint32View = new Uint32Array(buffer); - const baseTable = new Uint32Array(512); - const shiftTable = new Uint32Array(512); - for (let i = 0; i < 256; ++i) { - const e = i - 127; - if (e < -27) { - baseTable[i] = 0; - baseTable[i | 256] = 32768; - shiftTable[i] = 24; - shiftTable[i | 256] = 24; - } else if (e < -14) { - baseTable[i] = 1024 >> -e - 14; - baseTable[i | 256] = 1024 >> -e - 14 | 32768; - shiftTable[i] = -e - 1; - shiftTable[i | 256] = -e - 1; - } else if (e <= 15) { - baseTable[i] = e + 15 << 10; - baseTable[i | 256] = e + 15 << 10 | 32768; - shiftTable[i] = 13; - shiftTable[i | 256] = 13; - } else if (e < 128) { - baseTable[i] = 31744; - baseTable[i | 256] = 64512; - shiftTable[i] = 24; - shiftTable[i | 256] = 24; - } else { - baseTable[i] = 31744; - baseTable[i | 256] = 64512; - shiftTable[i] = 13; - shiftTable[i | 256] = 13; - } - } - const mantissaTable = new Uint32Array(2048); - const exponentTable = new Uint32Array(64); - const offsetTable = new Uint32Array(64); - for (let i = 1; i < 1024; ++i) { - let m = i << 13; - let e = 0; - while ((m & 8388608) === 0) { - m <<= 1; - e -= 8388608; - } - m &= ~8388608; - e += 947912704; - mantissaTable[i] = m | e; + toArray(array = [], offset = 0) { + array[offset] = this.x; + array[offset + 1] = this.y; + return array; } - for (let i = 1024; i < 2048; ++i) { - mantissaTable[i] = 939524096 + (i - 1024 << 13); + fromBufferAttribute(attribute, index) { + this.x = attribute.getX(index); + this.y = attribute.getY(index); + return this; } - for (let i = 1; i < 31; ++i) { - exponentTable[i] = i << 23; + rotateAround(center, angle) { + const c = Math.cos(angle), s = Math.sin(angle); + const x = this.x - center.x; + const y = this.y - center.y; + this.x = x * c - y * s + center.x; + this.y = x * s + y * c + center.y; + return this; } - exponentTable[31] = 1199570944; - exponentTable[32] = 2147483648; - for (let i = 33; i < 63; ++i) { - exponentTable[i] = 2147483648 + (i - 32 << 23); + random() { + this.x = Math.random(); + this.y = Math.random(); + return this; } - exponentTable[63] = 3347054592; - for (let i = 1; i < 64; ++i) { - if (i !== 32) { - offsetTable[i] = 1024; - } + *[Symbol.iterator]() { + yield this.x; + yield this.y; } - return { - floatView, - uint32View, - baseTable, - shiftTable, - mantissaTable, - exponentTable, - offsetTable - }; -} -__name(_generateTables, "_generateTables"); -function toHalfFloat(val) { - if (Math.abs(val) > 65504) console.warn("THREE.DataUtils.toHalfFloat(): Value out of range."); - val = clamp(val, -65504, 65504); - _tables.floatView[0] = val; - const f = _tables.uint32View[0]; - const e = f >> 23 & 511; - return _tables.baseTable[e] + ((f & 8388607) >> _tables.shiftTable[e]); -} -__name(toHalfFloat, "toHalfFloat"); -function fromHalfFloat(val) { - const m = val >> 10; - _tables.uint32View[0] = _tables.mantissaTable[_tables.offsetTable[m] + (val & 1023)] + _tables.exponentTable[m]; - return _tables.floatView[0]; } -__name(fromHalfFloat, "fromHalfFloat"); -const DataUtils = { - toHalfFloat, - fromHalfFloat -}; -const _vector$9 = /* @__PURE__ */ new Vector3(); -const _vector2$1 = /* @__PURE__ */ new Vector2(); -class BufferAttribute { +class Matrix3 { static { - __name(this, "BufferAttribute"); + __name(this, "Matrix3"); } - constructor(array, itemSize, normalized = false) { - if (Array.isArray(array)) { - throw new TypeError("THREE.BufferAttribute: array should be a Typed Array."); + constructor(n11, n12, n13, n21, n22, n23, n31, n32, n33) { + Matrix3.prototype.isMatrix3 = true; + this.elements = [ + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1 + ]; + if (n11 !== void 0) { + this.set(n11, n12, n13, n21, n22, n23, n31, n32, n33); } - this.isBufferAttribute = true; - this.name = ""; - this.array = array; - this.itemSize = itemSize; - this.count = array !== void 0 ? array.length / itemSize : 0; - this.normalized = normalized; - this.usage = StaticDrawUsage; - this.updateRanges = []; - this.gpuType = FloatType; - this.version = 0; - } - onUploadCallback() { } - set needsUpdate(value) { - if (value === true) this.version++; - } - setUsage(value) { - this.usage = value; + set(n11, n12, n13, n21, n22, n23, n31, n32, n33) { + const te2 = this.elements; + te2[0] = n11; + te2[1] = n21; + te2[2] = n31; + te2[3] = n12; + te2[4] = n22; + te2[5] = n32; + te2[6] = n13; + te2[7] = n23; + te2[8] = n33; return this; } - addUpdateRange(start, count) { - this.updateRanges.push({ start, count }); - } - clearUpdateRanges() { - this.updateRanges.length = 0; - } - copy(source) { - this.name = source.name; - this.array = new source.array.constructor(source.array); - this.itemSize = source.itemSize; - this.count = source.count; - this.normalized = source.normalized; - this.usage = source.usage; - this.gpuType = source.gpuType; + identity() { + this.set( + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1 + ); return this; } - copyAt(index1, attribute, index2) { - index1 *= this.itemSize; - index2 *= attribute.itemSize; - for (let i = 0, l = this.itemSize; i < l; i++) { - this.array[index1 + i] = attribute.array[index2 + i]; - } + copy(m) { + const te2 = this.elements; + const me = m.elements; + te2[0] = me[0]; + te2[1] = me[1]; + te2[2] = me[2]; + te2[3] = me[3]; + te2[4] = me[4]; + te2[5] = me[5]; + te2[6] = me[6]; + te2[7] = me[7]; + te2[8] = me[8]; return this; } - copyArray(array) { - this.array.set(array); + extractBasis(xAxis, yAxis, zAxis) { + xAxis.setFromMatrix3Column(this, 0); + yAxis.setFromMatrix3Column(this, 1); + zAxis.setFromMatrix3Column(this, 2); return this; } - applyMatrix3(m) { - if (this.itemSize === 2) { - for (let i = 0, l = this.count; i < l; i++) { - _vector2$1.fromBufferAttribute(this, i); - _vector2$1.applyMatrix3(m); - this.setXY(i, _vector2$1.x, _vector2$1.y); - } - } else if (this.itemSize === 3) { - for (let i = 0, l = this.count; i < l; i++) { - _vector$9.fromBufferAttribute(this, i); - _vector$9.applyMatrix3(m); - this.setXYZ(i, _vector$9.x, _vector$9.y, _vector$9.z); - } - } + setFromMatrix4(m) { + const me = m.elements; + this.set( + me[0], + me[4], + me[8], + me[1], + me[5], + me[9], + me[2], + me[6], + me[10] + ); return this; } - applyMatrix4(m) { - for (let i = 0, l = this.count; i < l; i++) { - _vector$9.fromBufferAttribute(this, i); - _vector$9.applyMatrix4(m); - this.setXYZ(i, _vector$9.x, _vector$9.y, _vector$9.z); - } - return this; + multiply(m) { + return this.multiplyMatrices(this, m); } - applyNormalMatrix(m) { - for (let i = 0, l = this.count; i < l; i++) { - _vector$9.fromBufferAttribute(this, i); - _vector$9.applyNormalMatrix(m); - this.setXYZ(i, _vector$9.x, _vector$9.y, _vector$9.z); - } - return this; + premultiply(m) { + return this.multiplyMatrices(m, this); } - transformDirection(m) { - for (let i = 0, l = this.count; i < l; i++) { - _vector$9.fromBufferAttribute(this, i); - _vector$9.transformDirection(m); - this.setXYZ(i, _vector$9.x, _vector$9.y, _vector$9.z); - } + multiplyMatrices(a, b) { + const ae = a.elements; + const be = b.elements; + const te2 = this.elements; + const a11 = ae[0], a12 = ae[3], a13 = ae[6]; + const a21 = ae[1], a22 = ae[4], a23 = ae[7]; + const a31 = ae[2], a32 = ae[5], a33 = ae[8]; + const b11 = be[0], b12 = be[3], b13 = be[6]; + const b21 = be[1], b22 = be[4], b23 = be[7]; + const b31 = be[2], b32 = be[5], b33 = be[8]; + te2[0] = a11 * b11 + a12 * b21 + a13 * b31; + te2[3] = a11 * b12 + a12 * b22 + a13 * b32; + te2[6] = a11 * b13 + a12 * b23 + a13 * b33; + te2[1] = a21 * b11 + a22 * b21 + a23 * b31; + te2[4] = a21 * b12 + a22 * b22 + a23 * b32; + te2[7] = a21 * b13 + a22 * b23 + a23 * b33; + te2[2] = a31 * b11 + a32 * b21 + a33 * b31; + te2[5] = a31 * b12 + a32 * b22 + a33 * b32; + te2[8] = a31 * b13 + a32 * b23 + a33 * b33; return this; } - set(value, offset = 0) { - this.array.set(value, offset); + multiplyScalar(s) { + const te2 = this.elements; + te2[0] *= s; + te2[3] *= s; + te2[6] *= s; + te2[1] *= s; + te2[4] *= s; + te2[7] *= s; + te2[2] *= s; + te2[5] *= s; + te2[8] *= s; return this; } - getComponent(index, component) { - let value = this.array[index * this.itemSize + component]; - if (this.normalized) value = denormalize(value, this.array); - return value; + determinant() { + const te2 = this.elements; + const a = te2[0], b = te2[1], c = te2[2], d = te2[3], e = te2[4], f = te2[5], g = te2[6], h = te2[7], i = te2[8]; + return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g; } - setComponent(index, component, value) { - if (this.normalized) value = normalize(value, this.array); - this.array[index * this.itemSize + component] = value; + invert() { + const te2 = this.elements, n11 = te2[0], n21 = te2[1], n31 = te2[2], n12 = te2[3], n22 = te2[4], n32 = te2[5], n13 = te2[6], n23 = te2[7], n33 = te2[8], t11 = n33 * n22 - n32 * n23, t12 = n32 * n13 - n33 * n12, t13 = n23 * n12 - n22 * n13, det = n11 * t11 + n21 * t12 + n31 * t13; + if (det === 0) return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0); + const detInv = 1 / det; + te2[0] = t11 * detInv; + te2[1] = (n31 * n23 - n33 * n21) * detInv; + te2[2] = (n32 * n21 - n31 * n22) * detInv; + te2[3] = t12 * detInv; + te2[4] = (n33 * n11 - n31 * n13) * detInv; + te2[5] = (n31 * n12 - n32 * n11) * detInv; + te2[6] = t13 * detInv; + te2[7] = (n21 * n13 - n23 * n11) * detInv; + te2[8] = (n22 * n11 - n21 * n12) * detInv; return this; } - getX(index) { - let x = this.array[index * this.itemSize]; - if (this.normalized) x = denormalize(x, this.array); - return x; - } - setX(index, x) { - if (this.normalized) x = normalize(x, this.array); - this.array[index * this.itemSize] = x; + transpose() { + let tmp2; + const m = this.elements; + tmp2 = m[1]; + m[1] = m[3]; + m[3] = tmp2; + tmp2 = m[2]; + m[2] = m[6]; + m[6] = tmp2; + tmp2 = m[5]; + m[5] = m[7]; + m[7] = tmp2; return this; } - getY(index) { - let y = this.array[index * this.itemSize + 1]; - if (this.normalized) y = denormalize(y, this.array); - return y; + getNormalMatrix(matrix4) { + return this.setFromMatrix4(matrix4).invert().transpose(); } - setY(index, y) { - if (this.normalized) y = normalize(y, this.array); - this.array[index * this.itemSize + 1] = y; + transposeIntoArray(r) { + const m = this.elements; + r[0] = m[0]; + r[1] = m[3]; + r[2] = m[6]; + r[3] = m[1]; + r[4] = m[4]; + r[5] = m[7]; + r[6] = m[2]; + r[7] = m[5]; + r[8] = m[8]; return this; } - getZ(index) { - let z = this.array[index * this.itemSize + 2]; - if (this.normalized) z = denormalize(z, this.array); - return z; - } - setZ(index, z) { - if (this.normalized) z = normalize(z, this.array); - this.array[index * this.itemSize + 2] = z; + setUvTransform(tx, ty, sx, sy, rotation, cx, cy) { + const c = Math.cos(rotation); + const s = Math.sin(rotation); + this.set( + sx * c, + sx * s, + -sx * (c * cx + s * cy) + cx + tx, + -sy * s, + sy * c, + -sy * (-s * cx + c * cy) + cy + ty, + 0, + 0, + 1 + ); return this; } - getW(index) { - let w = this.array[index * this.itemSize + 3]; - if (this.normalized) w = denormalize(w, this.array); - return w; - } - setW(index, w) { - if (this.normalized) w = normalize(w, this.array); - this.array[index * this.itemSize + 3] = w; + // + scale(sx, sy) { + this.premultiply(_m3.makeScale(sx, sy)); return this; } - setXY(index, x, y) { - index *= this.itemSize; - if (this.normalized) { - x = normalize(x, this.array); - y = normalize(y, this.array); - } - this.array[index + 0] = x; - this.array[index + 1] = y; + rotate(theta) { + this.premultiply(_m3.makeRotation(-theta)); return this; } - setXYZ(index, x, y, z) { - index *= this.itemSize; - if (this.normalized) { - x = normalize(x, this.array); - y = normalize(y, this.array); - z = normalize(z, this.array); - } - this.array[index + 0] = x; - this.array[index + 1] = y; - this.array[index + 2] = z; + translate(tx, ty) { + this.premultiply(_m3.makeTranslation(tx, ty)); return this; } - setXYZW(index, x, y, z, w) { - index *= this.itemSize; - if (this.normalized) { - x = normalize(x, this.array); - y = normalize(y, this.array); - z = normalize(z, this.array); - w = normalize(w, this.array); + // for 2D Transforms + makeTranslation(x, y) { + if (x.isVector2) { + this.set( + 1, + 0, + x.x, + 0, + 1, + x.y, + 0, + 0, + 1 + ); + } else { + this.set( + 1, + 0, + x, + 0, + 1, + y, + 0, + 0, + 1 + ); } - this.array[index + 0] = x; - this.array[index + 1] = y; - this.array[index + 2] = z; - this.array[index + 3] = w; return this; } - onUpload(callback) { - this.onUploadCallback = callback; + makeRotation(theta) { + const c = Math.cos(theta); + const s = Math.sin(theta); + this.set( + c, + -s, + 0, + s, + c, + 0, + 0, + 0, + 1 + ); return this; } - clone() { - return new this.constructor(this.array, this.itemSize).copy(this); - } - toJSON() { - const data = { - itemSize: this.itemSize, - type: this.array.constructor.name, - array: Array.from(this.array), - normalized: this.normalized - }; - if (this.name !== "") data.name = this.name; - if (this.usage !== StaticDrawUsage) data.usage = this.usage; - return data; + makeScale(x, y) { + this.set( + x, + 0, + 0, + 0, + y, + 0, + 0, + 0, + 1 + ); + return this; } -} -class Int8BufferAttribute extends BufferAttribute { - static { - __name(this, "Int8BufferAttribute"); + // + equals(matrix) { + const te2 = this.elements; + const me = matrix.elements; + for (let i = 0; i < 9; i++) { + if (te2[i] !== me[i]) return false; + } + return true; } - constructor(array, itemSize, normalized) { - super(new Int8Array(array), itemSize, normalized); + fromArray(array, offset = 0) { + for (let i = 0; i < 9; i++) { + this.elements[i] = array[i + offset]; + } + return this; } -} -class Uint8BufferAttribute extends BufferAttribute { - static { - __name(this, "Uint8BufferAttribute"); + toArray(array = [], offset = 0) { + const te2 = this.elements; + array[offset] = te2[0]; + array[offset + 1] = te2[1]; + array[offset + 2] = te2[2]; + array[offset + 3] = te2[3]; + array[offset + 4] = te2[4]; + array[offset + 5] = te2[5]; + array[offset + 6] = te2[6]; + array[offset + 7] = te2[7]; + array[offset + 8] = te2[8]; + return array; } - constructor(array, itemSize, normalized) { - super(new Uint8Array(array), itemSize, normalized); + clone() { + return new this.constructor().fromArray(this.elements); } } -class Uint8ClampedBufferAttribute extends BufferAttribute { - static { - __name(this, "Uint8ClampedBufferAttribute"); - } - constructor(array, itemSize, normalized) { - super(new Uint8ClampedArray(array), itemSize, normalized); +const _m3 = /* @__PURE__ */ new Matrix3(); +function arrayNeedsUint32(array) { + for (let i = array.length - 1; i >= 0; --i) { + if (array[i] >= 65535) return true; } + return false; } -class Int16BufferAttribute extends BufferAttribute { - static { - __name(this, "Int16BufferAttribute"); - } - constructor(array, itemSize, normalized) { - super(new Int16Array(array), itemSize, normalized); - } +__name(arrayNeedsUint32, "arrayNeedsUint32"); +const TYPED_ARRAYS = { + Int8Array, + Uint8Array, + Uint8ClampedArray, + Int16Array, + Uint16Array, + Int32Array, + Uint32Array, + Float32Array, + Float64Array +}; +function getTypedArray(type, buffer) { + return new TYPED_ARRAYS[type](buffer); } -class Uint16BufferAttribute extends BufferAttribute { - static { - __name(this, "Uint16BufferAttribute"); - } - constructor(array, itemSize, normalized) { - super(new Uint16Array(array), itemSize, normalized); - } +__name(getTypedArray, "getTypedArray"); +function createElementNS(name) { + return document.createElementNS("http://www.w3.org/1999/xhtml", name); } -class Int32BufferAttribute extends BufferAttribute { - static { - __name(this, "Int32BufferAttribute"); - } - constructor(array, itemSize, normalized) { - super(new Int32Array(array), itemSize, normalized); - } +__name(createElementNS, "createElementNS"); +function createCanvasElement() { + const canvas = createElementNS("canvas"); + canvas.style.display = "block"; + return canvas; } -class Uint32BufferAttribute extends BufferAttribute { - static { - __name(this, "Uint32BufferAttribute"); - } - constructor(array, itemSize, normalized) { - super(new Uint32Array(array), itemSize, normalized); - } +__name(createCanvasElement, "createCanvasElement"); +const _cache = {}; +function warnOnce(message) { + if (message in _cache) return; + _cache[message] = true; + console.warn(message); } -class Float16BufferAttribute extends BufferAttribute { - static { - __name(this, "Float16BufferAttribute"); - } - constructor(array, itemSize, normalized) { - super(new Uint16Array(array), itemSize, normalized); - this.isFloat16BufferAttribute = true; - } - getX(index) { - let x = fromHalfFloat(this.array[index * this.itemSize]); - if (this.normalized) x = denormalize(x, this.array); - return x; - } - setX(index, x) { - if (this.normalized) x = normalize(x, this.array); - this.array[index * this.itemSize] = toHalfFloat(x); - return this; - } - getY(index) { - let y = fromHalfFloat(this.array[index * this.itemSize + 1]); - if (this.normalized) y = denormalize(y, this.array); - return y; - } - setY(index, y) { - if (this.normalized) y = normalize(y, this.array); - this.array[index * this.itemSize + 1] = toHalfFloat(y); - return this; - } - getZ(index) { - let z = fromHalfFloat(this.array[index * this.itemSize + 2]); - if (this.normalized) z = denormalize(z, this.array); - return z; - } - setZ(index, z) { - if (this.normalized) z = normalize(z, this.array); - this.array[index * this.itemSize + 2] = toHalfFloat(z); - return this; - } - getW(index) { - let w = fromHalfFloat(this.array[index * this.itemSize + 3]); - if (this.normalized) w = denormalize(w, this.array); - return w; - } - setW(index, w) { - if (this.normalized) w = normalize(w, this.array); - this.array[index * this.itemSize + 3] = toHalfFloat(w); - return this; - } - setXY(index, x, y) { - index *= this.itemSize; - if (this.normalized) { - x = normalize(x, this.array); - y = normalize(y, this.array); - } - this.array[index + 0] = toHalfFloat(x); - this.array[index + 1] = toHalfFloat(y); - return this; - } - setXYZ(index, x, y, z) { - index *= this.itemSize; - if (this.normalized) { - x = normalize(x, this.array); - y = normalize(y, this.array); - z = normalize(z, this.array); - } - this.array[index + 0] = toHalfFloat(x); - this.array[index + 1] = toHalfFloat(y); - this.array[index + 2] = toHalfFloat(z); - return this; - } - setXYZW(index, x, y, z, w) { - index *= this.itemSize; - if (this.normalized) { - x = normalize(x, this.array); - y = normalize(y, this.array); - z = normalize(z, this.array); - w = normalize(w, this.array); +__name(warnOnce, "warnOnce"); +function probeAsync(gl, sync, interval) { + return new Promise(function(resolve, reject) { + function probe() { + switch (gl.clientWaitSync(sync, gl.SYNC_FLUSH_COMMANDS_BIT, 0)) { + case gl.WAIT_FAILED: + reject(); + break; + case gl.TIMEOUT_EXPIRED: + setTimeout(probe, interval); + break; + default: + resolve(); + } } - this.array[index + 0] = toHalfFloat(x); - this.array[index + 1] = toHalfFloat(y); - this.array[index + 2] = toHalfFloat(z); - this.array[index + 3] = toHalfFloat(w); - return this; - } + __name(probe, "probe"); + setTimeout(probe, interval); + }); } -class Float32BufferAttribute extends BufferAttribute { - static { - __name(this, "Float32BufferAttribute"); - } - constructor(array, itemSize, normalized) { - super(new Float32Array(array), itemSize, normalized); - } +__name(probeAsync, "probeAsync"); +function toNormalizedProjectionMatrix(projectionMatrix) { + const m = projectionMatrix.elements; + m[2] = 0.5 * m[2] + 0.5 * m[3]; + m[6] = 0.5 * m[6] + 0.5 * m[7]; + m[10] = 0.5 * m[10] + 0.5 * m[11]; + m[14] = 0.5 * m[14] + 0.5 * m[15]; } -let _id$2 = 0; -const _m1$2 = /* @__PURE__ */ new Matrix4(); -const _obj = /* @__PURE__ */ new Object3D(); -const _offset = /* @__PURE__ */ new Vector3(); -const _box$2 = /* @__PURE__ */ new Box3(); -const _boxMorphTargets = /* @__PURE__ */ new Box3(); -const _vector$8 = /* @__PURE__ */ new Vector3(); -class BufferGeometry extends EventDispatcher { - static { - __name(this, "BufferGeometry"); +__name(toNormalizedProjectionMatrix, "toNormalizedProjectionMatrix"); +function toReversedProjectionMatrix(projectionMatrix) { + const m = projectionMatrix.elements; + const isPerspectiveMatrix = m[11] === -1; + if (isPerspectiveMatrix) { + m[10] = -m[10] - 1; + m[14] = -m[14]; + } else { + m[10] = -m[10]; + m[14] = -m[14] + 1; } - constructor() { - super(); - this.isBufferGeometry = true; - Object.defineProperty(this, "id", { value: _id$2++ }); - this.uuid = generateUUID(); - this.name = ""; - this.type = "BufferGeometry"; - this.index = null; - this.indirect = null; - this.attributes = {}; - this.morphAttributes = {}; - this.morphTargetsRelative = false; - this.groups = []; - this.boundingBox = null; - this.boundingSphere = null; - this.drawRange = { start: 0, count: Infinity }; - this.userData = {}; +} +__name(toReversedProjectionMatrix, "toReversedProjectionMatrix"); +const ColorManagement = { + enabled: true, + workingColorSpace: LinearSRGBColorSpace, + /** + * Implementations of supported color spaces. + * + * Required: + * - primaries: chromaticity coordinates [ rx ry gx gy bx by ] + * - whitePoint: reference white [ x y ] + * - transfer: transfer function (pre-defined) + * - toXYZ: Matrix3 RGB to XYZ transform + * - fromXYZ: Matrix3 XYZ to RGB transform + * - luminanceCoefficients: RGB luminance coefficients + * + * Optional: + * - outputColorSpaceConfig: { drawingBufferColorSpace: ColorSpace } + * - workingColorSpaceConfig: { unpackColorSpace: ColorSpace } + * + * Reference: + * - https://www.russellcottrell.com/photo/matrixCalculator.htm + */ + spaces: {}, + convert: /* @__PURE__ */ __name(function(color, sourceColorSpace, targetColorSpace) { + if (this.enabled === false || sourceColorSpace === targetColorSpace || !sourceColorSpace || !targetColorSpace) { + return color; + } + if (this.spaces[sourceColorSpace].transfer === SRGBTransfer) { + color.r = SRGBToLinear(color.r); + color.g = SRGBToLinear(color.g); + color.b = SRGBToLinear(color.b); + } + if (this.spaces[sourceColorSpace].primaries !== this.spaces[targetColorSpace].primaries) { + color.applyMatrix3(this.spaces[sourceColorSpace].toXYZ); + color.applyMatrix3(this.spaces[targetColorSpace].fromXYZ); + } + if (this.spaces[targetColorSpace].transfer === SRGBTransfer) { + color.r = LinearToSRGB(color.r); + color.g = LinearToSRGB(color.g); + color.b = LinearToSRGB(color.b); + } + return color; + }, "convert"), + fromWorkingColorSpace: /* @__PURE__ */ __name(function(color, targetColorSpace) { + return this.convert(color, this.workingColorSpace, targetColorSpace); + }, "fromWorkingColorSpace"), + toWorkingColorSpace: /* @__PURE__ */ __name(function(color, sourceColorSpace) { + return this.convert(color, sourceColorSpace, this.workingColorSpace); + }, "toWorkingColorSpace"), + getPrimaries: /* @__PURE__ */ __name(function(colorSpace) { + return this.spaces[colorSpace].primaries; + }, "getPrimaries"), + getTransfer: /* @__PURE__ */ __name(function(colorSpace) { + if (colorSpace === NoColorSpace) return LinearTransfer; + return this.spaces[colorSpace].transfer; + }, "getTransfer"), + getLuminanceCoefficients: /* @__PURE__ */ __name(function(target, colorSpace = this.workingColorSpace) { + return target.fromArray(this.spaces[colorSpace].luminanceCoefficients); + }, "getLuminanceCoefficients"), + define: /* @__PURE__ */ __name(function(colorSpaces) { + Object.assign(this.spaces, colorSpaces); + }, "define"), + // Internal APIs + _getMatrix: /* @__PURE__ */ __name(function(targetMatrix, sourceColorSpace, targetColorSpace) { + return targetMatrix.copy(this.spaces[sourceColorSpace].toXYZ).multiply(this.spaces[targetColorSpace].fromXYZ); + }, "_getMatrix"), + _getDrawingBufferColorSpace: /* @__PURE__ */ __name(function(colorSpace) { + return this.spaces[colorSpace].outputColorSpaceConfig.drawingBufferColorSpace; + }, "_getDrawingBufferColorSpace"), + _getUnpackColorSpace: /* @__PURE__ */ __name(function(colorSpace = this.workingColorSpace) { + return this.spaces[colorSpace].workingColorSpaceConfig.unpackColorSpace; + }, "_getUnpackColorSpace") +}; +function SRGBToLinear(c) { + return c < 0.04045 ? c * 0.0773993808 : Math.pow(c * 0.9478672986 + 0.0521327014, 2.4); +} +__name(SRGBToLinear, "SRGBToLinear"); +function LinearToSRGB(c) { + return c < 31308e-7 ? c * 12.92 : 1.055 * Math.pow(c, 0.41666) - 0.055; +} +__name(LinearToSRGB, "LinearToSRGB"); +const REC709_PRIMARIES = [0.64, 0.33, 0.3, 0.6, 0.15, 0.06]; +const REC709_LUMINANCE_COEFFICIENTS = [0.2126, 0.7152, 0.0722]; +const D65 = [0.3127, 0.329]; +const LINEAR_REC709_TO_XYZ = /* @__PURE__ */ new Matrix3().set( + 0.4123908, + 0.3575843, + 0.1804808, + 0.212639, + 0.7151687, + 0.0721923, + 0.0193308, + 0.1191948, + 0.9505322 +); +const XYZ_TO_LINEAR_REC709 = /* @__PURE__ */ new Matrix3().set( + 3.2409699, + -1.5373832, + -0.4986108, + -0.9692436, + 1.8759675, + 0.0415551, + 0.0556301, + -0.203977, + 1.0569715 +); +ColorManagement.define({ + [LinearSRGBColorSpace]: { + primaries: REC709_PRIMARIES, + whitePoint: D65, + transfer: LinearTransfer, + toXYZ: LINEAR_REC709_TO_XYZ, + fromXYZ: XYZ_TO_LINEAR_REC709, + luminanceCoefficients: REC709_LUMINANCE_COEFFICIENTS, + workingColorSpaceConfig: { unpackColorSpace: SRGBColorSpace }, + outputColorSpaceConfig: { drawingBufferColorSpace: SRGBColorSpace } + }, + [SRGBColorSpace]: { + primaries: REC709_PRIMARIES, + whitePoint: D65, + transfer: SRGBTransfer, + toXYZ: LINEAR_REC709_TO_XYZ, + fromXYZ: XYZ_TO_LINEAR_REC709, + luminanceCoefficients: REC709_LUMINANCE_COEFFICIENTS, + outputColorSpaceConfig: { drawingBufferColorSpace: SRGBColorSpace } } - getIndex() { - return this.index; +}); +let _canvas; +class ImageUtils { + static { + __name(this, "ImageUtils"); } - setIndex(index) { - if (Array.isArray(index)) { - this.index = new (arrayNeedsUint32(index) ? Uint32BufferAttribute : Uint16BufferAttribute)(index, 1); + static getDataURL(image) { + if (/^data:/i.test(image.src)) { + return image.src; + } + if (typeof HTMLCanvasElement === "undefined") { + return image.src; + } + let canvas; + if (image instanceof HTMLCanvasElement) { + canvas = image; } else { - this.index = index; + if (_canvas === void 0) _canvas = createElementNS("canvas"); + _canvas.width = image.width; + _canvas.height = image.height; + const context = _canvas.getContext("2d"); + if (image instanceof ImageData) { + context.putImageData(image, 0, 0); + } else { + context.drawImage(image, 0, 0, image.width, image.height); + } + canvas = _canvas; + } + if (canvas.width > 2048 || canvas.height > 2048) { + console.warn("THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons", image); + return canvas.toDataURL("image/jpeg", 0.6); + } else { + return canvas.toDataURL("image/png"); } - return this; - } - setIndirect(indirect) { - this.indirect = indirect; - return this; - } - getIndirect() { - return this.indirect; - } - getAttribute(name) { - return this.attributes[name]; - } - setAttribute(name, attribute) { - this.attributes[name] = attribute; - return this; - } - deleteAttribute(name) { - delete this.attributes[name]; - return this; } - hasAttribute(name) { - return this.attributes[name] !== void 0; + static sRGBToLinear(image) { + if (typeof HTMLImageElement !== "undefined" && image instanceof HTMLImageElement || typeof HTMLCanvasElement !== "undefined" && image instanceof HTMLCanvasElement || typeof ImageBitmap !== "undefined" && image instanceof ImageBitmap) { + const canvas = createElementNS("canvas"); + canvas.width = image.width; + canvas.height = image.height; + const context = canvas.getContext("2d"); + context.drawImage(image, 0, 0, image.width, image.height); + const imageData = context.getImageData(0, 0, image.width, image.height); + const data = imageData.data; + for (let i = 0; i < data.length; i++) { + data[i] = SRGBToLinear(data[i] / 255) * 255; + } + context.putImageData(imageData, 0, 0); + return canvas; + } else if (image.data) { + const data = image.data.slice(0); + for (let i = 0; i < data.length; i++) { + if (data instanceof Uint8Array || data instanceof Uint8ClampedArray) { + data[i] = Math.floor(SRGBToLinear(data[i] / 255) * 255); + } else { + data[i] = SRGBToLinear(data[i]); + } + } + return { + data, + width: image.width, + height: image.height + }; + } else { + console.warn("THREE.ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied."); + return image; + } } - addGroup(start, count, materialIndex = 0) { - this.groups.push({ - start, - count, - materialIndex - }); +} +let _sourceId = 0; +class Source { + static { + __name(this, "Source"); } - clearGroups() { - this.groups = []; + constructor(data = null) { + this.isSource = true; + Object.defineProperty(this, "id", { value: _sourceId++ }); + this.uuid = generateUUID(); + this.data = data; + this.dataReady = true; + this.version = 0; } - setDrawRange(start, count) { - this.drawRange.start = start; - this.drawRange.count = count; + set needsUpdate(value) { + if (value === true) this.version++; } - applyMatrix4(matrix) { - const position = this.attributes.position; - if (position !== void 0) { - position.applyMatrix4(matrix); - position.needsUpdate = true; - } - const normal = this.attributes.normal; - if (normal !== void 0) { - const normalMatrix = new Matrix3().getNormalMatrix(matrix); - normal.applyNormalMatrix(normalMatrix); - normal.needsUpdate = true; - } - const tangent = this.attributes.tangent; - if (tangent !== void 0) { - tangent.transformDirection(matrix); - tangent.needsUpdate = true; + toJSON(meta) { + const isRootObject = meta === void 0 || typeof meta === "string"; + if (!isRootObject && meta.images[this.uuid] !== void 0) { + return meta.images[this.uuid]; } - if (this.boundingBox !== null) { - this.computeBoundingBox(); + const output = { + uuid: this.uuid, + url: "" + }; + const data = this.data; + if (data !== null) { + let url; + if (Array.isArray(data)) { + url = []; + for (let i = 0, l = data.length; i < l; i++) { + if (data[i].isDataTexture) { + url.push(serializeImage(data[i].image)); + } else { + url.push(serializeImage(data[i])); + } + } + } else { + url = serializeImage(data); + } + output.url = url; } - if (this.boundingSphere !== null) { - this.computeBoundingSphere(); + if (!isRootObject) { + meta.images[this.uuid] = output; } - return this; + return output; } - applyQuaternion(q) { - _m1$2.makeRotationFromQuaternion(q); - this.applyMatrix4(_m1$2); - return this; +} +function serializeImage(image) { + if (typeof HTMLImageElement !== "undefined" && image instanceof HTMLImageElement || typeof HTMLCanvasElement !== "undefined" && image instanceof HTMLCanvasElement || typeof ImageBitmap !== "undefined" && image instanceof ImageBitmap) { + return ImageUtils.getDataURL(image); + } else { + if (image.data) { + return { + data: Array.from(image.data), + width: image.width, + height: image.height, + type: image.data.constructor.name + }; + } else { + console.warn("THREE.Texture: Unable to serialize Texture."); + return {}; + } } - rotateX(angle) { - _m1$2.makeRotationX(angle); - this.applyMatrix4(_m1$2); - return this; +} +__name(serializeImage, "serializeImage"); +let _textureId = 0; +class Texture extends EventDispatcher { + static { + __name(this, "Texture"); } - rotateY(angle) { - _m1$2.makeRotationY(angle); - this.applyMatrix4(_m1$2); - return this; + constructor(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) { + super(); + this.isTexture = true; + Object.defineProperty(this, "id", { value: _textureId++ }); + this.uuid = generateUUID(); + this.name = ""; + this.source = new Source(image); + this.mipmaps = []; + this.mapping = mapping; + this.channel = 0; + this.wrapS = wrapS; + this.wrapT = wrapT; + this.magFilter = magFilter; + this.minFilter = minFilter; + this.anisotropy = anisotropy; + this.format = format; + this.internalFormat = null; + this.type = type; + this.offset = new Vector2(0, 0); + this.repeat = new Vector2(1, 1); + this.center = new Vector2(0, 0); + this.rotation = 0; + this.matrixAutoUpdate = true; + this.matrix = new Matrix3(); + this.generateMipmaps = true; + this.premultiplyAlpha = false; + this.flipY = true; + this.unpackAlignment = 4; + this.colorSpace = colorSpace; + this.userData = {}; + this.version = 0; + this.onUpdate = null; + this.isRenderTargetTexture = false; + this.pmremVersion = 0; } - rotateZ(angle) { - _m1$2.makeRotationZ(angle); - this.applyMatrix4(_m1$2); - return this; + get image() { + return this.source.data; } - translate(x, y, z) { - _m1$2.makeTranslation(x, y, z); - this.applyMatrix4(_m1$2); - return this; + set image(value = null) { + this.source.data = value; } - scale(x, y, z) { - _m1$2.makeScale(x, y, z); - this.applyMatrix4(_m1$2); - return this; + updateMatrix() { + this.matrix.setUvTransform(this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y); } - lookAt(vector) { - _obj.lookAt(vector); - _obj.updateMatrix(); - this.applyMatrix4(_obj.matrix); - return this; + clone() { + return new this.constructor().copy(this); } - center() { - this.computeBoundingBox(); - this.boundingBox.getCenter(_offset).negate(); - this.translate(_offset.x, _offset.y, _offset.z); + copy(source) { + this.name = source.name; + this.source = source.source; + this.mipmaps = source.mipmaps.slice(0); + this.mapping = source.mapping; + this.channel = source.channel; + this.wrapS = source.wrapS; + this.wrapT = source.wrapT; + this.magFilter = source.magFilter; + this.minFilter = source.minFilter; + this.anisotropy = source.anisotropy; + this.format = source.format; + this.internalFormat = source.internalFormat; + this.type = source.type; + this.offset.copy(source.offset); + this.repeat.copy(source.repeat); + this.center.copy(source.center); + this.rotation = source.rotation; + this.matrixAutoUpdate = source.matrixAutoUpdate; + this.matrix.copy(source.matrix); + this.generateMipmaps = source.generateMipmaps; + this.premultiplyAlpha = source.premultiplyAlpha; + this.flipY = source.flipY; + this.unpackAlignment = source.unpackAlignment; + this.colorSpace = source.colorSpace; + this.userData = JSON.parse(JSON.stringify(source.userData)); + this.needsUpdate = true; return this; } - setFromPoints(points) { - const positionAttribute = this.getAttribute("position"); - if (positionAttribute === void 0) { - const position = []; - for (let i = 0, l = points.length; i < l; i++) { - const point = points[i]; - position.push(point.x, point.y, point.z || 0); - } - this.setAttribute("position", new Float32BufferAttribute(position, 3)); - } else { - for (let i = 0, l = positionAttribute.count; i < l; i++) { - const point = points[i]; - positionAttribute.setXYZ(i, point.x, point.y, point.z || 0); - } - if (points.length > positionAttribute.count) { - console.warn("THREE.BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry."); - } - positionAttribute.needsUpdate = true; + toJSON(meta) { + const isRootObject = meta === void 0 || typeof meta === "string"; + if (!isRootObject && meta.textures[this.uuid] !== void 0) { + return meta.textures[this.uuid]; } - return this; + const output = { + metadata: { + version: 4.6, + type: "Texture", + generator: "Texture.toJSON" + }, + uuid: this.uuid, + name: this.name, + image: this.source.toJSON(meta).uuid, + mapping: this.mapping, + channel: this.channel, + repeat: [this.repeat.x, this.repeat.y], + offset: [this.offset.x, this.offset.y], + center: [this.center.x, this.center.y], + rotation: this.rotation, + wrap: [this.wrapS, this.wrapT], + format: this.format, + internalFormat: this.internalFormat, + type: this.type, + colorSpace: this.colorSpace, + minFilter: this.minFilter, + magFilter: this.magFilter, + anisotropy: this.anisotropy, + flipY: this.flipY, + generateMipmaps: this.generateMipmaps, + premultiplyAlpha: this.premultiplyAlpha, + unpackAlignment: this.unpackAlignment + }; + if (Object.keys(this.userData).length > 0) output.userData = this.userData; + if (!isRootObject) { + meta.textures[this.uuid] = output; + } + return output; } - computeBoundingBox() { - if (this.boundingBox === null) { - this.boundingBox = new Box3(); + dispose() { + this.dispatchEvent({ type: "dispose" }); + } + transformUv(uv) { + if (this.mapping !== UVMapping) return uv; + uv.applyMatrix3(this.matrix); + if (uv.x < 0 || uv.x > 1) { + switch (this.wrapS) { + case RepeatWrapping: + uv.x = uv.x - Math.floor(uv.x); + break; + case ClampToEdgeWrapping: + uv.x = uv.x < 0 ? 0 : 1; + break; + case MirroredRepeatWrapping: + if (Math.abs(Math.floor(uv.x) % 2) === 1) { + uv.x = Math.ceil(uv.x) - uv.x; + } else { + uv.x = uv.x - Math.floor(uv.x); + } + break; + } } - const position = this.attributes.position; - const morphAttributesPosition = this.morphAttributes.position; - if (position && position.isGLBufferAttribute) { - console.error("THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.", this); - this.boundingBox.set( - new Vector3(-Infinity, -Infinity, -Infinity), - new Vector3(Infinity, Infinity, Infinity) - ); - return; - } - if (position !== void 0) { - this.boundingBox.setFromBufferAttribute(position); - if (morphAttributesPosition) { - for (let i = 0, il = morphAttributesPosition.length; i < il; i++) { - const morphAttribute = morphAttributesPosition[i]; - _box$2.setFromBufferAttribute(morphAttribute); - if (this.morphTargetsRelative) { - _vector$8.addVectors(this.boundingBox.min, _box$2.min); - this.boundingBox.expandByPoint(_vector$8); - _vector$8.addVectors(this.boundingBox.max, _box$2.max); - this.boundingBox.expandByPoint(_vector$8); + if (uv.y < 0 || uv.y > 1) { + switch (this.wrapT) { + case RepeatWrapping: + uv.y = uv.y - Math.floor(uv.y); + break; + case ClampToEdgeWrapping: + uv.y = uv.y < 0 ? 0 : 1; + break; + case MirroredRepeatWrapping: + if (Math.abs(Math.floor(uv.y) % 2) === 1) { + uv.y = Math.ceil(uv.y) - uv.y; } else { - this.boundingBox.expandByPoint(_box$2.min); - this.boundingBox.expandByPoint(_box$2.max); + uv.y = uv.y - Math.floor(uv.y); } - } + break; } - } else { - this.boundingBox.makeEmpty(); } - if (isNaN(this.boundingBox.min.x) || isNaN(this.boundingBox.min.y) || isNaN(this.boundingBox.min.z)) { - console.error('THREE.BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The "position" attribute is likely to have NaN values.', this); + if (this.flipY) { + uv.y = 1 - uv.y; } + return uv; } - computeBoundingSphere() { - if (this.boundingSphere === null) { - this.boundingSphere = new Sphere(); - } - const position = this.attributes.position; - const morphAttributesPosition = this.morphAttributes.position; - if (position && position.isGLBufferAttribute) { - console.error("THREE.BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere.", this); - this.boundingSphere.set(new Vector3(), Infinity); - return; - } - if (position) { - const center = this.boundingSphere.center; - _box$2.setFromBufferAttribute(position); - if (morphAttributesPosition) { - for (let i = 0, il = morphAttributesPosition.length; i < il; i++) { - const morphAttribute = morphAttributesPosition[i]; - _boxMorphTargets.setFromBufferAttribute(morphAttribute); - if (this.morphTargetsRelative) { - _vector$8.addVectors(_box$2.min, _boxMorphTargets.min); - _box$2.expandByPoint(_vector$8); - _vector$8.addVectors(_box$2.max, _boxMorphTargets.max); - _box$2.expandByPoint(_vector$8); - } else { - _box$2.expandByPoint(_boxMorphTargets.min); - _box$2.expandByPoint(_boxMorphTargets.max); - } - } - } - _box$2.getCenter(center); - let maxRadiusSq = 0; - for (let i = 0, il = position.count; i < il; i++) { - _vector$8.fromBufferAttribute(position, i); - maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(_vector$8)); - } - if (morphAttributesPosition) { - for (let i = 0, il = morphAttributesPosition.length; i < il; i++) { - const morphAttribute = morphAttributesPosition[i]; - const morphTargetsRelative = this.morphTargetsRelative; - for (let j = 0, jl = morphAttribute.count; j < jl; j++) { - _vector$8.fromBufferAttribute(morphAttribute, j); - if (morphTargetsRelative) { - _offset.fromBufferAttribute(position, j); - _vector$8.add(_offset); - } - maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(_vector$8)); - } - } - } - this.boundingSphere.radius = Math.sqrt(maxRadiusSq); - if (isNaN(this.boundingSphere.radius)) { - console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', this); - } + set needsUpdate(value) { + if (value === true) { + this.version++; + this.source.needsUpdate = true; } } - computeTangents() { - const index = this.index; - const attributes = this.attributes; - if (index === null || attributes.position === void 0 || attributes.normal === void 0 || attributes.uv === void 0) { - console.error("THREE.BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)"); - return; - } - const positionAttribute = attributes.position; - const normalAttribute = attributes.normal; - const uvAttribute = attributes.uv; - if (this.hasAttribute("tangent") === false) { - this.setAttribute("tangent", new BufferAttribute(new Float32Array(4 * positionAttribute.count), 4)); - } - const tangentAttribute = this.getAttribute("tangent"); - const tan1 = [], tan2 = []; - for (let i = 0; i < positionAttribute.count; i++) { - tan1[i] = new Vector3(); - tan2[i] = new Vector3(); - } - const vA = new Vector3(), vB = new Vector3(), vC = new Vector3(), uvA = new Vector2(), uvB = new Vector2(), uvC = new Vector2(), sdir = new Vector3(), tdir = new Vector3(); - function handleTriangle(a, b, c) { - vA.fromBufferAttribute(positionAttribute, a); - vB.fromBufferAttribute(positionAttribute, b); - vC.fromBufferAttribute(positionAttribute, c); - uvA.fromBufferAttribute(uvAttribute, a); - uvB.fromBufferAttribute(uvAttribute, b); - uvC.fromBufferAttribute(uvAttribute, c); - vB.sub(vA); - vC.sub(vA); - uvB.sub(uvA); - uvC.sub(uvA); - const r = 1 / (uvB.x * uvC.y - uvC.x * uvB.y); - if (!isFinite(r)) return; - sdir.copy(vB).multiplyScalar(uvC.y).addScaledVector(vC, -uvB.y).multiplyScalar(r); - tdir.copy(vC).multiplyScalar(uvB.x).addScaledVector(vB, -uvC.x).multiplyScalar(r); - tan1[a].add(sdir); - tan1[b].add(sdir); - tan1[c].add(sdir); - tan2[a].add(tdir); - tan2[b].add(tdir); - tan2[c].add(tdir); - } - __name(handleTriangle, "handleTriangle"); - let groups = this.groups; - if (groups.length === 0) { - groups = [{ - start: 0, - count: index.count - }]; - } - for (let i = 0, il = groups.length; i < il; ++i) { - const group = groups[i]; - const start = group.start; - const count = group.count; - for (let j = start, jl = start + count; j < jl; j += 3) { - handleTriangle( - index.getX(j + 0), - index.getX(j + 1), - index.getX(j + 2) - ); - } - } - const tmp2 = new Vector3(), tmp22 = new Vector3(); - const n = new Vector3(), n2 = new Vector3(); - function handleVertex(v) { - n.fromBufferAttribute(normalAttribute, v); - n2.copy(n); - const t2 = tan1[v]; - tmp2.copy(t2); - tmp2.sub(n.multiplyScalar(n.dot(t2))).normalize(); - tmp22.crossVectors(n2, t2); - const test = tmp22.dot(tan2[v]); - const w = test < 0 ? -1 : 1; - tangentAttribute.setXYZW(v, tmp2.x, tmp2.y, tmp2.z, w); - } - __name(handleVertex, "handleVertex"); - for (let i = 0, il = groups.length; i < il; ++i) { - const group = groups[i]; - const start = group.start; - const count = group.count; - for (let j = start, jl = start + count; j < jl; j += 3) { - handleVertex(index.getX(j + 0)); - handleVertex(index.getX(j + 1)); - handleVertex(index.getX(j + 2)); - } + set needsPMREMUpdate(value) { + if (value === true) { + this.pmremVersion++; } } - computeVertexNormals() { - const index = this.index; - const positionAttribute = this.getAttribute("position"); - if (positionAttribute !== void 0) { - let normalAttribute = this.getAttribute("normal"); - if (normalAttribute === void 0) { - normalAttribute = new BufferAttribute(new Float32Array(positionAttribute.count * 3), 3); - this.setAttribute("normal", normalAttribute); - } else { - for (let i = 0, il = normalAttribute.count; i < il; i++) { - normalAttribute.setXYZ(i, 0, 0, 0); - } - } - const pA = new Vector3(), pB = new Vector3(), pC = new Vector3(); - const nA = new Vector3(), nB = new Vector3(), nC = new Vector3(); - const cb = new Vector3(), ab = new Vector3(); - if (index) { - for (let i = 0, il = index.count; i < il; i += 3) { - const vA = index.getX(i + 0); - const vB = index.getX(i + 1); - const vC = index.getX(i + 2); - pA.fromBufferAttribute(positionAttribute, vA); - pB.fromBufferAttribute(positionAttribute, vB); - pC.fromBufferAttribute(positionAttribute, vC); - cb.subVectors(pC, pB); - ab.subVectors(pA, pB); - cb.cross(ab); - nA.fromBufferAttribute(normalAttribute, vA); - nB.fromBufferAttribute(normalAttribute, vB); - nC.fromBufferAttribute(normalAttribute, vC); - nA.add(cb); - nB.add(cb); - nC.add(cb); - normalAttribute.setXYZ(vA, nA.x, nA.y, nA.z); - normalAttribute.setXYZ(vB, nB.x, nB.y, nB.z); - normalAttribute.setXYZ(vC, nC.x, nC.y, nC.z); - } - } else { - for (let i = 0, il = positionAttribute.count; i < il; i += 3) { - pA.fromBufferAttribute(positionAttribute, i + 0); - pB.fromBufferAttribute(positionAttribute, i + 1); - pC.fromBufferAttribute(positionAttribute, i + 2); - cb.subVectors(pC, pB); - ab.subVectors(pA, pB); - cb.cross(ab); - normalAttribute.setXYZ(i + 0, cb.x, cb.y, cb.z); - normalAttribute.setXYZ(i + 1, cb.x, cb.y, cb.z); - normalAttribute.setXYZ(i + 2, cb.x, cb.y, cb.z); - } - } - this.normalizeNormals(); - normalAttribute.needsUpdate = true; - } +} +Texture.DEFAULT_IMAGE = null; +Texture.DEFAULT_MAPPING = UVMapping; +Texture.DEFAULT_ANISOTROPY = 1; +class Vector4 { + static { + __name(this, "Vector4"); } - normalizeNormals() { - const normals = this.attributes.normal; - for (let i = 0, il = normals.count; i < il; i++) { - _vector$8.fromBufferAttribute(normals, i); - _vector$8.normalize(); - normals.setXYZ(i, _vector$8.x, _vector$8.y, _vector$8.z); - } + constructor(x = 0, y = 0, z = 0, w = 1) { + Vector4.prototype.isVector4 = true; + this.x = x; + this.y = y; + this.z = z; + this.w = w; } - toNonIndexed() { - function convertBufferAttribute(attribute, indices2) { - const array = attribute.array; - const itemSize = attribute.itemSize; - const normalized = attribute.normalized; - const array2 = new array.constructor(indices2.length * itemSize); - let index = 0, index2 = 0; - for (let i = 0, l = indices2.length; i < l; i++) { - if (attribute.isInterleavedBufferAttribute) { - index = indices2[i] * attribute.data.stride + attribute.offset; - } else { - index = indices2[i] * itemSize; - } - for (let j = 0; j < itemSize; j++) { - array2[index2++] = array[index++]; - } - } - return new BufferAttribute(array2, itemSize, normalized); - } - __name(convertBufferAttribute, "convertBufferAttribute"); - if (this.index === null) { - console.warn("THREE.BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed."); - return this; - } - const geometry2 = new BufferGeometry(); - const indices = this.index.array; - const attributes = this.attributes; - for (const name in attributes) { - const attribute = attributes[name]; - const newAttribute = convertBufferAttribute(attribute, indices); - geometry2.setAttribute(name, newAttribute); - } - const morphAttributes = this.morphAttributes; - for (const name in morphAttributes) { - const morphArray = []; - const morphAttribute = morphAttributes[name]; - for (let i = 0, il = morphAttribute.length; i < il; i++) { - const attribute = morphAttribute[i]; - const newAttribute = convertBufferAttribute(attribute, indices); - morphArray.push(newAttribute); - } - geometry2.morphAttributes[name] = morphArray; - } - geometry2.morphTargetsRelative = this.morphTargetsRelative; - const groups = this.groups; - for (let i = 0, l = groups.length; i < l; i++) { - const group = groups[i]; - geometry2.addGroup(group.start, group.count, group.materialIndex); - } - return geometry2; + get width() { + return this.z; } - toJSON() { - const data = { - metadata: { - version: 4.6, - type: "BufferGeometry", - generator: "BufferGeometry.toJSON" - } - }; - data.uuid = this.uuid; - data.type = this.type; - if (this.name !== "") data.name = this.name; - if (Object.keys(this.userData).length > 0) data.userData = this.userData; - if (this.parameters !== void 0) { - const parameters = this.parameters; - for (const key in parameters) { - if (parameters[key] !== void 0) data[key] = parameters[key]; - } - return data; - } - data.data = { attributes: {} }; - const index = this.index; - if (index !== null) { - data.data.index = { - type: index.array.constructor.name, - array: Array.prototype.slice.call(index.array) - }; - } - const attributes = this.attributes; - for (const key in attributes) { - const attribute = attributes[key]; - data.data.attributes[key] = attribute.toJSON(data.data); - } - const morphAttributes = {}; - let hasMorphAttributes = false; - for (const key in this.morphAttributes) { - const attributeArray = this.morphAttributes[key]; - const array = []; - for (let i = 0, il = attributeArray.length; i < il; i++) { - const attribute = attributeArray[i]; - array.push(attribute.toJSON(data.data)); - } - if (array.length > 0) { - morphAttributes[key] = array; - hasMorphAttributes = true; - } - } - if (hasMorphAttributes) { - data.data.morphAttributes = morphAttributes; - data.data.morphTargetsRelative = this.morphTargetsRelative; - } - const groups = this.groups; - if (groups.length > 0) { - data.data.groups = JSON.parse(JSON.stringify(groups)); - } - const boundingSphere = this.boundingSphere; - if (boundingSphere !== null) { - data.data.boundingSphere = { - center: boundingSphere.center.toArray(), - radius: boundingSphere.radius - }; - } - return data; + set width(value) { + this.z = value; } - clone() { - return new this.constructor().copy(this); + get height() { + return this.w; } - copy(source) { - this.index = null; - this.attributes = {}; - this.morphAttributes = {}; - this.groups = []; - this.boundingBox = null; - this.boundingSphere = null; - const data = {}; - this.name = source.name; - const index = source.index; - if (index !== null) { - this.setIndex(index.clone(data)); - } - const attributes = source.attributes; - for (const name in attributes) { - const attribute = attributes[name]; - this.setAttribute(name, attribute.clone(data)); - } - const morphAttributes = source.morphAttributes; - for (const name in morphAttributes) { - const array = []; - const morphAttribute = morphAttributes[name]; - for (let i = 0, l = morphAttribute.length; i < l; i++) { - array.push(morphAttribute[i].clone(data)); - } - this.morphAttributes[name] = array; - } - this.morphTargetsRelative = source.morphTargetsRelative; - const groups = source.groups; - for (let i = 0, l = groups.length; i < l; i++) { - const group = groups[i]; - this.addGroup(group.start, group.count, group.materialIndex); - } - const boundingBox = source.boundingBox; - if (boundingBox !== null) { - this.boundingBox = boundingBox.clone(); - } - const boundingSphere = source.boundingSphere; - if (boundingSphere !== null) { - this.boundingSphere = boundingSphere.clone(); - } - this.drawRange.start = source.drawRange.start; - this.drawRange.count = source.drawRange.count; - this.userData = source.userData; + set height(value) { + this.w = value; + } + set(x, y, z, w) { + this.x = x; + this.y = y; + this.z = z; + this.w = w; return this; } - dispose() { - this.dispatchEvent({ type: "dispose" }); + setScalar(scalar) { + this.x = scalar; + this.y = scalar; + this.z = scalar; + this.w = scalar; + return this; } -} -const _inverseMatrix$3 = /* @__PURE__ */ new Matrix4(); -const _ray$3 = /* @__PURE__ */ new Ray(); -const _sphere$6 = /* @__PURE__ */ new Sphere(); -const _sphereHitAt = /* @__PURE__ */ new Vector3(); -const _vA$1 = /* @__PURE__ */ new Vector3(); -const _vB$1 = /* @__PURE__ */ new Vector3(); -const _vC$1 = /* @__PURE__ */ new Vector3(); -const _tempA = /* @__PURE__ */ new Vector3(); -const _morphA = /* @__PURE__ */ new Vector3(); -const _intersectionPoint = /* @__PURE__ */ new Vector3(); -const _intersectionPointWorld = /* @__PURE__ */ new Vector3(); -class Mesh extends Object3D { - static { - __name(this, "Mesh"); + setX(x) { + this.x = x; + return this; } - constructor(geometry = new BufferGeometry(), material = new MeshBasicMaterial()) { - super(); - this.isMesh = true; - this.type = "Mesh"; - this.geometry = geometry; - this.material = material; - this.updateMorphTargets(); + setY(y) { + this.y = y; + return this; } - copy(source, recursive) { - super.copy(source, recursive); - if (source.morphTargetInfluences !== void 0) { - this.morphTargetInfluences = source.morphTargetInfluences.slice(); - } - if (source.morphTargetDictionary !== void 0) { - this.morphTargetDictionary = Object.assign({}, source.morphTargetDictionary); - } - this.material = Array.isArray(source.material) ? source.material.slice() : source.material; - this.geometry = source.geometry; + setZ(z) { + this.z = z; return this; } - updateMorphTargets() { - const geometry = this.geometry; - const morphAttributes = geometry.morphAttributes; - const keys = Object.keys(morphAttributes); - if (keys.length > 0) { - const morphAttribute = morphAttributes[keys[0]]; - if (morphAttribute !== void 0) { - this.morphTargetInfluences = []; - this.morphTargetDictionary = {}; - for (let m = 0, ml = morphAttribute.length; m < ml; m++) { - const name = morphAttribute[m].name || String(m); - this.morphTargetInfluences.push(0); - this.morphTargetDictionary[name] = m; - } - } - } + setW(w) { + this.w = w; + return this; } - getVertexPosition(index, target) { - const geometry = this.geometry; - const position = geometry.attributes.position; - const morphPosition = geometry.morphAttributes.position; - const morphTargetsRelative = geometry.morphTargetsRelative; - target.fromBufferAttribute(position, index); - const morphInfluences = this.morphTargetInfluences; - if (morphPosition && morphInfluences) { - _morphA.set(0, 0, 0); - for (let i = 0, il = morphPosition.length; i < il; i++) { - const influence = morphInfluences[i]; - const morphAttribute = morphPosition[i]; - if (influence === 0) continue; - _tempA.fromBufferAttribute(morphAttribute, index); - if (morphTargetsRelative) { - _morphA.addScaledVector(_tempA, influence); - } else { - _morphA.addScaledVector(_tempA.sub(target), influence); - } - } - target.add(_morphA); + setComponent(index, value) { + switch (index) { + case 0: + this.x = value; + break; + case 1: + this.y = value; + break; + case 2: + this.z = value; + break; + case 3: + this.w = value; + break; + default: + throw new Error("index is out of range: " + index); } - return target; + return this; } - raycast(raycaster, intersects2) { - const geometry = this.geometry; - const material = this.material; - const matrixWorld = this.matrixWorld; - if (material === void 0) return; - if (geometry.boundingSphere === null) geometry.computeBoundingSphere(); - _sphere$6.copy(geometry.boundingSphere); - _sphere$6.applyMatrix4(matrixWorld); - _ray$3.copy(raycaster.ray).recast(raycaster.near); - if (_sphere$6.containsPoint(_ray$3.origin) === false) { - if (_ray$3.intersectSphere(_sphere$6, _sphereHitAt) === null) return; - if (_ray$3.origin.distanceToSquared(_sphereHitAt) > (raycaster.far - raycaster.near) ** 2) return; - } - _inverseMatrix$3.copy(matrixWorld).invert(); - _ray$3.copy(raycaster.ray).applyMatrix4(_inverseMatrix$3); - if (geometry.boundingBox !== null) { - if (_ray$3.intersectsBox(geometry.boundingBox) === false) return; + getComponent(index) { + switch (index) { + case 0: + return this.x; + case 1: + return this.y; + case 2: + return this.z; + case 3: + return this.w; + default: + throw new Error("index is out of range: " + index); } - this._computeIntersections(raycaster, intersects2, _ray$3); } - _computeIntersections(raycaster, intersects2, rayLocalSpace) { - let intersection; - const geometry = this.geometry; - const material = this.material; - const index = geometry.index; - const position = geometry.attributes.position; - const uv = geometry.attributes.uv; - const uv1 = geometry.attributes.uv1; - const normal = geometry.attributes.normal; - const groups = geometry.groups; - const drawRange = geometry.drawRange; - if (index !== null) { - if (Array.isArray(material)) { - for (let i = 0, il = groups.length; i < il; i++) { - const group = groups[i]; - const groupMaterial = material[group.materialIndex]; - const start = Math.max(group.start, drawRange.start); - const end = Math.min(index.count, Math.min(group.start + group.count, drawRange.start + drawRange.count)); - for (let j = start, jl = end; j < jl; j += 3) { - const a = index.getX(j); - const b = index.getX(j + 1); - const c = index.getX(j + 2); - intersection = checkGeometryIntersection(this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c); - if (intersection) { - intersection.faceIndex = Math.floor(j / 3); - intersection.face.materialIndex = group.materialIndex; - intersects2.push(intersection); - } - } - } - } else { - const start = Math.max(0, drawRange.start); - const end = Math.min(index.count, drawRange.start + drawRange.count); - for (let i = start, il = end; i < il; i += 3) { - const a = index.getX(i); - const b = index.getX(i + 1); - const c = index.getX(i + 2); - intersection = checkGeometryIntersection(this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c); - if (intersection) { - intersection.faceIndex = Math.floor(i / 3); - intersects2.push(intersection); - } - } - } - } else if (position !== void 0) { - if (Array.isArray(material)) { - for (let i = 0, il = groups.length; i < il; i++) { - const group = groups[i]; - const groupMaterial = material[group.materialIndex]; - const start = Math.max(group.start, drawRange.start); - const end = Math.min(position.count, Math.min(group.start + group.count, drawRange.start + drawRange.count)); - for (let j = start, jl = end; j < jl; j += 3) { - const a = j; - const b = j + 1; - const c = j + 2; - intersection = checkGeometryIntersection(this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c); - if (intersection) { - intersection.faceIndex = Math.floor(j / 3); - intersection.face.materialIndex = group.materialIndex; - intersects2.push(intersection); - } - } - } - } else { - const start = Math.max(0, drawRange.start); - const end = Math.min(position.count, drawRange.start + drawRange.count); - for (let i = start, il = end; i < il; i += 3) { - const a = i; - const b = i + 1; - const c = i + 2; - intersection = checkGeometryIntersection(this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c); - if (intersection) { - intersection.faceIndex = Math.floor(i / 3); - intersects2.push(intersection); - } - } - } - } + clone() { + return new this.constructor(this.x, this.y, this.z, this.w); } -} -function checkIntersection$1(object, material, raycaster, ray, pA, pB, pC, point) { - let intersect2; - if (material.side === BackSide) { - intersect2 = ray.intersectTriangle(pC, pB, pA, true, point); - } else { - intersect2 = ray.intersectTriangle(pA, pB, pC, material.side === FrontSide, point); + copy(v) { + this.x = v.x; + this.y = v.y; + this.z = v.z; + this.w = v.w !== void 0 ? v.w : 1; + return this; } - if (intersect2 === null) return null; - _intersectionPointWorld.copy(point); - _intersectionPointWorld.applyMatrix4(object.matrixWorld); - const distance = raycaster.ray.origin.distanceTo(_intersectionPointWorld); - if (distance < raycaster.near || distance > raycaster.far) return null; - return { - distance, - point: _intersectionPointWorld.clone(), - object - }; -} -__name(checkIntersection$1, "checkIntersection$1"); -function checkGeometryIntersection(object, material, raycaster, ray, uv, uv1, normal, a, b, c) { - object.getVertexPosition(a, _vA$1); - object.getVertexPosition(b, _vB$1); - object.getVertexPosition(c, _vC$1); - const intersection = checkIntersection$1(object, material, raycaster, ray, _vA$1, _vB$1, _vC$1, _intersectionPoint); - if (intersection) { - const barycoord = new Vector3(); - Triangle.getBarycoord(_intersectionPoint, _vA$1, _vB$1, _vC$1, barycoord); - if (uv) { - intersection.uv = Triangle.getInterpolatedAttribute(uv, a, b, c, barycoord, new Vector2()); - } - if (uv1) { - intersection.uv1 = Triangle.getInterpolatedAttribute(uv1, a, b, c, barycoord, new Vector2()); - } - if (normal) { - intersection.normal = Triangle.getInterpolatedAttribute(normal, a, b, c, barycoord, new Vector3()); - if (intersection.normal.dot(ray.direction) > 0) { - intersection.normal.multiplyScalar(-1); - } - } - const face = { - a, - b, - c, - normal: new Vector3(), - materialIndex: 0 - }; - Triangle.getNormal(_vA$1, _vB$1, _vC$1, face.normal); - intersection.face = face; - intersection.barycoord = barycoord; + add(v) { + this.x += v.x; + this.y += v.y; + this.z += v.z; + this.w += v.w; + return this; } - return intersection; -} -__name(checkGeometryIntersection, "checkGeometryIntersection"); -class BoxGeometry extends BufferGeometry { - static { - __name(this, "BoxGeometry"); + addScalar(s) { + this.x += s; + this.y += s; + this.z += s; + this.w += s; + return this; } - constructor(width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1) { - super(); - this.type = "BoxGeometry"; - this.parameters = { - width, - height, - depth, - widthSegments, - heightSegments, - depthSegments - }; - const scope = this; - widthSegments = Math.floor(widthSegments); - heightSegments = Math.floor(heightSegments); - depthSegments = Math.floor(depthSegments); - const indices = []; - const vertices = []; - const normals = []; - const uvs = []; - let numberOfVertices = 0; - let groupStart = 0; - buildPlane("z", "y", "x", -1, -1, depth, height, width, depthSegments, heightSegments, 0); - buildPlane("z", "y", "x", 1, -1, depth, height, -width, depthSegments, heightSegments, 1); - buildPlane("x", "z", "y", 1, 1, width, depth, height, widthSegments, depthSegments, 2); - buildPlane("x", "z", "y", 1, -1, width, depth, -height, widthSegments, depthSegments, 3); - buildPlane("x", "y", "z", 1, -1, width, height, depth, widthSegments, heightSegments, 4); - buildPlane("x", "y", "z", -1, -1, width, height, -depth, widthSegments, heightSegments, 5); - this.setIndex(indices); - this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); - this.setAttribute("normal", new Float32BufferAttribute(normals, 3)); - this.setAttribute("uv", new Float32BufferAttribute(uvs, 2)); - function buildPlane(u, v, w, udir, vdir, width2, height2, depth2, gridX, gridY, materialIndex) { - const segmentWidth = width2 / gridX; - const segmentHeight = height2 / gridY; - const widthHalf = width2 / 2; - const heightHalf = height2 / 2; - const depthHalf = depth2 / 2; - const gridX1 = gridX + 1; - const gridY1 = gridY + 1; - let vertexCounter = 0; - let groupCount = 0; - const vector = new Vector3(); - for (let iy = 0; iy < gridY1; iy++) { - const y = iy * segmentHeight - heightHalf; - for (let ix = 0; ix < gridX1; ix++) { - const x = ix * segmentWidth - widthHalf; - vector[u] = x * udir; - vector[v] = y * vdir; - vector[w] = depthHalf; - vertices.push(vector.x, vector.y, vector.z); - vector[u] = 0; - vector[v] = 0; - vector[w] = depth2 > 0 ? 1 : -1; - normals.push(vector.x, vector.y, vector.z); - uvs.push(ix / gridX); - uvs.push(1 - iy / gridY); - vertexCounter += 1; - } - } - for (let iy = 0; iy < gridY; iy++) { - for (let ix = 0; ix < gridX; ix++) { - const a = numberOfVertices + ix + gridX1 * iy; - const b = numberOfVertices + ix + gridX1 * (iy + 1); - const c = numberOfVertices + (ix + 1) + gridX1 * (iy + 1); - const d = numberOfVertices + (ix + 1) + gridX1 * iy; - indices.push(a, b, d); - indices.push(b, c, d); - groupCount += 6; - } - } - scope.addGroup(groupStart, groupCount, materialIndex); - groupStart += groupCount; - numberOfVertices += vertexCounter; - } - __name(buildPlane, "buildPlane"); + addVectors(a, b) { + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + this.w = a.w + b.w; + return this; } - copy(source) { - super.copy(source); - this.parameters = Object.assign({}, source.parameters); + addScaledVector(v, s) { + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + this.w += v.w * s; return this; } - static fromJSON(data) { - return new BoxGeometry(data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments); + sub(v) { + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + this.w -= v.w; + return this; } -} -function cloneUniforms(src) { - const dst = {}; - for (const u in src) { - dst[u] = {}; - for (const p in src[u]) { - const property = src[u][p]; - if (property && (property.isColor || property.isMatrix3 || property.isMatrix4 || property.isVector2 || property.isVector3 || property.isVector4 || property.isTexture || property.isQuaternion)) { - if (property.isRenderTargetTexture) { - console.warn("UniformsUtils: Textures of render targets cannot be cloned via cloneUniforms() or mergeUniforms()."); - dst[u][p] = null; + subScalar(s) { + this.x -= s; + this.y -= s; + this.z -= s; + this.w -= s; + return this; + } + subVectors(a, b) { + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + this.w = a.w - b.w; + return this; + } + multiply(v) { + this.x *= v.x; + this.y *= v.y; + this.z *= v.z; + this.w *= v.w; + return this; + } + multiplyScalar(scalar) { + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + this.w *= scalar; + return this; + } + applyMatrix4(m) { + const x = this.x, y = this.y, z = this.z, w = this.w; + const e = m.elements; + this.x = e[0] * x + e[4] * y + e[8] * z + e[12] * w; + this.y = e[1] * x + e[5] * y + e[9] * z + e[13] * w; + this.z = e[2] * x + e[6] * y + e[10] * z + e[14] * w; + this.w = e[3] * x + e[7] * y + e[11] * z + e[15] * w; + return this; + } + divide(v) { + this.x /= v.x; + this.y /= v.y; + this.z /= v.z; + this.w /= v.w; + return this; + } + divideScalar(scalar) { + return this.multiplyScalar(1 / scalar); + } + setAxisAngleFromQuaternion(q) { + this.w = 2 * Math.acos(q.w); + const s = Math.sqrt(1 - q.w * q.w); + if (s < 1e-4) { + this.x = 1; + this.y = 0; + this.z = 0; + } else { + this.x = q.x / s; + this.y = q.y / s; + this.z = q.z / s; + } + return this; + } + setAxisAngleFromRotationMatrix(m) { + let angle, x, y, z; + const epsilon = 0.01, epsilon2 = 0.1, te2 = m.elements, m11 = te2[0], m12 = te2[4], m13 = te2[8], m21 = te2[1], m22 = te2[5], m23 = te2[9], m31 = te2[2], m32 = te2[6], m33 = te2[10]; + if (Math.abs(m12 - m21) < epsilon && Math.abs(m13 - m31) < epsilon && Math.abs(m23 - m32) < epsilon) { + if (Math.abs(m12 + m21) < epsilon2 && Math.abs(m13 + m31) < epsilon2 && Math.abs(m23 + m32) < epsilon2 && Math.abs(m11 + m22 + m33 - 3) < epsilon2) { + this.set(1, 0, 0, 0); + return this; + } + angle = Math.PI; + const xx = (m11 + 1) / 2; + const yy = (m22 + 1) / 2; + const zz = (m33 + 1) / 2; + const xy = (m12 + m21) / 4; + const xz = (m13 + m31) / 4; + const yz = (m23 + m32) / 4; + if (xx > yy && xx > zz) { + if (xx < epsilon) { + x = 0; + y = 0.707106781; + z = 0.707106781; } else { - dst[u][p] = property.clone(); + x = Math.sqrt(xx); + y = xy / x; + z = xz / x; + } + } else if (yy > zz) { + if (yy < epsilon) { + x = 0.707106781; + y = 0; + z = 0.707106781; + } else { + y = Math.sqrt(yy); + x = xy / y; + z = yz / y; } - } else if (Array.isArray(property)) { - dst[u][p] = property.slice(); } else { - dst[u][p] = property; + if (zz < epsilon) { + x = 0.707106781; + y = 0.707106781; + z = 0; + } else { + z = Math.sqrt(zz); + x = xz / z; + y = yz / z; + } } + this.set(x, y, z, angle); + return this; } + let s = Math.sqrt((m32 - m23) * (m32 - m23) + (m13 - m31) * (m13 - m31) + (m21 - m12) * (m21 - m12)); + if (Math.abs(s) < 1e-3) s = 1; + this.x = (m32 - m23) / s; + this.y = (m13 - m31) / s; + this.z = (m21 - m12) / s; + this.w = Math.acos((m11 + m22 + m33 - 1) / 2); + return this; } - return dst; -} -__name(cloneUniforms, "cloneUniforms"); -function mergeUniforms(uniforms) { - const merged = {}; - for (let u = 0; u < uniforms.length; u++) { - const tmp2 = cloneUniforms(uniforms[u]); - for (const p in tmp2) { - merged[p] = tmp2[p]; - } + setFromMatrixPosition(m) { + const e = m.elements; + this.x = e[12]; + this.y = e[13]; + this.z = e[14]; + this.w = e[15]; + return this; } - return merged; -} -__name(mergeUniforms, "mergeUniforms"); -function cloneUniformsGroups(src) { - const dst = []; - for (let u = 0; u < src.length; u++) { - dst.push(src[u].clone()); + min(v) { + this.x = Math.min(this.x, v.x); + this.y = Math.min(this.y, v.y); + this.z = Math.min(this.z, v.z); + this.w = Math.min(this.w, v.w); + return this; } - return dst; -} -__name(cloneUniformsGroups, "cloneUniformsGroups"); -function getUnlitUniformColorSpace(renderer) { - const currentRenderTarget = renderer.getRenderTarget(); - if (currentRenderTarget === null) { - return renderer.outputColorSpace; + max(v) { + this.x = Math.max(this.x, v.x); + this.y = Math.max(this.y, v.y); + this.z = Math.max(this.z, v.z); + this.w = Math.max(this.w, v.w); + return this; } - if (currentRenderTarget.isXRRenderTarget === true) { - return currentRenderTarget.texture.colorSpace; + clamp(min, max2) { + this.x = Math.max(min.x, Math.min(max2.x, this.x)); + this.y = Math.max(min.y, Math.min(max2.y, this.y)); + this.z = Math.max(min.z, Math.min(max2.z, this.z)); + this.w = Math.max(min.w, Math.min(max2.w, this.w)); + return this; } - return ColorManagement.workingColorSpace; -} -__name(getUnlitUniformColorSpace, "getUnlitUniformColorSpace"); -const UniformsUtils = { clone: cloneUniforms, merge: mergeUniforms }; -var default_vertex = "void main() {\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}"; -var default_fragment = "void main() {\n gl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}"; -class ShaderMaterial extends Material { - static { - __name(this, "ShaderMaterial"); + clampScalar(minVal, maxVal) { + this.x = Math.max(minVal, Math.min(maxVal, this.x)); + this.y = Math.max(minVal, Math.min(maxVal, this.y)); + this.z = Math.max(minVal, Math.min(maxVal, this.z)); + this.w = Math.max(minVal, Math.min(maxVal, this.w)); + return this; } - static get type() { - return "ShaderMaterial"; + clampLength(min, max2) { + const length = this.length(); + return this.divideScalar(length || 1).multiplyScalar(Math.max(min, Math.min(max2, length))); } - constructor(parameters) { - super(); - this.isShaderMaterial = true; - this.defines = {}; - this.uniforms = {}; - this.uniformsGroups = []; - this.vertexShader = default_vertex; - this.fragmentShader = default_fragment; - this.linewidth = 1; - this.wireframe = false; - this.wireframeLinewidth = 1; - this.fog = false; - this.lights = false; - this.clipping = false; - this.forceSinglePass = true; - this.extensions = { - clipCullDistance: false, - // set to use vertex shader clipping - multiDraw: false - // set to use vertex shader multi_draw / enable gl_DrawID - }; - this.defaultAttributeValues = { - "color": [1, 1, 1], - "uv": [0, 0], - "uv1": [0, 0] - }; - this.index0AttributeName = void 0; - this.uniformsNeedUpdate = false; - this.glslVersion = null; - if (parameters !== void 0) { - this.setValues(parameters); - } - } - copy(source) { - super.copy(source); - this.fragmentShader = source.fragmentShader; - this.vertexShader = source.vertexShader; - this.uniforms = cloneUniforms(source.uniforms); - this.uniformsGroups = cloneUniformsGroups(source.uniformsGroups); - this.defines = Object.assign({}, source.defines); - this.wireframe = source.wireframe; - this.wireframeLinewidth = source.wireframeLinewidth; - this.fog = source.fog; - this.lights = source.lights; - this.clipping = source.clipping; - this.extensions = Object.assign({}, source.extensions); - this.glslVersion = source.glslVersion; + floor() { + this.x = Math.floor(this.x); + this.y = Math.floor(this.y); + this.z = Math.floor(this.z); + this.w = Math.floor(this.w); return this; } - toJSON(meta) { - const data = super.toJSON(meta); - data.glslVersion = this.glslVersion; - data.uniforms = {}; - for (const name in this.uniforms) { - const uniform = this.uniforms[name]; - const value = uniform.value; - if (value && value.isTexture) { - data.uniforms[name] = { - type: "t", - value: value.toJSON(meta).uuid - }; - } else if (value && value.isColor) { - data.uniforms[name] = { - type: "c", - value: value.getHex() - }; - } else if (value && value.isVector2) { - data.uniforms[name] = { - type: "v2", - value: value.toArray() - }; - } else if (value && value.isVector3) { - data.uniforms[name] = { - type: "v3", - value: value.toArray() - }; - } else if (value && value.isVector4) { - data.uniforms[name] = { - type: "v4", - value: value.toArray() - }; - } else if (value && value.isMatrix3) { - data.uniforms[name] = { - type: "m3", - value: value.toArray() - }; - } else if (value && value.isMatrix4) { - data.uniforms[name] = { - type: "m4", - value: value.toArray() - }; - } else { - data.uniforms[name] = { - value - }; - } - } - if (Object.keys(this.defines).length > 0) data.defines = this.defines; - data.vertexShader = this.vertexShader; - data.fragmentShader = this.fragmentShader; - data.lights = this.lights; - data.clipping = this.clipping; - const extensions = {}; - for (const key in this.extensions) { - if (this.extensions[key] === true) extensions[key] = true; - } - if (Object.keys(extensions).length > 0) data.extensions = extensions; - return data; + ceil() { + this.x = Math.ceil(this.x); + this.y = Math.ceil(this.y); + this.z = Math.ceil(this.z); + this.w = Math.ceil(this.w); + return this; } -} -class Camera extends Object3D { - static { - __name(this, "Camera"); + round() { + this.x = Math.round(this.x); + this.y = Math.round(this.y); + this.z = Math.round(this.z); + this.w = Math.round(this.w); + return this; } - constructor() { - super(); - this.isCamera = true; - this.type = "Camera"; - this.matrixWorldInverse = new Matrix4(); - this.projectionMatrix = new Matrix4(); - this.projectionMatrixInverse = new Matrix4(); - this.coordinateSystem = WebGLCoordinateSystem; + roundToZero() { + this.x = Math.trunc(this.x); + this.y = Math.trunc(this.y); + this.z = Math.trunc(this.z); + this.w = Math.trunc(this.w); + return this; } - copy(source, recursive) { - super.copy(source, recursive); - this.matrixWorldInverse.copy(source.matrixWorldInverse); - this.projectionMatrix.copy(source.projectionMatrix); - this.projectionMatrixInverse.copy(source.projectionMatrixInverse); - this.coordinateSystem = source.coordinateSystem; + negate() { + this.x = -this.x; + this.y = -this.y; + this.z = -this.z; + this.w = -this.w; return this; } - getWorldDirection(target) { - return super.getWorldDirection(target).negate(); + dot(v) { + return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w; } - updateMatrixWorld(force) { - super.updateMatrixWorld(force); - this.matrixWorldInverse.copy(this.matrixWorld).invert(); + lengthSq() { + return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w; } - updateWorldMatrix(updateParents, updateChildren) { - super.updateWorldMatrix(updateParents, updateChildren); - this.matrixWorldInverse.copy(this.matrixWorld).invert(); + length() { + return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w); } - clone() { - return new this.constructor().copy(this); + manhattanLength() { + return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z) + Math.abs(this.w); } -} -const _v3$1 = /* @__PURE__ */ new Vector3(); -const _minTarget = /* @__PURE__ */ new Vector2(); -const _maxTarget = /* @__PURE__ */ new Vector2(); -class PerspectiveCamera extends Camera { - static { - __name(this, "PerspectiveCamera"); + normalize() { + return this.divideScalar(this.length() || 1); } - constructor(fov2 = 50, aspect2 = 1, near = 0.1, far = 2e3) { - super(); - this.isPerspectiveCamera = true; - this.type = "PerspectiveCamera"; - this.fov = fov2; - this.zoom = 1; - this.near = near; - this.far = far; - this.focus = 10; - this.aspect = aspect2; - this.view = null; - this.filmGauge = 35; - this.filmOffset = 0; - this.updateProjectionMatrix(); + setLength(length) { + return this.normalize().multiplyScalar(length); } - copy(source, recursive) { - super.copy(source, recursive); - this.fov = source.fov; - this.zoom = source.zoom; - this.near = source.near; - this.far = source.far; - this.focus = source.focus; - this.aspect = source.aspect; - this.view = source.view === null ? null : Object.assign({}, source.view); - this.filmGauge = source.filmGauge; - this.filmOffset = source.filmOffset; + lerp(v, alpha) { + this.x += (v.x - this.x) * alpha; + this.y += (v.y - this.y) * alpha; + this.z += (v.z - this.z) * alpha; + this.w += (v.w - this.w) * alpha; return this; } - /** - * Sets the FOV by focal length in respect to the current .filmGauge. - * - * The default film gauge is 35, so that the focal length can be specified for - * a 35mm (full frame) camera. - * - * Values for focal length and film gauge must have the same unit. - */ - setFocalLength(focalLength) { - const vExtentSlope = 0.5 * this.getFilmHeight() / focalLength; - this.fov = RAD2DEG * 2 * Math.atan(vExtentSlope); - this.updateProjectionMatrix(); + lerpVectors(v1, v2, alpha) { + this.x = v1.x + (v2.x - v1.x) * alpha; + this.y = v1.y + (v2.y - v1.y) * alpha; + this.z = v1.z + (v2.z - v1.z) * alpha; + this.w = v1.w + (v2.w - v1.w) * alpha; + return this; } - /** - * Calculates the focal length from the current .fov and .filmGauge. - */ - getFocalLength() { - const vExtentSlope = Math.tan(DEG2RAD * 0.5 * this.fov); - return 0.5 * this.getFilmHeight() / vExtentSlope; + equals(v) { + return v.x === this.x && v.y === this.y && v.z === this.z && v.w === this.w; } - getEffectiveFOV() { - return RAD2DEG * 2 * Math.atan( - Math.tan(DEG2RAD * 0.5 * this.fov) / this.zoom - ); + fromArray(array, offset = 0) { + this.x = array[offset]; + this.y = array[offset + 1]; + this.z = array[offset + 2]; + this.w = array[offset + 3]; + return this; } - getFilmWidth() { - return this.filmGauge * Math.min(this.aspect, 1); + toArray(array = [], offset = 0) { + array[offset] = this.x; + array[offset + 1] = this.y; + array[offset + 2] = this.z; + array[offset + 3] = this.w; + return array; } - getFilmHeight() { - return this.filmGauge / Math.max(this.aspect, 1); + fromBufferAttribute(attribute, index) { + this.x = attribute.getX(index); + this.y = attribute.getY(index); + this.z = attribute.getZ(index); + this.w = attribute.getW(index); + return this; } - /** - * Computes the 2D bounds of the camera's viewable rectangle at a given distance along the viewing direction. - * Sets minTarget and maxTarget to the coordinates of the lower-left and upper-right corners of the view rectangle. - */ - getViewBounds(distance, minTarget, maxTarget) { - _v3$1.set(-1, -1, 0.5).applyMatrix4(this.projectionMatrixInverse); - minTarget.set(_v3$1.x, _v3$1.y).multiplyScalar(-distance / _v3$1.z); - _v3$1.set(1, 1, 0.5).applyMatrix4(this.projectionMatrixInverse); - maxTarget.set(_v3$1.x, _v3$1.y).multiplyScalar(-distance / _v3$1.z); + random() { + this.x = Math.random(); + this.y = Math.random(); + this.z = Math.random(); + this.w = Math.random(); + return this; } - /** - * Computes the width and height of the camera's viewable rectangle at a given distance along the viewing direction. - * Copies the result into the target Vector2, where x is width and y is height. - */ - getViewSize(distance, target) { - this.getViewBounds(distance, _minTarget, _maxTarget); - return target.subVectors(_maxTarget, _minTarget); + *[Symbol.iterator]() { + yield this.x; + yield this.y; + yield this.z; + yield this.w; } - /** - * Sets an offset in a larger frustum. This is useful for multi-window or - * multi-monitor/multi-machine setups. - * - * For example, if you have 3x2 monitors and each monitor is 1920x1080 and - * the monitors are in grid like this - * - * +---+---+---+ - * | A | B | C | - * +---+---+---+ - * | D | E | F | - * +---+---+---+ - * - * then for each monitor you would call it like this - * - * const w = 1920; - * const h = 1080; - * const fullWidth = w * 3; - * const fullHeight = h * 2; - * - * --A-- - * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 0, w, h ); - * --B-- - * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 0, w, h ); - * --C-- - * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 0, w, h ); - * --D-- - * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 1, w, h ); - * --E-- - * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 1, w, h ); - * --F-- - * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 1, w, h ); - * - * Note there is no reason monitors have to be the same size or in a grid. - */ - setViewOffset(fullWidth, fullHeight, x, y, width, height) { - this.aspect = fullWidth / fullHeight; - if (this.view === null) { - this.view = { - enabled: true, - fullWidth: 1, - fullHeight: 1, - offsetX: 0, - offsetY: 0, - width: 1, - height: 1 - }; +} +class RenderTarget extends EventDispatcher { + static { + __name(this, "RenderTarget"); + } + constructor(width = 1, height = 1, options = {}) { + super(); + this.isRenderTarget = true; + this.width = width; + this.height = height; + this.depth = 1; + this.scissor = new Vector4(0, 0, width, height); + this.scissorTest = false; + this.viewport = new Vector4(0, 0, width, height); + const image = { width, height, depth: 1 }; + options = Object.assign({ + generateMipmaps: false, + internalFormat: null, + minFilter: LinearFilter, + depthBuffer: true, + stencilBuffer: false, + resolveDepthBuffer: true, + resolveStencilBuffer: true, + depthTexture: null, + samples: 0, + count: 1 + }, options); + const texture = new Texture(image, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.colorSpace); + texture.flipY = false; + texture.generateMipmaps = options.generateMipmaps; + texture.internalFormat = options.internalFormat; + this.textures = []; + const count = options.count; + for (let i = 0; i < count; i++) { + this.textures[i] = texture.clone(); + this.textures[i].isRenderTargetTexture = true; } - this.view.enabled = true; - this.view.fullWidth = fullWidth; - this.view.fullHeight = fullHeight; - this.view.offsetX = x; - this.view.offsetY = y; - this.view.width = width; - this.view.height = height; - this.updateProjectionMatrix(); + this.depthBuffer = options.depthBuffer; + this.stencilBuffer = options.stencilBuffer; + this.resolveDepthBuffer = options.resolveDepthBuffer; + this.resolveStencilBuffer = options.resolveStencilBuffer; + this.depthTexture = options.depthTexture; + this.samples = options.samples; } - clearViewOffset() { - if (this.view !== null) { - this.view.enabled = false; + get texture() { + return this.textures[0]; + } + set texture(value) { + this.textures[0] = value; + } + setSize(width, height, depth = 1) { + if (this.width !== width || this.height !== height || this.depth !== depth) { + this.width = width; + this.height = height; + this.depth = depth; + for (let i = 0, il = this.textures.length; i < il; i++) { + this.textures[i].image.width = width; + this.textures[i].image.height = height; + this.textures[i].image.depth = depth; + } + this.dispose(); } - this.updateProjectionMatrix(); + this.viewport.set(0, 0, width, height); + this.scissor.set(0, 0, width, height); } - updateProjectionMatrix() { - const near = this.near; - let top = near * Math.tan(DEG2RAD * 0.5 * this.fov) / this.zoom; - let height = 2 * top; - let width = this.aspect * height; - let left = -0.5 * width; - const view = this.view; - if (this.view !== null && this.view.enabled) { - const fullWidth = view.fullWidth, fullHeight = view.fullHeight; - left += view.offsetX * width / fullWidth; - top -= view.offsetY * height / fullHeight; - width *= view.width / fullWidth; - height *= view.height / fullHeight; + clone() { + return new this.constructor().copy(this); + } + copy(source) { + this.width = source.width; + this.height = source.height; + this.depth = source.depth; + this.scissor.copy(source.scissor); + this.scissorTest = source.scissorTest; + this.viewport.copy(source.viewport); + this.textures.length = 0; + for (let i = 0, il = source.textures.length; i < il; i++) { + this.textures[i] = source.textures[i].clone(); + this.textures[i].isRenderTargetTexture = true; } - const skew = this.filmOffset; - if (skew !== 0) left += near * skew / this.getFilmWidth(); - this.projectionMatrix.makePerspective(left, left + width, top, top - height, near, this.far, this.coordinateSystem); - this.projectionMatrixInverse.copy(this.projectionMatrix).invert(); + const image = Object.assign({}, source.texture.image); + this.texture.source = new Source(image); + this.depthBuffer = source.depthBuffer; + this.stencilBuffer = source.stencilBuffer; + this.resolveDepthBuffer = source.resolveDepthBuffer; + this.resolveStencilBuffer = source.resolveStencilBuffer; + if (source.depthTexture !== null) this.depthTexture = source.depthTexture.clone(); + this.samples = source.samples; + return this; } - toJSON(meta) { - const data = super.toJSON(meta); - data.object.fov = this.fov; - data.object.zoom = this.zoom; - data.object.near = this.near; - data.object.far = this.far; - data.object.focus = this.focus; - data.object.aspect = this.aspect; - if (this.view !== null) data.object.view = Object.assign({}, this.view); - data.object.filmGauge = this.filmGauge; - data.object.filmOffset = this.filmOffset; - return data; + dispose() { + this.dispatchEvent({ type: "dispose" }); } } -const fov = -90; -const aspect = 1; -class CubeCamera extends Object3D { +class WebGLRenderTarget extends RenderTarget { static { - __name(this, "CubeCamera"); + __name(this, "WebGLRenderTarget"); } - constructor(near, far, renderTarget) { - super(); - this.type = "CubeCamera"; - this.renderTarget = renderTarget; - this.coordinateSystem = null; - this.activeMipmapLevel = 0; - const cameraPX = new PerspectiveCamera(fov, aspect, near, far); - cameraPX.layers = this.layers; - this.add(cameraPX); - const cameraNX = new PerspectiveCamera(fov, aspect, near, far); - cameraNX.layers = this.layers; - this.add(cameraNX); - const cameraPY = new PerspectiveCamera(fov, aspect, near, far); - cameraPY.layers = this.layers; - this.add(cameraPY); - const cameraNY = new PerspectiveCamera(fov, aspect, near, far); - cameraNY.layers = this.layers; - this.add(cameraNY); - const cameraPZ = new PerspectiveCamera(fov, aspect, near, far); - cameraPZ.layers = this.layers; - this.add(cameraPZ); - const cameraNZ = new PerspectiveCamera(fov, aspect, near, far); - cameraNZ.layers = this.layers; - this.add(cameraNZ); - } - updateCoordinateSystem() { - const coordinateSystem = this.coordinateSystem; - const cameras = this.children.concat(); - const [cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ] = cameras; - for (const camera of cameras) this.remove(camera); - if (coordinateSystem === WebGLCoordinateSystem) { - cameraPX.up.set(0, 1, 0); - cameraPX.lookAt(1, 0, 0); - cameraNX.up.set(0, 1, 0); - cameraNX.lookAt(-1, 0, 0); - cameraPY.up.set(0, 0, -1); - cameraPY.lookAt(0, 1, 0); - cameraNY.up.set(0, 0, 1); - cameraNY.lookAt(0, -1, 0); - cameraPZ.up.set(0, 1, 0); - cameraPZ.lookAt(0, 0, 1); - cameraNZ.up.set(0, 1, 0); - cameraNZ.lookAt(0, 0, -1); - } else if (coordinateSystem === WebGPUCoordinateSystem) { - cameraPX.up.set(0, -1, 0); - cameraPX.lookAt(-1, 0, 0); - cameraNX.up.set(0, -1, 0); - cameraNX.lookAt(1, 0, 0); - cameraPY.up.set(0, 0, 1); - cameraPY.lookAt(0, 1, 0); - cameraNY.up.set(0, 0, -1); - cameraNY.lookAt(0, -1, 0); - cameraPZ.up.set(0, -1, 0); - cameraPZ.lookAt(0, 0, 1); - cameraNZ.up.set(0, -1, 0); - cameraNZ.lookAt(0, 0, -1); - } else { - throw new Error("THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: " + coordinateSystem); - } - for (const camera of cameras) { - this.add(camera); - camera.updateMatrixWorld(); - } - } - update(renderer, scene) { - if (this.parent === null) this.updateMatrixWorld(); - const { renderTarget, activeMipmapLevel } = this; - if (this.coordinateSystem !== renderer.coordinateSystem) { - this.coordinateSystem = renderer.coordinateSystem; - this.updateCoordinateSystem(); - } - const [cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ] = this.children; - const currentRenderTarget = renderer.getRenderTarget(); - const currentActiveCubeFace = renderer.getActiveCubeFace(); - const currentActiveMipmapLevel = renderer.getActiveMipmapLevel(); - const currentXrEnabled = renderer.xr.enabled; - renderer.xr.enabled = false; - const generateMipmaps = renderTarget.texture.generateMipmaps; - renderTarget.texture.generateMipmaps = false; - renderer.setRenderTarget(renderTarget, 0, activeMipmapLevel); - renderer.render(scene, cameraPX); - renderer.setRenderTarget(renderTarget, 1, activeMipmapLevel); - renderer.render(scene, cameraNX); - renderer.setRenderTarget(renderTarget, 2, activeMipmapLevel); - renderer.render(scene, cameraPY); - renderer.setRenderTarget(renderTarget, 3, activeMipmapLevel); - renderer.render(scene, cameraNY); - renderer.setRenderTarget(renderTarget, 4, activeMipmapLevel); - renderer.render(scene, cameraPZ); - renderTarget.texture.generateMipmaps = generateMipmaps; - renderer.setRenderTarget(renderTarget, 5, activeMipmapLevel); - renderer.render(scene, cameraNZ); - renderer.setRenderTarget(currentRenderTarget, currentActiveCubeFace, currentActiveMipmapLevel); - renderer.xr.enabled = currentXrEnabled; - renderTarget.texture.needsPMREMUpdate = true; + constructor(width = 1, height = 1, options = {}) { + super(width, height, options); + this.isWebGLRenderTarget = true; } } -class CubeTexture extends Texture { +class DataArrayTexture extends Texture { static { - __name(this, "CubeTexture"); + __name(this, "DataArrayTexture"); } - constructor(images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace) { - images = images !== void 0 ? images : []; - mapping = mapping !== void 0 ? mapping : CubeReflectionMapping; - super(images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace); - this.isCubeTexture = true; + constructor(data = null, width = 1, height = 1, depth = 1) { + super(null); + this.isDataArrayTexture = true; + this.image = { data, width, height, depth }; + this.magFilter = NearestFilter; + this.minFilter = NearestFilter; + this.wrapR = ClampToEdgeWrapping; + this.generateMipmaps = false; this.flipY = false; + this.unpackAlignment = 1; + this.layerUpdates = /* @__PURE__ */ new Set(); } - get images() { - return this.image; + addLayerUpdate(layerIndex) { + this.layerUpdates.add(layerIndex); } - set images(value) { - this.image = value; + clearLayerUpdates() { + this.layerUpdates.clear(); } } -class WebGLCubeRenderTarget extends WebGLRenderTarget { +class WebGLArrayRenderTarget extends WebGLRenderTarget { static { - __name(this, "WebGLCubeRenderTarget"); + __name(this, "WebGLArrayRenderTarget"); } - constructor(size = 1, options = {}) { - super(size, size, options); - this.isWebGLCubeRenderTarget = true; - const image = { width: size, height: size, depth: 1 }; - const images = [image, image, image, image, image, image]; - this.texture = new CubeTexture(images, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.colorSpace); + constructor(width = 1, height = 1, depth = 1, options = {}) { + super(width, height, options); + this.isWebGLArrayRenderTarget = true; + this.depth = depth; + this.texture = new DataArrayTexture(null, width, height, depth); this.texture.isRenderTargetTexture = true; - this.texture.generateMipmaps = options.generateMipmaps !== void 0 ? options.generateMipmaps : false; - this.texture.minFilter = options.minFilter !== void 0 ? options.minFilter : LinearFilter; - } - fromEquirectangularTexture(renderer, texture) { - this.texture.type = texture.type; - this.texture.colorSpace = texture.colorSpace; - this.texture.generateMipmaps = texture.generateMipmaps; - this.texture.minFilter = texture.minFilter; - this.texture.magFilter = texture.magFilter; - const shader = { - uniforms: { - tEquirect: { value: null } - }, - vertexShader: ( - /* glsl */ - ` - - varying vec3 vWorldDirection; - - vec3 transformDirection( in vec3 dir, in mat4 matrix ) { - - return normalize( ( matrix * vec4( dir, 0.0 ) ).xyz ); - - } - - void main() { - - vWorldDirection = transformDirection( position, modelMatrix ); - - #include - #include - - } - ` - ), - fragmentShader: ( - /* glsl */ - ` - - uniform sampler2D tEquirect; - - varying vec3 vWorldDirection; - - #include - - void main() { - - vec3 direction = normalize( vWorldDirection ); - - vec2 sampleUV = equirectUv( direction ); - - gl_FragColor = texture2D( tEquirect, sampleUV ); - - } - ` - ) - }; - const geometry = new BoxGeometry(5, 5, 5); - const material = new ShaderMaterial({ - name: "CubemapFromEquirect", - uniforms: cloneUniforms(shader.uniforms), - vertexShader: shader.vertexShader, - fragmentShader: shader.fragmentShader, - side: BackSide, - blending: NoBlending - }); - material.uniforms.tEquirect.value = texture; - const mesh = new Mesh(geometry, material); - const currentMinFilter = texture.minFilter; - if (texture.minFilter === LinearMipmapLinearFilter) texture.minFilter = LinearFilter; - const camera = new CubeCamera(1, 10, this); - camera.update(renderer, mesh); - texture.minFilter = currentMinFilter; - mesh.geometry.dispose(); - mesh.material.dispose(); - return this; - } - clear(renderer, color, depth, stencil) { - const currentRenderTarget = renderer.getRenderTarget(); - for (let i = 0; i < 6; i++) { - renderer.setRenderTarget(this, i); - renderer.clear(color, depth, stencil); - } - renderer.setRenderTarget(currentRenderTarget); } } -const _vector1 = /* @__PURE__ */ new Vector3(); -const _vector2 = /* @__PURE__ */ new Vector3(); -const _normalMatrix = /* @__PURE__ */ new Matrix3(); -class Plane { +class Data3DTexture extends Texture { static { - __name(this, "Plane"); - } - constructor(normal = new Vector3(1, 0, 0), constant = 0) { - this.isPlane = true; - this.normal = normal; - this.constant = constant; - } - set(normal, constant) { - this.normal.copy(normal); - this.constant = constant; - return this; + __name(this, "Data3DTexture"); } - setComponents(x, y, z, w) { - this.normal.set(x, y, z); - this.constant = w; - return this; + constructor(data = null, width = 1, height = 1, depth = 1) { + super(null); + this.isData3DTexture = true; + this.image = { data, width, height, depth }; + this.magFilter = NearestFilter; + this.minFilter = NearestFilter; + this.wrapR = ClampToEdgeWrapping; + this.generateMipmaps = false; + this.flipY = false; + this.unpackAlignment = 1; } - setFromNormalAndCoplanarPoint(normal, point) { - this.normal.copy(normal); - this.constant = -point.dot(this.normal); - return this; +} +class WebGL3DRenderTarget extends WebGLRenderTarget { + static { + __name(this, "WebGL3DRenderTarget"); } - setFromCoplanarPoints(a, b, c) { - const normal = _vector1.subVectors(c, b).cross(_vector2.subVectors(a, b)).normalize(); - this.setFromNormalAndCoplanarPoint(normal, a); - return this; + constructor(width = 1, height = 1, depth = 1, options = {}) { + super(width, height, options); + this.isWebGL3DRenderTarget = true; + this.depth = depth; + this.texture = new Data3DTexture(null, width, height, depth); + this.texture.isRenderTargetTexture = true; } - copy(plane) { - this.normal.copy(plane.normal); - this.constant = plane.constant; - return this; +} +class Quaternion { + static { + __name(this, "Quaternion"); } - normalize() { - const inverseNormalLength = 1 / this.normal.length(); - this.normal.multiplyScalar(inverseNormalLength); - this.constant *= inverseNormalLength; - return this; + constructor(x = 0, y = 0, z = 0, w = 1) { + this.isQuaternion = true; + this._x = x; + this._y = y; + this._z = z; + this._w = w; } - negate() { - this.constant *= -1; - this.normal.negate(); - return this; + static slerpFlat(dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t2) { + let x0 = src0[srcOffset0 + 0], y0 = src0[srcOffset0 + 1], z0 = src0[srcOffset0 + 2], w0 = src0[srcOffset0 + 3]; + const x1 = src1[srcOffset1 + 0], y1 = src1[srcOffset1 + 1], z1 = src1[srcOffset1 + 2], w1 = src1[srcOffset1 + 3]; + if (t2 === 0) { + dst[dstOffset + 0] = x0; + dst[dstOffset + 1] = y0; + dst[dstOffset + 2] = z0; + dst[dstOffset + 3] = w0; + return; + } + if (t2 === 1) { + dst[dstOffset + 0] = x1; + dst[dstOffset + 1] = y1; + dst[dstOffset + 2] = z1; + dst[dstOffset + 3] = w1; + return; + } + if (w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1) { + let s = 1 - t2; + const cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1, dir = cos >= 0 ? 1 : -1, sqrSin = 1 - cos * cos; + if (sqrSin > Number.EPSILON) { + const sin = Math.sqrt(sqrSin), len = Math.atan2(sin, cos * dir); + s = Math.sin(s * len) / sin; + t2 = Math.sin(t2 * len) / sin; + } + const tDir = t2 * dir; + x0 = x0 * s + x1 * tDir; + y0 = y0 * s + y1 * tDir; + z0 = z0 * s + z1 * tDir; + w0 = w0 * s + w1 * tDir; + if (s === 1 - t2) { + const f = 1 / Math.sqrt(x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0); + x0 *= f; + y0 *= f; + z0 *= f; + w0 *= f; + } + } + dst[dstOffset] = x0; + dst[dstOffset + 1] = y0; + dst[dstOffset + 2] = z0; + dst[dstOffset + 3] = w0; } - distanceToPoint(point) { - return this.normal.dot(point) + this.constant; + static multiplyQuaternionsFlat(dst, dstOffset, src0, srcOffset0, src1, srcOffset1) { + const x0 = src0[srcOffset0]; + const y0 = src0[srcOffset0 + 1]; + const z0 = src0[srcOffset0 + 2]; + const w0 = src0[srcOffset0 + 3]; + const x1 = src1[srcOffset1]; + const y1 = src1[srcOffset1 + 1]; + const z1 = src1[srcOffset1 + 2]; + const w1 = src1[srcOffset1 + 3]; + dst[dstOffset] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1; + dst[dstOffset + 1] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1; + dst[dstOffset + 2] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1; + dst[dstOffset + 3] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1; + return dst; } - distanceToSphere(sphere) { - return this.distanceToPoint(sphere.center) - sphere.radius; + get x() { + return this._x; } - projectPoint(point, target) { - return target.copy(point).addScaledVector(this.normal, -this.distanceToPoint(point)); + set x(value) { + this._x = value; + this._onChangeCallback(); } - intersectLine(line, target) { - const direction = line.delta(_vector1); - const denominator = this.normal.dot(direction); - if (denominator === 0) { - if (this.distanceToPoint(line.start) === 0) { - return target.copy(line.start); - } - return null; - } - const t2 = -(line.start.dot(this.normal) + this.constant) / denominator; - if (t2 < 0 || t2 > 1) { - return null; - } - return target.copy(line.start).addScaledVector(direction, t2); + get y() { + return this._y; } - intersectsLine(line) { - const startSign = this.distanceToPoint(line.start); - const endSign = this.distanceToPoint(line.end); - return startSign < 0 && endSign > 0 || endSign < 0 && startSign > 0; + set y(value) { + this._y = value; + this._onChangeCallback(); } - intersectsBox(box) { - return box.intersectsPlane(this); + get z() { + return this._z; } - intersectsSphere(sphere) { - return sphere.intersectsPlane(this); + set z(value) { + this._z = value; + this._onChangeCallback(); } - coplanarPoint(target) { - return target.copy(this.normal).multiplyScalar(-this.constant); + get w() { + return this._w; } - applyMatrix4(matrix, optionalNormalMatrix) { - const normalMatrix = optionalNormalMatrix || _normalMatrix.getNormalMatrix(matrix); - const referencePoint = this.coplanarPoint(_vector1).applyMatrix4(matrix); - const normal = this.normal.applyMatrix3(normalMatrix).normalize(); - this.constant = -referencePoint.dot(normal); - return this; + set w(value) { + this._w = value; + this._onChangeCallback(); } - translate(offset) { - this.constant -= offset.dot(this.normal); + set(x, y, z, w) { + this._x = x; + this._y = y; + this._z = z; + this._w = w; + this._onChangeCallback(); return this; } - equals(plane) { - return plane.normal.equals(this.normal) && plane.constant === this.constant; - } clone() { - return new this.constructor().copy(this); - } -} -const _sphere$5 = /* @__PURE__ */ new Sphere(); -const _vector$7 = /* @__PURE__ */ new Vector3(); -class Frustum { - static { - __name(this, "Frustum"); - } - constructor(p0 = new Plane(), p1 = new Plane(), p2 = new Plane(), p3 = new Plane(), p4 = new Plane(), p5 = new Plane()) { - this.planes = [p0, p1, p2, p3, p4, p5]; + return new this.constructor(this._x, this._y, this._z, this._w); } - set(p0, p1, p2, p3, p4, p5) { - const planes = this.planes; - planes[0].copy(p0); - planes[1].copy(p1); - planes[2].copy(p2); - planes[3].copy(p3); - planes[4].copy(p4); - planes[5].copy(p5); + copy(quaternion) { + this._x = quaternion.x; + this._y = quaternion.y; + this._z = quaternion.z; + this._w = quaternion.w; + this._onChangeCallback(); return this; } - copy(frustum) { - const planes = this.planes; - for (let i = 0; i < 6; i++) { - planes[i].copy(frustum.planes[i]); + setFromEuler(euler, update = true) { + const x = euler._x, y = euler._y, z = euler._z, order = euler._order; + const cos = Math.cos; + const sin = Math.sin; + const c1 = cos(x / 2); + const c2 = cos(y / 2); + const c3 = cos(z / 2); + const s1 = sin(x / 2); + const s2 = sin(y / 2); + const s3 = sin(z / 2); + switch (order) { + case "XYZ": + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + break; + case "YXZ": + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + break; + case "ZXY": + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + break; + case "ZYX": + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + break; + case "YZX": + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + break; + case "XZY": + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + break; + default: + console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: " + order); } + if (update === true) this._onChangeCallback(); return this; } - setFromProjectionMatrix(m, coordinateSystem = WebGLCoordinateSystem) { - const planes = this.planes; - const me = m.elements; - const me0 = me[0], me1 = me[1], me2 = me[2], me3 = me[3]; - const me4 = me[4], me5 = me[5], me6 = me[6], me7 = me[7]; - const me8 = me[8], me9 = me[9], me10 = me[10], me11 = me[11]; - const me12 = me[12], me13 = me[13], me14 = me[14], me15 = me[15]; - planes[0].setComponents(me3 - me0, me7 - me4, me11 - me8, me15 - me12).normalize(); - planes[1].setComponents(me3 + me0, me7 + me4, me11 + me8, me15 + me12).normalize(); - planes[2].setComponents(me3 + me1, me7 + me5, me11 + me9, me15 + me13).normalize(); - planes[3].setComponents(me3 - me1, me7 - me5, me11 - me9, me15 - me13).normalize(); - planes[4].setComponents(me3 - me2, me7 - me6, me11 - me10, me15 - me14).normalize(); - if (coordinateSystem === WebGLCoordinateSystem) { - planes[5].setComponents(me3 + me2, me7 + me6, me11 + me10, me15 + me14).normalize(); - } else if (coordinateSystem === WebGPUCoordinateSystem) { - planes[5].setComponents(me2, me6, me10, me14).normalize(); - } else { - throw new Error("THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: " + coordinateSystem); - } + setFromAxisAngle(axis, angle) { + const halfAngle = angle / 2, s = Math.sin(halfAngle); + this._x = axis.x * s; + this._y = axis.y * s; + this._z = axis.z * s; + this._w = Math.cos(halfAngle); + this._onChangeCallback(); return this; } - intersectsObject(object) { - if (object.boundingSphere !== void 0) { - if (object.boundingSphere === null) object.computeBoundingSphere(); - _sphere$5.copy(object.boundingSphere).applyMatrix4(object.matrixWorld); + setFromRotationMatrix(m) { + const te2 = m.elements, m11 = te2[0], m12 = te2[4], m13 = te2[8], m21 = te2[1], m22 = te2[5], m23 = te2[9], m31 = te2[2], m32 = te2[6], m33 = te2[10], trace = m11 + m22 + m33; + if (trace > 0) { + const s = 0.5 / Math.sqrt(trace + 1); + this._w = 0.25 / s; + this._x = (m32 - m23) * s; + this._y = (m13 - m31) * s; + this._z = (m21 - m12) * s; + } else if (m11 > m22 && m11 > m33) { + const s = 2 * Math.sqrt(1 + m11 - m22 - m33); + this._w = (m32 - m23) / s; + this._x = 0.25 * s; + this._y = (m12 + m21) / s; + this._z = (m13 + m31) / s; + } else if (m22 > m33) { + const s = 2 * Math.sqrt(1 + m22 - m11 - m33); + this._w = (m13 - m31) / s; + this._x = (m12 + m21) / s; + this._y = 0.25 * s; + this._z = (m23 + m32) / s; } else { - const geometry = object.geometry; - if (geometry.boundingSphere === null) geometry.computeBoundingSphere(); - _sphere$5.copy(geometry.boundingSphere).applyMatrix4(object.matrixWorld); + const s = 2 * Math.sqrt(1 + m33 - m11 - m22); + this._w = (m21 - m12) / s; + this._x = (m13 + m31) / s; + this._y = (m23 + m32) / s; + this._z = 0.25 * s; } - return this.intersectsSphere(_sphere$5); + this._onChangeCallback(); + return this; } - intersectsSprite(sprite) { - _sphere$5.center.set(0, 0, 0); - _sphere$5.radius = 0.7071067811865476; - _sphere$5.applyMatrix4(sprite.matrixWorld); - return this.intersectsSphere(_sphere$5); - } - intersectsSphere(sphere) { - const planes = this.planes; - const center = sphere.center; - const negRadius = -sphere.radius; - for (let i = 0; i < 6; i++) { - const distance = planes[i].distanceToPoint(center); - if (distance < negRadius) { - return false; + setFromUnitVectors(vFrom, vTo) { + let r = vFrom.dot(vTo) + 1; + if (r < Number.EPSILON) { + r = 0; + if (Math.abs(vFrom.x) > Math.abs(vFrom.z)) { + this._x = -vFrom.y; + this._y = vFrom.x; + this._z = 0; + this._w = r; + } else { + this._x = 0; + this._y = -vFrom.z; + this._z = vFrom.y; + this._w = r; } + } else { + this._x = vFrom.y * vTo.z - vFrom.z * vTo.y; + this._y = vFrom.z * vTo.x - vFrom.x * vTo.z; + this._z = vFrom.x * vTo.y - vFrom.y * vTo.x; + this._w = r; } - return true; + return this.normalize(); } - intersectsBox(box) { - const planes = this.planes; - for (let i = 0; i < 6; i++) { - const plane = planes[i]; - _vector$7.x = plane.normal.x > 0 ? box.max.x : box.min.x; - _vector$7.y = plane.normal.y > 0 ? box.max.y : box.min.y; - _vector$7.z = plane.normal.z > 0 ? box.max.z : box.min.z; - if (plane.distanceToPoint(_vector$7) < 0) { - return false; - } - } - return true; + angleTo(q) { + return 2 * Math.acos(Math.abs(clamp(this.dot(q), -1, 1))); } - containsPoint(point) { - const planes = this.planes; - for (let i = 0; i < 6; i++) { - if (planes[i].distanceToPoint(point) < 0) { - return false; - } - } - return true; + rotateTowards(q, step) { + const angle = this.angleTo(q); + if (angle === 0) return this; + const t2 = Math.min(1, step / angle); + this.slerp(q, t2); + return this; } - clone() { - return new this.constructor().copy(this); + identity() { + return this.set(0, 0, 0, 1); } -} -function WebGLAnimation() { - let context = null; - let isAnimating = false; - let animationLoop = null; - let requestId = null; - function onAnimationFrame(time, frame) { - animationLoop(time, frame); - requestId = context.requestAnimationFrame(onAnimationFrame); + invert() { + return this.conjugate(); } - __name(onAnimationFrame, "onAnimationFrame"); - return { - start: /* @__PURE__ */ __name(function() { - if (isAnimating === true) return; - if (animationLoop === null) return; - requestId = context.requestAnimationFrame(onAnimationFrame); - isAnimating = true; - }, "start"), - stop: /* @__PURE__ */ __name(function() { - context.cancelAnimationFrame(requestId); - isAnimating = false; - }, "stop"), - setAnimationLoop: /* @__PURE__ */ __name(function(callback) { - animationLoop = callback; - }, "setAnimationLoop"), - setContext: /* @__PURE__ */ __name(function(value) { - context = value; - }, "setContext") - }; -} -__name(WebGLAnimation, "WebGLAnimation"); -function WebGLAttributes(gl) { - const buffers = /* @__PURE__ */ new WeakMap(); - function createBuffer(attribute, bufferType) { - const array = attribute.array; - const usage = attribute.usage; - const size = array.byteLength; - const buffer = gl.createBuffer(); - gl.bindBuffer(bufferType, buffer); - gl.bufferData(bufferType, array, usage); - attribute.onUploadCallback(); - let type; - if (array instanceof Float32Array) { - type = gl.FLOAT; - } else if (array instanceof Uint16Array) { - if (attribute.isFloat16BufferAttribute) { - type = gl.HALF_FLOAT; - } else { - type = gl.UNSIGNED_SHORT; - } - } else if (array instanceof Int16Array) { - type = gl.SHORT; - } else if (array instanceof Uint32Array) { - type = gl.UNSIGNED_INT; - } else if (array instanceof Int32Array) { - type = gl.INT; - } else if (array instanceof Int8Array) { - type = gl.BYTE; - } else if (array instanceof Uint8Array) { - type = gl.UNSIGNED_BYTE; - } else if (array instanceof Uint8ClampedArray) { - type = gl.UNSIGNED_BYTE; - } else { - throw new Error("THREE.WebGLAttributes: Unsupported buffer data format: " + array); - } - return { - buffer, - type, - bytesPerElement: array.BYTES_PER_ELEMENT, - version: attribute.version, - size - }; + conjugate() { + this._x *= -1; + this._y *= -1; + this._z *= -1; + this._onChangeCallback(); + return this; } - __name(createBuffer, "createBuffer"); - function updateBuffer(buffer, attribute, bufferType) { - const array = attribute.array; - const updateRanges = attribute.updateRanges; - gl.bindBuffer(bufferType, buffer); - if (updateRanges.length === 0) { - gl.bufferSubData(bufferType, 0, array); + dot(v) { + return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w; + } + lengthSq() { + return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w; + } + length() { + return Math.sqrt(this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w); + } + normalize() { + let l = this.length(); + if (l === 0) { + this._x = 0; + this._y = 0; + this._z = 0; + this._w = 1; } else { - updateRanges.sort((a, b) => a.start - b.start); - let mergeIndex = 0; - for (let i = 1; i < updateRanges.length; i++) { - const previousRange = updateRanges[mergeIndex]; - const range = updateRanges[i]; - if (range.start <= previousRange.start + previousRange.count + 1) { - previousRange.count = Math.max( - previousRange.count, - range.start + range.count - previousRange.start - ); - } else { - ++mergeIndex; - updateRanges[mergeIndex] = range; - } - } - updateRanges.length = mergeIndex + 1; - for (let i = 0, l = updateRanges.length; i < l; i++) { - const range = updateRanges[i]; - gl.bufferSubData( - bufferType, - range.start * array.BYTES_PER_ELEMENT, - array, - range.start, - range.count - ); - } - attribute.clearUpdateRanges(); + l = 1 / l; + this._x = this._x * l; + this._y = this._y * l; + this._z = this._z * l; + this._w = this._w * l; } - attribute.onUploadCallback(); + this._onChangeCallback(); + return this; } - __name(updateBuffer, "updateBuffer"); - function get(attribute) { - if (attribute.isInterleavedBufferAttribute) attribute = attribute.data; - return buffers.get(attribute); + multiply(q) { + return this.multiplyQuaternions(this, q); } - __name(get, "get"); - function remove(attribute) { - if (attribute.isInterleavedBufferAttribute) attribute = attribute.data; - const data = buffers.get(attribute); - if (data) { - gl.deleteBuffer(data.buffer); - buffers.delete(attribute); - } + premultiply(q) { + return this.multiplyQuaternions(q, this); } - __name(remove, "remove"); - function update(attribute, bufferType) { - if (attribute.isInterleavedBufferAttribute) attribute = attribute.data; - if (attribute.isGLBufferAttribute) { - const cached = buffers.get(attribute); - if (!cached || cached.version < attribute.version) { - buffers.set(attribute, { - buffer: attribute.buffer, - type: attribute.type, - bytesPerElement: attribute.elementSize, - version: attribute.version - }); - } - return; + multiplyQuaternions(a, b) { + const qax = a._x, qay = a._y, qaz = a._z, qaw = a._w; + const qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w; + this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby; + this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz; + this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx; + this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz; + this._onChangeCallback(); + return this; + } + slerp(qb, t2) { + if (t2 === 0) return this; + if (t2 === 1) return this.copy(qb); + const x = this._x, y = this._y, z = this._z, w = this._w; + let cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z; + if (cosHalfTheta < 0) { + this._w = -qb._w; + this._x = -qb._x; + this._y = -qb._y; + this._z = -qb._z; + cosHalfTheta = -cosHalfTheta; + } else { + this.copy(qb); } - const data = buffers.get(attribute); - if (data === void 0) { - buffers.set(attribute, createBuffer(attribute, bufferType)); - } else if (data.version < attribute.version) { - if (data.size !== attribute.array.byteLength) { - throw 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."); - } - updateBuffer(data.buffer, attribute, bufferType); - data.version = attribute.version; + if (cosHalfTheta >= 1) { + this._w = w; + this._x = x; + this._y = y; + this._z = z; + return this; + } + const sqrSinHalfTheta = 1 - cosHalfTheta * cosHalfTheta; + if (sqrSinHalfTheta <= Number.EPSILON) { + const s = 1 - t2; + this._w = s * w + t2 * this._w; + this._x = s * x + t2 * this._x; + this._y = s * y + t2 * this._y; + this._z = s * z + t2 * this._z; + this.normalize(); + return this; } + const sinHalfTheta = Math.sqrt(sqrSinHalfTheta); + const halfTheta = Math.atan2(sinHalfTheta, cosHalfTheta); + const ratioA = Math.sin((1 - t2) * halfTheta) / sinHalfTheta, ratioB = Math.sin(t2 * halfTheta) / sinHalfTheta; + this._w = w * ratioA + this._w * ratioB; + this._x = x * ratioA + this._x * ratioB; + this._y = y * ratioA + this._y * ratioB; + this._z = z * ratioA + this._z * ratioB; + this._onChangeCallback(); + return this; + } + slerpQuaternions(qa, qb, t2) { + return this.copy(qa).slerp(qb, t2); + } + random() { + const theta1 = 2 * Math.PI * Math.random(); + const theta2 = 2 * Math.PI * Math.random(); + const x0 = Math.random(); + const r1 = Math.sqrt(1 - x0); + const r2 = Math.sqrt(x0); + return this.set( + r1 * Math.sin(theta1), + r1 * Math.cos(theta1), + r2 * Math.sin(theta2), + r2 * Math.cos(theta2) + ); + } + equals(quaternion) { + return quaternion._x === this._x && quaternion._y === this._y && quaternion._z === this._z && quaternion._w === this._w; + } + fromArray(array, offset = 0) { + this._x = array[offset]; + this._y = array[offset + 1]; + this._z = array[offset + 2]; + this._w = array[offset + 3]; + this._onChangeCallback(); + return this; + } + toArray(array = [], offset = 0) { + array[offset] = this._x; + array[offset + 1] = this._y; + array[offset + 2] = this._z; + array[offset + 3] = this._w; + return array; + } + fromBufferAttribute(attribute, index) { + this._x = attribute.getX(index); + this._y = attribute.getY(index); + this._z = attribute.getZ(index); + this._w = attribute.getW(index); + this._onChangeCallback(); + return this; + } + toJSON() { + return this.toArray(); + } + _onChange(callback) { + this._onChangeCallback = callback; + return this; + } + _onChangeCallback() { + } + *[Symbol.iterator]() { + yield this._x; + yield this._y; + yield this._z; + yield this._w; } - __name(update, "update"); - return { - get, - remove, - update - }; } -__name(WebGLAttributes, "WebGLAttributes"); -class PlaneGeometry extends BufferGeometry { +class Vector3 { static { - __name(this, "PlaneGeometry"); + __name(this, "Vector3"); } - constructor(width = 1, height = 1, widthSegments = 1, heightSegments = 1) { - super(); - this.type = "PlaneGeometry"; - this.parameters = { - width, - height, - widthSegments, - heightSegments - }; - const width_half = width / 2; - const height_half = height / 2; - const gridX = Math.floor(widthSegments); - const gridY = Math.floor(heightSegments); - const gridX1 = gridX + 1; - const gridY1 = gridY + 1; - const segment_width = width / gridX; - const segment_height = height / gridY; - const indices = []; - const vertices = []; - const normals = []; - const uvs = []; - for (let iy = 0; iy < gridY1; iy++) { - const y = iy * segment_height - height_half; - for (let ix = 0; ix < gridX1; ix++) { - const x = ix * segment_width - width_half; - vertices.push(x, -y, 0); - normals.push(0, 0, 1); - uvs.push(ix / gridX); - uvs.push(1 - iy / gridY); - } + constructor(x = 0, y = 0, z = 0) { + Vector3.prototype.isVector3 = true; + this.x = x; + this.y = y; + this.z = z; + } + set(x, y, z) { + if (z === void 0) z = this.z; + this.x = x; + this.y = y; + this.z = z; + return this; + } + setScalar(scalar) { + this.x = scalar; + this.y = scalar; + this.z = scalar; + return this; + } + setX(x) { + this.x = x; + return this; + } + setY(y) { + this.y = y; + return this; + } + setZ(z) { + this.z = z; + return this; + } + setComponent(index, value) { + switch (index) { + case 0: + this.x = value; + break; + case 1: + this.y = value; + break; + case 2: + this.z = value; + break; + default: + throw new Error("index is out of range: " + index); } - for (let iy = 0; iy < gridY; iy++) { - for (let ix = 0; ix < gridX; ix++) { - const a = ix + gridX1 * iy; - const b = ix + gridX1 * (iy + 1); - const c = ix + 1 + gridX1 * (iy + 1); - const d = ix + 1 + gridX1 * iy; - indices.push(a, b, d); - indices.push(b, c, d); - } + return this; + } + getComponent(index) { + switch (index) { + case 0: + return this.x; + case 1: + return this.y; + case 2: + return this.z; + default: + throw new Error("index is out of range: " + index); } - this.setIndex(indices); - this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); - this.setAttribute("normal", new Float32BufferAttribute(normals, 3)); - this.setAttribute("uv", new Float32BufferAttribute(uvs, 2)); } - copy(source) { - super.copy(source); - this.parameters = Object.assign({}, source.parameters); + clone() { + return new this.constructor(this.x, this.y, this.z); + } + copy(v) { + this.x = v.x; + this.y = v.y; + this.z = v.z; return this; } - static fromJSON(data) { - return new PlaneGeometry(data.width, data.height, data.widthSegments, data.heightSegments); + add(v) { + this.x += v.x; + this.y += v.y; + this.z += v.z; + return this; } -} -var alphahash_fragment = "#ifdef USE_ALPHAHASH\n if ( diffuseColor.a < getAlphaHashThreshold( vPosition ) ) discard;\n#endif"; -var alphahash_pars_fragment = "#ifdef USE_ALPHAHASH\n const float ALPHA_HASH_SCALE = 0.05;\n float hash2D( vec2 value ) {\n return fract( 1.0e4 * sin( 17.0 * value.x + 0.1 * value.y ) * ( 0.1 + abs( sin( 13.0 * value.y + value.x ) ) ) );\n }\n float hash3D( vec3 value ) {\n return hash2D( vec2( hash2D( value.xy ), value.z ) );\n }\n float getAlphaHashThreshold( vec3 position ) {\n float maxDeriv = max(\n length( dFdx( position.xyz ) ),\n length( dFdy( position.xyz ) )\n );\n float pixScale = 1.0 / ( ALPHA_HASH_SCALE * maxDeriv );\n vec2 pixScales = vec2(\n exp2( floor( log2( pixScale ) ) ),\n exp2( ceil( log2( pixScale ) ) )\n );\n vec2 alpha = vec2(\n hash3D( floor( pixScales.x * position.xyz ) ),\n hash3D( floor( pixScales.y * position.xyz ) )\n );\n float lerpFactor = fract( log2( pixScale ) );\n float x = ( 1.0 - lerpFactor ) * alpha.x + lerpFactor * alpha.y;\n float a = min( lerpFactor, 1.0 - lerpFactor );\n vec3 cases = vec3(\n x * x / ( 2.0 * a * ( 1.0 - a ) ),\n ( x - 0.5 * a ) / ( 1.0 - a ),\n 1.0 - ( ( 1.0 - x ) * ( 1.0 - x ) / ( 2.0 * a * ( 1.0 - a ) ) )\n );\n float threshold = ( x < ( 1.0 - a ) )\n ? ( ( x < a ) ? cases.x : cases.y )\n : cases.z;\n return clamp( threshold , 1.0e-6, 1.0 );\n }\n#endif"; -var alphamap_fragment = "#ifdef USE_ALPHAMAP\n diffuseColor.a *= texture2D( alphaMap, vAlphaMapUv ).g;\n#endif"; -var alphamap_pars_fragment = "#ifdef USE_ALPHAMAP\n uniform sampler2D alphaMap;\n#endif"; -var alphatest_fragment = "#ifdef USE_ALPHATEST\n #ifdef ALPHA_TO_COVERAGE\n diffuseColor.a = smoothstep( alphaTest, alphaTest + fwidth( diffuseColor.a ), diffuseColor.a );\n if ( diffuseColor.a == 0.0 ) discard;\n #else\n if ( diffuseColor.a < alphaTest ) discard;\n #endif\n#endif"; -var alphatest_pars_fragment = "#ifdef USE_ALPHATEST\n uniform float alphaTest;\n#endif"; -var aomap_fragment = "#ifdef USE_AOMAP\n float ambientOcclusion = ( texture2D( aoMap, vAoMapUv ).r - 1.0 ) * aoMapIntensity + 1.0;\n reflectedLight.indirectDiffuse *= ambientOcclusion;\n #if defined( USE_CLEARCOAT ) \n clearcoatSpecularIndirect *= ambientOcclusion;\n #endif\n #if defined( USE_SHEEN ) \n sheenSpecularIndirect *= ambientOcclusion;\n #endif\n #if defined( USE_ENVMAP ) && defined( STANDARD )\n float dotNV = saturate( dot( geometryNormal, geometryViewDir ) );\n reflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\n #endif\n#endif"; -var aomap_pars_fragment = "#ifdef USE_AOMAP\n uniform sampler2D aoMap;\n uniform float aoMapIntensity;\n#endif"; -var batching_pars_vertex = "#ifdef USE_BATCHING\n #if ! defined( GL_ANGLE_multi_draw )\n #define gl_DrawID _gl_DrawID\n uniform int _gl_DrawID;\n #endif\n uniform highp sampler2D batchingTexture;\n uniform highp usampler2D batchingIdTexture;\n mat4 getBatchingMatrix( const in float i ) {\n int size = textureSize( batchingTexture, 0 ).x;\n int j = int( i ) * 4;\n int x = j % size;\n int y = j / size;\n vec4 v1 = texelFetch( batchingTexture, ivec2( x, y ), 0 );\n vec4 v2 = texelFetch( batchingTexture, ivec2( x + 1, y ), 0 );\n vec4 v3 = texelFetch( batchingTexture, ivec2( x + 2, y ), 0 );\n vec4 v4 = texelFetch( batchingTexture, ivec2( x + 3, y ), 0 );\n return mat4( v1, v2, v3, v4 );\n }\n float getIndirectIndex( const in int i ) {\n int size = textureSize( batchingIdTexture, 0 ).x;\n int x = i % size;\n int y = i / size;\n return float( texelFetch( batchingIdTexture, ivec2( x, y ), 0 ).r );\n }\n#endif\n#ifdef USE_BATCHING_COLOR\n uniform sampler2D batchingColorTexture;\n vec3 getBatchingColor( const in float i ) {\n int size = textureSize( batchingColorTexture, 0 ).x;\n int j = int( i );\n int x = j % size;\n int y = j / size;\n return texelFetch( batchingColorTexture, ivec2( x, y ), 0 ).rgb;\n }\n#endif"; -var batching_vertex = "#ifdef USE_BATCHING\n mat4 batchingMatrix = getBatchingMatrix( getIndirectIndex( gl_DrawID ) );\n#endif"; -var begin_vertex = "vec3 transformed = vec3( position );\n#ifdef USE_ALPHAHASH\n vPosition = vec3( position );\n#endif"; -var beginnormal_vertex = "vec3 objectNormal = vec3( normal );\n#ifdef USE_TANGENT\n vec3 objectTangent = vec3( tangent.xyz );\n#endif"; -var bsdfs = "float G_BlinnPhong_Implicit( ) {\n return 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n return 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 vec3 halfDir = normalize( lightDir + viewDir );\n float dotNH = saturate( dot( normal, halfDir ) );\n float dotVH = saturate( dot( viewDir, halfDir ) );\n vec3 F = F_Schlick( specularColor, 1.0, dotVH );\n float G = G_BlinnPhong_Implicit( );\n float D = D_BlinnPhong( shininess, dotNH );\n return F * ( G * D );\n} // validated"; -var iridescence_fragment = "#ifdef USE_IRIDESCENCE\n const mat3 XYZ_TO_REC709 = mat3(\n 3.2404542, -0.9692660, 0.0556434,\n -1.5371385, 1.8760108, -0.2040259,\n -0.4985314, 0.0415560, 1.0572252\n );\n vec3 Fresnel0ToIor( vec3 fresnel0 ) {\n vec3 sqrtF0 = sqrt( fresnel0 );\n return ( vec3( 1.0 ) + sqrtF0 ) / ( vec3( 1.0 ) - sqrtF0 );\n }\n vec3 IorToFresnel0( vec3 transmittedIor, float incidentIor ) {\n return pow2( ( transmittedIor - vec3( incidentIor ) ) / ( transmittedIor + vec3( incidentIor ) ) );\n }\n float IorToFresnel0( float transmittedIor, float incidentIor ) {\n return pow2( ( transmittedIor - incidentIor ) / ( transmittedIor + incidentIor ));\n }\n vec3 evalSensitivity( float OPD, vec3 shift ) {\n float phase = 2.0 * PI * OPD * 1.0e-9;\n vec3 val = vec3( 5.4856e-13, 4.4201e-13, 5.2481e-13 );\n vec3 pos = vec3( 1.6810e+06, 1.7953e+06, 2.2084e+06 );\n vec3 var = vec3( 4.3278e+09, 9.3046e+09, 6.6121e+09 );\n vec3 xyz = val * sqrt( 2.0 * PI * var ) * cos( pos * phase + shift ) * exp( - pow2( phase ) * var );\n xyz.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 xyz /= 1.0685e-7;\n vec3 rgb = XYZ_TO_REC709 * xyz;\n return rgb;\n }\n vec3 evalIridescence( float outsideIOR, float eta2, float cosTheta1, float thinFilmThickness, vec3 baseF0 ) {\n vec3 I;\n float iridescenceIOR = mix( outsideIOR, eta2, smoothstep( 0.0, 0.03, thinFilmThickness ) );\n float sinTheta2Sq = pow2( outsideIOR / iridescenceIOR ) * ( 1.0 - pow2( cosTheta1 ) );\n float cosTheta2Sq = 1.0 - sinTheta2Sq;\n if ( cosTheta2Sq < 0.0 ) {\n return vec3( 1.0 );\n }\n float cosTheta2 = sqrt( cosTheta2Sq );\n float R0 = IorToFresnel0( iridescenceIOR, outsideIOR );\n float R12 = F_Schlick( R0, 1.0, cosTheta1 );\n float T121 = 1.0 - R12;\n float phi12 = 0.0;\n if ( iridescenceIOR < outsideIOR ) phi12 = PI;\n float phi21 = PI - phi12;\n vec3 baseIOR = Fresnel0ToIor( clamp( baseF0, 0.0, 0.9999 ) ); vec3 R1 = IorToFresnel0( baseIOR, iridescenceIOR );\n vec3 R23 = F_Schlick( R1, 1.0, cosTheta2 );\n vec3 phi23 = vec3( 0.0 );\n if ( baseIOR[ 0 ] < iridescenceIOR ) phi23[ 0 ] = PI;\n if ( baseIOR[ 1 ] < iridescenceIOR ) phi23[ 1 ] = PI;\n if ( baseIOR[ 2 ] < iridescenceIOR ) phi23[ 2 ] = PI;\n float OPD = 2.0 * iridescenceIOR * thinFilmThickness * cosTheta2;\n vec3 phi = vec3( phi21 ) + phi23;\n vec3 R123 = clamp( R12 * R23, 1e-5, 0.9999 );\n vec3 r123 = sqrt( R123 );\n vec3 Rs = pow2( T121 ) * R23 / ( vec3( 1.0 ) - R123 );\n vec3 C0 = R12 + Rs;\n I = C0;\n vec3 Cm = Rs - T121;\n for ( int m = 1; m <= 2; ++ m ) {\n Cm *= r123;\n vec3 Sm = 2.0 * evalSensitivity( float( m ) * OPD, float( m ) * phi );\n I += Cm * Sm;\n }\n return max( I, vec3( 0.0 ) );\n }\n#endif"; -var bumpmap_pars_fragment = "#ifdef USE_BUMPMAP\n uniform sampler2D bumpMap;\n uniform float bumpScale;\n vec2 dHdxy_fwd() {\n vec2 dSTdx = dFdx( vBumpMapUv );\n vec2 dSTdy = dFdy( vBumpMapUv );\n float Hll = bumpScale * texture2D( bumpMap, vBumpMapUv ).x;\n float dBx = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdx ).x - Hll;\n float dBy = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdy ).x - Hll;\n return vec2( dBx, dBy );\n }\n vec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\n vec3 vSigmaX = normalize( dFdx( surf_pos.xyz ) );\n vec3 vSigmaY = normalize( dFdy( surf_pos.xyz ) );\n vec3 vN = surf_norm;\n vec3 R1 = cross( vSigmaY, vN );\n vec3 R2 = cross( vN, vSigmaX );\n float fDet = dot( vSigmaX, R1 ) * faceDirection;\n vec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n return normalize( abs( fDet ) * surf_norm - vGrad );\n }\n#endif"; -var clipping_planes_fragment = "#if NUM_CLIPPING_PLANES > 0\n vec4 plane;\n #ifdef ALPHA_TO_COVERAGE\n float distanceToPlane, distanceGradient;\n float clipOpacity = 1.0;\n #pragma unroll_loop_start\n for ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n distanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n distanceGradient = fwidth( distanceToPlane ) / 2.0;\n clipOpacity *= smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n if ( clipOpacity == 0.0 ) discard;\n }\n #pragma unroll_loop_end\n #if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n float unionClipOpacity = 1.0;\n #pragma unroll_loop_start\n for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n distanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n distanceGradient = fwidth( distanceToPlane ) / 2.0;\n unionClipOpacity *= 1.0 - smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n }\n #pragma unroll_loop_end\n clipOpacity *= 1.0 - unionClipOpacity;\n #endif\n diffuseColor.a *= clipOpacity;\n if ( diffuseColor.a == 0.0 ) discard;\n #else\n #pragma unroll_loop_start\n for ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n if ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n }\n #pragma unroll_loop_end\n #if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n bool clipped = true;\n #pragma unroll_loop_start\n for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n clipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n }\n #pragma unroll_loop_end\n if ( clipped ) discard;\n #endif\n #endif\n#endif"; -var clipping_planes_pars_fragment = "#if NUM_CLIPPING_PLANES > 0\n varying vec3 vClipPosition;\n uniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif"; -var clipping_planes_pars_vertex = "#if NUM_CLIPPING_PLANES > 0\n varying vec3 vClipPosition;\n#endif"; -var clipping_planes_vertex = "#if NUM_CLIPPING_PLANES > 0\n vClipPosition = - mvPosition.xyz;\n#endif"; -var color_fragment = "#if defined( USE_COLOR_ALPHA )\n diffuseColor *= vColor;\n#elif defined( USE_COLOR )\n diffuseColor.rgb *= vColor;\n#endif"; -var color_pars_fragment = "#if defined( USE_COLOR_ALPHA )\n varying vec4 vColor;\n#elif defined( USE_COLOR )\n varying vec3 vColor;\n#endif"; -var color_pars_vertex = "#if defined( USE_COLOR_ALPHA )\n varying vec4 vColor;\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n varying vec3 vColor;\n#endif"; -var color_vertex = "#if defined( USE_COLOR_ALPHA )\n vColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n vColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n vColor *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n vColor.xyz *= instanceColor.xyz;\n#endif\n#ifdef USE_BATCHING_COLOR\n vec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) );\n vColor.xyz *= batchingColor.xyz;\n#endif"; -var 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 const highp float a = 12.9898, b = 78.233, c = 43758.5453;\n highp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n return fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n float precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n float precisionSafeLength( vec3 v ) {\n float maxComponent = max3( abs( v ) );\n return length( v / maxComponent ) * maxComponent;\n }\n#endif\nstruct IncidentLight {\n vec3 color;\n vec3 direction;\n bool visible;\n};\nstruct ReflectedLight {\n vec3 directDiffuse;\n vec3 directSpecular;\n vec3 indirectDiffuse;\n vec3 indirectSpecular;\n};\n#ifdef USE_ALPHAHASH\n varying vec3 vPosition;\n#endif\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n return normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n return normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nmat3 transposeMat3( const in mat3 m ) {\n mat3 tmp;\n tmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n tmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n tmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n return tmp;\n}\nbool isPerspectiveMatrix( mat4 m ) {\n return m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n float u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n float v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n return vec2( u, v );\n}\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\n return RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\n float fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n return f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n}\nfloat F_Schlick( const in float f0, const in float f90, const in float dotVH ) {\n float fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n return f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n} // validated"; -var cube_uv_reflection_fragment = "#ifdef ENVMAP_TYPE_CUBE_UV\n #define cubeUV_minMipLevel 4.0\n #define cubeUV_minTileSize 16.0\n float getFace( vec3 direction ) {\n vec3 absDirection = abs( direction );\n float face = - 1.0;\n if ( absDirection.x > absDirection.z ) {\n if ( absDirection.x > absDirection.y )\n face = direction.x > 0.0 ? 0.0 : 3.0;\n else\n face = direction.y > 0.0 ? 1.0 : 4.0;\n } else {\n if ( absDirection.z > absDirection.y )\n face = direction.z > 0.0 ? 2.0 : 5.0;\n else\n face = direction.y > 0.0 ? 1.0 : 4.0;\n }\n return face;\n }\n vec2 getUV( vec3 direction, float face ) {\n vec2 uv;\n if ( face == 0.0 ) {\n uv = vec2( direction.z, direction.y ) / abs( direction.x );\n } else if ( face == 1.0 ) {\n uv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n } else if ( face == 2.0 ) {\n uv = vec2( - direction.x, direction.y ) / abs( direction.z );\n } else if ( face == 3.0 ) {\n uv = vec2( - direction.z, direction.y ) / abs( direction.x );\n } else if ( face == 4.0 ) {\n uv = vec2( - direction.x, direction.z ) / abs( direction.y );\n } else {\n uv = vec2( direction.x, direction.y ) / abs( direction.z );\n }\n return 0.5 * ( uv + 1.0 );\n }\n vec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n float face = getFace( direction );\n float filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n mipInt = max( mipInt, cubeUV_minMipLevel );\n float faceSize = exp2( mipInt );\n highp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\n if ( face > 2.0 ) {\n uv.y += faceSize;\n face -= 3.0;\n }\n uv.x += face * faceSize;\n uv.x += filterInt * 3.0 * cubeUV_minTileSize;\n uv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\n uv.x *= CUBEUV_TEXEL_WIDTH;\n uv.y *= CUBEUV_TEXEL_HEIGHT;\n #ifdef texture2DGradEXT\n return texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\n #else\n return texture2D( envMap, uv ).rgb;\n #endif\n }\n #define cubeUV_r0 1.0\n #define cubeUV_m0 - 2.0\n #define cubeUV_r1 0.8\n #define cubeUV_m1 - 1.0\n #define cubeUV_r4 0.4\n #define cubeUV_m4 2.0\n #define cubeUV_r5 0.305\n #define cubeUV_m5 3.0\n #define cubeUV_r6 0.21\n #define cubeUV_m6 4.0\n float roughnessToMip( float roughness ) {\n float mip = 0.0;\n if ( roughness >= cubeUV_r1 ) {\n mip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\n } else if ( roughness >= cubeUV_r4 ) {\n mip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\n } else if ( roughness >= cubeUV_r5 ) {\n mip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\n } else if ( roughness >= cubeUV_r6 ) {\n mip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5;\n } else {\n mip = - 2.0 * log2( 1.16 * roughness ); }\n return mip;\n }\n vec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n float mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\n float mipF = fract( mip );\n float mipInt = floor( mip );\n vec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n if ( mipF == 0.0 ) {\n return vec4( color0, 1.0 );\n } else {\n vec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n return vec4( mix( color0, color1, mipF ), 1.0 );\n }\n }\n#endif"; -var defaultnormal_vertex = "vec3 transformedNormal = objectNormal;\n#ifdef USE_TANGENT\n vec3 transformedTangent = objectTangent;\n#endif\n#ifdef USE_BATCHING\n mat3 bm = mat3( batchingMatrix );\n transformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) );\n transformedNormal = bm * transformedNormal;\n #ifdef USE_TANGENT\n transformedTangent = bm * transformedTangent;\n #endif\n#endif\n#ifdef USE_INSTANCING\n mat3 im = mat3( instanceMatrix );\n transformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) );\n transformedNormal = im * transformedNormal;\n #ifdef USE_TANGENT\n transformedTangent = im * transformedTangent;\n #endif\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n transformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n transformedTangent = ( modelViewMatrix * vec4( transformedTangent, 0.0 ) ).xyz;\n #ifdef FLIP_SIDED\n transformedTangent = - transformedTangent;\n #endif\n#endif"; -var displacementmap_pars_vertex = "#ifdef USE_DISPLACEMENTMAP\n uniform sampler2D displacementMap;\n uniform float displacementScale;\n uniform float displacementBias;\n#endif"; -var displacementmap_vertex = "#ifdef USE_DISPLACEMENTMAP\n transformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias );\n#endif"; -var emissivemap_fragment = "#ifdef USE_EMISSIVEMAP\n vec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv );\n #ifdef DECODE_VIDEO_TEXTURE_EMISSIVE\n emissiveColor = sRGBTransferEOTF( emissiveColor );\n #endif\n totalEmissiveRadiance *= emissiveColor.rgb;\n#endif"; -var emissivemap_pars_fragment = "#ifdef USE_EMISSIVEMAP\n uniform sampler2D emissiveMap;\n#endif"; -var colorspace_fragment = "gl_FragColor = linearToOutputTexel( gl_FragColor );"; -var colorspace_pars_fragment = "vec4 LinearTransferOETF( in vec4 value ) {\n return value;\n}\nvec4 sRGBTransferEOTF( in vec4 value ) {\n return 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 sRGBTransferOETF( in vec4 value ) {\n return 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}"; -var envmap_fragment = "#ifdef USE_ENVMAP\n #ifdef ENV_WORLDPOS\n vec3 cameraToFrag;\n if ( isOrthographic ) {\n cameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n } else {\n cameraToFrag = normalize( vWorldPosition - cameraPosition );\n }\n vec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n #ifdef ENVMAP_MODE_REFLECTION\n vec3 reflectVec = reflect( cameraToFrag, worldNormal );\n #else\n vec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n #endif\n #else\n vec3 reflectVec = vReflect;\n #endif\n #ifdef ENVMAP_TYPE_CUBE\n vec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n #else\n vec4 envColor = vec4( 0.0 );\n #endif\n #ifdef ENVMAP_BLENDING_MULTIPLY\n outgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n #elif defined( ENVMAP_BLENDING_MIX )\n outgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n #elif defined( ENVMAP_BLENDING_ADD )\n outgoingLight += envColor.xyz * specularStrength * reflectivity;\n #endif\n#endif"; -var envmap_common_pars_fragment = "#ifdef USE_ENVMAP\n uniform float envMapIntensity;\n uniform float flipEnvMap;\n uniform mat3 envMapRotation;\n #ifdef ENVMAP_TYPE_CUBE\n uniform samplerCube envMap;\n #else\n uniform sampler2D envMap;\n #endif\n \n#endif"; -var envmap_pars_fragment = "#ifdef USE_ENVMAP\n uniform float reflectivity;\n #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n #define ENV_WORLDPOS\n #endif\n #ifdef ENV_WORLDPOS\n varying vec3 vWorldPosition;\n uniform float refractionRatio;\n #else\n varying vec3 vReflect;\n #endif\n#endif"; -var envmap_pars_vertex = "#ifdef USE_ENVMAP\n #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n #define ENV_WORLDPOS\n #endif\n #ifdef ENV_WORLDPOS\n \n varying vec3 vWorldPosition;\n #else\n varying vec3 vReflect;\n uniform float refractionRatio;\n #endif\n#endif"; -var envmap_vertex = "#ifdef USE_ENVMAP\n #ifdef ENV_WORLDPOS\n vWorldPosition = worldPosition.xyz;\n #else\n vec3 cameraToVertex;\n if ( isOrthographic ) {\n cameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n } else {\n cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n }\n vec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n #ifdef ENVMAP_MODE_REFLECTION\n vReflect = reflect( cameraToVertex, worldNormal );\n #else\n vReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n #endif\n #endif\n#endif"; -var fog_vertex = "#ifdef USE_FOG\n vFogDepth = - mvPosition.z;\n#endif"; -var fog_pars_vertex = "#ifdef USE_FOG\n varying float vFogDepth;\n#endif"; -var fog_fragment = "#ifdef USE_FOG\n #ifdef FOG_EXP2\n float fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\n #else\n float fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\n #endif\n gl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif"; -var fog_pars_fragment = "#ifdef USE_FOG\n uniform vec3 fogColor;\n varying float vFogDepth;\n #ifdef FOG_EXP2\n uniform float fogDensity;\n #else\n uniform float fogNear;\n uniform float fogFar;\n #endif\n#endif"; -var gradientmap_pars_fragment = "#ifdef USE_GRADIENTMAP\n uniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n float dotNL = dot( normal, lightDirection );\n vec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n #ifdef USE_GRADIENTMAP\n return vec3( texture2D( gradientMap, coord ).r );\n #else\n vec2 fw = fwidth( coord ) * 0.5;\n return mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\n #endif\n}"; -var lightmap_pars_fragment = "#ifdef USE_LIGHTMAP\n uniform sampler2D lightMap;\n uniform float lightMapIntensity;\n#endif"; -var lights_lambert_fragment = "LambertMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularStrength = specularStrength;"; -var lights_lambert_pars_fragment = "varying vec3 vViewPosition;\nstruct LambertMaterial {\n vec3 diffuseColor;\n float 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 float dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n vec3 irradiance = dotNL * directLight.color;\n reflectedLight.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 reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct RE_Direct_Lambert\n#define RE_IndirectDiffuse RE_IndirectDiffuse_Lambert"; -var lights_pars_begin = "uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\n#if defined( USE_LIGHT_PROBES )\n uniform vec3 lightProbe[ 9 ];\n#endif\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n float x = normal.x, y = normal.y, z = normal.z;\n vec3 result = shCoefficients[ 0 ] * 0.886227;\n result += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n result += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n result += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n result += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n result += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n result += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n result += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n result += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n return result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\n vec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n vec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n return irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n vec3 irradiance = ambientLightColor;\n return irradiance;\n}\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n float distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n if ( cutoffDistance > 0.0 ) {\n distanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n }\n return distanceFalloff;\n}\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n return smoothstep( coneCosine, penumbraCosine, angleCosine );\n}\n#if NUM_DIR_LIGHTS > 0\n struct DirectionalLight {\n vec3 direction;\n vec3 color;\n };\n uniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n void getDirectionalLightInfo( const in DirectionalLight directionalLight, out IncidentLight light ) {\n light.color = directionalLight.color;\n light.direction = directionalLight.direction;\n light.visible = true;\n }\n#endif\n#if NUM_POINT_LIGHTS > 0\n struct PointLight {\n vec3 position;\n vec3 color;\n float distance;\n float decay;\n };\n uniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n void getPointLightInfo( const in PointLight pointLight, const in vec3 geometryPosition, out IncidentLight light ) {\n vec3 lVector = pointLight.position - geometryPosition;\n light.direction = normalize( lVector );\n float lightDistance = length( lVector );\n light.color = pointLight.color;\n light.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\n light.visible = ( light.color != vec3( 0.0 ) );\n }\n#endif\n#if NUM_SPOT_LIGHTS > 0\n struct SpotLight {\n vec3 position;\n vec3 direction;\n vec3 color;\n float distance;\n float decay;\n float coneCos;\n float penumbraCos;\n };\n uniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n void getSpotLightInfo( const in SpotLight spotLight, const in vec3 geometryPosition, out IncidentLight light ) {\n vec3 lVector = spotLight.position - geometryPosition;\n light.direction = normalize( lVector );\n float angleCos = dot( light.direction, spotLight.direction );\n float spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n if ( spotAttenuation > 0.0 ) {\n float lightDistance = length( lVector );\n light.color = spotLight.color * spotAttenuation;\n light.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\n light.visible = ( light.color != vec3( 0.0 ) );\n } else {\n light.color = vec3( 0.0 );\n light.visible = false;\n }\n }\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n struct RectAreaLight {\n vec3 color;\n vec3 position;\n vec3 halfWidth;\n vec3 halfHeight;\n };\n uniform sampler2D ltc_1; uniform sampler2D ltc_2;\n uniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n struct HemisphereLight {\n vec3 direction;\n vec3 skyColor;\n vec3 groundColor;\n };\n uniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n vec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\n float dotNL = dot( normal, hemiLight.direction );\n float hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n vec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n return irradiance;\n }\n#endif"; -var envmap_physical_pars_fragment = "#ifdef USE_ENVMAP\n vec3 getIBLIrradiance( const in vec3 normal ) {\n #ifdef ENVMAP_TYPE_CUBE_UV\n vec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n vec4 envMapColor = textureCubeUV( envMap, envMapRotation * worldNormal, 1.0 );\n return PI * envMapColor.rgb * envMapIntensity;\n #else\n return vec3( 0.0 );\n #endif\n }\n vec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\n #ifdef ENVMAP_TYPE_CUBE_UV\n vec3 reflectVec = reflect( - viewDir, normal );\n reflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n reflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n vec4 envMapColor = textureCubeUV( envMap, envMapRotation * reflectVec, roughness );\n return envMapColor.rgb * envMapIntensity;\n #else\n return vec3( 0.0 );\n #endif\n }\n #ifdef USE_ANISOTROPY\n vec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {\n #ifdef ENVMAP_TYPE_CUBE_UV\n vec3 bentNormal = cross( bitangent, viewDir );\n bentNormal = normalize( cross( bentNormal, bitangent ) );\n bentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );\n return getIBLRadiance( viewDir, bentNormal, roughness );\n #else\n return vec3( 0.0 );\n #endif\n }\n #endif\n#endif"; -var lights_toon_fragment = "ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;"; -var lights_toon_pars_fragment = "varying vec3 vViewPosition;\nstruct ToonMaterial {\n vec3 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 vec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color;\n reflectedLight.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 reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct RE_Direct_Toon\n#define RE_IndirectDiffuse RE_IndirectDiffuse_Toon"; -var lights_phong_fragment = "BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;"; -var lights_phong_pars_fragment = "varying vec3 vViewPosition;\nstruct BlinnPhongMaterial {\n vec3 diffuseColor;\n vec3 specularColor;\n float specularShininess;\n float 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 float dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n vec3 irradiance = dotNL * directLight.color;\n reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n reflectedLight.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 reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct RE_Direct_BlinnPhong\n#define RE_IndirectDiffuse RE_IndirectDiffuse_BlinnPhong"; -var 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 material.ior = ior;\n #ifdef USE_SPECULAR\n float specularIntensityFactor = specularIntensity;\n vec3 specularColorFactor = specularColor;\n #ifdef USE_SPECULAR_COLORMAP\n specularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\n #endif\n #ifdef USE_SPECULAR_INTENSITYMAP\n specularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\n #endif\n material.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n #else\n float specularIntensityFactor = 1.0;\n vec3 specularColorFactor = vec3( 1.0 );\n material.specularF90 = 1.0;\n #endif\n material.specularColor = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\n#else\n material.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\n material.specularF90 = 1.0;\n#endif\n#ifdef USE_CLEARCOAT\n material.clearcoat = clearcoat;\n material.clearcoatRoughness = clearcoatRoughness;\n material.clearcoatF0 = vec3( 0.04 );\n material.clearcoatF90 = 1.0;\n #ifdef USE_CLEARCOATMAP\n material.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x;\n #endif\n #ifdef USE_CLEARCOAT_ROUGHNESSMAP\n material.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y;\n #endif\n material.clearcoat = saturate( material.clearcoat ); material.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n material.clearcoatRoughness += geometryRoughness;\n material.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_DISPERSION\n material.dispersion = dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n material.iridescence = iridescence;\n material.iridescenceIOR = iridescenceIOR;\n #ifdef USE_IRIDESCENCEMAP\n material.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r;\n #endif\n #ifdef USE_IRIDESCENCE_THICKNESSMAP\n material.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum;\n #else\n material.iridescenceThickness = iridescenceThicknessMaximum;\n #endif\n#endif\n#ifdef USE_SHEEN\n material.sheenColor = sheenColor;\n #ifdef USE_SHEEN_COLORMAP\n material.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\n #endif\n material.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\n #ifdef USE_SHEEN_ROUGHNESSMAP\n material.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\n #endif\n#endif\n#ifdef USE_ANISOTROPY\n #ifdef USE_ANISOTROPYMAP\n mat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\n vec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\n vec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\n #else\n vec2 anisotropyV = anisotropyVector;\n #endif\n material.anisotropy = length( anisotropyV );\n if( material.anisotropy == 0.0 ) {\n anisotropyV = vec2( 1.0, 0.0 );\n } else {\n anisotropyV /= material.anisotropy;\n material.anisotropy = saturate( material.anisotropy );\n }\n material.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\n material.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\n material.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\n#endif"; -var lights_physical_pars_fragment = "struct PhysicalMaterial {\n vec3 diffuseColor;\n float roughness;\n vec3 specularColor;\n float specularF90;\n float dispersion;\n #ifdef USE_CLEARCOAT\n float clearcoat;\n float clearcoatRoughness;\n vec3 clearcoatF0;\n float clearcoatF90;\n #endif\n #ifdef USE_IRIDESCENCE\n float iridescence;\n float iridescenceIOR;\n float iridescenceThickness;\n vec3 iridescenceFresnel;\n vec3 iridescenceF0;\n #endif\n #ifdef USE_SHEEN\n vec3 sheenColor;\n float sheenRoughness;\n #endif\n #ifdef IOR\n float ior;\n #endif\n #ifdef USE_TRANSMISSION\n float transmission;\n float transmissionAlpha;\n float thickness;\n float attenuationDistance;\n vec3 attenuationColor;\n #endif\n #ifdef USE_ANISOTROPY\n float anisotropy;\n float alphaT;\n vec3 anisotropyT;\n vec3 anisotropyB;\n #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 float a2 = pow2( alpha );\n float gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n float gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n return 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n float a2 = pow2( alpha );\n float denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n return RECIPROCAL_PI * a2 / pow2( denom );\n}\n#ifdef USE_ANISOTROPY\n float 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 float gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\n float gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\n float v = 0.5 / ( gv + gl );\n return saturate(v);\n }\n float D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\n float a2 = alphaT * alphaB;\n highp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\n highp float v2 = dot( v, v );\n float w2 = a2 / v2;\n return RECIPROCAL_PI * a2 * pow2 ( w2 );\n }\n#endif\n#ifdef USE_CLEARCOAT\n vec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\n vec3 f0 = material.clearcoatF0;\n float f90 = material.clearcoatF90;\n float roughness = material.clearcoatRoughness;\n float alpha = pow2( roughness );\n vec3 halfDir = normalize( lightDir + viewDir );\n float dotNL = saturate( dot( normal, lightDir ) );\n float dotNV = saturate( dot( normal, viewDir ) );\n float dotNH = saturate( dot( normal, halfDir ) );\n float dotVH = saturate( dot( viewDir, halfDir ) );\n vec3 F = F_Schlick( f0, f90, dotVH );\n float V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n float D = D_GGX( alpha, dotNH );\n return F * ( V * D );\n }\n#endif\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n vec3 f0 = material.specularColor;\n float f90 = material.specularF90;\n float roughness = material.roughness;\n float alpha = pow2( roughness );\n vec3 halfDir = normalize( lightDir + viewDir );\n float dotNL = saturate( dot( normal, lightDir ) );\n float dotNV = saturate( dot( normal, viewDir ) );\n float dotNH = saturate( dot( normal, halfDir ) );\n float dotVH = saturate( dot( viewDir, halfDir ) );\n vec3 F = F_Schlick( f0, f90, dotVH );\n #ifdef USE_IRIDESCENCE\n F = mix( F, material.iridescenceFresnel, material.iridescence );\n #endif\n #ifdef USE_ANISOTROPY\n float dotTL = dot( material.anisotropyT, lightDir );\n float dotTV = dot( material.anisotropyT, viewDir );\n float dotTH = dot( material.anisotropyT, halfDir );\n float dotBL = dot( material.anisotropyB, lightDir );\n float dotBV = dot( material.anisotropyB, viewDir );\n float dotBH = dot( material.anisotropyB, halfDir );\n float V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\n float D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\n #else\n float V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n float D = D_GGX( alpha, dotNH );\n #endif\n return F * ( V * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n const float LUT_SIZE = 64.0;\n const float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n const float LUT_BIAS = 0.5 / LUT_SIZE;\n float dotNV = saturate( dot( N, V ) );\n vec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n uv = uv * LUT_SCALE + LUT_BIAS;\n return uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n float l = length( f );\n return max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n float x = dot( v1, v2 );\n float y = abs( x );\n float a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n float b = 3.4175940 + ( 4.1616724 + y ) * y;\n float v = a / b;\n float theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n return 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 vec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n vec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n vec3 lightNormal = cross( v1, v2 );\n if( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n vec3 T1, T2;\n T1 = normalize( V - N * dot( V, N ) );\n T2 = - cross( N, T1 );\n mat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n vec3 coords[ 4 ];\n coords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n coords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n coords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n coords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n coords[ 0 ] = normalize( coords[ 0 ] );\n coords[ 1 ] = normalize( coords[ 1 ] );\n coords[ 2 ] = normalize( coords[ 2 ] );\n coords[ 3 ] = normalize( coords[ 3 ] );\n vec3 vectorFormFactor = vec3( 0.0 );\n vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n float result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n return vec3( result );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float dotNH ) {\n float alpha = pow2( roughness );\n float invAlpha = 1.0 / alpha;\n float cos2h = dotNH * dotNH;\n float sin2h = max( 1.0 - cos2h, 0.0078125 );\n return ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float dotNV, float dotNL ) {\n return 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 vec3 halfDir = normalize( lightDir + viewDir );\n float dotNL = saturate( dot( normal, lightDir ) );\n float dotNV = saturate( dot( normal, viewDir ) );\n float dotNH = saturate( dot( normal, halfDir ) );\n float D = D_Charlie( sheenRoughness, dotNH );\n float V = V_Neubelt( dotNV, dotNL );\n return sheenColor * ( D * V );\n}\n#endif\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n float dotNV = saturate( dot( normal, viewDir ) );\n float r2 = roughness * roughness;\n float a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\n float b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\n float DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\n return saturate( DG * RECIPROCAL_PI );\n}\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n float dotNV = saturate( dot( normal, viewDir ) );\n const vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n const vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n vec4 r = roughness * c0 + c1;\n float a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n vec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\n return 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 vec2 fab = DFGApprox( normal, viewDir, roughness );\n return 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 vec2 fab = DFGApprox( normal, viewDir, roughness );\n #ifdef USE_IRIDESCENCE\n vec3 Fr = mix( specularColor, iridescenceF0, iridescence );\n #else\n vec3 Fr = specularColor;\n #endif\n vec3 FssEss = Fr * fab.x + specularF90 * fab.y;\n float Ess = fab.x + fab.y;\n float Ems = 1.0 - Ess;\n vec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619; vec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n singleScatter += FssEss;\n multiScatter += Fms * Ems;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n void 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 vec3 normal = geometryNormal;\n vec3 viewDir = geometryViewDir;\n vec3 position = geometryPosition;\n vec3 lightPos = rectAreaLight.position;\n vec3 halfWidth = rectAreaLight.halfWidth;\n vec3 halfHeight = rectAreaLight.halfHeight;\n vec3 lightColor = rectAreaLight.color;\n float roughness = material.roughness;\n vec3 rectCoords[ 4 ];\n rectCoords[ 0 ] = lightPos + halfWidth - halfHeight; rectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n rectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n rectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n vec2 uv = LTC_Uv( normal, viewDir, roughness );\n vec4 t1 = texture2D( ltc_1, uv );\n vec4 t2 = texture2D( ltc_2, uv );\n mat3 mInv = mat3(\n vec3( t1.x, 0, t1.y ),\n vec3( 0, 1, 0 ),\n vec3( t1.z, 0, t1.w )\n );\n vec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n reflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n reflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n }\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 float dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n vec3 irradiance = dotNL * directLight.color;\n #ifdef USE_CLEARCOAT\n float dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\n vec3 ccIrradiance = dotNLcc * directLight.color;\n clearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\n #endif\n #ifdef USE_SHEEN\n sheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\n #endif\n reflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometryViewDir, geometryNormal, material );\n reflectedLight.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 reflectedLight.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 #ifdef USE_CLEARCOAT\n clearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n #endif\n #ifdef USE_SHEEN\n sheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n #endif\n vec3 singleScattering = vec3( 0.0 );\n vec3 multiScattering = vec3( 0.0 );\n vec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n #ifdef USE_IRIDESCENCE\n computeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\n #else\n computeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n #endif\n vec3 totalScattering = singleScattering + multiScattering;\n vec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\n reflectedLight.indirectSpecular += radiance * singleScattering;\n reflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n reflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct RE_Direct_Physical\n#define RE_Direct_RectArea RE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse RE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular RE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n return saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}"; -var 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 geometryClearcoatNormal = clearcoatNormal;\n#endif\n#ifdef USE_IRIDESCENCE\n float dotNVi = saturate( dot( normal, geometryViewDir ) );\n if ( material.iridescenceThickness == 0.0 ) {\n material.iridescence = 0.0;\n } else {\n material.iridescence = saturate( material.iridescence );\n }\n if ( material.iridescence > 0.0 ) {\n material.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n material.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\n }\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n PointLight pointLight;\n #if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n PointLightShadow pointLightShadow;\n #endif\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n pointLight = pointLights[ i ];\n getPointLightInfo( pointLight, geometryPosition, directLight );\n #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n pointLightShadow = pointLightShadows[ i ];\n directLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n #endif\n RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n }\n #pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n SpotLight spotLight;\n vec4 spotColor;\n vec3 spotLightCoord;\n bool inSpotLightMap;\n #if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n SpotLightShadow spotLightShadow;\n #endif\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n spotLight = spotLights[ i ];\n getSpotLightInfo( spotLight, geometryPosition, directLight );\n #if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n #define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\n #elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n #define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\n #else\n #define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n #endif\n #if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\n spotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\n inSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\n spotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\n directLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\n #endif\n #undef SPOT_LIGHT_MAP_INDEX\n #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n spotLightShadow = spotLightShadows[ i ];\n directLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n #endif\n RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n }\n #pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n DirectionalLight directionalLight;\n #if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n DirectionalLightShadow directionalLightShadow;\n #endif\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n directionalLight = directionalLights[ i ];\n getDirectionalLightInfo( directionalLight, directLight );\n #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n directionalLightShadow = directionalLightShadows[ i ];\n directLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n #endif\n RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n }\n #pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n RectAreaLight rectAreaLight;\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n rectAreaLight = rectAreaLights[ i ];\n RE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n }\n #pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n vec3 iblIrradiance = vec3( 0.0 );\n vec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n #if defined( USE_LIGHT_PROBES )\n irradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\n #endif\n #if ( NUM_HEMI_LIGHTS > 0 )\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n irradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\n }\n #pragma unroll_loop_end\n #endif\n#endif\n#if defined( RE_IndirectSpecular )\n vec3 radiance = vec3( 0.0 );\n vec3 clearcoatRadiance = vec3( 0.0 );\n#endif"; -var lights_fragment_maps = "#if defined( RE_IndirectDiffuse )\n #ifdef USE_LIGHTMAP\n vec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n vec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n irradiance += lightMapIrradiance;\n #endif\n #if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n iblIrradiance += getIBLIrradiance( geometryNormal );\n #endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n #ifdef USE_ANISOTROPY\n radiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\n #else\n radiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\n #endif\n #ifdef USE_CLEARCOAT\n clearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\n #endif\n#endif"; -var lights_fragment_end = "#if defined( RE_IndirectDiffuse )\n RE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n RE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif"; -var logdepthbuf_fragment = "#if defined( USE_LOGDEPTHBUF )\n gl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif"; -var logdepthbuf_pars_fragment = "#if defined( USE_LOGDEPTHBUF )\n uniform float logDepthBufFC;\n varying float vFragDepth;\n varying float vIsPerspective;\n#endif"; -var logdepthbuf_pars_vertex = "#ifdef USE_LOGDEPTHBUF\n varying float vFragDepth;\n varying float vIsPerspective;\n#endif"; -var logdepthbuf_vertex = "#ifdef USE_LOGDEPTHBUF\n vFragDepth = 1.0 + gl_Position.w;\n vIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n#endif"; -var map_fragment = "#ifdef USE_MAP\n vec4 sampledDiffuseColor = texture2D( map, vMapUv );\n #ifdef DECODE_VIDEO_TEXTURE\n sampledDiffuseColor = sRGBTransferEOTF( sampledDiffuseColor );\n #endif\n diffuseColor *= sampledDiffuseColor;\n#endif"; -var map_pars_fragment = "#ifdef USE_MAP\n uniform sampler2D map;\n#endif"; -var map_particle_fragment = "#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n #if defined( USE_POINTS_UV )\n vec2 uv = vUv;\n #else\n vec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n #endif\n#endif\n#ifdef USE_MAP\n diffuseColor *= texture2D( map, uv );\n#endif\n#ifdef USE_ALPHAMAP\n diffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif"; -var map_particle_pars_fragment = "#if defined( USE_POINTS_UV )\n varying vec2 vUv;\n#else\n #if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n uniform mat3 uvTransform;\n #endif\n#endif\n#ifdef USE_MAP\n uniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n uniform sampler2D alphaMap;\n#endif"; -var metalnessmap_fragment = "float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n vec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv );\n metalnessFactor *= texelMetalness.b;\n#endif"; -var metalnessmap_pars_fragment = "#ifdef USE_METALNESSMAP\n uniform sampler2D metalnessMap;\n#endif"; -var morphinstance_vertex = "#ifdef USE_INSTANCING_MORPH\n float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n float morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r;\n for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n morphTargetInfluences[i] = texelFetch( morphTexture, ivec2( i + 1, gl_InstanceID ), 0 ).r;\n }\n#endif"; -var morphcolor_vertex = "#if defined( USE_MORPHCOLORS )\n vColor *= morphTargetBaseInfluence;\n for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n #if defined( USE_COLOR_ALPHA )\n if ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\n #elif defined( USE_COLOR )\n if ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\n #endif\n }\n#endif"; -var morphnormal_vertex = "#ifdef USE_MORPHNORMALS\n objectNormal *= morphTargetBaseInfluence;\n for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n if ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\n }\n#endif"; -var morphtarget_pars_vertex = "#ifdef USE_MORPHTARGETS\n #ifndef USE_INSTANCING_MORPH\n uniform float morphTargetBaseInfluence;\n uniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n #endif\n uniform sampler2DArray morphTargetsTexture;\n uniform ivec2 morphTargetsTextureSize;\n vec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\n int texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\n int y = texelIndex / morphTargetsTextureSize.x;\n int x = texelIndex - y * morphTargetsTextureSize.x;\n ivec3 morphUV = ivec3( x, y, morphTargetIndex );\n return texelFetch( morphTargetsTexture, morphUV, 0 );\n }\n#endif"; -var morphtarget_vertex = "#ifdef USE_MORPHTARGETS\n transformed *= morphTargetBaseInfluence;\n for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n if ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\n }\n#endif"; -var normal_fragment_begin = "float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n#ifdef FLAT_SHADED\n vec3 fdx = dFdx( vViewPosition );\n vec3 fdy = dFdy( vViewPosition );\n vec3 normal = normalize( cross( fdx, fdy ) );\n#else\n vec3 normal = normalize( vNormal );\n #ifdef DOUBLE_SIDED\n normal *= faceDirection;\n #endif\n#endif\n#if defined( USE_NORMALMAP_TANGENTSPACE ) || defined( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY )\n #ifdef USE_TANGENT\n mat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n #else\n mat3 tbn = getTangentFrame( - vViewPosition, normal,\n #if defined( USE_NORMALMAP )\n vNormalMapUv\n #elif defined( USE_CLEARCOAT_NORMALMAP )\n vClearcoatNormalMapUv\n #else\n vUv\n #endif\n );\n #endif\n #if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n tbn[0] *= faceDirection;\n tbn[1] *= faceDirection;\n #endif\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n #ifdef USE_TANGENT\n mat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n #else\n mat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv );\n #endif\n #if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n tbn2[0] *= faceDirection;\n tbn2[1] *= faceDirection;\n #endif\n#endif\nvec3 nonPerturbedNormal = normal;"; -var normal_fragment_maps = "#ifdef USE_NORMALMAP_OBJECTSPACE\n normal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n #ifdef FLIP_SIDED\n normal = - normal;\n #endif\n #ifdef DOUBLE_SIDED\n normal = normal * faceDirection;\n #endif\n normal = normalize( normalMatrix * normal );\n#elif defined( USE_NORMALMAP_TANGENTSPACE )\n vec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n mapN.xy *= normalScale;\n normal = normalize( tbn * mapN );\n#elif defined( USE_BUMPMAP )\n normal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif"; -var normal_pars_fragment = "#ifndef FLAT_SHADED\n varying vec3 vNormal;\n #ifdef USE_TANGENT\n varying vec3 vTangent;\n varying vec3 vBitangent;\n #endif\n#endif"; -var normal_pars_vertex = "#ifndef FLAT_SHADED\n varying vec3 vNormal;\n #ifdef USE_TANGENT\n varying vec3 vTangent;\n varying vec3 vBitangent;\n #endif\n#endif"; -var normal_vertex = "#ifndef FLAT_SHADED\n vNormal = normalize( transformedNormal );\n #ifdef USE_TANGENT\n vTangent = normalize( transformedTangent );\n vBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n #endif\n#endif"; -var normalmap_pars_fragment = "#ifdef USE_NORMALMAP\n uniform sampler2D normalMap;\n uniform vec2 normalScale;\n#endif\n#ifdef USE_NORMALMAP_OBJECTSPACE\n uniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) )\n mat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) {\n vec3 q0 = dFdx( eye_pos.xyz );\n vec3 q1 = dFdy( eye_pos.xyz );\n vec2 st0 = dFdx( uv.st );\n vec2 st1 = dFdy( uv.st );\n vec3 N = surf_norm;\n vec3 q1perp = cross( q1, N );\n vec3 q0perp = cross( N, q0 );\n vec3 T = q1perp * st0.x + q0perp * st1.x;\n vec3 B = q1perp * st0.y + q0perp * st1.y;\n float det = max( dot( T, T ), dot( B, B ) );\n float scale = ( det == 0.0 ) ? 0.0 : inversesqrt( det );\n return mat3( T * scale, B * scale, N );\n }\n#endif"; -var clearcoat_normal_fragment_begin = "#ifdef USE_CLEARCOAT\n vec3 clearcoatNormal = nonPerturbedNormal;\n#endif"; -var clearcoat_normal_fragment_maps = "#ifdef USE_CLEARCOAT_NORMALMAP\n vec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0;\n clearcoatMapN.xy *= clearcoatNormalScale;\n clearcoatNormal = normalize( tbn2 * clearcoatMapN );\n#endif"; -var clearcoat_pars_fragment = "#ifdef USE_CLEARCOATMAP\n uniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n uniform sampler2D clearcoatNormalMap;\n uniform vec2 clearcoatNormalScale;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n uniform sampler2D clearcoatRoughnessMap;\n#endif"; -var iridescence_pars_fragment = "#ifdef USE_IRIDESCENCEMAP\n uniform sampler2D iridescenceMap;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n uniform sampler2D iridescenceThicknessMap;\n#endif"; -var opaque_fragment = "#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= material.transmissionAlpha;\n#endif\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );"; -var packing = "vec3 packNormalToRGB( const in vec3 normal ) {\n return normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n return 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;const float ShiftRight8 = 1. / 256.;\nconst float Inv255 = 1. / 255.;\nconst vec4 PackFactors = vec4( 1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0 );\nconst vec2 UnpackFactors2 = vec2( UnpackDownscale, 1.0 / PackFactors.g );\nconst vec3 UnpackFactors3 = vec3( UnpackDownscale / PackFactors.rg, 1.0 / PackFactors.b );\nconst vec4 UnpackFactors4 = vec4( UnpackDownscale / PackFactors.rgb, 1.0 / PackFactors.a );\nvec4 packDepthToRGBA( const in float v ) {\n if( v <= 0.0 )\n return vec4( 0., 0., 0., 0. );\n if( v >= 1.0 )\n return vec4( 1., 1., 1., 1. );\n float vuf;\n float af = modf( v * PackFactors.a, vuf );\n float bf = modf( vuf * ShiftRight8, vuf );\n float gf = modf( vuf * ShiftRight8, vuf );\n return vec4( vuf * Inv255, gf * PackUpscale, bf * PackUpscale, af );\n}\nvec3 packDepthToRGB( const in float v ) {\n if( v <= 0.0 )\n return vec3( 0., 0., 0. );\n if( v >= 1.0 )\n return vec3( 1., 1., 1. );\n float vuf;\n float bf = modf( v * PackFactors.b, vuf );\n float gf = modf( vuf * ShiftRight8, vuf );\n return vec3( vuf * Inv255, gf * PackUpscale, bf );\n}\nvec2 packDepthToRG( const in float v ) {\n if( v <= 0.0 )\n return vec2( 0., 0. );\n if( v >= 1.0 )\n return vec2( 1., 1. );\n float vuf;\n float gf = modf( v * 256., vuf );\n return vec2( vuf * Inv255, gf );\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n return dot( v, UnpackFactors4 );\n}\nfloat unpackRGBToDepth( const in vec3 v ) {\n return dot( v, UnpackFactors3 );\n}\nfloat unpackRGToDepth( const in vec2 v ) {\n return v.r * UnpackFactors2.r + v.g * UnpackFactors2.g;\n}\nvec4 pack2HalfToRGBA( const in vec2 v ) {\n vec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\n return vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\n}\nvec2 unpackRGBATo2Half( const in vec4 v ) {\n return 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 return ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float depth, const in float near, const in float far ) {\n return depth * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n return ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) {\n return ( near * far ) / ( ( far - near ) * depth - far );\n}"; -var premultiplied_alpha_fragment = "#ifdef PREMULTIPLIED_ALPHA\n gl_FragColor.rgb *= gl_FragColor.a;\n#endif"; -var project_vertex = "vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_BATCHING\n mvPosition = batchingMatrix * mvPosition;\n#endif\n#ifdef USE_INSTANCING\n mvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;"; -var dithering_fragment = "#ifdef DITHERING\n gl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif"; -var dithering_pars_fragment = "#ifdef DITHERING\n vec3 dithering( vec3 color ) {\n float grid_position = rand( gl_FragCoord.xy );\n vec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n dither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n return color + dither_shift_RGB;\n }\n#endif"; -var roughnessmap_fragment = "float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n vec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv );\n roughnessFactor *= texelRoughness.g;\n#endif"; -var roughnessmap_pars_fragment = "#ifdef USE_ROUGHNESSMAP\n uniform sampler2D roughnessMap;\n#endif"; -var shadowmap_pars_fragment = "#if NUM_SPOT_LIGHT_COORDS > 0\n varying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#if NUM_SPOT_LIGHT_MAPS > 0\n uniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\n#endif\n#ifdef USE_SHADOWMAP\n #if NUM_DIR_LIGHT_SHADOWS > 0\n uniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n varying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n struct DirectionalLightShadow {\n float shadowIntensity;\n float shadowBias;\n float shadowNormalBias;\n float shadowRadius;\n vec2 shadowMapSize;\n };\n uniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n #endif\n #if NUM_SPOT_LIGHT_SHADOWS > 0\n uniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n struct SpotLightShadow {\n float shadowIntensity;\n float shadowBias;\n float shadowNormalBias;\n float shadowRadius;\n vec2 shadowMapSize;\n };\n uniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n #endif\n #if NUM_POINT_LIGHT_SHADOWS > 0\n uniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n varying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n struct PointLightShadow {\n float shadowIntensity;\n float shadowBias;\n float shadowNormalBias;\n float shadowRadius;\n vec2 shadowMapSize;\n float shadowCameraNear;\n float shadowCameraFar;\n };\n uniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n #endif\n float texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n return step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n }\n vec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n return unpackRGBATo2Half( texture2D( shadow, uv ) );\n }\n float VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n float occlusion = 1.0;\n vec2 distribution = texture2DDistribution( shadow, uv );\n float hard_shadow = step( compare , distribution.x );\n if (hard_shadow != 1.0 ) {\n float distance = compare - distribution.x ;\n float variance = max( 0.00000, distribution.y * distribution.y );\n float softness_probability = variance / (variance + distance * distance ); softness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 ); occlusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n }\n return occlusion;\n }\n float getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n float shadow = 1.0;\n shadowCoord.xyz /= shadowCoord.w;\n shadowCoord.z += shadowBias;\n bool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n bool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n if ( frustumTest ) {\n #if defined( SHADOWMAP_TYPE_PCF )\n vec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n float dx0 = - texelSize.x * shadowRadius;\n float dy0 = - texelSize.y * shadowRadius;\n float dx1 = + texelSize.x * shadowRadius;\n float dy1 = + texelSize.y * shadowRadius;\n float dx2 = dx0 / 2.0;\n float dy2 = dy0 / 2.0;\n float dx3 = dx1 / 2.0;\n float dy3 = dy1 / 2.0;\n shadow = (\n texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n texture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n texture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n texture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n texture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n ) * ( 1.0 / 17.0 );\n #elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n vec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n float dx = texelSize.x;\n float dy = texelSize.y;\n vec2 uv = shadowCoord.xy;\n vec2 f = fract( uv * shadowMapSize + 0.5 );\n uv -= f * texelSize;\n shadow = (\n texture2DCompare( shadowMap, uv, shadowCoord.z ) +\n texture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n texture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n texture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n mix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ),\n texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n f.x ) +\n mix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ),\n texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n f.x ) +\n mix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ),\n texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n f.y ) +\n mix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ),\n texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n f.y ) +\n mix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ),\n texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n f.x ),\n mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ),\n texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n f.x ),\n f.y )\n ) * ( 1.0 / 9.0 );\n #elif defined( SHADOWMAP_TYPE_VSM )\n shadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n #else\n shadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n #endif\n }\n return mix( 1.0, shadow, shadowIntensity );\n }\n vec2 cubeToUV( vec3 v, float texelSizeY ) {\n vec3 absV = abs( v );\n float scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n absV *= scaleToCube;\n v *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n vec2 planar = v.xy;\n float almostATexel = 1.5 * texelSizeY;\n float almostOne = 1.0 - almostATexel;\n if ( absV.z >= almostOne ) {\n if ( v.z > 0.0 )\n planar.x = 4.0 - v.x;\n } else if ( absV.x >= almostOne ) {\n float signX = sign( v.x );\n planar.x = v.z * signX + 2.0 * signX;\n } else if ( absV.y >= almostOne ) {\n float signY = sign( v.y );\n planar.x = v.x + 2.0 * signY + 2.0;\n planar.y = v.z * signY - 2.0;\n }\n return vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n }\n float getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n float shadow = 1.0;\n vec3 lightToPosition = shadowCoord.xyz;\n \n float lightToPositionLength = length( lightToPosition );\n if ( lightToPositionLength - shadowCameraFar <= 0.0 && lightToPositionLength - shadowCameraNear >= 0.0 ) {\n float dp = ( lightToPositionLength - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear ); dp += shadowBias;\n vec3 bd3D = normalize( lightToPosition );\n vec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n #if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n vec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n shadow = (\n texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n ) * ( 1.0 / 9.0 );\n #else\n shadow = texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n #endif\n }\n return mix( 1.0, shadow, shadowIntensity );\n }\n#endif"; -var shadowmap_pars_vertex = "#if NUM_SPOT_LIGHT_COORDS > 0\n uniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\n varying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#ifdef USE_SHADOWMAP\n #if NUM_DIR_LIGHT_SHADOWS > 0\n uniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n varying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n struct DirectionalLightShadow {\n float shadowIntensity;\n float shadowBias;\n float shadowNormalBias;\n float shadowRadius;\n vec2 shadowMapSize;\n };\n uniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n #endif\n #if NUM_SPOT_LIGHT_SHADOWS > 0\n struct SpotLightShadow {\n float shadowIntensity;\n float shadowBias;\n float shadowNormalBias;\n float shadowRadius;\n vec2 shadowMapSize;\n };\n uniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n #endif\n #if NUM_POINT_LIGHT_SHADOWS > 0\n uniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n varying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n struct PointLightShadow {\n float shadowIntensity;\n float shadowBias;\n float shadowNormalBias;\n float shadowRadius;\n vec2 shadowMapSize;\n float shadowCameraNear;\n float shadowCameraFar;\n };\n uniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n #endif\n#endif"; -var shadowmap_vertex = "#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\n vec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n vec4 shadowWorldPosition;\n#endif\n#if defined( USE_SHADOWMAP )\n #if NUM_DIR_LIGHT_SHADOWS > 0\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n shadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n vDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n }\n #pragma unroll_loop_end\n #endif\n #if NUM_POINT_LIGHT_SHADOWS > 0\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n shadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n vPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n }\n #pragma unroll_loop_end\n #endif\n#endif\n#if NUM_SPOT_LIGHT_COORDS > 0\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\n shadowWorldPosition = worldPosition;\n #if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n shadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\n #endif\n vSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\n }\n #pragma unroll_loop_end\n#endif"; -var shadowmask_pars_fragment = "float getShadowMask() {\n float shadow = 1.0;\n #ifdef USE_SHADOWMAP\n #if NUM_DIR_LIGHT_SHADOWS > 0\n DirectionalLightShadow directionalLight;\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n directionalLight = directionalLightShadows[ i ];\n shadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowIntensity, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n }\n #pragma unroll_loop_end\n #endif\n #if NUM_SPOT_LIGHT_SHADOWS > 0\n SpotLightShadow spotLight;\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n spotLight = spotLightShadows[ i ];\n shadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowIntensity, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n }\n #pragma unroll_loop_end\n #endif\n #if NUM_POINT_LIGHT_SHADOWS > 0\n PointLightShadow pointLight;\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n pointLight = pointLightShadows[ i ];\n shadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowIntensity, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n }\n #pragma unroll_loop_end\n #endif\n #endif\n return shadow;\n}"; -var skinbase_vertex = "#ifdef USE_SKINNING\n mat4 boneMatX = getBoneMatrix( skinIndex.x );\n mat4 boneMatY = getBoneMatrix( skinIndex.y );\n mat4 boneMatZ = getBoneMatrix( skinIndex.z );\n mat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif"; -var skinning_pars_vertex = "#ifdef USE_SKINNING\n uniform mat4 bindMatrix;\n uniform mat4 bindMatrixInverse;\n uniform highp sampler2D boneTexture;\n mat4 getBoneMatrix( const in float i ) {\n int size = textureSize( boneTexture, 0 ).x;\n int j = int( i ) * 4;\n int x = j % size;\n int y = j / size;\n vec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 );\n vec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 );\n vec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 );\n vec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 );\n return mat4( v1, v2, v3, v4 );\n }\n#endif"; -var skinning_vertex = "#ifdef USE_SKINNING\n vec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n vec4 skinned = vec4( 0.0 );\n skinned += boneMatX * skinVertex * skinWeight.x;\n skinned += boneMatY * skinVertex * skinWeight.y;\n skinned += boneMatZ * skinVertex * skinWeight.z;\n skinned += boneMatW * skinVertex * skinWeight.w;\n transformed = ( bindMatrixInverse * skinned ).xyz;\n#endif"; -var skinnormal_vertex = "#ifdef USE_SKINNING\n mat4 skinMatrix = mat4( 0.0 );\n skinMatrix += skinWeight.x * boneMatX;\n skinMatrix += skinWeight.y * boneMatY;\n skinMatrix += skinWeight.z * boneMatZ;\n skinMatrix += skinWeight.w * boneMatW;\n skinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n objectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n #ifdef USE_TANGENT\n objectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n #endif\n#endif"; -var specularmap_fragment = "float specularStrength;\n#ifdef USE_SPECULARMAP\n vec4 texelSpecular = texture2D( specularMap, vSpecularMapUv );\n specularStrength = texelSpecular.r;\n#else\n specularStrength = 1.0;\n#endif"; -var specularmap_pars_fragment = "#ifdef USE_SPECULARMAP\n uniform sampler2D specularMap;\n#endif"; -var tonemapping_fragment = "#if defined( TONE_MAPPING )\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif"; -var 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 return saturate( toneMappingExposure * color );\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n color *= toneMappingExposure;\n return saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 CineonToneMapping( vec3 color ) {\n color *= toneMappingExposure;\n color = max( vec3( 0.0 ), color - 0.004 );\n return pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n vec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n vec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n return a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n const mat3 ACESInputMat = mat3(\n vec3( 0.59719, 0.07600, 0.02840 ), vec3( 0.35458, 0.90834, 0.13383 ),\n vec3( 0.04823, 0.01566, 0.83777 )\n );\n const mat3 ACESOutputMat = mat3(\n vec3( 1.60475, -0.10208, -0.00327 ), vec3( -0.53108, 1.10813, -0.07276 ),\n vec3( -0.07367, -0.00605, 1.07602 )\n );\n color *= toneMappingExposure / 0.6;\n color = ACESInputMat * color;\n color = RRTAndODTFit( color );\n color = ACESOutputMat * color;\n return saturate( color );\n}\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\n vec3( 1.6605, - 0.1246, - 0.0182 ),\n vec3( - 0.5876, 1.1329, - 0.1006 ),\n vec3( - 0.0728, - 0.0083, 1.1187 )\n);\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\n vec3( 0.6274, 0.0691, 0.0164 ),\n vec3( 0.3293, 0.9195, 0.0880 ),\n vec3( 0.0433, 0.0113, 0.8956 )\n);\nvec3 agxDefaultContrastApprox( vec3 x ) {\n vec3 x2 = x * x;\n vec3 x4 = x2 * x2;\n return + 15.5 * x4 * x2\n - 40.14 * x4 * x\n + 31.96 * x4\n - 6.868 * x2 * x\n + 0.4298 * x2\n + 0.1191 * x\n - 0.00232;\n}\nvec3 AgXToneMapping( vec3 color ) {\n const mat3 AgXInsetMatrix = mat3(\n vec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ),\n vec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ),\n vec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 )\n );\n const mat3 AgXOutsetMatrix = mat3(\n vec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ),\n vec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ),\n vec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 )\n );\n const float AgxMinEv = - 12.47393; const float AgxMaxEv = 4.026069;\n color *= toneMappingExposure;\n color = LINEAR_SRGB_TO_LINEAR_REC2020 * color;\n color = AgXInsetMatrix * color;\n color = max( color, 1e-10 ); color = log2( color );\n color = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv );\n color = clamp( color, 0.0, 1.0 );\n color = agxDefaultContrastApprox( color );\n color = AgXOutsetMatrix * color;\n color = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) );\n color = LINEAR_REC2020_TO_LINEAR_SRGB * color;\n color = clamp( color, 0.0, 1.0 );\n return color;\n}\nvec3 NeutralToneMapping( vec3 color ) {\n const float StartCompression = 0.8 - 0.04;\n const float Desaturation = 0.15;\n color *= toneMappingExposure;\n float x = min( color.r, min( color.g, color.b ) );\n float offset = x < 0.08 ? x - 6.25 * x * x : 0.04;\n color -= offset;\n float peak = max( color.r, max( color.g, color.b ) );\n if ( peak < StartCompression ) return color;\n float d = 1. - StartCompression;\n float newPeak = 1. - d * d / ( peak + d - StartCompression );\n color *= newPeak / peak;\n float g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. );\n return mix( color, vec3( newPeak ), g );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }"; -var transmission_fragment = "#ifdef USE_TRANSMISSION\n material.transmission = transmission;\n material.transmissionAlpha = 1.0;\n material.thickness = thickness;\n material.attenuationDistance = attenuationDistance;\n material.attenuationColor = attenuationColor;\n #ifdef USE_TRANSMISSIONMAP\n material.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\n #endif\n #ifdef USE_THICKNESSMAP\n material.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\n #endif\n vec3 pos = vWorldPosition;\n vec3 v = normalize( cameraPosition - pos );\n vec3 n = inverseTransformDirection( normal, viewMatrix );\n vec4 transmitted = getIBLVolumeRefraction(\n n, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n pos, modelMatrix, viewMatrix, projectionMatrix, material.dispersion, material.ior, material.thickness,\n material.attenuationColor, material.attenuationDistance );\n material.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\n totalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission );\n#endif"; -var transmission_pars_fragment = "#ifdef USE_TRANSMISSION\n uniform float transmission;\n uniform float thickness;\n uniform float attenuationDistance;\n uniform vec3 attenuationColor;\n #ifdef USE_TRANSMISSIONMAP\n uniform sampler2D transmissionMap;\n #endif\n #ifdef USE_THICKNESSMAP\n uniform sampler2D thicknessMap;\n #endif\n uniform vec2 transmissionSamplerSize;\n uniform sampler2D transmissionSamplerMap;\n uniform mat4 modelMatrix;\n uniform mat4 projectionMatrix;\n varying vec3 vWorldPosition;\n float w0( float a ) {\n return ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\n }\n float w1( float a ) {\n return ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\n }\n float w2( float a ){\n return ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\n }\n float w3( float a ) {\n return ( 1.0 / 6.0 ) * ( a * a * a );\n }\n float g0( float a ) {\n return w0( a ) + w1( a );\n }\n float g1( float a ) {\n return w2( a ) + w3( a );\n }\n float h0( float a ) {\n return - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\n }\n float h1( float a ) {\n return 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\n }\n vec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\n uv = uv * texelSize.zw + 0.5;\n vec2 iuv = floor( uv );\n vec2 fuv = fract( uv );\n float g0x = g0( fuv.x );\n float g1x = g1( fuv.x );\n float h0x = h0( fuv.x );\n float h1x = h1( fuv.x );\n float h0y = h0( fuv.y );\n float h1y = h1( fuv.y );\n vec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n vec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n vec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n vec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n return g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\n g1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\n }\n vec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\n vec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\n vec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\n vec2 fLodSizeInv = 1.0 / fLodSize;\n vec2 cLodSizeInv = 1.0 / cLodSize;\n vec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\n vec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\n return mix( fSample, cSample, fract( lod ) );\n }\n vec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n vec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n vec3 modelScale;\n modelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n modelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n modelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n return normalize( refractionVector ) * thickness * modelScale;\n }\n float applyIorToRoughness( const in float roughness, const in float ior ) {\n return roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n }\n vec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n float lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n return textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\n }\n vec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n if ( isinf( attenuationDistance ) ) {\n return vec3( 1.0 );\n } else {\n vec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n vec3 transmittance = exp( - attenuationCoefficient * transmissionDistance ); return transmittance;\n }\n }\n vec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n const in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n const in mat4 viewMatrix, const in mat4 projMatrix, const in float dispersion, const in float ior, const in float thickness,\n const in vec3 attenuationColor, const in float attenuationDistance ) {\n vec4 transmittedLight;\n vec3 transmittance;\n #ifdef USE_DISPERSION\n float halfSpread = ( ior - 1.0 ) * 0.025 * dispersion;\n vec3 iors = vec3( ior - halfSpread, ior, ior + halfSpread );\n for ( int i = 0; i < 3; i ++ ) {\n vec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, iors[ i ], modelMatrix );\n vec3 refractedRayExit = position + transmissionRay;\n \n vec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n vec2 refractionCoords = ndcPos.xy / ndcPos.w;\n refractionCoords += 1.0;\n refractionCoords /= 2.0;\n \n vec4 transmissionSample = getTransmissionSample( refractionCoords, roughness, iors[ i ] );\n transmittedLight[ i ] = transmissionSample[ i ];\n transmittedLight.a += transmissionSample.a;\n transmittance[ i ] = diffuseColor[ i ] * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance )[ i ];\n }\n transmittedLight.a /= 3.0;\n \n #else\n \n vec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n vec3 refractedRayExit = position + transmissionRay;\n vec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n vec2 refractionCoords = ndcPos.xy / ndcPos.w;\n refractionCoords += 1.0;\n refractionCoords /= 2.0;\n transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n transmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\n \n #endif\n vec3 attenuatedColor = transmittance * transmittedLight.rgb;\n vec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n float transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\n return vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\n }\n#endif"; -var uv_pars_fragment = "#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n varying vec2 vUv;\n#endif\n#ifdef USE_MAP\n varying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n varying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n varying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n varying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n varying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n varying vec2 vNormalMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n varying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n varying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n varying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n varying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n varying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n varying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n varying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n varying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n varying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n varying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n varying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n varying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n varying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n varying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n uniform mat3 transmissionMapTransform;\n varying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n uniform mat3 thicknessMapTransform;\n varying vec2 vThicknessMapUv;\n#endif"; -var uv_pars_vertex = "#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n varying vec2 vUv;\n#endif\n#ifdef USE_MAP\n uniform mat3 mapTransform;\n varying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n uniform mat3 alphaMapTransform;\n varying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n uniform mat3 lightMapTransform;\n varying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n uniform mat3 aoMapTransform;\n varying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n uniform mat3 bumpMapTransform;\n varying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n uniform mat3 normalMapTransform;\n varying vec2 vNormalMapUv;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n uniform mat3 displacementMapTransform;\n varying vec2 vDisplacementMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n uniform mat3 emissiveMapTransform;\n varying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n uniform mat3 metalnessMapTransform;\n varying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n uniform mat3 roughnessMapTransform;\n varying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n uniform mat3 anisotropyMapTransform;\n varying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n uniform mat3 clearcoatMapTransform;\n varying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n uniform mat3 clearcoatNormalMapTransform;\n varying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n uniform mat3 clearcoatRoughnessMapTransform;\n varying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n uniform mat3 sheenColorMapTransform;\n varying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n uniform mat3 sheenRoughnessMapTransform;\n varying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n uniform mat3 iridescenceMapTransform;\n varying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n uniform mat3 iridescenceThicknessMapTransform;\n varying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n uniform mat3 specularMapTransform;\n varying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n uniform mat3 specularColorMapTransform;\n varying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n uniform mat3 specularIntensityMapTransform;\n varying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n uniform mat3 transmissionMapTransform;\n varying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n uniform mat3 thicknessMapTransform;\n varying vec2 vThicknessMapUv;\n#endif"; -var uv_vertex = "#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n vUv = vec3( uv, 1 ).xy;\n#endif\n#ifdef USE_MAP\n vMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ALPHAMAP\n vAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_LIGHTMAP\n vLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_AOMAP\n vAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_BUMPMAP\n vBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_NORMALMAP\n vNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n vDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_EMISSIVEMAP\n vEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_METALNESSMAP\n vMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ROUGHNESSMAP\n vRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ANISOTROPYMAP\n vAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOATMAP\n vClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n vClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n vClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n vIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n vIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n vSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n vSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULARMAP\n vSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n vSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n vSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n vTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_THICKNESSMAP\n vThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy;\n#endif"; -var worldpos_vertex = "#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\n vec4 worldPosition = vec4( transformed, 1.0 );\n #ifdef USE_BATCHING\n worldPosition = batchingMatrix * worldPosition;\n #endif\n #ifdef USE_INSTANCING\n worldPosition = instanceMatrix * worldPosition;\n #endif\n worldPosition = modelMatrix * worldPosition;\n#endif"; -const vertex$h = "varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n vUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n gl_Position = vec4( position.xy, 1.0, 1.0 );\n}"; -const fragment$h = "uniform sampler2D t2D;\nuniform float backgroundIntensity;\nvarying vec2 vUv;\nvoid main() {\n vec4 texColor = texture2D( t2D, vUv );\n #ifdef DECODE_VIDEO_TEXTURE\n texColor = 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 #endif\n texColor.rgb *= backgroundIntensity;\n gl_FragColor = texColor;\n #include \n #include \n}"; -const vertex$g = "varying vec3 vWorldDirection;\n#include \nvoid main() {\n vWorldDirection = transformDirection( position, modelMatrix );\n #include \n #include \n gl_Position.z = gl_Position.w;\n}"; -const fragment$g = "#ifdef ENVMAP_TYPE_CUBE\n uniform samplerCube envMap;\n#elif defined( ENVMAP_TYPE_CUBE_UV )\n uniform sampler2D envMap;\n#endif\nuniform float flipEnvMap;\nuniform float backgroundBlurriness;\nuniform float backgroundIntensity;\nuniform mat3 backgroundRotation;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n #ifdef ENVMAP_TYPE_CUBE\n vec4 texColor = textureCube( envMap, backgroundRotation * vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\n #elif defined( ENVMAP_TYPE_CUBE_UV )\n vec4 texColor = textureCubeUV( envMap, backgroundRotation * vWorldDirection, backgroundBlurriness );\n #else\n vec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n #endif\n texColor.rgb *= backgroundIntensity;\n gl_FragColor = texColor;\n #include \n #include \n}"; -const vertex$f = "varying vec3 vWorldDirection;\n#include \nvoid main() {\n vWorldDirection = transformDirection( position, modelMatrix );\n #include \n #include \n gl_Position.z = gl_Position.w;\n}"; -const fragment$f = "uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldDirection;\nvoid main() {\n vec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\n gl_FragColor = texColor;\n gl_FragColor.a *= opacity;\n #include \n #include \n}"; -const vertex$e = "#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n #include \n #include \n #include \n #include \n #ifdef USE_DISPLACEMENTMAP\n #include \n #include \n #include \n #endif\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n vHighPrecisionZW = gl_Position.zw;\n}"; -const fragment$e = "#if DEPTH_PACKING == 3200\n uniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n vec4 diffuseColor = vec4( 1.0 );\n #include \n #if DEPTH_PACKING == 3200\n diffuseColor.a = opacity;\n #endif\n #include \n #include \n #include \n #include \n #include \n float fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n #if DEPTH_PACKING == 3200\n gl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n #elif DEPTH_PACKING == 3201\n gl_FragColor = packDepthToRGBA( fragCoordZ );\n #elif DEPTH_PACKING == 3202\n gl_FragColor = vec4( packDepthToRGB( fragCoordZ ), 1.0 );\n #elif DEPTH_PACKING == 3203\n gl_FragColor = vec4( packDepthToRG( fragCoordZ ), 0.0, 1.0 );\n #endif\n}"; -const vertex$d = "#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #ifdef USE_DISPLACEMENTMAP\n #include \n #include \n #include \n #endif\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n vWorldPosition = worldPosition.xyz;\n}"; -const fragment$d = "#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n vec4 diffuseColor = vec4( 1.0 );\n #include \n #include \n #include \n #include \n #include \n float dist = length( vWorldPosition - referencePosition );\n dist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n dist = saturate( dist );\n gl_FragColor = packDepthToRGBA( dist );\n}"; -const vertex$c = "varying vec3 vWorldDirection;\n#include \nvoid main() {\n vWorldDirection = transformDirection( position, modelMatrix );\n #include \n #include \n}"; -const fragment$c = "uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n vec3 direction = normalize( vWorldDirection );\n vec2 sampleUV = equirectUv( direction );\n gl_FragColor = texture2D( tEquirect, sampleUV );\n #include \n #include \n}"; -const vertex$b = "uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n vLineDistance = scale * lineDistance;\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n}"; -const fragment$b = "uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n vec4 diffuseColor = vec4( diffuse, opacity );\n #include \n if ( mod( vLineDistance, totalSize ) > dashSize ) {\n discard;\n }\n vec3 outgoingLight = vec3( 0.0 );\n #include \n #include \n #include \n outgoingLight = diffuseColor.rgb;\n #include \n #include \n #include \n #include \n #include \n}"; -const vertex$a = "#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n #include \n #include \n #include \n #include \n #include \n #endif\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n}"; -const fragment$a = "uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n varying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n vec4 diffuseColor = vec4( diffuse, opacity );\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n #ifdef USE_LIGHTMAP\n vec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n reflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\n #else\n reflectedLight.indirectDiffuse += vec3( 1.0 );\n #endif\n #include \n reflectedLight.indirectDiffuse *= diffuseColor.rgb;\n vec3 outgoingLight = reflectedLight.indirectDiffuse;\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n}"; -const vertex$9 = "#define LAMBERT\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n vViewPosition = - mvPosition.xyz;\n #include \n #include \n #include \n #include \n}"; -const fragment$9 = "#define LAMBERT\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n vec4 diffuseColor = vec4( diffuse, opacity );\n #include \n ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n vec3 totalEmissiveRadiance = emissive;\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n}"; -const vertex$8 = "#define MATCAP\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n vViewPosition = - mvPosition.xyz;\n}"; -const fragment$8 = "#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n vec4 diffuseColor = vec4( diffuse, opacity );\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n vec3 viewDir = normalize( vViewPosition );\n vec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n vec3 y = cross( viewDir, x );\n vec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n #ifdef USE_MATCAP\n vec4 matcapColor = texture2D( matcap, uv );\n #else\n vec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\n #endif\n vec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n #include \n #include \n #include \n #include \n #include \n #include \n}"; -const vertex$7 = "#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n varying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n vViewPosition = - mvPosition.xyz;\n#endif\n}"; -const fragment$7 = "#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n varying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n vec4 diffuseColor = vec4( 0.0, 0.0, 0.0, opacity );\n #include \n #include \n #include \n #include \n gl_FragColor = vec4( packNormalToRGB( normal ), diffuseColor.a );\n #ifdef OPAQUE\n gl_FragColor.a = 1.0;\n #endif\n}"; -const vertex$6 = "#define PHONG\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n vViewPosition = - mvPosition.xyz;\n #include \n #include \n #include \n #include \n}"; -const fragment$6 = "#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n vec4 diffuseColor = vec4( diffuse, opacity );\n #include \n ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n vec3 totalEmissiveRadiance = emissive;\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n}"; -const vertex$5 = "#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\n varying vec3 vWorldPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n vViewPosition = - mvPosition.xyz;\n #include \n #include \n #include \n#ifdef USE_TRANSMISSION\n vWorldPosition = worldPosition.xyz;\n#endif\n}"; -const fragment$5 = "#define STANDARD\n#ifdef PHYSICAL\n #define IOR\n #define USE_SPECULAR\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef IOR\n uniform float ior;\n#endif\n#ifdef USE_SPECULAR\n uniform float specularIntensity;\n uniform vec3 specularColor;\n #ifdef USE_SPECULAR_COLORMAP\n uniform sampler2D specularColorMap;\n #endif\n #ifdef USE_SPECULAR_INTENSITYMAP\n uniform sampler2D specularIntensityMap;\n #endif\n#endif\n#ifdef USE_CLEARCOAT\n uniform float clearcoat;\n uniform float clearcoatRoughness;\n#endif\n#ifdef USE_DISPERSION\n uniform float dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n uniform float iridescence;\n uniform float iridescenceIOR;\n uniform float iridescenceThicknessMinimum;\n uniform float iridescenceThicknessMaximum;\n#endif\n#ifdef USE_SHEEN\n uniform vec3 sheenColor;\n uniform float sheenRoughness;\n #ifdef USE_SHEEN_COLORMAP\n uniform sampler2D sheenColorMap;\n #endif\n #ifdef USE_SHEEN_ROUGHNESSMAP\n uniform sampler2D sheenRoughnessMap;\n #endif\n#endif\n#ifdef USE_ANISOTROPY\n uniform vec2 anisotropyVector;\n #ifdef USE_ANISOTROPYMAP\n uniform sampler2D anisotropyMap;\n #endif\n#endif\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n vec4 diffuseColor = vec4( diffuse, opacity );\n #include \n ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n vec3 totalEmissiveRadiance = emissive;\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n vec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n vec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n #include \n vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n #ifdef USE_SHEEN\n float sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\n outgoingLight = outgoingLight * sheenEnergyComp + sheenSpecularDirect + sheenSpecularIndirect;\n #endif\n #ifdef USE_CLEARCOAT\n float dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) );\n vec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n outgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;\n #endif\n #include \n #include \n #include \n #include \n #include \n #include \n}"; -const vertex$4 = "#define TOON\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n vViewPosition = - mvPosition.xyz;\n #include \n #include \n #include \n}"; -const fragment$4 = "#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n vec4 diffuseColor = vec4( diffuse, opacity );\n #include \n ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n vec3 totalEmissiveRadiance = emissive;\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n #include \n #include \n #include \n #include \n #include \n #include \n}"; -const vertex$3 = "uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \n#ifdef USE_POINTS_UV\n varying vec2 vUv;\n uniform mat3 uvTransform;\n#endif\nvoid main() {\n #ifdef USE_POINTS_UV\n vUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n #endif\n #include \n #include \n #include \n #include \n #include \n #include \n gl_PointSize = size;\n #ifdef USE_SIZEATTENUATION\n bool isPerspective = isPerspectiveMatrix( projectionMatrix );\n if ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n #endif\n #include \n #include \n #include \n #include \n}"; -const fragment$3 = "uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n vec4 diffuseColor = vec4( diffuse, opacity );\n #include \n vec3 outgoingLight = vec3( 0.0 );\n #include \n #include \n #include \n #include \n #include \n outgoingLight = diffuseColor.rgb;\n #include \n #include \n #include \n #include \n #include \n}"; -const vertex$2 = "#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n}"; -const fragment$2 = "uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n gl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n #include \n #include \n #include \n}"; -const vertex$1 = "uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n vec4 mvPosition = modelViewMatrix[ 3 ];\n vec2 scale = vec2( length( modelMatrix[ 0 ].xyz ), length( modelMatrix[ 1 ].xyz ) );\n #ifndef USE_SIZEATTENUATION\n bool isPerspective = isPerspectiveMatrix( projectionMatrix );\n if ( isPerspective ) scale *= - mvPosition.z;\n #endif\n vec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n vec2 rotatedPosition;\n rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n mvPosition.xy += rotatedPosition;\n gl_Position = projectionMatrix * mvPosition;\n #include \n #include \n #include \n}"; -const fragment$1 = "uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n vec4 diffuseColor = vec4( diffuse, opacity );\n #include \n vec3 outgoingLight = vec3( 0.0 );\n #include \n #include \n #include \n #include \n #include \n outgoingLight = diffuseColor.rgb;\n #include \n #include \n #include \n #include \n}"; -const ShaderChunk = { - 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_physical_pars_fragment, - envmap_vertex, - fog_vertex, - fog_pars_vertex, - fog_fragment, - fog_pars_fragment, - gradientmap_pars_fragment, - lightmap_pars_fragment, - lights_lambert_fragment, - lights_lambert_pars_fragment, - lights_pars_begin, - 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, - background_vert: vertex$h, - background_frag: fragment$h, - backgroundCube_vert: vertex$g, - backgroundCube_frag: fragment$g, - cube_vert: vertex$f, - cube_frag: fragment$f, - depth_vert: vertex$e, - depth_frag: fragment$e, - distanceRGBA_vert: vertex$d, - distanceRGBA_frag: fragment$d, - equirect_vert: vertex$c, - equirect_frag: fragment$c, - linedashed_vert: vertex$b, - linedashed_frag: fragment$b, - meshbasic_vert: vertex$a, - meshbasic_frag: fragment$a, - meshlambert_vert: vertex$9, - meshlambert_frag: fragment$9, - meshmatcap_vert: vertex$8, - meshmatcap_frag: fragment$8, - meshnormal_vert: vertex$7, - meshnormal_frag: fragment$7, - meshphong_vert: vertex$6, - meshphong_frag: fragment$6, - meshphysical_vert: vertex$5, - meshphysical_frag: fragment$5, - meshtoon_vert: vertex$4, - meshtoon_frag: fragment$4, - points_vert: vertex$3, - points_frag: fragment$3, - shadow_vert: vertex$2, - shadow_frag: fragment$2, - sprite_vert: vertex$1, - sprite_frag: fragment$1 -}; -const UniformsLib = { - common: { - diffuse: { value: /* @__PURE__ */ new Color(16777215) }, - opacity: { value: 1 }, - map: { value: null }, - mapTransform: { value: /* @__PURE__ */ new Matrix3() }, - alphaMap: { value: null }, - alphaMapTransform: { value: /* @__PURE__ */ new Matrix3() }, - alphaTest: { value: 0 } - }, - specularmap: { - specularMap: { value: null }, - specularMapTransform: { value: /* @__PURE__ */ new Matrix3() } - }, - envmap: { - envMap: { value: null }, - envMapRotation: { value: /* @__PURE__ */ new Matrix3() }, - flipEnvMap: { value: -1 }, - reflectivity: { value: 1 }, - // basic, lambert, phong - ior: { value: 1.5 }, - // physical - refractionRatio: { value: 0.98 } - // basic, lambert, phong - }, - aomap: { - aoMap: { value: null }, - aoMapIntensity: { value: 1 }, - aoMapTransform: { value: /* @__PURE__ */ new Matrix3() } - }, - lightmap: { - lightMap: { value: null }, - lightMapIntensity: { value: 1 }, - lightMapTransform: { value: /* @__PURE__ */ new Matrix3() } - }, - bumpmap: { - bumpMap: { value: null }, - bumpMapTransform: { value: /* @__PURE__ */ new Matrix3() }, - bumpScale: { value: 1 } - }, - normalmap: { - normalMap: { value: null }, - normalMapTransform: { value: /* @__PURE__ */ new Matrix3() }, - normalScale: { value: /* @__PURE__ */ new Vector2(1, 1) } - }, - displacementmap: { - displacementMap: { value: null }, - displacementMapTransform: { value: /* @__PURE__ */ new Matrix3() }, - displacementScale: { value: 1 }, - displacementBias: { value: 0 } - }, - emissivemap: { - emissiveMap: { value: null }, - emissiveMapTransform: { value: /* @__PURE__ */ new Matrix3() } - }, - metalnessmap: { - metalnessMap: { value: null }, - metalnessMapTransform: { value: /* @__PURE__ */ new Matrix3() } - }, - roughnessmap: { - roughnessMap: { value: null }, - roughnessMapTransform: { value: /* @__PURE__ */ new Matrix3() } - }, - gradientmap: { - gradientMap: { value: null } - }, - fog: { - fogDensity: { value: 25e-5 }, - fogNear: { value: 1 }, - fogFar: { value: 2e3 }, - fogColor: { value: /* @__PURE__ */ new Color(16777215) } - }, - lights: { - ambientLightColor: { value: [] }, - lightProbe: { value: [] }, - directionalLights: { value: [], properties: { - direction: {}, - color: {} - } }, - directionalLightShadows: { value: [], properties: { - shadowIntensity: 1, - shadowBias: {}, - shadowNormalBias: {}, - shadowRadius: {}, - shadowMapSize: {} - } }, - directionalShadowMap: { value: [] }, - directionalShadowMatrix: { value: [] }, - spotLights: { value: [], properties: { - color: {}, - position: {}, - direction: {}, - distance: {}, - coneCos: {}, - penumbraCos: {}, - decay: {} - } }, - spotLightShadows: { value: [], properties: { - shadowIntensity: 1, - shadowBias: {}, - shadowNormalBias: {}, - shadowRadius: {}, - shadowMapSize: {} - } }, - spotLightMap: { value: [] }, - spotShadowMap: { value: [] }, - spotLightMatrix: { value: [] }, - pointLights: { value: [], properties: { - color: {}, - position: {}, - decay: {}, - distance: {} - } }, - pointLightShadows: { value: [], properties: { - shadowIntensity: 1, - shadowBias: {}, - shadowNormalBias: {}, - shadowRadius: {}, - shadowMapSize: {}, - shadowCameraNear: {}, - shadowCameraFar: {} - } }, - pointShadowMap: { value: [] }, - pointShadowMatrix: { value: [] }, - hemisphereLights: { value: [], properties: { - direction: {}, - skyColor: {}, - groundColor: {} - } }, - // TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src - rectAreaLights: { value: [], properties: { - color: {}, - position: {}, - width: {}, - height: {} - } }, - ltc_1: { value: null }, - ltc_2: { value: null } - }, - points: { - diffuse: { value: /* @__PURE__ */ new Color(16777215) }, - opacity: { value: 1 }, - size: { value: 1 }, - scale: { value: 1 }, - map: { value: null }, - alphaMap: { value: null }, - alphaMapTransform: { value: /* @__PURE__ */ new Matrix3() }, - alphaTest: { value: 0 }, - uvTransform: { value: /* @__PURE__ */ new Matrix3() } - }, - sprite: { - diffuse: { value: /* @__PURE__ */ new Color(16777215) }, - opacity: { value: 1 }, - center: { value: /* @__PURE__ */ new Vector2(0.5, 0.5) }, - rotation: { value: 0 }, - map: { value: null }, - mapTransform: { value: /* @__PURE__ */ new Matrix3() }, - alphaMap: { value: null }, - alphaMapTransform: { value: /* @__PURE__ */ new Matrix3() }, - alphaTest: { value: 0 } - } -}; -const ShaderLib = { - basic: { - uniforms: /* @__PURE__ */ mergeUniforms([ - UniformsLib.common, - UniformsLib.specularmap, - UniformsLib.envmap, - UniformsLib.aomap, - UniformsLib.lightmap, - UniformsLib.fog - ]), - vertexShader: ShaderChunk.meshbasic_vert, - fragmentShader: ShaderChunk.meshbasic_frag - }, - lambert: { - uniforms: /* @__PURE__ */ mergeUniforms([ - UniformsLib.common, - UniformsLib.specularmap, - UniformsLib.envmap, - UniformsLib.aomap, - UniformsLib.lightmap, - UniformsLib.emissivemap, - UniformsLib.bumpmap, - UniformsLib.normalmap, - UniformsLib.displacementmap, - UniformsLib.fog, - UniformsLib.lights, - { - emissive: { value: /* @__PURE__ */ new Color(0) } - } - ]), - vertexShader: ShaderChunk.meshlambert_vert, - fragmentShader: ShaderChunk.meshlambert_frag - }, - phong: { - uniforms: /* @__PURE__ */ mergeUniforms([ - UniformsLib.common, - UniformsLib.specularmap, - UniformsLib.envmap, - UniformsLib.aomap, - UniformsLib.lightmap, - UniformsLib.emissivemap, - UniformsLib.bumpmap, - UniformsLib.normalmap, - UniformsLib.displacementmap, - UniformsLib.fog, - UniformsLib.lights, - { - emissive: { value: /* @__PURE__ */ new Color(0) }, - specular: { value: /* @__PURE__ */ new Color(1118481) }, - shininess: { value: 30 } - } - ]), - vertexShader: ShaderChunk.meshphong_vert, - fragmentShader: ShaderChunk.meshphong_frag - }, - standard: { - uniforms: /* @__PURE__ */ mergeUniforms([ - UniformsLib.common, - UniformsLib.envmap, - UniformsLib.aomap, - UniformsLib.lightmap, - UniformsLib.emissivemap, - UniformsLib.bumpmap, - UniformsLib.normalmap, - UniformsLib.displacementmap, - UniformsLib.roughnessmap, - UniformsLib.metalnessmap, - UniformsLib.fog, - UniformsLib.lights, - { - emissive: { value: /* @__PURE__ */ new Color(0) }, - roughness: { value: 1 }, - metalness: { value: 0 }, - envMapIntensity: { value: 1 } - } - ]), - vertexShader: ShaderChunk.meshphysical_vert, - fragmentShader: ShaderChunk.meshphysical_frag - }, - toon: { - uniforms: /* @__PURE__ */ mergeUniforms([ - UniformsLib.common, - UniformsLib.aomap, - UniformsLib.lightmap, - UniformsLib.emissivemap, - UniformsLib.bumpmap, - UniformsLib.normalmap, - UniformsLib.displacementmap, - UniformsLib.gradientmap, - UniformsLib.fog, - UniformsLib.lights, - { - emissive: { value: /* @__PURE__ */ new Color(0) } - } - ]), - vertexShader: ShaderChunk.meshtoon_vert, - fragmentShader: ShaderChunk.meshtoon_frag - }, - matcap: { - uniforms: /* @__PURE__ */ mergeUniforms([ - UniformsLib.common, - UniformsLib.bumpmap, - UniformsLib.normalmap, - UniformsLib.displacementmap, - UniformsLib.fog, - { - matcap: { value: null } - } - ]), - vertexShader: ShaderChunk.meshmatcap_vert, - fragmentShader: ShaderChunk.meshmatcap_frag - }, - points: { - uniforms: /* @__PURE__ */ mergeUniforms([ - UniformsLib.points, - UniformsLib.fog - ]), - vertexShader: ShaderChunk.points_vert, - fragmentShader: ShaderChunk.points_frag - }, - dashed: { - uniforms: /* @__PURE__ */ mergeUniforms([ - UniformsLib.common, - UniformsLib.fog, - { - scale: { value: 1 }, - dashSize: { value: 1 }, - totalSize: { value: 2 } - } - ]), - vertexShader: ShaderChunk.linedashed_vert, - fragmentShader: ShaderChunk.linedashed_frag - }, - depth: { - uniforms: /* @__PURE__ */ mergeUniforms([ - UniformsLib.common, - UniformsLib.displacementmap - ]), - vertexShader: ShaderChunk.depth_vert, - fragmentShader: ShaderChunk.depth_frag - }, - normal: { - uniforms: /* @__PURE__ */ mergeUniforms([ - UniformsLib.common, - UniformsLib.bumpmap, - UniformsLib.normalmap, - UniformsLib.displacementmap, - { - opacity: { value: 1 } - } - ]), - vertexShader: ShaderChunk.meshnormal_vert, - fragmentShader: ShaderChunk.meshnormal_frag - }, - sprite: { - uniforms: /* @__PURE__ */ mergeUniforms([ - UniformsLib.sprite, - UniformsLib.fog - ]), - vertexShader: ShaderChunk.sprite_vert, - fragmentShader: ShaderChunk.sprite_frag - }, - background: { - uniforms: { - uvTransform: { value: /* @__PURE__ */ new Matrix3() }, - t2D: { value: null }, - backgroundIntensity: { value: 1 } - }, - vertexShader: ShaderChunk.background_vert, - fragmentShader: ShaderChunk.background_frag - }, - backgroundCube: { - uniforms: { - envMap: { value: null }, - flipEnvMap: { value: -1 }, - backgroundBlurriness: { value: 0 }, - backgroundIntensity: { value: 1 }, - backgroundRotation: { value: /* @__PURE__ */ new Matrix3() } - }, - vertexShader: ShaderChunk.backgroundCube_vert, - fragmentShader: ShaderChunk.backgroundCube_frag - }, - cube: { - uniforms: { - tCube: { value: null }, - tFlip: { value: -1 }, - opacity: { value: 1 } - }, - vertexShader: ShaderChunk.cube_vert, - fragmentShader: ShaderChunk.cube_frag - }, - equirect: { - uniforms: { - tEquirect: { value: null } - }, - vertexShader: ShaderChunk.equirect_vert, - fragmentShader: ShaderChunk.equirect_frag - }, - distanceRGBA: { - uniforms: /* @__PURE__ */ mergeUniforms([ - UniformsLib.common, - UniformsLib.displacementmap, - { - referencePosition: { value: /* @__PURE__ */ new Vector3() }, - nearDistance: { value: 1 }, - farDistance: { value: 1e3 } - } - ]), - vertexShader: ShaderChunk.distanceRGBA_vert, - fragmentShader: ShaderChunk.distanceRGBA_frag - }, - shadow: { - uniforms: /* @__PURE__ */ mergeUniforms([ - UniformsLib.lights, - UniformsLib.fog, - { - color: { value: /* @__PURE__ */ new Color(0) }, - opacity: { value: 1 } - } - ]), - vertexShader: ShaderChunk.shadow_vert, - fragmentShader: ShaderChunk.shadow_frag - } -}; -ShaderLib.physical = { - uniforms: /* @__PURE__ */ mergeUniforms([ - ShaderLib.standard.uniforms, - { - clearcoat: { value: 0 }, - clearcoatMap: { value: null }, - clearcoatMapTransform: { value: /* @__PURE__ */ new Matrix3() }, - clearcoatNormalMap: { value: null }, - clearcoatNormalMapTransform: { value: /* @__PURE__ */ new Matrix3() }, - clearcoatNormalScale: { value: /* @__PURE__ */ new Vector2(1, 1) }, - clearcoatRoughness: { value: 0 }, - clearcoatRoughnessMap: { value: null }, - clearcoatRoughnessMapTransform: { value: /* @__PURE__ */ new Matrix3() }, - dispersion: { value: 0 }, - iridescence: { value: 0 }, - iridescenceMap: { value: null }, - iridescenceMapTransform: { value: /* @__PURE__ */ new Matrix3() }, - iridescenceIOR: { value: 1.3 }, - iridescenceThicknessMinimum: { value: 100 }, - iridescenceThicknessMaximum: { value: 400 }, - iridescenceThicknessMap: { value: null }, - iridescenceThicknessMapTransform: { value: /* @__PURE__ */ new Matrix3() }, - sheen: { value: 0 }, - sheenColor: { value: /* @__PURE__ */ new Color(0) }, - sheenColorMap: { value: null }, - sheenColorMapTransform: { value: /* @__PURE__ */ new Matrix3() }, - sheenRoughness: { value: 1 }, - sheenRoughnessMap: { value: null }, - sheenRoughnessMapTransform: { value: /* @__PURE__ */ new Matrix3() }, - transmission: { value: 0 }, - transmissionMap: { value: null }, - transmissionMapTransform: { value: /* @__PURE__ */ new Matrix3() }, - transmissionSamplerSize: { value: /* @__PURE__ */ new Vector2() }, - transmissionSamplerMap: { value: null }, - thickness: { value: 0 }, - thicknessMap: { value: null }, - thicknessMapTransform: { value: /* @__PURE__ */ new Matrix3() }, - attenuationDistance: { value: 0 }, - attenuationColor: { value: /* @__PURE__ */ new Color(0) }, - specularColor: { value: /* @__PURE__ */ new Color(1, 1, 1) }, - specularColorMap: { value: null }, - specularColorMapTransform: { value: /* @__PURE__ */ new Matrix3() }, - specularIntensity: { value: 1 }, - specularIntensityMap: { value: null }, - specularIntensityMapTransform: { value: /* @__PURE__ */ new Matrix3() }, - anisotropyVector: { value: /* @__PURE__ */ new Vector2() }, - anisotropyMap: { value: null }, - anisotropyMapTransform: { value: /* @__PURE__ */ new Matrix3() } - } - ]), - vertexShader: ShaderChunk.meshphysical_vert, - fragmentShader: ShaderChunk.meshphysical_frag -}; -const _rgb = { r: 0, b: 0, g: 0 }; -const _e1$1 = /* @__PURE__ */ new Euler(); -const _m1$1 = /* @__PURE__ */ new Matrix4(); -function WebGLBackground(renderer, cubemaps, cubeuvmaps, state, objects, alpha, premultipliedAlpha) { - const clearColor = new Color(0); - let clearAlpha = alpha === true ? 0 : 1; - let planeMesh; - let boxMesh; - let currentBackground = null; - let currentBackgroundVersion = 0; - let currentTonemapping = null; - function getBackground(scene) { - let background = scene.isScene === true ? scene.background : null; - if (background && background.isTexture) { - const usePMREM = scene.backgroundBlurriness > 0; - background = (usePMREM ? cubeuvmaps : cubemaps).get(background); - } - return background; - } - __name(getBackground, "getBackground"); - function render(scene) { - let forceClear = false; - const background = getBackground(scene); - if (background === null) { - setClear(clearColor, clearAlpha); - } else if (background && background.isColor) { - setClear(background, 1); - forceClear = true; - } - const environmentBlendMode = renderer.xr.getEnvironmentBlendMode(); - if (environmentBlendMode === "additive") { - state.buffers.color.setClear(0, 0, 0, 1, premultipliedAlpha); - } else if (environmentBlendMode === "alpha-blend") { - state.buffers.color.setClear(0, 0, 0, 0, premultipliedAlpha); - } - if (renderer.autoClear || forceClear) { - state.buffers.depth.setTest(true); - state.buffers.depth.setMask(true); - state.buffers.color.setMask(true); - renderer.clear(renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil); - } - } - __name(render, "render"); - function addToRenderList(renderList, scene) { - const background = getBackground(scene); - if (background && (background.isCubeTexture || background.mapping === CubeUVReflectionMapping)) { - if (boxMesh === void 0) { - boxMesh = new Mesh( - new BoxGeometry(1, 1, 1), - new ShaderMaterial({ - name: "BackgroundCubeMaterial", - uniforms: cloneUniforms(ShaderLib.backgroundCube.uniforms), - vertexShader: ShaderLib.backgroundCube.vertexShader, - fragmentShader: ShaderLib.backgroundCube.fragmentShader, - side: BackSide, - depthTest: false, - depthWrite: false, - fog: false - }) - ); - boxMesh.geometry.deleteAttribute("normal"); - boxMesh.geometry.deleteAttribute("uv"); - boxMesh.onBeforeRender = function(renderer2, scene2, camera) { - this.matrixWorld.copyPosition(camera.matrixWorld); - }; - Object.defineProperty(boxMesh.material, "envMap", { - get: /* @__PURE__ */ __name(function() { - return this.uniforms.envMap.value; - }, "get") - }); - objects.update(boxMesh); - } - _e1$1.copy(scene.backgroundRotation); - _e1$1.x *= -1; - _e1$1.y *= -1; - _e1$1.z *= -1; - if (background.isCubeTexture && background.isRenderTargetTexture === false) { - _e1$1.y *= -1; - _e1$1.z *= -1; - } - boxMesh.material.uniforms.envMap.value = background; - boxMesh.material.uniforms.flipEnvMap.value = background.isCubeTexture && background.isRenderTargetTexture === false ? -1 : 1; - boxMesh.material.uniforms.backgroundBlurriness.value = scene.backgroundBlurriness; - boxMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity; - boxMesh.material.uniforms.backgroundRotation.value.setFromMatrix4(_m1$1.makeRotationFromEuler(_e1$1)); - boxMesh.material.toneMapped = ColorManagement.getTransfer(background.colorSpace) !== SRGBTransfer; - if (currentBackground !== background || currentBackgroundVersion !== background.version || currentTonemapping !== renderer.toneMapping) { - boxMesh.material.needsUpdate = true; - currentBackground = background; - currentBackgroundVersion = background.version; - currentTonemapping = renderer.toneMapping; - } - boxMesh.layers.enableAll(); - renderList.unshift(boxMesh, boxMesh.geometry, boxMesh.material, 0, 0, null); - } else if (background && background.isTexture) { - if (planeMesh === void 0) { - planeMesh = new Mesh( - new PlaneGeometry(2, 2), - new ShaderMaterial({ - name: "BackgroundMaterial", - uniforms: cloneUniforms(ShaderLib.background.uniforms), - vertexShader: ShaderLib.background.vertexShader, - fragmentShader: ShaderLib.background.fragmentShader, - side: FrontSide, - depthTest: false, - depthWrite: false, - fog: false - }) - ); - planeMesh.geometry.deleteAttribute("normal"); - Object.defineProperty(planeMesh.material, "map", { - get: /* @__PURE__ */ __name(function() { - return this.uniforms.t2D.value; - }, "get") - }); - objects.update(planeMesh); - } - planeMesh.material.uniforms.t2D.value = background; - planeMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity; - planeMesh.material.toneMapped = ColorManagement.getTransfer(background.colorSpace) !== SRGBTransfer; - if (background.matrixAutoUpdate === true) { - background.updateMatrix(); - } - planeMesh.material.uniforms.uvTransform.value.copy(background.matrix); - if (currentBackground !== background || currentBackgroundVersion !== background.version || currentTonemapping !== renderer.toneMapping) { - planeMesh.material.needsUpdate = true; - currentBackground = background; - currentBackgroundVersion = background.version; - currentTonemapping = renderer.toneMapping; - } - planeMesh.layers.enableAll(); - renderList.unshift(planeMesh, planeMesh.geometry, planeMesh.material, 0, 0, null); - } - } - __name(addToRenderList, "addToRenderList"); - function setClear(color, alpha2) { - color.getRGB(_rgb, getUnlitUniformColorSpace(renderer)); - state.buffers.color.setClear(_rgb.r, _rgb.g, _rgb.b, alpha2, premultipliedAlpha); - } - __name(setClear, "setClear"); - return { - getClearColor: /* @__PURE__ */ __name(function() { - return clearColor; - }, "getClearColor"), - setClearColor: /* @__PURE__ */ __name(function(color, alpha2 = 1) { - clearColor.set(color); - clearAlpha = alpha2; - setClear(clearColor, clearAlpha); - }, "setClearColor"), - getClearAlpha: /* @__PURE__ */ __name(function() { - return clearAlpha; - }, "getClearAlpha"), - setClearAlpha: /* @__PURE__ */ __name(function(alpha2) { - clearAlpha = alpha2; - setClear(clearColor, clearAlpha); - }, "setClearAlpha"), - render, - addToRenderList - }; -} -__name(WebGLBackground, "WebGLBackground"); -function WebGLBindingStates(gl, attributes) { - const maxVertexAttributes = gl.getParameter(gl.MAX_VERTEX_ATTRIBS); - const bindingStates = {}; - const defaultState = createBindingState(null); - let currentState = defaultState; - let forceUpdate = false; - function setup(object, material, program, geometry, index) { - let updateBuffers = false; - const state = getBindingState(geometry, program, material); - if (currentState !== state) { - currentState = state; - bindVertexArrayObject(currentState.object); - } - updateBuffers = needsUpdate(object, geometry, program, index); - if (updateBuffers) saveCache(object, geometry, program, index); - if (index !== null) { - attributes.update(index, gl.ELEMENT_ARRAY_BUFFER); - } - if (updateBuffers || forceUpdate) { - forceUpdate = false; - setupVertexAttributes(object, material, program, geometry); - if (index !== null) { - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, attributes.get(index).buffer); - } - } - } - __name(setup, "setup"); - function createVertexArrayObject() { - return gl.createVertexArray(); - } - __name(createVertexArrayObject, "createVertexArrayObject"); - function bindVertexArrayObject(vao) { - return gl.bindVertexArray(vao); - } - __name(bindVertexArrayObject, "bindVertexArrayObject"); - function deleteVertexArrayObject(vao) { - return gl.deleteVertexArray(vao); - } - __name(deleteVertexArrayObject, "deleteVertexArrayObject"); - function getBindingState(geometry, program, material) { - const wireframe = material.wireframe === true; - let programMap = bindingStates[geometry.id]; - if (programMap === void 0) { - programMap = {}; - bindingStates[geometry.id] = programMap; - } - let stateMap = programMap[program.id]; - if (stateMap === void 0) { - stateMap = {}; - programMap[program.id] = stateMap; - } - let state = stateMap[wireframe]; - if (state === void 0) { - state = createBindingState(createVertexArrayObject()); - stateMap[wireframe] = state; - } - return state; - } - __name(getBindingState, "getBindingState"); - function createBindingState(vao) { - const newAttributes = []; - const enabledAttributes = []; - const attributeDivisors = []; - for (let i = 0; i < maxVertexAttributes; i++) { - newAttributes[i] = 0; - enabledAttributes[i] = 0; - attributeDivisors[i] = 0; - } - return { - // for backward compatibility on non-VAO support browser - geometry: null, - program: null, - wireframe: false, - newAttributes, - enabledAttributes, - attributeDivisors, - object: vao, - attributes: {}, - index: null - }; - } - __name(createBindingState, "createBindingState"); - function needsUpdate(object, geometry, program, index) { - const cachedAttributes = currentState.attributes; - const geometryAttributes = geometry.attributes; - let attributesNum = 0; - const programAttributes = program.getAttributes(); - for (const name in programAttributes) { - const programAttribute = programAttributes[name]; - if (programAttribute.location >= 0) { - const cachedAttribute = cachedAttributes[name]; - let geometryAttribute = geometryAttributes[name]; - if (geometryAttribute === void 0) { - if (name === "instanceMatrix" && object.instanceMatrix) geometryAttribute = object.instanceMatrix; - if (name === "instanceColor" && object.instanceColor) geometryAttribute = object.instanceColor; - } - if (cachedAttribute === void 0) return true; - if (cachedAttribute.attribute !== geometryAttribute) return true; - if (geometryAttribute && cachedAttribute.data !== geometryAttribute.data) return true; - attributesNum++; - } - } - if (currentState.attributesNum !== attributesNum) return true; - if (currentState.index !== index) return true; - return false; - } - __name(needsUpdate, "needsUpdate"); - function saveCache(object, geometry, program, index) { - const cache = {}; - const attributes2 = geometry.attributes; - let attributesNum = 0; - const programAttributes = program.getAttributes(); - for (const name in programAttributes) { - const programAttribute = programAttributes[name]; - if (programAttribute.location >= 0) { - let attribute = attributes2[name]; - if (attribute === void 0) { - if (name === "instanceMatrix" && object.instanceMatrix) attribute = object.instanceMatrix; - if (name === "instanceColor" && object.instanceColor) attribute = object.instanceColor; - } - const data = {}; - data.attribute = attribute; - if (attribute && attribute.data) { - data.data = attribute.data; - } - cache[name] = data; - attributesNum++; - } - } - currentState.attributes = cache; - currentState.attributesNum = attributesNum; - currentState.index = index; - } - __name(saveCache, "saveCache"); - function initAttributes() { - const newAttributes = currentState.newAttributes; - for (let i = 0, il = newAttributes.length; i < il; i++) { - newAttributes[i] = 0; - } - } - __name(initAttributes, "initAttributes"); - function enableAttribute(attribute) { - enableAttributeAndDivisor(attribute, 0); - } - __name(enableAttribute, "enableAttribute"); - function enableAttributeAndDivisor(attribute, meshPerAttribute) { - const newAttributes = currentState.newAttributes; - const enabledAttributes = currentState.enabledAttributes; - const attributeDivisors = currentState.attributeDivisors; - newAttributes[attribute] = 1; - if (enabledAttributes[attribute] === 0) { - gl.enableVertexAttribArray(attribute); - enabledAttributes[attribute] = 1; - } - if (attributeDivisors[attribute] !== meshPerAttribute) { - gl.vertexAttribDivisor(attribute, meshPerAttribute); - attributeDivisors[attribute] = meshPerAttribute; - } - } - __name(enableAttributeAndDivisor, "enableAttributeAndDivisor"); - function disableUnusedAttributes() { - const newAttributes = currentState.newAttributes; - const enabledAttributes = currentState.enabledAttributes; - for (let i = 0, il = enabledAttributes.length; i < il; i++) { - if (enabledAttributes[i] !== newAttributes[i]) { - gl.disableVertexAttribArray(i); - enabledAttributes[i] = 0; - } - } - } - __name(disableUnusedAttributes, "disableUnusedAttributes"); - function vertexAttribPointer(index, size, type, normalized, stride, offset, integer) { - if (integer === true) { - gl.vertexAttribIPointer(index, size, type, stride, offset); - } else { - gl.vertexAttribPointer(index, size, type, normalized, stride, offset); - } - } - __name(vertexAttribPointer, "vertexAttribPointer"); - function setupVertexAttributes(object, material, program, geometry) { - initAttributes(); - const geometryAttributes = geometry.attributes; - const programAttributes = program.getAttributes(); - const materialDefaultAttributeValues = material.defaultAttributeValues; - for (const name in programAttributes) { - const programAttribute = programAttributes[name]; - if (programAttribute.location >= 0) { - let geometryAttribute = geometryAttributes[name]; - if (geometryAttribute === void 0) { - if (name === "instanceMatrix" && object.instanceMatrix) geometryAttribute = object.instanceMatrix; - if (name === "instanceColor" && object.instanceColor) geometryAttribute = object.instanceColor; - } - if (geometryAttribute !== void 0) { - const normalized = geometryAttribute.normalized; - const size = geometryAttribute.itemSize; - const attribute = attributes.get(geometryAttribute); - if (attribute === void 0) continue; - const buffer = attribute.buffer; - const type = attribute.type; - const bytesPerElement = attribute.bytesPerElement; - const integer = type === gl.INT || type === gl.UNSIGNED_INT || geometryAttribute.gpuType === IntType; - if (geometryAttribute.isInterleavedBufferAttribute) { - const data = geometryAttribute.data; - const stride = data.stride; - const offset = geometryAttribute.offset; - if (data.isInstancedInterleavedBuffer) { - for (let i = 0; i < programAttribute.locationSize; i++) { - enableAttributeAndDivisor(programAttribute.location + i, data.meshPerAttribute); - } - if (object.isInstancedMesh !== true && geometry._maxInstanceCount === void 0) { - geometry._maxInstanceCount = data.meshPerAttribute * data.count; - } - } else { - for (let i = 0; i < programAttribute.locationSize; i++) { - enableAttribute(programAttribute.location + i); - } - } - gl.bindBuffer(gl.ARRAY_BUFFER, buffer); - for (let i = 0; i < programAttribute.locationSize; i++) { - vertexAttribPointer( - programAttribute.location + i, - size / programAttribute.locationSize, - type, - normalized, - stride * bytesPerElement, - (offset + size / programAttribute.locationSize * i) * bytesPerElement, - integer - ); - } - } else { - if (geometryAttribute.isInstancedBufferAttribute) { - for (let i = 0; i < programAttribute.locationSize; i++) { - enableAttributeAndDivisor(programAttribute.location + i, geometryAttribute.meshPerAttribute); - } - if (object.isInstancedMesh !== true && geometry._maxInstanceCount === void 0) { - geometry._maxInstanceCount = geometryAttribute.meshPerAttribute * geometryAttribute.count; - } - } else { - for (let i = 0; i < programAttribute.locationSize; i++) { - enableAttribute(programAttribute.location + i); - } - } - gl.bindBuffer(gl.ARRAY_BUFFER, buffer); - for (let i = 0; i < programAttribute.locationSize; i++) { - vertexAttribPointer( - programAttribute.location + i, - size / programAttribute.locationSize, - type, - normalized, - size * bytesPerElement, - size / programAttribute.locationSize * i * bytesPerElement, - integer - ); - } - } - } else if (materialDefaultAttributeValues !== void 0) { - const value = materialDefaultAttributeValues[name]; - if (value !== void 0) { - switch (value.length) { - case 2: - gl.vertexAttrib2fv(programAttribute.location, value); - break; - case 3: - gl.vertexAttrib3fv(programAttribute.location, value); - break; - case 4: - gl.vertexAttrib4fv(programAttribute.location, value); - break; - default: - gl.vertexAttrib1fv(programAttribute.location, value); - } - } - } - } - } - disableUnusedAttributes(); - } - __name(setupVertexAttributes, "setupVertexAttributes"); - function dispose() { - reset(); - for (const geometryId in bindingStates) { - const programMap = bindingStates[geometryId]; - for (const programId in programMap) { - const stateMap = programMap[programId]; - for (const wireframe in stateMap) { - deleteVertexArrayObject(stateMap[wireframe].object); - delete stateMap[wireframe]; - } - delete programMap[programId]; - } - delete bindingStates[geometryId]; - } - } - __name(dispose, "dispose"); - function releaseStatesOfGeometry(geometry) { - if (bindingStates[geometry.id] === void 0) return; - const programMap = bindingStates[geometry.id]; - for (const programId in programMap) { - const stateMap = programMap[programId]; - for (const wireframe in stateMap) { - deleteVertexArrayObject(stateMap[wireframe].object); - delete stateMap[wireframe]; - } - delete programMap[programId]; - } - delete bindingStates[geometry.id]; - } - __name(releaseStatesOfGeometry, "releaseStatesOfGeometry"); - function releaseStatesOfProgram(program) { - for (const geometryId in bindingStates) { - const programMap = bindingStates[geometryId]; - if (programMap[program.id] === void 0) continue; - const stateMap = programMap[program.id]; - for (const wireframe in stateMap) { - deleteVertexArrayObject(stateMap[wireframe].object); - delete stateMap[wireframe]; - } - delete programMap[program.id]; - } - } - __name(releaseStatesOfProgram, "releaseStatesOfProgram"); - function reset() { - resetDefaultState(); - forceUpdate = true; - if (currentState === defaultState) return; - currentState = defaultState; - bindVertexArrayObject(currentState.object); - } - __name(reset, "reset"); - function resetDefaultState() { - defaultState.geometry = null; - defaultState.program = null; - defaultState.wireframe = false; - } - __name(resetDefaultState, "resetDefaultState"); - return { - setup, - reset, - resetDefaultState, - dispose, - releaseStatesOfGeometry, - releaseStatesOfProgram, - initAttributes, - enableAttribute, - disableUnusedAttributes - }; -} -__name(WebGLBindingStates, "WebGLBindingStates"); -function WebGLBufferRenderer(gl, extensions, info) { - let mode; - function setMode(value) { - mode = value; - } - __name(setMode, "setMode"); - function render(start, count) { - gl.drawArrays(mode, start, count); - info.update(count, mode, 1); - } - __name(render, "render"); - function renderInstances(start, count, primcount) { - if (primcount === 0) return; - gl.drawArraysInstanced(mode, start, count, primcount); - info.update(count, mode, primcount); - } - __name(renderInstances, "renderInstances"); - function renderMultiDraw(starts, counts, drawCount) { - if (drawCount === 0) return; - const extension = extensions.get("WEBGL_multi_draw"); - extension.multiDrawArraysWEBGL(mode, starts, 0, counts, 0, drawCount); - let elementCount = 0; - for (let i = 0; i < drawCount; i++) { - elementCount += counts[i]; - } - info.update(elementCount, mode, 1); - } - __name(renderMultiDraw, "renderMultiDraw"); - function renderMultiDrawInstances(starts, counts, drawCount, primcount) { - if (drawCount === 0) return; - const extension = extensions.get("WEBGL_multi_draw"); - if (extension === null) { - for (let i = 0; i < starts.length; i++) { - renderInstances(starts[i], counts[i], primcount[i]); - } - } else { - extension.multiDrawArraysInstancedWEBGL(mode, starts, 0, counts, 0, primcount, 0, drawCount); - let elementCount = 0; - for (let i = 0; i < drawCount; i++) { - elementCount += counts[i] * primcount[i]; - } - info.update(elementCount, mode, 1); - } - } - __name(renderMultiDrawInstances, "renderMultiDrawInstances"); - this.setMode = setMode; - this.render = render; - this.renderInstances = renderInstances; - this.renderMultiDraw = renderMultiDraw; - this.renderMultiDrawInstances = renderMultiDrawInstances; -} -__name(WebGLBufferRenderer, "WebGLBufferRenderer"); -function WebGLCapabilities(gl, extensions, parameters, utils) { - let maxAnisotropy; - function getMaxAnisotropy() { - if (maxAnisotropy !== void 0) return maxAnisotropy; - if (extensions.has("EXT_texture_filter_anisotropic") === true) { - const extension = extensions.get("EXT_texture_filter_anisotropic"); - maxAnisotropy = gl.getParameter(extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT); - } else { - maxAnisotropy = 0; - } - return maxAnisotropy; - } - __name(getMaxAnisotropy, "getMaxAnisotropy"); - function textureFormatReadable(textureFormat) { - if (textureFormat !== RGBAFormat && utils.convert(textureFormat) !== gl.getParameter(gl.IMPLEMENTATION_COLOR_READ_FORMAT)) { - return false; - } - return true; - } - __name(textureFormatReadable, "textureFormatReadable"); - function textureTypeReadable(textureType) { - const halfFloatSupportedByExt = textureType === HalfFloatType && (extensions.has("EXT_color_buffer_half_float") || extensions.has("EXT_color_buffer_float")); - if (textureType !== UnsignedByteType && utils.convert(textureType) !== gl.getParameter(gl.IMPLEMENTATION_COLOR_READ_TYPE) && // Edge and Chrome Mac < 52 (#9513) - textureType !== FloatType && !halfFloatSupportedByExt) { - return false; - } - return true; - } - __name(textureTypeReadable, "textureTypeReadable"); - function getMaxPrecision(precision2) { - if (precision2 === "highp") { - if (gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_FLOAT).precision > 0 && gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT).precision > 0) { - return "highp"; - } - precision2 = "mediump"; - } - if (precision2 === "mediump") { - if (gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_FLOAT).precision > 0 && gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT).precision > 0) { - return "mediump"; - } - } - return "lowp"; - } - __name(getMaxPrecision, "getMaxPrecision"); - let precision = parameters.precision !== void 0 ? parameters.precision : "highp"; - const maxPrecision = getMaxPrecision(precision); - if (maxPrecision !== precision) { - console.warn("THREE.WebGLRenderer:", precision, "not supported, using", maxPrecision, "instead."); - precision = maxPrecision; - } - const logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true; - const reverseDepthBuffer = parameters.reverseDepthBuffer === true && extensions.has("EXT_clip_control"); - const maxTextures = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS); - const maxVertexTextures = gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS); - const maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE); - const maxCubemapSize = gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE); - const maxAttributes = gl.getParameter(gl.MAX_VERTEX_ATTRIBS); - const maxVertexUniforms = gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS); - const maxVaryings = gl.getParameter(gl.MAX_VARYING_VECTORS); - const maxFragmentUniforms = gl.getParameter(gl.MAX_FRAGMENT_UNIFORM_VECTORS); - const vertexTextures = maxVertexTextures > 0; - const maxSamples = gl.getParameter(gl.MAX_SAMPLES); - return { - isWebGL2: true, - // keeping this for backwards compatibility - getMaxAnisotropy, - getMaxPrecision, - textureFormatReadable, - textureTypeReadable, - precision, - logarithmicDepthBuffer, - reverseDepthBuffer, - maxTextures, - maxVertexTextures, - maxTextureSize, - maxCubemapSize, - maxAttributes, - maxVertexUniforms, - maxVaryings, - maxFragmentUniforms, - vertexTextures, - maxSamples - }; -} -__name(WebGLCapabilities, "WebGLCapabilities"); -function WebGLClipping(properties) { - const scope = this; - let globalState = null, numGlobalPlanes = 0, localClippingEnabled = false, renderingShadows = false; - const plane = new Plane(), viewNormalMatrix = new Matrix3(), uniform = { value: null, needsUpdate: false }; - this.uniform = uniform; - this.numPlanes = 0; - this.numIntersection = 0; - this.init = function(planes, enableLocalClipping) { - const enabled = planes.length !== 0 || enableLocalClipping || // enable state of previous frame - the clipping code has to - // run another frame in order to reset the state: - numGlobalPlanes !== 0 || localClippingEnabled; - localClippingEnabled = enableLocalClipping; - numGlobalPlanes = planes.length; - return enabled; - }; - this.beginShadows = function() { - renderingShadows = true; - projectPlanes(null); - }; - this.endShadows = function() { - renderingShadows = false; - }; - this.setGlobalState = function(planes, camera) { - globalState = projectPlanes(planes, camera, 0); - }; - this.setState = function(material, camera, useCache) { - const planes = material.clippingPlanes, clipIntersection = material.clipIntersection, clipShadows = material.clipShadows; - const materialProperties = properties.get(material); - if (!localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && !clipShadows) { - if (renderingShadows) { - projectPlanes(null); - } else { - resetGlobalState(); - } - } else { - const nGlobal = renderingShadows ? 0 : numGlobalPlanes, lGlobal = nGlobal * 4; - let dstArray = materialProperties.clippingState || null; - uniform.value = dstArray; - dstArray = projectPlanes(planes, camera, lGlobal, useCache); - for (let i = 0; i !== lGlobal; ++i) { - dstArray[i] = globalState[i]; - } - materialProperties.clippingState = dstArray; - this.numIntersection = clipIntersection ? this.numPlanes : 0; - this.numPlanes += nGlobal; - } - }; - function resetGlobalState() { - if (uniform.value !== globalState) { - uniform.value = globalState; - uniform.needsUpdate = numGlobalPlanes > 0; - } - scope.numPlanes = numGlobalPlanes; - scope.numIntersection = 0; - } - __name(resetGlobalState, "resetGlobalState"); - function projectPlanes(planes, camera, dstOffset, skipTransform) { - const nPlanes = planes !== null ? planes.length : 0; - let dstArray = null; - if (nPlanes !== 0) { - dstArray = uniform.value; - if (skipTransform !== true || dstArray === null) { - const flatSize = dstOffset + nPlanes * 4, viewMatrix = camera.matrixWorldInverse; - viewNormalMatrix.getNormalMatrix(viewMatrix); - if (dstArray === null || dstArray.length < flatSize) { - dstArray = new Float32Array(flatSize); - } - for (let i = 0, i4 = dstOffset; i !== nPlanes; ++i, i4 += 4) { - plane.copy(planes[i]).applyMatrix4(viewMatrix, viewNormalMatrix); - plane.normal.toArray(dstArray, i4); - dstArray[i4 + 3] = plane.constant; - } - } - uniform.value = dstArray; - uniform.needsUpdate = true; - } - scope.numPlanes = nPlanes; - scope.numIntersection = 0; - return dstArray; - } - __name(projectPlanes, "projectPlanes"); -} -__name(WebGLClipping, "WebGLClipping"); -function WebGLCubeMaps(renderer) { - let cubemaps = /* @__PURE__ */ new WeakMap(); - function mapTextureMapping(texture, mapping) { - if (mapping === EquirectangularReflectionMapping) { - texture.mapping = CubeReflectionMapping; - } else if (mapping === EquirectangularRefractionMapping) { - texture.mapping = CubeRefractionMapping; - } - return texture; - } - __name(mapTextureMapping, "mapTextureMapping"); - function get(texture) { - if (texture && texture.isTexture) { - const mapping = texture.mapping; - if (mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping) { - if (cubemaps.has(texture)) { - const cubemap = cubemaps.get(texture).texture; - return mapTextureMapping(cubemap, texture.mapping); - } else { - const image = texture.image; - if (image && image.height > 0) { - const renderTarget = new WebGLCubeRenderTarget(image.height); - renderTarget.fromEquirectangularTexture(renderer, texture); - cubemaps.set(texture, renderTarget); - texture.addEventListener("dispose", onTextureDispose); - return mapTextureMapping(renderTarget.texture, texture.mapping); - } else { - return null; - } - } - } - } - return texture; - } - __name(get, "get"); - function onTextureDispose(event) { - const texture = event.target; - texture.removeEventListener("dispose", onTextureDispose); - const cubemap = cubemaps.get(texture); - if (cubemap !== void 0) { - cubemaps.delete(texture); - cubemap.dispose(); - } - } - __name(onTextureDispose, "onTextureDispose"); - function dispose() { - cubemaps = /* @__PURE__ */ new WeakMap(); - } - __name(dispose, "dispose"); - return { - get, - dispose - }; -} -__name(WebGLCubeMaps, "WebGLCubeMaps"); -class OrthographicCamera extends Camera { - static { - __name(this, "OrthographicCamera"); - } - constructor(left = -1, right = 1, top = 1, bottom = -1, near = 0.1, far = 2e3) { - super(); - this.isOrthographicCamera = true; - this.type = "OrthographicCamera"; - this.zoom = 1; - this.view = null; - this.left = left; - this.right = right; - this.top = top; - this.bottom = bottom; - this.near = near; - this.far = far; - this.updateProjectionMatrix(); - } - copy(source, recursive) { - super.copy(source, recursive); - this.left = source.left; - this.right = source.right; - this.top = source.top; - this.bottom = source.bottom; - this.near = source.near; - this.far = source.far; - this.zoom = source.zoom; - this.view = source.view === null ? null : Object.assign({}, source.view); - return this; - } - setViewOffset(fullWidth, fullHeight, x, y, width, height) { - if (this.view === null) { - this.view = { - enabled: true, - fullWidth: 1, - fullHeight: 1, - offsetX: 0, - offsetY: 0, - width: 1, - height: 1 - }; - } - this.view.enabled = true; - this.view.fullWidth = fullWidth; - this.view.fullHeight = fullHeight; - this.view.offsetX = x; - this.view.offsetY = y; - this.view.width = width; - this.view.height = height; - this.updateProjectionMatrix(); - } - clearViewOffset() { - if (this.view !== null) { - this.view.enabled = false; - } - this.updateProjectionMatrix(); - } - updateProjectionMatrix() { - const dx = (this.right - this.left) / (2 * this.zoom); - const dy = (this.top - this.bottom) / (2 * this.zoom); - const cx = (this.right + this.left) / 2; - const cy = (this.top + this.bottom) / 2; - let left = cx - dx; - let right = cx + dx; - let top = cy + dy; - let bottom = cy - dy; - if (this.view !== null && this.view.enabled) { - const scaleW = (this.right - this.left) / this.view.fullWidth / this.zoom; - const scaleH = (this.top - this.bottom) / this.view.fullHeight / this.zoom; - left += scaleW * this.view.offsetX; - right = left + scaleW * this.view.width; - top -= scaleH * this.view.offsetY; - bottom = top - scaleH * this.view.height; - } - this.projectionMatrix.makeOrthographic(left, right, top, bottom, this.near, this.far, this.coordinateSystem); - this.projectionMatrixInverse.copy(this.projectionMatrix).invert(); - } - toJSON(meta) { - const data = super.toJSON(meta); - data.object.zoom = this.zoom; - data.object.left = this.left; - data.object.right = this.right; - data.object.top = this.top; - data.object.bottom = this.bottom; - data.object.near = this.near; - data.object.far = this.far; - if (this.view !== null) data.object.view = Object.assign({}, this.view); - return data; - } -} -const LOD_MIN = 4; -const EXTRA_LOD_SIGMA = [0.125, 0.215, 0.35, 0.446, 0.526, 0.582]; -const MAX_SAMPLES = 20; -const _flatCamera = /* @__PURE__ */ new OrthographicCamera(); -const _clearColor = /* @__PURE__ */ new Color(); -let _oldTarget = null; -let _oldActiveCubeFace = 0; -let _oldActiveMipmapLevel = 0; -let _oldXrEnabled = false; -const PHI = (1 + Math.sqrt(5)) / 2; -const INV_PHI = 1 / PHI; -const _axisDirections = [ - /* @__PURE__ */ new Vector3(-PHI, INV_PHI, 0), - /* @__PURE__ */ new Vector3(PHI, INV_PHI, 0), - /* @__PURE__ */ new Vector3(-INV_PHI, 0, PHI), - /* @__PURE__ */ new Vector3(INV_PHI, 0, PHI), - /* @__PURE__ */ new Vector3(0, PHI, -INV_PHI), - /* @__PURE__ */ new Vector3(0, PHI, INV_PHI), - /* @__PURE__ */ new Vector3(-1, 1, -1), - /* @__PURE__ */ new Vector3(1, 1, -1), - /* @__PURE__ */ new Vector3(-1, 1, 1), - /* @__PURE__ */ new Vector3(1, 1, 1) -]; -class PMREMGenerator { - static { - __name(this, "PMREMGenerator"); - } - constructor(renderer) { - this._renderer = renderer; - this._pingPongRenderTarget = null; - this._lodMax = 0; - this._cubeSize = 0; - this._lodPlanes = []; - this._sizeLods = []; - this._sigmas = []; - this._blurMaterial = null; - this._cubemapMaterial = null; - this._equirectMaterial = null; - this._compileMaterial(this._blurMaterial); - } - /** - * Generates a PMREM from a supplied Scene, which can be faster than using an - * image if networking bandwidth is low. Optional sigma specifies a blur radius - * in radians to be applied to the scene before PMREM generation. Optional near - * and far planes ensure the scene is rendered in its entirety (the cubeCamera - * is placed at the origin). - */ - fromScene(scene, sigma = 0, near = 0.1, far = 100) { - _oldTarget = this._renderer.getRenderTarget(); - _oldActiveCubeFace = this._renderer.getActiveCubeFace(); - _oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel(); - _oldXrEnabled = this._renderer.xr.enabled; - this._renderer.xr.enabled = false; - this._setSize(256); - const cubeUVRenderTarget = this._allocateTargets(); - cubeUVRenderTarget.depthBuffer = true; - this._sceneToCubeUV(scene, near, far, cubeUVRenderTarget); - if (sigma > 0) { - this._blur(cubeUVRenderTarget, 0, 0, sigma); - } - this._applyPMREM(cubeUVRenderTarget); - this._cleanup(cubeUVRenderTarget); - return cubeUVRenderTarget; - } - /** - * Generates a PMREM from an equirectangular texture, which can be either LDR - * or HDR. The ideal input image size is 1k (1024 x 512), - * as this matches best with the 256 x 256 cubemap output. - * The smallest supported equirectangular image size is 64 x 32. - */ - fromEquirectangular(equirectangular, renderTarget = null) { - return this._fromTexture(equirectangular, renderTarget); - } - /** - * Generates a PMREM from an cubemap texture, which can be either LDR - * or HDR. The ideal input cube size is 256 x 256, - * as this matches best with the 256 x 256 cubemap output. - * The smallest supported cube size is 16 x 16. - */ - fromCubemap(cubemap, renderTarget = null) { - return this._fromTexture(cubemap, renderTarget); - } - /** - * Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during - * your texture's network fetch for increased concurrency. - */ - compileCubemapShader() { - if (this._cubemapMaterial === null) { - this._cubemapMaterial = _getCubemapMaterial(); - this._compileMaterial(this._cubemapMaterial); - } - } - /** - * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during - * your texture's network fetch for increased concurrency. - */ - compileEquirectangularShader() { - if (this._equirectMaterial === null) { - this._equirectMaterial = _getEquirectMaterial(); - this._compileMaterial(this._equirectMaterial); - } - } - /** - * Disposes of the PMREMGenerator's internal memory. Note that PMREMGenerator is a static class, - * so you should not need more than one PMREMGenerator object. If you do, calling dispose() on - * one of them will cause any others to also become unusable. - */ - dispose() { - this._dispose(); - if (this._cubemapMaterial !== null) this._cubemapMaterial.dispose(); - if (this._equirectMaterial !== null) this._equirectMaterial.dispose(); - } - // private interface - _setSize(cubeSize) { - this._lodMax = Math.floor(Math.log2(cubeSize)); - this._cubeSize = Math.pow(2, this._lodMax); - } - _dispose() { - if (this._blurMaterial !== null) this._blurMaterial.dispose(); - if (this._pingPongRenderTarget !== null) this._pingPongRenderTarget.dispose(); - for (let i = 0; i < this._lodPlanes.length; i++) { - this._lodPlanes[i].dispose(); - } - } - _cleanup(outputTarget) { - this._renderer.setRenderTarget(_oldTarget, _oldActiveCubeFace, _oldActiveMipmapLevel); - this._renderer.xr.enabled = _oldXrEnabled; - outputTarget.scissorTest = false; - _setViewport(outputTarget, 0, 0, outputTarget.width, outputTarget.height); - } - _fromTexture(texture, renderTarget) { - if (texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping) { - this._setSize(texture.image.length === 0 ? 16 : texture.image[0].width || texture.image[0].image.width); - } else { - this._setSize(texture.image.width / 4); - } - _oldTarget = this._renderer.getRenderTarget(); - _oldActiveCubeFace = this._renderer.getActiveCubeFace(); - _oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel(); - _oldXrEnabled = this._renderer.xr.enabled; - this._renderer.xr.enabled = false; - const cubeUVRenderTarget = renderTarget || this._allocateTargets(); - this._textureToCubeUV(texture, cubeUVRenderTarget); - this._applyPMREM(cubeUVRenderTarget); - this._cleanup(cubeUVRenderTarget); - return cubeUVRenderTarget; - } - _allocateTargets() { - const width = 3 * Math.max(this._cubeSize, 16 * 7); - const height = 4 * this._cubeSize; - const params = { - magFilter: LinearFilter, - minFilter: LinearFilter, - generateMipmaps: false, - type: HalfFloatType, - format: RGBAFormat, - colorSpace: LinearSRGBColorSpace, - depthBuffer: false - }; - const cubeUVRenderTarget = _createRenderTarget(width, height, params); - if (this._pingPongRenderTarget === null || this._pingPongRenderTarget.width !== width || this._pingPongRenderTarget.height !== height) { - if (this._pingPongRenderTarget !== null) { - this._dispose(); - } - this._pingPongRenderTarget = _createRenderTarget(width, height, params); - const { _lodMax } = this; - ({ sizeLods: this._sizeLods, lodPlanes: this._lodPlanes, sigmas: this._sigmas } = _createPlanes(_lodMax)); - this._blurMaterial = _getBlurShader(_lodMax, width, height); - } - return cubeUVRenderTarget; - } - _compileMaterial(material) { - const tmpMesh = new Mesh(this._lodPlanes[0], material); - this._renderer.compile(tmpMesh, _flatCamera); - } - _sceneToCubeUV(scene, near, far, cubeUVRenderTarget) { - const fov2 = 90; - const aspect2 = 1; - const cubeCamera = new PerspectiveCamera(fov2, aspect2, near, far); - const upSign = [1, -1, 1, 1, 1, 1]; - const forwardSign = [1, 1, 1, -1, -1, -1]; - const renderer = this._renderer; - const originalAutoClear = renderer.autoClear; - const toneMapping = renderer.toneMapping; - renderer.getClearColor(_clearColor); - renderer.toneMapping = NoToneMapping; - renderer.autoClear = false; - const backgroundMaterial = new MeshBasicMaterial({ - name: "PMREM.Background", - side: BackSide, - depthWrite: false, - depthTest: false - }); - const backgroundBox = new Mesh(new BoxGeometry(), backgroundMaterial); - let useSolidColor = false; - const background = scene.background; - if (background) { - if (background.isColor) { - backgroundMaterial.color.copy(background); - scene.background = null; - useSolidColor = true; - } - } else { - backgroundMaterial.color.copy(_clearColor); - useSolidColor = true; - } - for (let i = 0; i < 6; i++) { - const col = i % 3; - if (col === 0) { - cubeCamera.up.set(0, upSign[i], 0); - cubeCamera.lookAt(forwardSign[i], 0, 0); - } else if (col === 1) { - cubeCamera.up.set(0, 0, upSign[i]); - cubeCamera.lookAt(0, forwardSign[i], 0); - } else { - cubeCamera.up.set(0, upSign[i], 0); - cubeCamera.lookAt(0, 0, forwardSign[i]); - } - const size = this._cubeSize; - _setViewport(cubeUVRenderTarget, col * size, i > 2 ? size : 0, size, size); - renderer.setRenderTarget(cubeUVRenderTarget); - if (useSolidColor) { - renderer.render(backgroundBox, cubeCamera); - } - renderer.render(scene, cubeCamera); - } - backgroundBox.geometry.dispose(); - backgroundBox.material.dispose(); - renderer.toneMapping = toneMapping; - renderer.autoClear = originalAutoClear; - scene.background = background; - } - _textureToCubeUV(texture, cubeUVRenderTarget) { - const renderer = this._renderer; - const isCubeTexture = texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping; - if (isCubeTexture) { - if (this._cubemapMaterial === null) { - this._cubemapMaterial = _getCubemapMaterial(); - } - this._cubemapMaterial.uniforms.flipEnvMap.value = texture.isRenderTargetTexture === false ? -1 : 1; - } else { - if (this._equirectMaterial === null) { - this._equirectMaterial = _getEquirectMaterial(); - } - } - const material = isCubeTexture ? this._cubemapMaterial : this._equirectMaterial; - const mesh = new Mesh(this._lodPlanes[0], material); - const uniforms = material.uniforms; - uniforms["envMap"].value = texture; - const size = this._cubeSize; - _setViewport(cubeUVRenderTarget, 0, 0, 3 * size, 2 * size); - renderer.setRenderTarget(cubeUVRenderTarget); - renderer.render(mesh, _flatCamera); - } - _applyPMREM(cubeUVRenderTarget) { - const renderer = this._renderer; - const autoClear = renderer.autoClear; - renderer.autoClear = false; - const n = this._lodPlanes.length; - for (let i = 1; i < n; i++) { - const sigma = Math.sqrt(this._sigmas[i] * this._sigmas[i] - this._sigmas[i - 1] * this._sigmas[i - 1]); - const poleAxis = _axisDirections[(n - i - 1) % _axisDirections.length]; - this._blur(cubeUVRenderTarget, i - 1, i, sigma, poleAxis); - } - renderer.autoClear = autoClear; - } - /** - * This is a two-pass Gaussian blur for a cubemap. Normally this is done - * vertically and horizontally, but this breaks down on a cube. Here we apply - * the blur latitudinally (around the poles), and then longitudinally (towards - * the poles) to approximate the orthogonally-separable blur. It is least - * accurate at the poles, but still does a decent job. - */ - _blur(cubeUVRenderTarget, lodIn, lodOut, sigma, poleAxis) { - const pingPongRenderTarget = this._pingPongRenderTarget; - this._halfBlur( - cubeUVRenderTarget, - pingPongRenderTarget, - lodIn, - lodOut, - sigma, - "latitudinal", - poleAxis - ); - this._halfBlur( - pingPongRenderTarget, - cubeUVRenderTarget, - lodOut, - lodOut, - sigma, - "longitudinal", - poleAxis - ); - } - _halfBlur(targetIn, targetOut, lodIn, lodOut, sigmaRadians, direction, poleAxis) { - const renderer = this._renderer; - const blurMaterial = this._blurMaterial; - if (direction !== "latitudinal" && direction !== "longitudinal") { - console.error( - "blur direction must be either latitudinal or longitudinal!" - ); - } - const STANDARD_DEVIATIONS = 3; - const blurMesh = new Mesh(this._lodPlanes[lodOut], blurMaterial); - const blurUniforms = blurMaterial.uniforms; - const pixels = this._sizeLods[lodIn] - 1; - const radiansPerPixel = isFinite(sigmaRadians) ? Math.PI / (2 * pixels) : 2 * Math.PI / (2 * MAX_SAMPLES - 1); - const sigmaPixels = sigmaRadians / radiansPerPixel; - const samples = isFinite(sigmaRadians) ? 1 + Math.floor(STANDARD_DEVIATIONS * sigmaPixels) : MAX_SAMPLES; - if (samples > MAX_SAMPLES) { - console.warn(`sigmaRadians, ${sigmaRadians}, is too large and will clip, as it requested ${samples} samples when the maximum is set to ${MAX_SAMPLES}`); - } - const weights = []; - let sum = 0; - for (let i = 0; i < MAX_SAMPLES; ++i) { - const x2 = i / sigmaPixels; - const weight = Math.exp(-x2 * x2 / 2); - weights.push(weight); - if (i === 0) { - sum += weight; - } else if (i < samples) { - sum += 2 * weight; - } - } - for (let i = 0; i < weights.length; i++) { - weights[i] = weights[i] / sum; - } - blurUniforms["envMap"].value = targetIn.texture; - blurUniforms["samples"].value = samples; - blurUniforms["weights"].value = weights; - blurUniforms["latitudinal"].value = direction === "latitudinal"; - if (poleAxis) { - blurUniforms["poleAxis"].value = poleAxis; - } - const { _lodMax } = this; - blurUniforms["dTheta"].value = radiansPerPixel; - blurUniforms["mipInt"].value = _lodMax - lodIn; - const outputSize = this._sizeLods[lodOut]; - const x = 3 * outputSize * (lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0); - const y = 4 * (this._cubeSize - outputSize); - _setViewport(targetOut, x, y, 3 * outputSize, 2 * outputSize); - renderer.setRenderTarget(targetOut); - renderer.render(blurMesh, _flatCamera); - } -} -function _createPlanes(lodMax) { - const lodPlanes = []; - const sizeLods = []; - const sigmas = []; - let lod = lodMax; - const totalLods = lodMax - LOD_MIN + 1 + EXTRA_LOD_SIGMA.length; - for (let i = 0; i < totalLods; i++) { - const sizeLod = Math.pow(2, lod); - sizeLods.push(sizeLod); - let sigma = 1 / sizeLod; - if (i > lodMax - LOD_MIN) { - sigma = EXTRA_LOD_SIGMA[i - lodMax + LOD_MIN - 1]; - } else if (i === 0) { - sigma = 0; - } - sigmas.push(sigma); - const texelSize = 1 / (sizeLod - 2); - const min = -texelSize; - const max2 = 1 + texelSize; - const uv1 = [min, min, max2, min, max2, max2, min, min, max2, max2, min, max2]; - const cubeFaces = 6; - const vertices = 6; - const positionSize = 3; - const uvSize = 2; - const faceIndexSize = 1; - const position = new Float32Array(positionSize * vertices * cubeFaces); - const uv = new Float32Array(uvSize * vertices * cubeFaces); - const faceIndex = new Float32Array(faceIndexSize * vertices * cubeFaces); - for (let face = 0; face < cubeFaces; face++) { - const x = face % 3 * 2 / 3 - 1; - const y = face > 2 ? 0 : -1; - const coordinates = [ - x, - y, - 0, - x + 2 / 3, - y, - 0, - x + 2 / 3, - y + 1, - 0, - x, - y, - 0, - x + 2 / 3, - y + 1, - 0, - x, - y + 1, - 0 - ]; - position.set(coordinates, positionSize * vertices * face); - uv.set(uv1, uvSize * vertices * face); - const fill2 = [face, face, face, face, face, face]; - faceIndex.set(fill2, faceIndexSize * vertices * face); - } - const planes = new BufferGeometry(); - planes.setAttribute("position", new BufferAttribute(position, positionSize)); - planes.setAttribute("uv", new BufferAttribute(uv, uvSize)); - planes.setAttribute("faceIndex", new BufferAttribute(faceIndex, faceIndexSize)); - lodPlanes.push(planes); - if (lod > LOD_MIN) { - lod--; - } - } - return { lodPlanes, sizeLods, sigmas }; -} -__name(_createPlanes, "_createPlanes"); -function _createRenderTarget(width, height, params) { - const cubeUVRenderTarget = new WebGLRenderTarget(width, height, params); - cubeUVRenderTarget.texture.mapping = CubeUVReflectionMapping; - cubeUVRenderTarget.texture.name = "PMREM.cubeUv"; - cubeUVRenderTarget.scissorTest = true; - return cubeUVRenderTarget; -} -__name(_createRenderTarget, "_createRenderTarget"); -function _setViewport(target, x, y, width, height) { - target.viewport.set(x, y, width, height); - target.scissor.set(x, y, width, height); -} -__name(_setViewport, "_setViewport"); -function _getBlurShader(lodMax, width, height) { - const weights = new Float32Array(MAX_SAMPLES); - const poleAxis = new Vector3(0, 1, 0); - const shaderMaterial = new ShaderMaterial({ - name: "SphericalGaussianBlur", - defines: { - "n": MAX_SAMPLES, - "CUBEUV_TEXEL_WIDTH": 1 / width, - "CUBEUV_TEXEL_HEIGHT": 1 / height, - "CUBEUV_MAX_MIP": `${lodMax}.0` - }, - uniforms: { - "envMap": { value: null }, - "samples": { value: 1 }, - "weights": { value: weights }, - "latitudinal": { value: false }, - "dTheta": { value: 0 }, - "mipInt": { value: 0 }, - "poleAxis": { value: poleAxis } - }, - vertexShader: _getCommonVertexShader(), - fragmentShader: ( - /* glsl */ - ` - - precision mediump float; - precision mediump int; - - varying vec3 vOutputDirection; - - uniform sampler2D envMap; - uniform int samples; - uniform float weights[ n ]; - uniform bool latitudinal; - uniform float dTheta; - uniform float mipInt; - uniform vec3 poleAxis; - - #define ENVMAP_TYPE_CUBE_UV - #include - - vec3 getSample( float theta, vec3 axis ) { - - float cosTheta = cos( theta ); - // Rodrigues' axis-angle rotation - vec3 sampleDirection = vOutputDirection * cosTheta - + cross( axis, vOutputDirection ) * sin( theta ) - + axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta ); - - return bilinearCubeUV( envMap, sampleDirection, mipInt ); - - } - - void main() { - - vec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection ); - - if ( all( equal( axis, vec3( 0.0 ) ) ) ) { - - axis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x ); - - } - - axis = normalize( axis ); - - gl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 ); - gl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis ); - - for ( int i = 1; i < n; i++ ) { - - if ( i >= samples ) { - - break; - - } - - float theta = dTheta * float( i ); - gl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis ); - gl_FragColor.rgb += weights[ i ] * getSample( theta, axis ); - - } - - } - ` - ), - blending: NoBlending, - depthTest: false, - depthWrite: false - }); - return shaderMaterial; -} -__name(_getBlurShader, "_getBlurShader"); -function _getEquirectMaterial() { - return new ShaderMaterial({ - name: "EquirectangularToCubeUV", - uniforms: { - "envMap": { value: null } - }, - vertexShader: _getCommonVertexShader(), - fragmentShader: ( - /* glsl */ - ` - - precision mediump float; - precision mediump int; - - varying vec3 vOutputDirection; - - uniform sampler2D envMap; - - #include - - void main() { - - vec3 outputDirection = normalize( vOutputDirection ); - vec2 uv = equirectUv( outputDirection ); - - gl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 ); - - } - ` - ), - blending: NoBlending, - depthTest: false, - depthWrite: false - }); -} -__name(_getEquirectMaterial, "_getEquirectMaterial"); -function _getCubemapMaterial() { - return new ShaderMaterial({ - name: "CubemapToCubeUV", - uniforms: { - "envMap": { value: null }, - "flipEnvMap": { value: -1 } - }, - vertexShader: _getCommonVertexShader(), - fragmentShader: ( - /* glsl */ - ` - - precision mediump float; - precision mediump int; - - uniform float flipEnvMap; - - varying vec3 vOutputDirection; - - uniform samplerCube envMap; - - void main() { - - gl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) ); - - } - ` - ), - blending: NoBlending, - depthTest: false, - depthWrite: false - }); -} -__name(_getCubemapMaterial, "_getCubemapMaterial"); -function _getCommonVertexShader() { - return ( - /* glsl */ - ` - - precision mediump float; - precision mediump int; - - attribute float faceIndex; - - varying vec3 vOutputDirection; - - // RH coordinate system; PMREM face-indexing convention - vec3 getDirection( vec2 uv, float face ) { - - uv = 2.0 * uv - 1.0; - - vec3 direction = vec3( uv, 1.0 ); - - if ( face == 0.0 ) { - - direction = direction.zyx; // ( 1, v, u ) pos x - - } else if ( face == 1.0 ) { - - direction = direction.xzy; - direction.xz *= -1.0; // ( -u, 1, -v ) pos y - - } else if ( face == 2.0 ) { - - direction.x *= -1.0; // ( -u, v, 1 ) pos z - - } else if ( face == 3.0 ) { - - direction = direction.zyx; - direction.xz *= -1.0; // ( -1, v, -u ) neg x - - } else if ( face == 4.0 ) { - - direction = direction.xzy; - direction.xy *= -1.0; // ( -u, -1, v ) neg y - - } else if ( face == 5.0 ) { - - direction.z *= -1.0; // ( u, v, -1 ) neg z - - } - - return direction; - - } - - void main() { - - vOutputDirection = getDirection( uv, faceIndex ); - gl_Position = vec4( position, 1.0 ); - - } - ` - ); -} -__name(_getCommonVertexShader, "_getCommonVertexShader"); -function WebGLCubeUVMaps(renderer) { - let cubeUVmaps = /* @__PURE__ */ new WeakMap(); - let pmremGenerator = null; - function get(texture) { - if (texture && texture.isTexture) { - const mapping = texture.mapping; - const isEquirectMap = mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping; - const isCubeMap = mapping === CubeReflectionMapping || mapping === CubeRefractionMapping; - if (isEquirectMap || isCubeMap) { - let renderTarget = cubeUVmaps.get(texture); - const currentPMREMVersion = renderTarget !== void 0 ? renderTarget.texture.pmremVersion : 0; - if (texture.isRenderTargetTexture && texture.pmremVersion !== currentPMREMVersion) { - if (pmremGenerator === null) pmremGenerator = new PMREMGenerator(renderer); - renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular(texture, renderTarget) : pmremGenerator.fromCubemap(texture, renderTarget); - renderTarget.texture.pmremVersion = texture.pmremVersion; - cubeUVmaps.set(texture, renderTarget); - return renderTarget.texture; - } else { - if (renderTarget !== void 0) { - return renderTarget.texture; - } else { - const image = texture.image; - if (isEquirectMap && image && image.height > 0 || isCubeMap && image && isCubeTextureComplete(image)) { - if (pmremGenerator === null) pmremGenerator = new PMREMGenerator(renderer); - renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular(texture) : pmremGenerator.fromCubemap(texture); - renderTarget.texture.pmremVersion = texture.pmremVersion; - cubeUVmaps.set(texture, renderTarget); - texture.addEventListener("dispose", onTextureDispose); - return renderTarget.texture; - } else { - return null; - } - } - } - } - } - return texture; - } - __name(get, "get"); - function isCubeTextureComplete(image) { - let count = 0; - const length = 6; - for (let i = 0; i < length; i++) { - if (image[i] !== void 0) count++; - } - return count === length; - } - __name(isCubeTextureComplete, "isCubeTextureComplete"); - function onTextureDispose(event) { - const texture = event.target; - texture.removeEventListener("dispose", onTextureDispose); - const cubemapUV = cubeUVmaps.get(texture); - if (cubemapUV !== void 0) { - cubeUVmaps.delete(texture); - cubemapUV.dispose(); - } - } - __name(onTextureDispose, "onTextureDispose"); - function dispose() { - cubeUVmaps = /* @__PURE__ */ new WeakMap(); - if (pmremGenerator !== null) { - pmremGenerator.dispose(); - pmremGenerator = null; - } - } - __name(dispose, "dispose"); - return { - get, - dispose - }; -} -__name(WebGLCubeUVMaps, "WebGLCubeUVMaps"); -function WebGLExtensions(gl) { - const extensions = {}; - function getExtension(name) { - if (extensions[name] !== void 0) { - return extensions[name]; - } - let extension; - switch (name) { - case "WEBGL_depth_texture": - extension = gl.getExtension("WEBGL_depth_texture") || gl.getExtension("MOZ_WEBGL_depth_texture") || gl.getExtension("WEBKIT_WEBGL_depth_texture"); - break; - case "EXT_texture_filter_anisotropic": - extension = gl.getExtension("EXT_texture_filter_anisotropic") || gl.getExtension("MOZ_EXT_texture_filter_anisotropic") || gl.getExtension("WEBKIT_EXT_texture_filter_anisotropic"); - break; - case "WEBGL_compressed_texture_s3tc": - extension = gl.getExtension("WEBGL_compressed_texture_s3tc") || gl.getExtension("MOZ_WEBGL_compressed_texture_s3tc") || gl.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc"); - break; - case "WEBGL_compressed_texture_pvrtc": - extension = gl.getExtension("WEBGL_compressed_texture_pvrtc") || gl.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc"); - break; - default: - extension = gl.getExtension(name); - } - extensions[name] = extension; - return extension; - } - __name(getExtension, "getExtension"); - return { - has: /* @__PURE__ */ __name(function(name) { - return getExtension(name) !== null; - }, "has"), - init: /* @__PURE__ */ __name(function() { - getExtension("EXT_color_buffer_float"); - getExtension("WEBGL_clip_cull_distance"); - getExtension("OES_texture_float_linear"); - getExtension("EXT_color_buffer_half_float"); - getExtension("WEBGL_multisampled_render_to_texture"); - getExtension("WEBGL_render_shared_exponent"); - }, "init"), - get: /* @__PURE__ */ __name(function(name) { - const extension = getExtension(name); - if (extension === null) { - warnOnce("THREE.WebGLRenderer: " + name + " extension not supported."); - } - return extension; - }, "get") - }; -} -__name(WebGLExtensions, "WebGLExtensions"); -function WebGLGeometries(gl, attributes, info, bindingStates) { - const geometries = {}; - const wireframeAttributes = /* @__PURE__ */ new WeakMap(); - function onGeometryDispose(event) { - const geometry = event.target; - if (geometry.index !== null) { - attributes.remove(geometry.index); - } - for (const name in geometry.attributes) { - attributes.remove(geometry.attributes[name]); - } - for (const name in geometry.morphAttributes) { - const array = geometry.morphAttributes[name]; - for (let i = 0, l = array.length; i < l; i++) { - attributes.remove(array[i]); - } - } - geometry.removeEventListener("dispose", onGeometryDispose); - delete geometries[geometry.id]; - const attribute = wireframeAttributes.get(geometry); - if (attribute) { - attributes.remove(attribute); - wireframeAttributes.delete(geometry); - } - bindingStates.releaseStatesOfGeometry(geometry); - if (geometry.isInstancedBufferGeometry === true) { - delete geometry._maxInstanceCount; - } - info.memory.geometries--; - } - __name(onGeometryDispose, "onGeometryDispose"); - function get(object, geometry) { - if (geometries[geometry.id] === true) return geometry; - geometry.addEventListener("dispose", onGeometryDispose); - geometries[geometry.id] = true; - info.memory.geometries++; - return geometry; - } - __name(get, "get"); - function update(geometry) { - const geometryAttributes = geometry.attributes; - for (const name in geometryAttributes) { - attributes.update(geometryAttributes[name], gl.ARRAY_BUFFER); - } - const morphAttributes = geometry.morphAttributes; - for (const name in morphAttributes) { - const array = morphAttributes[name]; - for (let i = 0, l = array.length; i < l; i++) { - attributes.update(array[i], gl.ARRAY_BUFFER); - } - } - } - __name(update, "update"); - function updateWireframeAttribute(geometry) { - const indices = []; - const geometryIndex = geometry.index; - const geometryPosition = geometry.attributes.position; - let version = 0; - if (geometryIndex !== null) { - const array = geometryIndex.array; - version = geometryIndex.version; - for (let i = 0, l = array.length; i < l; i += 3) { - const a = array[i + 0]; - const b = array[i + 1]; - const c = array[i + 2]; - indices.push(a, b, b, c, c, a); - } - } else if (geometryPosition !== void 0) { - const array = geometryPosition.array; - version = geometryPosition.version; - for (let i = 0, l = array.length / 3 - 1; i < l; i += 3) { - const a = i + 0; - const b = i + 1; - const c = i + 2; - indices.push(a, b, b, c, c, a); - } - } else { - return; - } - const attribute = new (arrayNeedsUint32(indices) ? Uint32BufferAttribute : Uint16BufferAttribute)(indices, 1); - attribute.version = version; - const previousAttribute = wireframeAttributes.get(geometry); - if (previousAttribute) attributes.remove(previousAttribute); - wireframeAttributes.set(geometry, attribute); - } - __name(updateWireframeAttribute, "updateWireframeAttribute"); - function getWireframeAttribute(geometry) { - const currentAttribute = wireframeAttributes.get(geometry); - if (currentAttribute) { - const geometryIndex = geometry.index; - if (geometryIndex !== null) { - if (currentAttribute.version < geometryIndex.version) { - updateWireframeAttribute(geometry); - } - } - } else { - updateWireframeAttribute(geometry); - } - return wireframeAttributes.get(geometry); - } - __name(getWireframeAttribute, "getWireframeAttribute"); - return { - get, - update, - getWireframeAttribute - }; -} -__name(WebGLGeometries, "WebGLGeometries"); -function WebGLIndexedBufferRenderer(gl, extensions, info) { - let mode; - function setMode(value) { - mode = value; - } - __name(setMode, "setMode"); - let type, bytesPerElement; - function setIndex(value) { - type = value.type; - bytesPerElement = value.bytesPerElement; - } - __name(setIndex, "setIndex"); - function render(start, count) { - gl.drawElements(mode, count, type, start * bytesPerElement); - info.update(count, mode, 1); - } - __name(render, "render"); - function renderInstances(start, count, primcount) { - if (primcount === 0) return; - gl.drawElementsInstanced(mode, count, type, start * bytesPerElement, primcount); - info.update(count, mode, primcount); - } - __name(renderInstances, "renderInstances"); - function renderMultiDraw(starts, counts, drawCount) { - if (drawCount === 0) return; - const extension = extensions.get("WEBGL_multi_draw"); - extension.multiDrawElementsWEBGL(mode, counts, 0, type, starts, 0, drawCount); - let elementCount = 0; - for (let i = 0; i < drawCount; i++) { - elementCount += counts[i]; - } - info.update(elementCount, mode, 1); - } - __name(renderMultiDraw, "renderMultiDraw"); - function renderMultiDrawInstances(starts, counts, drawCount, primcount) { - if (drawCount === 0) return; - const extension = extensions.get("WEBGL_multi_draw"); - if (extension === null) { - for (let i = 0; i < starts.length; i++) { - renderInstances(starts[i] / bytesPerElement, counts[i], primcount[i]); - } - } else { - extension.multiDrawElementsInstancedWEBGL(mode, counts, 0, type, starts, 0, primcount, 0, drawCount); - let elementCount = 0; - for (let i = 0; i < drawCount; i++) { - elementCount += counts[i] * primcount[i]; - } - info.update(elementCount, mode, 1); - } - } - __name(renderMultiDrawInstances, "renderMultiDrawInstances"); - this.setMode = setMode; - this.setIndex = setIndex; - this.render = render; - this.renderInstances = renderInstances; - this.renderMultiDraw = renderMultiDraw; - this.renderMultiDrawInstances = renderMultiDrawInstances; -} -__name(WebGLIndexedBufferRenderer, "WebGLIndexedBufferRenderer"); -function WebGLInfo(gl) { - const memory = { - geometries: 0, - textures: 0 - }; - const render = { - frame: 0, - calls: 0, - triangles: 0, - points: 0, - lines: 0 - }; - function update(count, mode, instanceCount) { - render.calls++; - switch (mode) { - case gl.TRIANGLES: - render.triangles += instanceCount * (count / 3); - break; - case gl.LINES: - render.lines += instanceCount * (count / 2); - break; - case gl.LINE_STRIP: - render.lines += instanceCount * (count - 1); - break; - case gl.LINE_LOOP: - render.lines += instanceCount * count; - break; - case gl.POINTS: - render.points += instanceCount * count; - break; - default: - console.error("THREE.WebGLInfo: Unknown draw mode:", mode); - break; - } - } - __name(update, "update"); - function reset() { - render.calls = 0; - render.triangles = 0; - render.points = 0; - render.lines = 0; - } - __name(reset, "reset"); - return { - memory, - render, - programs: null, - autoReset: true, - reset, - update - }; -} -__name(WebGLInfo, "WebGLInfo"); -function WebGLMorphtargets(gl, capabilities, textures) { - const morphTextures = /* @__PURE__ */ new WeakMap(); - const morph = new Vector4(); - function update(object, geometry, program) { - const objectInfluences = object.morphTargetInfluences; - const morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color; - const morphTargetsCount = morphAttribute !== void 0 ? morphAttribute.length : 0; - let entry = morphTextures.get(geometry); - if (entry === void 0 || entry.count !== morphTargetsCount) { - let disposeTexture = function() { - texture.dispose(); - morphTextures.delete(geometry); - geometry.removeEventListener("dispose", disposeTexture); - }; - __name(disposeTexture, "disposeTexture"); - if (entry !== void 0) entry.texture.dispose(); - const hasMorphPosition = geometry.morphAttributes.position !== void 0; - const hasMorphNormals = geometry.morphAttributes.normal !== void 0; - const hasMorphColors = geometry.morphAttributes.color !== void 0; - const morphTargets = geometry.morphAttributes.position || []; - const morphNormals = geometry.morphAttributes.normal || []; - const morphColors = geometry.morphAttributes.color || []; - let vertexDataCount = 0; - if (hasMorphPosition === true) vertexDataCount = 1; - if (hasMorphNormals === true) vertexDataCount = 2; - if (hasMorphColors === true) vertexDataCount = 3; - let width = geometry.attributes.position.count * vertexDataCount; - let height = 1; - if (width > capabilities.maxTextureSize) { - height = Math.ceil(width / capabilities.maxTextureSize); - width = capabilities.maxTextureSize; - } - const buffer = new Float32Array(width * height * 4 * morphTargetsCount); - const texture = new DataArrayTexture(buffer, width, height, morphTargetsCount); - texture.type = FloatType; - texture.needsUpdate = true; - const vertexDataStride = vertexDataCount * 4; - for (let i = 0; i < morphTargetsCount; i++) { - const morphTarget = morphTargets[i]; - const morphNormal = morphNormals[i]; - const morphColor = morphColors[i]; - const offset = width * height * 4 * i; - for (let j = 0; j < morphTarget.count; j++) { - const stride = j * vertexDataStride; - if (hasMorphPosition === true) { - morph.fromBufferAttribute(morphTarget, j); - buffer[offset + stride + 0] = morph.x; - buffer[offset + stride + 1] = morph.y; - buffer[offset + stride + 2] = morph.z; - buffer[offset + stride + 3] = 0; - } - if (hasMorphNormals === true) { - morph.fromBufferAttribute(morphNormal, j); - buffer[offset + stride + 4] = morph.x; - buffer[offset + stride + 5] = morph.y; - buffer[offset + stride + 6] = morph.z; - buffer[offset + stride + 7] = 0; - } - if (hasMorphColors === true) { - morph.fromBufferAttribute(morphColor, j); - buffer[offset + stride + 8] = morph.x; - buffer[offset + stride + 9] = morph.y; - buffer[offset + stride + 10] = morph.z; - buffer[offset + stride + 11] = morphColor.itemSize === 4 ? morph.w : 1; - } - } - } - entry = { - count: morphTargetsCount, - texture, - size: new Vector2(width, height) - }; - morphTextures.set(geometry, entry); - geometry.addEventListener("dispose", disposeTexture); - } - if (object.isInstancedMesh === true && object.morphTexture !== null) { - program.getUniforms().setValue(gl, "morphTexture", object.morphTexture, textures); - } else { - let morphInfluencesSum = 0; - for (let i = 0; i < objectInfluences.length; i++) { - morphInfluencesSum += objectInfluences[i]; - } - const morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum; - program.getUniforms().setValue(gl, "morphTargetBaseInfluence", morphBaseInfluence); - program.getUniforms().setValue(gl, "morphTargetInfluences", objectInfluences); - } - program.getUniforms().setValue(gl, "morphTargetsTexture", entry.texture, textures); - program.getUniforms().setValue(gl, "morphTargetsTextureSize", entry.size); - } - __name(update, "update"); - return { - update - }; -} -__name(WebGLMorphtargets, "WebGLMorphtargets"); -function WebGLObjects(gl, geometries, attributes, info) { - let updateMap = /* @__PURE__ */ new WeakMap(); - function update(object) { - const frame = info.render.frame; - const geometry = object.geometry; - const buffergeometry = geometries.get(object, geometry); - if (updateMap.get(buffergeometry) !== frame) { - geometries.update(buffergeometry); - updateMap.set(buffergeometry, frame); - } - if (object.isInstancedMesh) { - if (object.hasEventListener("dispose", onInstancedMeshDispose) === false) { - object.addEventListener("dispose", onInstancedMeshDispose); - } - if (updateMap.get(object) !== frame) { - attributes.update(object.instanceMatrix, gl.ARRAY_BUFFER); - if (object.instanceColor !== null) { - attributes.update(object.instanceColor, gl.ARRAY_BUFFER); - } - updateMap.set(object, frame); - } - } - if (object.isSkinnedMesh) { - const skeleton = object.skeleton; - if (updateMap.get(skeleton) !== frame) { - skeleton.update(); - updateMap.set(skeleton, frame); - } - } - return buffergeometry; - } - __name(update, "update"); - function dispose() { - updateMap = /* @__PURE__ */ new WeakMap(); - } - __name(dispose, "dispose"); - function onInstancedMeshDispose(event) { - const instancedMesh = event.target; - instancedMesh.removeEventListener("dispose", onInstancedMeshDispose); - attributes.remove(instancedMesh.instanceMatrix); - if (instancedMesh.instanceColor !== null) attributes.remove(instancedMesh.instanceColor); - } - __name(onInstancedMeshDispose, "onInstancedMeshDispose"); - return { - update, - dispose - }; -} -__name(WebGLObjects, "WebGLObjects"); -class DepthTexture extends Texture { - static { - __name(this, "DepthTexture"); - } - constructor(width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format = DepthFormat) { - if (format !== DepthFormat && format !== DepthStencilFormat) { - throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat"); - } - if (type === void 0 && format === DepthFormat) type = UnsignedIntType; - if (type === void 0 && format === DepthStencilFormat) type = UnsignedInt248Type; - super(null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy); - this.isDepthTexture = true; - this.image = { width, height }; - this.magFilter = magFilter !== void 0 ? magFilter : NearestFilter; - this.minFilter = minFilter !== void 0 ? minFilter : NearestFilter; - this.flipY = false; - this.generateMipmaps = false; - this.compareFunction = null; - } - copy(source) { - super.copy(source); - this.compareFunction = source.compareFunction; + addScalar(s) { + this.x += s; + this.y += s; + this.z += s; return this; } - toJSON(meta) { - const data = super.toJSON(meta); - if (this.compareFunction !== null) data.compareFunction = this.compareFunction; - return data; - } -} -const emptyTexture = /* @__PURE__ */ new Texture(); -const emptyShadowTexture = /* @__PURE__ */ new DepthTexture(1, 1); -const emptyArrayTexture = /* @__PURE__ */ new DataArrayTexture(); -const empty3dTexture = /* @__PURE__ */ new Data3DTexture(); -const emptyCubeTexture = /* @__PURE__ */ new CubeTexture(); -const arrayCacheF32 = []; -const arrayCacheI32 = []; -const mat4array = new Float32Array(16); -const mat3array = new Float32Array(9); -const mat2array = new Float32Array(4); -function flatten(array, nBlocks, blockSize) { - const firstElem = array[0]; - if (firstElem <= 0 || firstElem > 0) return array; - const n = nBlocks * blockSize; - let r = arrayCacheF32[n]; - if (r === void 0) { - r = new Float32Array(n); - arrayCacheF32[n] = r; - } - if (nBlocks !== 0) { - firstElem.toArray(r, 0); - for (let i = 1, offset = 0; i !== nBlocks; ++i) { - offset += blockSize; - array[i].toArray(r, offset); - } - } - return r; -} -__name(flatten, "flatten"); -function arraysEqual(a, b) { - if (a.length !== b.length) return false; - for (let i = 0, l = a.length; i < l; i++) { - if (a[i] !== b[i]) return false; - } - return true; -} -__name(arraysEqual, "arraysEqual"); -function copyArray(a, b) { - for (let i = 0, l = b.length; i < l; i++) { - a[i] = b[i]; - } -} -__name(copyArray, "copyArray"); -function allocTexUnits(textures, n) { - let r = arrayCacheI32[n]; - if (r === void 0) { - r = new Int32Array(n); - arrayCacheI32[n] = r; - } - for (let i = 0; i !== n; ++i) { - r[i] = textures.allocateTextureUnit(); - } - return r; -} -__name(allocTexUnits, "allocTexUnits"); -function setValueV1f(gl, v) { - const cache = this.cache; - if (cache[0] === v) return; - gl.uniform1f(this.addr, v); - cache[0] = v; -} -__name(setValueV1f, "setValueV1f"); -function setValueV2f(gl, v) { - const cache = this.cache; - if (v.x !== void 0) { - if (cache[0] !== v.x || cache[1] !== v.y) { - gl.uniform2f(this.addr, v.x, v.y); - cache[0] = v.x; - cache[1] = v.y; - } - } else { - if (arraysEqual(cache, v)) return; - gl.uniform2fv(this.addr, v); - copyArray(cache, v); - } -} -__name(setValueV2f, "setValueV2f"); -function setValueV3f(gl, v) { - const cache = this.cache; - if (v.x !== void 0) { - if (cache[0] !== v.x || cache[1] !== v.y || cache[2] !== v.z) { - gl.uniform3f(this.addr, v.x, v.y, v.z); - cache[0] = v.x; - cache[1] = v.y; - cache[2] = v.z; - } - } else if (v.r !== void 0) { - if (cache[0] !== v.r || cache[1] !== v.g || cache[2] !== v.b) { - gl.uniform3f(this.addr, v.r, v.g, v.b); - cache[0] = v.r; - cache[1] = v.g; - cache[2] = v.b; - } - } else { - if (arraysEqual(cache, v)) return; - gl.uniform3fv(this.addr, v); - copyArray(cache, v); - } -} -__name(setValueV3f, "setValueV3f"); -function setValueV4f(gl, v) { - const cache = this.cache; - if (v.x !== void 0) { - if (cache[0] !== v.x || cache[1] !== v.y || cache[2] !== v.z || cache[3] !== v.w) { - gl.uniform4f(this.addr, v.x, v.y, v.z, v.w); - cache[0] = v.x; - cache[1] = v.y; - cache[2] = v.z; - cache[3] = v.w; - } - } else { - if (arraysEqual(cache, v)) return; - gl.uniform4fv(this.addr, v); - copyArray(cache, v); - } -} -__name(setValueV4f, "setValueV4f"); -function setValueM2(gl, v) { - const cache = this.cache; - const elements = v.elements; - if (elements === void 0) { - if (arraysEqual(cache, v)) return; - gl.uniformMatrix2fv(this.addr, false, v); - copyArray(cache, v); - } else { - if (arraysEqual(cache, elements)) return; - mat2array.set(elements); - gl.uniformMatrix2fv(this.addr, false, mat2array); - copyArray(cache, elements); - } -} -__name(setValueM2, "setValueM2"); -function setValueM3(gl, v) { - const cache = this.cache; - const elements = v.elements; - if (elements === void 0) { - if (arraysEqual(cache, v)) return; - gl.uniformMatrix3fv(this.addr, false, v); - copyArray(cache, v); - } else { - if (arraysEqual(cache, elements)) return; - mat3array.set(elements); - gl.uniformMatrix3fv(this.addr, false, mat3array); - copyArray(cache, elements); - } -} -__name(setValueM3, "setValueM3"); -function setValueM4(gl, v) { - const cache = this.cache; - const elements = v.elements; - if (elements === void 0) { - if (arraysEqual(cache, v)) return; - gl.uniformMatrix4fv(this.addr, false, v); - copyArray(cache, v); - } else { - if (arraysEqual(cache, elements)) return; - mat4array.set(elements); - gl.uniformMatrix4fv(this.addr, false, mat4array); - copyArray(cache, elements); - } -} -__name(setValueM4, "setValueM4"); -function setValueV1i(gl, v) { - const cache = this.cache; - if (cache[0] === v) return; - gl.uniform1i(this.addr, v); - cache[0] = v; -} -__name(setValueV1i, "setValueV1i"); -function setValueV2i(gl, v) { - const cache = this.cache; - if (v.x !== void 0) { - if (cache[0] !== v.x || cache[1] !== v.y) { - gl.uniform2i(this.addr, v.x, v.y); - cache[0] = v.x; - cache[1] = v.y; - } - } else { - if (arraysEqual(cache, v)) return; - gl.uniform2iv(this.addr, v); - copyArray(cache, v); + addVectors(a, b) { + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + return this; } -} -__name(setValueV2i, "setValueV2i"); -function setValueV3i(gl, v) { - const cache = this.cache; - if (v.x !== void 0) { - if (cache[0] !== v.x || cache[1] !== v.y || cache[2] !== v.z) { - gl.uniform3i(this.addr, v.x, v.y, v.z); - cache[0] = v.x; - cache[1] = v.y; - cache[2] = v.z; - } - } else { - if (arraysEqual(cache, v)) return; - gl.uniform3iv(this.addr, v); - copyArray(cache, v); + addScaledVector(v, s) { + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + return this; } -} -__name(setValueV3i, "setValueV3i"); -function setValueV4i(gl, v) { - const cache = this.cache; - if (v.x !== void 0) { - if (cache[0] !== v.x || cache[1] !== v.y || cache[2] !== v.z || cache[3] !== v.w) { - gl.uniform4i(this.addr, v.x, v.y, v.z, v.w); - cache[0] = v.x; - cache[1] = v.y; - cache[2] = v.z; - cache[3] = v.w; - } - } else { - if (arraysEqual(cache, v)) return; - gl.uniform4iv(this.addr, v); - copyArray(cache, v); + sub(v) { + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + return this; } -} -__name(setValueV4i, "setValueV4i"); -function setValueV1ui(gl, v) { - const cache = this.cache; - if (cache[0] === v) return; - gl.uniform1ui(this.addr, v); - cache[0] = v; -} -__name(setValueV1ui, "setValueV1ui"); -function setValueV2ui(gl, v) { - const cache = this.cache; - if (v.x !== void 0) { - if (cache[0] !== v.x || cache[1] !== v.y) { - gl.uniform2ui(this.addr, v.x, v.y); - cache[0] = v.x; - cache[1] = v.y; - } - } else { - if (arraysEqual(cache, v)) return; - gl.uniform2uiv(this.addr, v); - copyArray(cache, v); + subScalar(s) { + this.x -= s; + this.y -= s; + this.z -= s; + return this; } -} -__name(setValueV2ui, "setValueV2ui"); -function setValueV3ui(gl, v) { - const cache = this.cache; - if (v.x !== void 0) { - if (cache[0] !== v.x || cache[1] !== v.y || cache[2] !== v.z) { - gl.uniform3ui(this.addr, v.x, v.y, v.z); - cache[0] = v.x; - cache[1] = v.y; - cache[2] = v.z; - } - } else { - if (arraysEqual(cache, v)) return; - gl.uniform3uiv(this.addr, v); - copyArray(cache, v); + subVectors(a, b) { + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + return this; } -} -__name(setValueV3ui, "setValueV3ui"); -function setValueV4ui(gl, v) { - const cache = this.cache; - if (v.x !== void 0) { - if (cache[0] !== v.x || cache[1] !== v.y || cache[2] !== v.z || cache[3] !== v.w) { - gl.uniform4ui(this.addr, v.x, v.y, v.z, v.w); - cache[0] = v.x; - cache[1] = v.y; - cache[2] = v.z; - cache[3] = v.w; - } - } else { - if (arraysEqual(cache, v)) return; - gl.uniform4uiv(this.addr, v); - copyArray(cache, v); + multiply(v) { + this.x *= v.x; + this.y *= v.y; + this.z *= v.z; + return this; } -} -__name(setValueV4ui, "setValueV4ui"); -function setValueT1(gl, v, textures) { - const cache = this.cache; - const unit = textures.allocateTextureUnit(); - if (cache[0] !== unit) { - gl.uniform1i(this.addr, unit); - cache[0] = unit; + multiplyScalar(scalar) { + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + return this; } - let emptyTexture2D; - if (this.type === gl.SAMPLER_2D_SHADOW) { - emptyShadowTexture.compareFunction = LessEqualCompare; - emptyTexture2D = emptyShadowTexture; - } else { - emptyTexture2D = emptyTexture; + multiplyVectors(a, b) { + this.x = a.x * b.x; + this.y = a.y * b.y; + this.z = a.z * b.z; + return this; } - textures.setTexture2D(v || emptyTexture2D, unit); -} -__name(setValueT1, "setValueT1"); -function setValueT3D1(gl, v, textures) { - const cache = this.cache; - const unit = textures.allocateTextureUnit(); - if (cache[0] !== unit) { - gl.uniform1i(this.addr, unit); - cache[0] = unit; + applyEuler(euler) { + return this.applyQuaternion(_quaternion$4.setFromEuler(euler)); } - textures.setTexture3D(v || empty3dTexture, unit); -} -__name(setValueT3D1, "setValueT3D1"); -function setValueT6(gl, v, textures) { - const cache = this.cache; - const unit = textures.allocateTextureUnit(); - if (cache[0] !== unit) { - gl.uniform1i(this.addr, unit); - cache[0] = unit; + applyAxisAngle(axis, angle) { + return this.applyQuaternion(_quaternion$4.setFromAxisAngle(axis, angle)); } - textures.setTextureCube(v || emptyCubeTexture, unit); -} -__name(setValueT6, "setValueT6"); -function setValueT2DArray1(gl, v, textures) { - const cache = this.cache; - const unit = textures.allocateTextureUnit(); - if (cache[0] !== unit) { - gl.uniform1i(this.addr, unit); - cache[0] = unit; + applyMatrix3(m) { + const x = this.x, y = this.y, z = this.z; + const e = m.elements; + this.x = e[0] * x + e[3] * y + e[6] * z; + this.y = e[1] * x + e[4] * y + e[7] * z; + this.z = e[2] * x + e[5] * y + e[8] * z; + return this; } - textures.setTexture2DArray(v || emptyArrayTexture, unit); -} -__name(setValueT2DArray1, "setValueT2DArray1"); -function getSingularSetter(type) { - switch (type) { - case 5126: - return setValueV1f; - case 35664: - return setValueV2f; - case 35665: - return setValueV3f; - case 35666: - return setValueV4f; - case 35674: - return setValueM2; - case 35675: - return setValueM3; - case 35676: - return setValueM4; - case 5124: - case 35670: - return setValueV1i; - case 35667: - case 35671: - return setValueV2i; - case 35668: - case 35672: - return setValueV3i; - case 35669: - case 35673: - return setValueV4i; - case 5125: - return setValueV1ui; - case 36294: - return setValueV2ui; - case 36295: - return setValueV3ui; - case 36296: - return setValueV4ui; - case 35678: - case 36198: - case 36298: - case 36306: - case 35682: - return setValueT1; - case 35679: - case 36299: - case 36307: - return setValueT3D1; - case 35680: - case 36300: - case 36308: - case 36293: - return setValueT6; - case 36289: - case 36303: - case 36311: - case 36292: - return setValueT2DArray1; + applyNormalMatrix(m) { + return this.applyMatrix3(m).normalize(); } -} -__name(getSingularSetter, "getSingularSetter"); -function setValueV1fArray(gl, v) { - gl.uniform1fv(this.addr, v); -} -__name(setValueV1fArray, "setValueV1fArray"); -function setValueV2fArray(gl, v) { - const data = flatten(v, this.size, 2); - gl.uniform2fv(this.addr, data); -} -__name(setValueV2fArray, "setValueV2fArray"); -function setValueV3fArray(gl, v) { - const data = flatten(v, this.size, 3); - gl.uniform3fv(this.addr, data); -} -__name(setValueV3fArray, "setValueV3fArray"); -function setValueV4fArray(gl, v) { - const data = flatten(v, this.size, 4); - gl.uniform4fv(this.addr, data); -} -__name(setValueV4fArray, "setValueV4fArray"); -function setValueM2Array(gl, v) { - const data = flatten(v, this.size, 4); - gl.uniformMatrix2fv(this.addr, false, data); -} -__name(setValueM2Array, "setValueM2Array"); -function setValueM3Array(gl, v) { - const data = flatten(v, this.size, 9); - gl.uniformMatrix3fv(this.addr, false, data); -} -__name(setValueM3Array, "setValueM3Array"); -function setValueM4Array(gl, v) { - const data = flatten(v, this.size, 16); - gl.uniformMatrix4fv(this.addr, false, data); -} -__name(setValueM4Array, "setValueM4Array"); -function setValueV1iArray(gl, v) { - gl.uniform1iv(this.addr, v); -} -__name(setValueV1iArray, "setValueV1iArray"); -function setValueV2iArray(gl, v) { - gl.uniform2iv(this.addr, v); -} -__name(setValueV2iArray, "setValueV2iArray"); -function setValueV3iArray(gl, v) { - gl.uniform3iv(this.addr, v); -} -__name(setValueV3iArray, "setValueV3iArray"); -function setValueV4iArray(gl, v) { - gl.uniform4iv(this.addr, v); -} -__name(setValueV4iArray, "setValueV4iArray"); -function setValueV1uiArray(gl, v) { - gl.uniform1uiv(this.addr, v); -} -__name(setValueV1uiArray, "setValueV1uiArray"); -function setValueV2uiArray(gl, v) { - gl.uniform2uiv(this.addr, v); -} -__name(setValueV2uiArray, "setValueV2uiArray"); -function setValueV3uiArray(gl, v) { - gl.uniform3uiv(this.addr, v); -} -__name(setValueV3uiArray, "setValueV3uiArray"); -function setValueV4uiArray(gl, v) { - gl.uniform4uiv(this.addr, v); -} -__name(setValueV4uiArray, "setValueV4uiArray"); -function setValueT1Array(gl, v, textures) { - const cache = this.cache; - const n = v.length; - const units = allocTexUnits(textures, n); - if (!arraysEqual(cache, units)) { - gl.uniform1iv(this.addr, units); - copyArray(cache, units); + applyMatrix4(m) { + const x = this.x, y = this.y, z = this.z; + const e = m.elements; + const w = 1 / (e[3] * x + e[7] * y + e[11] * z + e[15]); + this.x = (e[0] * x + e[4] * y + e[8] * z + e[12]) * w; + this.y = (e[1] * x + e[5] * y + e[9] * z + e[13]) * w; + this.z = (e[2] * x + e[6] * y + e[10] * z + e[14]) * w; + return this; } - for (let i = 0; i !== n; ++i) { - textures.setTexture2D(v[i] || emptyTexture, units[i]); + applyQuaternion(q) { + const vx = this.x, vy = this.y, vz = this.z; + const qx = q.x, qy = q.y, qz = q.z, qw = q.w; + const tx = 2 * (qy * vz - qz * vy); + const ty = 2 * (qz * vx - qx * vz); + const tz = 2 * (qx * vy - qy * vx); + this.x = vx + qw * tx + qy * tz - qz * ty; + this.y = vy + qw * ty + qz * tx - qx * tz; + this.z = vz + qw * tz + qx * ty - qy * tx; + return this; } -} -__name(setValueT1Array, "setValueT1Array"); -function setValueT3DArray(gl, v, textures) { - const cache = this.cache; - const n = v.length; - const units = allocTexUnits(textures, n); - if (!arraysEqual(cache, units)) { - gl.uniform1iv(this.addr, units); - copyArray(cache, units); + project(camera) { + return this.applyMatrix4(camera.matrixWorldInverse).applyMatrix4(camera.projectionMatrix); } - for (let i = 0; i !== n; ++i) { - textures.setTexture3D(v[i] || empty3dTexture, units[i]); + unproject(camera) { + return this.applyMatrix4(camera.projectionMatrixInverse).applyMatrix4(camera.matrixWorld); } -} -__name(setValueT3DArray, "setValueT3DArray"); -function setValueT6Array(gl, v, textures) { - const cache = this.cache; - const n = v.length; - const units = allocTexUnits(textures, n); - if (!arraysEqual(cache, units)) { - gl.uniform1iv(this.addr, units); - copyArray(cache, units); + transformDirection(m) { + const x = this.x, y = this.y, z = this.z; + const e = m.elements; + this.x = e[0] * x + e[4] * y + e[8] * z; + this.y = e[1] * x + e[5] * y + e[9] * z; + this.z = e[2] * x + e[6] * y + e[10] * z; + return this.normalize(); } - for (let i = 0; i !== n; ++i) { - textures.setTextureCube(v[i] || emptyCubeTexture, units[i]); + divide(v) { + this.x /= v.x; + this.y /= v.y; + this.z /= v.z; + return this; } -} -__name(setValueT6Array, "setValueT6Array"); -function setValueT2DArrayArray(gl, v, textures) { - const cache = this.cache; - const n = v.length; - const units = allocTexUnits(textures, n); - if (!arraysEqual(cache, units)) { - gl.uniform1iv(this.addr, units); - copyArray(cache, units); + divideScalar(scalar) { + return this.multiplyScalar(1 / scalar); } - for (let i = 0; i !== n; ++i) { - textures.setTexture2DArray(v[i] || emptyArrayTexture, units[i]); + min(v) { + this.x = Math.min(this.x, v.x); + this.y = Math.min(this.y, v.y); + this.z = Math.min(this.z, v.z); + return this; } -} -__name(setValueT2DArrayArray, "setValueT2DArrayArray"); -function getPureArraySetter(type) { - switch (type) { - case 5126: - return setValueV1fArray; - case 35664: - return setValueV2fArray; - case 35665: - return setValueV3fArray; - case 35666: - return setValueV4fArray; - case 35674: - return setValueM2Array; - case 35675: - return setValueM3Array; - case 35676: - return setValueM4Array; - case 5124: - case 35670: - return setValueV1iArray; - case 35667: - case 35671: - return setValueV2iArray; - case 35668: - case 35672: - return setValueV3iArray; - case 35669: - case 35673: - return setValueV4iArray; - case 5125: - return setValueV1uiArray; - case 36294: - return setValueV2uiArray; - case 36295: - return setValueV3uiArray; - case 36296: - return setValueV4uiArray; - case 35678: - case 36198: - case 36298: - case 36306: - case 35682: - return setValueT1Array; - case 35679: - case 36299: - case 36307: - return setValueT3DArray; - case 35680: - case 36300: - case 36308: - case 36293: - return setValueT6Array; - case 36289: - case 36303: - case 36311: - case 36292: - return setValueT2DArrayArray; + max(v) { + this.x = Math.max(this.x, v.x); + this.y = Math.max(this.y, v.y); + this.z = Math.max(this.z, v.z); + return this; } -} -__name(getPureArraySetter, "getPureArraySetter"); -class SingleUniform { - static { - __name(this, "SingleUniform"); + clamp(min, max2) { + this.x = Math.max(min.x, Math.min(max2.x, this.x)); + this.y = Math.max(min.y, Math.min(max2.y, this.y)); + this.z = Math.max(min.z, Math.min(max2.z, this.z)); + return this; } - constructor(id2, activeInfo, addr) { - this.id = id2; - this.addr = addr; - this.cache = []; - this.type = activeInfo.type; - this.setValue = getSingularSetter(activeInfo.type); + clampScalar(minVal, maxVal) { + this.x = Math.max(minVal, Math.min(maxVal, this.x)); + this.y = Math.max(minVal, Math.min(maxVal, this.y)); + this.z = Math.max(minVal, Math.min(maxVal, this.z)); + return this; } -} -class PureArrayUniform { - static { - __name(this, "PureArrayUniform"); + clampLength(min, max2) { + const length = this.length(); + return this.divideScalar(length || 1).multiplyScalar(Math.max(min, Math.min(max2, length))); } - constructor(id2, activeInfo, addr) { - this.id = id2; - this.addr = addr; - this.cache = []; - this.type = activeInfo.type; - this.size = activeInfo.size; - this.setValue = getPureArraySetter(activeInfo.type); + floor() { + this.x = Math.floor(this.x); + this.y = Math.floor(this.y); + this.z = Math.floor(this.z); + return this; } -} -class StructuredUniform { - static { - __name(this, "StructuredUniform"); + ceil() { + this.x = Math.ceil(this.x); + this.y = Math.ceil(this.y); + this.z = Math.ceil(this.z); + return this; } - constructor(id2) { - this.id = id2; - this.seq = []; - this.map = {}; + round() { + this.x = Math.round(this.x); + this.y = Math.round(this.y); + this.z = Math.round(this.z); + return this; } - setValue(gl, value, textures) { - const seq = this.seq; - for (let i = 0, n = seq.length; i !== n; ++i) { - const u = seq[i]; - u.setValue(gl, value[u.id], textures); - } + roundToZero() { + this.x = Math.trunc(this.x); + this.y = Math.trunc(this.y); + this.z = Math.trunc(this.z); + return this; } -} -const RePathPart = /(\w+)(\])?(\[|\.)?/g; -function addUniform(container, uniformObject) { - container.seq.push(uniformObject); - container.map[uniformObject.id] = uniformObject; -} -__name(addUniform, "addUniform"); -function parseUniform(activeInfo, addr, container) { - const path = activeInfo.name, pathLength = path.length; - RePathPart.lastIndex = 0; - while (true) { - const match = RePathPart.exec(path), matchEnd = RePathPart.lastIndex; - let id2 = match[1]; - const idIsIndex = match[2] === "]", subscript = match[3]; - if (idIsIndex) id2 = id2 | 0; - if (subscript === void 0 || subscript === "[" && matchEnd + 2 === pathLength) { - addUniform(container, subscript === void 0 ? new SingleUniform(id2, activeInfo, addr) : new PureArrayUniform(id2, activeInfo, addr)); - break; - } else { - const map = container.map; - let next = map[id2]; - if (next === void 0) { - next = new StructuredUniform(id2); - addUniform(container, next); - } - container = next; - } + negate() { + this.x = -this.x; + this.y = -this.y; + this.z = -this.z; + return this; } -} -__name(parseUniform, "parseUniform"); -class WebGLUniforms { - static { - __name(this, "WebGLUniforms"); + dot(v) { + return this.x * v.x + this.y * v.y + this.z * v.z; } - constructor(gl, program) { - this.seq = []; - this.map = {}; - const n = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS); - for (let i = 0; i < n; ++i) { - const info = gl.getActiveUniform(program, i), addr = gl.getUniformLocation(program, info.name); - parseUniform(info, addr, this); - } + // TODO lengthSquared? + lengthSq() { + return this.x * this.x + this.y * this.y + this.z * this.z; } - setValue(gl, name, value, textures) { - const u = this.map[name]; - if (u !== void 0) u.setValue(gl, value, textures); + length() { + return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z); } - setOptional(gl, object, name) { - const v = object[name]; - if (v !== void 0) this.setValue(gl, name, v); + manhattanLength() { + return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z); } - static upload(gl, seq, values, textures) { - for (let i = 0, n = seq.length; i !== n; ++i) { - const u = seq[i], v = values[u.id]; - if (v.needsUpdate !== false) { - u.setValue(gl, v.value, textures); - } - } + normalize() { + return this.divideScalar(this.length() || 1); } - static seqWithValue(seq, values) { - const r = []; - for (let i = 0, n = seq.length; i !== n; ++i) { - const u = seq[i]; - if (u.id in values) r.push(u); - } - return r; + setLength(length) { + return this.normalize().multiplyScalar(length); } -} -function WebGLShader(gl, type, string) { - const shader = gl.createShader(type); - gl.shaderSource(shader, string); - gl.compileShader(shader); - return shader; -} -__name(WebGLShader, "WebGLShader"); -const COMPLETION_STATUS_KHR = 37297; -let programIdCount = 0; -function handleSource(string, errorLine) { - const lines = string.split("\n"); - const lines2 = []; - const from = Math.max(errorLine - 6, 0); - const to = Math.min(errorLine + 6, lines.length); - for (let i = from; i < to; i++) { - const line = i + 1; - lines2.push(`${line === errorLine ? ">" : " "} ${line}: ${lines[i]}`); + lerp(v, alpha) { + this.x += (v.x - this.x) * alpha; + this.y += (v.y - this.y) * alpha; + this.z += (v.z - this.z) * alpha; + return this; } - return lines2.join("\n"); -} -__name(handleSource, "handleSource"); -const _m0 = /* @__PURE__ */ new Matrix3(); -function getEncodingComponents(colorSpace) { - ColorManagement._getMatrix(_m0, ColorManagement.workingColorSpace, colorSpace); - const encodingMatrix = `mat3( ${_m0.elements.map((v) => v.toFixed(4))} )`; - switch (ColorManagement.getTransfer(colorSpace)) { - case LinearTransfer: - return [encodingMatrix, "LinearTransferOETF"]; - case SRGBTransfer: - return [encodingMatrix, "sRGBTransferOETF"]; - default: - console.warn("THREE.WebGLProgram: Unsupported color space: ", colorSpace); - return [encodingMatrix, "LinearTransferOETF"]; + lerpVectors(v1, v2, alpha) { + this.x = v1.x + (v2.x - v1.x) * alpha; + this.y = v1.y + (v2.y - v1.y) * alpha; + this.z = v1.z + (v2.z - v1.z) * alpha; + return this; } -} -__name(getEncodingComponents, "getEncodingComponents"); -function getShaderErrors(gl, shader, type) { - const status = gl.getShaderParameter(shader, gl.COMPILE_STATUS); - const errors = gl.getShaderInfoLog(shader).trim(); - if (status && errors === "") return ""; - const errorMatches = /ERROR: 0:(\d+)/.exec(errors); - if (errorMatches) { - const errorLine = parseInt(errorMatches[1]); - return type.toUpperCase() + "\n\n" + errors + "\n\n" + handleSource(gl.getShaderSource(shader), errorLine); - } else { - return errors; + cross(v) { + return this.crossVectors(this, v); } -} -__name(getShaderErrors, "getShaderErrors"); -function getTexelEncodingFunction(functionName, colorSpace) { - const components = getEncodingComponents(colorSpace); - return [ - `vec4 ${functionName}( vec4 value ) {`, - ` return ${components[1]}( vec4( value.rgb * ${components[0]}, value.a ) );`, - "}" - ].join("\n"); -} -__name(getTexelEncodingFunction, "getTexelEncodingFunction"); -function getToneMappingFunction(functionName, toneMapping) { - let toneMappingName; - switch (toneMapping) { - case LinearToneMapping: - toneMappingName = "Linear"; - break; - case ReinhardToneMapping: - toneMappingName = "Reinhard"; - break; - case CineonToneMapping: - toneMappingName = "Cineon"; - break; - case ACESFilmicToneMapping: - toneMappingName = "ACESFilmic"; - break; - case AgXToneMapping: - toneMappingName = "AgX"; - break; - case NeutralToneMapping: - toneMappingName = "Neutral"; - break; - case CustomToneMapping: - toneMappingName = "Custom"; - break; - default: - console.warn("THREE.WebGLProgram: Unsupported toneMapping:", toneMapping); - toneMappingName = "Linear"; + crossVectors(a, b) { + const ax = a.x, ay = a.y, az = a.z; + const bx = b.x, by = b.y, bz = b.z; + this.x = ay * bz - az * by; + this.y = az * bx - ax * bz; + this.z = ax * by - ay * bx; + return this; } - return "vec3 " + functionName + "( vec3 color ) { return " + toneMappingName + "ToneMapping( color ); }"; -} -__name(getToneMappingFunction, "getToneMappingFunction"); -const _v0$1 = /* @__PURE__ */ new Vector3(); -function getLuminanceFunction() { - ColorManagement.getLuminanceCoefficients(_v0$1); - const r = _v0$1.x.toFixed(4); - const g = _v0$1.y.toFixed(4); - const b = _v0$1.z.toFixed(4); - return [ - "float luminance( const in vec3 rgb ) {", - ` const vec3 weights = vec3( ${r}, ${g}, ${b} );`, - " return dot( weights, rgb );", - "}" - ].join("\n"); -} -__name(getLuminanceFunction, "getLuminanceFunction"); -function generateVertexExtensions(parameters) { - const chunks = [ - parameters.extensionClipCullDistance ? "#extension GL_ANGLE_clip_cull_distance : require" : "", - parameters.extensionMultiDraw ? "#extension GL_ANGLE_multi_draw : require" : "" - ]; - return chunks.filter(filterEmptyLine).join("\n"); -} -__name(generateVertexExtensions, "generateVertexExtensions"); -function generateDefines(defines) { - const chunks = []; - for (const name in defines) { - const value = defines[name]; - if (value === false) continue; - chunks.push("#define " + name + " " + value); + projectOnVector(v) { + const denominator = v.lengthSq(); + if (denominator === 0) return this.set(0, 0, 0); + const scalar = v.dot(this) / denominator; + return this.copy(v).multiplyScalar(scalar); } - return chunks.join("\n"); -} -__name(generateDefines, "generateDefines"); -function fetchAttributeLocations(gl, program) { - const attributes = {}; - const n = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES); - for (let i = 0; i < n; i++) { - const info = gl.getActiveAttrib(program, i); - const name = info.name; - let locationSize = 1; - if (info.type === gl.FLOAT_MAT2) locationSize = 2; - if (info.type === gl.FLOAT_MAT3) locationSize = 3; - if (info.type === gl.FLOAT_MAT4) locationSize = 4; - attributes[name] = { - type: info.type, - location: gl.getAttribLocation(program, name), - locationSize - }; + projectOnPlane(planeNormal) { + _vector$c.copy(this).projectOnVector(planeNormal); + return this.sub(_vector$c); } - return attributes; -} -__name(fetchAttributeLocations, "fetchAttributeLocations"); -function filterEmptyLine(string) { - return string !== ""; -} -__name(filterEmptyLine, "filterEmptyLine"); -function replaceLightNums(string, parameters) { - const numSpotLightCoords = parameters.numSpotLightShadows + parameters.numSpotLightMaps - parameters.numSpotLightShadowsWithMaps; - return string.replace(/NUM_DIR_LIGHTS/g, parameters.numDirLights).replace(/NUM_SPOT_LIGHTS/g, parameters.numSpotLights).replace(/NUM_SPOT_LIGHT_MAPS/g, parameters.numSpotLightMaps).replace(/NUM_SPOT_LIGHT_COORDS/g, numSpotLightCoords).replace(/NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g, parameters.numPointLights).replace(/NUM_HEMI_LIGHTS/g, parameters.numHemiLights).replace(/NUM_DIR_LIGHT_SHADOWS/g, parameters.numDirLightShadows).replace(/NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g, parameters.numSpotLightShadowsWithMaps).replace(/NUM_SPOT_LIGHT_SHADOWS/g, parameters.numSpotLightShadows).replace(/NUM_POINT_LIGHT_SHADOWS/g, parameters.numPointLightShadows); -} -__name(replaceLightNums, "replaceLightNums"); -function replaceClippingPlaneNums(string, parameters) { - return string.replace(/NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g, parameters.numClippingPlanes - parameters.numClipIntersection); -} -__name(replaceClippingPlaneNums, "replaceClippingPlaneNums"); -const includePattern = /^[ \t]*#include +<([\w\d./]+)>/gm; -function resolveIncludes(string) { - return string.replace(includePattern, includeReplacer); -} -__name(resolveIncludes, "resolveIncludes"); -const shaderChunkMap = /* @__PURE__ */ new Map(); -function includeReplacer(match, include) { - let string = ShaderChunk[include]; - if (string === void 0) { - const newInclude = shaderChunkMap.get(include); - if (newInclude !== void 0) { - string = ShaderChunk[newInclude]; - console.warn('THREE.WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.', include, newInclude); - } else { - throw new Error("Can not resolve #include <" + include + ">"); - } + reflect(normal) { + return this.sub(_vector$c.copy(normal).multiplyScalar(2 * this.dot(normal))); } - return resolveIncludes(string); -} -__name(includeReplacer, "includeReplacer"); -const 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; -function unrollLoops(string) { - return string.replace(unrollLoopPattern, loopReplacer); -} -__name(unrollLoops, "unrollLoops"); -function loopReplacer(match, start, end, snippet) { - let string = ""; - for (let i = parseInt(start); i < parseInt(end); i++) { - string += snippet.replace(/\[\s*i\s*\]/g, "[ " + i + " ]").replace(/UNROLLED_LOOP_INDEX/g, i); + angleTo(v) { + const denominator = Math.sqrt(this.lengthSq() * v.lengthSq()); + if (denominator === 0) return Math.PI / 2; + const theta = this.dot(v) / denominator; + return Math.acos(clamp(theta, -1, 1)); + } + distanceTo(v) { + return Math.sqrt(this.distanceToSquared(v)); + } + distanceToSquared(v) { + const dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z; + return dx * dx + dy * dy + dz * dz; + } + manhattanDistanceTo(v) { + return Math.abs(this.x - v.x) + Math.abs(this.y - v.y) + Math.abs(this.z - v.z); + } + setFromSpherical(s) { + return this.setFromSphericalCoords(s.radius, s.phi, s.theta); + } + setFromSphericalCoords(radius, phi, theta) { + const sinPhiRadius = Math.sin(phi) * radius; + this.x = sinPhiRadius * Math.sin(theta); + this.y = Math.cos(phi) * radius; + this.z = sinPhiRadius * Math.cos(theta); + return this; } - return string; -} -__name(loopReplacer, "loopReplacer"); -function generatePrecision(parameters) { - let precisionstring = `precision ${parameters.precision} float; - precision ${parameters.precision} int; - precision ${parameters.precision} sampler2D; - precision ${parameters.precision} samplerCube; - precision ${parameters.precision} sampler3D; - precision ${parameters.precision} sampler2DArray; - precision ${parameters.precision} sampler2DShadow; - precision ${parameters.precision} samplerCubeShadow; - precision ${parameters.precision} sampler2DArrayShadow; - precision ${parameters.precision} isampler2D; - precision ${parameters.precision} isampler3D; - precision ${parameters.precision} isamplerCube; - precision ${parameters.precision} isampler2DArray; - precision ${parameters.precision} usampler2D; - precision ${parameters.precision} usampler3D; - precision ${parameters.precision} usamplerCube; - precision ${parameters.precision} usampler2DArray; - `; - if (parameters.precision === "highp") { - precisionstring += "\n#define HIGH_PRECISION"; - } else if (parameters.precision === "mediump") { - precisionstring += "\n#define MEDIUM_PRECISION"; - } else if (parameters.precision === "lowp") { - precisionstring += "\n#define LOW_PRECISION"; + setFromCylindrical(c) { + return this.setFromCylindricalCoords(c.radius, c.theta, c.y); } - return precisionstring; -} -__name(generatePrecision, "generatePrecision"); -function generateShadowMapTypeDefine(parameters) { - let shadowMapTypeDefine = "SHADOWMAP_TYPE_BASIC"; - if (parameters.shadowMapType === PCFShadowMap) { - shadowMapTypeDefine = "SHADOWMAP_TYPE_PCF"; - } else if (parameters.shadowMapType === PCFSoftShadowMap) { - shadowMapTypeDefine = "SHADOWMAP_TYPE_PCF_SOFT"; - } else if (parameters.shadowMapType === VSMShadowMap) { - shadowMapTypeDefine = "SHADOWMAP_TYPE_VSM"; + setFromCylindricalCoords(radius, theta, y) { + this.x = radius * Math.sin(theta); + this.y = y; + this.z = radius * Math.cos(theta); + return this; } - return shadowMapTypeDefine; -} -__name(generateShadowMapTypeDefine, "generateShadowMapTypeDefine"); -function generateEnvMapTypeDefine(parameters) { - let envMapTypeDefine = "ENVMAP_TYPE_CUBE"; - if (parameters.envMap) { - switch (parameters.envMapMode) { - case CubeReflectionMapping: - case CubeRefractionMapping: - envMapTypeDefine = "ENVMAP_TYPE_CUBE"; - break; - case CubeUVReflectionMapping: - envMapTypeDefine = "ENVMAP_TYPE_CUBE_UV"; - break; - } + setFromMatrixPosition(m) { + const e = m.elements; + this.x = e[12]; + this.y = e[13]; + this.z = e[14]; + return this; } - return envMapTypeDefine; -} -__name(generateEnvMapTypeDefine, "generateEnvMapTypeDefine"); -function generateEnvMapModeDefine(parameters) { - let envMapModeDefine = "ENVMAP_MODE_REFLECTION"; - if (parameters.envMap) { - switch (parameters.envMapMode) { - case CubeRefractionMapping: - envMapModeDefine = "ENVMAP_MODE_REFRACTION"; - break; - } + setFromMatrixScale(m) { + const sx = this.setFromMatrixColumn(m, 0).length(); + const sy = this.setFromMatrixColumn(m, 1).length(); + const sz = this.setFromMatrixColumn(m, 2).length(); + this.x = sx; + this.y = sy; + this.z = sz; + return this; } - return envMapModeDefine; -} -__name(generateEnvMapModeDefine, "generateEnvMapModeDefine"); -function generateEnvMapBlendingDefine(parameters) { - let envMapBlendingDefine = "ENVMAP_BLENDING_NONE"; - if (parameters.envMap) { - switch (parameters.combine) { - case MultiplyOperation: - envMapBlendingDefine = "ENVMAP_BLENDING_MULTIPLY"; - break; - case MixOperation: - envMapBlendingDefine = "ENVMAP_BLENDING_MIX"; - break; - case AddOperation: - envMapBlendingDefine = "ENVMAP_BLENDING_ADD"; - break; - } + setFromMatrixColumn(m, index) { + return this.fromArray(m.elements, index * 4); } - return envMapBlendingDefine; -} -__name(generateEnvMapBlendingDefine, "generateEnvMapBlendingDefine"); -function generateCubeUVSize(parameters) { - const imageHeight = parameters.envMapCubeUVHeight; - if (imageHeight === null) return null; - const maxMip = Math.log2(imageHeight) - 2; - const texelHeight = 1 / imageHeight; - const texelWidth = 1 / (3 * Math.max(Math.pow(2, maxMip), 7 * 16)); - return { texelWidth, texelHeight, maxMip }; -} -__name(generateCubeUVSize, "generateCubeUVSize"); -function WebGLProgram(renderer, cacheKey, parameters, bindingStates) { - const gl = renderer.getContext(); - const defines = parameters.defines; - let vertexShader = parameters.vertexShader; - let fragmentShader = parameters.fragmentShader; - const shadowMapTypeDefine = generateShadowMapTypeDefine(parameters); - const envMapTypeDefine = generateEnvMapTypeDefine(parameters); - const envMapModeDefine = generateEnvMapModeDefine(parameters); - const envMapBlendingDefine = generateEnvMapBlendingDefine(parameters); - const envMapCubeUVSize = generateCubeUVSize(parameters); - const customVertexExtensions = generateVertexExtensions(parameters); - const customDefines = generateDefines(defines); - const program = gl.createProgram(); - let prefixVertex, prefixFragment; - let versionString = parameters.glslVersion ? "#version " + parameters.glslVersion + "\n" : ""; - if (parameters.isRawShaderMaterial) { - prefixVertex = [ - "#define SHADER_TYPE " + parameters.shaderType, - "#define SHADER_NAME " + parameters.shaderName, - customDefines - ].filter(filterEmptyLine).join("\n"); - if (prefixVertex.length > 0) { - prefixVertex += "\n"; - } - prefixFragment = [ - "#define SHADER_TYPE " + parameters.shaderType, - "#define SHADER_NAME " + parameters.shaderName, - customDefines - ].filter(filterEmptyLine).join("\n"); - if (prefixFragment.length > 0) { - prefixFragment += "\n"; - } - } else { - prefixVertex = [ - generatePrecision(parameters), - "#define SHADER_TYPE " + parameters.shaderType, - "#define SHADER_NAME " + parameters.shaderName, - customDefines, - parameters.extensionClipCullDistance ? "#define USE_CLIP_DISTANCE" : "", - parameters.batching ? "#define USE_BATCHING" : "", - parameters.batchingColor ? "#define USE_BATCHING_COLOR" : "", - parameters.instancing ? "#define USE_INSTANCING" : "", - parameters.instancingColor ? "#define USE_INSTANCING_COLOR" : "", - parameters.instancingMorph ? "#define USE_INSTANCING_MORPH" : "", - parameters.useFog && parameters.fog ? "#define USE_FOG" : "", - parameters.useFog && parameters.fogExp2 ? "#define FOG_EXP2" : "", - parameters.map ? "#define USE_MAP" : "", - parameters.envMap ? "#define USE_ENVMAP" : "", - parameters.envMap ? "#define " + envMapModeDefine : "", - parameters.lightMap ? "#define USE_LIGHTMAP" : "", - parameters.aoMap ? "#define USE_AOMAP" : "", - parameters.bumpMap ? "#define USE_BUMPMAP" : "", - parameters.normalMap ? "#define USE_NORMALMAP" : "", - parameters.normalMapObjectSpace ? "#define USE_NORMALMAP_OBJECTSPACE" : "", - parameters.normalMapTangentSpace ? "#define USE_NORMALMAP_TANGENTSPACE" : "", - parameters.displacementMap ? "#define USE_DISPLACEMENTMAP" : "", - parameters.emissiveMap ? "#define USE_EMISSIVEMAP" : "", - parameters.anisotropy ? "#define USE_ANISOTROPY" : "", - parameters.anisotropyMap ? "#define USE_ANISOTROPYMAP" : "", - parameters.clearcoatMap ? "#define USE_CLEARCOATMAP" : "", - parameters.clearcoatRoughnessMap ? "#define USE_CLEARCOAT_ROUGHNESSMAP" : "", - parameters.clearcoatNormalMap ? "#define USE_CLEARCOAT_NORMALMAP" : "", - parameters.iridescenceMap ? "#define USE_IRIDESCENCEMAP" : "", - parameters.iridescenceThicknessMap ? "#define USE_IRIDESCENCE_THICKNESSMAP" : "", - parameters.specularMap ? "#define USE_SPECULARMAP" : "", - parameters.specularColorMap ? "#define USE_SPECULAR_COLORMAP" : "", - parameters.specularIntensityMap ? "#define USE_SPECULAR_INTENSITYMAP" : "", - parameters.roughnessMap ? "#define USE_ROUGHNESSMAP" : "", - parameters.metalnessMap ? "#define USE_METALNESSMAP" : "", - parameters.alphaMap ? "#define USE_ALPHAMAP" : "", - parameters.alphaHash ? "#define USE_ALPHAHASH" : "", - parameters.transmission ? "#define USE_TRANSMISSION" : "", - parameters.transmissionMap ? "#define USE_TRANSMISSIONMAP" : "", - parameters.thicknessMap ? "#define USE_THICKNESSMAP" : "", - parameters.sheenColorMap ? "#define USE_SHEEN_COLORMAP" : "", - parameters.sheenRoughnessMap ? "#define USE_SHEEN_ROUGHNESSMAP" : "", - // - parameters.mapUv ? "#define MAP_UV " + parameters.mapUv : "", - parameters.alphaMapUv ? "#define ALPHAMAP_UV " + parameters.alphaMapUv : "", - parameters.lightMapUv ? "#define LIGHTMAP_UV " + parameters.lightMapUv : "", - parameters.aoMapUv ? "#define AOMAP_UV " + parameters.aoMapUv : "", - parameters.emissiveMapUv ? "#define EMISSIVEMAP_UV " + parameters.emissiveMapUv : "", - parameters.bumpMapUv ? "#define BUMPMAP_UV " + parameters.bumpMapUv : "", - parameters.normalMapUv ? "#define NORMALMAP_UV " + parameters.normalMapUv : "", - parameters.displacementMapUv ? "#define DISPLACEMENTMAP_UV " + parameters.displacementMapUv : "", - parameters.metalnessMapUv ? "#define METALNESSMAP_UV " + parameters.metalnessMapUv : "", - parameters.roughnessMapUv ? "#define ROUGHNESSMAP_UV " + parameters.roughnessMapUv : "", - parameters.anisotropyMapUv ? "#define ANISOTROPYMAP_UV " + parameters.anisotropyMapUv : "", - parameters.clearcoatMapUv ? "#define CLEARCOATMAP_UV " + parameters.clearcoatMapUv : "", - parameters.clearcoatNormalMapUv ? "#define CLEARCOAT_NORMALMAP_UV " + parameters.clearcoatNormalMapUv : "", - parameters.clearcoatRoughnessMapUv ? "#define CLEARCOAT_ROUGHNESSMAP_UV " + parameters.clearcoatRoughnessMapUv : "", - parameters.iridescenceMapUv ? "#define IRIDESCENCEMAP_UV " + parameters.iridescenceMapUv : "", - parameters.iridescenceThicknessMapUv ? "#define IRIDESCENCE_THICKNESSMAP_UV " + parameters.iridescenceThicknessMapUv : "", - parameters.sheenColorMapUv ? "#define SHEEN_COLORMAP_UV " + parameters.sheenColorMapUv : "", - parameters.sheenRoughnessMapUv ? "#define SHEEN_ROUGHNESSMAP_UV " + parameters.sheenRoughnessMapUv : "", - parameters.specularMapUv ? "#define SPECULARMAP_UV " + parameters.specularMapUv : "", - parameters.specularColorMapUv ? "#define SPECULAR_COLORMAP_UV " + parameters.specularColorMapUv : "", - parameters.specularIntensityMapUv ? "#define SPECULAR_INTENSITYMAP_UV " + parameters.specularIntensityMapUv : "", - parameters.transmissionMapUv ? "#define TRANSMISSIONMAP_UV " + parameters.transmissionMapUv : "", - parameters.thicknessMapUv ? "#define THICKNESSMAP_UV " + parameters.thicknessMapUv : "", - // - parameters.vertexTangents && parameters.flatShading === false ? "#define USE_TANGENT" : "", - parameters.vertexColors ? "#define USE_COLOR" : "", - parameters.vertexAlphas ? "#define USE_COLOR_ALPHA" : "", - parameters.vertexUv1s ? "#define USE_UV1" : "", - parameters.vertexUv2s ? "#define USE_UV2" : "", - parameters.vertexUv3s ? "#define USE_UV3" : "", - parameters.pointsUvs ? "#define USE_POINTS_UV" : "", - parameters.flatShading ? "#define FLAT_SHADED" : "", - parameters.skinning ? "#define USE_SKINNING" : "", - parameters.morphTargets ? "#define USE_MORPHTARGETS" : "", - parameters.morphNormals && parameters.flatShading === false ? "#define USE_MORPHNORMALS" : "", - parameters.morphColors ? "#define USE_MORPHCOLORS" : "", - parameters.morphTargetsCount > 0 ? "#define MORPHTARGETS_TEXTURE_STRIDE " + parameters.morphTextureStride : "", - parameters.morphTargetsCount > 0 ? "#define MORPHTARGETS_COUNT " + parameters.morphTargetsCount : "", - parameters.doubleSided ? "#define DOUBLE_SIDED" : "", - parameters.flipSided ? "#define FLIP_SIDED" : "", - parameters.shadowMapEnabled ? "#define USE_SHADOWMAP" : "", - parameters.shadowMapEnabled ? "#define " + shadowMapTypeDefine : "", - parameters.sizeAttenuation ? "#define USE_SIZEATTENUATION" : "", - parameters.numLightProbes > 0 ? "#define USE_LIGHT_PROBES" : "", - parameters.logarithmicDepthBuffer ? "#define USE_LOGDEPTHBUF" : "", - parameters.reverseDepthBuffer ? "#define USE_REVERSEDEPTHBUF" : "", - "uniform mat4 modelMatrix;", - "uniform mat4 modelViewMatrix;", - "uniform mat4 projectionMatrix;", - "uniform mat4 viewMatrix;", - "uniform mat3 normalMatrix;", - "uniform vec3 cameraPosition;", - "uniform bool isOrthographic;", - "#ifdef USE_INSTANCING", - " attribute mat4 instanceMatrix;", - "#endif", - "#ifdef USE_INSTANCING_COLOR", - " attribute vec3 instanceColor;", - "#endif", - "#ifdef USE_INSTANCING_MORPH", - " uniform sampler2D morphTexture;", - "#endif", - "attribute vec3 position;", - "attribute vec3 normal;", - "attribute vec2 uv;", - "#ifdef USE_UV1", - " attribute vec2 uv1;", - "#endif", - "#ifdef USE_UV2", - " attribute vec2 uv2;", - "#endif", - "#ifdef USE_UV3", - " attribute vec2 uv3;", - "#endif", - "#ifdef USE_TANGENT", - " attribute vec4 tangent;", - "#endif", - "#if defined( USE_COLOR_ALPHA )", - " attribute vec4 color;", - "#elif defined( USE_COLOR )", - " attribute vec3 color;", - "#endif", - "#ifdef USE_SKINNING", - " attribute vec4 skinIndex;", - " attribute vec4 skinWeight;", - "#endif", - "\n" - ].filter(filterEmptyLine).join("\n"); - prefixFragment = [ - generatePrecision(parameters), - "#define SHADER_TYPE " + parameters.shaderType, - "#define SHADER_NAME " + parameters.shaderName, - customDefines, - parameters.useFog && parameters.fog ? "#define USE_FOG" : "", - parameters.useFog && parameters.fogExp2 ? "#define FOG_EXP2" : "", - parameters.alphaToCoverage ? "#define ALPHA_TO_COVERAGE" : "", - parameters.map ? "#define USE_MAP" : "", - parameters.matcap ? "#define USE_MATCAP" : "", - parameters.envMap ? "#define USE_ENVMAP" : "", - parameters.envMap ? "#define " + envMapTypeDefine : "", - parameters.envMap ? "#define " + envMapModeDefine : "", - parameters.envMap ? "#define " + envMapBlendingDefine : "", - envMapCubeUVSize ? "#define CUBEUV_TEXEL_WIDTH " + envMapCubeUVSize.texelWidth : "", - envMapCubeUVSize ? "#define CUBEUV_TEXEL_HEIGHT " + envMapCubeUVSize.texelHeight : "", - envMapCubeUVSize ? "#define CUBEUV_MAX_MIP " + envMapCubeUVSize.maxMip + ".0" : "", - parameters.lightMap ? "#define USE_LIGHTMAP" : "", - parameters.aoMap ? "#define USE_AOMAP" : "", - parameters.bumpMap ? "#define USE_BUMPMAP" : "", - parameters.normalMap ? "#define USE_NORMALMAP" : "", - parameters.normalMapObjectSpace ? "#define USE_NORMALMAP_OBJECTSPACE" : "", - parameters.normalMapTangentSpace ? "#define USE_NORMALMAP_TANGENTSPACE" : "", - parameters.emissiveMap ? "#define USE_EMISSIVEMAP" : "", - parameters.anisotropy ? "#define USE_ANISOTROPY" : "", - parameters.anisotropyMap ? "#define USE_ANISOTROPYMAP" : "", - parameters.clearcoat ? "#define USE_CLEARCOAT" : "", - parameters.clearcoatMap ? "#define USE_CLEARCOATMAP" : "", - parameters.clearcoatRoughnessMap ? "#define USE_CLEARCOAT_ROUGHNESSMAP" : "", - parameters.clearcoatNormalMap ? "#define USE_CLEARCOAT_NORMALMAP" : "", - parameters.dispersion ? "#define USE_DISPERSION" : "", - parameters.iridescence ? "#define USE_IRIDESCENCE" : "", - parameters.iridescenceMap ? "#define USE_IRIDESCENCEMAP" : "", - parameters.iridescenceThicknessMap ? "#define USE_IRIDESCENCE_THICKNESSMAP" : "", - parameters.specularMap ? "#define USE_SPECULARMAP" : "", - parameters.specularColorMap ? "#define USE_SPECULAR_COLORMAP" : "", - parameters.specularIntensityMap ? "#define USE_SPECULAR_INTENSITYMAP" : "", - parameters.roughnessMap ? "#define USE_ROUGHNESSMAP" : "", - parameters.metalnessMap ? "#define USE_METALNESSMAP" : "", - parameters.alphaMap ? "#define USE_ALPHAMAP" : "", - parameters.alphaTest ? "#define USE_ALPHATEST" : "", - parameters.alphaHash ? "#define USE_ALPHAHASH" : "", - parameters.sheen ? "#define USE_SHEEN" : "", - parameters.sheenColorMap ? "#define USE_SHEEN_COLORMAP" : "", - parameters.sheenRoughnessMap ? "#define USE_SHEEN_ROUGHNESSMAP" : "", - parameters.transmission ? "#define USE_TRANSMISSION" : "", - parameters.transmissionMap ? "#define USE_TRANSMISSIONMAP" : "", - parameters.thicknessMap ? "#define USE_THICKNESSMAP" : "", - parameters.vertexTangents && parameters.flatShading === false ? "#define USE_TANGENT" : "", - parameters.vertexColors || parameters.instancingColor || parameters.batchingColor ? "#define USE_COLOR" : "", - parameters.vertexAlphas ? "#define USE_COLOR_ALPHA" : "", - parameters.vertexUv1s ? "#define USE_UV1" : "", - parameters.vertexUv2s ? "#define USE_UV2" : "", - parameters.vertexUv3s ? "#define USE_UV3" : "", - parameters.pointsUvs ? "#define USE_POINTS_UV" : "", - parameters.gradientMap ? "#define USE_GRADIENTMAP" : "", - parameters.flatShading ? "#define FLAT_SHADED" : "", - parameters.doubleSided ? "#define DOUBLE_SIDED" : "", - parameters.flipSided ? "#define FLIP_SIDED" : "", - parameters.shadowMapEnabled ? "#define USE_SHADOWMAP" : "", - parameters.shadowMapEnabled ? "#define " + shadowMapTypeDefine : "", - parameters.premultipliedAlpha ? "#define PREMULTIPLIED_ALPHA" : "", - parameters.numLightProbes > 0 ? "#define USE_LIGHT_PROBES" : "", - parameters.decodeVideoTexture ? "#define DECODE_VIDEO_TEXTURE" : "", - parameters.decodeVideoTextureEmissive ? "#define DECODE_VIDEO_TEXTURE_EMISSIVE" : "", - parameters.logarithmicDepthBuffer ? "#define USE_LOGDEPTHBUF" : "", - parameters.reverseDepthBuffer ? "#define USE_REVERSEDEPTHBUF" : "", - "uniform mat4 viewMatrix;", - "uniform vec3 cameraPosition;", - "uniform bool isOrthographic;", - parameters.toneMapping !== NoToneMapping ? "#define TONE_MAPPING" : "", - parameters.toneMapping !== NoToneMapping ? ShaderChunk["tonemapping_pars_fragment"] : "", - // this code is required here because it is used by the toneMapping() function defined below - parameters.toneMapping !== NoToneMapping ? getToneMappingFunction("toneMapping", parameters.toneMapping) : "", - parameters.dithering ? "#define DITHERING" : "", - parameters.opaque ? "#define OPAQUE" : "", - ShaderChunk["colorspace_pars_fragment"], - // this code is required here because it is used by the various encoding/decoding function defined below - getTexelEncodingFunction("linearToOutputTexel", parameters.outputColorSpace), - getLuminanceFunction(), - parameters.useDepthPacking ? "#define DEPTH_PACKING " + parameters.depthPacking : "", - "\n" - ].filter(filterEmptyLine).join("\n"); + setFromMatrix3Column(m, index) { + return this.fromArray(m.elements, index * 3); } - vertexShader = resolveIncludes(vertexShader); - vertexShader = replaceLightNums(vertexShader, parameters); - vertexShader = replaceClippingPlaneNums(vertexShader, parameters); - fragmentShader = resolveIncludes(fragmentShader); - fragmentShader = replaceLightNums(fragmentShader, parameters); - fragmentShader = replaceClippingPlaneNums(fragmentShader, parameters); - vertexShader = unrollLoops(vertexShader); - fragmentShader = unrollLoops(fragmentShader); - if (parameters.isRawShaderMaterial !== true) { - versionString = "#version 300 es\n"; - prefixVertex = [ - customVertexExtensions, - "#define attribute in", - "#define varying out", - "#define texture2D texture" - ].join("\n") + "\n" + prefixVertex; - prefixFragment = [ - "#define varying in", - parameters.glslVersion === GLSL3 ? "" : "layout(location = 0) out highp vec4 pc_fragColor;", - parameters.glslVersion === GLSL3 ? "" : "#define gl_FragColor pc_fragColor", - "#define gl_FragDepthEXT gl_FragDepth", - "#define texture2D texture", - "#define textureCube texture", - "#define texture2DProj textureProj", - "#define texture2DLodEXT textureLod", - "#define texture2DProjLodEXT textureProjLod", - "#define textureCubeLodEXT textureLod", - "#define texture2DGradEXT textureGrad", - "#define texture2DProjGradEXT textureProjGrad", - "#define textureCubeGradEXT textureGrad" - ].join("\n") + "\n" + prefixFragment; + setFromEuler(e) { + this.x = e._x; + this.y = e._y; + this.z = e._z; + return this; } - const vertexGlsl = versionString + prefixVertex + vertexShader; - const fragmentGlsl = versionString + prefixFragment + fragmentShader; - const glVertexShader = WebGLShader(gl, gl.VERTEX_SHADER, vertexGlsl); - const glFragmentShader = WebGLShader(gl, gl.FRAGMENT_SHADER, fragmentGlsl); - gl.attachShader(program, glVertexShader); - gl.attachShader(program, glFragmentShader); - if (parameters.index0AttributeName !== void 0) { - gl.bindAttribLocation(program, 0, parameters.index0AttributeName); - } else if (parameters.morphTargets === true) { - gl.bindAttribLocation(program, 0, "position"); + setFromColor(c) { + this.x = c.r; + this.y = c.g; + this.z = c.b; + return this; } - gl.linkProgram(program); - function onFirstUse(self2) { - if (renderer.debug.checkShaderErrors) { - const programLog = gl.getProgramInfoLog(program).trim(); - const vertexLog = gl.getShaderInfoLog(glVertexShader).trim(); - const fragmentLog = gl.getShaderInfoLog(glFragmentShader).trim(); - let runnable = true; - let haveDiagnostics = true; - if (gl.getProgramParameter(program, gl.LINK_STATUS) === false) { - runnable = false; - if (typeof renderer.debug.onShaderError === "function") { - renderer.debug.onShaderError(gl, program, glVertexShader, glFragmentShader); - } else { - const vertexErrors = getShaderErrors(gl, glVertexShader, "vertex"); - const fragmentErrors = getShaderErrors(gl, glFragmentShader, "fragment"); - console.error( - "THREE.WebGLProgram: Shader Error " + gl.getError() + " - VALIDATE_STATUS " + gl.getProgramParameter(program, gl.VALIDATE_STATUS) + "\n\nMaterial Name: " + self2.name + "\nMaterial Type: " + self2.type + "\n\nProgram Info Log: " + programLog + "\n" + vertexErrors + "\n" + fragmentErrors - ); - } - } else if (programLog !== "") { - console.warn("THREE.WebGLProgram: Program Info Log:", programLog); - } else if (vertexLog === "" || fragmentLog === "") { - haveDiagnostics = false; - } - if (haveDiagnostics) { - self2.diagnostics = { - runnable, - programLog, - vertexShader: { - log: vertexLog, - prefix: prefixVertex - }, - fragmentShader: { - log: fragmentLog, - prefix: prefixFragment - } - }; - } - } - gl.deleteShader(glVertexShader); - gl.deleteShader(glFragmentShader); - cachedUniforms = new WebGLUniforms(gl, program); - cachedAttributes = fetchAttributeLocations(gl, program); + equals(v) { + return v.x === this.x && v.y === this.y && v.z === this.z; + } + fromArray(array, offset = 0) { + this.x = array[offset]; + this.y = array[offset + 1]; + this.z = array[offset + 2]; + return this; + } + toArray(array = [], offset = 0) { + array[offset] = this.x; + array[offset + 1] = this.y; + array[offset + 2] = this.z; + return array; + } + fromBufferAttribute(attribute, index) { + this.x = attribute.getX(index); + this.y = attribute.getY(index); + this.z = attribute.getZ(index); + return this; + } + random() { + this.x = Math.random(); + this.y = Math.random(); + this.z = Math.random(); + return this; + } + randomDirection() { + const theta = Math.random() * Math.PI * 2; + const u = Math.random() * 2 - 1; + const c = Math.sqrt(1 - u * u); + this.x = c * Math.cos(theta); + this.y = u; + this.z = c * Math.sin(theta); + return this; + } + *[Symbol.iterator]() { + yield this.x; + yield this.y; + yield this.z; } - __name(onFirstUse, "onFirstUse"); - let cachedUniforms; - this.getUniforms = function() { - if (cachedUniforms === void 0) { - onFirstUse(this); - } - return cachedUniforms; - }; - let cachedAttributes; - this.getAttributes = function() { - if (cachedAttributes === void 0) { - onFirstUse(this); - } - return cachedAttributes; - }; - let programReady = parameters.rendererExtensionParallelShaderCompile === false; - this.isReady = function() { - if (programReady === false) { - programReady = gl.getProgramParameter(program, COMPLETION_STATUS_KHR); - } - return programReady; - }; - this.destroy = function() { - bindingStates.releaseStatesOfProgram(this); - gl.deleteProgram(program); - this.program = void 0; - }; - this.type = parameters.shaderType; - this.name = parameters.shaderName; - this.id = programIdCount++; - this.cacheKey = cacheKey; - this.usedTimes = 1; - this.program = program; - this.vertexShader = glVertexShader; - this.fragmentShader = glFragmentShader; - return this; } -__name(WebGLProgram, "WebGLProgram"); -let _id$1 = 0; -class WebGLShaderCache { +const _vector$c = /* @__PURE__ */ new Vector3(); +const _quaternion$4 = /* @__PURE__ */ new Quaternion(); +class Box3 { static { - __name(this, "WebGLShaderCache"); + __name(this, "Box3"); } - constructor() { - this.shaderCache = /* @__PURE__ */ new Map(); - this.materialCache = /* @__PURE__ */ new Map(); + constructor(min = new Vector3(Infinity, Infinity, Infinity), max2 = new Vector3(-Infinity, -Infinity, -Infinity)) { + this.isBox3 = true; + this.min = min; + this.max = max2; } - update(material) { - const vertexShader = material.vertexShader; - const fragmentShader = material.fragmentShader; - const vertexShaderStage = this._getShaderStage(vertexShader); - const fragmentShaderStage = this._getShaderStage(fragmentShader); - const materialShaders = this._getShaderCacheForMaterial(material); - if (materialShaders.has(vertexShaderStage) === false) { - materialShaders.add(vertexShaderStage); - vertexShaderStage.usedTimes++; + set(min, max2) { + this.min.copy(min); + this.max.copy(max2); + return this; + } + setFromArray(array) { + this.makeEmpty(); + for (let i = 0, il = array.length; i < il; i += 3) { + this.expandByPoint(_vector$b.fromArray(array, i)); } - if (materialShaders.has(fragmentShaderStage) === false) { - materialShaders.add(fragmentShaderStage); - fragmentShaderStage.usedTimes++; + return this; + } + setFromBufferAttribute(attribute) { + this.makeEmpty(); + for (let i = 0, il = attribute.count; i < il; i++) { + this.expandByPoint(_vector$b.fromBufferAttribute(attribute, i)); } return this; } - remove(material) { - const materialShaders = this.materialCache.get(material); - for (const shaderStage of materialShaders) { - shaderStage.usedTimes--; - if (shaderStage.usedTimes === 0) this.shaderCache.delete(shaderStage.code); + setFromPoints(points) { + this.makeEmpty(); + for (let i = 0, il = points.length; i < il; i++) { + this.expandByPoint(points[i]); } - this.materialCache.delete(material); return this; } - getVertexShaderID(material) { - return this._getShaderStage(material.vertexShader).id; + setFromCenterAndSize(center, size) { + const halfSize = _vector$b.copy(size).multiplyScalar(0.5); + this.min.copy(center).sub(halfSize); + this.max.copy(center).add(halfSize); + return this; } - getFragmentShaderID(material) { - return this._getShaderStage(material.fragmentShader).id; + setFromObject(object, precise = false) { + this.makeEmpty(); + return this.expandByObject(object, precise); } - dispose() { - this.shaderCache.clear(); - this.materialCache.clear(); + clone() { + return new this.constructor().copy(this); } - _getShaderCacheForMaterial(material) { - const cache = this.materialCache; - let set = cache.get(material); - if (set === void 0) { - set = /* @__PURE__ */ new Set(); - cache.set(material, set); - } - return set; + copy(box) { + this.min.copy(box.min); + this.max.copy(box.max); + return this; } - _getShaderStage(code) { - const cache = this.shaderCache; - let stage = cache.get(code); - if (stage === void 0) { - stage = new WebGLShaderStage(code); - cache.set(code, stage); - } - return stage; + makeEmpty() { + this.min.x = this.min.y = this.min.z = Infinity; + this.max.x = this.max.y = this.max.z = -Infinity; + return this; } -} -class WebGLShaderStage { - static { - __name(this, "WebGLShaderStage"); + isEmpty() { + return this.max.x < this.min.x || this.max.y < this.min.y || this.max.z < this.min.z; } - constructor(code) { - this.id = _id$1++; - this.code = code; - this.usedTimes = 0; + getCenter(target) { + return this.isEmpty() ? target.set(0, 0, 0) : target.addVectors(this.min, this.max).multiplyScalar(0.5); } -} -function WebGLPrograms(renderer, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping) { - const _programLayers = new Layers(); - const _customShaders = new WebGLShaderCache(); - const _activeChannels = /* @__PURE__ */ new Set(); - const programs = []; - const logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer; - const SUPPORTS_VERTEX_TEXTURES = capabilities.vertexTextures; - let precision = capabilities.precision; - const shaderIDs = { - MeshDepthMaterial: "depth", - MeshDistanceMaterial: "distanceRGBA", - MeshNormalMaterial: "normal", - MeshBasicMaterial: "basic", - MeshLambertMaterial: "lambert", - MeshPhongMaterial: "phong", - MeshToonMaterial: "toon", - MeshStandardMaterial: "physical", - MeshPhysicalMaterial: "physical", - MeshMatcapMaterial: "matcap", - LineBasicMaterial: "basic", - LineDashedMaterial: "dashed", - PointsMaterial: "points", - ShadowMaterial: "shadow", - SpriteMaterial: "sprite" - }; - function getChannel(value) { - _activeChannels.add(value); - if (value === 0) return "uv"; - return `uv${value}`; + getSize(target) { + return this.isEmpty() ? target.set(0, 0, 0) : target.subVectors(this.max, this.min); } - __name(getChannel, "getChannel"); - function getParameters(material, lights, shadows, scene, object) { - const fog = scene.fog; + expandByPoint(point) { + this.min.min(point); + this.max.max(point); + return this; + } + expandByVector(vector) { + this.min.sub(vector); + this.max.add(vector); + return this; + } + expandByScalar(scalar) { + this.min.addScalar(-scalar); + this.max.addScalar(scalar); + return this; + } + expandByObject(object, precise = false) { + object.updateWorldMatrix(false, false); const geometry = object.geometry; - const environment = material.isMeshStandardMaterial ? scene.environment : null; - const envMap = (material.isMeshStandardMaterial ? cubeuvmaps : cubemaps).get(material.envMap || environment); - const envMapCubeUVHeight = !!envMap && envMap.mapping === CubeUVReflectionMapping ? envMap.image.height : null; - const shaderID = shaderIDs[material.type]; - if (material.precision !== null) { - precision = capabilities.getMaxPrecision(material.precision); - if (precision !== material.precision) { - console.warn("THREE.WebGLProgram.getParameters:", material.precision, "not supported, using", precision, "instead."); + if (geometry !== void 0) { + const positionAttribute = geometry.getAttribute("position"); + if (precise === true && positionAttribute !== void 0 && object.isInstancedMesh !== true) { + for (let i = 0, l = positionAttribute.count; i < l; i++) { + if (object.isMesh === true) { + object.getVertexPosition(i, _vector$b); + } else { + _vector$b.fromBufferAttribute(positionAttribute, i); + } + _vector$b.applyMatrix4(object.matrixWorld); + this.expandByPoint(_vector$b); + } + } else { + if (object.boundingBox !== void 0) { + if (object.boundingBox === null) { + object.computeBoundingBox(); + } + _box$4.copy(object.boundingBox); + } else { + if (geometry.boundingBox === null) { + geometry.computeBoundingBox(); + } + _box$4.copy(geometry.boundingBox); + } + _box$4.applyMatrix4(object.matrixWorld); + this.union(_box$4); } } - const morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color; - const morphTargetsCount = morphAttribute !== void 0 ? morphAttribute.length : 0; - let morphTextureStride = 0; - if (geometry.morphAttributes.position !== void 0) morphTextureStride = 1; - if (geometry.morphAttributes.normal !== void 0) morphTextureStride = 2; - if (geometry.morphAttributes.color !== void 0) morphTextureStride = 3; - let vertexShader, fragmentShader; - let customVertexShaderID, customFragmentShaderID; - if (shaderID) { - const shader = ShaderLib[shaderID]; - vertexShader = shader.vertexShader; - fragmentShader = shader.fragmentShader; + const children = object.children; + for (let i = 0, l = children.length; i < l; i++) { + this.expandByObject(children[i], precise); + } + return this; + } + containsPoint(point) { + return point.x >= this.min.x && point.x <= this.max.x && point.y >= this.min.y && point.y <= this.max.y && point.z >= this.min.z && point.z <= this.max.z; + } + containsBox(box) { + return this.min.x <= box.min.x && box.max.x <= this.max.x && this.min.y <= box.min.y && box.max.y <= this.max.y && this.min.z <= box.min.z && box.max.z <= this.max.z; + } + getParameter(point, target) { + return target.set( + (point.x - this.min.x) / (this.max.x - this.min.x), + (point.y - this.min.y) / (this.max.y - this.min.y), + (point.z - this.min.z) / (this.max.z - this.min.z) + ); + } + intersectsBox(box) { + return box.max.x >= this.min.x && box.min.x <= this.max.x && box.max.y >= this.min.y && box.min.y <= this.max.y && box.max.z >= this.min.z && box.min.z <= this.max.z; + } + intersectsSphere(sphere) { + this.clampPoint(sphere.center, _vector$b); + return _vector$b.distanceToSquared(sphere.center) <= sphere.radius * sphere.radius; + } + intersectsPlane(plane) { + let min, max2; + if (plane.normal.x > 0) { + min = plane.normal.x * this.min.x; + max2 = plane.normal.x * this.max.x; } else { - vertexShader = material.vertexShader; - fragmentShader = material.fragmentShader; - _customShaders.update(material); - customVertexShaderID = _customShaders.getVertexShaderID(material); - customFragmentShaderID = _customShaders.getFragmentShaderID(material); + min = plane.normal.x * this.max.x; + max2 = plane.normal.x * this.min.x; } - const currentRenderTarget = renderer.getRenderTarget(); - const reverseDepthBuffer = renderer.state.buffers.depth.getReversed(); - const IS_INSTANCEDMESH = object.isInstancedMesh === true; - const IS_BATCHEDMESH = object.isBatchedMesh === true; - const HAS_MAP = !!material.map; - const HAS_MATCAP = !!material.matcap; - const HAS_ENVMAP = !!envMap; - const HAS_AOMAP = !!material.aoMap; - const HAS_LIGHTMAP = !!material.lightMap; - const HAS_BUMPMAP = !!material.bumpMap; - const HAS_NORMALMAP = !!material.normalMap; - const HAS_DISPLACEMENTMAP = !!material.displacementMap; - const HAS_EMISSIVEMAP = !!material.emissiveMap; - const HAS_METALNESSMAP = !!material.metalnessMap; - const HAS_ROUGHNESSMAP = !!material.roughnessMap; - const HAS_ANISOTROPY = material.anisotropy > 0; - const HAS_CLEARCOAT = material.clearcoat > 0; - const HAS_DISPERSION = material.dispersion > 0; - const HAS_IRIDESCENCE = material.iridescence > 0; - const HAS_SHEEN = material.sheen > 0; - const HAS_TRANSMISSION = material.transmission > 0; - const HAS_ANISOTROPYMAP = HAS_ANISOTROPY && !!material.anisotropyMap; - const HAS_CLEARCOATMAP = HAS_CLEARCOAT && !!material.clearcoatMap; - const HAS_CLEARCOAT_NORMALMAP = HAS_CLEARCOAT && !!material.clearcoatNormalMap; - const HAS_CLEARCOAT_ROUGHNESSMAP = HAS_CLEARCOAT && !!material.clearcoatRoughnessMap; - const HAS_IRIDESCENCEMAP = HAS_IRIDESCENCE && !!material.iridescenceMap; - const HAS_IRIDESCENCE_THICKNESSMAP = HAS_IRIDESCENCE && !!material.iridescenceThicknessMap; - const HAS_SHEEN_COLORMAP = HAS_SHEEN && !!material.sheenColorMap; - const HAS_SHEEN_ROUGHNESSMAP = HAS_SHEEN && !!material.sheenRoughnessMap; - const HAS_SPECULARMAP = !!material.specularMap; - const HAS_SPECULAR_COLORMAP = !!material.specularColorMap; - const HAS_SPECULAR_INTENSITYMAP = !!material.specularIntensityMap; - const HAS_TRANSMISSIONMAP = HAS_TRANSMISSION && !!material.transmissionMap; - const HAS_THICKNESSMAP = HAS_TRANSMISSION && !!material.thicknessMap; - const HAS_GRADIENTMAP = !!material.gradientMap; - const HAS_ALPHAMAP = !!material.alphaMap; - const HAS_ALPHATEST = material.alphaTest > 0; - const HAS_ALPHAHASH = !!material.alphaHash; - const HAS_EXTENSIONS = !!material.extensions; - let toneMapping = NoToneMapping; - if (material.toneMapped) { - if (currentRenderTarget === null || currentRenderTarget.isXRRenderTarget === true) { - toneMapping = renderer.toneMapping; - } + if (plane.normal.y > 0) { + min += plane.normal.y * this.min.y; + max2 += plane.normal.y * this.max.y; + } else { + min += plane.normal.y * this.max.y; + max2 += plane.normal.y * this.min.y; } - const parameters = { - shaderID, - shaderType: material.type, - shaderName: material.name, - vertexShader, - fragmentShader, - defines: material.defines, - customVertexShaderID, - customFragmentShaderID, - isRawShaderMaterial: material.isRawShaderMaterial === true, - glslVersion: material.glslVersion, - precision, - batching: IS_BATCHEDMESH, - batchingColor: IS_BATCHEDMESH && object._colorsTexture !== null, - instancing: IS_INSTANCEDMESH, - instancingColor: IS_INSTANCEDMESH && object.instanceColor !== null, - instancingMorph: IS_INSTANCEDMESH && object.morphTexture !== null, - supportsVertexTextures: SUPPORTS_VERTEX_TEXTURES, - outputColorSpace: currentRenderTarget === null ? renderer.outputColorSpace : currentRenderTarget.isXRRenderTarget === true ? currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace, - alphaToCoverage: !!material.alphaToCoverage, - map: HAS_MAP, - matcap: HAS_MATCAP, - envMap: HAS_ENVMAP, - envMapMode: HAS_ENVMAP && envMap.mapping, - envMapCubeUVHeight, - aoMap: HAS_AOMAP, - lightMap: HAS_LIGHTMAP, - bumpMap: HAS_BUMPMAP, - normalMap: HAS_NORMALMAP, - displacementMap: SUPPORTS_VERTEX_TEXTURES && HAS_DISPLACEMENTMAP, - emissiveMap: HAS_EMISSIVEMAP, - normalMapObjectSpace: HAS_NORMALMAP && material.normalMapType === ObjectSpaceNormalMap, - normalMapTangentSpace: HAS_NORMALMAP && material.normalMapType === TangentSpaceNormalMap, - metalnessMap: HAS_METALNESSMAP, - roughnessMap: HAS_ROUGHNESSMAP, - anisotropy: HAS_ANISOTROPY, - anisotropyMap: HAS_ANISOTROPYMAP, - clearcoat: HAS_CLEARCOAT, - clearcoatMap: HAS_CLEARCOATMAP, - clearcoatNormalMap: HAS_CLEARCOAT_NORMALMAP, - clearcoatRoughnessMap: HAS_CLEARCOAT_ROUGHNESSMAP, - dispersion: HAS_DISPERSION, - iridescence: HAS_IRIDESCENCE, - iridescenceMap: HAS_IRIDESCENCEMAP, - iridescenceThicknessMap: HAS_IRIDESCENCE_THICKNESSMAP, - sheen: HAS_SHEEN, - sheenColorMap: HAS_SHEEN_COLORMAP, - sheenRoughnessMap: HAS_SHEEN_ROUGHNESSMAP, - specularMap: HAS_SPECULARMAP, - specularColorMap: HAS_SPECULAR_COLORMAP, - specularIntensityMap: HAS_SPECULAR_INTENSITYMAP, - transmission: HAS_TRANSMISSION, - transmissionMap: HAS_TRANSMISSIONMAP, - thicknessMap: HAS_THICKNESSMAP, - gradientMap: HAS_GRADIENTMAP, - opaque: material.transparent === false && material.blending === NormalBlending && material.alphaToCoverage === false, - alphaMap: HAS_ALPHAMAP, - alphaTest: HAS_ALPHATEST, - alphaHash: HAS_ALPHAHASH, - combine: material.combine, - // - mapUv: HAS_MAP && getChannel(material.map.channel), - aoMapUv: HAS_AOMAP && getChannel(material.aoMap.channel), - lightMapUv: HAS_LIGHTMAP && getChannel(material.lightMap.channel), - bumpMapUv: HAS_BUMPMAP && getChannel(material.bumpMap.channel), - normalMapUv: HAS_NORMALMAP && getChannel(material.normalMap.channel), - displacementMapUv: HAS_DISPLACEMENTMAP && getChannel(material.displacementMap.channel), - emissiveMapUv: HAS_EMISSIVEMAP && getChannel(material.emissiveMap.channel), - metalnessMapUv: HAS_METALNESSMAP && getChannel(material.metalnessMap.channel), - roughnessMapUv: HAS_ROUGHNESSMAP && getChannel(material.roughnessMap.channel), - anisotropyMapUv: HAS_ANISOTROPYMAP && getChannel(material.anisotropyMap.channel), - clearcoatMapUv: HAS_CLEARCOATMAP && getChannel(material.clearcoatMap.channel), - clearcoatNormalMapUv: HAS_CLEARCOAT_NORMALMAP && getChannel(material.clearcoatNormalMap.channel), - clearcoatRoughnessMapUv: HAS_CLEARCOAT_ROUGHNESSMAP && getChannel(material.clearcoatRoughnessMap.channel), - iridescenceMapUv: HAS_IRIDESCENCEMAP && getChannel(material.iridescenceMap.channel), - iridescenceThicknessMapUv: HAS_IRIDESCENCE_THICKNESSMAP && getChannel(material.iridescenceThicknessMap.channel), - sheenColorMapUv: HAS_SHEEN_COLORMAP && getChannel(material.sheenColorMap.channel), - sheenRoughnessMapUv: HAS_SHEEN_ROUGHNESSMAP && getChannel(material.sheenRoughnessMap.channel), - specularMapUv: HAS_SPECULARMAP && getChannel(material.specularMap.channel), - specularColorMapUv: HAS_SPECULAR_COLORMAP && getChannel(material.specularColorMap.channel), - specularIntensityMapUv: HAS_SPECULAR_INTENSITYMAP && getChannel(material.specularIntensityMap.channel), - transmissionMapUv: HAS_TRANSMISSIONMAP && getChannel(material.transmissionMap.channel), - thicknessMapUv: HAS_THICKNESSMAP && getChannel(material.thicknessMap.channel), - alphaMapUv: HAS_ALPHAMAP && getChannel(material.alphaMap.channel), - // - vertexTangents: !!geometry.attributes.tangent && (HAS_NORMALMAP || HAS_ANISOTROPY), - vertexColors: material.vertexColors, - vertexAlphas: material.vertexColors === true && !!geometry.attributes.color && geometry.attributes.color.itemSize === 4, - pointsUvs: object.isPoints === true && !!geometry.attributes.uv && (HAS_MAP || HAS_ALPHAMAP), - fog: !!fog, - useFog: material.fog === true, - fogExp2: !!fog && fog.isFogExp2, - flatShading: material.flatShading === true, - sizeAttenuation: material.sizeAttenuation === true, - logarithmicDepthBuffer, - reverseDepthBuffer, - skinning: object.isSkinnedMesh === true, - morphTargets: geometry.morphAttributes.position !== void 0, - morphNormals: geometry.morphAttributes.normal !== void 0, - morphColors: geometry.morphAttributes.color !== void 0, - morphTargetsCount, - morphTextureStride, - numDirLights: lights.directional.length, - numPointLights: lights.point.length, - numSpotLights: lights.spot.length, - numSpotLightMaps: lights.spotLightMap.length, - numRectAreaLights: lights.rectArea.length, - numHemiLights: lights.hemi.length, - numDirLightShadows: lights.directionalShadowMap.length, - numPointLightShadows: lights.pointShadowMap.length, - numSpotLightShadows: lights.spotShadowMap.length, - numSpotLightShadowsWithMaps: lights.numSpotLightShadowsWithMaps, - numLightProbes: lights.numLightProbes, - numClippingPlanes: clipping.numPlanes, - numClipIntersection: clipping.numIntersection, - dithering: material.dithering, - shadowMapEnabled: renderer.shadowMap.enabled && shadows.length > 0, - shadowMapType: renderer.shadowMap.type, - toneMapping, - decodeVideoTexture: HAS_MAP && material.map.isVideoTexture === true && ColorManagement.getTransfer(material.map.colorSpace) === SRGBTransfer, - decodeVideoTextureEmissive: HAS_EMISSIVEMAP && material.emissiveMap.isVideoTexture === true && ColorManagement.getTransfer(material.emissiveMap.colorSpace) === SRGBTransfer, - premultipliedAlpha: material.premultipliedAlpha, - doubleSided: material.side === DoubleSide, - flipSided: material.side === BackSide, - useDepthPacking: material.depthPacking >= 0, - depthPacking: material.depthPacking || 0, - index0AttributeName: material.index0AttributeName, - extensionClipCullDistance: HAS_EXTENSIONS && material.extensions.clipCullDistance === true && extensions.has("WEBGL_clip_cull_distance"), - extensionMultiDraw: (HAS_EXTENSIONS && material.extensions.multiDraw === true || IS_BATCHEDMESH) && extensions.has("WEBGL_multi_draw"), - rendererExtensionParallelShaderCompile: extensions.has("KHR_parallel_shader_compile"), - customProgramCacheKey: material.customProgramCacheKey() - }; - parameters.vertexUv1s = _activeChannels.has(1); - parameters.vertexUv2s = _activeChannels.has(2); - parameters.vertexUv3s = _activeChannels.has(3); - _activeChannels.clear(); - return parameters; - } - __name(getParameters, "getParameters"); - function getProgramCacheKey(parameters) { - const array = []; - if (parameters.shaderID) { - array.push(parameters.shaderID); + if (plane.normal.z > 0) { + min += plane.normal.z * this.min.z; + max2 += plane.normal.z * this.max.z; } else { - array.push(parameters.customVertexShaderID); - array.push(parameters.customFragmentShaderID); + min += plane.normal.z * this.max.z; + max2 += plane.normal.z * this.min.z; } - if (parameters.defines !== void 0) { - for (const name in parameters.defines) { - array.push(name); - array.push(parameters.defines[name]); - } + return min <= -plane.constant && max2 >= -plane.constant; + } + intersectsTriangle(triangle) { + if (this.isEmpty()) { + return false; + } + this.getCenter(_center); + _extents.subVectors(this.max, _center); + _v0$3.subVectors(triangle.a, _center); + _v1$7.subVectors(triangle.b, _center); + _v2$4.subVectors(triangle.c, _center); + _f0.subVectors(_v1$7, _v0$3); + _f1.subVectors(_v2$4, _v1$7); + _f2.subVectors(_v0$3, _v2$4); + let axes = [ + 0, + -_f0.z, + _f0.y, + 0, + -_f1.z, + _f1.y, + 0, + -_f2.z, + _f2.y, + _f0.z, + 0, + -_f0.x, + _f1.z, + 0, + -_f1.x, + _f2.z, + 0, + -_f2.x, + -_f0.y, + _f0.x, + 0, + -_f1.y, + _f1.x, + 0, + -_f2.y, + _f2.x, + 0 + ]; + if (!satForAxes(axes, _v0$3, _v1$7, _v2$4, _extents)) { + return false; } - if (parameters.isRawShaderMaterial === false) { - getProgramCacheKeyParameters(array, parameters); - getProgramCacheKeyBooleans(array, parameters); - array.push(renderer.outputColorSpace); + axes = [1, 0, 0, 0, 1, 0, 0, 0, 1]; + if (!satForAxes(axes, _v0$3, _v1$7, _v2$4, _extents)) { + return false; } - array.push(parameters.customProgramCacheKey); - return array.join(); + _triangleNormal.crossVectors(_f0, _f1); + axes = [_triangleNormal.x, _triangleNormal.y, _triangleNormal.z]; + return satForAxes(axes, _v0$3, _v1$7, _v2$4, _extents); } - __name(getProgramCacheKey, "getProgramCacheKey"); - function getProgramCacheKeyParameters(array, parameters) { - array.push(parameters.precision); - array.push(parameters.outputColorSpace); - array.push(parameters.envMapMode); - array.push(parameters.envMapCubeUVHeight); - array.push(parameters.mapUv); - array.push(parameters.alphaMapUv); - array.push(parameters.lightMapUv); - array.push(parameters.aoMapUv); - array.push(parameters.bumpMapUv); - array.push(parameters.normalMapUv); - array.push(parameters.displacementMapUv); - array.push(parameters.emissiveMapUv); - array.push(parameters.metalnessMapUv); - array.push(parameters.roughnessMapUv); - array.push(parameters.anisotropyMapUv); - array.push(parameters.clearcoatMapUv); - array.push(parameters.clearcoatNormalMapUv); - array.push(parameters.clearcoatRoughnessMapUv); - array.push(parameters.iridescenceMapUv); - array.push(parameters.iridescenceThicknessMapUv); - array.push(parameters.sheenColorMapUv); - array.push(parameters.sheenRoughnessMapUv); - array.push(parameters.specularMapUv); - array.push(parameters.specularColorMapUv); - array.push(parameters.specularIntensityMapUv); - array.push(parameters.transmissionMapUv); - array.push(parameters.thicknessMapUv); - array.push(parameters.combine); - array.push(parameters.fogExp2); - array.push(parameters.sizeAttenuation); - array.push(parameters.morphTargetsCount); - array.push(parameters.morphAttributeCount); - array.push(parameters.numDirLights); - array.push(parameters.numPointLights); - array.push(parameters.numSpotLights); - array.push(parameters.numSpotLightMaps); - array.push(parameters.numHemiLights); - array.push(parameters.numRectAreaLights); - array.push(parameters.numDirLightShadows); - array.push(parameters.numPointLightShadows); - array.push(parameters.numSpotLightShadows); - array.push(parameters.numSpotLightShadowsWithMaps); - array.push(parameters.numLightProbes); - array.push(parameters.shadowMapType); - array.push(parameters.toneMapping); - array.push(parameters.numClippingPlanes); - array.push(parameters.numClipIntersection); - array.push(parameters.depthPacking); + clampPoint(point, target) { + return target.copy(point).clamp(this.min, this.max); } - __name(getProgramCacheKeyParameters, "getProgramCacheKeyParameters"); - function getProgramCacheKeyBooleans(array, parameters) { - _programLayers.disableAll(); - if (parameters.supportsVertexTextures) - _programLayers.enable(0); - if (parameters.instancing) - _programLayers.enable(1); - if (parameters.instancingColor) - _programLayers.enable(2); - if (parameters.instancingMorph) - _programLayers.enable(3); - if (parameters.matcap) - _programLayers.enable(4); - if (parameters.envMap) - _programLayers.enable(5); - if (parameters.normalMapObjectSpace) - _programLayers.enable(6); - if (parameters.normalMapTangentSpace) - _programLayers.enable(7); - if (parameters.clearcoat) - _programLayers.enable(8); - if (parameters.iridescence) - _programLayers.enable(9); - if (parameters.alphaTest) - _programLayers.enable(10); - if (parameters.vertexColors) - _programLayers.enable(11); - if (parameters.vertexAlphas) - _programLayers.enable(12); - if (parameters.vertexUv1s) - _programLayers.enable(13); - if (parameters.vertexUv2s) - _programLayers.enable(14); - if (parameters.vertexUv3s) - _programLayers.enable(15); - if (parameters.vertexTangents) - _programLayers.enable(16); - if (parameters.anisotropy) - _programLayers.enable(17); - if (parameters.alphaHash) - _programLayers.enable(18); - if (parameters.batching) - _programLayers.enable(19); - if (parameters.dispersion) - _programLayers.enable(20); - if (parameters.batchingColor) - _programLayers.enable(21); - array.push(_programLayers.mask); - _programLayers.disableAll(); - if (parameters.fog) - _programLayers.enable(0); - if (parameters.useFog) - _programLayers.enable(1); - if (parameters.flatShading) - _programLayers.enable(2); - if (parameters.logarithmicDepthBuffer) - _programLayers.enable(3); - if (parameters.reverseDepthBuffer) - _programLayers.enable(4); - if (parameters.skinning) - _programLayers.enable(5); - if (parameters.morphTargets) - _programLayers.enable(6); - if (parameters.morphNormals) - _programLayers.enable(7); - if (parameters.morphColors) - _programLayers.enable(8); - if (parameters.premultipliedAlpha) - _programLayers.enable(9); - if (parameters.shadowMapEnabled) - _programLayers.enable(10); - if (parameters.doubleSided) - _programLayers.enable(11); - if (parameters.flipSided) - _programLayers.enable(12); - if (parameters.useDepthPacking) - _programLayers.enable(13); - if (parameters.dithering) - _programLayers.enable(14); - if (parameters.transmission) - _programLayers.enable(15); - if (parameters.sheen) - _programLayers.enable(16); - if (parameters.opaque) - _programLayers.enable(17); - if (parameters.pointsUvs) - _programLayers.enable(18); - if (parameters.decodeVideoTexture) - _programLayers.enable(19); - if (parameters.decodeVideoTextureEmissive) - _programLayers.enable(20); - if (parameters.alphaToCoverage) - _programLayers.enable(21); - array.push(_programLayers.mask); + distanceToPoint(point) { + return this.clampPoint(point, _vector$b).distanceTo(point); } - __name(getProgramCacheKeyBooleans, "getProgramCacheKeyBooleans"); - function getUniforms(material) { - const shaderID = shaderIDs[material.type]; - let uniforms; - if (shaderID) { - const shader = ShaderLib[shaderID]; - uniforms = UniformsUtils.clone(shader.uniforms); + getBoundingSphere(target) { + if (this.isEmpty()) { + target.makeEmpty(); } else { - uniforms = material.uniforms; + this.getCenter(target.center); + target.radius = this.getSize(_vector$b).length() * 0.5; } - return uniforms; + return target; } - __name(getUniforms, "getUniforms"); - function acquireProgram(parameters, cacheKey) { - let program; - for (let p = 0, pl = programs.length; p < pl; p++) { - const preexistingProgram = programs[p]; - if (preexistingProgram.cacheKey === cacheKey) { - program = preexistingProgram; - ++program.usedTimes; - break; - } - } - if (program === void 0) { - program = new WebGLProgram(renderer, cacheKey, parameters, bindingStates); - programs.push(program); - } - return program; + intersect(box) { + this.min.max(box.min); + this.max.min(box.max); + if (this.isEmpty()) this.makeEmpty(); + return this; } - __name(acquireProgram, "acquireProgram"); - function releaseProgram(program) { - if (--program.usedTimes === 0) { - const i = programs.indexOf(program); - programs[i] = programs[programs.length - 1]; - programs.pop(); - program.destroy(); - } + union(box) { + this.min.min(box.min); + this.max.max(box.max); + return this; } - __name(releaseProgram, "releaseProgram"); - function releaseShaderCache(material) { - _customShaders.remove(material); + applyMatrix4(matrix) { + if (this.isEmpty()) return this; + _points[0].set(this.min.x, this.min.y, this.min.z).applyMatrix4(matrix); + _points[1].set(this.min.x, this.min.y, this.max.z).applyMatrix4(matrix); + _points[2].set(this.min.x, this.max.y, this.min.z).applyMatrix4(matrix); + _points[3].set(this.min.x, this.max.y, this.max.z).applyMatrix4(matrix); + _points[4].set(this.max.x, this.min.y, this.min.z).applyMatrix4(matrix); + _points[5].set(this.max.x, this.min.y, this.max.z).applyMatrix4(matrix); + _points[6].set(this.max.x, this.max.y, this.min.z).applyMatrix4(matrix); + _points[7].set(this.max.x, this.max.y, this.max.z).applyMatrix4(matrix); + this.setFromPoints(_points); + return this; } - __name(releaseShaderCache, "releaseShaderCache"); - function dispose() { - _customShaders.dispose(); + translate(offset) { + this.min.add(offset); + this.max.add(offset); + return this; + } + equals(box) { + return box.min.equals(this.min) && box.max.equals(this.max); } - __name(dispose, "dispose"); - return { - getParameters, - getProgramCacheKey, - getUniforms, - acquireProgram, - releaseProgram, - releaseShaderCache, - // Exposed for resource monitoring & error feedback via renderer.info: - programs, - dispose - }; } -__name(WebGLPrograms, "WebGLPrograms"); -function WebGLProperties() { - let properties = /* @__PURE__ */ new WeakMap(); - function has(object) { - return properties.has(object); +const _points = [ + /* @__PURE__ */ new Vector3(), + /* @__PURE__ */ new Vector3(), + /* @__PURE__ */ new Vector3(), + /* @__PURE__ */ new Vector3(), + /* @__PURE__ */ new Vector3(), + /* @__PURE__ */ new Vector3(), + /* @__PURE__ */ new Vector3(), + /* @__PURE__ */ new Vector3() +]; +const _vector$b = /* @__PURE__ */ new Vector3(); +const _box$4 = /* @__PURE__ */ new Box3(); +const _v0$3 = /* @__PURE__ */ new Vector3(); +const _v1$7 = /* @__PURE__ */ new Vector3(); +const _v2$4 = /* @__PURE__ */ new Vector3(); +const _f0 = /* @__PURE__ */ new Vector3(); +const _f1 = /* @__PURE__ */ new Vector3(); +const _f2 = /* @__PURE__ */ new Vector3(); +const _center = /* @__PURE__ */ new Vector3(); +const _extents = /* @__PURE__ */ new Vector3(); +const _triangleNormal = /* @__PURE__ */ new Vector3(); +const _testAxis = /* @__PURE__ */ new Vector3(); +function satForAxes(axes, v0, v1, v2, extents) { + for (let i = 0, j = axes.length - 3; i <= j; i += 3) { + _testAxis.fromArray(axes, i); + const r = extents.x * Math.abs(_testAxis.x) + extents.y * Math.abs(_testAxis.y) + extents.z * Math.abs(_testAxis.z); + const p0 = v0.dot(_testAxis); + const p1 = v1.dot(_testAxis); + const p2 = v2.dot(_testAxis); + if (Math.max(-Math.max(p0, p1, p2), Math.min(p0, p1, p2)) > r) { + return false; + } } - __name(has, "has"); - function get(object) { - let map = properties.get(object); - if (map === void 0) { - map = {}; - properties.set(object, map); + return true; +} +__name(satForAxes, "satForAxes"); +const _box$3 = /* @__PURE__ */ new Box3(); +const _v1$6 = /* @__PURE__ */ new Vector3(); +const _v2$3 = /* @__PURE__ */ new Vector3(); +class Sphere { + static { + __name(this, "Sphere"); + } + constructor(center = new Vector3(), radius = -1) { + this.isSphere = true; + this.center = center; + this.radius = radius; + } + set(center, radius) { + this.center.copy(center); + this.radius = radius; + return this; + } + setFromPoints(points, optionalCenter) { + const center = this.center; + if (optionalCenter !== void 0) { + center.copy(optionalCenter); + } else { + _box$3.setFromPoints(points).getCenter(center); } - return map; + let maxRadiusSq = 0; + for (let i = 0, il = points.length; i < il; i++) { + maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(points[i])); + } + this.radius = Math.sqrt(maxRadiusSq); + return this; } - __name(get, "get"); - function remove(object) { - properties.delete(object); + copy(sphere) { + this.center.copy(sphere.center); + this.radius = sphere.radius; + return this; } - __name(remove, "remove"); - function update(object, key, value) { - properties.get(object)[key] = value; + isEmpty() { + return this.radius < 0; } - __name(update, "update"); - function dispose() { - properties = /* @__PURE__ */ new WeakMap(); + makeEmpty() { + this.center.set(0, 0, 0); + this.radius = -1; + return this; } - __name(dispose, "dispose"); - return { - has, - get, - remove, - update, - dispose - }; -} -__name(WebGLProperties, "WebGLProperties"); -function painterSortStable(a, b) { - if (a.groupOrder !== b.groupOrder) { - return a.groupOrder - b.groupOrder; - } else if (a.renderOrder !== b.renderOrder) { - return a.renderOrder - b.renderOrder; - } else if (a.material.id !== b.material.id) { - return a.material.id - b.material.id; - } else if (a.z !== b.z) { - return a.z - b.z; - } else { - return a.id - b.id; + containsPoint(point) { + return point.distanceToSquared(this.center) <= this.radius * this.radius; } -} -__name(painterSortStable, "painterSortStable"); -function reversePainterSortStable(a, b) { - if (a.groupOrder !== b.groupOrder) { - return a.groupOrder - b.groupOrder; - } else if (a.renderOrder !== b.renderOrder) { - return a.renderOrder - b.renderOrder; - } else if (a.z !== b.z) { - return b.z - a.z; - } else { - return a.id - b.id; + distanceToPoint(point) { + return point.distanceTo(this.center) - this.radius; } -} -__name(reversePainterSortStable, "reversePainterSortStable"); -function WebGLRenderList() { - const renderItems = []; - let renderItemsIndex = 0; - const opaque = []; - const transmissive = []; - const transparent = []; - function init() { - renderItemsIndex = 0; - opaque.length = 0; - transmissive.length = 0; - transparent.length = 0; + intersectsSphere(sphere) { + const radiusSum = this.radius + sphere.radius; + return sphere.center.distanceToSquared(this.center) <= radiusSum * radiusSum; } - __name(init, "init"); - function getNextRenderItem(object, geometry, material, groupOrder, z, group) { - let renderItem = renderItems[renderItemsIndex]; - if (renderItem === void 0) { - renderItem = { - id: object.id, - object, - geometry, - material, - groupOrder, - renderOrder: object.renderOrder, - z, - group - }; - renderItems[renderItemsIndex] = renderItem; + intersectsBox(box) { + return box.intersectsSphere(this); + } + intersectsPlane(plane) { + return Math.abs(plane.distanceToPoint(this.center)) <= this.radius; + } + clampPoint(point, target) { + const deltaLengthSq = this.center.distanceToSquared(point); + target.copy(point); + if (deltaLengthSq > this.radius * this.radius) { + target.sub(this.center).normalize(); + target.multiplyScalar(this.radius).add(this.center); + } + return target; + } + getBoundingBox(target) { + if (this.isEmpty()) { + target.makeEmpty(); + return target; + } + target.set(this.center, this.center); + target.expandByScalar(this.radius); + return target; + } + applyMatrix4(matrix) { + this.center.applyMatrix4(matrix); + this.radius = this.radius * matrix.getMaxScaleOnAxis(); + return this; + } + translate(offset) { + this.center.add(offset); + return this; + } + expandByPoint(point) { + if (this.isEmpty()) { + this.center.copy(point); + this.radius = 0; + return this; + } + _v1$6.subVectors(point, this.center); + const lengthSq = _v1$6.lengthSq(); + if (lengthSq > this.radius * this.radius) { + const length = Math.sqrt(lengthSq); + const delta = (length - this.radius) * 0.5; + this.center.addScaledVector(_v1$6, delta / length); + this.radius += delta; + } + return this; + } + union(sphere) { + if (sphere.isEmpty()) { + return this; + } + if (this.isEmpty()) { + this.copy(sphere); + return this; + } + if (this.center.equals(sphere.center) === true) { + this.radius = Math.max(this.radius, sphere.radius); } else { - renderItem.id = object.id; - renderItem.object = object; - renderItem.geometry = geometry; - renderItem.material = material; - renderItem.groupOrder = groupOrder; - renderItem.renderOrder = object.renderOrder; - renderItem.z = z; - renderItem.group = group; + _v2$3.subVectors(sphere.center, this.center).setLength(sphere.radius); + this.expandByPoint(_v1$6.copy(sphere.center).add(_v2$3)); + this.expandByPoint(_v1$6.copy(sphere.center).sub(_v2$3)); } - renderItemsIndex++; - return renderItem; + return this; + } + equals(sphere) { + return sphere.center.equals(this.center) && sphere.radius === this.radius; + } + clone() { + return new this.constructor().copy(this); + } +} +const _vector$a = /* @__PURE__ */ new Vector3(); +const _segCenter = /* @__PURE__ */ new Vector3(); +const _segDir = /* @__PURE__ */ new Vector3(); +const _diff = /* @__PURE__ */ new Vector3(); +const _edge1 = /* @__PURE__ */ new Vector3(); +const _edge2 = /* @__PURE__ */ new Vector3(); +const _normal$1 = /* @__PURE__ */ new Vector3(); +class Ray { + static { + __name(this, "Ray"); + } + constructor(origin = new Vector3(), direction = new Vector3(0, 0, -1)) { + this.origin = origin; + this.direction = direction; + } + set(origin, direction) { + this.origin.copy(origin); + this.direction.copy(direction); + return this; } - __name(getNextRenderItem, "getNextRenderItem"); - function push(object, geometry, material, groupOrder, z, group) { - const renderItem = getNextRenderItem(object, geometry, material, groupOrder, z, group); - if (material.transmission > 0) { - transmissive.push(renderItem); - } else if (material.transparent === true) { - transparent.push(renderItem); - } else { - opaque.push(renderItem); - } + copy(ray) { + this.origin.copy(ray.origin); + this.direction.copy(ray.direction); + return this; } - __name(push, "push"); - function unshift(object, geometry, material, groupOrder, z, group) { - const renderItem = getNextRenderItem(object, geometry, material, groupOrder, z, group); - if (material.transmission > 0) { - transmissive.unshift(renderItem); - } else if (material.transparent === true) { - transparent.unshift(renderItem); - } else { - opaque.unshift(renderItem); - } + at(t2, target) { + return target.copy(this.origin).addScaledVector(this.direction, t2); } - __name(unshift, "unshift"); - function sort(customOpaqueSort, customTransparentSort) { - if (opaque.length > 1) opaque.sort(customOpaqueSort || painterSortStable); - if (transmissive.length > 1) transmissive.sort(customTransparentSort || reversePainterSortStable); - if (transparent.length > 1) transparent.sort(customTransparentSort || reversePainterSortStable); + lookAt(v) { + this.direction.copy(v).sub(this.origin).normalize(); + return this; } - __name(sort, "sort"); - function finish() { - for (let i = renderItemsIndex, il = renderItems.length; i < il; i++) { - const renderItem = renderItems[i]; - if (renderItem.id === null) break; - renderItem.id = null; - renderItem.object = null; - renderItem.geometry = null; - renderItem.material = null; - renderItem.group = null; - } + recast(t2) { + this.origin.copy(this.at(t2, _vector$a)); + return this; } - __name(finish, "finish"); - return { - opaque, - transmissive, - transparent, - init, - push, - unshift, - finish, - sort - }; -} -__name(WebGLRenderList, "WebGLRenderList"); -function WebGLRenderLists() { - let lists = /* @__PURE__ */ new WeakMap(); - function get(scene, renderCallDepth) { - const listArray = lists.get(scene); - let list; - if (listArray === void 0) { - list = new WebGLRenderList(); - lists.set(scene, [list]); - } else { - if (renderCallDepth >= listArray.length) { - list = new WebGLRenderList(); - listArray.push(list); - } else { - list = listArray[renderCallDepth]; - } + closestPointToPoint(point, target) { + target.subVectors(point, this.origin); + const directionDistance = target.dot(this.direction); + if (directionDistance < 0) { + return target.copy(this.origin); } - return list; + return target.copy(this.origin).addScaledVector(this.direction, directionDistance); } - __name(get, "get"); - function dispose() { - lists = /* @__PURE__ */ new WeakMap(); + distanceToPoint(point) { + return Math.sqrt(this.distanceSqToPoint(point)); } - __name(dispose, "dispose"); - return { - get, - dispose - }; -} -__name(WebGLRenderLists, "WebGLRenderLists"); -function UniformsCache() { - const lights = {}; - return { - get: /* @__PURE__ */ __name(function(light) { - if (lights[light.id] !== void 0) { - return lights[light.id]; - } - let uniforms; - switch (light.type) { - case "DirectionalLight": - uniforms = { - direction: new Vector3(), - color: new Color() - }; - break; - case "SpotLight": - uniforms = { - position: new Vector3(), - direction: new Vector3(), - color: new Color(), - distance: 0, - coneCos: 0, - penumbraCos: 0, - decay: 0 - }; - break; - case "PointLight": - uniforms = { - position: new Vector3(), - color: new Color(), - distance: 0, - decay: 0 - }; - break; - case "HemisphereLight": - uniforms = { - direction: new Vector3(), - skyColor: new Color(), - groundColor: new Color() - }; - break; - case "RectAreaLight": - uniforms = { - color: new Color(), - position: new Vector3(), - halfWidth: new Vector3(), - halfHeight: new Vector3() - }; - break; - } - lights[light.id] = uniforms; - return uniforms; - }, "get") - }; -} -__name(UniformsCache, "UniformsCache"); -function ShadowUniformsCache() { - const lights = {}; - return { - get: /* @__PURE__ */ __name(function(light) { - if (lights[light.id] !== void 0) { - return lights[light.id]; - } - let uniforms; - switch (light.type) { - case "DirectionalLight": - uniforms = { - shadowIntensity: 1, - shadowBias: 0, - shadowNormalBias: 0, - shadowRadius: 1, - shadowMapSize: new Vector2() - }; - break; - case "SpotLight": - uniforms = { - shadowIntensity: 1, - shadowBias: 0, - shadowNormalBias: 0, - shadowRadius: 1, - shadowMapSize: new Vector2() - }; - break; - case "PointLight": - uniforms = { - shadowIntensity: 1, - shadowBias: 0, - shadowNormalBias: 0, - shadowRadius: 1, - shadowMapSize: new Vector2(), - shadowCameraNear: 1, - shadowCameraFar: 1e3 - }; - break; - } - lights[light.id] = uniforms; - return uniforms; - }, "get") - }; -} -__name(ShadowUniformsCache, "ShadowUniformsCache"); -let nextVersion = 0; -function shadowCastingAndTexturingLightsFirst(lightA, lightB) { - return (lightB.castShadow ? 2 : 0) - (lightA.castShadow ? 2 : 0) + (lightB.map ? 1 : 0) - (lightA.map ? 1 : 0); -} -__name(shadowCastingAndTexturingLightsFirst, "shadowCastingAndTexturingLightsFirst"); -function WebGLLights(extensions) { - const cache = new UniformsCache(); - const shadowCache = ShadowUniformsCache(); - const state = { - version: 0, - hash: { - directionalLength: -1, - pointLength: -1, - spotLength: -1, - rectAreaLength: -1, - hemiLength: -1, - numDirectionalShadows: -1, - numPointShadows: -1, - numSpotShadows: -1, - numSpotMaps: -1, - numLightProbes: -1 - }, - ambient: [0, 0, 0], - probe: [], - directional: [], - directionalShadow: [], - directionalShadowMap: [], - directionalShadowMatrix: [], - spot: [], - spotLightMap: [], - spotShadow: [], - spotShadowMap: [], - spotLightMatrix: [], - rectArea: [], - rectAreaLTC1: null, - rectAreaLTC2: null, - point: [], - pointShadow: [], - pointShadowMap: [], - pointShadowMatrix: [], - hemi: [], - numSpotLightShadowsWithMaps: 0, - numLightProbes: 0 - }; - for (let i = 0; i < 9; i++) state.probe.push(new Vector3()); - const vector3 = new Vector3(); - const matrix4 = new Matrix4(); - const matrix42 = new Matrix4(); - function setup(lights) { - let r = 0, g = 0, b = 0; - for (let i = 0; i < 9; i++) state.probe[i].set(0, 0, 0); - let directionalLength = 0; - let pointLength = 0; - let spotLength = 0; - let rectAreaLength = 0; - let hemiLength = 0; - let numDirectionalShadows = 0; - let numPointShadows = 0; - let numSpotShadows = 0; - let numSpotMaps = 0; - let numSpotShadowsWithMaps = 0; - let numLightProbes = 0; - lights.sort(shadowCastingAndTexturingLightsFirst); - for (let i = 0, l = lights.length; i < l; i++) { - const light = lights[i]; - const color = light.color; - const intensity = light.intensity; - const distance = light.distance; - const shadowMap = light.shadow && light.shadow.map ? light.shadow.map.texture : null; - if (light.isAmbientLight) { - r += color.r * intensity; - g += color.g * intensity; - b += color.b * intensity; - } else if (light.isLightProbe) { - for (let j = 0; j < 9; j++) { - state.probe[j].addScaledVector(light.sh.coefficients[j], intensity); - } - numLightProbes++; - } else if (light.isDirectionalLight) { - const uniforms = cache.get(light); - uniforms.color.copy(light.color).multiplyScalar(light.intensity); - if (light.castShadow) { - const shadow = light.shadow; - const shadowUniforms = shadowCache.get(light); - shadowUniforms.shadowIntensity = shadow.intensity; - shadowUniforms.shadowBias = shadow.bias; - shadowUniforms.shadowNormalBias = shadow.normalBias; - shadowUniforms.shadowRadius = shadow.radius; - shadowUniforms.shadowMapSize = shadow.mapSize; - state.directionalShadow[directionalLength] = shadowUniforms; - state.directionalShadowMap[directionalLength] = shadowMap; - state.directionalShadowMatrix[directionalLength] = light.shadow.matrix; - numDirectionalShadows++; - } - state.directional[directionalLength] = uniforms; - directionalLength++; - } else if (light.isSpotLight) { - const uniforms = cache.get(light); - uniforms.position.setFromMatrixPosition(light.matrixWorld); - uniforms.color.copy(color).multiplyScalar(intensity); - uniforms.distance = distance; - uniforms.coneCos = Math.cos(light.angle); - uniforms.penumbraCos = Math.cos(light.angle * (1 - light.penumbra)); - uniforms.decay = light.decay; - state.spot[spotLength] = uniforms; - const shadow = light.shadow; - if (light.map) { - state.spotLightMap[numSpotMaps] = light.map; - numSpotMaps++; - shadow.updateMatrices(light); - if (light.castShadow) numSpotShadowsWithMaps++; - } - state.spotLightMatrix[spotLength] = shadow.matrix; - if (light.castShadow) { - const shadowUniforms = shadowCache.get(light); - shadowUniforms.shadowIntensity = shadow.intensity; - shadowUniforms.shadowBias = shadow.bias; - shadowUniforms.shadowNormalBias = shadow.normalBias; - shadowUniforms.shadowRadius = shadow.radius; - shadowUniforms.shadowMapSize = shadow.mapSize; - state.spotShadow[spotLength] = shadowUniforms; - state.spotShadowMap[spotLength] = shadowMap; - numSpotShadows++; + distanceSqToPoint(point) { + const directionDistance = _vector$a.subVectors(point, this.origin).dot(this.direction); + if (directionDistance < 0) { + return this.origin.distanceToSquared(point); + } + _vector$a.copy(this.origin).addScaledVector(this.direction, directionDistance); + return _vector$a.distanceToSquared(point); + } + distanceSqToSegment(v0, v1, optionalPointOnRay, optionalPointOnSegment) { + _segCenter.copy(v0).add(v1).multiplyScalar(0.5); + _segDir.copy(v1).sub(v0).normalize(); + _diff.copy(this.origin).sub(_segCenter); + const segExtent = v0.distanceTo(v1) * 0.5; + const a01 = -this.direction.dot(_segDir); + const b0 = _diff.dot(this.direction); + const b1 = -_diff.dot(_segDir); + const c = _diff.lengthSq(); + const det = Math.abs(1 - a01 * a01); + let s0, s1, sqrDist, extDet; + if (det > 0) { + s0 = a01 * b1 - b0; + s1 = a01 * b0 - b1; + extDet = segExtent * det; + if (s0 >= 0) { + if (s1 >= -extDet) { + if (s1 <= extDet) { + const invDet = 1 / det; + s0 *= invDet; + s1 *= invDet; + sqrDist = s0 * (s0 + a01 * s1 + 2 * b0) + s1 * (a01 * s0 + s1 + 2 * b1) + c; + } else { + s1 = segExtent; + s0 = Math.max(0, -(a01 * s1 + b0)); + sqrDist = -s0 * s0 + s1 * (s1 + 2 * b1) + c; + } + } else { + s1 = -segExtent; + s0 = Math.max(0, -(a01 * s1 + b0)); + sqrDist = -s0 * s0 + s1 * (s1 + 2 * b1) + c; } - spotLength++; - } else if (light.isRectAreaLight) { - const uniforms = cache.get(light); - uniforms.color.copy(color).multiplyScalar(intensity); - uniforms.halfWidth.set(light.width * 0.5, 0, 0); - uniforms.halfHeight.set(0, light.height * 0.5, 0); - state.rectArea[rectAreaLength] = uniforms; - rectAreaLength++; - } else if (light.isPointLight) { - const uniforms = cache.get(light); - uniforms.color.copy(light.color).multiplyScalar(light.intensity); - uniforms.distance = light.distance; - uniforms.decay = light.decay; - if (light.castShadow) { - const shadow = light.shadow; - const shadowUniforms = shadowCache.get(light); - shadowUniforms.shadowIntensity = shadow.intensity; - shadowUniforms.shadowBias = shadow.bias; - shadowUniforms.shadowNormalBias = shadow.normalBias; - shadowUniforms.shadowRadius = shadow.radius; - shadowUniforms.shadowMapSize = shadow.mapSize; - shadowUniforms.shadowCameraNear = shadow.camera.near; - shadowUniforms.shadowCameraFar = shadow.camera.far; - state.pointShadow[pointLength] = shadowUniforms; - state.pointShadowMap[pointLength] = shadowMap; - state.pointShadowMatrix[pointLength] = light.shadow.matrix; - numPointShadows++; + } else { + if (s1 <= -extDet) { + s0 = Math.max(0, -(-a01 * segExtent + b0)); + s1 = s0 > 0 ? -segExtent : Math.min(Math.max(-segExtent, -b1), segExtent); + sqrDist = -s0 * s0 + s1 * (s1 + 2 * b1) + c; + } else if (s1 <= extDet) { + s0 = 0; + s1 = Math.min(Math.max(-segExtent, -b1), segExtent); + sqrDist = s1 * (s1 + 2 * b1) + c; + } else { + s0 = Math.max(0, -(a01 * segExtent + b0)); + s1 = s0 > 0 ? segExtent : Math.min(Math.max(-segExtent, -b1), segExtent); + sqrDist = -s0 * s0 + s1 * (s1 + 2 * b1) + c; } - state.point[pointLength] = uniforms; - pointLength++; - } else if (light.isHemisphereLight) { - const uniforms = cache.get(light); - uniforms.skyColor.copy(light.color).multiplyScalar(intensity); - uniforms.groundColor.copy(light.groundColor).multiplyScalar(intensity); - state.hemi[hemiLength] = uniforms; - hemiLength++; } + } else { + s1 = a01 > 0 ? -segExtent : segExtent; + s0 = Math.max(0, -(a01 * s1 + b0)); + sqrDist = -s0 * s0 + s1 * (s1 + 2 * b1) + c; } - if (rectAreaLength > 0) { - if (extensions.has("OES_texture_float_linear") === true) { - state.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1; - state.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2; - } else { - state.rectAreaLTC1 = UniformsLib.LTC_HALF_1; - state.rectAreaLTC2 = UniformsLib.LTC_HALF_2; - } + if (optionalPointOnRay) { + optionalPointOnRay.copy(this.origin).addScaledVector(this.direction, s0); } - state.ambient[0] = r; - state.ambient[1] = g; - state.ambient[2] = b; - const hash = state.hash; - if (hash.directionalLength !== directionalLength || hash.pointLength !== pointLength || hash.spotLength !== spotLength || hash.rectAreaLength !== rectAreaLength || hash.hemiLength !== hemiLength || hash.numDirectionalShadows !== numDirectionalShadows || hash.numPointShadows !== numPointShadows || hash.numSpotShadows !== numSpotShadows || hash.numSpotMaps !== numSpotMaps || hash.numLightProbes !== numLightProbes) { - state.directional.length = directionalLength; - state.spot.length = spotLength; - state.rectArea.length = rectAreaLength; - state.point.length = pointLength; - state.hemi.length = hemiLength; - state.directionalShadow.length = numDirectionalShadows; - state.directionalShadowMap.length = numDirectionalShadows; - state.pointShadow.length = numPointShadows; - state.pointShadowMap.length = numPointShadows; - state.spotShadow.length = numSpotShadows; - state.spotShadowMap.length = numSpotShadows; - state.directionalShadowMatrix.length = numDirectionalShadows; - state.pointShadowMatrix.length = numPointShadows; - state.spotLightMatrix.length = numSpotShadows + numSpotMaps - numSpotShadowsWithMaps; - state.spotLightMap.length = numSpotMaps; - state.numSpotLightShadowsWithMaps = numSpotShadowsWithMaps; - state.numLightProbes = numLightProbes; - hash.directionalLength = directionalLength; - hash.pointLength = pointLength; - hash.spotLength = spotLength; - hash.rectAreaLength = rectAreaLength; - hash.hemiLength = hemiLength; - hash.numDirectionalShadows = numDirectionalShadows; - hash.numPointShadows = numPointShadows; - hash.numSpotShadows = numSpotShadows; - hash.numSpotMaps = numSpotMaps; - hash.numLightProbes = numLightProbes; - state.version = nextVersion++; + if (optionalPointOnSegment) { + optionalPointOnSegment.copy(_segCenter).addScaledVector(_segDir, s1); } + return sqrDist; } - __name(setup, "setup"); - function setupView(lights, camera) { - let directionalLength = 0; - let pointLength = 0; - let spotLength = 0; - let rectAreaLength = 0; - let hemiLength = 0; - const viewMatrix = camera.matrixWorldInverse; - for (let i = 0, l = lights.length; i < l; i++) { - const light = lights[i]; - if (light.isDirectionalLight) { - const uniforms = state.directional[directionalLength]; - uniforms.direction.setFromMatrixPosition(light.matrixWorld); - vector3.setFromMatrixPosition(light.target.matrixWorld); - uniforms.direction.sub(vector3); - uniforms.direction.transformDirection(viewMatrix); - directionalLength++; - } else if (light.isSpotLight) { - const uniforms = state.spot[spotLength]; - uniforms.position.setFromMatrixPosition(light.matrixWorld); - uniforms.position.applyMatrix4(viewMatrix); - uniforms.direction.setFromMatrixPosition(light.matrixWorld); - vector3.setFromMatrixPosition(light.target.matrixWorld); - uniforms.direction.sub(vector3); - uniforms.direction.transformDirection(viewMatrix); - spotLength++; - } else if (light.isRectAreaLight) { - const uniforms = state.rectArea[rectAreaLength]; - uniforms.position.setFromMatrixPosition(light.matrixWorld); - uniforms.position.applyMatrix4(viewMatrix); - matrix42.identity(); - matrix4.copy(light.matrixWorld); - matrix4.premultiply(viewMatrix); - matrix42.extractRotation(matrix4); - uniforms.halfWidth.set(light.width * 0.5, 0, 0); - uniforms.halfHeight.set(0, light.height * 0.5, 0); - uniforms.halfWidth.applyMatrix4(matrix42); - uniforms.halfHeight.applyMatrix4(matrix42); - rectAreaLength++; - } else if (light.isPointLight) { - const uniforms = state.point[pointLength]; - uniforms.position.setFromMatrixPosition(light.matrixWorld); - uniforms.position.applyMatrix4(viewMatrix); - pointLength++; - } else if (light.isHemisphereLight) { - const uniforms = state.hemi[hemiLength]; - uniforms.direction.setFromMatrixPosition(light.matrixWorld); - uniforms.direction.transformDirection(viewMatrix); - hemiLength++; + intersectSphere(sphere, target) { + _vector$a.subVectors(sphere.center, this.origin); + const tca = _vector$a.dot(this.direction); + const d2 = _vector$a.dot(_vector$a) - tca * tca; + const radius2 = sphere.radius * sphere.radius; + if (d2 > radius2) return null; + const thc = Math.sqrt(radius2 - d2); + const t0 = tca - thc; + const t1 = tca + thc; + if (t1 < 0) return null; + if (t0 < 0) return this.at(t1, target); + return this.at(t0, target); + } + intersectsSphere(sphere) { + return this.distanceSqToPoint(sphere.center) <= sphere.radius * sphere.radius; + } + distanceToPlane(plane) { + const denominator = plane.normal.dot(this.direction); + if (denominator === 0) { + if (plane.distanceToPoint(this.origin) === 0) { + return 0; } + return null; } + const t2 = -(this.origin.dot(plane.normal) + plane.constant) / denominator; + return t2 >= 0 ? t2 : null; } - __name(setupView, "setupView"); - return { - setup, - setupView, - state - }; -} -__name(WebGLLights, "WebGLLights"); -function WebGLRenderState(extensions) { - const lights = new WebGLLights(extensions); - const lightsArray = []; - const shadowsArray = []; - function init(camera) { - state.camera = camera; - lightsArray.length = 0; - shadowsArray.length = 0; - } - __name(init, "init"); - function pushLight(light) { - lightsArray.push(light); + intersectPlane(plane, target) { + const t2 = this.distanceToPlane(plane); + if (t2 === null) { + return null; + } + return this.at(t2, target); } - __name(pushLight, "pushLight"); - function pushShadow(shadowLight) { - shadowsArray.push(shadowLight); + intersectsPlane(plane) { + const distToPoint = plane.distanceToPoint(this.origin); + if (distToPoint === 0) { + return true; + } + const denominator = plane.normal.dot(this.direction); + if (denominator * distToPoint < 0) { + return true; + } + return false; } - __name(pushShadow, "pushShadow"); - function setupLights() { - lights.setup(lightsArray); + intersectBox(box, target) { + let tmin, tmax, tymin, tymax, tzmin, tzmax; + const invdirx = 1 / this.direction.x, invdiry = 1 / this.direction.y, invdirz = 1 / this.direction.z; + const origin = this.origin; + if (invdirx >= 0) { + tmin = (box.min.x - origin.x) * invdirx; + tmax = (box.max.x - origin.x) * invdirx; + } else { + tmin = (box.max.x - origin.x) * invdirx; + tmax = (box.min.x - origin.x) * invdirx; + } + if (invdiry >= 0) { + tymin = (box.min.y - origin.y) * invdiry; + tymax = (box.max.y - origin.y) * invdiry; + } else { + tymin = (box.max.y - origin.y) * invdiry; + tymax = (box.min.y - origin.y) * invdiry; + } + if (tmin > tymax || tymin > tmax) return null; + if (tymin > tmin || isNaN(tmin)) tmin = tymin; + if (tymax < tmax || isNaN(tmax)) tmax = tymax; + if (invdirz >= 0) { + tzmin = (box.min.z - origin.z) * invdirz; + tzmax = (box.max.z - origin.z) * invdirz; + } else { + tzmin = (box.max.z - origin.z) * invdirz; + tzmax = (box.min.z - origin.z) * invdirz; + } + if (tmin > tzmax || tzmin > tmax) return null; + if (tzmin > tmin || tmin !== tmin) tmin = tzmin; + if (tzmax < tmax || tmax !== tmax) tmax = tzmax; + if (tmax < 0) return null; + return this.at(tmin >= 0 ? tmin : tmax, target); } - __name(setupLights, "setupLights"); - function setupLightsView(camera) { - lights.setupView(lightsArray, camera); + intersectsBox(box) { + return this.intersectBox(box, _vector$a) !== null; } - __name(setupLightsView, "setupLightsView"); - const state = { - lightsArray, - shadowsArray, - camera: null, - lights, - transmissionRenderTarget: {} - }; - return { - init, - state, - setupLights, - setupLightsView, - pushLight, - pushShadow - }; -} -__name(WebGLRenderState, "WebGLRenderState"); -function WebGLRenderStates(extensions) { - let renderStates = /* @__PURE__ */ new WeakMap(); - function get(scene, renderCallDepth = 0) { - const renderStateArray = renderStates.get(scene); - let renderState; - if (renderStateArray === void 0) { - renderState = new WebGLRenderState(extensions); - renderStates.set(scene, [renderState]); + intersectTriangle(a, b, c, backfaceCulling, target) { + _edge1.subVectors(b, a); + _edge2.subVectors(c, a); + _normal$1.crossVectors(_edge1, _edge2); + let DdN = this.direction.dot(_normal$1); + let sign2; + if (DdN > 0) { + if (backfaceCulling) return null; + sign2 = 1; + } else if (DdN < 0) { + sign2 = -1; + DdN = -DdN; } else { - if (renderCallDepth >= renderStateArray.length) { - renderState = new WebGLRenderState(extensions); - renderStateArray.push(renderState); - } else { - renderState = renderStateArray[renderCallDepth]; - } + return null; } - return renderState; + _diff.subVectors(this.origin, a); + const DdQxE2 = sign2 * this.direction.dot(_edge2.crossVectors(_diff, _edge2)); + if (DdQxE2 < 0) { + return null; + } + const DdE1xQ = sign2 * this.direction.dot(_edge1.cross(_diff)); + if (DdE1xQ < 0) { + return null; + } + if (DdQxE2 + DdE1xQ > DdN) { + return null; + } + const QdN = -sign2 * _diff.dot(_normal$1); + if (QdN < 0) { + return null; + } + return this.at(QdN / DdN, target); } - __name(get, "get"); - function dispose() { - renderStates = /* @__PURE__ */ new WeakMap(); + applyMatrix4(matrix4) { + this.origin.applyMatrix4(matrix4); + this.direction.transformDirection(matrix4); + return this; + } + equals(ray) { + return ray.origin.equals(this.origin) && ray.direction.equals(this.direction); + } + clone() { + return new this.constructor().copy(this); } - __name(dispose, "dispose"); - return { - get, - dispose - }; } -__name(WebGLRenderStates, "WebGLRenderStates"); -class MeshDepthMaterial extends Material { +class Matrix4 { static { - __name(this, "MeshDepthMaterial"); + __name(this, "Matrix4"); } - static get type() { - return "MeshDepthMaterial"; + constructor(n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44) { + Matrix4.prototype.isMatrix4 = true; + this.elements = [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ]; + if (n11 !== void 0) { + this.set(n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44); + } } - constructor(parameters) { - super(); - this.isMeshDepthMaterial = true; - this.depthPacking = BasicDepthPacking; - this.map = null; - this.alphaMap = null; - this.displacementMap = null; - this.displacementScale = 1; - this.displacementBias = 0; - this.wireframe = false; - this.wireframeLinewidth = 1; - this.setValues(parameters); + set(n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44) { + const te2 = this.elements; + te2[0] = n11; + te2[4] = n12; + te2[8] = n13; + te2[12] = n14; + te2[1] = n21; + te2[5] = n22; + te2[9] = n23; + te2[13] = n24; + te2[2] = n31; + te2[6] = n32; + te2[10] = n33; + te2[14] = n34; + te2[3] = n41; + te2[7] = n42; + te2[11] = n43; + te2[15] = n44; + return this; } - copy(source) { - super.copy(source); - this.depthPacking = source.depthPacking; - this.map = source.map; - this.alphaMap = source.alphaMap; - this.displacementMap = source.displacementMap; - this.displacementScale = source.displacementScale; - this.displacementBias = source.displacementBias; - this.wireframe = source.wireframe; - this.wireframeLinewidth = source.wireframeLinewidth; + identity() { + this.set( + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ); return this; } -} -class MeshDistanceMaterial extends Material { - static { - __name(this, "MeshDistanceMaterial"); + clone() { + return new Matrix4().fromArray(this.elements); } - static get type() { - return "MeshDistanceMaterial"; + copy(m) { + const te2 = this.elements; + const me = m.elements; + te2[0] = me[0]; + te2[1] = me[1]; + te2[2] = me[2]; + te2[3] = me[3]; + te2[4] = me[4]; + te2[5] = me[5]; + te2[6] = me[6]; + te2[7] = me[7]; + te2[8] = me[8]; + te2[9] = me[9]; + te2[10] = me[10]; + te2[11] = me[11]; + te2[12] = me[12]; + te2[13] = me[13]; + te2[14] = me[14]; + te2[15] = me[15]; + return this; } - constructor(parameters) { - super(); - this.isMeshDistanceMaterial = true; - this.map = null; - this.alphaMap = null; - this.displacementMap = null; - this.displacementScale = 1; - this.displacementBias = 0; - this.setValues(parameters); + copyPosition(m) { + const te2 = this.elements, me = m.elements; + te2[12] = me[12]; + te2[13] = me[13]; + te2[14] = me[14]; + return this; } - copy(source) { - super.copy(source); - this.map = source.map; - this.alphaMap = source.alphaMap; - this.displacementMap = source.displacementMap; - this.displacementScale = source.displacementScale; - this.displacementBias = source.displacementBias; + setFromMatrix3(m) { + const me = m.elements; + this.set( + me[0], + me[3], + me[6], + 0, + me[1], + me[4], + me[7], + 0, + me[2], + me[5], + me[8], + 0, + 0, + 0, + 0, + 1 + ); return this; } -} -const vertex = "void main() {\n gl_Position = vec4( position, 1.0 );\n}"; -const fragment = "uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include \nvoid main() {\n const float samples = float( VSM_SAMPLES );\n float mean = 0.0;\n float squared_mean = 0.0;\n float uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n float uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n for ( float i = 0.0; i < samples; i ++ ) {\n float uvOffset = uvStart + i * uvStride;\n #ifdef HORIZONTAL_PASS\n vec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\n mean += distribution.x;\n squared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n #else\n float depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\n mean += depth;\n squared_mean += depth * depth;\n #endif\n }\n mean = mean / samples;\n squared_mean = squared_mean / samples;\n float std_dev = sqrt( squared_mean - mean * mean );\n gl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}"; -function WebGLShadowMap(renderer, objects, capabilities) { - let _frustum2 = new Frustum(); - const _shadowMapSize = new Vector2(), _viewportSize = new Vector2(), _viewport = new Vector4(), _depthMaterial = new MeshDepthMaterial({ depthPacking: RGBADepthPacking }), _distanceMaterial = new MeshDistanceMaterial(), _materialCache = {}, _maxTextureSize = capabilities.maxTextureSize; - const shadowSide = { [FrontSide]: BackSide, [BackSide]: FrontSide, [DoubleSide]: DoubleSide }; - const shadowMaterialVertical = new ShaderMaterial({ - defines: { - VSM_SAMPLES: 8 - }, - uniforms: { - shadow_pass: { value: null }, - resolution: { value: new Vector2() }, - radius: { value: 4 } - }, - vertexShader: vertex, - fragmentShader: fragment - }); - const shadowMaterialHorizontal = shadowMaterialVertical.clone(); - shadowMaterialHorizontal.defines.HORIZONTAL_PASS = 1; - const fullScreenTri = new BufferGeometry(); - fullScreenTri.setAttribute( - "position", - new BufferAttribute( - new Float32Array([-1, -1, 0.5, 3, -1, 0.5, -1, 3, 0.5]), - 3 - ) - ); - const fullScreenMesh = new Mesh(fullScreenTri, shadowMaterialVertical); - const scope = this; - this.enabled = false; - this.autoUpdate = true; - this.needsUpdate = false; - this.type = PCFShadowMap; - let _previousType = this.type; - this.render = function(lights, scene, camera) { - if (scope.enabled === false) return; - if (scope.autoUpdate === false && scope.needsUpdate === false) return; - if (lights.length === 0) return; - const currentRenderTarget = renderer.getRenderTarget(); - const activeCubeFace = renderer.getActiveCubeFace(); - const activeMipmapLevel = renderer.getActiveMipmapLevel(); - const _state = renderer.state; - _state.setBlending(NoBlending); - _state.buffers.color.setClear(1, 1, 1, 1); - _state.buffers.depth.setTest(true); - _state.setScissorTest(false); - const toVSM = _previousType !== VSMShadowMap && this.type === VSMShadowMap; - const fromVSM = _previousType === VSMShadowMap && this.type !== VSMShadowMap; - for (let i = 0, il = lights.length; i < il; i++) { - const light = lights[i]; - const shadow = light.shadow; - if (shadow === void 0) { - console.warn("THREE.WebGLShadowMap:", light, "has no shadow."); - continue; - } - if (shadow.autoUpdate === false && shadow.needsUpdate === false) continue; - _shadowMapSize.copy(shadow.mapSize); - const shadowFrameExtents = shadow.getFrameExtents(); - _shadowMapSize.multiply(shadowFrameExtents); - _viewportSize.copy(shadow.mapSize); - if (_shadowMapSize.x > _maxTextureSize || _shadowMapSize.y > _maxTextureSize) { - if (_shadowMapSize.x > _maxTextureSize) { - _viewportSize.x = Math.floor(_maxTextureSize / shadowFrameExtents.x); - _shadowMapSize.x = _viewportSize.x * shadowFrameExtents.x; - shadow.mapSize.x = _viewportSize.x; - } - if (_shadowMapSize.y > _maxTextureSize) { - _viewportSize.y = Math.floor(_maxTextureSize / shadowFrameExtents.y); - _shadowMapSize.y = _viewportSize.y * shadowFrameExtents.y; - shadow.mapSize.y = _viewportSize.y; - } - } - if (shadow.map === null || toVSM === true || fromVSM === true) { - const pars = this.type !== VSMShadowMap ? { minFilter: NearestFilter, magFilter: NearestFilter } : {}; - if (shadow.map !== null) { - shadow.map.dispose(); - } - shadow.map = new WebGLRenderTarget(_shadowMapSize.x, _shadowMapSize.y, pars); - shadow.map.texture.name = light.name + ".shadowMap"; - shadow.camera.updateProjectionMatrix(); - } - renderer.setRenderTarget(shadow.map); - renderer.clear(); - const viewportCount = shadow.getViewportCount(); - for (let vp = 0; vp < viewportCount; vp++) { - const viewport = shadow.getViewport(vp); - _viewport.set( - _viewportSize.x * viewport.x, - _viewportSize.y * viewport.y, - _viewportSize.x * viewport.z, - _viewportSize.y * viewport.w - ); - _state.viewport(_viewport); - shadow.updateMatrices(light, vp); - _frustum2 = shadow.getFrustum(); - renderObject(scene, camera, shadow.camera, light, this.type); - } - if (shadow.isPointLightShadow !== true && this.type === VSMShadowMap) { - VSMPass(shadow, camera); - } - shadow.needsUpdate = false; - } - _previousType = this.type; - scope.needsUpdate = false; - renderer.setRenderTarget(currentRenderTarget, activeCubeFace, activeMipmapLevel); - }; - function VSMPass(shadow, camera) { - const geometry = objects.update(fullScreenMesh); - if (shadowMaterialVertical.defines.VSM_SAMPLES !== shadow.blurSamples) { - shadowMaterialVertical.defines.VSM_SAMPLES = shadow.blurSamples; - shadowMaterialHorizontal.defines.VSM_SAMPLES = shadow.blurSamples; - shadowMaterialVertical.needsUpdate = true; - shadowMaterialHorizontal.needsUpdate = true; - } - if (shadow.mapPass === null) { - shadow.mapPass = new WebGLRenderTarget(_shadowMapSize.x, _shadowMapSize.y); - } - shadowMaterialVertical.uniforms.shadow_pass.value = shadow.map.texture; - shadowMaterialVertical.uniforms.resolution.value = shadow.mapSize; - shadowMaterialVertical.uniforms.radius.value = shadow.radius; - renderer.setRenderTarget(shadow.mapPass); - renderer.clear(); - renderer.renderBufferDirect(camera, null, geometry, shadowMaterialVertical, fullScreenMesh, null); - shadowMaterialHorizontal.uniforms.shadow_pass.value = shadow.mapPass.texture; - shadowMaterialHorizontal.uniforms.resolution.value = shadow.mapSize; - shadowMaterialHorizontal.uniforms.radius.value = shadow.radius; - renderer.setRenderTarget(shadow.map); - renderer.clear(); - renderer.renderBufferDirect(camera, null, geometry, shadowMaterialHorizontal, fullScreenMesh, null); + extractBasis(xAxis, yAxis, zAxis) { + xAxis.setFromMatrixColumn(this, 0); + yAxis.setFromMatrixColumn(this, 1); + zAxis.setFromMatrixColumn(this, 2); + return this; + } + makeBasis(xAxis, yAxis, zAxis) { + this.set( + xAxis.x, + yAxis.x, + zAxis.x, + 0, + xAxis.y, + yAxis.y, + zAxis.y, + 0, + xAxis.z, + yAxis.z, + zAxis.z, + 0, + 0, + 0, + 0, + 1 + ); + return this; + } + extractRotation(m) { + const te2 = this.elements; + const me = m.elements; + const scaleX = 1 / _v1$5.setFromMatrixColumn(m, 0).length(); + const scaleY = 1 / _v1$5.setFromMatrixColumn(m, 1).length(); + const scaleZ = 1 / _v1$5.setFromMatrixColumn(m, 2).length(); + te2[0] = me[0] * scaleX; + te2[1] = me[1] * scaleX; + te2[2] = me[2] * scaleX; + te2[3] = 0; + te2[4] = me[4] * scaleY; + te2[5] = me[5] * scaleY; + te2[6] = me[6] * scaleY; + te2[7] = 0; + te2[8] = me[8] * scaleZ; + te2[9] = me[9] * scaleZ; + te2[10] = me[10] * scaleZ; + te2[11] = 0; + te2[12] = 0; + te2[13] = 0; + te2[14] = 0; + te2[15] = 1; + return this; } - __name(VSMPass, "VSMPass"); - function getDepthMaterial(object, material, light, type) { - let result = null; - const customMaterial = light.isPointLight === true ? object.customDistanceMaterial : object.customDepthMaterial; - if (customMaterial !== void 0) { - result = customMaterial; - } else { - result = light.isPointLight === true ? _distanceMaterial : _depthMaterial; - if (renderer.localClippingEnabled && material.clipShadows === true && Array.isArray(material.clippingPlanes) && material.clippingPlanes.length !== 0 || material.displacementMap && material.displacementScale !== 0 || material.alphaMap && material.alphaTest > 0 || material.map && material.alphaTest > 0) { - const keyA = result.uuid, keyB = material.uuid; - let materialsForVariant = _materialCache[keyA]; - if (materialsForVariant === void 0) { - materialsForVariant = {}; - _materialCache[keyA] = materialsForVariant; - } - let cachedMaterial = materialsForVariant[keyB]; - if (cachedMaterial === void 0) { - cachedMaterial = result.clone(); - materialsForVariant[keyB] = cachedMaterial; - material.addEventListener("dispose", onMaterialDispose); - } - result = cachedMaterial; - } - } - result.visible = material.visible; - result.wireframe = material.wireframe; - if (type === VSMShadowMap) { - result.side = material.shadowSide !== null ? material.shadowSide : material.side; - } else { - result.side = material.shadowSide !== null ? material.shadowSide : shadowSide[material.side]; - } - result.alphaMap = material.alphaMap; - result.alphaTest = material.alphaTest; - result.map = material.map; - result.clipShadows = material.clipShadows; - result.clippingPlanes = material.clippingPlanes; - result.clipIntersection = material.clipIntersection; - result.displacementMap = material.displacementMap; - result.displacementScale = material.displacementScale; - result.displacementBias = material.displacementBias; - result.wireframeLinewidth = material.wireframeLinewidth; - result.linewidth = material.linewidth; - if (light.isPointLight === true && result.isMeshDistanceMaterial === true) { - const materialProperties = renderer.properties.get(result); - materialProperties.light = light; + makeRotationFromEuler(euler) { + const te2 = this.elements; + const x = euler.x, y = euler.y, z = euler.z; + const a = Math.cos(x), b = Math.sin(x); + const c = Math.cos(y), d = Math.sin(y); + const e = Math.cos(z), f = Math.sin(z); + if (euler.order === "XYZ") { + const ae = a * e, af = a * f, be = b * e, bf = b * f; + te2[0] = c * e; + te2[4] = -c * f; + te2[8] = d; + te2[1] = af + be * d; + te2[5] = ae - bf * d; + te2[9] = -b * c; + te2[2] = bf - ae * d; + te2[6] = be + af * d; + te2[10] = a * c; + } else if (euler.order === "YXZ") { + const ce = c * e, cf = c * f, de = d * e, df = d * f; + te2[0] = ce + df * b; + te2[4] = de * b - cf; + te2[8] = a * d; + te2[1] = a * f; + te2[5] = a * e; + te2[9] = -b; + te2[2] = cf * b - de; + te2[6] = df + ce * b; + te2[10] = a * c; + } else if (euler.order === "ZXY") { + const ce = c * e, cf = c * f, de = d * e, df = d * f; + te2[0] = ce - df * b; + te2[4] = -a * f; + te2[8] = de + cf * b; + te2[1] = cf + de * b; + te2[5] = a * e; + te2[9] = df - ce * b; + te2[2] = -a * d; + te2[6] = b; + te2[10] = a * c; + } else if (euler.order === "ZYX") { + const ae = a * e, af = a * f, be = b * e, bf = b * f; + te2[0] = c * e; + te2[4] = be * d - af; + te2[8] = ae * d + bf; + te2[1] = c * f; + te2[5] = bf * d + ae; + te2[9] = af * d - be; + te2[2] = -d; + te2[6] = b * c; + te2[10] = a * c; + } else if (euler.order === "YZX") { + const ac = a * c, ad = a * d, bc = b * c, bd = b * d; + te2[0] = c * e; + te2[4] = bd - ac * f; + te2[8] = bc * f + ad; + te2[1] = f; + te2[5] = a * e; + te2[9] = -b * e; + te2[2] = -d * e; + te2[6] = ad * f + bc; + te2[10] = ac - bd * f; + } else if (euler.order === "XZY") { + const ac = a * c, ad = a * d, bc = b * c, bd = b * d; + te2[0] = c * e; + te2[4] = -f; + te2[8] = d * e; + te2[1] = ac * f + bd; + te2[5] = a * e; + te2[9] = ad * f - bc; + te2[2] = bc * f - ad; + te2[6] = b * e; + te2[10] = bd * f + ac; } - return result; + te2[3] = 0; + te2[7] = 0; + te2[11] = 0; + te2[12] = 0; + te2[13] = 0; + te2[14] = 0; + te2[15] = 1; + return this; } - __name(getDepthMaterial, "getDepthMaterial"); - function renderObject(object, camera, shadowCamera, light, type) { - if (object.visible === false) return; - const visible = object.layers.test(camera.layers); - if (visible && (object.isMesh || object.isLine || object.isPoints)) { - if ((object.castShadow || object.receiveShadow && type === VSMShadowMap) && (!object.frustumCulled || _frustum2.intersectsObject(object))) { - object.modelViewMatrix.multiplyMatrices(shadowCamera.matrixWorldInverse, object.matrixWorld); - const geometry = objects.update(object); - const material = object.material; - if (Array.isArray(material)) { - const groups = geometry.groups; - for (let k = 0, kl = groups.length; k < kl; k++) { - const group = groups[k]; - const groupMaterial = material[group.materialIndex]; - if (groupMaterial && groupMaterial.visible) { - const depthMaterial = getDepthMaterial(object, groupMaterial, light, type); - object.onBeforeShadow(renderer, object, camera, shadowCamera, geometry, depthMaterial, group); - renderer.renderBufferDirect(shadowCamera, null, geometry, depthMaterial, object, group); - object.onAfterShadow(renderer, object, camera, shadowCamera, geometry, depthMaterial, group); - } - } - } else if (material.visible) { - const depthMaterial = getDepthMaterial(object, material, light, type); - object.onBeforeShadow(renderer, object, camera, shadowCamera, geometry, depthMaterial, null); - renderer.renderBufferDirect(shadowCamera, null, geometry, depthMaterial, object, null); - object.onAfterShadow(renderer, object, camera, shadowCamera, geometry, depthMaterial, null); - } - } - } - const children = object.children; - for (let i = 0, l = children.length; i < l; i++) { - renderObject(children[i], camera, shadowCamera, light, type); - } + makeRotationFromQuaternion(q) { + return this.compose(_zero, q, _one); } - __name(renderObject, "renderObject"); - function onMaterialDispose(event) { - const material = event.target; - material.removeEventListener("dispose", onMaterialDispose); - for (const id2 in _materialCache) { - const cache = _materialCache[id2]; - const uuid = event.target.uuid; - if (uuid in cache) { - const shadowMaterial = cache[uuid]; - shadowMaterial.dispose(); - delete cache[uuid]; + lookAt(eye, target, up) { + const te2 = this.elements; + _z.subVectors(eye, target); + if (_z.lengthSq() === 0) { + _z.z = 1; + } + _z.normalize(); + _x.crossVectors(up, _z); + if (_x.lengthSq() === 0) { + if (Math.abs(up.z) === 1) { + _z.x += 1e-4; + } else { + _z.z += 1e-4; } + _z.normalize(); + _x.crossVectors(up, _z); } + _x.normalize(); + _y.crossVectors(_z, _x); + te2[0] = _x.x; + te2[4] = _y.x; + te2[8] = _z.x; + te2[1] = _x.y; + te2[5] = _y.y; + te2[9] = _z.y; + te2[2] = _x.z; + te2[6] = _y.z; + te2[10] = _z.z; + return this; } - __name(onMaterialDispose, "onMaterialDispose"); -} -__name(WebGLShadowMap, "WebGLShadowMap"); -const reversedFuncs = { - [NeverDepth]: AlwaysDepth, - [LessDepth]: GreaterDepth, - [EqualDepth]: NotEqualDepth, - [LessEqualDepth]: GreaterEqualDepth, - [AlwaysDepth]: NeverDepth, - [GreaterDepth]: LessDepth, - [NotEqualDepth]: EqualDepth, - [GreaterEqualDepth]: LessEqualDepth -}; -function WebGLState(gl, extensions) { - function ColorBuffer() { - let locked = false; - const color = new Vector4(); - let currentColorMask = null; - const currentColorClear = new Vector4(0, 0, 0, 0); - return { - setMask: /* @__PURE__ */ __name(function(colorMask) { - if (currentColorMask !== colorMask && !locked) { - gl.colorMask(colorMask, colorMask, colorMask, colorMask); - currentColorMask = colorMask; - } - }, "setMask"), - setLocked: /* @__PURE__ */ __name(function(lock) { - locked = lock; - }, "setLocked"), - setClear: /* @__PURE__ */ __name(function(r, g, b, a, premultipliedAlpha) { - if (premultipliedAlpha === true) { - r *= a; - g *= a; - b *= a; - } - color.set(r, g, b, a); - if (currentColorClear.equals(color) === false) { - gl.clearColor(r, g, b, a); - currentColorClear.copy(color); - } - }, "setClear"), - reset: /* @__PURE__ */ __name(function() { - locked = false; - currentColorMask = null; - currentColorClear.set(-1, 0, 0, 0); - }, "reset") - }; + multiply(m) { + return this.multiplyMatrices(this, m); } - __name(ColorBuffer, "ColorBuffer"); - function DepthBuffer() { - let locked = false; - let reversed = false; - let currentDepthMask = null; - let currentDepthFunc = null; - let currentDepthClear = null; - return { - setReversed: /* @__PURE__ */ __name(function(value) { - if (reversed !== value) { - const ext2 = extensions.get("EXT_clip_control"); - if (reversed) { - ext2.clipControlEXT(ext2.LOWER_LEFT_EXT, ext2.ZERO_TO_ONE_EXT); - } else { - ext2.clipControlEXT(ext2.LOWER_LEFT_EXT, ext2.NEGATIVE_ONE_TO_ONE_EXT); - } - const oldDepth = currentDepthClear; - currentDepthClear = null; - this.setClear(oldDepth); - } - reversed = value; - }, "setReversed"), - getReversed: /* @__PURE__ */ __name(function() { - return reversed; - }, "getReversed"), - setTest: /* @__PURE__ */ __name(function(depthTest) { - if (depthTest) { - enable(gl.DEPTH_TEST); - } else { - disable(gl.DEPTH_TEST); - } - }, "setTest"), - setMask: /* @__PURE__ */ __name(function(depthMask) { - if (currentDepthMask !== depthMask && !locked) { - gl.depthMask(depthMask); - currentDepthMask = depthMask; - } - }, "setMask"), - setFunc: /* @__PURE__ */ __name(function(depthFunc) { - if (reversed) depthFunc = reversedFuncs[depthFunc]; - if (currentDepthFunc !== depthFunc) { - switch (depthFunc) { - case NeverDepth: - gl.depthFunc(gl.NEVER); - break; - case AlwaysDepth: - gl.depthFunc(gl.ALWAYS); - break; - case LessDepth: - gl.depthFunc(gl.LESS); - break; - case LessEqualDepth: - gl.depthFunc(gl.LEQUAL); - break; - case EqualDepth: - gl.depthFunc(gl.EQUAL); - break; - case GreaterEqualDepth: - gl.depthFunc(gl.GEQUAL); - break; - case GreaterDepth: - gl.depthFunc(gl.GREATER); - break; - case NotEqualDepth: - gl.depthFunc(gl.NOTEQUAL); - break; - default: - gl.depthFunc(gl.LEQUAL); - } - currentDepthFunc = depthFunc; - } - }, "setFunc"), - setLocked: /* @__PURE__ */ __name(function(lock) { - locked = lock; - }, "setLocked"), - setClear: /* @__PURE__ */ __name(function(depth) { - if (currentDepthClear !== depth) { - if (reversed) { - depth = 1 - depth; - } - gl.clearDepth(depth); - currentDepthClear = depth; - } - }, "setClear"), - reset: /* @__PURE__ */ __name(function() { - locked = false; - currentDepthMask = null; - currentDepthFunc = null; - currentDepthClear = null; - reversed = false; - }, "reset") - }; + premultiply(m) { + return this.multiplyMatrices(m, this); } - __name(DepthBuffer, "DepthBuffer"); - function StencilBuffer() { - let locked = false; - let currentStencilMask = null; - let currentStencilFunc = null; - let currentStencilRef = null; - let currentStencilFuncMask = null; - let currentStencilFail = null; - let currentStencilZFail = null; - let currentStencilZPass = null; - let currentStencilClear = null; - return { - setTest: /* @__PURE__ */ __name(function(stencilTest) { - if (!locked) { - if (stencilTest) { - enable(gl.STENCIL_TEST); - } else { - disable(gl.STENCIL_TEST); - } - } - }, "setTest"), - setMask: /* @__PURE__ */ __name(function(stencilMask) { - if (currentStencilMask !== stencilMask && !locked) { - gl.stencilMask(stencilMask); - currentStencilMask = stencilMask; - } - }, "setMask"), - setFunc: /* @__PURE__ */ __name(function(stencilFunc, stencilRef, stencilMask) { - if (currentStencilFunc !== stencilFunc || currentStencilRef !== stencilRef || currentStencilFuncMask !== stencilMask) { - gl.stencilFunc(stencilFunc, stencilRef, stencilMask); - currentStencilFunc = stencilFunc; - currentStencilRef = stencilRef; - currentStencilFuncMask = stencilMask; - } - }, "setFunc"), - setOp: /* @__PURE__ */ __name(function(stencilFail, stencilZFail, stencilZPass) { - if (currentStencilFail !== stencilFail || currentStencilZFail !== stencilZFail || currentStencilZPass !== stencilZPass) { - gl.stencilOp(stencilFail, stencilZFail, stencilZPass); - currentStencilFail = stencilFail; - currentStencilZFail = stencilZFail; - currentStencilZPass = stencilZPass; - } - }, "setOp"), - setLocked: /* @__PURE__ */ __name(function(lock) { - locked = lock; - }, "setLocked"), - setClear: /* @__PURE__ */ __name(function(stencil) { - if (currentStencilClear !== stencil) { - gl.clearStencil(stencil); - currentStencilClear = stencil; - } - }, "setClear"), - reset: /* @__PURE__ */ __name(function() { - locked = false; - currentStencilMask = null; - currentStencilFunc = null; - currentStencilRef = null; - currentStencilFuncMask = null; - currentStencilFail = null; - currentStencilZFail = null; - currentStencilZPass = null; - currentStencilClear = null; - }, "reset") - }; + multiplyMatrices(a, b) { + const ae = a.elements; + const be = b.elements; + const te2 = this.elements; + const a11 = ae[0], a12 = ae[4], a13 = ae[8], a14 = ae[12]; + const a21 = ae[1], a22 = ae[5], a23 = ae[9], a24 = ae[13]; + const a31 = ae[2], a32 = ae[6], a33 = ae[10], a34 = ae[14]; + const a41 = ae[3], a42 = ae[7], a43 = ae[11], a44 = ae[15]; + const b11 = be[0], b12 = be[4], b13 = be[8], b14 = be[12]; + const b21 = be[1], b22 = be[5], b23 = be[9], b24 = be[13]; + const b31 = be[2], b32 = be[6], b33 = be[10], b34 = be[14]; + const b41 = be[3], b42 = be[7], b43 = be[11], b44 = be[15]; + te2[0] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41; + te2[4] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42; + te2[8] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43; + te2[12] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44; + te2[1] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41; + te2[5] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42; + te2[9] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43; + te2[13] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44; + te2[2] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41; + te2[6] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42; + te2[10] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43; + te2[14] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44; + te2[3] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41; + te2[7] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42; + te2[11] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43; + te2[15] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44; + return this; } - __name(StencilBuffer, "StencilBuffer"); - const colorBuffer = new ColorBuffer(); - const depthBuffer = new DepthBuffer(); - const stencilBuffer = new StencilBuffer(); - const uboBindings = /* @__PURE__ */ new WeakMap(); - const uboProgramMap = /* @__PURE__ */ new WeakMap(); - let enabledCapabilities = {}; - let currentBoundFramebuffers = {}; - let currentDrawbuffers = /* @__PURE__ */ new WeakMap(); - let defaultDrawbuffers = []; - let currentProgram = null; - let currentBlendingEnabled = false; - let currentBlending = null; - let currentBlendEquation = null; - let currentBlendSrc = null; - let currentBlendDst = null; - let currentBlendEquationAlpha = null; - let currentBlendSrcAlpha = null; - let currentBlendDstAlpha = null; - let currentBlendColor = new Color(0, 0, 0); - let currentBlendAlpha = 0; - let currentPremultipledAlpha = false; - let currentFlipSided = null; - let currentCullFace = null; - let currentLineWidth = null; - let currentPolygonOffsetFactor = null; - let currentPolygonOffsetUnits = null; - const maxTextures = gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS); - let lineWidthAvailable = false; - let version = 0; - const glVersion = gl.getParameter(gl.VERSION); - if (glVersion.indexOf("WebGL") !== -1) { - version = parseFloat(/^WebGL (\d)/.exec(glVersion)[1]); - lineWidthAvailable = version >= 1; - } else if (glVersion.indexOf("OpenGL ES") !== -1) { - version = parseFloat(/^OpenGL ES (\d)/.exec(glVersion)[1]); - lineWidthAvailable = version >= 2; + multiplyScalar(s) { + const te2 = this.elements; + te2[0] *= s; + te2[4] *= s; + te2[8] *= s; + te2[12] *= s; + te2[1] *= s; + te2[5] *= s; + te2[9] *= s; + te2[13] *= s; + te2[2] *= s; + te2[6] *= s; + te2[10] *= s; + te2[14] *= s; + te2[3] *= s; + te2[7] *= s; + te2[11] *= s; + te2[15] *= s; + return this; + } + determinant() { + const te2 = this.elements; + const n11 = te2[0], n12 = te2[4], n13 = te2[8], n14 = te2[12]; + const n21 = te2[1], n22 = te2[5], n23 = te2[9], n24 = te2[13]; + const n31 = te2[2], n32 = te2[6], n33 = te2[10], n34 = te2[14]; + const n41 = te2[3], n42 = te2[7], n43 = te2[11], n44 = te2[15]; + return n41 * (+n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34) + n42 * (+n11 * n23 * n34 - n11 * n24 * n33 + n14 * n21 * n33 - n13 * n21 * n34 + n13 * n24 * n31 - n14 * n23 * n31) + n43 * (+n11 * n24 * n32 - n11 * n22 * n34 - n14 * n21 * n32 + n12 * n21 * n34 + n14 * n22 * n31 - n12 * n24 * n31) + n44 * (-n13 * n22 * n31 - n11 * n23 * n32 + n11 * n22 * n33 + n13 * n21 * n32 - n12 * n21 * n33 + n12 * n23 * n31); + } + transpose() { + const te2 = this.elements; + let tmp2; + tmp2 = te2[1]; + te2[1] = te2[4]; + te2[4] = tmp2; + tmp2 = te2[2]; + te2[2] = te2[8]; + te2[8] = tmp2; + tmp2 = te2[6]; + te2[6] = te2[9]; + te2[9] = tmp2; + tmp2 = te2[3]; + te2[3] = te2[12]; + te2[12] = tmp2; + tmp2 = te2[7]; + te2[7] = te2[13]; + te2[13] = tmp2; + tmp2 = te2[11]; + te2[11] = te2[14]; + te2[14] = tmp2; + return this; } - let currentTextureSlot = null; - let currentBoundTextures = {}; - const scissorParam = gl.getParameter(gl.SCISSOR_BOX); - const viewportParam = gl.getParameter(gl.VIEWPORT); - const currentScissor = new Vector4().fromArray(scissorParam); - const currentViewport = new Vector4().fromArray(viewportParam); - function createTexture(type, target, count, dimensions) { - const data = new Uint8Array(4); - const texture = gl.createTexture(); - gl.bindTexture(type, texture); - gl.texParameteri(type, gl.TEXTURE_MIN_FILTER, gl.NEAREST); - gl.texParameteri(type, gl.TEXTURE_MAG_FILTER, gl.NEAREST); - for (let i = 0; i < count; i++) { - if (type === gl.TEXTURE_3D || type === gl.TEXTURE_2D_ARRAY) { - gl.texImage3D(target, 0, gl.RGBA, 1, 1, dimensions, 0, gl.RGBA, gl.UNSIGNED_BYTE, data); - } else { - gl.texImage2D(target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data); - } + setPosition(x, y, z) { + const te2 = this.elements; + if (x.isVector3) { + te2[12] = x.x; + te2[13] = x.y; + te2[14] = x.z; + } else { + te2[12] = x; + te2[13] = y; + te2[14] = z; } - return texture; + return this; } - __name(createTexture, "createTexture"); - const emptyTextures = {}; - emptyTextures[gl.TEXTURE_2D] = createTexture(gl.TEXTURE_2D, gl.TEXTURE_2D, 1); - emptyTextures[gl.TEXTURE_CUBE_MAP] = createTexture(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6); - emptyTextures[gl.TEXTURE_2D_ARRAY] = createTexture(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_2D_ARRAY, 1, 1); - emptyTextures[gl.TEXTURE_3D] = createTexture(gl.TEXTURE_3D, gl.TEXTURE_3D, 1, 1); - colorBuffer.setClear(0, 0, 0, 1); - depthBuffer.setClear(1); - stencilBuffer.setClear(0); - enable(gl.DEPTH_TEST); - depthBuffer.setFunc(LessEqualDepth); - setFlipSided(false); - setCullFace(CullFaceBack); - enable(gl.CULL_FACE); - setBlending(NoBlending); - function enable(id2) { - if (enabledCapabilities[id2] !== true) { - gl.enable(id2); - enabledCapabilities[id2] = true; - } + invert() { + const te2 = this.elements, n11 = te2[0], n21 = te2[1], n31 = te2[2], n41 = te2[3], n12 = te2[4], n22 = te2[5], n32 = te2[6], n42 = te2[7], n13 = te2[8], n23 = te2[9], n33 = te2[10], n43 = te2[11], n14 = te2[12], n24 = te2[13], n34 = te2[14], n44 = te2[15], t11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44, t12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44, t13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44, t14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34; + const det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14; + if (det === 0) return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + const detInv = 1 / det; + te2[0] = t11 * detInv; + te2[1] = (n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44) * detInv; + te2[2] = (n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44) * detInv; + te2[3] = (n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43) * detInv; + te2[4] = t12 * detInv; + te2[5] = (n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44) * detInv; + te2[6] = (n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44) * detInv; + te2[7] = (n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43) * detInv; + te2[8] = t13 * detInv; + te2[9] = (n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44) * detInv; + te2[10] = (n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44) * detInv; + te2[11] = (n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43) * detInv; + te2[12] = t14 * detInv; + te2[13] = (n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34) * detInv; + te2[14] = (n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34) * detInv; + te2[15] = (n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33) * detInv; + return this; } - __name(enable, "enable"); - function disable(id2) { - if (enabledCapabilities[id2] !== false) { - gl.disable(id2); - enabledCapabilities[id2] = false; - } + scale(v) { + const te2 = this.elements; + const x = v.x, y = v.y, z = v.z; + te2[0] *= x; + te2[4] *= y; + te2[8] *= z; + te2[1] *= x; + te2[5] *= y; + te2[9] *= z; + te2[2] *= x; + te2[6] *= y; + te2[10] *= z; + te2[3] *= x; + te2[7] *= y; + te2[11] *= z; + return this; } - __name(disable, "disable"); - function bindFramebuffer(target, framebuffer) { - if (currentBoundFramebuffers[target] !== framebuffer) { - gl.bindFramebuffer(target, framebuffer); - currentBoundFramebuffers[target] = framebuffer; - if (target === gl.DRAW_FRAMEBUFFER) { - currentBoundFramebuffers[gl.FRAMEBUFFER] = framebuffer; - } - if (target === gl.FRAMEBUFFER) { - currentBoundFramebuffers[gl.DRAW_FRAMEBUFFER] = framebuffer; - } - return true; - } - return false; + getMaxScaleOnAxis() { + const te2 = this.elements; + const scaleXSq = te2[0] * te2[0] + te2[1] * te2[1] + te2[2] * te2[2]; + const scaleYSq = te2[4] * te2[4] + te2[5] * te2[5] + te2[6] * te2[6]; + const scaleZSq = te2[8] * te2[8] + te2[9] * te2[9] + te2[10] * te2[10]; + return Math.sqrt(Math.max(scaleXSq, scaleYSq, scaleZSq)); } - __name(bindFramebuffer, "bindFramebuffer"); - function drawBuffers(renderTarget, framebuffer) { - let drawBuffers2 = defaultDrawbuffers; - let needsUpdate = false; - if (renderTarget) { - drawBuffers2 = currentDrawbuffers.get(framebuffer); - if (drawBuffers2 === void 0) { - drawBuffers2 = []; - currentDrawbuffers.set(framebuffer, drawBuffers2); - } - const textures = renderTarget.textures; - if (drawBuffers2.length !== textures.length || drawBuffers2[0] !== gl.COLOR_ATTACHMENT0) { - for (let i = 0, il = textures.length; i < il; i++) { - drawBuffers2[i] = gl.COLOR_ATTACHMENT0 + i; - } - drawBuffers2.length = textures.length; - needsUpdate = true; - } + makeTranslation(x, y, z) { + if (x.isVector3) { + this.set( + 1, + 0, + 0, + x.x, + 0, + 1, + 0, + x.y, + 0, + 0, + 1, + x.z, + 0, + 0, + 0, + 1 + ); } else { - if (drawBuffers2[0] !== gl.BACK) { - drawBuffers2[0] = gl.BACK; - needsUpdate = true; - } - } - if (needsUpdate) { - gl.drawBuffers(drawBuffers2); + this.set( + 1, + 0, + 0, + x, + 0, + 1, + 0, + y, + 0, + 0, + 1, + z, + 0, + 0, + 0, + 1 + ); } + return this; } - __name(drawBuffers, "drawBuffers"); - function useProgram(program) { - if (currentProgram !== program) { - gl.useProgram(program); - currentProgram = program; - return true; - } - return false; + makeRotationX(theta) { + const c = Math.cos(theta), s = Math.sin(theta); + this.set( + 1, + 0, + 0, + 0, + 0, + c, + -s, + 0, + 0, + s, + c, + 0, + 0, + 0, + 0, + 1 + ); + return this; } - __name(useProgram, "useProgram"); - const equationToGL = { - [AddEquation]: gl.FUNC_ADD, - [SubtractEquation]: gl.FUNC_SUBTRACT, - [ReverseSubtractEquation]: gl.FUNC_REVERSE_SUBTRACT - }; - equationToGL[MinEquation] = gl.MIN; - equationToGL[MaxEquation] = gl.MAX; - const factorToGL = { - [ZeroFactor]: gl.ZERO, - [OneFactor]: gl.ONE, - [SrcColorFactor]: gl.SRC_COLOR, - [SrcAlphaFactor]: gl.SRC_ALPHA, - [SrcAlphaSaturateFactor]: gl.SRC_ALPHA_SATURATE, - [DstColorFactor]: gl.DST_COLOR, - [DstAlphaFactor]: gl.DST_ALPHA, - [OneMinusSrcColorFactor]: gl.ONE_MINUS_SRC_COLOR, - [OneMinusSrcAlphaFactor]: gl.ONE_MINUS_SRC_ALPHA, - [OneMinusDstColorFactor]: gl.ONE_MINUS_DST_COLOR, - [OneMinusDstAlphaFactor]: gl.ONE_MINUS_DST_ALPHA, - [ConstantColorFactor]: gl.CONSTANT_COLOR, - [OneMinusConstantColorFactor]: gl.ONE_MINUS_CONSTANT_COLOR, - [ConstantAlphaFactor]: gl.CONSTANT_ALPHA, - [OneMinusConstantAlphaFactor]: gl.ONE_MINUS_CONSTANT_ALPHA - }; - function setBlending(blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, blendColor, blendAlpha, premultipliedAlpha) { - if (blending === NoBlending) { - if (currentBlendingEnabled === true) { - disable(gl.BLEND); - currentBlendingEnabled = false; - } - return; - } - if (currentBlendingEnabled === false) { - enable(gl.BLEND); - currentBlendingEnabled = true; - } - if (blending !== CustomBlending) { - if (blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha) { - if (currentBlendEquation !== AddEquation || currentBlendEquationAlpha !== AddEquation) { - gl.blendEquation(gl.FUNC_ADD); - currentBlendEquation = AddEquation; - currentBlendEquationAlpha = AddEquation; - } - if (premultipliedAlpha) { - switch (blending) { - case NormalBlending: - gl.blendFuncSeparate(gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - break; - case AdditiveBlending: - gl.blendFunc(gl.ONE, gl.ONE); - break; - case SubtractiveBlending: - gl.blendFuncSeparate(gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE); - break; - case MultiplyBlending: - gl.blendFuncSeparate(gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA); - break; - default: - console.error("THREE.WebGLState: Invalid blending: ", blending); - break; - } - } else { - switch (blending) { - case NormalBlending: - gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - break; - case AdditiveBlending: - gl.blendFunc(gl.SRC_ALPHA, gl.ONE); - break; - case SubtractiveBlending: - gl.blendFuncSeparate(gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE); - break; - case MultiplyBlending: - gl.blendFunc(gl.ZERO, gl.SRC_COLOR); - break; - default: - console.error("THREE.WebGLState: Invalid blending: ", blending); - break; - } - } - currentBlendSrc = null; - currentBlendDst = null; - currentBlendSrcAlpha = null; - currentBlendDstAlpha = null; - currentBlendColor.set(0, 0, 0); - currentBlendAlpha = 0; - currentBlending = blending; - currentPremultipledAlpha = premultipliedAlpha; - } - return; - } - blendEquationAlpha = blendEquationAlpha || blendEquation; - blendSrcAlpha = blendSrcAlpha || blendSrc; - blendDstAlpha = blendDstAlpha || blendDst; - if (blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha) { - gl.blendEquationSeparate(equationToGL[blendEquation], equationToGL[blendEquationAlpha]); - currentBlendEquation = blendEquation; - currentBlendEquationAlpha = blendEquationAlpha; - } - if (blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha) { - gl.blendFuncSeparate(factorToGL[blendSrc], factorToGL[blendDst], factorToGL[blendSrcAlpha], factorToGL[blendDstAlpha]); - currentBlendSrc = blendSrc; - currentBlendDst = blendDst; - currentBlendSrcAlpha = blendSrcAlpha; - currentBlendDstAlpha = blendDstAlpha; + makeRotationY(theta) { + const c = Math.cos(theta), s = Math.sin(theta); + this.set( + c, + 0, + s, + 0, + 0, + 1, + 0, + 0, + -s, + 0, + c, + 0, + 0, + 0, + 0, + 1 + ); + return this; + } + makeRotationZ(theta) { + const c = Math.cos(theta), s = Math.sin(theta); + this.set( + c, + -s, + 0, + 0, + s, + c, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ); + return this; + } + makeRotationAxis(axis, angle) { + const c = Math.cos(angle); + const s = Math.sin(angle); + const t2 = 1 - c; + const x = axis.x, y = axis.y, z = axis.z; + const tx = t2 * x, ty = t2 * y; + this.set( + tx * x + c, + tx * y - s * z, + tx * z + s * y, + 0, + tx * y + s * z, + ty * y + c, + ty * z - s * x, + 0, + tx * z - s * y, + ty * z + s * x, + t2 * z * z + c, + 0, + 0, + 0, + 0, + 1 + ); + return this; + } + makeScale(x, y, z) { + this.set( + x, + 0, + 0, + 0, + 0, + y, + 0, + 0, + 0, + 0, + z, + 0, + 0, + 0, + 0, + 1 + ); + return this; + } + makeShear(xy, xz, yx, yz, zx, zy) { + this.set( + 1, + yx, + zx, + 0, + xy, + 1, + zy, + 0, + xz, + yz, + 1, + 0, + 0, + 0, + 0, + 1 + ); + return this; + } + compose(position, quaternion, scale) { + const te2 = this.elements; + const x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w; + const x2 = x + x, y2 = y + y, z2 = z + z; + const xx = x * x2, xy = x * y2, xz = x * z2; + const yy = y * y2, yz = y * z2, zz = z * z2; + const wx = w * x2, wy = w * y2, wz = w * z2; + const sx = scale.x, sy = scale.y, sz = scale.z; + te2[0] = (1 - (yy + zz)) * sx; + te2[1] = (xy + wz) * sx; + te2[2] = (xz - wy) * sx; + te2[3] = 0; + te2[4] = (xy - wz) * sy; + te2[5] = (1 - (xx + zz)) * sy; + te2[6] = (yz + wx) * sy; + te2[7] = 0; + te2[8] = (xz + wy) * sz; + te2[9] = (yz - wx) * sz; + te2[10] = (1 - (xx + yy)) * sz; + te2[11] = 0; + te2[12] = position.x; + te2[13] = position.y; + te2[14] = position.z; + te2[15] = 1; + return this; + } + decompose(position, quaternion, scale) { + const te2 = this.elements; + let sx = _v1$5.set(te2[0], te2[1], te2[2]).length(); + const sy = _v1$5.set(te2[4], te2[5], te2[6]).length(); + const sz = _v1$5.set(te2[8], te2[9], te2[10]).length(); + const det = this.determinant(); + if (det < 0) sx = -sx; + position.x = te2[12]; + position.y = te2[13]; + position.z = te2[14]; + _m1$4.copy(this); + const invSX = 1 / sx; + const invSY = 1 / sy; + const invSZ = 1 / sz; + _m1$4.elements[0] *= invSX; + _m1$4.elements[1] *= invSX; + _m1$4.elements[2] *= invSX; + _m1$4.elements[4] *= invSY; + _m1$4.elements[5] *= invSY; + _m1$4.elements[6] *= invSY; + _m1$4.elements[8] *= invSZ; + _m1$4.elements[9] *= invSZ; + _m1$4.elements[10] *= invSZ; + quaternion.setFromRotationMatrix(_m1$4); + scale.x = sx; + scale.y = sy; + scale.z = sz; + return this; + } + makePerspective(left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem) { + const te2 = this.elements; + const x = 2 * near / (right - left); + const y = 2 * near / (top - bottom); + const a = (right + left) / (right - left); + const b = (top + bottom) / (top - bottom); + let c, d; + if (coordinateSystem === WebGLCoordinateSystem) { + c = -(far + near) / (far - near); + d = -2 * far * near / (far - near); + } else if (coordinateSystem === WebGPUCoordinateSystem) { + c = -far / (far - near); + d = -far * near / (far - near); + } else { + throw new Error("THREE.Matrix4.makePerspective(): Invalid coordinate system: " + coordinateSystem); } - if (blendColor.equals(currentBlendColor) === false || blendAlpha !== currentBlendAlpha) { - gl.blendColor(blendColor.r, blendColor.g, blendColor.b, blendAlpha); - currentBlendColor.copy(blendColor); - currentBlendAlpha = blendAlpha; + te2[0] = x; + te2[4] = 0; + te2[8] = a; + te2[12] = 0; + te2[1] = 0; + te2[5] = y; + te2[9] = b; + te2[13] = 0; + te2[2] = 0; + te2[6] = 0; + te2[10] = c; + te2[14] = d; + te2[3] = 0; + te2[7] = 0; + te2[11] = -1; + te2[15] = 0; + return this; + } + makeOrthographic(left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem) { + const te2 = this.elements; + const w = 1 / (right - left); + const h = 1 / (top - bottom); + const p = 1 / (far - near); + const x = (right + left) * w; + const y = (top + bottom) * h; + let z, zInv; + if (coordinateSystem === WebGLCoordinateSystem) { + z = (far + near) * p; + zInv = -2 * p; + } else if (coordinateSystem === WebGPUCoordinateSystem) { + z = near * p; + zInv = -1 * p; + } else { + throw new Error("THREE.Matrix4.makeOrthographic(): Invalid coordinate system: " + coordinateSystem); } - currentBlending = blending; - currentPremultipledAlpha = false; + te2[0] = 2 * w; + te2[4] = 0; + te2[8] = 0; + te2[12] = -x; + te2[1] = 0; + te2[5] = 2 * h; + te2[9] = 0; + te2[13] = -y; + te2[2] = 0; + te2[6] = 0; + te2[10] = zInv; + te2[14] = -z; + te2[3] = 0; + te2[7] = 0; + te2[11] = 0; + te2[15] = 1; + return this; } - __name(setBlending, "setBlending"); - function setMaterial(material, frontFaceCW) { - material.side === DoubleSide ? disable(gl.CULL_FACE) : enable(gl.CULL_FACE); - let flipSided = material.side === BackSide; - if (frontFaceCW) flipSided = !flipSided; - setFlipSided(flipSided); - material.blending === NormalBlending && material.transparent === false ? setBlending(NoBlending) : setBlending(material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.blendColor, material.blendAlpha, material.premultipliedAlpha); - depthBuffer.setFunc(material.depthFunc); - depthBuffer.setTest(material.depthTest); - depthBuffer.setMask(material.depthWrite); - colorBuffer.setMask(material.colorWrite); - const stencilWrite = material.stencilWrite; - stencilBuffer.setTest(stencilWrite); - if (stencilWrite) { - stencilBuffer.setMask(material.stencilWriteMask); - stencilBuffer.setFunc(material.stencilFunc, material.stencilRef, material.stencilFuncMask); - stencilBuffer.setOp(material.stencilFail, material.stencilZFail, material.stencilZPass); + equals(matrix) { + const te2 = this.elements; + const me = matrix.elements; + for (let i = 0; i < 16; i++) { + if (te2[i] !== me[i]) return false; } - setPolygonOffset(material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits); - material.alphaToCoverage === true ? enable(gl.SAMPLE_ALPHA_TO_COVERAGE) : disable(gl.SAMPLE_ALPHA_TO_COVERAGE); + return true; } - __name(setMaterial, "setMaterial"); - function setFlipSided(flipSided) { - if (currentFlipSided !== flipSided) { - if (flipSided) { - gl.frontFace(gl.CW); - } else { - gl.frontFace(gl.CCW); - } - currentFlipSided = flipSided; + fromArray(array, offset = 0) { + for (let i = 0; i < 16; i++) { + this.elements[i] = array[i + offset]; } + return this; } - __name(setFlipSided, "setFlipSided"); - function setCullFace(cullFace) { - if (cullFace !== CullFaceNone) { - enable(gl.CULL_FACE); - if (cullFace !== currentCullFace) { - if (cullFace === CullFaceBack) { - gl.cullFace(gl.BACK); - } else if (cullFace === CullFaceFront) { - gl.cullFace(gl.FRONT); + toArray(array = [], offset = 0) { + const te2 = this.elements; + array[offset] = te2[0]; + array[offset + 1] = te2[1]; + array[offset + 2] = te2[2]; + array[offset + 3] = te2[3]; + array[offset + 4] = te2[4]; + array[offset + 5] = te2[5]; + array[offset + 6] = te2[6]; + array[offset + 7] = te2[7]; + array[offset + 8] = te2[8]; + array[offset + 9] = te2[9]; + array[offset + 10] = te2[10]; + array[offset + 11] = te2[11]; + array[offset + 12] = te2[12]; + array[offset + 13] = te2[13]; + array[offset + 14] = te2[14]; + array[offset + 15] = te2[15]; + return array; + } +} +const _v1$5 = /* @__PURE__ */ new Vector3(); +const _m1$4 = /* @__PURE__ */ new Matrix4(); +const _zero = /* @__PURE__ */ new Vector3(0, 0, 0); +const _one = /* @__PURE__ */ new Vector3(1, 1, 1); +const _x = /* @__PURE__ */ new Vector3(); +const _y = /* @__PURE__ */ new Vector3(); +const _z = /* @__PURE__ */ new Vector3(); +const _matrix$2 = /* @__PURE__ */ new Matrix4(); +const _quaternion$3 = /* @__PURE__ */ new Quaternion(); +class Euler { + static { + __name(this, "Euler"); + } + constructor(x = 0, y = 0, z = 0, order = Euler.DEFAULT_ORDER) { + this.isEuler = true; + this._x = x; + this._y = y; + this._z = z; + this._order = order; + } + get x() { + return this._x; + } + set x(value) { + this._x = value; + this._onChangeCallback(); + } + get y() { + return this._y; + } + set y(value) { + this._y = value; + this._onChangeCallback(); + } + get z() { + return this._z; + } + set z(value) { + this._z = value; + this._onChangeCallback(); + } + get order() { + return this._order; + } + set order(value) { + this._order = value; + this._onChangeCallback(); + } + set(x, y, z, order = this._order) { + this._x = x; + this._y = y; + this._z = z; + this._order = order; + this._onChangeCallback(); + return this; + } + clone() { + return new this.constructor(this._x, this._y, this._z, this._order); + } + copy(euler) { + this._x = euler._x; + this._y = euler._y; + this._z = euler._z; + this._order = euler._order; + this._onChangeCallback(); + return this; + } + setFromRotationMatrix(m, order = this._order, update = true) { + const te2 = m.elements; + const m11 = te2[0], m12 = te2[4], m13 = te2[8]; + const m21 = te2[1], m22 = te2[5], m23 = te2[9]; + const m31 = te2[2], m32 = te2[6], m33 = te2[10]; + switch (order) { + case "XYZ": + this._y = Math.asin(clamp(m13, -1, 1)); + if (Math.abs(m13) < 0.9999999) { + this._x = Math.atan2(-m23, m33); + this._z = Math.atan2(-m12, m11); } else { - gl.cullFace(gl.FRONT_AND_BACK); + this._x = Math.atan2(m32, m22); + this._z = 0; } - } - } else { - disable(gl.CULL_FACE); + break; + case "YXZ": + this._x = Math.asin(-clamp(m23, -1, 1)); + if (Math.abs(m23) < 0.9999999) { + this._y = Math.atan2(m13, m33); + this._z = Math.atan2(m21, m22); + } else { + this._y = Math.atan2(-m31, m11); + this._z = 0; + } + break; + case "ZXY": + this._x = Math.asin(clamp(m32, -1, 1)); + if (Math.abs(m32) < 0.9999999) { + this._y = Math.atan2(-m31, m33); + this._z = Math.atan2(-m12, m22); + } else { + this._y = 0; + this._z = Math.atan2(m21, m11); + } + break; + case "ZYX": + this._y = Math.asin(-clamp(m31, -1, 1)); + if (Math.abs(m31) < 0.9999999) { + this._x = Math.atan2(m32, m33); + this._z = Math.atan2(m21, m11); + } else { + this._x = 0; + this._z = Math.atan2(-m12, m22); + } + break; + case "YZX": + this._z = Math.asin(clamp(m21, -1, 1)); + if (Math.abs(m21) < 0.9999999) { + this._x = Math.atan2(-m23, m22); + this._y = Math.atan2(-m31, m11); + } else { + this._x = 0; + this._y = Math.atan2(m13, m33); + } + break; + case "XZY": + this._z = Math.asin(-clamp(m12, -1, 1)); + if (Math.abs(m12) < 0.9999999) { + this._x = Math.atan2(m32, m22); + this._y = Math.atan2(m13, m11); + } else { + this._x = Math.atan2(-m23, m33); + this._y = 0; + } + break; + default: + console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: " + order); } - currentCullFace = cullFace; + this._order = order; + if (update === true) this._onChangeCallback(); + return this; } - __name(setCullFace, "setCullFace"); - function setLineWidth(width) { - if (width !== currentLineWidth) { - if (lineWidthAvailable) gl.lineWidth(width); - currentLineWidth = width; - } + setFromQuaternion(q, order, update) { + _matrix$2.makeRotationFromQuaternion(q); + return this.setFromRotationMatrix(_matrix$2, order, update); } - __name(setLineWidth, "setLineWidth"); - function setPolygonOffset(polygonOffset, factor, units) { - if (polygonOffset) { - enable(gl.POLYGON_OFFSET_FILL); - if (currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units) { - gl.polygonOffset(factor, units); - currentPolygonOffsetFactor = factor; - currentPolygonOffsetUnits = units; - } - } else { - disable(gl.POLYGON_OFFSET_FILL); - } + setFromVector3(v, order = this._order) { + return this.set(v.x, v.y, v.z, order); } - __name(setPolygonOffset, "setPolygonOffset"); - function setScissorTest(scissorTest) { - if (scissorTest) { - enable(gl.SCISSOR_TEST); - } else { - disable(gl.SCISSOR_TEST); - } + reorder(newOrder) { + _quaternion$3.setFromEuler(this); + return this.setFromQuaternion(_quaternion$3, newOrder); } - __name(setScissorTest, "setScissorTest"); - function activeTexture(webglSlot) { - if (webglSlot === void 0) webglSlot = gl.TEXTURE0 + maxTextures - 1; - if (currentTextureSlot !== webglSlot) { - gl.activeTexture(webglSlot); - currentTextureSlot = webglSlot; - } + equals(euler) { + return euler._x === this._x && euler._y === this._y && euler._z === this._z && euler._order === this._order; } - __name(activeTexture, "activeTexture"); - function bindTexture(webglType, webglTexture, webglSlot) { - if (webglSlot === void 0) { - if (currentTextureSlot === null) { - webglSlot = gl.TEXTURE0 + maxTextures - 1; - } else { - webglSlot = currentTextureSlot; - } - } - let boundTexture = currentBoundTextures[webglSlot]; - if (boundTexture === void 0) { - boundTexture = { type: void 0, texture: void 0 }; - currentBoundTextures[webglSlot] = boundTexture; - } - if (boundTexture.type !== webglType || boundTexture.texture !== webglTexture) { - if (currentTextureSlot !== webglSlot) { - gl.activeTexture(webglSlot); - currentTextureSlot = webglSlot; - } - gl.bindTexture(webglType, webglTexture || emptyTextures[webglType]); - boundTexture.type = webglType; - boundTexture.texture = webglTexture; - } + fromArray(array) { + this._x = array[0]; + this._y = array[1]; + this._z = array[2]; + if (array[3] !== void 0) this._order = array[3]; + this._onChangeCallback(); + return this; } - __name(bindTexture, "bindTexture"); - function unbindTexture() { - const boundTexture = currentBoundTextures[currentTextureSlot]; - if (boundTexture !== void 0 && boundTexture.type !== void 0) { - gl.bindTexture(boundTexture.type, null); - boundTexture.type = void 0; - boundTexture.texture = void 0; - } + toArray(array = [], offset = 0) { + array[offset] = this._x; + array[offset + 1] = this._y; + array[offset + 2] = this._z; + array[offset + 3] = this._order; + return array; } - __name(unbindTexture, "unbindTexture"); - function compressedTexImage2D() { - try { - gl.compressedTexImage2D.apply(gl, arguments); - } catch (error) { - console.error("THREE.WebGLState:", error); - } + _onChange(callback) { + this._onChangeCallback = callback; + return this; } - __name(compressedTexImage2D, "compressedTexImage2D"); - function compressedTexImage3D() { - try { - gl.compressedTexImage3D.apply(gl, arguments); - } catch (error) { - console.error("THREE.WebGLState:", error); - } + _onChangeCallback() { } - __name(compressedTexImage3D, "compressedTexImage3D"); - function texSubImage2D() { - try { - gl.texSubImage2D.apply(gl, arguments); - } catch (error) { - console.error("THREE.WebGLState:", error); - } + *[Symbol.iterator]() { + yield this._x; + yield this._y; + yield this._z; + yield this._order; } - __name(texSubImage2D, "texSubImage2D"); - function texSubImage3D() { - try { - gl.texSubImage3D.apply(gl, arguments); - } catch (error) { - console.error("THREE.WebGLState:", error); - } +} +Euler.DEFAULT_ORDER = "XYZ"; +class Layers { + static { + __name(this, "Layers"); } - __name(texSubImage3D, "texSubImage3D"); - function compressedTexSubImage2D() { - try { - gl.compressedTexSubImage2D.apply(gl, arguments); - } catch (error) { - console.error("THREE.WebGLState:", error); - } + constructor() { + this.mask = 1 | 0; } - __name(compressedTexSubImage2D, "compressedTexSubImage2D"); - function compressedTexSubImage3D() { - try { - gl.compressedTexSubImage3D.apply(gl, arguments); - } catch (error) { - console.error("THREE.WebGLState:", error); - } + set(channel) { + this.mask = (1 << channel | 0) >>> 0; } - __name(compressedTexSubImage3D, "compressedTexSubImage3D"); - function texStorage2D() { - try { - gl.texStorage2D.apply(gl, arguments); - } catch (error) { - console.error("THREE.WebGLState:", error); + enable(channel) { + this.mask |= 1 << channel | 0; + } + enableAll() { + this.mask = 4294967295 | 0; + } + toggle(channel) { + this.mask ^= 1 << channel | 0; + } + disable(channel) { + this.mask &= ~(1 << channel | 0); + } + disableAll() { + this.mask = 0; + } + test(layers) { + return (this.mask & layers.mask) !== 0; + } + isEnabled(channel) { + return (this.mask & (1 << channel | 0)) !== 0; + } +} +let _object3DId = 0; +const _v1$4 = /* @__PURE__ */ new Vector3(); +const _q1 = /* @__PURE__ */ new Quaternion(); +const _m1$3 = /* @__PURE__ */ new Matrix4(); +const _target = /* @__PURE__ */ new Vector3(); +const _position$3 = /* @__PURE__ */ new Vector3(); +const _scale$2 = /* @__PURE__ */ new Vector3(); +const _quaternion$2 = /* @__PURE__ */ new Quaternion(); +const _xAxis = /* @__PURE__ */ new Vector3(1, 0, 0); +const _yAxis = /* @__PURE__ */ new Vector3(0, 1, 0); +const _zAxis = /* @__PURE__ */ new Vector3(0, 0, 1); +const _addedEvent = { type: "added" }; +const _removedEvent = { type: "removed" }; +const _childaddedEvent = { type: "childadded", child: null }; +const _childremovedEvent = { type: "childremoved", child: null }; +class Object3D extends EventDispatcher { + static { + __name(this, "Object3D"); + } + constructor() { + super(); + this.isObject3D = true; + Object.defineProperty(this, "id", { value: _object3DId++ }); + this.uuid = generateUUID(); + this.name = ""; + this.type = "Object3D"; + this.parent = null; + this.children = []; + this.up = Object3D.DEFAULT_UP.clone(); + const position = new Vector3(); + const rotation = new Euler(); + const quaternion = new Quaternion(); + const scale = new Vector3(1, 1, 1); + function onRotationChange() { + quaternion.setFromEuler(rotation, false); + } + __name(onRotationChange, "onRotationChange"); + function onQuaternionChange() { + rotation.setFromQuaternion(quaternion, void 0, false); } + __name(onQuaternionChange, "onQuaternionChange"); + rotation._onChange(onRotationChange); + quaternion._onChange(onQuaternionChange); + Object.defineProperties(this, { + position: { + configurable: true, + enumerable: true, + value: position + }, + rotation: { + configurable: true, + enumerable: true, + value: rotation + }, + quaternion: { + configurable: true, + enumerable: true, + value: quaternion + }, + scale: { + configurable: true, + enumerable: true, + value: scale + }, + modelViewMatrix: { + value: new Matrix4() + }, + normalMatrix: { + value: new Matrix3() + } + }); + this.matrix = new Matrix4(); + this.matrixWorld = new Matrix4(); + this.matrixAutoUpdate = Object3D.DEFAULT_MATRIX_AUTO_UPDATE; + this.matrixWorldAutoUpdate = Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE; + this.matrixWorldNeedsUpdate = false; + this.layers = new Layers(); + this.visible = true; + this.castShadow = false; + this.receiveShadow = false; + this.frustumCulled = true; + this.renderOrder = 0; + this.animations = []; + this.userData = {}; } - __name(texStorage2D, "texStorage2D"); - function texStorage3D() { - try { - gl.texStorage3D.apply(gl, arguments); - } catch (error) { - console.error("THREE.WebGLState:", error); - } + onBeforeShadow() { } - __name(texStorage3D, "texStorage3D"); - function texImage2D() { - try { - gl.texImage2D.apply(gl, arguments); - } catch (error) { - console.error("THREE.WebGLState:", error); - } + onAfterShadow() { } - __name(texImage2D, "texImage2D"); - function texImage3D() { - try { - gl.texImage3D.apply(gl, arguments); - } catch (error) { - console.error("THREE.WebGLState:", error); - } + onBeforeRender() { } - __name(texImage3D, "texImage3D"); - function scissor(scissor2) { - if (currentScissor.equals(scissor2) === false) { - gl.scissor(scissor2.x, scissor2.y, scissor2.z, scissor2.w); - currentScissor.copy(scissor2); - } + onAfterRender() { } - __name(scissor, "scissor"); - function viewport(viewport2) { - if (currentViewport.equals(viewport2) === false) { - gl.viewport(viewport2.x, viewport2.y, viewport2.z, viewport2.w); - currentViewport.copy(viewport2); - } + applyMatrix4(matrix) { + if (this.matrixAutoUpdate) this.updateMatrix(); + this.matrix.premultiply(matrix); + this.matrix.decompose(this.position, this.quaternion, this.scale); } - __name(viewport, "viewport"); - function updateUBOMapping(uniformsGroup, program) { - let mapping = uboProgramMap.get(program); - if (mapping === void 0) { - mapping = /* @__PURE__ */ new WeakMap(); - uboProgramMap.set(program, mapping); - } - let blockIndex = mapping.get(uniformsGroup); - if (blockIndex === void 0) { - blockIndex = gl.getUniformBlockIndex(program, uniformsGroup.name); - mapping.set(uniformsGroup, blockIndex); - } + applyQuaternion(q) { + this.quaternion.premultiply(q); + return this; } - __name(updateUBOMapping, "updateUBOMapping"); - function uniformBlockBinding(uniformsGroup, program) { - const mapping = uboProgramMap.get(program); - const blockIndex = mapping.get(uniformsGroup); - if (uboBindings.get(program) !== blockIndex) { - gl.uniformBlockBinding(program, blockIndex, uniformsGroup.__bindingPointIndex); - uboBindings.set(program, blockIndex); - } + setRotationFromAxisAngle(axis, angle) { + this.quaternion.setFromAxisAngle(axis, angle); } - __name(uniformBlockBinding, "uniformBlockBinding"); - function reset() { - gl.disable(gl.BLEND); - gl.disable(gl.CULL_FACE); - gl.disable(gl.DEPTH_TEST); - gl.disable(gl.POLYGON_OFFSET_FILL); - gl.disable(gl.SCISSOR_TEST); - gl.disable(gl.STENCIL_TEST); - gl.disable(gl.SAMPLE_ALPHA_TO_COVERAGE); - gl.blendEquation(gl.FUNC_ADD); - gl.blendFunc(gl.ONE, gl.ZERO); - gl.blendFuncSeparate(gl.ONE, gl.ZERO, gl.ONE, gl.ZERO); - gl.blendColor(0, 0, 0, 0); - gl.colorMask(true, true, true, true); - gl.clearColor(0, 0, 0, 0); - gl.depthMask(true); - gl.depthFunc(gl.LESS); - depthBuffer.setReversed(false); - gl.clearDepth(1); - gl.stencilMask(4294967295); - gl.stencilFunc(gl.ALWAYS, 0, 4294967295); - gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP); - gl.clearStencil(0); - gl.cullFace(gl.BACK); - gl.frontFace(gl.CCW); - gl.polygonOffset(0, 0); - gl.activeTexture(gl.TEXTURE0); - gl.bindFramebuffer(gl.FRAMEBUFFER, null); - gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null); - gl.bindFramebuffer(gl.READ_FRAMEBUFFER, null); - gl.useProgram(null); - gl.lineWidth(1); - gl.scissor(0, 0, gl.canvas.width, gl.canvas.height); - gl.viewport(0, 0, gl.canvas.width, gl.canvas.height); - enabledCapabilities = {}; - currentTextureSlot = null; - currentBoundTextures = {}; - currentBoundFramebuffers = {}; - currentDrawbuffers = /* @__PURE__ */ new WeakMap(); - defaultDrawbuffers = []; - currentProgram = null; - currentBlendingEnabled = false; - currentBlending = null; - currentBlendEquation = null; - currentBlendSrc = null; - currentBlendDst = null; - currentBlendEquationAlpha = null; - currentBlendSrcAlpha = null; - currentBlendDstAlpha = null; - currentBlendColor = new Color(0, 0, 0); - currentBlendAlpha = 0; - currentPremultipledAlpha = false; - currentFlipSided = null; - currentCullFace = null; - currentLineWidth = null; - currentPolygonOffsetFactor = null; - currentPolygonOffsetUnits = null; - currentScissor.set(0, 0, gl.canvas.width, gl.canvas.height); - currentViewport.set(0, 0, gl.canvas.width, gl.canvas.height); - colorBuffer.reset(); - depthBuffer.reset(); - stencilBuffer.reset(); + setRotationFromEuler(euler) { + this.quaternion.setFromEuler(euler, true); } - __name(reset, "reset"); - return { - buffers: { - color: colorBuffer, - depth: depthBuffer, - stencil: stencilBuffer - }, - enable, - disable, - bindFramebuffer, - drawBuffers, - useProgram, - setBlending, - setMaterial, - setFlipSided, - setCullFace, - setLineWidth, - setPolygonOffset, - setScissorTest, - activeTexture, - bindTexture, - unbindTexture, - compressedTexImage2D, - compressedTexImage3D, - texImage2D, - texImage3D, - updateUBOMapping, - uniformBlockBinding, - texStorage2D, - texStorage3D, - texSubImage2D, - texSubImage3D, - compressedTexSubImage2D, - compressedTexSubImage3D, - scissor, - viewport, - reset - }; -} -__name(WebGLState, "WebGLState"); -function contain(texture, aspect2) { - const imageAspect = texture.image && texture.image.width ? texture.image.width / texture.image.height : 1; - if (imageAspect > aspect2) { - texture.repeat.x = 1; - texture.repeat.y = imageAspect / aspect2; - texture.offset.x = 0; - texture.offset.y = (1 - texture.repeat.y) / 2; - } else { - texture.repeat.x = aspect2 / imageAspect; - texture.repeat.y = 1; - texture.offset.x = (1 - texture.repeat.x) / 2; - texture.offset.y = 0; + setRotationFromMatrix(m) { + this.quaternion.setFromRotationMatrix(m); } - return texture; -} -__name(contain, "contain"); -function cover(texture, aspect2) { - const imageAspect = texture.image && texture.image.width ? texture.image.width / texture.image.height : 1; - if (imageAspect > aspect2) { - texture.repeat.x = aspect2 / imageAspect; - texture.repeat.y = 1; - texture.offset.x = (1 - texture.repeat.x) / 2; - texture.offset.y = 0; - } else { - texture.repeat.x = 1; - texture.repeat.y = imageAspect / aspect2; - texture.offset.x = 0; - texture.offset.y = (1 - texture.repeat.y) / 2; + setRotationFromQuaternion(q) { + this.quaternion.copy(q); } - return texture; -} -__name(cover, "cover"); -function fill(texture) { - texture.repeat.x = 1; - texture.repeat.y = 1; - texture.offset.x = 0; - texture.offset.y = 0; - return texture; -} -__name(fill, "fill"); -function getByteLength(width, height, format, type) { - const typeByteLength = getTextureTypeByteLength(type); - switch (format) { - case AlphaFormat: - return width * height; - case LuminanceFormat: - return width * height; - case LuminanceAlphaFormat: - return width * height * 2; - case RedFormat: - return width * height / typeByteLength.components * typeByteLength.byteLength; - case RedIntegerFormat: - return width * height / typeByteLength.components * typeByteLength.byteLength; - case RGFormat: - return width * height * 2 / typeByteLength.components * typeByteLength.byteLength; - case RGIntegerFormat: - return width * height * 2 / typeByteLength.components * typeByteLength.byteLength; - case RGBFormat: - return width * height * 3 / typeByteLength.components * typeByteLength.byteLength; - case RGBAFormat: - return width * height * 4 / typeByteLength.components * typeByteLength.byteLength; - case RGBAIntegerFormat: - return width * height * 4 / typeByteLength.components * typeByteLength.byteLength; - case RGB_S3TC_DXT1_Format: - case RGBA_S3TC_DXT1_Format: - return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 8; - case RGBA_S3TC_DXT3_Format: - case RGBA_S3TC_DXT5_Format: - return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 16; - case RGB_PVRTC_2BPPV1_Format: - case RGBA_PVRTC_2BPPV1_Format: - return Math.max(width, 16) * Math.max(height, 8) / 4; - case RGB_PVRTC_4BPPV1_Format: - case RGBA_PVRTC_4BPPV1_Format: - return Math.max(width, 8) * Math.max(height, 8) / 2; - case RGB_ETC1_Format: - case RGB_ETC2_Format: - return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 8; - case RGBA_ETC2_EAC_Format: - return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 16; - case RGBA_ASTC_4x4_Format: - return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 16; - case RGBA_ASTC_5x4_Format: - return Math.floor((width + 4) / 5) * Math.floor((height + 3) / 4) * 16; - case RGBA_ASTC_5x5_Format: - return Math.floor((width + 4) / 5) * Math.floor((height + 4) / 5) * 16; - case RGBA_ASTC_6x5_Format: - return Math.floor((width + 5) / 6) * Math.floor((height + 4) / 5) * 16; - case RGBA_ASTC_6x6_Format: - return Math.floor((width + 5) / 6) * Math.floor((height + 5) / 6) * 16; - case RGBA_ASTC_8x5_Format: - return Math.floor((width + 7) / 8) * Math.floor((height + 4) / 5) * 16; - case RGBA_ASTC_8x6_Format: - return Math.floor((width + 7) / 8) * Math.floor((height + 5) / 6) * 16; - case RGBA_ASTC_8x8_Format: - return Math.floor((width + 7) / 8) * Math.floor((height + 7) / 8) * 16; - case RGBA_ASTC_10x5_Format: - return Math.floor((width + 9) / 10) * Math.floor((height + 4) / 5) * 16; - case RGBA_ASTC_10x6_Format: - return Math.floor((width + 9) / 10) * Math.floor((height + 5) / 6) * 16; - case RGBA_ASTC_10x8_Format: - return Math.floor((width + 9) / 10) * Math.floor((height + 7) / 8) * 16; - case RGBA_ASTC_10x10_Format: - return Math.floor((width + 9) / 10) * Math.floor((height + 9) / 10) * 16; - case RGBA_ASTC_12x10_Format: - return Math.floor((width + 11) / 12) * Math.floor((height + 9) / 10) * 16; - case RGBA_ASTC_12x12_Format: - return Math.floor((width + 11) / 12) * Math.floor((height + 11) / 12) * 16; - case RGBA_BPTC_Format: - case RGB_BPTC_SIGNED_Format: - case RGB_BPTC_UNSIGNED_Format: - return Math.ceil(width / 4) * Math.ceil(height / 4) * 16; - case RED_RGTC1_Format: - case SIGNED_RED_RGTC1_Format: - return Math.ceil(width / 4) * Math.ceil(height / 4) * 8; - case RED_GREEN_RGTC2_Format: - case SIGNED_RED_GREEN_RGTC2_Format: - return Math.ceil(width / 4) * Math.ceil(height / 4) * 16; + rotateOnAxis(axis, angle) { + _q1.setFromAxisAngle(axis, angle); + this.quaternion.multiply(_q1); + return this; } - throw new Error( - `Unable to determine texture byte length for ${format} format.` - ); -} -__name(getByteLength, "getByteLength"); -function getTextureTypeByteLength(type) { - switch (type) { - case UnsignedByteType: - case ByteType: - return { byteLength: 1, components: 1 }; - case UnsignedShortType: - case ShortType: - case HalfFloatType: - return { byteLength: 2, components: 1 }; - case UnsignedShort4444Type: - case UnsignedShort5551Type: - return { byteLength: 2, components: 4 }; - case UnsignedIntType: - case IntType: - case FloatType: - return { byteLength: 4, components: 1 }; - case UnsignedInt5999Type: - return { byteLength: 4, components: 3 }; + rotateOnWorldAxis(axis, angle) { + _q1.setFromAxisAngle(axis, angle); + this.quaternion.premultiply(_q1); + return this; } - throw new Error(`Unknown texture type ${type}.`); -} -__name(getTextureTypeByteLength, "getTextureTypeByteLength"); -const TextureUtils = { - contain, - cover, - fill, - getByteLength -}; -function WebGLTextures(_gl, extensions, state, properties, capabilities, utils, info) { - const multisampledRTTExt = extensions.has("WEBGL_multisampled_render_to_texture") ? extensions.get("WEBGL_multisampled_render_to_texture") : null; - const supportsInvalidateFramebuffer = typeof navigator === "undefined" ? false : /OculusBrowser/g.test(navigator.userAgent); - const _imageDimensions = new Vector2(); - const _videoTextures = /* @__PURE__ */ new WeakMap(); - let _canvas2; - const _sources = /* @__PURE__ */ new WeakMap(); - let useOffscreenCanvas = false; - try { - useOffscreenCanvas = typeof OffscreenCanvas !== "undefined" && new OffscreenCanvas(1, 1).getContext("2d") !== null; - } catch (err2) { + rotateX(angle) { + return this.rotateOnAxis(_xAxis, angle); } - function createCanvas(width, height) { - return useOffscreenCanvas ? ( - // eslint-disable-next-line compat/compat - new OffscreenCanvas(width, height) - ) : createElementNS("canvas"); + rotateY(angle) { + return this.rotateOnAxis(_yAxis, angle); } - __name(createCanvas, "createCanvas"); - function resizeImage(image, needsNewCanvas, maxSize) { - let scale = 1; - const dimensions = getDimensions(image); - if (dimensions.width > maxSize || dimensions.height > maxSize) { - scale = maxSize / Math.max(dimensions.width, dimensions.height); - } - if (scale < 1) { - if (typeof HTMLImageElement !== "undefined" && image instanceof HTMLImageElement || typeof HTMLCanvasElement !== "undefined" && image instanceof HTMLCanvasElement || typeof ImageBitmap !== "undefined" && image instanceof ImageBitmap || typeof VideoFrame !== "undefined" && image instanceof VideoFrame) { - const width = Math.floor(scale * dimensions.width); - const height = Math.floor(scale * dimensions.height); - if (_canvas2 === void 0) _canvas2 = createCanvas(width, height); - const canvas = needsNewCanvas ? createCanvas(width, height) : _canvas2; - canvas.width = width; - canvas.height = height; - const context = canvas.getContext("2d"); - context.drawImage(image, 0, 0, width, height); - console.warn("THREE.WebGLRenderer: Texture has been resized from (" + dimensions.width + "x" + dimensions.height + ") to (" + width + "x" + height + ")."); - return canvas; - } else { - if ("data" in image) { - console.warn("THREE.WebGLRenderer: Image in DataTexture is too big (" + dimensions.width + "x" + dimensions.height + ")."); - } - return image; - } - } - return image; + rotateZ(angle) { + return this.rotateOnAxis(_zAxis, angle); } - __name(resizeImage, "resizeImage"); - function textureNeedsGenerateMipmaps(texture) { - return texture.generateMipmaps; + translateOnAxis(axis, distance) { + _v1$4.copy(axis).applyQuaternion(this.quaternion); + this.position.add(_v1$4.multiplyScalar(distance)); + return this; } - __name(textureNeedsGenerateMipmaps, "textureNeedsGenerateMipmaps"); - function generateMipmap(target) { - _gl.generateMipmap(target); + translateX(distance) { + return this.translateOnAxis(_xAxis, distance); } - __name(generateMipmap, "generateMipmap"); - function getTargetType(texture) { - if (texture.isWebGLCubeRenderTarget) return _gl.TEXTURE_CUBE_MAP; - if (texture.isWebGL3DRenderTarget) return _gl.TEXTURE_3D; - if (texture.isWebGLArrayRenderTarget || texture.isCompressedArrayTexture) return _gl.TEXTURE_2D_ARRAY; - return _gl.TEXTURE_2D; + translateY(distance) { + return this.translateOnAxis(_yAxis, distance); } - __name(getTargetType, "getTargetType"); - function getInternalFormat(internalFormatName, glFormat, glType, colorSpace, forceLinearTransfer = false) { - if (internalFormatName !== null) { - if (_gl[internalFormatName] !== void 0) return _gl[internalFormatName]; - console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '" + internalFormatName + "'"); - } - let internalFormat = glFormat; - if (glFormat === _gl.RED) { - if (glType === _gl.FLOAT) internalFormat = _gl.R32F; - if (glType === _gl.HALF_FLOAT) internalFormat = _gl.R16F; - if (glType === _gl.UNSIGNED_BYTE) internalFormat = _gl.R8; - } - if (glFormat === _gl.RED_INTEGER) { - if (glType === _gl.UNSIGNED_BYTE) internalFormat = _gl.R8UI; - if (glType === _gl.UNSIGNED_SHORT) internalFormat = _gl.R16UI; - if (glType === _gl.UNSIGNED_INT) internalFormat = _gl.R32UI; - if (glType === _gl.BYTE) internalFormat = _gl.R8I; - if (glType === _gl.SHORT) internalFormat = _gl.R16I; - if (glType === _gl.INT) internalFormat = _gl.R32I; - } - if (glFormat === _gl.RG) { - if (glType === _gl.FLOAT) internalFormat = _gl.RG32F; - if (glType === _gl.HALF_FLOAT) internalFormat = _gl.RG16F; - if (glType === _gl.UNSIGNED_BYTE) internalFormat = _gl.RG8; - } - if (glFormat === _gl.RG_INTEGER) { - if (glType === _gl.UNSIGNED_BYTE) internalFormat = _gl.RG8UI; - if (glType === _gl.UNSIGNED_SHORT) internalFormat = _gl.RG16UI; - if (glType === _gl.UNSIGNED_INT) internalFormat = _gl.RG32UI; - if (glType === _gl.BYTE) internalFormat = _gl.RG8I; - if (glType === _gl.SHORT) internalFormat = _gl.RG16I; - if (glType === _gl.INT) internalFormat = _gl.RG32I; - } - if (glFormat === _gl.RGB_INTEGER) { - if (glType === _gl.UNSIGNED_BYTE) internalFormat = _gl.RGB8UI; - if (glType === _gl.UNSIGNED_SHORT) internalFormat = _gl.RGB16UI; - if (glType === _gl.UNSIGNED_INT) internalFormat = _gl.RGB32UI; - if (glType === _gl.BYTE) internalFormat = _gl.RGB8I; - if (glType === _gl.SHORT) internalFormat = _gl.RGB16I; - if (glType === _gl.INT) internalFormat = _gl.RGB32I; - } - if (glFormat === _gl.RGBA_INTEGER) { - if (glType === _gl.UNSIGNED_BYTE) internalFormat = _gl.RGBA8UI; - if (glType === _gl.UNSIGNED_SHORT) internalFormat = _gl.RGBA16UI; - if (glType === _gl.UNSIGNED_INT) internalFormat = _gl.RGBA32UI; - if (glType === _gl.BYTE) internalFormat = _gl.RGBA8I; - if (glType === _gl.SHORT) internalFormat = _gl.RGBA16I; - if (glType === _gl.INT) internalFormat = _gl.RGBA32I; - } - if (glFormat === _gl.RGB) { - if (glType === _gl.UNSIGNED_INT_5_9_9_9_REV) internalFormat = _gl.RGB9_E5; - } - if (glFormat === _gl.RGBA) { - const transfer = forceLinearTransfer ? LinearTransfer : ColorManagement.getTransfer(colorSpace); - if (glType === _gl.FLOAT) internalFormat = _gl.RGBA32F; - if (glType === _gl.HALF_FLOAT) internalFormat = _gl.RGBA16F; - if (glType === _gl.UNSIGNED_BYTE) internalFormat = transfer === SRGBTransfer ? _gl.SRGB8_ALPHA8 : _gl.RGBA8; - if (glType === _gl.UNSIGNED_SHORT_4_4_4_4) internalFormat = _gl.RGBA4; - if (glType === _gl.UNSIGNED_SHORT_5_5_5_1) internalFormat = _gl.RGB5_A1; - } - if (internalFormat === _gl.R16F || internalFormat === _gl.R32F || internalFormat === _gl.RG16F || internalFormat === _gl.RG32F || internalFormat === _gl.RGBA16F || internalFormat === _gl.RGBA32F) { - extensions.get("EXT_color_buffer_float"); - } - return internalFormat; + translateZ(distance) { + return this.translateOnAxis(_zAxis, distance); } - __name(getInternalFormat, "getInternalFormat"); - function getInternalDepthFormat(useStencil, depthType) { - let glInternalFormat; - if (useStencil) { - if (depthType === null || depthType === UnsignedIntType || depthType === UnsignedInt248Type) { - glInternalFormat = _gl.DEPTH24_STENCIL8; - } else if (depthType === FloatType) { - glInternalFormat = _gl.DEPTH32F_STENCIL8; - } else if (depthType === UnsignedShortType) { - glInternalFormat = _gl.DEPTH24_STENCIL8; - console.warn("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment."); - } - } else { - if (depthType === null || depthType === UnsignedIntType || depthType === UnsignedInt248Type) { - glInternalFormat = _gl.DEPTH_COMPONENT24; - } else if (depthType === FloatType) { - glInternalFormat = _gl.DEPTH_COMPONENT32F; - } else if (depthType === UnsignedShortType) { - glInternalFormat = _gl.DEPTH_COMPONENT16; - } - } - return glInternalFormat; + localToWorld(vector) { + this.updateWorldMatrix(true, false); + return vector.applyMatrix4(this.matrixWorld); } - __name(getInternalDepthFormat, "getInternalDepthFormat"); - function getMipLevels(texture, image) { - if (textureNeedsGenerateMipmaps(texture) === true || texture.isFramebufferTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter) { - return Math.log2(Math.max(image.width, image.height)) + 1; - } else if (texture.mipmaps !== void 0 && texture.mipmaps.length > 0) { - return texture.mipmaps.length; - } else if (texture.isCompressedTexture && Array.isArray(texture.image)) { - return image.mipmaps.length; + worldToLocal(vector) { + this.updateWorldMatrix(true, false); + return vector.applyMatrix4(_m1$3.copy(this.matrixWorld).invert()); + } + lookAt(x, y, z) { + if (x.isVector3) { + _target.copy(x); } else { - return 1; + _target.set(x, y, z); } - } - __name(getMipLevels, "getMipLevels"); - function onTextureDispose(event) { - const texture = event.target; - texture.removeEventListener("dispose", onTextureDispose); - deallocateTexture(texture); - if (texture.isVideoTexture) { - _videoTextures.delete(texture); + const parent = this.parent; + this.updateWorldMatrix(true, false); + _position$3.setFromMatrixPosition(this.matrixWorld); + if (this.isCamera || this.isLight) { + _m1$3.lookAt(_position$3, _target, this.up); + } else { + _m1$3.lookAt(_target, _position$3, this.up); + } + this.quaternion.setFromRotationMatrix(_m1$3); + if (parent) { + _m1$3.extractRotation(parent.matrixWorld); + _q1.setFromRotationMatrix(_m1$3); + this.quaternion.premultiply(_q1.invert()); } } - __name(onTextureDispose, "onTextureDispose"); - function onRenderTargetDispose(event) { - const renderTarget = event.target; - renderTarget.removeEventListener("dispose", onRenderTargetDispose); - deallocateRenderTarget(renderTarget); - } - __name(onRenderTargetDispose, "onRenderTargetDispose"); - function deallocateTexture(texture) { - const textureProperties = properties.get(texture); - if (textureProperties.__webglInit === void 0) return; - const source = texture.source; - const webglTextures = _sources.get(source); - if (webglTextures) { - const webglTexture = webglTextures[textureProperties.__cacheKey]; - webglTexture.usedTimes--; - if (webglTexture.usedTimes === 0) { - deleteTexture(texture); - } - if (Object.keys(webglTextures).length === 0) { - _sources.delete(source); + add(object) { + if (arguments.length > 1) { + for (let i = 0; i < arguments.length; i++) { + this.add(arguments[i]); } + return this; } - properties.remove(texture); - } - __name(deallocateTexture, "deallocateTexture"); - function deleteTexture(texture) { - const textureProperties = properties.get(texture); - _gl.deleteTexture(textureProperties.__webglTexture); - const source = texture.source; - const webglTextures = _sources.get(source); - delete webglTextures[textureProperties.__cacheKey]; - info.memory.textures--; - } - __name(deleteTexture, "deleteTexture"); - function deallocateRenderTarget(renderTarget) { - const renderTargetProperties = properties.get(renderTarget); - if (renderTarget.depthTexture) { - renderTarget.depthTexture.dispose(); - properties.remove(renderTarget.depthTexture); + if (object === this) { + console.error("THREE.Object3D.add: object can't be added as a child of itself.", object); + return this; } - if (renderTarget.isWebGLCubeRenderTarget) { - for (let i = 0; i < 6; i++) { - if (Array.isArray(renderTargetProperties.__webglFramebuffer[i])) { - for (let level = 0; level < renderTargetProperties.__webglFramebuffer[i].length; level++) _gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer[i][level]); - } else { - _gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer[i]); - } - if (renderTargetProperties.__webglDepthbuffer) _gl.deleteRenderbuffer(renderTargetProperties.__webglDepthbuffer[i]); - } + if (object && object.isObject3D) { + object.removeFromParent(); + object.parent = this; + this.children.push(object); + object.dispatchEvent(_addedEvent); + _childaddedEvent.child = object; + this.dispatchEvent(_childaddedEvent); + _childaddedEvent.child = null; } else { - if (Array.isArray(renderTargetProperties.__webglFramebuffer)) { - for (let level = 0; level < renderTargetProperties.__webglFramebuffer.length; level++) _gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer[level]); - } else { - _gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer); - } - if (renderTargetProperties.__webglDepthbuffer) _gl.deleteRenderbuffer(renderTargetProperties.__webglDepthbuffer); - if (renderTargetProperties.__webglMultisampledFramebuffer) _gl.deleteFramebuffer(renderTargetProperties.__webglMultisampledFramebuffer); - if (renderTargetProperties.__webglColorRenderbuffer) { - for (let i = 0; i < renderTargetProperties.__webglColorRenderbuffer.length; i++) { - if (renderTargetProperties.__webglColorRenderbuffer[i]) _gl.deleteRenderbuffer(renderTargetProperties.__webglColorRenderbuffer[i]); - } - } - if (renderTargetProperties.__webglDepthRenderbuffer) _gl.deleteRenderbuffer(renderTargetProperties.__webglDepthRenderbuffer); + console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.", object); } - const textures = renderTarget.textures; - for (let i = 0, il = textures.length; i < il; i++) { - const attachmentProperties = properties.get(textures[i]); - if (attachmentProperties.__webglTexture) { - _gl.deleteTexture(attachmentProperties.__webglTexture); - info.memory.textures--; + return this; + } + remove(object) { + if (arguments.length > 1) { + for (let i = 0; i < arguments.length; i++) { + this.remove(arguments[i]); } - properties.remove(textures[i]); + return this; } - properties.remove(renderTarget); + const index = this.children.indexOf(object); + if (index !== -1) { + object.parent = null; + this.children.splice(index, 1); + object.dispatchEvent(_removedEvent); + _childremovedEvent.child = object; + this.dispatchEvent(_childremovedEvent); + _childremovedEvent.child = null; + } + return this; } - __name(deallocateRenderTarget, "deallocateRenderTarget"); - let textureUnits = 0; - function resetTextureUnits() { - textureUnits = 0; + removeFromParent() { + const parent = this.parent; + if (parent !== null) { + parent.remove(this); + } + return this; } - __name(resetTextureUnits, "resetTextureUnits"); - function allocateTextureUnit() { - const textureUnit = textureUnits; - if (textureUnit >= capabilities.maxTextures) { - console.warn("THREE.WebGLTextures: Trying to use " + textureUnit + " texture units while this GPU supports only " + capabilities.maxTextures); + clear() { + return this.remove(...this.children); + } + attach(object) { + this.updateWorldMatrix(true, false); + _m1$3.copy(this.matrixWorld).invert(); + if (object.parent !== null) { + object.parent.updateWorldMatrix(true, false); + _m1$3.multiply(object.parent.matrixWorld); } - textureUnits += 1; - return textureUnit; + object.applyMatrix4(_m1$3); + object.removeFromParent(); + object.parent = this; + this.children.push(object); + object.updateWorldMatrix(false, true); + object.dispatchEvent(_addedEvent); + _childaddedEvent.child = object; + this.dispatchEvent(_childaddedEvent); + _childaddedEvent.child = null; + return this; } - __name(allocateTextureUnit, "allocateTextureUnit"); - function getTextureCacheKey(texture) { - const array = []; - array.push(texture.wrapS); - array.push(texture.wrapT); - array.push(texture.wrapR || 0); - array.push(texture.magFilter); - array.push(texture.minFilter); - array.push(texture.anisotropy); - array.push(texture.internalFormat); - array.push(texture.format); - array.push(texture.type); - array.push(texture.generateMipmaps); - array.push(texture.premultiplyAlpha); - array.push(texture.flipY); - array.push(texture.unpackAlignment); - array.push(texture.colorSpace); - return array.join(); + getObjectById(id2) { + return this.getObjectByProperty("id", id2); } - __name(getTextureCacheKey, "getTextureCacheKey"); - function setTexture2D(texture, slot) { - const textureProperties = properties.get(texture); - if (texture.isVideoTexture) updateVideoTexture(texture); - if (texture.isRenderTargetTexture === false && texture.version > 0 && textureProperties.__version !== texture.version) { - const image = texture.image; - if (image === null) { - console.warn("THREE.WebGLRenderer: Texture marked for update but no image data found."); - } else if (image.complete === false) { - console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete"); - } else { - uploadTexture(textureProperties, texture, slot); - return; + getObjectByName(name) { + return this.getObjectByProperty("name", name); + } + getObjectByProperty(name, value) { + if (this[name] === value) return this; + for (let i = 0, l = this.children.length; i < l; i++) { + const child = this.children[i]; + const object = child.getObjectByProperty(name, value); + if (object !== void 0) { + return object; } } - state.bindTexture(_gl.TEXTURE_2D, textureProperties.__webglTexture, _gl.TEXTURE0 + slot); + return void 0; } - __name(setTexture2D, "setTexture2D"); - function setTexture2DArray(texture, slot) { - const textureProperties = properties.get(texture); - if (texture.version > 0 && textureProperties.__version !== texture.version) { - uploadTexture(textureProperties, texture, slot); - return; + getObjectsByProperty(name, value, result = []) { + if (this[name] === value) result.push(this); + const children = this.children; + for (let i = 0, l = children.length; i < l; i++) { + children[i].getObjectsByProperty(name, value, result); } - state.bindTexture(_gl.TEXTURE_2D_ARRAY, textureProperties.__webglTexture, _gl.TEXTURE0 + slot); + return result; } - __name(setTexture2DArray, "setTexture2DArray"); - function setTexture3D(texture, slot) { - const textureProperties = properties.get(texture); - if (texture.version > 0 && textureProperties.__version !== texture.version) { - uploadTexture(textureProperties, texture, slot); - return; - } - state.bindTexture(_gl.TEXTURE_3D, textureProperties.__webglTexture, _gl.TEXTURE0 + slot); + getWorldPosition(target) { + this.updateWorldMatrix(true, false); + return target.setFromMatrixPosition(this.matrixWorld); } - __name(setTexture3D, "setTexture3D"); - function setTextureCube(texture, slot) { - const textureProperties = properties.get(texture); - if (texture.version > 0 && textureProperties.__version !== texture.version) { - uploadCubeTexture(textureProperties, texture, slot); - return; - } - state.bindTexture(_gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture, _gl.TEXTURE0 + slot); + getWorldQuaternion(target) { + this.updateWorldMatrix(true, false); + this.matrixWorld.decompose(_position$3, target, _scale$2); + return target; } - __name(setTextureCube, "setTextureCube"); - const wrappingToGL = { - [RepeatWrapping]: _gl.REPEAT, - [ClampToEdgeWrapping]: _gl.CLAMP_TO_EDGE, - [MirroredRepeatWrapping]: _gl.MIRRORED_REPEAT - }; - const filterToGL = { - [NearestFilter]: _gl.NEAREST, - [NearestMipmapNearestFilter]: _gl.NEAREST_MIPMAP_NEAREST, - [NearestMipmapLinearFilter]: _gl.NEAREST_MIPMAP_LINEAR, - [LinearFilter]: _gl.LINEAR, - [LinearMipmapNearestFilter]: _gl.LINEAR_MIPMAP_NEAREST, - [LinearMipmapLinearFilter]: _gl.LINEAR_MIPMAP_LINEAR - }; - const compareToGL = { - [NeverCompare]: _gl.NEVER, - [AlwaysCompare]: _gl.ALWAYS, - [LessCompare]: _gl.LESS, - [LessEqualCompare]: _gl.LEQUAL, - [EqualCompare]: _gl.EQUAL, - [GreaterEqualCompare]: _gl.GEQUAL, - [GreaterCompare]: _gl.GREATER, - [NotEqualCompare]: _gl.NOTEQUAL - }; - function setTextureParameters(textureType, texture) { - if (texture.type === FloatType && extensions.has("OES_texture_float_linear") === false && (texture.magFilter === LinearFilter || texture.magFilter === LinearMipmapNearestFilter || texture.magFilter === NearestMipmapLinearFilter || texture.magFilter === LinearMipmapLinearFilter || texture.minFilter === LinearFilter || texture.minFilter === LinearMipmapNearestFilter || texture.minFilter === NearestMipmapLinearFilter || texture.minFilter === LinearMipmapLinearFilter)) { - console.warn("THREE.WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device."); - } - _gl.texParameteri(textureType, _gl.TEXTURE_WRAP_S, wrappingToGL[texture.wrapS]); - _gl.texParameteri(textureType, _gl.TEXTURE_WRAP_T, wrappingToGL[texture.wrapT]); - if (textureType === _gl.TEXTURE_3D || textureType === _gl.TEXTURE_2D_ARRAY) { - _gl.texParameteri(textureType, _gl.TEXTURE_WRAP_R, wrappingToGL[texture.wrapR]); - } - _gl.texParameteri(textureType, _gl.TEXTURE_MAG_FILTER, filterToGL[texture.magFilter]); - _gl.texParameteri(textureType, _gl.TEXTURE_MIN_FILTER, filterToGL[texture.minFilter]); - if (texture.compareFunction) { - _gl.texParameteri(textureType, _gl.TEXTURE_COMPARE_MODE, _gl.COMPARE_REF_TO_TEXTURE); - _gl.texParameteri(textureType, _gl.TEXTURE_COMPARE_FUNC, compareToGL[texture.compareFunction]); - } - if (extensions.has("EXT_texture_filter_anisotropic") === true) { - if (texture.magFilter === NearestFilter) return; - if (texture.minFilter !== NearestMipmapLinearFilter && texture.minFilter !== LinearMipmapLinearFilter) return; - if (texture.type === FloatType && extensions.has("OES_texture_float_linear") === false) return; - if (texture.anisotropy > 1 || properties.get(texture).__currentAnisotropy) { - const extension = extensions.get("EXT_texture_filter_anisotropic"); - _gl.texParameterf(textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min(texture.anisotropy, capabilities.getMaxAnisotropy())); - properties.get(texture).__currentAnisotropy = texture.anisotropy; - } - } + getWorldScale(target) { + this.updateWorldMatrix(true, false); + this.matrixWorld.decompose(_position$3, _quaternion$2, target); + return target; } - __name(setTextureParameters, "setTextureParameters"); - function initTexture(textureProperties, texture) { - let forceUpload = false; - if (textureProperties.__webglInit === void 0) { - textureProperties.__webglInit = true; - texture.addEventListener("dispose", onTextureDispose); - } - const source = texture.source; - let webglTextures = _sources.get(source); - if (webglTextures === void 0) { - webglTextures = {}; - _sources.set(source, webglTextures); - } - const textureCacheKey = getTextureCacheKey(texture); - if (textureCacheKey !== textureProperties.__cacheKey) { - if (webglTextures[textureCacheKey] === void 0) { - webglTextures[textureCacheKey] = { - texture: _gl.createTexture(), - usedTimes: 0 - }; - info.memory.textures++; - forceUpload = true; - } - webglTextures[textureCacheKey].usedTimes++; - const webglTexture = webglTextures[textureProperties.__cacheKey]; - if (webglTexture !== void 0) { - webglTextures[textureProperties.__cacheKey].usedTimes--; - if (webglTexture.usedTimes === 0) { - deleteTexture(texture); - } - } - textureProperties.__cacheKey = textureCacheKey; - textureProperties.__webglTexture = webglTextures[textureCacheKey].texture; + getWorldDirection(target) { + this.updateWorldMatrix(true, false); + const e = this.matrixWorld.elements; + return target.set(e[8], e[9], e[10]).normalize(); + } + raycast() { + } + traverse(callback) { + callback(this); + const children = this.children; + for (let i = 0, l = children.length; i < l; i++) { + children[i].traverse(callback); } - return forceUpload; } - __name(initTexture, "initTexture"); - function uploadTexture(textureProperties, texture, slot) { - let textureType = _gl.TEXTURE_2D; - if (texture.isDataArrayTexture || texture.isCompressedArrayTexture) textureType = _gl.TEXTURE_2D_ARRAY; - if (texture.isData3DTexture) textureType = _gl.TEXTURE_3D; - const forceUpload = initTexture(textureProperties, texture); - const source = texture.source; - state.bindTexture(textureType, textureProperties.__webglTexture, _gl.TEXTURE0 + slot); - const sourceProperties = properties.get(source); - if (source.version !== sourceProperties.__version || forceUpload === true) { - state.activeTexture(_gl.TEXTURE0 + slot); - const workingPrimaries = ColorManagement.getPrimaries(ColorManagement.workingColorSpace); - const texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries(texture.colorSpace); - const unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL; - _gl.pixelStorei(_gl.UNPACK_FLIP_Y_WEBGL, texture.flipY); - _gl.pixelStorei(_gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha); - _gl.pixelStorei(_gl.UNPACK_ALIGNMENT, texture.unpackAlignment); - _gl.pixelStorei(_gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion); - let image = resizeImage(texture.image, false, capabilities.maxTextureSize); - image = verifyColorSpace(texture, image); - const glFormat = utils.convert(texture.format, texture.colorSpace); - const glType = utils.convert(texture.type); - let glInternalFormat = getInternalFormat(texture.internalFormat, glFormat, glType, texture.colorSpace, texture.isVideoTexture); - setTextureParameters(textureType, texture); - let mipmap; - const mipmaps = texture.mipmaps; - const useTexStorage = texture.isVideoTexture !== true; - const allocateMemory = sourceProperties.__version === void 0 || forceUpload === true; - const dataReady = source.dataReady; - const levels = getMipLevels(texture, image); - if (texture.isDepthTexture) { - glInternalFormat = getInternalDepthFormat(texture.format === DepthStencilFormat, texture.type); - if (allocateMemory) { - if (useTexStorage) { - state.texStorage2D(_gl.TEXTURE_2D, 1, glInternalFormat, image.width, image.height); - } else { - state.texImage2D(_gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null); - } - } - } else if (texture.isDataTexture) { - if (mipmaps.length > 0) { - if (useTexStorage && allocateMemory) { - state.texStorage2D(_gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[0].width, mipmaps[0].height); - } - for (let i = 0, il = mipmaps.length; i < il; i++) { - mipmap = mipmaps[i]; - if (useTexStorage) { - if (dataReady) { - state.texSubImage2D(_gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data); - } - } else { - state.texImage2D(_gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data); - } - } - texture.generateMipmaps = false; - } else { - if (useTexStorage) { - if (allocateMemory) { - state.texStorage2D(_gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height); - } - if (dataReady) { - state.texSubImage2D(_gl.TEXTURE_2D, 0, 0, 0, image.width, image.height, glFormat, glType, image.data); - } - } else { - state.texImage2D(_gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data); - } - } - } else if (texture.isCompressedTexture) { - if (texture.isCompressedArrayTexture) { - if (useTexStorage && allocateMemory) { - state.texStorage3D(_gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, mipmaps[0].width, mipmaps[0].height, image.depth); - } - for (let i = 0, il = mipmaps.length; i < il; i++) { - mipmap = mipmaps[i]; - if (texture.format !== RGBAFormat) { - if (glFormat !== null) { - if (useTexStorage) { - if (dataReady) { - if (texture.layerUpdates.size > 0) { - const layerByteLength = getByteLength(mipmap.width, mipmap.height, texture.format, texture.type); - for (const layerIndex of texture.layerUpdates) { - const layerData = mipmap.data.subarray( - layerIndex * layerByteLength / mipmap.data.BYTES_PER_ELEMENT, - (layerIndex + 1) * layerByteLength / mipmap.data.BYTES_PER_ELEMENT - ); - state.compressedTexSubImage3D(_gl.TEXTURE_2D_ARRAY, i, 0, 0, layerIndex, mipmap.width, mipmap.height, 1, glFormat, layerData); - } - texture.clearLayerUpdates(); - } else { - state.compressedTexSubImage3D(_gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, mipmap.data); - } - } - } else { - state.compressedTexImage3D(_gl.TEXTURE_2D_ARRAY, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 0, mipmap.data, 0, 0); - } - } else { - console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"); - } - } else { - if (useTexStorage) { - if (dataReady) { - state.texSubImage3D(_gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, glType, mipmap.data); - } - } else { - state.texImage3D(_gl.TEXTURE_2D_ARRAY, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 0, glFormat, glType, mipmap.data); - } - } - } - } else { - if (useTexStorage && allocateMemory) { - state.texStorage2D(_gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[0].width, mipmaps[0].height); - } - for (let i = 0, il = mipmaps.length; i < il; i++) { - mipmap = mipmaps[i]; - if (texture.format !== RGBAFormat) { - if (glFormat !== null) { - if (useTexStorage) { - if (dataReady) { - state.compressedTexSubImage2D(_gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data); - } - } else { - state.compressedTexImage2D(_gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data); - } - } else { - console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"); - } - } else { - if (useTexStorage) { - if (dataReady) { - state.texSubImage2D(_gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data); - } - } else { - state.texImage2D(_gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data); - } - } - } - } - } else if (texture.isDataArrayTexture) { - if (useTexStorage) { - if (allocateMemory) { - state.texStorage3D(_gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, image.width, image.height, image.depth); - } - if (dataReady) { - if (texture.layerUpdates.size > 0) { - const layerByteLength = getByteLength(image.width, image.height, texture.format, texture.type); - for (const layerIndex of texture.layerUpdates) { - const layerData = image.data.subarray( - layerIndex * layerByteLength / image.data.BYTES_PER_ELEMENT, - (layerIndex + 1) * layerByteLength / image.data.BYTES_PER_ELEMENT - ); - state.texSubImage3D(_gl.TEXTURE_2D_ARRAY, 0, 0, 0, layerIndex, image.width, image.height, 1, glFormat, glType, layerData); - } - texture.clearLayerUpdates(); - } else { - state.texSubImage3D(_gl.TEXTURE_2D_ARRAY, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data); - } - } - } else { - state.texImage3D(_gl.TEXTURE_2D_ARRAY, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data); - } - } else if (texture.isData3DTexture) { - if (useTexStorage) { - if (allocateMemory) { - state.texStorage3D(_gl.TEXTURE_3D, levels, glInternalFormat, image.width, image.height, image.depth); - } - if (dataReady) { - state.texSubImage3D(_gl.TEXTURE_3D, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data); - } + traverseVisible(callback) { + if (this.visible === false) return; + callback(this); + const children = this.children; + for (let i = 0, l = children.length; i < l; i++) { + children[i].traverseVisible(callback); + } + } + traverseAncestors(callback) { + const parent = this.parent; + if (parent !== null) { + callback(parent); + parent.traverseAncestors(callback); + } + } + updateMatrix() { + this.matrix.compose(this.position, this.quaternion, this.scale); + this.matrixWorldNeedsUpdate = true; + } + updateMatrixWorld(force) { + if (this.matrixAutoUpdate) this.updateMatrix(); + if (this.matrixWorldNeedsUpdate || force) { + if (this.matrixWorldAutoUpdate === true) { + if (this.parent === null) { + this.matrixWorld.copy(this.matrix); } else { - state.texImage3D(_gl.TEXTURE_3D, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data); - } - } else if (texture.isFramebufferTexture) { - if (allocateMemory) { - if (useTexStorage) { - state.texStorage2D(_gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height); - } else { - let width = image.width, height = image.height; - for (let i = 0; i < levels; i++) { - state.texImage2D(_gl.TEXTURE_2D, i, glInternalFormat, width, height, 0, glFormat, glType, null); - width >>= 1; - height >>= 1; - } - } + this.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix); } + } + this.matrixWorldNeedsUpdate = false; + force = true; + } + const children = this.children; + for (let i = 0, l = children.length; i < l; i++) { + const child = children[i]; + child.updateMatrixWorld(force); + } + } + updateWorldMatrix(updateParents, updateChildren) { + const parent = this.parent; + if (updateParents === true && parent !== null) { + parent.updateWorldMatrix(true, false); + } + if (this.matrixAutoUpdate) this.updateMatrix(); + if (this.matrixWorldAutoUpdate === true) { + if (this.parent === null) { + this.matrixWorld.copy(this.matrix); } else { - if (mipmaps.length > 0) { - if (useTexStorage && allocateMemory) { - const dimensions = getDimensions(mipmaps[0]); - state.texStorage2D(_gl.TEXTURE_2D, levels, glInternalFormat, dimensions.width, dimensions.height); - } - for (let i = 0, il = mipmaps.length; i < il; i++) { - mipmap = mipmaps[i]; - if (useTexStorage) { - if (dataReady) { - state.texSubImage2D(_gl.TEXTURE_2D, i, 0, 0, glFormat, glType, mipmap); - } - } else { - state.texImage2D(_gl.TEXTURE_2D, i, glInternalFormat, glFormat, glType, mipmap); - } - } - texture.generateMipmaps = false; - } else { - if (useTexStorage) { - if (allocateMemory) { - const dimensions = getDimensions(image); - state.texStorage2D(_gl.TEXTURE_2D, levels, glInternalFormat, dimensions.width, dimensions.height); - } - if (dataReady) { - state.texSubImage2D(_gl.TEXTURE_2D, 0, 0, 0, glFormat, glType, image); - } - } else { - state.texImage2D(_gl.TEXTURE_2D, 0, glInternalFormat, glFormat, glType, image); - } - } + this.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix); } - if (textureNeedsGenerateMipmaps(texture)) { - generateMipmap(textureType); + } + if (updateChildren === true) { + const children = this.children; + for (let i = 0, l = children.length; i < l; i++) { + const child = children[i]; + child.updateWorldMatrix(false, true); } - sourceProperties.__version = source.version; - if (texture.onUpdate) texture.onUpdate(texture); } - textureProperties.__version = texture.version; } - __name(uploadTexture, "uploadTexture"); - function uploadCubeTexture(textureProperties, texture, slot) { - if (texture.image.length !== 6) return; - const forceUpload = initTexture(textureProperties, texture); - const source = texture.source; - state.bindTexture(_gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture, _gl.TEXTURE0 + slot); - const sourceProperties = properties.get(source); - if (source.version !== sourceProperties.__version || forceUpload === true) { - state.activeTexture(_gl.TEXTURE0 + slot); - const workingPrimaries = ColorManagement.getPrimaries(ColorManagement.workingColorSpace); - const texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries(texture.colorSpace); - const unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL; - _gl.pixelStorei(_gl.UNPACK_FLIP_Y_WEBGL, texture.flipY); - _gl.pixelStorei(_gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha); - _gl.pixelStorei(_gl.UNPACK_ALIGNMENT, texture.unpackAlignment); - _gl.pixelStorei(_gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion); - const isCompressed = texture.isCompressedTexture || texture.image[0].isCompressedTexture; - const isDataTexture = texture.image[0] && texture.image[0].isDataTexture; - const cubeImage = []; - for (let i = 0; i < 6; i++) { - if (!isCompressed && !isDataTexture) { - cubeImage[i] = resizeImage(texture.image[i], true, capabilities.maxCubemapSize); - } else { - cubeImage[i] = isDataTexture ? texture.image[i].image : texture.image[i]; - } - cubeImage[i] = verifyColorSpace(texture, cubeImage[i]); + toJSON(meta) { + const isRootObject = meta === void 0 || typeof meta === "string"; + const output = {}; + if (isRootObject) { + meta = { + geometries: {}, + materials: {}, + textures: {}, + images: {}, + shapes: {}, + skeletons: {}, + animations: {}, + nodes: {} + }; + output.metadata = { + version: 4.6, + type: "Object", + generator: "Object3D.toJSON" + }; + } + const object = {}; + object.uuid = this.uuid; + object.type = this.type; + if (this.name !== "") object.name = this.name; + if (this.castShadow === true) object.castShadow = true; + if (this.receiveShadow === true) object.receiveShadow = true; + if (this.visible === false) object.visible = false; + if (this.frustumCulled === false) object.frustumCulled = false; + if (this.renderOrder !== 0) object.renderOrder = this.renderOrder; + if (Object.keys(this.userData).length > 0) object.userData = this.userData; + object.layers = this.layers.mask; + object.matrix = this.matrix.toArray(); + object.up = this.up.toArray(); + if (this.matrixAutoUpdate === false) object.matrixAutoUpdate = false; + if (this.isInstancedMesh) { + object.type = "InstancedMesh"; + object.count = this.count; + object.instanceMatrix = this.instanceMatrix.toJSON(); + if (this.instanceColor !== null) object.instanceColor = this.instanceColor.toJSON(); + } + if (this.isBatchedMesh) { + object.type = "BatchedMesh"; + object.perObjectFrustumCulled = this.perObjectFrustumCulled; + object.sortObjects = this.sortObjects; + object.drawRanges = this._drawRanges; + object.reservedRanges = this._reservedRanges; + object.visibility = this._visibility; + object.active = this._active; + object.bounds = this._bounds.map((bound) => ({ + boxInitialized: bound.boxInitialized, + boxMin: bound.box.min.toArray(), + boxMax: bound.box.max.toArray(), + sphereInitialized: bound.sphereInitialized, + sphereRadius: bound.sphere.radius, + sphereCenter: bound.sphere.center.toArray() + })); + object.maxInstanceCount = this._maxInstanceCount; + object.maxVertexCount = this._maxVertexCount; + object.maxIndexCount = this._maxIndexCount; + object.geometryInitialized = this._geometryInitialized; + object.geometryCount = this._geometryCount; + object.matricesTexture = this._matricesTexture.toJSON(meta); + if (this._colorsTexture !== null) object.colorsTexture = this._colorsTexture.toJSON(meta); + if (this.boundingSphere !== null) { + object.boundingSphere = { + center: object.boundingSphere.center.toArray(), + radius: object.boundingSphere.radius + }; } - const image = cubeImage[0], glFormat = utils.convert(texture.format, texture.colorSpace), glType = utils.convert(texture.type), glInternalFormat = getInternalFormat(texture.internalFormat, glFormat, glType, texture.colorSpace); - const useTexStorage = texture.isVideoTexture !== true; - const allocateMemory = sourceProperties.__version === void 0 || forceUpload === true; - const dataReady = source.dataReady; - let levels = getMipLevels(texture, image); - setTextureParameters(_gl.TEXTURE_CUBE_MAP, texture); - let mipmaps; - if (isCompressed) { - if (useTexStorage && allocateMemory) { - state.texStorage2D(_gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, image.width, image.height); - } - for (let i = 0; i < 6; i++) { - mipmaps = cubeImage[i].mipmaps; - for (let j = 0; j < mipmaps.length; j++) { - const mipmap = mipmaps[j]; - if (texture.format !== RGBAFormat) { - if (glFormat !== null) { - if (useTexStorage) { - if (dataReady) { - state.compressedTexSubImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data); - } - } else { - state.compressedTexImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data); - } - } else { - console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()"); - } - } else { - if (useTexStorage) { - if (dataReady) { - state.texSubImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data); - } - } else { - state.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data); - } - } - } - } - } else { - mipmaps = texture.mipmaps; - if (useTexStorage && allocateMemory) { - if (mipmaps.length > 0) levels++; - const dimensions = getDimensions(cubeImage[0]); - state.texStorage2D(_gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, dimensions.width, dimensions.height); + if (this.boundingBox !== null) { + object.boundingBox = { + min: object.boundingBox.min.toArray(), + max: object.boundingBox.max.toArray() + }; + } + } + function serialize(library, element) { + if (library[element.uuid] === void 0) { + library[element.uuid] = element.toJSON(meta); + } + return element.uuid; + } + __name(serialize, "serialize"); + if (this.isScene) { + if (this.background) { + if (this.background.isColor) { + object.background = this.background.toJSON(); + } else if (this.background.isTexture) { + object.background = this.background.toJSON(meta).uuid; } - for (let i = 0; i < 6; i++) { - if (isDataTexture) { - if (useTexStorage) { - if (dataReady) { - state.texSubImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, cubeImage[i].width, cubeImage[i].height, glFormat, glType, cubeImage[i].data); - } - } else { - state.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, cubeImage[i].width, cubeImage[i].height, 0, glFormat, glType, cubeImage[i].data); - } - for (let j = 0; j < mipmaps.length; j++) { - const mipmap = mipmaps[j]; - const mipmapImage = mipmap.image[i].image; - if (useTexStorage) { - if (dataReady) { - state.texSubImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, mipmapImage.width, mipmapImage.height, glFormat, glType, mipmapImage.data); - } - } else { - state.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, mipmapImage.width, mipmapImage.height, 0, glFormat, glType, mipmapImage.data); - } - } - } else { - if (useTexStorage) { - if (dataReady) { - state.texSubImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, glFormat, glType, cubeImage[i]); - } - } else { - state.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, glFormat, glType, cubeImage[i]); - } - for (let j = 0; j < mipmaps.length; j++) { - const mipmap = mipmaps[j]; - if (useTexStorage) { - if (dataReady) { - state.texSubImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, glFormat, glType, mipmap.image[i]); - } - } else { - state.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, glFormat, glType, mipmap.image[i]); - } - } + } + if (this.environment && this.environment.isTexture && this.environment.isRenderTargetTexture !== true) { + object.environment = this.environment.toJSON(meta).uuid; + } + } else if (this.isMesh || this.isLine || this.isPoints) { + object.geometry = serialize(meta.geometries, this.geometry); + const parameters = this.geometry.parameters; + if (parameters !== void 0 && parameters.shapes !== void 0) { + const shapes = parameters.shapes; + if (Array.isArray(shapes)) { + for (let i = 0, l = shapes.length; i < l; i++) { + const shape = shapes[i]; + serialize(meta.shapes, shape); } + } else { + serialize(meta.shapes, shapes); } } - if (textureNeedsGenerateMipmaps(texture)) { - generateMipmap(_gl.TEXTURE_CUBE_MAP); + } + if (this.isSkinnedMesh) { + object.bindMode = this.bindMode; + object.bindMatrix = this.bindMatrix.toArray(); + if (this.skeleton !== void 0) { + serialize(meta.skeletons, this.skeleton); + object.skeleton = this.skeleton.uuid; } - sourceProperties.__version = source.version; - if (texture.onUpdate) texture.onUpdate(texture); } - textureProperties.__version = texture.version; - } - __name(uploadCubeTexture, "uploadCubeTexture"); - function setupFrameBufferTexture(framebuffer, renderTarget, texture, attachment, textureTarget, level) { - const glFormat = utils.convert(texture.format, texture.colorSpace); - const glType = utils.convert(texture.type); - const glInternalFormat = getInternalFormat(texture.internalFormat, glFormat, glType, texture.colorSpace); - const renderTargetProperties = properties.get(renderTarget); - const textureProperties = properties.get(texture); - textureProperties.__renderTarget = renderTarget; - if (!renderTargetProperties.__hasExternalTextures) { - const width = Math.max(1, renderTarget.width >> level); - const height = Math.max(1, renderTarget.height >> level); - if (textureTarget === _gl.TEXTURE_3D || textureTarget === _gl.TEXTURE_2D_ARRAY) { - state.texImage3D(textureTarget, level, glInternalFormat, width, height, renderTarget.depth, 0, glFormat, glType, null); + if (this.material !== void 0) { + if (Array.isArray(this.material)) { + const uuids = []; + for (let i = 0, l = this.material.length; i < l; i++) { + uuids.push(serialize(meta.materials, this.material[i])); + } + object.material = uuids; } else { - state.texImage2D(textureTarget, level, glInternalFormat, width, height, 0, glFormat, glType, null); + object.material = serialize(meta.materials, this.material); } } - state.bindFramebuffer(_gl.FRAMEBUFFER, framebuffer); - if (useMultisampledRTT(renderTarget)) { - multisampledRTTExt.framebufferTexture2DMultisampleEXT(_gl.FRAMEBUFFER, attachment, textureTarget, textureProperties.__webglTexture, 0, getRenderTargetSamples(renderTarget)); - } else if (textureTarget === _gl.TEXTURE_2D || textureTarget >= _gl.TEXTURE_CUBE_MAP_POSITIVE_X && textureTarget <= _gl.TEXTURE_CUBE_MAP_NEGATIVE_Z) { - _gl.framebufferTexture2D(_gl.FRAMEBUFFER, attachment, textureTarget, textureProperties.__webglTexture, level); + if (this.children.length > 0) { + object.children = []; + for (let i = 0; i < this.children.length; i++) { + object.children.push(this.children[i].toJSON(meta).object); + } } - state.bindFramebuffer(_gl.FRAMEBUFFER, null); - } - __name(setupFrameBufferTexture, "setupFrameBufferTexture"); - function setupRenderBufferStorage(renderbuffer, renderTarget, isMultisample) { - _gl.bindRenderbuffer(_gl.RENDERBUFFER, renderbuffer); - if (renderTarget.depthBuffer) { - const depthTexture = renderTarget.depthTexture; - const depthType = depthTexture && depthTexture.isDepthTexture ? depthTexture.type : null; - const glInternalFormat = getInternalDepthFormat(renderTarget.stencilBuffer, depthType); - const glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT; - const samples = getRenderTargetSamples(renderTarget); - const isUseMultisampledRTT = useMultisampledRTT(renderTarget); - if (isUseMultisampledRTT) { - multisampledRTTExt.renderbufferStorageMultisampleEXT(_gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height); - } else if (isMultisample) { - _gl.renderbufferStorageMultisample(_gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height); - } else { - _gl.renderbufferStorage(_gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height); + if (this.animations.length > 0) { + object.animations = []; + for (let i = 0; i < this.animations.length; i++) { + const animation = this.animations[i]; + object.animations.push(serialize(meta.animations, animation)); } - _gl.framebufferRenderbuffer(_gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer); - } else { - const textures = renderTarget.textures; - for (let i = 0; i < textures.length; i++) { - const texture = textures[i]; - const glFormat = utils.convert(texture.format, texture.colorSpace); - const glType = utils.convert(texture.type); - const glInternalFormat = getInternalFormat(texture.internalFormat, glFormat, glType, texture.colorSpace); - const samples = getRenderTargetSamples(renderTarget); - if (isMultisample && useMultisampledRTT(renderTarget) === false) { - _gl.renderbufferStorageMultisample(_gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height); - } else if (useMultisampledRTT(renderTarget)) { - multisampledRTTExt.renderbufferStorageMultisampleEXT(_gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height); - } else { - _gl.renderbufferStorage(_gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height); - } + } + if (isRootObject) { + const geometries = extractFromCache(meta.geometries); + const materials = extractFromCache(meta.materials); + const textures = extractFromCache(meta.textures); + const images = extractFromCache(meta.images); + const shapes = extractFromCache(meta.shapes); + const skeletons = extractFromCache(meta.skeletons); + const animations = extractFromCache(meta.animations); + const nodes = extractFromCache(meta.nodes); + if (geometries.length > 0) output.geometries = geometries; + if (materials.length > 0) output.materials = materials; + if (textures.length > 0) output.textures = textures; + if (images.length > 0) output.images = images; + if (shapes.length > 0) output.shapes = shapes; + if (skeletons.length > 0) output.skeletons = skeletons; + if (animations.length > 0) output.animations = animations; + if (nodes.length > 0) output.nodes = nodes; + } + output.object = object; + return output; + function extractFromCache(cache) { + const values = []; + for (const key in cache) { + const data = cache[key]; + delete data.metadata; + values.push(data); } + return values; } - _gl.bindRenderbuffer(_gl.RENDERBUFFER, null); + __name(extractFromCache, "extractFromCache"); } - __name(setupRenderBufferStorage, "setupRenderBufferStorage"); - function setupDepthTexture(framebuffer, renderTarget) { - const isCube = renderTarget && renderTarget.isWebGLCubeRenderTarget; - if (isCube) throw new Error("Depth Texture with cube render targets is not supported"); - state.bindFramebuffer(_gl.FRAMEBUFFER, framebuffer); - if (!(renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture)) { - throw new Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture"); + clone(recursive) { + return new this.constructor().copy(this, recursive); + } + copy(source, recursive = true) { + this.name = source.name; + this.up.copy(source.up); + this.position.copy(source.position); + this.rotation.order = source.rotation.order; + this.quaternion.copy(source.quaternion); + this.scale.copy(source.scale); + this.matrix.copy(source.matrix); + this.matrixWorld.copy(source.matrixWorld); + this.matrixAutoUpdate = source.matrixAutoUpdate; + this.matrixWorldAutoUpdate = source.matrixWorldAutoUpdate; + this.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate; + this.layers.mask = source.layers.mask; + this.visible = source.visible; + this.castShadow = source.castShadow; + this.receiveShadow = source.receiveShadow; + this.frustumCulled = source.frustumCulled; + this.renderOrder = source.renderOrder; + this.animations = source.animations.slice(); + this.userData = JSON.parse(JSON.stringify(source.userData)); + if (recursive === true) { + for (let i = 0; i < source.children.length; i++) { + const child = source.children[i]; + this.add(child.clone()); + } + } + return this; + } +} +Object3D.DEFAULT_UP = /* @__PURE__ */ new Vector3(0, 1, 0); +Object3D.DEFAULT_MATRIX_AUTO_UPDATE = true; +Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE = true; +const _v0$2 = /* @__PURE__ */ new Vector3(); +const _v1$3 = /* @__PURE__ */ new Vector3(); +const _v2$2 = /* @__PURE__ */ new Vector3(); +const _v3$2 = /* @__PURE__ */ new Vector3(); +const _vab = /* @__PURE__ */ new Vector3(); +const _vac = /* @__PURE__ */ new Vector3(); +const _vbc = /* @__PURE__ */ new Vector3(); +const _vap = /* @__PURE__ */ new Vector3(); +const _vbp = /* @__PURE__ */ new Vector3(); +const _vcp = /* @__PURE__ */ new Vector3(); +const _v40 = /* @__PURE__ */ new Vector4(); +const _v41 = /* @__PURE__ */ new Vector4(); +const _v42 = /* @__PURE__ */ new Vector4(); +class Triangle { + static { + __name(this, "Triangle"); + } + constructor(a = new Vector3(), b = new Vector3(), c = new Vector3()) { + this.a = a; + this.b = b; + this.c = c; + } + static getNormal(a, b, c, target) { + target.subVectors(c, b); + _v0$2.subVectors(a, b); + target.cross(_v0$2); + const targetLengthSq = target.lengthSq(); + if (targetLengthSq > 0) { + return target.multiplyScalar(1 / Math.sqrt(targetLengthSq)); + } + return target.set(0, 0, 0); + } + // static/instance method to calculate barycentric coordinates + // based on: http://www.blackpawn.com/texts/pointinpoly/default.html + static getBarycoord(point, a, b, c, target) { + _v0$2.subVectors(c, a); + _v1$3.subVectors(b, a); + _v2$2.subVectors(point, a); + const dot00 = _v0$2.dot(_v0$2); + const dot01 = _v0$2.dot(_v1$3); + const dot02 = _v0$2.dot(_v2$2); + const dot11 = _v1$3.dot(_v1$3); + const dot12 = _v1$3.dot(_v2$2); + const denom = dot00 * dot11 - dot01 * dot01; + if (denom === 0) { + target.set(0, 0, 0); + return null; } - const textureProperties = properties.get(renderTarget.depthTexture); - textureProperties.__renderTarget = renderTarget; - if (!textureProperties.__webglTexture || renderTarget.depthTexture.image.width !== renderTarget.width || renderTarget.depthTexture.image.height !== renderTarget.height) { - renderTarget.depthTexture.image.width = renderTarget.width; - renderTarget.depthTexture.image.height = renderTarget.height; - renderTarget.depthTexture.needsUpdate = true; + const invDenom = 1 / denom; + const u = (dot11 * dot02 - dot01 * dot12) * invDenom; + const v = (dot00 * dot12 - dot01 * dot02) * invDenom; + return target.set(1 - u - v, v, u); + } + static containsPoint(point, a, b, c) { + if (this.getBarycoord(point, a, b, c, _v3$2) === null) { + return false; } - setTexture2D(renderTarget.depthTexture, 0); - const webglDepthTexture = textureProperties.__webglTexture; - const samples = getRenderTargetSamples(renderTarget); - if (renderTarget.depthTexture.format === DepthFormat) { - if (useMultisampledRTT(renderTarget)) { - multisampledRTTExt.framebufferTexture2DMultisampleEXT(_gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples); - } else { - _gl.framebufferTexture2D(_gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0); - } - } else if (renderTarget.depthTexture.format === DepthStencilFormat) { - if (useMultisampledRTT(renderTarget)) { - multisampledRTTExt.framebufferTexture2DMultisampleEXT(_gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples); - } else { - _gl.framebufferTexture2D(_gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0); - } - } else { - throw new Error("Unknown depthTexture format"); + return _v3$2.x >= 0 && _v3$2.y >= 0 && _v3$2.x + _v3$2.y <= 1; + } + static getInterpolation(point, p1, p2, p3, v1, v2, v3, target) { + if (this.getBarycoord(point, p1, p2, p3, _v3$2) === null) { + target.x = 0; + target.y = 0; + if ("z" in target) target.z = 0; + if ("w" in target) target.w = 0; + return null; } + target.setScalar(0); + target.addScaledVector(v1, _v3$2.x); + target.addScaledVector(v2, _v3$2.y); + target.addScaledVector(v3, _v3$2.z); + return target; } - __name(setupDepthTexture, "setupDepthTexture"); - function setupDepthRenderbuffer(renderTarget) { - const renderTargetProperties = properties.get(renderTarget); - const isCube = renderTarget.isWebGLCubeRenderTarget === true; - if (renderTargetProperties.__boundDepthTexture !== renderTarget.depthTexture) { - const depthTexture = renderTarget.depthTexture; - if (renderTargetProperties.__depthDisposeCallback) { - renderTargetProperties.__depthDisposeCallback(); - } - if (depthTexture) { - const disposeEvent = /* @__PURE__ */ __name(() => { - delete renderTargetProperties.__boundDepthTexture; - delete renderTargetProperties.__depthDisposeCallback; - depthTexture.removeEventListener("dispose", disposeEvent); - }, "disposeEvent"); - depthTexture.addEventListener("dispose", disposeEvent); - renderTargetProperties.__depthDisposeCallback = disposeEvent; - } - renderTargetProperties.__boundDepthTexture = depthTexture; + static getInterpolatedAttribute(attr, i1, i2, i3, barycoord, target) { + _v40.setScalar(0); + _v41.setScalar(0); + _v42.setScalar(0); + _v40.fromBufferAttribute(attr, i1); + _v41.fromBufferAttribute(attr, i2); + _v42.fromBufferAttribute(attr, i3); + target.setScalar(0); + target.addScaledVector(_v40, barycoord.x); + target.addScaledVector(_v41, barycoord.y); + target.addScaledVector(_v42, barycoord.z); + return target; + } + static isFrontFacing(a, b, c, direction) { + _v0$2.subVectors(c, b); + _v1$3.subVectors(a, b); + return _v0$2.cross(_v1$3).dot(direction) < 0 ? true : false; + } + set(a, b, c) { + this.a.copy(a); + this.b.copy(b); + this.c.copy(c); + return this; + } + setFromPointsAndIndices(points, i0, i1, i2) { + this.a.copy(points[i0]); + this.b.copy(points[i1]); + this.c.copy(points[i2]); + return this; + } + setFromAttributeAndIndices(attribute, i0, i1, i2) { + this.a.fromBufferAttribute(attribute, i0); + this.b.fromBufferAttribute(attribute, i1); + this.c.fromBufferAttribute(attribute, i2); + return this; + } + clone() { + return new this.constructor().copy(this); + } + copy(triangle) { + this.a.copy(triangle.a); + this.b.copy(triangle.b); + this.c.copy(triangle.c); + return this; + } + getArea() { + _v0$2.subVectors(this.c, this.b); + _v1$3.subVectors(this.a, this.b); + return _v0$2.cross(_v1$3).length() * 0.5; + } + getMidpoint(target) { + return target.addVectors(this.a, this.b).add(this.c).multiplyScalar(1 / 3); + } + getNormal(target) { + return Triangle.getNormal(this.a, this.b, this.c, target); + } + getPlane(target) { + return target.setFromCoplanarPoints(this.a, this.b, this.c); + } + getBarycoord(point, target) { + return Triangle.getBarycoord(point, this.a, this.b, this.c, target); + } + getInterpolation(point, v1, v2, v3, target) { + return Triangle.getInterpolation(point, this.a, this.b, this.c, v1, v2, v3, target); + } + containsPoint(point) { + return Triangle.containsPoint(point, this.a, this.b, this.c); + } + isFrontFacing(direction) { + return Triangle.isFrontFacing(this.a, this.b, this.c, direction); + } + intersectsBox(box) { + return box.intersectsTriangle(this); + } + closestPointToPoint(p, target) { + const a = this.a, b = this.b, c = this.c; + let v, w; + _vab.subVectors(b, a); + _vac.subVectors(c, a); + _vap.subVectors(p, a); + const d1 = _vab.dot(_vap); + const d2 = _vac.dot(_vap); + if (d1 <= 0 && d2 <= 0) { + return target.copy(a); } - if (renderTarget.depthTexture && !renderTargetProperties.__autoAllocateDepthBuffer) { - if (isCube) throw new Error("target.depthTexture not supported in Cube render targets"); - setupDepthTexture(renderTargetProperties.__webglFramebuffer, renderTarget); - } else { - if (isCube) { - renderTargetProperties.__webglDepthbuffer = []; - for (let i = 0; i < 6; i++) { - state.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[i]); - if (renderTargetProperties.__webglDepthbuffer[i] === void 0) { - renderTargetProperties.__webglDepthbuffer[i] = _gl.createRenderbuffer(); - setupRenderBufferStorage(renderTargetProperties.__webglDepthbuffer[i], renderTarget, false); - } else { - const glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT; - const renderbuffer = renderTargetProperties.__webglDepthbuffer[i]; - _gl.bindRenderbuffer(_gl.RENDERBUFFER, renderbuffer); - _gl.framebufferRenderbuffer(_gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer); - } - } - } else { - state.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer); - if (renderTargetProperties.__webglDepthbuffer === void 0) { - renderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer(); - setupRenderBufferStorage(renderTargetProperties.__webglDepthbuffer, renderTarget, false); - } else { - const glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT; - const renderbuffer = renderTargetProperties.__webglDepthbuffer; - _gl.bindRenderbuffer(_gl.RENDERBUFFER, renderbuffer); - _gl.framebufferRenderbuffer(_gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer); - } - } + _vbp.subVectors(p, b); + const d3 = _vab.dot(_vbp); + const d4 = _vac.dot(_vbp); + if (d3 >= 0 && d4 <= d3) { + return target.copy(b); } - state.bindFramebuffer(_gl.FRAMEBUFFER, null); - } - __name(setupDepthRenderbuffer, "setupDepthRenderbuffer"); - function rebindTextures(renderTarget, colorTexture, depthTexture) { - const renderTargetProperties = properties.get(renderTarget); - if (colorTexture !== void 0) { - setupFrameBufferTexture(renderTargetProperties.__webglFramebuffer, renderTarget, renderTarget.texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, 0); + const vc = d1 * d4 - d3 * d2; + if (vc <= 0 && d1 >= 0 && d3 <= 0) { + v = d1 / (d1 - d3); + return target.copy(a).addScaledVector(_vab, v); } - if (depthTexture !== void 0) { - setupDepthRenderbuffer(renderTarget); + _vcp.subVectors(p, c); + const d5 = _vab.dot(_vcp); + const d6 = _vac.dot(_vcp); + if (d6 >= 0 && d5 <= d6) { + return target.copy(c); } - } - __name(rebindTextures, "rebindTextures"); - function setupRenderTarget(renderTarget) { - const texture = renderTarget.texture; - const renderTargetProperties = properties.get(renderTarget); - const textureProperties = properties.get(texture); - renderTarget.addEventListener("dispose", onRenderTargetDispose); - const textures = renderTarget.textures; - const isCube = renderTarget.isWebGLCubeRenderTarget === true; - const isMultipleRenderTargets = textures.length > 1; - if (!isMultipleRenderTargets) { - if (textureProperties.__webglTexture === void 0) { - textureProperties.__webglTexture = _gl.createTexture(); - } - textureProperties.__version = texture.version; - info.memory.textures++; + const vb = d5 * d2 - d1 * d6; + if (vb <= 0 && d2 >= 0 && d6 <= 0) { + w = d2 / (d2 - d6); + return target.copy(a).addScaledVector(_vac, w); } - if (isCube) { - renderTargetProperties.__webglFramebuffer = []; - for (let i = 0; i < 6; i++) { - if (texture.mipmaps && texture.mipmaps.length > 0) { - renderTargetProperties.__webglFramebuffer[i] = []; - for (let level = 0; level < texture.mipmaps.length; level++) { - renderTargetProperties.__webglFramebuffer[i][level] = _gl.createFramebuffer(); - } - } else { - renderTargetProperties.__webglFramebuffer[i] = _gl.createFramebuffer(); - } - } - } else { - if (texture.mipmaps && texture.mipmaps.length > 0) { - renderTargetProperties.__webglFramebuffer = []; - for (let level = 0; level < texture.mipmaps.length; level++) { - renderTargetProperties.__webglFramebuffer[level] = _gl.createFramebuffer(); - } - } else { - renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer(); - } - if (isMultipleRenderTargets) { - for (let i = 0, il = textures.length; i < il; i++) { - const attachmentProperties = properties.get(textures[i]); - if (attachmentProperties.__webglTexture === void 0) { - attachmentProperties.__webglTexture = _gl.createTexture(); - info.memory.textures++; - } - } - } - if (renderTarget.samples > 0 && useMultisampledRTT(renderTarget) === false) { - renderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer(); - renderTargetProperties.__webglColorRenderbuffer = []; - state.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer); - for (let i = 0; i < textures.length; i++) { - const texture2 = textures[i]; - renderTargetProperties.__webglColorRenderbuffer[i] = _gl.createRenderbuffer(); - _gl.bindRenderbuffer(_gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[i]); - const glFormat = utils.convert(texture2.format, texture2.colorSpace); - const glType = utils.convert(texture2.type); - const glInternalFormat = getInternalFormat(texture2.internalFormat, glFormat, glType, texture2.colorSpace, renderTarget.isXRRenderTarget === true); - const samples = getRenderTargetSamples(renderTarget); - _gl.renderbufferStorageMultisample(_gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height); - _gl.framebufferRenderbuffer(_gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[i]); - } - _gl.bindRenderbuffer(_gl.RENDERBUFFER, null); - if (renderTarget.depthBuffer) { - renderTargetProperties.__webglDepthRenderbuffer = _gl.createRenderbuffer(); - setupRenderBufferStorage(renderTargetProperties.__webglDepthRenderbuffer, renderTarget, true); - } - state.bindFramebuffer(_gl.FRAMEBUFFER, null); - } + const va = d3 * d6 - d5 * d4; + if (va <= 0 && d4 - d3 >= 0 && d5 - d6 >= 0) { + _vbc.subVectors(c, b); + w = (d4 - d3) / (d4 - d3 + (d5 - d6)); + return target.copy(b).addScaledVector(_vbc, w); } - if (isCube) { - state.bindTexture(_gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture); - setTextureParameters(_gl.TEXTURE_CUBE_MAP, texture); - for (let i = 0; i < 6; i++) { - if (texture.mipmaps && texture.mipmaps.length > 0) { - for (let level = 0; level < texture.mipmaps.length; level++) { - setupFrameBufferTexture(renderTargetProperties.__webglFramebuffer[i][level], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, level); - } - } else { - setupFrameBufferTexture(renderTargetProperties.__webglFramebuffer[i], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0); - } - } - if (textureNeedsGenerateMipmaps(texture)) { - generateMipmap(_gl.TEXTURE_CUBE_MAP); - } - state.unbindTexture(); - } else if (isMultipleRenderTargets) { - for (let i = 0, il = textures.length; i < il; i++) { - const attachment = textures[i]; - const attachmentProperties = properties.get(attachment); - state.bindTexture(_gl.TEXTURE_2D, attachmentProperties.__webglTexture); - setTextureParameters(_gl.TEXTURE_2D, attachment); - setupFrameBufferTexture(renderTargetProperties.__webglFramebuffer, renderTarget, attachment, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, 0); - if (textureNeedsGenerateMipmaps(attachment)) { - generateMipmap(_gl.TEXTURE_2D); - } - } - state.unbindTexture(); - } else { - let glTextureType = _gl.TEXTURE_2D; - if (renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget) { - glTextureType = renderTarget.isWebGL3DRenderTarget ? _gl.TEXTURE_3D : _gl.TEXTURE_2D_ARRAY; - } - state.bindTexture(glTextureType, textureProperties.__webglTexture); - setTextureParameters(glTextureType, texture); - if (texture.mipmaps && texture.mipmaps.length > 0) { - for (let level = 0; level < texture.mipmaps.length; level++) { - setupFrameBufferTexture(renderTargetProperties.__webglFramebuffer[level], renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, level); - } - } else { - setupFrameBufferTexture(renderTargetProperties.__webglFramebuffer, renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, 0); - } - if (textureNeedsGenerateMipmaps(texture)) { - generateMipmap(glTextureType); + const denom = 1 / (va + vb + vc); + v = vb * denom; + w = vc * denom; + return target.copy(a).addScaledVector(_vab, v).addScaledVector(_vac, w); + } + equals(triangle) { + return triangle.a.equals(this.a) && triangle.b.equals(this.b) && triangle.c.equals(this.c); + } +} +const _colorKeywords = { + "aliceblue": 15792383, + "antiquewhite": 16444375, + "aqua": 65535, + "aquamarine": 8388564, + "azure": 15794175, + "beige": 16119260, + "bisque": 16770244, + "black": 0, + "blanchedalmond": 16772045, + "blue": 255, + "blueviolet": 9055202, + "brown": 10824234, + "burlywood": 14596231, + "cadetblue": 6266528, + "chartreuse": 8388352, + "chocolate": 13789470, + "coral": 16744272, + "cornflowerblue": 6591981, + "cornsilk": 16775388, + "crimson": 14423100, + "cyan": 65535, + "darkblue": 139, + "darkcyan": 35723, + "darkgoldenrod": 12092939, + "darkgray": 11119017, + "darkgreen": 25600, + "darkgrey": 11119017, + "darkkhaki": 12433259, + "darkmagenta": 9109643, + "darkolivegreen": 5597999, + "darkorange": 16747520, + "darkorchid": 10040012, + "darkred": 9109504, + "darksalmon": 15308410, + "darkseagreen": 9419919, + "darkslateblue": 4734347, + "darkslategray": 3100495, + "darkslategrey": 3100495, + "darkturquoise": 52945, + "darkviolet": 9699539, + "deeppink": 16716947, + "deepskyblue": 49151, + "dimgray": 6908265, + "dimgrey": 6908265, + "dodgerblue": 2003199, + "firebrick": 11674146, + "floralwhite": 16775920, + "forestgreen": 2263842, + "fuchsia": 16711935, + "gainsboro": 14474460, + "ghostwhite": 16316671, + "gold": 16766720, + "goldenrod": 14329120, + "gray": 8421504, + "green": 32768, + "greenyellow": 11403055, + "grey": 8421504, + "honeydew": 15794160, + "hotpink": 16738740, + "indianred": 13458524, + "indigo": 4915330, + "ivory": 16777200, + "khaki": 15787660, + "lavender": 15132410, + "lavenderblush": 16773365, + "lawngreen": 8190976, + "lemonchiffon": 16775885, + "lightblue": 11393254, + "lightcoral": 15761536, + "lightcyan": 14745599, + "lightgoldenrodyellow": 16448210, + "lightgray": 13882323, + "lightgreen": 9498256, + "lightgrey": 13882323, + "lightpink": 16758465, + "lightsalmon": 16752762, + "lightseagreen": 2142890, + "lightskyblue": 8900346, + "lightslategray": 7833753, + "lightslategrey": 7833753, + "lightsteelblue": 11584734, + "lightyellow": 16777184, + "lime": 65280, + "limegreen": 3329330, + "linen": 16445670, + "magenta": 16711935, + "maroon": 8388608, + "mediumaquamarine": 6737322, + "mediumblue": 205, + "mediumorchid": 12211667, + "mediumpurple": 9662683, + "mediumseagreen": 3978097, + "mediumslateblue": 8087790, + "mediumspringgreen": 64154, + "mediumturquoise": 4772300, + "mediumvioletred": 13047173, + "midnightblue": 1644912, + "mintcream": 16121850, + "mistyrose": 16770273, + "moccasin": 16770229, + "navajowhite": 16768685, + "navy": 128, + "oldlace": 16643558, + "olive": 8421376, + "olivedrab": 7048739, + "orange": 16753920, + "orangered": 16729344, + "orchid": 14315734, + "palegoldenrod": 15657130, + "palegreen": 10025880, + "paleturquoise": 11529966, + "palevioletred": 14381203, + "papayawhip": 16773077, + "peachpuff": 16767673, + "peru": 13468991, + "pink": 16761035, + "plum": 14524637, + "powderblue": 11591910, + "purple": 8388736, + "rebeccapurple": 6697881, + "red": 16711680, + "rosybrown": 12357519, + "royalblue": 4286945, + "saddlebrown": 9127187, + "salmon": 16416882, + "sandybrown": 16032864, + "seagreen": 3050327, + "seashell": 16774638, + "sienna": 10506797, + "silver": 12632256, + "skyblue": 8900331, + "slateblue": 6970061, + "slategray": 7372944, + "slategrey": 7372944, + "snow": 16775930, + "springgreen": 65407, + "steelblue": 4620980, + "tan": 13808780, + "teal": 32896, + "thistle": 14204888, + "tomato": 16737095, + "turquoise": 4251856, + "violet": 15631086, + "wheat": 16113331, + "white": 16777215, + "whitesmoke": 16119285, + "yellow": 16776960, + "yellowgreen": 10145074 +}; +const _hslA = { h: 0, s: 0, l: 0 }; +const _hslB = { h: 0, s: 0, l: 0 }; +function hue2rgb(p, q, t2) { + if (t2 < 0) t2 += 1; + if (t2 > 1) t2 -= 1; + if (t2 < 1 / 6) return p + (q - p) * 6 * t2; + if (t2 < 1 / 2) return q; + if (t2 < 2 / 3) return p + (q - p) * 6 * (2 / 3 - t2); + return p; +} +__name(hue2rgb, "hue2rgb"); +class Color { + static { + __name(this, "Color"); + } + constructor(r, g, b) { + this.isColor = true; + this.r = 1; + this.g = 1; + this.b = 1; + return this.set(r, g, b); + } + set(r, g, b) { + if (g === void 0 && b === void 0) { + const value = r; + if (value && value.isColor) { + this.copy(value); + } else if (typeof value === "number") { + this.setHex(value); + } else if (typeof value === "string") { + this.setStyle(value); } - state.unbindTexture(); + } else { + this.setRGB(r, g, b); } - if (renderTarget.depthBuffer) { - setupDepthRenderbuffer(renderTarget); + return this; + } + setScalar(scalar) { + this.r = scalar; + this.g = scalar; + this.b = scalar; + return this; + } + setHex(hex, colorSpace = SRGBColorSpace) { + hex = Math.floor(hex); + this.r = (hex >> 16 & 255) / 255; + this.g = (hex >> 8 & 255) / 255; + this.b = (hex & 255) / 255; + ColorManagement.toWorkingColorSpace(this, colorSpace); + return this; + } + setRGB(r, g, b, colorSpace = ColorManagement.workingColorSpace) { + this.r = r; + this.g = g; + this.b = b; + ColorManagement.toWorkingColorSpace(this, colorSpace); + return this; + } + setHSL(h, s, l, colorSpace = ColorManagement.workingColorSpace) { + h = euclideanModulo(h, 1); + s = clamp(s, 0, 1); + l = clamp(l, 0, 1); + if (s === 0) { + this.r = this.g = this.b = l; + } else { + const p = l <= 0.5 ? l * (1 + s) : l + s - l * s; + const q = 2 * l - p; + this.r = hue2rgb(q, p, h + 1 / 3); + this.g = hue2rgb(q, p, h); + this.b = hue2rgb(q, p, h - 1 / 3); } + ColorManagement.toWorkingColorSpace(this, colorSpace); + return this; } - __name(setupRenderTarget, "setupRenderTarget"); - function updateRenderTargetMipmap(renderTarget) { - const textures = renderTarget.textures; - for (let i = 0, il = textures.length; i < il; i++) { - const texture = textures[i]; - if (textureNeedsGenerateMipmaps(texture)) { - const targetType = getTargetType(renderTarget); - const webglTexture = properties.get(texture).__webglTexture; - state.bindTexture(targetType, webglTexture); - generateMipmap(targetType); - state.unbindTexture(); + setStyle(style, colorSpace = SRGBColorSpace) { + function handleAlpha(string) { + if (string === void 0) return; + if (parseFloat(string) < 1) { + console.warn("THREE.Color: Alpha component of " + style + " will be ignored."); } } - } - __name(updateRenderTargetMipmap, "updateRenderTargetMipmap"); - const invalidationArrayRead = []; - const invalidationArrayDraw = []; - function updateMultisampleRenderTarget(renderTarget) { - if (renderTarget.samples > 0) { - if (useMultisampledRTT(renderTarget) === false) { - const textures = renderTarget.textures; - const width = renderTarget.width; - const height = renderTarget.height; - let mask = _gl.COLOR_BUFFER_BIT; - const depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT; - const renderTargetProperties = properties.get(renderTarget); - const isMultipleRenderTargets = textures.length > 1; - if (isMultipleRenderTargets) { - for (let i = 0; i < textures.length; i++) { - state.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer); - _gl.framebufferRenderbuffer(_gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, null); - state.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer); - _gl.framebufferTexture2D(_gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, null, 0); - } - } - state.bindFramebuffer(_gl.READ_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer); - state.bindFramebuffer(_gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer); - for (let i = 0; i < textures.length; i++) { - if (renderTarget.resolveDepthBuffer) { - if (renderTarget.depthBuffer) mask |= _gl.DEPTH_BUFFER_BIT; - if (renderTarget.stencilBuffer && renderTarget.resolveStencilBuffer) mask |= _gl.STENCIL_BUFFER_BIT; - } - if (isMultipleRenderTargets) { - _gl.framebufferRenderbuffer(_gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[i]); - const webglTexture = properties.get(textures[i]).__webglTexture; - _gl.framebufferTexture2D(_gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, webglTexture, 0); + __name(handleAlpha, "handleAlpha"); + let m; + if (m = /^(\w+)\(([^\)]*)\)/.exec(style)) { + let color; + const name = m[1]; + const components = m[2]; + switch (name) { + case "rgb": + case "rgba": + if (color = /^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(components)) { + handleAlpha(color[4]); + return this.setRGB( + Math.min(255, parseInt(color[1], 10)) / 255, + Math.min(255, parseInt(color[2], 10)) / 255, + Math.min(255, parseInt(color[3], 10)) / 255, + colorSpace + ); } - _gl.blitFramebuffer(0, 0, width, height, 0, 0, width, height, mask, _gl.NEAREST); - if (supportsInvalidateFramebuffer === true) { - invalidationArrayRead.length = 0; - invalidationArrayDraw.length = 0; - invalidationArrayRead.push(_gl.COLOR_ATTACHMENT0 + i); - if (renderTarget.depthBuffer && renderTarget.resolveDepthBuffer === false) { - invalidationArrayRead.push(depthStyle); - invalidationArrayDraw.push(depthStyle); - _gl.invalidateFramebuffer(_gl.DRAW_FRAMEBUFFER, invalidationArrayDraw); - } - _gl.invalidateFramebuffer(_gl.READ_FRAMEBUFFER, invalidationArrayRead); + if (color = /^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(components)) { + handleAlpha(color[4]); + return this.setRGB( + Math.min(100, parseInt(color[1], 10)) / 100, + Math.min(100, parseInt(color[2], 10)) / 100, + Math.min(100, parseInt(color[3], 10)) / 100, + colorSpace + ); } - } - state.bindFramebuffer(_gl.READ_FRAMEBUFFER, null); - state.bindFramebuffer(_gl.DRAW_FRAMEBUFFER, null); - if (isMultipleRenderTargets) { - for (let i = 0; i < textures.length; i++) { - state.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer); - _gl.framebufferRenderbuffer(_gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[i]); - const webglTexture = properties.get(textures[i]).__webglTexture; - state.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer); - _gl.framebufferTexture2D(_gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, webglTexture, 0); + break; + case "hsl": + case "hsla": + if (color = /^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(components)) { + handleAlpha(color[4]); + return this.setHSL( + parseFloat(color[1]) / 360, + parseFloat(color[2]) / 100, + parseFloat(color[3]) / 100, + colorSpace + ); } - } - state.bindFramebuffer(_gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer); + break; + default: + console.warn("THREE.Color: Unknown color model " + style); + } + } else if (m = /^\#([A-Fa-f\d]+)$/.exec(style)) { + const hex = m[1]; + const size = hex.length; + if (size === 3) { + return this.setRGB( + parseInt(hex.charAt(0), 16) / 15, + parseInt(hex.charAt(1), 16) / 15, + parseInt(hex.charAt(2), 16) / 15, + colorSpace + ); + } else if (size === 6) { + return this.setHex(parseInt(hex, 16), colorSpace); } else { - if (renderTarget.depthBuffer && renderTarget.resolveDepthBuffer === false && supportsInvalidateFramebuffer) { - const depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT; - _gl.invalidateFramebuffer(_gl.DRAW_FRAMEBUFFER, [depthStyle]); - } + console.warn("THREE.Color: Invalid hex color " + style); } + } else if (style && style.length > 0) { + return this.setColorName(style, colorSpace); } + return this; } - __name(updateMultisampleRenderTarget, "updateMultisampleRenderTarget"); - function getRenderTargetSamples(renderTarget) { - return Math.min(capabilities.maxSamples, renderTarget.samples); + setColorName(style, colorSpace = SRGBColorSpace) { + const hex = _colorKeywords[style.toLowerCase()]; + if (hex !== void 0) { + this.setHex(hex, colorSpace); + } else { + console.warn("THREE.Color: Unknown color " + style); + } + return this; } - __name(getRenderTargetSamples, "getRenderTargetSamples"); - function useMultisampledRTT(renderTarget) { - const renderTargetProperties = properties.get(renderTarget); - return renderTarget.samples > 0 && extensions.has("WEBGL_multisampled_render_to_texture") === true && renderTargetProperties.__useRenderToTexture !== false; + clone() { + return new this.constructor(this.r, this.g, this.b); } - __name(useMultisampledRTT, "useMultisampledRTT"); - function updateVideoTexture(texture) { - const frame = info.render.frame; - if (_videoTextures.get(texture) !== frame) { - _videoTextures.set(texture, frame); - texture.update(); - } + copy(color) { + this.r = color.r; + this.g = color.g; + this.b = color.b; + return this; } - __name(updateVideoTexture, "updateVideoTexture"); - function verifyColorSpace(texture, image) { - const colorSpace = texture.colorSpace; - const format = texture.format; - const type = texture.type; - if (texture.isCompressedTexture === true || texture.isVideoTexture === true) return image; - if (colorSpace !== LinearSRGBColorSpace && colorSpace !== NoColorSpace) { - if (ColorManagement.getTransfer(colorSpace) === SRGBTransfer) { - if (format !== RGBAFormat || type !== UnsignedByteType) { - console.warn("THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."); - } - } else { - console.error("THREE.WebGLTextures: Unsupported texture color space:", colorSpace); - } - } - return image; + copySRGBToLinear(color) { + this.r = SRGBToLinear(color.r); + this.g = SRGBToLinear(color.g); + this.b = SRGBToLinear(color.b); + return this; } - __name(verifyColorSpace, "verifyColorSpace"); - function getDimensions(image) { - if (typeof HTMLImageElement !== "undefined" && image instanceof HTMLImageElement) { - _imageDimensions.width = image.naturalWidth || image.width; - _imageDimensions.height = image.naturalHeight || image.height; - } else if (typeof VideoFrame !== "undefined" && image instanceof VideoFrame) { - _imageDimensions.width = image.displayWidth; - _imageDimensions.height = image.displayHeight; - } else { - _imageDimensions.width = image.width; - _imageDimensions.height = image.height; - } - return _imageDimensions; + copyLinearToSRGB(color) { + this.r = LinearToSRGB(color.r); + this.g = LinearToSRGB(color.g); + this.b = LinearToSRGB(color.b); + return this; } - __name(getDimensions, "getDimensions"); - this.allocateTextureUnit = allocateTextureUnit; - this.resetTextureUnits = resetTextureUnits; - this.setTexture2D = setTexture2D; - this.setTexture2DArray = setTexture2DArray; - this.setTexture3D = setTexture3D; - this.setTextureCube = setTextureCube; - this.rebindTextures = rebindTextures; - this.setupRenderTarget = setupRenderTarget; - this.updateRenderTargetMipmap = updateRenderTargetMipmap; - this.updateMultisampleRenderTarget = updateMultisampleRenderTarget; - this.setupDepthRenderbuffer = setupDepthRenderbuffer; - this.setupFrameBufferTexture = setupFrameBufferTexture; - this.useMultisampledRTT = useMultisampledRTT; -} -__name(WebGLTextures, "WebGLTextures"); -function WebGLUtils(gl, extensions) { - function convert(p, colorSpace = NoColorSpace) { - let extension; - const transfer = ColorManagement.getTransfer(colorSpace); - if (p === UnsignedByteType) return gl.UNSIGNED_BYTE; - if (p === UnsignedShort4444Type) return gl.UNSIGNED_SHORT_4_4_4_4; - if (p === UnsignedShort5551Type) return gl.UNSIGNED_SHORT_5_5_5_1; - if (p === UnsignedInt5999Type) return gl.UNSIGNED_INT_5_9_9_9_REV; - if (p === ByteType) return gl.BYTE; - if (p === ShortType) return gl.SHORT; - if (p === UnsignedShortType) return gl.UNSIGNED_SHORT; - if (p === IntType) return gl.INT; - if (p === UnsignedIntType) return gl.UNSIGNED_INT; - if (p === FloatType) return gl.FLOAT; - if (p === HalfFloatType) return gl.HALF_FLOAT; - if (p === AlphaFormat) return gl.ALPHA; - if (p === RGBFormat) return gl.RGB; - if (p === RGBAFormat) return gl.RGBA; - if (p === LuminanceFormat) return gl.LUMINANCE; - if (p === LuminanceAlphaFormat) return gl.LUMINANCE_ALPHA; - if (p === DepthFormat) return gl.DEPTH_COMPONENT; - if (p === DepthStencilFormat) return gl.DEPTH_STENCIL; - if (p === RedFormat) return gl.RED; - if (p === RedIntegerFormat) return gl.RED_INTEGER; - if (p === RGFormat) return gl.RG; - if (p === RGIntegerFormat) return gl.RG_INTEGER; - if (p === RGBAIntegerFormat) return gl.RGBA_INTEGER; - if (p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format) { - if (transfer === SRGBTransfer) { - extension = extensions.get("WEBGL_compressed_texture_s3tc_srgb"); - if (extension !== null) { - if (p === RGB_S3TC_DXT1_Format) return extension.COMPRESSED_SRGB_S3TC_DXT1_EXT; - if (p === RGBA_S3TC_DXT1_Format) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT; - if (p === RGBA_S3TC_DXT3_Format) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT; - if (p === RGBA_S3TC_DXT5_Format) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT; - } else { - return null; - } - } else { - extension = extensions.get("WEBGL_compressed_texture_s3tc"); - if (extension !== null) { - if (p === RGB_S3TC_DXT1_Format) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT; - if (p === RGBA_S3TC_DXT1_Format) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT; - if (p === RGBA_S3TC_DXT3_Format) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT; - if (p === RGBA_S3TC_DXT5_Format) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT; - } else { - return null; - } - } - } - if (p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format) { - extension = extensions.get("WEBGL_compressed_texture_pvrtc"); - if (extension !== null) { - if (p === RGB_PVRTC_4BPPV1_Format) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; - if (p === RGB_PVRTC_2BPPV1_Format) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG; - if (p === RGBA_PVRTC_4BPPV1_Format) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; - if (p === RGBA_PVRTC_2BPPV1_Format) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; - } else { - return null; - } - } - if (p === RGB_ETC1_Format || p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format) { - extension = extensions.get("WEBGL_compressed_texture_etc"); - if (extension !== null) { - if (p === RGB_ETC1_Format || p === RGB_ETC2_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ETC2 : extension.COMPRESSED_RGB8_ETC2; - if (p === RGBA_ETC2_EAC_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : extension.COMPRESSED_RGBA8_ETC2_EAC; - } else { - return null; - } - } - if (p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format || p === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format || p === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format || p === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format || p === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format) { - extension = extensions.get("WEBGL_compressed_texture_astc"); - if (extension !== null) { - if (p === RGBA_ASTC_4x4_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR : extension.COMPRESSED_RGBA_ASTC_4x4_KHR; - if (p === RGBA_ASTC_5x4_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR : extension.COMPRESSED_RGBA_ASTC_5x4_KHR; - if (p === RGBA_ASTC_5x5_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR : extension.COMPRESSED_RGBA_ASTC_5x5_KHR; - if (p === RGBA_ASTC_6x5_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR : extension.COMPRESSED_RGBA_ASTC_6x5_KHR; - if (p === RGBA_ASTC_6x6_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR : extension.COMPRESSED_RGBA_ASTC_6x6_KHR; - if (p === RGBA_ASTC_8x5_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR : extension.COMPRESSED_RGBA_ASTC_8x5_KHR; - if (p === RGBA_ASTC_8x6_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR : extension.COMPRESSED_RGBA_ASTC_8x6_KHR; - if (p === RGBA_ASTC_8x8_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR : extension.COMPRESSED_RGBA_ASTC_8x8_KHR; - if (p === RGBA_ASTC_10x5_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR : extension.COMPRESSED_RGBA_ASTC_10x5_KHR; - if (p === RGBA_ASTC_10x6_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR : extension.COMPRESSED_RGBA_ASTC_10x6_KHR; - if (p === RGBA_ASTC_10x8_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR : extension.COMPRESSED_RGBA_ASTC_10x8_KHR; - if (p === RGBA_ASTC_10x10_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR : extension.COMPRESSED_RGBA_ASTC_10x10_KHR; - if (p === RGBA_ASTC_12x10_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR : extension.COMPRESSED_RGBA_ASTC_12x10_KHR; - if (p === RGBA_ASTC_12x12_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR : extension.COMPRESSED_RGBA_ASTC_12x12_KHR; - } else { - return null; - } - } - if (p === RGBA_BPTC_Format || p === RGB_BPTC_SIGNED_Format || p === RGB_BPTC_UNSIGNED_Format) { - extension = extensions.get("EXT_texture_compression_bptc"); - if (extension !== null) { - if (p === RGBA_BPTC_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT : extension.COMPRESSED_RGBA_BPTC_UNORM_EXT; - if (p === RGB_BPTC_SIGNED_Format) return extension.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT; - if (p === RGB_BPTC_UNSIGNED_Format) return extension.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT; - } else { - return null; + convertSRGBToLinear() { + this.copySRGBToLinear(this); + return this; + } + convertLinearToSRGB() { + this.copyLinearToSRGB(this); + return this; + } + getHex(colorSpace = SRGBColorSpace) { + ColorManagement.fromWorkingColorSpace(_color$1.copy(this), colorSpace); + return Math.round(clamp(_color$1.r * 255, 0, 255)) * 65536 + Math.round(clamp(_color$1.g * 255, 0, 255)) * 256 + Math.round(clamp(_color$1.b * 255, 0, 255)); + } + getHexString(colorSpace = SRGBColorSpace) { + return ("000000" + this.getHex(colorSpace).toString(16)).slice(-6); + } + getHSL(target, colorSpace = ColorManagement.workingColorSpace) { + ColorManagement.fromWorkingColorSpace(_color$1.copy(this), colorSpace); + const r = _color$1.r, g = _color$1.g, b = _color$1.b; + const max2 = Math.max(r, g, b); + const min = Math.min(r, g, b); + let hue, saturation; + const lightness = (min + max2) / 2; + if (min === max2) { + hue = 0; + saturation = 0; + } else { + const delta = max2 - min; + saturation = lightness <= 0.5 ? delta / (max2 + min) : delta / (2 - max2 - min); + switch (max2) { + case r: + hue = (g - b) / delta + (g < b ? 6 : 0); + break; + case g: + hue = (b - r) / delta + 2; + break; + case b: + hue = (r - g) / delta + 4; + break; } + hue /= 6; } - if (p === RED_RGTC1_Format || p === SIGNED_RED_RGTC1_Format || p === RED_GREEN_RGTC2_Format || p === SIGNED_RED_GREEN_RGTC2_Format) { - extension = extensions.get("EXT_texture_compression_rgtc"); - if (extension !== null) { - if (p === RGBA_BPTC_Format) return extension.COMPRESSED_RED_RGTC1_EXT; - if (p === SIGNED_RED_RGTC1_Format) return extension.COMPRESSED_SIGNED_RED_RGTC1_EXT; - if (p === RED_GREEN_RGTC2_Format) return extension.COMPRESSED_RED_GREEN_RGTC2_EXT; - if (p === SIGNED_RED_GREEN_RGTC2_Format) return extension.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT; - } else { - return null; - } + target.h = hue; + target.s = saturation; + target.l = lightness; + return target; + } + getRGB(target, colorSpace = ColorManagement.workingColorSpace) { + ColorManagement.fromWorkingColorSpace(_color$1.copy(this), colorSpace); + target.r = _color$1.r; + target.g = _color$1.g; + target.b = _color$1.b; + return target; + } + getStyle(colorSpace = SRGBColorSpace) { + ColorManagement.fromWorkingColorSpace(_color$1.copy(this), colorSpace); + const r = _color$1.r, g = _color$1.g, b = _color$1.b; + if (colorSpace !== SRGBColorSpace) { + return `color(${colorSpace} ${r.toFixed(3)} ${g.toFixed(3)} ${b.toFixed(3)})`; } - if (p === UnsignedInt248Type) return gl.UNSIGNED_INT_24_8; - return gl[p] !== void 0 ? gl[p] : null; + return `rgb(${Math.round(r * 255)},${Math.round(g * 255)},${Math.round(b * 255)})`; + } + offsetHSL(h, s, l) { + this.getHSL(_hslA); + return this.setHSL(_hslA.h + h, _hslA.s + s, _hslA.l + l); + } + add(color) { + this.r += color.r; + this.g += color.g; + this.b += color.b; + return this; + } + addColors(color1, color2) { + this.r = color1.r + color2.r; + this.g = color1.g + color2.g; + this.b = color1.b + color2.b; + return this; + } + addScalar(s) { + this.r += s; + this.g += s; + this.b += s; + return this; + } + sub(color) { + this.r = Math.max(0, this.r - color.r); + this.g = Math.max(0, this.g - color.g); + this.b = Math.max(0, this.b - color.b); + return this; + } + multiply(color) { + this.r *= color.r; + this.g *= color.g; + this.b *= color.b; + return this; + } + multiplyScalar(s) { + this.r *= s; + this.g *= s; + this.b *= s; + return this; + } + lerp(color, alpha) { + this.r += (color.r - this.r) * alpha; + this.g += (color.g - this.g) * alpha; + this.b += (color.b - this.b) * alpha; + return this; + } + lerpColors(color1, color2, alpha) { + this.r = color1.r + (color2.r - color1.r) * alpha; + this.g = color1.g + (color2.g - color1.g) * alpha; + this.b = color1.b + (color2.b - color1.b) * alpha; + return this; + } + lerpHSL(color, alpha) { + this.getHSL(_hslA); + color.getHSL(_hslB); + const h = lerp(_hslA.h, _hslB.h, alpha); + const s = lerp(_hslA.s, _hslB.s, alpha); + const l = lerp(_hslA.l, _hslB.l, alpha); + this.setHSL(h, s, l); + return this; + } + setFromVector3(v) { + this.r = v.x; + this.g = v.y; + this.b = v.z; + return this; + } + applyMatrix3(m) { + const r = this.r, g = this.g, b = this.b; + const e = m.elements; + this.r = e[0] * r + e[3] * g + e[6] * b; + this.g = e[1] * r + e[4] * g + e[7] * b; + this.b = e[2] * r + e[5] * g + e[8] * b; + return this; + } + equals(c) { + return c.r === this.r && c.g === this.g && c.b === this.b; + } + fromArray(array, offset = 0) { + this.r = array[offset]; + this.g = array[offset + 1]; + this.b = array[offset + 2]; + return this; } - __name(convert, "convert"); - return { convert }; -} -__name(WebGLUtils, "WebGLUtils"); -class ArrayCamera extends PerspectiveCamera { - static { - __name(this, "ArrayCamera"); + toArray(array = [], offset = 0) { + array[offset] = this.r; + array[offset + 1] = this.g; + array[offset + 2] = this.b; + return array; } - constructor(array = []) { - super(); - this.isArrayCamera = true; - this.cameras = array; + fromBufferAttribute(attribute, index) { + this.r = attribute.getX(index); + this.g = attribute.getY(index); + this.b = attribute.getZ(index); + return this; } -} -class Group extends Object3D { - static { - __name(this, "Group"); + toJSON() { + return this.getHex(); } - constructor() { - super(); - this.isGroup = true; - this.type = "Group"; + *[Symbol.iterator]() { + yield this.r; + yield this.g; + yield this.b; } } -const _moveEvent = { type: "move" }; -class WebXRController { +const _color$1 = /* @__PURE__ */ new Color(); +Color.NAMES = _colorKeywords; +let _materialId = 0; +class Material extends EventDispatcher { static { - __name(this, "WebXRController"); + __name(this, "Material"); + } + static get type() { + return "Material"; + } + get type() { + return this.constructor.type; + } + set type(_value) { } constructor() { - this._targetRay = null; - this._grip = null; - this._hand = null; + super(); + this.isMaterial = true; + Object.defineProperty(this, "id", { value: _materialId++ }); + this.uuid = generateUUID(); + this.name = ""; + this.blending = NormalBlending; + this.side = FrontSide; + this.vertexColors = false; + this.opacity = 1; + this.transparent = false; + this.alphaHash = false; + this.blendSrc = SrcAlphaFactor; + this.blendDst = OneMinusSrcAlphaFactor; + this.blendEquation = AddEquation; + this.blendSrcAlpha = null; + this.blendDstAlpha = null; + this.blendEquationAlpha = null; + this.blendColor = new Color(0, 0, 0); + this.blendAlpha = 0; + this.depthFunc = LessEqualDepth; + this.depthTest = true; + this.depthWrite = true; + this.stencilWriteMask = 255; + this.stencilFunc = AlwaysStencilFunc; + this.stencilRef = 0; + this.stencilFuncMask = 255; + this.stencilFail = KeepStencilOp; + this.stencilZFail = KeepStencilOp; + this.stencilZPass = KeepStencilOp; + this.stencilWrite = false; + this.clippingPlanes = null; + this.clipIntersection = false; + this.clipShadows = false; + this.shadowSide = null; + this.colorWrite = true; + this.precision = null; + this.polygonOffset = false; + this.polygonOffsetFactor = 0; + this.polygonOffsetUnits = 0; + this.dithering = false; + this.alphaToCoverage = false; + this.premultipliedAlpha = false; + this.forceSinglePass = false; + this.visible = true; + this.toneMapped = true; + this.userData = {}; + this.version = 0; + this._alphaTest = 0; } - getHandSpace() { - if (this._hand === null) { - this._hand = new Group(); - this._hand.matrixAutoUpdate = false; - this._hand.visible = false; - this._hand.joints = {}; - this._hand.inputState = { pinching: false }; - } - return this._hand; + get alphaTest() { + return this._alphaTest; } - getTargetRaySpace() { - if (this._targetRay === null) { - this._targetRay = new Group(); - this._targetRay.matrixAutoUpdate = false; - this._targetRay.visible = false; - this._targetRay.hasLinearVelocity = false; - this._targetRay.linearVelocity = new Vector3(); - this._targetRay.hasAngularVelocity = false; - this._targetRay.angularVelocity = new Vector3(); + set alphaTest(value) { + if (this._alphaTest > 0 !== value > 0) { + this.version++; } - return this._targetRay; + this._alphaTest = value; } - getGripSpace() { - if (this._grip === null) { - this._grip = new Group(); - this._grip.matrixAutoUpdate = false; - this._grip.visible = false; - this._grip.hasLinearVelocity = false; - this._grip.linearVelocity = new Vector3(); - this._grip.hasAngularVelocity = false; - this._grip.angularVelocity = new Vector3(); + // onBeforeRender and onBeforeCompile only supported in WebGLRenderer + onBeforeRender() { + } + onBeforeCompile() { + } + customProgramCacheKey() { + return this.onBeforeCompile.toString(); + } + setValues(values) { + if (values === void 0) return; + for (const key in values) { + const newValue = values[key]; + if (newValue === void 0) { + console.warn(`THREE.Material: parameter '${key}' has value of undefined.`); + continue; + } + const currentValue = this[key]; + if (currentValue === void 0) { + console.warn(`THREE.Material: '${key}' is not a property of THREE.${this.type}.`); + continue; + } + if (currentValue && currentValue.isColor) { + currentValue.set(newValue); + } else if (currentValue && currentValue.isVector3 && (newValue && newValue.isVector3)) { + currentValue.copy(newValue); + } else { + this[key] = newValue; + } } - return this._grip; } - dispatchEvent(event) { - if (this._targetRay !== null) { - this._targetRay.dispatchEvent(event); + toJSON(meta) { + const isRootObject = meta === void 0 || typeof meta === "string"; + if (isRootObject) { + meta = { + textures: {}, + images: {} + }; } - if (this._grip !== null) { - this._grip.dispatchEvent(event); + const data = { + metadata: { + version: 4.6, + type: "Material", + generator: "Material.toJSON" + } + }; + data.uuid = this.uuid; + data.type = this.type; + if (this.name !== "") data.name = this.name; + if (this.color && this.color.isColor) data.color = this.color.getHex(); + if (this.roughness !== void 0) data.roughness = this.roughness; + if (this.metalness !== void 0) data.metalness = this.metalness; + if (this.sheen !== void 0) data.sheen = this.sheen; + if (this.sheenColor && this.sheenColor.isColor) data.sheenColor = this.sheenColor.getHex(); + if (this.sheenRoughness !== void 0) data.sheenRoughness = this.sheenRoughness; + if (this.emissive && this.emissive.isColor) data.emissive = this.emissive.getHex(); + if (this.emissiveIntensity !== void 0 && this.emissiveIntensity !== 1) data.emissiveIntensity = this.emissiveIntensity; + if (this.specular && this.specular.isColor) data.specular = this.specular.getHex(); + if (this.specularIntensity !== void 0) data.specularIntensity = this.specularIntensity; + if (this.specularColor && this.specularColor.isColor) data.specularColor = this.specularColor.getHex(); + if (this.shininess !== void 0) data.shininess = this.shininess; + if (this.clearcoat !== void 0) data.clearcoat = this.clearcoat; + if (this.clearcoatRoughness !== void 0) data.clearcoatRoughness = this.clearcoatRoughness; + if (this.clearcoatMap && this.clearcoatMap.isTexture) { + data.clearcoatMap = this.clearcoatMap.toJSON(meta).uuid; } - if (this._hand !== null) { - this._hand.dispatchEvent(event); + if (this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture) { + data.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON(meta).uuid; } - return this; - } - connect(inputSource) { - if (inputSource && inputSource.hand) { - const hand = this._hand; - if (hand) { - for (const inputjoint of inputSource.hand.values()) { - this._getHandJoint(hand, inputjoint); - } - } + if (this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture) { + data.clearcoatNormalMap = this.clearcoatNormalMap.toJSON(meta).uuid; + data.clearcoatNormalScale = this.clearcoatNormalScale.toArray(); } - this.dispatchEvent({ type: "connected", data: inputSource }); - return this; - } - disconnect(inputSource) { - this.dispatchEvent({ type: "disconnected", data: inputSource }); - if (this._targetRay !== null) { - this._targetRay.visible = false; + if (this.dispersion !== void 0) data.dispersion = this.dispersion; + if (this.iridescence !== void 0) data.iridescence = this.iridescence; + if (this.iridescenceIOR !== void 0) data.iridescenceIOR = this.iridescenceIOR; + if (this.iridescenceThicknessRange !== void 0) data.iridescenceThicknessRange = this.iridescenceThicknessRange; + if (this.iridescenceMap && this.iridescenceMap.isTexture) { + data.iridescenceMap = this.iridescenceMap.toJSON(meta).uuid; } - if (this._grip !== null) { - this._grip.visible = false; + if (this.iridescenceThicknessMap && this.iridescenceThicknessMap.isTexture) { + data.iridescenceThicknessMap = this.iridescenceThicknessMap.toJSON(meta).uuid; } - if (this._hand !== null) { - this._hand.visible = false; + if (this.anisotropy !== void 0) data.anisotropy = this.anisotropy; + if (this.anisotropyRotation !== void 0) data.anisotropyRotation = this.anisotropyRotation; + if (this.anisotropyMap && this.anisotropyMap.isTexture) { + data.anisotropyMap = this.anisotropyMap.toJSON(meta).uuid; } - return this; - } - update(inputSource, frame, referenceSpace) { - let inputPose = null; - let gripPose = null; - let handPose = null; - const targetRay = this._targetRay; - const grip = this._grip; - const hand = this._hand; - if (inputSource && frame.session.visibilityState !== "visible-blurred") { - if (hand && inputSource.hand) { - handPose = true; - for (const inputjoint of inputSource.hand.values()) { - const jointPose = frame.getJointPose(inputjoint, referenceSpace); - const joint = this._getHandJoint(hand, inputjoint); - if (jointPose !== null) { - joint.matrix.fromArray(jointPose.transform.matrix); - joint.matrix.decompose(joint.position, joint.rotation, joint.scale); - joint.matrixWorldNeedsUpdate = true; - joint.jointRadius = jointPose.radius; - } - joint.visible = jointPose !== null; - } - const indexTip = hand.joints["index-finger-tip"]; - const thumbTip = hand.joints["thumb-tip"]; - const distance = indexTip.position.distanceTo(thumbTip.position); - const distanceToPinch = 0.02; - const threshold = 5e-3; - if (hand.inputState.pinching && distance > distanceToPinch + threshold) { - hand.inputState.pinching = false; - this.dispatchEvent({ - type: "pinchend", - handedness: inputSource.handedness, - target: this - }); - } else if (!hand.inputState.pinching && distance <= distanceToPinch - threshold) { - hand.inputState.pinching = true; - this.dispatchEvent({ - type: "pinchstart", - handedness: inputSource.handedness, - target: this - }); - } - } else { - if (grip !== null && inputSource.gripSpace) { - gripPose = frame.getPose(inputSource.gripSpace, referenceSpace); - if (gripPose !== null) { - grip.matrix.fromArray(gripPose.transform.matrix); - grip.matrix.decompose(grip.position, grip.rotation, grip.scale); - grip.matrixWorldNeedsUpdate = true; - if (gripPose.linearVelocity) { - grip.hasLinearVelocity = true; - grip.linearVelocity.copy(gripPose.linearVelocity); - } else { - grip.hasLinearVelocity = false; - } - if (gripPose.angularVelocity) { - grip.hasAngularVelocity = true; - grip.angularVelocity.copy(gripPose.angularVelocity); - } else { - grip.hasAngularVelocity = false; - } - } - } - } - if (targetRay !== null) { - inputPose = frame.getPose(inputSource.targetRaySpace, referenceSpace); - if (inputPose === null && gripPose !== null) { - inputPose = gripPose; - } - if (inputPose !== null) { - targetRay.matrix.fromArray(inputPose.transform.matrix); - targetRay.matrix.decompose(targetRay.position, targetRay.rotation, targetRay.scale); - targetRay.matrixWorldNeedsUpdate = true; - if (inputPose.linearVelocity) { - targetRay.hasLinearVelocity = true; - targetRay.linearVelocity.copy(inputPose.linearVelocity); - } else { - targetRay.hasLinearVelocity = false; - } - if (inputPose.angularVelocity) { - targetRay.hasAngularVelocity = true; - targetRay.angularVelocity.copy(inputPose.angularVelocity); - } else { - targetRay.hasAngularVelocity = false; - } - this.dispatchEvent(_moveEvent); - } - } + if (this.map && this.map.isTexture) data.map = this.map.toJSON(meta).uuid; + if (this.matcap && this.matcap.isTexture) data.matcap = this.matcap.toJSON(meta).uuid; + if (this.alphaMap && this.alphaMap.isTexture) data.alphaMap = this.alphaMap.toJSON(meta).uuid; + if (this.lightMap && this.lightMap.isTexture) { + data.lightMap = this.lightMap.toJSON(meta).uuid; + data.lightMapIntensity = this.lightMapIntensity; } - if (targetRay !== null) { - targetRay.visible = inputPose !== null; + if (this.aoMap && this.aoMap.isTexture) { + data.aoMap = this.aoMap.toJSON(meta).uuid; + data.aoMapIntensity = this.aoMapIntensity; } - if (grip !== null) { - grip.visible = gripPose !== null; + if (this.bumpMap && this.bumpMap.isTexture) { + data.bumpMap = this.bumpMap.toJSON(meta).uuid; + data.bumpScale = this.bumpScale; } - if (hand !== null) { - hand.visible = handPose !== null; + if (this.normalMap && this.normalMap.isTexture) { + data.normalMap = this.normalMap.toJSON(meta).uuid; + data.normalMapType = this.normalMapType; + data.normalScale = this.normalScale.toArray(); + } + if (this.displacementMap && this.displacementMap.isTexture) { + data.displacementMap = this.displacementMap.toJSON(meta).uuid; + data.displacementScale = this.displacementScale; + data.displacementBias = this.displacementBias; + } + if (this.roughnessMap && this.roughnessMap.isTexture) data.roughnessMap = this.roughnessMap.toJSON(meta).uuid; + if (this.metalnessMap && this.metalnessMap.isTexture) data.metalnessMap = this.metalnessMap.toJSON(meta).uuid; + if (this.emissiveMap && this.emissiveMap.isTexture) data.emissiveMap = this.emissiveMap.toJSON(meta).uuid; + if (this.specularMap && this.specularMap.isTexture) data.specularMap = this.specularMap.toJSON(meta).uuid; + if (this.specularIntensityMap && this.specularIntensityMap.isTexture) data.specularIntensityMap = this.specularIntensityMap.toJSON(meta).uuid; + if (this.specularColorMap && this.specularColorMap.isTexture) data.specularColorMap = this.specularColorMap.toJSON(meta).uuid; + if (this.envMap && this.envMap.isTexture) { + data.envMap = this.envMap.toJSON(meta).uuid; + if (this.combine !== void 0) data.combine = this.combine; + } + if (this.envMapRotation !== void 0) data.envMapRotation = this.envMapRotation.toArray(); + if (this.envMapIntensity !== void 0) data.envMapIntensity = this.envMapIntensity; + if (this.reflectivity !== void 0) data.reflectivity = this.reflectivity; + if (this.refractionRatio !== void 0) data.refractionRatio = this.refractionRatio; + if (this.gradientMap && this.gradientMap.isTexture) { + data.gradientMap = this.gradientMap.toJSON(meta).uuid; + } + if (this.transmission !== void 0) data.transmission = this.transmission; + if (this.transmissionMap && this.transmissionMap.isTexture) data.transmissionMap = this.transmissionMap.toJSON(meta).uuid; + if (this.thickness !== void 0) data.thickness = this.thickness; + if (this.thicknessMap && this.thicknessMap.isTexture) data.thicknessMap = this.thicknessMap.toJSON(meta).uuid; + if (this.attenuationDistance !== void 0 && this.attenuationDistance !== Infinity) data.attenuationDistance = this.attenuationDistance; + if (this.attenuationColor !== void 0) data.attenuationColor = this.attenuationColor.getHex(); + if (this.size !== void 0) data.size = this.size; + if (this.shadowSide !== null) data.shadowSide = this.shadowSide; + if (this.sizeAttenuation !== void 0) data.sizeAttenuation = this.sizeAttenuation; + if (this.blending !== NormalBlending) data.blending = this.blending; + if (this.side !== FrontSide) data.side = this.side; + if (this.vertexColors === true) data.vertexColors = true; + if (this.opacity < 1) data.opacity = this.opacity; + if (this.transparent === true) data.transparent = true; + if (this.blendSrc !== SrcAlphaFactor) data.blendSrc = this.blendSrc; + if (this.blendDst !== OneMinusSrcAlphaFactor) data.blendDst = this.blendDst; + if (this.blendEquation !== AddEquation) data.blendEquation = this.blendEquation; + if (this.blendSrcAlpha !== null) data.blendSrcAlpha = this.blendSrcAlpha; + if (this.blendDstAlpha !== null) data.blendDstAlpha = this.blendDstAlpha; + if (this.blendEquationAlpha !== null) data.blendEquationAlpha = this.blendEquationAlpha; + if (this.blendColor && this.blendColor.isColor) data.blendColor = this.blendColor.getHex(); + if (this.blendAlpha !== 0) data.blendAlpha = this.blendAlpha; + if (this.depthFunc !== LessEqualDepth) data.depthFunc = this.depthFunc; + if (this.depthTest === false) data.depthTest = this.depthTest; + if (this.depthWrite === false) data.depthWrite = this.depthWrite; + if (this.colorWrite === false) data.colorWrite = this.colorWrite; + if (this.stencilWriteMask !== 255) data.stencilWriteMask = this.stencilWriteMask; + if (this.stencilFunc !== AlwaysStencilFunc) data.stencilFunc = this.stencilFunc; + if (this.stencilRef !== 0) data.stencilRef = this.stencilRef; + if (this.stencilFuncMask !== 255) data.stencilFuncMask = this.stencilFuncMask; + if (this.stencilFail !== KeepStencilOp) data.stencilFail = this.stencilFail; + if (this.stencilZFail !== KeepStencilOp) data.stencilZFail = this.stencilZFail; + if (this.stencilZPass !== KeepStencilOp) data.stencilZPass = this.stencilZPass; + if (this.stencilWrite === true) data.stencilWrite = this.stencilWrite; + if (this.rotation !== void 0 && this.rotation !== 0) data.rotation = this.rotation; + if (this.polygonOffset === true) data.polygonOffset = true; + if (this.polygonOffsetFactor !== 0) data.polygonOffsetFactor = this.polygonOffsetFactor; + if (this.polygonOffsetUnits !== 0) data.polygonOffsetUnits = this.polygonOffsetUnits; + if (this.linewidth !== void 0 && this.linewidth !== 1) data.linewidth = this.linewidth; + if (this.dashSize !== void 0) data.dashSize = this.dashSize; + if (this.gapSize !== void 0) data.gapSize = this.gapSize; + if (this.scale !== void 0) data.scale = this.scale; + if (this.dithering === true) data.dithering = true; + if (this.alphaTest > 0) data.alphaTest = this.alphaTest; + if (this.alphaHash === true) data.alphaHash = true; + if (this.alphaToCoverage === true) data.alphaToCoverage = true; + if (this.premultipliedAlpha === true) data.premultipliedAlpha = true; + if (this.forceSinglePass === true) data.forceSinglePass = true; + if (this.wireframe === true) data.wireframe = true; + if (this.wireframeLinewidth > 1) data.wireframeLinewidth = this.wireframeLinewidth; + if (this.wireframeLinecap !== "round") data.wireframeLinecap = this.wireframeLinecap; + if (this.wireframeLinejoin !== "round") data.wireframeLinejoin = this.wireframeLinejoin; + if (this.flatShading === true) data.flatShading = true; + if (this.visible === false) data.visible = false; + if (this.toneMapped === false) data.toneMapped = false; + if (this.fog === false) data.fog = false; + if (Object.keys(this.userData).length > 0) data.userData = this.userData; + function extractFromCache(cache) { + const values = []; + for (const key in cache) { + const data2 = cache[key]; + delete data2.metadata; + values.push(data2); + } + return values; + } + __name(extractFromCache, "extractFromCache"); + if (isRootObject) { + const textures = extractFromCache(meta.textures); + const images = extractFromCache(meta.images); + if (textures.length > 0) data.textures = textures; + if (images.length > 0) data.images = images; + } + return data; + } + clone() { + return new this.constructor().copy(this); + } + copy(source) { + this.name = source.name; + this.blending = source.blending; + this.side = source.side; + this.vertexColors = source.vertexColors; + this.opacity = source.opacity; + this.transparent = source.transparent; + this.blendSrc = source.blendSrc; + this.blendDst = source.blendDst; + this.blendEquation = source.blendEquation; + this.blendSrcAlpha = source.blendSrcAlpha; + this.blendDstAlpha = source.blendDstAlpha; + this.blendEquationAlpha = source.blendEquationAlpha; + this.blendColor.copy(source.blendColor); + this.blendAlpha = source.blendAlpha; + this.depthFunc = source.depthFunc; + this.depthTest = source.depthTest; + this.depthWrite = source.depthWrite; + this.stencilWriteMask = source.stencilWriteMask; + this.stencilFunc = source.stencilFunc; + this.stencilRef = source.stencilRef; + this.stencilFuncMask = source.stencilFuncMask; + this.stencilFail = source.stencilFail; + this.stencilZFail = source.stencilZFail; + this.stencilZPass = source.stencilZPass; + this.stencilWrite = source.stencilWrite; + const srcPlanes = source.clippingPlanes; + let dstPlanes = null; + if (srcPlanes !== null) { + const n = srcPlanes.length; + dstPlanes = new Array(n); + for (let i = 0; i !== n; ++i) { + dstPlanes[i] = srcPlanes[i].clone(); + } } + this.clippingPlanes = dstPlanes; + this.clipIntersection = source.clipIntersection; + this.clipShadows = source.clipShadows; + this.shadowSide = source.shadowSide; + this.colorWrite = source.colorWrite; + this.precision = source.precision; + this.polygonOffset = source.polygonOffset; + this.polygonOffsetFactor = source.polygonOffsetFactor; + this.polygonOffsetUnits = source.polygonOffsetUnits; + this.dithering = source.dithering; + this.alphaTest = source.alphaTest; + this.alphaHash = source.alphaHash; + this.alphaToCoverage = source.alphaToCoverage; + this.premultipliedAlpha = source.premultipliedAlpha; + this.forceSinglePass = source.forceSinglePass; + this.visible = source.visible; + this.toneMapped = source.toneMapped; + this.userData = JSON.parse(JSON.stringify(source.userData)); return this; } - // private method - _getHandJoint(hand, inputjoint) { - if (hand.joints[inputjoint.jointName] === void 0) { - const joint = new Group(); - joint.matrixAutoUpdate = false; - joint.visible = false; - hand.joints[inputjoint.jointName] = joint; - hand.add(joint); - } - return hand.joints[inputjoint.jointName]; + dispose() { + this.dispatchEvent({ type: "dispose" }); + } + set needsUpdate(value) { + if (value === true) this.version++; + } + onBuild() { + console.warn("Material: onBuild() has been removed."); } } -const _occlusion_vertex = ` -void main() { - - gl_Position = vec4( position, 1.0 ); - -}`; -const _occlusion_fragment = ` -uniform sampler2DArray depthColor; -uniform float depthWidth; -uniform float depthHeight; - -void main() { - - vec2 coord = vec2( gl_FragCoord.x / depthWidth, gl_FragCoord.y / depthHeight ); - - if ( coord.x >= 1.0 ) { - - gl_FragDepth = texture( depthColor, vec3( coord.x - 1.0, coord.y, 1 ) ).r; - - } else { - - gl_FragDepth = texture( depthColor, vec3( coord.x, coord.y, 0 ) ).r; - - } - -}`; -class WebXRDepthSensing { +class MeshBasicMaterial extends Material { static { - __name(this, "WebXRDepthSensing"); + __name(this, "MeshBasicMaterial"); } - constructor() { - this.texture = null; - this.mesh = null; - this.depthNear = 0; - this.depthFar = 0; + static get type() { + return "MeshBasicMaterial"; } - init(renderer, depthData, renderState) { - if (this.texture === null) { - const texture = new Texture(); - const texProps = renderer.properties.get(texture); - texProps.__webglTexture = depthData.texture; - if (depthData.depthNear != renderState.depthNear || depthData.depthFar != renderState.depthFar) { - this.depthNear = depthData.depthNear; - this.depthFar = depthData.depthFar; - } - this.texture = texture; + constructor(parameters) { + super(); + this.isMeshBasicMaterial = true; + this.color = new Color(16777215); + this.map = null; + this.lightMap = null; + this.lightMapIntensity = 1; + this.aoMap = null; + this.aoMapIntensity = 1; + this.specularMap = null; + this.alphaMap = null; + this.envMap = null; + this.envMapRotation = new Euler(); + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = "round"; + this.wireframeLinejoin = "round"; + this.fog = true; + this.setValues(parameters); + } + copy(source) { + super.copy(source); + this.color.copy(source.color); + this.map = source.map; + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + this.specularMap = source.specularMap; + this.alphaMap = source.alphaMap; + this.envMap = source.envMap; + this.envMapRotation.copy(source.envMapRotation); + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + this.fog = source.fog; + return this; + } +} +const _tables = /* @__PURE__ */ _generateTables(); +function _generateTables() { + const buffer = new ArrayBuffer(4); + const floatView = new Float32Array(buffer); + const uint32View = new Uint32Array(buffer); + const baseTable = new Uint32Array(512); + const shiftTable = new Uint32Array(512); + for (let i = 0; i < 256; ++i) { + const e = i - 127; + if (e < -27) { + baseTable[i] = 0; + baseTable[i | 256] = 32768; + shiftTable[i] = 24; + shiftTable[i | 256] = 24; + } else if (e < -14) { + baseTable[i] = 1024 >> -e - 14; + baseTable[i | 256] = 1024 >> -e - 14 | 32768; + shiftTable[i] = -e - 1; + shiftTable[i | 256] = -e - 1; + } else if (e <= 15) { + baseTable[i] = e + 15 << 10; + baseTable[i | 256] = e + 15 << 10 | 32768; + shiftTable[i] = 13; + shiftTable[i | 256] = 13; + } else if (e < 128) { + baseTable[i] = 31744; + baseTable[i | 256] = 64512; + shiftTable[i] = 24; + shiftTable[i | 256] = 24; + } else { + baseTable[i] = 31744; + baseTable[i | 256] = 64512; + shiftTable[i] = 13; + shiftTable[i | 256] = 13; } } - getMesh(cameraXR) { - if (this.texture !== null) { - if (this.mesh === null) { - const viewport = cameraXR.cameras[0].viewport; - const material = new ShaderMaterial({ - vertexShader: _occlusion_vertex, - fragmentShader: _occlusion_fragment, - uniforms: { - depthColor: { value: this.texture }, - depthWidth: { value: viewport.z }, - depthHeight: { value: viewport.w } - } - }); - this.mesh = new Mesh(new PlaneGeometry(20, 20), material); - } + const mantissaTable = new Uint32Array(2048); + const exponentTable = new Uint32Array(64); + const offsetTable = new Uint32Array(64); + for (let i = 1; i < 1024; ++i) { + let m = i << 13; + let e = 0; + while ((m & 8388608) === 0) { + m <<= 1; + e -= 8388608; } - return this.mesh; + m &= ~8388608; + e += 947912704; + mantissaTable[i] = m | e; } - reset() { - this.texture = null; - this.mesh = null; + for (let i = 1024; i < 2048; ++i) { + mantissaTable[i] = 939524096 + (i - 1024 << 13); } - getDepthTexture() { - return this.texture; + for (let i = 1; i < 31; ++i) { + exponentTable[i] = i << 23; } -} -class WebXRManager extends EventDispatcher { - static { - __name(this, "WebXRManager"); + exponentTable[31] = 1199570944; + exponentTable[32] = 2147483648; + for (let i = 33; i < 63; ++i) { + exponentTable[i] = 2147483648 + (i - 32 << 23); } - constructor(renderer, gl) { - super(); - const scope = this; - let session = null; - let framebufferScaleFactor = 1; - let referenceSpace = null; - let referenceSpaceType = "local-floor"; - let foveation = 1; - let customReferenceSpace = null; - let pose = null; - let glBinding = null; - let glProjLayer = null; - let glBaseLayer = null; - let xrFrame = null; - const depthSensing = new WebXRDepthSensing(); - const attributes = gl.getContextAttributes(); - let initialRenderTarget = null; - let newRenderTarget = null; - const controllers = []; - const controllerInputSources = []; - const currentSize = new Vector2(); - let currentPixelRatio = null; - const cameraL = new PerspectiveCamera(); - cameraL.viewport = new Vector4(); - const cameraR = new PerspectiveCamera(); - cameraR.viewport = new Vector4(); - const cameras = [cameraL, cameraR]; - const cameraXR = new ArrayCamera(); - let _currentDepthNear = null; - let _currentDepthFar = null; - this.cameraAutoUpdate = true; - this.enabled = false; - this.isPresenting = false; - this.getController = function(index) { - let controller = controllers[index]; - if (controller === void 0) { - controller = new WebXRController(); - controllers[index] = controller; - } - return controller.getTargetRaySpace(); - }; - this.getControllerGrip = function(index) { - let controller = controllers[index]; - if (controller === void 0) { - controller = new WebXRController(); - controllers[index] = controller; - } - return controller.getGripSpace(); - }; - this.getHand = function(index) { - let controller = controllers[index]; - if (controller === void 0) { - controller = new WebXRController(); - controllers[index] = controller; - } - return controller.getHandSpace(); - }; - function onSessionEvent(event) { - const controllerIndex = controllerInputSources.indexOf(event.inputSource); - if (controllerIndex === -1) { - return; - } - const controller = controllers[controllerIndex]; - if (controller !== void 0) { - controller.update(event.inputSource, event.frame, customReferenceSpace || referenceSpace); - controller.dispatchEvent({ type: event.type, data: event.inputSource }); - } - } - __name(onSessionEvent, "onSessionEvent"); - function onSessionEnd() { - session.removeEventListener("select", onSessionEvent); - session.removeEventListener("selectstart", onSessionEvent); - session.removeEventListener("selectend", onSessionEvent); - session.removeEventListener("squeeze", onSessionEvent); - session.removeEventListener("squeezestart", onSessionEvent); - session.removeEventListener("squeezeend", onSessionEvent); - session.removeEventListener("end", onSessionEnd); - session.removeEventListener("inputsourceschange", onInputSourcesChange); - for (let i = 0; i < controllers.length; i++) { - const inputSource = controllerInputSources[i]; - if (inputSource === null) continue; - controllerInputSources[i] = null; - controllers[i].disconnect(inputSource); - } - _currentDepthNear = null; - _currentDepthFar = null; - depthSensing.reset(); - renderer.setRenderTarget(initialRenderTarget); - glBaseLayer = null; - glProjLayer = null; - glBinding = null; - session = null; - newRenderTarget = null; - animation.stop(); - scope.isPresenting = false; - renderer.setPixelRatio(currentPixelRatio); - renderer.setSize(currentSize.width, currentSize.height, false); - scope.dispatchEvent({ type: "sessionend" }); - } - __name(onSessionEnd, "onSessionEnd"); - this.setFramebufferScaleFactor = function(value) { - framebufferScaleFactor = value; - if (scope.isPresenting === true) { - console.warn("THREE.WebXRManager: Cannot change framebuffer scale while presenting."); - } - }; - this.setReferenceSpaceType = function(value) { - referenceSpaceType = value; - if (scope.isPresenting === true) { - console.warn("THREE.WebXRManager: Cannot change reference space type while presenting."); - } - }; - this.getReferenceSpace = function() { - return customReferenceSpace || referenceSpace; - }; - this.setReferenceSpace = function(space) { - customReferenceSpace = space; - }; - this.getBaseLayer = function() { - return glProjLayer !== null ? glProjLayer : glBaseLayer; - }; - this.getBinding = function() { - return glBinding; - }; - this.getFrame = function() { - return xrFrame; - }; - this.getSession = function() { - return session; - }; - this.setSession = async function(value) { - session = value; - if (session !== null) { - initialRenderTarget = renderer.getRenderTarget(); - session.addEventListener("select", onSessionEvent); - session.addEventListener("selectstart", onSessionEvent); - session.addEventListener("selectend", onSessionEvent); - session.addEventListener("squeeze", onSessionEvent); - session.addEventListener("squeezestart", onSessionEvent); - session.addEventListener("squeezeend", onSessionEvent); - session.addEventListener("end", onSessionEnd); - session.addEventListener("inputsourceschange", onInputSourcesChange); - if (attributes.xrCompatible !== true) { - await gl.makeXRCompatible(); - } - currentPixelRatio = renderer.getPixelRatio(); - renderer.getSize(currentSize); - if (session.renderState.layers === void 0) { - const layerInit = { - antialias: attributes.antialias, - alpha: true, - depth: attributes.depth, - stencil: attributes.stencil, - framebufferScaleFactor - }; - glBaseLayer = new XRWebGLLayer(session, gl, layerInit); - session.updateRenderState({ baseLayer: glBaseLayer }); - renderer.setPixelRatio(1); - renderer.setSize(glBaseLayer.framebufferWidth, glBaseLayer.framebufferHeight, false); - newRenderTarget = new WebGLRenderTarget( - glBaseLayer.framebufferWidth, - glBaseLayer.framebufferHeight, - { - format: RGBAFormat, - type: UnsignedByteType, - colorSpace: renderer.outputColorSpace, - stencilBuffer: attributes.stencil - } - ); - } else { - let depthFormat = null; - let depthType = null; - let glDepthFormat = null; - if (attributes.depth) { - glDepthFormat = attributes.stencil ? gl.DEPTH24_STENCIL8 : gl.DEPTH_COMPONENT24; - depthFormat = attributes.stencil ? DepthStencilFormat : DepthFormat; - depthType = attributes.stencil ? UnsignedInt248Type : UnsignedIntType; - } - const projectionlayerInit = { - colorFormat: gl.RGBA8, - depthFormat: glDepthFormat, - scaleFactor: framebufferScaleFactor - }; - glBinding = new XRWebGLBinding(session, gl); - glProjLayer = glBinding.createProjectionLayer(projectionlayerInit); - session.updateRenderState({ layers: [glProjLayer] }); - renderer.setPixelRatio(1); - renderer.setSize(glProjLayer.textureWidth, glProjLayer.textureHeight, false); - newRenderTarget = new WebGLRenderTarget( - glProjLayer.textureWidth, - glProjLayer.textureHeight, - { - format: RGBAFormat, - type: UnsignedByteType, - depthTexture: new DepthTexture(glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, void 0, void 0, void 0, void 0, void 0, void 0, depthFormat), - stencilBuffer: attributes.stencil, - colorSpace: renderer.outputColorSpace, - samples: attributes.antialias ? 4 : 0, - resolveDepthBuffer: glProjLayer.ignoreDepthValues === false - } - ); - } - newRenderTarget.isXRRenderTarget = true; - this.setFoveation(foveation); - customReferenceSpace = null; - referenceSpace = await session.requestReferenceSpace(referenceSpaceType); - animation.setContext(session); - animation.start(); - scope.isPresenting = true; - scope.dispatchEvent({ type: "sessionstart" }); - } - }; - this.getEnvironmentBlendMode = function() { - if (session !== null) { - return session.environmentBlendMode; - } - }; - this.getDepthTexture = function() { - return depthSensing.getDepthTexture(); - }; - function onInputSourcesChange(event) { - for (let i = 0; i < event.removed.length; i++) { - const inputSource = event.removed[i]; - const index = controllerInputSources.indexOf(inputSource); - if (index >= 0) { - controllerInputSources[index] = null; - controllers[index].disconnect(inputSource); - } - } - for (let i = 0; i < event.added.length; i++) { - const inputSource = event.added[i]; - let controllerIndex = controllerInputSources.indexOf(inputSource); - if (controllerIndex === -1) { - for (let i2 = 0; i2 < controllers.length; i2++) { - if (i2 >= controllerInputSources.length) { - controllerInputSources.push(inputSource); - controllerIndex = i2; - break; - } else if (controllerInputSources[i2] === null) { - controllerInputSources[i2] = inputSource; - controllerIndex = i2; - break; - } - } - if (controllerIndex === -1) break; - } - const controller = controllers[controllerIndex]; - if (controller) { - controller.connect(inputSource); - } - } + exponentTable[63] = 3347054592; + for (let i = 1; i < 64; ++i) { + if (i !== 32) { + offsetTable[i] = 1024; } - __name(onInputSourcesChange, "onInputSourcesChange"); - const cameraLPos = new Vector3(); - const cameraRPos = new Vector3(); - function setProjectionFromUnion(camera, cameraL2, cameraR2) { - cameraLPos.setFromMatrixPosition(cameraL2.matrixWorld); - cameraRPos.setFromMatrixPosition(cameraR2.matrixWorld); - const ipd = cameraLPos.distanceTo(cameraRPos); - const projL = cameraL2.projectionMatrix.elements; - const projR = cameraR2.projectionMatrix.elements; - const near = projL[14] / (projL[10] - 1); - const far = projL[14] / (projL[10] + 1); - const topFov = (projL[9] + 1) / projL[5]; - const bottomFov = (projL[9] - 1) / projL[5]; - const leftFov = (projL[8] - 1) / projL[0]; - const rightFov = (projR[8] + 1) / projR[0]; - const left = near * leftFov; - const right = near * rightFov; - const zOffset = ipd / (-leftFov + rightFov); - const xOffset = zOffset * -leftFov; - cameraL2.matrixWorld.decompose(camera.position, camera.quaternion, camera.scale); - camera.translateX(xOffset); - camera.translateZ(zOffset); - camera.matrixWorld.compose(camera.position, camera.quaternion, camera.scale); - camera.matrixWorldInverse.copy(camera.matrixWorld).invert(); - if (projL[10] === -1) { - camera.projectionMatrix.copy(cameraL2.projectionMatrix); - camera.projectionMatrixInverse.copy(cameraL2.projectionMatrixInverse); - } else { - const near2 = near + zOffset; - const far2 = far + zOffset; - const left2 = left - xOffset; - const right2 = right + (ipd - xOffset); - const top2 = topFov * far / far2 * near2; - const bottom2 = bottomFov * far / far2 * near2; - camera.projectionMatrix.makePerspective(left2, right2, top2, bottom2, near2, far2); - camera.projectionMatrixInverse.copy(camera.projectionMatrix).invert(); - } + } + return { + floatView, + uint32View, + baseTable, + shiftTable, + mantissaTable, + exponentTable, + offsetTable + }; +} +__name(_generateTables, "_generateTables"); +function toHalfFloat(val) { + if (Math.abs(val) > 65504) console.warn("THREE.DataUtils.toHalfFloat(): Value out of range."); + val = clamp(val, -65504, 65504); + _tables.floatView[0] = val; + const f = _tables.uint32View[0]; + const e = f >> 23 & 511; + return _tables.baseTable[e] + ((f & 8388607) >> _tables.shiftTable[e]); +} +__name(toHalfFloat, "toHalfFloat"); +function fromHalfFloat(val) { + const m = val >> 10; + _tables.uint32View[0] = _tables.mantissaTable[_tables.offsetTable[m] + (val & 1023)] + _tables.exponentTable[m]; + return _tables.floatView[0]; +} +__name(fromHalfFloat, "fromHalfFloat"); +const DataUtils = { + toHalfFloat, + fromHalfFloat +}; +const _vector$9 = /* @__PURE__ */ new Vector3(); +const _vector2$1 = /* @__PURE__ */ new Vector2(); +class BufferAttribute { + static { + __name(this, "BufferAttribute"); + } + constructor(array, itemSize, normalized = false) { + if (Array.isArray(array)) { + throw new TypeError("THREE.BufferAttribute: array should be a Typed Array."); } - __name(setProjectionFromUnion, "setProjectionFromUnion"); - function updateCamera(camera, parent) { - if (parent === null) { - camera.matrixWorld.copy(camera.matrix); - } else { - camera.matrixWorld.multiplyMatrices(parent.matrixWorld, camera.matrix); - } - camera.matrixWorldInverse.copy(camera.matrixWorld).invert(); + this.isBufferAttribute = true; + this.name = ""; + this.array = array; + this.itemSize = itemSize; + this.count = array !== void 0 ? array.length / itemSize : 0; + this.normalized = normalized; + this.usage = StaticDrawUsage; + this.updateRanges = []; + this.gpuType = FloatType; + this.version = 0; + } + onUploadCallback() { + } + set needsUpdate(value) { + if (value === true) this.version++; + } + setUsage(value) { + this.usage = value; + return this; + } + addUpdateRange(start, count) { + this.updateRanges.push({ start, count }); + } + clearUpdateRanges() { + this.updateRanges.length = 0; + } + copy(source) { + this.name = source.name; + this.array = new source.array.constructor(source.array); + this.itemSize = source.itemSize; + this.count = source.count; + this.normalized = source.normalized; + this.usage = source.usage; + this.gpuType = source.gpuType; + return this; + } + copyAt(index1, attribute, index2) { + index1 *= this.itemSize; + index2 *= attribute.itemSize; + for (let i = 0, l = this.itemSize; i < l; i++) { + this.array[index1 + i] = attribute.array[index2 + i]; } - __name(updateCamera, "updateCamera"); - this.updateCamera = function(camera) { - if (session === null) return; - let depthNear = camera.near; - let depthFar = camera.far; - if (depthSensing.texture !== null) { - if (depthSensing.depthNear > 0) depthNear = depthSensing.depthNear; - if (depthSensing.depthFar > 0) depthFar = depthSensing.depthFar; - } - cameraXR.near = cameraR.near = cameraL.near = depthNear; - cameraXR.far = cameraR.far = cameraL.far = depthFar; - if (_currentDepthNear !== cameraXR.near || _currentDepthFar !== cameraXR.far) { - session.updateRenderState({ - depthNear: cameraXR.near, - depthFar: cameraXR.far - }); - _currentDepthNear = cameraXR.near; - _currentDepthFar = cameraXR.far; - } - cameraL.layers.mask = camera.layers.mask | 2; - cameraR.layers.mask = camera.layers.mask | 4; - cameraXR.layers.mask = cameraL.layers.mask | cameraR.layers.mask; - const parent = camera.parent; - const cameras2 = cameraXR.cameras; - updateCamera(cameraXR, parent); - for (let i = 0; i < cameras2.length; i++) { - updateCamera(cameras2[i], parent); - } - if (cameras2.length === 2) { - setProjectionFromUnion(cameraXR, cameraL, cameraR); - } else { - cameraXR.projectionMatrix.copy(cameraL.projectionMatrix); - } - updateUserCamera(camera, cameraXR, parent); - }; - function updateUserCamera(camera, cameraXR2, parent) { - if (parent === null) { - camera.matrix.copy(cameraXR2.matrixWorld); - } else { - camera.matrix.copy(parent.matrixWorld); - camera.matrix.invert(); - camera.matrix.multiply(cameraXR2.matrixWorld); + return this; + } + copyArray(array) { + this.array.set(array); + return this; + } + applyMatrix3(m) { + if (this.itemSize === 2) { + for (let i = 0, l = this.count; i < l; i++) { + _vector2$1.fromBufferAttribute(this, i); + _vector2$1.applyMatrix3(m); + this.setXY(i, _vector2$1.x, _vector2$1.y); } - camera.matrix.decompose(camera.position, camera.quaternion, camera.scale); - camera.updateMatrixWorld(true); - camera.projectionMatrix.copy(cameraXR2.projectionMatrix); - camera.projectionMatrixInverse.copy(cameraXR2.projectionMatrixInverse); - if (camera.isPerspectiveCamera) { - camera.fov = RAD2DEG * 2 * Math.atan(1 / camera.projectionMatrix.elements[5]); - camera.zoom = 1; + } else if (this.itemSize === 3) { + for (let i = 0, l = this.count; i < l; i++) { + _vector$9.fromBufferAttribute(this, i); + _vector$9.applyMatrix3(m); + this.setXYZ(i, _vector$9.x, _vector$9.y, _vector$9.z); } } - __name(updateUserCamera, "updateUserCamera"); - this.getCamera = function() { - return cameraXR; - }; - this.getFoveation = function() { - if (glProjLayer === null && glBaseLayer === null) { - return void 0; - } - return foveation; - }; - this.setFoveation = function(value) { - foveation = value; - if (glProjLayer !== null) { - glProjLayer.fixedFoveation = value; - } - if (glBaseLayer !== null && glBaseLayer.fixedFoveation !== void 0) { - glBaseLayer.fixedFoveation = value; - } - }; - this.hasDepthSensing = function() { - return depthSensing.texture !== null; - }; - this.getDepthSensingMesh = function() { - return depthSensing.getMesh(cameraXR); - }; - let onAnimationFrameCallback = null; - function onAnimationFrame(time, frame) { - pose = frame.getViewerPose(customReferenceSpace || referenceSpace); - xrFrame = frame; - if (pose !== null) { - const views = pose.views; - if (glBaseLayer !== null) { - renderer.setRenderTargetFramebuffer(newRenderTarget, glBaseLayer.framebuffer); - renderer.setRenderTarget(newRenderTarget); - } - let cameraXRNeedsUpdate = false; - if (views.length !== cameraXR.cameras.length) { - cameraXR.cameras.length = 0; - cameraXRNeedsUpdate = true; - } - for (let i = 0; i < views.length; i++) { - const view = views[i]; - let viewport = null; - if (glBaseLayer !== null) { - viewport = glBaseLayer.getViewport(view); - } else { - const glSubImage = glBinding.getViewSubImage(glProjLayer, view); - viewport = glSubImage.viewport; - if (i === 0) { - renderer.setRenderTargetTextures( - newRenderTarget, - glSubImage.colorTexture, - glProjLayer.ignoreDepthValues ? void 0 : glSubImage.depthStencilTexture - ); - renderer.setRenderTarget(newRenderTarget); - } - } - let camera = cameras[i]; - if (camera === void 0) { - camera = new PerspectiveCamera(); - camera.layers.enable(i); - camera.viewport = new Vector4(); - cameras[i] = camera; - } - camera.matrix.fromArray(view.transform.matrix); - camera.matrix.decompose(camera.position, camera.quaternion, camera.scale); - camera.projectionMatrix.fromArray(view.projectionMatrix); - camera.projectionMatrixInverse.copy(camera.projectionMatrix).invert(); - camera.viewport.set(viewport.x, viewport.y, viewport.width, viewport.height); - if (i === 0) { - cameraXR.matrix.copy(camera.matrix); - cameraXR.matrix.decompose(cameraXR.position, cameraXR.quaternion, cameraXR.scale); - } - if (cameraXRNeedsUpdate === true) { - cameraXR.cameras.push(camera); - } - } - const enabledFeatures = session.enabledFeatures; - if (enabledFeatures && enabledFeatures.includes("depth-sensing")) { - const depthData = glBinding.getDepthInformation(views[0]); - if (depthData && depthData.isValid && depthData.texture) { - depthSensing.init(renderer, depthData, session.renderState); - } - } - } - for (let i = 0; i < controllers.length; i++) { - const inputSource = controllerInputSources[i]; - const controller = controllers[i]; - if (inputSource !== null && controller !== void 0) { - controller.update(inputSource, frame, customReferenceSpace || referenceSpace); - } - } - if (onAnimationFrameCallback) onAnimationFrameCallback(time, frame); - if (frame.detectedPlanes) { - scope.dispatchEvent({ type: "planesdetected", data: frame }); - } - xrFrame = null; + return this; + } + applyMatrix4(m) { + for (let i = 0, l = this.count; i < l; i++) { + _vector$9.fromBufferAttribute(this, i); + _vector$9.applyMatrix4(m); + this.setXYZ(i, _vector$9.x, _vector$9.y, _vector$9.z); } - __name(onAnimationFrame, "onAnimationFrame"); - const animation = new WebGLAnimation(); - animation.setAnimationLoop(onAnimationFrame); - this.setAnimationLoop = function(callback) { - onAnimationFrameCallback = callback; - }; - this.dispose = function() { - }; + return this; } -} -const _e1 = /* @__PURE__ */ new Euler(); -const _m1 = /* @__PURE__ */ new Matrix4(); -function WebGLMaterials(renderer, properties) { - function refreshTransformUniform(map, uniform) { - if (map.matrixAutoUpdate === true) { - map.updateMatrix(); + applyNormalMatrix(m) { + for (let i = 0, l = this.count; i < l; i++) { + _vector$9.fromBufferAttribute(this, i); + _vector$9.applyNormalMatrix(m); + this.setXYZ(i, _vector$9.x, _vector$9.y, _vector$9.z); } - uniform.value.copy(map.matrix); + return this; } - __name(refreshTransformUniform, "refreshTransformUniform"); - function refreshFogUniforms(uniforms, fog) { - fog.color.getRGB(uniforms.fogColor.value, getUnlitUniformColorSpace(renderer)); - if (fog.isFog) { - uniforms.fogNear.value = fog.near; - uniforms.fogFar.value = fog.far; - } else if (fog.isFogExp2) { - uniforms.fogDensity.value = fog.density; + transformDirection(m) { + for (let i = 0, l = this.count; i < l; i++) { + _vector$9.fromBufferAttribute(this, i); + _vector$9.transformDirection(m); + this.setXYZ(i, _vector$9.x, _vector$9.y, _vector$9.z); } + return this; } - __name(refreshFogUniforms, "refreshFogUniforms"); - function refreshMaterialUniforms(uniforms, material, pixelRatio, height, transmissionRenderTarget) { - if (material.isMeshBasicMaterial) { - refreshUniformsCommon(uniforms, material); - } else if (material.isMeshLambertMaterial) { - refreshUniformsCommon(uniforms, material); - } else if (material.isMeshToonMaterial) { - refreshUniformsCommon(uniforms, material); - refreshUniformsToon(uniforms, material); - } else if (material.isMeshPhongMaterial) { - refreshUniformsCommon(uniforms, material); - refreshUniformsPhong(uniforms, material); - } else if (material.isMeshStandardMaterial) { - refreshUniformsCommon(uniforms, material); - refreshUniformsStandard(uniforms, material); - if (material.isMeshPhysicalMaterial) { - refreshUniformsPhysical(uniforms, material, transmissionRenderTarget); - } - } else if (material.isMeshMatcapMaterial) { - refreshUniformsCommon(uniforms, material); - refreshUniformsMatcap(uniforms, material); - } else if (material.isMeshDepthMaterial) { - refreshUniformsCommon(uniforms, material); - } else if (material.isMeshDistanceMaterial) { - refreshUniformsCommon(uniforms, material); - refreshUniformsDistance(uniforms, material); - } else if (material.isMeshNormalMaterial) { - refreshUniformsCommon(uniforms, material); - } else if (material.isLineBasicMaterial) { - refreshUniformsLine(uniforms, material); - if (material.isLineDashedMaterial) { - refreshUniformsDash(uniforms, material); - } - } else if (material.isPointsMaterial) { - refreshUniformsPoints(uniforms, material, pixelRatio, height); - } else if (material.isSpriteMaterial) { - refreshUniformsSprites(uniforms, material); - } else if (material.isShadowMaterial) { - uniforms.color.value.copy(material.color); - uniforms.opacity.value = material.opacity; - } else if (material.isShaderMaterial) { - material.uniformsNeedUpdate = false; + set(value, offset = 0) { + this.array.set(value, offset); + return this; + } + getComponent(index, component) { + let value = this.array[index * this.itemSize + component]; + if (this.normalized) value = denormalize(value, this.array); + return value; + } + setComponent(index, component, value) { + if (this.normalized) value = normalize(value, this.array); + this.array[index * this.itemSize + component] = value; + return this; + } + getX(index) { + let x = this.array[index * this.itemSize]; + if (this.normalized) x = denormalize(x, this.array); + return x; + } + setX(index, x) { + if (this.normalized) x = normalize(x, this.array); + this.array[index * this.itemSize] = x; + return this; + } + getY(index) { + let y = this.array[index * this.itemSize + 1]; + if (this.normalized) y = denormalize(y, this.array); + return y; + } + setY(index, y) { + if (this.normalized) y = normalize(y, this.array); + this.array[index * this.itemSize + 1] = y; + return this; + } + getZ(index) { + let z = this.array[index * this.itemSize + 2]; + if (this.normalized) z = denormalize(z, this.array); + return z; + } + setZ(index, z) { + if (this.normalized) z = normalize(z, this.array); + this.array[index * this.itemSize + 2] = z; + return this; + } + getW(index) { + let w = this.array[index * this.itemSize + 3]; + if (this.normalized) w = denormalize(w, this.array); + return w; + } + setW(index, w) { + if (this.normalized) w = normalize(w, this.array); + this.array[index * this.itemSize + 3] = w; + return this; + } + setXY(index, x, y) { + index *= this.itemSize; + if (this.normalized) { + x = normalize(x, this.array); + y = normalize(y, this.array); + } + this.array[index + 0] = x; + this.array[index + 1] = y; + return this; + } + setXYZ(index, x, y, z) { + index *= this.itemSize; + if (this.normalized) { + x = normalize(x, this.array); + y = normalize(y, this.array); + z = normalize(z, this.array); + } + this.array[index + 0] = x; + this.array[index + 1] = y; + this.array[index + 2] = z; + return this; + } + setXYZW(index, x, y, z, w) { + index *= this.itemSize; + if (this.normalized) { + x = normalize(x, this.array); + y = normalize(y, this.array); + z = normalize(z, this.array); + w = normalize(w, this.array); } + this.array[index + 0] = x; + this.array[index + 1] = y; + this.array[index + 2] = z; + this.array[index + 3] = w; + return this; + } + onUpload(callback) { + this.onUploadCallback = callback; + return this; + } + clone() { + return new this.constructor(this.array, this.itemSize).copy(this); + } + toJSON() { + const data = { + itemSize: this.itemSize, + type: this.array.constructor.name, + array: Array.from(this.array), + normalized: this.normalized + }; + if (this.name !== "") data.name = this.name; + if (this.usage !== StaticDrawUsage) data.usage = this.usage; + return data; + } +} +class Int8BufferAttribute extends BufferAttribute { + static { + __name(this, "Int8BufferAttribute"); + } + constructor(array, itemSize, normalized) { + super(new Int8Array(array), itemSize, normalized); + } +} +class Uint8BufferAttribute extends BufferAttribute { + static { + __name(this, "Uint8BufferAttribute"); + } + constructor(array, itemSize, normalized) { + super(new Uint8Array(array), itemSize, normalized); + } +} +class Uint8ClampedBufferAttribute extends BufferAttribute { + static { + __name(this, "Uint8ClampedBufferAttribute"); + } + constructor(array, itemSize, normalized) { + super(new Uint8ClampedArray(array), itemSize, normalized); + } +} +class Int16BufferAttribute extends BufferAttribute { + static { + __name(this, "Int16BufferAttribute"); + } + constructor(array, itemSize, normalized) { + super(new Int16Array(array), itemSize, normalized); + } +} +class Uint16BufferAttribute extends BufferAttribute { + static { + __name(this, "Uint16BufferAttribute"); + } + constructor(array, itemSize, normalized) { + super(new Uint16Array(array), itemSize, normalized); + } +} +class Int32BufferAttribute extends BufferAttribute { + static { + __name(this, "Int32BufferAttribute"); + } + constructor(array, itemSize, normalized) { + super(new Int32Array(array), itemSize, normalized); + } +} +class Uint32BufferAttribute extends BufferAttribute { + static { + __name(this, "Uint32BufferAttribute"); + } + constructor(array, itemSize, normalized) { + super(new Uint32Array(array), itemSize, normalized); + } +} +class Float16BufferAttribute extends BufferAttribute { + static { + __name(this, "Float16BufferAttribute"); + } + constructor(array, itemSize, normalized) { + super(new Uint16Array(array), itemSize, normalized); + this.isFloat16BufferAttribute = true; + } + getX(index) { + let x = fromHalfFloat(this.array[index * this.itemSize]); + if (this.normalized) x = denormalize(x, this.array); + return x; + } + setX(index, x) { + if (this.normalized) x = normalize(x, this.array); + this.array[index * this.itemSize] = toHalfFloat(x); + return this; + } + getY(index) { + let y = fromHalfFloat(this.array[index * this.itemSize + 1]); + if (this.normalized) y = denormalize(y, this.array); + return y; + } + setY(index, y) { + if (this.normalized) y = normalize(y, this.array); + this.array[index * this.itemSize + 1] = toHalfFloat(y); + return this; + } + getZ(index) { + let z = fromHalfFloat(this.array[index * this.itemSize + 2]); + if (this.normalized) z = denormalize(z, this.array); + return z; + } + setZ(index, z) { + if (this.normalized) z = normalize(z, this.array); + this.array[index * this.itemSize + 2] = toHalfFloat(z); + return this; + } + getW(index) { + let w = fromHalfFloat(this.array[index * this.itemSize + 3]); + if (this.normalized) w = denormalize(w, this.array); + return w; + } + setW(index, w) { + if (this.normalized) w = normalize(w, this.array); + this.array[index * this.itemSize + 3] = toHalfFloat(w); + return this; } - __name(refreshMaterialUniforms, "refreshMaterialUniforms"); - function refreshUniformsCommon(uniforms, material) { - uniforms.opacity.value = material.opacity; - if (material.color) { - uniforms.diffuse.value.copy(material.color); - } - if (material.emissive) { - uniforms.emissive.value.copy(material.emissive).multiplyScalar(material.emissiveIntensity); - } - if (material.map) { - uniforms.map.value = material.map; - refreshTransformUniform(material.map, uniforms.mapTransform); - } - if (material.alphaMap) { - uniforms.alphaMap.value = material.alphaMap; - refreshTransformUniform(material.alphaMap, uniforms.alphaMapTransform); - } - if (material.bumpMap) { - uniforms.bumpMap.value = material.bumpMap; - refreshTransformUniform(material.bumpMap, uniforms.bumpMapTransform); - uniforms.bumpScale.value = material.bumpScale; - if (material.side === BackSide) { - uniforms.bumpScale.value *= -1; - } - } - if (material.normalMap) { - uniforms.normalMap.value = material.normalMap; - refreshTransformUniform(material.normalMap, uniforms.normalMapTransform); - uniforms.normalScale.value.copy(material.normalScale); - if (material.side === BackSide) { - uniforms.normalScale.value.negate(); - } - } - if (material.displacementMap) { - uniforms.displacementMap.value = material.displacementMap; - refreshTransformUniform(material.displacementMap, uniforms.displacementMapTransform); - uniforms.displacementScale.value = material.displacementScale; - uniforms.displacementBias.value = material.displacementBias; - } - if (material.emissiveMap) { - uniforms.emissiveMap.value = material.emissiveMap; - refreshTransformUniform(material.emissiveMap, uniforms.emissiveMapTransform); - } - if (material.specularMap) { - uniforms.specularMap.value = material.specularMap; - refreshTransformUniform(material.specularMap, uniforms.specularMapTransform); - } - if (material.alphaTest > 0) { - uniforms.alphaTest.value = material.alphaTest; - } - const materialProperties = properties.get(material); - const envMap = materialProperties.envMap; - const envMapRotation = materialProperties.envMapRotation; - if (envMap) { - uniforms.envMap.value = envMap; - _e1.copy(envMapRotation); - _e1.x *= -1; - _e1.y *= -1; - _e1.z *= -1; - if (envMap.isCubeTexture && envMap.isRenderTargetTexture === false) { - _e1.y *= -1; - _e1.z *= -1; - } - uniforms.envMapRotation.value.setFromMatrix4(_m1.makeRotationFromEuler(_e1)); - uniforms.flipEnvMap.value = envMap.isCubeTexture && envMap.isRenderTargetTexture === false ? -1 : 1; - uniforms.reflectivity.value = material.reflectivity; - uniforms.ior.value = material.ior; - uniforms.refractionRatio.value = material.refractionRatio; - } - if (material.lightMap) { - uniforms.lightMap.value = material.lightMap; - uniforms.lightMapIntensity.value = material.lightMapIntensity; - refreshTransformUniform(material.lightMap, uniforms.lightMapTransform); + setXY(index, x, y) { + index *= this.itemSize; + if (this.normalized) { + x = normalize(x, this.array); + y = normalize(y, this.array); } - if (material.aoMap) { - uniforms.aoMap.value = material.aoMap; - uniforms.aoMapIntensity.value = material.aoMapIntensity; - refreshTransformUniform(material.aoMap, uniforms.aoMapTransform); + this.array[index + 0] = toHalfFloat(x); + this.array[index + 1] = toHalfFloat(y); + return this; + } + setXYZ(index, x, y, z) { + index *= this.itemSize; + if (this.normalized) { + x = normalize(x, this.array); + y = normalize(y, this.array); + z = normalize(z, this.array); } + this.array[index + 0] = toHalfFloat(x); + this.array[index + 1] = toHalfFloat(y); + this.array[index + 2] = toHalfFloat(z); + return this; } - __name(refreshUniformsCommon, "refreshUniformsCommon"); - function refreshUniformsLine(uniforms, material) { - uniforms.diffuse.value.copy(material.color); - uniforms.opacity.value = material.opacity; - if (material.map) { - uniforms.map.value = material.map; - refreshTransformUniform(material.map, uniforms.mapTransform); + setXYZW(index, x, y, z, w) { + index *= this.itemSize; + if (this.normalized) { + x = normalize(x, this.array); + y = normalize(y, this.array); + z = normalize(z, this.array); + w = normalize(w, this.array); } + this.array[index + 0] = toHalfFloat(x); + this.array[index + 1] = toHalfFloat(y); + this.array[index + 2] = toHalfFloat(z); + this.array[index + 3] = toHalfFloat(w); + return this; } - __name(refreshUniformsLine, "refreshUniformsLine"); - function refreshUniformsDash(uniforms, material) { - uniforms.dashSize.value = material.dashSize; - uniforms.totalSize.value = material.dashSize + material.gapSize; - uniforms.scale.value = material.scale; +} +class Float32BufferAttribute extends BufferAttribute { + static { + __name(this, "Float32BufferAttribute"); } - __name(refreshUniformsDash, "refreshUniformsDash"); - function refreshUniformsPoints(uniforms, material, pixelRatio, height) { - uniforms.diffuse.value.copy(material.color); - uniforms.opacity.value = material.opacity; - uniforms.size.value = material.size * pixelRatio; - uniforms.scale.value = height * 0.5; - if (material.map) { - uniforms.map.value = material.map; - refreshTransformUniform(material.map, uniforms.uvTransform); - } - if (material.alphaMap) { - uniforms.alphaMap.value = material.alphaMap; - refreshTransformUniform(material.alphaMap, uniforms.alphaMapTransform); - } - if (material.alphaTest > 0) { - uniforms.alphaTest.value = material.alphaTest; - } + constructor(array, itemSize, normalized) { + super(new Float32Array(array), itemSize, normalized); } - __name(refreshUniformsPoints, "refreshUniformsPoints"); - function refreshUniformsSprites(uniforms, material) { - uniforms.diffuse.value.copy(material.color); - uniforms.opacity.value = material.opacity; - uniforms.rotation.value = material.rotation; - if (material.map) { - uniforms.map.value = material.map; - refreshTransformUniform(material.map, uniforms.mapTransform); - } - if (material.alphaMap) { - uniforms.alphaMap.value = material.alphaMap; - refreshTransformUniform(material.alphaMap, uniforms.alphaMapTransform); - } - if (material.alphaTest > 0) { - uniforms.alphaTest.value = material.alphaTest; - } +} +let _id$2 = 0; +const _m1$2 = /* @__PURE__ */ new Matrix4(); +const _obj = /* @__PURE__ */ new Object3D(); +const _offset = /* @__PURE__ */ new Vector3(); +const _box$2 = /* @__PURE__ */ new Box3(); +const _boxMorphTargets = /* @__PURE__ */ new Box3(); +const _vector$8 = /* @__PURE__ */ new Vector3(); +class BufferGeometry extends EventDispatcher { + static { + __name(this, "BufferGeometry"); } - __name(refreshUniformsSprites, "refreshUniformsSprites"); - function refreshUniformsPhong(uniforms, material) { - uniforms.specular.value.copy(material.specular); - uniforms.shininess.value = Math.max(material.shininess, 1e-4); + constructor() { + super(); + this.isBufferGeometry = true; + Object.defineProperty(this, "id", { value: _id$2++ }); + this.uuid = generateUUID(); + this.name = ""; + this.type = "BufferGeometry"; + this.index = null; + this.indirect = null; + this.attributes = {}; + this.morphAttributes = {}; + this.morphTargetsRelative = false; + this.groups = []; + this.boundingBox = null; + this.boundingSphere = null; + this.drawRange = { start: 0, count: Infinity }; + this.userData = {}; } - __name(refreshUniformsPhong, "refreshUniformsPhong"); - function refreshUniformsToon(uniforms, material) { - if (material.gradientMap) { - uniforms.gradientMap.value = material.gradientMap; - } + getIndex() { + return this.index; } - __name(refreshUniformsToon, "refreshUniformsToon"); - function refreshUniformsStandard(uniforms, material) { - uniforms.metalness.value = material.metalness; - if (material.metalnessMap) { - uniforms.metalnessMap.value = material.metalnessMap; - refreshTransformUniform(material.metalnessMap, uniforms.metalnessMapTransform); - } - uniforms.roughness.value = material.roughness; - if (material.roughnessMap) { - uniforms.roughnessMap.value = material.roughnessMap; - refreshTransformUniform(material.roughnessMap, uniforms.roughnessMapTransform); - } - if (material.envMap) { - uniforms.envMapIntensity.value = material.envMapIntensity; + setIndex(index) { + if (Array.isArray(index)) { + this.index = new (arrayNeedsUint32(index) ? Uint32BufferAttribute : Uint16BufferAttribute)(index, 1); + } else { + this.index = index; } + return this; } - __name(refreshUniformsStandard, "refreshUniformsStandard"); - function refreshUniformsPhysical(uniforms, material, transmissionRenderTarget) { - uniforms.ior.value = material.ior; - if (material.sheen > 0) { - uniforms.sheenColor.value.copy(material.sheenColor).multiplyScalar(material.sheen); - uniforms.sheenRoughness.value = material.sheenRoughness; - if (material.sheenColorMap) { - uniforms.sheenColorMap.value = material.sheenColorMap; - refreshTransformUniform(material.sheenColorMap, uniforms.sheenColorMapTransform); - } - if (material.sheenRoughnessMap) { - uniforms.sheenRoughnessMap.value = material.sheenRoughnessMap; - refreshTransformUniform(material.sheenRoughnessMap, uniforms.sheenRoughnessMapTransform); - } - } - if (material.clearcoat > 0) { - uniforms.clearcoat.value = material.clearcoat; - uniforms.clearcoatRoughness.value = material.clearcoatRoughness; - if (material.clearcoatMap) { - uniforms.clearcoatMap.value = material.clearcoatMap; - refreshTransformUniform(material.clearcoatMap, uniforms.clearcoatMapTransform); - } - if (material.clearcoatRoughnessMap) { - uniforms.clearcoatRoughnessMap.value = material.clearcoatRoughnessMap; - refreshTransformUniform(material.clearcoatRoughnessMap, uniforms.clearcoatRoughnessMapTransform); - } - if (material.clearcoatNormalMap) { - uniforms.clearcoatNormalMap.value = material.clearcoatNormalMap; - refreshTransformUniform(material.clearcoatNormalMap, uniforms.clearcoatNormalMapTransform); - uniforms.clearcoatNormalScale.value.copy(material.clearcoatNormalScale); - if (material.side === BackSide) { - uniforms.clearcoatNormalScale.value.negate(); - } - } - } - if (material.dispersion > 0) { - uniforms.dispersion.value = material.dispersion; - } - if (material.iridescence > 0) { - uniforms.iridescence.value = material.iridescence; - uniforms.iridescenceIOR.value = material.iridescenceIOR; - uniforms.iridescenceThicknessMinimum.value = material.iridescenceThicknessRange[0]; - uniforms.iridescenceThicknessMaximum.value = material.iridescenceThicknessRange[1]; - if (material.iridescenceMap) { - uniforms.iridescenceMap.value = material.iridescenceMap; - refreshTransformUniform(material.iridescenceMap, uniforms.iridescenceMapTransform); - } - if (material.iridescenceThicknessMap) { - uniforms.iridescenceThicknessMap.value = material.iridescenceThicknessMap; - refreshTransformUniform(material.iridescenceThicknessMap, uniforms.iridescenceThicknessMapTransform); - } + setIndirect(indirect) { + this.indirect = indirect; + return this; + } + getIndirect() { + return this.indirect; + } + getAttribute(name) { + return this.attributes[name]; + } + setAttribute(name, attribute) { + this.attributes[name] = attribute; + return this; + } + deleteAttribute(name) { + delete this.attributes[name]; + return this; + } + hasAttribute(name) { + return this.attributes[name] !== void 0; + } + addGroup(start, count, materialIndex = 0) { + this.groups.push({ + start, + count, + materialIndex + }); + } + clearGroups() { + this.groups = []; + } + setDrawRange(start, count) { + this.drawRange.start = start; + this.drawRange.count = count; + } + applyMatrix4(matrix) { + const position = this.attributes.position; + if (position !== void 0) { + position.applyMatrix4(matrix); + position.needsUpdate = true; } - if (material.transmission > 0) { - uniforms.transmission.value = material.transmission; - uniforms.transmissionSamplerMap.value = transmissionRenderTarget.texture; - uniforms.transmissionSamplerSize.value.set(transmissionRenderTarget.width, transmissionRenderTarget.height); - if (material.transmissionMap) { - uniforms.transmissionMap.value = material.transmissionMap; - refreshTransformUniform(material.transmissionMap, uniforms.transmissionMapTransform); - } - uniforms.thickness.value = material.thickness; - if (material.thicknessMap) { - uniforms.thicknessMap.value = material.thicknessMap; - refreshTransformUniform(material.thicknessMap, uniforms.thicknessMapTransform); - } - uniforms.attenuationDistance.value = material.attenuationDistance; - uniforms.attenuationColor.value.copy(material.attenuationColor); + const normal = this.attributes.normal; + if (normal !== void 0) { + const normalMatrix = new Matrix3().getNormalMatrix(matrix); + normal.applyNormalMatrix(normalMatrix); + normal.needsUpdate = true; } - if (material.anisotropy > 0) { - uniforms.anisotropyVector.value.set(material.anisotropy * Math.cos(material.anisotropyRotation), material.anisotropy * Math.sin(material.anisotropyRotation)); - if (material.anisotropyMap) { - uniforms.anisotropyMap.value = material.anisotropyMap; - refreshTransformUniform(material.anisotropyMap, uniforms.anisotropyMapTransform); - } + const tangent = this.attributes.tangent; + if (tangent !== void 0) { + tangent.transformDirection(matrix); + tangent.needsUpdate = true; } - uniforms.specularIntensity.value = material.specularIntensity; - uniforms.specularColor.value.copy(material.specularColor); - if (material.specularColorMap) { - uniforms.specularColorMap.value = material.specularColorMap; - refreshTransformUniform(material.specularColorMap, uniforms.specularColorMapTransform); + if (this.boundingBox !== null) { + this.computeBoundingBox(); } - if (material.specularIntensityMap) { - uniforms.specularIntensityMap.value = material.specularIntensityMap; - refreshTransformUniform(material.specularIntensityMap, uniforms.specularIntensityMapTransform); + if (this.boundingSphere !== null) { + this.computeBoundingSphere(); } + return this; } - __name(refreshUniformsPhysical, "refreshUniformsPhysical"); - function refreshUniformsMatcap(uniforms, material) { - if (material.matcap) { - uniforms.matcap.value = material.matcap; - } + applyQuaternion(q) { + _m1$2.makeRotationFromQuaternion(q); + this.applyMatrix4(_m1$2); + return this; } - __name(refreshUniformsMatcap, "refreshUniformsMatcap"); - function refreshUniformsDistance(uniforms, material) { - const light = properties.get(material).light; - uniforms.referencePosition.value.setFromMatrixPosition(light.matrixWorld); - uniforms.nearDistance.value = light.shadow.camera.near; - uniforms.farDistance.value = light.shadow.camera.far; + rotateX(angle) { + _m1$2.makeRotationX(angle); + this.applyMatrix4(_m1$2); + return this; } - __name(refreshUniformsDistance, "refreshUniformsDistance"); - return { - refreshFogUniforms, - refreshMaterialUniforms - }; -} -__name(WebGLMaterials, "WebGLMaterials"); -function WebGLUniformsGroups(gl, info, capabilities, state) { - let buffers = {}; - let updateList = {}; - let allocatedBindingPoints = []; - const maxBindingPoints = gl.getParameter(gl.MAX_UNIFORM_BUFFER_BINDINGS); - function bind(uniformsGroup, program) { - const webglProgram = program.program; - state.uniformBlockBinding(uniformsGroup, webglProgram); + rotateY(angle) { + _m1$2.makeRotationY(angle); + this.applyMatrix4(_m1$2); + return this; } - __name(bind, "bind"); - function update(uniformsGroup, program) { - let buffer = buffers[uniformsGroup.id]; - if (buffer === void 0) { - prepareUniformsGroup(uniformsGroup); - buffer = createBuffer(uniformsGroup); - buffers[uniformsGroup.id] = buffer; - uniformsGroup.addEventListener("dispose", onUniformsGroupsDispose); - } - const webglProgram = program.program; - state.updateUBOMapping(uniformsGroup, webglProgram); - const frame = info.render.frame; - if (updateList[uniformsGroup.id] !== frame) { - updateBufferData(uniformsGroup); - updateList[uniformsGroup.id] = frame; - } + rotateZ(angle) { + _m1$2.makeRotationZ(angle); + this.applyMatrix4(_m1$2); + return this; } - __name(update, "update"); - function createBuffer(uniformsGroup) { - const bindingPointIndex = allocateBindingPointIndex(); - uniformsGroup.__bindingPointIndex = bindingPointIndex; - const buffer = gl.createBuffer(); - const size = uniformsGroup.__size; - const usage = uniformsGroup.usage; - gl.bindBuffer(gl.UNIFORM_BUFFER, buffer); - gl.bufferData(gl.UNIFORM_BUFFER, size, usage); - gl.bindBuffer(gl.UNIFORM_BUFFER, null); - gl.bindBufferBase(gl.UNIFORM_BUFFER, bindingPointIndex, buffer); - return buffer; + translate(x, y, z) { + _m1$2.makeTranslation(x, y, z); + this.applyMatrix4(_m1$2); + return this; } - __name(createBuffer, "createBuffer"); - function allocateBindingPointIndex() { - for (let i = 0; i < maxBindingPoints; i++) { - if (allocatedBindingPoints.indexOf(i) === -1) { - allocatedBindingPoints.push(i); - return i; - } - } - console.error("THREE.WebGLRenderer: Maximum number of simultaneously usable uniforms groups reached."); - return 0; + scale(x, y, z) { + _m1$2.makeScale(x, y, z); + this.applyMatrix4(_m1$2); + return this; } - __name(allocateBindingPointIndex, "allocateBindingPointIndex"); - function updateBufferData(uniformsGroup) { - const buffer = buffers[uniformsGroup.id]; - const uniforms = uniformsGroup.uniforms; - const cache = uniformsGroup.__cache; - gl.bindBuffer(gl.UNIFORM_BUFFER, buffer); - for (let i = 0, il = uniforms.length; i < il; i++) { - const uniformArray = Array.isArray(uniforms[i]) ? uniforms[i] : [uniforms[i]]; - for (let j = 0, jl = uniformArray.length; j < jl; j++) { - const uniform = uniformArray[j]; - if (hasUniformChanged(uniform, i, j, cache) === true) { - const offset = uniform.__offset; - const values = Array.isArray(uniform.value) ? uniform.value : [uniform.value]; - let arrayOffset = 0; - for (let k = 0; k < values.length; k++) { - const value = values[k]; - const info2 = getUniformSize(value); - if (typeof value === "number" || typeof value === "boolean") { - uniform.__data[0] = value; - gl.bufferSubData(gl.UNIFORM_BUFFER, offset + arrayOffset, uniform.__data); - } else if (value.isMatrix3) { - uniform.__data[0] = value.elements[0]; - uniform.__data[1] = value.elements[1]; - uniform.__data[2] = value.elements[2]; - uniform.__data[3] = 0; - uniform.__data[4] = value.elements[3]; - uniform.__data[5] = value.elements[4]; - uniform.__data[6] = value.elements[5]; - uniform.__data[7] = 0; - uniform.__data[8] = value.elements[6]; - uniform.__data[9] = value.elements[7]; - uniform.__data[10] = value.elements[8]; - uniform.__data[11] = 0; - } else { - value.toArray(uniform.__data, arrayOffset); - arrayOffset += info2.storage / Float32Array.BYTES_PER_ELEMENT; - } - } - gl.bufferSubData(gl.UNIFORM_BUFFER, offset, uniform.__data); - } - } - } - gl.bindBuffer(gl.UNIFORM_BUFFER, null); + lookAt(vector) { + _obj.lookAt(vector); + _obj.updateMatrix(); + this.applyMatrix4(_obj.matrix); + return this; } - __name(updateBufferData, "updateBufferData"); - function hasUniformChanged(uniform, index, indexArray, cache) { - const value = uniform.value; - const indexString = index + "_" + indexArray; - if (cache[indexString] === void 0) { - if (typeof value === "number" || typeof value === "boolean") { - cache[indexString] = value; - } else { - cache[indexString] = value.clone(); + center() { + this.computeBoundingBox(); + this.boundingBox.getCenter(_offset).negate(); + this.translate(_offset.x, _offset.y, _offset.z); + return this; + } + setFromPoints(points) { + const positionAttribute = this.getAttribute("position"); + if (positionAttribute === void 0) { + const position = []; + for (let i = 0, l = points.length; i < l; i++) { + const point = points[i]; + position.push(point.x, point.y, point.z || 0); } - return true; + this.setAttribute("position", new Float32BufferAttribute(position, 3)); } else { - const cachedObject = cache[indexString]; - if (typeof value === "number" || typeof value === "boolean") { - if (cachedObject !== value) { - cache[indexString] = value; - return true; - } - } else { - if (cachedObject.equals(value) === false) { - cachedObject.copy(value); - return true; - } + for (let i = 0, l = positionAttribute.count; i < l; i++) { + const point = points[i]; + positionAttribute.setXYZ(i, point.x, point.y, point.z || 0); } - } - return false; - } - __name(hasUniformChanged, "hasUniformChanged"); - function prepareUniformsGroup(uniformsGroup) { - const uniforms = uniformsGroup.uniforms; - let offset = 0; - const chunkSize = 16; - for (let i = 0, l = uniforms.length; i < l; i++) { - const uniformArray = Array.isArray(uniforms[i]) ? uniforms[i] : [uniforms[i]]; - for (let j = 0, jl = uniformArray.length; j < jl; j++) { - const uniform = uniformArray[j]; - const values = Array.isArray(uniform.value) ? uniform.value : [uniform.value]; - for (let k = 0, kl = values.length; k < kl; k++) { - const value = values[k]; - const info2 = getUniformSize(value); - const chunkOffset2 = offset % chunkSize; - const chunkPadding = chunkOffset2 % info2.boundary; - const chunkStart = chunkOffset2 + chunkPadding; - offset += chunkPadding; - if (chunkStart !== 0 && chunkSize - chunkStart < info2.storage) { - offset += chunkSize - chunkStart; - } - uniform.__data = new Float32Array(info2.storage / Float32Array.BYTES_PER_ELEMENT); - uniform.__offset = offset; - offset += info2.storage; - } + if (points.length > positionAttribute.count) { + console.warn("THREE.BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry."); } + positionAttribute.needsUpdate = true; } - const chunkOffset = offset % chunkSize; - if (chunkOffset > 0) offset += chunkSize - chunkOffset; - uniformsGroup.__size = offset; - uniformsGroup.__cache = {}; return this; } - __name(prepareUniformsGroup, "prepareUniformsGroup"); - function getUniformSize(value) { - const info2 = { - boundary: 0, - // bytes - storage: 0 - // bytes - }; - if (typeof value === "number" || typeof value === "boolean") { - info2.boundary = 4; - info2.storage = 4; - } else if (value.isVector2) { - info2.boundary = 8; - info2.storage = 8; - } else if (value.isVector3 || value.isColor) { - info2.boundary = 16; - info2.storage = 12; - } else if (value.isVector4) { - info2.boundary = 16; - info2.storage = 16; - } else if (value.isMatrix3) { - info2.boundary = 48; - info2.storage = 48; - } else if (value.isMatrix4) { - info2.boundary = 64; - info2.storage = 64; - } else if (value.isTexture) { - console.warn("THREE.WebGLRenderer: Texture samplers can not be part of an uniforms group."); - } else { - console.warn("THREE.WebGLRenderer: Unsupported uniform value type.", value); + computeBoundingBox() { + if (this.boundingBox === null) { + this.boundingBox = new Box3(); } - return info2; - } - __name(getUniformSize, "getUniformSize"); - function onUniformsGroupsDispose(event) { - const uniformsGroup = event.target; - uniformsGroup.removeEventListener("dispose", onUniformsGroupsDispose); - const index = allocatedBindingPoints.indexOf(uniformsGroup.__bindingPointIndex); - allocatedBindingPoints.splice(index, 1); - gl.deleteBuffer(buffers[uniformsGroup.id]); - delete buffers[uniformsGroup.id]; - delete updateList[uniformsGroup.id]; - } - __name(onUniformsGroupsDispose, "onUniformsGroupsDispose"); - function dispose() { - for (const id2 in buffers) { - gl.deleteBuffer(buffers[id2]); + const position = this.attributes.position; + const morphAttributesPosition = this.morphAttributes.position; + if (position && position.isGLBufferAttribute) { + console.error("THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.", this); + this.boundingBox.set( + new Vector3(-Infinity, -Infinity, -Infinity), + new Vector3(Infinity, Infinity, Infinity) + ); + return; } - allocatedBindingPoints = []; - buffers = {}; - updateList = {}; - } - __name(dispose, "dispose"); - return { - bind, - update, - dispose - }; -} -__name(WebGLUniformsGroups, "WebGLUniformsGroups"); -class WebGLRenderer { - static { - __name(this, "WebGLRenderer"); - } - constructor(parameters = {}) { - const { - canvas = createCanvasElement(), - context = null, - depth = true, - stencil = false, - alpha = false, - antialias = false, - premultipliedAlpha = true, - preserveDrawingBuffer = false, - powerPreference = "default", - failIfMajorPerformanceCaveat = false, - reverseDepthBuffer = false - } = parameters; - this.isWebGLRenderer = true; - let _alpha; - if (context !== null) { - if (typeof WebGLRenderingContext !== "undefined" && context instanceof WebGLRenderingContext) { - throw new Error("THREE.WebGLRenderer: WebGL 1 is not supported since r163."); + if (position !== void 0) { + this.boundingBox.setFromBufferAttribute(position); + if (morphAttributesPosition) { + for (let i = 0, il = morphAttributesPosition.length; i < il; i++) { + const morphAttribute = morphAttributesPosition[i]; + _box$2.setFromBufferAttribute(morphAttribute); + if (this.morphTargetsRelative) { + _vector$8.addVectors(this.boundingBox.min, _box$2.min); + this.boundingBox.expandByPoint(_vector$8); + _vector$8.addVectors(this.boundingBox.max, _box$2.max); + this.boundingBox.expandByPoint(_vector$8); + } else { + this.boundingBox.expandByPoint(_box$2.min); + this.boundingBox.expandByPoint(_box$2.max); + } + } } - _alpha = context.getContextAttributes().alpha; } else { - _alpha = alpha; + this.boundingBox.makeEmpty(); } - const uintClearColor = new Uint32Array(4); - const intClearColor = new Int32Array(4); - let currentRenderList = null; - let currentRenderState = null; - const renderListStack = []; - const renderStateStack = []; - this.domElement = canvas; - this.debug = { - /** - * Enables error checking and reporting when shader programs are being compiled - * @type {boolean} - */ - checkShaderErrors: true, - /** - * Callback for custom error reporting. - * @type {?Function} - */ - onShaderError: null - }; - this.autoClear = true; - this.autoClearColor = true; - this.autoClearDepth = true; - this.autoClearStencil = true; - this.sortObjects = true; - this.clippingPlanes = []; - this.localClippingEnabled = false; - this._outputColorSpace = SRGBColorSpace; - this.toneMapping = NoToneMapping; - this.toneMappingExposure = 1; - const _this = this; - let _isContextLost = false; - let _currentActiveCubeFace = 0; - let _currentActiveMipmapLevel = 0; - let _currentRenderTarget = null; - let _currentMaterialId = -1; - let _currentCamera = null; - const _currentViewport = new Vector4(); - const _currentScissor = new Vector4(); - let _currentScissorTest = null; - const _currentClearColor = new Color(0); - let _currentClearAlpha = 0; - let _width = canvas.width; - let _height = canvas.height; - let _pixelRatio = 1; - let _opaqueSort = null; - let _transparentSort = null; - const _viewport = new Vector4(0, 0, _width, _height); - const _scissor = new Vector4(0, 0, _width, _height); - let _scissorTest = false; - const _frustum2 = new Frustum(); - let _clippingEnabled = false; - let _localClippingEnabled = false; - const _currentProjectionMatrix = new Matrix4(); - const _projScreenMatrix2 = new Matrix4(); - const _vector32 = new Vector3(); - const _vector4 = new Vector4(); - const _emptyScene = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: true }; - let _renderBackground = false; - function getTargetPixelRatio() { - return _currentRenderTarget === null ? _pixelRatio : 1; + if (isNaN(this.boundingBox.min.x) || isNaN(this.boundingBox.min.y) || isNaN(this.boundingBox.min.z)) { + console.error('THREE.BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The "position" attribute is likely to have NaN values.', this); } - __name(getTargetPixelRatio, "getTargetPixelRatio"); - let _gl = context; - function getContext(contextName, contextAttributes) { - return canvas.getContext(contextName, contextAttributes); + } + computeBoundingSphere() { + if (this.boundingSphere === null) { + this.boundingSphere = new Sphere(); } - __name(getContext, "getContext"); - try { - const contextAttributes = { - alpha: true, - depth, - stencil, - antialias, - premultipliedAlpha, - preserveDrawingBuffer, - powerPreference, - failIfMajorPerformanceCaveat - }; - if ("setAttribute" in canvas) canvas.setAttribute("data-engine", `three.js r${REVISION}`); - canvas.addEventListener("webglcontextlost", onContextLost, false); - canvas.addEventListener("webglcontextrestored", onContextRestore, false); - canvas.addEventListener("webglcontextcreationerror", onContextCreationError, false); - if (_gl === null) { - const contextName = "webgl2"; - _gl = getContext(contextName, contextAttributes); - if (_gl === null) { - if (getContext(contextName)) { - throw new Error("Error creating WebGL context with your selected attributes."); + const position = this.attributes.position; + const morphAttributesPosition = this.morphAttributes.position; + if (position && position.isGLBufferAttribute) { + console.error("THREE.BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere.", this); + this.boundingSphere.set(new Vector3(), Infinity); + return; + } + if (position) { + const center = this.boundingSphere.center; + _box$2.setFromBufferAttribute(position); + if (morphAttributesPosition) { + for (let i = 0, il = morphAttributesPosition.length; i < il; i++) { + const morphAttribute = morphAttributesPosition[i]; + _boxMorphTargets.setFromBufferAttribute(morphAttribute); + if (this.morphTargetsRelative) { + _vector$8.addVectors(_box$2.min, _boxMorphTargets.min); + _box$2.expandByPoint(_vector$8); + _vector$8.addVectors(_box$2.max, _boxMorphTargets.max); + _box$2.expandByPoint(_vector$8); } else { - throw new Error("Error creating WebGL context."); + _box$2.expandByPoint(_boxMorphTargets.min); + _box$2.expandByPoint(_boxMorphTargets.max); } } } - } catch (error) { - console.error("THREE.WebGLRenderer: " + error.message); - throw error; - } - let extensions, capabilities, state, info; - let properties, textures, cubemaps, cubeuvmaps, attributes, geometries, objects; - let programCache, materials, renderLists, renderStates, clipping, shadowMap; - let background, morphtargets, bufferRenderer, indexedBufferRenderer; - let utils, bindingStates, uniformsGroups; - function initGLContext() { - extensions = new WebGLExtensions(_gl); - extensions.init(); - utils = new WebGLUtils(_gl, extensions); - capabilities = new WebGLCapabilities(_gl, extensions, parameters, utils); - state = new WebGLState(_gl, extensions); - if (capabilities.reverseDepthBuffer && reverseDepthBuffer) { - state.buffers.depth.setReversed(true); + _box$2.getCenter(center); + let maxRadiusSq = 0; + for (let i = 0, il = position.count; i < il; i++) { + _vector$8.fromBufferAttribute(position, i); + maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(_vector$8)); } - info = new WebGLInfo(_gl); - properties = new WebGLProperties(); - textures = new WebGLTextures(_gl, extensions, state, properties, capabilities, utils, info); - cubemaps = new WebGLCubeMaps(_this); - cubeuvmaps = new WebGLCubeUVMaps(_this); - attributes = new WebGLAttributes(_gl); - bindingStates = new WebGLBindingStates(_gl, attributes); - geometries = new WebGLGeometries(_gl, attributes, info, bindingStates); - objects = new WebGLObjects(_gl, geometries, attributes, info); - morphtargets = new WebGLMorphtargets(_gl, capabilities, textures); - clipping = new WebGLClipping(properties); - programCache = new WebGLPrograms(_this, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping); - materials = new WebGLMaterials(_this, properties); - renderLists = new WebGLRenderLists(); - renderStates = new WebGLRenderStates(extensions); - background = new WebGLBackground(_this, cubemaps, cubeuvmaps, state, objects, _alpha, premultipliedAlpha); - shadowMap = new WebGLShadowMap(_this, objects, capabilities); - uniformsGroups = new WebGLUniformsGroups(_gl, info, capabilities, state); - bufferRenderer = new WebGLBufferRenderer(_gl, extensions, info); - indexedBufferRenderer = new WebGLIndexedBufferRenderer(_gl, extensions, info); - info.programs = programCache.programs; - _this.capabilities = capabilities; - _this.extensions = extensions; - _this.properties = properties; - _this.renderLists = renderLists; - _this.shadowMap = shadowMap; - _this.state = state; - _this.info = info; - } - __name(initGLContext, "initGLContext"); - initGLContext(); - const xr = new WebXRManager(_this, _gl); - this.xr = xr; - this.getContext = function() { - return _gl; - }; - this.getContextAttributes = function() { - return _gl.getContextAttributes(); - }; - this.forceContextLoss = function() { - const extension = extensions.get("WEBGL_lose_context"); - if (extension) extension.loseContext(); - }; - this.forceContextRestore = function() { - const extension = extensions.get("WEBGL_lose_context"); - if (extension) extension.restoreContext(); - }; - this.getPixelRatio = function() { - return _pixelRatio; - }; - this.setPixelRatio = function(value) { - if (value === void 0) return; - _pixelRatio = value; - this.setSize(_width, _height, false); - }; - this.getSize = function(target) { - return target.set(_width, _height); - }; - this.setSize = function(width, height, updateStyle = true) { - if (xr.isPresenting) { - console.warn("THREE.WebGLRenderer: Can't change size while VR device is presenting."); - return; + if (morphAttributesPosition) { + for (let i = 0, il = morphAttributesPosition.length; i < il; i++) { + const morphAttribute = morphAttributesPosition[i]; + const morphTargetsRelative = this.morphTargetsRelative; + for (let j = 0, jl = morphAttribute.count; j < jl; j++) { + _vector$8.fromBufferAttribute(morphAttribute, j); + if (morphTargetsRelative) { + _offset.fromBufferAttribute(position, j); + _vector$8.add(_offset); + } + maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(_vector$8)); + } + } } - _width = width; - _height = height; - canvas.width = Math.floor(width * _pixelRatio); - canvas.height = Math.floor(height * _pixelRatio); - if (updateStyle === true) { - canvas.style.width = width + "px"; - canvas.style.height = height + "px"; + this.boundingSphere.radius = Math.sqrt(maxRadiusSq); + if (isNaN(this.boundingSphere.radius)) { + console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', this); } - this.setViewport(0, 0, width, height); - }; - this.getDrawingBufferSize = function(target) { - return target.set(_width * _pixelRatio, _height * _pixelRatio).floor(); - }; - this.setDrawingBufferSize = function(width, height, pixelRatio) { - _width = width; - _height = height; - _pixelRatio = pixelRatio; - canvas.width = Math.floor(width * pixelRatio); - canvas.height = Math.floor(height * pixelRatio); - this.setViewport(0, 0, width, height); - }; - this.getCurrentViewport = function(target) { - return target.copy(_currentViewport); - }; - this.getViewport = function(target) { - return target.copy(_viewport); - }; - this.setViewport = function(x, y, width, height) { - if (x.isVector4) { - _viewport.set(x.x, x.y, x.z, x.w); - } else { - _viewport.set(x, y, width, height); + } + } + computeTangents() { + const index = this.index; + const attributes = this.attributes; + if (index === null || attributes.position === void 0 || attributes.normal === void 0 || attributes.uv === void 0) { + console.error("THREE.BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)"); + return; + } + const positionAttribute = attributes.position; + const normalAttribute = attributes.normal; + const uvAttribute = attributes.uv; + if (this.hasAttribute("tangent") === false) { + this.setAttribute("tangent", new BufferAttribute(new Float32Array(4 * positionAttribute.count), 4)); + } + const tangentAttribute = this.getAttribute("tangent"); + const tan1 = [], tan2 = []; + for (let i = 0; i < positionAttribute.count; i++) { + tan1[i] = new Vector3(); + tan2[i] = new Vector3(); + } + const vA = new Vector3(), vB = new Vector3(), vC = new Vector3(), uvA = new Vector2(), uvB = new Vector2(), uvC = new Vector2(), sdir = new Vector3(), tdir = new Vector3(); + function handleTriangle(a, b, c) { + vA.fromBufferAttribute(positionAttribute, a); + vB.fromBufferAttribute(positionAttribute, b); + vC.fromBufferAttribute(positionAttribute, c); + uvA.fromBufferAttribute(uvAttribute, a); + uvB.fromBufferAttribute(uvAttribute, b); + uvC.fromBufferAttribute(uvAttribute, c); + vB.sub(vA); + vC.sub(vA); + uvB.sub(uvA); + uvC.sub(uvA); + const r = 1 / (uvB.x * uvC.y - uvC.x * uvB.y); + if (!isFinite(r)) return; + sdir.copy(vB).multiplyScalar(uvC.y).addScaledVector(vC, -uvB.y).multiplyScalar(r); + tdir.copy(vC).multiplyScalar(uvB.x).addScaledVector(vB, -uvC.x).multiplyScalar(r); + tan1[a].add(sdir); + tan1[b].add(sdir); + tan1[c].add(sdir); + tan2[a].add(tdir); + tan2[b].add(tdir); + tan2[c].add(tdir); + } + __name(handleTriangle, "handleTriangle"); + let groups = this.groups; + if (groups.length === 0) { + groups = [{ + start: 0, + count: index.count + }]; + } + for (let i = 0, il = groups.length; i < il; ++i) { + const group = groups[i]; + const start = group.start; + const count = group.count; + for (let j = start, jl = start + count; j < jl; j += 3) { + handleTriangle( + index.getX(j + 0), + index.getX(j + 1), + index.getX(j + 2) + ); } - state.viewport(_currentViewport.copy(_viewport).multiplyScalar(_pixelRatio).round()); - }; - this.getScissor = function(target) { - return target.copy(_scissor); - }; - this.setScissor = function(x, y, width, height) { - if (x.isVector4) { - _scissor.set(x.x, x.y, x.z, x.w); + } + const tmp2 = new Vector3(), tmp22 = new Vector3(); + const n = new Vector3(), n2 = new Vector3(); + function handleVertex(v) { + n.fromBufferAttribute(normalAttribute, v); + n2.copy(n); + const t2 = tan1[v]; + tmp2.copy(t2); + tmp2.sub(n.multiplyScalar(n.dot(t2))).normalize(); + tmp22.crossVectors(n2, t2); + const test = tmp22.dot(tan2[v]); + const w = test < 0 ? -1 : 1; + tangentAttribute.setXYZW(v, tmp2.x, tmp2.y, tmp2.z, w); + } + __name(handleVertex, "handleVertex"); + for (let i = 0, il = groups.length; i < il; ++i) { + const group = groups[i]; + const start = group.start; + const count = group.count; + for (let j = start, jl = start + count; j < jl; j += 3) { + handleVertex(index.getX(j + 0)); + handleVertex(index.getX(j + 1)); + handleVertex(index.getX(j + 2)); + } + } + } + computeVertexNormals() { + const index = this.index; + const positionAttribute = this.getAttribute("position"); + if (positionAttribute !== void 0) { + let normalAttribute = this.getAttribute("normal"); + if (normalAttribute === void 0) { + normalAttribute = new BufferAttribute(new Float32Array(positionAttribute.count * 3), 3); + this.setAttribute("normal", normalAttribute); } else { - _scissor.set(x, y, width, height); + for (let i = 0, il = normalAttribute.count; i < il; i++) { + normalAttribute.setXYZ(i, 0, 0, 0); + } } - state.scissor(_currentScissor.copy(_scissor).multiplyScalar(_pixelRatio).round()); - }; - this.getScissorTest = function() { - return _scissorTest; - }; - this.setScissorTest = function(boolean) { - state.setScissorTest(_scissorTest = boolean); - }; - this.setOpaqueSort = function(method) { - _opaqueSort = method; - }; - this.setTransparentSort = function(method) { - _transparentSort = method; - }; - this.getClearColor = function(target) { - return target.copy(background.getClearColor()); - }; - this.setClearColor = function() { - background.setClearColor.apply(background, arguments); - }; - this.getClearAlpha = function() { - return background.getClearAlpha(); - }; - this.setClearAlpha = function() { - background.setClearAlpha.apply(background, arguments); - }; - this.clear = function(color = true, depth2 = true, stencil2 = true) { - let bits2 = 0; - if (color) { - let isIntegerFormat = false; - if (_currentRenderTarget !== null) { - const targetFormat = _currentRenderTarget.texture.format; - isIntegerFormat = targetFormat === RGBAIntegerFormat || targetFormat === RGIntegerFormat || targetFormat === RedIntegerFormat; + const pA = new Vector3(), pB = new Vector3(), pC = new Vector3(); + const nA = new Vector3(), nB = new Vector3(), nC = new Vector3(); + const cb = new Vector3(), ab = new Vector3(); + if (index) { + for (let i = 0, il = index.count; i < il; i += 3) { + const vA = index.getX(i + 0); + const vB = index.getX(i + 1); + const vC = index.getX(i + 2); + pA.fromBufferAttribute(positionAttribute, vA); + pB.fromBufferAttribute(positionAttribute, vB); + pC.fromBufferAttribute(positionAttribute, vC); + cb.subVectors(pC, pB); + ab.subVectors(pA, pB); + cb.cross(ab); + nA.fromBufferAttribute(normalAttribute, vA); + nB.fromBufferAttribute(normalAttribute, vB); + nC.fromBufferAttribute(normalAttribute, vC); + nA.add(cb); + nB.add(cb); + nC.add(cb); + normalAttribute.setXYZ(vA, nA.x, nA.y, nA.z); + normalAttribute.setXYZ(vB, nB.x, nB.y, nB.z); + normalAttribute.setXYZ(vC, nC.x, nC.y, nC.z); } - if (isIntegerFormat) { - const targetType = _currentRenderTarget.texture.type; - const isUnsignedType = targetType === UnsignedByteType || targetType === UnsignedIntType || targetType === UnsignedShortType || targetType === UnsignedInt248Type || targetType === UnsignedShort4444Type || targetType === UnsignedShort5551Type; - const clearColor = background.getClearColor(); - const a = background.getClearAlpha(); - const r = clearColor.r; - const g = clearColor.g; - const b = clearColor.b; - if (isUnsignedType) { - uintClearColor[0] = r; - uintClearColor[1] = g; - uintClearColor[2] = b; - uintClearColor[3] = a; - _gl.clearBufferuiv(_gl.COLOR, 0, uintClearColor); - } else { - intClearColor[0] = r; - intClearColor[1] = g; - intClearColor[2] = b; - intClearColor[3] = a; - _gl.clearBufferiv(_gl.COLOR, 0, intClearColor); - } - } else { - bits2 |= _gl.COLOR_BUFFER_BIT; + } else { + for (let i = 0, il = positionAttribute.count; i < il; i += 3) { + pA.fromBufferAttribute(positionAttribute, i + 0); + pB.fromBufferAttribute(positionAttribute, i + 1); + pC.fromBufferAttribute(positionAttribute, i + 2); + cb.subVectors(pC, pB); + ab.subVectors(pA, pB); + cb.cross(ab); + normalAttribute.setXYZ(i + 0, cb.x, cb.y, cb.z); + normalAttribute.setXYZ(i + 1, cb.x, cb.y, cb.z); + normalAttribute.setXYZ(i + 2, cb.x, cb.y, cb.z); } } - if (depth2) { - bits2 |= _gl.DEPTH_BUFFER_BIT; - } - if (stencil2) { - bits2 |= _gl.STENCIL_BUFFER_BIT; - this.state.buffers.stencil.setMask(4294967295); - } - _gl.clear(bits2); - }; - this.clearColor = function() { - this.clear(true, false, false); - }; - this.clearDepth = function() { - this.clear(false, true, false); - }; - this.clearStencil = function() { - this.clear(false, false, true); - }; - this.dispose = function() { - canvas.removeEventListener("webglcontextlost", onContextLost, false); - canvas.removeEventListener("webglcontextrestored", onContextRestore, false); - canvas.removeEventListener("webglcontextcreationerror", onContextCreationError, false); - renderLists.dispose(); - renderStates.dispose(); - properties.dispose(); - cubemaps.dispose(); - cubeuvmaps.dispose(); - objects.dispose(); - bindingStates.dispose(); - uniformsGroups.dispose(); - programCache.dispose(); - xr.dispose(); - xr.removeEventListener("sessionstart", onXRSessionStart); - xr.removeEventListener("sessionend", onXRSessionEnd); - animation.stop(); - }; - function onContextLost(event) { - event.preventDefault(); - console.log("THREE.WebGLRenderer: Context Lost."); - _isContextLost = true; + this.normalizeNormals(); + normalAttribute.needsUpdate = true; } - __name(onContextLost, "onContextLost"); - function onContextRestore() { - console.log("THREE.WebGLRenderer: Context Restored."); - _isContextLost = false; - const infoAutoReset = info.autoReset; - const shadowMapEnabled = shadowMap.enabled; - const shadowMapAutoUpdate = shadowMap.autoUpdate; - const shadowMapNeedsUpdate = shadowMap.needsUpdate; - const shadowMapType = shadowMap.type; - initGLContext(); - info.autoReset = infoAutoReset; - shadowMap.enabled = shadowMapEnabled; - shadowMap.autoUpdate = shadowMapAutoUpdate; - shadowMap.needsUpdate = shadowMapNeedsUpdate; - shadowMap.type = shadowMapType; + } + normalizeNormals() { + const normals = this.attributes.normal; + for (let i = 0, il = normals.count; i < il; i++) { + _vector$8.fromBufferAttribute(normals, i); + _vector$8.normalize(); + normals.setXYZ(i, _vector$8.x, _vector$8.y, _vector$8.z); } - __name(onContextRestore, "onContextRestore"); - function onContextCreationError(event) { - console.error("THREE.WebGLRenderer: A WebGL context could not be created. Reason: ", event.statusMessage); + } + toNonIndexed() { + function convertBufferAttribute(attribute, indices2) { + const array = attribute.array; + const itemSize = attribute.itemSize; + const normalized = attribute.normalized; + const array2 = new array.constructor(indices2.length * itemSize); + let index = 0, index2 = 0; + for (let i = 0, l = indices2.length; i < l; i++) { + if (attribute.isInterleavedBufferAttribute) { + index = indices2[i] * attribute.data.stride + attribute.offset; + } else { + index = indices2[i] * itemSize; + } + for (let j = 0; j < itemSize; j++) { + array2[index2++] = array[index++]; + } + } + return new BufferAttribute(array2, itemSize, normalized); } - __name(onContextCreationError, "onContextCreationError"); - function onMaterialDispose(event) { - const material = event.target; - material.removeEventListener("dispose", onMaterialDispose); - deallocateMaterial(material); + __name(convertBufferAttribute, "convertBufferAttribute"); + if (this.index === null) { + console.warn("THREE.BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed."); + return this; } - __name(onMaterialDispose, "onMaterialDispose"); - function deallocateMaterial(material) { - releaseMaterialProgramReferences(material); - properties.remove(material); + const geometry2 = new BufferGeometry(); + const indices = this.index.array; + const attributes = this.attributes; + for (const name in attributes) { + const attribute = attributes[name]; + const newAttribute = convertBufferAttribute(attribute, indices); + geometry2.setAttribute(name, newAttribute); } - __name(deallocateMaterial, "deallocateMaterial"); - function releaseMaterialProgramReferences(material) { - const programs = properties.get(material).programs; - if (programs !== void 0) { - programs.forEach(function(program) { - programCache.releaseProgram(program); - }); - if (material.isShaderMaterial) { - programCache.releaseShaderCache(material); - } + const morphAttributes = this.morphAttributes; + for (const name in morphAttributes) { + const morphArray = []; + const morphAttribute = morphAttributes[name]; + for (let i = 0, il = morphAttribute.length; i < il; i++) { + const attribute = morphAttribute[i]; + const newAttribute = convertBufferAttribute(attribute, indices); + morphArray.push(newAttribute); } + geometry2.morphAttributes[name] = morphArray; } - __name(releaseMaterialProgramReferences, "releaseMaterialProgramReferences"); - this.renderBufferDirect = function(camera, scene, geometry, material, object, group) { - if (scene === null) scene = _emptyScene; - const frontFaceCW = object.isMesh && object.matrixWorld.determinant() < 0; - const program = setProgram(camera, scene, geometry, material, object); - state.setMaterial(material, frontFaceCW); - let index = geometry.index; - let rangeFactor = 1; - if (material.wireframe === true) { - index = geometries.getWireframeAttribute(geometry); - if (index === void 0) return; - rangeFactor = 2; + geometry2.morphTargetsRelative = this.morphTargetsRelative; + const groups = this.groups; + for (let i = 0, l = groups.length; i < l; i++) { + const group = groups[i]; + geometry2.addGroup(group.start, group.count, group.materialIndex); + } + return geometry2; + } + toJSON() { + const data = { + metadata: { + version: 4.6, + type: "BufferGeometry", + generator: "BufferGeometry.toJSON" } - const drawRange = geometry.drawRange; - const position = geometry.attributes.position; - let drawStart = drawRange.start * rangeFactor; - let drawEnd = (drawRange.start + drawRange.count) * rangeFactor; - if (group !== null) { - drawStart = Math.max(drawStart, group.start * rangeFactor); - drawEnd = Math.min(drawEnd, (group.start + group.count) * rangeFactor); + }; + data.uuid = this.uuid; + data.type = this.type; + if (this.name !== "") data.name = this.name; + if (Object.keys(this.userData).length > 0) data.userData = this.userData; + if (this.parameters !== void 0) { + const parameters = this.parameters; + for (const key in parameters) { + if (parameters[key] !== void 0) data[key] = parameters[key]; } - if (index !== null) { - drawStart = Math.max(drawStart, 0); - drawEnd = Math.min(drawEnd, index.count); - } else if (position !== void 0 && position !== null) { - drawStart = Math.max(drawStart, 0); - drawEnd = Math.min(drawEnd, position.count); + return data; + } + data.data = { attributes: {} }; + const index = this.index; + if (index !== null) { + data.data.index = { + type: index.array.constructor.name, + array: Array.prototype.slice.call(index.array) + }; + } + const attributes = this.attributes; + for (const key in attributes) { + const attribute = attributes[key]; + data.data.attributes[key] = attribute.toJSON(data.data); + } + const morphAttributes = {}; + let hasMorphAttributes = false; + for (const key in this.morphAttributes) { + const attributeArray = this.morphAttributes[key]; + const array = []; + for (let i = 0, il = attributeArray.length; i < il; i++) { + const attribute = attributeArray[i]; + array.push(attribute.toJSON(data.data)); } - const drawCount = drawEnd - drawStart; - if (drawCount < 0 || drawCount === Infinity) return; - bindingStates.setup(object, material, program, geometry, index); - let attribute; - let renderer = bufferRenderer; - if (index !== null) { - attribute = attributes.get(index); - renderer = indexedBufferRenderer; - renderer.setIndex(attribute); + if (array.length > 0) { + morphAttributes[key] = array; + hasMorphAttributes = true; } - if (object.isMesh) { - if (material.wireframe === true) { - state.setLineWidth(material.wireframeLinewidth * getTargetPixelRatio()); - renderer.setMode(_gl.LINES); - } else { - renderer.setMode(_gl.TRIANGLES); + } + if (hasMorphAttributes) { + data.data.morphAttributes = morphAttributes; + data.data.morphTargetsRelative = this.morphTargetsRelative; + } + const groups = this.groups; + if (groups.length > 0) { + data.data.groups = JSON.parse(JSON.stringify(groups)); + } + const boundingSphere = this.boundingSphere; + if (boundingSphere !== null) { + data.data.boundingSphere = { + center: boundingSphere.center.toArray(), + radius: boundingSphere.radius + }; + } + return data; + } + clone() { + return new this.constructor().copy(this); + } + copy(source) { + this.index = null; + this.attributes = {}; + this.morphAttributes = {}; + this.groups = []; + this.boundingBox = null; + this.boundingSphere = null; + const data = {}; + this.name = source.name; + const index = source.index; + if (index !== null) { + this.setIndex(index.clone(data)); + } + const attributes = source.attributes; + for (const name in attributes) { + const attribute = attributes[name]; + this.setAttribute(name, attribute.clone(data)); + } + const morphAttributes = source.morphAttributes; + for (const name in morphAttributes) { + const array = []; + const morphAttribute = morphAttributes[name]; + for (let i = 0, l = morphAttribute.length; i < l; i++) { + array.push(morphAttribute[i].clone(data)); + } + this.morphAttributes[name] = array; + } + this.morphTargetsRelative = source.morphTargetsRelative; + const groups = source.groups; + for (let i = 0, l = groups.length; i < l; i++) { + const group = groups[i]; + this.addGroup(group.start, group.count, group.materialIndex); + } + const boundingBox = source.boundingBox; + if (boundingBox !== null) { + this.boundingBox = boundingBox.clone(); + } + const boundingSphere = source.boundingSphere; + if (boundingSphere !== null) { + this.boundingSphere = boundingSphere.clone(); + } + this.drawRange.start = source.drawRange.start; + this.drawRange.count = source.drawRange.count; + this.userData = source.userData; + return this; + } + dispose() { + this.dispatchEvent({ type: "dispose" }); + } +} +const _inverseMatrix$3 = /* @__PURE__ */ new Matrix4(); +const _ray$3 = /* @__PURE__ */ new Ray(); +const _sphere$6 = /* @__PURE__ */ new Sphere(); +const _sphereHitAt = /* @__PURE__ */ new Vector3(); +const _vA$1 = /* @__PURE__ */ new Vector3(); +const _vB$1 = /* @__PURE__ */ new Vector3(); +const _vC$1 = /* @__PURE__ */ new Vector3(); +const _tempA = /* @__PURE__ */ new Vector3(); +const _morphA = /* @__PURE__ */ new Vector3(); +const _intersectionPoint = /* @__PURE__ */ new Vector3(); +const _intersectionPointWorld = /* @__PURE__ */ new Vector3(); +class Mesh extends Object3D { + static { + __name(this, "Mesh"); + } + constructor(geometry = new BufferGeometry(), material = new MeshBasicMaterial()) { + super(); + this.isMesh = true; + this.type = "Mesh"; + this.geometry = geometry; + this.material = material; + this.updateMorphTargets(); + } + copy(source, recursive) { + super.copy(source, recursive); + if (source.morphTargetInfluences !== void 0) { + this.morphTargetInfluences = source.morphTargetInfluences.slice(); + } + if (source.morphTargetDictionary !== void 0) { + this.morphTargetDictionary = Object.assign({}, source.morphTargetDictionary); + } + this.material = Array.isArray(source.material) ? source.material.slice() : source.material; + this.geometry = source.geometry; + return this; + } + updateMorphTargets() { + const geometry = this.geometry; + const morphAttributes = geometry.morphAttributes; + const keys = Object.keys(morphAttributes); + if (keys.length > 0) { + const morphAttribute = morphAttributes[keys[0]]; + if (morphAttribute !== void 0) { + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + for (let m = 0, ml = morphAttribute.length; m < ml; m++) { + const name = morphAttribute[m].name || String(m); + this.morphTargetInfluences.push(0); + this.morphTargetDictionary[name] = m; } - } else if (object.isLine) { - let lineWidth = material.linewidth; - if (lineWidth === void 0) lineWidth = 1; - state.setLineWidth(lineWidth * getTargetPixelRatio()); - if (object.isLineSegments) { - renderer.setMode(_gl.LINES); - } else if (object.isLineLoop) { - renderer.setMode(_gl.LINE_LOOP); + } + } + } + getVertexPosition(index, target) { + const geometry = this.geometry; + const position = geometry.attributes.position; + const morphPosition = geometry.morphAttributes.position; + const morphTargetsRelative = geometry.morphTargetsRelative; + target.fromBufferAttribute(position, index); + const morphInfluences = this.morphTargetInfluences; + if (morphPosition && morphInfluences) { + _morphA.set(0, 0, 0); + for (let i = 0, il = morphPosition.length; i < il; i++) { + const influence = morphInfluences[i]; + const morphAttribute = morphPosition[i]; + if (influence === 0) continue; + _tempA.fromBufferAttribute(morphAttribute, index); + if (morphTargetsRelative) { + _morphA.addScaledVector(_tempA, influence); } else { - renderer.setMode(_gl.LINE_STRIP); + _morphA.addScaledVector(_tempA.sub(target), influence); } - } else if (object.isPoints) { - renderer.setMode(_gl.POINTS); - } else if (object.isSprite) { - renderer.setMode(_gl.TRIANGLES); } - if (object.isBatchedMesh) { - if (object._multiDrawInstances !== null) { - renderer.renderMultiDrawInstances(object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount, object._multiDrawInstances); - } else { - if (!extensions.get("WEBGL_multi_draw")) { - const starts = object._multiDrawStarts; - const counts = object._multiDrawCounts; - const drawCount2 = object._multiDrawCount; - const bytesPerElement = index ? attributes.get(index).bytesPerElement : 1; - const uniforms = properties.get(material).currentProgram.getUniforms(); - for (let i = 0; i < drawCount2; i++) { - uniforms.setValue(_gl, "_gl_DrawID", i); - renderer.render(starts[i] / bytesPerElement, counts[i]); + target.add(_morphA); + } + return target; + } + raycast(raycaster, intersects2) { + const geometry = this.geometry; + const material = this.material; + const matrixWorld = this.matrixWorld; + if (material === void 0) return; + if (geometry.boundingSphere === null) geometry.computeBoundingSphere(); + _sphere$6.copy(geometry.boundingSphere); + _sphere$6.applyMatrix4(matrixWorld); + _ray$3.copy(raycaster.ray).recast(raycaster.near); + if (_sphere$6.containsPoint(_ray$3.origin) === false) { + if (_ray$3.intersectSphere(_sphere$6, _sphereHitAt) === null) return; + if (_ray$3.origin.distanceToSquared(_sphereHitAt) > (raycaster.far - raycaster.near) ** 2) return; + } + _inverseMatrix$3.copy(matrixWorld).invert(); + _ray$3.copy(raycaster.ray).applyMatrix4(_inverseMatrix$3); + if (geometry.boundingBox !== null) { + if (_ray$3.intersectsBox(geometry.boundingBox) === false) return; + } + this._computeIntersections(raycaster, intersects2, _ray$3); + } + _computeIntersections(raycaster, intersects2, rayLocalSpace) { + let intersection; + const geometry = this.geometry; + const material = this.material; + const index = geometry.index; + const position = geometry.attributes.position; + const uv = geometry.attributes.uv; + const uv1 = geometry.attributes.uv1; + const normal = geometry.attributes.normal; + const groups = geometry.groups; + const drawRange = geometry.drawRange; + if (index !== null) { + if (Array.isArray(material)) { + for (let i = 0, il = groups.length; i < il; i++) { + const group = groups[i]; + const groupMaterial = material[group.materialIndex]; + const start = Math.max(group.start, drawRange.start); + const end = Math.min(index.count, Math.min(group.start + group.count, drawRange.start + drawRange.count)); + for (let j = start, jl = end; j < jl; j += 3) { + const a = index.getX(j); + const b = index.getX(j + 1); + const c = index.getX(j + 2); + intersection = checkGeometryIntersection(this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c); + if (intersection) { + intersection.faceIndex = Math.floor(j / 3); + intersection.face.materialIndex = group.materialIndex; + intersects2.push(intersection); } - } else { - renderer.renderMultiDraw(object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount); } } - } else if (object.isInstancedMesh) { - renderer.renderInstances(drawStart, drawCount, object.count); - } else if (geometry.isInstancedBufferGeometry) { - const maxInstanceCount = geometry._maxInstanceCount !== void 0 ? geometry._maxInstanceCount : Infinity; - const instanceCount = Math.min(geometry.instanceCount, maxInstanceCount); - renderer.renderInstances(drawStart, drawCount, instanceCount); - } else { - renderer.render(drawStart, drawCount); - } - }; - function prepareMaterial(material, scene, object) { - if (material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false) { - material.side = BackSide; - material.needsUpdate = true; - getProgram(material, scene, object); - material.side = FrontSide; - material.needsUpdate = true; - getProgram(material, scene, object); - material.side = DoubleSide; } else { - getProgram(material, scene, object); - } - } - __name(prepareMaterial, "prepareMaterial"); - this.compile = function(scene, camera, targetScene = null) { - if (targetScene === null) targetScene = scene; - currentRenderState = renderStates.get(targetScene); - currentRenderState.init(camera); - renderStateStack.push(currentRenderState); - targetScene.traverseVisible(function(object) { - if (object.isLight && object.layers.test(camera.layers)) { - currentRenderState.pushLight(object); - if (object.castShadow) { - currentRenderState.pushShadow(object); + const start = Math.max(0, drawRange.start); + const end = Math.min(index.count, drawRange.start + drawRange.count); + for (let i = start, il = end; i < il; i += 3) { + const a = index.getX(i); + const b = index.getX(i + 1); + const c = index.getX(i + 2); + intersection = checkGeometryIntersection(this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c); + if (intersection) { + intersection.faceIndex = Math.floor(i / 3); + intersects2.push(intersection); } } - }); - if (scene !== targetScene) { - scene.traverseVisible(function(object) { - if (object.isLight && object.layers.test(camera.layers)) { - currentRenderState.pushLight(object); - if (object.castShadow) { - currentRenderState.pushShadow(object); - } - } - }); } - currentRenderState.setupLights(); - const materials2 = /* @__PURE__ */ new Set(); - scene.traverse(function(object) { - if (!(object.isMesh || object.isPoints || object.isLine || object.isSprite)) { - return; - } - const material = object.material; - if (material) { - if (Array.isArray(material)) { - for (let i = 0; i < material.length; i++) { - const material2 = material[i]; - prepareMaterial(material2, targetScene, object); - materials2.add(material2); + } else if (position !== void 0) { + if (Array.isArray(material)) { + for (let i = 0, il = groups.length; i < il; i++) { + const group = groups[i]; + const groupMaterial = material[group.materialIndex]; + const start = Math.max(group.start, drawRange.start); + const end = Math.min(position.count, Math.min(group.start + group.count, drawRange.start + drawRange.count)); + for (let j = start, jl = end; j < jl; j += 3) { + const a = j; + const b = j + 1; + const c = j + 2; + intersection = checkGeometryIntersection(this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c); + if (intersection) { + intersection.faceIndex = Math.floor(j / 3); + intersection.face.materialIndex = group.materialIndex; + intersects2.push(intersection); } - } else { - prepareMaterial(material, targetScene, object); - materials2.add(material); } } - }); - renderStateStack.pop(); - currentRenderState = null; - return materials2; - }; - this.compileAsync = function(scene, camera, targetScene = null) { - const materials2 = this.compile(scene, camera, targetScene); - return new Promise((resolve) => { - function checkMaterialsReady() { - materials2.forEach(function(material) { - const materialProperties = properties.get(material); - const program = materialProperties.currentProgram; - if (program.isReady()) { - materials2.delete(material); - } - }); - if (materials2.size === 0) { - resolve(scene); - return; + } else { + const start = Math.max(0, drawRange.start); + const end = Math.min(position.count, drawRange.start + drawRange.count); + for (let i = start, il = end; i < il; i += 3) { + const a = i; + const b = i + 1; + const c = i + 2; + intersection = checkGeometryIntersection(this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c); + if (intersection) { + intersection.faceIndex = Math.floor(i / 3); + intersects2.push(intersection); } - setTimeout(checkMaterialsReady, 10); - } - __name(checkMaterialsReady, "checkMaterialsReady"); - if (extensions.get("KHR_parallel_shader_compile") !== null) { - checkMaterialsReady(); - } else { - setTimeout(checkMaterialsReady, 10); } - }); - }; - let onAnimationFrameCallback = null; - function onAnimationFrame(time) { - if (onAnimationFrameCallback) onAnimationFrameCallback(time); + } } - __name(onAnimationFrame, "onAnimationFrame"); - function onXRSessionStart() { - animation.stop(); + } +} +function checkIntersection$1(object, material, raycaster, ray, pA, pB, pC, point) { + let intersect2; + if (material.side === BackSide) { + intersect2 = ray.intersectTriangle(pC, pB, pA, true, point); + } else { + intersect2 = ray.intersectTriangle(pA, pB, pC, material.side === FrontSide, point); + } + if (intersect2 === null) return null; + _intersectionPointWorld.copy(point); + _intersectionPointWorld.applyMatrix4(object.matrixWorld); + const distance = raycaster.ray.origin.distanceTo(_intersectionPointWorld); + if (distance < raycaster.near || distance > raycaster.far) return null; + return { + distance, + point: _intersectionPointWorld.clone(), + object + }; +} +__name(checkIntersection$1, "checkIntersection$1"); +function checkGeometryIntersection(object, material, raycaster, ray, uv, uv1, normal, a, b, c) { + object.getVertexPosition(a, _vA$1); + object.getVertexPosition(b, _vB$1); + object.getVertexPosition(c, _vC$1); + const intersection = checkIntersection$1(object, material, raycaster, ray, _vA$1, _vB$1, _vC$1, _intersectionPoint); + if (intersection) { + const barycoord = new Vector3(); + Triangle.getBarycoord(_intersectionPoint, _vA$1, _vB$1, _vC$1, barycoord); + if (uv) { + intersection.uv = Triangle.getInterpolatedAttribute(uv, a, b, c, barycoord, new Vector2()); } - __name(onXRSessionStart, "onXRSessionStart"); - function onXRSessionEnd() { - animation.start(); + if (uv1) { + intersection.uv1 = Triangle.getInterpolatedAttribute(uv1, a, b, c, barycoord, new Vector2()); } - __name(onXRSessionEnd, "onXRSessionEnd"); - const animation = new WebGLAnimation(); - animation.setAnimationLoop(onAnimationFrame); - if (typeof self !== "undefined") animation.setContext(self); - this.setAnimationLoop = function(callback) { - onAnimationFrameCallback = callback; - xr.setAnimationLoop(callback); - callback === null ? animation.stop() : animation.start(); - }; - xr.addEventListener("sessionstart", onXRSessionStart); - xr.addEventListener("sessionend", onXRSessionEnd); - this.render = function(scene, camera) { - if (camera !== void 0 && camera.isCamera !== true) { - console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera."); - return; - } - if (_isContextLost === true) return; - if (scene.matrixWorldAutoUpdate === true) scene.updateMatrixWorld(); - if (camera.parent === null && camera.matrixWorldAutoUpdate === true) camera.updateMatrixWorld(); - if (xr.enabled === true && xr.isPresenting === true) { - if (xr.cameraAutoUpdate === true) xr.updateCamera(camera); - camera = xr.getCamera(); - } - if (scene.isScene === true) scene.onBeforeRender(_this, scene, camera, _currentRenderTarget); - currentRenderState = renderStates.get(scene, renderStateStack.length); - currentRenderState.init(camera); - renderStateStack.push(currentRenderState); - _projScreenMatrix2.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse); - _frustum2.setFromProjectionMatrix(_projScreenMatrix2); - _localClippingEnabled = this.localClippingEnabled; - _clippingEnabled = clipping.init(this.clippingPlanes, _localClippingEnabled); - currentRenderList = renderLists.get(scene, renderListStack.length); - currentRenderList.init(); - renderListStack.push(currentRenderList); - if (xr.enabled === true && xr.isPresenting === true) { - const depthSensingMesh = _this.xr.getDepthSensingMesh(); - if (depthSensingMesh !== null) { - projectObject(depthSensingMesh, camera, -Infinity, _this.sortObjects); - } - } - projectObject(scene, camera, 0, _this.sortObjects); - currentRenderList.finish(); - if (_this.sortObjects === true) { - currentRenderList.sort(_opaqueSort, _transparentSort); - } - _renderBackground = xr.enabled === false || xr.isPresenting === false || xr.hasDepthSensing() === false; - if (_renderBackground) { - background.addToRenderList(currentRenderList, scene); - } - this.info.render.frame++; - if (_clippingEnabled === true) clipping.beginShadows(); - const shadowsArray = currentRenderState.state.shadowsArray; - shadowMap.render(shadowsArray, scene, camera); - if (_clippingEnabled === true) clipping.endShadows(); - if (this.info.autoReset === true) this.info.reset(); - const opaqueObjects = currentRenderList.opaque; - const transmissiveObjects = currentRenderList.transmissive; - currentRenderState.setupLights(); - if (camera.isArrayCamera) { - const cameras = camera.cameras; - if (transmissiveObjects.length > 0) { - for (let i = 0, l = cameras.length; i < l; i++) { - const camera2 = cameras[i]; - renderTransmissionPass(opaqueObjects, transmissiveObjects, scene, camera2); - } - } - if (_renderBackground) background.render(scene); - for (let i = 0, l = cameras.length; i < l; i++) { - const camera2 = cameras[i]; - renderScene(currentRenderList, scene, camera2, camera2.viewport); - } - } else { - if (transmissiveObjects.length > 0) renderTransmissionPass(opaqueObjects, transmissiveObjects, scene, camera); - if (_renderBackground) background.render(scene); - renderScene(currentRenderList, scene, camera); - } - if (_currentRenderTarget !== null) { - textures.updateMultisampleRenderTarget(_currentRenderTarget); - textures.updateRenderTargetMipmap(_currentRenderTarget); - } - if (scene.isScene === true) scene.onAfterRender(_this, scene, camera); - bindingStates.resetDefaultState(); - _currentMaterialId = -1; - _currentCamera = null; - renderStateStack.pop(); - if (renderStateStack.length > 0) { - currentRenderState = renderStateStack[renderStateStack.length - 1]; - if (_clippingEnabled === true) clipping.setGlobalState(_this.clippingPlanes, currentRenderState.state.camera); - } else { - currentRenderState = null; - } - renderListStack.pop(); - if (renderListStack.length > 0) { - currentRenderList = renderListStack[renderListStack.length - 1]; - } else { - currentRenderList = null; + if (normal) { + intersection.normal = Triangle.getInterpolatedAttribute(normal, a, b, c, barycoord, new Vector3()); + if (intersection.normal.dot(ray.direction) > 0) { + intersection.normal.multiplyScalar(-1); } + } + const face = { + a, + b, + c, + normal: new Vector3(), + materialIndex: 0 }; - function projectObject(object, camera, groupOrder, sortObjects) { - if (object.visible === false) return; - const visible = object.layers.test(camera.layers); - if (visible) { - if (object.isGroup) { - groupOrder = object.renderOrder; - } else if (object.isLOD) { - if (object.autoUpdate === true) object.update(camera); - } else if (object.isLight) { - currentRenderState.pushLight(object); - if (object.castShadow) { - currentRenderState.pushShadow(object); - } - } else if (object.isSprite) { - if (!object.frustumCulled || _frustum2.intersectsSprite(object)) { - if (sortObjects) { - _vector4.setFromMatrixPosition(object.matrixWorld).applyMatrix4(_projScreenMatrix2); - } - const geometry = objects.update(object); - const material = object.material; - if (material.visible) { - currentRenderList.push(object, geometry, material, groupOrder, _vector4.z, null); - } - } - } else if (object.isMesh || object.isLine || object.isPoints) { - if (!object.frustumCulled || _frustum2.intersectsObject(object)) { - const geometry = objects.update(object); - const material = object.material; - if (sortObjects) { - if (object.boundingSphere !== void 0) { - if (object.boundingSphere === null) object.computeBoundingSphere(); - _vector4.copy(object.boundingSphere.center); - } else { - if (geometry.boundingSphere === null) geometry.computeBoundingSphere(); - _vector4.copy(geometry.boundingSphere.center); - } - _vector4.applyMatrix4(object.matrixWorld).applyMatrix4(_projScreenMatrix2); - } - if (Array.isArray(material)) { - const groups = geometry.groups; - for (let i = 0, l = groups.length; i < l; i++) { - const group = groups[i]; - const groupMaterial = material[group.materialIndex]; - if (groupMaterial && groupMaterial.visible) { - currentRenderList.push(object, geometry, groupMaterial, groupOrder, _vector4.z, group); - } - } - } else if (material.visible) { - currentRenderList.push(object, geometry, material, groupOrder, _vector4.z, null); - } - } + Triangle.getNormal(_vA$1, _vB$1, _vC$1, face.normal); + intersection.face = face; + intersection.barycoord = barycoord; + } + return intersection; +} +__name(checkGeometryIntersection, "checkGeometryIntersection"); +class BoxGeometry extends BufferGeometry { + static { + __name(this, "BoxGeometry"); + } + constructor(width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1) { + super(); + this.type = "BoxGeometry"; + this.parameters = { + width, + height, + depth, + widthSegments, + heightSegments, + depthSegments + }; + const scope = this; + widthSegments = Math.floor(widthSegments); + heightSegments = Math.floor(heightSegments); + depthSegments = Math.floor(depthSegments); + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + let numberOfVertices = 0; + let groupStart = 0; + buildPlane("z", "y", "x", -1, -1, depth, height, width, depthSegments, heightSegments, 0); + buildPlane("z", "y", "x", 1, -1, depth, height, -width, depthSegments, heightSegments, 1); + buildPlane("x", "z", "y", 1, 1, width, depth, height, widthSegments, depthSegments, 2); + buildPlane("x", "z", "y", 1, -1, width, depth, -height, widthSegments, depthSegments, 3); + buildPlane("x", "y", "z", 1, -1, width, height, depth, widthSegments, heightSegments, 4); + buildPlane("x", "y", "z", -1, -1, width, height, -depth, widthSegments, heightSegments, 5); + this.setIndex(indices); + this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + this.setAttribute("normal", new Float32BufferAttribute(normals, 3)); + this.setAttribute("uv", new Float32BufferAttribute(uvs, 2)); + function buildPlane(u, v, w, udir, vdir, width2, height2, depth2, gridX, gridY, materialIndex) { + const segmentWidth = width2 / gridX; + const segmentHeight = height2 / gridY; + const widthHalf = width2 / 2; + const heightHalf = height2 / 2; + const depthHalf = depth2 / 2; + const gridX1 = gridX + 1; + const gridY1 = gridY + 1; + let vertexCounter = 0; + let groupCount = 0; + const vector = new Vector3(); + for (let iy = 0; iy < gridY1; iy++) { + const y = iy * segmentHeight - heightHalf; + for (let ix = 0; ix < gridX1; ix++) { + const x = ix * segmentWidth - widthHalf; + vector[u] = x * udir; + vector[v] = y * vdir; + vector[w] = depthHalf; + vertices.push(vector.x, vector.y, vector.z); + vector[u] = 0; + vector[v] = 0; + vector[w] = depth2 > 0 ? 1 : -1; + normals.push(vector.x, vector.y, vector.z); + uvs.push(ix / gridX); + uvs.push(1 - iy / gridY); + vertexCounter += 1; } } - const children = object.children; - for (let i = 0, l = children.length; i < l; i++) { - projectObject(children[i], camera, groupOrder, sortObjects); + for (let iy = 0; iy < gridY; iy++) { + for (let ix = 0; ix < gridX; ix++) { + const a = numberOfVertices + ix + gridX1 * iy; + const b = numberOfVertices + ix + gridX1 * (iy + 1); + const c = numberOfVertices + (ix + 1) + gridX1 * (iy + 1); + const d = numberOfVertices + (ix + 1) + gridX1 * iy; + indices.push(a, b, d); + indices.push(b, c, d); + groupCount += 6; + } } + scope.addGroup(groupStart, groupCount, materialIndex); + groupStart += groupCount; + numberOfVertices += vertexCounter; } - __name(projectObject, "projectObject"); - function renderScene(currentRenderList2, scene, camera, viewport) { - const opaqueObjects = currentRenderList2.opaque; - const transmissiveObjects = currentRenderList2.transmissive; - const transparentObjects = currentRenderList2.transparent; - currentRenderState.setupLightsView(camera); - if (_clippingEnabled === true) clipping.setGlobalState(_this.clippingPlanes, camera); - if (viewport) state.viewport(_currentViewport.copy(viewport)); - if (opaqueObjects.length > 0) renderObjects(opaqueObjects, scene, camera); - if (transmissiveObjects.length > 0) renderObjects(transmissiveObjects, scene, camera); - if (transparentObjects.length > 0) renderObjects(transparentObjects, scene, camera); - state.buffers.depth.setTest(true); - state.buffers.depth.setMask(true); - state.buffers.color.setMask(true); - state.setPolygonOffset(false); - } - __name(renderScene, "renderScene"); - function renderTransmissionPass(opaqueObjects, transmissiveObjects, scene, camera) { - const overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null; - if (overrideMaterial !== null) { - return; - } - if (currentRenderState.state.transmissionRenderTarget[camera.id] === void 0) { - currentRenderState.state.transmissionRenderTarget[camera.id] = new WebGLRenderTarget(1, 1, { - generateMipmaps: true, - type: extensions.has("EXT_color_buffer_half_float") || extensions.has("EXT_color_buffer_float") ? HalfFloatType : UnsignedByteType, - minFilter: LinearMipmapLinearFilter, - samples: 4, - stencilBuffer: stencil, - resolveDepthBuffer: false, - resolveStencilBuffer: false, - colorSpace: ColorManagement.workingColorSpace - }); - } - const transmissionRenderTarget = currentRenderState.state.transmissionRenderTarget[camera.id]; - const activeViewport = camera.viewport || _currentViewport; - transmissionRenderTarget.setSize(activeViewport.z, activeViewport.w); - const currentRenderTarget = _this.getRenderTarget(); - _this.setRenderTarget(transmissionRenderTarget); - _this.getClearColor(_currentClearColor); - _currentClearAlpha = _this.getClearAlpha(); - if (_currentClearAlpha < 1) _this.setClearColor(16777215, 0.5); - _this.clear(); - if (_renderBackground) background.render(scene); - const currentToneMapping = _this.toneMapping; - _this.toneMapping = NoToneMapping; - const currentCameraViewport = camera.viewport; - if (camera.viewport !== void 0) camera.viewport = void 0; - currentRenderState.setupLightsView(camera); - if (_clippingEnabled === true) clipping.setGlobalState(_this.clippingPlanes, camera); - renderObjects(opaqueObjects, scene, camera); - textures.updateMultisampleRenderTarget(transmissionRenderTarget); - textures.updateRenderTargetMipmap(transmissionRenderTarget); - if (extensions.has("WEBGL_multisampled_render_to_texture") === false) { - let renderTargetNeedsUpdate = false; - for (let i = 0, l = transmissiveObjects.length; i < l; i++) { - const renderItem = transmissiveObjects[i]; - const object = renderItem.object; - const geometry = renderItem.geometry; - const material = renderItem.material; - const group = renderItem.group; - if (material.side === DoubleSide && object.layers.test(camera.layers)) { - const currentSide = material.side; - material.side = BackSide; - material.needsUpdate = true; - renderObject(object, scene, camera, geometry, material, group); - material.side = currentSide; - material.needsUpdate = true; - renderTargetNeedsUpdate = true; - } - } - if (renderTargetNeedsUpdate === true) { - textures.updateMultisampleRenderTarget(transmissionRenderTarget); - textures.updateRenderTargetMipmap(transmissionRenderTarget); + __name(buildPlane, "buildPlane"); + } + copy(source) { + super.copy(source); + this.parameters = Object.assign({}, source.parameters); + return this; + } + static fromJSON(data) { + return new BoxGeometry(data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments); + } +} +function cloneUniforms(src) { + const dst = {}; + for (const u in src) { + dst[u] = {}; + for (const p in src[u]) { + const property = src[u][p]; + if (property && (property.isColor || property.isMatrix3 || property.isMatrix4 || property.isVector2 || property.isVector3 || property.isVector4 || property.isTexture || property.isQuaternion)) { + if (property.isRenderTargetTexture) { + console.warn("UniformsUtils: Textures of render targets cannot be cloned via cloneUniforms() or mergeUniforms()."); + dst[u][p] = null; + } else { + dst[u][p] = property.clone(); } + } else if (Array.isArray(property)) { + dst[u][p] = property.slice(); + } else { + dst[u][p] = property; } - _this.setRenderTarget(currentRenderTarget); - _this.setClearColor(_currentClearColor, _currentClearAlpha); - if (currentCameraViewport !== void 0) camera.viewport = currentCameraViewport; - _this.toneMapping = currentToneMapping; } - __name(renderTransmissionPass, "renderTransmissionPass"); - function renderObjects(renderList, scene, camera) { - const overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null; - for (let i = 0, l = renderList.length; i < l; i++) { - const renderItem = renderList[i]; - const object = renderItem.object; - const geometry = renderItem.geometry; - const material = overrideMaterial === null ? renderItem.material : overrideMaterial; - const group = renderItem.group; - if (object.layers.test(camera.layers)) { - renderObject(object, scene, camera, geometry, material, group); - } - } + } + return dst; +} +__name(cloneUniforms, "cloneUniforms"); +function mergeUniforms(uniforms) { + const merged = {}; + for (let u = 0; u < uniforms.length; u++) { + const tmp2 = cloneUniforms(uniforms[u]); + for (const p in tmp2) { + merged[p] = tmp2[p]; } - __name(renderObjects, "renderObjects"); - function renderObject(object, scene, camera, geometry, material, group) { - object.onBeforeRender(_this, scene, camera, geometry, material, group); - object.modelViewMatrix.multiplyMatrices(camera.matrixWorldInverse, object.matrixWorld); - object.normalMatrix.getNormalMatrix(object.modelViewMatrix); - material.onBeforeRender(_this, scene, camera, geometry, object, group); - if (material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false) { - material.side = BackSide; - material.needsUpdate = true; - _this.renderBufferDirect(camera, scene, geometry, material, object, group); - material.side = FrontSide; - material.needsUpdate = true; - _this.renderBufferDirect(camera, scene, geometry, material, object, group); - material.side = DoubleSide; - } else { - _this.renderBufferDirect(camera, scene, geometry, material, object, group); - } - object.onAfterRender(_this, scene, camera, geometry, material, group); + } + return merged; +} +__name(mergeUniforms, "mergeUniforms"); +function cloneUniformsGroups(src) { + const dst = []; + for (let u = 0; u < src.length; u++) { + dst.push(src[u].clone()); + } + return dst; +} +__name(cloneUniformsGroups, "cloneUniformsGroups"); +function getUnlitUniformColorSpace(renderer) { + const currentRenderTarget = renderer.getRenderTarget(); + if (currentRenderTarget === null) { + return renderer.outputColorSpace; + } + if (currentRenderTarget.isXRRenderTarget === true) { + return currentRenderTarget.texture.colorSpace; + } + return ColorManagement.workingColorSpace; +} +__name(getUnlitUniformColorSpace, "getUnlitUniformColorSpace"); +const UniformsUtils = { clone: cloneUniforms, merge: mergeUniforms }; +var default_vertex = "void main() {\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}"; +var default_fragment = "void main() {\n gl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}"; +class ShaderMaterial extends Material { + static { + __name(this, "ShaderMaterial"); + } + static get type() { + return "ShaderMaterial"; + } + constructor(parameters) { + super(); + this.isShaderMaterial = true; + this.defines = {}; + this.uniforms = {}; + this.uniformsGroups = []; + this.vertexShader = default_vertex; + this.fragmentShader = default_fragment; + this.linewidth = 1; + this.wireframe = false; + this.wireframeLinewidth = 1; + this.fog = false; + this.lights = false; + this.clipping = false; + this.forceSinglePass = true; + this.extensions = { + clipCullDistance: false, + // set to use vertex shader clipping + multiDraw: false + // set to use vertex shader multi_draw / enable gl_DrawID + }; + this.defaultAttributeValues = { + "color": [1, 1, 1], + "uv": [0, 0], + "uv1": [0, 0] + }; + this.index0AttributeName = void 0; + this.uniformsNeedUpdate = false; + this.glslVersion = null; + if (parameters !== void 0) { + this.setValues(parameters); } - __name(renderObject, "renderObject"); - function getProgram(material, scene, object) { - if (scene.isScene !== true) scene = _emptyScene; - const materialProperties = properties.get(material); - const lights = currentRenderState.state.lights; - const shadowsArray = currentRenderState.state.shadowsArray; - const lightsStateVersion = lights.state.version; - const parameters2 = programCache.getParameters(material, lights.state, shadowsArray, scene, object); - const programCacheKey = programCache.getProgramCacheKey(parameters2); - let programs = materialProperties.programs; - materialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null; - materialProperties.fog = scene.fog; - materialProperties.envMap = (material.isMeshStandardMaterial ? cubeuvmaps : cubemaps).get(material.envMap || materialProperties.environment); - materialProperties.envMapRotation = materialProperties.environment !== null && material.envMap === null ? scene.environmentRotation : material.envMapRotation; - if (programs === void 0) { - material.addEventListener("dispose", onMaterialDispose); - programs = /* @__PURE__ */ new Map(); - materialProperties.programs = programs; - } - let program = programs.get(programCacheKey); - if (program !== void 0) { - if (materialProperties.currentProgram === program && materialProperties.lightsStateVersion === lightsStateVersion) { - updateCommonMaterialProperties(material, parameters2); - return program; - } + } + copy(source) { + super.copy(source); + this.fragmentShader = source.fragmentShader; + this.vertexShader = source.vertexShader; + this.uniforms = cloneUniforms(source.uniforms); + this.uniformsGroups = cloneUniformsGroups(source.uniformsGroups); + this.defines = Object.assign({}, source.defines); + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.fog = source.fog; + this.lights = source.lights; + this.clipping = source.clipping; + this.extensions = Object.assign({}, source.extensions); + this.glslVersion = source.glslVersion; + return this; + } + toJSON(meta) { + const data = super.toJSON(meta); + data.glslVersion = this.glslVersion; + data.uniforms = {}; + for (const name in this.uniforms) { + const uniform = this.uniforms[name]; + const value = uniform.value; + if (value && value.isTexture) { + data.uniforms[name] = { + type: "t", + value: value.toJSON(meta).uuid + }; + } else if (value && value.isColor) { + data.uniforms[name] = { + type: "c", + value: value.getHex() + }; + } else if (value && value.isVector2) { + data.uniforms[name] = { + type: "v2", + value: value.toArray() + }; + } else if (value && value.isVector3) { + data.uniforms[name] = { + type: "v3", + value: value.toArray() + }; + } else if (value && value.isVector4) { + data.uniforms[name] = { + type: "v4", + value: value.toArray() + }; + } else if (value && value.isMatrix3) { + data.uniforms[name] = { + type: "m3", + value: value.toArray() + }; + } else if (value && value.isMatrix4) { + data.uniforms[name] = { + type: "m4", + value: value.toArray() + }; } else { - parameters2.uniforms = programCache.getUniforms(material); - material.onBeforeCompile(parameters2, _this); - program = programCache.acquireProgram(parameters2, programCacheKey); - programs.set(programCacheKey, program); - materialProperties.uniforms = parameters2.uniforms; - } - const uniforms = materialProperties.uniforms; - if (!material.isShaderMaterial && !material.isRawShaderMaterial || material.clipping === true) { - uniforms.clippingPlanes = clipping.uniform; - } - updateCommonMaterialProperties(material, parameters2); - materialProperties.needsLights = materialNeedsLights(material); - materialProperties.lightsStateVersion = lightsStateVersion; - if (materialProperties.needsLights) { - uniforms.ambientLightColor.value = lights.state.ambient; - uniforms.lightProbe.value = lights.state.probe; - uniforms.directionalLights.value = lights.state.directional; - uniforms.directionalLightShadows.value = lights.state.directionalShadow; - uniforms.spotLights.value = lights.state.spot; - uniforms.spotLightShadows.value = lights.state.spotShadow; - uniforms.rectAreaLights.value = lights.state.rectArea; - uniforms.ltc_1.value = lights.state.rectAreaLTC1; - uniforms.ltc_2.value = lights.state.rectAreaLTC2; - uniforms.pointLights.value = lights.state.point; - uniforms.pointLightShadows.value = lights.state.pointShadow; - uniforms.hemisphereLights.value = lights.state.hemi; - uniforms.directionalShadowMap.value = lights.state.directionalShadowMap; - uniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix; - uniforms.spotShadowMap.value = lights.state.spotShadowMap; - uniforms.spotLightMatrix.value = lights.state.spotLightMatrix; - uniforms.spotLightMap.value = lights.state.spotLightMap; - uniforms.pointShadowMap.value = lights.state.pointShadowMap; - uniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix; + data.uniforms[name] = { + value + }; } - materialProperties.currentProgram = program; - materialProperties.uniformsList = null; - return program; } - __name(getProgram, "getProgram"); - function getUniformList(materialProperties) { - if (materialProperties.uniformsList === null) { - const progUniforms = materialProperties.currentProgram.getUniforms(); - materialProperties.uniformsList = WebGLUniforms.seqWithValue(progUniforms.seq, materialProperties.uniforms); - } - return materialProperties.uniformsList; + if (Object.keys(this.defines).length > 0) data.defines = this.defines; + data.vertexShader = this.vertexShader; + data.fragmentShader = this.fragmentShader; + data.lights = this.lights; + data.clipping = this.clipping; + const extensions = {}; + for (const key in this.extensions) { + if (this.extensions[key] === true) extensions[key] = true; + } + if (Object.keys(extensions).length > 0) data.extensions = extensions; + return data; + } +} +class Camera extends Object3D { + static { + __name(this, "Camera"); + } + constructor() { + super(); + this.isCamera = true; + this.type = "Camera"; + this.matrixWorldInverse = new Matrix4(); + this.projectionMatrix = new Matrix4(); + this.projectionMatrixInverse = new Matrix4(); + this.coordinateSystem = WebGLCoordinateSystem; + } + copy(source, recursive) { + super.copy(source, recursive); + this.matrixWorldInverse.copy(source.matrixWorldInverse); + this.projectionMatrix.copy(source.projectionMatrix); + this.projectionMatrixInverse.copy(source.projectionMatrixInverse); + this.coordinateSystem = source.coordinateSystem; + return this; + } + getWorldDirection(target) { + return super.getWorldDirection(target).negate(); + } + updateMatrixWorld(force) { + super.updateMatrixWorld(force); + this.matrixWorldInverse.copy(this.matrixWorld).invert(); + } + updateWorldMatrix(updateParents, updateChildren) { + super.updateWorldMatrix(updateParents, updateChildren); + this.matrixWorldInverse.copy(this.matrixWorld).invert(); + } + clone() { + return new this.constructor().copy(this); + } +} +const _v3$1 = /* @__PURE__ */ new Vector3(); +const _minTarget = /* @__PURE__ */ new Vector2(); +const _maxTarget = /* @__PURE__ */ new Vector2(); +class PerspectiveCamera extends Camera { + static { + __name(this, "PerspectiveCamera"); + } + constructor(fov2 = 50, aspect2 = 1, near = 0.1, far = 2e3) { + super(); + this.isPerspectiveCamera = true; + this.type = "PerspectiveCamera"; + this.fov = fov2; + this.zoom = 1; + this.near = near; + this.far = far; + this.focus = 10; + this.aspect = aspect2; + this.view = null; + this.filmGauge = 35; + this.filmOffset = 0; + this.updateProjectionMatrix(); + } + copy(source, recursive) { + super.copy(source, recursive); + this.fov = source.fov; + this.zoom = source.zoom; + this.near = source.near; + this.far = source.far; + this.focus = source.focus; + this.aspect = source.aspect; + this.view = source.view === null ? null : Object.assign({}, source.view); + this.filmGauge = source.filmGauge; + this.filmOffset = source.filmOffset; + return this; + } + /** + * Sets the FOV by focal length in respect to the current .filmGauge. + * + * The default film gauge is 35, so that the focal length can be specified for + * a 35mm (full frame) camera. + * + * Values for focal length and film gauge must have the same unit. + */ + setFocalLength(focalLength) { + const vExtentSlope = 0.5 * this.getFilmHeight() / focalLength; + this.fov = RAD2DEG * 2 * Math.atan(vExtentSlope); + this.updateProjectionMatrix(); + } + /** + * Calculates the focal length from the current .fov and .filmGauge. + */ + getFocalLength() { + const vExtentSlope = Math.tan(DEG2RAD * 0.5 * this.fov); + return 0.5 * this.getFilmHeight() / vExtentSlope; + } + getEffectiveFOV() { + return RAD2DEG * 2 * Math.atan( + Math.tan(DEG2RAD * 0.5 * this.fov) / this.zoom + ); + } + getFilmWidth() { + return this.filmGauge * Math.min(this.aspect, 1); + } + getFilmHeight() { + return this.filmGauge / Math.max(this.aspect, 1); + } + /** + * Computes the 2D bounds of the camera's viewable rectangle at a given distance along the viewing direction. + * Sets minTarget and maxTarget to the coordinates of the lower-left and upper-right corners of the view rectangle. + */ + getViewBounds(distance, minTarget, maxTarget) { + _v3$1.set(-1, -1, 0.5).applyMatrix4(this.projectionMatrixInverse); + minTarget.set(_v3$1.x, _v3$1.y).multiplyScalar(-distance / _v3$1.z); + _v3$1.set(1, 1, 0.5).applyMatrix4(this.projectionMatrixInverse); + maxTarget.set(_v3$1.x, _v3$1.y).multiplyScalar(-distance / _v3$1.z); + } + /** + * Computes the width and height of the camera's viewable rectangle at a given distance along the viewing direction. + * Copies the result into the target Vector2, where x is width and y is height. + */ + getViewSize(distance, target) { + this.getViewBounds(distance, _minTarget, _maxTarget); + return target.subVectors(_maxTarget, _minTarget); + } + /** + * Sets an offset in a larger frustum. This is useful for multi-window or + * multi-monitor/multi-machine setups. + * + * For example, if you have 3x2 monitors and each monitor is 1920x1080 and + * the monitors are in grid like this + * + * +---+---+---+ + * | A | B | C | + * +---+---+---+ + * | D | E | F | + * +---+---+---+ + * + * then for each monitor you would call it like this + * + * const w = 1920; + * const h = 1080; + * const fullWidth = w * 3; + * const fullHeight = h * 2; + * + * --A-- + * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 0, w, h ); + * --B-- + * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 0, w, h ); + * --C-- + * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 0, w, h ); + * --D-- + * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 1, w, h ); + * --E-- + * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 1, w, h ); + * --F-- + * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 1, w, h ); + * + * Note there is no reason monitors have to be the same size or in a grid. + */ + setViewOffset(fullWidth, fullHeight, x, y, width, height) { + this.aspect = fullWidth / fullHeight; + if (this.view === null) { + this.view = { + enabled: true, + fullWidth: 1, + fullHeight: 1, + offsetX: 0, + offsetY: 0, + width: 1, + height: 1 + }; + } + this.view.enabled = true; + this.view.fullWidth = fullWidth; + this.view.fullHeight = fullHeight; + this.view.offsetX = x; + this.view.offsetY = y; + this.view.width = width; + this.view.height = height; + this.updateProjectionMatrix(); + } + clearViewOffset() { + if (this.view !== null) { + this.view.enabled = false; + } + this.updateProjectionMatrix(); + } + updateProjectionMatrix() { + const near = this.near; + let top = near * Math.tan(DEG2RAD * 0.5 * this.fov) / this.zoom; + let height = 2 * top; + let width = this.aspect * height; + let left = -0.5 * width; + const view = this.view; + if (this.view !== null && this.view.enabled) { + const fullWidth = view.fullWidth, fullHeight = view.fullHeight; + left += view.offsetX * width / fullWidth; + top -= view.offsetY * height / fullHeight; + width *= view.width / fullWidth; + height *= view.height / fullHeight; + } + const skew = this.filmOffset; + if (skew !== 0) left += near * skew / this.getFilmWidth(); + this.projectionMatrix.makePerspective(left, left + width, top, top - height, near, this.far, this.coordinateSystem); + this.projectionMatrixInverse.copy(this.projectionMatrix).invert(); + } + toJSON(meta) { + const data = super.toJSON(meta); + data.object.fov = this.fov; + data.object.zoom = this.zoom; + data.object.near = this.near; + data.object.far = this.far; + data.object.focus = this.focus; + data.object.aspect = this.aspect; + if (this.view !== null) data.object.view = Object.assign({}, this.view); + data.object.filmGauge = this.filmGauge; + data.object.filmOffset = this.filmOffset; + return data; + } +} +const fov = -90; +const aspect = 1; +class CubeCamera extends Object3D { + static { + __name(this, "CubeCamera"); + } + constructor(near, far, renderTarget) { + super(); + this.type = "CubeCamera"; + this.renderTarget = renderTarget; + this.coordinateSystem = null; + this.activeMipmapLevel = 0; + const cameraPX = new PerspectiveCamera(fov, aspect, near, far); + cameraPX.layers = this.layers; + this.add(cameraPX); + const cameraNX = new PerspectiveCamera(fov, aspect, near, far); + cameraNX.layers = this.layers; + this.add(cameraNX); + const cameraPY = new PerspectiveCamera(fov, aspect, near, far); + cameraPY.layers = this.layers; + this.add(cameraPY); + const cameraNY = new PerspectiveCamera(fov, aspect, near, far); + cameraNY.layers = this.layers; + this.add(cameraNY); + const cameraPZ = new PerspectiveCamera(fov, aspect, near, far); + cameraPZ.layers = this.layers; + this.add(cameraPZ); + const cameraNZ = new PerspectiveCamera(fov, aspect, near, far); + cameraNZ.layers = this.layers; + this.add(cameraNZ); + } + updateCoordinateSystem() { + const coordinateSystem = this.coordinateSystem; + const cameras = this.children.concat(); + const [cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ] = cameras; + for (const camera of cameras) this.remove(camera); + if (coordinateSystem === WebGLCoordinateSystem) { + cameraPX.up.set(0, 1, 0); + cameraPX.lookAt(1, 0, 0); + cameraNX.up.set(0, 1, 0); + cameraNX.lookAt(-1, 0, 0); + cameraPY.up.set(0, 0, -1); + cameraPY.lookAt(0, 1, 0); + cameraNY.up.set(0, 0, 1); + cameraNY.lookAt(0, -1, 0); + cameraPZ.up.set(0, 1, 0); + cameraPZ.lookAt(0, 0, 1); + cameraNZ.up.set(0, 1, 0); + cameraNZ.lookAt(0, 0, -1); + } else if (coordinateSystem === WebGPUCoordinateSystem) { + cameraPX.up.set(0, -1, 0); + cameraPX.lookAt(-1, 0, 0); + cameraNX.up.set(0, -1, 0); + cameraNX.lookAt(1, 0, 0); + cameraPY.up.set(0, 0, 1); + cameraPY.lookAt(0, 1, 0); + cameraNY.up.set(0, 0, -1); + cameraNY.lookAt(0, -1, 0); + cameraPZ.up.set(0, -1, 0); + cameraPZ.lookAt(0, 0, 1); + cameraNZ.up.set(0, -1, 0); + cameraNZ.lookAt(0, 0, -1); + } else { + throw new Error("THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: " + coordinateSystem); + } + for (const camera of cameras) { + this.add(camera); + camera.updateMatrixWorld(); } - __name(getUniformList, "getUniformList"); - function updateCommonMaterialProperties(material, parameters2) { - const materialProperties = properties.get(material); - materialProperties.outputColorSpace = parameters2.outputColorSpace; - materialProperties.batching = parameters2.batching; - materialProperties.batchingColor = parameters2.batchingColor; - materialProperties.instancing = parameters2.instancing; - materialProperties.instancingColor = parameters2.instancingColor; - materialProperties.instancingMorph = parameters2.instancingMorph; - materialProperties.skinning = parameters2.skinning; - materialProperties.morphTargets = parameters2.morphTargets; - materialProperties.morphNormals = parameters2.morphNormals; - materialProperties.morphColors = parameters2.morphColors; - materialProperties.morphTargetsCount = parameters2.morphTargetsCount; - materialProperties.numClippingPlanes = parameters2.numClippingPlanes; - materialProperties.numIntersection = parameters2.numClipIntersection; - materialProperties.vertexAlphas = parameters2.vertexAlphas; - materialProperties.vertexTangents = parameters2.vertexTangents; - materialProperties.toneMapping = parameters2.toneMapping; + } + update(renderer, scene) { + if (this.parent === null) this.updateMatrixWorld(); + const { renderTarget, activeMipmapLevel } = this; + if (this.coordinateSystem !== renderer.coordinateSystem) { + this.coordinateSystem = renderer.coordinateSystem; + this.updateCoordinateSystem(); } - __name(updateCommonMaterialProperties, "updateCommonMaterialProperties"); - function setProgram(camera, scene, geometry, material, object) { - if (scene.isScene !== true) scene = _emptyScene; - textures.resetTextureUnits(); - const fog = scene.fog; - const environment = material.isMeshStandardMaterial ? scene.environment : null; - const colorSpace = _currentRenderTarget === null ? _this.outputColorSpace : _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace; - const envMap = (material.isMeshStandardMaterial ? cubeuvmaps : cubemaps).get(material.envMap || environment); - const vertexAlphas = material.vertexColors === true && !!geometry.attributes.color && geometry.attributes.color.itemSize === 4; - const vertexTangents = !!geometry.attributes.tangent && (!!material.normalMap || material.anisotropy > 0); - const morphTargets = !!geometry.morphAttributes.position; - const morphNormals = !!geometry.morphAttributes.normal; - const morphColors = !!geometry.morphAttributes.color; - let toneMapping = NoToneMapping; - if (material.toneMapped) { - if (_currentRenderTarget === null || _currentRenderTarget.isXRRenderTarget === true) { - toneMapping = _this.toneMapping; - } - } - const morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color; - const morphTargetsCount = morphAttribute !== void 0 ? morphAttribute.length : 0; - const materialProperties = properties.get(material); - const lights = currentRenderState.state.lights; - if (_clippingEnabled === true) { - if (_localClippingEnabled === true || camera !== _currentCamera) { - const useCache = camera === _currentCamera && material.id === _currentMaterialId; - clipping.setState(material, camera, useCache); - } - } - let needsProgramChange = false; - if (material.version === materialProperties.__version) { - if (materialProperties.needsLights && materialProperties.lightsStateVersion !== lights.state.version) { - needsProgramChange = true; - } else if (materialProperties.outputColorSpace !== colorSpace) { - needsProgramChange = true; - } else if (object.isBatchedMesh && materialProperties.batching === false) { - needsProgramChange = true; - } else if (!object.isBatchedMesh && materialProperties.batching === true) { - needsProgramChange = true; - } else if (object.isBatchedMesh && materialProperties.batchingColor === true && object.colorTexture === null) { - needsProgramChange = true; - } else if (object.isBatchedMesh && materialProperties.batchingColor === false && object.colorTexture !== null) { - needsProgramChange = true; - } else if (object.isInstancedMesh && materialProperties.instancing === false) { - needsProgramChange = true; - } else if (!object.isInstancedMesh && materialProperties.instancing === true) { - needsProgramChange = true; - } else if (object.isSkinnedMesh && materialProperties.skinning === false) { - needsProgramChange = true; - } else if (!object.isSkinnedMesh && materialProperties.skinning === true) { - needsProgramChange = true; - } else if (object.isInstancedMesh && materialProperties.instancingColor === true && object.instanceColor === null) { - needsProgramChange = true; - } else if (object.isInstancedMesh && materialProperties.instancingColor === false && object.instanceColor !== null) { - needsProgramChange = true; - } else if (object.isInstancedMesh && materialProperties.instancingMorph === true && object.morphTexture === null) { - needsProgramChange = true; - } else if (object.isInstancedMesh && materialProperties.instancingMorph === false && object.morphTexture !== null) { - needsProgramChange = true; - } else if (materialProperties.envMap !== envMap) { - needsProgramChange = true; - } else if (material.fog === true && materialProperties.fog !== fog) { - needsProgramChange = true; - } else if (materialProperties.numClippingPlanes !== void 0 && (materialProperties.numClippingPlanes !== clipping.numPlanes || materialProperties.numIntersection !== clipping.numIntersection)) { - needsProgramChange = true; - } else if (materialProperties.vertexAlphas !== vertexAlphas) { - needsProgramChange = true; - } else if (materialProperties.vertexTangents !== vertexTangents) { - needsProgramChange = true; - } else if (materialProperties.morphTargets !== morphTargets) { - needsProgramChange = true; - } else if (materialProperties.morphNormals !== morphNormals) { - needsProgramChange = true; - } else if (materialProperties.morphColors !== morphColors) { - needsProgramChange = true; - } else if (materialProperties.toneMapping !== toneMapping) { - needsProgramChange = true; - } else if (materialProperties.morphTargetsCount !== morphTargetsCount) { - needsProgramChange = true; - } - } else { - needsProgramChange = true; - materialProperties.__version = material.version; - } - let program = materialProperties.currentProgram; - if (needsProgramChange === true) { - program = getProgram(material, scene, object); - } - let refreshProgram = false; - let refreshMaterial = false; - let refreshLights = false; - const p_uniforms = program.getUniforms(), m_uniforms = materialProperties.uniforms; - if (state.useProgram(program.program)) { - refreshProgram = true; - refreshMaterial = true; - refreshLights = true; - } - if (material.id !== _currentMaterialId) { - _currentMaterialId = material.id; - refreshMaterial = true; - } - if (refreshProgram || _currentCamera !== camera) { - const reverseDepthBuffer2 = state.buffers.depth.getReversed(); - if (reverseDepthBuffer2) { - _currentProjectionMatrix.copy(camera.projectionMatrix); - toNormalizedProjectionMatrix(_currentProjectionMatrix); - toReversedProjectionMatrix(_currentProjectionMatrix); - p_uniforms.setValue(_gl, "projectionMatrix", _currentProjectionMatrix); - } else { - p_uniforms.setValue(_gl, "projectionMatrix", camera.projectionMatrix); - } - p_uniforms.setValue(_gl, "viewMatrix", camera.matrixWorldInverse); - const uCamPos = p_uniforms.map.cameraPosition; - if (uCamPos !== void 0) { - uCamPos.setValue(_gl, _vector32.setFromMatrixPosition(camera.matrixWorld)); - } - if (capabilities.logarithmicDepthBuffer) { - p_uniforms.setValue( - _gl, - "logDepthBufFC", - 2 / (Math.log(camera.far + 1) / Math.LN2) - ); - } - if (material.isMeshPhongMaterial || material.isMeshToonMaterial || material.isMeshLambertMaterial || material.isMeshBasicMaterial || material.isMeshStandardMaterial || material.isShaderMaterial) { - p_uniforms.setValue(_gl, "isOrthographic", camera.isOrthographicCamera === true); - } - if (_currentCamera !== camera) { - _currentCamera = camera; - refreshMaterial = true; - refreshLights = true; - } - } - if (object.isSkinnedMesh) { - p_uniforms.setOptional(_gl, object, "bindMatrix"); - p_uniforms.setOptional(_gl, object, "bindMatrixInverse"); - const skeleton = object.skeleton; - if (skeleton) { - if (skeleton.boneTexture === null) skeleton.computeBoneTexture(); - p_uniforms.setValue(_gl, "boneTexture", skeleton.boneTexture, textures); - } - } - if (object.isBatchedMesh) { - p_uniforms.setOptional(_gl, object, "batchingTexture"); - p_uniforms.setValue(_gl, "batchingTexture", object._matricesTexture, textures); - p_uniforms.setOptional(_gl, object, "batchingIdTexture"); - p_uniforms.setValue(_gl, "batchingIdTexture", object._indirectTexture, textures); - p_uniforms.setOptional(_gl, object, "batchingColorTexture"); - if (object._colorsTexture !== null) { - p_uniforms.setValue(_gl, "batchingColorTexture", object._colorsTexture, textures); - } - } - const morphAttributes = geometry.morphAttributes; - if (morphAttributes.position !== void 0 || morphAttributes.normal !== void 0 || morphAttributes.color !== void 0) { - morphtargets.update(object, geometry, program); - } - if (refreshMaterial || materialProperties.receiveShadow !== object.receiveShadow) { - materialProperties.receiveShadow = object.receiveShadow; - p_uniforms.setValue(_gl, "receiveShadow", object.receiveShadow); - } - if (material.isMeshGouraudMaterial && material.envMap !== null) { - m_uniforms.envMap.value = envMap; - m_uniforms.flipEnvMap.value = envMap.isCubeTexture && envMap.isRenderTargetTexture === false ? -1 : 1; - } - if (material.isMeshStandardMaterial && material.envMap === null && scene.environment !== null) { - m_uniforms.envMapIntensity.value = scene.environmentIntensity; - } - if (refreshMaterial) { - p_uniforms.setValue(_gl, "toneMappingExposure", _this.toneMappingExposure); - if (materialProperties.needsLights) { - markUniformsLightsNeedsUpdate(m_uniforms, refreshLights); - } - if (fog && material.fog === true) { - materials.refreshFogUniforms(m_uniforms, fog); - } - materials.refreshMaterialUniforms(m_uniforms, material, _pixelRatio, _height, currentRenderState.state.transmissionRenderTarget[camera.id]); - WebGLUniforms.upload(_gl, getUniformList(materialProperties), m_uniforms, textures); - } - if (material.isShaderMaterial && material.uniformsNeedUpdate === true) { - WebGLUniforms.upload(_gl, getUniformList(materialProperties), m_uniforms, textures); - material.uniformsNeedUpdate = false; - } - if (material.isSpriteMaterial) { - p_uniforms.setValue(_gl, "center", object.center); - } - p_uniforms.setValue(_gl, "modelViewMatrix", object.modelViewMatrix); - p_uniforms.setValue(_gl, "normalMatrix", object.normalMatrix); - p_uniforms.setValue(_gl, "modelMatrix", object.matrixWorld); - if (material.isShaderMaterial || material.isRawShaderMaterial) { - const groups = material.uniformsGroups; - for (let i = 0, l = groups.length; i < l; i++) { - const group = groups[i]; - uniformsGroups.update(group, program); - uniformsGroups.bind(group, program); - } + const [cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ] = this.children; + const currentRenderTarget = renderer.getRenderTarget(); + const currentActiveCubeFace = renderer.getActiveCubeFace(); + const currentActiveMipmapLevel = renderer.getActiveMipmapLevel(); + const currentXrEnabled = renderer.xr.enabled; + renderer.xr.enabled = false; + const generateMipmaps = renderTarget.texture.generateMipmaps; + renderTarget.texture.generateMipmaps = false; + renderer.setRenderTarget(renderTarget, 0, activeMipmapLevel); + renderer.render(scene, cameraPX); + renderer.setRenderTarget(renderTarget, 1, activeMipmapLevel); + renderer.render(scene, cameraNX); + renderer.setRenderTarget(renderTarget, 2, activeMipmapLevel); + renderer.render(scene, cameraPY); + renderer.setRenderTarget(renderTarget, 3, activeMipmapLevel); + renderer.render(scene, cameraNY); + renderer.setRenderTarget(renderTarget, 4, activeMipmapLevel); + renderer.render(scene, cameraPZ); + renderTarget.texture.generateMipmaps = generateMipmaps; + renderer.setRenderTarget(renderTarget, 5, activeMipmapLevel); + renderer.render(scene, cameraNZ); + renderer.setRenderTarget(currentRenderTarget, currentActiveCubeFace, currentActiveMipmapLevel); + renderer.xr.enabled = currentXrEnabled; + renderTarget.texture.needsPMREMUpdate = true; + } +} +class CubeTexture extends Texture { + static { + __name(this, "CubeTexture"); + } + constructor(images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace) { + images = images !== void 0 ? images : []; + mapping = mapping !== void 0 ? mapping : CubeReflectionMapping; + super(images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace); + this.isCubeTexture = true; + this.flipY = false; + } + get images() { + return this.image; + } + set images(value) { + this.image = value; + } +} +class WebGLCubeRenderTarget extends WebGLRenderTarget { + static { + __name(this, "WebGLCubeRenderTarget"); + } + constructor(size = 1, options = {}) { + super(size, size, options); + this.isWebGLCubeRenderTarget = true; + const image = { width: size, height: size, depth: 1 }; + const images = [image, image, image, image, image, image]; + this.texture = new CubeTexture(images, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.colorSpace); + this.texture.isRenderTargetTexture = true; + this.texture.generateMipmaps = options.generateMipmaps !== void 0 ? options.generateMipmaps : false; + this.texture.minFilter = options.minFilter !== void 0 ? options.minFilter : LinearFilter; + } + fromEquirectangularTexture(renderer, texture) { + this.texture.type = texture.type; + this.texture.colorSpace = texture.colorSpace; + this.texture.generateMipmaps = texture.generateMipmaps; + this.texture.minFilter = texture.minFilter; + this.texture.magFilter = texture.magFilter; + const shader = { + uniforms: { + tEquirect: { value: null } + }, + vertexShader: ( + /* glsl */ + ` + + varying vec3 vWorldDirection; + + vec3 transformDirection( in vec3 dir, in mat4 matrix ) { + + return normalize( ( matrix * vec4( dir, 0.0 ) ).xyz ); + + } + + void main() { + + vWorldDirection = transformDirection( position, modelMatrix ); + + #include + #include + + } + ` + ), + fragmentShader: ( + /* glsl */ + ` + + uniform sampler2D tEquirect; + + varying vec3 vWorldDirection; + + #include + + void main() { + + vec3 direction = normalize( vWorldDirection ); + + vec2 sampleUV = equirectUv( direction ); + + gl_FragColor = texture2D( tEquirect, sampleUV ); + + } + ` + ) + }; + const geometry = new BoxGeometry(5, 5, 5); + const material = new ShaderMaterial({ + name: "CubemapFromEquirect", + uniforms: cloneUniforms(shader.uniforms), + vertexShader: shader.vertexShader, + fragmentShader: shader.fragmentShader, + side: BackSide, + blending: NoBlending + }); + material.uniforms.tEquirect.value = texture; + const mesh = new Mesh(geometry, material); + const currentMinFilter = texture.minFilter; + if (texture.minFilter === LinearMipmapLinearFilter) texture.minFilter = LinearFilter; + const camera = new CubeCamera(1, 10, this); + camera.update(renderer, mesh); + texture.minFilter = currentMinFilter; + mesh.geometry.dispose(); + mesh.material.dispose(); + return this; + } + clear(renderer, color, depth, stencil) { + const currentRenderTarget = renderer.getRenderTarget(); + for (let i = 0; i < 6; i++) { + renderer.setRenderTarget(this, i); + renderer.clear(color, depth, stencil); + } + renderer.setRenderTarget(currentRenderTarget); + } +} +const _vector1 = /* @__PURE__ */ new Vector3(); +const _vector2 = /* @__PURE__ */ new Vector3(); +const _normalMatrix = /* @__PURE__ */ new Matrix3(); +class Plane { + static { + __name(this, "Plane"); + } + constructor(normal = new Vector3(1, 0, 0), constant = 0) { + this.isPlane = true; + this.normal = normal; + this.constant = constant; + } + set(normal, constant) { + this.normal.copy(normal); + this.constant = constant; + return this; + } + setComponents(x, y, z, w) { + this.normal.set(x, y, z); + this.constant = w; + return this; + } + setFromNormalAndCoplanarPoint(normal, point) { + this.normal.copy(normal); + this.constant = -point.dot(this.normal); + return this; + } + setFromCoplanarPoints(a, b, c) { + const normal = _vector1.subVectors(c, b).cross(_vector2.subVectors(a, b)).normalize(); + this.setFromNormalAndCoplanarPoint(normal, a); + return this; + } + copy(plane) { + this.normal.copy(plane.normal); + this.constant = plane.constant; + return this; + } + normalize() { + const inverseNormalLength = 1 / this.normal.length(); + this.normal.multiplyScalar(inverseNormalLength); + this.constant *= inverseNormalLength; + return this; + } + negate() { + this.constant *= -1; + this.normal.negate(); + return this; + } + distanceToPoint(point) { + return this.normal.dot(point) + this.constant; + } + distanceToSphere(sphere) { + return this.distanceToPoint(sphere.center) - sphere.radius; + } + projectPoint(point, target) { + return target.copy(point).addScaledVector(this.normal, -this.distanceToPoint(point)); + } + intersectLine(line, target) { + const direction = line.delta(_vector1); + const denominator = this.normal.dot(direction); + if (denominator === 0) { + if (this.distanceToPoint(line.start) === 0) { + return target.copy(line.start); } - return program; + return null; + } + const t2 = -(line.start.dot(this.normal) + this.constant) / denominator; + if (t2 < 0 || t2 > 1) { + return null; + } + return target.copy(line.start).addScaledVector(direction, t2); + } + intersectsLine(line) { + const startSign = this.distanceToPoint(line.start); + const endSign = this.distanceToPoint(line.end); + return startSign < 0 && endSign > 0 || endSign < 0 && startSign > 0; + } + intersectsBox(box) { + return box.intersectsPlane(this); + } + intersectsSphere(sphere) { + return sphere.intersectsPlane(this); + } + coplanarPoint(target) { + return target.copy(this.normal).multiplyScalar(-this.constant); + } + applyMatrix4(matrix, optionalNormalMatrix) { + const normalMatrix = optionalNormalMatrix || _normalMatrix.getNormalMatrix(matrix); + const referencePoint = this.coplanarPoint(_vector1).applyMatrix4(matrix); + const normal = this.normal.applyMatrix3(normalMatrix).normalize(); + this.constant = -referencePoint.dot(normal); + return this; + } + translate(offset) { + this.constant -= offset.dot(this.normal); + return this; + } + equals(plane) { + return plane.normal.equals(this.normal) && plane.constant === this.constant; + } + clone() { + return new this.constructor().copy(this); + } +} +const _sphere$5 = /* @__PURE__ */ new Sphere(); +const _vector$7 = /* @__PURE__ */ new Vector3(); +class Frustum { + static { + __name(this, "Frustum"); + } + constructor(p0 = new Plane(), p1 = new Plane(), p2 = new Plane(), p3 = new Plane(), p4 = new Plane(), p5 = new Plane()) { + this.planes = [p0, p1, p2, p3, p4, p5]; + } + set(p0, p1, p2, p3, p4, p5) { + const planes = this.planes; + planes[0].copy(p0); + planes[1].copy(p1); + planes[2].copy(p2); + planes[3].copy(p3); + planes[4].copy(p4); + planes[5].copy(p5); + return this; + } + copy(frustum) { + const planes = this.planes; + for (let i = 0; i < 6; i++) { + planes[i].copy(frustum.planes[i]); } - __name(setProgram, "setProgram"); - function markUniformsLightsNeedsUpdate(uniforms, value) { - uniforms.ambientLightColor.needsUpdate = value; - uniforms.lightProbe.needsUpdate = value; - uniforms.directionalLights.needsUpdate = value; - uniforms.directionalLightShadows.needsUpdate = value; - uniforms.pointLights.needsUpdate = value; - uniforms.pointLightShadows.needsUpdate = value; - uniforms.spotLights.needsUpdate = value; - uniforms.spotLightShadows.needsUpdate = value; - uniforms.rectAreaLights.needsUpdate = value; - uniforms.hemisphereLights.needsUpdate = value; + return this; + } + setFromProjectionMatrix(m, coordinateSystem = WebGLCoordinateSystem) { + const planes = this.planes; + const me = m.elements; + const me0 = me[0], me1 = me[1], me2 = me[2], me3 = me[3]; + const me4 = me[4], me5 = me[5], me6 = me[6], me7 = me[7]; + const me8 = me[8], me9 = me[9], me10 = me[10], me11 = me[11]; + const me12 = me[12], me13 = me[13], me14 = me[14], me15 = me[15]; + planes[0].setComponents(me3 - me0, me7 - me4, me11 - me8, me15 - me12).normalize(); + planes[1].setComponents(me3 + me0, me7 + me4, me11 + me8, me15 + me12).normalize(); + planes[2].setComponents(me3 + me1, me7 + me5, me11 + me9, me15 + me13).normalize(); + planes[3].setComponents(me3 - me1, me7 - me5, me11 - me9, me15 - me13).normalize(); + planes[4].setComponents(me3 - me2, me7 - me6, me11 - me10, me15 - me14).normalize(); + if (coordinateSystem === WebGLCoordinateSystem) { + planes[5].setComponents(me3 + me2, me7 + me6, me11 + me10, me15 + me14).normalize(); + } else if (coordinateSystem === WebGPUCoordinateSystem) { + planes[5].setComponents(me2, me6, me10, me14).normalize(); + } else { + throw new Error("THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: " + coordinateSystem); } - __name(markUniformsLightsNeedsUpdate, "markUniformsLightsNeedsUpdate"); - function materialNeedsLights(material) { - return material.isMeshLambertMaterial || material.isMeshToonMaterial || material.isMeshPhongMaterial || material.isMeshStandardMaterial || material.isShadowMaterial || material.isShaderMaterial && material.lights === true; + return this; + } + intersectsObject(object) { + if (object.boundingSphere !== void 0) { + if (object.boundingSphere === null) object.computeBoundingSphere(); + _sphere$5.copy(object.boundingSphere).applyMatrix4(object.matrixWorld); + } else { + const geometry = object.geometry; + if (geometry.boundingSphere === null) geometry.computeBoundingSphere(); + _sphere$5.copy(geometry.boundingSphere).applyMatrix4(object.matrixWorld); } - __name(materialNeedsLights, "materialNeedsLights"); - this.getActiveCubeFace = function() { - return _currentActiveCubeFace; - }; - this.getActiveMipmapLevel = function() { - return _currentActiveMipmapLevel; - }; - this.getRenderTarget = function() { - return _currentRenderTarget; - }; - this.setRenderTargetTextures = function(renderTarget, colorTexture, depthTexture) { - properties.get(renderTarget.texture).__webglTexture = colorTexture; - properties.get(renderTarget.depthTexture).__webglTexture = depthTexture; - const renderTargetProperties = properties.get(renderTarget); - renderTargetProperties.__hasExternalTextures = true; - renderTargetProperties.__autoAllocateDepthBuffer = depthTexture === void 0; - if (!renderTargetProperties.__autoAllocateDepthBuffer) { - if (extensions.has("WEBGL_multisampled_render_to_texture") === true) { - console.warn("THREE.WebGLRenderer: Render-to-texture extension was disabled because an external texture was provided"); - renderTargetProperties.__useRenderToTexture = false; - } + return this.intersectsSphere(_sphere$5); + } + intersectsSprite(sprite) { + _sphere$5.center.set(0, 0, 0); + _sphere$5.radius = 0.7071067811865476; + _sphere$5.applyMatrix4(sprite.matrixWorld); + return this.intersectsSphere(_sphere$5); + } + intersectsSphere(sphere) { + const planes = this.planes; + const center = sphere.center; + const negRadius = -sphere.radius; + for (let i = 0; i < 6; i++) { + const distance = planes[i].distanceToPoint(center); + if (distance < negRadius) { + return false; } - }; - this.setRenderTargetFramebuffer = function(renderTarget, defaultFramebuffer) { - const renderTargetProperties = properties.get(renderTarget); - renderTargetProperties.__webglFramebuffer = defaultFramebuffer; - renderTargetProperties.__useDefaultFramebuffer = defaultFramebuffer === void 0; - }; - this.setRenderTarget = function(renderTarget, activeCubeFace = 0, activeMipmapLevel = 0) { - _currentRenderTarget = renderTarget; - _currentActiveCubeFace = activeCubeFace; - _currentActiveMipmapLevel = activeMipmapLevel; - let useDefaultFramebuffer = true; - let framebuffer = null; - let isCube = false; - let isRenderTarget3D = false; - if (renderTarget) { - const renderTargetProperties = properties.get(renderTarget); - if (renderTargetProperties.__useDefaultFramebuffer !== void 0) { - state.bindFramebuffer(_gl.FRAMEBUFFER, null); - useDefaultFramebuffer = false; - } else if (renderTargetProperties.__webglFramebuffer === void 0) { - textures.setupRenderTarget(renderTarget); - } else if (renderTargetProperties.__hasExternalTextures) { - textures.rebindTextures(renderTarget, properties.get(renderTarget.texture).__webglTexture, properties.get(renderTarget.depthTexture).__webglTexture); - } else if (renderTarget.depthBuffer) { - const depthTexture = renderTarget.depthTexture; - if (renderTargetProperties.__boundDepthTexture !== depthTexture) { - if (depthTexture !== null && properties.has(depthTexture) && (renderTarget.width !== depthTexture.image.width || renderTarget.height !== depthTexture.image.height)) { - throw new Error("WebGLRenderTarget: Attached DepthTexture is initialized to the incorrect size."); - } - textures.setupDepthRenderbuffer(renderTarget); - } - } - const texture = renderTarget.texture; - if (texture.isData3DTexture || texture.isDataArrayTexture || texture.isCompressedArrayTexture) { - isRenderTarget3D = true; - } - const __webglFramebuffer = properties.get(renderTarget).__webglFramebuffer; - if (renderTarget.isWebGLCubeRenderTarget) { - if (Array.isArray(__webglFramebuffer[activeCubeFace])) { - framebuffer = __webglFramebuffer[activeCubeFace][activeMipmapLevel]; - } else { - framebuffer = __webglFramebuffer[activeCubeFace]; - } - isCube = true; - } else if (renderTarget.samples > 0 && textures.useMultisampledRTT(renderTarget) === false) { - framebuffer = properties.get(renderTarget).__webglMultisampledFramebuffer; - } else { - if (Array.isArray(__webglFramebuffer)) { - framebuffer = __webglFramebuffer[activeMipmapLevel]; - } else { - framebuffer = __webglFramebuffer; - } - } - _currentViewport.copy(renderTarget.viewport); - _currentScissor.copy(renderTarget.scissor); - _currentScissorTest = renderTarget.scissorTest; - } else { - _currentViewport.copy(_viewport).multiplyScalar(_pixelRatio).floor(); - _currentScissor.copy(_scissor).multiplyScalar(_pixelRatio).floor(); - _currentScissorTest = _scissorTest; + } + return true; + } + intersectsBox(box) { + const planes = this.planes; + for (let i = 0; i < 6; i++) { + const plane = planes[i]; + _vector$7.x = plane.normal.x > 0 ? box.max.x : box.min.x; + _vector$7.y = plane.normal.y > 0 ? box.max.y : box.min.y; + _vector$7.z = plane.normal.z > 0 ? box.max.z : box.min.z; + if (plane.distanceToPoint(_vector$7) < 0) { + return false; } - const framebufferBound = state.bindFramebuffer(_gl.FRAMEBUFFER, framebuffer); - if (framebufferBound && useDefaultFramebuffer) { - state.drawBuffers(renderTarget, framebuffer); + } + return true; + } + containsPoint(point) { + const planes = this.planes; + for (let i = 0; i < 6; i++) { + if (planes[i].distanceToPoint(point) < 0) { + return false; } - state.viewport(_currentViewport); - state.scissor(_currentScissor); - state.setScissorTest(_currentScissorTest); - if (isCube) { - const textureProperties = properties.get(renderTarget.texture); - _gl.framebufferTexture2D(_gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + activeCubeFace, textureProperties.__webglTexture, activeMipmapLevel); - } else if (isRenderTarget3D) { - const textureProperties = properties.get(renderTarget.texture); - const layer = activeCubeFace || 0; - _gl.framebufferTextureLayer(_gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, textureProperties.__webglTexture, activeMipmapLevel || 0, layer); + } + return true; + } + clone() { + return new this.constructor().copy(this); + } +} +function WebGLAnimation() { + let context = null; + let isAnimating = false; + let animationLoop = null; + let requestId = null; + function onAnimationFrame(time, frame) { + animationLoop(time, frame); + requestId = context.requestAnimationFrame(onAnimationFrame); + } + __name(onAnimationFrame, "onAnimationFrame"); + return { + start: /* @__PURE__ */ __name(function() { + if (isAnimating === true) return; + if (animationLoop === null) return; + requestId = context.requestAnimationFrame(onAnimationFrame); + isAnimating = true; + }, "start"), + stop: /* @__PURE__ */ __name(function() { + context.cancelAnimationFrame(requestId); + isAnimating = false; + }, "stop"), + setAnimationLoop: /* @__PURE__ */ __name(function(callback) { + animationLoop = callback; + }, "setAnimationLoop"), + setContext: /* @__PURE__ */ __name(function(value) { + context = value; + }, "setContext") + }; +} +__name(WebGLAnimation, "WebGLAnimation"); +function WebGLAttributes(gl) { + const buffers = /* @__PURE__ */ new WeakMap(); + function createBuffer(attribute, bufferType) { + const array = attribute.array; + const usage = attribute.usage; + const size = array.byteLength; + const buffer = gl.createBuffer(); + gl.bindBuffer(bufferType, buffer); + gl.bufferData(bufferType, array, usage); + attribute.onUploadCallback(); + let type; + if (array instanceof Float32Array) { + type = gl.FLOAT; + } else if (array instanceof Uint16Array) { + if (attribute.isFloat16BufferAttribute) { + type = gl.HALF_FLOAT; + } else { + type = gl.UNSIGNED_SHORT; } - _currentMaterialId = -1; + } else if (array instanceof Int16Array) { + type = gl.SHORT; + } else if (array instanceof Uint32Array) { + type = gl.UNSIGNED_INT; + } else if (array instanceof Int32Array) { + type = gl.INT; + } else if (array instanceof Int8Array) { + type = gl.BYTE; + } else if (array instanceof Uint8Array) { + type = gl.UNSIGNED_BYTE; + } else if (array instanceof Uint8ClampedArray) { + type = gl.UNSIGNED_BYTE; + } else { + throw new Error("THREE.WebGLAttributes: Unsupported buffer data format: " + array); + } + return { + buffer, + type, + bytesPerElement: array.BYTES_PER_ELEMENT, + version: attribute.version, + size }; - this.readRenderTargetPixels = function(renderTarget, x, y, width, height, buffer, activeCubeFaceIndex) { - if (!(renderTarget && renderTarget.isWebGLRenderTarget)) { - console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget."); - return; - } - let framebuffer = properties.get(renderTarget).__webglFramebuffer; - if (renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== void 0) { - framebuffer = framebuffer[activeCubeFaceIndex]; - } - if (framebuffer) { - state.bindFramebuffer(_gl.FRAMEBUFFER, framebuffer); - try { - const texture = renderTarget.texture; - const textureFormat = texture.format; - const textureType = texture.type; - if (!capabilities.textureFormatReadable(textureFormat)) { - console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format."); - return; - } - if (!capabilities.textureTypeReadable(textureType)) { - console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type."); - return; - } - if (x >= 0 && x <= renderTarget.width - width && (y >= 0 && y <= renderTarget.height - height)) { - _gl.readPixels(x, y, width, height, utils.convert(textureFormat), utils.convert(textureType), buffer); - } - } finally { - const framebuffer2 = _currentRenderTarget !== null ? properties.get(_currentRenderTarget).__webglFramebuffer : null; - state.bindFramebuffer(_gl.FRAMEBUFFER, framebuffer2); + } + __name(createBuffer, "createBuffer"); + function updateBuffer(buffer, attribute, bufferType) { + const array = attribute.array; + const updateRanges = attribute.updateRanges; + gl.bindBuffer(bufferType, buffer); + if (updateRanges.length === 0) { + gl.bufferSubData(bufferType, 0, array); + } else { + updateRanges.sort((a, b) => a.start - b.start); + let mergeIndex = 0; + for (let i = 1; i < updateRanges.length; i++) { + const previousRange = updateRanges[mergeIndex]; + const range = updateRanges[i]; + if (range.start <= previousRange.start + previousRange.count + 1) { + previousRange.count = Math.max( + previousRange.count, + range.start + range.count - previousRange.start + ); + } else { + ++mergeIndex; + updateRanges[mergeIndex] = range; } } - }; - this.readRenderTargetPixelsAsync = async function(renderTarget, x, y, width, height, buffer, activeCubeFaceIndex) { - if (!(renderTarget && renderTarget.isWebGLRenderTarget)) { - throw new Error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget."); + updateRanges.length = mergeIndex + 1; + for (let i = 0, l = updateRanges.length; i < l; i++) { + const range = updateRanges[i]; + gl.bufferSubData( + bufferType, + range.start * array.BYTES_PER_ELEMENT, + array, + range.start, + range.count + ); } - let framebuffer = properties.get(renderTarget).__webglFramebuffer; - if (renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== void 0) { - framebuffer = framebuffer[activeCubeFaceIndex]; + attribute.clearUpdateRanges(); + } + attribute.onUploadCallback(); + } + __name(updateBuffer, "updateBuffer"); + function get(attribute) { + if (attribute.isInterleavedBufferAttribute) attribute = attribute.data; + return buffers.get(attribute); + } + __name(get, "get"); + function remove(attribute) { + if (attribute.isInterleavedBufferAttribute) attribute = attribute.data; + const data = buffers.get(attribute); + if (data) { + gl.deleteBuffer(data.buffer); + buffers.delete(attribute); + } + } + __name(remove, "remove"); + function update(attribute, bufferType) { + if (attribute.isInterleavedBufferAttribute) attribute = attribute.data; + if (attribute.isGLBufferAttribute) { + const cached = buffers.get(attribute); + if (!cached || cached.version < attribute.version) { + buffers.set(attribute, { + buffer: attribute.buffer, + type: attribute.type, + bytesPerElement: attribute.elementSize, + version: attribute.version + }); } - if (framebuffer) { - const texture = renderTarget.texture; - const textureFormat = texture.format; - const textureType = texture.type; - if (!capabilities.textureFormatReadable(textureFormat)) { - throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format."); - } - if (!capabilities.textureTypeReadable(textureType)) { - throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type."); - } - if (x >= 0 && x <= renderTarget.width - width && (y >= 0 && y <= renderTarget.height - height)) { - state.bindFramebuffer(_gl.FRAMEBUFFER, framebuffer); - const glBuffer = _gl.createBuffer(); - _gl.bindBuffer(_gl.PIXEL_PACK_BUFFER, glBuffer); - _gl.bufferData(_gl.PIXEL_PACK_BUFFER, buffer.byteLength, _gl.STREAM_READ); - _gl.readPixels(x, y, width, height, utils.convert(textureFormat), utils.convert(textureType), 0); - const currFramebuffer = _currentRenderTarget !== null ? properties.get(_currentRenderTarget).__webglFramebuffer : null; - state.bindFramebuffer(_gl.FRAMEBUFFER, currFramebuffer); - const sync = _gl.fenceSync(_gl.SYNC_GPU_COMMANDS_COMPLETE, 0); - _gl.flush(); - await probeAsync(_gl, sync, 4); - _gl.bindBuffer(_gl.PIXEL_PACK_BUFFER, glBuffer); - _gl.getBufferSubData(_gl.PIXEL_PACK_BUFFER, 0, buffer); - _gl.deleteBuffer(glBuffer); - _gl.deleteSync(sync); - return buffer; - } else { - throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range."); - } + return; + } + const data = buffers.get(attribute); + if (data === void 0) { + buffers.set(attribute, createBuffer(attribute, bufferType)); + } else if (data.version < attribute.version) { + if (data.size !== attribute.array.byteLength) { + throw 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."); } + updateBuffer(data.buffer, attribute, bufferType); + data.version = attribute.version; + } + } + __name(update, "update"); + return { + get, + remove, + update + }; +} +__name(WebGLAttributes, "WebGLAttributes"); +class PlaneGeometry extends BufferGeometry { + static { + __name(this, "PlaneGeometry"); + } + constructor(width = 1, height = 1, widthSegments = 1, heightSegments = 1) { + super(); + this.type = "PlaneGeometry"; + this.parameters = { + width, + height, + widthSegments, + heightSegments }; - this.copyFramebufferToTexture = function(texture, position = null, level = 0) { - if (texture.isTexture !== true) { - warnOnce("WebGLRenderer: copyFramebufferToTexture function signature has changed."); - position = arguments[0] || null; - texture = arguments[1]; + const width_half = width / 2; + const height_half = height / 2; + const gridX = Math.floor(widthSegments); + const gridY = Math.floor(heightSegments); + const gridX1 = gridX + 1; + const gridY1 = gridY + 1; + const segment_width = width / gridX; + const segment_height = height / gridY; + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + for (let iy = 0; iy < gridY1; iy++) { + const y = iy * segment_height - height_half; + for (let ix = 0; ix < gridX1; ix++) { + const x = ix * segment_width - width_half; + vertices.push(x, -y, 0); + normals.push(0, 0, 1); + uvs.push(ix / gridX); + uvs.push(1 - iy / gridY); } - const levelScale = Math.pow(2, -level); - const width = Math.floor(texture.image.width * levelScale); - const height = Math.floor(texture.image.height * levelScale); - const x = position !== null ? position.x : 0; - const y = position !== null ? position.y : 0; - textures.setTexture2D(texture, 0); - _gl.copyTexSubImage2D(_gl.TEXTURE_2D, level, 0, 0, x, y, width, height); - state.unbindTexture(); - }; - this.copyTextureToTexture = function(srcTexture, dstTexture, srcRegion = null, dstPosition = null, level = 0) { - if (srcTexture.isTexture !== true) { - warnOnce("WebGLRenderer: copyTextureToTexture function signature has changed."); - dstPosition = arguments[0] || null; - srcTexture = arguments[1]; - dstTexture = arguments[2]; - level = arguments[3] || 0; - srcRegion = null; + } + for (let iy = 0; iy < gridY; iy++) { + for (let ix = 0; ix < gridX; ix++) { + const a = ix + gridX1 * iy; + const b = ix + gridX1 * (iy + 1); + const c = ix + 1 + gridX1 * (iy + 1); + const d = ix + 1 + gridX1 * iy; + indices.push(a, b, d); + indices.push(b, c, d); + } + } + this.setIndex(indices); + this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + this.setAttribute("normal", new Float32BufferAttribute(normals, 3)); + this.setAttribute("uv", new Float32BufferAttribute(uvs, 2)); + } + copy(source) { + super.copy(source); + this.parameters = Object.assign({}, source.parameters); + return this; + } + static fromJSON(data) { + return new PlaneGeometry(data.width, data.height, data.widthSegments, data.heightSegments); + } +} +var alphahash_fragment = "#ifdef USE_ALPHAHASH\n if ( diffuseColor.a < getAlphaHashThreshold( vPosition ) ) discard;\n#endif"; +var alphahash_pars_fragment = "#ifdef USE_ALPHAHASH\n const float ALPHA_HASH_SCALE = 0.05;\n float hash2D( vec2 value ) {\n return fract( 1.0e4 * sin( 17.0 * value.x + 0.1 * value.y ) * ( 0.1 + abs( sin( 13.0 * value.y + value.x ) ) ) );\n }\n float hash3D( vec3 value ) {\n return hash2D( vec2( hash2D( value.xy ), value.z ) );\n }\n float getAlphaHashThreshold( vec3 position ) {\n float maxDeriv = max(\n length( dFdx( position.xyz ) ),\n length( dFdy( position.xyz ) )\n );\n float pixScale = 1.0 / ( ALPHA_HASH_SCALE * maxDeriv );\n vec2 pixScales = vec2(\n exp2( floor( log2( pixScale ) ) ),\n exp2( ceil( log2( pixScale ) ) )\n );\n vec2 alpha = vec2(\n hash3D( floor( pixScales.x * position.xyz ) ),\n hash3D( floor( pixScales.y * position.xyz ) )\n );\n float lerpFactor = fract( log2( pixScale ) );\n float x = ( 1.0 - lerpFactor ) * alpha.x + lerpFactor * alpha.y;\n float a = min( lerpFactor, 1.0 - lerpFactor );\n vec3 cases = vec3(\n x * x / ( 2.0 * a * ( 1.0 - a ) ),\n ( x - 0.5 * a ) / ( 1.0 - a ),\n 1.0 - ( ( 1.0 - x ) * ( 1.0 - x ) / ( 2.0 * a * ( 1.0 - a ) ) )\n );\n float threshold = ( x < ( 1.0 - a ) )\n ? ( ( x < a ) ? cases.x : cases.y )\n : cases.z;\n return clamp( threshold , 1.0e-6, 1.0 );\n }\n#endif"; +var alphamap_fragment = "#ifdef USE_ALPHAMAP\n diffuseColor.a *= texture2D( alphaMap, vAlphaMapUv ).g;\n#endif"; +var alphamap_pars_fragment = "#ifdef USE_ALPHAMAP\n uniform sampler2D alphaMap;\n#endif"; +var alphatest_fragment = "#ifdef USE_ALPHATEST\n #ifdef ALPHA_TO_COVERAGE\n diffuseColor.a = smoothstep( alphaTest, alphaTest + fwidth( diffuseColor.a ), diffuseColor.a );\n if ( diffuseColor.a == 0.0 ) discard;\n #else\n if ( diffuseColor.a < alphaTest ) discard;\n #endif\n#endif"; +var alphatest_pars_fragment = "#ifdef USE_ALPHATEST\n uniform float alphaTest;\n#endif"; +var aomap_fragment = "#ifdef USE_AOMAP\n float ambientOcclusion = ( texture2D( aoMap, vAoMapUv ).r - 1.0 ) * aoMapIntensity + 1.0;\n reflectedLight.indirectDiffuse *= ambientOcclusion;\n #if defined( USE_CLEARCOAT ) \n clearcoatSpecularIndirect *= ambientOcclusion;\n #endif\n #if defined( USE_SHEEN ) \n sheenSpecularIndirect *= ambientOcclusion;\n #endif\n #if defined( USE_ENVMAP ) && defined( STANDARD )\n float dotNV = saturate( dot( geometryNormal, geometryViewDir ) );\n reflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\n #endif\n#endif"; +var aomap_pars_fragment = "#ifdef USE_AOMAP\n uniform sampler2D aoMap;\n uniform float aoMapIntensity;\n#endif"; +var batching_pars_vertex = "#ifdef USE_BATCHING\n #if ! defined( GL_ANGLE_multi_draw )\n #define gl_DrawID _gl_DrawID\n uniform int _gl_DrawID;\n #endif\n uniform highp sampler2D batchingTexture;\n uniform highp usampler2D batchingIdTexture;\n mat4 getBatchingMatrix( const in float i ) {\n int size = textureSize( batchingTexture, 0 ).x;\n int j = int( i ) * 4;\n int x = j % size;\n int y = j / size;\n vec4 v1 = texelFetch( batchingTexture, ivec2( x, y ), 0 );\n vec4 v2 = texelFetch( batchingTexture, ivec2( x + 1, y ), 0 );\n vec4 v3 = texelFetch( batchingTexture, ivec2( x + 2, y ), 0 );\n vec4 v4 = texelFetch( batchingTexture, ivec2( x + 3, y ), 0 );\n return mat4( v1, v2, v3, v4 );\n }\n float getIndirectIndex( const in int i ) {\n int size = textureSize( batchingIdTexture, 0 ).x;\n int x = i % size;\n int y = i / size;\n return float( texelFetch( batchingIdTexture, ivec2( x, y ), 0 ).r );\n }\n#endif\n#ifdef USE_BATCHING_COLOR\n uniform sampler2D batchingColorTexture;\n vec3 getBatchingColor( const in float i ) {\n int size = textureSize( batchingColorTexture, 0 ).x;\n int j = int( i );\n int x = j % size;\n int y = j / size;\n return texelFetch( batchingColorTexture, ivec2( x, y ), 0 ).rgb;\n }\n#endif"; +var batching_vertex = "#ifdef USE_BATCHING\n mat4 batchingMatrix = getBatchingMatrix( getIndirectIndex( gl_DrawID ) );\n#endif"; +var begin_vertex = "vec3 transformed = vec3( position );\n#ifdef USE_ALPHAHASH\n vPosition = vec3( position );\n#endif"; +var beginnormal_vertex = "vec3 objectNormal = vec3( normal );\n#ifdef USE_TANGENT\n vec3 objectTangent = vec3( tangent.xyz );\n#endif"; +var bsdfs = "float G_BlinnPhong_Implicit( ) {\n return 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n return 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 vec3 halfDir = normalize( lightDir + viewDir );\n float dotNH = saturate( dot( normal, halfDir ) );\n float dotVH = saturate( dot( viewDir, halfDir ) );\n vec3 F = F_Schlick( specularColor, 1.0, dotVH );\n float G = G_BlinnPhong_Implicit( );\n float D = D_BlinnPhong( shininess, dotNH );\n return F * ( G * D );\n} // validated"; +var iridescence_fragment = "#ifdef USE_IRIDESCENCE\n const mat3 XYZ_TO_REC709 = mat3(\n 3.2404542, -0.9692660, 0.0556434,\n -1.5371385, 1.8760108, -0.2040259,\n -0.4985314, 0.0415560, 1.0572252\n );\n vec3 Fresnel0ToIor( vec3 fresnel0 ) {\n vec3 sqrtF0 = sqrt( fresnel0 );\n return ( vec3( 1.0 ) + sqrtF0 ) / ( vec3( 1.0 ) - sqrtF0 );\n }\n vec3 IorToFresnel0( vec3 transmittedIor, float incidentIor ) {\n return pow2( ( transmittedIor - vec3( incidentIor ) ) / ( transmittedIor + vec3( incidentIor ) ) );\n }\n float IorToFresnel0( float transmittedIor, float incidentIor ) {\n return pow2( ( transmittedIor - incidentIor ) / ( transmittedIor + incidentIor ));\n }\n vec3 evalSensitivity( float OPD, vec3 shift ) {\n float phase = 2.0 * PI * OPD * 1.0e-9;\n vec3 val = vec3( 5.4856e-13, 4.4201e-13, 5.2481e-13 );\n vec3 pos = vec3( 1.6810e+06, 1.7953e+06, 2.2084e+06 );\n vec3 var = vec3( 4.3278e+09, 9.3046e+09, 6.6121e+09 );\n vec3 xyz = val * sqrt( 2.0 * PI * var ) * cos( pos * phase + shift ) * exp( - pow2( phase ) * var );\n xyz.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 xyz /= 1.0685e-7;\n vec3 rgb = XYZ_TO_REC709 * xyz;\n return rgb;\n }\n vec3 evalIridescence( float outsideIOR, float eta2, float cosTheta1, float thinFilmThickness, vec3 baseF0 ) {\n vec3 I;\n float iridescenceIOR = mix( outsideIOR, eta2, smoothstep( 0.0, 0.03, thinFilmThickness ) );\n float sinTheta2Sq = pow2( outsideIOR / iridescenceIOR ) * ( 1.0 - pow2( cosTheta1 ) );\n float cosTheta2Sq = 1.0 - sinTheta2Sq;\n if ( cosTheta2Sq < 0.0 ) {\n return vec3( 1.0 );\n }\n float cosTheta2 = sqrt( cosTheta2Sq );\n float R0 = IorToFresnel0( iridescenceIOR, outsideIOR );\n float R12 = F_Schlick( R0, 1.0, cosTheta1 );\n float T121 = 1.0 - R12;\n float phi12 = 0.0;\n if ( iridescenceIOR < outsideIOR ) phi12 = PI;\n float phi21 = PI - phi12;\n vec3 baseIOR = Fresnel0ToIor( clamp( baseF0, 0.0, 0.9999 ) ); vec3 R1 = IorToFresnel0( baseIOR, iridescenceIOR );\n vec3 R23 = F_Schlick( R1, 1.0, cosTheta2 );\n vec3 phi23 = vec3( 0.0 );\n if ( baseIOR[ 0 ] < iridescenceIOR ) phi23[ 0 ] = PI;\n if ( baseIOR[ 1 ] < iridescenceIOR ) phi23[ 1 ] = PI;\n if ( baseIOR[ 2 ] < iridescenceIOR ) phi23[ 2 ] = PI;\n float OPD = 2.0 * iridescenceIOR * thinFilmThickness * cosTheta2;\n vec3 phi = vec3( phi21 ) + phi23;\n vec3 R123 = clamp( R12 * R23, 1e-5, 0.9999 );\n vec3 r123 = sqrt( R123 );\n vec3 Rs = pow2( T121 ) * R23 / ( vec3( 1.0 ) - R123 );\n vec3 C0 = R12 + Rs;\n I = C0;\n vec3 Cm = Rs - T121;\n for ( int m = 1; m <= 2; ++ m ) {\n Cm *= r123;\n vec3 Sm = 2.0 * evalSensitivity( float( m ) * OPD, float( m ) * phi );\n I += Cm * Sm;\n }\n return max( I, vec3( 0.0 ) );\n }\n#endif"; +var bumpmap_pars_fragment = "#ifdef USE_BUMPMAP\n uniform sampler2D bumpMap;\n uniform float bumpScale;\n vec2 dHdxy_fwd() {\n vec2 dSTdx = dFdx( vBumpMapUv );\n vec2 dSTdy = dFdy( vBumpMapUv );\n float Hll = bumpScale * texture2D( bumpMap, vBumpMapUv ).x;\n float dBx = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdx ).x - Hll;\n float dBy = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdy ).x - Hll;\n return vec2( dBx, dBy );\n }\n vec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\n vec3 vSigmaX = normalize( dFdx( surf_pos.xyz ) );\n vec3 vSigmaY = normalize( dFdy( surf_pos.xyz ) );\n vec3 vN = surf_norm;\n vec3 R1 = cross( vSigmaY, vN );\n vec3 R2 = cross( vN, vSigmaX );\n float fDet = dot( vSigmaX, R1 ) * faceDirection;\n vec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n return normalize( abs( fDet ) * surf_norm - vGrad );\n }\n#endif"; +var clipping_planes_fragment = "#if NUM_CLIPPING_PLANES > 0\n vec4 plane;\n #ifdef ALPHA_TO_COVERAGE\n float distanceToPlane, distanceGradient;\n float clipOpacity = 1.0;\n #pragma unroll_loop_start\n for ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n distanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n distanceGradient = fwidth( distanceToPlane ) / 2.0;\n clipOpacity *= smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n if ( clipOpacity == 0.0 ) discard;\n }\n #pragma unroll_loop_end\n #if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n float unionClipOpacity = 1.0;\n #pragma unroll_loop_start\n for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n distanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n distanceGradient = fwidth( distanceToPlane ) / 2.0;\n unionClipOpacity *= 1.0 - smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n }\n #pragma unroll_loop_end\n clipOpacity *= 1.0 - unionClipOpacity;\n #endif\n diffuseColor.a *= clipOpacity;\n if ( diffuseColor.a == 0.0 ) discard;\n #else\n #pragma unroll_loop_start\n for ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n if ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n }\n #pragma unroll_loop_end\n #if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n bool clipped = true;\n #pragma unroll_loop_start\n for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n clipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n }\n #pragma unroll_loop_end\n if ( clipped ) discard;\n #endif\n #endif\n#endif"; +var clipping_planes_pars_fragment = "#if NUM_CLIPPING_PLANES > 0\n varying vec3 vClipPosition;\n uniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif"; +var clipping_planes_pars_vertex = "#if NUM_CLIPPING_PLANES > 0\n varying vec3 vClipPosition;\n#endif"; +var clipping_planes_vertex = "#if NUM_CLIPPING_PLANES > 0\n vClipPosition = - mvPosition.xyz;\n#endif"; +var color_fragment = "#if defined( USE_COLOR_ALPHA )\n diffuseColor *= vColor;\n#elif defined( USE_COLOR )\n diffuseColor.rgb *= vColor;\n#endif"; +var color_pars_fragment = "#if defined( USE_COLOR_ALPHA )\n varying vec4 vColor;\n#elif defined( USE_COLOR )\n varying vec3 vColor;\n#endif"; +var color_pars_vertex = "#if defined( USE_COLOR_ALPHA )\n varying vec4 vColor;\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n varying vec3 vColor;\n#endif"; +var color_vertex = "#if defined( USE_COLOR_ALPHA )\n vColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n vColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n vColor *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n vColor.xyz *= instanceColor.xyz;\n#endif\n#ifdef USE_BATCHING_COLOR\n vec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) );\n vColor.xyz *= batchingColor.xyz;\n#endif"; +var 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 const highp float a = 12.9898, b = 78.233, c = 43758.5453;\n highp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n return fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n float precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n float precisionSafeLength( vec3 v ) {\n float maxComponent = max3( abs( v ) );\n return length( v / maxComponent ) * maxComponent;\n }\n#endif\nstruct IncidentLight {\n vec3 color;\n vec3 direction;\n bool visible;\n};\nstruct ReflectedLight {\n vec3 directDiffuse;\n vec3 directSpecular;\n vec3 indirectDiffuse;\n vec3 indirectSpecular;\n};\n#ifdef USE_ALPHAHASH\n varying vec3 vPosition;\n#endif\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n return normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n return normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nmat3 transposeMat3( const in mat3 m ) {\n mat3 tmp;\n tmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n tmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n tmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n return tmp;\n}\nbool isPerspectiveMatrix( mat4 m ) {\n return m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n float u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n float v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n return vec2( u, v );\n}\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\n return RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\n float fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n return f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n}\nfloat F_Schlick( const in float f0, const in float f90, const in float dotVH ) {\n float fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n return f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n} // validated"; +var cube_uv_reflection_fragment = "#ifdef ENVMAP_TYPE_CUBE_UV\n #define cubeUV_minMipLevel 4.0\n #define cubeUV_minTileSize 16.0\n float getFace( vec3 direction ) {\n vec3 absDirection = abs( direction );\n float face = - 1.0;\n if ( absDirection.x > absDirection.z ) {\n if ( absDirection.x > absDirection.y )\n face = direction.x > 0.0 ? 0.0 : 3.0;\n else\n face = direction.y > 0.0 ? 1.0 : 4.0;\n } else {\n if ( absDirection.z > absDirection.y )\n face = direction.z > 0.0 ? 2.0 : 5.0;\n else\n face = direction.y > 0.0 ? 1.0 : 4.0;\n }\n return face;\n }\n vec2 getUV( vec3 direction, float face ) {\n vec2 uv;\n if ( face == 0.0 ) {\n uv = vec2( direction.z, direction.y ) / abs( direction.x );\n } else if ( face == 1.0 ) {\n uv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n } else if ( face == 2.0 ) {\n uv = vec2( - direction.x, direction.y ) / abs( direction.z );\n } else if ( face == 3.0 ) {\n uv = vec2( - direction.z, direction.y ) / abs( direction.x );\n } else if ( face == 4.0 ) {\n uv = vec2( - direction.x, direction.z ) / abs( direction.y );\n } else {\n uv = vec2( direction.x, direction.y ) / abs( direction.z );\n }\n return 0.5 * ( uv + 1.0 );\n }\n vec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n float face = getFace( direction );\n float filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n mipInt = max( mipInt, cubeUV_minMipLevel );\n float faceSize = exp2( mipInt );\n highp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\n if ( face > 2.0 ) {\n uv.y += faceSize;\n face -= 3.0;\n }\n uv.x += face * faceSize;\n uv.x += filterInt * 3.0 * cubeUV_minTileSize;\n uv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\n uv.x *= CUBEUV_TEXEL_WIDTH;\n uv.y *= CUBEUV_TEXEL_HEIGHT;\n #ifdef texture2DGradEXT\n return texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\n #else\n return texture2D( envMap, uv ).rgb;\n #endif\n }\n #define cubeUV_r0 1.0\n #define cubeUV_m0 - 2.0\n #define cubeUV_r1 0.8\n #define cubeUV_m1 - 1.0\n #define cubeUV_r4 0.4\n #define cubeUV_m4 2.0\n #define cubeUV_r5 0.305\n #define cubeUV_m5 3.0\n #define cubeUV_r6 0.21\n #define cubeUV_m6 4.0\n float roughnessToMip( float roughness ) {\n float mip = 0.0;\n if ( roughness >= cubeUV_r1 ) {\n mip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\n } else if ( roughness >= cubeUV_r4 ) {\n mip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\n } else if ( roughness >= cubeUV_r5 ) {\n mip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\n } else if ( roughness >= cubeUV_r6 ) {\n mip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5;\n } else {\n mip = - 2.0 * log2( 1.16 * roughness ); }\n return mip;\n }\n vec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n float mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\n float mipF = fract( mip );\n float mipInt = floor( mip );\n vec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n if ( mipF == 0.0 ) {\n return vec4( color0, 1.0 );\n } else {\n vec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n return vec4( mix( color0, color1, mipF ), 1.0 );\n }\n }\n#endif"; +var defaultnormal_vertex = "vec3 transformedNormal = objectNormal;\n#ifdef USE_TANGENT\n vec3 transformedTangent = objectTangent;\n#endif\n#ifdef USE_BATCHING\n mat3 bm = mat3( batchingMatrix );\n transformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) );\n transformedNormal = bm * transformedNormal;\n #ifdef USE_TANGENT\n transformedTangent = bm * transformedTangent;\n #endif\n#endif\n#ifdef USE_INSTANCING\n mat3 im = mat3( instanceMatrix );\n transformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) );\n transformedNormal = im * transformedNormal;\n #ifdef USE_TANGENT\n transformedTangent = im * transformedTangent;\n #endif\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n transformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n transformedTangent = ( modelViewMatrix * vec4( transformedTangent, 0.0 ) ).xyz;\n #ifdef FLIP_SIDED\n transformedTangent = - transformedTangent;\n #endif\n#endif"; +var displacementmap_pars_vertex = "#ifdef USE_DISPLACEMENTMAP\n uniform sampler2D displacementMap;\n uniform float displacementScale;\n uniform float displacementBias;\n#endif"; +var displacementmap_vertex = "#ifdef USE_DISPLACEMENTMAP\n transformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias );\n#endif"; +var emissivemap_fragment = "#ifdef USE_EMISSIVEMAP\n vec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv );\n #ifdef DECODE_VIDEO_TEXTURE_EMISSIVE\n emissiveColor = sRGBTransferEOTF( emissiveColor );\n #endif\n totalEmissiveRadiance *= emissiveColor.rgb;\n#endif"; +var emissivemap_pars_fragment = "#ifdef USE_EMISSIVEMAP\n uniform sampler2D emissiveMap;\n#endif"; +var colorspace_fragment = "gl_FragColor = linearToOutputTexel( gl_FragColor );"; +var colorspace_pars_fragment = "vec4 LinearTransferOETF( in vec4 value ) {\n return value;\n}\nvec4 sRGBTransferEOTF( in vec4 value ) {\n return 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 sRGBTransferOETF( in vec4 value ) {\n return 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}"; +var envmap_fragment = "#ifdef USE_ENVMAP\n #ifdef ENV_WORLDPOS\n vec3 cameraToFrag;\n if ( isOrthographic ) {\n cameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n } else {\n cameraToFrag = normalize( vWorldPosition - cameraPosition );\n }\n vec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n #ifdef ENVMAP_MODE_REFLECTION\n vec3 reflectVec = reflect( cameraToFrag, worldNormal );\n #else\n vec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n #endif\n #else\n vec3 reflectVec = vReflect;\n #endif\n #ifdef ENVMAP_TYPE_CUBE\n vec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n #else\n vec4 envColor = vec4( 0.0 );\n #endif\n #ifdef ENVMAP_BLENDING_MULTIPLY\n outgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n #elif defined( ENVMAP_BLENDING_MIX )\n outgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n #elif defined( ENVMAP_BLENDING_ADD )\n outgoingLight += envColor.xyz * specularStrength * reflectivity;\n #endif\n#endif"; +var envmap_common_pars_fragment = "#ifdef USE_ENVMAP\n uniform float envMapIntensity;\n uniform float flipEnvMap;\n uniform mat3 envMapRotation;\n #ifdef ENVMAP_TYPE_CUBE\n uniform samplerCube envMap;\n #else\n uniform sampler2D envMap;\n #endif\n \n#endif"; +var envmap_pars_fragment = "#ifdef USE_ENVMAP\n uniform float reflectivity;\n #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n #define ENV_WORLDPOS\n #endif\n #ifdef ENV_WORLDPOS\n varying vec3 vWorldPosition;\n uniform float refractionRatio;\n #else\n varying vec3 vReflect;\n #endif\n#endif"; +var envmap_pars_vertex = "#ifdef USE_ENVMAP\n #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n #define ENV_WORLDPOS\n #endif\n #ifdef ENV_WORLDPOS\n \n varying vec3 vWorldPosition;\n #else\n varying vec3 vReflect;\n uniform float refractionRatio;\n #endif\n#endif"; +var envmap_vertex = "#ifdef USE_ENVMAP\n #ifdef ENV_WORLDPOS\n vWorldPosition = worldPosition.xyz;\n #else\n vec3 cameraToVertex;\n if ( isOrthographic ) {\n cameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n } else {\n cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n }\n vec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n #ifdef ENVMAP_MODE_REFLECTION\n vReflect = reflect( cameraToVertex, worldNormal );\n #else\n vReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n #endif\n #endif\n#endif"; +var fog_vertex = "#ifdef USE_FOG\n vFogDepth = - mvPosition.z;\n#endif"; +var fog_pars_vertex = "#ifdef USE_FOG\n varying float vFogDepth;\n#endif"; +var fog_fragment = "#ifdef USE_FOG\n #ifdef FOG_EXP2\n float fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\n #else\n float fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\n #endif\n gl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif"; +var fog_pars_fragment = "#ifdef USE_FOG\n uniform vec3 fogColor;\n varying float vFogDepth;\n #ifdef FOG_EXP2\n uniform float fogDensity;\n #else\n uniform float fogNear;\n uniform float fogFar;\n #endif\n#endif"; +var gradientmap_pars_fragment = "#ifdef USE_GRADIENTMAP\n uniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n float dotNL = dot( normal, lightDirection );\n vec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n #ifdef USE_GRADIENTMAP\n return vec3( texture2D( gradientMap, coord ).r );\n #else\n vec2 fw = fwidth( coord ) * 0.5;\n return mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\n #endif\n}"; +var lightmap_pars_fragment = "#ifdef USE_LIGHTMAP\n uniform sampler2D lightMap;\n uniform float lightMapIntensity;\n#endif"; +var lights_lambert_fragment = "LambertMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularStrength = specularStrength;"; +var lights_lambert_pars_fragment = "varying vec3 vViewPosition;\nstruct LambertMaterial {\n vec3 diffuseColor;\n float 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 float dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n vec3 irradiance = dotNL * directLight.color;\n reflectedLight.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 reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct RE_Direct_Lambert\n#define RE_IndirectDiffuse RE_IndirectDiffuse_Lambert"; +var lights_pars_begin = "uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\n#if defined( USE_LIGHT_PROBES )\n uniform vec3 lightProbe[ 9 ];\n#endif\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n float x = normal.x, y = normal.y, z = normal.z;\n vec3 result = shCoefficients[ 0 ] * 0.886227;\n result += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n result += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n result += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n result += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n result += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n result += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n result += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n result += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n return result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\n vec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n vec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n return irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n vec3 irradiance = ambientLightColor;\n return irradiance;\n}\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n float distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n if ( cutoffDistance > 0.0 ) {\n distanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n }\n return distanceFalloff;\n}\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n return smoothstep( coneCosine, penumbraCosine, angleCosine );\n}\n#if NUM_DIR_LIGHTS > 0\n struct DirectionalLight {\n vec3 direction;\n vec3 color;\n };\n uniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n void getDirectionalLightInfo( const in DirectionalLight directionalLight, out IncidentLight light ) {\n light.color = directionalLight.color;\n light.direction = directionalLight.direction;\n light.visible = true;\n }\n#endif\n#if NUM_POINT_LIGHTS > 0\n struct PointLight {\n vec3 position;\n vec3 color;\n float distance;\n float decay;\n };\n uniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n void getPointLightInfo( const in PointLight pointLight, const in vec3 geometryPosition, out IncidentLight light ) {\n vec3 lVector = pointLight.position - geometryPosition;\n light.direction = normalize( lVector );\n float lightDistance = length( lVector );\n light.color = pointLight.color;\n light.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\n light.visible = ( light.color != vec3( 0.0 ) );\n }\n#endif\n#if NUM_SPOT_LIGHTS > 0\n struct SpotLight {\n vec3 position;\n vec3 direction;\n vec3 color;\n float distance;\n float decay;\n float coneCos;\n float penumbraCos;\n };\n uniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n void getSpotLightInfo( const in SpotLight spotLight, const in vec3 geometryPosition, out IncidentLight light ) {\n vec3 lVector = spotLight.position - geometryPosition;\n light.direction = normalize( lVector );\n float angleCos = dot( light.direction, spotLight.direction );\n float spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n if ( spotAttenuation > 0.0 ) {\n float lightDistance = length( lVector );\n light.color = spotLight.color * spotAttenuation;\n light.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\n light.visible = ( light.color != vec3( 0.0 ) );\n } else {\n light.color = vec3( 0.0 );\n light.visible = false;\n }\n }\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n struct RectAreaLight {\n vec3 color;\n vec3 position;\n vec3 halfWidth;\n vec3 halfHeight;\n };\n uniform sampler2D ltc_1; uniform sampler2D ltc_2;\n uniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n struct HemisphereLight {\n vec3 direction;\n vec3 skyColor;\n vec3 groundColor;\n };\n uniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n vec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\n float dotNL = dot( normal, hemiLight.direction );\n float hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n vec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n return irradiance;\n }\n#endif"; +var envmap_physical_pars_fragment = "#ifdef USE_ENVMAP\n vec3 getIBLIrradiance( const in vec3 normal ) {\n #ifdef ENVMAP_TYPE_CUBE_UV\n vec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n vec4 envMapColor = textureCubeUV( envMap, envMapRotation * worldNormal, 1.0 );\n return PI * envMapColor.rgb * envMapIntensity;\n #else\n return vec3( 0.0 );\n #endif\n }\n vec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\n #ifdef ENVMAP_TYPE_CUBE_UV\n vec3 reflectVec = reflect( - viewDir, normal );\n reflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n reflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n vec4 envMapColor = textureCubeUV( envMap, envMapRotation * reflectVec, roughness );\n return envMapColor.rgb * envMapIntensity;\n #else\n return vec3( 0.0 );\n #endif\n }\n #ifdef USE_ANISOTROPY\n vec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {\n #ifdef ENVMAP_TYPE_CUBE_UV\n vec3 bentNormal = cross( bitangent, viewDir );\n bentNormal = normalize( cross( bentNormal, bitangent ) );\n bentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );\n return getIBLRadiance( viewDir, bentNormal, roughness );\n #else\n return vec3( 0.0 );\n #endif\n }\n #endif\n#endif"; +var lights_toon_fragment = "ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;"; +var lights_toon_pars_fragment = "varying vec3 vViewPosition;\nstruct ToonMaterial {\n vec3 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 vec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color;\n reflectedLight.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 reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct RE_Direct_Toon\n#define RE_IndirectDiffuse RE_IndirectDiffuse_Toon"; +var lights_phong_fragment = "BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;"; +var lights_phong_pars_fragment = "varying vec3 vViewPosition;\nstruct BlinnPhongMaterial {\n vec3 diffuseColor;\n vec3 specularColor;\n float specularShininess;\n float 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 float dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n vec3 irradiance = dotNL * directLight.color;\n reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n reflectedLight.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 reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct RE_Direct_BlinnPhong\n#define RE_IndirectDiffuse RE_IndirectDiffuse_BlinnPhong"; +var 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 material.ior = ior;\n #ifdef USE_SPECULAR\n float specularIntensityFactor = specularIntensity;\n vec3 specularColorFactor = specularColor;\n #ifdef USE_SPECULAR_COLORMAP\n specularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\n #endif\n #ifdef USE_SPECULAR_INTENSITYMAP\n specularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\n #endif\n material.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n #else\n float specularIntensityFactor = 1.0;\n vec3 specularColorFactor = vec3( 1.0 );\n material.specularF90 = 1.0;\n #endif\n material.specularColor = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\n#else\n material.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\n material.specularF90 = 1.0;\n#endif\n#ifdef USE_CLEARCOAT\n material.clearcoat = clearcoat;\n material.clearcoatRoughness = clearcoatRoughness;\n material.clearcoatF0 = vec3( 0.04 );\n material.clearcoatF90 = 1.0;\n #ifdef USE_CLEARCOATMAP\n material.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x;\n #endif\n #ifdef USE_CLEARCOAT_ROUGHNESSMAP\n material.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y;\n #endif\n material.clearcoat = saturate( material.clearcoat ); material.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n material.clearcoatRoughness += geometryRoughness;\n material.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_DISPERSION\n material.dispersion = dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n material.iridescence = iridescence;\n material.iridescenceIOR = iridescenceIOR;\n #ifdef USE_IRIDESCENCEMAP\n material.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r;\n #endif\n #ifdef USE_IRIDESCENCE_THICKNESSMAP\n material.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum;\n #else\n material.iridescenceThickness = iridescenceThicknessMaximum;\n #endif\n#endif\n#ifdef USE_SHEEN\n material.sheenColor = sheenColor;\n #ifdef USE_SHEEN_COLORMAP\n material.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\n #endif\n material.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\n #ifdef USE_SHEEN_ROUGHNESSMAP\n material.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\n #endif\n#endif\n#ifdef USE_ANISOTROPY\n #ifdef USE_ANISOTROPYMAP\n mat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\n vec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\n vec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\n #else\n vec2 anisotropyV = anisotropyVector;\n #endif\n material.anisotropy = length( anisotropyV );\n if( material.anisotropy == 0.0 ) {\n anisotropyV = vec2( 1.0, 0.0 );\n } else {\n anisotropyV /= material.anisotropy;\n material.anisotropy = saturate( material.anisotropy );\n }\n material.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\n material.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\n material.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\n#endif"; +var lights_physical_pars_fragment = "struct PhysicalMaterial {\n vec3 diffuseColor;\n float roughness;\n vec3 specularColor;\n float specularF90;\n float dispersion;\n #ifdef USE_CLEARCOAT\n float clearcoat;\n float clearcoatRoughness;\n vec3 clearcoatF0;\n float clearcoatF90;\n #endif\n #ifdef USE_IRIDESCENCE\n float iridescence;\n float iridescenceIOR;\n float iridescenceThickness;\n vec3 iridescenceFresnel;\n vec3 iridescenceF0;\n #endif\n #ifdef USE_SHEEN\n vec3 sheenColor;\n float sheenRoughness;\n #endif\n #ifdef IOR\n float ior;\n #endif\n #ifdef USE_TRANSMISSION\n float transmission;\n float transmissionAlpha;\n float thickness;\n float attenuationDistance;\n vec3 attenuationColor;\n #endif\n #ifdef USE_ANISOTROPY\n float anisotropy;\n float alphaT;\n vec3 anisotropyT;\n vec3 anisotropyB;\n #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 float a2 = pow2( alpha );\n float gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n float gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n return 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n float a2 = pow2( alpha );\n float denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n return RECIPROCAL_PI * a2 / pow2( denom );\n}\n#ifdef USE_ANISOTROPY\n float 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 float gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\n float gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\n float v = 0.5 / ( gv + gl );\n return saturate(v);\n }\n float D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\n float a2 = alphaT * alphaB;\n highp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\n highp float v2 = dot( v, v );\n float w2 = a2 / v2;\n return RECIPROCAL_PI * a2 * pow2 ( w2 );\n }\n#endif\n#ifdef USE_CLEARCOAT\n vec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\n vec3 f0 = material.clearcoatF0;\n float f90 = material.clearcoatF90;\n float roughness = material.clearcoatRoughness;\n float alpha = pow2( roughness );\n vec3 halfDir = normalize( lightDir + viewDir );\n float dotNL = saturate( dot( normal, lightDir ) );\n float dotNV = saturate( dot( normal, viewDir ) );\n float dotNH = saturate( dot( normal, halfDir ) );\n float dotVH = saturate( dot( viewDir, halfDir ) );\n vec3 F = F_Schlick( f0, f90, dotVH );\n float V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n float D = D_GGX( alpha, dotNH );\n return F * ( V * D );\n }\n#endif\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n vec3 f0 = material.specularColor;\n float f90 = material.specularF90;\n float roughness = material.roughness;\n float alpha = pow2( roughness );\n vec3 halfDir = normalize( lightDir + viewDir );\n float dotNL = saturate( dot( normal, lightDir ) );\n float dotNV = saturate( dot( normal, viewDir ) );\n float dotNH = saturate( dot( normal, halfDir ) );\n float dotVH = saturate( dot( viewDir, halfDir ) );\n vec3 F = F_Schlick( f0, f90, dotVH );\n #ifdef USE_IRIDESCENCE\n F = mix( F, material.iridescenceFresnel, material.iridescence );\n #endif\n #ifdef USE_ANISOTROPY\n float dotTL = dot( material.anisotropyT, lightDir );\n float dotTV = dot( material.anisotropyT, viewDir );\n float dotTH = dot( material.anisotropyT, halfDir );\n float dotBL = dot( material.anisotropyB, lightDir );\n float dotBV = dot( material.anisotropyB, viewDir );\n float dotBH = dot( material.anisotropyB, halfDir );\n float V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\n float D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\n #else\n float V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n float D = D_GGX( alpha, dotNH );\n #endif\n return F * ( V * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n const float LUT_SIZE = 64.0;\n const float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n const float LUT_BIAS = 0.5 / LUT_SIZE;\n float dotNV = saturate( dot( N, V ) );\n vec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n uv = uv * LUT_SCALE + LUT_BIAS;\n return uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n float l = length( f );\n return max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n float x = dot( v1, v2 );\n float y = abs( x );\n float a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n float b = 3.4175940 + ( 4.1616724 + y ) * y;\n float v = a / b;\n float theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n return 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 vec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n vec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n vec3 lightNormal = cross( v1, v2 );\n if( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n vec3 T1, T2;\n T1 = normalize( V - N * dot( V, N ) );\n T2 = - cross( N, T1 );\n mat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n vec3 coords[ 4 ];\n coords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n coords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n coords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n coords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n coords[ 0 ] = normalize( coords[ 0 ] );\n coords[ 1 ] = normalize( coords[ 1 ] );\n coords[ 2 ] = normalize( coords[ 2 ] );\n coords[ 3 ] = normalize( coords[ 3 ] );\n vec3 vectorFormFactor = vec3( 0.0 );\n vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n float result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n return vec3( result );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float dotNH ) {\n float alpha = pow2( roughness );\n float invAlpha = 1.0 / alpha;\n float cos2h = dotNH * dotNH;\n float sin2h = max( 1.0 - cos2h, 0.0078125 );\n return ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float dotNV, float dotNL ) {\n return 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 vec3 halfDir = normalize( lightDir + viewDir );\n float dotNL = saturate( dot( normal, lightDir ) );\n float dotNV = saturate( dot( normal, viewDir ) );\n float dotNH = saturate( dot( normal, halfDir ) );\n float D = D_Charlie( sheenRoughness, dotNH );\n float V = V_Neubelt( dotNV, dotNL );\n return sheenColor * ( D * V );\n}\n#endif\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n float dotNV = saturate( dot( normal, viewDir ) );\n float r2 = roughness * roughness;\n float a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\n float b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\n float DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\n return saturate( DG * RECIPROCAL_PI );\n}\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n float dotNV = saturate( dot( normal, viewDir ) );\n const vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n const vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n vec4 r = roughness * c0 + c1;\n float a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n vec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\n return 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 vec2 fab = DFGApprox( normal, viewDir, roughness );\n return 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 vec2 fab = DFGApprox( normal, viewDir, roughness );\n #ifdef USE_IRIDESCENCE\n vec3 Fr = mix( specularColor, iridescenceF0, iridescence );\n #else\n vec3 Fr = specularColor;\n #endif\n vec3 FssEss = Fr * fab.x + specularF90 * fab.y;\n float Ess = fab.x + fab.y;\n float Ems = 1.0 - Ess;\n vec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619; vec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n singleScatter += FssEss;\n multiScatter += Fms * Ems;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n void 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 vec3 normal = geometryNormal;\n vec3 viewDir = geometryViewDir;\n vec3 position = geometryPosition;\n vec3 lightPos = rectAreaLight.position;\n vec3 halfWidth = rectAreaLight.halfWidth;\n vec3 halfHeight = rectAreaLight.halfHeight;\n vec3 lightColor = rectAreaLight.color;\n float roughness = material.roughness;\n vec3 rectCoords[ 4 ];\n rectCoords[ 0 ] = lightPos + halfWidth - halfHeight; rectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n rectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n rectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n vec2 uv = LTC_Uv( normal, viewDir, roughness );\n vec4 t1 = texture2D( ltc_1, uv );\n vec4 t2 = texture2D( ltc_2, uv );\n mat3 mInv = mat3(\n vec3( t1.x, 0, t1.y ),\n vec3( 0, 1, 0 ),\n vec3( t1.z, 0, t1.w )\n );\n vec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n reflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n reflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n }\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 float dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n vec3 irradiance = dotNL * directLight.color;\n #ifdef USE_CLEARCOAT\n float dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\n vec3 ccIrradiance = dotNLcc * directLight.color;\n clearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\n #endif\n #ifdef USE_SHEEN\n sheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\n #endif\n reflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometryViewDir, geometryNormal, material );\n reflectedLight.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 reflectedLight.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 #ifdef USE_CLEARCOAT\n clearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n #endif\n #ifdef USE_SHEEN\n sheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n #endif\n vec3 singleScattering = vec3( 0.0 );\n vec3 multiScattering = vec3( 0.0 );\n vec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n #ifdef USE_IRIDESCENCE\n computeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\n #else\n computeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n #endif\n vec3 totalScattering = singleScattering + multiScattering;\n vec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\n reflectedLight.indirectSpecular += radiance * singleScattering;\n reflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n reflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct RE_Direct_Physical\n#define RE_Direct_RectArea RE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse RE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular RE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n return saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}"; +var 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 geometryClearcoatNormal = clearcoatNormal;\n#endif\n#ifdef USE_IRIDESCENCE\n float dotNVi = saturate( dot( normal, geometryViewDir ) );\n if ( material.iridescenceThickness == 0.0 ) {\n material.iridescence = 0.0;\n } else {\n material.iridescence = saturate( material.iridescence );\n }\n if ( material.iridescence > 0.0 ) {\n material.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n material.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\n }\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n PointLight pointLight;\n #if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n PointLightShadow pointLightShadow;\n #endif\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n pointLight = pointLights[ i ];\n getPointLightInfo( pointLight, geometryPosition, directLight );\n #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n pointLightShadow = pointLightShadows[ i ];\n directLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n #endif\n RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n }\n #pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n SpotLight spotLight;\n vec4 spotColor;\n vec3 spotLightCoord;\n bool inSpotLightMap;\n #if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n SpotLightShadow spotLightShadow;\n #endif\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n spotLight = spotLights[ i ];\n getSpotLightInfo( spotLight, geometryPosition, directLight );\n #if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n #define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\n #elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n #define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\n #else\n #define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n #endif\n #if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\n spotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\n inSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\n spotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\n directLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\n #endif\n #undef SPOT_LIGHT_MAP_INDEX\n #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n spotLightShadow = spotLightShadows[ i ];\n directLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n #endif\n RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n }\n #pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n DirectionalLight directionalLight;\n #if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n DirectionalLightShadow directionalLightShadow;\n #endif\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n directionalLight = directionalLights[ i ];\n getDirectionalLightInfo( directionalLight, directLight );\n #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n directionalLightShadow = directionalLightShadows[ i ];\n directLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n #endif\n RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n }\n #pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n RectAreaLight rectAreaLight;\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n rectAreaLight = rectAreaLights[ i ];\n RE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n }\n #pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n vec3 iblIrradiance = vec3( 0.0 );\n vec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n #if defined( USE_LIGHT_PROBES )\n irradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\n #endif\n #if ( NUM_HEMI_LIGHTS > 0 )\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n irradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\n }\n #pragma unroll_loop_end\n #endif\n#endif\n#if defined( RE_IndirectSpecular )\n vec3 radiance = vec3( 0.0 );\n vec3 clearcoatRadiance = vec3( 0.0 );\n#endif"; +var lights_fragment_maps = "#if defined( RE_IndirectDiffuse )\n #ifdef USE_LIGHTMAP\n vec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n vec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n irradiance += lightMapIrradiance;\n #endif\n #if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n iblIrradiance += getIBLIrradiance( geometryNormal );\n #endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n #ifdef USE_ANISOTROPY\n radiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\n #else\n radiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\n #endif\n #ifdef USE_CLEARCOAT\n clearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\n #endif\n#endif"; +var lights_fragment_end = "#if defined( RE_IndirectDiffuse )\n RE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n RE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif"; +var logdepthbuf_fragment = "#if defined( USE_LOGDEPTHBUF )\n gl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif"; +var logdepthbuf_pars_fragment = "#if defined( USE_LOGDEPTHBUF )\n uniform float logDepthBufFC;\n varying float vFragDepth;\n varying float vIsPerspective;\n#endif"; +var logdepthbuf_pars_vertex = "#ifdef USE_LOGDEPTHBUF\n varying float vFragDepth;\n varying float vIsPerspective;\n#endif"; +var logdepthbuf_vertex = "#ifdef USE_LOGDEPTHBUF\n vFragDepth = 1.0 + gl_Position.w;\n vIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n#endif"; +var map_fragment = "#ifdef USE_MAP\n vec4 sampledDiffuseColor = texture2D( map, vMapUv );\n #ifdef DECODE_VIDEO_TEXTURE\n sampledDiffuseColor = sRGBTransferEOTF( sampledDiffuseColor );\n #endif\n diffuseColor *= sampledDiffuseColor;\n#endif"; +var map_pars_fragment = "#ifdef USE_MAP\n uniform sampler2D map;\n#endif"; +var map_particle_fragment = "#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n #if defined( USE_POINTS_UV )\n vec2 uv = vUv;\n #else\n vec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n #endif\n#endif\n#ifdef USE_MAP\n diffuseColor *= texture2D( map, uv );\n#endif\n#ifdef USE_ALPHAMAP\n diffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif"; +var map_particle_pars_fragment = "#if defined( USE_POINTS_UV )\n varying vec2 vUv;\n#else\n #if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n uniform mat3 uvTransform;\n #endif\n#endif\n#ifdef USE_MAP\n uniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n uniform sampler2D alphaMap;\n#endif"; +var metalnessmap_fragment = "float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n vec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv );\n metalnessFactor *= texelMetalness.b;\n#endif"; +var metalnessmap_pars_fragment = "#ifdef USE_METALNESSMAP\n uniform sampler2D metalnessMap;\n#endif"; +var morphinstance_vertex = "#ifdef USE_INSTANCING_MORPH\n float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n float morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r;\n for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n morphTargetInfluences[i] = texelFetch( morphTexture, ivec2( i + 1, gl_InstanceID ), 0 ).r;\n }\n#endif"; +var morphcolor_vertex = "#if defined( USE_MORPHCOLORS )\n vColor *= morphTargetBaseInfluence;\n for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n #if defined( USE_COLOR_ALPHA )\n if ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\n #elif defined( USE_COLOR )\n if ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\n #endif\n }\n#endif"; +var morphnormal_vertex = "#ifdef USE_MORPHNORMALS\n objectNormal *= morphTargetBaseInfluence;\n for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n if ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\n }\n#endif"; +var morphtarget_pars_vertex = "#ifdef USE_MORPHTARGETS\n #ifndef USE_INSTANCING_MORPH\n uniform float morphTargetBaseInfluence;\n uniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n #endif\n uniform sampler2DArray morphTargetsTexture;\n uniform ivec2 morphTargetsTextureSize;\n vec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\n int texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\n int y = texelIndex / morphTargetsTextureSize.x;\n int x = texelIndex - y * morphTargetsTextureSize.x;\n ivec3 morphUV = ivec3( x, y, morphTargetIndex );\n return texelFetch( morphTargetsTexture, morphUV, 0 );\n }\n#endif"; +var morphtarget_vertex = "#ifdef USE_MORPHTARGETS\n transformed *= morphTargetBaseInfluence;\n for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n if ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\n }\n#endif"; +var normal_fragment_begin = "float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n#ifdef FLAT_SHADED\n vec3 fdx = dFdx( vViewPosition );\n vec3 fdy = dFdy( vViewPosition );\n vec3 normal = normalize( cross( fdx, fdy ) );\n#else\n vec3 normal = normalize( vNormal );\n #ifdef DOUBLE_SIDED\n normal *= faceDirection;\n #endif\n#endif\n#if defined( USE_NORMALMAP_TANGENTSPACE ) || defined( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY )\n #ifdef USE_TANGENT\n mat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n #else\n mat3 tbn = getTangentFrame( - vViewPosition, normal,\n #if defined( USE_NORMALMAP )\n vNormalMapUv\n #elif defined( USE_CLEARCOAT_NORMALMAP )\n vClearcoatNormalMapUv\n #else\n vUv\n #endif\n );\n #endif\n #if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n tbn[0] *= faceDirection;\n tbn[1] *= faceDirection;\n #endif\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n #ifdef USE_TANGENT\n mat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n #else\n mat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv );\n #endif\n #if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n tbn2[0] *= faceDirection;\n tbn2[1] *= faceDirection;\n #endif\n#endif\nvec3 nonPerturbedNormal = normal;"; +var normal_fragment_maps = "#ifdef USE_NORMALMAP_OBJECTSPACE\n normal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n #ifdef FLIP_SIDED\n normal = - normal;\n #endif\n #ifdef DOUBLE_SIDED\n normal = normal * faceDirection;\n #endif\n normal = normalize( normalMatrix * normal );\n#elif defined( USE_NORMALMAP_TANGENTSPACE )\n vec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n mapN.xy *= normalScale;\n normal = normalize( tbn * mapN );\n#elif defined( USE_BUMPMAP )\n normal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif"; +var normal_pars_fragment = "#ifndef FLAT_SHADED\n varying vec3 vNormal;\n #ifdef USE_TANGENT\n varying vec3 vTangent;\n varying vec3 vBitangent;\n #endif\n#endif"; +var normal_pars_vertex = "#ifndef FLAT_SHADED\n varying vec3 vNormal;\n #ifdef USE_TANGENT\n varying vec3 vTangent;\n varying vec3 vBitangent;\n #endif\n#endif"; +var normal_vertex = "#ifndef FLAT_SHADED\n vNormal = normalize( transformedNormal );\n #ifdef USE_TANGENT\n vTangent = normalize( transformedTangent );\n vBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n #endif\n#endif"; +var normalmap_pars_fragment = "#ifdef USE_NORMALMAP\n uniform sampler2D normalMap;\n uniform vec2 normalScale;\n#endif\n#ifdef USE_NORMALMAP_OBJECTSPACE\n uniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) )\n mat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) {\n vec3 q0 = dFdx( eye_pos.xyz );\n vec3 q1 = dFdy( eye_pos.xyz );\n vec2 st0 = dFdx( uv.st );\n vec2 st1 = dFdy( uv.st );\n vec3 N = surf_norm;\n vec3 q1perp = cross( q1, N );\n vec3 q0perp = cross( N, q0 );\n vec3 T = q1perp * st0.x + q0perp * st1.x;\n vec3 B = q1perp * st0.y + q0perp * st1.y;\n float det = max( dot( T, T ), dot( B, B ) );\n float scale = ( det == 0.0 ) ? 0.0 : inversesqrt( det );\n return mat3( T * scale, B * scale, N );\n }\n#endif"; +var clearcoat_normal_fragment_begin = "#ifdef USE_CLEARCOAT\n vec3 clearcoatNormal = nonPerturbedNormal;\n#endif"; +var clearcoat_normal_fragment_maps = "#ifdef USE_CLEARCOAT_NORMALMAP\n vec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0;\n clearcoatMapN.xy *= clearcoatNormalScale;\n clearcoatNormal = normalize( tbn2 * clearcoatMapN );\n#endif"; +var clearcoat_pars_fragment = "#ifdef USE_CLEARCOATMAP\n uniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n uniform sampler2D clearcoatNormalMap;\n uniform vec2 clearcoatNormalScale;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n uniform sampler2D clearcoatRoughnessMap;\n#endif"; +var iridescence_pars_fragment = "#ifdef USE_IRIDESCENCEMAP\n uniform sampler2D iridescenceMap;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n uniform sampler2D iridescenceThicknessMap;\n#endif"; +var opaque_fragment = "#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= material.transmissionAlpha;\n#endif\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );"; +var packing = "vec3 packNormalToRGB( const in vec3 normal ) {\n return normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n return 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;const float ShiftRight8 = 1. / 256.;\nconst float Inv255 = 1. / 255.;\nconst vec4 PackFactors = vec4( 1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0 );\nconst vec2 UnpackFactors2 = vec2( UnpackDownscale, 1.0 / PackFactors.g );\nconst vec3 UnpackFactors3 = vec3( UnpackDownscale / PackFactors.rg, 1.0 / PackFactors.b );\nconst vec4 UnpackFactors4 = vec4( UnpackDownscale / PackFactors.rgb, 1.0 / PackFactors.a );\nvec4 packDepthToRGBA( const in float v ) {\n if( v <= 0.0 )\n return vec4( 0., 0., 0., 0. );\n if( v >= 1.0 )\n return vec4( 1., 1., 1., 1. );\n float vuf;\n float af = modf( v * PackFactors.a, vuf );\n float bf = modf( vuf * ShiftRight8, vuf );\n float gf = modf( vuf * ShiftRight8, vuf );\n return vec4( vuf * Inv255, gf * PackUpscale, bf * PackUpscale, af );\n}\nvec3 packDepthToRGB( const in float v ) {\n if( v <= 0.0 )\n return vec3( 0., 0., 0. );\n if( v >= 1.0 )\n return vec3( 1., 1., 1. );\n float vuf;\n float bf = modf( v * PackFactors.b, vuf );\n float gf = modf( vuf * ShiftRight8, vuf );\n return vec3( vuf * Inv255, gf * PackUpscale, bf );\n}\nvec2 packDepthToRG( const in float v ) {\n if( v <= 0.0 )\n return vec2( 0., 0. );\n if( v >= 1.0 )\n return vec2( 1., 1. );\n float vuf;\n float gf = modf( v * 256., vuf );\n return vec2( vuf * Inv255, gf );\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n return dot( v, UnpackFactors4 );\n}\nfloat unpackRGBToDepth( const in vec3 v ) {\n return dot( v, UnpackFactors3 );\n}\nfloat unpackRGToDepth( const in vec2 v ) {\n return v.r * UnpackFactors2.r + v.g * UnpackFactors2.g;\n}\nvec4 pack2HalfToRGBA( const in vec2 v ) {\n vec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\n return vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\n}\nvec2 unpackRGBATo2Half( const in vec4 v ) {\n return 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 return ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float depth, const in float near, const in float far ) {\n return depth * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n return ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) {\n return ( near * far ) / ( ( far - near ) * depth - far );\n}"; +var premultiplied_alpha_fragment = "#ifdef PREMULTIPLIED_ALPHA\n gl_FragColor.rgb *= gl_FragColor.a;\n#endif"; +var project_vertex = "vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_BATCHING\n mvPosition = batchingMatrix * mvPosition;\n#endif\n#ifdef USE_INSTANCING\n mvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;"; +var dithering_fragment = "#ifdef DITHERING\n gl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif"; +var dithering_pars_fragment = "#ifdef DITHERING\n vec3 dithering( vec3 color ) {\n float grid_position = rand( gl_FragCoord.xy );\n vec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n dither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n return color + dither_shift_RGB;\n }\n#endif"; +var roughnessmap_fragment = "float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n vec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv );\n roughnessFactor *= texelRoughness.g;\n#endif"; +var roughnessmap_pars_fragment = "#ifdef USE_ROUGHNESSMAP\n uniform sampler2D roughnessMap;\n#endif"; +var shadowmap_pars_fragment = "#if NUM_SPOT_LIGHT_COORDS > 0\n varying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#if NUM_SPOT_LIGHT_MAPS > 0\n uniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\n#endif\n#ifdef USE_SHADOWMAP\n #if NUM_DIR_LIGHT_SHADOWS > 0\n uniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n varying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n struct DirectionalLightShadow {\n float shadowIntensity;\n float shadowBias;\n float shadowNormalBias;\n float shadowRadius;\n vec2 shadowMapSize;\n };\n uniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n #endif\n #if NUM_SPOT_LIGHT_SHADOWS > 0\n uniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n struct SpotLightShadow {\n float shadowIntensity;\n float shadowBias;\n float shadowNormalBias;\n float shadowRadius;\n vec2 shadowMapSize;\n };\n uniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n #endif\n #if NUM_POINT_LIGHT_SHADOWS > 0\n uniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n varying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n struct PointLightShadow {\n float shadowIntensity;\n float shadowBias;\n float shadowNormalBias;\n float shadowRadius;\n vec2 shadowMapSize;\n float shadowCameraNear;\n float shadowCameraFar;\n };\n uniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n #endif\n float texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n return step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n }\n vec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n return unpackRGBATo2Half( texture2D( shadow, uv ) );\n }\n float VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n float occlusion = 1.0;\n vec2 distribution = texture2DDistribution( shadow, uv );\n float hard_shadow = step( compare , distribution.x );\n if (hard_shadow != 1.0 ) {\n float distance = compare - distribution.x ;\n float variance = max( 0.00000, distribution.y * distribution.y );\n float softness_probability = variance / (variance + distance * distance ); softness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 ); occlusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n }\n return occlusion;\n }\n float getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n float shadow = 1.0;\n shadowCoord.xyz /= shadowCoord.w;\n shadowCoord.z += shadowBias;\n bool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n bool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n if ( frustumTest ) {\n #if defined( SHADOWMAP_TYPE_PCF )\n vec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n float dx0 = - texelSize.x * shadowRadius;\n float dy0 = - texelSize.y * shadowRadius;\n float dx1 = + texelSize.x * shadowRadius;\n float dy1 = + texelSize.y * shadowRadius;\n float dx2 = dx0 / 2.0;\n float dy2 = dy0 / 2.0;\n float dx3 = dx1 / 2.0;\n float dy3 = dy1 / 2.0;\n shadow = (\n texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n texture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n texture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n texture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n texture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n ) * ( 1.0 / 17.0 );\n #elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n vec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n float dx = texelSize.x;\n float dy = texelSize.y;\n vec2 uv = shadowCoord.xy;\n vec2 f = fract( uv * shadowMapSize + 0.5 );\n uv -= f * texelSize;\n shadow = (\n texture2DCompare( shadowMap, uv, shadowCoord.z ) +\n texture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n texture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n texture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n mix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ),\n texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n f.x ) +\n mix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ),\n texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n f.x ) +\n mix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ),\n texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n f.y ) +\n mix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ),\n texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n f.y ) +\n mix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ),\n texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n f.x ),\n mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ),\n texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n f.x ),\n f.y )\n ) * ( 1.0 / 9.0 );\n #elif defined( SHADOWMAP_TYPE_VSM )\n shadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n #else\n shadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n #endif\n }\n return mix( 1.0, shadow, shadowIntensity );\n }\n vec2 cubeToUV( vec3 v, float texelSizeY ) {\n vec3 absV = abs( v );\n float scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n absV *= scaleToCube;\n v *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n vec2 planar = v.xy;\n float almostATexel = 1.5 * texelSizeY;\n float almostOne = 1.0 - almostATexel;\n if ( absV.z >= almostOne ) {\n if ( v.z > 0.0 )\n planar.x = 4.0 - v.x;\n } else if ( absV.x >= almostOne ) {\n float signX = sign( v.x );\n planar.x = v.z * signX + 2.0 * signX;\n } else if ( absV.y >= almostOne ) {\n float signY = sign( v.y );\n planar.x = v.x + 2.0 * signY + 2.0;\n planar.y = v.z * signY - 2.0;\n }\n return vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n }\n float getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n float shadow = 1.0;\n vec3 lightToPosition = shadowCoord.xyz;\n \n float lightToPositionLength = length( lightToPosition );\n if ( lightToPositionLength - shadowCameraFar <= 0.0 && lightToPositionLength - shadowCameraNear >= 0.0 ) {\n float dp = ( lightToPositionLength - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear ); dp += shadowBias;\n vec3 bd3D = normalize( lightToPosition );\n vec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n #if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n vec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n shadow = (\n texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n ) * ( 1.0 / 9.0 );\n #else\n shadow = texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n #endif\n }\n return mix( 1.0, shadow, shadowIntensity );\n }\n#endif"; +var shadowmap_pars_vertex = "#if NUM_SPOT_LIGHT_COORDS > 0\n uniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\n varying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#ifdef USE_SHADOWMAP\n #if NUM_DIR_LIGHT_SHADOWS > 0\n uniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n varying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n struct DirectionalLightShadow {\n float shadowIntensity;\n float shadowBias;\n float shadowNormalBias;\n float shadowRadius;\n vec2 shadowMapSize;\n };\n uniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n #endif\n #if NUM_SPOT_LIGHT_SHADOWS > 0\n struct SpotLightShadow {\n float shadowIntensity;\n float shadowBias;\n float shadowNormalBias;\n float shadowRadius;\n vec2 shadowMapSize;\n };\n uniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n #endif\n #if NUM_POINT_LIGHT_SHADOWS > 0\n uniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n varying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n struct PointLightShadow {\n float shadowIntensity;\n float shadowBias;\n float shadowNormalBias;\n float shadowRadius;\n vec2 shadowMapSize;\n float shadowCameraNear;\n float shadowCameraFar;\n };\n uniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n #endif\n#endif"; +var shadowmap_vertex = "#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\n vec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n vec4 shadowWorldPosition;\n#endif\n#if defined( USE_SHADOWMAP )\n #if NUM_DIR_LIGHT_SHADOWS > 0\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n shadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n vDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n }\n #pragma unroll_loop_end\n #endif\n #if NUM_POINT_LIGHT_SHADOWS > 0\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n shadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n vPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n }\n #pragma unroll_loop_end\n #endif\n#endif\n#if NUM_SPOT_LIGHT_COORDS > 0\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\n shadowWorldPosition = worldPosition;\n #if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n shadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\n #endif\n vSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\n }\n #pragma unroll_loop_end\n#endif"; +var shadowmask_pars_fragment = "float getShadowMask() {\n float shadow = 1.0;\n #ifdef USE_SHADOWMAP\n #if NUM_DIR_LIGHT_SHADOWS > 0\n DirectionalLightShadow directionalLight;\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n directionalLight = directionalLightShadows[ i ];\n shadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowIntensity, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n }\n #pragma unroll_loop_end\n #endif\n #if NUM_SPOT_LIGHT_SHADOWS > 0\n SpotLightShadow spotLight;\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n spotLight = spotLightShadows[ i ];\n shadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowIntensity, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n }\n #pragma unroll_loop_end\n #endif\n #if NUM_POINT_LIGHT_SHADOWS > 0\n PointLightShadow pointLight;\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n pointLight = pointLightShadows[ i ];\n shadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowIntensity, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n }\n #pragma unroll_loop_end\n #endif\n #endif\n return shadow;\n}"; +var skinbase_vertex = "#ifdef USE_SKINNING\n mat4 boneMatX = getBoneMatrix( skinIndex.x );\n mat4 boneMatY = getBoneMatrix( skinIndex.y );\n mat4 boneMatZ = getBoneMatrix( skinIndex.z );\n mat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif"; +var skinning_pars_vertex = "#ifdef USE_SKINNING\n uniform mat4 bindMatrix;\n uniform mat4 bindMatrixInverse;\n uniform highp sampler2D boneTexture;\n mat4 getBoneMatrix( const in float i ) {\n int size = textureSize( boneTexture, 0 ).x;\n int j = int( i ) * 4;\n int x = j % size;\n int y = j / size;\n vec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 );\n vec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 );\n vec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 );\n vec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 );\n return mat4( v1, v2, v3, v4 );\n }\n#endif"; +var skinning_vertex = "#ifdef USE_SKINNING\n vec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n vec4 skinned = vec4( 0.0 );\n skinned += boneMatX * skinVertex * skinWeight.x;\n skinned += boneMatY * skinVertex * skinWeight.y;\n skinned += boneMatZ * skinVertex * skinWeight.z;\n skinned += boneMatW * skinVertex * skinWeight.w;\n transformed = ( bindMatrixInverse * skinned ).xyz;\n#endif"; +var skinnormal_vertex = "#ifdef USE_SKINNING\n mat4 skinMatrix = mat4( 0.0 );\n skinMatrix += skinWeight.x * boneMatX;\n skinMatrix += skinWeight.y * boneMatY;\n skinMatrix += skinWeight.z * boneMatZ;\n skinMatrix += skinWeight.w * boneMatW;\n skinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n objectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n #ifdef USE_TANGENT\n objectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n #endif\n#endif"; +var specularmap_fragment = "float specularStrength;\n#ifdef USE_SPECULARMAP\n vec4 texelSpecular = texture2D( specularMap, vSpecularMapUv );\n specularStrength = texelSpecular.r;\n#else\n specularStrength = 1.0;\n#endif"; +var specularmap_pars_fragment = "#ifdef USE_SPECULARMAP\n uniform sampler2D specularMap;\n#endif"; +var tonemapping_fragment = "#if defined( TONE_MAPPING )\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif"; +var 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 return saturate( toneMappingExposure * color );\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n color *= toneMappingExposure;\n return saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 CineonToneMapping( vec3 color ) {\n color *= toneMappingExposure;\n color = max( vec3( 0.0 ), color - 0.004 );\n return pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n vec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n vec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n return a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n const mat3 ACESInputMat = mat3(\n vec3( 0.59719, 0.07600, 0.02840 ), vec3( 0.35458, 0.90834, 0.13383 ),\n vec3( 0.04823, 0.01566, 0.83777 )\n );\n const mat3 ACESOutputMat = mat3(\n vec3( 1.60475, -0.10208, -0.00327 ), vec3( -0.53108, 1.10813, -0.07276 ),\n vec3( -0.07367, -0.00605, 1.07602 )\n );\n color *= toneMappingExposure / 0.6;\n color = ACESInputMat * color;\n color = RRTAndODTFit( color );\n color = ACESOutputMat * color;\n return saturate( color );\n}\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\n vec3( 1.6605, - 0.1246, - 0.0182 ),\n vec3( - 0.5876, 1.1329, - 0.1006 ),\n vec3( - 0.0728, - 0.0083, 1.1187 )\n);\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\n vec3( 0.6274, 0.0691, 0.0164 ),\n vec3( 0.3293, 0.9195, 0.0880 ),\n vec3( 0.0433, 0.0113, 0.8956 )\n);\nvec3 agxDefaultContrastApprox( vec3 x ) {\n vec3 x2 = x * x;\n vec3 x4 = x2 * x2;\n return + 15.5 * x4 * x2\n - 40.14 * x4 * x\n + 31.96 * x4\n - 6.868 * x2 * x\n + 0.4298 * x2\n + 0.1191 * x\n - 0.00232;\n}\nvec3 AgXToneMapping( vec3 color ) {\n const mat3 AgXInsetMatrix = mat3(\n vec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ),\n vec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ),\n vec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 )\n );\n const mat3 AgXOutsetMatrix = mat3(\n vec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ),\n vec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ),\n vec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 )\n );\n const float AgxMinEv = - 12.47393; const float AgxMaxEv = 4.026069;\n color *= toneMappingExposure;\n color = LINEAR_SRGB_TO_LINEAR_REC2020 * color;\n color = AgXInsetMatrix * color;\n color = max( color, 1e-10 ); color = log2( color );\n color = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv );\n color = clamp( color, 0.0, 1.0 );\n color = agxDefaultContrastApprox( color );\n color = AgXOutsetMatrix * color;\n color = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) );\n color = LINEAR_REC2020_TO_LINEAR_SRGB * color;\n color = clamp( color, 0.0, 1.0 );\n return color;\n}\nvec3 NeutralToneMapping( vec3 color ) {\n const float StartCompression = 0.8 - 0.04;\n const float Desaturation = 0.15;\n color *= toneMappingExposure;\n float x = min( color.r, min( color.g, color.b ) );\n float offset = x < 0.08 ? x - 6.25 * x * x : 0.04;\n color -= offset;\n float peak = max( color.r, max( color.g, color.b ) );\n if ( peak < StartCompression ) return color;\n float d = 1. - StartCompression;\n float newPeak = 1. - d * d / ( peak + d - StartCompression );\n color *= newPeak / peak;\n float g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. );\n return mix( color, vec3( newPeak ), g );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }"; +var transmission_fragment = "#ifdef USE_TRANSMISSION\n material.transmission = transmission;\n material.transmissionAlpha = 1.0;\n material.thickness = thickness;\n material.attenuationDistance = attenuationDistance;\n material.attenuationColor = attenuationColor;\n #ifdef USE_TRANSMISSIONMAP\n material.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\n #endif\n #ifdef USE_THICKNESSMAP\n material.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\n #endif\n vec3 pos = vWorldPosition;\n vec3 v = normalize( cameraPosition - pos );\n vec3 n = inverseTransformDirection( normal, viewMatrix );\n vec4 transmitted = getIBLVolumeRefraction(\n n, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n pos, modelMatrix, viewMatrix, projectionMatrix, material.dispersion, material.ior, material.thickness,\n material.attenuationColor, material.attenuationDistance );\n material.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\n totalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission );\n#endif"; +var transmission_pars_fragment = "#ifdef USE_TRANSMISSION\n uniform float transmission;\n uniform float thickness;\n uniform float attenuationDistance;\n uniform vec3 attenuationColor;\n #ifdef USE_TRANSMISSIONMAP\n uniform sampler2D transmissionMap;\n #endif\n #ifdef USE_THICKNESSMAP\n uniform sampler2D thicknessMap;\n #endif\n uniform vec2 transmissionSamplerSize;\n uniform sampler2D transmissionSamplerMap;\n uniform mat4 modelMatrix;\n uniform mat4 projectionMatrix;\n varying vec3 vWorldPosition;\n float w0( float a ) {\n return ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\n }\n float w1( float a ) {\n return ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\n }\n float w2( float a ){\n return ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\n }\n float w3( float a ) {\n return ( 1.0 / 6.0 ) * ( a * a * a );\n }\n float g0( float a ) {\n return w0( a ) + w1( a );\n }\n float g1( float a ) {\n return w2( a ) + w3( a );\n }\n float h0( float a ) {\n return - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\n }\n float h1( float a ) {\n return 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\n }\n vec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\n uv = uv * texelSize.zw + 0.5;\n vec2 iuv = floor( uv );\n vec2 fuv = fract( uv );\n float g0x = g0( fuv.x );\n float g1x = g1( fuv.x );\n float h0x = h0( fuv.x );\n float h1x = h1( fuv.x );\n float h0y = h0( fuv.y );\n float h1y = h1( fuv.y );\n vec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n vec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n vec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n vec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n return g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\n g1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\n }\n vec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\n vec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\n vec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\n vec2 fLodSizeInv = 1.0 / fLodSize;\n vec2 cLodSizeInv = 1.0 / cLodSize;\n vec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\n vec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\n return mix( fSample, cSample, fract( lod ) );\n }\n vec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n vec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n vec3 modelScale;\n modelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n modelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n modelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n return normalize( refractionVector ) * thickness * modelScale;\n }\n float applyIorToRoughness( const in float roughness, const in float ior ) {\n return roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n }\n vec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n float lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n return textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\n }\n vec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n if ( isinf( attenuationDistance ) ) {\n return vec3( 1.0 );\n } else {\n vec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n vec3 transmittance = exp( - attenuationCoefficient * transmissionDistance ); return transmittance;\n }\n }\n vec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n const in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n const in mat4 viewMatrix, const in mat4 projMatrix, const in float dispersion, const in float ior, const in float thickness,\n const in vec3 attenuationColor, const in float attenuationDistance ) {\n vec4 transmittedLight;\n vec3 transmittance;\n #ifdef USE_DISPERSION\n float halfSpread = ( ior - 1.0 ) * 0.025 * dispersion;\n vec3 iors = vec3( ior - halfSpread, ior, ior + halfSpread );\n for ( int i = 0; i < 3; i ++ ) {\n vec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, iors[ i ], modelMatrix );\n vec3 refractedRayExit = position + transmissionRay;\n \n vec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n vec2 refractionCoords = ndcPos.xy / ndcPos.w;\n refractionCoords += 1.0;\n refractionCoords /= 2.0;\n \n vec4 transmissionSample = getTransmissionSample( refractionCoords, roughness, iors[ i ] );\n transmittedLight[ i ] = transmissionSample[ i ];\n transmittedLight.a += transmissionSample.a;\n transmittance[ i ] = diffuseColor[ i ] * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance )[ i ];\n }\n transmittedLight.a /= 3.0;\n \n #else\n \n vec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n vec3 refractedRayExit = position + transmissionRay;\n vec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n vec2 refractionCoords = ndcPos.xy / ndcPos.w;\n refractionCoords += 1.0;\n refractionCoords /= 2.0;\n transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n transmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\n \n #endif\n vec3 attenuatedColor = transmittance * transmittedLight.rgb;\n vec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n float transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\n return vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\n }\n#endif"; +var uv_pars_fragment = "#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n varying vec2 vUv;\n#endif\n#ifdef USE_MAP\n varying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n varying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n varying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n varying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n varying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n varying vec2 vNormalMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n varying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n varying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n varying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n varying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n varying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n varying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n varying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n varying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n varying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n varying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n varying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n varying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n varying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n varying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n uniform mat3 transmissionMapTransform;\n varying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n uniform mat3 thicknessMapTransform;\n varying vec2 vThicknessMapUv;\n#endif"; +var uv_pars_vertex = "#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n varying vec2 vUv;\n#endif\n#ifdef USE_MAP\n uniform mat3 mapTransform;\n varying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n uniform mat3 alphaMapTransform;\n varying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n uniform mat3 lightMapTransform;\n varying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n uniform mat3 aoMapTransform;\n varying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n uniform mat3 bumpMapTransform;\n varying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n uniform mat3 normalMapTransform;\n varying vec2 vNormalMapUv;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n uniform mat3 displacementMapTransform;\n varying vec2 vDisplacementMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n uniform mat3 emissiveMapTransform;\n varying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n uniform mat3 metalnessMapTransform;\n varying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n uniform mat3 roughnessMapTransform;\n varying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n uniform mat3 anisotropyMapTransform;\n varying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n uniform mat3 clearcoatMapTransform;\n varying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n uniform mat3 clearcoatNormalMapTransform;\n varying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n uniform mat3 clearcoatRoughnessMapTransform;\n varying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n uniform mat3 sheenColorMapTransform;\n varying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n uniform mat3 sheenRoughnessMapTransform;\n varying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n uniform mat3 iridescenceMapTransform;\n varying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n uniform mat3 iridescenceThicknessMapTransform;\n varying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n uniform mat3 specularMapTransform;\n varying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n uniform mat3 specularColorMapTransform;\n varying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n uniform mat3 specularIntensityMapTransform;\n varying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n uniform mat3 transmissionMapTransform;\n varying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n uniform mat3 thicknessMapTransform;\n varying vec2 vThicknessMapUv;\n#endif"; +var uv_vertex = "#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n vUv = vec3( uv, 1 ).xy;\n#endif\n#ifdef USE_MAP\n vMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ALPHAMAP\n vAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_LIGHTMAP\n vLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_AOMAP\n vAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_BUMPMAP\n vBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_NORMALMAP\n vNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n vDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_EMISSIVEMAP\n vEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_METALNESSMAP\n vMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ROUGHNESSMAP\n vRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ANISOTROPYMAP\n vAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOATMAP\n vClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n vClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n vClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n vIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n vIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n vSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n vSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULARMAP\n vSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n vSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n vSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n vTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_THICKNESSMAP\n vThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy;\n#endif"; +var worldpos_vertex = "#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\n vec4 worldPosition = vec4( transformed, 1.0 );\n #ifdef USE_BATCHING\n worldPosition = batchingMatrix * worldPosition;\n #endif\n #ifdef USE_INSTANCING\n worldPosition = instanceMatrix * worldPosition;\n #endif\n worldPosition = modelMatrix * worldPosition;\n#endif"; +const vertex$h = "varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n vUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n gl_Position = vec4( position.xy, 1.0, 1.0 );\n}"; +const fragment$h = "uniform sampler2D t2D;\nuniform float backgroundIntensity;\nvarying vec2 vUv;\nvoid main() {\n vec4 texColor = texture2D( t2D, vUv );\n #ifdef DECODE_VIDEO_TEXTURE\n texColor = 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 #endif\n texColor.rgb *= backgroundIntensity;\n gl_FragColor = texColor;\n #include \n #include \n}"; +const vertex$g = "varying vec3 vWorldDirection;\n#include \nvoid main() {\n vWorldDirection = transformDirection( position, modelMatrix );\n #include \n #include \n gl_Position.z = gl_Position.w;\n}"; +const fragment$g = "#ifdef ENVMAP_TYPE_CUBE\n uniform samplerCube envMap;\n#elif defined( ENVMAP_TYPE_CUBE_UV )\n uniform sampler2D envMap;\n#endif\nuniform float flipEnvMap;\nuniform float backgroundBlurriness;\nuniform float backgroundIntensity;\nuniform mat3 backgroundRotation;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n #ifdef ENVMAP_TYPE_CUBE\n vec4 texColor = textureCube( envMap, backgroundRotation * vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\n #elif defined( ENVMAP_TYPE_CUBE_UV )\n vec4 texColor = textureCubeUV( envMap, backgroundRotation * vWorldDirection, backgroundBlurriness );\n #else\n vec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n #endif\n texColor.rgb *= backgroundIntensity;\n gl_FragColor = texColor;\n #include \n #include \n}"; +const vertex$f = "varying vec3 vWorldDirection;\n#include \nvoid main() {\n vWorldDirection = transformDirection( position, modelMatrix );\n #include \n #include \n gl_Position.z = gl_Position.w;\n}"; +const fragment$f = "uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldDirection;\nvoid main() {\n vec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\n gl_FragColor = texColor;\n gl_FragColor.a *= opacity;\n #include \n #include \n}"; +const vertex$e = "#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n #include \n #include \n #include \n #include \n #ifdef USE_DISPLACEMENTMAP\n #include \n #include \n #include \n #endif\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n vHighPrecisionZW = gl_Position.zw;\n}"; +const fragment$e = "#if DEPTH_PACKING == 3200\n uniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n vec4 diffuseColor = vec4( 1.0 );\n #include \n #if DEPTH_PACKING == 3200\n diffuseColor.a = opacity;\n #endif\n #include \n #include \n #include \n #include \n #include \n float fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n #if DEPTH_PACKING == 3200\n gl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n #elif DEPTH_PACKING == 3201\n gl_FragColor = packDepthToRGBA( fragCoordZ );\n #elif DEPTH_PACKING == 3202\n gl_FragColor = vec4( packDepthToRGB( fragCoordZ ), 1.0 );\n #elif DEPTH_PACKING == 3203\n gl_FragColor = vec4( packDepthToRG( fragCoordZ ), 0.0, 1.0 );\n #endif\n}"; +const vertex$d = "#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #ifdef USE_DISPLACEMENTMAP\n #include \n #include \n #include \n #endif\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n vWorldPosition = worldPosition.xyz;\n}"; +const fragment$d = "#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n vec4 diffuseColor = vec4( 1.0 );\n #include \n #include \n #include \n #include \n #include \n float dist = length( vWorldPosition - referencePosition );\n dist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n dist = saturate( dist );\n gl_FragColor = packDepthToRGBA( dist );\n}"; +const vertex$c = "varying vec3 vWorldDirection;\n#include \nvoid main() {\n vWorldDirection = transformDirection( position, modelMatrix );\n #include \n #include \n}"; +const fragment$c = "uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n vec3 direction = normalize( vWorldDirection );\n vec2 sampleUV = equirectUv( direction );\n gl_FragColor = texture2D( tEquirect, sampleUV );\n #include \n #include \n}"; +const vertex$b = "uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n vLineDistance = scale * lineDistance;\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n}"; +const fragment$b = "uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n vec4 diffuseColor = vec4( diffuse, opacity );\n #include \n if ( mod( vLineDistance, totalSize ) > dashSize ) {\n discard;\n }\n vec3 outgoingLight = vec3( 0.0 );\n #include \n #include \n #include \n outgoingLight = diffuseColor.rgb;\n #include \n #include \n #include \n #include \n #include \n}"; +const vertex$a = "#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n #include \n #include \n #include \n #include \n #include \n #endif\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n}"; +const fragment$a = "uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n varying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n vec4 diffuseColor = vec4( diffuse, opacity );\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n #ifdef USE_LIGHTMAP\n vec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n reflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\n #else\n reflectedLight.indirectDiffuse += vec3( 1.0 );\n #endif\n #include \n reflectedLight.indirectDiffuse *= diffuseColor.rgb;\n vec3 outgoingLight = reflectedLight.indirectDiffuse;\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n}"; +const vertex$9 = "#define LAMBERT\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n vViewPosition = - mvPosition.xyz;\n #include \n #include \n #include \n #include \n}"; +const fragment$9 = "#define LAMBERT\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n vec4 diffuseColor = vec4( diffuse, opacity );\n #include \n ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n vec3 totalEmissiveRadiance = emissive;\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n}"; +const vertex$8 = "#define MATCAP\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n vViewPosition = - mvPosition.xyz;\n}"; +const fragment$8 = "#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n vec4 diffuseColor = vec4( diffuse, opacity );\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n vec3 viewDir = normalize( vViewPosition );\n vec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n vec3 y = cross( viewDir, x );\n vec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n #ifdef USE_MATCAP\n vec4 matcapColor = texture2D( matcap, uv );\n #else\n vec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\n #endif\n vec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n #include \n #include \n #include \n #include \n #include \n #include \n}"; +const vertex$7 = "#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n varying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n vViewPosition = - mvPosition.xyz;\n#endif\n}"; +const fragment$7 = "#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n varying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n vec4 diffuseColor = vec4( 0.0, 0.0, 0.0, opacity );\n #include \n #include \n #include \n #include \n gl_FragColor = vec4( packNormalToRGB( normal ), diffuseColor.a );\n #ifdef OPAQUE\n gl_FragColor.a = 1.0;\n #endif\n}"; +const vertex$6 = "#define PHONG\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n vViewPosition = - mvPosition.xyz;\n #include \n #include \n #include \n #include \n}"; +const fragment$6 = "#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n vec4 diffuseColor = vec4( diffuse, opacity );\n #include \n ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n vec3 totalEmissiveRadiance = emissive;\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n}"; +const vertex$5 = "#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\n varying vec3 vWorldPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n vViewPosition = - mvPosition.xyz;\n #include \n #include \n #include \n#ifdef USE_TRANSMISSION\n vWorldPosition = worldPosition.xyz;\n#endif\n}"; +const fragment$5 = "#define STANDARD\n#ifdef PHYSICAL\n #define IOR\n #define USE_SPECULAR\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef IOR\n uniform float ior;\n#endif\n#ifdef USE_SPECULAR\n uniform float specularIntensity;\n uniform vec3 specularColor;\n #ifdef USE_SPECULAR_COLORMAP\n uniform sampler2D specularColorMap;\n #endif\n #ifdef USE_SPECULAR_INTENSITYMAP\n uniform sampler2D specularIntensityMap;\n #endif\n#endif\n#ifdef USE_CLEARCOAT\n uniform float clearcoat;\n uniform float clearcoatRoughness;\n#endif\n#ifdef USE_DISPERSION\n uniform float dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n uniform float iridescence;\n uniform float iridescenceIOR;\n uniform float iridescenceThicknessMinimum;\n uniform float iridescenceThicknessMaximum;\n#endif\n#ifdef USE_SHEEN\n uniform vec3 sheenColor;\n uniform float sheenRoughness;\n #ifdef USE_SHEEN_COLORMAP\n uniform sampler2D sheenColorMap;\n #endif\n #ifdef USE_SHEEN_ROUGHNESSMAP\n uniform sampler2D sheenRoughnessMap;\n #endif\n#endif\n#ifdef USE_ANISOTROPY\n uniform vec2 anisotropyVector;\n #ifdef USE_ANISOTROPYMAP\n uniform sampler2D anisotropyMap;\n #endif\n#endif\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n vec4 diffuseColor = vec4( diffuse, opacity );\n #include \n ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n vec3 totalEmissiveRadiance = emissive;\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n vec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n vec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n #include \n vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n #ifdef USE_SHEEN\n float sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\n outgoingLight = outgoingLight * sheenEnergyComp + sheenSpecularDirect + sheenSpecularIndirect;\n #endif\n #ifdef USE_CLEARCOAT\n float dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) );\n vec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n outgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;\n #endif\n #include \n #include \n #include \n #include \n #include \n #include \n}"; +const vertex$4 = "#define TOON\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n vViewPosition = - mvPosition.xyz;\n #include \n #include \n #include \n}"; +const fragment$4 = "#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n vec4 diffuseColor = vec4( diffuse, opacity );\n #include \n ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n vec3 totalEmissiveRadiance = emissive;\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n #include \n #include \n #include \n #include \n #include \n #include \n}"; +const vertex$3 = "uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \n#ifdef USE_POINTS_UV\n varying vec2 vUv;\n uniform mat3 uvTransform;\n#endif\nvoid main() {\n #ifdef USE_POINTS_UV\n vUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n #endif\n #include \n #include \n #include \n #include \n #include \n #include \n gl_PointSize = size;\n #ifdef USE_SIZEATTENUATION\n bool isPerspective = isPerspectiveMatrix( projectionMatrix );\n if ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n #endif\n #include \n #include \n #include \n #include \n}"; +const fragment$3 = "uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n vec4 diffuseColor = vec4( diffuse, opacity );\n #include \n vec3 outgoingLight = vec3( 0.0 );\n #include \n #include \n #include \n #include \n #include \n outgoingLight = diffuseColor.rgb;\n #include \n #include \n #include \n #include \n #include \n}"; +const vertex$2 = "#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n}"; +const fragment$2 = "uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n gl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n #include \n #include \n #include \n}"; +const vertex$1 = "uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n vec4 mvPosition = modelViewMatrix[ 3 ];\n vec2 scale = vec2( length( modelMatrix[ 0 ].xyz ), length( modelMatrix[ 1 ].xyz ) );\n #ifndef USE_SIZEATTENUATION\n bool isPerspective = isPerspectiveMatrix( projectionMatrix );\n if ( isPerspective ) scale *= - mvPosition.z;\n #endif\n vec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n vec2 rotatedPosition;\n rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n mvPosition.xy += rotatedPosition;\n gl_Position = projectionMatrix * mvPosition;\n #include \n #include \n #include \n}"; +const fragment$1 = "uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n vec4 diffuseColor = vec4( diffuse, opacity );\n #include \n vec3 outgoingLight = vec3( 0.0 );\n #include \n #include \n #include \n #include \n #include \n outgoingLight = diffuseColor.rgb;\n #include \n #include \n #include \n #include \n}"; +const ShaderChunk = { + 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_physical_pars_fragment, + envmap_vertex, + fog_vertex, + fog_pars_vertex, + fog_fragment, + fog_pars_fragment, + gradientmap_pars_fragment, + lightmap_pars_fragment, + lights_lambert_fragment, + lights_lambert_pars_fragment, + lights_pars_begin, + 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, + background_vert: vertex$h, + background_frag: fragment$h, + backgroundCube_vert: vertex$g, + backgroundCube_frag: fragment$g, + cube_vert: vertex$f, + cube_frag: fragment$f, + depth_vert: vertex$e, + depth_frag: fragment$e, + distanceRGBA_vert: vertex$d, + distanceRGBA_frag: fragment$d, + equirect_vert: vertex$c, + equirect_frag: fragment$c, + linedashed_vert: vertex$b, + linedashed_frag: fragment$b, + meshbasic_vert: vertex$a, + meshbasic_frag: fragment$a, + meshlambert_vert: vertex$9, + meshlambert_frag: fragment$9, + meshmatcap_vert: vertex$8, + meshmatcap_frag: fragment$8, + meshnormal_vert: vertex$7, + meshnormal_frag: fragment$7, + meshphong_vert: vertex$6, + meshphong_frag: fragment$6, + meshphysical_vert: vertex$5, + meshphysical_frag: fragment$5, + meshtoon_vert: vertex$4, + meshtoon_frag: fragment$4, + points_vert: vertex$3, + points_frag: fragment$3, + shadow_vert: vertex$2, + shadow_frag: fragment$2, + sprite_vert: vertex$1, + sprite_frag: fragment$1 +}; +const UniformsLib = { + common: { + diffuse: { value: /* @__PURE__ */ new Color(16777215) }, + opacity: { value: 1 }, + map: { value: null }, + mapTransform: { value: /* @__PURE__ */ new Matrix3() }, + alphaMap: { value: null }, + alphaMapTransform: { value: /* @__PURE__ */ new Matrix3() }, + alphaTest: { value: 0 } + }, + specularmap: { + specularMap: { value: null }, + specularMapTransform: { value: /* @__PURE__ */ new Matrix3() } + }, + envmap: { + envMap: { value: null }, + envMapRotation: { value: /* @__PURE__ */ new Matrix3() }, + flipEnvMap: { value: -1 }, + reflectivity: { value: 1 }, + // basic, lambert, phong + ior: { value: 1.5 }, + // physical + refractionRatio: { value: 0.98 } + // basic, lambert, phong + }, + aomap: { + aoMap: { value: null }, + aoMapIntensity: { value: 1 }, + aoMapTransform: { value: /* @__PURE__ */ new Matrix3() } + }, + lightmap: { + lightMap: { value: null }, + lightMapIntensity: { value: 1 }, + lightMapTransform: { value: /* @__PURE__ */ new Matrix3() } + }, + bumpmap: { + bumpMap: { value: null }, + bumpMapTransform: { value: /* @__PURE__ */ new Matrix3() }, + bumpScale: { value: 1 } + }, + normalmap: { + normalMap: { value: null }, + normalMapTransform: { value: /* @__PURE__ */ new Matrix3() }, + normalScale: { value: /* @__PURE__ */ new Vector2(1, 1) } + }, + displacementmap: { + displacementMap: { value: null }, + displacementMapTransform: { value: /* @__PURE__ */ new Matrix3() }, + displacementScale: { value: 1 }, + displacementBias: { value: 0 } + }, + emissivemap: { + emissiveMap: { value: null }, + emissiveMapTransform: { value: /* @__PURE__ */ new Matrix3() } + }, + metalnessmap: { + metalnessMap: { value: null }, + metalnessMapTransform: { value: /* @__PURE__ */ new Matrix3() } + }, + roughnessmap: { + roughnessMap: { value: null }, + roughnessMapTransform: { value: /* @__PURE__ */ new Matrix3() } + }, + gradientmap: { + gradientMap: { value: null } + }, + fog: { + fogDensity: { value: 25e-5 }, + fogNear: { value: 1 }, + fogFar: { value: 2e3 }, + fogColor: { value: /* @__PURE__ */ new Color(16777215) } + }, + lights: { + ambientLightColor: { value: [] }, + lightProbe: { value: [] }, + directionalLights: { value: [], properties: { + direction: {}, + color: {} + } }, + directionalLightShadows: { value: [], properties: { + shadowIntensity: 1, + shadowBias: {}, + shadowNormalBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + directionalShadowMap: { value: [] }, + directionalShadowMatrix: { value: [] }, + spotLights: { value: [], properties: { + color: {}, + position: {}, + direction: {}, + distance: {}, + coneCos: {}, + penumbraCos: {}, + decay: {} + } }, + spotLightShadows: { value: [], properties: { + shadowIntensity: 1, + shadowBias: {}, + shadowNormalBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + spotLightMap: { value: [] }, + spotShadowMap: { value: [] }, + spotLightMatrix: { value: [] }, + pointLights: { value: [], properties: { + color: {}, + position: {}, + decay: {}, + distance: {} + } }, + pointLightShadows: { value: [], properties: { + shadowIntensity: 1, + shadowBias: {}, + shadowNormalBias: {}, + shadowRadius: {}, + shadowMapSize: {}, + shadowCameraNear: {}, + shadowCameraFar: {} + } }, + pointShadowMap: { value: [] }, + pointShadowMatrix: { value: [] }, + hemisphereLights: { value: [], properties: { + direction: {}, + skyColor: {}, + groundColor: {} + } }, + // TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src + rectAreaLights: { value: [], properties: { + color: {}, + position: {}, + width: {}, + height: {} + } }, + ltc_1: { value: null }, + ltc_2: { value: null } + }, + points: { + diffuse: { value: /* @__PURE__ */ new Color(16777215) }, + opacity: { value: 1 }, + size: { value: 1 }, + scale: { value: 1 }, + map: { value: null }, + alphaMap: { value: null }, + alphaMapTransform: { value: /* @__PURE__ */ new Matrix3() }, + alphaTest: { value: 0 }, + uvTransform: { value: /* @__PURE__ */ new Matrix3() } + }, + sprite: { + diffuse: { value: /* @__PURE__ */ new Color(16777215) }, + opacity: { value: 1 }, + center: { value: /* @__PURE__ */ new Vector2(0.5, 0.5) }, + rotation: { value: 0 }, + map: { value: null }, + mapTransform: { value: /* @__PURE__ */ new Matrix3() }, + alphaMap: { value: null }, + alphaMapTransform: { value: /* @__PURE__ */ new Matrix3() }, + alphaTest: { value: 0 } + } +}; +const ShaderLib = { + basic: { + uniforms: /* @__PURE__ */ mergeUniforms([ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.fog + ]), + vertexShader: ShaderChunk.meshbasic_vert, + fragmentShader: ShaderChunk.meshbasic_frag + }, + lambert: { + uniforms: /* @__PURE__ */ mergeUniforms([ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: /* @__PURE__ */ new Color(0) } } - let width, height, depth2, minX, minY, minZ; - let dstX, dstY, dstZ; - const image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[level] : srcTexture.image; - if (srcRegion !== null) { - width = srcRegion.max.x - srcRegion.min.x; - height = srcRegion.max.y - srcRegion.min.y; - depth2 = srcRegion.isBox3 ? srcRegion.max.z - srcRegion.min.z : 1; - minX = srcRegion.min.x; - minY = srcRegion.min.y; - minZ = srcRegion.isBox3 ? srcRegion.min.z : 0; - } else { - width = image.width; - height = image.height; - depth2 = image.depth || 1; - minX = 0; - minY = 0; - minZ = 0; + ]), + vertexShader: ShaderChunk.meshlambert_vert, + fragmentShader: ShaderChunk.meshlambert_frag + }, + phong: { + uniforms: /* @__PURE__ */ mergeUniforms([ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: /* @__PURE__ */ new Color(0) }, + specular: { value: /* @__PURE__ */ new Color(1118481) }, + shininess: { value: 30 } } - if (dstPosition !== null) { - dstX = dstPosition.x; - dstY = dstPosition.y; - dstZ = dstPosition.z; - } else { - dstX = 0; - dstY = 0; - dstZ = 0; + ]), + vertexShader: ShaderChunk.meshphong_vert, + fragmentShader: ShaderChunk.meshphong_frag + }, + standard: { + uniforms: /* @__PURE__ */ mergeUniforms([ + UniformsLib.common, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.roughnessmap, + UniformsLib.metalnessmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: /* @__PURE__ */ new Color(0) }, + roughness: { value: 1 }, + metalness: { value: 0 }, + envMapIntensity: { value: 1 } } - const glFormat = utils.convert(dstTexture.format); - const glType = utils.convert(dstTexture.type); - let glTarget; - if (dstTexture.isData3DTexture) { - textures.setTexture3D(dstTexture, 0); - glTarget = _gl.TEXTURE_3D; - } else if (dstTexture.isDataArrayTexture || dstTexture.isCompressedArrayTexture) { - textures.setTexture2DArray(dstTexture, 0); - glTarget = _gl.TEXTURE_2D_ARRAY; - } else { - textures.setTexture2D(dstTexture, 0); - glTarget = _gl.TEXTURE_2D; + ]), + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag + }, + toon: { + uniforms: /* @__PURE__ */ mergeUniforms([ + UniformsLib.common, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.gradientmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: /* @__PURE__ */ new Color(0) } } - _gl.pixelStorei(_gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY); - _gl.pixelStorei(_gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha); - _gl.pixelStorei(_gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment); - const currentUnpackRowLen = _gl.getParameter(_gl.UNPACK_ROW_LENGTH); - const currentUnpackImageHeight = _gl.getParameter(_gl.UNPACK_IMAGE_HEIGHT); - const currentUnpackSkipPixels = _gl.getParameter(_gl.UNPACK_SKIP_PIXELS); - const currentUnpackSkipRows = _gl.getParameter(_gl.UNPACK_SKIP_ROWS); - const currentUnpackSkipImages = _gl.getParameter(_gl.UNPACK_SKIP_IMAGES); - _gl.pixelStorei(_gl.UNPACK_ROW_LENGTH, image.width); - _gl.pixelStorei(_gl.UNPACK_IMAGE_HEIGHT, image.height); - _gl.pixelStorei(_gl.UNPACK_SKIP_PIXELS, minX); - _gl.pixelStorei(_gl.UNPACK_SKIP_ROWS, minY); - _gl.pixelStorei(_gl.UNPACK_SKIP_IMAGES, minZ); - const isSrc3D = srcTexture.isDataArrayTexture || srcTexture.isData3DTexture; - const isDst3D = dstTexture.isDataArrayTexture || dstTexture.isData3DTexture; - if (srcTexture.isRenderTargetTexture || srcTexture.isDepthTexture) { - const srcTextureProperties = properties.get(srcTexture); - const dstTextureProperties = properties.get(dstTexture); - const srcRenderTargetProperties = properties.get(srcTextureProperties.__renderTarget); - const dstRenderTargetProperties = properties.get(dstTextureProperties.__renderTarget); - state.bindFramebuffer(_gl.READ_FRAMEBUFFER, srcRenderTargetProperties.__webglFramebuffer); - state.bindFramebuffer(_gl.DRAW_FRAMEBUFFER, dstRenderTargetProperties.__webglFramebuffer); - for (let i = 0; i < depth2; i++) { - if (isSrc3D) { - _gl.framebufferTextureLayer(_gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, properties.get(srcTexture).__webglTexture, level, minZ + i); - } - if (srcTexture.isDepthTexture) { - if (isDst3D) { - _gl.framebufferTextureLayer(_gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, properties.get(dstTexture).__webglTexture, level, dstZ + i); - } - _gl.blitFramebuffer(minX, minY, width, height, dstX, dstY, width, height, _gl.DEPTH_BUFFER_BIT, _gl.NEAREST); - } else if (isDst3D) { - _gl.copyTexSubImage3D(glTarget, level, dstX, dstY, dstZ + i, minX, minY, width, height); - } else { - _gl.copyTexSubImage2D(glTarget, level, dstX, dstY, dstZ + i, minX, minY, width, height); - } - } - state.bindFramebuffer(_gl.READ_FRAMEBUFFER, null); - state.bindFramebuffer(_gl.DRAW_FRAMEBUFFER, null); - } else { - if (isDst3D) { - if (srcTexture.isDataTexture || srcTexture.isData3DTexture) { - _gl.texSubImage3D(glTarget, level, dstX, dstY, dstZ, width, height, depth2, glFormat, glType, image.data); - } else if (dstTexture.isCompressedArrayTexture) { - _gl.compressedTexSubImage3D(glTarget, level, dstX, dstY, dstZ, width, height, depth2, glFormat, image.data); - } else { - _gl.texSubImage3D(glTarget, level, dstX, dstY, dstZ, width, height, depth2, glFormat, glType, image); - } - } else { - if (srcTexture.isDataTexture) { - _gl.texSubImage2D(_gl.TEXTURE_2D, level, dstX, dstY, width, height, glFormat, glType, image.data); - } else if (srcTexture.isCompressedTexture) { - _gl.compressedTexSubImage2D(_gl.TEXTURE_2D, level, dstX, dstY, image.width, image.height, glFormat, image.data); - } else { - _gl.texSubImage2D(_gl.TEXTURE_2D, level, dstX, dstY, width, height, glFormat, glType, image); - } - } + ]), + vertexShader: ShaderChunk.meshtoon_vert, + fragmentShader: ShaderChunk.meshtoon_frag + }, + matcap: { + uniforms: /* @__PURE__ */ mergeUniforms([ + UniformsLib.common, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.fog, + { + matcap: { value: null } } - _gl.pixelStorei(_gl.UNPACK_ROW_LENGTH, currentUnpackRowLen); - _gl.pixelStorei(_gl.UNPACK_IMAGE_HEIGHT, currentUnpackImageHeight); - _gl.pixelStorei(_gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels); - _gl.pixelStorei(_gl.UNPACK_SKIP_ROWS, currentUnpackSkipRows); - _gl.pixelStorei(_gl.UNPACK_SKIP_IMAGES, currentUnpackSkipImages); - if (level === 0 && dstTexture.generateMipmaps) { - _gl.generateMipmap(glTarget); + ]), + vertexShader: ShaderChunk.meshmatcap_vert, + fragmentShader: ShaderChunk.meshmatcap_frag + }, + points: { + uniforms: /* @__PURE__ */ mergeUniforms([ + UniformsLib.points, + UniformsLib.fog + ]), + vertexShader: ShaderChunk.points_vert, + fragmentShader: ShaderChunk.points_frag + }, + dashed: { + uniforms: /* @__PURE__ */ mergeUniforms([ + UniformsLib.common, + UniformsLib.fog, + { + scale: { value: 1 }, + dashSize: { value: 1 }, + totalSize: { value: 2 } } - state.unbindTexture(); - }; - this.copyTextureToTexture3D = function(srcTexture, dstTexture, srcRegion = null, dstPosition = null, level = 0) { - if (srcTexture.isTexture !== true) { - warnOnce("WebGLRenderer: copyTextureToTexture3D function signature has changed."); - srcRegion = arguments[0] || null; - dstPosition = arguments[1] || null; - srcTexture = arguments[2]; - dstTexture = arguments[3]; - level = arguments[4] || 0; + ]), + vertexShader: ShaderChunk.linedashed_vert, + fragmentShader: ShaderChunk.linedashed_frag + }, + depth: { + uniforms: /* @__PURE__ */ mergeUniforms([ + UniformsLib.common, + UniformsLib.displacementmap + ]), + vertexShader: ShaderChunk.depth_vert, + fragmentShader: ShaderChunk.depth_frag + }, + normal: { + uniforms: /* @__PURE__ */ mergeUniforms([ + UniformsLib.common, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + { + opacity: { value: 1 } } - warnOnce('WebGLRenderer: copyTextureToTexture3D function has been deprecated. Use "copyTextureToTexture" instead.'); - return this.copyTextureToTexture(srcTexture, dstTexture, srcRegion, dstPosition, level); - }; - this.initRenderTarget = function(target) { - if (properties.get(target).__webglFramebuffer === void 0) { - textures.setupRenderTarget(target); + ]), + vertexShader: ShaderChunk.meshnormal_vert, + fragmentShader: ShaderChunk.meshnormal_frag + }, + sprite: { + uniforms: /* @__PURE__ */ mergeUniforms([ + UniformsLib.sprite, + UniformsLib.fog + ]), + vertexShader: ShaderChunk.sprite_vert, + fragmentShader: ShaderChunk.sprite_frag + }, + background: { + uniforms: { + uvTransform: { value: /* @__PURE__ */ new Matrix3() }, + t2D: { value: null }, + backgroundIntensity: { value: 1 } + }, + vertexShader: ShaderChunk.background_vert, + fragmentShader: ShaderChunk.background_frag + }, + backgroundCube: { + uniforms: { + envMap: { value: null }, + flipEnvMap: { value: -1 }, + backgroundBlurriness: { value: 0 }, + backgroundIntensity: { value: 1 }, + backgroundRotation: { value: /* @__PURE__ */ new Matrix3() } + }, + vertexShader: ShaderChunk.backgroundCube_vert, + fragmentShader: ShaderChunk.backgroundCube_frag + }, + cube: { + uniforms: { + tCube: { value: null }, + tFlip: { value: -1 }, + opacity: { value: 1 } + }, + vertexShader: ShaderChunk.cube_vert, + fragmentShader: ShaderChunk.cube_frag + }, + equirect: { + uniforms: { + tEquirect: { value: null } + }, + vertexShader: ShaderChunk.equirect_vert, + fragmentShader: ShaderChunk.equirect_frag + }, + distanceRGBA: { + uniforms: /* @__PURE__ */ mergeUniforms([ + UniformsLib.common, + UniformsLib.displacementmap, + { + referencePosition: { value: /* @__PURE__ */ new Vector3() }, + nearDistance: { value: 1 }, + farDistance: { value: 1e3 } } - }; - this.initTexture = function(texture) { - if (texture.isCubeTexture) { - textures.setTextureCube(texture, 0); - } else if (texture.isData3DTexture) { - textures.setTexture3D(texture, 0); - } else if (texture.isDataArrayTexture || texture.isCompressedArrayTexture) { - textures.setTexture2DArray(texture, 0); - } else { - textures.setTexture2D(texture, 0); + ]), + vertexShader: ShaderChunk.distanceRGBA_vert, + fragmentShader: ShaderChunk.distanceRGBA_frag + }, + shadow: { + uniforms: /* @__PURE__ */ mergeUniforms([ + UniformsLib.lights, + UniformsLib.fog, + { + color: { value: /* @__PURE__ */ new Color(0) }, + opacity: { value: 1 } } - state.unbindTexture(); - }; - this.resetState = function() { - _currentActiveCubeFace = 0; - _currentActiveMipmapLevel = 0; - _currentRenderTarget = null; - state.reset(); - bindingStates.reset(); - }; - if (typeof __THREE_DEVTOOLS__ !== "undefined") { - __THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe", { detail: this })); - } - } - get coordinateSystem() { - return WebGLCoordinateSystem; - } - get outputColorSpace() { - return this._outputColorSpace; - } - set outputColorSpace(colorSpace) { - this._outputColorSpace = colorSpace; - const gl = this.getContext(); - gl.drawingBufferColorspace = ColorManagement._getDrawingBufferColorSpace(colorSpace); - gl.unpackColorSpace = ColorManagement._getUnpackColorSpace(); - } -} -class FogExp2 { - static { - __name(this, "FogExp2"); - } - constructor(color, density = 25e-5) { - this.isFogExp2 = true; - this.name = ""; - this.color = new Color(color); - this.density = density; - } - clone() { - return new FogExp2(this.color, this.density); - } - toJSON() { - return { - type: "FogExp2", - name: this.name, - color: this.color.getHex(), - density: this.density - }; - } -} -class Fog { - static { - __name(this, "Fog"); - } - constructor(color, near = 1, far = 1e3) { - this.isFog = true; - this.name = ""; - this.color = new Color(color); - this.near = near; - this.far = far; - } - clone() { - return new Fog(this.color, this.near, this.far); - } - toJSON() { - return { - type: "Fog", - name: this.name, - color: this.color.getHex(), - near: this.near, - far: this.far - }; - } -} -class Scene extends Object3D { - static { - __name(this, "Scene"); - } - constructor() { - super(); - this.isScene = true; - this.type = "Scene"; - this.background = null; - this.environment = null; - this.fog = null; - this.backgroundBlurriness = 0; - this.backgroundIntensity = 1; - this.backgroundRotation = new Euler(); - this.environmentIntensity = 1; - this.environmentRotation = new Euler(); - this.overrideMaterial = null; - if (typeof __THREE_DEVTOOLS__ !== "undefined") { - __THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe", { detail: this })); - } - } - copy(source, recursive) { - super.copy(source, recursive); - if (source.background !== null) this.background = source.background.clone(); - if (source.environment !== null) this.environment = source.environment.clone(); - if (source.fog !== null) this.fog = source.fog.clone(); - this.backgroundBlurriness = source.backgroundBlurriness; - this.backgroundIntensity = source.backgroundIntensity; - this.backgroundRotation.copy(source.backgroundRotation); - this.environmentIntensity = source.environmentIntensity; - this.environmentRotation.copy(source.environmentRotation); - if (source.overrideMaterial !== null) this.overrideMaterial = source.overrideMaterial.clone(); - this.matrixAutoUpdate = source.matrixAutoUpdate; - return this; - } - toJSON(meta) { - const data = super.toJSON(meta); - if (this.fog !== null) data.object.fog = this.fog.toJSON(); - if (this.backgroundBlurriness > 0) data.object.backgroundBlurriness = this.backgroundBlurriness; - if (this.backgroundIntensity !== 1) data.object.backgroundIntensity = this.backgroundIntensity; - data.object.backgroundRotation = this.backgroundRotation.toArray(); - if (this.environmentIntensity !== 1) data.object.environmentIntensity = this.environmentIntensity; - data.object.environmentRotation = this.environmentRotation.toArray(); - return data; - } -} -class InterleavedBuffer { - static { - __name(this, "InterleavedBuffer"); - } - constructor(array, stride) { - this.isInterleavedBuffer = true; - this.array = array; - this.stride = stride; - this.count = array !== void 0 ? array.length / stride : 0; - this.usage = StaticDrawUsage; - this.updateRanges = []; - this.version = 0; - this.uuid = generateUUID(); - } - onUploadCallback() { - } - set needsUpdate(value) { - if (value === true) this.version++; - } - setUsage(value) { - this.usage = value; - return this; - } - addUpdateRange(start, count) { - this.updateRanges.push({ start, count }); - } - clearUpdateRanges() { - this.updateRanges.length = 0; - } - copy(source) { - this.array = new source.array.constructor(source.array); - this.count = source.count; - this.stride = source.stride; - this.usage = source.usage; - return this; - } - copyAt(index1, attribute, index2) { - index1 *= this.stride; - index2 *= attribute.stride; - for (let i = 0, l = this.stride; i < l; i++) { - this.array[index1 + i] = attribute.array[index2 + i]; - } - return this; - } - set(value, offset = 0) { - this.array.set(value, offset); - return this; - } - clone(data) { - if (data.arrayBuffers === void 0) { - data.arrayBuffers = {}; - } - if (this.array.buffer._uuid === void 0) { - this.array.buffer._uuid = generateUUID(); - } - if (data.arrayBuffers[this.array.buffer._uuid] === void 0) { - data.arrayBuffers[this.array.buffer._uuid] = this.array.slice(0).buffer; - } - const array = new this.array.constructor(data.arrayBuffers[this.array.buffer._uuid]); - const ib = new this.constructor(array, this.stride); - ib.setUsage(this.usage); - return ib; - } - onUpload(callback) { - this.onUploadCallback = callback; - return this; - } - toJSON(data) { - if (data.arrayBuffers === void 0) { - data.arrayBuffers = {}; - } - if (this.array.buffer._uuid === void 0) { - this.array.buffer._uuid = generateUUID(); - } - if (data.arrayBuffers[this.array.buffer._uuid] === void 0) { - data.arrayBuffers[this.array.buffer._uuid] = Array.from(new Uint32Array(this.array.buffer)); - } - return { - uuid: this.uuid, - buffer: this.array.buffer._uuid, - type: this.array.constructor.name, - stride: this.stride - }; - } -} -const _vector$6 = /* @__PURE__ */ new Vector3(); -class InterleavedBufferAttribute { - static { - __name(this, "InterleavedBufferAttribute"); - } - constructor(interleavedBuffer, itemSize, offset, normalized = false) { - this.isInterleavedBufferAttribute = true; - this.name = ""; - this.data = interleavedBuffer; - this.itemSize = itemSize; - this.offset = offset; - this.normalized = normalized; - } - get count() { - return this.data.count; - } - get array() { - return this.data.array; - } - set needsUpdate(value) { - this.data.needsUpdate = value; - } - applyMatrix4(m) { - for (let i = 0, l = this.data.count; i < l; i++) { - _vector$6.fromBufferAttribute(this, i); - _vector$6.applyMatrix4(m); - this.setXYZ(i, _vector$6.x, _vector$6.y, _vector$6.z); - } - return this; + ]), + vertexShader: ShaderChunk.shadow_vert, + fragmentShader: ShaderChunk.shadow_frag } - applyNormalMatrix(m) { - for (let i = 0, l = this.count; i < l; i++) { - _vector$6.fromBufferAttribute(this, i); - _vector$6.applyNormalMatrix(m); - this.setXYZ(i, _vector$6.x, _vector$6.y, _vector$6.z); +}; +ShaderLib.physical = { + uniforms: /* @__PURE__ */ mergeUniforms([ + ShaderLib.standard.uniforms, + { + clearcoat: { value: 0 }, + clearcoatMap: { value: null }, + clearcoatMapTransform: { value: /* @__PURE__ */ new Matrix3() }, + clearcoatNormalMap: { value: null }, + clearcoatNormalMapTransform: { value: /* @__PURE__ */ new Matrix3() }, + clearcoatNormalScale: { value: /* @__PURE__ */ new Vector2(1, 1) }, + clearcoatRoughness: { value: 0 }, + clearcoatRoughnessMap: { value: null }, + clearcoatRoughnessMapTransform: { value: /* @__PURE__ */ new Matrix3() }, + dispersion: { value: 0 }, + iridescence: { value: 0 }, + iridescenceMap: { value: null }, + iridescenceMapTransform: { value: /* @__PURE__ */ new Matrix3() }, + iridescenceIOR: { value: 1.3 }, + iridescenceThicknessMinimum: { value: 100 }, + iridescenceThicknessMaximum: { value: 400 }, + iridescenceThicknessMap: { value: null }, + iridescenceThicknessMapTransform: { value: /* @__PURE__ */ new Matrix3() }, + sheen: { value: 0 }, + sheenColor: { value: /* @__PURE__ */ new Color(0) }, + sheenColorMap: { value: null }, + sheenColorMapTransform: { value: /* @__PURE__ */ new Matrix3() }, + sheenRoughness: { value: 1 }, + sheenRoughnessMap: { value: null }, + sheenRoughnessMapTransform: { value: /* @__PURE__ */ new Matrix3() }, + transmission: { value: 0 }, + transmissionMap: { value: null }, + transmissionMapTransform: { value: /* @__PURE__ */ new Matrix3() }, + transmissionSamplerSize: { value: /* @__PURE__ */ new Vector2() }, + transmissionSamplerMap: { value: null }, + thickness: { value: 0 }, + thicknessMap: { value: null }, + thicknessMapTransform: { value: /* @__PURE__ */ new Matrix3() }, + attenuationDistance: { value: 0 }, + attenuationColor: { value: /* @__PURE__ */ new Color(0) }, + specularColor: { value: /* @__PURE__ */ new Color(1, 1, 1) }, + specularColorMap: { value: null }, + specularColorMapTransform: { value: /* @__PURE__ */ new Matrix3() }, + specularIntensity: { value: 1 }, + specularIntensityMap: { value: null }, + specularIntensityMapTransform: { value: /* @__PURE__ */ new Matrix3() }, + anisotropyVector: { value: /* @__PURE__ */ new Vector2() }, + anisotropyMap: { value: null }, + anisotropyMapTransform: { value: /* @__PURE__ */ new Matrix3() } } - return this; - } - transformDirection(m) { - for (let i = 0, l = this.count; i < l; i++) { - _vector$6.fromBufferAttribute(this, i); - _vector$6.transformDirection(m); - this.setXYZ(i, _vector$6.x, _vector$6.y, _vector$6.z); + ]), + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag +}; +const _rgb = { r: 0, b: 0, g: 0 }; +const _e1$1 = /* @__PURE__ */ new Euler(); +const _m1$1 = /* @__PURE__ */ new Matrix4(); +function WebGLBackground(renderer, cubemaps, cubeuvmaps, state, objects, alpha, premultipliedAlpha) { + const clearColor = new Color(0); + let clearAlpha = alpha === true ? 0 : 1; + let planeMesh; + let boxMesh; + let currentBackground = null; + let currentBackgroundVersion = 0; + let currentTonemapping = null; + function getBackground(scene) { + let background = scene.isScene === true ? scene.background : null; + if (background && background.isTexture) { + const usePMREM = scene.backgroundBlurriness > 0; + background = (usePMREM ? cubeuvmaps : cubemaps).get(background); } - return this; - } - getComponent(index, component) { - let value = this.array[index * this.data.stride + this.offset + component]; - if (this.normalized) value = denormalize(value, this.array); - return value; - } - setComponent(index, component, value) { - if (this.normalized) value = normalize(value, this.array); - this.data.array[index * this.data.stride + this.offset + component] = value; - return this; - } - setX(index, x) { - if (this.normalized) x = normalize(x, this.array); - this.data.array[index * this.data.stride + this.offset] = x; - return this; - } - setY(index, y) { - if (this.normalized) y = normalize(y, this.array); - this.data.array[index * this.data.stride + this.offset + 1] = y; - return this; - } - setZ(index, z) { - if (this.normalized) z = normalize(z, this.array); - this.data.array[index * this.data.stride + this.offset + 2] = z; - return this; - } - setW(index, w) { - if (this.normalized) w = normalize(w, this.array); - this.data.array[index * this.data.stride + this.offset + 3] = w; - return this; - } - getX(index) { - let x = this.data.array[index * this.data.stride + this.offset]; - if (this.normalized) x = denormalize(x, this.array); - return x; - } - getY(index) { - let y = this.data.array[index * this.data.stride + this.offset + 1]; - if (this.normalized) y = denormalize(y, this.array); - return y; - } - getZ(index) { - let z = this.data.array[index * this.data.stride + this.offset + 2]; - if (this.normalized) z = denormalize(z, this.array); - return z; - } - getW(index) { - let w = this.data.array[index * this.data.stride + this.offset + 3]; - if (this.normalized) w = denormalize(w, this.array); - return w; + return background; } - setXY(index, x, y) { - index = index * this.data.stride + this.offset; - if (this.normalized) { - x = normalize(x, this.array); - y = normalize(y, this.array); + __name(getBackground, "getBackground"); + function render(scene) { + let forceClear = false; + const background = getBackground(scene); + if (background === null) { + setClear(clearColor, clearAlpha); + } else if (background && background.isColor) { + setClear(background, 1); + forceClear = true; } - this.data.array[index + 0] = x; - this.data.array[index + 1] = y; - return this; - } - setXYZ(index, x, y, z) { - index = index * this.data.stride + this.offset; - if (this.normalized) { - x = normalize(x, this.array); - y = normalize(y, this.array); - z = normalize(z, this.array); + const environmentBlendMode = renderer.xr.getEnvironmentBlendMode(); + if (environmentBlendMode === "additive") { + state.buffers.color.setClear(0, 0, 0, 1, premultipliedAlpha); + } else if (environmentBlendMode === "alpha-blend") { + state.buffers.color.setClear(0, 0, 0, 0, premultipliedAlpha); } - this.data.array[index + 0] = x; - this.data.array[index + 1] = y; - this.data.array[index + 2] = z; - return this; - } - setXYZW(index, x, y, z, w) { - index = index * this.data.stride + this.offset; - if (this.normalized) { - x = normalize(x, this.array); - y = normalize(y, this.array); - z = normalize(z, this.array); - w = normalize(w, this.array); + if (renderer.autoClear || forceClear) { + state.buffers.depth.setTest(true); + state.buffers.depth.setMask(true); + state.buffers.color.setMask(true); + renderer.clear(renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil); } - this.data.array[index + 0] = x; - this.data.array[index + 1] = y; - this.data.array[index + 2] = z; - this.data.array[index + 3] = w; - return this; } - clone(data) { - if (data === void 0) { - console.log("THREE.InterleavedBufferAttribute.clone(): Cloning an interleaved buffer attribute will de-interleave buffer data."); - const array = []; - for (let i = 0; i < this.count; i++) { - const index = i * this.data.stride + this.offset; - for (let j = 0; j < this.itemSize; j++) { - array.push(this.data.array[index + j]); - } + __name(render, "render"); + function addToRenderList(renderList, scene) { + const background = getBackground(scene); + if (background && (background.isCubeTexture || background.mapping === CubeUVReflectionMapping)) { + if (boxMesh === void 0) { + boxMesh = new Mesh( + new BoxGeometry(1, 1, 1), + new ShaderMaterial({ + name: "BackgroundCubeMaterial", + uniforms: cloneUniforms(ShaderLib.backgroundCube.uniforms), + vertexShader: ShaderLib.backgroundCube.vertexShader, + fragmentShader: ShaderLib.backgroundCube.fragmentShader, + side: BackSide, + depthTest: false, + depthWrite: false, + fog: false + }) + ); + boxMesh.geometry.deleteAttribute("normal"); + boxMesh.geometry.deleteAttribute("uv"); + boxMesh.onBeforeRender = function(renderer2, scene2, camera) { + this.matrixWorld.copyPosition(camera.matrixWorld); + }; + Object.defineProperty(boxMesh.material, "envMap", { + get: /* @__PURE__ */ __name(function() { + return this.uniforms.envMap.value; + }, "get") + }); + objects.update(boxMesh); } - return new BufferAttribute(new this.array.constructor(array), this.itemSize, this.normalized); - } else { - if (data.interleavedBuffers === void 0) { - data.interleavedBuffers = {}; + _e1$1.copy(scene.backgroundRotation); + _e1$1.x *= -1; + _e1$1.y *= -1; + _e1$1.z *= -1; + if (background.isCubeTexture && background.isRenderTargetTexture === false) { + _e1$1.y *= -1; + _e1$1.z *= -1; } - if (data.interleavedBuffers[this.data.uuid] === void 0) { - data.interleavedBuffers[this.data.uuid] = this.data.clone(data); + boxMesh.material.uniforms.envMap.value = background; + boxMesh.material.uniforms.flipEnvMap.value = background.isCubeTexture && background.isRenderTargetTexture === false ? -1 : 1; + boxMesh.material.uniforms.backgroundBlurriness.value = scene.backgroundBlurriness; + boxMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity; + boxMesh.material.uniforms.backgroundRotation.value.setFromMatrix4(_m1$1.makeRotationFromEuler(_e1$1)); + boxMesh.material.toneMapped = ColorManagement.getTransfer(background.colorSpace) !== SRGBTransfer; + if (currentBackground !== background || currentBackgroundVersion !== background.version || currentTonemapping !== renderer.toneMapping) { + boxMesh.material.needsUpdate = true; + currentBackground = background; + currentBackgroundVersion = background.version; + currentTonemapping = renderer.toneMapping; } - return new InterleavedBufferAttribute(data.interleavedBuffers[this.data.uuid], this.itemSize, this.offset, this.normalized); - } - } - toJSON(data) { - if (data === void 0) { - console.log("THREE.InterleavedBufferAttribute.toJSON(): Serializing an interleaved buffer attribute will de-interleave buffer data."); - const array = []; - for (let i = 0; i < this.count; i++) { - const index = i * this.data.stride + this.offset; - for (let j = 0; j < this.itemSize; j++) { - array.push(this.data.array[index + j]); - } + boxMesh.layers.enableAll(); + renderList.unshift(boxMesh, boxMesh.geometry, boxMesh.material, 0, 0, null); + } else if (background && background.isTexture) { + if (planeMesh === void 0) { + planeMesh = new Mesh( + new PlaneGeometry(2, 2), + new ShaderMaterial({ + name: "BackgroundMaterial", + uniforms: cloneUniforms(ShaderLib.background.uniforms), + vertexShader: ShaderLib.background.vertexShader, + fragmentShader: ShaderLib.background.fragmentShader, + side: FrontSide, + depthTest: false, + depthWrite: false, + fog: false + }) + ); + planeMesh.geometry.deleteAttribute("normal"); + Object.defineProperty(planeMesh.material, "map", { + get: /* @__PURE__ */ __name(function() { + return this.uniforms.t2D.value; + }, "get") + }); + objects.update(planeMesh); } - return { - itemSize: this.itemSize, - type: this.array.constructor.name, - array, - normalized: this.normalized - }; - } else { - if (data.interleavedBuffers === void 0) { - data.interleavedBuffers = {}; + planeMesh.material.uniforms.t2D.value = background; + planeMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity; + planeMesh.material.toneMapped = ColorManagement.getTransfer(background.colorSpace) !== SRGBTransfer; + if (background.matrixAutoUpdate === true) { + background.updateMatrix(); } - if (data.interleavedBuffers[this.data.uuid] === void 0) { - data.interleavedBuffers[this.data.uuid] = this.data.toJSON(data); + planeMesh.material.uniforms.uvTransform.value.copy(background.matrix); + if (currentBackground !== background || currentBackgroundVersion !== background.version || currentTonemapping !== renderer.toneMapping) { + planeMesh.material.needsUpdate = true; + currentBackground = background; + currentBackgroundVersion = background.version; + currentTonemapping = renderer.toneMapping; } - return { - isInterleavedBufferAttribute: true, - itemSize: this.itemSize, - data: this.data.uuid, - offset: this.offset, - normalized: this.normalized - }; + planeMesh.layers.enableAll(); + renderList.unshift(planeMesh, planeMesh.geometry, planeMesh.material, 0, 0, null); } } -} -class SpriteMaterial extends Material { - static { - __name(this, "SpriteMaterial"); - } - static get type() { - return "SpriteMaterial"; - } - constructor(parameters) { - super(); - this.isSpriteMaterial = true; - this.color = new Color(16777215); - this.map = null; - this.alphaMap = null; - this.rotation = 0; - this.sizeAttenuation = true; - this.transparent = true; - this.fog = true; - this.setValues(parameters); - } - copy(source) { - super.copy(source); - this.color.copy(source.color); - this.map = source.map; - this.alphaMap = source.alphaMap; - this.rotation = source.rotation; - this.sizeAttenuation = source.sizeAttenuation; - this.fog = source.fog; - return this; + __name(addToRenderList, "addToRenderList"); + function setClear(color, alpha2) { + color.getRGB(_rgb, getUnlitUniformColorSpace(renderer)); + state.buffers.color.setClear(_rgb.r, _rgb.g, _rgb.b, alpha2, premultipliedAlpha); } + __name(setClear, "setClear"); + return { + getClearColor: /* @__PURE__ */ __name(function() { + return clearColor; + }, "getClearColor"), + setClearColor: /* @__PURE__ */ __name(function(color, alpha2 = 1) { + clearColor.set(color); + clearAlpha = alpha2; + setClear(clearColor, clearAlpha); + }, "setClearColor"), + getClearAlpha: /* @__PURE__ */ __name(function() { + return clearAlpha; + }, "getClearAlpha"), + setClearAlpha: /* @__PURE__ */ __name(function(alpha2) { + clearAlpha = alpha2; + setClear(clearColor, clearAlpha); + }, "setClearAlpha"), + render, + addToRenderList + }; } -let _geometry; -const _intersectPoint = /* @__PURE__ */ new Vector3(); -const _worldScale = /* @__PURE__ */ new Vector3(); -const _mvPosition = /* @__PURE__ */ new Vector3(); -const _alignedPosition = /* @__PURE__ */ new Vector2(); -const _rotatedPosition = /* @__PURE__ */ new Vector2(); -const _viewWorldMatrix = /* @__PURE__ */ new Matrix4(); -const _vA$2 = /* @__PURE__ */ new Vector3(); -const _vB$2 = /* @__PURE__ */ new Vector3(); -const _vC$2 = /* @__PURE__ */ new Vector3(); -const _uvA = /* @__PURE__ */ new Vector2(); -const _uvB = /* @__PURE__ */ new Vector2(); -const _uvC = /* @__PURE__ */ new Vector2(); -class Sprite extends Object3D { - static { - __name(this, "Sprite"); - } - constructor(material = new SpriteMaterial()) { - super(); - this.isSprite = true; - this.type = "Sprite"; - if (_geometry === void 0) { - _geometry = new BufferGeometry(); - const float32Array = new Float32Array([ - -0.5, - -0.5, - 0, - 0, - 0, - 0.5, - -0.5, - 0, - 1, - 0, - 0.5, - 0.5, - 0, - 1, - 1, - -0.5, - 0.5, - 0, - 0, - 1 - ]); - const interleavedBuffer = new InterleavedBuffer(float32Array, 5); - _geometry.setIndex([0, 1, 2, 0, 2, 3]); - _geometry.setAttribute("position", new InterleavedBufferAttribute(interleavedBuffer, 3, 0, false)); - _geometry.setAttribute("uv", new InterleavedBufferAttribute(interleavedBuffer, 2, 3, false)); - } - this.geometry = _geometry; - this.material = material; - this.center = new Vector2(0.5, 0.5); - } - raycast(raycaster, intersects2) { - if (raycaster.camera === null) { - console.error('THREE.Sprite: "Raycaster.camera" needs to be set in order to raycast against sprites.'); - } - _worldScale.setFromMatrixScale(this.matrixWorld); - _viewWorldMatrix.copy(raycaster.camera.matrixWorld); - this.modelViewMatrix.multiplyMatrices(raycaster.camera.matrixWorldInverse, this.matrixWorld); - _mvPosition.setFromMatrixPosition(this.modelViewMatrix); - if (raycaster.camera.isPerspectiveCamera && this.material.sizeAttenuation === false) { - _worldScale.multiplyScalar(-_mvPosition.z); +__name(WebGLBackground, "WebGLBackground"); +function WebGLBindingStates(gl, attributes) { + const maxVertexAttributes = gl.getParameter(gl.MAX_VERTEX_ATTRIBS); + const bindingStates = {}; + const defaultState = createBindingState(null); + let currentState = defaultState; + let forceUpdate = false; + function setup(object, material, program, geometry, index) { + let updateBuffers = false; + const state = getBindingState(geometry, program, material); + if (currentState !== state) { + currentState = state; + bindVertexArrayObject(currentState.object); } - const rotation = this.material.rotation; - let sin, cos; - if (rotation !== 0) { - cos = Math.cos(rotation); - sin = Math.sin(rotation); + updateBuffers = needsUpdate(object, geometry, program, index); + if (updateBuffers) saveCache(object, geometry, program, index); + if (index !== null) { + attributes.update(index, gl.ELEMENT_ARRAY_BUFFER); } - const center = this.center; - transformVertex(_vA$2.set(-0.5, -0.5, 0), _mvPosition, center, _worldScale, sin, cos); - transformVertex(_vB$2.set(0.5, -0.5, 0), _mvPosition, center, _worldScale, sin, cos); - transformVertex(_vC$2.set(0.5, 0.5, 0), _mvPosition, center, _worldScale, sin, cos); - _uvA.set(0, 0); - _uvB.set(1, 0); - _uvC.set(1, 1); - let intersect2 = raycaster.ray.intersectTriangle(_vA$2, _vB$2, _vC$2, false, _intersectPoint); - if (intersect2 === null) { - transformVertex(_vB$2.set(-0.5, 0.5, 0), _mvPosition, center, _worldScale, sin, cos); - _uvB.set(0, 1); - intersect2 = raycaster.ray.intersectTriangle(_vA$2, _vC$2, _vB$2, false, _intersectPoint); - if (intersect2 === null) { - return; + if (updateBuffers || forceUpdate) { + forceUpdate = false; + setupVertexAttributes(object, material, program, geometry); + if (index !== null) { + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, attributes.get(index).buffer); } } - const distance = raycaster.ray.origin.distanceTo(_intersectPoint); - if (distance < raycaster.near || distance > raycaster.far) return; - intersects2.push({ - distance, - point: _intersectPoint.clone(), - uv: Triangle.getInterpolation(_intersectPoint, _vA$2, _vB$2, _vC$2, _uvA, _uvB, _uvC, new Vector2()), - face: null, - object: this - }); - } - copy(source, recursive) { - super.copy(source, recursive); - if (source.center !== void 0) this.center.copy(source.center); - this.material = source.material; - return this; } -} -function transformVertex(vertexPosition, mvPosition, center, scale, sin, cos) { - _alignedPosition.subVectors(vertexPosition, center).addScalar(0.5).multiply(scale); - if (sin !== void 0) { - _rotatedPosition.x = cos * _alignedPosition.x - sin * _alignedPosition.y; - _rotatedPosition.y = sin * _alignedPosition.x + cos * _alignedPosition.y; - } else { - _rotatedPosition.copy(_alignedPosition); + __name(setup, "setup"); + function createVertexArrayObject() { + return gl.createVertexArray(); } - vertexPosition.copy(mvPosition); - vertexPosition.x += _rotatedPosition.x; - vertexPosition.y += _rotatedPosition.y; - vertexPosition.applyMatrix4(_viewWorldMatrix); -} -__name(transformVertex, "transformVertex"); -const _v1$2 = /* @__PURE__ */ new Vector3(); -const _v2$1 = /* @__PURE__ */ new Vector3(); -class LOD extends Object3D { - static { - __name(this, "LOD"); + __name(createVertexArrayObject, "createVertexArrayObject"); + function bindVertexArrayObject(vao) { + return gl.bindVertexArray(vao); } - constructor() { - super(); - this._currentLevel = 0; - this.type = "LOD"; - Object.defineProperties(this, { - levels: { - enumerable: true, - value: [] - }, - isLOD: { - value: true - } - }); - this.autoUpdate = true; + __name(bindVertexArrayObject, "bindVertexArrayObject"); + function deleteVertexArrayObject(vao) { + return gl.deleteVertexArray(vao); } - copy(source) { - super.copy(source, false); - const levels = source.levels; - for (let i = 0, l = levels.length; i < l; i++) { - const level = levels[i]; - this.addLevel(level.object.clone(), level.distance, level.hysteresis); + __name(deleteVertexArrayObject, "deleteVertexArrayObject"); + function getBindingState(geometry, program, material) { + const wireframe = material.wireframe === true; + let programMap = bindingStates[geometry.id]; + if (programMap === void 0) { + programMap = {}; + bindingStates[geometry.id] = programMap; } - this.autoUpdate = source.autoUpdate; - return this; + let stateMap = programMap[program.id]; + if (stateMap === void 0) { + stateMap = {}; + programMap[program.id] = stateMap; + } + let state = stateMap[wireframe]; + if (state === void 0) { + state = createBindingState(createVertexArrayObject()); + stateMap[wireframe] = state; + } + return state; } - addLevel(object, distance = 0, hysteresis = 0) { - distance = Math.abs(distance); - const levels = this.levels; - let l; - for (l = 0; l < levels.length; l++) { - if (distance < levels[l].distance) { - break; - } + __name(getBindingState, "getBindingState"); + function createBindingState(vao) { + const newAttributes = []; + const enabledAttributes = []; + const attributeDivisors = []; + for (let i = 0; i < maxVertexAttributes; i++) { + newAttributes[i] = 0; + enabledAttributes[i] = 0; + attributeDivisors[i] = 0; } - levels.splice(l, 0, { distance, hysteresis, object }); - this.add(object); - return this; + return { + // for backward compatibility on non-VAO support browser + geometry: null, + program: null, + wireframe: false, + newAttributes, + enabledAttributes, + attributeDivisors, + object: vao, + attributes: {}, + index: null + }; } - removeLevel(distance) { - const levels = this.levels; - for (let i = 0; i < levels.length; i++) { - if (levels[i].distance === distance) { - const removedElements = levels.splice(i, 1); - this.remove(removedElements[0].object); - return true; + __name(createBindingState, "createBindingState"); + function needsUpdate(object, geometry, program, index) { + const cachedAttributes = currentState.attributes; + const geometryAttributes = geometry.attributes; + let attributesNum = 0; + const programAttributes = program.getAttributes(); + for (const name in programAttributes) { + const programAttribute = programAttributes[name]; + if (programAttribute.location >= 0) { + const cachedAttribute = cachedAttributes[name]; + let geometryAttribute = geometryAttributes[name]; + if (geometryAttribute === void 0) { + if (name === "instanceMatrix" && object.instanceMatrix) geometryAttribute = object.instanceMatrix; + if (name === "instanceColor" && object.instanceColor) geometryAttribute = object.instanceColor; + } + if (cachedAttribute === void 0) return true; + if (cachedAttribute.attribute !== geometryAttribute) return true; + if (geometryAttribute && cachedAttribute.data !== geometryAttribute.data) return true; + attributesNum++; } } + if (currentState.attributesNum !== attributesNum) return true; + if (currentState.index !== index) return true; return false; } - getCurrentLevel() { - return this._currentLevel; - } - getObjectForDistance(distance) { - const levels = this.levels; - if (levels.length > 0) { - let i, l; - for (i = 1, l = levels.length; i < l; i++) { - let levelDistance = levels[i].distance; - if (levels[i].object.visible) { - levelDistance -= levelDistance * levels[i].hysteresis; + __name(needsUpdate, "needsUpdate"); + function saveCache(object, geometry, program, index) { + const cache = {}; + const attributes2 = geometry.attributes; + let attributesNum = 0; + const programAttributes = program.getAttributes(); + for (const name in programAttributes) { + const programAttribute = programAttributes[name]; + if (programAttribute.location >= 0) { + let attribute = attributes2[name]; + if (attribute === void 0) { + if (name === "instanceMatrix" && object.instanceMatrix) attribute = object.instanceMatrix; + if (name === "instanceColor" && object.instanceColor) attribute = object.instanceColor; } - if (distance < levelDistance) { - break; + const data = {}; + data.attribute = attribute; + if (attribute && attribute.data) { + data.data = attribute.data; } + cache[name] = data; + attributesNum++; } - return levels[i - 1].object; } - return null; + currentState.attributes = cache; + currentState.attributesNum = attributesNum; + currentState.index = index; } - raycast(raycaster, intersects2) { - const levels = this.levels; - if (levels.length > 0) { - _v1$2.setFromMatrixPosition(this.matrixWorld); - const distance = raycaster.ray.origin.distanceTo(_v1$2); - this.getObjectForDistance(distance).raycast(raycaster, intersects2); + __name(saveCache, "saveCache"); + function initAttributes() { + const newAttributes = currentState.newAttributes; + for (let i = 0, il = newAttributes.length; i < il; i++) { + newAttributes[i] = 0; } } - update(camera) { - const levels = this.levels; - if (levels.length > 1) { - _v1$2.setFromMatrixPosition(camera.matrixWorld); - _v2$1.setFromMatrixPosition(this.matrixWorld); - const distance = _v1$2.distanceTo(_v2$1) / camera.zoom; - levels[0].object.visible = true; - let i, l; - for (i = 1, l = levels.length; i < l; i++) { - let levelDistance = levels[i].distance; - if (levels[i].object.visible) { - levelDistance -= levelDistance * levels[i].hysteresis; - } - if (distance >= levelDistance) { - levels[i - 1].object.visible = false; - levels[i].object.visible = true; - } else { - break; - } - } - this._currentLevel = i - 1; - for (; i < l; i++) { - levels[i].object.visible = false; - } - } + __name(initAttributes, "initAttributes"); + function enableAttribute(attribute) { + enableAttributeAndDivisor(attribute, 0); } - toJSON(meta) { - const data = super.toJSON(meta); - if (this.autoUpdate === false) data.object.autoUpdate = false; - data.object.levels = []; - const levels = this.levels; - for (let i = 0, l = levels.length; i < l; i++) { - const level = levels[i]; - data.object.levels.push({ - object: level.object.uuid, - distance: level.distance, - hysteresis: level.hysteresis - }); + __name(enableAttribute, "enableAttribute"); + function enableAttributeAndDivisor(attribute, meshPerAttribute) { + const newAttributes = currentState.newAttributes; + const enabledAttributes = currentState.enabledAttributes; + const attributeDivisors = currentState.attributeDivisors; + newAttributes[attribute] = 1; + if (enabledAttributes[attribute] === 0) { + gl.enableVertexAttribArray(attribute); + enabledAttributes[attribute] = 1; + } + if (attributeDivisors[attribute] !== meshPerAttribute) { + gl.vertexAttribDivisor(attribute, meshPerAttribute); + attributeDivisors[attribute] = meshPerAttribute; } - return data; } -} -const _basePosition = /* @__PURE__ */ new Vector3(); -const _skinIndex = /* @__PURE__ */ new Vector4(); -const _skinWeight = /* @__PURE__ */ new Vector4(); -const _vector3 = /* @__PURE__ */ new Vector3(); -const _matrix4 = /* @__PURE__ */ new Matrix4(); -const _vertex = /* @__PURE__ */ new Vector3(); -const _sphere$4 = /* @__PURE__ */ new Sphere(); -const _inverseMatrix$2 = /* @__PURE__ */ new Matrix4(); -const _ray$2 = /* @__PURE__ */ new Ray(); -class SkinnedMesh extends Mesh { - static { - __name(this, "SkinnedMesh"); + __name(enableAttributeAndDivisor, "enableAttributeAndDivisor"); + function disableUnusedAttributes() { + const newAttributes = currentState.newAttributes; + const enabledAttributes = currentState.enabledAttributes; + for (let i = 0, il = enabledAttributes.length; i < il; i++) { + if (enabledAttributes[i] !== newAttributes[i]) { + gl.disableVertexAttribArray(i); + enabledAttributes[i] = 0; + } + } } - constructor(geometry, material) { - super(geometry, material); - this.isSkinnedMesh = true; - this.type = "SkinnedMesh"; - this.bindMode = AttachedBindMode; - this.bindMatrix = new Matrix4(); - this.bindMatrixInverse = new Matrix4(); - this.boundingBox = null; - this.boundingSphere = null; + __name(disableUnusedAttributes, "disableUnusedAttributes"); + function vertexAttribPointer(index, size, type, normalized, stride, offset, integer) { + if (integer === true) { + gl.vertexAttribIPointer(index, size, type, stride, offset); + } else { + gl.vertexAttribPointer(index, size, type, normalized, stride, offset); + } } - computeBoundingBox() { - const geometry = this.geometry; - if (this.boundingBox === null) { - this.boundingBox = new Box3(); + __name(vertexAttribPointer, "vertexAttribPointer"); + function setupVertexAttributes(object, material, program, geometry) { + initAttributes(); + const geometryAttributes = geometry.attributes; + const programAttributes = program.getAttributes(); + const materialDefaultAttributeValues = material.defaultAttributeValues; + for (const name in programAttributes) { + const programAttribute = programAttributes[name]; + if (programAttribute.location >= 0) { + let geometryAttribute = geometryAttributes[name]; + if (geometryAttribute === void 0) { + if (name === "instanceMatrix" && object.instanceMatrix) geometryAttribute = object.instanceMatrix; + if (name === "instanceColor" && object.instanceColor) geometryAttribute = object.instanceColor; + } + if (geometryAttribute !== void 0) { + const normalized = geometryAttribute.normalized; + const size = geometryAttribute.itemSize; + const attribute = attributes.get(geometryAttribute); + if (attribute === void 0) continue; + const buffer = attribute.buffer; + const type = attribute.type; + const bytesPerElement = attribute.bytesPerElement; + const integer = type === gl.INT || type === gl.UNSIGNED_INT || geometryAttribute.gpuType === IntType; + if (geometryAttribute.isInterleavedBufferAttribute) { + const data = geometryAttribute.data; + const stride = data.stride; + const offset = geometryAttribute.offset; + if (data.isInstancedInterleavedBuffer) { + for (let i = 0; i < programAttribute.locationSize; i++) { + enableAttributeAndDivisor(programAttribute.location + i, data.meshPerAttribute); + } + if (object.isInstancedMesh !== true && geometry._maxInstanceCount === void 0) { + geometry._maxInstanceCount = data.meshPerAttribute * data.count; + } + } else { + for (let i = 0; i < programAttribute.locationSize; i++) { + enableAttribute(programAttribute.location + i); + } + } + gl.bindBuffer(gl.ARRAY_BUFFER, buffer); + for (let i = 0; i < programAttribute.locationSize; i++) { + vertexAttribPointer( + programAttribute.location + i, + size / programAttribute.locationSize, + type, + normalized, + stride * bytesPerElement, + (offset + size / programAttribute.locationSize * i) * bytesPerElement, + integer + ); + } + } else { + if (geometryAttribute.isInstancedBufferAttribute) { + for (let i = 0; i < programAttribute.locationSize; i++) { + enableAttributeAndDivisor(programAttribute.location + i, geometryAttribute.meshPerAttribute); + } + if (object.isInstancedMesh !== true && geometry._maxInstanceCount === void 0) { + geometry._maxInstanceCount = geometryAttribute.meshPerAttribute * geometryAttribute.count; + } + } else { + for (let i = 0; i < programAttribute.locationSize; i++) { + enableAttribute(programAttribute.location + i); + } + } + gl.bindBuffer(gl.ARRAY_BUFFER, buffer); + for (let i = 0; i < programAttribute.locationSize; i++) { + vertexAttribPointer( + programAttribute.location + i, + size / programAttribute.locationSize, + type, + normalized, + size * bytesPerElement, + size / programAttribute.locationSize * i * bytesPerElement, + integer + ); + } + } + } else if (materialDefaultAttributeValues !== void 0) { + const value = materialDefaultAttributeValues[name]; + if (value !== void 0) { + switch (value.length) { + case 2: + gl.vertexAttrib2fv(programAttribute.location, value); + break; + case 3: + gl.vertexAttrib3fv(programAttribute.location, value); + break; + case 4: + gl.vertexAttrib4fv(programAttribute.location, value); + break; + default: + gl.vertexAttrib1fv(programAttribute.location, value); + } + } + } + } } - this.boundingBox.makeEmpty(); - const positionAttribute = geometry.getAttribute("position"); - for (let i = 0; i < positionAttribute.count; i++) { - this.getVertexPosition(i, _vertex); - this.boundingBox.expandByPoint(_vertex); + disableUnusedAttributes(); + } + __name(setupVertexAttributes, "setupVertexAttributes"); + function dispose() { + reset(); + for (const geometryId in bindingStates) { + const programMap = bindingStates[geometryId]; + for (const programId in programMap) { + const stateMap = programMap[programId]; + for (const wireframe in stateMap) { + deleteVertexArrayObject(stateMap[wireframe].object); + delete stateMap[wireframe]; + } + delete programMap[programId]; + } + delete bindingStates[geometryId]; } } - computeBoundingSphere() { - const geometry = this.geometry; - if (this.boundingSphere === null) { - this.boundingSphere = new Sphere(); + __name(dispose, "dispose"); + function releaseStatesOfGeometry(geometry) { + if (bindingStates[geometry.id] === void 0) return; + const programMap = bindingStates[geometry.id]; + for (const programId in programMap) { + const stateMap = programMap[programId]; + for (const wireframe in stateMap) { + deleteVertexArrayObject(stateMap[wireframe].object); + delete stateMap[wireframe]; + } + delete programMap[programId]; } - this.boundingSphere.makeEmpty(); - const positionAttribute = geometry.getAttribute("position"); - for (let i = 0; i < positionAttribute.count; i++) { - this.getVertexPosition(i, _vertex); - this.boundingSphere.expandByPoint(_vertex); + delete bindingStates[geometry.id]; + } + __name(releaseStatesOfGeometry, "releaseStatesOfGeometry"); + function releaseStatesOfProgram(program) { + for (const geometryId in bindingStates) { + const programMap = bindingStates[geometryId]; + if (programMap[program.id] === void 0) continue; + const stateMap = programMap[program.id]; + for (const wireframe in stateMap) { + deleteVertexArrayObject(stateMap[wireframe].object); + delete stateMap[wireframe]; + } + delete programMap[program.id]; } } - copy(source, recursive) { - super.copy(source, recursive); - this.bindMode = source.bindMode; - this.bindMatrix.copy(source.bindMatrix); - this.bindMatrixInverse.copy(source.bindMatrixInverse); - this.skeleton = source.skeleton; - if (source.boundingBox !== null) this.boundingBox = source.boundingBox.clone(); - if (source.boundingSphere !== null) this.boundingSphere = source.boundingSphere.clone(); - return this; + __name(releaseStatesOfProgram, "releaseStatesOfProgram"); + function reset() { + resetDefaultState(); + forceUpdate = true; + if (currentState === defaultState) return; + currentState = defaultState; + bindVertexArrayObject(currentState.object); } - raycast(raycaster, intersects2) { - const material = this.material; - const matrixWorld = this.matrixWorld; - if (material === void 0) return; - if (this.boundingSphere === null) this.computeBoundingSphere(); - _sphere$4.copy(this.boundingSphere); - _sphere$4.applyMatrix4(matrixWorld); - if (raycaster.ray.intersectsSphere(_sphere$4) === false) return; - _inverseMatrix$2.copy(matrixWorld).invert(); - _ray$2.copy(raycaster.ray).applyMatrix4(_inverseMatrix$2); - if (this.boundingBox !== null) { - if (_ray$2.intersectsBox(this.boundingBox) === false) return; - } - this._computeIntersections(raycaster, intersects2, _ray$2); + __name(reset, "reset"); + function resetDefaultState() { + defaultState.geometry = null; + defaultState.program = null; + defaultState.wireframe = false; } - getVertexPosition(index, target) { - super.getVertexPosition(index, target); - this.applyBoneTransform(index, target); - return target; + __name(resetDefaultState, "resetDefaultState"); + return { + setup, + reset, + resetDefaultState, + dispose, + releaseStatesOfGeometry, + releaseStatesOfProgram, + initAttributes, + enableAttribute, + disableUnusedAttributes + }; +} +__name(WebGLBindingStates, "WebGLBindingStates"); +function WebGLBufferRenderer(gl, extensions, info) { + let mode; + function setMode(value) { + mode = value; } - bind(skeleton, bindMatrix) { - this.skeleton = skeleton; - if (bindMatrix === void 0) { - this.updateMatrixWorld(true); - this.skeleton.calculateInverses(); - bindMatrix = this.matrixWorld; - } - this.bindMatrix.copy(bindMatrix); - this.bindMatrixInverse.copy(bindMatrix).invert(); + __name(setMode, "setMode"); + function render(start, count) { + gl.drawArrays(mode, start, count); + info.update(count, mode, 1); } - pose() { - this.skeleton.pose(); + __name(render, "render"); + function renderInstances(start, count, primcount) { + if (primcount === 0) return; + gl.drawArraysInstanced(mode, start, count, primcount); + info.update(count, mode, primcount); } - normalizeSkinWeights() { - const vector = new Vector4(); - const skinWeight = this.geometry.attributes.skinWeight; - for (let i = 0, l = skinWeight.count; i < l; i++) { - vector.fromBufferAttribute(skinWeight, i); - const scale = 1 / vector.manhattanLength(); - if (scale !== Infinity) { - vector.multiplyScalar(scale); - } else { - vector.set(1, 0, 0, 0); - } - skinWeight.setXYZW(i, vector.x, vector.y, vector.z, vector.w); + __name(renderInstances, "renderInstances"); + function renderMultiDraw(starts, counts, drawCount) { + if (drawCount === 0) return; + const extension = extensions.get("WEBGL_multi_draw"); + extension.multiDrawArraysWEBGL(mode, starts, 0, counts, 0, drawCount); + let elementCount = 0; + for (let i = 0; i < drawCount; i++) { + elementCount += counts[i]; } + info.update(elementCount, mode, 1); } - updateMatrixWorld(force) { - super.updateMatrixWorld(force); - if (this.bindMode === AttachedBindMode) { - this.bindMatrixInverse.copy(this.matrixWorld).invert(); - } else if (this.bindMode === DetachedBindMode) { - this.bindMatrixInverse.copy(this.bindMatrix).invert(); + __name(renderMultiDraw, "renderMultiDraw"); + function renderMultiDrawInstances(starts, counts, drawCount, primcount) { + if (drawCount === 0) return; + const extension = extensions.get("WEBGL_multi_draw"); + if (extension === null) { + for (let i = 0; i < starts.length; i++) { + renderInstances(starts[i], counts[i], primcount[i]); + } } else { - console.warn("THREE.SkinnedMesh: Unrecognized bindMode: " + this.bindMode); + extension.multiDrawArraysInstancedWEBGL(mode, starts, 0, counts, 0, primcount, 0, drawCount); + let elementCount = 0; + for (let i = 0; i < drawCount; i++) { + elementCount += counts[i] * primcount[i]; + } + info.update(elementCount, mode, 1); } } - applyBoneTransform(index, vector) { - const skeleton = this.skeleton; - const geometry = this.geometry; - _skinIndex.fromBufferAttribute(geometry.attributes.skinIndex, index); - _skinWeight.fromBufferAttribute(geometry.attributes.skinWeight, index); - _basePosition.copy(vector).applyMatrix4(this.bindMatrix); - vector.set(0, 0, 0); - for (let i = 0; i < 4; i++) { - const weight = _skinWeight.getComponent(i); - if (weight !== 0) { - const boneIndex = _skinIndex.getComponent(i); - _matrix4.multiplyMatrices(skeleton.bones[boneIndex].matrixWorld, skeleton.boneInverses[boneIndex]); - vector.addScaledVector(_vector3.copy(_basePosition).applyMatrix4(_matrix4), weight); - } + __name(renderMultiDrawInstances, "renderMultiDrawInstances"); + this.setMode = setMode; + this.render = render; + this.renderInstances = renderInstances; + this.renderMultiDraw = renderMultiDraw; + this.renderMultiDrawInstances = renderMultiDrawInstances; +} +__name(WebGLBufferRenderer, "WebGLBufferRenderer"); +function WebGLCapabilities(gl, extensions, parameters, utils) { + let maxAnisotropy; + function getMaxAnisotropy() { + if (maxAnisotropy !== void 0) return maxAnisotropy; + if (extensions.has("EXT_texture_filter_anisotropic") === true) { + const extension = extensions.get("EXT_texture_filter_anisotropic"); + maxAnisotropy = gl.getParameter(extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT); + } else { + maxAnisotropy = 0; } - return vector.applyMatrix4(this.bindMatrixInverse); + return maxAnisotropy; } -} -class Bone extends Object3D { - static { - __name(this, "Bone"); + __name(getMaxAnisotropy, "getMaxAnisotropy"); + function textureFormatReadable(textureFormat) { + if (textureFormat !== RGBAFormat && utils.convert(textureFormat) !== gl.getParameter(gl.IMPLEMENTATION_COLOR_READ_FORMAT)) { + return false; + } + return true; } - constructor() { - super(); - this.isBone = true; - this.type = "Bone"; + __name(textureFormatReadable, "textureFormatReadable"); + function textureTypeReadable(textureType) { + const halfFloatSupportedByExt = textureType === HalfFloatType && (extensions.has("EXT_color_buffer_half_float") || extensions.has("EXT_color_buffer_float")); + if (textureType !== UnsignedByteType && utils.convert(textureType) !== gl.getParameter(gl.IMPLEMENTATION_COLOR_READ_TYPE) && // Edge and Chrome Mac < 52 (#9513) + textureType !== FloatType && !halfFloatSupportedByExt) { + return false; + } + return true; } -} -class DataTexture extends Texture { - static { - __name(this, "DataTexture"); + __name(textureTypeReadable, "textureTypeReadable"); + function getMaxPrecision(precision2) { + if (precision2 === "highp") { + if (gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_FLOAT).precision > 0 && gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT).precision > 0) { + return "highp"; + } + precision2 = "mediump"; + } + if (precision2 === "mediump") { + if (gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_FLOAT).precision > 0 && gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT).precision > 0) { + return "mediump"; + } + } + return "lowp"; } - constructor(data = null, width = 1, height = 1, format, type, mapping, wrapS, wrapT, magFilter = NearestFilter, minFilter = NearestFilter, anisotropy, colorSpace) { - super(null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace); - this.isDataTexture = true; - this.image = { data, width, height }; - this.generateMipmaps = false; - this.flipY = false; - this.unpackAlignment = 1; + __name(getMaxPrecision, "getMaxPrecision"); + let precision = parameters.precision !== void 0 ? parameters.precision : "highp"; + const maxPrecision = getMaxPrecision(precision); + if (maxPrecision !== precision) { + console.warn("THREE.WebGLRenderer:", precision, "not supported, using", maxPrecision, "instead."); + precision = maxPrecision; } + const logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true; + const reverseDepthBuffer = parameters.reverseDepthBuffer === true && extensions.has("EXT_clip_control"); + const maxTextures = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS); + const maxVertexTextures = gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS); + const maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE); + const maxCubemapSize = gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE); + const maxAttributes = gl.getParameter(gl.MAX_VERTEX_ATTRIBS); + const maxVertexUniforms = gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS); + const maxVaryings = gl.getParameter(gl.MAX_VARYING_VECTORS); + const maxFragmentUniforms = gl.getParameter(gl.MAX_FRAGMENT_UNIFORM_VECTORS); + const vertexTextures = maxVertexTextures > 0; + const maxSamples = gl.getParameter(gl.MAX_SAMPLES); + return { + isWebGL2: true, + // keeping this for backwards compatibility + getMaxAnisotropy, + getMaxPrecision, + textureFormatReadable, + textureTypeReadable, + precision, + logarithmicDepthBuffer, + reverseDepthBuffer, + maxTextures, + maxVertexTextures, + maxTextureSize, + maxCubemapSize, + maxAttributes, + maxVertexUniforms, + maxVaryings, + maxFragmentUniforms, + vertexTextures, + maxSamples + }; } -const _offsetMatrix = /* @__PURE__ */ new Matrix4(); -const _identityMatrix$1 = /* @__PURE__ */ new Matrix4(); -class Skeleton { - static { - __name(this, "Skeleton"); - } - constructor(bones = [], boneInverses = []) { - this.uuid = generateUUID(); - this.bones = bones.slice(0); - this.boneInverses = boneInverses; - this.boneMatrices = null; - this.boneTexture = null; - this.init(); - } - init() { - const bones = this.bones; - const boneInverses = this.boneInverses; - this.boneMatrices = new Float32Array(bones.length * 16); - if (boneInverses.length === 0) { - this.calculateInverses(); +__name(WebGLCapabilities, "WebGLCapabilities"); +function WebGLClipping(properties) { + const scope = this; + let globalState = null, numGlobalPlanes = 0, localClippingEnabled = false, renderingShadows = false; + const plane = new Plane(), viewNormalMatrix = new Matrix3(), uniform = { value: null, needsUpdate: false }; + this.uniform = uniform; + this.numPlanes = 0; + this.numIntersection = 0; + this.init = function(planes, enableLocalClipping) { + const enabled = planes.length !== 0 || enableLocalClipping || // enable state of previous frame - the clipping code has to + // run another frame in order to reset the state: + numGlobalPlanes !== 0 || localClippingEnabled; + localClippingEnabled = enableLocalClipping; + numGlobalPlanes = planes.length; + return enabled; + }; + this.beginShadows = function() { + renderingShadows = true; + projectPlanes(null); + }; + this.endShadows = function() { + renderingShadows = false; + }; + this.setGlobalState = function(planes, camera) { + globalState = projectPlanes(planes, camera, 0); + }; + this.setState = function(material, camera, useCache) { + const planes = material.clippingPlanes, clipIntersection = material.clipIntersection, clipShadows = material.clipShadows; + const materialProperties = properties.get(material); + if (!localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && !clipShadows) { + if (renderingShadows) { + projectPlanes(null); + } else { + resetGlobalState(); + } } else { - if (bones.length !== boneInverses.length) { - console.warn("THREE.Skeleton: Number of inverse bone matrices does not match amount of bones."); - this.boneInverses = []; - for (let i = 0, il = this.bones.length; i < il; i++) { - this.boneInverses.push(new Matrix4()); - } + const nGlobal = renderingShadows ? 0 : numGlobalPlanes, lGlobal = nGlobal * 4; + let dstArray = materialProperties.clippingState || null; + uniform.value = dstArray; + dstArray = projectPlanes(planes, camera, lGlobal, useCache); + for (let i = 0; i !== lGlobal; ++i) { + dstArray[i] = globalState[i]; } + materialProperties.clippingState = dstArray; + this.numIntersection = clipIntersection ? this.numPlanes : 0; + this.numPlanes += nGlobal; + } + }; + function resetGlobalState() { + if (uniform.value !== globalState) { + uniform.value = globalState; + uniform.needsUpdate = numGlobalPlanes > 0; } + scope.numPlanes = numGlobalPlanes; + scope.numIntersection = 0; } - calculateInverses() { - this.boneInverses.length = 0; - for (let i = 0, il = this.bones.length; i < il; i++) { - const inverse = new Matrix4(); - if (this.bones[i]) { - inverse.copy(this.bones[i].matrixWorld).invert(); + __name(resetGlobalState, "resetGlobalState"); + function projectPlanes(planes, camera, dstOffset, skipTransform) { + const nPlanes = planes !== null ? planes.length : 0; + let dstArray = null; + if (nPlanes !== 0) { + dstArray = uniform.value; + if (skipTransform !== true || dstArray === null) { + const flatSize = dstOffset + nPlanes * 4, viewMatrix = camera.matrixWorldInverse; + viewNormalMatrix.getNormalMatrix(viewMatrix); + if (dstArray === null || dstArray.length < flatSize) { + dstArray = new Float32Array(flatSize); + } + for (let i = 0, i4 = dstOffset; i !== nPlanes; ++i, i4 += 4) { + plane.copy(planes[i]).applyMatrix4(viewMatrix, viewNormalMatrix); + plane.normal.toArray(dstArray, i4); + dstArray[i4 + 3] = plane.constant; + } } - this.boneInverses.push(inverse); + uniform.value = dstArray; + uniform.needsUpdate = true; } + scope.numPlanes = nPlanes; + scope.numIntersection = 0; + return dstArray; } - pose() { - for (let i = 0, il = this.bones.length; i < il; i++) { - const bone = this.bones[i]; - if (bone) { - bone.matrixWorld.copy(this.boneInverses[i]).invert(); - } + __name(projectPlanes, "projectPlanes"); +} +__name(WebGLClipping, "WebGLClipping"); +function WebGLCubeMaps(renderer) { + let cubemaps = /* @__PURE__ */ new WeakMap(); + function mapTextureMapping(texture, mapping) { + if (mapping === EquirectangularReflectionMapping) { + texture.mapping = CubeReflectionMapping; + } else if (mapping === EquirectangularRefractionMapping) { + texture.mapping = CubeRefractionMapping; } - for (let i = 0, il = this.bones.length; i < il; i++) { - const bone = this.bones[i]; - if (bone) { - if (bone.parent && bone.parent.isBone) { - bone.matrix.copy(bone.parent.matrixWorld).invert(); - bone.matrix.multiply(bone.matrixWorld); + return texture; + } + __name(mapTextureMapping, "mapTextureMapping"); + function get(texture) { + if (texture && texture.isTexture) { + const mapping = texture.mapping; + if (mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping) { + if (cubemaps.has(texture)) { + const cubemap = cubemaps.get(texture).texture; + return mapTextureMapping(cubemap, texture.mapping); } else { - bone.matrix.copy(bone.matrixWorld); + const image = texture.image; + if (image && image.height > 0) { + const renderTarget = new WebGLCubeRenderTarget(image.height); + renderTarget.fromEquirectangularTexture(renderer, texture); + cubemaps.set(texture, renderTarget); + texture.addEventListener("dispose", onTextureDispose); + return mapTextureMapping(renderTarget.texture, texture.mapping); + } else { + return null; + } } - bone.matrix.decompose(bone.position, bone.quaternion, bone.scale); } } + return texture; } - update() { - const bones = this.bones; - const boneInverses = this.boneInverses; - const boneMatrices = this.boneMatrices; - const boneTexture = this.boneTexture; - for (let i = 0, il = bones.length; i < il; i++) { - const matrix = bones[i] ? bones[i].matrixWorld : _identityMatrix$1; - _offsetMatrix.multiplyMatrices(matrix, boneInverses[i]); - _offsetMatrix.toArray(boneMatrices, i * 16); - } - if (boneTexture !== null) { - boneTexture.needsUpdate = true; + __name(get, "get"); + function onTextureDispose(event) { + const texture = event.target; + texture.removeEventListener("dispose", onTextureDispose); + const cubemap = cubemaps.get(texture); + if (cubemap !== void 0) { + cubemaps.delete(texture); + cubemap.dispose(); } } - clone() { - return new Skeleton(this.bones, this.boneInverses); + __name(onTextureDispose, "onTextureDispose"); + function dispose() { + cubemaps = /* @__PURE__ */ new WeakMap(); } - computeBoneTexture() { - let size = Math.sqrt(this.bones.length * 4); - size = Math.ceil(size / 4) * 4; - size = Math.max(size, 4); - const boneMatrices = new Float32Array(size * size * 4); - boneMatrices.set(this.boneMatrices); - const boneTexture = new DataTexture(boneMatrices, size, size, RGBAFormat, FloatType); - boneTexture.needsUpdate = true; - this.boneMatrices = boneMatrices; - this.boneTexture = boneTexture; + __name(dispose, "dispose"); + return { + get, + dispose + }; +} +__name(WebGLCubeMaps, "WebGLCubeMaps"); +class OrthographicCamera extends Camera { + static { + __name(this, "OrthographicCamera"); + } + constructor(left = -1, right = 1, top = 1, bottom = -1, near = 0.1, far = 2e3) { + super(); + this.isOrthographicCamera = true; + this.type = "OrthographicCamera"; + this.zoom = 1; + this.view = null; + this.left = left; + this.right = right; + this.top = top; + this.bottom = bottom; + this.near = near; + this.far = far; + this.updateProjectionMatrix(); + } + copy(source, recursive) { + super.copy(source, recursive); + this.left = source.left; + this.right = source.right; + this.top = source.top; + this.bottom = source.bottom; + this.near = source.near; + this.far = source.far; + this.zoom = source.zoom; + this.view = source.view === null ? null : Object.assign({}, source.view); return this; } - getBoneByName(name) { - for (let i = 0, il = this.bones.length; i < il; i++) { - const bone = this.bones[i]; - if (bone.name === name) { - return bone; - } + setViewOffset(fullWidth, fullHeight, x, y, width, height) { + if (this.view === null) { + this.view = { + enabled: true, + fullWidth: 1, + fullHeight: 1, + offsetX: 0, + offsetY: 0, + width: 1, + height: 1 + }; } - return void 0; + this.view.enabled = true; + this.view.fullWidth = fullWidth; + this.view.fullHeight = fullHeight; + this.view.offsetX = x; + this.view.offsetY = y; + this.view.width = width; + this.view.height = height; + this.updateProjectionMatrix(); } - dispose() { - if (this.boneTexture !== null) { - this.boneTexture.dispose(); - this.boneTexture = null; + clearViewOffset() { + if (this.view !== null) { + this.view.enabled = false; } + this.updateProjectionMatrix(); } - fromJSON(json, bones) { - this.uuid = json.uuid; - for (let i = 0, l = json.bones.length; i < l; i++) { - const uuid = json.bones[i]; - let bone = bones[uuid]; - if (bone === void 0) { - console.warn("THREE.Skeleton: No bone found with UUID:", uuid); - bone = new Bone(); - } - this.bones.push(bone); - this.boneInverses.push(new Matrix4().fromArray(json.boneInverses[i])); + updateProjectionMatrix() { + const dx = (this.right - this.left) / (2 * this.zoom); + const dy = (this.top - this.bottom) / (2 * this.zoom); + const cx = (this.right + this.left) / 2; + const cy = (this.top + this.bottom) / 2; + let left = cx - dx; + let right = cx + dx; + let top = cy + dy; + let bottom = cy - dy; + if (this.view !== null && this.view.enabled) { + const scaleW = (this.right - this.left) / this.view.fullWidth / this.zoom; + const scaleH = (this.top - this.bottom) / this.view.fullHeight / this.zoom; + left += scaleW * this.view.offsetX; + right = left + scaleW * this.view.width; + top -= scaleH * this.view.offsetY; + bottom = top - scaleH * this.view.height; } - this.init(); - return this; + this.projectionMatrix.makeOrthographic(left, right, top, bottom, this.near, this.far, this.coordinateSystem); + this.projectionMatrixInverse.copy(this.projectionMatrix).invert(); } - toJSON() { - const data = { - metadata: { - version: 4.6, - type: "Skeleton", - generator: "Skeleton.toJSON" - }, - bones: [], - boneInverses: [] - }; - data.uuid = this.uuid; - const bones = this.bones; - const boneInverses = this.boneInverses; - for (let i = 0, l = bones.length; i < l; i++) { - const bone = bones[i]; - data.bones.push(bone.uuid); - const boneInverse = boneInverses[i]; - data.boneInverses.push(boneInverse.toArray()); - } + toJSON(meta) { + const data = super.toJSON(meta); + data.object.zoom = this.zoom; + data.object.left = this.left; + data.object.right = this.right; + data.object.top = this.top; + data.object.bottom = this.bottom; + data.object.near = this.near; + data.object.far = this.far; + if (this.view !== null) data.object.view = Object.assign({}, this.view); return data; } } -class InstancedBufferAttribute extends BufferAttribute { +const LOD_MIN = 4; +const EXTRA_LOD_SIGMA = [0.125, 0.215, 0.35, 0.446, 0.526, 0.582]; +const MAX_SAMPLES = 20; +const _flatCamera = /* @__PURE__ */ new OrthographicCamera(); +const _clearColor = /* @__PURE__ */ new Color(); +let _oldTarget = null; +let _oldActiveCubeFace = 0; +let _oldActiveMipmapLevel = 0; +let _oldXrEnabled = false; +const PHI = (1 + Math.sqrt(5)) / 2; +const INV_PHI = 1 / PHI; +const _axisDirections = [ + /* @__PURE__ */ new Vector3(-PHI, INV_PHI, 0), + /* @__PURE__ */ new Vector3(PHI, INV_PHI, 0), + /* @__PURE__ */ new Vector3(-INV_PHI, 0, PHI), + /* @__PURE__ */ new Vector3(INV_PHI, 0, PHI), + /* @__PURE__ */ new Vector3(0, PHI, -INV_PHI), + /* @__PURE__ */ new Vector3(0, PHI, INV_PHI), + /* @__PURE__ */ new Vector3(-1, 1, -1), + /* @__PURE__ */ new Vector3(1, 1, -1), + /* @__PURE__ */ new Vector3(-1, 1, 1), + /* @__PURE__ */ new Vector3(1, 1, 1) +]; +class PMREMGenerator { static { - __name(this, "InstancedBufferAttribute"); + __name(this, "PMREMGenerator"); } - constructor(array, itemSize, normalized, meshPerAttribute = 1) { - super(array, itemSize, normalized); - this.isInstancedBufferAttribute = true; - this.meshPerAttribute = meshPerAttribute; + constructor(renderer) { + this._renderer = renderer; + this._pingPongRenderTarget = null; + this._lodMax = 0; + this._cubeSize = 0; + this._lodPlanes = []; + this._sizeLods = []; + this._sigmas = []; + this._blurMaterial = null; + this._cubemapMaterial = null; + this._equirectMaterial = null; + this._compileMaterial(this._blurMaterial); } - copy(source) { - super.copy(source); - this.meshPerAttribute = source.meshPerAttribute; - return this; + /** + * Generates a PMREM from a supplied Scene, which can be faster than using an + * image if networking bandwidth is low. Optional sigma specifies a blur radius + * in radians to be applied to the scene before PMREM generation. Optional near + * and far planes ensure the scene is rendered in its entirety (the cubeCamera + * is placed at the origin). + */ + fromScene(scene, sigma = 0, near = 0.1, far = 100) { + _oldTarget = this._renderer.getRenderTarget(); + _oldActiveCubeFace = this._renderer.getActiveCubeFace(); + _oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel(); + _oldXrEnabled = this._renderer.xr.enabled; + this._renderer.xr.enabled = false; + this._setSize(256); + const cubeUVRenderTarget = this._allocateTargets(); + cubeUVRenderTarget.depthBuffer = true; + this._sceneToCubeUV(scene, near, far, cubeUVRenderTarget); + if (sigma > 0) { + this._blur(cubeUVRenderTarget, 0, 0, sigma); + } + this._applyPMREM(cubeUVRenderTarget); + this._cleanup(cubeUVRenderTarget); + return cubeUVRenderTarget; } - toJSON() { - const data = super.toJSON(); - data.meshPerAttribute = this.meshPerAttribute; - data.isInstancedBufferAttribute = true; - return data; + /** + * Generates a PMREM from an equirectangular texture, which can be either LDR + * or HDR. The ideal input image size is 1k (1024 x 512), + * as this matches best with the 256 x 256 cubemap output. + * The smallest supported equirectangular image size is 64 x 32. + */ + fromEquirectangular(equirectangular, renderTarget = null) { + return this._fromTexture(equirectangular, renderTarget); } -} -const _instanceLocalMatrix = /* @__PURE__ */ new Matrix4(); -const _instanceWorldMatrix = /* @__PURE__ */ new Matrix4(); -const _instanceIntersects = []; -const _box3 = /* @__PURE__ */ new Box3(); -const _identity = /* @__PURE__ */ new Matrix4(); -const _mesh$1 = /* @__PURE__ */ new Mesh(); -const _sphere$3 = /* @__PURE__ */ new Sphere(); -class InstancedMesh extends Mesh { - static { - __name(this, "InstancedMesh"); + /** + * Generates a PMREM from an cubemap texture, which can be either LDR + * or HDR. The ideal input cube size is 256 x 256, + * as this matches best with the 256 x 256 cubemap output. + * The smallest supported cube size is 16 x 16. + */ + fromCubemap(cubemap, renderTarget = null) { + return this._fromTexture(cubemap, renderTarget); } - constructor(geometry, material, count) { - super(geometry, material); - this.isInstancedMesh = true; - this.instanceMatrix = new InstancedBufferAttribute(new Float32Array(count * 16), 16); - this.instanceColor = null; - this.morphTexture = null; - this.count = count; - this.boundingBox = null; - this.boundingSphere = null; - for (let i = 0; i < count; i++) { - this.setMatrixAt(i, _identity); + /** + * Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during + * your texture's network fetch for increased concurrency. + */ + compileCubemapShader() { + if (this._cubemapMaterial === null) { + this._cubemapMaterial = _getCubemapMaterial(); + this._compileMaterial(this._cubemapMaterial); } } - computeBoundingBox() { - const geometry = this.geometry; - const count = this.count; - if (this.boundingBox === null) { - this.boundingBox = new Box3(); - } - if (geometry.boundingBox === null) { - geometry.computeBoundingBox(); - } - this.boundingBox.makeEmpty(); - for (let i = 0; i < count; i++) { - this.getMatrixAt(i, _instanceLocalMatrix); - _box3.copy(geometry.boundingBox).applyMatrix4(_instanceLocalMatrix); - this.boundingBox.union(_box3); + /** + * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during + * your texture's network fetch for increased concurrency. + */ + compileEquirectangularShader() { + if (this._equirectMaterial === null) { + this._equirectMaterial = _getEquirectMaterial(); + this._compileMaterial(this._equirectMaterial); } } - computeBoundingSphere() { - const geometry = this.geometry; - const count = this.count; - if (this.boundingSphere === null) { - this.boundingSphere = new Sphere(); - } - if (geometry.boundingSphere === null) { - geometry.computeBoundingSphere(); - } - this.boundingSphere.makeEmpty(); - for (let i = 0; i < count; i++) { - this.getMatrixAt(i, _instanceLocalMatrix); - _sphere$3.copy(geometry.boundingSphere).applyMatrix4(_instanceLocalMatrix); - this.boundingSphere.union(_sphere$3); + /** + * Disposes of the PMREMGenerator's internal memory. Note that PMREMGenerator is a static class, + * so you should not need more than one PMREMGenerator object. If you do, calling dispose() on + * one of them will cause any others to also become unusable. + */ + dispose() { + this._dispose(); + if (this._cubemapMaterial !== null) this._cubemapMaterial.dispose(); + if (this._equirectMaterial !== null) this._equirectMaterial.dispose(); + } + // private interface + _setSize(cubeSize) { + this._lodMax = Math.floor(Math.log2(cubeSize)); + this._cubeSize = Math.pow(2, this._lodMax); + } + _dispose() { + if (this._blurMaterial !== null) this._blurMaterial.dispose(); + if (this._pingPongRenderTarget !== null) this._pingPongRenderTarget.dispose(); + for (let i = 0; i < this._lodPlanes.length; i++) { + this._lodPlanes[i].dispose(); } } - copy(source, recursive) { - super.copy(source, recursive); - this.instanceMatrix.copy(source.instanceMatrix); - if (source.morphTexture !== null) this.morphTexture = source.morphTexture.clone(); - if (source.instanceColor !== null) this.instanceColor = source.instanceColor.clone(); - this.count = source.count; - if (source.boundingBox !== null) this.boundingBox = source.boundingBox.clone(); - if (source.boundingSphere !== null) this.boundingSphere = source.boundingSphere.clone(); - return this; + _cleanup(outputTarget) { + this._renderer.setRenderTarget(_oldTarget, _oldActiveCubeFace, _oldActiveMipmapLevel); + this._renderer.xr.enabled = _oldXrEnabled; + outputTarget.scissorTest = false; + _setViewport(outputTarget, 0, 0, outputTarget.width, outputTarget.height); } - getColorAt(index, color) { - color.fromArray(this.instanceColor.array, index * 3); + _fromTexture(texture, renderTarget) { + if (texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping) { + this._setSize(texture.image.length === 0 ? 16 : texture.image[0].width || texture.image[0].image.width); + } else { + this._setSize(texture.image.width / 4); + } + _oldTarget = this._renderer.getRenderTarget(); + _oldActiveCubeFace = this._renderer.getActiveCubeFace(); + _oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel(); + _oldXrEnabled = this._renderer.xr.enabled; + this._renderer.xr.enabled = false; + const cubeUVRenderTarget = renderTarget || this._allocateTargets(); + this._textureToCubeUV(texture, cubeUVRenderTarget); + this._applyPMREM(cubeUVRenderTarget); + this._cleanup(cubeUVRenderTarget); + return cubeUVRenderTarget; } - getMatrixAt(index, matrix) { - matrix.fromArray(this.instanceMatrix.array, index * 16); + _allocateTargets() { + const width = 3 * Math.max(this._cubeSize, 16 * 7); + const height = 4 * this._cubeSize; + const params = { + magFilter: LinearFilter, + minFilter: LinearFilter, + generateMipmaps: false, + type: HalfFloatType, + format: RGBAFormat, + colorSpace: LinearSRGBColorSpace, + depthBuffer: false + }; + const cubeUVRenderTarget = _createRenderTarget(width, height, params); + if (this._pingPongRenderTarget === null || this._pingPongRenderTarget.width !== width || this._pingPongRenderTarget.height !== height) { + if (this._pingPongRenderTarget !== null) { + this._dispose(); + } + this._pingPongRenderTarget = _createRenderTarget(width, height, params); + const { _lodMax } = this; + ({ sizeLods: this._sizeLods, lodPlanes: this._lodPlanes, sigmas: this._sigmas } = _createPlanes(_lodMax)); + this._blurMaterial = _getBlurShader(_lodMax, width, height); + } + return cubeUVRenderTarget; } - getMorphAt(index, object) { - const objectInfluences = object.morphTargetInfluences; - const array = this.morphTexture.source.data.data; - const len = objectInfluences.length + 1; - const dataIndex = index * len + 1; - for (let i = 0; i < objectInfluences.length; i++) { - objectInfluences[i] = array[dataIndex + i]; + _compileMaterial(material) { + const tmpMesh = new Mesh(this._lodPlanes[0], material); + this._renderer.compile(tmpMesh, _flatCamera); + } + _sceneToCubeUV(scene, near, far, cubeUVRenderTarget) { + const fov2 = 90; + const aspect2 = 1; + const cubeCamera = new PerspectiveCamera(fov2, aspect2, near, far); + const upSign = [1, -1, 1, 1, 1, 1]; + const forwardSign = [1, 1, 1, -1, -1, -1]; + const renderer = this._renderer; + const originalAutoClear = renderer.autoClear; + const toneMapping = renderer.toneMapping; + renderer.getClearColor(_clearColor); + renderer.toneMapping = NoToneMapping; + renderer.autoClear = false; + const backgroundMaterial = new MeshBasicMaterial({ + name: "PMREM.Background", + side: BackSide, + depthWrite: false, + depthTest: false + }); + const backgroundBox = new Mesh(new BoxGeometry(), backgroundMaterial); + let useSolidColor = false; + const background = scene.background; + if (background) { + if (background.isColor) { + backgroundMaterial.color.copy(background); + scene.background = null; + useSolidColor = true; + } + } else { + backgroundMaterial.color.copy(_clearColor); + useSolidColor = true; + } + for (let i = 0; i < 6; i++) { + const col = i % 3; + if (col === 0) { + cubeCamera.up.set(0, upSign[i], 0); + cubeCamera.lookAt(forwardSign[i], 0, 0); + } else if (col === 1) { + cubeCamera.up.set(0, 0, upSign[i]); + cubeCamera.lookAt(0, forwardSign[i], 0); + } else { + cubeCamera.up.set(0, upSign[i], 0); + cubeCamera.lookAt(0, 0, forwardSign[i]); + } + const size = this._cubeSize; + _setViewport(cubeUVRenderTarget, col * size, i > 2 ? size : 0, size, size); + renderer.setRenderTarget(cubeUVRenderTarget); + if (useSolidColor) { + renderer.render(backgroundBox, cubeCamera); + } + renderer.render(scene, cubeCamera); } + backgroundBox.geometry.dispose(); + backgroundBox.material.dispose(); + renderer.toneMapping = toneMapping; + renderer.autoClear = originalAutoClear; + scene.background = background; } - raycast(raycaster, intersects2) { - const matrixWorld = this.matrixWorld; - const raycastTimes = this.count; - _mesh$1.geometry = this.geometry; - _mesh$1.material = this.material; - if (_mesh$1.material === void 0) return; - if (this.boundingSphere === null) this.computeBoundingSphere(); - _sphere$3.copy(this.boundingSphere); - _sphere$3.applyMatrix4(matrixWorld); - if (raycaster.ray.intersectsSphere(_sphere$3) === false) return; - for (let instanceId = 0; instanceId < raycastTimes; instanceId++) { - this.getMatrixAt(instanceId, _instanceLocalMatrix); - _instanceWorldMatrix.multiplyMatrices(matrixWorld, _instanceLocalMatrix); - _mesh$1.matrixWorld = _instanceWorldMatrix; - _mesh$1.raycast(raycaster, _instanceIntersects); - for (let i = 0, l = _instanceIntersects.length; i < l; i++) { - const intersect2 = _instanceIntersects[i]; - intersect2.instanceId = instanceId; - intersect2.object = this; - intersects2.push(intersect2); + _textureToCubeUV(texture, cubeUVRenderTarget) { + const renderer = this._renderer; + const isCubeTexture = texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping; + if (isCubeTexture) { + if (this._cubemapMaterial === null) { + this._cubemapMaterial = _getCubemapMaterial(); + } + this._cubemapMaterial.uniforms.flipEnvMap.value = texture.isRenderTargetTexture === false ? -1 : 1; + } else { + if (this._equirectMaterial === null) { + this._equirectMaterial = _getEquirectMaterial(); } - _instanceIntersects.length = 0; } + const material = isCubeTexture ? this._cubemapMaterial : this._equirectMaterial; + const mesh = new Mesh(this._lodPlanes[0], material); + const uniforms = material.uniforms; + uniforms["envMap"].value = texture; + const size = this._cubeSize; + _setViewport(cubeUVRenderTarget, 0, 0, 3 * size, 2 * size); + renderer.setRenderTarget(cubeUVRenderTarget); + renderer.render(mesh, _flatCamera); } - setColorAt(index, color) { - if (this.instanceColor === null) { - this.instanceColor = new InstancedBufferAttribute(new Float32Array(this.instanceMatrix.count * 3).fill(1), 3); + _applyPMREM(cubeUVRenderTarget) { + const renderer = this._renderer; + const autoClear = renderer.autoClear; + renderer.autoClear = false; + const n = this._lodPlanes.length; + for (let i = 1; i < n; i++) { + const sigma = Math.sqrt(this._sigmas[i] * this._sigmas[i] - this._sigmas[i - 1] * this._sigmas[i - 1]); + const poleAxis = _axisDirections[(n - i - 1) % _axisDirections.length]; + this._blur(cubeUVRenderTarget, i - 1, i, sigma, poleAxis); } - color.toArray(this.instanceColor.array, index * 3); + renderer.autoClear = autoClear; } - setMatrixAt(index, matrix) { - matrix.toArray(this.instanceMatrix.array, index * 16); + /** + * This is a two-pass Gaussian blur for a cubemap. Normally this is done + * vertically and horizontally, but this breaks down on a cube. Here we apply + * the blur latitudinally (around the poles), and then longitudinally (towards + * the poles) to approximate the orthogonally-separable blur. It is least + * accurate at the poles, but still does a decent job. + */ + _blur(cubeUVRenderTarget, lodIn, lodOut, sigma, poleAxis) { + const pingPongRenderTarget = this._pingPongRenderTarget; + this._halfBlur( + cubeUVRenderTarget, + pingPongRenderTarget, + lodIn, + lodOut, + sigma, + "latitudinal", + poleAxis + ); + this._halfBlur( + pingPongRenderTarget, + cubeUVRenderTarget, + lodOut, + lodOut, + sigma, + "longitudinal", + poleAxis + ); } - setMorphAt(index, object) { - const objectInfluences = object.morphTargetInfluences; - const len = objectInfluences.length + 1; - if (this.morphTexture === null) { - this.morphTexture = new DataTexture(new Float32Array(len * this.count), len, this.count, RedFormat, FloatType); + _halfBlur(targetIn, targetOut, lodIn, lodOut, sigmaRadians, direction, poleAxis) { + const renderer = this._renderer; + const blurMaterial = this._blurMaterial; + if (direction !== "latitudinal" && direction !== "longitudinal") { + console.error( + "blur direction must be either latitudinal or longitudinal!" + ); } - const array = this.morphTexture.source.data.data; - let morphInfluencesSum = 0; - for (let i = 0; i < objectInfluences.length; i++) { - morphInfluencesSum += objectInfluences[i]; + const STANDARD_DEVIATIONS = 3; + const blurMesh = new Mesh(this._lodPlanes[lodOut], blurMaterial); + const blurUniforms = blurMaterial.uniforms; + const pixels = this._sizeLods[lodIn] - 1; + const radiansPerPixel = isFinite(sigmaRadians) ? Math.PI / (2 * pixels) : 2 * Math.PI / (2 * MAX_SAMPLES - 1); + const sigmaPixels = sigmaRadians / radiansPerPixel; + const samples = isFinite(sigmaRadians) ? 1 + Math.floor(STANDARD_DEVIATIONS * sigmaPixels) : MAX_SAMPLES; + if (samples > MAX_SAMPLES) { + console.warn(`sigmaRadians, ${sigmaRadians}, is too large and will clip, as it requested ${samples} samples when the maximum is set to ${MAX_SAMPLES}`); } - const morphBaseInfluence = this.geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum; - const dataIndex = len * index; - array[dataIndex] = morphBaseInfluence; - array.set(objectInfluences, dataIndex + 1); - } - updateMorphTargets() { + const weights = []; + let sum = 0; + for (let i = 0; i < MAX_SAMPLES; ++i) { + const x2 = i / sigmaPixels; + const weight = Math.exp(-x2 * x2 / 2); + weights.push(weight); + if (i === 0) { + sum += weight; + } else if (i < samples) { + sum += 2 * weight; + } + } + for (let i = 0; i < weights.length; i++) { + weights[i] = weights[i] / sum; + } + blurUniforms["envMap"].value = targetIn.texture; + blurUniforms["samples"].value = samples; + blurUniforms["weights"].value = weights; + blurUniforms["latitudinal"].value = direction === "latitudinal"; + if (poleAxis) { + blurUniforms["poleAxis"].value = poleAxis; + } + const { _lodMax } = this; + blurUniforms["dTheta"].value = radiansPerPixel; + blurUniforms["mipInt"].value = _lodMax - lodIn; + const outputSize = this._sizeLods[lodOut]; + const x = 3 * outputSize * (lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0); + const y = 4 * (this._cubeSize - outputSize); + _setViewport(targetOut, x, y, 3 * outputSize, 2 * outputSize); + renderer.setRenderTarget(targetOut); + renderer.render(blurMesh, _flatCamera); } - dispose() { - this.dispatchEvent({ type: "dispose" }); - if (this.morphTexture !== null) { - this.morphTexture.dispose(); - this.morphTexture = null; +} +function _createPlanes(lodMax) { + const lodPlanes = []; + const sizeLods = []; + const sigmas = []; + let lod = lodMax; + const totalLods = lodMax - LOD_MIN + 1 + EXTRA_LOD_SIGMA.length; + for (let i = 0; i < totalLods; i++) { + const sizeLod = Math.pow(2, lod); + sizeLods.push(sizeLod); + let sigma = 1 / sizeLod; + if (i > lodMax - LOD_MIN) { + sigma = EXTRA_LOD_SIGMA[i - lodMax + LOD_MIN - 1]; + } else if (i === 0) { + sigma = 0; + } + sigmas.push(sigma); + const texelSize = 1 / (sizeLod - 2); + const min = -texelSize; + const max2 = 1 + texelSize; + const uv1 = [min, min, max2, min, max2, max2, min, min, max2, max2, min, max2]; + const cubeFaces = 6; + const vertices = 6; + const positionSize = 3; + const uvSize = 2; + const faceIndexSize = 1; + const position = new Float32Array(positionSize * vertices * cubeFaces); + const uv = new Float32Array(uvSize * vertices * cubeFaces); + const faceIndex = new Float32Array(faceIndexSize * vertices * cubeFaces); + for (let face = 0; face < cubeFaces; face++) { + const x = face % 3 * 2 / 3 - 1; + const y = face > 2 ? 0 : -1; + const coordinates = [ + x, + y, + 0, + x + 2 / 3, + y, + 0, + x + 2 / 3, + y + 1, + 0, + x, + y, + 0, + x + 2 / 3, + y + 1, + 0, + x, + y + 1, + 0 + ]; + position.set(coordinates, positionSize * vertices * face); + uv.set(uv1, uvSize * vertices * face); + const fill2 = [face, face, face, face, face, face]; + faceIndex.set(fill2, faceIndexSize * vertices * face); + } + const planes = new BufferGeometry(); + planes.setAttribute("position", new BufferAttribute(position, positionSize)); + planes.setAttribute("uv", new BufferAttribute(uv, uvSize)); + planes.setAttribute("faceIndex", new BufferAttribute(faceIndex, faceIndexSize)); + lodPlanes.push(planes); + if (lod > LOD_MIN) { + lod--; } - return this; } + return { lodPlanes, sizeLods, sigmas }; } -function ascIdSort(a, b) { - return a - b; +__name(_createPlanes, "_createPlanes"); +function _createRenderTarget(width, height, params) { + const cubeUVRenderTarget = new WebGLRenderTarget(width, height, params); + cubeUVRenderTarget.texture.mapping = CubeUVReflectionMapping; + cubeUVRenderTarget.texture.name = "PMREM.cubeUv"; + cubeUVRenderTarget.scissorTest = true; + return cubeUVRenderTarget; } -__name(ascIdSort, "ascIdSort"); -function sortOpaque(a, b) { - return a.z - b.z; +__name(_createRenderTarget, "_createRenderTarget"); +function _setViewport(target, x, y, width, height) { + target.viewport.set(x, y, width, height); + target.scissor.set(x, y, width, height); } -__name(sortOpaque, "sortOpaque"); -function sortTransparent(a, b) { - return b.z - a.z; +__name(_setViewport, "_setViewport"); +function _getBlurShader(lodMax, width, height) { + const weights = new Float32Array(MAX_SAMPLES); + const poleAxis = new Vector3(0, 1, 0); + const shaderMaterial = new ShaderMaterial({ + name: "SphericalGaussianBlur", + defines: { + "n": MAX_SAMPLES, + "CUBEUV_TEXEL_WIDTH": 1 / width, + "CUBEUV_TEXEL_HEIGHT": 1 / height, + "CUBEUV_MAX_MIP": `${lodMax}.0` + }, + uniforms: { + "envMap": { value: null }, + "samples": { value: 1 }, + "weights": { value: weights }, + "latitudinal": { value: false }, + "dTheta": { value: 0 }, + "mipInt": { value: 0 }, + "poleAxis": { value: poleAxis } + }, + vertexShader: _getCommonVertexShader(), + fragmentShader: ( + /* glsl */ + ` + + precision mediump float; + precision mediump int; + + varying vec3 vOutputDirection; + + uniform sampler2D envMap; + uniform int samples; + uniform float weights[ n ]; + uniform bool latitudinal; + uniform float dTheta; + uniform float mipInt; + uniform vec3 poleAxis; + + #define ENVMAP_TYPE_CUBE_UV + #include + + vec3 getSample( float theta, vec3 axis ) { + + float cosTheta = cos( theta ); + // Rodrigues' axis-angle rotation + vec3 sampleDirection = vOutputDirection * cosTheta + + cross( axis, vOutputDirection ) * sin( theta ) + + axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta ); + + return bilinearCubeUV( envMap, sampleDirection, mipInt ); + + } + + void main() { + + vec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection ); + + if ( all( equal( axis, vec3( 0.0 ) ) ) ) { + + axis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x ); + + } + + axis = normalize( axis ); + + gl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 ); + gl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis ); + + for ( int i = 1; i < n; i++ ) { + + if ( i >= samples ) { + + break; + + } + + float theta = dTheta * float( i ); + gl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis ); + gl_FragColor.rgb += weights[ i ] * getSample( theta, axis ); + + } + + } + ` + ), + blending: NoBlending, + depthTest: false, + depthWrite: false + }); + return shaderMaterial; } -__name(sortTransparent, "sortTransparent"); -class MultiDrawRenderList { - static { - __name(this, "MultiDrawRenderList"); - } - constructor() { - this.index = 0; - this.pool = []; - this.list = []; - } - push(start, count, z, index) { - const pool = this.pool; - const list = this.list; - if (this.index >= pool.length) { - pool.push({ - start: -1, - count: -1, - z: -1, - index: -1 - }); - } - const item = pool[this.index]; - list.push(item); - this.index++; - item.start = start; - item.count = count; - item.z = z; - item.index = index; - } - reset() { - this.list.length = 0; - this.index = 0; - } +__name(_getBlurShader, "_getBlurShader"); +function _getEquirectMaterial() { + return new ShaderMaterial({ + name: "EquirectangularToCubeUV", + uniforms: { + "envMap": { value: null } + }, + vertexShader: _getCommonVertexShader(), + fragmentShader: ( + /* glsl */ + ` + + precision mediump float; + precision mediump int; + + varying vec3 vOutputDirection; + + uniform sampler2D envMap; + + #include + + void main() { + + vec3 outputDirection = normalize( vOutputDirection ); + vec2 uv = equirectUv( outputDirection ); + + gl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 ); + + } + ` + ), + blending: NoBlending, + depthTest: false, + depthWrite: false + }); } -const _matrix$1 = /* @__PURE__ */ new Matrix4(); -const _whiteColor = /* @__PURE__ */ new Color(1, 1, 1); -const _frustum = /* @__PURE__ */ new Frustum(); -const _box$1 = /* @__PURE__ */ new Box3(); -const _sphere$2 = /* @__PURE__ */ new Sphere(); -const _vector$5 = /* @__PURE__ */ new Vector3(); -const _forward = /* @__PURE__ */ new Vector3(); -const _temp = /* @__PURE__ */ new Vector3(); -const _renderList = /* @__PURE__ */ new MultiDrawRenderList(); -const _mesh = /* @__PURE__ */ new Mesh(); -const _batchIntersects = []; -function copyAttributeData(src, target, targetOffset = 0) { - const itemSize = target.itemSize; - if (src.isInterleavedBufferAttribute || src.array.constructor !== target.array.constructor) { - const vertexCount = src.count; - for (let i = 0; i < vertexCount; i++) { - for (let c = 0; c < itemSize; c++) { - target.setComponent(i + targetOffset, c, src.getComponent(i, c)); - } - } - } else { - target.array.set(src.array, targetOffset * itemSize); - } - target.needsUpdate = true; +__name(_getEquirectMaterial, "_getEquirectMaterial"); +function _getCubemapMaterial() { + return new ShaderMaterial({ + name: "CubemapToCubeUV", + uniforms: { + "envMap": { value: null }, + "flipEnvMap": { value: -1 } + }, + vertexShader: _getCommonVertexShader(), + fragmentShader: ( + /* glsl */ + ` + + precision mediump float; + precision mediump int; + + uniform float flipEnvMap; + + varying vec3 vOutputDirection; + + uniform samplerCube envMap; + + void main() { + + gl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) ); + + } + ` + ), + blending: NoBlending, + depthTest: false, + depthWrite: false + }); } -__name(copyAttributeData, "copyAttributeData"); -function copyArrayContents(src, target) { - if (src.constructor !== target.constructor) { - const len = Math.min(src.length, target.length); - for (let i = 0; i < len; i++) { - target[i] = src[i]; - } - } else { - const len = Math.min(src.length, target.length); - target.set(new src.constructor(src.buffer, 0, len)); - } +__name(_getCubemapMaterial, "_getCubemapMaterial"); +function _getCommonVertexShader() { + return ( + /* glsl */ + ` + + precision mediump float; + precision mediump int; + + attribute float faceIndex; + + varying vec3 vOutputDirection; + + // RH coordinate system; PMREM face-indexing convention + vec3 getDirection( vec2 uv, float face ) { + + uv = 2.0 * uv - 1.0; + + vec3 direction = vec3( uv, 1.0 ); + + if ( face == 0.0 ) { + + direction = direction.zyx; // ( 1, v, u ) pos x + + } else if ( face == 1.0 ) { + + direction = direction.xzy; + direction.xz *= -1.0; // ( -u, 1, -v ) pos y + + } else if ( face == 2.0 ) { + + direction.x *= -1.0; // ( -u, v, 1 ) pos z + + } else if ( face == 3.0 ) { + + direction = direction.zyx; + direction.xz *= -1.0; // ( -1, v, -u ) neg x + + } else if ( face == 4.0 ) { + + direction = direction.xzy; + direction.xy *= -1.0; // ( -u, -1, v ) neg y + + } else if ( face == 5.0 ) { + + direction.z *= -1.0; // ( u, v, -1 ) neg z + + } + + return direction; + + } + + void main() { + + vOutputDirection = getDirection( uv, faceIndex ); + gl_Position = vec4( position, 1.0 ); + + } + ` + ); } -__name(copyArrayContents, "copyArrayContents"); -class BatchedMesh extends Mesh { - static { - __name(this, "BatchedMesh"); - } - get maxInstanceCount() { - return this._maxInstanceCount; - } - get instanceCount() { - return this._instanceInfo.length - this._availableInstanceIds.length; - } - get unusedVertexCount() { - return this._maxVertexCount - this._nextVertexStart; - } - get unusedIndexCount() { - return this._maxIndexCount - this._nextIndexStart; - } - constructor(maxInstanceCount, maxVertexCount, maxIndexCount = maxVertexCount * 2, material) { - super(new BufferGeometry(), material); - this.isBatchedMesh = true; - this.perObjectFrustumCulled = true; - this.sortObjects = true; - this.boundingBox = null; - this.boundingSphere = null; - this.customSort = null; - this._instanceInfo = []; - this._geometryInfo = []; - this._availableInstanceIds = []; - this._availableGeometryIds = []; - this._nextIndexStart = 0; - this._nextVertexStart = 0; - this._geometryCount = 0; - this._visibilityChanged = true; - this._geometryInitialized = false; - this._maxInstanceCount = maxInstanceCount; - this._maxVertexCount = maxVertexCount; - this._maxIndexCount = maxIndexCount; - this._multiDrawCounts = new Int32Array(maxInstanceCount); - this._multiDrawStarts = new Int32Array(maxInstanceCount); - this._multiDrawCount = 0; - this._multiDrawInstances = null; - this._matricesTexture = null; - this._indirectTexture = null; - this._colorsTexture = null; - this._initMatricesTexture(); - this._initIndirectTexture(); - } - _initMatricesTexture() { - let size = Math.sqrt(this._maxInstanceCount * 4); - size = Math.ceil(size / 4) * 4; - size = Math.max(size, 4); - const matricesArray = new Float32Array(size * size * 4); - const matricesTexture = new DataTexture(matricesArray, size, size, RGBAFormat, FloatType); - this._matricesTexture = matricesTexture; - } - _initIndirectTexture() { - let size = Math.sqrt(this._maxInstanceCount); - size = Math.ceil(size); - const indirectArray = new Uint32Array(size * size); - const indirectTexture = new DataTexture(indirectArray, size, size, RedIntegerFormat, UnsignedIntType); - this._indirectTexture = indirectTexture; - } - _initColorsTexture() { - let size = Math.sqrt(this._maxInstanceCount); - size = Math.ceil(size); - const colorsArray = new Float32Array(size * size * 4).fill(1); - const colorsTexture = new DataTexture(colorsArray, size, size, RGBAFormat, FloatType); - colorsTexture.colorSpace = ColorManagement.workingColorSpace; - this._colorsTexture = colorsTexture; - } - _initializeGeometry(reference) { - const geometry = this.geometry; - const maxVertexCount = this._maxVertexCount; - const maxIndexCount = this._maxIndexCount; - if (this._geometryInitialized === false) { - for (const attributeName in reference.attributes) { - const srcAttribute = reference.getAttribute(attributeName); - const { array, itemSize, normalized } = srcAttribute; - const dstArray = new array.constructor(maxVertexCount * itemSize); - const dstAttribute = new BufferAttribute(dstArray, itemSize, normalized); - geometry.setAttribute(attributeName, dstAttribute); - } - if (reference.getIndex() !== null) { - const indexArray = maxVertexCount > 65535 ? new Uint32Array(maxIndexCount) : new Uint16Array(maxIndexCount); - geometry.setIndex(new BufferAttribute(indexArray, 1)); - } - this._geometryInitialized = true; - } - } - // Make sure the geometry is compatible with the existing combined geometry attributes - _validateGeometry(geometry) { - const batchGeometry = this.geometry; - if (Boolean(geometry.getIndex()) !== Boolean(batchGeometry.getIndex())) { - throw new Error('BatchedMesh: All geometries must consistently have "index".'); - } - for (const attributeName in batchGeometry.attributes) { - if (!geometry.hasAttribute(attributeName)) { - throw new Error(`BatchedMesh: Added geometry missing "${attributeName}". All geometries must have consistent attributes.`); - } - const srcAttribute = geometry.getAttribute(attributeName); - const dstAttribute = batchGeometry.getAttribute(attributeName); - if (srcAttribute.itemSize !== dstAttribute.itemSize || srcAttribute.normalized !== dstAttribute.normalized) { - throw new Error("BatchedMesh: All attributes must have a consistent itemSize and normalized value."); +__name(_getCommonVertexShader, "_getCommonVertexShader"); +function WebGLCubeUVMaps(renderer) { + let cubeUVmaps = /* @__PURE__ */ new WeakMap(); + let pmremGenerator = null; + function get(texture) { + if (texture && texture.isTexture) { + const mapping = texture.mapping; + const isEquirectMap = mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping; + const isCubeMap = mapping === CubeReflectionMapping || mapping === CubeRefractionMapping; + if (isEquirectMap || isCubeMap) { + let renderTarget = cubeUVmaps.get(texture); + const currentPMREMVersion = renderTarget !== void 0 ? renderTarget.texture.pmremVersion : 0; + if (texture.isRenderTargetTexture && texture.pmremVersion !== currentPMREMVersion) { + if (pmremGenerator === null) pmremGenerator = new PMREMGenerator(renderer); + renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular(texture, renderTarget) : pmremGenerator.fromCubemap(texture, renderTarget); + renderTarget.texture.pmremVersion = texture.pmremVersion; + cubeUVmaps.set(texture, renderTarget); + return renderTarget.texture; + } else { + if (renderTarget !== void 0) { + return renderTarget.texture; + } else { + const image = texture.image; + if (isEquirectMap && image && image.height > 0 || isCubeMap && image && isCubeTextureComplete(image)) { + if (pmremGenerator === null) pmremGenerator = new PMREMGenerator(renderer); + renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular(texture) : pmremGenerator.fromCubemap(texture); + renderTarget.texture.pmremVersion = texture.pmremVersion; + cubeUVmaps.set(texture, renderTarget); + texture.addEventListener("dispose", onTextureDispose); + return renderTarget.texture; + } else { + return null; + } + } + } } } + return texture; } - setCustomSort(func) { - this.customSort = func; - return this; - } - computeBoundingBox() { - if (this.boundingBox === null) { - this.boundingBox = new Box3(); - } - const boundingBox = this.boundingBox; - const instanceInfo = this._instanceInfo; - boundingBox.makeEmpty(); - for (let i = 0, l = instanceInfo.length; i < l; i++) { - if (instanceInfo[i].active === false) continue; - const geometryId = instanceInfo[i].geometryIndex; - this.getMatrixAt(i, _matrix$1); - this.getBoundingBoxAt(geometryId, _box$1).applyMatrix4(_matrix$1); - boundingBox.union(_box$1); - } - } - computeBoundingSphere() { - if (this.boundingSphere === null) { - this.boundingSphere = new Sphere(); - } - const boundingSphere = this.boundingSphere; - const instanceInfo = this._instanceInfo; - boundingSphere.makeEmpty(); - for (let i = 0, l = instanceInfo.length; i < l; i++) { - if (instanceInfo[i].active === false) continue; - const geometryId = instanceInfo[i].geometryIndex; - this.getMatrixAt(i, _matrix$1); - this.getBoundingSphereAt(geometryId, _sphere$2).applyMatrix4(_matrix$1); - boundingSphere.union(_sphere$2); + __name(get, "get"); + function isCubeTextureComplete(image) { + let count = 0; + const length = 6; + for (let i = 0; i < length; i++) { + if (image[i] !== void 0) count++; } + return count === length; } - addInstance(geometryId) { - const atCapacity = this._instanceInfo.length >= this.maxInstanceCount; - if (atCapacity && this._availableInstanceIds.length === 0) { - throw new Error("BatchedMesh: Maximum item count reached."); - } - const instanceInfo = { - visible: true, - active: true, - geometryIndex: geometryId - }; - let drawId = null; - if (this._availableInstanceIds.length > 0) { - this._availableInstanceIds.sort(ascIdSort); - drawId = this._availableInstanceIds.shift(); - this._instanceInfo[drawId] = instanceInfo; - } else { - drawId = this._instanceInfo.length; - this._instanceInfo.push(instanceInfo); - } - const matricesTexture = this._matricesTexture; - _matrix$1.identity().toArray(matricesTexture.image.data, drawId * 16); - matricesTexture.needsUpdate = true; - const colorsTexture = this._colorsTexture; - if (colorsTexture) { - _whiteColor.toArray(colorsTexture.image.data, drawId * 4); - colorsTexture.needsUpdate = true; + __name(isCubeTextureComplete, "isCubeTextureComplete"); + function onTextureDispose(event) { + const texture = event.target; + texture.removeEventListener("dispose", onTextureDispose); + const cubemapUV = cubeUVmaps.get(texture); + if (cubemapUV !== void 0) { + cubeUVmaps.delete(texture); + cubemapUV.dispose(); } - this._visibilityChanged = true; - return drawId; } - addGeometry(geometry, reservedVertexCount = -1, reservedIndexCount = -1) { - this._initializeGeometry(geometry); - this._validateGeometry(geometry); - const geometryInfo = { - // geometry information - vertexStart: -1, - vertexCount: -1, - reservedVertexCount: -1, - indexStart: -1, - indexCount: -1, - reservedIndexCount: -1, - // draw range information - start: -1, - count: -1, - // state - boundingBox: null, - boundingSphere: null, - active: true - }; - const geometryInfoList = this._geometryInfo; - geometryInfo.vertexStart = this._nextVertexStart; - geometryInfo.reservedVertexCount = reservedVertexCount === -1 ? geometry.getAttribute("position").count : reservedVertexCount; - const index = geometry.getIndex(); - const hasIndex = index !== null; - if (hasIndex) { - geometryInfo.indexStart = this._nextIndexStart; - geometryInfo.reservedIndexCount = reservedIndexCount === -1 ? index.count : reservedIndexCount; - } - if (geometryInfo.indexStart !== -1 && geometryInfo.indexStart + geometryInfo.reservedIndexCount > this._maxIndexCount || geometryInfo.vertexStart + geometryInfo.reservedVertexCount > this._maxVertexCount) { - throw new Error("BatchedMesh: Reserved space request exceeds the maximum buffer size."); - } - let geometryId; - if (this._availableGeometryIds.length > 0) { - this._availableGeometryIds.sort(ascIdSort); - geometryId = this._availableGeometryIds.shift(); - geometryInfoList[geometryId] = geometryInfo; - } else { - geometryId = this._geometryCount; - this._geometryCount++; - geometryInfoList.push(geometryInfo); + __name(onTextureDispose, "onTextureDispose"); + function dispose() { + cubeUVmaps = /* @__PURE__ */ new WeakMap(); + if (pmremGenerator !== null) { + pmremGenerator.dispose(); + pmremGenerator = null; } - this.setGeometryAt(geometryId, geometry); - this._nextIndexStart = geometryInfo.indexStart + geometryInfo.reservedIndexCount; - this._nextVertexStart = geometryInfo.vertexStart + geometryInfo.reservedVertexCount; - return geometryId; } - setGeometryAt(geometryId, geometry) { - if (geometryId >= this._geometryCount) { - throw new Error("BatchedMesh: Maximum geometry count reached."); + __name(dispose, "dispose"); + return { + get, + dispose + }; +} +__name(WebGLCubeUVMaps, "WebGLCubeUVMaps"); +function WebGLExtensions(gl) { + const extensions = {}; + function getExtension(name) { + if (extensions[name] !== void 0) { + return extensions[name]; } - this._validateGeometry(geometry); - const batchGeometry = this.geometry; - const hasIndex = batchGeometry.getIndex() !== null; - const dstIndex = batchGeometry.getIndex(); - const srcIndex = geometry.getIndex(); - const geometryInfo = this._geometryInfo[geometryId]; - if (hasIndex && srcIndex.count > geometryInfo.reservedIndexCount || geometry.attributes.position.count > geometryInfo.reservedVertexCount) { - throw new Error("BatchedMesh: Reserved space not large enough for provided geometry."); + let extension; + switch (name) { + case "WEBGL_depth_texture": + extension = gl.getExtension("WEBGL_depth_texture") || gl.getExtension("MOZ_WEBGL_depth_texture") || gl.getExtension("WEBKIT_WEBGL_depth_texture"); + break; + case "EXT_texture_filter_anisotropic": + extension = gl.getExtension("EXT_texture_filter_anisotropic") || gl.getExtension("MOZ_EXT_texture_filter_anisotropic") || gl.getExtension("WEBKIT_EXT_texture_filter_anisotropic"); + break; + case "WEBGL_compressed_texture_s3tc": + extension = gl.getExtension("WEBGL_compressed_texture_s3tc") || gl.getExtension("MOZ_WEBGL_compressed_texture_s3tc") || gl.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc"); + break; + case "WEBGL_compressed_texture_pvrtc": + extension = gl.getExtension("WEBGL_compressed_texture_pvrtc") || gl.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc"); + break; + default: + extension = gl.getExtension(name); } - const vertexStart = geometryInfo.vertexStart; - const reservedVertexCount = geometryInfo.reservedVertexCount; - geometryInfo.vertexCount = geometry.getAttribute("position").count; - for (const attributeName in batchGeometry.attributes) { - const srcAttribute = geometry.getAttribute(attributeName); - const dstAttribute = batchGeometry.getAttribute(attributeName); - copyAttributeData(srcAttribute, dstAttribute, vertexStart); - const itemSize = srcAttribute.itemSize; - for (let i = srcAttribute.count, l = reservedVertexCount; i < l; i++) { - const index = vertexStart + i; - for (let c = 0; c < itemSize; c++) { - dstAttribute.setComponent(index, c, 0); - } + extensions[name] = extension; + return extension; + } + __name(getExtension, "getExtension"); + return { + has: /* @__PURE__ */ __name(function(name) { + return getExtension(name) !== null; + }, "has"), + init: /* @__PURE__ */ __name(function() { + getExtension("EXT_color_buffer_float"); + getExtension("WEBGL_clip_cull_distance"); + getExtension("OES_texture_float_linear"); + getExtension("EXT_color_buffer_half_float"); + getExtension("WEBGL_multisampled_render_to_texture"); + getExtension("WEBGL_render_shared_exponent"); + }, "init"), + get: /* @__PURE__ */ __name(function(name) { + const extension = getExtension(name); + if (extension === null) { + warnOnce("THREE.WebGLRenderer: " + name + " extension not supported."); } - dstAttribute.needsUpdate = true; - dstAttribute.addUpdateRange(vertexStart * itemSize, reservedVertexCount * itemSize); + return extension; + }, "get") + }; +} +__name(WebGLExtensions, "WebGLExtensions"); +function WebGLGeometries(gl, attributes, info, bindingStates) { + const geometries = {}; + const wireframeAttributes = /* @__PURE__ */ new WeakMap(); + function onGeometryDispose(event) { + const geometry = event.target; + if (geometry.index !== null) { + attributes.remove(geometry.index); } - if (hasIndex) { - const indexStart = geometryInfo.indexStart; - const reservedIndexCount = geometryInfo.reservedIndexCount; - geometryInfo.indexCount = geometry.getIndex().count; - for (let i = 0; i < srcIndex.count; i++) { - dstIndex.setX(indexStart + i, vertexStart + srcIndex.getX(i)); - } - for (let i = srcIndex.count, l = reservedIndexCount; i < l; i++) { - dstIndex.setX(indexStart + i, vertexStart); + for (const name in geometry.attributes) { + attributes.remove(geometry.attributes[name]); + } + for (const name in geometry.morphAttributes) { + const array = geometry.morphAttributes[name]; + for (let i = 0, l = array.length; i < l; i++) { + attributes.remove(array[i]); } - dstIndex.needsUpdate = true; - dstIndex.addUpdateRange(indexStart, geometryInfo.reservedIndexCount); } - geometryInfo.start = hasIndex ? geometryInfo.indexStart : geometryInfo.vertexStart; - geometryInfo.count = hasIndex ? geometryInfo.indexCount : geometryInfo.vertexCount; - geometryInfo.boundingBox = null; - if (geometry.boundingBox !== null) { - geometryInfo.boundingBox = geometry.boundingBox.clone(); + geometry.removeEventListener("dispose", onGeometryDispose); + delete geometries[geometry.id]; + const attribute = wireframeAttributes.get(geometry); + if (attribute) { + attributes.remove(attribute); + wireframeAttributes.delete(geometry); } - geometryInfo.boundingSphere = null; - if (geometry.boundingSphere !== null) { - geometryInfo.boundingSphere = geometry.boundingSphere.clone(); + bindingStates.releaseStatesOfGeometry(geometry); + if (geometry.isInstancedBufferGeometry === true) { + delete geometry._maxInstanceCount; } - this._visibilityChanged = true; - return geometryId; + info.memory.geometries--; } - deleteGeometry(geometryId) { - const geometryInfoList = this._geometryInfo; - if (geometryId >= geometryInfoList.length || geometryInfoList[geometryId].active === false) { - return this; - } - const instanceInfo = this._instanceInfo; - for (let i = 0, l = instanceInfo.length; i < l; i++) { - if (instanceInfo[i].geometryIndex === geometryId) { - this.deleteInstance(i); - } - } - geometryInfoList[geometryId].active = false; - this._availableGeometryIds.push(geometryId); - this._visibilityChanged = true; - return this; + __name(onGeometryDispose, "onGeometryDispose"); + function get(object, geometry) { + if (geometries[geometry.id] === true) return geometry; + geometry.addEventListener("dispose", onGeometryDispose); + geometries[geometry.id] = true; + info.memory.geometries++; + return geometry; } - deleteInstance(instanceId) { - const instanceInfo = this._instanceInfo; - if (instanceId >= instanceInfo.length || instanceInfo[instanceId].active === false) { - return this; + __name(get, "get"); + function update(geometry) { + const geometryAttributes = geometry.attributes; + for (const name in geometryAttributes) { + attributes.update(geometryAttributes[name], gl.ARRAY_BUFFER); } - instanceInfo[instanceId].active = false; - this._availableInstanceIds.push(instanceId); - this._visibilityChanged = true; - return this; - } - optimize() { - let nextVertexStart = 0; - let nextIndexStart = 0; - const geometryInfoList = this._geometryInfo; - const indices = geometryInfoList.map((e, i) => i).sort((a, b) => { - return geometryInfoList[a].vertexStart - geometryInfoList[b].vertexStart; - }); - const geometry = this.geometry; - for (let i = 0, l = geometryInfoList.length; i < l; i++) { - const index = indices[i]; - const geometryInfo = geometryInfoList[index]; - if (geometryInfo.active === false) { - continue; - } - if (geometry.index !== null) { - if (geometryInfo.indexStart !== nextIndexStart) { - const { indexStart, vertexStart, reservedIndexCount } = geometryInfo; - const index2 = geometry.index; - const array = index2.array; - const elementDelta = nextVertexStart - vertexStart; - for (let j = indexStart; j < indexStart + reservedIndexCount; j++) { - array[j] = array[j] + elementDelta; - } - index2.array.copyWithin(nextIndexStart, indexStart, indexStart + reservedIndexCount); - index2.addUpdateRange(nextIndexStart, reservedIndexCount); - geometryInfo.indexStart = nextIndexStart; - } - nextIndexStart += geometryInfo.reservedIndexCount; - } - if (geometryInfo.vertexStart !== nextVertexStart) { - const { vertexStart, reservedVertexCount } = geometryInfo; - const attributes = geometry.attributes; - for (const key in attributes) { - const attribute = attributes[key]; - const { array, itemSize } = attribute; - array.copyWithin(nextVertexStart * itemSize, vertexStart * itemSize, (vertexStart + reservedVertexCount) * itemSize); - attribute.addUpdateRange(nextVertexStart * itemSize, reservedVertexCount * itemSize); - } - geometryInfo.vertexStart = nextVertexStart; + const morphAttributes = geometry.morphAttributes; + for (const name in morphAttributes) { + const array = morphAttributes[name]; + for (let i = 0, l = array.length; i < l; i++) { + attributes.update(array[i], gl.ARRAY_BUFFER); } - nextVertexStart += geometryInfo.reservedVertexCount; - geometryInfo.start = geometry.index ? geometryInfo.indexStart : geometryInfo.vertexStart; - this._nextIndexStart = geometry.index ? geometryInfo.indexStart + geometryInfo.reservedIndexCount : 0; - this._nextVertexStart = geometryInfo.vertexStart + geometryInfo.reservedVertexCount; } - return this; } - // get bounding box and compute it if it doesn't exist - getBoundingBoxAt(geometryId, target) { - if (geometryId >= this._geometryCount) { - return null; - } - const geometry = this.geometry; - const geometryInfo = this._geometryInfo[geometryId]; - if (geometryInfo.boundingBox === null) { - const box = new Box3(); - const index = geometry.index; - const position = geometry.attributes.position; - for (let i = geometryInfo.start, l = geometryInfo.start + geometryInfo.count; i < l; i++) { - let iv = i; - if (index) { - iv = index.getX(iv); - } - box.expandByPoint(_vector$5.fromBufferAttribute(position, iv)); + __name(update, "update"); + function updateWireframeAttribute(geometry) { + const indices = []; + const geometryIndex = geometry.index; + const geometryPosition = geometry.attributes.position; + let version = 0; + if (geometryIndex !== null) { + const array = geometryIndex.array; + version = geometryIndex.version; + for (let i = 0, l = array.length; i < l; i += 3) { + const a = array[i + 0]; + const b = array[i + 1]; + const c = array[i + 2]; + indices.push(a, b, b, c, c, a); } - geometryInfo.boundingBox = box; + } else if (geometryPosition !== void 0) { + const array = geometryPosition.array; + version = geometryPosition.version; + for (let i = 0, l = array.length / 3 - 1; i < l; i += 3) { + const a = i + 0; + const b = i + 1; + const c = i + 2; + indices.push(a, b, b, c, c, a); + } + } else { + return; } - target.copy(geometryInfo.boundingBox); - return target; + const attribute = new (arrayNeedsUint32(indices) ? Uint32BufferAttribute : Uint16BufferAttribute)(indices, 1); + attribute.version = version; + const previousAttribute = wireframeAttributes.get(geometry); + if (previousAttribute) attributes.remove(previousAttribute); + wireframeAttributes.set(geometry, attribute); } - // get bounding sphere and compute it if it doesn't exist - getBoundingSphereAt(geometryId, target) { - if (geometryId >= this._geometryCount) { - return null; - } - const geometry = this.geometry; - const geometryInfo = this._geometryInfo[geometryId]; - if (geometryInfo.boundingSphere === null) { - const sphere = new Sphere(); - this.getBoundingBoxAt(geometryId, _box$1); - _box$1.getCenter(sphere.center); - const index = geometry.index; - const position = geometry.attributes.position; - let maxRadiusSq = 0; - for (let i = geometryInfo.start, l = geometryInfo.start + geometryInfo.count; i < l; i++) { - let iv = i; - if (index) { - iv = index.getX(iv); + __name(updateWireframeAttribute, "updateWireframeAttribute"); + function getWireframeAttribute(geometry) { + const currentAttribute = wireframeAttributes.get(geometry); + if (currentAttribute) { + const geometryIndex = geometry.index; + if (geometryIndex !== null) { + if (currentAttribute.version < geometryIndex.version) { + updateWireframeAttribute(geometry); } - _vector$5.fromBufferAttribute(position, iv); - maxRadiusSq = Math.max(maxRadiusSq, sphere.center.distanceToSquared(_vector$5)); } - sphere.radius = Math.sqrt(maxRadiusSq); - geometryInfo.boundingSphere = sphere; - } - target.copy(geometryInfo.boundingSphere); - return target; - } - setMatrixAt(instanceId, matrix) { - const instanceInfo = this._instanceInfo; - const matricesTexture = this._matricesTexture; - const matricesArray = this._matricesTexture.image.data; - if (instanceId >= instanceInfo.length || instanceInfo[instanceId].active === false) { - return this; + } else { + updateWireframeAttribute(geometry); } - matrix.toArray(matricesArray, instanceId * 16); - matricesTexture.needsUpdate = true; - return this; + return wireframeAttributes.get(geometry); } - getMatrixAt(instanceId, matrix) { - const instanceInfo = this._instanceInfo; - const matricesArray = this._matricesTexture.image.data; - if (instanceId >= instanceInfo.length || instanceInfo[instanceId].active === false) { - return null; - } - return matrix.fromArray(matricesArray, instanceId * 16); + __name(getWireframeAttribute, "getWireframeAttribute"); + return { + get, + update, + getWireframeAttribute + }; +} +__name(WebGLGeometries, "WebGLGeometries"); +function WebGLIndexedBufferRenderer(gl, extensions, info) { + let mode; + function setMode(value) { + mode = value; } - setColorAt(instanceId, color) { - if (this._colorsTexture === null) { - this._initColorsTexture(); - } - const colorsTexture = this._colorsTexture; - const colorsArray = this._colorsTexture.image.data; - const instanceInfo = this._instanceInfo; - if (instanceId >= instanceInfo.length || instanceInfo[instanceId].active === false) { - return this; - } - color.toArray(colorsArray, instanceId * 4); - colorsTexture.needsUpdate = true; - return this; + __name(setMode, "setMode"); + let type, bytesPerElement; + function setIndex(value) { + type = value.type; + bytesPerElement = value.bytesPerElement; } - getColorAt(instanceId, color) { - const colorsArray = this._colorsTexture.image.data; - const instanceInfo = this._instanceInfo; - if (instanceId >= instanceInfo.length || instanceInfo[instanceId].active === false) { - return null; - } - return color.fromArray(colorsArray, instanceId * 4); + __name(setIndex, "setIndex"); + function render(start, count) { + gl.drawElements(mode, count, type, start * bytesPerElement); + info.update(count, mode, 1); } - setVisibleAt(instanceId, value) { - const instanceInfo = this._instanceInfo; - if (instanceId >= instanceInfo.length || instanceInfo[instanceId].active === false || instanceInfo[instanceId].visible === value) { - return this; - } - instanceInfo[instanceId].visible = value; - this._visibilityChanged = true; - return this; + __name(render, "render"); + function renderInstances(start, count, primcount) { + if (primcount === 0) return; + gl.drawElementsInstanced(mode, count, type, start * bytesPerElement, primcount); + info.update(count, mode, primcount); } - getVisibleAt(instanceId) { - const instanceInfo = this._instanceInfo; - if (instanceId >= instanceInfo.length || instanceInfo[instanceId].active === false) { - return false; + __name(renderInstances, "renderInstances"); + function renderMultiDraw(starts, counts, drawCount) { + if (drawCount === 0) return; + const extension = extensions.get("WEBGL_multi_draw"); + extension.multiDrawElementsWEBGL(mode, counts, 0, type, starts, 0, drawCount); + let elementCount = 0; + for (let i = 0; i < drawCount; i++) { + elementCount += counts[i]; } - return instanceInfo[instanceId].visible; + info.update(elementCount, mode, 1); } - setGeometryIdAt(instanceId, geometryId) { - const instanceInfo = this._instanceInfo; - const geometryInfoList = this._geometryInfo; - if (instanceId >= instanceInfo.length || instanceInfo[instanceId].active === false) { - return null; - } - if (geometryId >= geometryInfoList.length || geometryInfoList[geometryId].active === false) { - return null; + __name(renderMultiDraw, "renderMultiDraw"); + function renderMultiDrawInstances(starts, counts, drawCount, primcount) { + if (drawCount === 0) return; + const extension = extensions.get("WEBGL_multi_draw"); + if (extension === null) { + for (let i = 0; i < starts.length; i++) { + renderInstances(starts[i] / bytesPerElement, counts[i], primcount[i]); + } + } else { + extension.multiDrawElementsInstancedWEBGL(mode, counts, 0, type, starts, 0, primcount, 0, drawCount); + let elementCount = 0; + for (let i = 0; i < drawCount; i++) { + elementCount += counts[i] * primcount[i]; + } + info.update(elementCount, mode, 1); } - instanceInfo[instanceId].geometryIndex = geometryId; - return this; } - getGeometryIdAt(instanceId) { - const instanceInfo = this._instanceInfo; - if (instanceId >= instanceInfo.length || instanceInfo[instanceId].active === false) { - return -1; + __name(renderMultiDrawInstances, "renderMultiDrawInstances"); + this.setMode = setMode; + this.setIndex = setIndex; + this.render = render; + this.renderInstances = renderInstances; + this.renderMultiDraw = renderMultiDraw; + this.renderMultiDrawInstances = renderMultiDrawInstances; +} +__name(WebGLIndexedBufferRenderer, "WebGLIndexedBufferRenderer"); +function WebGLInfo(gl) { + const memory = { + geometries: 0, + textures: 0 + }; + const render = { + frame: 0, + calls: 0, + triangles: 0, + points: 0, + lines: 0 + }; + function update(count, mode, instanceCount) { + render.calls++; + switch (mode) { + case gl.TRIANGLES: + render.triangles += instanceCount * (count / 3); + break; + case gl.LINES: + render.lines += instanceCount * (count / 2); + break; + case gl.LINE_STRIP: + render.lines += instanceCount * (count - 1); + break; + case gl.LINE_LOOP: + render.lines += instanceCount * count; + break; + case gl.POINTS: + render.points += instanceCount * count; + break; + default: + console.error("THREE.WebGLInfo: Unknown draw mode:", mode); + break; } - return instanceInfo[instanceId].geometryIndex; } - getGeometryRangeAt(geometryId, target = {}) { - if (geometryId < 0 || geometryId >= this._geometryCount) { - return null; - } - const geometryInfo = this._geometryInfo[geometryId]; - target.vertexStart = geometryInfo.vertexStart; - target.vertexCount = geometryInfo.vertexCount; - target.reservedVertexCount = geometryInfo.reservedVertexCount; - target.indexStart = geometryInfo.indexStart; - target.indexCount = geometryInfo.indexCount; - target.reservedIndexCount = geometryInfo.reservedIndexCount; - target.start = geometryInfo.start; - target.count = geometryInfo.count; - return target; + __name(update, "update"); + function reset() { + render.calls = 0; + render.triangles = 0; + render.points = 0; + render.lines = 0; } - setInstanceCount(maxInstanceCount) { - const availableInstanceIds = this._availableInstanceIds; - const instanceInfo = this._instanceInfo; - availableInstanceIds.sort(ascIdSort); - while (availableInstanceIds[availableInstanceIds.length - 1] === instanceInfo.length) { - instanceInfo.pop(); - availableInstanceIds.pop(); - } - if (maxInstanceCount < instanceInfo.length) { - throw new Error(`BatchedMesh: Instance ids outside the range ${maxInstanceCount} are being used. Cannot shrink instance count.`); + __name(reset, "reset"); + return { + memory, + render, + programs: null, + autoReset: true, + reset, + update + }; +} +__name(WebGLInfo, "WebGLInfo"); +function WebGLMorphtargets(gl, capabilities, textures) { + const morphTextures = /* @__PURE__ */ new WeakMap(); + const morph = new Vector4(); + function update(object, geometry, program) { + const objectInfluences = object.morphTargetInfluences; + const morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color; + const morphTargetsCount = morphAttribute !== void 0 ? morphAttribute.length : 0; + let entry = morphTextures.get(geometry); + if (entry === void 0 || entry.count !== morphTargetsCount) { + let disposeTexture = function() { + texture.dispose(); + morphTextures.delete(geometry); + geometry.removeEventListener("dispose", disposeTexture); + }; + __name(disposeTexture, "disposeTexture"); + if (entry !== void 0) entry.texture.dispose(); + const hasMorphPosition = geometry.morphAttributes.position !== void 0; + const hasMorphNormals = geometry.morphAttributes.normal !== void 0; + const hasMorphColors = geometry.morphAttributes.color !== void 0; + const morphTargets = geometry.morphAttributes.position || []; + const morphNormals = geometry.morphAttributes.normal || []; + const morphColors = geometry.morphAttributes.color || []; + let vertexDataCount = 0; + if (hasMorphPosition === true) vertexDataCount = 1; + if (hasMorphNormals === true) vertexDataCount = 2; + if (hasMorphColors === true) vertexDataCount = 3; + let width = geometry.attributes.position.count * vertexDataCount; + let height = 1; + if (width > capabilities.maxTextureSize) { + height = Math.ceil(width / capabilities.maxTextureSize); + width = capabilities.maxTextureSize; + } + const buffer = new Float32Array(width * height * 4 * morphTargetsCount); + const texture = new DataArrayTexture(buffer, width, height, morphTargetsCount); + texture.type = FloatType; + texture.needsUpdate = true; + const vertexDataStride = vertexDataCount * 4; + for (let i = 0; i < morphTargetsCount; i++) { + const morphTarget = morphTargets[i]; + const morphNormal = morphNormals[i]; + const morphColor = morphColors[i]; + const offset = width * height * 4 * i; + for (let j = 0; j < morphTarget.count; j++) { + const stride = j * vertexDataStride; + if (hasMorphPosition === true) { + morph.fromBufferAttribute(morphTarget, j); + buffer[offset + stride + 0] = morph.x; + buffer[offset + stride + 1] = morph.y; + buffer[offset + stride + 2] = morph.z; + buffer[offset + stride + 3] = 0; + } + if (hasMorphNormals === true) { + morph.fromBufferAttribute(morphNormal, j); + buffer[offset + stride + 4] = morph.x; + buffer[offset + stride + 5] = morph.y; + buffer[offset + stride + 6] = morph.z; + buffer[offset + stride + 7] = 0; + } + if (hasMorphColors === true) { + morph.fromBufferAttribute(morphColor, j); + buffer[offset + stride + 8] = morph.x; + buffer[offset + stride + 9] = morph.y; + buffer[offset + stride + 10] = morph.z; + buffer[offset + stride + 11] = morphColor.itemSize === 4 ? morph.w : 1; + } + } + } + entry = { + count: morphTargetsCount, + texture, + size: new Vector2(width, height) + }; + morphTextures.set(geometry, entry); + geometry.addEventListener("dispose", disposeTexture); } - const multiDrawCounts = new Int32Array(maxInstanceCount); - const multiDrawStarts = new Int32Array(maxInstanceCount); - copyArrayContents(this._multiDrawCounts, multiDrawCounts); - copyArrayContents(this._multiDrawStarts, multiDrawStarts); - this._multiDrawCounts = multiDrawCounts; - this._multiDrawStarts = multiDrawStarts; - this._maxInstanceCount = maxInstanceCount; - const indirectTexture = this._indirectTexture; - const matricesTexture = this._matricesTexture; - const colorsTexture = this._colorsTexture; - indirectTexture.dispose(); - this._initIndirectTexture(); - copyArrayContents(indirectTexture.image.data, this._indirectTexture.image.data); - matricesTexture.dispose(); - this._initMatricesTexture(); - copyArrayContents(matricesTexture.image.data, this._matricesTexture.image.data); - if (colorsTexture) { - colorsTexture.dispose(); - this._initColorsTexture(); - copyArrayContents(colorsTexture.image.data, this._colorsTexture.image.data); + if (object.isInstancedMesh === true && object.morphTexture !== null) { + program.getUniforms().setValue(gl, "morphTexture", object.morphTexture, textures); + } else { + let morphInfluencesSum = 0; + for (let i = 0; i < objectInfluences.length; i++) { + morphInfluencesSum += objectInfluences[i]; + } + const morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum; + program.getUniforms().setValue(gl, "morphTargetBaseInfluence", morphBaseInfluence); + program.getUniforms().setValue(gl, "morphTargetInfluences", objectInfluences); } + program.getUniforms().setValue(gl, "morphTargetsTexture", entry.texture, textures); + program.getUniforms().setValue(gl, "morphTargetsTextureSize", entry.size); } - setGeometrySize(maxVertexCount, maxIndexCount) { - const validRanges = [...this._geometryInfo].filter((info) => info.active); - const requiredVertexLength = Math.max(...validRanges.map((range) => range.vertexStart + range.reservedVertexCount)); - if (requiredVertexLength > maxVertexCount) { - throw new Error(`BatchedMesh: Geometry vertex values are being used outside the range ${maxIndexCount}. Cannot shrink further.`); + __name(update, "update"); + return { + update + }; +} +__name(WebGLMorphtargets, "WebGLMorphtargets"); +function WebGLObjects(gl, geometries, attributes, info) { + let updateMap = /* @__PURE__ */ new WeakMap(); + function update(object) { + const frame = info.render.frame; + const geometry = object.geometry; + const buffergeometry = geometries.get(object, geometry); + if (updateMap.get(buffergeometry) !== frame) { + geometries.update(buffergeometry); + updateMap.set(buffergeometry, frame); } - if (this.geometry.index) { - const requiredIndexLength = Math.max(...validRanges.map((range) => range.indexStart + range.reservedIndexCount)); - if (requiredIndexLength > maxIndexCount) { - throw new Error(`BatchedMesh: Geometry index values are being used outside the range ${maxIndexCount}. Cannot shrink further.`); + if (object.isInstancedMesh) { + if (object.hasEventListener("dispose", onInstancedMeshDispose) === false) { + object.addEventListener("dispose", onInstancedMeshDispose); + } + if (updateMap.get(object) !== frame) { + attributes.update(object.instanceMatrix, gl.ARRAY_BUFFER); + if (object.instanceColor !== null) { + attributes.update(object.instanceColor, gl.ARRAY_BUFFER); + } + updateMap.set(object, frame); } } - const oldGeometry = this.geometry; - oldGeometry.dispose(); - this._maxVertexCount = maxVertexCount; - this._maxIndexCount = maxIndexCount; - if (this._geometryInitialized) { - this._geometryInitialized = false; - this.geometry = new BufferGeometry(); - this._initializeGeometry(oldGeometry); - } - const geometry = this.geometry; - if (oldGeometry.index) { - copyArrayContents(oldGeometry.index.array, geometry.index.array); - } - for (const key in oldGeometry.attributes) { - copyArrayContents(oldGeometry.attributes[key].array, geometry.attributes[key].array); + if (object.isSkinnedMesh) { + const skeleton = object.skeleton; + if (updateMap.get(skeleton) !== frame) { + skeleton.update(); + updateMap.set(skeleton, frame); + } } + return buffergeometry; } - raycast(raycaster, intersects2) { - const instanceInfo = this._instanceInfo; - const geometryInfoList = this._geometryInfo; - const matrixWorld = this.matrixWorld; - const batchGeometry = this.geometry; - _mesh.material = this.material; - _mesh.geometry.index = batchGeometry.index; - _mesh.geometry.attributes = batchGeometry.attributes; - if (_mesh.geometry.boundingBox === null) { - _mesh.geometry.boundingBox = new Box3(); - } - if (_mesh.geometry.boundingSphere === null) { - _mesh.geometry.boundingSphere = new Sphere(); - } - for (let i = 0, l = instanceInfo.length; i < l; i++) { - if (!instanceInfo[i].visible || !instanceInfo[i].active) { - continue; - } - const geometryId = instanceInfo[i].geometryIndex; - const geometryInfo = geometryInfoList[geometryId]; - _mesh.geometry.setDrawRange(geometryInfo.start, geometryInfo.count); - this.getMatrixAt(i, _mesh.matrixWorld).premultiply(matrixWorld); - this.getBoundingBoxAt(geometryId, _mesh.geometry.boundingBox); - this.getBoundingSphereAt(geometryId, _mesh.geometry.boundingSphere); - _mesh.raycast(raycaster, _batchIntersects); - for (let j = 0, l2 = _batchIntersects.length; j < l2; j++) { - const intersect2 = _batchIntersects[j]; - intersect2.object = this; - intersect2.batchId = i; - intersects2.push(intersect2); - } - _batchIntersects.length = 0; + __name(update, "update"); + function dispose() { + updateMap = /* @__PURE__ */ new WeakMap(); + } + __name(dispose, "dispose"); + function onInstancedMeshDispose(event) { + const instancedMesh = event.target; + instancedMesh.removeEventListener("dispose", onInstancedMeshDispose); + attributes.remove(instancedMesh.instanceMatrix); + if (instancedMesh.instanceColor !== null) attributes.remove(instancedMesh.instanceColor); + } + __name(onInstancedMeshDispose, "onInstancedMeshDispose"); + return { + update, + dispose + }; +} +__name(WebGLObjects, "WebGLObjects"); +class DepthTexture extends Texture { + static { + __name(this, "DepthTexture"); + } + constructor(width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format = DepthFormat) { + if (format !== DepthFormat && format !== DepthStencilFormat) { + throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat"); } - _mesh.material = null; - _mesh.geometry.index = null; - _mesh.geometry.attributes = {}; - _mesh.geometry.setDrawRange(0, Infinity); + if (type === void 0 && format === DepthFormat) type = UnsignedIntType; + if (type === void 0 && format === DepthStencilFormat) type = UnsignedInt248Type; + super(null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy); + this.isDepthTexture = true; + this.image = { width, height }; + this.magFilter = magFilter !== void 0 ? magFilter : NearestFilter; + this.minFilter = minFilter !== void 0 ? minFilter : NearestFilter; + this.flipY = false; + this.generateMipmaps = false; + this.compareFunction = null; } copy(source) { super.copy(source); - this.geometry = source.geometry.clone(); - this.perObjectFrustumCulled = source.perObjectFrustumCulled; - this.sortObjects = source.sortObjects; - this.boundingBox = source.boundingBox !== null ? source.boundingBox.clone() : null; - this.boundingSphere = source.boundingSphere !== null ? source.boundingSphere.clone() : null; - this._geometryInfo = source._geometryInfo.map((info) => ({ - ...info, - boundingBox: info.boundingBox !== null ? info.boundingBox.clone() : null, - boundingSphere: info.boundingSphere !== null ? info.boundingSphere.clone() : null - })); - this._instanceInfo = source._instanceInfo.map((info) => ({ ...info })); - this._maxInstanceCount = source._maxInstanceCount; - this._maxVertexCount = source._maxVertexCount; - this._maxIndexCount = source._maxIndexCount; - this._geometryInitialized = source._geometryInitialized; - this._geometryCount = source._geometryCount; - this._multiDrawCounts = source._multiDrawCounts.slice(); - this._multiDrawStarts = source._multiDrawStarts.slice(); - this._matricesTexture = source._matricesTexture.clone(); - this._matricesTexture.image.data = this._matricesTexture.image.data.slice(); - if (this._colorsTexture !== null) { - this._colorsTexture = source._colorsTexture.clone(); - this._colorsTexture.image.data = this._colorsTexture.image.data.slice(); - } + this.compareFunction = source.compareFunction; return this; } - dispose() { - this.geometry.dispose(); - this._matricesTexture.dispose(); - this._matricesTexture = null; - this._indirectTexture.dispose(); - this._indirectTexture = null; - if (this._colorsTexture !== null) { - this._colorsTexture.dispose(); - this._colorsTexture = null; - } - return this; + toJSON(meta) { + const data = super.toJSON(meta); + if (this.compareFunction !== null) data.compareFunction = this.compareFunction; + return data; } - onBeforeRender(renderer, scene, camera, geometry, material) { - if (!this._visibilityChanged && !this.perObjectFrustumCulled && !this.sortObjects) { - return; - } - const index = geometry.getIndex(); - const bytesPerElement = index === null ? 1 : index.array.BYTES_PER_ELEMENT; - const instanceInfo = this._instanceInfo; - const multiDrawStarts = this._multiDrawStarts; - const multiDrawCounts = this._multiDrawCounts; - const geometryInfoList = this._geometryInfo; - const perObjectFrustumCulled = this.perObjectFrustumCulled; - const indirectTexture = this._indirectTexture; - const indirectArray = indirectTexture.image.data; - if (perObjectFrustumCulled) { - _matrix$1.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse).multiply(this.matrixWorld); - _frustum.setFromProjectionMatrix( - _matrix$1, - renderer.coordinateSystem - ); - } - let multiDrawCount = 0; - if (this.sortObjects) { - _matrix$1.copy(this.matrixWorld).invert(); - _vector$5.setFromMatrixPosition(camera.matrixWorld).applyMatrix4(_matrix$1); - _forward.set(0, 0, -1).transformDirection(camera.matrixWorld).transformDirection(_matrix$1); - for (let i = 0, l = instanceInfo.length; i < l; i++) { - if (instanceInfo[i].visible && instanceInfo[i].active) { - const geometryId = instanceInfo[i].geometryIndex; - this.getMatrixAt(i, _matrix$1); - this.getBoundingSphereAt(geometryId, _sphere$2).applyMatrix4(_matrix$1); - let culled = false; - if (perObjectFrustumCulled) { - culled = !_frustum.intersectsSphere(_sphere$2); - } - if (!culled) { - const geometryInfo = geometryInfoList[geometryId]; - const z = _temp.subVectors(_sphere$2.center, _vector$5).dot(_forward); - _renderList.push(geometryInfo.start, geometryInfo.count, z, i); - } - } - } - const list = _renderList.list; - const customSort = this.customSort; - if (customSort === null) { - list.sort(material.transparent ? sortTransparent : sortOpaque); - } else { - customSort.call(this, list, camera); - } - for (let i = 0, l = list.length; i < l; i++) { - const item = list[i]; - multiDrawStarts[multiDrawCount] = item.start * bytesPerElement; - multiDrawCounts[multiDrawCount] = item.count; - indirectArray[multiDrawCount] = item.index; - multiDrawCount++; - } - _renderList.reset(); - } else { - for (let i = 0, l = instanceInfo.length; i < l; i++) { - if (instanceInfo[i].visible && instanceInfo[i].active) { - const geometryId = instanceInfo[i].geometryIndex; - let culled = false; - if (perObjectFrustumCulled) { - this.getMatrixAt(i, _matrix$1); - this.getBoundingSphereAt(geometryId, _sphere$2).applyMatrix4(_matrix$1); - culled = !_frustum.intersectsSphere(_sphere$2); - } - if (!culled) { - const geometryInfo = geometryInfoList[geometryId]; - multiDrawStarts[multiDrawCount] = geometryInfo.start * bytesPerElement; - multiDrawCounts[multiDrawCount] = geometryInfo.count; - indirectArray[multiDrawCount] = i; - multiDrawCount++; - } - } - } +} +const emptyTexture = /* @__PURE__ */ new Texture(); +const emptyShadowTexture = /* @__PURE__ */ new DepthTexture(1, 1); +const emptyArrayTexture = /* @__PURE__ */ new DataArrayTexture(); +const empty3dTexture = /* @__PURE__ */ new Data3DTexture(); +const emptyCubeTexture = /* @__PURE__ */ new CubeTexture(); +const arrayCacheF32 = []; +const arrayCacheI32 = []; +const mat4array = new Float32Array(16); +const mat3array = new Float32Array(9); +const mat2array = new Float32Array(4); +function flatten(array, nBlocks, blockSize) { + const firstElem = array[0]; + if (firstElem <= 0 || firstElem > 0) return array; + const n = nBlocks * blockSize; + let r = arrayCacheF32[n]; + if (r === void 0) { + r = new Float32Array(n); + arrayCacheF32[n] = r; + } + if (nBlocks !== 0) { + firstElem.toArray(r, 0); + for (let i = 1, offset = 0; i !== nBlocks; ++i) { + offset += blockSize; + array[i].toArray(r, offset); } - indirectTexture.needsUpdate = true; - this._multiDrawCount = multiDrawCount; - this._visibilityChanged = false; } - onBeforeShadow(renderer, object, camera, shadowCamera, geometry, depthMaterial) { - this.onBeforeRender(renderer, null, shadowCamera, geometry, depthMaterial); + return r; +} +__name(flatten, "flatten"); +function arraysEqual(a, b) { + if (a.length !== b.length) return false; + for (let i = 0, l = a.length; i < l; i++) { + if (a[i] !== b[i]) return false; } + return true; } -class LineBasicMaterial extends Material { - static { - __name(this, "LineBasicMaterial"); +__name(arraysEqual, "arraysEqual"); +function copyArray(a, b) { + for (let i = 0, l = b.length; i < l; i++) { + a[i] = b[i]; } - static get type() { - return "LineBasicMaterial"; +} +__name(copyArray, "copyArray"); +function allocTexUnits(textures, n) { + let r = arrayCacheI32[n]; + if (r === void 0) { + r = new Int32Array(n); + arrayCacheI32[n] = r; } - constructor(parameters) { - super(); - this.isLineBasicMaterial = true; - this.color = new Color(16777215); - this.map = null; - this.linewidth = 1; - this.linecap = "round"; - this.linejoin = "round"; - this.fog = true; - this.setValues(parameters); + for (let i = 0; i !== n; ++i) { + r[i] = textures.allocateTextureUnit(); } - copy(source) { - super.copy(source); - this.color.copy(source.color); - this.map = source.map; - this.linewidth = source.linewidth; - this.linecap = source.linecap; - this.linejoin = source.linejoin; - this.fog = source.fog; - return this; + return r; +} +__name(allocTexUnits, "allocTexUnits"); +function setValueV1f(gl, v) { + const cache = this.cache; + if (cache[0] === v) return; + gl.uniform1f(this.addr, v); + cache[0] = v; +} +__name(setValueV1f, "setValueV1f"); +function setValueV2f(gl, v) { + const cache = this.cache; + if (v.x !== void 0) { + if (cache[0] !== v.x || cache[1] !== v.y) { + gl.uniform2f(this.addr, v.x, v.y); + cache[0] = v.x; + cache[1] = v.y; + } + } else { + if (arraysEqual(cache, v)) return; + gl.uniform2fv(this.addr, v); + copyArray(cache, v); } } -const _vStart = /* @__PURE__ */ new Vector3(); -const _vEnd = /* @__PURE__ */ new Vector3(); -const _inverseMatrix$1 = /* @__PURE__ */ new Matrix4(); -const _ray$1 = /* @__PURE__ */ new Ray(); -const _sphere$1 = /* @__PURE__ */ new Sphere(); -const _intersectPointOnRay = /* @__PURE__ */ new Vector3(); -const _intersectPointOnSegment = /* @__PURE__ */ new Vector3(); -class Line extends Object3D { - static { - __name(this, "Line"); +__name(setValueV2f, "setValueV2f"); +function setValueV3f(gl, v) { + const cache = this.cache; + if (v.x !== void 0) { + if (cache[0] !== v.x || cache[1] !== v.y || cache[2] !== v.z) { + gl.uniform3f(this.addr, v.x, v.y, v.z); + cache[0] = v.x; + cache[1] = v.y; + cache[2] = v.z; + } + } else if (v.r !== void 0) { + if (cache[0] !== v.r || cache[1] !== v.g || cache[2] !== v.b) { + gl.uniform3f(this.addr, v.r, v.g, v.b); + cache[0] = v.r; + cache[1] = v.g; + cache[2] = v.b; + } + } else { + if (arraysEqual(cache, v)) return; + gl.uniform3fv(this.addr, v); + copyArray(cache, v); } - constructor(geometry = new BufferGeometry(), material = new LineBasicMaterial()) { - super(); - this.isLine = true; - this.type = "Line"; - this.geometry = geometry; - this.material = material; - this.updateMorphTargets(); +} +__name(setValueV3f, "setValueV3f"); +function setValueV4f(gl, v) { + const cache = this.cache; + if (v.x !== void 0) { + if (cache[0] !== v.x || cache[1] !== v.y || cache[2] !== v.z || cache[3] !== v.w) { + gl.uniform4f(this.addr, v.x, v.y, v.z, v.w); + cache[0] = v.x; + cache[1] = v.y; + cache[2] = v.z; + cache[3] = v.w; + } + } else { + if (arraysEqual(cache, v)) return; + gl.uniform4fv(this.addr, v); + copyArray(cache, v); } - copy(source, recursive) { - super.copy(source, recursive); - this.material = Array.isArray(source.material) ? source.material.slice() : source.material; - this.geometry = source.geometry; - return this; +} +__name(setValueV4f, "setValueV4f"); +function setValueM2(gl, v) { + const cache = this.cache; + const elements = v.elements; + if (elements === void 0) { + if (arraysEqual(cache, v)) return; + gl.uniformMatrix2fv(this.addr, false, v); + copyArray(cache, v); + } else { + if (arraysEqual(cache, elements)) return; + mat2array.set(elements); + gl.uniformMatrix2fv(this.addr, false, mat2array); + copyArray(cache, elements); } - computeLineDistances() { - const geometry = this.geometry; - if (geometry.index === null) { - const positionAttribute = geometry.attributes.position; - const lineDistances = [0]; - for (let i = 1, l = positionAttribute.count; i < l; i++) { - _vStart.fromBufferAttribute(positionAttribute, i - 1); - _vEnd.fromBufferAttribute(positionAttribute, i); - lineDistances[i] = lineDistances[i - 1]; - lineDistances[i] += _vStart.distanceTo(_vEnd); - } - geometry.setAttribute("lineDistance", new Float32BufferAttribute(lineDistances, 1)); - } else { - console.warn("THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry."); +} +__name(setValueM2, "setValueM2"); +function setValueM3(gl, v) { + const cache = this.cache; + const elements = v.elements; + if (elements === void 0) { + if (arraysEqual(cache, v)) return; + gl.uniformMatrix3fv(this.addr, false, v); + copyArray(cache, v); + } else { + if (arraysEqual(cache, elements)) return; + mat3array.set(elements); + gl.uniformMatrix3fv(this.addr, false, mat3array); + copyArray(cache, elements); + } +} +__name(setValueM3, "setValueM3"); +function setValueM4(gl, v) { + const cache = this.cache; + const elements = v.elements; + if (elements === void 0) { + if (arraysEqual(cache, v)) return; + gl.uniformMatrix4fv(this.addr, false, v); + copyArray(cache, v); + } else { + if (arraysEqual(cache, elements)) return; + mat4array.set(elements); + gl.uniformMatrix4fv(this.addr, false, mat4array); + copyArray(cache, elements); + } +} +__name(setValueM4, "setValueM4"); +function setValueV1i(gl, v) { + const cache = this.cache; + if (cache[0] === v) return; + gl.uniform1i(this.addr, v); + cache[0] = v; +} +__name(setValueV1i, "setValueV1i"); +function setValueV2i(gl, v) { + const cache = this.cache; + if (v.x !== void 0) { + if (cache[0] !== v.x || cache[1] !== v.y) { + gl.uniform2i(this.addr, v.x, v.y); + cache[0] = v.x; + cache[1] = v.y; } - return this; + } else { + if (arraysEqual(cache, v)) return; + gl.uniform2iv(this.addr, v); + copyArray(cache, v); } - raycast(raycaster, intersects2) { - const geometry = this.geometry; - const matrixWorld = this.matrixWorld; - const threshold = raycaster.params.Line.threshold; - const drawRange = geometry.drawRange; - if (geometry.boundingSphere === null) geometry.computeBoundingSphere(); - _sphere$1.copy(geometry.boundingSphere); - _sphere$1.applyMatrix4(matrixWorld); - _sphere$1.radius += threshold; - if (raycaster.ray.intersectsSphere(_sphere$1) === false) return; - _inverseMatrix$1.copy(matrixWorld).invert(); - _ray$1.copy(raycaster.ray).applyMatrix4(_inverseMatrix$1); - const localThreshold = threshold / ((this.scale.x + this.scale.y + this.scale.z) / 3); - const localThresholdSq = localThreshold * localThreshold; - const step = this.isLineSegments ? 2 : 1; - const index = geometry.index; - const attributes = geometry.attributes; - const positionAttribute = attributes.position; - if (index !== null) { - const start = Math.max(0, drawRange.start); - const end = Math.min(index.count, drawRange.start + drawRange.count); - for (let i = start, l = end - 1; i < l; i += step) { - const a = index.getX(i); - const b = index.getX(i + 1); - const intersect2 = checkIntersection(this, raycaster, _ray$1, localThresholdSq, a, b); - if (intersect2) { - intersects2.push(intersect2); - } - } - if (this.isLineLoop) { - const a = index.getX(end - 1); - const b = index.getX(start); - const intersect2 = checkIntersection(this, raycaster, _ray$1, localThresholdSq, a, b); - if (intersect2) { - intersects2.push(intersect2); - } - } - } else { - const start = Math.max(0, drawRange.start); - const end = Math.min(positionAttribute.count, drawRange.start + drawRange.count); - for (let i = start, l = end - 1; i < l; i += step) { - const intersect2 = checkIntersection(this, raycaster, _ray$1, localThresholdSq, i, i + 1); - if (intersect2) { - intersects2.push(intersect2); - } - } - if (this.isLineLoop) { - const intersect2 = checkIntersection(this, raycaster, _ray$1, localThresholdSq, end - 1, start); - if (intersect2) { - intersects2.push(intersect2); - } - } +} +__name(setValueV2i, "setValueV2i"); +function setValueV3i(gl, v) { + const cache = this.cache; + if (v.x !== void 0) { + if (cache[0] !== v.x || cache[1] !== v.y || cache[2] !== v.z) { + gl.uniform3i(this.addr, v.x, v.y, v.z); + cache[0] = v.x; + cache[1] = v.y; + cache[2] = v.z; } + } else { + if (arraysEqual(cache, v)) return; + gl.uniform3iv(this.addr, v); + copyArray(cache, v); } - updateMorphTargets() { - const geometry = this.geometry; - const morphAttributes = geometry.morphAttributes; - const keys = Object.keys(morphAttributes); - if (keys.length > 0) { - const morphAttribute = morphAttributes[keys[0]]; - if (morphAttribute !== void 0) { - this.morphTargetInfluences = []; - this.morphTargetDictionary = {}; - for (let m = 0, ml = morphAttribute.length; m < ml; m++) { - const name = morphAttribute[m].name || String(m); - this.morphTargetInfluences.push(0); - this.morphTargetDictionary[name] = m; - } - } +} +__name(setValueV3i, "setValueV3i"); +function setValueV4i(gl, v) { + const cache = this.cache; + if (v.x !== void 0) { + if (cache[0] !== v.x || cache[1] !== v.y || cache[2] !== v.z || cache[3] !== v.w) { + gl.uniform4i(this.addr, v.x, v.y, v.z, v.w); + cache[0] = v.x; + cache[1] = v.y; + cache[2] = v.z; + cache[3] = v.w; } + } else { + if (arraysEqual(cache, v)) return; + gl.uniform4iv(this.addr, v); + copyArray(cache, v); } } -function checkIntersection(object, raycaster, ray, thresholdSq, a, b) { - const positionAttribute = object.geometry.attributes.position; - _vStart.fromBufferAttribute(positionAttribute, a); - _vEnd.fromBufferAttribute(positionAttribute, b); - const distSq = ray.distanceSqToSegment(_vStart, _vEnd, _intersectPointOnRay, _intersectPointOnSegment); - if (distSq > thresholdSq) return; - _intersectPointOnRay.applyMatrix4(object.matrixWorld); - const distance = raycaster.ray.origin.distanceTo(_intersectPointOnRay); - if (distance < raycaster.near || distance > raycaster.far) return; - return { - distance, - // What do we want? intersection point on the ray or on the segment?? - // point: raycaster.ray.at( distance ), - point: _intersectPointOnSegment.clone().applyMatrix4(object.matrixWorld), - index: a, - face: null, - faceIndex: null, - barycoord: null, - object - }; +__name(setValueV4i, "setValueV4i"); +function setValueV1ui(gl, v) { + const cache = this.cache; + if (cache[0] === v) return; + gl.uniform1ui(this.addr, v); + cache[0] = v; } -__name(checkIntersection, "checkIntersection"); -const _start = /* @__PURE__ */ new Vector3(); -const _end = /* @__PURE__ */ new Vector3(); -class LineSegments extends Line { - static { - __name(this, "LineSegments"); +__name(setValueV1ui, "setValueV1ui"); +function setValueV2ui(gl, v) { + const cache = this.cache; + if (v.x !== void 0) { + if (cache[0] !== v.x || cache[1] !== v.y) { + gl.uniform2ui(this.addr, v.x, v.y); + cache[0] = v.x; + cache[1] = v.y; + } + } else { + if (arraysEqual(cache, v)) return; + gl.uniform2uiv(this.addr, v); + copyArray(cache, v); } - constructor(geometry, material) { - super(geometry, material); - this.isLineSegments = true; - this.type = "LineSegments"; +} +__name(setValueV2ui, "setValueV2ui"); +function setValueV3ui(gl, v) { + const cache = this.cache; + if (v.x !== void 0) { + if (cache[0] !== v.x || cache[1] !== v.y || cache[2] !== v.z) { + gl.uniform3ui(this.addr, v.x, v.y, v.z); + cache[0] = v.x; + cache[1] = v.y; + cache[2] = v.z; + } + } else { + if (arraysEqual(cache, v)) return; + gl.uniform3uiv(this.addr, v); + copyArray(cache, v); } - computeLineDistances() { - const geometry = this.geometry; - if (geometry.index === null) { - const positionAttribute = geometry.attributes.position; - const lineDistances = []; - for (let i = 0, l = positionAttribute.count; i < l; i += 2) { - _start.fromBufferAttribute(positionAttribute, i); - _end.fromBufferAttribute(positionAttribute, i + 1); - lineDistances[i] = i === 0 ? 0 : lineDistances[i - 1]; - lineDistances[i + 1] = lineDistances[i] + _start.distanceTo(_end); - } - geometry.setAttribute("lineDistance", new Float32BufferAttribute(lineDistances, 1)); - } else { - console.warn("THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry."); +} +__name(setValueV3ui, "setValueV3ui"); +function setValueV4ui(gl, v) { + const cache = this.cache; + if (v.x !== void 0) { + if (cache[0] !== v.x || cache[1] !== v.y || cache[2] !== v.z || cache[3] !== v.w) { + gl.uniform4ui(this.addr, v.x, v.y, v.z, v.w); + cache[0] = v.x; + cache[1] = v.y; + cache[2] = v.z; + cache[3] = v.w; } - return this; + } else { + if (arraysEqual(cache, v)) return; + gl.uniform4uiv(this.addr, v); + copyArray(cache, v); } } -class LineLoop extends Line { - static { - __name(this, "LineLoop"); +__name(setValueV4ui, "setValueV4ui"); +function setValueT1(gl, v, textures) { + const cache = this.cache; + const unit = textures.allocateTextureUnit(); + if (cache[0] !== unit) { + gl.uniform1i(this.addr, unit); + cache[0] = unit; } - constructor(geometry, material) { - super(geometry, material); - this.isLineLoop = true; - this.type = "LineLoop"; + let emptyTexture2D; + if (this.type === gl.SAMPLER_2D_SHADOW) { + emptyShadowTexture.compareFunction = LessEqualCompare; + emptyTexture2D = emptyShadowTexture; + } else { + emptyTexture2D = emptyTexture; } + textures.setTexture2D(v || emptyTexture2D, unit); } -class PointsMaterial extends Material { - static { - __name(this, "PointsMaterial"); - } - static get type() { - return "PointsMaterial"; +__name(setValueT1, "setValueT1"); +function setValueT3D1(gl, v, textures) { + const cache = this.cache; + const unit = textures.allocateTextureUnit(); + if (cache[0] !== unit) { + gl.uniform1i(this.addr, unit); + cache[0] = unit; } - constructor(parameters) { - super(); - this.isPointsMaterial = true; - this.color = new Color(16777215); - this.map = null; - this.alphaMap = null; - this.size = 1; - this.sizeAttenuation = true; - this.fog = true; - this.setValues(parameters); + textures.setTexture3D(v || empty3dTexture, unit); +} +__name(setValueT3D1, "setValueT3D1"); +function setValueT6(gl, v, textures) { + const cache = this.cache; + const unit = textures.allocateTextureUnit(); + if (cache[0] !== unit) { + gl.uniform1i(this.addr, unit); + cache[0] = unit; } - copy(source) { - super.copy(source); - this.color.copy(source.color); - this.map = source.map; - this.alphaMap = source.alphaMap; - this.size = source.size; - this.sizeAttenuation = source.sizeAttenuation; - this.fog = source.fog; - return this; + textures.setTextureCube(v || emptyCubeTexture, unit); +} +__name(setValueT6, "setValueT6"); +function setValueT2DArray1(gl, v, textures) { + const cache = this.cache; + const unit = textures.allocateTextureUnit(); + if (cache[0] !== unit) { + gl.uniform1i(this.addr, unit); + cache[0] = unit; } + textures.setTexture2DArray(v || emptyArrayTexture, unit); } -const _inverseMatrix = /* @__PURE__ */ new Matrix4(); -const _ray$4 = /* @__PURE__ */ new Ray(); -const _sphere = /* @__PURE__ */ new Sphere(); -const _position$2 = /* @__PURE__ */ new Vector3(); -class Points extends Object3D { - static { - __name(this, "Points"); +__name(setValueT2DArray1, "setValueT2DArray1"); +function getSingularSetter(type) { + switch (type) { + case 5126: + return setValueV1f; + case 35664: + return setValueV2f; + case 35665: + return setValueV3f; + case 35666: + return setValueV4f; + case 35674: + return setValueM2; + case 35675: + return setValueM3; + case 35676: + return setValueM4; + case 5124: + case 35670: + return setValueV1i; + case 35667: + case 35671: + return setValueV2i; + case 35668: + case 35672: + return setValueV3i; + case 35669: + case 35673: + return setValueV4i; + case 5125: + return setValueV1ui; + case 36294: + return setValueV2ui; + case 36295: + return setValueV3ui; + case 36296: + return setValueV4ui; + case 35678: + case 36198: + case 36298: + case 36306: + case 35682: + return setValueT1; + case 35679: + case 36299: + case 36307: + return setValueT3D1; + case 35680: + case 36300: + case 36308: + case 36293: + return setValueT6; + case 36289: + case 36303: + case 36311: + case 36292: + return setValueT2DArray1; } - constructor(geometry = new BufferGeometry(), material = new PointsMaterial()) { - super(); - this.isPoints = true; - this.type = "Points"; - this.geometry = geometry; - this.material = material; - this.updateMorphTargets(); +} +__name(getSingularSetter, "getSingularSetter"); +function setValueV1fArray(gl, v) { + gl.uniform1fv(this.addr, v); +} +__name(setValueV1fArray, "setValueV1fArray"); +function setValueV2fArray(gl, v) { + const data = flatten(v, this.size, 2); + gl.uniform2fv(this.addr, data); +} +__name(setValueV2fArray, "setValueV2fArray"); +function setValueV3fArray(gl, v) { + const data = flatten(v, this.size, 3); + gl.uniform3fv(this.addr, data); +} +__name(setValueV3fArray, "setValueV3fArray"); +function setValueV4fArray(gl, v) { + const data = flatten(v, this.size, 4); + gl.uniform4fv(this.addr, data); +} +__name(setValueV4fArray, "setValueV4fArray"); +function setValueM2Array(gl, v) { + const data = flatten(v, this.size, 4); + gl.uniformMatrix2fv(this.addr, false, data); +} +__name(setValueM2Array, "setValueM2Array"); +function setValueM3Array(gl, v) { + const data = flatten(v, this.size, 9); + gl.uniformMatrix3fv(this.addr, false, data); +} +__name(setValueM3Array, "setValueM3Array"); +function setValueM4Array(gl, v) { + const data = flatten(v, this.size, 16); + gl.uniformMatrix4fv(this.addr, false, data); +} +__name(setValueM4Array, "setValueM4Array"); +function setValueV1iArray(gl, v) { + gl.uniform1iv(this.addr, v); +} +__name(setValueV1iArray, "setValueV1iArray"); +function setValueV2iArray(gl, v) { + gl.uniform2iv(this.addr, v); +} +__name(setValueV2iArray, "setValueV2iArray"); +function setValueV3iArray(gl, v) { + gl.uniform3iv(this.addr, v); +} +__name(setValueV3iArray, "setValueV3iArray"); +function setValueV4iArray(gl, v) { + gl.uniform4iv(this.addr, v); +} +__name(setValueV4iArray, "setValueV4iArray"); +function setValueV1uiArray(gl, v) { + gl.uniform1uiv(this.addr, v); +} +__name(setValueV1uiArray, "setValueV1uiArray"); +function setValueV2uiArray(gl, v) { + gl.uniform2uiv(this.addr, v); +} +__name(setValueV2uiArray, "setValueV2uiArray"); +function setValueV3uiArray(gl, v) { + gl.uniform3uiv(this.addr, v); +} +__name(setValueV3uiArray, "setValueV3uiArray"); +function setValueV4uiArray(gl, v) { + gl.uniform4uiv(this.addr, v); +} +__name(setValueV4uiArray, "setValueV4uiArray"); +function setValueT1Array(gl, v, textures) { + const cache = this.cache; + const n = v.length; + const units = allocTexUnits(textures, n); + if (!arraysEqual(cache, units)) { + gl.uniform1iv(this.addr, units); + copyArray(cache, units); } - copy(source, recursive) { - super.copy(source, recursive); - this.material = Array.isArray(source.material) ? source.material.slice() : source.material; - this.geometry = source.geometry; - return this; + for (let i = 0; i !== n; ++i) { + textures.setTexture2D(v[i] || emptyTexture, units[i]); } - raycast(raycaster, intersects2) { - const geometry = this.geometry; - const matrixWorld = this.matrixWorld; - const threshold = raycaster.params.Points.threshold; - const drawRange = geometry.drawRange; - if (geometry.boundingSphere === null) geometry.computeBoundingSphere(); - _sphere.copy(geometry.boundingSphere); - _sphere.applyMatrix4(matrixWorld); - _sphere.radius += threshold; - if (raycaster.ray.intersectsSphere(_sphere) === false) return; - _inverseMatrix.copy(matrixWorld).invert(); - _ray$4.copy(raycaster.ray).applyMatrix4(_inverseMatrix); - const localThreshold = threshold / ((this.scale.x + this.scale.y + this.scale.z) / 3); - const localThresholdSq = localThreshold * localThreshold; - const index = geometry.index; - const attributes = geometry.attributes; - const positionAttribute = attributes.position; - if (index !== null) { - const start = Math.max(0, drawRange.start); - const end = Math.min(index.count, drawRange.start + drawRange.count); - for (let i = start, il = end; i < il; i++) { - const a = index.getX(i); - _position$2.fromBufferAttribute(positionAttribute, a); - testPoint(_position$2, a, localThresholdSq, matrixWorld, raycaster, intersects2, this); - } - } else { - const start = Math.max(0, drawRange.start); - const end = Math.min(positionAttribute.count, drawRange.start + drawRange.count); - for (let i = start, l = end; i < l; i++) { - _position$2.fromBufferAttribute(positionAttribute, i); - testPoint(_position$2, i, localThresholdSq, matrixWorld, raycaster, intersects2, this); - } - } +} +__name(setValueT1Array, "setValueT1Array"); +function setValueT3DArray(gl, v, textures) { + const cache = this.cache; + const n = v.length; + const units = allocTexUnits(textures, n); + if (!arraysEqual(cache, units)) { + gl.uniform1iv(this.addr, units); + copyArray(cache, units); } - updateMorphTargets() { - const geometry = this.geometry; - const morphAttributes = geometry.morphAttributes; - const keys = Object.keys(morphAttributes); - if (keys.length > 0) { - const morphAttribute = morphAttributes[keys[0]]; - if (morphAttribute !== void 0) { - this.morphTargetInfluences = []; - this.morphTargetDictionary = {}; - for (let m = 0, ml = morphAttribute.length; m < ml; m++) { - const name = morphAttribute[m].name || String(m); - this.morphTargetInfluences.push(0); - this.morphTargetDictionary[name] = m; - } - } - } + for (let i = 0; i !== n; ++i) { + textures.setTexture3D(v[i] || empty3dTexture, units[i]); } } -function testPoint(point, index, localThresholdSq, matrixWorld, raycaster, intersects2, object) { - const rayPointDistanceSq = _ray$4.distanceSqToPoint(point); - if (rayPointDistanceSq < localThresholdSq) { - const intersectPoint = new Vector3(); - _ray$4.closestPointToPoint(point, intersectPoint); - intersectPoint.applyMatrix4(matrixWorld); - const distance = raycaster.ray.origin.distanceTo(intersectPoint); - if (distance < raycaster.near || distance > raycaster.far) return; - intersects2.push({ - distance, - distanceToRay: Math.sqrt(rayPointDistanceSq), - point: intersectPoint, - index, - face: null, - faceIndex: null, - barycoord: null, - object - }); +__name(setValueT3DArray, "setValueT3DArray"); +function setValueT6Array(gl, v, textures) { + const cache = this.cache; + const n = v.length; + const units = allocTexUnits(textures, n); + if (!arraysEqual(cache, units)) { + gl.uniform1iv(this.addr, units); + copyArray(cache, units); } -} -__name(testPoint, "testPoint"); -class VideoTexture extends Texture { - static { - __name(this, "VideoTexture"); + for (let i = 0; i !== n; ++i) { + textures.setTextureCube(v[i] || emptyCubeTexture, units[i]); } - constructor(video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy) { - super(video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy); - this.isVideoTexture = true; - this.minFilter = minFilter !== void 0 ? minFilter : LinearFilter; - this.magFilter = magFilter !== void 0 ? magFilter : LinearFilter; - this.generateMipmaps = false; - const scope = this; - function updateVideo() { - scope.needsUpdate = true; - video.requestVideoFrameCallback(updateVideo); - } - __name(updateVideo, "updateVideo"); - if ("requestVideoFrameCallback" in video) { - video.requestVideoFrameCallback(updateVideo); - } +} +__name(setValueT6Array, "setValueT6Array"); +function setValueT2DArrayArray(gl, v, textures) { + const cache = this.cache; + const n = v.length; + const units = allocTexUnits(textures, n); + if (!arraysEqual(cache, units)) { + gl.uniform1iv(this.addr, units); + copyArray(cache, units); } - clone() { - return new this.constructor(this.image).copy(this); + for (let i = 0; i !== n; ++i) { + textures.setTexture2DArray(v[i] || emptyArrayTexture, units[i]); } - update() { - const video = this.image; - const hasVideoFrameCallback = "requestVideoFrameCallback" in video; - if (hasVideoFrameCallback === false && video.readyState >= video.HAVE_CURRENT_DATA) { - this.needsUpdate = true; - } +} +__name(setValueT2DArrayArray, "setValueT2DArrayArray"); +function getPureArraySetter(type) { + switch (type) { + case 5126: + return setValueV1fArray; + case 35664: + return setValueV2fArray; + case 35665: + return setValueV3fArray; + case 35666: + return setValueV4fArray; + case 35674: + return setValueM2Array; + case 35675: + return setValueM3Array; + case 35676: + return setValueM4Array; + case 5124: + case 35670: + return setValueV1iArray; + case 35667: + case 35671: + return setValueV2iArray; + case 35668: + case 35672: + return setValueV3iArray; + case 35669: + case 35673: + return setValueV4iArray; + case 5125: + return setValueV1uiArray; + case 36294: + return setValueV2uiArray; + case 36295: + return setValueV3uiArray; + case 36296: + return setValueV4uiArray; + case 35678: + case 36198: + case 36298: + case 36306: + case 35682: + return setValueT1Array; + case 35679: + case 36299: + case 36307: + return setValueT3DArray; + case 35680: + case 36300: + case 36308: + case 36293: + return setValueT6Array; + case 36289: + case 36303: + case 36311: + case 36292: + return setValueT2DArrayArray; } } -class FramebufferTexture extends Texture { +__name(getPureArraySetter, "getPureArraySetter"); +class SingleUniform { static { - __name(this, "FramebufferTexture"); + __name(this, "SingleUniform"); } - constructor(width, height) { - super({ width, height }); - this.isFramebufferTexture = true; - this.magFilter = NearestFilter; - this.minFilter = NearestFilter; - this.generateMipmaps = false; - this.needsUpdate = true; + constructor(id2, activeInfo, addr) { + this.id = id2; + this.addr = addr; + this.cache = []; + this.type = activeInfo.type; + this.setValue = getSingularSetter(activeInfo.type); } } -class CompressedTexture extends Texture { +class PureArrayUniform { static { - __name(this, "CompressedTexture"); + __name(this, "PureArrayUniform"); } - constructor(mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, colorSpace) { - super(null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace); - this.isCompressedTexture = true; - this.image = { width, height }; - this.mipmaps = mipmaps; - this.flipY = false; - this.generateMipmaps = false; + constructor(id2, activeInfo, addr) { + this.id = id2; + this.addr = addr; + this.cache = []; + this.type = activeInfo.type; + this.size = activeInfo.size; + this.setValue = getPureArraySetter(activeInfo.type); } } -class CompressedArrayTexture extends CompressedTexture { +class StructuredUniform { static { - __name(this, "CompressedArrayTexture"); + __name(this, "StructuredUniform"); } - constructor(mipmaps, width, height, depth, format, type) { - super(mipmaps, width, height, format, type); - this.isCompressedArrayTexture = true; - this.image.depth = depth; - this.wrapR = ClampToEdgeWrapping; - this.layerUpdates = /* @__PURE__ */ new Set(); + constructor(id2) { + this.id = id2; + this.seq = []; + this.map = {}; } - addLayerUpdate(layerIndex) { - this.layerUpdates.add(layerIndex); + setValue(gl, value, textures) { + const seq = this.seq; + for (let i = 0, n = seq.length; i !== n; ++i) { + const u = seq[i]; + u.setValue(gl, value[u.id], textures); + } } - clearLayerUpdates() { - this.layerUpdates.clear(); +} +const RePathPart = /(\w+)(\])?(\[|\.)?/g; +function addUniform(container, uniformObject) { + container.seq.push(uniformObject); + container.map[uniformObject.id] = uniformObject; +} +__name(addUniform, "addUniform"); +function parseUniform(activeInfo, addr, container) { + const path = activeInfo.name, pathLength = path.length; + RePathPart.lastIndex = 0; + while (true) { + const match = RePathPart.exec(path), matchEnd = RePathPart.lastIndex; + let id2 = match[1]; + const idIsIndex = match[2] === "]", subscript = match[3]; + if (idIsIndex) id2 = id2 | 0; + if (subscript === void 0 || subscript === "[" && matchEnd + 2 === pathLength) { + addUniform(container, subscript === void 0 ? new SingleUniform(id2, activeInfo, addr) : new PureArrayUniform(id2, activeInfo, addr)); + break; + } else { + const map = container.map; + let next = map[id2]; + if (next === void 0) { + next = new StructuredUniform(id2); + addUniform(container, next); + } + container = next; + } } } -class CompressedCubeTexture extends CompressedTexture { +__name(parseUniform, "parseUniform"); +class WebGLUniforms { static { - __name(this, "CompressedCubeTexture"); + __name(this, "WebGLUniforms"); } - constructor(images, format, type) { - super(void 0, images[0].width, images[0].height, format, type, CubeReflectionMapping); - this.isCompressedCubeTexture = true; - this.isCubeTexture = true; - this.image = images; + constructor(gl, program) { + this.seq = []; + this.map = {}; + const n = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS); + for (let i = 0; i < n; ++i) { + const info = gl.getActiveUniform(program, i), addr = gl.getUniformLocation(program, info.name); + parseUniform(info, addr, this); + } + } + setValue(gl, name, value, textures) { + const u = this.map[name]; + if (u !== void 0) u.setValue(gl, value, textures); + } + setOptional(gl, object, name) { + const v = object[name]; + if (v !== void 0) this.setValue(gl, name, v); + } + static upload(gl, seq, values, textures) { + for (let i = 0, n = seq.length; i !== n; ++i) { + const u = seq[i], v = values[u.id]; + if (v.needsUpdate !== false) { + u.setValue(gl, v.value, textures); + } + } + } + static seqWithValue(seq, values) { + const r = []; + for (let i = 0, n = seq.length; i !== n; ++i) { + const u = seq[i]; + if (u.id in values) r.push(u); + } + return r; } } -class CanvasTexture extends Texture { - static { - __name(this, "CanvasTexture"); +function WebGLShader(gl, type, string) { + const shader = gl.createShader(type); + gl.shaderSource(shader, string); + gl.compileShader(shader); + return shader; +} +__name(WebGLShader, "WebGLShader"); +const COMPLETION_STATUS_KHR = 37297; +let programIdCount = 0; +function handleSource(string, errorLine) { + const lines = string.split("\n"); + const lines2 = []; + const from = Math.max(errorLine - 6, 0); + const to = Math.min(errorLine + 6, lines.length); + for (let i = from; i < to; i++) { + const line = i + 1; + lines2.push(`${line === errorLine ? ">" : " "} ${line}: ${lines[i]}`); } - constructor(canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy) { - super(canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy); - this.isCanvasTexture = true; - this.needsUpdate = true; + return lines2.join("\n"); +} +__name(handleSource, "handleSource"); +const _m0 = /* @__PURE__ */ new Matrix3(); +function getEncodingComponents(colorSpace) { + ColorManagement._getMatrix(_m0, ColorManagement.workingColorSpace, colorSpace); + const encodingMatrix = `mat3( ${_m0.elements.map((v) => v.toFixed(4))} )`; + switch (ColorManagement.getTransfer(colorSpace)) { + case LinearTransfer: + return [encodingMatrix, "LinearTransferOETF"]; + case SRGBTransfer: + return [encodingMatrix, "sRGBTransferOETF"]; + default: + console.warn("THREE.WebGLProgram: Unsupported color space: ", colorSpace); + return [encodingMatrix, "LinearTransferOETF"]; } } -class Curve { - static { - __name(this, "Curve"); +__name(getEncodingComponents, "getEncodingComponents"); +function getShaderErrors(gl, shader, type) { + const status = gl.getShaderParameter(shader, gl.COMPILE_STATUS); + const errors = gl.getShaderInfoLog(shader).trim(); + if (status && errors === "") return ""; + const errorMatches = /ERROR: 0:(\d+)/.exec(errors); + if (errorMatches) { + const errorLine = parseInt(errorMatches[1]); + return type.toUpperCase() + "\n\n" + errors + "\n\n" + handleSource(gl.getShaderSource(shader), errorLine); + } else { + return errors; } - constructor() { - this.type = "Curve"; - this.arcLengthDivisions = 200; +} +__name(getShaderErrors, "getShaderErrors"); +function getTexelEncodingFunction(functionName, colorSpace) { + const components = getEncodingComponents(colorSpace); + return [ + `vec4 ${functionName}( vec4 value ) {`, + ` return ${components[1]}( vec4( value.rgb * ${components[0]}, value.a ) );`, + "}" + ].join("\n"); +} +__name(getTexelEncodingFunction, "getTexelEncodingFunction"); +function getToneMappingFunction(functionName, toneMapping) { + let toneMappingName; + switch (toneMapping) { + case LinearToneMapping: + toneMappingName = "Linear"; + break; + case ReinhardToneMapping: + toneMappingName = "Reinhard"; + break; + case CineonToneMapping: + toneMappingName = "Cineon"; + break; + case ACESFilmicToneMapping: + toneMappingName = "ACESFilmic"; + break; + case AgXToneMapping: + toneMappingName = "AgX"; + break; + case NeutralToneMapping: + toneMappingName = "Neutral"; + break; + case CustomToneMapping: + toneMappingName = "Custom"; + break; + default: + console.warn("THREE.WebGLProgram: Unsupported toneMapping:", toneMapping); + toneMappingName = "Linear"; } - // Virtual base class method to overwrite and implement in subclasses - // - t [0 .. 1] - getPoint() { - console.warn("THREE.Curve: .getPoint() not implemented."); - return null; + return "vec3 " + functionName + "( vec3 color ) { return " + toneMappingName + "ToneMapping( color ); }"; +} +__name(getToneMappingFunction, "getToneMappingFunction"); +const _v0$1 = /* @__PURE__ */ new Vector3(); +function getLuminanceFunction() { + ColorManagement.getLuminanceCoefficients(_v0$1); + const r = _v0$1.x.toFixed(4); + const g = _v0$1.y.toFixed(4); + const b = _v0$1.z.toFixed(4); + return [ + "float luminance( const in vec3 rgb ) {", + ` const vec3 weights = vec3( ${r}, ${g}, ${b} );`, + " return dot( weights, rgb );", + "}" + ].join("\n"); +} +__name(getLuminanceFunction, "getLuminanceFunction"); +function generateVertexExtensions(parameters) { + const chunks = [ + parameters.extensionClipCullDistance ? "#extension GL_ANGLE_clip_cull_distance : require" : "", + parameters.extensionMultiDraw ? "#extension GL_ANGLE_multi_draw : require" : "" + ]; + return chunks.filter(filterEmptyLine).join("\n"); +} +__name(generateVertexExtensions, "generateVertexExtensions"); +function generateDefines(defines) { + const chunks = []; + for (const name in defines) { + const value = defines[name]; + if (value === false) continue; + chunks.push("#define " + name + " " + value); } - // Get point at relative position in curve according to arc length - // - u [0 .. 1] - getPointAt(u, optionalTarget) { - const t2 = this.getUtoTmapping(u); - return this.getPoint(t2, optionalTarget); + return chunks.join("\n"); +} +__name(generateDefines, "generateDefines"); +function fetchAttributeLocations(gl, program) { + const attributes = {}; + const n = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES); + for (let i = 0; i < n; i++) { + const info = gl.getActiveAttrib(program, i); + const name = info.name; + let locationSize = 1; + if (info.type === gl.FLOAT_MAT2) locationSize = 2; + if (info.type === gl.FLOAT_MAT3) locationSize = 3; + if (info.type === gl.FLOAT_MAT4) locationSize = 4; + attributes[name] = { + type: info.type, + location: gl.getAttribLocation(program, name), + locationSize + }; } - // Get sequence of points using getPoint( t ) - getPoints(divisions = 5) { - const points = []; - for (let d = 0; d <= divisions; d++) { - points.push(this.getPoint(d / divisions)); + return attributes; +} +__name(fetchAttributeLocations, "fetchAttributeLocations"); +function filterEmptyLine(string) { + return string !== ""; +} +__name(filterEmptyLine, "filterEmptyLine"); +function replaceLightNums(string, parameters) { + const numSpotLightCoords = parameters.numSpotLightShadows + parameters.numSpotLightMaps - parameters.numSpotLightShadowsWithMaps; + return string.replace(/NUM_DIR_LIGHTS/g, parameters.numDirLights).replace(/NUM_SPOT_LIGHTS/g, parameters.numSpotLights).replace(/NUM_SPOT_LIGHT_MAPS/g, parameters.numSpotLightMaps).replace(/NUM_SPOT_LIGHT_COORDS/g, numSpotLightCoords).replace(/NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g, parameters.numPointLights).replace(/NUM_HEMI_LIGHTS/g, parameters.numHemiLights).replace(/NUM_DIR_LIGHT_SHADOWS/g, parameters.numDirLightShadows).replace(/NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g, parameters.numSpotLightShadowsWithMaps).replace(/NUM_SPOT_LIGHT_SHADOWS/g, parameters.numSpotLightShadows).replace(/NUM_POINT_LIGHT_SHADOWS/g, parameters.numPointLightShadows); +} +__name(replaceLightNums, "replaceLightNums"); +function replaceClippingPlaneNums(string, parameters) { + return string.replace(/NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g, parameters.numClippingPlanes - parameters.numClipIntersection); +} +__name(replaceClippingPlaneNums, "replaceClippingPlaneNums"); +const includePattern = /^[ \t]*#include +<([\w\d./]+)>/gm; +function resolveIncludes(string) { + return string.replace(includePattern, includeReplacer); +} +__name(resolveIncludes, "resolveIncludes"); +const shaderChunkMap = /* @__PURE__ */ new Map(); +function includeReplacer(match, include) { + let string = ShaderChunk[include]; + if (string === void 0) { + const newInclude = shaderChunkMap.get(include); + if (newInclude !== void 0) { + string = ShaderChunk[newInclude]; + console.warn('THREE.WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.', include, newInclude); + } else { + throw new Error("Can not resolve #include <" + include + ">"); } - return points; } - // Get sequence of points using getPointAt( u ) - getSpacedPoints(divisions = 5) { - const points = []; - for (let d = 0; d <= divisions; d++) { - points.push(this.getPointAt(d / divisions)); - } - return points; + return resolveIncludes(string); +} +__name(includeReplacer, "includeReplacer"); +const 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; +function unrollLoops(string) { + return string.replace(unrollLoopPattern, loopReplacer); +} +__name(unrollLoops, "unrollLoops"); +function loopReplacer(match, start, end, snippet) { + let string = ""; + for (let i = parseInt(start); i < parseInt(end); i++) { + string += snippet.replace(/\[\s*i\s*\]/g, "[ " + i + " ]").replace(/UNROLLED_LOOP_INDEX/g, i); } - // Get total curve arc length - getLength() { - const lengths = this.getLengths(); - return lengths[lengths.length - 1]; + return string; +} +__name(loopReplacer, "loopReplacer"); +function generatePrecision(parameters) { + let precisionstring = `precision ${parameters.precision} float; + precision ${parameters.precision} int; + precision ${parameters.precision} sampler2D; + precision ${parameters.precision} samplerCube; + precision ${parameters.precision} sampler3D; + precision ${parameters.precision} sampler2DArray; + precision ${parameters.precision} sampler2DShadow; + precision ${parameters.precision} samplerCubeShadow; + precision ${parameters.precision} sampler2DArrayShadow; + precision ${parameters.precision} isampler2D; + precision ${parameters.precision} isampler3D; + precision ${parameters.precision} isamplerCube; + precision ${parameters.precision} isampler2DArray; + precision ${parameters.precision} usampler2D; + precision ${parameters.precision} usampler3D; + precision ${parameters.precision} usamplerCube; + precision ${parameters.precision} usampler2DArray; + `; + if (parameters.precision === "highp") { + precisionstring += "\n#define HIGH_PRECISION"; + } else if (parameters.precision === "mediump") { + precisionstring += "\n#define MEDIUM_PRECISION"; + } else if (parameters.precision === "lowp") { + precisionstring += "\n#define LOW_PRECISION"; } - // Get list of cumulative segment lengths - getLengths(divisions = this.arcLengthDivisions) { - if (this.cacheArcLengths && this.cacheArcLengths.length === divisions + 1 && !this.needsUpdate) { - return this.cacheArcLengths; - } - this.needsUpdate = false; - const cache = []; - let current, last = this.getPoint(0); - let sum = 0; - cache.push(0); - for (let p = 1; p <= divisions; p++) { - current = this.getPoint(p / divisions); - sum += current.distanceTo(last); - cache.push(sum); - last = current; + return precisionstring; +} +__name(generatePrecision, "generatePrecision"); +function generateShadowMapTypeDefine(parameters) { + let shadowMapTypeDefine = "SHADOWMAP_TYPE_BASIC"; + if (parameters.shadowMapType === PCFShadowMap) { + shadowMapTypeDefine = "SHADOWMAP_TYPE_PCF"; + } else if (parameters.shadowMapType === PCFSoftShadowMap) { + shadowMapTypeDefine = "SHADOWMAP_TYPE_PCF_SOFT"; + } else if (parameters.shadowMapType === VSMShadowMap) { + shadowMapTypeDefine = "SHADOWMAP_TYPE_VSM"; + } + return shadowMapTypeDefine; +} +__name(generateShadowMapTypeDefine, "generateShadowMapTypeDefine"); +function generateEnvMapTypeDefine(parameters) { + let envMapTypeDefine = "ENVMAP_TYPE_CUBE"; + if (parameters.envMap) { + switch (parameters.envMapMode) { + case CubeReflectionMapping: + case CubeRefractionMapping: + envMapTypeDefine = "ENVMAP_TYPE_CUBE"; + break; + case CubeUVReflectionMapping: + envMapTypeDefine = "ENVMAP_TYPE_CUBE_UV"; + break; } - this.cacheArcLengths = cache; - return cache; - } - updateArcLengths() { - this.needsUpdate = true; - this.getLengths(); } - // Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant - getUtoTmapping(u, distance) { - const arcLengths = this.getLengths(); - let i = 0; - const il = arcLengths.length; - let targetArcLength; - if (distance) { - targetArcLength = distance; - } else { - targetArcLength = u * arcLengths[il - 1]; - } - let low = 0, high = il - 1, comparison; - while (low <= high) { - i = Math.floor(low + (high - low) / 2); - comparison = arcLengths[i] - targetArcLength; - if (comparison < 0) { - low = i + 1; - } else if (comparison > 0) { - high = i - 1; - } else { - high = i; + return envMapTypeDefine; +} +__name(generateEnvMapTypeDefine, "generateEnvMapTypeDefine"); +function generateEnvMapModeDefine(parameters) { + let envMapModeDefine = "ENVMAP_MODE_REFLECTION"; + if (parameters.envMap) { + switch (parameters.envMapMode) { + case CubeRefractionMapping: + envMapModeDefine = "ENVMAP_MODE_REFRACTION"; break; - } - } - i = high; - if (arcLengths[i] === targetArcLength) { - return i / (il - 1); } - const lengthBefore = arcLengths[i]; - const lengthAfter = arcLengths[i + 1]; - const segmentLength = lengthAfter - lengthBefore; - const segmentFraction = (targetArcLength - lengthBefore) / segmentLength; - const t2 = (i + segmentFraction) / (il - 1); - return t2; - } - // Returns a unit vector tangent at t - // In case any sub curve does not implement its tangent derivation, - // 2 points a small delta apart will be used to find its gradient - // which seems to give a reasonable approximation - getTangent(t2, optionalTarget) { - const delta = 1e-4; - let t1 = t2 - delta; - let t22 = t2 + delta; - if (t1 < 0) t1 = 0; - if (t22 > 1) t22 = 1; - const pt1 = this.getPoint(t1); - const pt2 = this.getPoint(t22); - const tangent = optionalTarget || (pt1.isVector2 ? new Vector2() : new Vector3()); - tangent.copy(pt2).sub(pt1).normalize(); - return tangent; - } - getTangentAt(u, optionalTarget) { - const t2 = this.getUtoTmapping(u); - return this.getTangent(t2, optionalTarget); } - computeFrenetFrames(segments, closed) { - const normal = new Vector3(); - const tangents = []; - const normals = []; - const binormals = []; - const vec = new Vector3(); - const mat = new Matrix4(); - for (let i = 0; i <= segments; i++) { - const u = i / segments; - tangents[i] = this.getTangentAt(u, new Vector3()); - } - normals[0] = new Vector3(); - binormals[0] = new Vector3(); - let min = Number.MAX_VALUE; - const tx = Math.abs(tangents[0].x); - const ty = Math.abs(tangents[0].y); - const tz = Math.abs(tangents[0].z); - if (tx <= min) { - min = tx; - normal.set(1, 0, 0); - } - if (ty <= min) { - min = ty; - normal.set(0, 1, 0); - } - if (tz <= min) { - normal.set(0, 0, 1); + return envMapModeDefine; +} +__name(generateEnvMapModeDefine, "generateEnvMapModeDefine"); +function generateEnvMapBlendingDefine(parameters) { + let envMapBlendingDefine = "ENVMAP_BLENDING_NONE"; + if (parameters.envMap) { + switch (parameters.combine) { + case MultiplyOperation: + envMapBlendingDefine = "ENVMAP_BLENDING_MULTIPLY"; + break; + case MixOperation: + envMapBlendingDefine = "ENVMAP_BLENDING_MIX"; + break; + case AddOperation: + envMapBlendingDefine = "ENVMAP_BLENDING_ADD"; + break; } - vec.crossVectors(tangents[0], normal).normalize(); - normals[0].crossVectors(tangents[0], vec); - binormals[0].crossVectors(tangents[0], normals[0]); - for (let i = 1; i <= segments; i++) { - normals[i] = normals[i - 1].clone(); - binormals[i] = binormals[i - 1].clone(); - vec.crossVectors(tangents[i - 1], tangents[i]); - if (vec.length() > Number.EPSILON) { - vec.normalize(); - const theta = Math.acos(clamp(tangents[i - 1].dot(tangents[i]), -1, 1)); - normals[i].applyMatrix4(mat.makeRotationAxis(vec, theta)); - } - binormals[i].crossVectors(tangents[i], normals[i]); + } + return envMapBlendingDefine; +} +__name(generateEnvMapBlendingDefine, "generateEnvMapBlendingDefine"); +function generateCubeUVSize(parameters) { + const imageHeight = parameters.envMapCubeUVHeight; + if (imageHeight === null) return null; + const maxMip = Math.log2(imageHeight) - 2; + const texelHeight = 1 / imageHeight; + const texelWidth = 1 / (3 * Math.max(Math.pow(2, maxMip), 7 * 16)); + return { texelWidth, texelHeight, maxMip }; +} +__name(generateCubeUVSize, "generateCubeUVSize"); +function WebGLProgram(renderer, cacheKey, parameters, bindingStates) { + const gl = renderer.getContext(); + const defines = parameters.defines; + let vertexShader = parameters.vertexShader; + let fragmentShader = parameters.fragmentShader; + const shadowMapTypeDefine = generateShadowMapTypeDefine(parameters); + const envMapTypeDefine = generateEnvMapTypeDefine(parameters); + const envMapModeDefine = generateEnvMapModeDefine(parameters); + const envMapBlendingDefine = generateEnvMapBlendingDefine(parameters); + const envMapCubeUVSize = generateCubeUVSize(parameters); + const customVertexExtensions = generateVertexExtensions(parameters); + const customDefines = generateDefines(defines); + const program = gl.createProgram(); + let prefixVertex, prefixFragment; + let versionString = parameters.glslVersion ? "#version " + parameters.glslVersion + "\n" : ""; + if (parameters.isRawShaderMaterial) { + prefixVertex = [ + "#define SHADER_TYPE " + parameters.shaderType, + "#define SHADER_NAME " + parameters.shaderName, + customDefines + ].filter(filterEmptyLine).join("\n"); + if (prefixVertex.length > 0) { + prefixVertex += "\n"; } - if (closed === true) { - let theta = Math.acos(clamp(normals[0].dot(normals[segments]), -1, 1)); - theta /= segments; - if (tangents[0].dot(vec.crossVectors(normals[0], normals[segments])) > 0) { - theta = -theta; - } - for (let i = 1; i <= segments; i++) { - normals[i].applyMatrix4(mat.makeRotationAxis(tangents[i], theta * i)); - binormals[i].crossVectors(tangents[i], normals[i]); - } + prefixFragment = [ + "#define SHADER_TYPE " + parameters.shaderType, + "#define SHADER_NAME " + parameters.shaderName, + customDefines + ].filter(filterEmptyLine).join("\n"); + if (prefixFragment.length > 0) { + prefixFragment += "\n"; } - return { - tangents, - normals, - binormals - }; - } - clone() { - return new this.constructor().copy(this); - } - copy(source) { - this.arcLengthDivisions = source.arcLengthDivisions; - return this; - } - toJSON() { - const data = { - metadata: { - version: 4.6, - type: "Curve", - generator: "Curve.toJSON" - } - }; - data.arcLengthDivisions = this.arcLengthDivisions; - data.type = this.type; - return data; - } - fromJSON(json) { - this.arcLengthDivisions = json.arcLengthDivisions; - return this; + } else { + prefixVertex = [ + generatePrecision(parameters), + "#define SHADER_TYPE " + parameters.shaderType, + "#define SHADER_NAME " + parameters.shaderName, + customDefines, + parameters.extensionClipCullDistance ? "#define USE_CLIP_DISTANCE" : "", + parameters.batching ? "#define USE_BATCHING" : "", + parameters.batchingColor ? "#define USE_BATCHING_COLOR" : "", + parameters.instancing ? "#define USE_INSTANCING" : "", + parameters.instancingColor ? "#define USE_INSTANCING_COLOR" : "", + parameters.instancingMorph ? "#define USE_INSTANCING_MORPH" : "", + parameters.useFog && parameters.fog ? "#define USE_FOG" : "", + parameters.useFog && parameters.fogExp2 ? "#define FOG_EXP2" : "", + parameters.map ? "#define USE_MAP" : "", + parameters.envMap ? "#define USE_ENVMAP" : "", + parameters.envMap ? "#define " + envMapModeDefine : "", + parameters.lightMap ? "#define USE_LIGHTMAP" : "", + parameters.aoMap ? "#define USE_AOMAP" : "", + parameters.bumpMap ? "#define USE_BUMPMAP" : "", + parameters.normalMap ? "#define USE_NORMALMAP" : "", + parameters.normalMapObjectSpace ? "#define USE_NORMALMAP_OBJECTSPACE" : "", + parameters.normalMapTangentSpace ? "#define USE_NORMALMAP_TANGENTSPACE" : "", + parameters.displacementMap ? "#define USE_DISPLACEMENTMAP" : "", + parameters.emissiveMap ? "#define USE_EMISSIVEMAP" : "", + parameters.anisotropy ? "#define USE_ANISOTROPY" : "", + parameters.anisotropyMap ? "#define USE_ANISOTROPYMAP" : "", + parameters.clearcoatMap ? "#define USE_CLEARCOATMAP" : "", + parameters.clearcoatRoughnessMap ? "#define USE_CLEARCOAT_ROUGHNESSMAP" : "", + parameters.clearcoatNormalMap ? "#define USE_CLEARCOAT_NORMALMAP" : "", + parameters.iridescenceMap ? "#define USE_IRIDESCENCEMAP" : "", + parameters.iridescenceThicknessMap ? "#define USE_IRIDESCENCE_THICKNESSMAP" : "", + parameters.specularMap ? "#define USE_SPECULARMAP" : "", + parameters.specularColorMap ? "#define USE_SPECULAR_COLORMAP" : "", + parameters.specularIntensityMap ? "#define USE_SPECULAR_INTENSITYMAP" : "", + parameters.roughnessMap ? "#define USE_ROUGHNESSMAP" : "", + parameters.metalnessMap ? "#define USE_METALNESSMAP" : "", + parameters.alphaMap ? "#define USE_ALPHAMAP" : "", + parameters.alphaHash ? "#define USE_ALPHAHASH" : "", + parameters.transmission ? "#define USE_TRANSMISSION" : "", + parameters.transmissionMap ? "#define USE_TRANSMISSIONMAP" : "", + parameters.thicknessMap ? "#define USE_THICKNESSMAP" : "", + parameters.sheenColorMap ? "#define USE_SHEEN_COLORMAP" : "", + parameters.sheenRoughnessMap ? "#define USE_SHEEN_ROUGHNESSMAP" : "", + // + parameters.mapUv ? "#define MAP_UV " + parameters.mapUv : "", + parameters.alphaMapUv ? "#define ALPHAMAP_UV " + parameters.alphaMapUv : "", + parameters.lightMapUv ? "#define LIGHTMAP_UV " + parameters.lightMapUv : "", + parameters.aoMapUv ? "#define AOMAP_UV " + parameters.aoMapUv : "", + parameters.emissiveMapUv ? "#define EMISSIVEMAP_UV " + parameters.emissiveMapUv : "", + parameters.bumpMapUv ? "#define BUMPMAP_UV " + parameters.bumpMapUv : "", + parameters.normalMapUv ? "#define NORMALMAP_UV " + parameters.normalMapUv : "", + parameters.displacementMapUv ? "#define DISPLACEMENTMAP_UV " + parameters.displacementMapUv : "", + parameters.metalnessMapUv ? "#define METALNESSMAP_UV " + parameters.metalnessMapUv : "", + parameters.roughnessMapUv ? "#define ROUGHNESSMAP_UV " + parameters.roughnessMapUv : "", + parameters.anisotropyMapUv ? "#define ANISOTROPYMAP_UV " + parameters.anisotropyMapUv : "", + parameters.clearcoatMapUv ? "#define CLEARCOATMAP_UV " + parameters.clearcoatMapUv : "", + parameters.clearcoatNormalMapUv ? "#define CLEARCOAT_NORMALMAP_UV " + parameters.clearcoatNormalMapUv : "", + parameters.clearcoatRoughnessMapUv ? "#define CLEARCOAT_ROUGHNESSMAP_UV " + parameters.clearcoatRoughnessMapUv : "", + parameters.iridescenceMapUv ? "#define IRIDESCENCEMAP_UV " + parameters.iridescenceMapUv : "", + parameters.iridescenceThicknessMapUv ? "#define IRIDESCENCE_THICKNESSMAP_UV " + parameters.iridescenceThicknessMapUv : "", + parameters.sheenColorMapUv ? "#define SHEEN_COLORMAP_UV " + parameters.sheenColorMapUv : "", + parameters.sheenRoughnessMapUv ? "#define SHEEN_ROUGHNESSMAP_UV " + parameters.sheenRoughnessMapUv : "", + parameters.specularMapUv ? "#define SPECULARMAP_UV " + parameters.specularMapUv : "", + parameters.specularColorMapUv ? "#define SPECULAR_COLORMAP_UV " + parameters.specularColorMapUv : "", + parameters.specularIntensityMapUv ? "#define SPECULAR_INTENSITYMAP_UV " + parameters.specularIntensityMapUv : "", + parameters.transmissionMapUv ? "#define TRANSMISSIONMAP_UV " + parameters.transmissionMapUv : "", + parameters.thicknessMapUv ? "#define THICKNESSMAP_UV " + parameters.thicknessMapUv : "", + // + parameters.vertexTangents && parameters.flatShading === false ? "#define USE_TANGENT" : "", + parameters.vertexColors ? "#define USE_COLOR" : "", + parameters.vertexAlphas ? "#define USE_COLOR_ALPHA" : "", + parameters.vertexUv1s ? "#define USE_UV1" : "", + parameters.vertexUv2s ? "#define USE_UV2" : "", + parameters.vertexUv3s ? "#define USE_UV3" : "", + parameters.pointsUvs ? "#define USE_POINTS_UV" : "", + parameters.flatShading ? "#define FLAT_SHADED" : "", + parameters.skinning ? "#define USE_SKINNING" : "", + parameters.morphTargets ? "#define USE_MORPHTARGETS" : "", + parameters.morphNormals && parameters.flatShading === false ? "#define USE_MORPHNORMALS" : "", + parameters.morphColors ? "#define USE_MORPHCOLORS" : "", + parameters.morphTargetsCount > 0 ? "#define MORPHTARGETS_TEXTURE_STRIDE " + parameters.morphTextureStride : "", + parameters.morphTargetsCount > 0 ? "#define MORPHTARGETS_COUNT " + parameters.morphTargetsCount : "", + parameters.doubleSided ? "#define DOUBLE_SIDED" : "", + parameters.flipSided ? "#define FLIP_SIDED" : "", + parameters.shadowMapEnabled ? "#define USE_SHADOWMAP" : "", + parameters.shadowMapEnabled ? "#define " + shadowMapTypeDefine : "", + parameters.sizeAttenuation ? "#define USE_SIZEATTENUATION" : "", + parameters.numLightProbes > 0 ? "#define USE_LIGHT_PROBES" : "", + parameters.logarithmicDepthBuffer ? "#define USE_LOGDEPTHBUF" : "", + parameters.reverseDepthBuffer ? "#define USE_REVERSEDEPTHBUF" : "", + "uniform mat4 modelMatrix;", + "uniform mat4 modelViewMatrix;", + "uniform mat4 projectionMatrix;", + "uniform mat4 viewMatrix;", + "uniform mat3 normalMatrix;", + "uniform vec3 cameraPosition;", + "uniform bool isOrthographic;", + "#ifdef USE_INSTANCING", + " attribute mat4 instanceMatrix;", + "#endif", + "#ifdef USE_INSTANCING_COLOR", + " attribute vec3 instanceColor;", + "#endif", + "#ifdef USE_INSTANCING_MORPH", + " uniform sampler2D morphTexture;", + "#endif", + "attribute vec3 position;", + "attribute vec3 normal;", + "attribute vec2 uv;", + "#ifdef USE_UV1", + " attribute vec2 uv1;", + "#endif", + "#ifdef USE_UV2", + " attribute vec2 uv2;", + "#endif", + "#ifdef USE_UV3", + " attribute vec2 uv3;", + "#endif", + "#ifdef USE_TANGENT", + " attribute vec4 tangent;", + "#endif", + "#if defined( USE_COLOR_ALPHA )", + " attribute vec4 color;", + "#elif defined( USE_COLOR )", + " attribute vec3 color;", + "#endif", + "#ifdef USE_SKINNING", + " attribute vec4 skinIndex;", + " attribute vec4 skinWeight;", + "#endif", + "\n" + ].filter(filterEmptyLine).join("\n"); + prefixFragment = [ + generatePrecision(parameters), + "#define SHADER_TYPE " + parameters.shaderType, + "#define SHADER_NAME " + parameters.shaderName, + customDefines, + parameters.useFog && parameters.fog ? "#define USE_FOG" : "", + parameters.useFog && parameters.fogExp2 ? "#define FOG_EXP2" : "", + parameters.alphaToCoverage ? "#define ALPHA_TO_COVERAGE" : "", + parameters.map ? "#define USE_MAP" : "", + parameters.matcap ? "#define USE_MATCAP" : "", + parameters.envMap ? "#define USE_ENVMAP" : "", + parameters.envMap ? "#define " + envMapTypeDefine : "", + parameters.envMap ? "#define " + envMapModeDefine : "", + parameters.envMap ? "#define " + envMapBlendingDefine : "", + envMapCubeUVSize ? "#define CUBEUV_TEXEL_WIDTH " + envMapCubeUVSize.texelWidth : "", + envMapCubeUVSize ? "#define CUBEUV_TEXEL_HEIGHT " + envMapCubeUVSize.texelHeight : "", + envMapCubeUVSize ? "#define CUBEUV_MAX_MIP " + envMapCubeUVSize.maxMip + ".0" : "", + parameters.lightMap ? "#define USE_LIGHTMAP" : "", + parameters.aoMap ? "#define USE_AOMAP" : "", + parameters.bumpMap ? "#define USE_BUMPMAP" : "", + parameters.normalMap ? "#define USE_NORMALMAP" : "", + parameters.normalMapObjectSpace ? "#define USE_NORMALMAP_OBJECTSPACE" : "", + parameters.normalMapTangentSpace ? "#define USE_NORMALMAP_TANGENTSPACE" : "", + parameters.emissiveMap ? "#define USE_EMISSIVEMAP" : "", + parameters.anisotropy ? "#define USE_ANISOTROPY" : "", + parameters.anisotropyMap ? "#define USE_ANISOTROPYMAP" : "", + parameters.clearcoat ? "#define USE_CLEARCOAT" : "", + parameters.clearcoatMap ? "#define USE_CLEARCOATMAP" : "", + parameters.clearcoatRoughnessMap ? "#define USE_CLEARCOAT_ROUGHNESSMAP" : "", + parameters.clearcoatNormalMap ? "#define USE_CLEARCOAT_NORMALMAP" : "", + parameters.dispersion ? "#define USE_DISPERSION" : "", + parameters.iridescence ? "#define USE_IRIDESCENCE" : "", + parameters.iridescenceMap ? "#define USE_IRIDESCENCEMAP" : "", + parameters.iridescenceThicknessMap ? "#define USE_IRIDESCENCE_THICKNESSMAP" : "", + parameters.specularMap ? "#define USE_SPECULARMAP" : "", + parameters.specularColorMap ? "#define USE_SPECULAR_COLORMAP" : "", + parameters.specularIntensityMap ? "#define USE_SPECULAR_INTENSITYMAP" : "", + parameters.roughnessMap ? "#define USE_ROUGHNESSMAP" : "", + parameters.metalnessMap ? "#define USE_METALNESSMAP" : "", + parameters.alphaMap ? "#define USE_ALPHAMAP" : "", + parameters.alphaTest ? "#define USE_ALPHATEST" : "", + parameters.alphaHash ? "#define USE_ALPHAHASH" : "", + parameters.sheen ? "#define USE_SHEEN" : "", + parameters.sheenColorMap ? "#define USE_SHEEN_COLORMAP" : "", + parameters.sheenRoughnessMap ? "#define USE_SHEEN_ROUGHNESSMAP" : "", + parameters.transmission ? "#define USE_TRANSMISSION" : "", + parameters.transmissionMap ? "#define USE_TRANSMISSIONMAP" : "", + parameters.thicknessMap ? "#define USE_THICKNESSMAP" : "", + parameters.vertexTangents && parameters.flatShading === false ? "#define USE_TANGENT" : "", + parameters.vertexColors || parameters.instancingColor || parameters.batchingColor ? "#define USE_COLOR" : "", + parameters.vertexAlphas ? "#define USE_COLOR_ALPHA" : "", + parameters.vertexUv1s ? "#define USE_UV1" : "", + parameters.vertexUv2s ? "#define USE_UV2" : "", + parameters.vertexUv3s ? "#define USE_UV3" : "", + parameters.pointsUvs ? "#define USE_POINTS_UV" : "", + parameters.gradientMap ? "#define USE_GRADIENTMAP" : "", + parameters.flatShading ? "#define FLAT_SHADED" : "", + parameters.doubleSided ? "#define DOUBLE_SIDED" : "", + parameters.flipSided ? "#define FLIP_SIDED" : "", + parameters.shadowMapEnabled ? "#define USE_SHADOWMAP" : "", + parameters.shadowMapEnabled ? "#define " + shadowMapTypeDefine : "", + parameters.premultipliedAlpha ? "#define PREMULTIPLIED_ALPHA" : "", + parameters.numLightProbes > 0 ? "#define USE_LIGHT_PROBES" : "", + parameters.decodeVideoTexture ? "#define DECODE_VIDEO_TEXTURE" : "", + parameters.decodeVideoTextureEmissive ? "#define DECODE_VIDEO_TEXTURE_EMISSIVE" : "", + parameters.logarithmicDepthBuffer ? "#define USE_LOGDEPTHBUF" : "", + parameters.reverseDepthBuffer ? "#define USE_REVERSEDEPTHBUF" : "", + "uniform mat4 viewMatrix;", + "uniform vec3 cameraPosition;", + "uniform bool isOrthographic;", + parameters.toneMapping !== NoToneMapping ? "#define TONE_MAPPING" : "", + parameters.toneMapping !== NoToneMapping ? ShaderChunk["tonemapping_pars_fragment"] : "", + // this code is required here because it is used by the toneMapping() function defined below + parameters.toneMapping !== NoToneMapping ? getToneMappingFunction("toneMapping", parameters.toneMapping) : "", + parameters.dithering ? "#define DITHERING" : "", + parameters.opaque ? "#define OPAQUE" : "", + ShaderChunk["colorspace_pars_fragment"], + // this code is required here because it is used by the various encoding/decoding function defined below + getTexelEncodingFunction("linearToOutputTexel", parameters.outputColorSpace), + getLuminanceFunction(), + parameters.useDepthPacking ? "#define DEPTH_PACKING " + parameters.depthPacking : "", + "\n" + ].filter(filterEmptyLine).join("\n"); } -} -class EllipseCurve extends Curve { - static { - __name(this, "EllipseCurve"); + vertexShader = resolveIncludes(vertexShader); + vertexShader = replaceLightNums(vertexShader, parameters); + vertexShader = replaceClippingPlaneNums(vertexShader, parameters); + fragmentShader = resolveIncludes(fragmentShader); + fragmentShader = replaceLightNums(fragmentShader, parameters); + fragmentShader = replaceClippingPlaneNums(fragmentShader, parameters); + vertexShader = unrollLoops(vertexShader); + fragmentShader = unrollLoops(fragmentShader); + if (parameters.isRawShaderMaterial !== true) { + versionString = "#version 300 es\n"; + prefixVertex = [ + customVertexExtensions, + "#define attribute in", + "#define varying out", + "#define texture2D texture" + ].join("\n") + "\n" + prefixVertex; + prefixFragment = [ + "#define varying in", + parameters.glslVersion === GLSL3 ? "" : "layout(location = 0) out highp vec4 pc_fragColor;", + parameters.glslVersion === GLSL3 ? "" : "#define gl_FragColor pc_fragColor", + "#define gl_FragDepthEXT gl_FragDepth", + "#define texture2D texture", + "#define textureCube texture", + "#define texture2DProj textureProj", + "#define texture2DLodEXT textureLod", + "#define texture2DProjLodEXT textureProjLod", + "#define textureCubeLodEXT textureLod", + "#define texture2DGradEXT textureGrad", + "#define texture2DProjGradEXT textureProjGrad", + "#define textureCubeGradEXT textureGrad" + ].join("\n") + "\n" + prefixFragment; } - constructor(aX = 0, aY = 0, xRadius = 1, yRadius = 1, aStartAngle = 0, aEndAngle = Math.PI * 2, aClockwise = false, aRotation = 0) { - super(); - this.isEllipseCurve = true; - this.type = "EllipseCurve"; - this.aX = aX; - this.aY = aY; - this.xRadius = xRadius; - this.yRadius = yRadius; - this.aStartAngle = aStartAngle; - this.aEndAngle = aEndAngle; - this.aClockwise = aClockwise; - this.aRotation = aRotation; + const vertexGlsl = versionString + prefixVertex + vertexShader; + const fragmentGlsl = versionString + prefixFragment + fragmentShader; + const glVertexShader = WebGLShader(gl, gl.VERTEX_SHADER, vertexGlsl); + const glFragmentShader = WebGLShader(gl, gl.FRAGMENT_SHADER, fragmentGlsl); + gl.attachShader(program, glVertexShader); + gl.attachShader(program, glFragmentShader); + if (parameters.index0AttributeName !== void 0) { + gl.bindAttribLocation(program, 0, parameters.index0AttributeName); + } else if (parameters.morphTargets === true) { + gl.bindAttribLocation(program, 0, "position"); } - getPoint(t2, optionalTarget = new Vector2()) { - const point = optionalTarget; - const twoPi = Math.PI * 2; - let deltaAngle = this.aEndAngle - this.aStartAngle; - const samePoints = Math.abs(deltaAngle) < Number.EPSILON; - while (deltaAngle < 0) deltaAngle += twoPi; - while (deltaAngle > twoPi) deltaAngle -= twoPi; - if (deltaAngle < Number.EPSILON) { - if (samePoints) { - deltaAngle = 0; - } else { - deltaAngle = twoPi; + gl.linkProgram(program); + function onFirstUse(self2) { + if (renderer.debug.checkShaderErrors) { + const programLog = gl.getProgramInfoLog(program).trim(); + const vertexLog = gl.getShaderInfoLog(glVertexShader).trim(); + const fragmentLog = gl.getShaderInfoLog(glFragmentShader).trim(); + let runnable = true; + let haveDiagnostics = true; + if (gl.getProgramParameter(program, gl.LINK_STATUS) === false) { + runnable = false; + if (typeof renderer.debug.onShaderError === "function") { + renderer.debug.onShaderError(gl, program, glVertexShader, glFragmentShader); + } else { + const vertexErrors = getShaderErrors(gl, glVertexShader, "vertex"); + const fragmentErrors = getShaderErrors(gl, glFragmentShader, "fragment"); + console.error( + "THREE.WebGLProgram: Shader Error " + gl.getError() + " - VALIDATE_STATUS " + gl.getProgramParameter(program, gl.VALIDATE_STATUS) + "\n\nMaterial Name: " + self2.name + "\nMaterial Type: " + self2.type + "\n\nProgram Info Log: " + programLog + "\n" + vertexErrors + "\n" + fragmentErrors + ); + } + } else if (programLog !== "") { + console.warn("THREE.WebGLProgram: Program Info Log:", programLog); + } else if (vertexLog === "" || fragmentLog === "") { + haveDiagnostics = false; } - } - if (this.aClockwise === true && !samePoints) { - if (deltaAngle === twoPi) { - deltaAngle = -twoPi; - } else { - deltaAngle = deltaAngle - twoPi; + if (haveDiagnostics) { + self2.diagnostics = { + runnable, + programLog, + vertexShader: { + log: vertexLog, + prefix: prefixVertex + }, + fragmentShader: { + log: fragmentLog, + prefix: prefixFragment + } + }; } } - const angle = this.aStartAngle + t2 * deltaAngle; - let x = this.aX + this.xRadius * Math.cos(angle); - let y = this.aY + this.yRadius * Math.sin(angle); - if (this.aRotation !== 0) { - const cos = Math.cos(this.aRotation); - const sin = Math.sin(this.aRotation); - const tx = x - this.aX; - const ty = y - this.aY; - x = tx * cos - ty * sin + this.aX; - y = tx * sin + ty * cos + this.aY; - } - return point.set(x, y); - } - copy(source) { - super.copy(source); - this.aX = source.aX; - this.aY = source.aY; - this.xRadius = source.xRadius; - this.yRadius = source.yRadius; - this.aStartAngle = source.aStartAngle; - this.aEndAngle = source.aEndAngle; - this.aClockwise = source.aClockwise; - this.aRotation = source.aRotation; - return this; - } - toJSON() { - const data = super.toJSON(); - data.aX = this.aX; - data.aY = this.aY; - data.xRadius = this.xRadius; - data.yRadius = this.yRadius; - data.aStartAngle = this.aStartAngle; - data.aEndAngle = this.aEndAngle; - data.aClockwise = this.aClockwise; - data.aRotation = this.aRotation; - return data; - } - fromJSON(json) { - super.fromJSON(json); - this.aX = json.aX; - this.aY = json.aY; - this.xRadius = json.xRadius; - this.yRadius = json.yRadius; - this.aStartAngle = json.aStartAngle; - this.aEndAngle = json.aEndAngle; - this.aClockwise = json.aClockwise; - this.aRotation = json.aRotation; - return this; - } -} -class ArcCurve extends EllipseCurve { - static { - __name(this, "ArcCurve"); - } - constructor(aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise) { - super(aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise); - this.isArcCurve = true; - this.type = "ArcCurve"; - } -} -function CubicPoly() { - let c0 = 0, c1 = 0, c2 = 0, c3 = 0; - function init(x0, x1, t0, t1) { - c0 = x0; - c1 = t0; - c2 = -3 * x0 + 3 * x1 - 2 * t0 - t1; - c3 = 2 * x0 - 2 * x1 + t0 + t1; + gl.deleteShader(glVertexShader); + gl.deleteShader(glFragmentShader); + cachedUniforms = new WebGLUniforms(gl, program); + cachedAttributes = fetchAttributeLocations(gl, program); } - __name(init, "init"); - return { - initCatmullRom: /* @__PURE__ */ __name(function(x0, x1, x2, x3, tension) { - init(x1, x2, tension * (x2 - x0), tension * (x3 - x1)); - }, "initCatmullRom"), - initNonuniformCatmullRom: /* @__PURE__ */ __name(function(x0, x1, x2, x3, dt0, dt1, dt2) { - let t1 = (x1 - x0) / dt0 - (x2 - x0) / (dt0 + dt1) + (x2 - x1) / dt1; - let t2 = (x2 - x1) / dt1 - (x3 - x1) / (dt1 + dt2) + (x3 - x2) / dt2; - t1 *= dt1; - t2 *= dt1; - init(x1, x2, t1, t2); - }, "initNonuniformCatmullRom"), - calc: /* @__PURE__ */ __name(function(t2) { - const t22 = t2 * t2; - const t3 = t22 * t2; - return c0 + c1 * t2 + c2 * t22 + c3 * t3; - }, "calc") + __name(onFirstUse, "onFirstUse"); + let cachedUniforms; + this.getUniforms = function() { + if (cachedUniforms === void 0) { + onFirstUse(this); + } + return cachedUniforms; + }; + let cachedAttributes; + this.getAttributes = function() { + if (cachedAttributes === void 0) { + onFirstUse(this); + } + return cachedAttributes; + }; + let programReady = parameters.rendererExtensionParallelShaderCompile === false; + this.isReady = function() { + if (programReady === false) { + programReady = gl.getProgramParameter(program, COMPLETION_STATUS_KHR); + } + return programReady; }; + this.destroy = function() { + bindingStates.releaseStatesOfProgram(this); + gl.deleteProgram(program); + this.program = void 0; + }; + this.type = parameters.shaderType; + this.name = parameters.shaderName; + this.id = programIdCount++; + this.cacheKey = cacheKey; + this.usedTimes = 1; + this.program = program; + this.vertexShader = glVertexShader; + this.fragmentShader = glFragmentShader; + return this; } -__name(CubicPoly, "CubicPoly"); -const tmp = /* @__PURE__ */ new Vector3(); -const px = /* @__PURE__ */ new CubicPoly(); -const py = /* @__PURE__ */ new CubicPoly(); -const pz = /* @__PURE__ */ new CubicPoly(); -class CatmullRomCurve3 extends Curve { +__name(WebGLProgram, "WebGLProgram"); +let _id$1 = 0; +class WebGLShaderCache { static { - __name(this, "CatmullRomCurve3"); + __name(this, "WebGLShaderCache"); } - constructor(points = [], closed = false, curveType = "centripetal", tension = 0.5) { - super(); - this.isCatmullRomCurve3 = true; - this.type = "CatmullRomCurve3"; - this.points = points; - this.closed = closed; - this.curveType = curveType; - this.tension = tension; + constructor() { + this.shaderCache = /* @__PURE__ */ new Map(); + this.materialCache = /* @__PURE__ */ new Map(); } - getPoint(t2, optionalTarget = new Vector3()) { - const point = optionalTarget; - const points = this.points; - const l = points.length; - const p = (l - (this.closed ? 0 : 1)) * t2; - let intPoint = Math.floor(p); - let weight = p - intPoint; - if (this.closed) { - intPoint += intPoint > 0 ? 0 : (Math.floor(Math.abs(intPoint) / l) + 1) * l; - } else if (weight === 0 && intPoint === l - 1) { - intPoint = l - 2; - weight = 1; - } - let p0, p3; - if (this.closed || intPoint > 0) { - p0 = points[(intPoint - 1) % l]; - } else { - tmp.subVectors(points[0], points[1]).add(points[0]); - p0 = tmp; - } - const p1 = points[intPoint % l]; - const p2 = points[(intPoint + 1) % l]; - if (this.closed || intPoint + 2 < l) { - p3 = points[(intPoint + 2) % l]; - } else { - tmp.subVectors(points[l - 1], points[l - 2]).add(points[l - 1]); - p3 = tmp; - } - if (this.curveType === "centripetal" || this.curveType === "chordal") { - const pow = this.curveType === "chordal" ? 0.5 : 0.25; - let dt0 = Math.pow(p0.distanceToSquared(p1), pow); - let dt1 = Math.pow(p1.distanceToSquared(p2), pow); - let dt2 = Math.pow(p2.distanceToSquared(p3), pow); - if (dt1 < 1e-4) dt1 = 1; - if (dt0 < 1e-4) dt0 = dt1; - if (dt2 < 1e-4) dt2 = dt1; - px.initNonuniformCatmullRom(p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2); - py.initNonuniformCatmullRom(p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2); - pz.initNonuniformCatmullRom(p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2); - } else if (this.curveType === "catmullrom") { - px.initCatmullRom(p0.x, p1.x, p2.x, p3.x, this.tension); - py.initCatmullRom(p0.y, p1.y, p2.y, p3.y, this.tension); - pz.initCatmullRom(p0.z, p1.z, p2.z, p3.z, this.tension); + update(material) { + const vertexShader = material.vertexShader; + const fragmentShader = material.fragmentShader; + const vertexShaderStage = this._getShaderStage(vertexShader); + const fragmentShaderStage = this._getShaderStage(fragmentShader); + const materialShaders = this._getShaderCacheForMaterial(material); + if (materialShaders.has(vertexShaderStage) === false) { + materialShaders.add(vertexShaderStage); + vertexShaderStage.usedTimes++; } - point.set( - px.calc(weight), - py.calc(weight), - pz.calc(weight) - ); - return point; - } - copy(source) { - super.copy(source); - this.points = []; - for (let i = 0, l = source.points.length; i < l; i++) { - const point = source.points[i]; - this.points.push(point.clone()); + if (materialShaders.has(fragmentShaderStage) === false) { + materialShaders.add(fragmentShaderStage); + fragmentShaderStage.usedTimes++; } - this.closed = source.closed; - this.curveType = source.curveType; - this.tension = source.tension; return this; } - toJSON() { - const data = super.toJSON(); - data.points = []; - for (let i = 0, l = this.points.length; i < l; i++) { - const point = this.points[i]; - data.points.push(point.toArray()); - } - data.closed = this.closed; - data.curveType = this.curveType; - data.tension = this.tension; - return data; - } - fromJSON(json) { - super.fromJSON(json); - this.points = []; - for (let i = 0, l = json.points.length; i < l; i++) { - const point = json.points[i]; - this.points.push(new Vector3().fromArray(point)); + remove(material) { + const materialShaders = this.materialCache.get(material); + for (const shaderStage of materialShaders) { + shaderStage.usedTimes--; + if (shaderStage.usedTimes === 0) this.shaderCache.delete(shaderStage.code); } - this.closed = json.closed; - this.curveType = json.curveType; - this.tension = json.tension; + this.materialCache.delete(material); return this; } -} -function CatmullRom(t2, p0, p1, p2, p3) { - const v0 = (p2 - p0) * 0.5; - const v1 = (p3 - p1) * 0.5; - const t22 = t2 * t2; - const t3 = t2 * t22; - return (2 * p1 - 2 * p2 + v0 + v1) * t3 + (-3 * p1 + 3 * p2 - 2 * v0 - v1) * t22 + v0 * t2 + p1; -} -__name(CatmullRom, "CatmullRom"); -function QuadraticBezierP0(t2, p) { - const k = 1 - t2; - return k * k * p; -} -__name(QuadraticBezierP0, "QuadraticBezierP0"); -function QuadraticBezierP1(t2, p) { - return 2 * (1 - t2) * t2 * p; -} -__name(QuadraticBezierP1, "QuadraticBezierP1"); -function QuadraticBezierP2(t2, p) { - return t2 * t2 * p; -} -__name(QuadraticBezierP2, "QuadraticBezierP2"); -function QuadraticBezier(t2, p0, p1, p2) { - return QuadraticBezierP0(t2, p0) + QuadraticBezierP1(t2, p1) + QuadraticBezierP2(t2, p2); -} -__name(QuadraticBezier, "QuadraticBezier"); -function CubicBezierP0(t2, p) { - const k = 1 - t2; - return k * k * k * p; -} -__name(CubicBezierP0, "CubicBezierP0"); -function CubicBezierP1(t2, p) { - const k = 1 - t2; - return 3 * k * k * t2 * p; -} -__name(CubicBezierP1, "CubicBezierP1"); -function CubicBezierP2(t2, p) { - return 3 * (1 - t2) * t2 * t2 * p; -} -__name(CubicBezierP2, "CubicBezierP2"); -function CubicBezierP3(t2, p) { - return t2 * t2 * t2 * p; -} -__name(CubicBezierP3, "CubicBezierP3"); -function CubicBezier(t2, p0, p1, p2, p3) { - return CubicBezierP0(t2, p0) + CubicBezierP1(t2, p1) + CubicBezierP2(t2, p2) + CubicBezierP3(t2, p3); -} -__name(CubicBezier, "CubicBezier"); -class CubicBezierCurve extends Curve { - static { - __name(this, "CubicBezierCurve"); - } - constructor(v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2(), v3 = new Vector2()) { - super(); - this.isCubicBezierCurve = true; - this.type = "CubicBezierCurve"; - this.v0 = v0; - this.v1 = v1; - this.v2 = v2; - this.v3 = v3; + getVertexShaderID(material) { + return this._getShaderStage(material.vertexShader).id; } - getPoint(t2, optionalTarget = new Vector2()) { - const point = optionalTarget; - const v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; - point.set( - CubicBezier(t2, v0.x, v1.x, v2.x, v3.x), - CubicBezier(t2, v0.y, v1.y, v2.y, v3.y) - ); - return point; + getFragmentShaderID(material) { + return this._getShaderStage(material.fragmentShader).id; } - copy(source) { - super.copy(source); - this.v0.copy(source.v0); - this.v1.copy(source.v1); - this.v2.copy(source.v2); - this.v3.copy(source.v3); - return this; + dispose() { + this.shaderCache.clear(); + this.materialCache.clear(); } - toJSON() { - const data = super.toJSON(); - data.v0 = this.v0.toArray(); - data.v1 = this.v1.toArray(); - data.v2 = this.v2.toArray(); - data.v3 = this.v3.toArray(); - return data; + _getShaderCacheForMaterial(material) { + const cache = this.materialCache; + let set = cache.get(material); + if (set === void 0) { + set = /* @__PURE__ */ new Set(); + cache.set(material, set); + } + return set; } - fromJSON(json) { - super.fromJSON(json); - this.v0.fromArray(json.v0); - this.v1.fromArray(json.v1); - this.v2.fromArray(json.v2); - this.v3.fromArray(json.v3); - return this; + _getShaderStage(code) { + const cache = this.shaderCache; + let stage = cache.get(code); + if (stage === void 0) { + stage = new WebGLShaderStage(code); + cache.set(code, stage); + } + return stage; } } -class CubicBezierCurve3 extends Curve { +class WebGLShaderStage { static { - __name(this, "CubicBezierCurve3"); - } - constructor(v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3(), v3 = new Vector3()) { - super(); - this.isCubicBezierCurve3 = true; - this.type = "CubicBezierCurve3"; - this.v0 = v0; - this.v1 = v1; - this.v2 = v2; - this.v3 = v3; - } - getPoint(t2, optionalTarget = new Vector3()) { - const point = optionalTarget; - const v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; - point.set( - CubicBezier(t2, v0.x, v1.x, v2.x, v3.x), - CubicBezier(t2, v0.y, v1.y, v2.y, v3.y), - CubicBezier(t2, v0.z, v1.z, v2.z, v3.z) - ); - return point; - } - copy(source) { - super.copy(source); - this.v0.copy(source.v0); - this.v1.copy(source.v1); - this.v2.copy(source.v2); - this.v3.copy(source.v3); - return this; - } - toJSON() { - const data = super.toJSON(); - data.v0 = this.v0.toArray(); - data.v1 = this.v1.toArray(); - data.v2 = this.v2.toArray(); - data.v3 = this.v3.toArray(); - return data; + __name(this, "WebGLShaderStage"); } - fromJSON(json) { - super.fromJSON(json); - this.v0.fromArray(json.v0); - this.v1.fromArray(json.v1); - this.v2.fromArray(json.v2); - this.v3.fromArray(json.v3); - return this; + constructor(code) { + this.id = _id$1++; + this.code = code; + this.usedTimes = 0; } } -class LineCurve extends Curve { - static { - __name(this, "LineCurve"); +function WebGLPrograms(renderer, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping) { + const _programLayers = new Layers(); + const _customShaders = new WebGLShaderCache(); + const _activeChannels = /* @__PURE__ */ new Set(); + const programs = []; + const logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer; + const SUPPORTS_VERTEX_TEXTURES = capabilities.vertexTextures; + let precision = capabilities.precision; + const shaderIDs = { + MeshDepthMaterial: "depth", + MeshDistanceMaterial: "distanceRGBA", + MeshNormalMaterial: "normal", + MeshBasicMaterial: "basic", + MeshLambertMaterial: "lambert", + MeshPhongMaterial: "phong", + MeshToonMaterial: "toon", + MeshStandardMaterial: "physical", + MeshPhysicalMaterial: "physical", + MeshMatcapMaterial: "matcap", + LineBasicMaterial: "basic", + LineDashedMaterial: "dashed", + PointsMaterial: "points", + ShadowMaterial: "shadow", + SpriteMaterial: "sprite" + }; + function getChannel(value) { + _activeChannels.add(value); + if (value === 0) return "uv"; + return `uv${value}`; } - constructor(v1 = new Vector2(), v2 = new Vector2()) { - super(); - this.isLineCurve = true; - this.type = "LineCurve"; - this.v1 = v1; - this.v2 = v2; + __name(getChannel, "getChannel"); + function getParameters(material, lights, shadows, scene, object) { + const fog = scene.fog; + const geometry = object.geometry; + const environment = material.isMeshStandardMaterial ? scene.environment : null; + const envMap = (material.isMeshStandardMaterial ? cubeuvmaps : cubemaps).get(material.envMap || environment); + const envMapCubeUVHeight = !!envMap && envMap.mapping === CubeUVReflectionMapping ? envMap.image.height : null; + const shaderID = shaderIDs[material.type]; + if (material.precision !== null) { + precision = capabilities.getMaxPrecision(material.precision); + if (precision !== material.precision) { + console.warn("THREE.WebGLProgram.getParameters:", material.precision, "not supported, using", precision, "instead."); + } + } + const morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color; + const morphTargetsCount = morphAttribute !== void 0 ? morphAttribute.length : 0; + let morphTextureStride = 0; + if (geometry.morphAttributes.position !== void 0) morphTextureStride = 1; + if (geometry.morphAttributes.normal !== void 0) morphTextureStride = 2; + if (geometry.morphAttributes.color !== void 0) morphTextureStride = 3; + let vertexShader, fragmentShader; + let customVertexShaderID, customFragmentShaderID; + if (shaderID) { + const shader = ShaderLib[shaderID]; + vertexShader = shader.vertexShader; + fragmentShader = shader.fragmentShader; + } else { + vertexShader = material.vertexShader; + fragmentShader = material.fragmentShader; + _customShaders.update(material); + customVertexShaderID = _customShaders.getVertexShaderID(material); + customFragmentShaderID = _customShaders.getFragmentShaderID(material); + } + const currentRenderTarget = renderer.getRenderTarget(); + const reverseDepthBuffer = renderer.state.buffers.depth.getReversed(); + const IS_INSTANCEDMESH = object.isInstancedMesh === true; + const IS_BATCHEDMESH = object.isBatchedMesh === true; + const HAS_MAP = !!material.map; + const HAS_MATCAP = !!material.matcap; + const HAS_ENVMAP = !!envMap; + const HAS_AOMAP = !!material.aoMap; + const HAS_LIGHTMAP = !!material.lightMap; + const HAS_BUMPMAP = !!material.bumpMap; + const HAS_NORMALMAP = !!material.normalMap; + const HAS_DISPLACEMENTMAP = !!material.displacementMap; + const HAS_EMISSIVEMAP = !!material.emissiveMap; + const HAS_METALNESSMAP = !!material.metalnessMap; + const HAS_ROUGHNESSMAP = !!material.roughnessMap; + const HAS_ANISOTROPY = material.anisotropy > 0; + const HAS_CLEARCOAT = material.clearcoat > 0; + const HAS_DISPERSION = material.dispersion > 0; + const HAS_IRIDESCENCE = material.iridescence > 0; + const HAS_SHEEN = material.sheen > 0; + const HAS_TRANSMISSION = material.transmission > 0; + const HAS_ANISOTROPYMAP = HAS_ANISOTROPY && !!material.anisotropyMap; + const HAS_CLEARCOATMAP = HAS_CLEARCOAT && !!material.clearcoatMap; + const HAS_CLEARCOAT_NORMALMAP = HAS_CLEARCOAT && !!material.clearcoatNormalMap; + const HAS_CLEARCOAT_ROUGHNESSMAP = HAS_CLEARCOAT && !!material.clearcoatRoughnessMap; + const HAS_IRIDESCENCEMAP = HAS_IRIDESCENCE && !!material.iridescenceMap; + const HAS_IRIDESCENCE_THICKNESSMAP = HAS_IRIDESCENCE && !!material.iridescenceThicknessMap; + const HAS_SHEEN_COLORMAP = HAS_SHEEN && !!material.sheenColorMap; + const HAS_SHEEN_ROUGHNESSMAP = HAS_SHEEN && !!material.sheenRoughnessMap; + const HAS_SPECULARMAP = !!material.specularMap; + const HAS_SPECULAR_COLORMAP = !!material.specularColorMap; + const HAS_SPECULAR_INTENSITYMAP = !!material.specularIntensityMap; + const HAS_TRANSMISSIONMAP = HAS_TRANSMISSION && !!material.transmissionMap; + const HAS_THICKNESSMAP = HAS_TRANSMISSION && !!material.thicknessMap; + const HAS_GRADIENTMAP = !!material.gradientMap; + const HAS_ALPHAMAP = !!material.alphaMap; + const HAS_ALPHATEST = material.alphaTest > 0; + const HAS_ALPHAHASH = !!material.alphaHash; + const HAS_EXTENSIONS = !!material.extensions; + let toneMapping = NoToneMapping; + if (material.toneMapped) { + if (currentRenderTarget === null || currentRenderTarget.isXRRenderTarget === true) { + toneMapping = renderer.toneMapping; + } + } + const parameters = { + shaderID, + shaderType: material.type, + shaderName: material.name, + vertexShader, + fragmentShader, + defines: material.defines, + customVertexShaderID, + customFragmentShaderID, + isRawShaderMaterial: material.isRawShaderMaterial === true, + glslVersion: material.glslVersion, + precision, + batching: IS_BATCHEDMESH, + batchingColor: IS_BATCHEDMESH && object._colorsTexture !== null, + instancing: IS_INSTANCEDMESH, + instancingColor: IS_INSTANCEDMESH && object.instanceColor !== null, + instancingMorph: IS_INSTANCEDMESH && object.morphTexture !== null, + supportsVertexTextures: SUPPORTS_VERTEX_TEXTURES, + outputColorSpace: currentRenderTarget === null ? renderer.outputColorSpace : currentRenderTarget.isXRRenderTarget === true ? currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace, + alphaToCoverage: !!material.alphaToCoverage, + map: HAS_MAP, + matcap: HAS_MATCAP, + envMap: HAS_ENVMAP, + envMapMode: HAS_ENVMAP && envMap.mapping, + envMapCubeUVHeight, + aoMap: HAS_AOMAP, + lightMap: HAS_LIGHTMAP, + bumpMap: HAS_BUMPMAP, + normalMap: HAS_NORMALMAP, + displacementMap: SUPPORTS_VERTEX_TEXTURES && HAS_DISPLACEMENTMAP, + emissiveMap: HAS_EMISSIVEMAP, + normalMapObjectSpace: HAS_NORMALMAP && material.normalMapType === ObjectSpaceNormalMap, + normalMapTangentSpace: HAS_NORMALMAP && material.normalMapType === TangentSpaceNormalMap, + metalnessMap: HAS_METALNESSMAP, + roughnessMap: HAS_ROUGHNESSMAP, + anisotropy: HAS_ANISOTROPY, + anisotropyMap: HAS_ANISOTROPYMAP, + clearcoat: HAS_CLEARCOAT, + clearcoatMap: HAS_CLEARCOATMAP, + clearcoatNormalMap: HAS_CLEARCOAT_NORMALMAP, + clearcoatRoughnessMap: HAS_CLEARCOAT_ROUGHNESSMAP, + dispersion: HAS_DISPERSION, + iridescence: HAS_IRIDESCENCE, + iridescenceMap: HAS_IRIDESCENCEMAP, + iridescenceThicknessMap: HAS_IRIDESCENCE_THICKNESSMAP, + sheen: HAS_SHEEN, + sheenColorMap: HAS_SHEEN_COLORMAP, + sheenRoughnessMap: HAS_SHEEN_ROUGHNESSMAP, + specularMap: HAS_SPECULARMAP, + specularColorMap: HAS_SPECULAR_COLORMAP, + specularIntensityMap: HAS_SPECULAR_INTENSITYMAP, + transmission: HAS_TRANSMISSION, + transmissionMap: HAS_TRANSMISSIONMAP, + thicknessMap: HAS_THICKNESSMAP, + gradientMap: HAS_GRADIENTMAP, + opaque: material.transparent === false && material.blending === NormalBlending && material.alphaToCoverage === false, + alphaMap: HAS_ALPHAMAP, + alphaTest: HAS_ALPHATEST, + alphaHash: HAS_ALPHAHASH, + combine: material.combine, + // + mapUv: HAS_MAP && getChannel(material.map.channel), + aoMapUv: HAS_AOMAP && getChannel(material.aoMap.channel), + lightMapUv: HAS_LIGHTMAP && getChannel(material.lightMap.channel), + bumpMapUv: HAS_BUMPMAP && getChannel(material.bumpMap.channel), + normalMapUv: HAS_NORMALMAP && getChannel(material.normalMap.channel), + displacementMapUv: HAS_DISPLACEMENTMAP && getChannel(material.displacementMap.channel), + emissiveMapUv: HAS_EMISSIVEMAP && getChannel(material.emissiveMap.channel), + metalnessMapUv: HAS_METALNESSMAP && getChannel(material.metalnessMap.channel), + roughnessMapUv: HAS_ROUGHNESSMAP && getChannel(material.roughnessMap.channel), + anisotropyMapUv: HAS_ANISOTROPYMAP && getChannel(material.anisotropyMap.channel), + clearcoatMapUv: HAS_CLEARCOATMAP && getChannel(material.clearcoatMap.channel), + clearcoatNormalMapUv: HAS_CLEARCOAT_NORMALMAP && getChannel(material.clearcoatNormalMap.channel), + clearcoatRoughnessMapUv: HAS_CLEARCOAT_ROUGHNESSMAP && getChannel(material.clearcoatRoughnessMap.channel), + iridescenceMapUv: HAS_IRIDESCENCEMAP && getChannel(material.iridescenceMap.channel), + iridescenceThicknessMapUv: HAS_IRIDESCENCE_THICKNESSMAP && getChannel(material.iridescenceThicknessMap.channel), + sheenColorMapUv: HAS_SHEEN_COLORMAP && getChannel(material.sheenColorMap.channel), + sheenRoughnessMapUv: HAS_SHEEN_ROUGHNESSMAP && getChannel(material.sheenRoughnessMap.channel), + specularMapUv: HAS_SPECULARMAP && getChannel(material.specularMap.channel), + specularColorMapUv: HAS_SPECULAR_COLORMAP && getChannel(material.specularColorMap.channel), + specularIntensityMapUv: HAS_SPECULAR_INTENSITYMAP && getChannel(material.specularIntensityMap.channel), + transmissionMapUv: HAS_TRANSMISSIONMAP && getChannel(material.transmissionMap.channel), + thicknessMapUv: HAS_THICKNESSMAP && getChannel(material.thicknessMap.channel), + alphaMapUv: HAS_ALPHAMAP && getChannel(material.alphaMap.channel), + // + vertexTangents: !!geometry.attributes.tangent && (HAS_NORMALMAP || HAS_ANISOTROPY), + vertexColors: material.vertexColors, + vertexAlphas: material.vertexColors === true && !!geometry.attributes.color && geometry.attributes.color.itemSize === 4, + pointsUvs: object.isPoints === true && !!geometry.attributes.uv && (HAS_MAP || HAS_ALPHAMAP), + fog: !!fog, + useFog: material.fog === true, + fogExp2: !!fog && fog.isFogExp2, + flatShading: material.flatShading === true, + sizeAttenuation: material.sizeAttenuation === true, + logarithmicDepthBuffer, + reverseDepthBuffer, + skinning: object.isSkinnedMesh === true, + morphTargets: geometry.morphAttributes.position !== void 0, + morphNormals: geometry.morphAttributes.normal !== void 0, + morphColors: geometry.morphAttributes.color !== void 0, + morphTargetsCount, + morphTextureStride, + numDirLights: lights.directional.length, + numPointLights: lights.point.length, + numSpotLights: lights.spot.length, + numSpotLightMaps: lights.spotLightMap.length, + numRectAreaLights: lights.rectArea.length, + numHemiLights: lights.hemi.length, + numDirLightShadows: lights.directionalShadowMap.length, + numPointLightShadows: lights.pointShadowMap.length, + numSpotLightShadows: lights.spotShadowMap.length, + numSpotLightShadowsWithMaps: lights.numSpotLightShadowsWithMaps, + numLightProbes: lights.numLightProbes, + numClippingPlanes: clipping.numPlanes, + numClipIntersection: clipping.numIntersection, + dithering: material.dithering, + shadowMapEnabled: renderer.shadowMap.enabled && shadows.length > 0, + shadowMapType: renderer.shadowMap.type, + toneMapping, + decodeVideoTexture: HAS_MAP && material.map.isVideoTexture === true && ColorManagement.getTransfer(material.map.colorSpace) === SRGBTransfer, + decodeVideoTextureEmissive: HAS_EMISSIVEMAP && material.emissiveMap.isVideoTexture === true && ColorManagement.getTransfer(material.emissiveMap.colorSpace) === SRGBTransfer, + premultipliedAlpha: material.premultipliedAlpha, + doubleSided: material.side === DoubleSide, + flipSided: material.side === BackSide, + useDepthPacking: material.depthPacking >= 0, + depthPacking: material.depthPacking || 0, + index0AttributeName: material.index0AttributeName, + extensionClipCullDistance: HAS_EXTENSIONS && material.extensions.clipCullDistance === true && extensions.has("WEBGL_clip_cull_distance"), + extensionMultiDraw: (HAS_EXTENSIONS && material.extensions.multiDraw === true || IS_BATCHEDMESH) && extensions.has("WEBGL_multi_draw"), + rendererExtensionParallelShaderCompile: extensions.has("KHR_parallel_shader_compile"), + customProgramCacheKey: material.customProgramCacheKey() + }; + parameters.vertexUv1s = _activeChannels.has(1); + parameters.vertexUv2s = _activeChannels.has(2); + parameters.vertexUv3s = _activeChannels.has(3); + _activeChannels.clear(); + return parameters; } - getPoint(t2, optionalTarget = new Vector2()) { - const point = optionalTarget; - if (t2 === 1) { - point.copy(this.v2); + __name(getParameters, "getParameters"); + function getProgramCacheKey(parameters) { + const array = []; + if (parameters.shaderID) { + array.push(parameters.shaderID); } else { - point.copy(this.v2).sub(this.v1); - point.multiplyScalar(t2).add(this.v1); + array.push(parameters.customVertexShaderID); + array.push(parameters.customFragmentShaderID); } - return point; - } - // Line curve is linear, so we can overwrite default getPointAt - getPointAt(u, optionalTarget) { - return this.getPoint(u, optionalTarget); - } - getTangent(t2, optionalTarget = new Vector2()) { - return optionalTarget.subVectors(this.v2, this.v1).normalize(); - } - getTangentAt(u, optionalTarget) { - return this.getTangent(u, optionalTarget); - } - copy(source) { - super.copy(source); - this.v1.copy(source.v1); - this.v2.copy(source.v2); - return this; - } - toJSON() { - const data = super.toJSON(); - data.v1 = this.v1.toArray(); - data.v2 = this.v2.toArray(); - return data; - } - fromJSON(json) { - super.fromJSON(json); - this.v1.fromArray(json.v1); - this.v2.fromArray(json.v2); - return this; + if (parameters.defines !== void 0) { + for (const name in parameters.defines) { + array.push(name); + array.push(parameters.defines[name]); + } + } + if (parameters.isRawShaderMaterial === false) { + getProgramCacheKeyParameters(array, parameters); + getProgramCacheKeyBooleans(array, parameters); + array.push(renderer.outputColorSpace); + } + array.push(parameters.customProgramCacheKey); + return array.join(); } -} -class LineCurve3 extends Curve { - static { - __name(this, "LineCurve3"); + __name(getProgramCacheKey, "getProgramCacheKey"); + function getProgramCacheKeyParameters(array, parameters) { + array.push(parameters.precision); + array.push(parameters.outputColorSpace); + array.push(parameters.envMapMode); + array.push(parameters.envMapCubeUVHeight); + array.push(parameters.mapUv); + array.push(parameters.alphaMapUv); + array.push(parameters.lightMapUv); + array.push(parameters.aoMapUv); + array.push(parameters.bumpMapUv); + array.push(parameters.normalMapUv); + array.push(parameters.displacementMapUv); + array.push(parameters.emissiveMapUv); + array.push(parameters.metalnessMapUv); + array.push(parameters.roughnessMapUv); + array.push(parameters.anisotropyMapUv); + array.push(parameters.clearcoatMapUv); + array.push(parameters.clearcoatNormalMapUv); + array.push(parameters.clearcoatRoughnessMapUv); + array.push(parameters.iridescenceMapUv); + array.push(parameters.iridescenceThicknessMapUv); + array.push(parameters.sheenColorMapUv); + array.push(parameters.sheenRoughnessMapUv); + array.push(parameters.specularMapUv); + array.push(parameters.specularColorMapUv); + array.push(parameters.specularIntensityMapUv); + array.push(parameters.transmissionMapUv); + array.push(parameters.thicknessMapUv); + array.push(parameters.combine); + array.push(parameters.fogExp2); + array.push(parameters.sizeAttenuation); + array.push(parameters.morphTargetsCount); + array.push(parameters.morphAttributeCount); + array.push(parameters.numDirLights); + array.push(parameters.numPointLights); + array.push(parameters.numSpotLights); + array.push(parameters.numSpotLightMaps); + array.push(parameters.numHemiLights); + array.push(parameters.numRectAreaLights); + array.push(parameters.numDirLightShadows); + array.push(parameters.numPointLightShadows); + array.push(parameters.numSpotLightShadows); + array.push(parameters.numSpotLightShadowsWithMaps); + array.push(parameters.numLightProbes); + array.push(parameters.shadowMapType); + array.push(parameters.toneMapping); + array.push(parameters.numClippingPlanes); + array.push(parameters.numClipIntersection); + array.push(parameters.depthPacking); } - constructor(v1 = new Vector3(), v2 = new Vector3()) { - super(); - this.isLineCurve3 = true; - this.type = "LineCurve3"; - this.v1 = v1; - this.v2 = v2; + __name(getProgramCacheKeyParameters, "getProgramCacheKeyParameters"); + function getProgramCacheKeyBooleans(array, parameters) { + _programLayers.disableAll(); + if (parameters.supportsVertexTextures) + _programLayers.enable(0); + if (parameters.instancing) + _programLayers.enable(1); + if (parameters.instancingColor) + _programLayers.enable(2); + if (parameters.instancingMorph) + _programLayers.enable(3); + if (parameters.matcap) + _programLayers.enable(4); + if (parameters.envMap) + _programLayers.enable(5); + if (parameters.normalMapObjectSpace) + _programLayers.enable(6); + if (parameters.normalMapTangentSpace) + _programLayers.enable(7); + if (parameters.clearcoat) + _programLayers.enable(8); + if (parameters.iridescence) + _programLayers.enable(9); + if (parameters.alphaTest) + _programLayers.enable(10); + if (parameters.vertexColors) + _programLayers.enable(11); + if (parameters.vertexAlphas) + _programLayers.enable(12); + if (parameters.vertexUv1s) + _programLayers.enable(13); + if (parameters.vertexUv2s) + _programLayers.enable(14); + if (parameters.vertexUv3s) + _programLayers.enable(15); + if (parameters.vertexTangents) + _programLayers.enable(16); + if (parameters.anisotropy) + _programLayers.enable(17); + if (parameters.alphaHash) + _programLayers.enable(18); + if (parameters.batching) + _programLayers.enable(19); + if (parameters.dispersion) + _programLayers.enable(20); + if (parameters.batchingColor) + _programLayers.enable(21); + array.push(_programLayers.mask); + _programLayers.disableAll(); + if (parameters.fog) + _programLayers.enable(0); + if (parameters.useFog) + _programLayers.enable(1); + if (parameters.flatShading) + _programLayers.enable(2); + if (parameters.logarithmicDepthBuffer) + _programLayers.enable(3); + if (parameters.reverseDepthBuffer) + _programLayers.enable(4); + if (parameters.skinning) + _programLayers.enable(5); + if (parameters.morphTargets) + _programLayers.enable(6); + if (parameters.morphNormals) + _programLayers.enable(7); + if (parameters.morphColors) + _programLayers.enable(8); + if (parameters.premultipliedAlpha) + _programLayers.enable(9); + if (parameters.shadowMapEnabled) + _programLayers.enable(10); + if (parameters.doubleSided) + _programLayers.enable(11); + if (parameters.flipSided) + _programLayers.enable(12); + if (parameters.useDepthPacking) + _programLayers.enable(13); + if (parameters.dithering) + _programLayers.enable(14); + if (parameters.transmission) + _programLayers.enable(15); + if (parameters.sheen) + _programLayers.enable(16); + if (parameters.opaque) + _programLayers.enable(17); + if (parameters.pointsUvs) + _programLayers.enable(18); + if (parameters.decodeVideoTexture) + _programLayers.enable(19); + if (parameters.decodeVideoTextureEmissive) + _programLayers.enable(20); + if (parameters.alphaToCoverage) + _programLayers.enable(21); + array.push(_programLayers.mask); } - getPoint(t2, optionalTarget = new Vector3()) { - const point = optionalTarget; - if (t2 === 1) { - point.copy(this.v2); + __name(getProgramCacheKeyBooleans, "getProgramCacheKeyBooleans"); + function getUniforms(material) { + const shaderID = shaderIDs[material.type]; + let uniforms; + if (shaderID) { + const shader = ShaderLib[shaderID]; + uniforms = UniformsUtils.clone(shader.uniforms); } else { - point.copy(this.v2).sub(this.v1); - point.multiplyScalar(t2).add(this.v1); + uniforms = material.uniforms; } - return point; - } - // Line curve is linear, so we can overwrite default getPointAt - getPointAt(u, optionalTarget) { - return this.getPoint(u, optionalTarget); - } - getTangent(t2, optionalTarget = new Vector3()) { - return optionalTarget.subVectors(this.v2, this.v1).normalize(); - } - getTangentAt(u, optionalTarget) { - return this.getTangent(u, optionalTarget); - } - copy(source) { - super.copy(source); - this.v1.copy(source.v1); - this.v2.copy(source.v2); - return this; - } - toJSON() { - const data = super.toJSON(); - data.v1 = this.v1.toArray(); - data.v2 = this.v2.toArray(); - return data; - } - fromJSON(json) { - super.fromJSON(json); - this.v1.fromArray(json.v1); - this.v2.fromArray(json.v2); - return this; - } -} -class QuadraticBezierCurve extends Curve { - static { - __name(this, "QuadraticBezierCurve"); - } - constructor(v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2()) { - super(); - this.isQuadraticBezierCurve = true; - this.type = "QuadraticBezierCurve"; - this.v0 = v0; - this.v1 = v1; - this.v2 = v2; + return uniforms; } - getPoint(t2, optionalTarget = new Vector2()) { - const point = optionalTarget; - const v0 = this.v0, v1 = this.v1, v2 = this.v2; - point.set( - QuadraticBezier(t2, v0.x, v1.x, v2.x), - QuadraticBezier(t2, v0.y, v1.y, v2.y) - ); - return point; + __name(getUniforms, "getUniforms"); + function acquireProgram(parameters, cacheKey) { + let program; + for (let p = 0, pl = programs.length; p < pl; p++) { + const preexistingProgram = programs[p]; + if (preexistingProgram.cacheKey === cacheKey) { + program = preexistingProgram; + ++program.usedTimes; + break; + } + } + if (program === void 0) { + program = new WebGLProgram(renderer, cacheKey, parameters, bindingStates); + programs.push(program); + } + return program; } - copy(source) { - super.copy(source); - this.v0.copy(source.v0); - this.v1.copy(source.v1); - this.v2.copy(source.v2); - return this; + __name(acquireProgram, "acquireProgram"); + function releaseProgram(program) { + if (--program.usedTimes === 0) { + const i = programs.indexOf(program); + programs[i] = programs[programs.length - 1]; + programs.pop(); + program.destroy(); + } } - toJSON() { - const data = super.toJSON(); - data.v0 = this.v0.toArray(); - data.v1 = this.v1.toArray(); - data.v2 = this.v2.toArray(); - return data; + __name(releaseProgram, "releaseProgram"); + function releaseShaderCache(material) { + _customShaders.remove(material); } - fromJSON(json) { - super.fromJSON(json); - this.v0.fromArray(json.v0); - this.v1.fromArray(json.v1); - this.v2.fromArray(json.v2); - return this; + __name(releaseShaderCache, "releaseShaderCache"); + function dispose() { + _customShaders.dispose(); } + __name(dispose, "dispose"); + return { + getParameters, + getProgramCacheKey, + getUniforms, + acquireProgram, + releaseProgram, + releaseShaderCache, + // Exposed for resource monitoring & error feedback via renderer.info: + programs, + dispose + }; } -class QuadraticBezierCurve3 extends Curve { - static { - __name(this, "QuadraticBezierCurve3"); - } - constructor(v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3()) { - super(); - this.isQuadraticBezierCurve3 = true; - this.type = "QuadraticBezierCurve3"; - this.v0 = v0; - this.v1 = v1; - this.v2 = v2; +__name(WebGLPrograms, "WebGLPrograms"); +function WebGLProperties() { + let properties = /* @__PURE__ */ new WeakMap(); + function has(object) { + return properties.has(object); } - getPoint(t2, optionalTarget = new Vector3()) { - const point = optionalTarget; - const v0 = this.v0, v1 = this.v1, v2 = this.v2; - point.set( - QuadraticBezier(t2, v0.x, v1.x, v2.x), - QuadraticBezier(t2, v0.y, v1.y, v2.y), - QuadraticBezier(t2, v0.z, v1.z, v2.z) - ); - return point; + __name(has, "has"); + function get(object) { + let map = properties.get(object); + if (map === void 0) { + map = {}; + properties.set(object, map); + } + return map; } - copy(source) { - super.copy(source); - this.v0.copy(source.v0); - this.v1.copy(source.v1); - this.v2.copy(source.v2); - return this; + __name(get, "get"); + function remove(object) { + properties.delete(object); } - toJSON() { - const data = super.toJSON(); - data.v0 = this.v0.toArray(); - data.v1 = this.v1.toArray(); - data.v2 = this.v2.toArray(); - return data; + __name(remove, "remove"); + function update(object, key, value) { + properties.get(object)[key] = value; } - fromJSON(json) { - super.fromJSON(json); - this.v0.fromArray(json.v0); - this.v1.fromArray(json.v1); - this.v2.fromArray(json.v2); - return this; + __name(update, "update"); + function dispose() { + properties = /* @__PURE__ */ new WeakMap(); } + __name(dispose, "dispose"); + return { + has, + get, + remove, + update, + dispose + }; } -class SplineCurve extends Curve { - static { - __name(this, "SplineCurve"); +__name(WebGLProperties, "WebGLProperties"); +function painterSortStable(a, b) { + if (a.groupOrder !== b.groupOrder) { + return a.groupOrder - b.groupOrder; + } else if (a.renderOrder !== b.renderOrder) { + return a.renderOrder - b.renderOrder; + } else if (a.material.id !== b.material.id) { + return a.material.id - b.material.id; + } else if (a.z !== b.z) { + return a.z - b.z; + } else { + return a.id - b.id; } - constructor(points = []) { - super(); - this.isSplineCurve = true; - this.type = "SplineCurve"; - this.points = points; +} +__name(painterSortStable, "painterSortStable"); +function reversePainterSortStable(a, b) { + if (a.groupOrder !== b.groupOrder) { + return a.groupOrder - b.groupOrder; + } else if (a.renderOrder !== b.renderOrder) { + return a.renderOrder - b.renderOrder; + } else if (a.z !== b.z) { + return b.z - a.z; + } else { + return a.id - b.id; } - getPoint(t2, optionalTarget = new Vector2()) { - const point = optionalTarget; - const points = this.points; - const p = (points.length - 1) * t2; - const intPoint = Math.floor(p); - const weight = p - intPoint; - const p0 = points[intPoint === 0 ? intPoint : intPoint - 1]; - const p1 = points[intPoint]; - const p2 = points[intPoint > points.length - 2 ? points.length - 1 : intPoint + 1]; - const p3 = points[intPoint > points.length - 3 ? points.length - 1 : intPoint + 2]; - point.set( - CatmullRom(weight, p0.x, p1.x, p2.x, p3.x), - CatmullRom(weight, p0.y, p1.y, p2.y, p3.y) - ); - return point; +} +__name(reversePainterSortStable, "reversePainterSortStable"); +function WebGLRenderList() { + const renderItems = []; + let renderItemsIndex = 0; + const opaque = []; + const transmissive = []; + const transparent = []; + function init() { + renderItemsIndex = 0; + opaque.length = 0; + transmissive.length = 0; + transparent.length = 0; } - copy(source) { - super.copy(source); - this.points = []; - for (let i = 0, l = source.points.length; i < l; i++) { - const point = source.points[i]; - this.points.push(point.clone()); + __name(init, "init"); + function getNextRenderItem(object, geometry, material, groupOrder, z, group) { + let renderItem = renderItems[renderItemsIndex]; + if (renderItem === void 0) { + renderItem = { + id: object.id, + object, + geometry, + material, + groupOrder, + renderOrder: object.renderOrder, + z, + group + }; + renderItems[renderItemsIndex] = renderItem; + } else { + renderItem.id = object.id; + renderItem.object = object; + renderItem.geometry = geometry; + renderItem.material = material; + renderItem.groupOrder = groupOrder; + renderItem.renderOrder = object.renderOrder; + renderItem.z = z; + renderItem.group = group; } - return this; + renderItemsIndex++; + return renderItem; } - toJSON() { - const data = super.toJSON(); - data.points = []; - for (let i = 0, l = this.points.length; i < l; i++) { - const point = this.points[i]; - data.points.push(point.toArray()); + __name(getNextRenderItem, "getNextRenderItem"); + function push(object, geometry, material, groupOrder, z, group) { + const renderItem = getNextRenderItem(object, geometry, material, groupOrder, z, group); + if (material.transmission > 0) { + transmissive.push(renderItem); + } else if (material.transparent === true) { + transparent.push(renderItem); + } else { + opaque.push(renderItem); } - return data; } - fromJSON(json) { - super.fromJSON(json); - this.points = []; - for (let i = 0, l = json.points.length; i < l; i++) { - const point = json.points[i]; - this.points.push(new Vector2().fromArray(point)); + __name(push, "push"); + function unshift(object, geometry, material, groupOrder, z, group) { + const renderItem = getNextRenderItem(object, geometry, material, groupOrder, z, group); + if (material.transmission > 0) { + transmissive.unshift(renderItem); + } else if (material.transparent === true) { + transparent.unshift(renderItem); + } else { + opaque.unshift(renderItem); } - return this; - } -} -var Curves = /* @__PURE__ */ Object.freeze({ - __proto__: null, - ArcCurve, - CatmullRomCurve3, - CubicBezierCurve, - CubicBezierCurve3, - EllipseCurve, - LineCurve, - LineCurve3, - QuadraticBezierCurve, - QuadraticBezierCurve3, - SplineCurve -}); -class CurvePath extends Curve { - static { - __name(this, "CurvePath"); } - constructor() { - super(); - this.type = "CurvePath"; - this.curves = []; - this.autoClose = false; + __name(unshift, "unshift"); + function sort(customOpaqueSort, customTransparentSort) { + if (opaque.length > 1) opaque.sort(customOpaqueSort || painterSortStable); + if (transmissive.length > 1) transmissive.sort(customTransparentSort || reversePainterSortStable); + if (transparent.length > 1) transparent.sort(customTransparentSort || reversePainterSortStable); } - add(curve) { - this.curves.push(curve); + __name(sort, "sort"); + function finish() { + for (let i = renderItemsIndex, il = renderItems.length; i < il; i++) { + const renderItem = renderItems[i]; + if (renderItem.id === null) break; + renderItem.id = null; + renderItem.object = null; + renderItem.geometry = null; + renderItem.material = null; + renderItem.group = null; + } } - closePath() { - const startPoint = this.curves[0].getPoint(0); - const endPoint = this.curves[this.curves.length - 1].getPoint(1); - if (!startPoint.equals(endPoint)) { - const lineType = startPoint.isVector2 === true ? "LineCurve" : "LineCurve3"; - this.curves.push(new Curves[lineType](endPoint, startPoint)); + __name(finish, "finish"); + return { + opaque, + transmissive, + transparent, + init, + push, + unshift, + finish, + sort + }; +} +__name(WebGLRenderList, "WebGLRenderList"); +function WebGLRenderLists() { + let lists = /* @__PURE__ */ new WeakMap(); + function get(scene, renderCallDepth) { + const listArray = lists.get(scene); + let list; + if (listArray === void 0) { + list = new WebGLRenderList(); + lists.set(scene, [list]); + } else { + if (renderCallDepth >= listArray.length) { + list = new WebGLRenderList(); + listArray.push(list); + } else { + list = listArray[renderCallDepth]; + } } - return this; + return list; } - // To get accurate point with reference to - // entire path distance at time t, - // following has to be done: - // 1. Length of each sub path have to be known - // 2. Locate and identify type of curve - // 3. Get t for the curve - // 4. Return curve.getPointAt(t') - getPoint(t2, optionalTarget) { - const d = t2 * this.getLength(); - const curveLengths = this.getCurveLengths(); - let i = 0; - while (i < curveLengths.length) { - if (curveLengths[i] >= d) { - const diff = curveLengths[i] - d; - const curve = this.curves[i]; - const segmentLength = curve.getLength(); - const u = segmentLength === 0 ? 0 : 1 - diff / segmentLength; - return curve.getPointAt(u, optionalTarget); + __name(get, "get"); + function dispose() { + lists = /* @__PURE__ */ new WeakMap(); + } + __name(dispose, "dispose"); + return { + get, + dispose + }; +} +__name(WebGLRenderLists, "WebGLRenderLists"); +function UniformsCache() { + const lights = {}; + return { + get: /* @__PURE__ */ __name(function(light) { + if (lights[light.id] !== void 0) { + return lights[light.id]; + } + let uniforms; + switch (light.type) { + case "DirectionalLight": + uniforms = { + direction: new Vector3(), + color: new Color() + }; + break; + case "SpotLight": + uniforms = { + position: new Vector3(), + direction: new Vector3(), + color: new Color(), + distance: 0, + coneCos: 0, + penumbraCos: 0, + decay: 0 + }; + break; + case "PointLight": + uniforms = { + position: new Vector3(), + color: new Color(), + distance: 0, + decay: 0 + }; + break; + case "HemisphereLight": + uniforms = { + direction: new Vector3(), + skyColor: new Color(), + groundColor: new Color() + }; + break; + case "RectAreaLight": + uniforms = { + color: new Color(), + position: new Vector3(), + halfWidth: new Vector3(), + halfHeight: new Vector3() + }; + break; + } + lights[light.id] = uniforms; + return uniforms; + }, "get") + }; +} +__name(UniformsCache, "UniformsCache"); +function ShadowUniformsCache() { + const lights = {}; + return { + get: /* @__PURE__ */ __name(function(light) { + if (lights[light.id] !== void 0) { + return lights[light.id]; + } + let uniforms; + switch (light.type) { + case "DirectionalLight": + uniforms = { + shadowIntensity: 1, + shadowBias: 0, + shadowNormalBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + case "SpotLight": + uniforms = { + shadowIntensity: 1, + shadowBias: 0, + shadowNormalBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + case "PointLight": + uniforms = { + shadowIntensity: 1, + shadowBias: 0, + shadowNormalBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2(), + shadowCameraNear: 1, + shadowCameraFar: 1e3 + }; + break; + } + lights[light.id] = uniforms; + return uniforms; + }, "get") + }; +} +__name(ShadowUniformsCache, "ShadowUniformsCache"); +let nextVersion = 0; +function shadowCastingAndTexturingLightsFirst(lightA, lightB) { + return (lightB.castShadow ? 2 : 0) - (lightA.castShadow ? 2 : 0) + (lightB.map ? 1 : 0) - (lightA.map ? 1 : 0); +} +__name(shadowCastingAndTexturingLightsFirst, "shadowCastingAndTexturingLightsFirst"); +function WebGLLights(extensions) { + const cache = new UniformsCache(); + const shadowCache = ShadowUniformsCache(); + const state = { + version: 0, + hash: { + directionalLength: -1, + pointLength: -1, + spotLength: -1, + rectAreaLength: -1, + hemiLength: -1, + numDirectionalShadows: -1, + numPointShadows: -1, + numSpotShadows: -1, + numSpotMaps: -1, + numLightProbes: -1 + }, + ambient: [0, 0, 0], + probe: [], + directional: [], + directionalShadow: [], + directionalShadowMap: [], + directionalShadowMatrix: [], + spot: [], + spotLightMap: [], + spotShadow: [], + spotShadowMap: [], + spotLightMatrix: [], + rectArea: [], + rectAreaLTC1: null, + rectAreaLTC2: null, + point: [], + pointShadow: [], + pointShadowMap: [], + pointShadowMatrix: [], + hemi: [], + numSpotLightShadowsWithMaps: 0, + numLightProbes: 0 + }; + for (let i = 0; i < 9; i++) state.probe.push(new Vector3()); + const vector3 = new Vector3(); + const matrix4 = new Matrix4(); + const matrix42 = new Matrix4(); + function setup(lights) { + let r = 0, g = 0, b = 0; + for (let i = 0; i < 9; i++) state.probe[i].set(0, 0, 0); + let directionalLength = 0; + let pointLength = 0; + let spotLength = 0; + let rectAreaLength = 0; + let hemiLength = 0; + let numDirectionalShadows = 0; + let numPointShadows = 0; + let numSpotShadows = 0; + let numSpotMaps = 0; + let numSpotShadowsWithMaps = 0; + let numLightProbes = 0; + lights.sort(shadowCastingAndTexturingLightsFirst); + for (let i = 0, l = lights.length; i < l; i++) { + const light = lights[i]; + const color = light.color; + const intensity = light.intensity; + const distance = light.distance; + const shadowMap = light.shadow && light.shadow.map ? light.shadow.map.texture : null; + if (light.isAmbientLight) { + r += color.r * intensity; + g += color.g * intensity; + b += color.b * intensity; + } else if (light.isLightProbe) { + for (let j = 0; j < 9; j++) { + state.probe[j].addScaledVector(light.sh.coefficients[j], intensity); + } + numLightProbes++; + } else if (light.isDirectionalLight) { + const uniforms = cache.get(light); + uniforms.color.copy(light.color).multiplyScalar(light.intensity); + if (light.castShadow) { + const shadow = light.shadow; + const shadowUniforms = shadowCache.get(light); + shadowUniforms.shadowIntensity = shadow.intensity; + shadowUniforms.shadowBias = shadow.bias; + shadowUniforms.shadowNormalBias = shadow.normalBias; + shadowUniforms.shadowRadius = shadow.radius; + shadowUniforms.shadowMapSize = shadow.mapSize; + state.directionalShadow[directionalLength] = shadowUniforms; + state.directionalShadowMap[directionalLength] = shadowMap; + state.directionalShadowMatrix[directionalLength] = light.shadow.matrix; + numDirectionalShadows++; + } + state.directional[directionalLength] = uniforms; + directionalLength++; + } else if (light.isSpotLight) { + const uniforms = cache.get(light); + uniforms.position.setFromMatrixPosition(light.matrixWorld); + uniforms.color.copy(color).multiplyScalar(intensity); + uniforms.distance = distance; + uniforms.coneCos = Math.cos(light.angle); + uniforms.penumbraCos = Math.cos(light.angle * (1 - light.penumbra)); + uniforms.decay = light.decay; + state.spot[spotLength] = uniforms; + const shadow = light.shadow; + if (light.map) { + state.spotLightMap[numSpotMaps] = light.map; + numSpotMaps++; + shadow.updateMatrices(light); + if (light.castShadow) numSpotShadowsWithMaps++; + } + state.spotLightMatrix[spotLength] = shadow.matrix; + if (light.castShadow) { + const shadowUniforms = shadowCache.get(light); + shadowUniforms.shadowIntensity = shadow.intensity; + shadowUniforms.shadowBias = shadow.bias; + shadowUniforms.shadowNormalBias = shadow.normalBias; + shadowUniforms.shadowRadius = shadow.radius; + shadowUniforms.shadowMapSize = shadow.mapSize; + state.spotShadow[spotLength] = shadowUniforms; + state.spotShadowMap[spotLength] = shadowMap; + numSpotShadows++; + } + spotLength++; + } else if (light.isRectAreaLight) { + const uniforms = cache.get(light); + uniforms.color.copy(color).multiplyScalar(intensity); + uniforms.halfWidth.set(light.width * 0.5, 0, 0); + uniforms.halfHeight.set(0, light.height * 0.5, 0); + state.rectArea[rectAreaLength] = uniforms; + rectAreaLength++; + } else if (light.isPointLight) { + const uniforms = cache.get(light); + uniforms.color.copy(light.color).multiplyScalar(light.intensity); + uniforms.distance = light.distance; + uniforms.decay = light.decay; + if (light.castShadow) { + const shadow = light.shadow; + const shadowUniforms = shadowCache.get(light); + shadowUniforms.shadowIntensity = shadow.intensity; + shadowUniforms.shadowBias = shadow.bias; + shadowUniforms.shadowNormalBias = shadow.normalBias; + shadowUniforms.shadowRadius = shadow.radius; + shadowUniforms.shadowMapSize = shadow.mapSize; + shadowUniforms.shadowCameraNear = shadow.camera.near; + shadowUniforms.shadowCameraFar = shadow.camera.far; + state.pointShadow[pointLength] = shadowUniforms; + state.pointShadowMap[pointLength] = shadowMap; + state.pointShadowMatrix[pointLength] = light.shadow.matrix; + numPointShadows++; + } + state.point[pointLength] = uniforms; + pointLength++; + } else if (light.isHemisphereLight) { + const uniforms = cache.get(light); + uniforms.skyColor.copy(light.color).multiplyScalar(intensity); + uniforms.groundColor.copy(light.groundColor).multiplyScalar(intensity); + state.hemi[hemiLength] = uniforms; + hemiLength++; } - i++; - } - return null; - } - // We cannot use the default THREE.Curve getPoint() with getLength() because in - // THREE.Curve, getLength() depends on getPoint() but in THREE.CurvePath - // getPoint() depends on getLength - getLength() { - const lens = this.getCurveLengths(); - return lens[lens.length - 1]; - } - // cacheLengths must be recalculated. - updateArcLengths() { - this.needsUpdate = true; - this.cacheLengths = null; - this.getCurveLengths(); - } - // Compute lengths and cache them - // We cannot overwrite getLengths() because UtoT mapping uses it. - getCurveLengths() { - if (this.cacheLengths && this.cacheLengths.length === this.curves.length) { - return this.cacheLengths; - } - const lengths = []; - let sums = 0; - for (let i = 0, l = this.curves.length; i < l; i++) { - sums += this.curves[i].getLength(); - lengths.push(sums); - } - this.cacheLengths = lengths; - return lengths; - } - getSpacedPoints(divisions = 40) { - const points = []; - for (let i = 0; i <= divisions; i++) { - points.push(this.getPoint(i / divisions)); - } - if (this.autoClose) { - points.push(points[0]); } - return points; - } - getPoints(divisions = 12) { - const points = []; - let last; - for (let i = 0, curves = this.curves; i < curves.length; i++) { - const curve = curves[i]; - const resolution = curve.isEllipseCurve ? divisions * 2 : curve.isLineCurve || curve.isLineCurve3 ? 1 : curve.isSplineCurve ? divisions * curve.points.length : divisions; - const pts = curve.getPoints(resolution); - for (let j = 0; j < pts.length; j++) { - const point = pts[j]; - if (last && last.equals(point)) continue; - points.push(point); - last = point; + if (rectAreaLength > 0) { + if (extensions.has("OES_texture_float_linear") === true) { + state.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1; + state.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2; + } else { + state.rectAreaLTC1 = UniformsLib.LTC_HALF_1; + state.rectAreaLTC2 = UniformsLib.LTC_HALF_2; } } - if (this.autoClose && points.length > 1 && !points[points.length - 1].equals(points[0])) { - points.push(points[0]); - } - return points; - } - copy(source) { - super.copy(source); - this.curves = []; - for (let i = 0, l = source.curves.length; i < l; i++) { - const curve = source.curves[i]; - this.curves.push(curve.clone()); - } - this.autoClose = source.autoClose; - return this; - } - toJSON() { - const data = super.toJSON(); - data.autoClose = this.autoClose; - data.curves = []; - for (let i = 0, l = this.curves.length; i < l; i++) { - const curve = this.curves[i]; - data.curves.push(curve.toJSON()); + state.ambient[0] = r; + state.ambient[1] = g; + state.ambient[2] = b; + const hash = state.hash; + if (hash.directionalLength !== directionalLength || hash.pointLength !== pointLength || hash.spotLength !== spotLength || hash.rectAreaLength !== rectAreaLength || hash.hemiLength !== hemiLength || hash.numDirectionalShadows !== numDirectionalShadows || hash.numPointShadows !== numPointShadows || hash.numSpotShadows !== numSpotShadows || hash.numSpotMaps !== numSpotMaps || hash.numLightProbes !== numLightProbes) { + state.directional.length = directionalLength; + state.spot.length = spotLength; + state.rectArea.length = rectAreaLength; + state.point.length = pointLength; + state.hemi.length = hemiLength; + state.directionalShadow.length = numDirectionalShadows; + state.directionalShadowMap.length = numDirectionalShadows; + state.pointShadow.length = numPointShadows; + state.pointShadowMap.length = numPointShadows; + state.spotShadow.length = numSpotShadows; + state.spotShadowMap.length = numSpotShadows; + state.directionalShadowMatrix.length = numDirectionalShadows; + state.pointShadowMatrix.length = numPointShadows; + state.spotLightMatrix.length = numSpotShadows + numSpotMaps - numSpotShadowsWithMaps; + state.spotLightMap.length = numSpotMaps; + state.numSpotLightShadowsWithMaps = numSpotShadowsWithMaps; + state.numLightProbes = numLightProbes; + hash.directionalLength = directionalLength; + hash.pointLength = pointLength; + hash.spotLength = spotLength; + hash.rectAreaLength = rectAreaLength; + hash.hemiLength = hemiLength; + hash.numDirectionalShadows = numDirectionalShadows; + hash.numPointShadows = numPointShadows; + hash.numSpotShadows = numSpotShadows; + hash.numSpotMaps = numSpotMaps; + hash.numLightProbes = numLightProbes; + state.version = nextVersion++; } - return data; } - fromJSON(json) { - super.fromJSON(json); - this.autoClose = json.autoClose; - this.curves = []; - for (let i = 0, l = json.curves.length; i < l; i++) { - const curve = json.curves[i]; - this.curves.push(new Curves[curve.type]().fromJSON(curve)); + __name(setup, "setup"); + function setupView(lights, camera) { + let directionalLength = 0; + let pointLength = 0; + let spotLength = 0; + let rectAreaLength = 0; + let hemiLength = 0; + const viewMatrix = camera.matrixWorldInverse; + for (let i = 0, l = lights.length; i < l; i++) { + const light = lights[i]; + if (light.isDirectionalLight) { + const uniforms = state.directional[directionalLength]; + uniforms.direction.setFromMatrixPosition(light.matrixWorld); + vector3.setFromMatrixPosition(light.target.matrixWorld); + uniforms.direction.sub(vector3); + uniforms.direction.transformDirection(viewMatrix); + directionalLength++; + } else if (light.isSpotLight) { + const uniforms = state.spot[spotLength]; + uniforms.position.setFromMatrixPosition(light.matrixWorld); + uniforms.position.applyMatrix4(viewMatrix); + uniforms.direction.setFromMatrixPosition(light.matrixWorld); + vector3.setFromMatrixPosition(light.target.matrixWorld); + uniforms.direction.sub(vector3); + uniforms.direction.transformDirection(viewMatrix); + spotLength++; + } else if (light.isRectAreaLight) { + const uniforms = state.rectArea[rectAreaLength]; + uniforms.position.setFromMatrixPosition(light.matrixWorld); + uniforms.position.applyMatrix4(viewMatrix); + matrix42.identity(); + matrix4.copy(light.matrixWorld); + matrix4.premultiply(viewMatrix); + matrix42.extractRotation(matrix4); + uniforms.halfWidth.set(light.width * 0.5, 0, 0); + uniforms.halfHeight.set(0, light.height * 0.5, 0); + uniforms.halfWidth.applyMatrix4(matrix42); + uniforms.halfHeight.applyMatrix4(matrix42); + rectAreaLength++; + } else if (light.isPointLight) { + const uniforms = state.point[pointLength]; + uniforms.position.setFromMatrixPosition(light.matrixWorld); + uniforms.position.applyMatrix4(viewMatrix); + pointLength++; + } else if (light.isHemisphereLight) { + const uniforms = state.hemi[hemiLength]; + uniforms.direction.setFromMatrixPosition(light.matrixWorld); + uniforms.direction.transformDirection(viewMatrix); + hemiLength++; + } } - return this; } + __name(setupView, "setupView"); + return { + setup, + setupView, + state + }; } -class Path extends CurvePath { - static { - __name(this, "Path"); - } - constructor(points) { - super(); - this.type = "Path"; - this.currentPoint = new Vector2(); - if (points) { - this.setFromPoints(points); - } - } - setFromPoints(points) { - this.moveTo(points[0].x, points[0].y); - for (let i = 1, l = points.length; i < l; i++) { - this.lineTo(points[i].x, points[i].y); - } - return this; - } - moveTo(x, y) { - this.currentPoint.set(x, y); - return this; - } - lineTo(x, y) { - const curve = new LineCurve(this.currentPoint.clone(), new Vector2(x, y)); - this.curves.push(curve); - this.currentPoint.set(x, y); - return this; - } - quadraticCurveTo(aCPx, aCPy, aX, aY) { - const curve = new QuadraticBezierCurve( - this.currentPoint.clone(), - new Vector2(aCPx, aCPy), - new Vector2(aX, aY) - ); - this.curves.push(curve); - this.currentPoint.set(aX, aY); - return this; - } - bezierCurveTo(aCP1x, aCP1y, aCP2x, aCP2y, aX, aY) { - const curve = new CubicBezierCurve( - this.currentPoint.clone(), - new Vector2(aCP1x, aCP1y), - new Vector2(aCP2x, aCP2y), - new Vector2(aX, aY) - ); - this.curves.push(curve); - this.currentPoint.set(aX, aY); - return this; +__name(WebGLLights, "WebGLLights"); +function WebGLRenderState(extensions) { + const lights = new WebGLLights(extensions); + const lightsArray = []; + const shadowsArray = []; + function init(camera) { + state.camera = camera; + lightsArray.length = 0; + shadowsArray.length = 0; } - splineThru(pts) { - const npts = [this.currentPoint.clone()].concat(pts); - const curve = new SplineCurve(npts); - this.curves.push(curve); - this.currentPoint.copy(pts[pts.length - 1]); - return this; + __name(init, "init"); + function pushLight(light) { + lightsArray.push(light); } - arc(aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise) { - const x0 = this.currentPoint.x; - const y0 = this.currentPoint.y; - this.absarc( - aX + x0, - aY + y0, - aRadius, - aStartAngle, - aEndAngle, - aClockwise - ); - return this; + __name(pushLight, "pushLight"); + function pushShadow(shadowLight) { + shadowsArray.push(shadowLight); } - absarc(aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise) { - this.absellipse(aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise); - return this; + __name(pushShadow, "pushShadow"); + function setupLights() { + lights.setup(lightsArray); } - ellipse(aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation) { - const x0 = this.currentPoint.x; - const y0 = this.currentPoint.y; - this.absellipse(aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation); - return this; + __name(setupLights, "setupLights"); + function setupLightsView(camera) { + lights.setupView(lightsArray, camera); } - absellipse(aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation) { - const curve = new EllipseCurve(aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation); - if (this.curves.length > 0) { - const firstPoint = curve.getPoint(0); - if (!firstPoint.equals(this.currentPoint)) { - this.lineTo(firstPoint.x, firstPoint.y); + __name(setupLightsView, "setupLightsView"); + const state = { + lightsArray, + shadowsArray, + camera: null, + lights, + transmissionRenderTarget: {} + }; + return { + init, + state, + setupLights, + setupLightsView, + pushLight, + pushShadow + }; +} +__name(WebGLRenderState, "WebGLRenderState"); +function WebGLRenderStates(extensions) { + let renderStates = /* @__PURE__ */ new WeakMap(); + function get(scene, renderCallDepth = 0) { + const renderStateArray = renderStates.get(scene); + let renderState; + if (renderStateArray === void 0) { + renderState = new WebGLRenderState(extensions); + renderStates.set(scene, [renderState]); + } else { + if (renderCallDepth >= renderStateArray.length) { + renderState = new WebGLRenderState(extensions); + renderStateArray.push(renderState); + } else { + renderState = renderStateArray[renderCallDepth]; } } - this.curves.push(curve); - const lastPoint = curve.getPoint(1); - this.currentPoint.copy(lastPoint); - return this; - } - copy(source) { - super.copy(source); - this.currentPoint.copy(source.currentPoint); - return this; - } - toJSON() { - const data = super.toJSON(); - data.currentPoint = this.currentPoint.toArray(); - return data; + return renderState; } - fromJSON(json) { - super.fromJSON(json); - this.currentPoint.fromArray(json.currentPoint); - return this; + __name(get, "get"); + function dispose() { + renderStates = /* @__PURE__ */ new WeakMap(); } + __name(dispose, "dispose"); + return { + get, + dispose + }; } -class LatheGeometry extends BufferGeometry { +__name(WebGLRenderStates, "WebGLRenderStates"); +class MeshDepthMaterial extends Material { static { - __name(this, "LatheGeometry"); + __name(this, "MeshDepthMaterial"); } - constructor(points = [new Vector2(0, -0.5), new Vector2(0.5, 0), new Vector2(0, 0.5)], segments = 12, phiStart = 0, phiLength = Math.PI * 2) { + static get type() { + return "MeshDepthMaterial"; + } + constructor(parameters) { super(); - this.type = "LatheGeometry"; - this.parameters = { - points, - segments, - phiStart, - phiLength - }; - segments = Math.floor(segments); - phiLength = clamp(phiLength, 0, Math.PI * 2); - const indices = []; - const vertices = []; - const uvs = []; - const initNormals = []; - const normals = []; - const inverseSegments = 1 / segments; - const vertex2 = new Vector3(); - const uv = new Vector2(); - const normal = new Vector3(); - const curNormal = new Vector3(); - const prevNormal = new Vector3(); - let dx = 0; - let dy = 0; - for (let j = 0; j <= points.length - 1; j++) { - switch (j) { - case 0: - dx = points[j + 1].x - points[j].x; - dy = points[j + 1].y - points[j].y; - normal.x = dy * 1; - normal.y = -dx; - normal.z = dy * 0; - prevNormal.copy(normal); - normal.normalize(); - initNormals.push(normal.x, normal.y, normal.z); - break; - case points.length - 1: - initNormals.push(prevNormal.x, prevNormal.y, prevNormal.z); - break; - default: - dx = points[j + 1].x - points[j].x; - dy = points[j + 1].y - points[j].y; - normal.x = dy * 1; - normal.y = -dx; - normal.z = dy * 0; - curNormal.copy(normal); - normal.x += prevNormal.x; - normal.y += prevNormal.y; - normal.z += prevNormal.z; - normal.normalize(); - initNormals.push(normal.x, normal.y, normal.z); - prevNormal.copy(curNormal); - } - } - for (let i = 0; i <= segments; i++) { - const phi = phiStart + i * inverseSegments * phiLength; - const sin = Math.sin(phi); - const cos = Math.cos(phi); - for (let j = 0; j <= points.length - 1; j++) { - vertex2.x = points[j].x * sin; - vertex2.y = points[j].y; - vertex2.z = points[j].x * cos; - vertices.push(vertex2.x, vertex2.y, vertex2.z); - uv.x = i / segments; - uv.y = j / (points.length - 1); - uvs.push(uv.x, uv.y); - const x = initNormals[3 * j + 0] * sin; - const y = initNormals[3 * j + 1]; - const z = initNormals[3 * j + 0] * cos; - normals.push(x, y, z); - } - } - for (let i = 0; i < segments; i++) { - for (let j = 0; j < points.length - 1; j++) { - const base = j + i * points.length; - const a = base; - const b = base + points.length; - const c = base + points.length + 1; - const d = base + 1; - indices.push(a, b, d); - indices.push(c, d, b); - } - } - this.setIndex(indices); - this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); - this.setAttribute("uv", new Float32BufferAttribute(uvs, 2)); - this.setAttribute("normal", new Float32BufferAttribute(normals, 3)); + this.isMeshDepthMaterial = true; + this.depthPacking = BasicDepthPacking; + this.map = null; + this.alphaMap = null; + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + this.wireframe = false; + this.wireframeLinewidth = 1; + this.setValues(parameters); } copy(source) { super.copy(source); - this.parameters = Object.assign({}, source.parameters); - return this; - } - static fromJSON(data) { - return new LatheGeometry(data.points, data.segments, data.phiStart, data.phiLength); - } -} -class CapsuleGeometry extends LatheGeometry { - static { - __name(this, "CapsuleGeometry"); - } - constructor(radius = 1, length = 1, capSegments = 4, radialSegments = 8) { - const path = new Path(); - path.absarc(0, -length / 2, radius, Math.PI * 1.5, 0); - path.absarc(0, length / 2, radius, 0, Math.PI * 0.5); - super(path.getPoints(capSegments), radialSegments); - this.type = "CapsuleGeometry"; - this.parameters = { - radius, - length, - capSegments, - radialSegments - }; - } - static fromJSON(data) { - return new CapsuleGeometry(data.radius, data.length, data.capSegments, data.radialSegments); + this.depthPacking = source.depthPacking; + this.map = source.map; + this.alphaMap = source.alphaMap; + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + return this; } } -class CircleGeometry extends BufferGeometry { +class MeshDistanceMaterial extends Material { static { - __name(this, "CircleGeometry"); + __name(this, "MeshDistanceMaterial"); } - constructor(radius = 1, segments = 32, thetaStart = 0, thetaLength = Math.PI * 2) { + static get type() { + return "MeshDistanceMaterial"; + } + constructor(parameters) { super(); - this.type = "CircleGeometry"; - this.parameters = { - radius, - segments, - thetaStart, - thetaLength - }; - segments = Math.max(3, segments); - const indices = []; - const vertices = []; - const normals = []; - const uvs = []; - const vertex2 = new Vector3(); - const uv = new Vector2(); - vertices.push(0, 0, 0); - normals.push(0, 0, 1); - uvs.push(0.5, 0.5); - for (let s = 0, i = 3; s <= segments; s++, i += 3) { - const segment = thetaStart + s / segments * thetaLength; - vertex2.x = radius * Math.cos(segment); - vertex2.y = radius * Math.sin(segment); - vertices.push(vertex2.x, vertex2.y, vertex2.z); - normals.push(0, 0, 1); - uv.x = (vertices[i] / radius + 1) / 2; - uv.y = (vertices[i + 1] / radius + 1) / 2; - uvs.push(uv.x, uv.y); - } - for (let i = 1; i <= segments; i++) { - indices.push(i, i + 1, 0); - } - this.setIndex(indices); - this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); - this.setAttribute("normal", new Float32BufferAttribute(normals, 3)); - this.setAttribute("uv", new Float32BufferAttribute(uvs, 2)); + this.isMeshDistanceMaterial = true; + this.map = null; + this.alphaMap = null; + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + this.setValues(parameters); } copy(source) { super.copy(source); - this.parameters = Object.assign({}, source.parameters); + this.map = source.map; + this.alphaMap = source.alphaMap; + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; return this; } - static fromJSON(data) { - return new CircleGeometry(data.radius, data.segments, data.thetaStart, data.thetaLength); - } } -class CylinderGeometry extends BufferGeometry { - static { - __name(this, "CylinderGeometry"); - } - constructor(radiusTop = 1, radiusBottom = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2) { - super(); - this.type = "CylinderGeometry"; - this.parameters = { - radiusTop, - radiusBottom, - height, - radialSegments, - heightSegments, - openEnded, - thetaStart, - thetaLength - }; - const scope = this; - radialSegments = Math.floor(radialSegments); - heightSegments = Math.floor(heightSegments); - const indices = []; - const vertices = []; - const normals = []; - const uvs = []; - let index = 0; - const indexArray = []; - const halfHeight = height / 2; - let groupStart = 0; - generateTorso(); - if (openEnded === false) { - if (radiusTop > 0) generateCap(true); - if (radiusBottom > 0) generateCap(false); - } - this.setIndex(indices); - this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); - this.setAttribute("normal", new Float32BufferAttribute(normals, 3)); - this.setAttribute("uv", new Float32BufferAttribute(uvs, 2)); - function generateTorso() { - const normal = new Vector3(); - const vertex2 = new Vector3(); - let groupCount = 0; - const slope = (radiusBottom - radiusTop) / height; - for (let y = 0; y <= heightSegments; y++) { - const indexRow = []; - const v = y / heightSegments; - const radius = v * (radiusBottom - radiusTop) + radiusTop; - for (let x = 0; x <= radialSegments; x++) { - const u = x / radialSegments; - const theta = u * thetaLength + thetaStart; - const sinTheta = Math.sin(theta); - const cosTheta = Math.cos(theta); - vertex2.x = radius * sinTheta; - vertex2.y = -v * height + halfHeight; - vertex2.z = radius * cosTheta; - vertices.push(vertex2.x, vertex2.y, vertex2.z); - normal.set(sinTheta, slope, cosTheta).normalize(); - normals.push(normal.x, normal.y, normal.z); - uvs.push(u, 1 - v); - indexRow.push(index++); +const vertex = "void main() {\n gl_Position = vec4( position, 1.0 );\n}"; +const fragment = "uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include \nvoid main() {\n const float samples = float( VSM_SAMPLES );\n float mean = 0.0;\n float squared_mean = 0.0;\n float uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n float uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n for ( float i = 0.0; i < samples; i ++ ) {\n float uvOffset = uvStart + i * uvStride;\n #ifdef HORIZONTAL_PASS\n vec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\n mean += distribution.x;\n squared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n #else\n float depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\n mean += depth;\n squared_mean += depth * depth;\n #endif\n }\n mean = mean / samples;\n squared_mean = squared_mean / samples;\n float std_dev = sqrt( squared_mean - mean * mean );\n gl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}"; +function WebGLShadowMap(renderer, objects, capabilities) { + let _frustum2 = new Frustum(); + const _shadowMapSize = new Vector2(), _viewportSize = new Vector2(), _viewport = new Vector4(), _depthMaterial = new MeshDepthMaterial({ depthPacking: RGBADepthPacking }), _distanceMaterial = new MeshDistanceMaterial(), _materialCache = {}, _maxTextureSize = capabilities.maxTextureSize; + const shadowSide = { [FrontSide]: BackSide, [BackSide]: FrontSide, [DoubleSide]: DoubleSide }; + const shadowMaterialVertical = new ShaderMaterial({ + defines: { + VSM_SAMPLES: 8 + }, + uniforms: { + shadow_pass: { value: null }, + resolution: { value: new Vector2() }, + radius: { value: 4 } + }, + vertexShader: vertex, + fragmentShader: fragment + }); + const shadowMaterialHorizontal = shadowMaterialVertical.clone(); + shadowMaterialHorizontal.defines.HORIZONTAL_PASS = 1; + const fullScreenTri = new BufferGeometry(); + fullScreenTri.setAttribute( + "position", + new BufferAttribute( + new Float32Array([-1, -1, 0.5, 3, -1, 0.5, -1, 3, 0.5]), + 3 + ) + ); + const fullScreenMesh = new Mesh(fullScreenTri, shadowMaterialVertical); + const scope = this; + this.enabled = false; + this.autoUpdate = true; + this.needsUpdate = false; + this.type = PCFShadowMap; + let _previousType = this.type; + this.render = function(lights, scene, camera) { + if (scope.enabled === false) return; + if (scope.autoUpdate === false && scope.needsUpdate === false) return; + if (lights.length === 0) return; + const currentRenderTarget = renderer.getRenderTarget(); + const activeCubeFace = renderer.getActiveCubeFace(); + const activeMipmapLevel = renderer.getActiveMipmapLevel(); + const _state = renderer.state; + _state.setBlending(NoBlending); + _state.buffers.color.setClear(1, 1, 1, 1); + _state.buffers.depth.setTest(true); + _state.setScissorTest(false); + const toVSM = _previousType !== VSMShadowMap && this.type === VSMShadowMap; + const fromVSM = _previousType === VSMShadowMap && this.type !== VSMShadowMap; + for (let i = 0, il = lights.length; i < il; i++) { + const light = lights[i]; + const shadow = light.shadow; + if (shadow === void 0) { + console.warn("THREE.WebGLShadowMap:", light, "has no shadow."); + continue; + } + if (shadow.autoUpdate === false && shadow.needsUpdate === false) continue; + _shadowMapSize.copy(shadow.mapSize); + const shadowFrameExtents = shadow.getFrameExtents(); + _shadowMapSize.multiply(shadowFrameExtents); + _viewportSize.copy(shadow.mapSize); + if (_shadowMapSize.x > _maxTextureSize || _shadowMapSize.y > _maxTextureSize) { + if (_shadowMapSize.x > _maxTextureSize) { + _viewportSize.x = Math.floor(_maxTextureSize / shadowFrameExtents.x); + _shadowMapSize.x = _viewportSize.x * shadowFrameExtents.x; + shadow.mapSize.x = _viewportSize.x; + } + if (_shadowMapSize.y > _maxTextureSize) { + _viewportSize.y = Math.floor(_maxTextureSize / shadowFrameExtents.y); + _shadowMapSize.y = _viewportSize.y * shadowFrameExtents.y; + shadow.mapSize.y = _viewportSize.y; } - indexArray.push(indexRow); } - for (let x = 0; x < radialSegments; x++) { - for (let y = 0; y < heightSegments; y++) { - const a = indexArray[y][x]; - const b = indexArray[y + 1][x]; - const c = indexArray[y + 1][x + 1]; - const d = indexArray[y][x + 1]; - if (radiusTop > 0 || y !== 0) { - indices.push(a, b, d); - groupCount += 3; - } - if (radiusBottom > 0 || y !== heightSegments - 1) { - indices.push(b, c, d); - groupCount += 3; - } + if (shadow.map === null || toVSM === true || fromVSM === true) { + const pars = this.type !== VSMShadowMap ? { minFilter: NearestFilter, magFilter: NearestFilter } : {}; + if (shadow.map !== null) { + shadow.map.dispose(); } + shadow.map = new WebGLRenderTarget(_shadowMapSize.x, _shadowMapSize.y, pars); + shadow.map.texture.name = light.name + ".shadowMap"; + shadow.camera.updateProjectionMatrix(); } - scope.addGroup(groupStart, groupCount, 0); - groupStart += groupCount; - } - __name(generateTorso, "generateTorso"); - function generateCap(top) { - const centerIndexStart = index; - const uv = new Vector2(); - const vertex2 = new Vector3(); - let groupCount = 0; - const radius = top === true ? radiusTop : radiusBottom; - const sign2 = top === true ? 1 : -1; - for (let x = 1; x <= radialSegments; x++) { - vertices.push(0, halfHeight * sign2, 0); - normals.push(0, sign2, 0); - uvs.push(0.5, 0.5); - index++; + renderer.setRenderTarget(shadow.map); + renderer.clear(); + const viewportCount = shadow.getViewportCount(); + for (let vp = 0; vp < viewportCount; vp++) { + const viewport = shadow.getViewport(vp); + _viewport.set( + _viewportSize.x * viewport.x, + _viewportSize.y * viewport.y, + _viewportSize.x * viewport.z, + _viewportSize.y * viewport.w + ); + _state.viewport(_viewport); + shadow.updateMatrices(light, vp); + _frustum2 = shadow.getFrustum(); + renderObject(scene, camera, shadow.camera, light, this.type); } - const centerIndexEnd = index; - for (let x = 0; x <= radialSegments; x++) { - const u = x / radialSegments; - const theta = u * thetaLength + thetaStart; - const cosTheta = Math.cos(theta); - const sinTheta = Math.sin(theta); - vertex2.x = radius * sinTheta; - vertex2.y = halfHeight * sign2; - vertex2.z = radius * cosTheta; - vertices.push(vertex2.x, vertex2.y, vertex2.z); - normals.push(0, sign2, 0); - uv.x = cosTheta * 0.5 + 0.5; - uv.y = sinTheta * 0.5 * sign2 + 0.5; - uvs.push(uv.x, uv.y); - index++; + if (shadow.isPointLightShadow !== true && this.type === VSMShadowMap) { + VSMPass(shadow, camera); } - for (let x = 0; x < radialSegments; x++) { - const c = centerIndexStart + x; - const i = centerIndexEnd + x; - if (top === true) { - indices.push(i, i + 1, c); - } else { - indices.push(i + 1, i, c); + shadow.needsUpdate = false; + } + _previousType = this.type; + scope.needsUpdate = false; + renderer.setRenderTarget(currentRenderTarget, activeCubeFace, activeMipmapLevel); + }; + function VSMPass(shadow, camera) { + const geometry = objects.update(fullScreenMesh); + if (shadowMaterialVertical.defines.VSM_SAMPLES !== shadow.blurSamples) { + shadowMaterialVertical.defines.VSM_SAMPLES = shadow.blurSamples; + shadowMaterialHorizontal.defines.VSM_SAMPLES = shadow.blurSamples; + shadowMaterialVertical.needsUpdate = true; + shadowMaterialHorizontal.needsUpdate = true; + } + if (shadow.mapPass === null) { + shadow.mapPass = new WebGLRenderTarget(_shadowMapSize.x, _shadowMapSize.y); + } + shadowMaterialVertical.uniforms.shadow_pass.value = shadow.map.texture; + shadowMaterialVertical.uniforms.resolution.value = shadow.mapSize; + shadowMaterialVertical.uniforms.radius.value = shadow.radius; + renderer.setRenderTarget(shadow.mapPass); + renderer.clear(); + renderer.renderBufferDirect(camera, null, geometry, shadowMaterialVertical, fullScreenMesh, null); + shadowMaterialHorizontal.uniforms.shadow_pass.value = shadow.mapPass.texture; + shadowMaterialHorizontal.uniforms.resolution.value = shadow.mapSize; + shadowMaterialHorizontal.uniforms.radius.value = shadow.radius; + renderer.setRenderTarget(shadow.map); + renderer.clear(); + renderer.renderBufferDirect(camera, null, geometry, shadowMaterialHorizontal, fullScreenMesh, null); + } + __name(VSMPass, "VSMPass"); + function getDepthMaterial(object, material, light, type) { + let result = null; + const customMaterial = light.isPointLight === true ? object.customDistanceMaterial : object.customDepthMaterial; + if (customMaterial !== void 0) { + result = customMaterial; + } else { + result = light.isPointLight === true ? _distanceMaterial : _depthMaterial; + if (renderer.localClippingEnabled && material.clipShadows === true && Array.isArray(material.clippingPlanes) && material.clippingPlanes.length !== 0 || material.displacementMap && material.displacementScale !== 0 || material.alphaMap && material.alphaTest > 0 || material.map && material.alphaTest > 0) { + const keyA = result.uuid, keyB = material.uuid; + let materialsForVariant = _materialCache[keyA]; + if (materialsForVariant === void 0) { + materialsForVariant = {}; + _materialCache[keyA] = materialsForVariant; } - groupCount += 3; + let cachedMaterial = materialsForVariant[keyB]; + if (cachedMaterial === void 0) { + cachedMaterial = result.clone(); + materialsForVariant[keyB] = cachedMaterial; + material.addEventListener("dispose", onMaterialDispose); + } + result = cachedMaterial; } - scope.addGroup(groupStart, groupCount, top === true ? 1 : 2); - groupStart += groupCount; } - __name(generateCap, "generateCap"); + result.visible = material.visible; + result.wireframe = material.wireframe; + if (type === VSMShadowMap) { + result.side = material.shadowSide !== null ? material.shadowSide : material.side; + } else { + result.side = material.shadowSide !== null ? material.shadowSide : shadowSide[material.side]; + } + result.alphaMap = material.alphaMap; + result.alphaTest = material.alphaTest; + result.map = material.map; + result.clipShadows = material.clipShadows; + result.clippingPlanes = material.clippingPlanes; + result.clipIntersection = material.clipIntersection; + result.displacementMap = material.displacementMap; + result.displacementScale = material.displacementScale; + result.displacementBias = material.displacementBias; + result.wireframeLinewidth = material.wireframeLinewidth; + result.linewidth = material.linewidth; + if (light.isPointLight === true && result.isMeshDistanceMaterial === true) { + const materialProperties = renderer.properties.get(result); + materialProperties.light = light; + } + return result; } - copy(source) { - super.copy(source); - this.parameters = Object.assign({}, source.parameters); - return this; + __name(getDepthMaterial, "getDepthMaterial"); + function renderObject(object, camera, shadowCamera, light, type) { + if (object.visible === false) return; + const visible = object.layers.test(camera.layers); + if (visible && (object.isMesh || object.isLine || object.isPoints)) { + if ((object.castShadow || object.receiveShadow && type === VSMShadowMap) && (!object.frustumCulled || _frustum2.intersectsObject(object))) { + object.modelViewMatrix.multiplyMatrices(shadowCamera.matrixWorldInverse, object.matrixWorld); + const geometry = objects.update(object); + const material = object.material; + if (Array.isArray(material)) { + const groups = geometry.groups; + for (let k = 0, kl = groups.length; k < kl; k++) { + const group = groups[k]; + const groupMaterial = material[group.materialIndex]; + if (groupMaterial && groupMaterial.visible) { + const depthMaterial = getDepthMaterial(object, groupMaterial, light, type); + object.onBeforeShadow(renderer, object, camera, shadowCamera, geometry, depthMaterial, group); + renderer.renderBufferDirect(shadowCamera, null, geometry, depthMaterial, object, group); + object.onAfterShadow(renderer, object, camera, shadowCamera, geometry, depthMaterial, group); + } + } + } else if (material.visible) { + const depthMaterial = getDepthMaterial(object, material, light, type); + object.onBeforeShadow(renderer, object, camera, shadowCamera, geometry, depthMaterial, null); + renderer.renderBufferDirect(shadowCamera, null, geometry, depthMaterial, object, null); + object.onAfterShadow(renderer, object, camera, shadowCamera, geometry, depthMaterial, null); + } + } + } + const children = object.children; + for (let i = 0, l = children.length; i < l; i++) { + renderObject(children[i], camera, shadowCamera, light, type); + } } - static fromJSON(data) { - return new CylinderGeometry(data.radiusTop, data.radiusBottom, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength); + __name(renderObject, "renderObject"); + function onMaterialDispose(event) { + const material = event.target; + material.removeEventListener("dispose", onMaterialDispose); + for (const id2 in _materialCache) { + const cache = _materialCache[id2]; + const uuid = event.target.uuid; + if (uuid in cache) { + const shadowMaterial = cache[uuid]; + shadowMaterial.dispose(); + delete cache[uuid]; + } + } } + __name(onMaterialDispose, "onMaterialDispose"); } -class ConeGeometry extends CylinderGeometry { - static { - __name(this, "ConeGeometry"); - } - constructor(radius = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2) { - super(0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength); - this.type = "ConeGeometry"; - this.parameters = { - radius, - height, - radialSegments, - heightSegments, - openEnded, - thetaStart, - thetaLength +__name(WebGLShadowMap, "WebGLShadowMap"); +const reversedFuncs = { + [NeverDepth]: AlwaysDepth, + [LessDepth]: GreaterDepth, + [EqualDepth]: NotEqualDepth, + [LessEqualDepth]: GreaterEqualDepth, + [AlwaysDepth]: NeverDepth, + [GreaterDepth]: LessDepth, + [NotEqualDepth]: EqualDepth, + [GreaterEqualDepth]: LessEqualDepth +}; +function WebGLState(gl, extensions) { + function ColorBuffer() { + let locked = false; + const color = new Vector4(); + let currentColorMask = null; + const currentColorClear = new Vector4(0, 0, 0, 0); + return { + setMask: /* @__PURE__ */ __name(function(colorMask) { + if (currentColorMask !== colorMask && !locked) { + gl.colorMask(colorMask, colorMask, colorMask, colorMask); + currentColorMask = colorMask; + } + }, "setMask"), + setLocked: /* @__PURE__ */ __name(function(lock) { + locked = lock; + }, "setLocked"), + setClear: /* @__PURE__ */ __name(function(r, g, b, a, premultipliedAlpha) { + if (premultipliedAlpha === true) { + r *= a; + g *= a; + b *= a; + } + color.set(r, g, b, a); + if (currentColorClear.equals(color) === false) { + gl.clearColor(r, g, b, a); + currentColorClear.copy(color); + } + }, "setClear"), + reset: /* @__PURE__ */ __name(function() { + locked = false; + currentColorMask = null; + currentColorClear.set(-1, 0, 0, 0); + }, "reset") }; } - static fromJSON(data) { - return new ConeGeometry(data.radius, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength); - } -} -class PolyhedronGeometry extends BufferGeometry { - static { - __name(this, "PolyhedronGeometry"); - } - constructor(vertices = [], indices = [], radius = 1, detail = 0) { - super(); - this.type = "PolyhedronGeometry"; - this.parameters = { - vertices, - indices, - radius, - detail - }; - const vertexBuffer = []; - const uvBuffer = []; - subdivide(detail); - applyRadius(radius); - generateUVs(); - this.setAttribute("position", new Float32BufferAttribute(vertexBuffer, 3)); - this.setAttribute("normal", new Float32BufferAttribute(vertexBuffer.slice(), 3)); - this.setAttribute("uv", new Float32BufferAttribute(uvBuffer, 2)); - if (detail === 0) { - this.computeVertexNormals(); - } else { - this.normalizeNormals(); - } - function subdivide(detail2) { - const a = new Vector3(); - const b = new Vector3(); - const c = new Vector3(); - for (let i = 0; i < indices.length; i += 3) { - getVertexByIndex(indices[i + 0], a); - getVertexByIndex(indices[i + 1], b); - getVertexByIndex(indices[i + 2], c); - subdivideFace(a, b, c, detail2); - } - } - __name(subdivide, "subdivide"); - function subdivideFace(a, b, c, detail2) { - const cols = detail2 + 1; - const v = []; - for (let i = 0; i <= cols; i++) { - v[i] = []; - const aj = a.clone().lerp(c, i / cols); - const bj = b.clone().lerp(c, i / cols); - const rows = cols - i; - for (let j = 0; j <= rows; j++) { - if (j === 0 && i === cols) { - v[i][j] = aj; + __name(ColorBuffer, "ColorBuffer"); + function DepthBuffer() { + let locked = false; + let reversed = false; + let currentDepthMask = null; + let currentDepthFunc = null; + let currentDepthClear = null; + return { + setReversed: /* @__PURE__ */ __name(function(value) { + if (reversed !== value) { + const ext2 = extensions.get("EXT_clip_control"); + if (reversed) { + ext2.clipControlEXT(ext2.LOWER_LEFT_EXT, ext2.ZERO_TO_ONE_EXT); } else { - v[i][j] = aj.clone().lerp(bj, j / rows); + ext2.clipControlEXT(ext2.LOWER_LEFT_EXT, ext2.NEGATIVE_ONE_TO_ONE_EXT); } + const oldDepth = currentDepthClear; + currentDepthClear = null; + this.setClear(oldDepth); } - } - for (let i = 0; i < cols; i++) { - for (let j = 0; j < 2 * (cols - i) - 1; j++) { - const k = Math.floor(j / 2); - if (j % 2 === 0) { - pushVertex(v[i][k + 1]); - pushVertex(v[i + 1][k]); - pushVertex(v[i][k]); - } else { - pushVertex(v[i][k + 1]); - pushVertex(v[i + 1][k + 1]); - pushVertex(v[i + 1][k]); + reversed = value; + }, "setReversed"), + getReversed: /* @__PURE__ */ __name(function() { + return reversed; + }, "getReversed"), + setTest: /* @__PURE__ */ __name(function(depthTest) { + if (depthTest) { + enable(gl.DEPTH_TEST); + } else { + disable(gl.DEPTH_TEST); + } + }, "setTest"), + setMask: /* @__PURE__ */ __name(function(depthMask) { + if (currentDepthMask !== depthMask && !locked) { + gl.depthMask(depthMask); + currentDepthMask = depthMask; + } + }, "setMask"), + setFunc: /* @__PURE__ */ __name(function(depthFunc) { + if (reversed) depthFunc = reversedFuncs[depthFunc]; + if (currentDepthFunc !== depthFunc) { + switch (depthFunc) { + case NeverDepth: + gl.depthFunc(gl.NEVER); + break; + case AlwaysDepth: + gl.depthFunc(gl.ALWAYS); + break; + case LessDepth: + gl.depthFunc(gl.LESS); + break; + case LessEqualDepth: + gl.depthFunc(gl.LEQUAL); + break; + case EqualDepth: + gl.depthFunc(gl.EQUAL); + break; + case GreaterEqualDepth: + gl.depthFunc(gl.GEQUAL); + break; + case GreaterDepth: + gl.depthFunc(gl.GREATER); + break; + case NotEqualDepth: + gl.depthFunc(gl.NOTEQUAL); + break; + default: + gl.depthFunc(gl.LEQUAL); } + currentDepthFunc = depthFunc; } - } - } - __name(subdivideFace, "subdivideFace"); - function applyRadius(radius2) { - const vertex2 = new Vector3(); - for (let i = 0; i < vertexBuffer.length; i += 3) { - vertex2.x = vertexBuffer[i + 0]; - vertex2.y = vertexBuffer[i + 1]; - vertex2.z = vertexBuffer[i + 2]; - vertex2.normalize().multiplyScalar(radius2); - vertexBuffer[i + 0] = vertex2.x; - vertexBuffer[i + 1] = vertex2.y; - vertexBuffer[i + 2] = vertex2.z; - } - } - __name(applyRadius, "applyRadius"); - function generateUVs() { - const vertex2 = new Vector3(); - for (let i = 0; i < vertexBuffer.length; i += 3) { - vertex2.x = vertexBuffer[i + 0]; - vertex2.y = vertexBuffer[i + 1]; - vertex2.z = vertexBuffer[i + 2]; - const u = azimuth(vertex2) / 2 / Math.PI + 0.5; - const v = inclination(vertex2) / Math.PI + 0.5; - uvBuffer.push(u, 1 - v); - } - correctUVs(); - correctSeam(); - } - __name(generateUVs, "generateUVs"); - function correctSeam() { - for (let i = 0; i < uvBuffer.length; i += 6) { - const x0 = uvBuffer[i + 0]; - const x1 = uvBuffer[i + 2]; - const x2 = uvBuffer[i + 4]; - const max2 = Math.max(x0, x1, x2); - const min = Math.min(x0, x1, x2); - if (max2 > 0.9 && min < 0.1) { - if (x0 < 0.2) uvBuffer[i + 0] += 1; - if (x1 < 0.2) uvBuffer[i + 2] += 1; - if (x2 < 0.2) uvBuffer[i + 4] += 1; + }, "setFunc"), + setLocked: /* @__PURE__ */ __name(function(lock) { + locked = lock; + }, "setLocked"), + setClear: /* @__PURE__ */ __name(function(depth) { + if (currentDepthClear !== depth) { + if (reversed) { + depth = 1 - depth; + } + gl.clearDepth(depth); + currentDepthClear = depth; } - } - } - __name(correctSeam, "correctSeam"); - function pushVertex(vertex2) { - vertexBuffer.push(vertex2.x, vertex2.y, vertex2.z); - } - __name(pushVertex, "pushVertex"); - function getVertexByIndex(index, vertex2) { - const stride = index * 3; - vertex2.x = vertices[stride + 0]; - vertex2.y = vertices[stride + 1]; - vertex2.z = vertices[stride + 2]; - } - __name(getVertexByIndex, "getVertexByIndex"); - function correctUVs() { - const a = new Vector3(); - const b = new Vector3(); - const c = new Vector3(); - const centroid = new Vector3(); - const uvA = new Vector2(); - const uvB = new Vector2(); - const uvC = new Vector2(); - for (let i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6) { - a.set(vertexBuffer[i + 0], vertexBuffer[i + 1], vertexBuffer[i + 2]); - b.set(vertexBuffer[i + 3], vertexBuffer[i + 4], vertexBuffer[i + 5]); - c.set(vertexBuffer[i + 6], vertexBuffer[i + 7], vertexBuffer[i + 8]); - uvA.set(uvBuffer[j + 0], uvBuffer[j + 1]); - uvB.set(uvBuffer[j + 2], uvBuffer[j + 3]); - uvC.set(uvBuffer[j + 4], uvBuffer[j + 5]); - centroid.copy(a).add(b).add(c).divideScalar(3); - const azi = azimuth(centroid); - correctUV(uvA, j + 0, a, azi); - correctUV(uvB, j + 2, b, azi); - correctUV(uvC, j + 4, c, azi); - } - } - __name(correctUVs, "correctUVs"); - function correctUV(uv, stride, vector, azimuth2) { - if (azimuth2 < 0 && uv.x === 1) { - uvBuffer[stride] = uv.x - 1; - } - if (vector.x === 0 && vector.z === 0) { - uvBuffer[stride] = azimuth2 / 2 / Math.PI + 0.5; - } - } - __name(correctUV, "correctUV"); - function azimuth(vector) { - return Math.atan2(vector.z, -vector.x); - } - __name(azimuth, "azimuth"); - function inclination(vector) { - return Math.atan2(-vector.y, Math.sqrt(vector.x * vector.x + vector.z * vector.z)); - } - __name(inclination, "inclination"); + }, "setClear"), + reset: /* @__PURE__ */ __name(function() { + locked = false; + currentDepthMask = null; + currentDepthFunc = null; + currentDepthClear = null; + reversed = false; + }, "reset") + }; } - copy(source) { - super.copy(source); - this.parameters = Object.assign({}, source.parameters); - return this; + __name(DepthBuffer, "DepthBuffer"); + function StencilBuffer() { + let locked = false; + let currentStencilMask = null; + let currentStencilFunc = null; + let currentStencilRef = null; + let currentStencilFuncMask = null; + let currentStencilFail = null; + let currentStencilZFail = null; + let currentStencilZPass = null; + let currentStencilClear = null; + return { + setTest: /* @__PURE__ */ __name(function(stencilTest) { + if (!locked) { + if (stencilTest) { + enable(gl.STENCIL_TEST); + } else { + disable(gl.STENCIL_TEST); + } + } + }, "setTest"), + setMask: /* @__PURE__ */ __name(function(stencilMask) { + if (currentStencilMask !== stencilMask && !locked) { + gl.stencilMask(stencilMask); + currentStencilMask = stencilMask; + } + }, "setMask"), + setFunc: /* @__PURE__ */ __name(function(stencilFunc, stencilRef, stencilMask) { + if (currentStencilFunc !== stencilFunc || currentStencilRef !== stencilRef || currentStencilFuncMask !== stencilMask) { + gl.stencilFunc(stencilFunc, stencilRef, stencilMask); + currentStencilFunc = stencilFunc; + currentStencilRef = stencilRef; + currentStencilFuncMask = stencilMask; + } + }, "setFunc"), + setOp: /* @__PURE__ */ __name(function(stencilFail, stencilZFail, stencilZPass) { + if (currentStencilFail !== stencilFail || currentStencilZFail !== stencilZFail || currentStencilZPass !== stencilZPass) { + gl.stencilOp(stencilFail, stencilZFail, stencilZPass); + currentStencilFail = stencilFail; + currentStencilZFail = stencilZFail; + currentStencilZPass = stencilZPass; + } + }, "setOp"), + setLocked: /* @__PURE__ */ __name(function(lock) { + locked = lock; + }, "setLocked"), + setClear: /* @__PURE__ */ __name(function(stencil) { + if (currentStencilClear !== stencil) { + gl.clearStencil(stencil); + currentStencilClear = stencil; + } + }, "setClear"), + reset: /* @__PURE__ */ __name(function() { + locked = false; + currentStencilMask = null; + currentStencilFunc = null; + currentStencilRef = null; + currentStencilFuncMask = null; + currentStencilFail = null; + currentStencilZFail = null; + currentStencilZPass = null; + currentStencilClear = null; + }, "reset") + }; } - static fromJSON(data) { - return new PolyhedronGeometry(data.vertices, data.indices, data.radius, data.details); + __name(StencilBuffer, "StencilBuffer"); + const colorBuffer = new ColorBuffer(); + const depthBuffer = new DepthBuffer(); + const stencilBuffer = new StencilBuffer(); + const uboBindings = /* @__PURE__ */ new WeakMap(); + const uboProgramMap = /* @__PURE__ */ new WeakMap(); + let enabledCapabilities = {}; + let currentBoundFramebuffers = {}; + let currentDrawbuffers = /* @__PURE__ */ new WeakMap(); + let defaultDrawbuffers = []; + let currentProgram = null; + let currentBlendingEnabled = false; + let currentBlending = null; + let currentBlendEquation = null; + let currentBlendSrc = null; + let currentBlendDst = null; + let currentBlendEquationAlpha = null; + let currentBlendSrcAlpha = null; + let currentBlendDstAlpha = null; + let currentBlendColor = new Color(0, 0, 0); + let currentBlendAlpha = 0; + let currentPremultipledAlpha = false; + let currentFlipSided = null; + let currentCullFace = null; + let currentLineWidth = null; + let currentPolygonOffsetFactor = null; + let currentPolygonOffsetUnits = null; + const maxTextures = gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS); + let lineWidthAvailable = false; + let version = 0; + const glVersion = gl.getParameter(gl.VERSION); + if (glVersion.indexOf("WebGL") !== -1) { + version = parseFloat(/^WebGL (\d)/.exec(glVersion)[1]); + lineWidthAvailable = version >= 1; + } else if (glVersion.indexOf("OpenGL ES") !== -1) { + version = parseFloat(/^OpenGL ES (\d)/.exec(glVersion)[1]); + lineWidthAvailable = version >= 2; } -} -class DodecahedronGeometry extends PolyhedronGeometry { - static { - __name(this, "DodecahedronGeometry"); + let currentTextureSlot = null; + let currentBoundTextures = {}; + const scissorParam = gl.getParameter(gl.SCISSOR_BOX); + const viewportParam = gl.getParameter(gl.VIEWPORT); + const currentScissor = new Vector4().fromArray(scissorParam); + const currentViewport = new Vector4().fromArray(viewportParam); + function createTexture(type, target, count, dimensions) { + const data = new Uint8Array(4); + const texture = gl.createTexture(); + gl.bindTexture(type, texture); + gl.texParameteri(type, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + gl.texParameteri(type, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + for (let i = 0; i < count; i++) { + if (type === gl.TEXTURE_3D || type === gl.TEXTURE_2D_ARRAY) { + gl.texImage3D(target, 0, gl.RGBA, 1, 1, dimensions, 0, gl.RGBA, gl.UNSIGNED_BYTE, data); + } else { + gl.texImage2D(target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data); + } + } + return texture; } - constructor(radius = 1, detail = 0) { - const t2 = (1 + Math.sqrt(5)) / 2; - const r = 1 / t2; - const vertices = [ - // (±1, ±1, ±1) - -1, - -1, - -1, - -1, - -1, - 1, - -1, - 1, - -1, - -1, - 1, - 1, - 1, - -1, - -1, - 1, - -1, - 1, - 1, - 1, - -1, - 1, - 1, - 1, - // (0, ±1/φ, ±φ) - 0, - -r, - -t2, - 0, - -r, - t2, - 0, - r, - -t2, - 0, - r, - t2, - // (±1/φ, ±φ, 0) - -r, - -t2, - 0, - -r, - t2, - 0, - r, - -t2, - 0, - r, - t2, - 0, - // (±φ, 0, ±1/φ) - -t2, - 0, - -r, - t2, - 0, - -r, - -t2, - 0, - r, - t2, - 0, - r - ]; - const indices = [ - 3, - 11, - 7, - 3, - 7, - 15, - 3, - 15, - 13, - 7, - 19, - 17, - 7, - 17, - 6, - 7, - 6, - 15, - 17, - 4, - 8, - 17, - 8, - 10, - 17, - 10, - 6, - 8, - 0, - 16, - 8, - 16, - 2, - 8, - 2, - 10, - 0, - 12, - 1, - 0, - 1, - 18, - 0, - 18, - 16, - 6, - 10, - 2, - 6, - 2, - 13, - 6, - 13, - 15, - 2, - 16, - 18, - 2, - 18, - 3, - 2, - 3, - 13, - 18, - 1, - 9, - 18, - 9, - 11, - 18, - 11, - 3, - 4, - 14, - 12, - 4, - 12, - 0, - 4, - 0, - 8, - 11, - 9, - 5, - 11, - 5, - 19, - 11, - 19, - 7, - 19, - 5, - 14, - 19, - 14, - 4, - 19, - 4, - 17, - 1, - 12, - 14, - 1, - 14, - 5, - 1, - 5, - 9 - ]; - super(vertices, indices, radius, detail); - this.type = "DodecahedronGeometry"; - this.parameters = { - radius, - detail - }; + __name(createTexture, "createTexture"); + const emptyTextures = {}; + emptyTextures[gl.TEXTURE_2D] = createTexture(gl.TEXTURE_2D, gl.TEXTURE_2D, 1); + emptyTextures[gl.TEXTURE_CUBE_MAP] = createTexture(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6); + emptyTextures[gl.TEXTURE_2D_ARRAY] = createTexture(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_2D_ARRAY, 1, 1); + emptyTextures[gl.TEXTURE_3D] = createTexture(gl.TEXTURE_3D, gl.TEXTURE_3D, 1, 1); + colorBuffer.setClear(0, 0, 0, 1); + depthBuffer.setClear(1); + stencilBuffer.setClear(0); + enable(gl.DEPTH_TEST); + depthBuffer.setFunc(LessEqualDepth); + setFlipSided(false); + setCullFace(CullFaceBack); + enable(gl.CULL_FACE); + setBlending(NoBlending); + function enable(id2) { + if (enabledCapabilities[id2] !== true) { + gl.enable(id2); + enabledCapabilities[id2] = true; + } } - static fromJSON(data) { - return new DodecahedronGeometry(data.radius, data.detail); + __name(enable, "enable"); + function disable(id2) { + if (enabledCapabilities[id2] !== false) { + gl.disable(id2); + enabledCapabilities[id2] = false; + } } -} -const _v0 = /* @__PURE__ */ new Vector3(); -const _v1$1 = /* @__PURE__ */ new Vector3(); -const _normal = /* @__PURE__ */ new Vector3(); -const _triangle = /* @__PURE__ */ new Triangle(); -class EdgesGeometry extends BufferGeometry { - static { - __name(this, "EdgesGeometry"); + __name(disable, "disable"); + function bindFramebuffer(target, framebuffer) { + if (currentBoundFramebuffers[target] !== framebuffer) { + gl.bindFramebuffer(target, framebuffer); + currentBoundFramebuffers[target] = framebuffer; + if (target === gl.DRAW_FRAMEBUFFER) { + currentBoundFramebuffers[gl.FRAMEBUFFER] = framebuffer; + } + if (target === gl.FRAMEBUFFER) { + currentBoundFramebuffers[gl.DRAW_FRAMEBUFFER] = framebuffer; + } + return true; + } + return false; } - constructor(geometry = null, thresholdAngle = 1) { - super(); - this.type = "EdgesGeometry"; - this.parameters = { - geometry, - thresholdAngle - }; - if (geometry !== null) { - const precisionPoints = 4; - const precision = Math.pow(10, precisionPoints); - const thresholdDot = Math.cos(DEG2RAD * thresholdAngle); - const indexAttr = geometry.getIndex(); - const positionAttr = geometry.getAttribute("position"); - const indexCount = indexAttr ? indexAttr.count : positionAttr.count; - const indexArr = [0, 0, 0]; - const vertKeys = ["a", "b", "c"]; - const hashes = new Array(3); - const edgeData = {}; - const vertices = []; - for (let i = 0; i < indexCount; i += 3) { - if (indexAttr) { - indexArr[0] = indexAttr.getX(i); - indexArr[1] = indexAttr.getX(i + 1); - indexArr[2] = indexAttr.getX(i + 2); - } else { - indexArr[0] = i; - indexArr[1] = i + 1; - indexArr[2] = i + 2; + __name(bindFramebuffer, "bindFramebuffer"); + function drawBuffers(renderTarget, framebuffer) { + let drawBuffers2 = defaultDrawbuffers; + let needsUpdate = false; + if (renderTarget) { + drawBuffers2 = currentDrawbuffers.get(framebuffer); + if (drawBuffers2 === void 0) { + drawBuffers2 = []; + currentDrawbuffers.set(framebuffer, drawBuffers2); + } + const textures = renderTarget.textures; + if (drawBuffers2.length !== textures.length || drawBuffers2[0] !== gl.COLOR_ATTACHMENT0) { + for (let i = 0, il = textures.length; i < il; i++) { + drawBuffers2[i] = gl.COLOR_ATTACHMENT0 + i; } - const { a, b, c } = _triangle; - a.fromBufferAttribute(positionAttr, indexArr[0]); - b.fromBufferAttribute(positionAttr, indexArr[1]); - c.fromBufferAttribute(positionAttr, indexArr[2]); - _triangle.getNormal(_normal); - hashes[0] = `${Math.round(a.x * precision)},${Math.round(a.y * precision)},${Math.round(a.z * precision)}`; - hashes[1] = `${Math.round(b.x * precision)},${Math.round(b.y * precision)},${Math.round(b.z * precision)}`; - hashes[2] = `${Math.round(c.x * precision)},${Math.round(c.y * precision)},${Math.round(c.z * precision)}`; - if (hashes[0] === hashes[1] || hashes[1] === hashes[2] || hashes[2] === hashes[0]) { - continue; + drawBuffers2.length = textures.length; + needsUpdate = true; + } + } else { + if (drawBuffers2[0] !== gl.BACK) { + drawBuffers2[0] = gl.BACK; + needsUpdate = true; + } + } + if (needsUpdate) { + gl.drawBuffers(drawBuffers2); + } + } + __name(drawBuffers, "drawBuffers"); + function useProgram(program) { + if (currentProgram !== program) { + gl.useProgram(program); + currentProgram = program; + return true; + } + return false; + } + __name(useProgram, "useProgram"); + const equationToGL = { + [AddEquation]: gl.FUNC_ADD, + [SubtractEquation]: gl.FUNC_SUBTRACT, + [ReverseSubtractEquation]: gl.FUNC_REVERSE_SUBTRACT + }; + equationToGL[MinEquation] = gl.MIN; + equationToGL[MaxEquation] = gl.MAX; + const factorToGL = { + [ZeroFactor]: gl.ZERO, + [OneFactor]: gl.ONE, + [SrcColorFactor]: gl.SRC_COLOR, + [SrcAlphaFactor]: gl.SRC_ALPHA, + [SrcAlphaSaturateFactor]: gl.SRC_ALPHA_SATURATE, + [DstColorFactor]: gl.DST_COLOR, + [DstAlphaFactor]: gl.DST_ALPHA, + [OneMinusSrcColorFactor]: gl.ONE_MINUS_SRC_COLOR, + [OneMinusSrcAlphaFactor]: gl.ONE_MINUS_SRC_ALPHA, + [OneMinusDstColorFactor]: gl.ONE_MINUS_DST_COLOR, + [OneMinusDstAlphaFactor]: gl.ONE_MINUS_DST_ALPHA, + [ConstantColorFactor]: gl.CONSTANT_COLOR, + [OneMinusConstantColorFactor]: gl.ONE_MINUS_CONSTANT_COLOR, + [ConstantAlphaFactor]: gl.CONSTANT_ALPHA, + [OneMinusConstantAlphaFactor]: gl.ONE_MINUS_CONSTANT_ALPHA + }; + function setBlending(blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, blendColor, blendAlpha, premultipliedAlpha) { + if (blending === NoBlending) { + if (currentBlendingEnabled === true) { + disable(gl.BLEND); + currentBlendingEnabled = false; + } + return; + } + if (currentBlendingEnabled === false) { + enable(gl.BLEND); + currentBlendingEnabled = true; + } + if (blending !== CustomBlending) { + if (blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha) { + if (currentBlendEquation !== AddEquation || currentBlendEquationAlpha !== AddEquation) { + gl.blendEquation(gl.FUNC_ADD); + currentBlendEquation = AddEquation; + currentBlendEquationAlpha = AddEquation; } - for (let j = 0; j < 3; j++) { - const jNext = (j + 1) % 3; - const vecHash0 = hashes[j]; - const vecHash1 = hashes[jNext]; - const v0 = _triangle[vertKeys[j]]; - const v1 = _triangle[vertKeys[jNext]]; - const hash = `${vecHash0}_${vecHash1}`; - const reverseHash = `${vecHash1}_${vecHash0}`; - if (reverseHash in edgeData && edgeData[reverseHash]) { - if (_normal.dot(edgeData[reverseHash].normal) <= thresholdDot) { - vertices.push(v0.x, v0.y, v0.z); - vertices.push(v1.x, v1.y, v1.z); - } - edgeData[reverseHash] = null; - } else if (!(hash in edgeData)) { - edgeData[hash] = { - index0: indexArr[j], - index1: indexArr[jNext], - normal: _normal.clone() - }; + if (premultipliedAlpha) { + switch (blending) { + case NormalBlending: + gl.blendFuncSeparate(gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + break; + case AdditiveBlending: + gl.blendFunc(gl.ONE, gl.ONE); + break; + case SubtractiveBlending: + gl.blendFuncSeparate(gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE); + break; + case MultiplyBlending: + gl.blendFuncSeparate(gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA); + break; + default: + console.error("THREE.WebGLState: Invalid blending: ", blending); + break; + } + } else { + switch (blending) { + case NormalBlending: + gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + break; + case AdditiveBlending: + gl.blendFunc(gl.SRC_ALPHA, gl.ONE); + break; + case SubtractiveBlending: + gl.blendFuncSeparate(gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE); + break; + case MultiplyBlending: + gl.blendFunc(gl.ZERO, gl.SRC_COLOR); + break; + default: + console.error("THREE.WebGLState: Invalid blending: ", blending); + break; } } + currentBlendSrc = null; + currentBlendDst = null; + currentBlendSrcAlpha = null; + currentBlendDstAlpha = null; + currentBlendColor.set(0, 0, 0); + currentBlendAlpha = 0; + currentBlending = blending; + currentPremultipledAlpha = premultipliedAlpha; } - for (const key in edgeData) { - if (edgeData[key]) { - const { index0, index1 } = edgeData[key]; - _v0.fromBufferAttribute(positionAttr, index0); - _v1$1.fromBufferAttribute(positionAttr, index1); - vertices.push(_v0.x, _v0.y, _v0.z); - vertices.push(_v1$1.x, _v1$1.y, _v1$1.z); - } - } - this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + return; } + blendEquationAlpha = blendEquationAlpha || blendEquation; + blendSrcAlpha = blendSrcAlpha || blendSrc; + blendDstAlpha = blendDstAlpha || blendDst; + if (blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha) { + gl.blendEquationSeparate(equationToGL[blendEquation], equationToGL[blendEquationAlpha]); + currentBlendEquation = blendEquation; + currentBlendEquationAlpha = blendEquationAlpha; + } + if (blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha) { + gl.blendFuncSeparate(factorToGL[blendSrc], factorToGL[blendDst], factorToGL[blendSrcAlpha], factorToGL[blendDstAlpha]); + currentBlendSrc = blendSrc; + currentBlendDst = blendDst; + currentBlendSrcAlpha = blendSrcAlpha; + currentBlendDstAlpha = blendDstAlpha; + } + if (blendColor.equals(currentBlendColor) === false || blendAlpha !== currentBlendAlpha) { + gl.blendColor(blendColor.r, blendColor.g, blendColor.b, blendAlpha); + currentBlendColor.copy(blendColor); + currentBlendAlpha = blendAlpha; + } + currentBlending = blending; + currentPremultipledAlpha = false; } - copy(source) { - super.copy(source); - this.parameters = Object.assign({}, source.parameters); - return this; - } -} -class Shape extends Path { - static { - __name(this, "Shape"); + __name(setBlending, "setBlending"); + function setMaterial(material, frontFaceCW) { + material.side === DoubleSide ? disable(gl.CULL_FACE) : enable(gl.CULL_FACE); + let flipSided = material.side === BackSide; + if (frontFaceCW) flipSided = !flipSided; + setFlipSided(flipSided); + material.blending === NormalBlending && material.transparent === false ? setBlending(NoBlending) : setBlending(material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.blendColor, material.blendAlpha, material.premultipliedAlpha); + depthBuffer.setFunc(material.depthFunc); + depthBuffer.setTest(material.depthTest); + depthBuffer.setMask(material.depthWrite); + colorBuffer.setMask(material.colorWrite); + const stencilWrite = material.stencilWrite; + stencilBuffer.setTest(stencilWrite); + if (stencilWrite) { + stencilBuffer.setMask(material.stencilWriteMask); + stencilBuffer.setFunc(material.stencilFunc, material.stencilRef, material.stencilFuncMask); + stencilBuffer.setOp(material.stencilFail, material.stencilZFail, material.stencilZPass); + } + setPolygonOffset(material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits); + material.alphaToCoverage === true ? enable(gl.SAMPLE_ALPHA_TO_COVERAGE) : disable(gl.SAMPLE_ALPHA_TO_COVERAGE); } - constructor(points) { - super(points); - this.uuid = generateUUID(); - this.type = "Shape"; - this.holes = []; + __name(setMaterial, "setMaterial"); + function setFlipSided(flipSided) { + if (currentFlipSided !== flipSided) { + if (flipSided) { + gl.frontFace(gl.CW); + } else { + gl.frontFace(gl.CCW); + } + currentFlipSided = flipSided; + } } - getPointsHoles(divisions) { - const holesPts = []; - for (let i = 0, l = this.holes.length; i < l; i++) { - holesPts[i] = this.holes[i].getPoints(divisions); + __name(setFlipSided, "setFlipSided"); + function setCullFace(cullFace) { + if (cullFace !== CullFaceNone) { + enable(gl.CULL_FACE); + if (cullFace !== currentCullFace) { + if (cullFace === CullFaceBack) { + gl.cullFace(gl.BACK); + } else if (cullFace === CullFaceFront) { + gl.cullFace(gl.FRONT); + } else { + gl.cullFace(gl.FRONT_AND_BACK); + } + } + } else { + disable(gl.CULL_FACE); } - return holesPts; + currentCullFace = cullFace; } - // get points of shape and holes (keypoints based on segments parameter) - extractPoints(divisions) { - return { - shape: this.getPoints(divisions), - holes: this.getPointsHoles(divisions) - }; + __name(setCullFace, "setCullFace"); + function setLineWidth(width) { + if (width !== currentLineWidth) { + if (lineWidthAvailable) gl.lineWidth(width); + currentLineWidth = width; + } } - copy(source) { - super.copy(source); - this.holes = []; - for (let i = 0, l = source.holes.length; i < l; i++) { - const hole = source.holes[i]; - this.holes.push(hole.clone()); + __name(setLineWidth, "setLineWidth"); + function setPolygonOffset(polygonOffset, factor, units) { + if (polygonOffset) { + enable(gl.POLYGON_OFFSET_FILL); + if (currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units) { + gl.polygonOffset(factor, units); + currentPolygonOffsetFactor = factor; + currentPolygonOffsetUnits = units; + } + } else { + disable(gl.POLYGON_OFFSET_FILL); } - return this; } - toJSON() { - const data = super.toJSON(); - data.uuid = this.uuid; - data.holes = []; - for (let i = 0, l = this.holes.length; i < l; i++) { - const hole = this.holes[i]; - data.holes.push(hole.toJSON()); + __name(setPolygonOffset, "setPolygonOffset"); + function setScissorTest(scissorTest) { + if (scissorTest) { + enable(gl.SCISSOR_TEST); + } else { + disable(gl.SCISSOR_TEST); } - return data; } - fromJSON(json) { - super.fromJSON(json); - this.uuid = json.uuid; - this.holes = []; - for (let i = 0, l = json.holes.length; i < l; i++) { - const hole = json.holes[i]; - this.holes.push(new Path().fromJSON(hole)); + __name(setScissorTest, "setScissorTest"); + function activeTexture(webglSlot) { + if (webglSlot === void 0) webglSlot = gl.TEXTURE0 + maxTextures - 1; + if (currentTextureSlot !== webglSlot) { + gl.activeTexture(webglSlot); + currentTextureSlot = webglSlot; } - return this; } -} -const Earcut = { - triangulate: /* @__PURE__ */ __name(function(data, holeIndices, dim = 2) { - const hasHoles = holeIndices && holeIndices.length; - const outerLen = hasHoles ? holeIndices[0] * dim : data.length; - let outerNode = linkedList(data, 0, outerLen, dim, true); - const triangles = []; - if (!outerNode || outerNode.next === outerNode.prev) return triangles; - let minX, minY, maxX, maxY, x, y, invSize; - if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim); - if (data.length > 80 * dim) { - minX = maxX = data[0]; - minY = maxY = data[1]; - for (let i = dim; i < outerLen; i += dim) { - x = data[i]; - y = data[i + 1]; - if (x < minX) minX = x; - if (y < minY) minY = y; - if (x > maxX) maxX = x; - if (y > maxY) maxY = y; + __name(activeTexture, "activeTexture"); + function bindTexture(webglType, webglTexture, webglSlot) { + if (webglSlot === void 0) { + if (currentTextureSlot === null) { + webglSlot = gl.TEXTURE0 + maxTextures - 1; + } else { + webglSlot = currentTextureSlot; } - invSize = Math.max(maxX - minX, maxY - minY); - invSize = invSize !== 0 ? 32767 / invSize : 0; } - earcutLinked(outerNode, triangles, dim, minX, minY, invSize, 0); - return triangles; - }, "triangulate") -}; -function linkedList(data, start, end, dim, clockwise) { - let i, last; - if (clockwise === signedArea(data, start, end, dim) > 0) { - for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last); - } else { - for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last); + let boundTexture = currentBoundTextures[webglSlot]; + if (boundTexture === void 0) { + boundTexture = { type: void 0, texture: void 0 }; + currentBoundTextures[webglSlot] = boundTexture; + } + if (boundTexture.type !== webglType || boundTexture.texture !== webglTexture) { + if (currentTextureSlot !== webglSlot) { + gl.activeTexture(webglSlot); + currentTextureSlot = webglSlot; + } + gl.bindTexture(webglType, webglTexture || emptyTextures[webglType]); + boundTexture.type = webglType; + boundTexture.texture = webglTexture; + } } - if (last && equals(last, last.next)) { - removeNode(last); - last = last.next; + __name(bindTexture, "bindTexture"); + function unbindTexture() { + const boundTexture = currentBoundTextures[currentTextureSlot]; + if (boundTexture !== void 0 && boundTexture.type !== void 0) { + gl.bindTexture(boundTexture.type, null); + boundTexture.type = void 0; + boundTexture.texture = void 0; + } } - return last; -} -__name(linkedList, "linkedList"); -function filterPoints(start, end) { - if (!start) return start; - if (!end) end = start; - let p = start, again; - do { - again = false; - if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) { - removeNode(p); - p = end = p.prev; - if (p === p.next) break; - again = true; - } else { - p = p.next; + __name(unbindTexture, "unbindTexture"); + function compressedTexImage2D() { + try { + gl.compressedTexImage2D.apply(gl, arguments); + } catch (error) { + console.error("THREE.WebGLState:", error); } - } while (again || p !== end); - return end; -} -__name(filterPoints, "filterPoints"); -function earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) { - if (!ear) return; - if (!pass && invSize) indexCurve(ear, minX, minY, invSize); - let stop = ear, prev, next; - while (ear.prev !== ear.next) { - prev = ear.prev; - next = ear.next; - if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) { - triangles.push(prev.i / dim | 0); - triangles.push(ear.i / dim | 0); - triangles.push(next.i / dim | 0); - removeNode(ear); - ear = next.next; - stop = next.next; - continue; + } + __name(compressedTexImage2D, "compressedTexImage2D"); + function compressedTexImage3D() { + try { + gl.compressedTexImage3D.apply(gl, arguments); + } catch (error) { + console.error("THREE.WebGLState:", error); } - ear = next; - if (ear === stop) { - if (!pass) { - earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1); - } else if (pass === 1) { - ear = cureLocalIntersections(filterPoints(ear), triangles, dim); - earcutLinked(ear, triangles, dim, minX, minY, invSize, 2); - } else if (pass === 2) { - splitEarcut(ear, triangles, dim, minX, minY, invSize); - } - break; + } + __name(compressedTexImage3D, "compressedTexImage3D"); + function texSubImage2D() { + try { + gl.texSubImage2D.apply(gl, arguments); + } catch (error) { + console.error("THREE.WebGLState:", error); } } -} -__name(earcutLinked, "earcutLinked"); -function isEar(ear) { - const a = ear.prev, b = ear, c = ear.next; - if (area(a, b, c) >= 0) return false; - const ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y; - const x0 = ax < bx ? ax < cx ? ax : cx : bx < cx ? bx : cx, y0 = ay < by ? ay < cy ? ay : cy : by < cy ? by : cy, x1 = ax > bx ? ax > cx ? ax : cx : bx > cx ? bx : cx, y1 = ay > by ? ay > cy ? ay : cy : by > cy ? by : cy; - let p = c.next; - while (p !== a) { - if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && pointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false; - p = p.next; + __name(texSubImage2D, "texSubImage2D"); + function texSubImage3D() { + try { + gl.texSubImage3D.apply(gl, arguments); + } catch (error) { + console.error("THREE.WebGLState:", error); + } } - return true; -} -__name(isEar, "isEar"); -function isEarHashed(ear, minX, minY, invSize) { - const a = ear.prev, b = ear, c = ear.next; - if (area(a, b, c) >= 0) return false; - const ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y; - const x0 = ax < bx ? ax < cx ? ax : cx : bx < cx ? bx : cx, y0 = ay < by ? ay < cy ? ay : cy : by < cy ? by : cy, x1 = ax > bx ? ax > cx ? ax : cx : bx > cx ? bx : cx, y1 = ay > by ? ay > cy ? ay : cy : by > cy ? by : cy; - const minZ = zOrder(x0, y0, minX, minY, invSize), maxZ = zOrder(x1, y1, minX, minY, invSize); - let p = ear.prevZ, n = ear.nextZ; - while (p && p.z >= minZ && n && n.z <= maxZ) { - if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c && pointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false; - p = p.prevZ; - if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c && pointInTriangle(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false; - n = n.nextZ; + __name(texSubImage3D, "texSubImage3D"); + function compressedTexSubImage2D() { + try { + gl.compressedTexSubImage2D.apply(gl, arguments); + } catch (error) { + console.error("THREE.WebGLState:", error); + } } - while (p && p.z >= minZ) { - if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c && pointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false; - p = p.prevZ; + __name(compressedTexSubImage2D, "compressedTexSubImage2D"); + function compressedTexSubImage3D() { + try { + gl.compressedTexSubImage3D.apply(gl, arguments); + } catch (error) { + console.error("THREE.WebGLState:", error); + } } - while (n && n.z <= maxZ) { - if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c && pointInTriangle(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false; - n = n.nextZ; + __name(compressedTexSubImage3D, "compressedTexSubImage3D"); + function texStorage2D() { + try { + gl.texStorage2D.apply(gl, arguments); + } catch (error) { + console.error("THREE.WebGLState:", error); + } } - return true; -} -__name(isEarHashed, "isEarHashed"); -function cureLocalIntersections(start, triangles, dim) { - let p = start; - do { - const a = p.prev, b = p.next.next; - if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) { - triangles.push(a.i / dim | 0); - triangles.push(p.i / dim | 0); - triangles.push(b.i / dim | 0); - removeNode(p); - removeNode(p.next); - p = start = b; + __name(texStorage2D, "texStorage2D"); + function texStorage3D() { + try { + gl.texStorage3D.apply(gl, arguments); + } catch (error) { + console.error("THREE.WebGLState:", error); } - p = p.next; - } while (p !== start); - return filterPoints(p); -} -__name(cureLocalIntersections, "cureLocalIntersections"); -function splitEarcut(start, triangles, dim, minX, minY, invSize) { - let a = start; - do { - let b = a.next.next; - while (b !== a.prev) { - if (a.i !== b.i && isValidDiagonal(a, b)) { - let c = splitPolygon(a, b); - a = filterPoints(a, a.next); - c = filterPoints(c, c.next); - earcutLinked(a, triangles, dim, minX, minY, invSize, 0); - earcutLinked(c, triangles, dim, minX, minY, invSize, 0); - return; - } - b = b.next; + } + __name(texStorage3D, "texStorage3D"); + function texImage2D() { + try { + gl.texImage2D.apply(gl, arguments); + } catch (error) { + console.error("THREE.WebGLState:", error); } - a = a.next; - } while (a !== start); -} -__name(splitEarcut, "splitEarcut"); -function eliminateHoles(data, holeIndices, outerNode, dim) { - const queue = []; - let i, len, start, end, list; - for (i = 0, len = holeIndices.length; i < len; i++) { - start = holeIndices[i] * dim; - end = i < len - 1 ? holeIndices[i + 1] * dim : data.length; - list = linkedList(data, start, end, dim, false); - if (list === list.next) list.steiner = true; - queue.push(getLeftmost(list)); } - queue.sort(compareX); - for (i = 0; i < queue.length; i++) { - outerNode = eliminateHole(queue[i], outerNode); + __name(texImage2D, "texImage2D"); + function texImage3D() { + try { + gl.texImage3D.apply(gl, arguments); + } catch (error) { + console.error("THREE.WebGLState:", error); + } } - return outerNode; -} -__name(eliminateHoles, "eliminateHoles"); -function compareX(a, b) { - return a.x - b.x; -} -__name(compareX, "compareX"); -function eliminateHole(hole, outerNode) { - const bridge = findHoleBridge(hole, outerNode); - if (!bridge) { - return outerNode; + __name(texImage3D, "texImage3D"); + function scissor(scissor2) { + if (currentScissor.equals(scissor2) === false) { + gl.scissor(scissor2.x, scissor2.y, scissor2.z, scissor2.w); + currentScissor.copy(scissor2); + } } - const bridgeReverse = splitPolygon(bridge, hole); - filterPoints(bridgeReverse, bridgeReverse.next); - return filterPoints(bridge, bridge.next); -} -__name(eliminateHole, "eliminateHole"); -function findHoleBridge(hole, outerNode) { - let p = outerNode, qx = -Infinity, m; - const hx = hole.x, hy = hole.y; - do { - if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) { - const x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y); - if (x <= hx && x > qx) { - qx = x; - m = p.x < p.next.x ? p : p.next; - if (x === hx) return m; - } + __name(scissor, "scissor"); + function viewport(viewport2) { + if (currentViewport.equals(viewport2) === false) { + gl.viewport(viewport2.x, viewport2.y, viewport2.z, viewport2.w); + currentViewport.copy(viewport2); } - p = p.next; - } while (p !== outerNode); - if (!m) return null; - const stop = m, mx = m.x, my = m.y; - let tanMin = Infinity, tan; - p = m; - do { - if (hx >= p.x && p.x >= mx && hx !== p.x && pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) { - tan = Math.abs(hy - p.y) / (hx - p.x); - if (locallyInside(p, hole) && (tan < tanMin || tan === tanMin && (p.x > m.x || p.x === m.x && sectorContainsSector(m, p)))) { - m = p; - tanMin = tan; - } + } + __name(viewport, "viewport"); + function updateUBOMapping(uniformsGroup, program) { + let mapping = uboProgramMap.get(program); + if (mapping === void 0) { + mapping = /* @__PURE__ */ new WeakMap(); + uboProgramMap.set(program, mapping); } - p = p.next; - } while (p !== stop); - return m; -} -__name(findHoleBridge, "findHoleBridge"); -function sectorContainsSector(m, p) { - return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0; -} -__name(sectorContainsSector, "sectorContainsSector"); -function indexCurve(start, minX, minY, invSize) { - let p = start; - do { - if (p.z === 0) p.z = zOrder(p.x, p.y, minX, minY, invSize); - p.prevZ = p.prev; - p.nextZ = p.next; - p = p.next; - } while (p !== start); - p.prevZ.nextZ = null; - p.prevZ = null; - sortLinked(p); -} -__name(indexCurve, "indexCurve"); -function sortLinked(list) { - let i, p, q, e, tail, numMerges, pSize, qSize, inSize = 1; - do { - p = list; - list = null; - tail = null; - numMerges = 0; - while (p) { - numMerges++; - q = p; - pSize = 0; - for (i = 0; i < inSize; i++) { - pSize++; - q = q.nextZ; - if (!q) break; - } - qSize = inSize; - while (pSize > 0 || qSize > 0 && q) { - if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) { - e = p; - p = p.nextZ; - pSize--; - } else { - e = q; - q = q.nextZ; - qSize--; - } - if (tail) tail.nextZ = e; - else list = e; - e.prevZ = tail; - tail = e; - } - p = q; + let blockIndex = mapping.get(uniformsGroup); + if (blockIndex === void 0) { + blockIndex = gl.getUniformBlockIndex(program, uniformsGroup.name); + mapping.set(uniformsGroup, blockIndex); } - tail.nextZ = null; - inSize *= 2; - } while (numMerges > 1); - return list; -} -__name(sortLinked, "sortLinked"); -function zOrder(x, y, minX, minY, invSize) { - x = (x - minX) * invSize | 0; - y = (y - minY) * invSize | 0; - x = (x | x << 8) & 16711935; - x = (x | x << 4) & 252645135; - x = (x | x << 2) & 858993459; - x = (x | x << 1) & 1431655765; - y = (y | y << 8) & 16711935; - y = (y | y << 4) & 252645135; - y = (y | y << 2) & 858993459; - y = (y | y << 1) & 1431655765; - return x | y << 1; -} -__name(zOrder, "zOrder"); -function getLeftmost(start) { - let p = start, leftmost = start; - do { - if (p.x < leftmost.x || p.x === leftmost.x && p.y < leftmost.y) leftmost = p; - p = p.next; - } while (p !== start); - return leftmost; -} -__name(getLeftmost, "getLeftmost"); -function pointInTriangle(ax, ay, bx, by, cx, cy, px2, py2) { - return (cx - px2) * (ay - py2) >= (ax - px2) * (cy - py2) && (ax - px2) * (by - py2) >= (bx - px2) * (ay - py2) && (bx - px2) * (cy - py2) >= (cx - px2) * (by - py2); -} -__name(pointInTriangle, "pointInTriangle"); -function isValidDiagonal(a, b) { - return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // dones't intersect other edges - (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible - (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors - equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); -} -__name(isValidDiagonal, "isValidDiagonal"); -function area(p, q, r) { - return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y); -} -__name(area, "area"); -function equals(p1, p2) { - return p1.x === p2.x && p1.y === p2.y; -} -__name(equals, "equals"); -function intersects(p1, q1, p2, q2) { - const o1 = sign(area(p1, q1, p2)); - const o2 = sign(area(p1, q1, q2)); - const o3 = sign(area(p2, q2, p1)); - const o4 = sign(area(p2, q2, q1)); - if (o1 !== o2 && o3 !== o4) return true; - if (o1 === 0 && onSegment(p1, p2, q1)) return true; - if (o2 === 0 && onSegment(p1, q2, q1)) return true; - if (o3 === 0 && onSegment(p2, p1, q2)) return true; - if (o4 === 0 && onSegment(p2, q1, q2)) return true; - return false; -} -__name(intersects, "intersects"); -function onSegment(p, q, r) { - return 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); -} -__name(onSegment, "onSegment"); -function sign(num) { - return num > 0 ? 1 : num < 0 ? -1 : 0; -} -__name(sign, "sign"); -function intersectsPolygon(a, b) { - let p = a; - do { - if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i && intersects(p, p.next, a, b)) return true; - p = p.next; - } while (p !== a); - return false; -} -__name(intersectsPolygon, "intersectsPolygon"); -function locallyInside(a, b) { - return area(a.prev, a, a.next) < 0 ? area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 : area(a, b, a.prev) < 0 || area(a, a.next, b) < 0; -} -__name(locallyInside, "locallyInside"); -function middleInside(a, b) { - let p = a, inside = false; - const px2 = (a.x + b.x) / 2, py2 = (a.y + b.y) / 2; - do { - if (p.y > py2 !== p.next.y > py2 && p.next.y !== p.y && px2 < (p.next.x - p.x) * (py2 - p.y) / (p.next.y - p.y) + p.x) - inside = !inside; - p = p.next; - } while (p !== a); - return inside; -} -__name(middleInside, "middleInside"); -function splitPolygon(a, b) { - const a2 = new Node(a.i, a.x, a.y), b22 = new Node(b.i, b.x, b.y), an = a.next, bp = b.prev; - a.next = b; - b.prev = a; - a2.next = an; - an.prev = a2; - b22.next = a2; - a2.prev = b22; - bp.next = b22; - b22.prev = bp; - return b22; -} -__name(splitPolygon, "splitPolygon"); -function insertNode(i, x, y, last) { - const p = new Node(i, x, y); - if (!last) { - p.prev = p; - p.next = p; - } else { - p.next = last.next; - p.prev = last; - last.next.prev = p; - last.next = p; } - return p; -} -__name(insertNode, "insertNode"); -function removeNode(p) { - p.next.prev = p.prev; - p.prev.next = p.next; - if (p.prevZ) p.prevZ.nextZ = p.nextZ; - if (p.nextZ) p.nextZ.prevZ = p.prevZ; -} -__name(removeNode, "removeNode"); -function Node(i, x, y) { - this.i = i; - this.x = x; - this.y = y; - this.prev = null; - this.next = null; - this.z = 0; - this.prevZ = null; - this.nextZ = null; - this.steiner = false; + __name(updateUBOMapping, "updateUBOMapping"); + function uniformBlockBinding(uniformsGroup, program) { + const mapping = uboProgramMap.get(program); + const blockIndex = mapping.get(uniformsGroup); + if (uboBindings.get(program) !== blockIndex) { + gl.uniformBlockBinding(program, blockIndex, uniformsGroup.__bindingPointIndex); + uboBindings.set(program, blockIndex); + } + } + __name(uniformBlockBinding, "uniformBlockBinding"); + function reset() { + gl.disable(gl.BLEND); + gl.disable(gl.CULL_FACE); + gl.disable(gl.DEPTH_TEST); + gl.disable(gl.POLYGON_OFFSET_FILL); + gl.disable(gl.SCISSOR_TEST); + gl.disable(gl.STENCIL_TEST); + gl.disable(gl.SAMPLE_ALPHA_TO_COVERAGE); + gl.blendEquation(gl.FUNC_ADD); + gl.blendFunc(gl.ONE, gl.ZERO); + gl.blendFuncSeparate(gl.ONE, gl.ZERO, gl.ONE, gl.ZERO); + gl.blendColor(0, 0, 0, 0); + gl.colorMask(true, true, true, true); + gl.clearColor(0, 0, 0, 0); + gl.depthMask(true); + gl.depthFunc(gl.LESS); + depthBuffer.setReversed(false); + gl.clearDepth(1); + gl.stencilMask(4294967295); + gl.stencilFunc(gl.ALWAYS, 0, 4294967295); + gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP); + gl.clearStencil(0); + gl.cullFace(gl.BACK); + gl.frontFace(gl.CCW); + gl.polygonOffset(0, 0); + gl.activeTexture(gl.TEXTURE0); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null); + gl.bindFramebuffer(gl.READ_FRAMEBUFFER, null); + gl.useProgram(null); + gl.lineWidth(1); + gl.scissor(0, 0, gl.canvas.width, gl.canvas.height); + gl.viewport(0, 0, gl.canvas.width, gl.canvas.height); + enabledCapabilities = {}; + currentTextureSlot = null; + currentBoundTextures = {}; + currentBoundFramebuffers = {}; + currentDrawbuffers = /* @__PURE__ */ new WeakMap(); + defaultDrawbuffers = []; + currentProgram = null; + currentBlendingEnabled = false; + currentBlending = null; + currentBlendEquation = null; + currentBlendSrc = null; + currentBlendDst = null; + currentBlendEquationAlpha = null; + currentBlendSrcAlpha = null; + currentBlendDstAlpha = null; + currentBlendColor = new Color(0, 0, 0); + currentBlendAlpha = 0; + currentPremultipledAlpha = false; + currentFlipSided = null; + currentCullFace = null; + currentLineWidth = null; + currentPolygonOffsetFactor = null; + currentPolygonOffsetUnits = null; + currentScissor.set(0, 0, gl.canvas.width, gl.canvas.height); + currentViewport.set(0, 0, gl.canvas.width, gl.canvas.height); + colorBuffer.reset(); + depthBuffer.reset(); + stencilBuffer.reset(); + } + __name(reset, "reset"); + return { + buffers: { + color: colorBuffer, + depth: depthBuffer, + stencil: stencilBuffer + }, + enable, + disable, + bindFramebuffer, + drawBuffers, + useProgram, + setBlending, + setMaterial, + setFlipSided, + setCullFace, + setLineWidth, + setPolygonOffset, + setScissorTest, + activeTexture, + bindTexture, + unbindTexture, + compressedTexImage2D, + compressedTexImage3D, + texImage2D, + texImage3D, + updateUBOMapping, + uniformBlockBinding, + texStorage2D, + texStorage3D, + texSubImage2D, + texSubImage3D, + compressedTexSubImage2D, + compressedTexSubImage3D, + scissor, + viewport, + reset + }; } -__name(Node, "Node"); -function signedArea(data, start, end, dim) { - let sum = 0; - for (let i = start, j = end - dim; i < end; i += dim) { - sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]); - j = i; +__name(WebGLState, "WebGLState"); +function contain(texture, aspect2) { + const imageAspect = texture.image && texture.image.width ? texture.image.width / texture.image.height : 1; + if (imageAspect > aspect2) { + texture.repeat.x = 1; + texture.repeat.y = imageAspect / aspect2; + texture.offset.x = 0; + texture.offset.y = (1 - texture.repeat.y) / 2; + } else { + texture.repeat.x = aspect2 / imageAspect; + texture.repeat.y = 1; + texture.offset.x = (1 - texture.repeat.x) / 2; + texture.offset.y = 0; } - return sum; + return texture; } -__name(signedArea, "signedArea"); -class ShapeUtils { - static { - __name(this, "ShapeUtils"); - } - // calculate area of the contour polygon - static area(contour) { - const n = contour.length; - let a = 0; - for (let p = n - 1, q = 0; q < n; p = q++) { - a += contour[p].x * contour[q].y - contour[q].x * contour[p].y; - } - return a * 0.5; - } - static isClockWise(pts) { - return ShapeUtils.area(pts) < 0; - } - static triangulateShape(contour, holes) { - const vertices = []; - const holeIndices = []; - const faces = []; - removeDupEndPts(contour); - addContour(vertices, contour); - let holeIndex = contour.length; - holes.forEach(removeDupEndPts); - for (let i = 0; i < holes.length; i++) { - holeIndices.push(holeIndex); - holeIndex += holes[i].length; - addContour(vertices, holes[i]); - } - const triangles = Earcut.triangulate(vertices, holeIndices); - for (let i = 0; i < triangles.length; i += 3) { - faces.push(triangles.slice(i, i + 3)); - } - return faces; +__name(contain, "contain"); +function cover(texture, aspect2) { + const imageAspect = texture.image && texture.image.width ? texture.image.width / texture.image.height : 1; + if (imageAspect > aspect2) { + texture.repeat.x = aspect2 / imageAspect; + texture.repeat.y = 1; + texture.offset.x = (1 - texture.repeat.x) / 2; + texture.offset.y = 0; + } else { + texture.repeat.x = 1; + texture.repeat.y = imageAspect / aspect2; + texture.offset.x = 0; + texture.offset.y = (1 - texture.repeat.y) / 2; } + return texture; } -function removeDupEndPts(points) { - const l = points.length; - if (l > 2 && points[l - 1].equals(points[0])) { - points.pop(); +__name(cover, "cover"); +function fill(texture) { + texture.repeat.x = 1; + texture.repeat.y = 1; + texture.offset.x = 0; + texture.offset.y = 0; + return texture; +} +__name(fill, "fill"); +function getByteLength(width, height, format, type) { + const typeByteLength = getTextureTypeByteLength(type); + switch (format) { + case AlphaFormat: + return width * height; + case LuminanceFormat: + return width * height; + case LuminanceAlphaFormat: + return width * height * 2; + case RedFormat: + return width * height / typeByteLength.components * typeByteLength.byteLength; + case RedIntegerFormat: + return width * height / typeByteLength.components * typeByteLength.byteLength; + case RGFormat: + return width * height * 2 / typeByteLength.components * typeByteLength.byteLength; + case RGIntegerFormat: + return width * height * 2 / typeByteLength.components * typeByteLength.byteLength; + case RGBFormat: + return width * height * 3 / typeByteLength.components * typeByteLength.byteLength; + case RGBAFormat: + return width * height * 4 / typeByteLength.components * typeByteLength.byteLength; + case RGBAIntegerFormat: + return width * height * 4 / typeByteLength.components * typeByteLength.byteLength; + case RGB_S3TC_DXT1_Format: + case RGBA_S3TC_DXT1_Format: + return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 8; + case RGBA_S3TC_DXT3_Format: + case RGBA_S3TC_DXT5_Format: + return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 16; + case RGB_PVRTC_2BPPV1_Format: + case RGBA_PVRTC_2BPPV1_Format: + return Math.max(width, 16) * Math.max(height, 8) / 4; + case RGB_PVRTC_4BPPV1_Format: + case RGBA_PVRTC_4BPPV1_Format: + return Math.max(width, 8) * Math.max(height, 8) / 2; + case RGB_ETC1_Format: + case RGB_ETC2_Format: + return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 8; + case RGBA_ETC2_EAC_Format: + return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 16; + case RGBA_ASTC_4x4_Format: + return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 16; + case RGBA_ASTC_5x4_Format: + return Math.floor((width + 4) / 5) * Math.floor((height + 3) / 4) * 16; + case RGBA_ASTC_5x5_Format: + return Math.floor((width + 4) / 5) * Math.floor((height + 4) / 5) * 16; + case RGBA_ASTC_6x5_Format: + return Math.floor((width + 5) / 6) * Math.floor((height + 4) / 5) * 16; + case RGBA_ASTC_6x6_Format: + return Math.floor((width + 5) / 6) * Math.floor((height + 5) / 6) * 16; + case RGBA_ASTC_8x5_Format: + return Math.floor((width + 7) / 8) * Math.floor((height + 4) / 5) * 16; + case RGBA_ASTC_8x6_Format: + return Math.floor((width + 7) / 8) * Math.floor((height + 5) / 6) * 16; + case RGBA_ASTC_8x8_Format: + return Math.floor((width + 7) / 8) * Math.floor((height + 7) / 8) * 16; + case RGBA_ASTC_10x5_Format: + return Math.floor((width + 9) / 10) * Math.floor((height + 4) / 5) * 16; + case RGBA_ASTC_10x6_Format: + return Math.floor((width + 9) / 10) * Math.floor((height + 5) / 6) * 16; + case RGBA_ASTC_10x8_Format: + return Math.floor((width + 9) / 10) * Math.floor((height + 7) / 8) * 16; + case RGBA_ASTC_10x10_Format: + return Math.floor((width + 9) / 10) * Math.floor((height + 9) / 10) * 16; + case RGBA_ASTC_12x10_Format: + return Math.floor((width + 11) / 12) * Math.floor((height + 9) / 10) * 16; + case RGBA_ASTC_12x12_Format: + return Math.floor((width + 11) / 12) * Math.floor((height + 11) / 12) * 16; + case RGBA_BPTC_Format: + case RGB_BPTC_SIGNED_Format: + case RGB_BPTC_UNSIGNED_Format: + return Math.ceil(width / 4) * Math.ceil(height / 4) * 16; + case RED_RGTC1_Format: + case SIGNED_RED_RGTC1_Format: + return Math.ceil(width / 4) * Math.ceil(height / 4) * 8; + case RED_GREEN_RGTC2_Format: + case SIGNED_RED_GREEN_RGTC2_Format: + return Math.ceil(width / 4) * Math.ceil(height / 4) * 16; } + throw new Error( + `Unable to determine texture byte length for ${format} format.` + ); } -__name(removeDupEndPts, "removeDupEndPts"); -function addContour(vertices, contour) { - for (let i = 0; i < contour.length; i++) { - vertices.push(contour[i].x); - vertices.push(contour[i].y); +__name(getByteLength, "getByteLength"); +function getTextureTypeByteLength(type) { + switch (type) { + case UnsignedByteType: + case ByteType: + return { byteLength: 1, components: 1 }; + case UnsignedShortType: + case ShortType: + case HalfFloatType: + return { byteLength: 2, components: 1 }; + case UnsignedShort4444Type: + case UnsignedShort5551Type: + return { byteLength: 2, components: 4 }; + case UnsignedIntType: + case IntType: + case FloatType: + return { byteLength: 4, components: 1 }; + case UnsignedInt5999Type: + return { byteLength: 4, components: 3 }; } + throw new Error(`Unknown texture type ${type}.`); } -__name(addContour, "addContour"); -class ExtrudeGeometry extends BufferGeometry { - static { - __name(this, "ExtrudeGeometry"); +__name(getTextureTypeByteLength, "getTextureTypeByteLength"); +const TextureUtils = { + contain, + cover, + fill, + getByteLength +}; +function WebGLTextures(_gl, extensions, state, properties, capabilities, utils, info) { + const multisampledRTTExt = extensions.has("WEBGL_multisampled_render_to_texture") ? extensions.get("WEBGL_multisampled_render_to_texture") : null; + const supportsInvalidateFramebuffer = typeof navigator === "undefined" ? false : /OculusBrowser/g.test(navigator.userAgent); + const _imageDimensions = new Vector2(); + const _videoTextures = /* @__PURE__ */ new WeakMap(); + let _canvas2; + const _sources = /* @__PURE__ */ new WeakMap(); + let useOffscreenCanvas = false; + try { + useOffscreenCanvas = typeof OffscreenCanvas !== "undefined" && new OffscreenCanvas(1, 1).getContext("2d") !== null; + } catch (err2) { } - constructor(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 = {}) { - super(); - this.type = "ExtrudeGeometry"; - this.parameters = { - shapes, - options - }; - shapes = Array.isArray(shapes) ? shapes : [shapes]; - const scope = this; - const verticesArray = []; - const uvArray = []; - for (let i = 0, l = shapes.length; i < l; i++) { - const shape = shapes[i]; - addShape(shape); + function createCanvas(width, height) { + return useOffscreenCanvas ? ( + // eslint-disable-next-line compat/compat + new OffscreenCanvas(width, height) + ) : createElementNS("canvas"); + } + __name(createCanvas, "createCanvas"); + function resizeImage(image, needsNewCanvas, maxSize) { + let scale = 1; + const dimensions = getDimensions(image); + if (dimensions.width > maxSize || dimensions.height > maxSize) { + scale = maxSize / Math.max(dimensions.width, dimensions.height); } - this.setAttribute("position", new Float32BufferAttribute(verticesArray, 3)); - this.setAttribute("uv", new Float32BufferAttribute(uvArray, 2)); - this.computeVertexNormals(); - function addShape(shape) { - const placeholder = []; - const curveSegments = options.curveSegments !== void 0 ? options.curveSegments : 12; - const steps = options.steps !== void 0 ? options.steps : 1; - const depth = options.depth !== void 0 ? options.depth : 1; - let bevelEnabled = options.bevelEnabled !== void 0 ? options.bevelEnabled : true; - let bevelThickness = options.bevelThickness !== void 0 ? options.bevelThickness : 0.2; - let bevelSize = options.bevelSize !== void 0 ? options.bevelSize : bevelThickness - 0.1; - let bevelOffset = options.bevelOffset !== void 0 ? options.bevelOffset : 0; - let bevelSegments = options.bevelSegments !== void 0 ? options.bevelSegments : 3; - const extrudePath = options.extrudePath; - const uvgen = options.UVGenerator !== void 0 ? options.UVGenerator : WorldUVGenerator; - let extrudePts, extrudeByPath = false; - let splineTube, binormal, normal, position2; - if (extrudePath) { - extrudePts = extrudePath.getSpacedPoints(steps); - extrudeByPath = true; - bevelEnabled = false; - splineTube = extrudePath.computeFrenetFrames(steps, false); - binormal = new Vector3(); - normal = new Vector3(); - position2 = new Vector3(); - } - if (!bevelEnabled) { - bevelSegments = 0; - bevelThickness = 0; - bevelSize = 0; - bevelOffset = 0; - } - const shapePoints = shape.extractPoints(curveSegments); - let vertices = shapePoints.shape; - const holes = shapePoints.holes; - const reverse = !ShapeUtils.isClockWise(vertices); - if (reverse) { - vertices = vertices.reverse(); - for (let h = 0, hl = holes.length; h < hl; h++) { - const ahole = holes[h]; - if (ShapeUtils.isClockWise(ahole)) { - holes[h] = ahole.reverse(); - } - } - } - const faces = ShapeUtils.triangulateShape(vertices, holes); - const contour = vertices; - for (let h = 0, hl = holes.length; h < hl; h++) { - const ahole = holes[h]; - vertices = vertices.concat(ahole); - } - function scalePt2(pt, vec, size) { - if (!vec) console.error("THREE.ExtrudeGeometry: vec does not exist"); - return pt.clone().addScaledVector(vec, size); - } - __name(scalePt2, "scalePt2"); - const vlen = vertices.length, flen = faces.length; - function getBevelVec(inPt, inPrev, inNext) { - let v_trans_x, v_trans_y, shrink_by; - const v_prev_x = inPt.x - inPrev.x, v_prev_y = inPt.y - inPrev.y; - const v_next_x = inNext.x - inPt.x, v_next_y = inNext.y - inPt.y; - const v_prev_lensq = v_prev_x * v_prev_x + v_prev_y * v_prev_y; - const collinear0 = v_prev_x * v_next_y - v_prev_y * v_next_x; - if (Math.abs(collinear0) > Number.EPSILON) { - const v_prev_len = Math.sqrt(v_prev_lensq); - const v_next_len = Math.sqrt(v_next_x * v_next_x + v_next_y * v_next_y); - const ptPrevShift_x = inPrev.x - v_prev_y / v_prev_len; - const ptPrevShift_y = inPrev.y + v_prev_x / v_prev_len; - const ptNextShift_x = inNext.x - v_next_y / v_next_len; - const ptNextShift_y = inNext.y + v_next_x / v_next_len; - const sf = ((ptNextShift_x - ptPrevShift_x) * v_next_y - (ptNextShift_y - ptPrevShift_y) * v_next_x) / (v_prev_x * v_next_y - v_prev_y * v_next_x); - v_trans_x = ptPrevShift_x + v_prev_x * sf - inPt.x; - v_trans_y = ptPrevShift_y + v_prev_y * sf - inPt.y; - const v_trans_lensq = v_trans_x * v_trans_x + v_trans_y * v_trans_y; - if (v_trans_lensq <= 2) { - return new Vector2(v_trans_x, v_trans_y); - } else { - shrink_by = Math.sqrt(v_trans_lensq / 2); - } - } else { - let direction_eq = false; - if (v_prev_x > Number.EPSILON) { - if (v_next_x > Number.EPSILON) { - direction_eq = true; - } - } else { - if (v_prev_x < -Number.EPSILON) { - if (v_next_x < -Number.EPSILON) { - direction_eq = true; - } - } else { - if (Math.sign(v_prev_y) === Math.sign(v_next_y)) { - direction_eq = true; - } - } - } - if (direction_eq) { - v_trans_x = -v_prev_y; - v_trans_y = v_prev_x; - shrink_by = Math.sqrt(v_prev_lensq); - } else { - v_trans_x = v_prev_x; - v_trans_y = v_prev_y; - shrink_by = Math.sqrt(v_prev_lensq / 2); - } - } - return new Vector2(v_trans_x / shrink_by, v_trans_y / shrink_by); - } - __name(getBevelVec, "getBevelVec"); - const contourMovements = []; - for (let i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i++, j++, k++) { - if (j === il) j = 0; - if (k === il) k = 0; - contourMovements[i] = getBevelVec(contour[i], contour[j], contour[k]); - } - const holesMovements = []; - let oneHoleMovements, verticesMovements = contourMovements.concat(); - for (let h = 0, hl = holes.length; h < hl; h++) { - const ahole = holes[h]; - oneHoleMovements = []; - for (let i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i++, j++, k++) { - if (j === il) j = 0; - if (k === il) k = 0; - oneHoleMovements[i] = getBevelVec(ahole[i], ahole[j], ahole[k]); - } - holesMovements.push(oneHoleMovements); - verticesMovements = verticesMovements.concat(oneHoleMovements); - } - for (let b = 0; b < bevelSegments; b++) { - const t2 = b / bevelSegments; - const z = bevelThickness * Math.cos(t2 * Math.PI / 2); - const bs2 = bevelSize * Math.sin(t2 * Math.PI / 2) + bevelOffset; - for (let i = 0, il = contour.length; i < il; i++) { - const vert = scalePt2(contour[i], contourMovements[i], bs2); - v(vert.x, vert.y, -z); - } - for (let h = 0, hl = holes.length; h < hl; h++) { - const ahole = holes[h]; - oneHoleMovements = holesMovements[h]; - for (let i = 0, il = ahole.length; i < il; i++) { - const vert = scalePt2(ahole[i], oneHoleMovements[i], bs2); - v(vert.x, vert.y, -z); - } - } - } - const bs = bevelSize + bevelOffset; - for (let i = 0; i < vlen; i++) { - const vert = bevelEnabled ? scalePt2(vertices[i], verticesMovements[i], bs) : vertices[i]; - if (!extrudeByPath) { - v(vert.x, vert.y, 0); - } else { - normal.copy(splineTube.normals[0]).multiplyScalar(vert.x); - binormal.copy(splineTube.binormals[0]).multiplyScalar(vert.y); - position2.copy(extrudePts[0]).add(normal).add(binormal); - v(position2.x, position2.y, position2.z); - } - } - for (let s = 1; s <= steps; s++) { - for (let i = 0; i < vlen; i++) { - const vert = bevelEnabled ? scalePt2(vertices[i], verticesMovements[i], bs) : vertices[i]; - if (!extrudeByPath) { - v(vert.x, vert.y, depth / steps * s); - } else { - normal.copy(splineTube.normals[s]).multiplyScalar(vert.x); - binormal.copy(splineTube.binormals[s]).multiplyScalar(vert.y); - position2.copy(extrudePts[s]).add(normal).add(binormal); - v(position2.x, position2.y, position2.z); - } - } - } - for (let b = bevelSegments - 1; b >= 0; b--) { - const t2 = b / bevelSegments; - const z = bevelThickness * Math.cos(t2 * Math.PI / 2); - const bs2 = bevelSize * Math.sin(t2 * Math.PI / 2) + bevelOffset; - for (let i = 0, il = contour.length; i < il; i++) { - const vert = scalePt2(contour[i], contourMovements[i], bs2); - v(vert.x, vert.y, depth + z); - } - for (let h = 0, hl = holes.length; h < hl; h++) { - const ahole = holes[h]; - oneHoleMovements = holesMovements[h]; - for (let i = 0, il = ahole.length; i < il; i++) { - const vert = scalePt2(ahole[i], oneHoleMovements[i], bs2); - if (!extrudeByPath) { - v(vert.x, vert.y, depth + z); - } else { - v(vert.x, vert.y + extrudePts[steps - 1].y, extrudePts[steps - 1].x + z); - } - } - } - } - buildLidFaces(); - buildSideFaces(); - function buildLidFaces() { - const start = verticesArray.length / 3; - if (bevelEnabled) { - let layer = 0; - let offset = vlen * layer; - for (let i = 0; i < flen; i++) { - const face = faces[i]; - f3(face[2] + offset, face[1] + offset, face[0] + offset); - } - layer = steps + bevelSegments * 2; - offset = vlen * layer; - for (let i = 0; i < flen; i++) { - const face = faces[i]; - f3(face[0] + offset, face[1] + offset, face[2] + offset); - } - } else { - for (let i = 0; i < flen; i++) { - const face = faces[i]; - f3(face[2], face[1], face[0]); - } - for (let i = 0; i < flen; i++) { - const face = faces[i]; - f3(face[0] + vlen * steps, face[1] + vlen * steps, face[2] + vlen * steps); - } - } - scope.addGroup(start, verticesArray.length / 3 - start, 0); - } - __name(buildLidFaces, "buildLidFaces"); - function buildSideFaces() { - const start = verticesArray.length / 3; - let layeroffset = 0; - sidewalls(contour, layeroffset); - layeroffset += contour.length; - for (let h = 0, hl = holes.length; h < hl; h++) { - const ahole = holes[h]; - sidewalls(ahole, layeroffset); - layeroffset += ahole.length; - } - scope.addGroup(start, verticesArray.length / 3 - start, 1); - } - __name(buildSideFaces, "buildSideFaces"); - function sidewalls(contour2, layeroffset) { - let i = contour2.length; - while (--i >= 0) { - const j = i; - let k = i - 1; - if (k < 0) k = contour2.length - 1; - for (let s = 0, sl = steps + bevelSegments * 2; s < sl; s++) { - const slen1 = vlen * s; - const slen2 = vlen * (s + 1); - const a = layeroffset + j + slen1, b = layeroffset + k + slen1, c = layeroffset + k + slen2, d = layeroffset + j + slen2; - f4(a, b, c, d); - } - } - } - __name(sidewalls, "sidewalls"); - function v(x, y, z) { - placeholder.push(x); - placeholder.push(y); - placeholder.push(z); - } - __name(v, "v"); - function f3(a, b, c) { - addVertex(a); - addVertex(b); - addVertex(c); - const nextIndex = verticesArray.length / 3; - const uvs = uvgen.generateTopUV(scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1); - addUV(uvs[0]); - addUV(uvs[1]); - addUV(uvs[2]); - } - __name(f3, "f3"); - function f4(a, b, c, d) { - addVertex(a); - addVertex(b); - addVertex(d); - addVertex(b); - addVertex(c); - addVertex(d); - const nextIndex = verticesArray.length / 3; - const uvs = uvgen.generateSideWallUV(scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1); - addUV(uvs[0]); - addUV(uvs[1]); - addUV(uvs[3]); - addUV(uvs[1]); - addUV(uvs[2]); - addUV(uvs[3]); - } - __name(f4, "f4"); - function addVertex(index) { - verticesArray.push(placeholder[index * 3 + 0]); - verticesArray.push(placeholder[index * 3 + 1]); - verticesArray.push(placeholder[index * 3 + 2]); - } - __name(addVertex, "addVertex"); - function addUV(vector2) { - uvArray.push(vector2.x); - uvArray.push(vector2.y); + if (scale < 1) { + if (typeof HTMLImageElement !== "undefined" && image instanceof HTMLImageElement || typeof HTMLCanvasElement !== "undefined" && image instanceof HTMLCanvasElement || typeof ImageBitmap !== "undefined" && image instanceof ImageBitmap || typeof VideoFrame !== "undefined" && image instanceof VideoFrame) { + const width = Math.floor(scale * dimensions.width); + const height = Math.floor(scale * dimensions.height); + if (_canvas2 === void 0) _canvas2 = createCanvas(width, height); + const canvas = needsNewCanvas ? createCanvas(width, height) : _canvas2; + canvas.width = width; + canvas.height = height; + const context = canvas.getContext("2d"); + context.drawImage(image, 0, 0, width, height); + console.warn("THREE.WebGLRenderer: Texture has been resized from (" + dimensions.width + "x" + dimensions.height + ") to (" + width + "x" + height + ")."); + return canvas; + } else { + if ("data" in image) { + console.warn("THREE.WebGLRenderer: Image in DataTexture is too big (" + dimensions.width + "x" + dimensions.height + ")."); + } + return image; } - __name(addUV, "addUV"); } - __name(addShape, "addShape"); + return image; } - copy(source) { - super.copy(source); - this.parameters = Object.assign({}, source.parameters); - return this; + __name(resizeImage, "resizeImage"); + function textureNeedsGenerateMipmaps(texture) { + return texture.generateMipmaps; } - toJSON() { - const data = super.toJSON(); - const shapes = this.parameters.shapes; - const options = this.parameters.options; - return toJSON$1(shapes, options, data); + __name(textureNeedsGenerateMipmaps, "textureNeedsGenerateMipmaps"); + function generateMipmap(target) { + _gl.generateMipmap(target); } - static fromJSON(data, shapes) { - const geometryShapes = []; - for (let j = 0, jl = data.shapes.length; j < jl; j++) { - const shape = shapes[data.shapes[j]]; - geometryShapes.push(shape); + __name(generateMipmap, "generateMipmap"); + function getTargetType(texture) { + if (texture.isWebGLCubeRenderTarget) return _gl.TEXTURE_CUBE_MAP; + if (texture.isWebGL3DRenderTarget) return _gl.TEXTURE_3D; + if (texture.isWebGLArrayRenderTarget || texture.isCompressedArrayTexture) return _gl.TEXTURE_2D_ARRAY; + return _gl.TEXTURE_2D; + } + __name(getTargetType, "getTargetType"); + function getInternalFormat(internalFormatName, glFormat, glType, colorSpace, forceLinearTransfer = false) { + if (internalFormatName !== null) { + if (_gl[internalFormatName] !== void 0) return _gl[internalFormatName]; + console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '" + internalFormatName + "'"); } - const extrudePath = data.options.extrudePath; - if (extrudePath !== void 0) { - data.options.extrudePath = new Curves[extrudePath.type]().fromJSON(extrudePath); + let internalFormat = glFormat; + if (glFormat === _gl.RED) { + if (glType === _gl.FLOAT) internalFormat = _gl.R32F; + if (glType === _gl.HALF_FLOAT) internalFormat = _gl.R16F; + if (glType === _gl.UNSIGNED_BYTE) internalFormat = _gl.R8; } - return new ExtrudeGeometry(geometryShapes, data.options); + if (glFormat === _gl.RED_INTEGER) { + if (glType === _gl.UNSIGNED_BYTE) internalFormat = _gl.R8UI; + if (glType === _gl.UNSIGNED_SHORT) internalFormat = _gl.R16UI; + if (glType === _gl.UNSIGNED_INT) internalFormat = _gl.R32UI; + if (glType === _gl.BYTE) internalFormat = _gl.R8I; + if (glType === _gl.SHORT) internalFormat = _gl.R16I; + if (glType === _gl.INT) internalFormat = _gl.R32I; + } + if (glFormat === _gl.RG) { + if (glType === _gl.FLOAT) internalFormat = _gl.RG32F; + if (glType === _gl.HALF_FLOAT) internalFormat = _gl.RG16F; + if (glType === _gl.UNSIGNED_BYTE) internalFormat = _gl.RG8; + } + if (glFormat === _gl.RG_INTEGER) { + if (glType === _gl.UNSIGNED_BYTE) internalFormat = _gl.RG8UI; + if (glType === _gl.UNSIGNED_SHORT) internalFormat = _gl.RG16UI; + if (glType === _gl.UNSIGNED_INT) internalFormat = _gl.RG32UI; + if (glType === _gl.BYTE) internalFormat = _gl.RG8I; + if (glType === _gl.SHORT) internalFormat = _gl.RG16I; + if (glType === _gl.INT) internalFormat = _gl.RG32I; + } + if (glFormat === _gl.RGB_INTEGER) { + if (glType === _gl.UNSIGNED_BYTE) internalFormat = _gl.RGB8UI; + if (glType === _gl.UNSIGNED_SHORT) internalFormat = _gl.RGB16UI; + if (glType === _gl.UNSIGNED_INT) internalFormat = _gl.RGB32UI; + if (glType === _gl.BYTE) internalFormat = _gl.RGB8I; + if (glType === _gl.SHORT) internalFormat = _gl.RGB16I; + if (glType === _gl.INT) internalFormat = _gl.RGB32I; + } + if (glFormat === _gl.RGBA_INTEGER) { + if (glType === _gl.UNSIGNED_BYTE) internalFormat = _gl.RGBA8UI; + if (glType === _gl.UNSIGNED_SHORT) internalFormat = _gl.RGBA16UI; + if (glType === _gl.UNSIGNED_INT) internalFormat = _gl.RGBA32UI; + if (glType === _gl.BYTE) internalFormat = _gl.RGBA8I; + if (glType === _gl.SHORT) internalFormat = _gl.RGBA16I; + if (glType === _gl.INT) internalFormat = _gl.RGBA32I; + } + if (glFormat === _gl.RGB) { + if (glType === _gl.UNSIGNED_INT_5_9_9_9_REV) internalFormat = _gl.RGB9_E5; + } + if (glFormat === _gl.RGBA) { + const transfer = forceLinearTransfer ? LinearTransfer : ColorManagement.getTransfer(colorSpace); + if (glType === _gl.FLOAT) internalFormat = _gl.RGBA32F; + if (glType === _gl.HALF_FLOAT) internalFormat = _gl.RGBA16F; + if (glType === _gl.UNSIGNED_BYTE) internalFormat = transfer === SRGBTransfer ? _gl.SRGB8_ALPHA8 : _gl.RGBA8; + if (glType === _gl.UNSIGNED_SHORT_4_4_4_4) internalFormat = _gl.RGBA4; + if (glType === _gl.UNSIGNED_SHORT_5_5_5_1) internalFormat = _gl.RGB5_A1; + } + if (internalFormat === _gl.R16F || internalFormat === _gl.R32F || internalFormat === _gl.RG16F || internalFormat === _gl.RG32F || internalFormat === _gl.RGBA16F || internalFormat === _gl.RGBA32F) { + extensions.get("EXT_color_buffer_float"); + } + return internalFormat; } -} -const WorldUVGenerator = { - generateTopUV: /* @__PURE__ */ __name(function(geometry, vertices, indexA, indexB, indexC) { - const a_x = vertices[indexA * 3]; - const a_y = vertices[indexA * 3 + 1]; - const b_x = vertices[indexB * 3]; - const b_y = vertices[indexB * 3 + 1]; - const c_x = vertices[indexC * 3]; - const c_y = vertices[indexC * 3 + 1]; - return [ - new Vector2(a_x, a_y), - new Vector2(b_x, b_y), - new Vector2(c_x, c_y) - ]; - }, "generateTopUV"), - generateSideWallUV: /* @__PURE__ */ __name(function(geometry, vertices, indexA, indexB, indexC, indexD) { - const a_x = vertices[indexA * 3]; - const a_y = vertices[indexA * 3 + 1]; - const a_z = vertices[indexA * 3 + 2]; - const b_x = vertices[indexB * 3]; - const b_y = vertices[indexB * 3 + 1]; - const b_z = vertices[indexB * 3 + 2]; - const c_x = vertices[indexC * 3]; - const c_y = vertices[indexC * 3 + 1]; - const c_z = vertices[indexC * 3 + 2]; - const d_x = vertices[indexD * 3]; - const d_y = vertices[indexD * 3 + 1]; - const d_z = vertices[indexD * 3 + 2]; - if (Math.abs(a_y - b_y) < Math.abs(a_x - b_x)) { - return [ - new Vector2(a_x, 1 - a_z), - new Vector2(b_x, 1 - b_z), - new Vector2(c_x, 1 - c_z), - new Vector2(d_x, 1 - d_z) - ]; + __name(getInternalFormat, "getInternalFormat"); + function getInternalDepthFormat(useStencil, depthType) { + let glInternalFormat; + if (useStencil) { + if (depthType === null || depthType === UnsignedIntType || depthType === UnsignedInt248Type) { + glInternalFormat = _gl.DEPTH24_STENCIL8; + } else if (depthType === FloatType) { + glInternalFormat = _gl.DEPTH32F_STENCIL8; + } else if (depthType === UnsignedShortType) { + glInternalFormat = _gl.DEPTH24_STENCIL8; + console.warn("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment."); + } } else { - return [ - new Vector2(a_y, 1 - a_z), - new Vector2(b_y, 1 - b_z), - new Vector2(c_y, 1 - c_z), - new Vector2(d_y, 1 - d_z) - ]; + if (depthType === null || depthType === UnsignedIntType || depthType === UnsignedInt248Type) { + glInternalFormat = _gl.DEPTH_COMPONENT24; + } else if (depthType === FloatType) { + glInternalFormat = _gl.DEPTH_COMPONENT32F; + } else if (depthType === UnsignedShortType) { + glInternalFormat = _gl.DEPTH_COMPONENT16; + } } - }, "generateSideWallUV") -}; -function toJSON$1(shapes, options, data) { - data.shapes = []; - if (Array.isArray(shapes)) { - for (let i = 0, l = shapes.length; i < l; i++) { - const shape = shapes[i]; - data.shapes.push(shape.uuid); + return glInternalFormat; + } + __name(getInternalDepthFormat, "getInternalDepthFormat"); + function getMipLevels(texture, image) { + if (textureNeedsGenerateMipmaps(texture) === true || texture.isFramebufferTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter) { + return Math.log2(Math.max(image.width, image.height)) + 1; + } else if (texture.mipmaps !== void 0 && texture.mipmaps.length > 0) { + return texture.mipmaps.length; + } else if (texture.isCompressedTexture && Array.isArray(texture.image)) { + return image.mipmaps.length; + } else { + return 1; } - } else { - data.shapes.push(shapes.uuid); } - data.options = Object.assign({}, options); - if (options.extrudePath !== void 0) data.options.extrudePath = options.extrudePath.toJSON(); - return data; -} -__name(toJSON$1, "toJSON$1"); -class IcosahedronGeometry extends PolyhedronGeometry { - static { - __name(this, "IcosahedronGeometry"); + __name(getMipLevels, "getMipLevels"); + function onTextureDispose(event) { + const texture = event.target; + texture.removeEventListener("dispose", onTextureDispose); + deallocateTexture(texture); + if (texture.isVideoTexture) { + _videoTextures.delete(texture); + } } - constructor(radius = 1, detail = 0) { - const t2 = (1 + Math.sqrt(5)) / 2; - const vertices = [ - -1, - t2, - 0, - 1, - t2, - 0, - -1, - -t2, - 0, - 1, - -t2, - 0, - 0, - -1, - t2, - 0, - 1, - t2, - 0, - -1, - -t2, - 0, - 1, - -t2, - t2, - 0, - -1, - t2, - 0, - 1, - -t2, - 0, - -1, - -t2, - 0, - 1 - ]; - const indices = [ - 0, - 11, - 5, - 0, - 5, - 1, - 0, - 1, - 7, - 0, - 7, - 10, - 0, - 10, - 11, - 1, - 5, - 9, - 5, - 11, - 4, - 11, - 10, - 2, - 10, - 7, - 6, - 7, - 1, - 8, - 3, - 9, - 4, - 3, - 4, - 2, - 3, - 2, - 6, - 3, - 6, - 8, - 3, - 8, - 9, - 4, - 9, - 5, - 2, - 4, - 11, - 6, - 2, - 10, - 8, - 6, - 7, - 9, - 8, - 1 - ]; - super(vertices, indices, radius, detail); - this.type = "IcosahedronGeometry"; - this.parameters = { - radius, - detail - }; + __name(onTextureDispose, "onTextureDispose"); + function onRenderTargetDispose(event) { + const renderTarget = event.target; + renderTarget.removeEventListener("dispose", onRenderTargetDispose); + deallocateRenderTarget(renderTarget); } - static fromJSON(data) { - return new IcosahedronGeometry(data.radius, data.detail); + __name(onRenderTargetDispose, "onRenderTargetDispose"); + function deallocateTexture(texture) { + const textureProperties = properties.get(texture); + if (textureProperties.__webglInit === void 0) return; + const source = texture.source; + const webglTextures = _sources.get(source); + if (webglTextures) { + const webglTexture = webglTextures[textureProperties.__cacheKey]; + webglTexture.usedTimes--; + if (webglTexture.usedTimes === 0) { + deleteTexture(texture); + } + if (Object.keys(webglTextures).length === 0) { + _sources.delete(source); + } + } + properties.remove(texture); } -} -class OctahedronGeometry extends PolyhedronGeometry { - static { - __name(this, "OctahedronGeometry"); + __name(deallocateTexture, "deallocateTexture"); + function deleteTexture(texture) { + const textureProperties = properties.get(texture); + _gl.deleteTexture(textureProperties.__webglTexture); + const source = texture.source; + const webglTextures = _sources.get(source); + delete webglTextures[textureProperties.__cacheKey]; + info.memory.textures--; } - constructor(radius = 1, detail = 0) { - const vertices = [ - 1, - 0, - 0, - -1, - 0, - 0, - 0, - 1, - 0, - 0, - -1, - 0, - 0, - 0, - 1, - 0, - 0, - -1 - ]; - const indices = [ - 0, - 2, - 4, - 0, - 4, - 3, - 0, - 3, - 5, - 0, - 5, - 2, - 1, - 2, - 5, - 1, - 5, - 3, - 1, - 3, - 4, - 1, - 4, - 2 - ]; - super(vertices, indices, radius, detail); - this.type = "OctahedronGeometry"; - this.parameters = { - radius, - detail - }; + __name(deleteTexture, "deleteTexture"); + function deallocateRenderTarget(renderTarget) { + const renderTargetProperties = properties.get(renderTarget); + if (renderTarget.depthTexture) { + renderTarget.depthTexture.dispose(); + properties.remove(renderTarget.depthTexture); + } + if (renderTarget.isWebGLCubeRenderTarget) { + for (let i = 0; i < 6; i++) { + if (Array.isArray(renderTargetProperties.__webglFramebuffer[i])) { + for (let level = 0; level < renderTargetProperties.__webglFramebuffer[i].length; level++) _gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer[i][level]); + } else { + _gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer[i]); + } + if (renderTargetProperties.__webglDepthbuffer) _gl.deleteRenderbuffer(renderTargetProperties.__webglDepthbuffer[i]); + } + } else { + if (Array.isArray(renderTargetProperties.__webglFramebuffer)) { + for (let level = 0; level < renderTargetProperties.__webglFramebuffer.length; level++) _gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer[level]); + } else { + _gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer); + } + if (renderTargetProperties.__webglDepthbuffer) _gl.deleteRenderbuffer(renderTargetProperties.__webglDepthbuffer); + if (renderTargetProperties.__webglMultisampledFramebuffer) _gl.deleteFramebuffer(renderTargetProperties.__webglMultisampledFramebuffer); + if (renderTargetProperties.__webglColorRenderbuffer) { + for (let i = 0; i < renderTargetProperties.__webglColorRenderbuffer.length; i++) { + if (renderTargetProperties.__webglColorRenderbuffer[i]) _gl.deleteRenderbuffer(renderTargetProperties.__webglColorRenderbuffer[i]); + } + } + if (renderTargetProperties.__webglDepthRenderbuffer) _gl.deleteRenderbuffer(renderTargetProperties.__webglDepthRenderbuffer); + } + const textures = renderTarget.textures; + for (let i = 0, il = textures.length; i < il; i++) { + const attachmentProperties = properties.get(textures[i]); + if (attachmentProperties.__webglTexture) { + _gl.deleteTexture(attachmentProperties.__webglTexture); + info.memory.textures--; + } + properties.remove(textures[i]); + } + properties.remove(renderTarget); } - static fromJSON(data) { - return new OctahedronGeometry(data.radius, data.detail); + __name(deallocateRenderTarget, "deallocateRenderTarget"); + let textureUnits = 0; + function resetTextureUnits() { + textureUnits = 0; } -} -class RingGeometry extends BufferGeometry { - static { - __name(this, "RingGeometry"); + __name(resetTextureUnits, "resetTextureUnits"); + function allocateTextureUnit() { + const textureUnit = textureUnits; + if (textureUnit >= capabilities.maxTextures) { + console.warn("THREE.WebGLTextures: Trying to use " + textureUnit + " texture units while this GPU supports only " + capabilities.maxTextures); + } + textureUnits += 1; + return textureUnit; } - constructor(innerRadius = 0.5, outerRadius = 1, thetaSegments = 32, phiSegments = 1, thetaStart = 0, thetaLength = Math.PI * 2) { - super(); - this.type = "RingGeometry"; - this.parameters = { - innerRadius, - outerRadius, - thetaSegments, - phiSegments, - thetaStart, - thetaLength - }; - thetaSegments = Math.max(3, thetaSegments); - phiSegments = Math.max(1, phiSegments); - const indices = []; - const vertices = []; - const normals = []; - const uvs = []; - let radius = innerRadius; - const radiusStep = (outerRadius - innerRadius) / phiSegments; - const vertex2 = new Vector3(); - const uv = new Vector2(); - for (let j = 0; j <= phiSegments; j++) { - for (let i = 0; i <= thetaSegments; i++) { - const segment = thetaStart + i / thetaSegments * thetaLength; - vertex2.x = radius * Math.cos(segment); - vertex2.y = radius * Math.sin(segment); - vertices.push(vertex2.x, vertex2.y, vertex2.z); - normals.push(0, 0, 1); - uv.x = (vertex2.x / outerRadius + 1) / 2; - uv.y = (vertex2.y / outerRadius + 1) / 2; - uvs.push(uv.x, uv.y); + __name(allocateTextureUnit, "allocateTextureUnit"); + function getTextureCacheKey(texture) { + const array = []; + array.push(texture.wrapS); + array.push(texture.wrapT); + array.push(texture.wrapR || 0); + array.push(texture.magFilter); + array.push(texture.minFilter); + array.push(texture.anisotropy); + array.push(texture.internalFormat); + array.push(texture.format); + array.push(texture.type); + array.push(texture.generateMipmaps); + array.push(texture.premultiplyAlpha); + array.push(texture.flipY); + array.push(texture.unpackAlignment); + array.push(texture.colorSpace); + return array.join(); + } + __name(getTextureCacheKey, "getTextureCacheKey"); + function setTexture2D(texture, slot) { + const textureProperties = properties.get(texture); + if (texture.isVideoTexture) updateVideoTexture(texture); + if (texture.isRenderTargetTexture === false && texture.version > 0 && textureProperties.__version !== texture.version) { + const image = texture.image; + if (image === null) { + console.warn("THREE.WebGLRenderer: Texture marked for update but no image data found."); + } else if (image.complete === false) { + console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete"); + } else { + uploadTexture(textureProperties, texture, slot); + return; } - radius += radiusStep; } - for (let j = 0; j < phiSegments; j++) { - const thetaSegmentLevel = j * (thetaSegments + 1); - for (let i = 0; i < thetaSegments; i++) { - const segment = i + thetaSegmentLevel; - const a = segment; - const b = segment + thetaSegments + 1; - const c = segment + thetaSegments + 2; - const d = segment + 1; - indices.push(a, b, d); - indices.push(b, c, d); - } + state.bindTexture(_gl.TEXTURE_2D, textureProperties.__webglTexture, _gl.TEXTURE0 + slot); + } + __name(setTexture2D, "setTexture2D"); + function setTexture2DArray(texture, slot) { + const textureProperties = properties.get(texture); + if (texture.version > 0 && textureProperties.__version !== texture.version) { + uploadTexture(textureProperties, texture, slot); + return; } - this.setIndex(indices); - this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); - this.setAttribute("normal", new Float32BufferAttribute(normals, 3)); - this.setAttribute("uv", new Float32BufferAttribute(uvs, 2)); + state.bindTexture(_gl.TEXTURE_2D_ARRAY, textureProperties.__webglTexture, _gl.TEXTURE0 + slot); } - copy(source) { - super.copy(source); - this.parameters = Object.assign({}, source.parameters); - return this; + __name(setTexture2DArray, "setTexture2DArray"); + function setTexture3D(texture, slot) { + const textureProperties = properties.get(texture); + if (texture.version > 0 && textureProperties.__version !== texture.version) { + uploadTexture(textureProperties, texture, slot); + return; + } + state.bindTexture(_gl.TEXTURE_3D, textureProperties.__webglTexture, _gl.TEXTURE0 + slot); } - static fromJSON(data) { - return new RingGeometry(data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength); + __name(setTexture3D, "setTexture3D"); + function setTextureCube(texture, slot) { + const textureProperties = properties.get(texture); + if (texture.version > 0 && textureProperties.__version !== texture.version) { + uploadCubeTexture(textureProperties, texture, slot); + return; + } + state.bindTexture(_gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture, _gl.TEXTURE0 + slot); } -} -class ShapeGeometry extends BufferGeometry { - static { - __name(this, "ShapeGeometry"); + __name(setTextureCube, "setTextureCube"); + const wrappingToGL = { + [RepeatWrapping]: _gl.REPEAT, + [ClampToEdgeWrapping]: _gl.CLAMP_TO_EDGE, + [MirroredRepeatWrapping]: _gl.MIRRORED_REPEAT + }; + const filterToGL = { + [NearestFilter]: _gl.NEAREST, + [NearestMipmapNearestFilter]: _gl.NEAREST_MIPMAP_NEAREST, + [NearestMipmapLinearFilter]: _gl.NEAREST_MIPMAP_LINEAR, + [LinearFilter]: _gl.LINEAR, + [LinearMipmapNearestFilter]: _gl.LINEAR_MIPMAP_NEAREST, + [LinearMipmapLinearFilter]: _gl.LINEAR_MIPMAP_LINEAR + }; + const compareToGL = { + [NeverCompare]: _gl.NEVER, + [AlwaysCompare]: _gl.ALWAYS, + [LessCompare]: _gl.LESS, + [LessEqualCompare]: _gl.LEQUAL, + [EqualCompare]: _gl.EQUAL, + [GreaterEqualCompare]: _gl.GEQUAL, + [GreaterCompare]: _gl.GREATER, + [NotEqualCompare]: _gl.NOTEQUAL + }; + function setTextureParameters(textureType, texture) { + if (texture.type === FloatType && extensions.has("OES_texture_float_linear") === false && (texture.magFilter === LinearFilter || texture.magFilter === LinearMipmapNearestFilter || texture.magFilter === NearestMipmapLinearFilter || texture.magFilter === LinearMipmapLinearFilter || texture.minFilter === LinearFilter || texture.minFilter === LinearMipmapNearestFilter || texture.minFilter === NearestMipmapLinearFilter || texture.minFilter === LinearMipmapLinearFilter)) { + console.warn("THREE.WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device."); + } + _gl.texParameteri(textureType, _gl.TEXTURE_WRAP_S, wrappingToGL[texture.wrapS]); + _gl.texParameteri(textureType, _gl.TEXTURE_WRAP_T, wrappingToGL[texture.wrapT]); + if (textureType === _gl.TEXTURE_3D || textureType === _gl.TEXTURE_2D_ARRAY) { + _gl.texParameteri(textureType, _gl.TEXTURE_WRAP_R, wrappingToGL[texture.wrapR]); + } + _gl.texParameteri(textureType, _gl.TEXTURE_MAG_FILTER, filterToGL[texture.magFilter]); + _gl.texParameteri(textureType, _gl.TEXTURE_MIN_FILTER, filterToGL[texture.minFilter]); + if (texture.compareFunction) { + _gl.texParameteri(textureType, _gl.TEXTURE_COMPARE_MODE, _gl.COMPARE_REF_TO_TEXTURE); + _gl.texParameteri(textureType, _gl.TEXTURE_COMPARE_FUNC, compareToGL[texture.compareFunction]); + } + if (extensions.has("EXT_texture_filter_anisotropic") === true) { + if (texture.magFilter === NearestFilter) return; + if (texture.minFilter !== NearestMipmapLinearFilter && texture.minFilter !== LinearMipmapLinearFilter) return; + if (texture.type === FloatType && extensions.has("OES_texture_float_linear") === false) return; + if (texture.anisotropy > 1 || properties.get(texture).__currentAnisotropy) { + const extension = extensions.get("EXT_texture_filter_anisotropic"); + _gl.texParameterf(textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min(texture.anisotropy, capabilities.getMaxAnisotropy())); + properties.get(texture).__currentAnisotropy = texture.anisotropy; + } + } } - constructor(shapes = new Shape([new Vector2(0, 0.5), new Vector2(-0.5, -0.5), new Vector2(0.5, -0.5)]), curveSegments = 12) { - super(); - this.type = "ShapeGeometry"; - this.parameters = { - shapes, - curveSegments - }; - const indices = []; - const vertices = []; - const normals = []; - const uvs = []; - let groupStart = 0; - let groupCount = 0; - if (Array.isArray(shapes) === false) { - addShape(shapes); - } else { - for (let i = 0; i < shapes.length; i++) { - addShape(shapes[i]); - this.addGroup(groupStart, groupCount, i); - groupStart += groupCount; - groupCount = 0; + __name(setTextureParameters, "setTextureParameters"); + function initTexture(textureProperties, texture) { + let forceUpload = false; + if (textureProperties.__webglInit === void 0) { + textureProperties.__webglInit = true; + texture.addEventListener("dispose", onTextureDispose); + } + const source = texture.source; + let webglTextures = _sources.get(source); + if (webglTextures === void 0) { + webglTextures = {}; + _sources.set(source, webglTextures); + } + const textureCacheKey = getTextureCacheKey(texture); + if (textureCacheKey !== textureProperties.__cacheKey) { + if (webglTextures[textureCacheKey] === void 0) { + webglTextures[textureCacheKey] = { + texture: _gl.createTexture(), + usedTimes: 0 + }; + info.memory.textures++; + forceUpload = true; } + webglTextures[textureCacheKey].usedTimes++; + const webglTexture = webglTextures[textureProperties.__cacheKey]; + if (webglTexture !== void 0) { + webglTextures[textureProperties.__cacheKey].usedTimes--; + if (webglTexture.usedTimes === 0) { + deleteTexture(texture); + } + } + textureProperties.__cacheKey = textureCacheKey; + textureProperties.__webglTexture = webglTextures[textureCacheKey].texture; } - this.setIndex(indices); - this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); - this.setAttribute("normal", new Float32BufferAttribute(normals, 3)); - this.setAttribute("uv", new Float32BufferAttribute(uvs, 2)); - function addShape(shape) { - const indexOffset = vertices.length / 3; - const points = shape.extractPoints(curveSegments); - let shapeVertices = points.shape; - const shapeHoles = points.holes; - if (ShapeUtils.isClockWise(shapeVertices) === false) { - shapeVertices = shapeVertices.reverse(); + return forceUpload; + } + __name(initTexture, "initTexture"); + function uploadTexture(textureProperties, texture, slot) { + let textureType = _gl.TEXTURE_2D; + if (texture.isDataArrayTexture || texture.isCompressedArrayTexture) textureType = _gl.TEXTURE_2D_ARRAY; + if (texture.isData3DTexture) textureType = _gl.TEXTURE_3D; + const forceUpload = initTexture(textureProperties, texture); + const source = texture.source; + state.bindTexture(textureType, textureProperties.__webglTexture, _gl.TEXTURE0 + slot); + const sourceProperties = properties.get(source); + if (source.version !== sourceProperties.__version || forceUpload === true) { + state.activeTexture(_gl.TEXTURE0 + slot); + const workingPrimaries = ColorManagement.getPrimaries(ColorManagement.workingColorSpace); + const texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries(texture.colorSpace); + const unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL; + _gl.pixelStorei(_gl.UNPACK_FLIP_Y_WEBGL, texture.flipY); + _gl.pixelStorei(_gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha); + _gl.pixelStorei(_gl.UNPACK_ALIGNMENT, texture.unpackAlignment); + _gl.pixelStorei(_gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion); + let image = resizeImage(texture.image, false, capabilities.maxTextureSize); + image = verifyColorSpace(texture, image); + const glFormat = utils.convert(texture.format, texture.colorSpace); + const glType = utils.convert(texture.type); + let glInternalFormat = getInternalFormat(texture.internalFormat, glFormat, glType, texture.colorSpace, texture.isVideoTexture); + setTextureParameters(textureType, texture); + let mipmap; + const mipmaps = texture.mipmaps; + const useTexStorage = texture.isVideoTexture !== true; + const allocateMemory = sourceProperties.__version === void 0 || forceUpload === true; + const dataReady = source.dataReady; + const levels = getMipLevels(texture, image); + if (texture.isDepthTexture) { + glInternalFormat = getInternalDepthFormat(texture.format === DepthStencilFormat, texture.type); + if (allocateMemory) { + if (useTexStorage) { + state.texStorage2D(_gl.TEXTURE_2D, 1, glInternalFormat, image.width, image.height); + } else { + state.texImage2D(_gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null); + } + } + } else if (texture.isDataTexture) { + if (mipmaps.length > 0) { + if (useTexStorage && allocateMemory) { + state.texStorage2D(_gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[0].width, mipmaps[0].height); + } + for (let i = 0, il = mipmaps.length; i < il; i++) { + mipmap = mipmaps[i]; + if (useTexStorage) { + if (dataReady) { + state.texSubImage2D(_gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data); + } + } else { + state.texImage2D(_gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data); + } + } + texture.generateMipmaps = false; + } else { + if (useTexStorage) { + if (allocateMemory) { + state.texStorage2D(_gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height); + } + if (dataReady) { + state.texSubImage2D(_gl.TEXTURE_2D, 0, 0, 0, image.width, image.height, glFormat, glType, image.data); + } + } else { + state.texImage2D(_gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data); + } + } + } else if (texture.isCompressedTexture) { + if (texture.isCompressedArrayTexture) { + if (useTexStorage && allocateMemory) { + state.texStorage3D(_gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, mipmaps[0].width, mipmaps[0].height, image.depth); + } + for (let i = 0, il = mipmaps.length; i < il; i++) { + mipmap = mipmaps[i]; + if (texture.format !== RGBAFormat) { + if (glFormat !== null) { + if (useTexStorage) { + if (dataReady) { + if (texture.layerUpdates.size > 0) { + const layerByteLength = getByteLength(mipmap.width, mipmap.height, texture.format, texture.type); + for (const layerIndex of texture.layerUpdates) { + const layerData = mipmap.data.subarray( + layerIndex * layerByteLength / mipmap.data.BYTES_PER_ELEMENT, + (layerIndex + 1) * layerByteLength / mipmap.data.BYTES_PER_ELEMENT + ); + state.compressedTexSubImage3D(_gl.TEXTURE_2D_ARRAY, i, 0, 0, layerIndex, mipmap.width, mipmap.height, 1, glFormat, layerData); + } + texture.clearLayerUpdates(); + } else { + state.compressedTexSubImage3D(_gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, mipmap.data); + } + } + } else { + state.compressedTexImage3D(_gl.TEXTURE_2D_ARRAY, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 0, mipmap.data, 0, 0); + } + } else { + console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"); + } + } else { + if (useTexStorage) { + if (dataReady) { + state.texSubImage3D(_gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, glType, mipmap.data); + } + } else { + state.texImage3D(_gl.TEXTURE_2D_ARRAY, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 0, glFormat, glType, mipmap.data); + } + } + } + } else { + if (useTexStorage && allocateMemory) { + state.texStorage2D(_gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[0].width, mipmaps[0].height); + } + for (let i = 0, il = mipmaps.length; i < il; i++) { + mipmap = mipmaps[i]; + if (texture.format !== RGBAFormat) { + if (glFormat !== null) { + if (useTexStorage) { + if (dataReady) { + state.compressedTexSubImage2D(_gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data); + } + } else { + state.compressedTexImage2D(_gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data); + } + } else { + console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"); + } + } else { + if (useTexStorage) { + if (dataReady) { + state.texSubImage2D(_gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data); + } + } else { + state.texImage2D(_gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data); + } + } + } + } + } else if (texture.isDataArrayTexture) { + if (useTexStorage) { + if (allocateMemory) { + state.texStorage3D(_gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, image.width, image.height, image.depth); + } + if (dataReady) { + if (texture.layerUpdates.size > 0) { + const layerByteLength = getByteLength(image.width, image.height, texture.format, texture.type); + for (const layerIndex of texture.layerUpdates) { + const layerData = image.data.subarray( + layerIndex * layerByteLength / image.data.BYTES_PER_ELEMENT, + (layerIndex + 1) * layerByteLength / image.data.BYTES_PER_ELEMENT + ); + state.texSubImage3D(_gl.TEXTURE_2D_ARRAY, 0, 0, 0, layerIndex, image.width, image.height, 1, glFormat, glType, layerData); + } + texture.clearLayerUpdates(); + } else { + state.texSubImage3D(_gl.TEXTURE_2D_ARRAY, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data); + } + } + } else { + state.texImage3D(_gl.TEXTURE_2D_ARRAY, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data); + } + } else if (texture.isData3DTexture) { + if (useTexStorage) { + if (allocateMemory) { + state.texStorage3D(_gl.TEXTURE_3D, levels, glInternalFormat, image.width, image.height, image.depth); + } + if (dataReady) { + state.texSubImage3D(_gl.TEXTURE_3D, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data); + } + } else { + state.texImage3D(_gl.TEXTURE_3D, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data); + } + } else if (texture.isFramebufferTexture) { + if (allocateMemory) { + if (useTexStorage) { + state.texStorage2D(_gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height); + } else { + let width = image.width, height = image.height; + for (let i = 0; i < levels; i++) { + state.texImage2D(_gl.TEXTURE_2D, i, glInternalFormat, width, height, 0, glFormat, glType, null); + width >>= 1; + height >>= 1; + } + } + } + } else { + if (mipmaps.length > 0) { + if (useTexStorage && allocateMemory) { + const dimensions = getDimensions(mipmaps[0]); + state.texStorage2D(_gl.TEXTURE_2D, levels, glInternalFormat, dimensions.width, dimensions.height); + } + for (let i = 0, il = mipmaps.length; i < il; i++) { + mipmap = mipmaps[i]; + if (useTexStorage) { + if (dataReady) { + state.texSubImage2D(_gl.TEXTURE_2D, i, 0, 0, glFormat, glType, mipmap); + } + } else { + state.texImage2D(_gl.TEXTURE_2D, i, glInternalFormat, glFormat, glType, mipmap); + } + } + texture.generateMipmaps = false; + } else { + if (useTexStorage) { + if (allocateMemory) { + const dimensions = getDimensions(image); + state.texStorage2D(_gl.TEXTURE_2D, levels, glInternalFormat, dimensions.width, dimensions.height); + } + if (dataReady) { + state.texSubImage2D(_gl.TEXTURE_2D, 0, 0, 0, glFormat, glType, image); + } + } else { + state.texImage2D(_gl.TEXTURE_2D, 0, glInternalFormat, glFormat, glType, image); + } + } } - for (let i = 0, l = shapeHoles.length; i < l; i++) { - const shapeHole = shapeHoles[i]; - if (ShapeUtils.isClockWise(shapeHole) === true) { - shapeHoles[i] = shapeHole.reverse(); + if (textureNeedsGenerateMipmaps(texture)) { + generateMipmap(textureType); + } + sourceProperties.__version = source.version; + if (texture.onUpdate) texture.onUpdate(texture); + } + textureProperties.__version = texture.version; + } + __name(uploadTexture, "uploadTexture"); + function uploadCubeTexture(textureProperties, texture, slot) { + if (texture.image.length !== 6) return; + const forceUpload = initTexture(textureProperties, texture); + const source = texture.source; + state.bindTexture(_gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture, _gl.TEXTURE0 + slot); + const sourceProperties = properties.get(source); + if (source.version !== sourceProperties.__version || forceUpload === true) { + state.activeTexture(_gl.TEXTURE0 + slot); + const workingPrimaries = ColorManagement.getPrimaries(ColorManagement.workingColorSpace); + const texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries(texture.colorSpace); + const unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL; + _gl.pixelStorei(_gl.UNPACK_FLIP_Y_WEBGL, texture.flipY); + _gl.pixelStorei(_gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha); + _gl.pixelStorei(_gl.UNPACK_ALIGNMENT, texture.unpackAlignment); + _gl.pixelStorei(_gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion); + const isCompressed = texture.isCompressedTexture || texture.image[0].isCompressedTexture; + const isDataTexture = texture.image[0] && texture.image[0].isDataTexture; + const cubeImage = []; + for (let i = 0; i < 6; i++) { + if (!isCompressed && !isDataTexture) { + cubeImage[i] = resizeImage(texture.image[i], true, capabilities.maxCubemapSize); + } else { + cubeImage[i] = isDataTexture ? texture.image[i].image : texture.image[i]; + } + cubeImage[i] = verifyColorSpace(texture, cubeImage[i]); + } + const image = cubeImage[0], glFormat = utils.convert(texture.format, texture.colorSpace), glType = utils.convert(texture.type), glInternalFormat = getInternalFormat(texture.internalFormat, glFormat, glType, texture.colorSpace); + const useTexStorage = texture.isVideoTexture !== true; + const allocateMemory = sourceProperties.__version === void 0 || forceUpload === true; + const dataReady = source.dataReady; + let levels = getMipLevels(texture, image); + setTextureParameters(_gl.TEXTURE_CUBE_MAP, texture); + let mipmaps; + if (isCompressed) { + if (useTexStorage && allocateMemory) { + state.texStorage2D(_gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, image.width, image.height); + } + for (let i = 0; i < 6; i++) { + mipmaps = cubeImage[i].mipmaps; + for (let j = 0; j < mipmaps.length; j++) { + const mipmap = mipmaps[j]; + if (texture.format !== RGBAFormat) { + if (glFormat !== null) { + if (useTexStorage) { + if (dataReady) { + state.compressedTexSubImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data); + } + } else { + state.compressedTexImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data); + } + } else { + console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()"); + } + } else { + if (useTexStorage) { + if (dataReady) { + state.texSubImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data); + } + } else { + state.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data); + } + } + } + } + } else { + mipmaps = texture.mipmaps; + if (useTexStorage && allocateMemory) { + if (mipmaps.length > 0) levels++; + const dimensions = getDimensions(cubeImage[0]); + state.texStorage2D(_gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, dimensions.width, dimensions.height); + } + for (let i = 0; i < 6; i++) { + if (isDataTexture) { + if (useTexStorage) { + if (dataReady) { + state.texSubImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, cubeImage[i].width, cubeImage[i].height, glFormat, glType, cubeImage[i].data); + } + } else { + state.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, cubeImage[i].width, cubeImage[i].height, 0, glFormat, glType, cubeImage[i].data); + } + for (let j = 0; j < mipmaps.length; j++) { + const mipmap = mipmaps[j]; + const mipmapImage = mipmap.image[i].image; + if (useTexStorage) { + if (dataReady) { + state.texSubImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, mipmapImage.width, mipmapImage.height, glFormat, glType, mipmapImage.data); + } + } else { + state.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, mipmapImage.width, mipmapImage.height, 0, glFormat, glType, mipmapImage.data); + } + } + } else { + if (useTexStorage) { + if (dataReady) { + state.texSubImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, glFormat, glType, cubeImage[i]); + } + } else { + state.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, glFormat, glType, cubeImage[i]); + } + for (let j = 0; j < mipmaps.length; j++) { + const mipmap = mipmaps[j]; + if (useTexStorage) { + if (dataReady) { + state.texSubImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, glFormat, glType, mipmap.image[i]); + } + } else { + state.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, glFormat, glType, mipmap.image[i]); + } + } + } } } - const faces = ShapeUtils.triangulateShape(shapeVertices, shapeHoles); - for (let i = 0, l = shapeHoles.length; i < l; i++) { - const shapeHole = shapeHoles[i]; - shapeVertices = shapeVertices.concat(shapeHole); - } - for (let i = 0, l = shapeVertices.length; i < l; i++) { - const vertex2 = shapeVertices[i]; - vertices.push(vertex2.x, vertex2.y, 0); - normals.push(0, 0, 1); - uvs.push(vertex2.x, vertex2.y); - } - for (let i = 0, l = faces.length; i < l; i++) { - const face = faces[i]; - const a = face[0] + indexOffset; - const b = face[1] + indexOffset; - const c = face[2] + indexOffset; - indices.push(a, b, c); - groupCount += 3; + if (textureNeedsGenerateMipmaps(texture)) { + generateMipmap(_gl.TEXTURE_CUBE_MAP); } + sourceProperties.__version = source.version; + if (texture.onUpdate) texture.onUpdate(texture); } - __name(addShape, "addShape"); - } - copy(source) { - super.copy(source); - this.parameters = Object.assign({}, source.parameters); - return this; - } - toJSON() { - const data = super.toJSON(); - const shapes = this.parameters.shapes; - return toJSON(shapes, data); + textureProperties.__version = texture.version; } - static fromJSON(data, shapes) { - const geometryShapes = []; - for (let j = 0, jl = data.shapes.length; j < jl; j++) { - const shape = shapes[data.shapes[j]]; - geometryShapes.push(shape); + __name(uploadCubeTexture, "uploadCubeTexture"); + function setupFrameBufferTexture(framebuffer, renderTarget, texture, attachment, textureTarget, level) { + const glFormat = utils.convert(texture.format, texture.colorSpace); + const glType = utils.convert(texture.type); + const glInternalFormat = getInternalFormat(texture.internalFormat, glFormat, glType, texture.colorSpace); + const renderTargetProperties = properties.get(renderTarget); + const textureProperties = properties.get(texture); + textureProperties.__renderTarget = renderTarget; + if (!renderTargetProperties.__hasExternalTextures) { + const width = Math.max(1, renderTarget.width >> level); + const height = Math.max(1, renderTarget.height >> level); + if (textureTarget === _gl.TEXTURE_3D || textureTarget === _gl.TEXTURE_2D_ARRAY) { + state.texImage3D(textureTarget, level, glInternalFormat, width, height, renderTarget.depth, 0, glFormat, glType, null); + } else { + state.texImage2D(textureTarget, level, glInternalFormat, width, height, 0, glFormat, glType, null); + } } - return new ShapeGeometry(geometryShapes, data.curveSegments); - } -} -function toJSON(shapes, data) { - data.shapes = []; - if (Array.isArray(shapes)) { - for (let i = 0, l = shapes.length; i < l; i++) { - const shape = shapes[i]; - data.shapes.push(shape.uuid); + state.bindFramebuffer(_gl.FRAMEBUFFER, framebuffer); + if (useMultisampledRTT(renderTarget)) { + multisampledRTTExt.framebufferTexture2DMultisampleEXT(_gl.FRAMEBUFFER, attachment, textureTarget, textureProperties.__webglTexture, 0, getRenderTargetSamples(renderTarget)); + } else if (textureTarget === _gl.TEXTURE_2D || textureTarget >= _gl.TEXTURE_CUBE_MAP_POSITIVE_X && textureTarget <= _gl.TEXTURE_CUBE_MAP_NEGATIVE_Z) { + _gl.framebufferTexture2D(_gl.FRAMEBUFFER, attachment, textureTarget, textureProperties.__webglTexture, level); } - } else { - data.shapes.push(shapes.uuid); - } - return data; -} -__name(toJSON, "toJSON"); -class SphereGeometry extends BufferGeometry { - static { - __name(this, "SphereGeometry"); + state.bindFramebuffer(_gl.FRAMEBUFFER, null); } - constructor(radius = 1, widthSegments = 32, heightSegments = 16, phiStart = 0, phiLength = Math.PI * 2, thetaStart = 0, thetaLength = Math.PI) { - super(); - this.type = "SphereGeometry"; - this.parameters = { - radius, - widthSegments, - heightSegments, - phiStart, - phiLength, - thetaStart, - thetaLength - }; - widthSegments = Math.max(3, Math.floor(widthSegments)); - heightSegments = Math.max(2, Math.floor(heightSegments)); - const thetaEnd = Math.min(thetaStart + thetaLength, Math.PI); - let index = 0; - const grid = []; - const vertex2 = new Vector3(); - const normal = new Vector3(); - const indices = []; - const vertices = []; - const normals = []; - const uvs = []; - for (let iy = 0; iy <= heightSegments; iy++) { - const verticesRow = []; - const v = iy / heightSegments; - let uOffset = 0; - if (iy === 0 && thetaStart === 0) { - uOffset = 0.5 / widthSegments; - } else if (iy === heightSegments && thetaEnd === Math.PI) { - uOffset = -0.5 / widthSegments; - } - for (let ix = 0; ix <= widthSegments; ix++) { - const u = ix / widthSegments; - vertex2.x = -radius * Math.cos(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength); - vertex2.y = radius * Math.cos(thetaStart + v * thetaLength); - vertex2.z = radius * Math.sin(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength); - vertices.push(vertex2.x, vertex2.y, vertex2.z); - normal.copy(vertex2).normalize(); - normals.push(normal.x, normal.y, normal.z); - uvs.push(u + uOffset, 1 - v); - verticesRow.push(index++); + __name(setupFrameBufferTexture, "setupFrameBufferTexture"); + function setupRenderBufferStorage(renderbuffer, renderTarget, isMultisample) { + _gl.bindRenderbuffer(_gl.RENDERBUFFER, renderbuffer); + if (renderTarget.depthBuffer) { + const depthTexture = renderTarget.depthTexture; + const depthType = depthTexture && depthTexture.isDepthTexture ? depthTexture.type : null; + const glInternalFormat = getInternalDepthFormat(renderTarget.stencilBuffer, depthType); + const glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT; + const samples = getRenderTargetSamples(renderTarget); + const isUseMultisampledRTT = useMultisampledRTT(renderTarget); + if (isUseMultisampledRTT) { + multisampledRTTExt.renderbufferStorageMultisampleEXT(_gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height); + } else if (isMultisample) { + _gl.renderbufferStorageMultisample(_gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height); + } else { + _gl.renderbufferStorage(_gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height); } - grid.push(verticesRow); - } - for (let iy = 0; iy < heightSegments; iy++) { - for (let ix = 0; ix < widthSegments; ix++) { - const a = grid[iy][ix + 1]; - const b = grid[iy][ix]; - const c = grid[iy + 1][ix]; - const d = grid[iy + 1][ix + 1]; - if (iy !== 0 || thetaStart > 0) indices.push(a, b, d); - if (iy !== heightSegments - 1 || thetaEnd < Math.PI) indices.push(b, c, d); + _gl.framebufferRenderbuffer(_gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer); + } else { + const textures = renderTarget.textures; + for (let i = 0; i < textures.length; i++) { + const texture = textures[i]; + const glFormat = utils.convert(texture.format, texture.colorSpace); + const glType = utils.convert(texture.type); + const glInternalFormat = getInternalFormat(texture.internalFormat, glFormat, glType, texture.colorSpace); + const samples = getRenderTargetSamples(renderTarget); + if (isMultisample && useMultisampledRTT(renderTarget) === false) { + _gl.renderbufferStorageMultisample(_gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height); + } else if (useMultisampledRTT(renderTarget)) { + multisampledRTTExt.renderbufferStorageMultisampleEXT(_gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height); + } else { + _gl.renderbufferStorage(_gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height); + } } } - this.setIndex(indices); - this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); - this.setAttribute("normal", new Float32BufferAttribute(normals, 3)); - this.setAttribute("uv", new Float32BufferAttribute(uvs, 2)); - } - copy(source) { - super.copy(source); - this.parameters = Object.assign({}, source.parameters); - return this; - } - static fromJSON(data) { - return new SphereGeometry(data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength); - } -} -class TetrahedronGeometry extends PolyhedronGeometry { - static { - __name(this, "TetrahedronGeometry"); - } - constructor(radius = 1, detail = 0) { - const vertices = [ - 1, - 1, - 1, - -1, - -1, - 1, - -1, - 1, - -1, - 1, - -1, - -1 - ]; - const indices = [ - 2, - 1, - 0, - 0, - 3, - 2, - 1, - 3, - 0, - 2, - 3, - 1 - ]; - super(vertices, indices, radius, detail); - this.type = "TetrahedronGeometry"; - this.parameters = { - radius, - detail - }; - } - static fromJSON(data) { - return new TetrahedronGeometry(data.radius, data.detail); - } -} -class TorusGeometry extends BufferGeometry { - static { - __name(this, "TorusGeometry"); + _gl.bindRenderbuffer(_gl.RENDERBUFFER, null); } - constructor(radius = 1, tube = 0.4, radialSegments = 12, tubularSegments = 48, arc = Math.PI * 2) { - super(); - this.type = "TorusGeometry"; - this.parameters = { - radius, - tube, - radialSegments, - tubularSegments, - arc - }; - radialSegments = Math.floor(radialSegments); - tubularSegments = Math.floor(tubularSegments); - const indices = []; - const vertices = []; - const normals = []; - const uvs = []; - const center = new Vector3(); - const vertex2 = new Vector3(); - const normal = new Vector3(); - for (let j = 0; j <= radialSegments; j++) { - for (let i = 0; i <= tubularSegments; i++) { - const u = i / tubularSegments * arc; - const v = j / radialSegments * Math.PI * 2; - vertex2.x = (radius + tube * Math.cos(v)) * Math.cos(u); - vertex2.y = (radius + tube * Math.cos(v)) * Math.sin(u); - vertex2.z = tube * Math.sin(v); - vertices.push(vertex2.x, vertex2.y, vertex2.z); - center.x = radius * Math.cos(u); - center.y = radius * Math.sin(u); - normal.subVectors(vertex2, center).normalize(); - normals.push(normal.x, normal.y, normal.z); - uvs.push(i / tubularSegments); - uvs.push(j / radialSegments); - } + __name(setupRenderBufferStorage, "setupRenderBufferStorage"); + function setupDepthTexture(framebuffer, renderTarget) { + const isCube = renderTarget && renderTarget.isWebGLCubeRenderTarget; + if (isCube) throw new Error("Depth Texture with cube render targets is not supported"); + state.bindFramebuffer(_gl.FRAMEBUFFER, framebuffer); + if (!(renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture)) { + throw new Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture"); } - for (let j = 1; j <= radialSegments; j++) { - for (let i = 1; i <= tubularSegments; i++) { - const a = (tubularSegments + 1) * j + i - 1; - const b = (tubularSegments + 1) * (j - 1) + i - 1; - const c = (tubularSegments + 1) * (j - 1) + i; - const d = (tubularSegments + 1) * j + i; - indices.push(a, b, d); - indices.push(b, c, d); + const textureProperties = properties.get(renderTarget.depthTexture); + textureProperties.__renderTarget = renderTarget; + if (!textureProperties.__webglTexture || renderTarget.depthTexture.image.width !== renderTarget.width || renderTarget.depthTexture.image.height !== renderTarget.height) { + renderTarget.depthTexture.image.width = renderTarget.width; + renderTarget.depthTexture.image.height = renderTarget.height; + renderTarget.depthTexture.needsUpdate = true; + } + setTexture2D(renderTarget.depthTexture, 0); + const webglDepthTexture = textureProperties.__webglTexture; + const samples = getRenderTargetSamples(renderTarget); + if (renderTarget.depthTexture.format === DepthFormat) { + if (useMultisampledRTT(renderTarget)) { + multisampledRTTExt.framebufferTexture2DMultisampleEXT(_gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples); + } else { + _gl.framebufferTexture2D(_gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0); + } + } else if (renderTarget.depthTexture.format === DepthStencilFormat) { + if (useMultisampledRTT(renderTarget)) { + multisampledRTTExt.framebufferTexture2DMultisampleEXT(_gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples); + } else { + _gl.framebufferTexture2D(_gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0); } + } else { + throw new Error("Unknown depthTexture format"); } - this.setIndex(indices); - this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); - this.setAttribute("normal", new Float32BufferAttribute(normals, 3)); - this.setAttribute("uv", new Float32BufferAttribute(uvs, 2)); - } - copy(source) { - super.copy(source); - this.parameters = Object.assign({}, source.parameters); - return this; - } - static fromJSON(data) { - return new TorusGeometry(data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc); - } -} -class TorusKnotGeometry extends BufferGeometry { - static { - __name(this, "TorusKnotGeometry"); } - constructor(radius = 1, tube = 0.4, tubularSegments = 64, radialSegments = 8, p = 2, q = 3) { - super(); - this.type = "TorusKnotGeometry"; - this.parameters = { - radius, - tube, - tubularSegments, - radialSegments, - p, - q - }; - tubularSegments = Math.floor(tubularSegments); - radialSegments = Math.floor(radialSegments); - const indices = []; - const vertices = []; - const normals = []; - const uvs = []; - const vertex2 = new Vector3(); - const normal = new Vector3(); - const P1 = new Vector3(); - const P2 = new Vector3(); - const B = new Vector3(); - const T = new Vector3(); - const N = new Vector3(); - for (let i = 0; i <= tubularSegments; ++i) { - const u = i / tubularSegments * p * Math.PI * 2; - calculatePositionOnCurve(u, p, q, radius, P1); - calculatePositionOnCurve(u + 0.01, p, q, radius, P2); - T.subVectors(P2, P1); - N.addVectors(P2, P1); - B.crossVectors(T, N); - N.crossVectors(B, T); - B.normalize(); - N.normalize(); - for (let j = 0; j <= radialSegments; ++j) { - const v = j / radialSegments * Math.PI * 2; - const cx = -tube * Math.cos(v); - const cy = tube * Math.sin(v); - vertex2.x = P1.x + (cx * N.x + cy * B.x); - vertex2.y = P1.y + (cx * N.y + cy * B.y); - vertex2.z = P1.z + (cx * N.z + cy * B.z); - vertices.push(vertex2.x, vertex2.y, vertex2.z); - normal.subVectors(vertex2, P1).normalize(); - normals.push(normal.x, normal.y, normal.z); - uvs.push(i / tubularSegments); - uvs.push(j / radialSegments); + __name(setupDepthTexture, "setupDepthTexture"); + function setupDepthRenderbuffer(renderTarget) { + const renderTargetProperties = properties.get(renderTarget); + const isCube = renderTarget.isWebGLCubeRenderTarget === true; + if (renderTargetProperties.__boundDepthTexture !== renderTarget.depthTexture) { + const depthTexture = renderTarget.depthTexture; + if (renderTargetProperties.__depthDisposeCallback) { + renderTargetProperties.__depthDisposeCallback(); } - } - for (let j = 1; j <= tubularSegments; j++) { - for (let i = 1; i <= radialSegments; i++) { - const a = (radialSegments + 1) * (j - 1) + (i - 1); - const b = (radialSegments + 1) * j + (i - 1); - const c = (radialSegments + 1) * j + i; - const d = (radialSegments + 1) * (j - 1) + i; - indices.push(a, b, d); - indices.push(b, c, d); + if (depthTexture) { + const disposeEvent = /* @__PURE__ */ __name(() => { + delete renderTargetProperties.__boundDepthTexture; + delete renderTargetProperties.__depthDisposeCallback; + depthTexture.removeEventListener("dispose", disposeEvent); + }, "disposeEvent"); + depthTexture.addEventListener("dispose", disposeEvent); + renderTargetProperties.__depthDisposeCallback = disposeEvent; } + renderTargetProperties.__boundDepthTexture = depthTexture; } - this.setIndex(indices); - this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); - this.setAttribute("normal", new Float32BufferAttribute(normals, 3)); - this.setAttribute("uv", new Float32BufferAttribute(uvs, 2)); - function calculatePositionOnCurve(u, p2, q2, radius2, position) { - const cu = Math.cos(u); - const su = Math.sin(u); - const quOverP = q2 / p2 * u; - const cs = Math.cos(quOverP); - position.x = radius2 * (2 + cs) * 0.5 * cu; - position.y = radius2 * (2 + cs) * su * 0.5; - position.z = radius2 * Math.sin(quOverP) * 0.5; + if (renderTarget.depthTexture && !renderTargetProperties.__autoAllocateDepthBuffer) { + if (isCube) throw new Error("target.depthTexture not supported in Cube render targets"); + setupDepthTexture(renderTargetProperties.__webglFramebuffer, renderTarget); + } else { + if (isCube) { + renderTargetProperties.__webglDepthbuffer = []; + for (let i = 0; i < 6; i++) { + state.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[i]); + if (renderTargetProperties.__webglDepthbuffer[i] === void 0) { + renderTargetProperties.__webglDepthbuffer[i] = _gl.createRenderbuffer(); + setupRenderBufferStorage(renderTargetProperties.__webglDepthbuffer[i], renderTarget, false); + } else { + const glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT; + const renderbuffer = renderTargetProperties.__webglDepthbuffer[i]; + _gl.bindRenderbuffer(_gl.RENDERBUFFER, renderbuffer); + _gl.framebufferRenderbuffer(_gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer); + } + } + } else { + state.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer); + if (renderTargetProperties.__webglDepthbuffer === void 0) { + renderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer(); + setupRenderBufferStorage(renderTargetProperties.__webglDepthbuffer, renderTarget, false); + } else { + const glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT; + const renderbuffer = renderTargetProperties.__webglDepthbuffer; + _gl.bindRenderbuffer(_gl.RENDERBUFFER, renderbuffer); + _gl.framebufferRenderbuffer(_gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer); + } + } } - __name(calculatePositionOnCurve, "calculatePositionOnCurve"); - } - copy(source) { - super.copy(source); - this.parameters = Object.assign({}, source.parameters); - return this; - } - static fromJSON(data) { - return new TorusKnotGeometry(data.radius, data.tube, data.tubularSegments, data.radialSegments, data.p, data.q); - } -} -class TubeGeometry extends BufferGeometry { - static { - __name(this, "TubeGeometry"); + state.bindFramebuffer(_gl.FRAMEBUFFER, null); } - constructor(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) { - super(); - this.type = "TubeGeometry"; - this.parameters = { - path, - tubularSegments, - radius, - radialSegments, - closed - }; - const frames = path.computeFrenetFrames(tubularSegments, closed); - this.tangents = frames.tangents; - this.normals = frames.normals; - this.binormals = frames.binormals; - const vertex2 = new Vector3(); - const normal = new Vector3(); - const uv = new Vector2(); - let P = new Vector3(); - const vertices = []; - const normals = []; - const uvs = []; - const indices = []; - generateBufferData(); - this.setIndex(indices); - this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); - this.setAttribute("normal", new Float32BufferAttribute(normals, 3)); - this.setAttribute("uv", new Float32BufferAttribute(uvs, 2)); - function generateBufferData() { - for (let i = 0; i < tubularSegments; i++) { - generateSegment(i); - } - generateSegment(closed === false ? tubularSegments : 0); - generateUVs(); - generateIndices(); + __name(setupDepthRenderbuffer, "setupDepthRenderbuffer"); + function rebindTextures(renderTarget, colorTexture, depthTexture) { + const renderTargetProperties = properties.get(renderTarget); + if (colorTexture !== void 0) { + setupFrameBufferTexture(renderTargetProperties.__webglFramebuffer, renderTarget, renderTarget.texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, 0); } - __name(generateBufferData, "generateBufferData"); - function generateSegment(i) { - P = path.getPointAt(i / tubularSegments, P); - const N = frames.normals[i]; - const B = frames.binormals[i]; - for (let j = 0; j <= radialSegments; j++) { - const v = j / radialSegments * Math.PI * 2; - const sin = Math.sin(v); - const cos = -Math.cos(v); - normal.x = cos * N.x + sin * B.x; - normal.y = cos * N.y + sin * B.y; - normal.z = cos * N.z + sin * B.z; - normal.normalize(); - normals.push(normal.x, normal.y, normal.z); - vertex2.x = P.x + radius * normal.x; - vertex2.y = P.y + radius * normal.y; - vertex2.z = P.z + radius * normal.z; - vertices.push(vertex2.x, vertex2.y, vertex2.z); + if (depthTexture !== void 0) { + setupDepthRenderbuffer(renderTarget); + } + } + __name(rebindTextures, "rebindTextures"); + function setupRenderTarget(renderTarget) { + const texture = renderTarget.texture; + const renderTargetProperties = properties.get(renderTarget); + const textureProperties = properties.get(texture); + renderTarget.addEventListener("dispose", onRenderTargetDispose); + const textures = renderTarget.textures; + const isCube = renderTarget.isWebGLCubeRenderTarget === true; + const isMultipleRenderTargets = textures.length > 1; + if (!isMultipleRenderTargets) { + if (textureProperties.__webglTexture === void 0) { + textureProperties.__webglTexture = _gl.createTexture(); } + textureProperties.__version = texture.version; + info.memory.textures++; } - __name(generateSegment, "generateSegment"); - function generateIndices() { - for (let j = 1; j <= tubularSegments; j++) { - for (let i = 1; i <= radialSegments; i++) { - const a = (radialSegments + 1) * (j - 1) + (i - 1); - const b = (radialSegments + 1) * j + (i - 1); - const c = (radialSegments + 1) * j + i; - const d = (radialSegments + 1) * (j - 1) + i; - indices.push(a, b, d); - indices.push(b, c, d); + if (isCube) { + renderTargetProperties.__webglFramebuffer = []; + for (let i = 0; i < 6; i++) { + if (texture.mipmaps && texture.mipmaps.length > 0) { + renderTargetProperties.__webglFramebuffer[i] = []; + for (let level = 0; level < texture.mipmaps.length; level++) { + renderTargetProperties.__webglFramebuffer[i][level] = _gl.createFramebuffer(); + } + } else { + renderTargetProperties.__webglFramebuffer[i] = _gl.createFramebuffer(); + } + } + } else { + if (texture.mipmaps && texture.mipmaps.length > 0) { + renderTargetProperties.__webglFramebuffer = []; + for (let level = 0; level < texture.mipmaps.length; level++) { + renderTargetProperties.__webglFramebuffer[level] = _gl.createFramebuffer(); + } + } else { + renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer(); + } + if (isMultipleRenderTargets) { + for (let i = 0, il = textures.length; i < il; i++) { + const attachmentProperties = properties.get(textures[i]); + if (attachmentProperties.__webglTexture === void 0) { + attachmentProperties.__webglTexture = _gl.createTexture(); + info.memory.textures++; + } + } + } + if (renderTarget.samples > 0 && useMultisampledRTT(renderTarget) === false) { + renderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer(); + renderTargetProperties.__webglColorRenderbuffer = []; + state.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer); + for (let i = 0; i < textures.length; i++) { + const texture2 = textures[i]; + renderTargetProperties.__webglColorRenderbuffer[i] = _gl.createRenderbuffer(); + _gl.bindRenderbuffer(_gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[i]); + const glFormat = utils.convert(texture2.format, texture2.colorSpace); + const glType = utils.convert(texture2.type); + const glInternalFormat = getInternalFormat(texture2.internalFormat, glFormat, glType, texture2.colorSpace, renderTarget.isXRRenderTarget === true); + const samples = getRenderTargetSamples(renderTarget); + _gl.renderbufferStorageMultisample(_gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height); + _gl.framebufferRenderbuffer(_gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[i]); + } + _gl.bindRenderbuffer(_gl.RENDERBUFFER, null); + if (renderTarget.depthBuffer) { + renderTargetProperties.__webglDepthRenderbuffer = _gl.createRenderbuffer(); + setupRenderBufferStorage(renderTargetProperties.__webglDepthRenderbuffer, renderTarget, true); } + state.bindFramebuffer(_gl.FRAMEBUFFER, null); } } - __name(generateIndices, "generateIndices"); - function generateUVs() { - for (let i = 0; i <= tubularSegments; i++) { - for (let j = 0; j <= radialSegments; j++) { - uv.x = i / tubularSegments; - uv.y = j / radialSegments; - uvs.push(uv.x, uv.y); + if (isCube) { + state.bindTexture(_gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture); + setTextureParameters(_gl.TEXTURE_CUBE_MAP, texture); + for (let i = 0; i < 6; i++) { + if (texture.mipmaps && texture.mipmaps.length > 0) { + for (let level = 0; level < texture.mipmaps.length; level++) { + setupFrameBufferTexture(renderTargetProperties.__webglFramebuffer[i][level], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, level); + } + } else { + setupFrameBufferTexture(renderTargetProperties.__webglFramebuffer[i], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0); + } + } + if (textureNeedsGenerateMipmaps(texture)) { + generateMipmap(_gl.TEXTURE_CUBE_MAP); + } + state.unbindTexture(); + } else if (isMultipleRenderTargets) { + for (let i = 0, il = textures.length; i < il; i++) { + const attachment = textures[i]; + const attachmentProperties = properties.get(attachment); + state.bindTexture(_gl.TEXTURE_2D, attachmentProperties.__webglTexture); + setTextureParameters(_gl.TEXTURE_2D, attachment); + setupFrameBufferTexture(renderTargetProperties.__webglFramebuffer, renderTarget, attachment, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, 0); + if (textureNeedsGenerateMipmaps(attachment)) { + generateMipmap(_gl.TEXTURE_2D); + } + } + state.unbindTexture(); + } else { + let glTextureType = _gl.TEXTURE_2D; + if (renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget) { + glTextureType = renderTarget.isWebGL3DRenderTarget ? _gl.TEXTURE_3D : _gl.TEXTURE_2D_ARRAY; + } + state.bindTexture(glTextureType, textureProperties.__webglTexture); + setTextureParameters(glTextureType, texture); + if (texture.mipmaps && texture.mipmaps.length > 0) { + for (let level = 0; level < texture.mipmaps.length; level++) { + setupFrameBufferTexture(renderTargetProperties.__webglFramebuffer[level], renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, level); } + } else { + setupFrameBufferTexture(renderTargetProperties.__webglFramebuffer, renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, 0); + } + if (textureNeedsGenerateMipmaps(texture)) { + generateMipmap(glTextureType); } + state.unbindTexture(); + } + if (renderTarget.depthBuffer) { + setupDepthRenderbuffer(renderTarget); } - __name(generateUVs, "generateUVs"); - } - copy(source) { - super.copy(source); - this.parameters = Object.assign({}, source.parameters); - return this; - } - toJSON() { - const data = super.toJSON(); - data.path = this.parameters.path.toJSON(); - return data; - } - static fromJSON(data) { - return new TubeGeometry( - new Curves[data.path.type]().fromJSON(data.path), - data.tubularSegments, - data.radius, - data.radialSegments, - data.closed - ); } -} -class WireframeGeometry extends BufferGeometry { - static { - __name(this, "WireframeGeometry"); + __name(setupRenderTarget, "setupRenderTarget"); + function updateRenderTargetMipmap(renderTarget) { + const textures = renderTarget.textures; + for (let i = 0, il = textures.length; i < il; i++) { + const texture = textures[i]; + if (textureNeedsGenerateMipmaps(texture)) { + const targetType = getTargetType(renderTarget); + const webglTexture = properties.get(texture).__webglTexture; + state.bindTexture(targetType, webglTexture); + generateMipmap(targetType); + state.unbindTexture(); + } + } } - constructor(geometry = null) { - super(); - this.type = "WireframeGeometry"; - this.parameters = { - geometry - }; - if (geometry !== null) { - const vertices = []; - const edges = /* @__PURE__ */ new Set(); - const start = new Vector3(); - const end = new Vector3(); - if (geometry.index !== null) { - const position = geometry.attributes.position; - const indices = geometry.index; - let groups = geometry.groups; - if (groups.length === 0) { - groups = [{ start: 0, count: indices.count, materialIndex: 0 }]; + __name(updateRenderTargetMipmap, "updateRenderTargetMipmap"); + const invalidationArrayRead = []; + const invalidationArrayDraw = []; + function updateMultisampleRenderTarget(renderTarget) { + if (renderTarget.samples > 0) { + if (useMultisampledRTT(renderTarget) === false) { + const textures = renderTarget.textures; + const width = renderTarget.width; + const height = renderTarget.height; + let mask = _gl.COLOR_BUFFER_BIT; + const depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT; + const renderTargetProperties = properties.get(renderTarget); + const isMultipleRenderTargets = textures.length > 1; + if (isMultipleRenderTargets) { + for (let i = 0; i < textures.length; i++) { + state.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer); + _gl.framebufferRenderbuffer(_gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, null); + state.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer); + _gl.framebufferTexture2D(_gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, null, 0); + } } - for (let o = 0, ol = groups.length; o < ol; ++o) { - const group = groups[o]; - const groupStart = group.start; - const groupCount = group.count; - for (let i = groupStart, l = groupStart + groupCount; i < l; i += 3) { - for (let j = 0; j < 3; j++) { - const index1 = indices.getX(i + j); - const index2 = indices.getX(i + (j + 1) % 3); - start.fromBufferAttribute(position, index1); - end.fromBufferAttribute(position, index2); - if (isUniqueEdge(start, end, edges) === true) { - vertices.push(start.x, start.y, start.z); - vertices.push(end.x, end.y, end.z); - } + state.bindFramebuffer(_gl.READ_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer); + state.bindFramebuffer(_gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer); + for (let i = 0; i < textures.length; i++) { + if (renderTarget.resolveDepthBuffer) { + if (renderTarget.depthBuffer) mask |= _gl.DEPTH_BUFFER_BIT; + if (renderTarget.stencilBuffer && renderTarget.resolveStencilBuffer) mask |= _gl.STENCIL_BUFFER_BIT; + } + if (isMultipleRenderTargets) { + _gl.framebufferRenderbuffer(_gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[i]); + const webglTexture = properties.get(textures[i]).__webglTexture; + _gl.framebufferTexture2D(_gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, webglTexture, 0); + } + _gl.blitFramebuffer(0, 0, width, height, 0, 0, width, height, mask, _gl.NEAREST); + if (supportsInvalidateFramebuffer === true) { + invalidationArrayRead.length = 0; + invalidationArrayDraw.length = 0; + invalidationArrayRead.push(_gl.COLOR_ATTACHMENT0 + i); + if (renderTarget.depthBuffer && renderTarget.resolveDepthBuffer === false) { + invalidationArrayRead.push(depthStyle); + invalidationArrayDraw.push(depthStyle); + _gl.invalidateFramebuffer(_gl.DRAW_FRAMEBUFFER, invalidationArrayDraw); } + _gl.invalidateFramebuffer(_gl.READ_FRAMEBUFFER, invalidationArrayRead); } } - } else { - const position = geometry.attributes.position; - for (let i = 0, l = position.count / 3; i < l; i++) { - for (let j = 0; j < 3; j++) { - const index1 = 3 * i + j; - const index2 = 3 * i + (j + 1) % 3; - start.fromBufferAttribute(position, index1); - end.fromBufferAttribute(position, index2); - if (isUniqueEdge(start, end, edges) === true) { - vertices.push(start.x, start.y, start.z); - vertices.push(end.x, end.y, end.z); - } + state.bindFramebuffer(_gl.READ_FRAMEBUFFER, null); + state.bindFramebuffer(_gl.DRAW_FRAMEBUFFER, null); + if (isMultipleRenderTargets) { + for (let i = 0; i < textures.length; i++) { + state.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer); + _gl.framebufferRenderbuffer(_gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[i]); + const webglTexture = properties.get(textures[i]).__webglTexture; + state.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer); + _gl.framebufferTexture2D(_gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, webglTexture, 0); } } + state.bindFramebuffer(_gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer); + } else { + if (renderTarget.depthBuffer && renderTarget.resolveDepthBuffer === false && supportsInvalidateFramebuffer) { + const depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT; + _gl.invalidateFramebuffer(_gl.DRAW_FRAMEBUFFER, [depthStyle]); + } } - this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); } } - copy(source) { - super.copy(source); - this.parameters = Object.assign({}, source.parameters); - return this; + __name(updateMultisampleRenderTarget, "updateMultisampleRenderTarget"); + function getRenderTargetSamples(renderTarget) { + return Math.min(capabilities.maxSamples, renderTarget.samples); } -} -function isUniqueEdge(start, end, edges) { - const hash1 = `${start.x},${start.y},${start.z}-${end.x},${end.y},${end.z}`; - const hash2 = `${end.x},${end.y},${end.z}-${start.x},${start.y},${start.z}`; - if (edges.has(hash1) === true || edges.has(hash2) === true) { - return false; - } else { - edges.add(hash1); - edges.add(hash2); - return true; + __name(getRenderTargetSamples, "getRenderTargetSamples"); + function useMultisampledRTT(renderTarget) { + const renderTargetProperties = properties.get(renderTarget); + return renderTarget.samples > 0 && extensions.has("WEBGL_multisampled_render_to_texture") === true && renderTargetProperties.__useRenderToTexture !== false; } -} -__name(isUniqueEdge, "isUniqueEdge"); -var Geometries = /* @__PURE__ */ Object.freeze({ - __proto__: null, - BoxGeometry, - CapsuleGeometry, - CircleGeometry, - ConeGeometry, - CylinderGeometry, - DodecahedronGeometry, - EdgesGeometry, - ExtrudeGeometry, - IcosahedronGeometry, - LatheGeometry, - OctahedronGeometry, - PlaneGeometry, - PolyhedronGeometry, - RingGeometry, - ShapeGeometry, - SphereGeometry, - TetrahedronGeometry, - TorusGeometry, - TorusKnotGeometry, - TubeGeometry, - WireframeGeometry -}); -class ShadowMaterial extends Material { - static { - __name(this, "ShadowMaterial"); + __name(useMultisampledRTT, "useMultisampledRTT"); + function updateVideoTexture(texture) { + const frame = info.render.frame; + if (_videoTextures.get(texture) !== frame) { + _videoTextures.set(texture, frame); + texture.update(); + } } - static get type() { - return "ShadowMaterial"; + __name(updateVideoTexture, "updateVideoTexture"); + function verifyColorSpace(texture, image) { + const colorSpace = texture.colorSpace; + const format = texture.format; + const type = texture.type; + if (texture.isCompressedTexture === true || texture.isVideoTexture === true) return image; + if (colorSpace !== LinearSRGBColorSpace && colorSpace !== NoColorSpace) { + if (ColorManagement.getTransfer(colorSpace) === SRGBTransfer) { + if (format !== RGBAFormat || type !== UnsignedByteType) { + console.warn("THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."); + } + } else { + console.error("THREE.WebGLTextures: Unsupported texture color space:", colorSpace); + } + } + return image; } - constructor(parameters) { - super(); - this.isShadowMaterial = true; - this.color = new Color(0); - this.transparent = true; - this.fog = true; - this.setValues(parameters); + __name(verifyColorSpace, "verifyColorSpace"); + function getDimensions(image) { + if (typeof HTMLImageElement !== "undefined" && image instanceof HTMLImageElement) { + _imageDimensions.width = image.naturalWidth || image.width; + _imageDimensions.height = image.naturalHeight || image.height; + } else if (typeof VideoFrame !== "undefined" && image instanceof VideoFrame) { + _imageDimensions.width = image.displayWidth; + _imageDimensions.height = image.displayHeight; + } else { + _imageDimensions.width = image.width; + _imageDimensions.height = image.height; + } + return _imageDimensions; } - copy(source) { - super.copy(source); - this.color.copy(source.color); - this.fog = source.fog; - return this; + __name(getDimensions, "getDimensions"); + this.allocateTextureUnit = allocateTextureUnit; + this.resetTextureUnits = resetTextureUnits; + this.setTexture2D = setTexture2D; + this.setTexture2DArray = setTexture2DArray; + this.setTexture3D = setTexture3D; + this.setTextureCube = setTextureCube; + this.rebindTextures = rebindTextures; + this.setupRenderTarget = setupRenderTarget; + this.updateRenderTargetMipmap = updateRenderTargetMipmap; + this.updateMultisampleRenderTarget = updateMultisampleRenderTarget; + this.setupDepthRenderbuffer = setupDepthRenderbuffer; + this.setupFrameBufferTexture = setupFrameBufferTexture; + this.useMultisampledRTT = useMultisampledRTT; +} +__name(WebGLTextures, "WebGLTextures"); +function WebGLUtils(gl, extensions) { + function convert(p, colorSpace = NoColorSpace) { + let extension; + const transfer = ColorManagement.getTransfer(colorSpace); + if (p === UnsignedByteType) return gl.UNSIGNED_BYTE; + if (p === UnsignedShort4444Type) return gl.UNSIGNED_SHORT_4_4_4_4; + if (p === UnsignedShort5551Type) return gl.UNSIGNED_SHORT_5_5_5_1; + if (p === UnsignedInt5999Type) return gl.UNSIGNED_INT_5_9_9_9_REV; + if (p === ByteType) return gl.BYTE; + if (p === ShortType) return gl.SHORT; + if (p === UnsignedShortType) return gl.UNSIGNED_SHORT; + if (p === IntType) return gl.INT; + if (p === UnsignedIntType) return gl.UNSIGNED_INT; + if (p === FloatType) return gl.FLOAT; + if (p === HalfFloatType) return gl.HALF_FLOAT; + if (p === AlphaFormat) return gl.ALPHA; + if (p === RGBFormat) return gl.RGB; + if (p === RGBAFormat) return gl.RGBA; + if (p === LuminanceFormat) return gl.LUMINANCE; + if (p === LuminanceAlphaFormat) return gl.LUMINANCE_ALPHA; + if (p === DepthFormat) return gl.DEPTH_COMPONENT; + if (p === DepthStencilFormat) return gl.DEPTH_STENCIL; + if (p === RedFormat) return gl.RED; + if (p === RedIntegerFormat) return gl.RED_INTEGER; + if (p === RGFormat) return gl.RG; + if (p === RGIntegerFormat) return gl.RG_INTEGER; + if (p === RGBAIntegerFormat) return gl.RGBA_INTEGER; + if (p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format) { + if (transfer === SRGBTransfer) { + extension = extensions.get("WEBGL_compressed_texture_s3tc_srgb"); + if (extension !== null) { + if (p === RGB_S3TC_DXT1_Format) return extension.COMPRESSED_SRGB_S3TC_DXT1_EXT; + if (p === RGBA_S3TC_DXT1_Format) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT; + if (p === RGBA_S3TC_DXT3_Format) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT; + if (p === RGBA_S3TC_DXT5_Format) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT; + } else { + return null; + } + } else { + extension = extensions.get("WEBGL_compressed_texture_s3tc"); + if (extension !== null) { + if (p === RGB_S3TC_DXT1_Format) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT; + if (p === RGBA_S3TC_DXT1_Format) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT; + if (p === RGBA_S3TC_DXT3_Format) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT; + if (p === RGBA_S3TC_DXT5_Format) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT; + } else { + return null; + } + } + } + if (p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format) { + extension = extensions.get("WEBGL_compressed_texture_pvrtc"); + if (extension !== null) { + if (p === RGB_PVRTC_4BPPV1_Format) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; + if (p === RGB_PVRTC_2BPPV1_Format) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG; + if (p === RGBA_PVRTC_4BPPV1_Format) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; + if (p === RGBA_PVRTC_2BPPV1_Format) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; + } else { + return null; + } + } + if (p === RGB_ETC1_Format || p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format) { + extension = extensions.get("WEBGL_compressed_texture_etc"); + if (extension !== null) { + if (p === RGB_ETC1_Format || p === RGB_ETC2_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ETC2 : extension.COMPRESSED_RGB8_ETC2; + if (p === RGBA_ETC2_EAC_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : extension.COMPRESSED_RGBA8_ETC2_EAC; + } else { + return null; + } + } + if (p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format || p === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format || p === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format || p === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format || p === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format) { + extension = extensions.get("WEBGL_compressed_texture_astc"); + if (extension !== null) { + if (p === RGBA_ASTC_4x4_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR : extension.COMPRESSED_RGBA_ASTC_4x4_KHR; + if (p === RGBA_ASTC_5x4_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR : extension.COMPRESSED_RGBA_ASTC_5x4_KHR; + if (p === RGBA_ASTC_5x5_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR : extension.COMPRESSED_RGBA_ASTC_5x5_KHR; + if (p === RGBA_ASTC_6x5_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR : extension.COMPRESSED_RGBA_ASTC_6x5_KHR; + if (p === RGBA_ASTC_6x6_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR : extension.COMPRESSED_RGBA_ASTC_6x6_KHR; + if (p === RGBA_ASTC_8x5_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR : extension.COMPRESSED_RGBA_ASTC_8x5_KHR; + if (p === RGBA_ASTC_8x6_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR : extension.COMPRESSED_RGBA_ASTC_8x6_KHR; + if (p === RGBA_ASTC_8x8_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR : extension.COMPRESSED_RGBA_ASTC_8x8_KHR; + if (p === RGBA_ASTC_10x5_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR : extension.COMPRESSED_RGBA_ASTC_10x5_KHR; + if (p === RGBA_ASTC_10x6_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR : extension.COMPRESSED_RGBA_ASTC_10x6_KHR; + if (p === RGBA_ASTC_10x8_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR : extension.COMPRESSED_RGBA_ASTC_10x8_KHR; + if (p === RGBA_ASTC_10x10_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR : extension.COMPRESSED_RGBA_ASTC_10x10_KHR; + if (p === RGBA_ASTC_12x10_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR : extension.COMPRESSED_RGBA_ASTC_12x10_KHR; + if (p === RGBA_ASTC_12x12_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR : extension.COMPRESSED_RGBA_ASTC_12x12_KHR; + } else { + return null; + } + } + if (p === RGBA_BPTC_Format || p === RGB_BPTC_SIGNED_Format || p === RGB_BPTC_UNSIGNED_Format) { + extension = extensions.get("EXT_texture_compression_bptc"); + if (extension !== null) { + if (p === RGBA_BPTC_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT : extension.COMPRESSED_RGBA_BPTC_UNORM_EXT; + if (p === RGB_BPTC_SIGNED_Format) return extension.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT; + if (p === RGB_BPTC_UNSIGNED_Format) return extension.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT; + } else { + return null; + } + } + if (p === RED_RGTC1_Format || p === SIGNED_RED_RGTC1_Format || p === RED_GREEN_RGTC2_Format || p === SIGNED_RED_GREEN_RGTC2_Format) { + extension = extensions.get("EXT_texture_compression_rgtc"); + if (extension !== null) { + if (p === RGBA_BPTC_Format) return extension.COMPRESSED_RED_RGTC1_EXT; + if (p === SIGNED_RED_RGTC1_Format) return extension.COMPRESSED_SIGNED_RED_RGTC1_EXT; + if (p === RED_GREEN_RGTC2_Format) return extension.COMPRESSED_RED_GREEN_RGTC2_EXT; + if (p === SIGNED_RED_GREEN_RGTC2_Format) return extension.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT; + } else { + return null; + } + } + if (p === UnsignedInt248Type) return gl.UNSIGNED_INT_24_8; + return gl[p] !== void 0 ? gl[p] : null; } + __name(convert, "convert"); + return { convert }; } -class RawShaderMaterial extends ShaderMaterial { +__name(WebGLUtils, "WebGLUtils"); +class ArrayCamera extends PerspectiveCamera { static { - __name(this, "RawShaderMaterial"); - } - static get type() { - return "RawShaderMaterial"; + __name(this, "ArrayCamera"); } - constructor(parameters) { - super(parameters); - this.isRawShaderMaterial = true; + constructor(array = []) { + super(); + this.isArrayCamera = true; + this.cameras = array; } } -class MeshStandardMaterial extends Material { +class Group extends Object3D { static { - __name(this, "MeshStandardMaterial"); - } - static get type() { - return "MeshStandardMaterial"; + __name(this, "Group"); } - constructor(parameters) { + constructor() { super(); - this.isMeshStandardMaterial = true; - this.defines = { "STANDARD": "" }; - this.color = new Color(16777215); - this.roughness = 1; - this.metalness = 0; - this.map = null; - this.lightMap = null; - this.lightMapIntensity = 1; - this.aoMap = null; - this.aoMapIntensity = 1; - this.emissive = new Color(0); - this.emissiveIntensity = 1; - this.emissiveMap = null; - this.bumpMap = null; - this.bumpScale = 1; - this.normalMap = null; - this.normalMapType = TangentSpaceNormalMap; - this.normalScale = new Vector2(1, 1); - this.displacementMap = null; - this.displacementScale = 1; - this.displacementBias = 0; - this.roughnessMap = null; - this.metalnessMap = null; - this.alphaMap = null; - this.envMap = null; - this.envMapRotation = new Euler(); - this.envMapIntensity = 1; - this.wireframe = false; - this.wireframeLinewidth = 1; - this.wireframeLinecap = "round"; - this.wireframeLinejoin = "round"; - this.flatShading = false; - this.fog = true; - this.setValues(parameters); - } - copy(source) { - super.copy(source); - this.defines = { "STANDARD": "" }; - this.color.copy(source.color); - this.roughness = source.roughness; - this.metalness = source.metalness; - this.map = source.map; - this.lightMap = source.lightMap; - this.lightMapIntensity = source.lightMapIntensity; - this.aoMap = source.aoMap; - this.aoMapIntensity = source.aoMapIntensity; - this.emissive.copy(source.emissive); - this.emissiveMap = source.emissiveMap; - this.emissiveIntensity = source.emissiveIntensity; - this.bumpMap = source.bumpMap; - this.bumpScale = source.bumpScale; - this.normalMap = source.normalMap; - this.normalMapType = source.normalMapType; - this.normalScale.copy(source.normalScale); - this.displacementMap = source.displacementMap; - this.displacementScale = source.displacementScale; - this.displacementBias = source.displacementBias; - this.roughnessMap = source.roughnessMap; - this.metalnessMap = source.metalnessMap; - this.alphaMap = source.alphaMap; - this.envMap = source.envMap; - this.envMapRotation.copy(source.envMapRotation); - this.envMapIntensity = source.envMapIntensity; - this.wireframe = source.wireframe; - this.wireframeLinewidth = source.wireframeLinewidth; - this.wireframeLinecap = source.wireframeLinecap; - this.wireframeLinejoin = source.wireframeLinejoin; - this.flatShading = source.flatShading; - this.fog = source.fog; - return this; + this.isGroup = true; + this.type = "Group"; } } -class MeshPhysicalMaterial extends MeshStandardMaterial { +const _moveEvent = { type: "move" }; +class WebXRController { static { - __name(this, "MeshPhysicalMaterial"); - } - static get type() { - return "MeshPhysicalMaterial"; - } - constructor(parameters) { - super(); - this.isMeshPhysicalMaterial = true; - this.defines = { - "STANDARD": "", - "PHYSICAL": "" - }; - this.anisotropyRotation = 0; - this.anisotropyMap = null; - this.clearcoatMap = null; - this.clearcoatRoughness = 0; - this.clearcoatRoughnessMap = null; - this.clearcoatNormalScale = new Vector2(1, 1); - this.clearcoatNormalMap = null; - this.ior = 1.5; - Object.defineProperty(this, "reflectivity", { - get: /* @__PURE__ */ __name(function() { - return clamp(2.5 * (this.ior - 1) / (this.ior + 1), 0, 1); - }, "get"), - set: /* @__PURE__ */ __name(function(reflectivity) { - this.ior = (1 + 0.4 * reflectivity) / (1 - 0.4 * reflectivity); - }, "set") - }); - this.iridescenceMap = null; - this.iridescenceIOR = 1.3; - this.iridescenceThicknessRange = [100, 400]; - this.iridescenceThicknessMap = null; - this.sheenColor = new Color(0); - this.sheenColorMap = null; - this.sheenRoughness = 1; - this.sheenRoughnessMap = null; - this.transmissionMap = null; - this.thickness = 0; - this.thicknessMap = null; - this.attenuationDistance = Infinity; - this.attenuationColor = new Color(1, 1, 1); - this.specularIntensity = 1; - this.specularIntensityMap = null; - this.specularColor = new Color(1, 1, 1); - this.specularColorMap = null; - this._anisotropy = 0; - this._clearcoat = 0; - this._dispersion = 0; - this._iridescence = 0; - this._sheen = 0; - this._transmission = 0; - this.setValues(parameters); + __name(this, "WebXRController"); } - get anisotropy() { - return this._anisotropy; + constructor() { + this._targetRay = null; + this._grip = null; + this._hand = null; } - set anisotropy(value) { - if (this._anisotropy > 0 !== value > 0) { - this.version++; + getHandSpace() { + if (this._hand === null) { + this._hand = new Group(); + this._hand.matrixAutoUpdate = false; + this._hand.visible = false; + this._hand.joints = {}; + this._hand.inputState = { pinching: false }; } - this._anisotropy = value; - } - get clearcoat() { - return this._clearcoat; + return this._hand; } - set clearcoat(value) { - if (this._clearcoat > 0 !== value > 0) { - this.version++; + getTargetRaySpace() { + if (this._targetRay === null) { + this._targetRay = new Group(); + this._targetRay.matrixAutoUpdate = false; + this._targetRay.visible = false; + this._targetRay.hasLinearVelocity = false; + this._targetRay.linearVelocity = new Vector3(); + this._targetRay.hasAngularVelocity = false; + this._targetRay.angularVelocity = new Vector3(); } - this._clearcoat = value; - } - get iridescence() { - return this._iridescence; + return this._targetRay; } - set iridescence(value) { - if (this._iridescence > 0 !== value > 0) { - this.version++; + getGripSpace() { + if (this._grip === null) { + this._grip = new Group(); + this._grip.matrixAutoUpdate = false; + this._grip.visible = false; + this._grip.hasLinearVelocity = false; + this._grip.linearVelocity = new Vector3(); + this._grip.hasAngularVelocity = false; + this._grip.angularVelocity = new Vector3(); } - this._iridescence = value; - } - get dispersion() { - return this._dispersion; + return this._grip; } - set dispersion(value) { - if (this._dispersion > 0 !== value > 0) { - this.version++; + dispatchEvent(event) { + if (this._targetRay !== null) { + this._targetRay.dispatchEvent(event); } - this._dispersion = value; - } - get sheen() { - return this._sheen; - } - set sheen(value) { - if (this._sheen > 0 !== value > 0) { - this.version++; + if (this._grip !== null) { + this._grip.dispatchEvent(event); } - this._sheen = value; - } - get transmission() { - return this._transmission; - } - set transmission(value) { - if (this._transmission > 0 !== value > 0) { - this.version++; + if (this._hand !== null) { + this._hand.dispatchEvent(event); } - this._transmission = value; - } - copy(source) { - super.copy(source); - this.defines = { - "STANDARD": "", - "PHYSICAL": "" - }; - this.anisotropy = source.anisotropy; - this.anisotropyRotation = source.anisotropyRotation; - this.anisotropyMap = source.anisotropyMap; - this.clearcoat = source.clearcoat; - this.clearcoatMap = source.clearcoatMap; - this.clearcoatRoughness = source.clearcoatRoughness; - this.clearcoatRoughnessMap = source.clearcoatRoughnessMap; - this.clearcoatNormalMap = source.clearcoatNormalMap; - this.clearcoatNormalScale.copy(source.clearcoatNormalScale); - this.dispersion = source.dispersion; - this.ior = source.ior; - this.iridescence = source.iridescence; - this.iridescenceMap = source.iridescenceMap; - this.iridescenceIOR = source.iridescenceIOR; - this.iridescenceThicknessRange = [...source.iridescenceThicknessRange]; - this.iridescenceThicknessMap = source.iridescenceThicknessMap; - this.sheen = source.sheen; - this.sheenColor.copy(source.sheenColor); - this.sheenColorMap = source.sheenColorMap; - this.sheenRoughness = source.sheenRoughness; - this.sheenRoughnessMap = source.sheenRoughnessMap; - this.transmission = source.transmission; - this.transmissionMap = source.transmissionMap; - this.thickness = source.thickness; - this.thicknessMap = source.thicknessMap; - this.attenuationDistance = source.attenuationDistance; - this.attenuationColor.copy(source.attenuationColor); - this.specularIntensity = source.specularIntensity; - this.specularIntensityMap = source.specularIntensityMap; - this.specularColor.copy(source.specularColor); - this.specularColorMap = source.specularColorMap; return this; } -} -class MeshPhongMaterial extends Material { - static { - __name(this, "MeshPhongMaterial"); - } - static get type() { - return "MeshPhongMaterial"; - } - constructor(parameters) { - super(); - this.isMeshPhongMaterial = true; - this.color = new Color(16777215); - this.specular = new Color(1118481); - this.shininess = 30; - this.map = null; - this.lightMap = null; - this.lightMapIntensity = 1; - this.aoMap = null; - this.aoMapIntensity = 1; - this.emissive = new Color(0); - this.emissiveIntensity = 1; - this.emissiveMap = null; - this.bumpMap = null; - this.bumpScale = 1; - this.normalMap = null; - this.normalMapType = TangentSpaceNormalMap; - this.normalScale = new Vector2(1, 1); - this.displacementMap = null; - this.displacementScale = 1; - this.displacementBias = 0; - this.specularMap = null; - this.alphaMap = null; - this.envMap = null; - this.envMapRotation = new Euler(); - this.combine = MultiplyOperation; - this.reflectivity = 1; - this.refractionRatio = 0.98; - this.wireframe = false; - this.wireframeLinewidth = 1; - this.wireframeLinecap = "round"; - this.wireframeLinejoin = "round"; - this.flatShading = false; - this.fog = true; - this.setValues(parameters); - } - copy(source) { - super.copy(source); - this.color.copy(source.color); - this.specular.copy(source.specular); - this.shininess = source.shininess; - this.map = source.map; - this.lightMap = source.lightMap; - this.lightMapIntensity = source.lightMapIntensity; - this.aoMap = source.aoMap; - this.aoMapIntensity = source.aoMapIntensity; - this.emissive.copy(source.emissive); - this.emissiveMap = source.emissiveMap; - this.emissiveIntensity = source.emissiveIntensity; - this.bumpMap = source.bumpMap; - this.bumpScale = source.bumpScale; - this.normalMap = source.normalMap; - this.normalMapType = source.normalMapType; - this.normalScale.copy(source.normalScale); - this.displacementMap = source.displacementMap; - this.displacementScale = source.displacementScale; - this.displacementBias = source.displacementBias; - this.specularMap = source.specularMap; - this.alphaMap = source.alphaMap; - this.envMap = source.envMap; - this.envMapRotation.copy(source.envMapRotation); - this.combine = source.combine; - this.reflectivity = source.reflectivity; - this.refractionRatio = source.refractionRatio; - this.wireframe = source.wireframe; - this.wireframeLinewidth = source.wireframeLinewidth; - this.wireframeLinecap = source.wireframeLinecap; - this.wireframeLinejoin = source.wireframeLinejoin; - this.flatShading = source.flatShading; - this.fog = source.fog; + connect(inputSource) { + if (inputSource && inputSource.hand) { + const hand = this._hand; + if (hand) { + for (const inputjoint of inputSource.hand.values()) { + this._getHandJoint(hand, inputjoint); + } + } + } + this.dispatchEvent({ type: "connected", data: inputSource }); return this; } -} -class MeshToonMaterial extends Material { - static { - __name(this, "MeshToonMaterial"); - } - static get type() { - return "MeshToonMaterial"; - } - constructor(parameters) { - super(); - this.isMeshToonMaterial = true; - this.defines = { "TOON": "" }; - this.color = new Color(16777215); - this.map = null; - this.gradientMap = null; - this.lightMap = null; - this.lightMapIntensity = 1; - this.aoMap = null; - this.aoMapIntensity = 1; - this.emissive = new Color(0); - this.emissiveIntensity = 1; - this.emissiveMap = null; - this.bumpMap = null; - this.bumpScale = 1; - this.normalMap = null; - this.normalMapType = TangentSpaceNormalMap; - this.normalScale = new Vector2(1, 1); - this.displacementMap = null; - this.displacementScale = 1; - this.displacementBias = 0; - this.alphaMap = null; - this.wireframe = false; - this.wireframeLinewidth = 1; - this.wireframeLinecap = "round"; - this.wireframeLinejoin = "round"; - this.fog = true; - this.setValues(parameters); + disconnect(inputSource) { + this.dispatchEvent({ type: "disconnected", data: inputSource }); + if (this._targetRay !== null) { + this._targetRay.visible = false; + } + if (this._grip !== null) { + this._grip.visible = false; + } + if (this._hand !== null) { + this._hand.visible = false; + } + return this; } - copy(source) { - super.copy(source); - this.color.copy(source.color); - this.map = source.map; - this.gradientMap = source.gradientMap; - this.lightMap = source.lightMap; - this.lightMapIntensity = source.lightMapIntensity; - this.aoMap = source.aoMap; - this.aoMapIntensity = source.aoMapIntensity; - this.emissive.copy(source.emissive); - this.emissiveMap = source.emissiveMap; - this.emissiveIntensity = source.emissiveIntensity; - this.bumpMap = source.bumpMap; - this.bumpScale = source.bumpScale; - this.normalMap = source.normalMap; - this.normalMapType = source.normalMapType; - this.normalScale.copy(source.normalScale); - this.displacementMap = source.displacementMap; - this.displacementScale = source.displacementScale; - this.displacementBias = source.displacementBias; - this.alphaMap = source.alphaMap; - this.wireframe = source.wireframe; - this.wireframeLinewidth = source.wireframeLinewidth; - this.wireframeLinecap = source.wireframeLinecap; - this.wireframeLinejoin = source.wireframeLinejoin; - this.fog = source.fog; + update(inputSource, frame, referenceSpace) { + let inputPose = null; + let gripPose = null; + let handPose = null; + const targetRay = this._targetRay; + const grip = this._grip; + const hand = this._hand; + if (inputSource && frame.session.visibilityState !== "visible-blurred") { + if (hand && inputSource.hand) { + handPose = true; + for (const inputjoint of inputSource.hand.values()) { + const jointPose = frame.getJointPose(inputjoint, referenceSpace); + const joint = this._getHandJoint(hand, inputjoint); + if (jointPose !== null) { + joint.matrix.fromArray(jointPose.transform.matrix); + joint.matrix.decompose(joint.position, joint.rotation, joint.scale); + joint.matrixWorldNeedsUpdate = true; + joint.jointRadius = jointPose.radius; + } + joint.visible = jointPose !== null; + } + const indexTip = hand.joints["index-finger-tip"]; + const thumbTip = hand.joints["thumb-tip"]; + const distance = indexTip.position.distanceTo(thumbTip.position); + const distanceToPinch = 0.02; + const threshold = 5e-3; + if (hand.inputState.pinching && distance > distanceToPinch + threshold) { + hand.inputState.pinching = false; + this.dispatchEvent({ + type: "pinchend", + handedness: inputSource.handedness, + target: this + }); + } else if (!hand.inputState.pinching && distance <= distanceToPinch - threshold) { + hand.inputState.pinching = true; + this.dispatchEvent({ + type: "pinchstart", + handedness: inputSource.handedness, + target: this + }); + } + } else { + if (grip !== null && inputSource.gripSpace) { + gripPose = frame.getPose(inputSource.gripSpace, referenceSpace); + if (gripPose !== null) { + grip.matrix.fromArray(gripPose.transform.matrix); + grip.matrix.decompose(grip.position, grip.rotation, grip.scale); + grip.matrixWorldNeedsUpdate = true; + if (gripPose.linearVelocity) { + grip.hasLinearVelocity = true; + grip.linearVelocity.copy(gripPose.linearVelocity); + } else { + grip.hasLinearVelocity = false; + } + if (gripPose.angularVelocity) { + grip.hasAngularVelocity = true; + grip.angularVelocity.copy(gripPose.angularVelocity); + } else { + grip.hasAngularVelocity = false; + } + } + } + } + if (targetRay !== null) { + inputPose = frame.getPose(inputSource.targetRaySpace, referenceSpace); + if (inputPose === null && gripPose !== null) { + inputPose = gripPose; + } + if (inputPose !== null) { + targetRay.matrix.fromArray(inputPose.transform.matrix); + targetRay.matrix.decompose(targetRay.position, targetRay.rotation, targetRay.scale); + targetRay.matrixWorldNeedsUpdate = true; + if (inputPose.linearVelocity) { + targetRay.hasLinearVelocity = true; + targetRay.linearVelocity.copy(inputPose.linearVelocity); + } else { + targetRay.hasLinearVelocity = false; + } + if (inputPose.angularVelocity) { + targetRay.hasAngularVelocity = true; + targetRay.angularVelocity.copy(inputPose.angularVelocity); + } else { + targetRay.hasAngularVelocity = false; + } + this.dispatchEvent(_moveEvent); + } + } + } + if (targetRay !== null) { + targetRay.visible = inputPose !== null; + } + if (grip !== null) { + grip.visible = gripPose !== null; + } + if (hand !== null) { + hand.visible = handPose !== null; + } return this; } -} -class MeshNormalMaterial extends Material { - static { - __name(this, "MeshNormalMaterial"); - } - static get type() { - return "MeshNormalMaterial"; - } - constructor(parameters) { - super(); - this.isMeshNormalMaterial = true; - this.bumpMap = null; - this.bumpScale = 1; - this.normalMap = null; - this.normalMapType = TangentSpaceNormalMap; - this.normalScale = new Vector2(1, 1); - this.displacementMap = null; - this.displacementScale = 1; - this.displacementBias = 0; - this.wireframe = false; - this.wireframeLinewidth = 1; - this.flatShading = false; - this.setValues(parameters); - } - copy(source) { - super.copy(source); - this.bumpMap = source.bumpMap; - this.bumpScale = source.bumpScale; - this.normalMap = source.normalMap; - this.normalMapType = source.normalMapType; - this.normalScale.copy(source.normalScale); - this.displacementMap = source.displacementMap; - this.displacementScale = source.displacementScale; - this.displacementBias = source.displacementBias; - this.wireframe = source.wireframe; - this.wireframeLinewidth = source.wireframeLinewidth; - this.flatShading = source.flatShading; - return this; + // private method + _getHandJoint(hand, inputjoint) { + if (hand.joints[inputjoint.jointName] === void 0) { + const joint = new Group(); + joint.matrixAutoUpdate = false; + joint.visible = false; + hand.joints[inputjoint.jointName] = joint; + hand.add(joint); + } + return hand.joints[inputjoint.jointName]; } } -class MeshLambertMaterial extends Material { +const _occlusion_vertex = ` +void main() { + + gl_Position = vec4( position, 1.0 ); + +}`; +const _occlusion_fragment = ` +uniform sampler2DArray depthColor; +uniform float depthWidth; +uniform float depthHeight; + +void main() { + + vec2 coord = vec2( gl_FragCoord.x / depthWidth, gl_FragCoord.y / depthHeight ); + + if ( coord.x >= 1.0 ) { + + gl_FragDepth = texture( depthColor, vec3( coord.x - 1.0, coord.y, 1 ) ).r; + + } else { + + gl_FragDepth = texture( depthColor, vec3( coord.x, coord.y, 0 ) ).r; + + } + +}`; +class WebXRDepthSensing { static { - __name(this, "MeshLambertMaterial"); - } - static get type() { - return "MeshLambertMaterial"; - } - constructor(parameters) { - super(); - this.isMeshLambertMaterial = true; - this.color = new Color(16777215); - this.map = null; - this.lightMap = null; - this.lightMapIntensity = 1; - this.aoMap = null; - this.aoMapIntensity = 1; - this.emissive = new Color(0); - this.emissiveIntensity = 1; - this.emissiveMap = null; - this.bumpMap = null; - this.bumpScale = 1; - this.normalMap = null; - this.normalMapType = TangentSpaceNormalMap; - this.normalScale = new Vector2(1, 1); - this.displacementMap = null; - this.displacementScale = 1; - this.displacementBias = 0; - this.specularMap = null; - this.alphaMap = null; - this.envMap = null; - this.envMapRotation = new Euler(); - this.combine = MultiplyOperation; - this.reflectivity = 1; - this.refractionRatio = 0.98; - this.wireframe = false; - this.wireframeLinewidth = 1; - this.wireframeLinecap = "round"; - this.wireframeLinejoin = "round"; - this.flatShading = false; - this.fog = true; - this.setValues(parameters); + __name(this, "WebXRDepthSensing"); } - copy(source) { - super.copy(source); - this.color.copy(source.color); - this.map = source.map; - this.lightMap = source.lightMap; - this.lightMapIntensity = source.lightMapIntensity; - this.aoMap = source.aoMap; - this.aoMapIntensity = source.aoMapIntensity; - this.emissive.copy(source.emissive); - this.emissiveMap = source.emissiveMap; - this.emissiveIntensity = source.emissiveIntensity; - this.bumpMap = source.bumpMap; - this.bumpScale = source.bumpScale; - this.normalMap = source.normalMap; - this.normalMapType = source.normalMapType; - this.normalScale.copy(source.normalScale); - this.displacementMap = source.displacementMap; - this.displacementScale = source.displacementScale; - this.displacementBias = source.displacementBias; - this.specularMap = source.specularMap; - this.alphaMap = source.alphaMap; - this.envMap = source.envMap; - this.envMapRotation.copy(source.envMapRotation); - this.combine = source.combine; - this.reflectivity = source.reflectivity; - this.refractionRatio = source.refractionRatio; - this.wireframe = source.wireframe; - this.wireframeLinewidth = source.wireframeLinewidth; - this.wireframeLinecap = source.wireframeLinecap; - this.wireframeLinejoin = source.wireframeLinejoin; - this.flatShading = source.flatShading; - this.fog = source.fog; - return this; + constructor() { + this.texture = null; + this.mesh = null; + this.depthNear = 0; + this.depthFar = 0; } -} -class MeshMatcapMaterial extends Material { - static { - __name(this, "MeshMatcapMaterial"); + init(renderer, depthData, renderState) { + if (this.texture === null) { + const texture = new Texture(); + const texProps = renderer.properties.get(texture); + texProps.__webglTexture = depthData.texture; + if (depthData.depthNear != renderState.depthNear || depthData.depthFar != renderState.depthFar) { + this.depthNear = depthData.depthNear; + this.depthFar = depthData.depthFar; + } + this.texture = texture; + } } - static get type() { - return "MeshMatcapMaterial"; + getMesh(cameraXR) { + if (this.texture !== null) { + if (this.mesh === null) { + const viewport = cameraXR.cameras[0].viewport; + const material = new ShaderMaterial({ + vertexShader: _occlusion_vertex, + fragmentShader: _occlusion_fragment, + uniforms: { + depthColor: { value: this.texture }, + depthWidth: { value: viewport.z }, + depthHeight: { value: viewport.w } + } + }); + this.mesh = new Mesh(new PlaneGeometry(20, 20), material); + } + } + return this.mesh; } - constructor(parameters) { - super(); - this.isMeshMatcapMaterial = true; - this.defines = { "MATCAP": "" }; - this.color = new Color(16777215); - this.matcap = null; - this.map = null; - this.bumpMap = null; - this.bumpScale = 1; - this.normalMap = null; - this.normalMapType = TangentSpaceNormalMap; - this.normalScale = new Vector2(1, 1); - this.displacementMap = null; - this.displacementScale = 1; - this.displacementBias = 0; - this.alphaMap = null; - this.flatShading = false; - this.fog = true; - this.setValues(parameters); + reset() { + this.texture = null; + this.mesh = null; } - copy(source) { - super.copy(source); - this.defines = { "MATCAP": "" }; - this.color.copy(source.color); - this.matcap = source.matcap; - this.map = source.map; - this.bumpMap = source.bumpMap; - this.bumpScale = source.bumpScale; - this.normalMap = source.normalMap; - this.normalMapType = source.normalMapType; - this.normalScale.copy(source.normalScale); - this.displacementMap = source.displacementMap; - this.displacementScale = source.displacementScale; - this.displacementBias = source.displacementBias; - this.alphaMap = source.alphaMap; - this.flatShading = source.flatShading; - this.fog = source.fog; - return this; + getDepthTexture() { + return this.texture; } } -class LineDashedMaterial extends LineBasicMaterial { +class WebXRManager extends EventDispatcher { static { - __name(this, "LineDashedMaterial"); - } - static get type() { - return "LineDashedMaterial"; + __name(this, "WebXRManager"); } - constructor(parameters) { + constructor(renderer, gl) { super(); - this.isLineDashedMaterial = true; - this.scale = 1; - this.dashSize = 3; - this.gapSize = 1; - this.setValues(parameters); - } - copy(source) { - super.copy(source); - this.scale = source.scale; - this.dashSize = source.dashSize; - this.gapSize = source.gapSize; - return this; - } -} -function convertArray(array, type, forceClone) { - if (!array || // let 'undefined' and 'null' pass - !forceClone && array.constructor === type) return array; - if (typeof type.BYTES_PER_ELEMENT === "number") { - return new type(array); - } - return Array.prototype.slice.call(array); -} -__name(convertArray, "convertArray"); -function isTypedArray(object) { - return ArrayBuffer.isView(object) && !(object instanceof DataView); -} -__name(isTypedArray, "isTypedArray"); -function getKeyframeOrder(times) { - function compareTime(i, j) { - return times[i] - times[j]; - } - __name(compareTime, "compareTime"); - const n = times.length; - const result = new Array(n); - for (let i = 0; i !== n; ++i) result[i] = i; - result.sort(compareTime); - return result; -} -__name(getKeyframeOrder, "getKeyframeOrder"); -function sortedArray(values, stride, order) { - const nValues = values.length; - const result = new values.constructor(nValues); - for (let i = 0, dstOffset = 0; dstOffset !== nValues; ++i) { - const srcOffset = order[i] * stride; - for (let j = 0; j !== stride; ++j) { - result[dstOffset++] = values[srcOffset + j]; + const scope = this; + let session = null; + let framebufferScaleFactor = 1; + let referenceSpace = null; + let referenceSpaceType = "local-floor"; + let foveation = 1; + let customReferenceSpace = null; + let pose = null; + let glBinding = null; + let glProjLayer = null; + let glBaseLayer = null; + let xrFrame = null; + const depthSensing = new WebXRDepthSensing(); + const attributes = gl.getContextAttributes(); + let initialRenderTarget = null; + let newRenderTarget = null; + const controllers = []; + const controllerInputSources = []; + const currentSize = new Vector2(); + let currentPixelRatio = null; + const cameraL = new PerspectiveCamera(); + cameraL.viewport = new Vector4(); + const cameraR = new PerspectiveCamera(); + cameraR.viewport = new Vector4(); + const cameras = [cameraL, cameraR]; + const cameraXR = new ArrayCamera(); + let _currentDepthNear = null; + let _currentDepthFar = null; + this.cameraAutoUpdate = true; + this.enabled = false; + this.isPresenting = false; + this.getController = function(index) { + let controller = controllers[index]; + if (controller === void 0) { + controller = new WebXRController(); + controllers[index] = controller; + } + return controller.getTargetRaySpace(); + }; + this.getControllerGrip = function(index) { + let controller = controllers[index]; + if (controller === void 0) { + controller = new WebXRController(); + controllers[index] = controller; + } + return controller.getGripSpace(); + }; + this.getHand = function(index) { + let controller = controllers[index]; + if (controller === void 0) { + controller = new WebXRController(); + controllers[index] = controller; + } + return controller.getHandSpace(); + }; + function onSessionEvent(event) { + const controllerIndex = controllerInputSources.indexOf(event.inputSource); + if (controllerIndex === -1) { + return; + } + const controller = controllers[controllerIndex]; + if (controller !== void 0) { + controller.update(event.inputSource, event.frame, customReferenceSpace || referenceSpace); + controller.dispatchEvent({ type: event.type, data: event.inputSource }); + } } - } - return result; -} -__name(sortedArray, "sortedArray"); -function flattenJSON(jsonKeys, times, values, valuePropertyName) { - let i = 1, key = jsonKeys[0]; - while (key !== void 0 && key[valuePropertyName] === void 0) { - key = jsonKeys[i++]; - } - if (key === void 0) return; - let value = key[valuePropertyName]; - if (value === void 0) return; - if (Array.isArray(value)) { - do { - value = key[valuePropertyName]; - if (value !== void 0) { - times.push(key.time); - values.push.apply(values, value); + __name(onSessionEvent, "onSessionEvent"); + function onSessionEnd() { + session.removeEventListener("select", onSessionEvent); + session.removeEventListener("selectstart", onSessionEvent); + session.removeEventListener("selectend", onSessionEvent); + session.removeEventListener("squeeze", onSessionEvent); + session.removeEventListener("squeezestart", onSessionEvent); + session.removeEventListener("squeezeend", onSessionEvent); + session.removeEventListener("end", onSessionEnd); + session.removeEventListener("inputsourceschange", onInputSourcesChange); + for (let i = 0; i < controllers.length; i++) { + const inputSource = controllerInputSources[i]; + if (inputSource === null) continue; + controllerInputSources[i] = null; + controllers[i].disconnect(inputSource); + } + _currentDepthNear = null; + _currentDepthFar = null; + depthSensing.reset(); + renderer.setRenderTarget(initialRenderTarget); + glBaseLayer = null; + glProjLayer = null; + glBinding = null; + session = null; + newRenderTarget = null; + animation.stop(); + scope.isPresenting = false; + renderer.setPixelRatio(currentPixelRatio); + renderer.setSize(currentSize.width, currentSize.height, false); + scope.dispatchEvent({ type: "sessionend" }); + } + __name(onSessionEnd, "onSessionEnd"); + this.setFramebufferScaleFactor = function(value) { + framebufferScaleFactor = value; + if (scope.isPresenting === true) { + console.warn("THREE.WebXRManager: Cannot change framebuffer scale while presenting."); + } + }; + this.setReferenceSpaceType = function(value) { + referenceSpaceType = value; + if (scope.isPresenting === true) { + console.warn("THREE.WebXRManager: Cannot change reference space type while presenting."); + } + }; + this.getReferenceSpace = function() { + return customReferenceSpace || referenceSpace; + }; + this.setReferenceSpace = function(space) { + customReferenceSpace = space; + }; + this.getBaseLayer = function() { + return glProjLayer !== null ? glProjLayer : glBaseLayer; + }; + this.getBinding = function() { + return glBinding; + }; + this.getFrame = function() { + return xrFrame; + }; + this.getSession = function() { + return session; + }; + this.setSession = async function(value) { + session = value; + if (session !== null) { + initialRenderTarget = renderer.getRenderTarget(); + session.addEventListener("select", onSessionEvent); + session.addEventListener("selectstart", onSessionEvent); + session.addEventListener("selectend", onSessionEvent); + session.addEventListener("squeeze", onSessionEvent); + session.addEventListener("squeezestart", onSessionEvent); + session.addEventListener("squeezeend", onSessionEvent); + session.addEventListener("end", onSessionEnd); + session.addEventListener("inputsourceschange", onInputSourcesChange); + if (attributes.xrCompatible !== true) { + await gl.makeXRCompatible(); + } + currentPixelRatio = renderer.getPixelRatio(); + renderer.getSize(currentSize); + if (session.renderState.layers === void 0) { + const layerInit = { + antialias: attributes.antialias, + alpha: true, + depth: attributes.depth, + stencil: attributes.stencil, + framebufferScaleFactor + }; + glBaseLayer = new XRWebGLLayer(session, gl, layerInit); + session.updateRenderState({ baseLayer: glBaseLayer }); + renderer.setPixelRatio(1); + renderer.setSize(glBaseLayer.framebufferWidth, glBaseLayer.framebufferHeight, false); + newRenderTarget = new WebGLRenderTarget( + glBaseLayer.framebufferWidth, + glBaseLayer.framebufferHeight, + { + format: RGBAFormat, + type: UnsignedByteType, + colorSpace: renderer.outputColorSpace, + stencilBuffer: attributes.stencil + } + ); + } else { + let depthFormat = null; + let depthType = null; + let glDepthFormat = null; + if (attributes.depth) { + glDepthFormat = attributes.stencil ? gl.DEPTH24_STENCIL8 : gl.DEPTH_COMPONENT24; + depthFormat = attributes.stencil ? DepthStencilFormat : DepthFormat; + depthType = attributes.stencil ? UnsignedInt248Type : UnsignedIntType; + } + const projectionlayerInit = { + colorFormat: gl.RGBA8, + depthFormat: glDepthFormat, + scaleFactor: framebufferScaleFactor + }; + glBinding = new XRWebGLBinding(session, gl); + glProjLayer = glBinding.createProjectionLayer(projectionlayerInit); + session.updateRenderState({ layers: [glProjLayer] }); + renderer.setPixelRatio(1); + renderer.setSize(glProjLayer.textureWidth, glProjLayer.textureHeight, false); + newRenderTarget = new WebGLRenderTarget( + glProjLayer.textureWidth, + glProjLayer.textureHeight, + { + format: RGBAFormat, + type: UnsignedByteType, + depthTexture: new DepthTexture(glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, void 0, void 0, void 0, void 0, void 0, void 0, depthFormat), + stencilBuffer: attributes.stencil, + colorSpace: renderer.outputColorSpace, + samples: attributes.antialias ? 4 : 0, + resolveDepthBuffer: glProjLayer.ignoreDepthValues === false + } + ); + } + newRenderTarget.isXRRenderTarget = true; + this.setFoveation(foveation); + customReferenceSpace = null; + referenceSpace = await session.requestReferenceSpace(referenceSpaceType); + animation.setContext(session); + animation.start(); + scope.isPresenting = true; + scope.dispatchEvent({ type: "sessionstart" }); } - key = jsonKeys[i++]; - } while (key !== void 0); - } else if (value.toArray !== void 0) { - do { - value = key[valuePropertyName]; - if (value !== void 0) { - times.push(key.time); - value.toArray(values, values.length); + }; + this.getEnvironmentBlendMode = function() { + if (session !== null) { + return session.environmentBlendMode; } - key = jsonKeys[i++]; - } while (key !== void 0); - } else { - do { - value = key[valuePropertyName]; - if (value !== void 0) { - times.push(key.time); - values.push(value); + }; + this.getDepthTexture = function() { + return depthSensing.getDepthTexture(); + }; + function onInputSourcesChange(event) { + for (let i = 0; i < event.removed.length; i++) { + const inputSource = event.removed[i]; + const index = controllerInputSources.indexOf(inputSource); + if (index >= 0) { + controllerInputSources[index] = null; + controllers[index].disconnect(inputSource); + } } - key = jsonKeys[i++]; - } while (key !== void 0); - } -} -__name(flattenJSON, "flattenJSON"); -function subclip(sourceClip, name, startFrame, endFrame, fps = 30) { - const clip = sourceClip.clone(); - clip.name = name; - const tracks = []; - for (let i = 0; i < clip.tracks.length; ++i) { - const track = clip.tracks[i]; - const valueSize = track.getValueSize(); - const times = []; - const values = []; - for (let j = 0; j < track.times.length; ++j) { - const frame = track.times[j] * fps; - if (frame < startFrame || frame >= endFrame) continue; - times.push(track.times[j]); - for (let k = 0; k < valueSize; ++k) { - values.push(track.values[j * valueSize + k]); + for (let i = 0; i < event.added.length; i++) { + const inputSource = event.added[i]; + let controllerIndex = controllerInputSources.indexOf(inputSource); + if (controllerIndex === -1) { + for (let i2 = 0; i2 < controllers.length; i2++) { + if (i2 >= controllerInputSources.length) { + controllerInputSources.push(inputSource); + controllerIndex = i2; + break; + } else if (controllerInputSources[i2] === null) { + controllerInputSources[i2] = inputSource; + controllerIndex = i2; + break; + } + } + if (controllerIndex === -1) break; + } + const controller = controllers[controllerIndex]; + if (controller) { + controller.connect(inputSource); + } } } - if (times.length === 0) continue; - track.times = convertArray(times, track.times.constructor); - track.values = convertArray(values, track.values.constructor); - tracks.push(track); - } - clip.tracks = tracks; - let minStartTime = Infinity; - for (let i = 0; i < clip.tracks.length; ++i) { - if (minStartTime > clip.tracks[i].times[0]) { - minStartTime = clip.tracks[i].times[0]; - } - } - for (let i = 0; i < clip.tracks.length; ++i) { - clip.tracks[i].shift(-1 * minStartTime); - } - clip.resetDuration(); - return clip; -} -__name(subclip, "subclip"); -function makeClipAdditive(targetClip, referenceFrame = 0, referenceClip = targetClip, fps = 30) { - if (fps <= 0) fps = 30; - const numTracks = referenceClip.tracks.length; - const referenceTime = referenceFrame / fps; - for (let i = 0; i < numTracks; ++i) { - const referenceTrack = referenceClip.tracks[i]; - const referenceTrackType = referenceTrack.ValueTypeName; - if (referenceTrackType === "bool" || referenceTrackType === "string") continue; - const targetTrack = targetClip.tracks.find(function(track) { - return track.name === referenceTrack.name && track.ValueTypeName === referenceTrackType; - }); - if (targetTrack === void 0) continue; - let referenceOffset = 0; - const referenceValueSize = referenceTrack.getValueSize(); - if (referenceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline) { - referenceOffset = referenceValueSize / 3; - } - let targetOffset = 0; - const targetValueSize = targetTrack.getValueSize(); - if (targetTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline) { - targetOffset = targetValueSize / 3; - } - const lastIndex = referenceTrack.times.length - 1; - let referenceValue; - if (referenceTime <= referenceTrack.times[0]) { - const startIndex = referenceOffset; - const endIndex = referenceValueSize - referenceOffset; - referenceValue = referenceTrack.values.slice(startIndex, endIndex); - } else if (referenceTime >= referenceTrack.times[lastIndex]) { - const startIndex = lastIndex * referenceValueSize + referenceOffset; - const endIndex = startIndex + referenceValueSize - referenceOffset; - referenceValue = referenceTrack.values.slice(startIndex, endIndex); - } else { - const interpolant = referenceTrack.createInterpolant(); - const startIndex = referenceOffset; - const endIndex = referenceValueSize - referenceOffset; - interpolant.evaluate(referenceTime); - referenceValue = interpolant.resultBuffer.slice(startIndex, endIndex); + __name(onInputSourcesChange, "onInputSourcesChange"); + const cameraLPos = new Vector3(); + const cameraRPos = new Vector3(); + function setProjectionFromUnion(camera, cameraL2, cameraR2) { + cameraLPos.setFromMatrixPosition(cameraL2.matrixWorld); + cameraRPos.setFromMatrixPosition(cameraR2.matrixWorld); + const ipd = cameraLPos.distanceTo(cameraRPos); + const projL = cameraL2.projectionMatrix.elements; + const projR = cameraR2.projectionMatrix.elements; + const near = projL[14] / (projL[10] - 1); + const far = projL[14] / (projL[10] + 1); + const topFov = (projL[9] + 1) / projL[5]; + const bottomFov = (projL[9] - 1) / projL[5]; + const leftFov = (projL[8] - 1) / projL[0]; + const rightFov = (projR[8] + 1) / projR[0]; + const left = near * leftFov; + const right = near * rightFov; + const zOffset = ipd / (-leftFov + rightFov); + const xOffset = zOffset * -leftFov; + cameraL2.matrixWorld.decompose(camera.position, camera.quaternion, camera.scale); + camera.translateX(xOffset); + camera.translateZ(zOffset); + camera.matrixWorld.compose(camera.position, camera.quaternion, camera.scale); + camera.matrixWorldInverse.copy(camera.matrixWorld).invert(); + if (projL[10] === -1) { + camera.projectionMatrix.copy(cameraL2.projectionMatrix); + camera.projectionMatrixInverse.copy(cameraL2.projectionMatrixInverse); + } else { + const near2 = near + zOffset; + const far2 = far + zOffset; + const left2 = left - xOffset; + const right2 = right + (ipd - xOffset); + const top2 = topFov * far / far2 * near2; + const bottom2 = bottomFov * far / far2 * near2; + camera.projectionMatrix.makePerspective(left2, right2, top2, bottom2, near2, far2); + camera.projectionMatrixInverse.copy(camera.projectionMatrix).invert(); + } } - if (referenceTrackType === "quaternion") { - const referenceQuat = new Quaternion().fromArray(referenceValue).normalize().conjugate(); - referenceQuat.toArray(referenceValue); + __name(setProjectionFromUnion, "setProjectionFromUnion"); + function updateCamera(camera, parent) { + if (parent === null) { + camera.matrixWorld.copy(camera.matrix); + } else { + camera.matrixWorld.multiplyMatrices(parent.matrixWorld, camera.matrix); + } + camera.matrixWorldInverse.copy(camera.matrixWorld).invert(); } - const numTimes = targetTrack.times.length; - for (let j = 0; j < numTimes; ++j) { - const valueStart = j * targetValueSize + targetOffset; - if (referenceTrackType === "quaternion") { - Quaternion.multiplyQuaternionsFlat( - targetTrack.values, - valueStart, - referenceValue, - 0, - targetTrack.values, - valueStart - ); + __name(updateCamera, "updateCamera"); + this.updateCamera = function(camera) { + if (session === null) return; + let depthNear = camera.near; + let depthFar = camera.far; + if (depthSensing.texture !== null) { + if (depthSensing.depthNear > 0) depthNear = depthSensing.depthNear; + if (depthSensing.depthFar > 0) depthFar = depthSensing.depthFar; + } + cameraXR.near = cameraR.near = cameraL.near = depthNear; + cameraXR.far = cameraR.far = cameraL.far = depthFar; + if (_currentDepthNear !== cameraXR.near || _currentDepthFar !== cameraXR.far) { + session.updateRenderState({ + depthNear: cameraXR.near, + depthFar: cameraXR.far + }); + _currentDepthNear = cameraXR.near; + _currentDepthFar = cameraXR.far; + } + cameraL.layers.mask = camera.layers.mask | 2; + cameraR.layers.mask = camera.layers.mask | 4; + cameraXR.layers.mask = cameraL.layers.mask | cameraR.layers.mask; + const parent = camera.parent; + const cameras2 = cameraXR.cameras; + updateCamera(cameraXR, parent); + for (let i = 0; i < cameras2.length; i++) { + updateCamera(cameras2[i], parent); + } + if (cameras2.length === 2) { + setProjectionFromUnion(cameraXR, cameraL, cameraR); } else { - const valueEnd = targetValueSize - targetOffset * 2; - for (let k = 0; k < valueEnd; ++k) { - targetTrack.values[valueStart + k] -= referenceValue[k]; - } + cameraXR.projectionMatrix.copy(cameraL.projectionMatrix); + } + updateUserCamera(camera, cameraXR, parent); + }; + function updateUserCamera(camera, cameraXR2, parent) { + if (parent === null) { + camera.matrix.copy(cameraXR2.matrixWorld); + } else { + camera.matrix.copy(parent.matrixWorld); + camera.matrix.invert(); + camera.matrix.multiply(cameraXR2.matrixWorld); + } + camera.matrix.decompose(camera.position, camera.quaternion, camera.scale); + camera.updateMatrixWorld(true); + camera.projectionMatrix.copy(cameraXR2.projectionMatrix); + camera.projectionMatrixInverse.copy(cameraXR2.projectionMatrixInverse); + if (camera.isPerspectiveCamera) { + camera.fov = RAD2DEG * 2 * Math.atan(1 / camera.projectionMatrix.elements[5]); + camera.zoom = 1; } } - } - targetClip.blendMode = AdditiveAnimationBlendMode; - return targetClip; -} -__name(makeClipAdditive, "makeClipAdditive"); -const AnimationUtils = { - convertArray, - isTypedArray, - getKeyframeOrder, - sortedArray, - flattenJSON, - subclip, - makeClipAdditive -}; -class Interpolant { - static { - __name(this, "Interpolant"); - } - constructor(parameterPositions, sampleValues, sampleSize, resultBuffer) { - this.parameterPositions = parameterPositions; - this._cachedIndex = 0; - this.resultBuffer = resultBuffer !== void 0 ? resultBuffer : new sampleValues.constructor(sampleSize); - this.sampleValues = sampleValues; - this.valueSize = sampleSize; - this.settings = null; - this.DefaultSettings_ = {}; - } - evaluate(t2) { - const pp = this.parameterPositions; - let i1 = this._cachedIndex, t1 = pp[i1], t0 = pp[i1 - 1]; - validate_interval: { - seek: { - let right; - linear_scan: { - forward_scan: if (!(t2 < t1)) { - for (let giveUpAt = i1 + 2; ; ) { - if (t1 === void 0) { - if (t2 < t0) break forward_scan; - i1 = pp.length; - this._cachedIndex = i1; - return this.copySampleValue_(i1 - 1); - } - if (i1 === giveUpAt) break; - t0 = t1; - t1 = pp[++i1]; - if (t2 < t1) { - break seek; - } + __name(updateUserCamera, "updateUserCamera"); + this.getCamera = function() { + return cameraXR; + }; + this.getFoveation = function() { + if (glProjLayer === null && glBaseLayer === null) { + return void 0; + } + return foveation; + }; + this.setFoveation = function(value) { + foveation = value; + if (glProjLayer !== null) { + glProjLayer.fixedFoveation = value; + } + if (glBaseLayer !== null && glBaseLayer.fixedFoveation !== void 0) { + glBaseLayer.fixedFoveation = value; + } + }; + this.hasDepthSensing = function() { + return depthSensing.texture !== null; + }; + this.getDepthSensingMesh = function() { + return depthSensing.getMesh(cameraXR); + }; + let onAnimationFrameCallback = null; + function onAnimationFrame(time, frame) { + pose = frame.getViewerPose(customReferenceSpace || referenceSpace); + xrFrame = frame; + if (pose !== null) { + const views = pose.views; + if (glBaseLayer !== null) { + renderer.setRenderTargetFramebuffer(newRenderTarget, glBaseLayer.framebuffer); + renderer.setRenderTarget(newRenderTarget); + } + let cameraXRNeedsUpdate = false; + if (views.length !== cameraXR.cameras.length) { + cameraXR.cameras.length = 0; + cameraXRNeedsUpdate = true; + } + for (let i = 0; i < views.length; i++) { + const view = views[i]; + let viewport = null; + if (glBaseLayer !== null) { + viewport = glBaseLayer.getViewport(view); + } else { + const glSubImage = glBinding.getViewSubImage(glProjLayer, view); + viewport = glSubImage.viewport; + if (i === 0) { + renderer.setRenderTargetTextures( + newRenderTarget, + glSubImage.colorTexture, + glProjLayer.ignoreDepthValues ? void 0 : glSubImage.depthStencilTexture + ); + renderer.setRenderTarget(newRenderTarget); } - right = pp.length; - break linear_scan; } - if (!(t2 >= t0)) { - const t1global = pp[1]; - if (t2 < t1global) { - i1 = 2; - t0 = t1global; - } - for (let giveUpAt = i1 - 2; ; ) { - if (t0 === void 0) { - this._cachedIndex = 0; - return this.copySampleValue_(0); - } - if (i1 === giveUpAt) break; - t1 = t0; - t0 = pp[--i1 - 1]; - if (t2 >= t0) { - break seek; - } - } - right = i1; - i1 = 0; - break linear_scan; + let camera = cameras[i]; + if (camera === void 0) { + camera = new PerspectiveCamera(); + camera.layers.enable(i); + camera.viewport = new Vector4(); + cameras[i] = camera; } - break validate_interval; - } - while (i1 < right) { - const mid = i1 + right >>> 1; - if (t2 < pp[mid]) { - right = mid; - } else { - i1 = mid + 1; + camera.matrix.fromArray(view.transform.matrix); + camera.matrix.decompose(camera.position, camera.quaternion, camera.scale); + camera.projectionMatrix.fromArray(view.projectionMatrix); + camera.projectionMatrixInverse.copy(camera.projectionMatrix).invert(); + camera.viewport.set(viewport.x, viewport.y, viewport.width, viewport.height); + if (i === 0) { + cameraXR.matrix.copy(camera.matrix); + cameraXR.matrix.decompose(cameraXR.position, cameraXR.quaternion, cameraXR.scale); + } + if (cameraXRNeedsUpdate === true) { + cameraXR.cameras.push(camera); } } - t1 = pp[i1]; - t0 = pp[i1 - 1]; - if (t0 === void 0) { - this._cachedIndex = 0; - return this.copySampleValue_(0); + const enabledFeatures = session.enabledFeatures; + if (enabledFeatures && enabledFeatures.includes("depth-sensing")) { + const depthData = glBinding.getDepthInformation(views[0]); + if (depthData && depthData.isValid && depthData.texture) { + depthSensing.init(renderer, depthData, session.renderState); + } } - if (t1 === void 0) { - i1 = pp.length; - this._cachedIndex = i1; - return this.copySampleValue_(i1 - 1); + } + for (let i = 0; i < controllers.length; i++) { + const inputSource = controllerInputSources[i]; + const controller = controllers[i]; + if (inputSource !== null && controller !== void 0) { + controller.update(inputSource, frame, customReferenceSpace || referenceSpace); } } - this._cachedIndex = i1; - this.intervalChanged_(i1, t0, t1); + if (onAnimationFrameCallback) onAnimationFrameCallback(time, frame); + if (frame.detectedPlanes) { + scope.dispatchEvent({ type: "planesdetected", data: frame }); + } + xrFrame = null; + } + __name(onAnimationFrame, "onAnimationFrame"); + const animation = new WebGLAnimation(); + animation.setAnimationLoop(onAnimationFrame); + this.setAnimationLoop = function(callback) { + onAnimationFrameCallback = callback; + }; + this.dispose = function() { + }; + } +} +const _e1 = /* @__PURE__ */ new Euler(); +const _m1 = /* @__PURE__ */ new Matrix4(); +function WebGLMaterials(renderer, properties) { + function refreshTransformUniform(map, uniform) { + if (map.matrixAutoUpdate === true) { + map.updateMatrix(); + } + uniform.value.copy(map.matrix); + } + __name(refreshTransformUniform, "refreshTransformUniform"); + function refreshFogUniforms(uniforms, fog) { + fog.color.getRGB(uniforms.fogColor.value, getUnlitUniformColorSpace(renderer)); + if (fog.isFog) { + uniforms.fogNear.value = fog.near; + uniforms.fogFar.value = fog.far; + } else if (fog.isFogExp2) { + uniforms.fogDensity.value = fog.density; + } + } + __name(refreshFogUniforms, "refreshFogUniforms"); + function refreshMaterialUniforms(uniforms, material, pixelRatio, height, transmissionRenderTarget) { + if (material.isMeshBasicMaterial) { + refreshUniformsCommon(uniforms, material); + } else if (material.isMeshLambertMaterial) { + refreshUniformsCommon(uniforms, material); + } else if (material.isMeshToonMaterial) { + refreshUniformsCommon(uniforms, material); + refreshUniformsToon(uniforms, material); + } else if (material.isMeshPhongMaterial) { + refreshUniformsCommon(uniforms, material); + refreshUniformsPhong(uniforms, material); + } else if (material.isMeshStandardMaterial) { + refreshUniformsCommon(uniforms, material); + refreshUniformsStandard(uniforms, material); + if (material.isMeshPhysicalMaterial) { + refreshUniformsPhysical(uniforms, material, transmissionRenderTarget); + } + } else if (material.isMeshMatcapMaterial) { + refreshUniformsCommon(uniforms, material); + refreshUniformsMatcap(uniforms, material); + } else if (material.isMeshDepthMaterial) { + refreshUniformsCommon(uniforms, material); + } else if (material.isMeshDistanceMaterial) { + refreshUniformsCommon(uniforms, material); + refreshUniformsDistance(uniforms, material); + } else if (material.isMeshNormalMaterial) { + refreshUniformsCommon(uniforms, material); + } else if (material.isLineBasicMaterial) { + refreshUniformsLine(uniforms, material); + if (material.isLineDashedMaterial) { + refreshUniformsDash(uniforms, material); + } + } else if (material.isPointsMaterial) { + refreshUniformsPoints(uniforms, material, pixelRatio, height); + } else if (material.isSpriteMaterial) { + refreshUniformsSprites(uniforms, material); + } else if (material.isShadowMaterial) { + uniforms.color.value.copy(material.color); + uniforms.opacity.value = material.opacity; + } else if (material.isShaderMaterial) { + material.uniformsNeedUpdate = false; + } + } + __name(refreshMaterialUniforms, "refreshMaterialUniforms"); + function refreshUniformsCommon(uniforms, material) { + uniforms.opacity.value = material.opacity; + if (material.color) { + uniforms.diffuse.value.copy(material.color); + } + if (material.emissive) { + uniforms.emissive.value.copy(material.emissive).multiplyScalar(material.emissiveIntensity); + } + if (material.map) { + uniforms.map.value = material.map; + refreshTransformUniform(material.map, uniforms.mapTransform); } - return this.interpolate_(i1, t0, t2, t1); - } - getSettings_() { - return this.settings || this.DefaultSettings_; - } - copySampleValue_(index) { - const result = this.resultBuffer, values = this.sampleValues, stride = this.valueSize, offset = index * stride; - for (let i = 0; i !== stride; ++i) { - result[i] = values[offset + i]; + if (material.alphaMap) { + uniforms.alphaMap.value = material.alphaMap; + refreshTransformUniform(material.alphaMap, uniforms.alphaMapTransform); } - return result; - } - // Template methods for derived classes: - interpolate_() { - throw new Error("call to abstract method"); - } - intervalChanged_() { - } -} -class CubicInterpolant extends Interpolant { - static { - __name(this, "CubicInterpolant"); - } - constructor(parameterPositions, sampleValues, sampleSize, resultBuffer) { - super(parameterPositions, sampleValues, sampleSize, resultBuffer); - this._weightPrev = -0; - this._offsetPrev = -0; - this._weightNext = -0; - this._offsetNext = -0; - this.DefaultSettings_ = { - endingStart: ZeroCurvatureEnding, - endingEnd: ZeroCurvatureEnding - }; - } - intervalChanged_(i1, t0, t1) { - const pp = this.parameterPositions; - let iPrev = i1 - 2, iNext = i1 + 1, tPrev = pp[iPrev], tNext = pp[iNext]; - if (tPrev === void 0) { - switch (this.getSettings_().endingStart) { - case ZeroSlopeEnding: - iPrev = i1; - tPrev = 2 * t0 - t1; - break; - case WrapAroundEnding: - iPrev = pp.length - 2; - tPrev = t0 + pp[iPrev] - pp[iPrev + 1]; - break; - default: - iPrev = i1; - tPrev = t1; + if (material.bumpMap) { + uniforms.bumpMap.value = material.bumpMap; + refreshTransformUniform(material.bumpMap, uniforms.bumpMapTransform); + uniforms.bumpScale.value = material.bumpScale; + if (material.side === BackSide) { + uniforms.bumpScale.value *= -1; } } - if (tNext === void 0) { - switch (this.getSettings_().endingEnd) { - case ZeroSlopeEnding: - iNext = i1; - tNext = 2 * t1 - t0; - break; - case WrapAroundEnding: - iNext = 1; - tNext = t1 + pp[1] - pp[0]; - break; - default: - iNext = i1 - 1; - tNext = t0; + if (material.normalMap) { + uniforms.normalMap.value = material.normalMap; + refreshTransformUniform(material.normalMap, uniforms.normalMapTransform); + uniforms.normalScale.value.copy(material.normalScale); + if (material.side === BackSide) { + uniforms.normalScale.value.negate(); } } - const halfDt = (t1 - t0) * 0.5, stride = this.valueSize; - this._weightPrev = halfDt / (t0 - tPrev); - this._weightNext = halfDt / (tNext - t1); - this._offsetPrev = iPrev * stride; - this._offsetNext = iNext * stride; - } - interpolate_(i1, t0, t2, t1) { - const result = this.resultBuffer, values = this.sampleValues, stride = this.valueSize, o1 = i1 * stride, o0 = o1 - stride, oP = this._offsetPrev, oN = this._offsetNext, wP = this._weightPrev, wN = this._weightNext, p = (t2 - t0) / (t1 - t0), pp = p * p, ppp = pp * p; - const sP = -wP * ppp + 2 * wP * pp - wP * p; - const s0 = (1 + wP) * ppp + (-1.5 - 2 * wP) * pp + (-0.5 + wP) * p + 1; - const s1 = (-1 - wN) * ppp + (1.5 + wN) * pp + 0.5 * p; - const sN = wN * ppp - wN * pp; - for (let i = 0; i !== stride; ++i) { - result[i] = sP * values[oP + i] + s0 * values[o0 + i] + s1 * values[o1 + i] + sN * values[oN + i]; + if (material.displacementMap) { + uniforms.displacementMap.value = material.displacementMap; + refreshTransformUniform(material.displacementMap, uniforms.displacementMapTransform); + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; } - return result; - } -} -class LinearInterpolant extends Interpolant { - static { - __name(this, "LinearInterpolant"); - } - constructor(parameterPositions, sampleValues, sampleSize, resultBuffer) { - super(parameterPositions, sampleValues, sampleSize, resultBuffer); - } - interpolate_(i1, t0, t2, t1) { - const result = this.resultBuffer, values = this.sampleValues, stride = this.valueSize, offset1 = i1 * stride, offset0 = offset1 - stride, weight1 = (t2 - t0) / (t1 - t0), weight0 = 1 - weight1; - for (let i = 0; i !== stride; ++i) { - result[i] = values[offset0 + i] * weight0 + values[offset1 + i] * weight1; + if (material.emissiveMap) { + uniforms.emissiveMap.value = material.emissiveMap; + refreshTransformUniform(material.emissiveMap, uniforms.emissiveMapTransform); } - return result; - } -} -class DiscreteInterpolant extends Interpolant { - static { - __name(this, "DiscreteInterpolant"); - } - constructor(parameterPositions, sampleValues, sampleSize, resultBuffer) { - super(parameterPositions, sampleValues, sampleSize, resultBuffer); - } - interpolate_(i1) { - return this.copySampleValue_(i1 - 1); - } -} -class KeyframeTrack { - static { - __name(this, "KeyframeTrack"); - } - constructor(name, times, values, interpolation) { - if (name === void 0) throw new Error("THREE.KeyframeTrack: track name is undefined"); - if (times === void 0 || times.length === 0) throw new Error("THREE.KeyframeTrack: no keyframes in track named " + name); - this.name = name; - this.times = convertArray(times, this.TimeBufferType); - this.values = convertArray(values, this.ValueBufferType); - this.setInterpolation(interpolation || this.DefaultInterpolation); - } - // Serialization (in static context, because of constructor invocation - // and automatic invocation of .toJSON): - static toJSON(track) { - const trackType = track.constructor; - let json; - if (trackType.toJSON !== this.toJSON) { - json = trackType.toJSON(track); - } else { - json = { - "name": track.name, - "times": convertArray(track.times, Array), - "values": convertArray(track.values, Array) - }; - const interpolation = track.getInterpolation(); - if (interpolation !== track.DefaultInterpolation) { - json.interpolation = interpolation; - } + if (material.specularMap) { + uniforms.specularMap.value = material.specularMap; + refreshTransformUniform(material.specularMap, uniforms.specularMapTransform); } - json.type = track.ValueTypeName; - return json; - } - InterpolantFactoryMethodDiscrete(result) { - return new DiscreteInterpolant(this.times, this.values, this.getValueSize(), result); - } - InterpolantFactoryMethodLinear(result) { - return new LinearInterpolant(this.times, this.values, this.getValueSize(), result); - } - InterpolantFactoryMethodSmooth(result) { - return new CubicInterpolant(this.times, this.values, this.getValueSize(), result); - } - setInterpolation(interpolation) { - let factoryMethod; - switch (interpolation) { - case InterpolateDiscrete: - factoryMethod = this.InterpolantFactoryMethodDiscrete; - break; - case InterpolateLinear: - factoryMethod = this.InterpolantFactoryMethodLinear; - break; - case InterpolateSmooth: - factoryMethod = this.InterpolantFactoryMethodSmooth; - break; + if (material.alphaTest > 0) { + uniforms.alphaTest.value = material.alphaTest; } - if (factoryMethod === void 0) { - const message = "unsupported interpolation for " + this.ValueTypeName + " keyframe track named " + this.name; - if (this.createInterpolant === void 0) { - if (interpolation !== this.DefaultInterpolation) { - this.setInterpolation(this.DefaultInterpolation); - } else { - throw new Error(message); - } + const materialProperties = properties.get(material); + const envMap = materialProperties.envMap; + const envMapRotation = materialProperties.envMapRotation; + if (envMap) { + uniforms.envMap.value = envMap; + _e1.copy(envMapRotation); + _e1.x *= -1; + _e1.y *= -1; + _e1.z *= -1; + if (envMap.isCubeTexture && envMap.isRenderTargetTexture === false) { + _e1.y *= -1; + _e1.z *= -1; } - console.warn("THREE.KeyframeTrack:", message); - return this; + uniforms.envMapRotation.value.setFromMatrix4(_m1.makeRotationFromEuler(_e1)); + uniforms.flipEnvMap.value = envMap.isCubeTexture && envMap.isRenderTargetTexture === false ? -1 : 1; + uniforms.reflectivity.value = material.reflectivity; + uniforms.ior.value = material.ior; + uniforms.refractionRatio.value = material.refractionRatio; + } + if (material.lightMap) { + uniforms.lightMap.value = material.lightMap; + uniforms.lightMapIntensity.value = material.lightMapIntensity; + refreshTransformUniform(material.lightMap, uniforms.lightMapTransform); + } + if (material.aoMap) { + uniforms.aoMap.value = material.aoMap; + uniforms.aoMapIntensity.value = material.aoMapIntensity; + refreshTransformUniform(material.aoMap, uniforms.aoMapTransform); } - this.createInterpolant = factoryMethod; - return this; } - getInterpolation() { - switch (this.createInterpolant) { - case this.InterpolantFactoryMethodDiscrete: - return InterpolateDiscrete; - case this.InterpolantFactoryMethodLinear: - return InterpolateLinear; - case this.InterpolantFactoryMethodSmooth: - return InterpolateSmooth; + __name(refreshUniformsCommon, "refreshUniformsCommon"); + function refreshUniformsLine(uniforms, material) { + uniforms.diffuse.value.copy(material.color); + uniforms.opacity.value = material.opacity; + if (material.map) { + uniforms.map.value = material.map; + refreshTransformUniform(material.map, uniforms.mapTransform); } } - getValueSize() { - return this.values.length / this.times.length; + __name(refreshUniformsLine, "refreshUniformsLine"); + function refreshUniformsDash(uniforms, material) { + uniforms.dashSize.value = material.dashSize; + uniforms.totalSize.value = material.dashSize + material.gapSize; + uniforms.scale.value = material.scale; } - // move all keyframes either forwards or backwards in time - shift(timeOffset) { - if (timeOffset !== 0) { - const times = this.times; - for (let i = 0, n = times.length; i !== n; ++i) { - times[i] += timeOffset; - } + __name(refreshUniformsDash, "refreshUniformsDash"); + function refreshUniformsPoints(uniforms, material, pixelRatio, height) { + uniforms.diffuse.value.copy(material.color); + uniforms.opacity.value = material.opacity; + uniforms.size.value = material.size * pixelRatio; + uniforms.scale.value = height * 0.5; + if (material.map) { + uniforms.map.value = material.map; + refreshTransformUniform(material.map, uniforms.uvTransform); } - return this; - } - // scale all keyframe times by a factor (useful for frame <-> seconds conversions) - scale(timeScale) { - if (timeScale !== 1) { - const times = this.times; - for (let i = 0, n = times.length; i !== n; ++i) { - times[i] *= timeScale; - } + if (material.alphaMap) { + uniforms.alphaMap.value = material.alphaMap; + refreshTransformUniform(material.alphaMap, uniforms.alphaMapTransform); + } + if (material.alphaTest > 0) { + uniforms.alphaTest.value = material.alphaTest; } - return this; } - // removes keyframes before and after animation without changing any values within the range [startTime, endTime]. - // IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values - trim(startTime, endTime) { - const times = this.times, nKeys = times.length; - let from = 0, to = nKeys - 1; - while (from !== nKeys && times[from] < startTime) { - ++from; + __name(refreshUniformsPoints, "refreshUniformsPoints"); + function refreshUniformsSprites(uniforms, material) { + uniforms.diffuse.value.copy(material.color); + uniforms.opacity.value = material.opacity; + uniforms.rotation.value = material.rotation; + if (material.map) { + uniforms.map.value = material.map; + refreshTransformUniform(material.map, uniforms.mapTransform); } - while (to !== -1 && times[to] > endTime) { - --to; + if (material.alphaMap) { + uniforms.alphaMap.value = material.alphaMap; + refreshTransformUniform(material.alphaMap, uniforms.alphaMapTransform); } - ++to; - if (from !== 0 || to !== nKeys) { - if (from >= to) { - to = Math.max(to, 1); - from = to - 1; - } - const stride = this.getValueSize(); - this.times = times.slice(from, to); - this.values = this.values.slice(from * stride, to * stride); + if (material.alphaTest > 0) { + uniforms.alphaTest.value = material.alphaTest; } - return this; } - // ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable - validate() { - let valid = true; - const valueSize = this.getValueSize(); - if (valueSize - Math.floor(valueSize) !== 0) { - console.error("THREE.KeyframeTrack: Invalid value size in track.", this); - valid = false; + __name(refreshUniformsSprites, "refreshUniformsSprites"); + function refreshUniformsPhong(uniforms, material) { + uniforms.specular.value.copy(material.specular); + uniforms.shininess.value = Math.max(material.shininess, 1e-4); + } + __name(refreshUniformsPhong, "refreshUniformsPhong"); + function refreshUniformsToon(uniforms, material) { + if (material.gradientMap) { + uniforms.gradientMap.value = material.gradientMap; } - const times = this.times, values = this.values, nKeys = times.length; - if (nKeys === 0) { - console.error("THREE.KeyframeTrack: Track is empty.", this); - valid = false; + } + __name(refreshUniformsToon, "refreshUniformsToon"); + function refreshUniformsStandard(uniforms, material) { + uniforms.metalness.value = material.metalness; + if (material.metalnessMap) { + uniforms.metalnessMap.value = material.metalnessMap; + refreshTransformUniform(material.metalnessMap, uniforms.metalnessMapTransform); } - let prevTime = null; - for (let i = 0; i !== nKeys; i++) { - const currTime = times[i]; - if (typeof currTime === "number" && isNaN(currTime)) { - console.error("THREE.KeyframeTrack: Time is not a valid number.", this, i, currTime); - valid = false; - break; + uniforms.roughness.value = material.roughness; + if (material.roughnessMap) { + uniforms.roughnessMap.value = material.roughnessMap; + refreshTransformUniform(material.roughnessMap, uniforms.roughnessMapTransform); + } + if (material.envMap) { + uniforms.envMapIntensity.value = material.envMapIntensity; + } + } + __name(refreshUniformsStandard, "refreshUniformsStandard"); + function refreshUniformsPhysical(uniforms, material, transmissionRenderTarget) { + uniforms.ior.value = material.ior; + if (material.sheen > 0) { + uniforms.sheenColor.value.copy(material.sheenColor).multiplyScalar(material.sheen); + uniforms.sheenRoughness.value = material.sheenRoughness; + if (material.sheenColorMap) { + uniforms.sheenColorMap.value = material.sheenColorMap; + refreshTransformUniform(material.sheenColorMap, uniforms.sheenColorMapTransform); } - if (prevTime !== null && prevTime > currTime) { - console.error("THREE.KeyframeTrack: Out of order keys.", this, i, currTime, prevTime); - valid = false; - break; + if (material.sheenRoughnessMap) { + uniforms.sheenRoughnessMap.value = material.sheenRoughnessMap; + refreshTransformUniform(material.sheenRoughnessMap, uniforms.sheenRoughnessMapTransform); } - prevTime = currTime; } - if (values !== void 0) { - if (isTypedArray(values)) { - for (let i = 0, n = values.length; i !== n; ++i) { - const value = values[i]; - if (isNaN(value)) { - console.error("THREE.KeyframeTrack: Value is not a valid number.", this, i, value); - valid = false; - break; - } - } + if (material.clearcoat > 0) { + uniforms.clearcoat.value = material.clearcoat; + uniforms.clearcoatRoughness.value = material.clearcoatRoughness; + if (material.clearcoatMap) { + uniforms.clearcoatMap.value = material.clearcoatMap; + refreshTransformUniform(material.clearcoatMap, uniforms.clearcoatMapTransform); } - } - return valid; - } - // removes equivalent sequential keys as common in morph target sequences - // (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0) - optimize() { - const times = this.times.slice(), values = this.values.slice(), stride = this.getValueSize(), smoothInterpolation = this.getInterpolation() === InterpolateSmooth, lastIndex = times.length - 1; - let writeIndex = 1; - for (let i = 1; i < lastIndex; ++i) { - let keep = false; - const time = times[i]; - const timeNext = times[i + 1]; - if (time !== timeNext && (i !== 1 || time !== times[0])) { - if (!smoothInterpolation) { - const offset = i * stride, offsetP = offset - stride, offsetN = offset + stride; - for (let j = 0; j !== stride; ++j) { - const value = values[offset + j]; - if (value !== values[offsetP + j] || value !== values[offsetN + j]) { - keep = true; - break; - } - } - } else { - keep = true; - } + if (material.clearcoatRoughnessMap) { + uniforms.clearcoatRoughnessMap.value = material.clearcoatRoughnessMap; + refreshTransformUniform(material.clearcoatRoughnessMap, uniforms.clearcoatRoughnessMapTransform); } - if (keep) { - if (i !== writeIndex) { - times[writeIndex] = times[i]; - const readOffset = i * stride, writeOffset = writeIndex * stride; - for (let j = 0; j !== stride; ++j) { - values[writeOffset + j] = values[readOffset + j]; - } + if (material.clearcoatNormalMap) { + uniforms.clearcoatNormalMap.value = material.clearcoatNormalMap; + refreshTransformUniform(material.clearcoatNormalMap, uniforms.clearcoatNormalMapTransform); + uniforms.clearcoatNormalScale.value.copy(material.clearcoatNormalScale); + if (material.side === BackSide) { + uniforms.clearcoatNormalScale.value.negate(); } - ++writeIndex; } } - if (lastIndex > 0) { - times[writeIndex] = times[lastIndex]; - for (let readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++j) { - values[writeOffset + j] = values[readOffset + j]; - } - ++writeIndex; + if (material.dispersion > 0) { + uniforms.dispersion.value = material.dispersion; } - if (writeIndex !== times.length) { - this.times = times.slice(0, writeIndex); - this.values = values.slice(0, writeIndex * stride); - } else { - this.times = times; - this.values = values; + if (material.iridescence > 0) { + uniforms.iridescence.value = material.iridescence; + uniforms.iridescenceIOR.value = material.iridescenceIOR; + uniforms.iridescenceThicknessMinimum.value = material.iridescenceThicknessRange[0]; + uniforms.iridescenceThicknessMaximum.value = material.iridescenceThicknessRange[1]; + if (material.iridescenceMap) { + uniforms.iridescenceMap.value = material.iridescenceMap; + refreshTransformUniform(material.iridescenceMap, uniforms.iridescenceMapTransform); + } + if (material.iridescenceThicknessMap) { + uniforms.iridescenceThicknessMap.value = material.iridescenceThicknessMap; + refreshTransformUniform(material.iridescenceThicknessMap, uniforms.iridescenceThicknessMapTransform); + } } - return this; - } - clone() { - const times = this.times.slice(); - const values = this.values.slice(); - const TypedKeyframeTrack = this.constructor; - const track = new TypedKeyframeTrack(this.name, times, values); - track.createInterpolant = this.createInterpolant; - return track; - } -} -KeyframeTrack.prototype.TimeBufferType = Float32Array; -KeyframeTrack.prototype.ValueBufferType = Float32Array; -KeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear; -class BooleanKeyframeTrack extends KeyframeTrack { - static { - __name(this, "BooleanKeyframeTrack"); - } - // No interpolation parameter because only InterpolateDiscrete is valid. - constructor(name, times, values) { - super(name, times, values); - } -} -BooleanKeyframeTrack.prototype.ValueTypeName = "bool"; -BooleanKeyframeTrack.prototype.ValueBufferType = Array; -BooleanKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete; -BooleanKeyframeTrack.prototype.InterpolantFactoryMethodLinear = void 0; -BooleanKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = void 0; -class ColorKeyframeTrack extends KeyframeTrack { - static { - __name(this, "ColorKeyframeTrack"); - } -} -ColorKeyframeTrack.prototype.ValueTypeName = "color"; -class NumberKeyframeTrack extends KeyframeTrack { - static { - __name(this, "NumberKeyframeTrack"); - } -} -NumberKeyframeTrack.prototype.ValueTypeName = "number"; -class QuaternionLinearInterpolant extends Interpolant { - static { - __name(this, "QuaternionLinearInterpolant"); - } - constructor(parameterPositions, sampleValues, sampleSize, resultBuffer) { - super(parameterPositions, sampleValues, sampleSize, resultBuffer); - } - interpolate_(i1, t0, t2, t1) { - const result = this.resultBuffer, values = this.sampleValues, stride = this.valueSize, alpha = (t2 - t0) / (t1 - t0); - let offset = i1 * stride; - for (let end = offset + stride; offset !== end; offset += 4) { - Quaternion.slerpFlat(result, 0, values, offset - stride, values, offset, alpha); + if (material.transmission > 0) { + uniforms.transmission.value = material.transmission; + uniforms.transmissionSamplerMap.value = transmissionRenderTarget.texture; + uniforms.transmissionSamplerSize.value.set(transmissionRenderTarget.width, transmissionRenderTarget.height); + if (material.transmissionMap) { + uniforms.transmissionMap.value = material.transmissionMap; + refreshTransformUniform(material.transmissionMap, uniforms.transmissionMapTransform); + } + uniforms.thickness.value = material.thickness; + if (material.thicknessMap) { + uniforms.thicknessMap.value = material.thicknessMap; + refreshTransformUniform(material.thicknessMap, uniforms.thicknessMapTransform); + } + uniforms.attenuationDistance.value = material.attenuationDistance; + uniforms.attenuationColor.value.copy(material.attenuationColor); + } + if (material.anisotropy > 0) { + uniforms.anisotropyVector.value.set(material.anisotropy * Math.cos(material.anisotropyRotation), material.anisotropy * Math.sin(material.anisotropyRotation)); + if (material.anisotropyMap) { + uniforms.anisotropyMap.value = material.anisotropyMap; + refreshTransformUniform(material.anisotropyMap, uniforms.anisotropyMapTransform); + } + } + uniforms.specularIntensity.value = material.specularIntensity; + uniforms.specularColor.value.copy(material.specularColor); + if (material.specularColorMap) { + uniforms.specularColorMap.value = material.specularColorMap; + refreshTransformUniform(material.specularColorMap, uniforms.specularColorMapTransform); + } + if (material.specularIntensityMap) { + uniforms.specularIntensityMap.value = material.specularIntensityMap; + refreshTransformUniform(material.specularIntensityMap, uniforms.specularIntensityMapTransform); } - return result; - } -} -class QuaternionKeyframeTrack extends KeyframeTrack { - static { - __name(this, "QuaternionKeyframeTrack"); - } - InterpolantFactoryMethodLinear(result) { - return new QuaternionLinearInterpolant(this.times, this.values, this.getValueSize(), result); - } -} -QuaternionKeyframeTrack.prototype.ValueTypeName = "quaternion"; -QuaternionKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = void 0; -class StringKeyframeTrack extends KeyframeTrack { - static { - __name(this, "StringKeyframeTrack"); } - // No interpolation parameter because only InterpolateDiscrete is valid. - constructor(name, times, values) { - super(name, times, values); + __name(refreshUniformsPhysical, "refreshUniformsPhysical"); + function refreshUniformsMatcap(uniforms, material) { + if (material.matcap) { + uniforms.matcap.value = material.matcap; + } } -} -StringKeyframeTrack.prototype.ValueTypeName = "string"; -StringKeyframeTrack.prototype.ValueBufferType = Array; -StringKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete; -StringKeyframeTrack.prototype.InterpolantFactoryMethodLinear = void 0; -StringKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = void 0; -class VectorKeyframeTrack extends KeyframeTrack { - static { - __name(this, "VectorKeyframeTrack"); + __name(refreshUniformsMatcap, "refreshUniformsMatcap"); + function refreshUniformsDistance(uniforms, material) { + const light = properties.get(material).light; + uniforms.referencePosition.value.setFromMatrixPosition(light.matrixWorld); + uniforms.nearDistance.value = light.shadow.camera.near; + uniforms.farDistance.value = light.shadow.camera.far; } + __name(refreshUniformsDistance, "refreshUniformsDistance"); + return { + refreshFogUniforms, + refreshMaterialUniforms + }; } -VectorKeyframeTrack.prototype.ValueTypeName = "vector"; -class AnimationClip { - static { - __name(this, "AnimationClip"); - } - constructor(name = "", duration = -1, tracks = [], blendMode = NormalAnimationBlendMode) { - this.name = name; - this.tracks = tracks; - this.duration = duration; - this.blendMode = blendMode; - this.uuid = generateUUID(); - if (this.duration < 0) { - this.resetDuration(); - } +__name(WebGLMaterials, "WebGLMaterials"); +function WebGLUniformsGroups(gl, info, capabilities, state) { + let buffers = {}; + let updateList = {}; + let allocatedBindingPoints = []; + const maxBindingPoints = gl.getParameter(gl.MAX_UNIFORM_BUFFER_BINDINGS); + function bind(uniformsGroup, program) { + const webglProgram = program.program; + state.uniformBlockBinding(uniformsGroup, webglProgram); } - static parse(json) { - const tracks = [], jsonTracks = json.tracks, frameTime = 1 / (json.fps || 1); - for (let i = 0, n = jsonTracks.length; i !== n; ++i) { - tracks.push(parseKeyframeTrack(jsonTracks[i]).scale(frameTime)); + __name(bind, "bind"); + function update(uniformsGroup, program) { + let buffer = buffers[uniformsGroup.id]; + if (buffer === void 0) { + prepareUniformsGroup(uniformsGroup); + buffer = createBuffer(uniformsGroup); + buffers[uniformsGroup.id] = buffer; + uniformsGroup.addEventListener("dispose", onUniformsGroupsDispose); } - const clip = new this(json.name, json.duration, tracks, json.blendMode); - clip.uuid = json.uuid; - return clip; - } - static toJSON(clip) { - const tracks = [], clipTracks = clip.tracks; - const json = { - "name": clip.name, - "duration": clip.duration, - "tracks": tracks, - "uuid": clip.uuid, - "blendMode": clip.blendMode - }; - for (let i = 0, n = clipTracks.length; i !== n; ++i) { - tracks.push(KeyframeTrack.toJSON(clipTracks[i])); + const webglProgram = program.program; + state.updateUBOMapping(uniformsGroup, webglProgram); + const frame = info.render.frame; + if (updateList[uniformsGroup.id] !== frame) { + updateBufferData(uniformsGroup); + updateList[uniformsGroup.id] = frame; } - return json; } - static CreateFromMorphTargetSequence(name, morphTargetSequence, fps, noLoop) { - const numMorphTargets = morphTargetSequence.length; - const tracks = []; - for (let i = 0; i < numMorphTargets; i++) { - let times = []; - let values = []; - times.push( - (i + numMorphTargets - 1) % numMorphTargets, - i, - (i + 1) % numMorphTargets - ); - values.push(0, 1, 0); - const order = getKeyframeOrder(times); - times = sortedArray(times, 1, order); - values = sortedArray(values, 1, order); - if (!noLoop && times[0] === 0) { - times.push(numMorphTargets); - values.push(values[0]); - } - tracks.push( - new NumberKeyframeTrack( - ".morphTargetInfluences[" + morphTargetSequence[i].name + "]", - times, - values - ).scale(1 / fps) - ); - } - return new this(name, -1, tracks); + __name(update, "update"); + function createBuffer(uniformsGroup) { + const bindingPointIndex = allocateBindingPointIndex(); + uniformsGroup.__bindingPointIndex = bindingPointIndex; + const buffer = gl.createBuffer(); + const size = uniformsGroup.__size; + const usage = uniformsGroup.usage; + gl.bindBuffer(gl.UNIFORM_BUFFER, buffer); + gl.bufferData(gl.UNIFORM_BUFFER, size, usage); + gl.bindBuffer(gl.UNIFORM_BUFFER, null); + gl.bindBufferBase(gl.UNIFORM_BUFFER, bindingPointIndex, buffer); + return buffer; } - static findByName(objectOrClipArray, name) { - let clipArray = objectOrClipArray; - if (!Array.isArray(objectOrClipArray)) { - const o = objectOrClipArray; - clipArray = o.geometry && o.geometry.animations || o.animations; - } - for (let i = 0; i < clipArray.length; i++) { - if (clipArray[i].name === name) { - return clipArray[i]; + __name(createBuffer, "createBuffer"); + function allocateBindingPointIndex() { + for (let i = 0; i < maxBindingPoints; i++) { + if (allocatedBindingPoints.indexOf(i) === -1) { + allocatedBindingPoints.push(i); + return i; } } - return null; + console.error("THREE.WebGLRenderer: Maximum number of simultaneously usable uniforms groups reached."); + return 0; } - static CreateClipsFromMorphTargetSequences(morphTargets, fps, noLoop) { - const animationToMorphTargets = {}; - const pattern = /^([\w-]*?)([\d]+)$/; - for (let i = 0, il = morphTargets.length; i < il; i++) { - const morphTarget = morphTargets[i]; - const parts = morphTarget.name.match(pattern); - if (parts && parts.length > 1) { - const name = parts[1]; - let animationMorphTargets = animationToMorphTargets[name]; - if (!animationMorphTargets) { - animationToMorphTargets[name] = animationMorphTargets = []; + __name(allocateBindingPointIndex, "allocateBindingPointIndex"); + function updateBufferData(uniformsGroup) { + const buffer = buffers[uniformsGroup.id]; + const uniforms = uniformsGroup.uniforms; + const cache = uniformsGroup.__cache; + gl.bindBuffer(gl.UNIFORM_BUFFER, buffer); + for (let i = 0, il = uniforms.length; i < il; i++) { + const uniformArray = Array.isArray(uniforms[i]) ? uniforms[i] : [uniforms[i]]; + for (let j = 0, jl = uniformArray.length; j < jl; j++) { + const uniform = uniformArray[j]; + if (hasUniformChanged(uniform, i, j, cache) === true) { + const offset = uniform.__offset; + const values = Array.isArray(uniform.value) ? uniform.value : [uniform.value]; + let arrayOffset = 0; + for (let k = 0; k < values.length; k++) { + const value = values[k]; + const info2 = getUniformSize(value); + if (typeof value === "number" || typeof value === "boolean") { + uniform.__data[0] = value; + gl.bufferSubData(gl.UNIFORM_BUFFER, offset + arrayOffset, uniform.__data); + } else if (value.isMatrix3) { + uniform.__data[0] = value.elements[0]; + uniform.__data[1] = value.elements[1]; + uniform.__data[2] = value.elements[2]; + uniform.__data[3] = 0; + uniform.__data[4] = value.elements[3]; + uniform.__data[5] = value.elements[4]; + uniform.__data[6] = value.elements[5]; + uniform.__data[7] = 0; + uniform.__data[8] = value.elements[6]; + uniform.__data[9] = value.elements[7]; + uniform.__data[10] = value.elements[8]; + uniform.__data[11] = 0; + } else { + value.toArray(uniform.__data, arrayOffset); + arrayOffset += info2.storage / Float32Array.BYTES_PER_ELEMENT; + } + } + gl.bufferSubData(gl.UNIFORM_BUFFER, offset, uniform.__data); } - animationMorphTargets.push(morphTarget); } } - const clips = []; - for (const name in animationToMorphTargets) { - clips.push(this.CreateFromMorphTargetSequence(name, animationToMorphTargets[name], fps, noLoop)); - } - return clips; + gl.bindBuffer(gl.UNIFORM_BUFFER, null); } - // parse the animation.hierarchy format - static parseAnimation(animation, bones) { - if (!animation) { - console.error("THREE.AnimationClip: No animation in JSONLoader data."); - return null; - } - const addNonemptyTrack = /* @__PURE__ */ __name(function(trackType, trackName, animationKeys, propertyName, destTracks) { - if (animationKeys.length !== 0) { - const times = []; - const values = []; - flattenJSON(animationKeys, times, values, propertyName); - if (times.length !== 0) { - destTracks.push(new trackType(trackName, times, values)); - } + __name(updateBufferData, "updateBufferData"); + function hasUniformChanged(uniform, index, indexArray, cache) { + const value = uniform.value; + const indexString = index + "_" + indexArray; + if (cache[indexString] === void 0) { + if (typeof value === "number" || typeof value === "boolean") { + cache[indexString] = value; + } else { + cache[indexString] = value.clone(); } - }, "addNonemptyTrack"); - const tracks = []; - const clipName = animation.name || "default"; - const fps = animation.fps || 30; - const blendMode = animation.blendMode; - let duration = animation.length || -1; - const hierarchyTracks = animation.hierarchy || []; - for (let h = 0; h < hierarchyTracks.length; h++) { - const animationKeys = hierarchyTracks[h].keys; - if (!animationKeys || animationKeys.length === 0) continue; - if (animationKeys[0].morphTargets) { - const morphTargetNames = {}; - let k; - for (k = 0; k < animationKeys.length; k++) { - if (animationKeys[k].morphTargets) { - for (let m = 0; m < animationKeys[k].morphTargets.length; m++) { - morphTargetNames[animationKeys[k].morphTargets[m]] = -1; - } - } - } - for (const morphTargetName in morphTargetNames) { - const times = []; - const values = []; - for (let m = 0; m !== animationKeys[k].morphTargets.length; ++m) { - const animationKey = animationKeys[k]; - times.push(animationKey.time); - values.push(animationKey.morphTarget === morphTargetName ? 1 : 0); - } - tracks.push(new NumberKeyframeTrack(".morphTargetInfluence[" + morphTargetName + "]", times, values)); + return true; + } else { + const cachedObject = cache[indexString]; + if (typeof value === "number" || typeof value === "boolean") { + if (cachedObject !== value) { + cache[indexString] = value; + return true; } - duration = morphTargetNames.length * fps; } else { - const boneName = ".bones[" + bones[h].name + "]"; - addNonemptyTrack( - VectorKeyframeTrack, - boneName + ".position", - animationKeys, - "pos", - tracks - ); - addNonemptyTrack( - QuaternionKeyframeTrack, - boneName + ".quaternion", - animationKeys, - "rot", - tracks - ); - addNonemptyTrack( - VectorKeyframeTrack, - boneName + ".scale", - animationKeys, - "scl", - tracks - ); + if (cachedObject.equals(value) === false) { + cachedObject.copy(value); + return true; + } } } - if (tracks.length === 0) { - return null; - } - const clip = new this(clipName, duration, tracks, blendMode); - return clip; - } - resetDuration() { - const tracks = this.tracks; - let duration = 0; - for (let i = 0, n = tracks.length; i !== n; ++i) { - const track = this.tracks[i]; - duration = Math.max(duration, track.times[track.times.length - 1]); - } - this.duration = duration; - return this; + return false; } - trim() { - for (let i = 0; i < this.tracks.length; i++) { - this.tracks[i].trim(0, this.duration); + __name(hasUniformChanged, "hasUniformChanged"); + function prepareUniformsGroup(uniformsGroup) { + const uniforms = uniformsGroup.uniforms; + let offset = 0; + const chunkSize = 16; + for (let i = 0, l = uniforms.length; i < l; i++) { + const uniformArray = Array.isArray(uniforms[i]) ? uniforms[i] : [uniforms[i]]; + for (let j = 0, jl = uniformArray.length; j < jl; j++) { + const uniform = uniformArray[j]; + const values = Array.isArray(uniform.value) ? uniform.value : [uniform.value]; + for (let k = 0, kl = values.length; k < kl; k++) { + const value = values[k]; + const info2 = getUniformSize(value); + const chunkOffset2 = offset % chunkSize; + const chunkPadding = chunkOffset2 % info2.boundary; + const chunkStart = chunkOffset2 + chunkPadding; + offset += chunkPadding; + if (chunkStart !== 0 && chunkSize - chunkStart < info2.storage) { + offset += chunkSize - chunkStart; + } + uniform.__data = new Float32Array(info2.storage / Float32Array.BYTES_PER_ELEMENT); + uniform.__offset = offset; + offset += info2.storage; + } + } } + const chunkOffset = offset % chunkSize; + if (chunkOffset > 0) offset += chunkSize - chunkOffset; + uniformsGroup.__size = offset; + uniformsGroup.__cache = {}; return this; } - validate() { - let valid = true; - for (let i = 0; i < this.tracks.length; i++) { - valid = valid && this.tracks[i].validate(); + __name(prepareUniformsGroup, "prepareUniformsGroup"); + function getUniformSize(value) { + const info2 = { + boundary: 0, + // bytes + storage: 0 + // bytes + }; + if (typeof value === "number" || typeof value === "boolean") { + info2.boundary = 4; + info2.storage = 4; + } else if (value.isVector2) { + info2.boundary = 8; + info2.storage = 8; + } else if (value.isVector3 || value.isColor) { + info2.boundary = 16; + info2.storage = 12; + } else if (value.isVector4) { + info2.boundary = 16; + info2.storage = 16; + } else if (value.isMatrix3) { + info2.boundary = 48; + info2.storage = 48; + } else if (value.isMatrix4) { + info2.boundary = 64; + info2.storage = 64; + } else if (value.isTexture) { + console.warn("THREE.WebGLRenderer: Texture samplers can not be part of an uniforms group."); + } else { + console.warn("THREE.WebGLRenderer: Unsupported uniform value type.", value); } - return valid; + return info2; } - optimize() { - for (let i = 0; i < this.tracks.length; i++) { - this.tracks[i].optimize(); - } - return this; + __name(getUniformSize, "getUniformSize"); + function onUniformsGroupsDispose(event) { + const uniformsGroup = event.target; + uniformsGroup.removeEventListener("dispose", onUniformsGroupsDispose); + const index = allocatedBindingPoints.indexOf(uniformsGroup.__bindingPointIndex); + allocatedBindingPoints.splice(index, 1); + gl.deleteBuffer(buffers[uniformsGroup.id]); + delete buffers[uniformsGroup.id]; + delete updateList[uniformsGroup.id]; } - clone() { - const tracks = []; - for (let i = 0; i < this.tracks.length; i++) { - tracks.push(this.tracks[i].clone()); + __name(onUniformsGroupsDispose, "onUniformsGroupsDispose"); + function dispose() { + for (const id2 in buffers) { + gl.deleteBuffer(buffers[id2]); } - return new this.constructor(this.name, this.duration, tracks, this.blendMode); - } - toJSON() { - return this.constructor.toJSON(this); - } -} -function getTrackTypeForValueTypeName(typeName) { - switch (typeName.toLowerCase()) { - case "scalar": - case "double": - case "float": - case "number": - case "integer": - return NumberKeyframeTrack; - case "vector": - case "vector2": - case "vector3": - case "vector4": - return VectorKeyframeTrack; - case "color": - return ColorKeyframeTrack; - case "quaternion": - return QuaternionKeyframeTrack; - case "bool": - case "boolean": - return BooleanKeyframeTrack; - case "string": - return StringKeyframeTrack; - } - throw new Error("THREE.KeyframeTrack: Unsupported typeName: " + typeName); -} -__name(getTrackTypeForValueTypeName, "getTrackTypeForValueTypeName"); -function parseKeyframeTrack(json) { - if (json.type === void 0) { - throw new Error("THREE.KeyframeTrack: track type undefined, can not parse"); - } - const trackType = getTrackTypeForValueTypeName(json.type); - if (json.times === void 0) { - const times = [], values = []; - flattenJSON(json.keys, times, values, "value"); - json.times = times; - json.values = values; - } - if (trackType.parse !== void 0) { - return trackType.parse(json); - } else { - return new trackType(json.name, json.times, json.values, json.interpolation); + allocatedBindingPoints = []; + buffers = {}; + updateList = {}; } + __name(dispose, "dispose"); + return { + bind, + update, + dispose + }; } -__name(parseKeyframeTrack, "parseKeyframeTrack"); -const Cache = { - enabled: false, - files: {}, - add: /* @__PURE__ */ __name(function(key, file2) { - if (this.enabled === false) return; - this.files[key] = file2; - }, "add"), - get: /* @__PURE__ */ __name(function(key) { - if (this.enabled === false) return; - return this.files[key]; - }, "get"), - remove: /* @__PURE__ */ __name(function(key) { - delete this.files[key]; - }, "remove"), - clear: /* @__PURE__ */ __name(function() { - this.files = {}; - }, "clear") -}; -class LoadingManager { +__name(WebGLUniformsGroups, "WebGLUniformsGroups"); +class WebGLRenderer { static { - __name(this, "LoadingManager"); + __name(this, "WebGLRenderer"); } - constructor(onLoad, onProgress, onError) { - const scope = this; - let isLoading = false; - let itemsLoaded = 0; - let itemsTotal = 0; - let urlModifier = void 0; - const handlers = []; - this.onStart = void 0; - this.onLoad = onLoad; - this.onProgress = onProgress; - this.onError = onError; - this.itemStart = function(url) { - itemsTotal++; - if (isLoading === false) { - if (scope.onStart !== void 0) { - scope.onStart(url, itemsLoaded, itemsTotal); - } + constructor(parameters = {}) { + const { + canvas = createCanvasElement(), + context = null, + depth = true, + stencil = false, + alpha = false, + antialias = false, + premultipliedAlpha = true, + preserveDrawingBuffer = false, + powerPreference = "default", + failIfMajorPerformanceCaveat = false, + reverseDepthBuffer = false + } = parameters; + this.isWebGLRenderer = true; + let _alpha; + if (context !== null) { + if (typeof WebGLRenderingContext !== "undefined" && context instanceof WebGLRenderingContext) { + throw new Error("THREE.WebGLRenderer: WebGL 1 is not supported since r163."); } - isLoading = true; + _alpha = context.getContextAttributes().alpha; + } else { + _alpha = alpha; + } + const uintClearColor = new Uint32Array(4); + const intClearColor = new Int32Array(4); + let currentRenderList = null; + let currentRenderState = null; + const renderListStack = []; + const renderStateStack = []; + this.domElement = canvas; + this.debug = { + /** + * Enables error checking and reporting when shader programs are being compiled + * @type {boolean} + */ + checkShaderErrors: true, + /** + * Callback for custom error reporting. + * @type {?Function} + */ + onShaderError: null }; - this.itemEnd = function(url) { - itemsLoaded++; - if (scope.onProgress !== void 0) { - scope.onProgress(url, itemsLoaded, itemsTotal); - } - if (itemsLoaded === itemsTotal) { - isLoading = false; - if (scope.onLoad !== void 0) { - scope.onLoad(); + this.autoClear = true; + this.autoClearColor = true; + this.autoClearDepth = true; + this.autoClearStencil = true; + this.sortObjects = true; + this.clippingPlanes = []; + this.localClippingEnabled = false; + this._outputColorSpace = SRGBColorSpace; + this.toneMapping = NoToneMapping; + this.toneMappingExposure = 1; + const _this = this; + let _isContextLost = false; + let _currentActiveCubeFace = 0; + let _currentActiveMipmapLevel = 0; + let _currentRenderTarget = null; + let _currentMaterialId = -1; + let _currentCamera = null; + const _currentViewport = new Vector4(); + const _currentScissor = new Vector4(); + let _currentScissorTest = null; + const _currentClearColor = new Color(0); + let _currentClearAlpha = 0; + let _width = canvas.width; + let _height = canvas.height; + let _pixelRatio = 1; + let _opaqueSort = null; + let _transparentSort = null; + const _viewport = new Vector4(0, 0, _width, _height); + const _scissor = new Vector4(0, 0, _width, _height); + let _scissorTest = false; + const _frustum2 = new Frustum(); + let _clippingEnabled = false; + let _localClippingEnabled = false; + const _currentProjectionMatrix = new Matrix4(); + const _projScreenMatrix2 = new Matrix4(); + const _vector32 = new Vector3(); + const _vector4 = new Vector4(); + const _emptyScene = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: true }; + let _renderBackground = false; + function getTargetPixelRatio() { + return _currentRenderTarget === null ? _pixelRatio : 1; + } + __name(getTargetPixelRatio, "getTargetPixelRatio"); + let _gl = context; + function getContext(contextName, contextAttributes) { + return canvas.getContext(contextName, contextAttributes); + } + __name(getContext, "getContext"); + try { + const contextAttributes = { + alpha: true, + depth, + stencil, + antialias, + premultipliedAlpha, + preserveDrawingBuffer, + powerPreference, + failIfMajorPerformanceCaveat + }; + if ("setAttribute" in canvas) canvas.setAttribute("data-engine", `three.js r${REVISION}`); + canvas.addEventListener("webglcontextlost", onContextLost, false); + canvas.addEventListener("webglcontextrestored", onContextRestore, false); + canvas.addEventListener("webglcontextcreationerror", onContextCreationError, false); + if (_gl === null) { + const contextName = "webgl2"; + _gl = getContext(contextName, contextAttributes); + if (_gl === null) { + if (getContext(contextName)) { + throw new Error("Error creating WebGL context with your selected attributes."); + } else { + throw new Error("Error creating WebGL context."); + } } } - }; - this.itemError = function(url) { - if (scope.onError !== void 0) { - scope.onError(url); + } catch (error) { + console.error("THREE.WebGLRenderer: " + error.message); + throw error; + } + let extensions, capabilities, state, info; + let properties, textures, cubemaps, cubeuvmaps, attributes, geometries, objects; + let programCache, materials, renderLists, renderStates, clipping, shadowMap; + let background, morphtargets, bufferRenderer, indexedBufferRenderer; + let utils, bindingStates, uniformsGroups; + function initGLContext() { + extensions = new WebGLExtensions(_gl); + extensions.init(); + utils = new WebGLUtils(_gl, extensions); + capabilities = new WebGLCapabilities(_gl, extensions, parameters, utils); + state = new WebGLState(_gl, extensions); + if (capabilities.reverseDepthBuffer && reverseDepthBuffer) { + state.buffers.depth.setReversed(true); } + info = new WebGLInfo(_gl); + properties = new WebGLProperties(); + textures = new WebGLTextures(_gl, extensions, state, properties, capabilities, utils, info); + cubemaps = new WebGLCubeMaps(_this); + cubeuvmaps = new WebGLCubeUVMaps(_this); + attributes = new WebGLAttributes(_gl); + bindingStates = new WebGLBindingStates(_gl, attributes); + geometries = new WebGLGeometries(_gl, attributes, info, bindingStates); + objects = new WebGLObjects(_gl, geometries, attributes, info); + morphtargets = new WebGLMorphtargets(_gl, capabilities, textures); + clipping = new WebGLClipping(properties); + programCache = new WebGLPrograms(_this, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping); + materials = new WebGLMaterials(_this, properties); + renderLists = new WebGLRenderLists(); + renderStates = new WebGLRenderStates(extensions); + background = new WebGLBackground(_this, cubemaps, cubeuvmaps, state, objects, _alpha, premultipliedAlpha); + shadowMap = new WebGLShadowMap(_this, objects, capabilities); + uniformsGroups = new WebGLUniformsGroups(_gl, info, capabilities, state); + bufferRenderer = new WebGLBufferRenderer(_gl, extensions, info); + indexedBufferRenderer = new WebGLIndexedBufferRenderer(_gl, extensions, info); + info.programs = programCache.programs; + _this.capabilities = capabilities; + _this.extensions = extensions; + _this.properties = properties; + _this.renderLists = renderLists; + _this.shadowMap = shadowMap; + _this.state = state; + _this.info = info; + } + __name(initGLContext, "initGLContext"); + initGLContext(); + const xr = new WebXRManager(_this, _gl); + this.xr = xr; + this.getContext = function() { + return _gl; }; - this.resolveURL = function(url) { - if (urlModifier) { - return urlModifier(url); + this.getContextAttributes = function() { + return _gl.getContextAttributes(); + }; + this.forceContextLoss = function() { + const extension = extensions.get("WEBGL_lose_context"); + if (extension) extension.loseContext(); + }; + this.forceContextRestore = function() { + const extension = extensions.get("WEBGL_lose_context"); + if (extension) extension.restoreContext(); + }; + this.getPixelRatio = function() { + return _pixelRatio; + }; + this.setPixelRatio = function(value) { + if (value === void 0) return; + _pixelRatio = value; + this.setSize(_width, _height, false); + }; + this.getSize = function(target) { + return target.set(_width, _height); + }; + this.setSize = function(width, height, updateStyle = true) { + if (xr.isPresenting) { + console.warn("THREE.WebGLRenderer: Can't change size while VR device is presenting."); + return; } - return url; + _width = width; + _height = height; + canvas.width = Math.floor(width * _pixelRatio); + canvas.height = Math.floor(height * _pixelRatio); + if (updateStyle === true) { + canvas.style.width = width + "px"; + canvas.style.height = height + "px"; + } + this.setViewport(0, 0, width, height); }; - this.setURLModifier = function(transform) { - urlModifier = transform; - return this; + this.getDrawingBufferSize = function(target) { + return target.set(_width * _pixelRatio, _height * _pixelRatio).floor(); }; - this.addHandler = function(regex, loader) { - handlers.push(regex, loader); - return this; + this.setDrawingBufferSize = function(width, height, pixelRatio) { + _width = width; + _height = height; + _pixelRatio = pixelRatio; + canvas.width = Math.floor(width * pixelRatio); + canvas.height = Math.floor(height * pixelRatio); + this.setViewport(0, 0, width, height); }; - this.removeHandler = function(regex) { - const index = handlers.indexOf(regex); - if (index !== -1) { - handlers.splice(index, 2); + this.getCurrentViewport = function(target) { + return target.copy(_currentViewport); + }; + this.getViewport = function(target) { + return target.copy(_viewport); + }; + this.setViewport = function(x, y, width, height) { + if (x.isVector4) { + _viewport.set(x.x, x.y, x.z, x.w); + } else { + _viewport.set(x, y, width, height); } - return this; + state.viewport(_currentViewport.copy(_viewport).multiplyScalar(_pixelRatio).round()); }; - this.getHandler = function(file2) { - for (let i = 0, l = handlers.length; i < l; i += 2) { - const regex = handlers[i]; - const loader = handlers[i + 1]; - if (regex.global) regex.lastIndex = 0; - if (regex.test(file2)) { - return loader; - } + this.getScissor = function(target) { + return target.copy(_scissor); + }; + this.setScissor = function(x, y, width, height) { + if (x.isVector4) { + _scissor.set(x.x, x.y, x.z, x.w); + } else { + _scissor.set(x, y, width, height); } - return null; + state.scissor(_currentScissor.copy(_scissor).multiplyScalar(_pixelRatio).round()); }; - } -} -const DefaultLoadingManager = /* @__PURE__ */ new LoadingManager(); -class Loader { - static { - __name(this, "Loader"); - } - constructor(manager) { - this.manager = manager !== void 0 ? manager : DefaultLoadingManager; - this.crossOrigin = "anonymous"; - this.withCredentials = false; - this.path = ""; - this.resourcePath = ""; - this.requestHeader = {}; - } - load() { - } - loadAsync(url, onProgress) { - const scope = this; - return new Promise(function(resolve, reject) { - scope.load(url, resolve, onProgress, reject); - }); - } - parse() { - } - setCrossOrigin(crossOrigin) { - this.crossOrigin = crossOrigin; - return this; - } - setWithCredentials(value) { - this.withCredentials = value; - return this; - } - setPath(path) { - this.path = path; - return this; - } - setResourcePath(resourcePath) { - this.resourcePath = resourcePath; - return this; - } - setRequestHeader(requestHeader) { - this.requestHeader = requestHeader; - return this; - } -} -Loader.DEFAULT_MATERIAL_NAME = "__DEFAULT"; -const loading = {}; -class HttpError extends Error { - static { - __name(this, "HttpError"); - } - constructor(message, response) { - super(message); - this.response = response; - } -} -class FileLoader extends Loader { - static { - __name(this, "FileLoader"); - } - constructor(manager) { - super(manager); - } - load(url, onLoad, onProgress, onError) { - if (url === void 0) url = ""; - if (this.path !== void 0) url = this.path + url; - url = this.manager.resolveURL(url); - const cached = Cache.get(url); - if (cached !== void 0) { - this.manager.itemStart(url); - setTimeout(() => { - if (onLoad) onLoad(cached); - this.manager.itemEnd(url); - }, 0); - return cached; - } - if (loading[url] !== void 0) { - loading[url].push({ - onLoad, - onProgress, - onError - }); - return; - } - loading[url] = []; - loading[url].push({ - onLoad, - onProgress, - onError - }); - const req = new Request(url, { - headers: new Headers(this.requestHeader), - credentials: this.withCredentials ? "include" : "same-origin" - // An abort controller could be added within a future PR - }); - const mimeType = this.mimeType; - const responseType = this.responseType; - fetch(req).then((response) => { - if (response.status === 200 || response.status === 0) { - if (response.status === 0) { - console.warn("THREE.FileLoader: HTTP Status 0 received."); - } - if (typeof ReadableStream === "undefined" || response.body === void 0 || response.body.getReader === void 0) { - return response; + this.getScissorTest = function() { + return _scissorTest; + }; + this.setScissorTest = function(boolean) { + state.setScissorTest(_scissorTest = boolean); + }; + this.setOpaqueSort = function(method) { + _opaqueSort = method; + }; + this.setTransparentSort = function(method) { + _transparentSort = method; + }; + this.getClearColor = function(target) { + return target.copy(background.getClearColor()); + }; + this.setClearColor = function() { + background.setClearColor.apply(background, arguments); + }; + this.getClearAlpha = function() { + return background.getClearAlpha(); + }; + this.setClearAlpha = function() { + background.setClearAlpha.apply(background, arguments); + }; + this.clear = function(color = true, depth2 = true, stencil2 = true) { + let bits2 = 0; + if (color) { + let isIntegerFormat = false; + if (_currentRenderTarget !== null) { + const targetFormat = _currentRenderTarget.texture.format; + isIntegerFormat = targetFormat === RGBAIntegerFormat || targetFormat === RGIntegerFormat || targetFormat === RedIntegerFormat; } - const callbacks = loading[url]; - const reader = response.body.getReader(); - const contentLength = response.headers.get("X-File-Size") || response.headers.get("Content-Length"); - const total = contentLength ? parseInt(contentLength) : 0; - const lengthComputable = total !== 0; - let loaded = 0; - const stream = new ReadableStream({ - start(controller) { - readData(); - function readData() { - reader.read().then(({ done, value }) => { - if (done) { - controller.close(); - } else { - loaded += value.byteLength; - const event = new ProgressEvent("progress", { lengthComputable, loaded, total }); - for (let i = 0, il = callbacks.length; i < il; i++) { - const callback = callbacks[i]; - if (callback.onProgress) callback.onProgress(event); - } - controller.enqueue(value); - readData(); - } - }, (e) => { - controller.error(e); - }); - } - __name(readData, "readData"); + if (isIntegerFormat) { + const targetType = _currentRenderTarget.texture.type; + const isUnsignedType = targetType === UnsignedByteType || targetType === UnsignedIntType || targetType === UnsignedShortType || targetType === UnsignedInt248Type || targetType === UnsignedShort4444Type || targetType === UnsignedShort5551Type; + const clearColor = background.getClearColor(); + const a = background.getClearAlpha(); + const r = clearColor.r; + const g = clearColor.g; + const b = clearColor.b; + if (isUnsignedType) { + uintClearColor[0] = r; + uintClearColor[1] = g; + uintClearColor[2] = b; + uintClearColor[3] = a; + _gl.clearBufferuiv(_gl.COLOR, 0, uintClearColor); + } else { + intClearColor[0] = r; + intClearColor[1] = g; + intClearColor[2] = b; + intClearColor[3] = a; + _gl.clearBufferiv(_gl.COLOR, 0, intClearColor); } + } else { + bits2 |= _gl.COLOR_BUFFER_BIT; + } + } + if (depth2) { + bits2 |= _gl.DEPTH_BUFFER_BIT; + } + if (stencil2) { + bits2 |= _gl.STENCIL_BUFFER_BIT; + this.state.buffers.stencil.setMask(4294967295); + } + _gl.clear(bits2); + }; + this.clearColor = function() { + this.clear(true, false, false); + }; + this.clearDepth = function() { + this.clear(false, true, false); + }; + this.clearStencil = function() { + this.clear(false, false, true); + }; + this.dispose = function() { + canvas.removeEventListener("webglcontextlost", onContextLost, false); + canvas.removeEventListener("webglcontextrestored", onContextRestore, false); + canvas.removeEventListener("webglcontextcreationerror", onContextCreationError, false); + renderLists.dispose(); + renderStates.dispose(); + properties.dispose(); + cubemaps.dispose(); + cubeuvmaps.dispose(); + objects.dispose(); + bindingStates.dispose(); + uniformsGroups.dispose(); + programCache.dispose(); + xr.dispose(); + xr.removeEventListener("sessionstart", onXRSessionStart); + xr.removeEventListener("sessionend", onXRSessionEnd); + animation.stop(); + }; + function onContextLost(event) { + event.preventDefault(); + console.log("THREE.WebGLRenderer: Context Lost."); + _isContextLost = true; + } + __name(onContextLost, "onContextLost"); + function onContextRestore() { + console.log("THREE.WebGLRenderer: Context Restored."); + _isContextLost = false; + const infoAutoReset = info.autoReset; + const shadowMapEnabled = shadowMap.enabled; + const shadowMapAutoUpdate = shadowMap.autoUpdate; + const shadowMapNeedsUpdate = shadowMap.needsUpdate; + const shadowMapType = shadowMap.type; + initGLContext(); + info.autoReset = infoAutoReset; + shadowMap.enabled = shadowMapEnabled; + shadowMap.autoUpdate = shadowMapAutoUpdate; + shadowMap.needsUpdate = shadowMapNeedsUpdate; + shadowMap.type = shadowMapType; + } + __name(onContextRestore, "onContextRestore"); + function onContextCreationError(event) { + console.error("THREE.WebGLRenderer: A WebGL context could not be created. Reason: ", event.statusMessage); + } + __name(onContextCreationError, "onContextCreationError"); + function onMaterialDispose(event) { + const material = event.target; + material.removeEventListener("dispose", onMaterialDispose); + deallocateMaterial(material); + } + __name(onMaterialDispose, "onMaterialDispose"); + function deallocateMaterial(material) { + releaseMaterialProgramReferences(material); + properties.remove(material); + } + __name(deallocateMaterial, "deallocateMaterial"); + function releaseMaterialProgramReferences(material) { + const programs = properties.get(material).programs; + if (programs !== void 0) { + programs.forEach(function(program) { + programCache.releaseProgram(program); }); - return new Response(stream); - } else { - throw new HttpError(`fetch for "${response.url}" responded with ${response.status}: ${response.statusText}`, response); + if (material.isShaderMaterial) { + programCache.releaseShaderCache(material); + } } - }).then((response) => { - switch (responseType) { - case "arraybuffer": - return response.arrayBuffer(); - case "blob": - return response.blob(); - case "document": - return response.text().then((text) => { - const parser = new DOMParser(); - return parser.parseFromString(text, mimeType); - }); - case "json": - return response.json(); - default: - if (mimeType === void 0) { - return response.text(); - } else { - const re = /charset="?([^;"\s]*)"?/i; - const exec = re.exec(mimeType); - const label = exec && exec[1] ? exec[1].toLowerCase() : void 0; - const decoder = new TextDecoder(label); - return response.arrayBuffer().then((ab) => decoder.decode(ab)); - } + } + __name(releaseMaterialProgramReferences, "releaseMaterialProgramReferences"); + this.renderBufferDirect = function(camera, scene, geometry, material, object, group) { + if (scene === null) scene = _emptyScene; + const frontFaceCW = object.isMesh && object.matrixWorld.determinant() < 0; + const program = setProgram(camera, scene, geometry, material, object); + state.setMaterial(material, frontFaceCW); + let index = geometry.index; + let rangeFactor = 1; + if (material.wireframe === true) { + index = geometries.getWireframeAttribute(geometry); + if (index === void 0) return; + rangeFactor = 2; } - }).then((data) => { - Cache.add(url, data); - const callbacks = loading[url]; - delete loading[url]; - for (let i = 0, il = callbacks.length; i < il; i++) { - const callback = callbacks[i]; - if (callback.onLoad) callback.onLoad(data); + const drawRange = geometry.drawRange; + const position = geometry.attributes.position; + let drawStart = drawRange.start * rangeFactor; + let drawEnd = (drawRange.start + drawRange.count) * rangeFactor; + if (group !== null) { + drawStart = Math.max(drawStart, group.start * rangeFactor); + drawEnd = Math.min(drawEnd, (group.start + group.count) * rangeFactor); } - }).catch((err2) => { - const callbacks = loading[url]; - if (callbacks === void 0) { - this.manager.itemError(url); - throw err2; + if (index !== null) { + drawStart = Math.max(drawStart, 0); + drawEnd = Math.min(drawEnd, index.count); + } else if (position !== void 0 && position !== null) { + drawStart = Math.max(drawStart, 0); + drawEnd = Math.min(drawEnd, position.count); } - delete loading[url]; - for (let i = 0, il = callbacks.length; i < il; i++) { - const callback = callbacks[i]; - if (callback.onError) callback.onError(err2); + const drawCount = drawEnd - drawStart; + if (drawCount < 0 || drawCount === Infinity) return; + bindingStates.setup(object, material, program, geometry, index); + let attribute; + let renderer = bufferRenderer; + if (index !== null) { + attribute = attributes.get(index); + renderer = indexedBufferRenderer; + renderer.setIndex(attribute); } - this.manager.itemError(url); - }).finally(() => { - this.manager.itemEnd(url); - }); - this.manager.itemStart(url); - } - setResponseType(value) { - this.responseType = value; - return this; - } - setMimeType(value) { - this.mimeType = value; - return this; - } -} -class AnimationLoader extends Loader { - static { - __name(this, "AnimationLoader"); - } - constructor(manager) { - super(manager); - } - load(url, onLoad, onProgress, onError) { - const scope = this; - const loader = new FileLoader(this.manager); - loader.setPath(this.path); - loader.setRequestHeader(this.requestHeader); - loader.setWithCredentials(this.withCredentials); - loader.load(url, function(text) { - try { - onLoad(scope.parse(JSON.parse(text))); - } catch (e) { - if (onError) { - onError(e); + if (object.isMesh) { + if (material.wireframe === true) { + state.setLineWidth(material.wireframeLinewidth * getTargetPixelRatio()); + renderer.setMode(_gl.LINES); } else { - console.error(e); + renderer.setMode(_gl.TRIANGLES); } - scope.manager.itemError(url); + } else if (object.isLine) { + let lineWidth = material.linewidth; + if (lineWidth === void 0) lineWidth = 1; + state.setLineWidth(lineWidth * getTargetPixelRatio()); + if (object.isLineSegments) { + renderer.setMode(_gl.LINES); + } else if (object.isLineLoop) { + renderer.setMode(_gl.LINE_LOOP); + } else { + renderer.setMode(_gl.LINE_STRIP); + } + } else if (object.isPoints) { + renderer.setMode(_gl.POINTS); + } else if (object.isSprite) { + renderer.setMode(_gl.TRIANGLES); } - }, onProgress, onError); - } - parse(json) { - const animations = []; - for (let i = 0; i < json.length; i++) { - const clip = AnimationClip.parse(json[i]); - animations.push(clip); - } - return animations; - } -} -class CompressedTextureLoader extends Loader { - static { - __name(this, "CompressedTextureLoader"); - } - constructor(manager) { - super(manager); - } - load(url, onLoad, onProgress, onError) { - const scope = this; - const images = []; - const texture = new CompressedTexture(); - const loader = new FileLoader(this.manager); - loader.setPath(this.path); - loader.setResponseType("arraybuffer"); - loader.setRequestHeader(this.requestHeader); - loader.setWithCredentials(scope.withCredentials); - let loaded = 0; - function loadTexture(i) { - loader.load(url[i], function(buffer) { - const texDatas = scope.parse(buffer, true); - images[i] = { - width: texDatas.width, - height: texDatas.height, - format: texDatas.format, - mipmaps: texDatas.mipmaps - }; - loaded += 1; - if (loaded === 6) { - if (texDatas.mipmapCount === 1) texture.minFilter = LinearFilter; - texture.image = images; - texture.format = texDatas.format; - texture.needsUpdate = true; - if (onLoad) onLoad(texture); + if (object.isBatchedMesh) { + if (object._multiDrawInstances !== null) { + renderer.renderMultiDrawInstances(object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount, object._multiDrawInstances); + } else { + if (!extensions.get("WEBGL_multi_draw")) { + const starts = object._multiDrawStarts; + const counts = object._multiDrawCounts; + const drawCount2 = object._multiDrawCount; + const bytesPerElement = index ? attributes.get(index).bytesPerElement : 1; + const uniforms = properties.get(material).currentProgram.getUniforms(); + for (let i = 0; i < drawCount2; i++) { + uniforms.setValue(_gl, "_gl_DrawID", i); + renderer.render(starts[i] / bytesPerElement, counts[i]); + } + } else { + renderer.renderMultiDraw(object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount); + } } - }, onProgress, onError); + } else if (object.isInstancedMesh) { + renderer.renderInstances(drawStart, drawCount, object.count); + } else if (geometry.isInstancedBufferGeometry) { + const maxInstanceCount = geometry._maxInstanceCount !== void 0 ? geometry._maxInstanceCount : Infinity; + const instanceCount = Math.min(geometry.instanceCount, maxInstanceCount); + renderer.renderInstances(drawStart, drawCount, instanceCount); + } else { + renderer.render(drawStart, drawCount); + } + }; + function prepareMaterial(material, scene, object) { + if (material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false) { + material.side = BackSide; + material.needsUpdate = true; + getProgram(material, scene, object); + material.side = FrontSide; + material.needsUpdate = true; + getProgram(material, scene, object); + material.side = DoubleSide; + } else { + getProgram(material, scene, object); + } } - __name(loadTexture, "loadTexture"); - if (Array.isArray(url)) { - for (let i = 0, il = url.length; i < il; ++i) { - loadTexture(i); + __name(prepareMaterial, "prepareMaterial"); + this.compile = function(scene, camera, targetScene = null) { + if (targetScene === null) targetScene = scene; + currentRenderState = renderStates.get(targetScene); + currentRenderState.init(camera); + renderStateStack.push(currentRenderState); + targetScene.traverseVisible(function(object) { + if (object.isLight && object.layers.test(camera.layers)) { + currentRenderState.pushLight(object); + if (object.castShadow) { + currentRenderState.pushShadow(object); + } + } + }); + if (scene !== targetScene) { + scene.traverseVisible(function(object) { + if (object.isLight && object.layers.test(camera.layers)) { + currentRenderState.pushLight(object); + if (object.castShadow) { + currentRenderState.pushShadow(object); + } + } + }); } - } else { - loader.load(url, function(buffer) { - const texDatas = scope.parse(buffer, true); - if (texDatas.isCubemap) { - const faces = texDatas.mipmaps.length / texDatas.mipmapCount; - for (let f = 0; f < faces; f++) { - images[f] = { mipmaps: [] }; - for (let i = 0; i < texDatas.mipmapCount; i++) { - images[f].mipmaps.push(texDatas.mipmaps[f * texDatas.mipmapCount + i]); - images[f].format = texDatas.format; - images[f].width = texDatas.width; - images[f].height = texDatas.height; + currentRenderState.setupLights(); + const materials2 = /* @__PURE__ */ new Set(); + scene.traverse(function(object) { + if (!(object.isMesh || object.isPoints || object.isLine || object.isSprite)) { + return; + } + const material = object.material; + if (material) { + if (Array.isArray(material)) { + for (let i = 0; i < material.length; i++) { + const material2 = material[i]; + prepareMaterial(material2, targetScene, object); + materials2.add(material2); } + } else { + prepareMaterial(material, targetScene, object); + materials2.add(material); } - texture.image = images; - } else { - texture.image.width = texDatas.width; - texture.image.height = texDatas.height; - texture.mipmaps = texDatas.mipmaps; } - if (texDatas.mipmapCount === 1) { - texture.minFilter = LinearFilter; + }); + renderStateStack.pop(); + currentRenderState = null; + return materials2; + }; + this.compileAsync = function(scene, camera, targetScene = null) { + const materials2 = this.compile(scene, camera, targetScene); + return new Promise((resolve) => { + function checkMaterialsReady() { + materials2.forEach(function(material) { + const materialProperties = properties.get(material); + const program = materialProperties.currentProgram; + if (program.isReady()) { + materials2.delete(material); + } + }); + if (materials2.size === 0) { + resolve(scene); + return; + } + setTimeout(checkMaterialsReady, 10); } - texture.format = texDatas.format; - texture.needsUpdate = true; - if (onLoad) onLoad(texture); - }, onProgress, onError); - } - return texture; - } -} -class ImageLoader extends Loader { - static { - __name(this, "ImageLoader"); - } - constructor(manager) { - super(manager); - } - load(url, onLoad, onProgress, onError) { - if (this.path !== void 0) url = this.path + url; - url = this.manager.resolveURL(url); - const scope = this; - const cached = Cache.get(url); - if (cached !== void 0) { - scope.manager.itemStart(url); - setTimeout(function() { - if (onLoad) onLoad(cached); - scope.manager.itemEnd(url); - }, 0); - return cached; - } - const image = createElementNS("img"); - function onImageLoad() { - removeEventListeners(); - Cache.add(url, this); - if (onLoad) onLoad(this); - scope.manager.itemEnd(url); - } - __name(onImageLoad, "onImageLoad"); - function onImageError(event) { - removeEventListeners(); - if (onError) onError(event); - scope.manager.itemError(url); - scope.manager.itemEnd(url); - } - __name(onImageError, "onImageError"); - function removeEventListeners() { - image.removeEventListener("load", onImageLoad, false); - image.removeEventListener("error", onImageError, false); - } - __name(removeEventListeners, "removeEventListeners"); - image.addEventListener("load", onImageLoad, false); - image.addEventListener("error", onImageError, false); - if (url.slice(0, 5) !== "data:") { - if (this.crossOrigin !== void 0) image.crossOrigin = this.crossOrigin; - } - scope.manager.itemStart(url); - image.src = url; - return image; - } -} -class CubeTextureLoader extends Loader { - static { - __name(this, "CubeTextureLoader"); - } - constructor(manager) { - super(manager); - } - load(urls, onLoad, onProgress, onError) { - const texture = new CubeTexture(); - texture.colorSpace = SRGBColorSpace; - const loader = new ImageLoader(this.manager); - loader.setCrossOrigin(this.crossOrigin); - loader.setPath(this.path); - let loaded = 0; - function loadTexture(i) { - loader.load(urls[i], function(image) { - texture.images[i] = image; - loaded++; - if (loaded === 6) { - texture.needsUpdate = true; - if (onLoad) onLoad(texture); + __name(checkMaterialsReady, "checkMaterialsReady"); + if (extensions.get("KHR_parallel_shader_compile") !== null) { + checkMaterialsReady(); + } else { + setTimeout(checkMaterialsReady, 10); } - }, void 0, onError); + }); + }; + let onAnimationFrameCallback = null; + function onAnimationFrame(time) { + if (onAnimationFrameCallback) onAnimationFrameCallback(time); } - __name(loadTexture, "loadTexture"); - for (let i = 0; i < urls.length; ++i) { - loadTexture(i); + __name(onAnimationFrame, "onAnimationFrame"); + function onXRSessionStart() { + animation.stop(); } - return texture; - } -} -class DataTextureLoader extends Loader { - static { - __name(this, "DataTextureLoader"); - } - constructor(manager) { - super(manager); - } - load(url, onLoad, onProgress, onError) { - const scope = this; - const texture = new DataTexture(); - const loader = new FileLoader(this.manager); - loader.setResponseType("arraybuffer"); - loader.setRequestHeader(this.requestHeader); - loader.setPath(this.path); - loader.setWithCredentials(scope.withCredentials); - loader.load(url, function(buffer) { - let texData; - try { - texData = scope.parse(buffer); - } catch (error) { - if (onError !== void 0) { - onError(error); - } else { - console.error(error); - return; - } - } - if (texData.image !== void 0) { - texture.image = texData.image; - } else if (texData.data !== void 0) { - texture.image.width = texData.width; - texture.image.height = texData.height; - texture.image.data = texData.data; + __name(onXRSessionStart, "onXRSessionStart"); + function onXRSessionEnd() { + animation.start(); + } + __name(onXRSessionEnd, "onXRSessionEnd"); + const animation = new WebGLAnimation(); + animation.setAnimationLoop(onAnimationFrame); + if (typeof self !== "undefined") animation.setContext(self); + this.setAnimationLoop = function(callback) { + onAnimationFrameCallback = callback; + xr.setAnimationLoop(callback); + callback === null ? animation.stop() : animation.start(); + }; + xr.addEventListener("sessionstart", onXRSessionStart); + xr.addEventListener("sessionend", onXRSessionEnd); + this.render = function(scene, camera) { + if (camera !== void 0 && camera.isCamera !== true) { + console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera."); + return; } - texture.wrapS = texData.wrapS !== void 0 ? texData.wrapS : ClampToEdgeWrapping; - texture.wrapT = texData.wrapT !== void 0 ? texData.wrapT : ClampToEdgeWrapping; - texture.magFilter = texData.magFilter !== void 0 ? texData.magFilter : LinearFilter; - texture.minFilter = texData.minFilter !== void 0 ? texData.minFilter : LinearFilter; - texture.anisotropy = texData.anisotropy !== void 0 ? texData.anisotropy : 1; - if (texData.colorSpace !== void 0) { - texture.colorSpace = texData.colorSpace; + if (_isContextLost === true) return; + if (scene.matrixWorldAutoUpdate === true) scene.updateMatrixWorld(); + if (camera.parent === null && camera.matrixWorldAutoUpdate === true) camera.updateMatrixWorld(); + if (xr.enabled === true && xr.isPresenting === true) { + if (xr.cameraAutoUpdate === true) xr.updateCamera(camera); + camera = xr.getCamera(); } - if (texData.flipY !== void 0) { - texture.flipY = texData.flipY; + if (scene.isScene === true) scene.onBeforeRender(_this, scene, camera, _currentRenderTarget); + currentRenderState = renderStates.get(scene, renderStateStack.length); + currentRenderState.init(camera); + renderStateStack.push(currentRenderState); + _projScreenMatrix2.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse); + _frustum2.setFromProjectionMatrix(_projScreenMatrix2); + _localClippingEnabled = this.localClippingEnabled; + _clippingEnabled = clipping.init(this.clippingPlanes, _localClippingEnabled); + currentRenderList = renderLists.get(scene, renderListStack.length); + currentRenderList.init(); + renderListStack.push(currentRenderList); + if (xr.enabled === true && xr.isPresenting === true) { + const depthSensingMesh = _this.xr.getDepthSensingMesh(); + if (depthSensingMesh !== null) { + projectObject(depthSensingMesh, camera, -Infinity, _this.sortObjects); + } } - if (texData.format !== void 0) { - texture.format = texData.format; + projectObject(scene, camera, 0, _this.sortObjects); + currentRenderList.finish(); + if (_this.sortObjects === true) { + currentRenderList.sort(_opaqueSort, _transparentSort); } - if (texData.type !== void 0) { - texture.type = texData.type; + _renderBackground = xr.enabled === false || xr.isPresenting === false || xr.hasDepthSensing() === false; + if (_renderBackground) { + background.addToRenderList(currentRenderList, scene); } - if (texData.mipmaps !== void 0) { - texture.mipmaps = texData.mipmaps; - texture.minFilter = LinearMipmapLinearFilter; + this.info.render.frame++; + if (_clippingEnabled === true) clipping.beginShadows(); + const shadowsArray = currentRenderState.state.shadowsArray; + shadowMap.render(shadowsArray, scene, camera); + if (_clippingEnabled === true) clipping.endShadows(); + if (this.info.autoReset === true) this.info.reset(); + const opaqueObjects = currentRenderList.opaque; + const transmissiveObjects = currentRenderList.transmissive; + currentRenderState.setupLights(); + if (camera.isArrayCamera) { + const cameras = camera.cameras; + if (transmissiveObjects.length > 0) { + for (let i = 0, l = cameras.length; i < l; i++) { + const camera2 = cameras[i]; + renderTransmissionPass(opaqueObjects, transmissiveObjects, scene, camera2); + } + } + if (_renderBackground) background.render(scene); + for (let i = 0, l = cameras.length; i < l; i++) { + const camera2 = cameras[i]; + renderScene(currentRenderList, scene, camera2, camera2.viewport); + } + } else { + if (transmissiveObjects.length > 0) renderTransmissionPass(opaqueObjects, transmissiveObjects, scene, camera); + if (_renderBackground) background.render(scene); + renderScene(currentRenderList, scene, camera); } - if (texData.mipmapCount === 1) { - texture.minFilter = LinearFilter; + if (_currentRenderTarget !== null) { + textures.updateMultisampleRenderTarget(_currentRenderTarget); + textures.updateRenderTargetMipmap(_currentRenderTarget); } - if (texData.generateMipmaps !== void 0) { - texture.generateMipmaps = texData.generateMipmaps; + if (scene.isScene === true) scene.onAfterRender(_this, scene, camera); + bindingStates.resetDefaultState(); + _currentMaterialId = -1; + _currentCamera = null; + renderStateStack.pop(); + if (renderStateStack.length > 0) { + currentRenderState = renderStateStack[renderStateStack.length - 1]; + if (_clippingEnabled === true) clipping.setGlobalState(_this.clippingPlanes, currentRenderState.state.camera); + } else { + currentRenderState = null; } - texture.needsUpdate = true; - if (onLoad) onLoad(texture, texData); - }, onProgress, onError); - return texture; - } -} -class TextureLoader extends Loader { - static { - __name(this, "TextureLoader"); - } - constructor(manager) { - super(manager); - } - load(url, onLoad, onProgress, onError) { - const texture = new Texture(); - const loader = new ImageLoader(this.manager); - loader.setCrossOrigin(this.crossOrigin); - loader.setPath(this.path); - loader.load(url, function(image) { - texture.image = image; - texture.needsUpdate = true; - if (onLoad !== void 0) { - onLoad(texture); + renderListStack.pop(); + if (renderListStack.length > 0) { + currentRenderList = renderListStack[renderListStack.length - 1]; + } else { + currentRenderList = null; + } + }; + function projectObject(object, camera, groupOrder, sortObjects) { + if (object.visible === false) return; + const visible = object.layers.test(camera.layers); + if (visible) { + if (object.isGroup) { + groupOrder = object.renderOrder; + } else if (object.isLOD) { + if (object.autoUpdate === true) object.update(camera); + } else if (object.isLight) { + currentRenderState.pushLight(object); + if (object.castShadow) { + currentRenderState.pushShadow(object); + } + } else if (object.isSprite) { + if (!object.frustumCulled || _frustum2.intersectsSprite(object)) { + if (sortObjects) { + _vector4.setFromMatrixPosition(object.matrixWorld).applyMatrix4(_projScreenMatrix2); + } + const geometry = objects.update(object); + const material = object.material; + if (material.visible) { + currentRenderList.push(object, geometry, material, groupOrder, _vector4.z, null); + } + } + } else if (object.isMesh || object.isLine || object.isPoints) { + if (!object.frustumCulled || _frustum2.intersectsObject(object)) { + const geometry = objects.update(object); + const material = object.material; + if (sortObjects) { + if (object.boundingSphere !== void 0) { + if (object.boundingSphere === null) object.computeBoundingSphere(); + _vector4.copy(object.boundingSphere.center); + } else { + if (geometry.boundingSphere === null) geometry.computeBoundingSphere(); + _vector4.copy(geometry.boundingSphere.center); + } + _vector4.applyMatrix4(object.matrixWorld).applyMatrix4(_projScreenMatrix2); + } + if (Array.isArray(material)) { + const groups = geometry.groups; + for (let i = 0, l = groups.length; i < l; i++) { + const group = groups[i]; + const groupMaterial = material[group.materialIndex]; + if (groupMaterial && groupMaterial.visible) { + currentRenderList.push(object, geometry, groupMaterial, groupOrder, _vector4.z, group); + } + } + } else if (material.visible) { + currentRenderList.push(object, geometry, material, groupOrder, _vector4.z, null); + } + } + } + } + const children = object.children; + for (let i = 0, l = children.length; i < l; i++) { + projectObject(children[i], camera, groupOrder, sortObjects); } - }, onProgress, onError); - return texture; - } -} -class Light extends Object3D { - static { - __name(this, "Light"); - } - constructor(color, intensity = 1) { - super(); - this.isLight = true; - this.type = "Light"; - this.color = new Color(color); - this.intensity = intensity; - } - dispose() { - } - copy(source, recursive) { - super.copy(source, recursive); - this.color.copy(source.color); - this.intensity = source.intensity; - return this; - } - toJSON(meta) { - const data = super.toJSON(meta); - data.object.color = this.color.getHex(); - data.object.intensity = this.intensity; - if (this.groundColor !== void 0) data.object.groundColor = this.groundColor.getHex(); - if (this.distance !== void 0) data.object.distance = this.distance; - if (this.angle !== void 0) data.object.angle = this.angle; - if (this.decay !== void 0) data.object.decay = this.decay; - if (this.penumbra !== void 0) data.object.penumbra = this.penumbra; - if (this.shadow !== void 0) data.object.shadow = this.shadow.toJSON(); - if (this.target !== void 0) data.object.target = this.target.uuid; - return data; - } -} -class HemisphereLight extends Light { - static { - __name(this, "HemisphereLight"); - } - constructor(skyColor, groundColor, intensity) { - super(skyColor, intensity); - this.isHemisphereLight = true; - this.type = "HemisphereLight"; - this.position.copy(Object3D.DEFAULT_UP); - this.updateMatrix(); - this.groundColor = new Color(groundColor); - } - copy(source, recursive) { - super.copy(source, recursive); - this.groundColor.copy(source.groundColor); - return this; - } -} -const _projScreenMatrix$1 = /* @__PURE__ */ new Matrix4(); -const _lightPositionWorld$1 = /* @__PURE__ */ new Vector3(); -const _lookTarget$1 = /* @__PURE__ */ new Vector3(); -class LightShadow { - static { - __name(this, "LightShadow"); - } - constructor(camera) { - this.camera = camera; - this.intensity = 1; - this.bias = 0; - this.normalBias = 0; - this.radius = 1; - this.blurSamples = 8; - this.mapSize = new Vector2(512, 512); - this.map = null; - this.mapPass = null; - this.matrix = new Matrix4(); - this.autoUpdate = true; - this.needsUpdate = false; - this._frustum = new Frustum(); - this._frameExtents = new Vector2(1, 1); - this._viewportCount = 1; - this._viewports = [ - new Vector4(0, 0, 1, 1) - ]; - } - getViewportCount() { - return this._viewportCount; - } - getFrustum() { - return this._frustum; - } - updateMatrices(light) { - const shadowCamera = this.camera; - const shadowMatrix = this.matrix; - _lightPositionWorld$1.setFromMatrixPosition(light.matrixWorld); - shadowCamera.position.copy(_lightPositionWorld$1); - _lookTarget$1.setFromMatrixPosition(light.target.matrixWorld); - shadowCamera.lookAt(_lookTarget$1); - shadowCamera.updateMatrixWorld(); - _projScreenMatrix$1.multiplyMatrices(shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse); - this._frustum.setFromProjectionMatrix(_projScreenMatrix$1); - shadowMatrix.set( - 0.5, - 0, - 0, - 0.5, - 0, - 0.5, - 0, - 0.5, - 0, - 0, - 0.5, - 0.5, - 0, - 0, - 0, - 1 - ); - shadowMatrix.multiply(_projScreenMatrix$1); - } - getViewport(viewportIndex) { - return this._viewports[viewportIndex]; - } - getFrameExtents() { - return this._frameExtents; - } - dispose() { - if (this.map) { - this.map.dispose(); - } - if (this.mapPass) { - this.mapPass.dispose(); - } - } - copy(source) { - this.camera = source.camera.clone(); - this.intensity = source.intensity; - this.bias = source.bias; - this.radius = source.radius; - this.mapSize.copy(source.mapSize); - return this; - } - clone() { - return new this.constructor().copy(this); - } - toJSON() { - const object = {}; - if (this.intensity !== 1) object.intensity = this.intensity; - if (this.bias !== 0) object.bias = this.bias; - if (this.normalBias !== 0) object.normalBias = this.normalBias; - if (this.radius !== 1) object.radius = this.radius; - if (this.mapSize.x !== 512 || this.mapSize.y !== 512) object.mapSize = this.mapSize.toArray(); - object.camera = this.camera.toJSON(false).object; - delete object.camera.matrix; - return object; - } -} -class SpotLightShadow extends LightShadow { - static { - __name(this, "SpotLightShadow"); - } - constructor() { - super(new PerspectiveCamera(50, 1, 0.5, 500)); - this.isSpotLightShadow = true; - this.focus = 1; - } - updateMatrices(light) { - const camera = this.camera; - const fov2 = RAD2DEG * 2 * light.angle * this.focus; - const aspect2 = this.mapSize.width / this.mapSize.height; - const far = light.distance || camera.far; - if (fov2 !== camera.fov || aspect2 !== camera.aspect || far !== camera.far) { - camera.fov = fov2; - camera.aspect = aspect2; - camera.far = far; - camera.updateProjectionMatrix(); - } - super.updateMatrices(light); - } - copy(source) { - super.copy(source); - this.focus = source.focus; - return this; - } -} -class SpotLight extends Light { - static { - __name(this, "SpotLight"); - } - constructor(color, intensity, distance = 0, angle = Math.PI / 3, penumbra = 0, decay = 2) { - super(color, intensity); - this.isSpotLight = true; - this.type = "SpotLight"; - this.position.copy(Object3D.DEFAULT_UP); - this.updateMatrix(); - this.target = new Object3D(); - this.distance = distance; - this.angle = angle; - this.penumbra = penumbra; - this.decay = decay; - this.map = null; - this.shadow = new SpotLightShadow(); - } - get power() { - return this.intensity * Math.PI; - } - set power(power) { - this.intensity = power / Math.PI; - } - dispose() { - this.shadow.dispose(); - } - copy(source, recursive) { - super.copy(source, recursive); - this.distance = source.distance; - this.angle = source.angle; - this.penumbra = source.penumbra; - this.decay = source.decay; - this.target = source.target.clone(); - this.shadow = source.shadow.clone(); - return this; - } -} -const _projScreenMatrix = /* @__PURE__ */ new Matrix4(); -const _lightPositionWorld = /* @__PURE__ */ new Vector3(); -const _lookTarget = /* @__PURE__ */ new Vector3(); -class PointLightShadow extends LightShadow { - static { - __name(this, "PointLightShadow"); - } - constructor() { - super(new PerspectiveCamera(90, 1, 0.5, 500)); - this.isPointLightShadow = true; - this._frameExtents = new Vector2(4, 2); - this._viewportCount = 6; - this._viewports = [ - // These viewports map a cube-map onto a 2D texture with the - // following orientation: - // - // xzXZ - // y Y - // - // X - Positive x direction - // x - Negative x direction - // Y - Positive y direction - // y - Negative y direction - // Z - Positive z direction - // z - Negative z direction - // positive X - new Vector4(2, 1, 1, 1), - // negative X - new Vector4(0, 1, 1, 1), - // positive Z - new Vector4(3, 1, 1, 1), - // negative Z - new Vector4(1, 1, 1, 1), - // positive Y - new Vector4(3, 0, 1, 1), - // negative Y - new Vector4(1, 0, 1, 1) - ]; - this._cubeDirections = [ - new Vector3(1, 0, 0), - new Vector3(-1, 0, 0), - new Vector3(0, 0, 1), - new Vector3(0, 0, -1), - new Vector3(0, 1, 0), - new Vector3(0, -1, 0) - ]; - this._cubeUps = [ - new Vector3(0, 1, 0), - new Vector3(0, 1, 0), - new Vector3(0, 1, 0), - new Vector3(0, 1, 0), - new Vector3(0, 0, 1), - new Vector3(0, 0, -1) - ]; - } - updateMatrices(light, viewportIndex = 0) { - const camera = this.camera; - const shadowMatrix = this.matrix; - const far = light.distance || camera.far; - if (far !== camera.far) { - camera.far = far; - camera.updateProjectionMatrix(); - } - _lightPositionWorld.setFromMatrixPosition(light.matrixWorld); - camera.position.copy(_lightPositionWorld); - _lookTarget.copy(camera.position); - _lookTarget.add(this._cubeDirections[viewportIndex]); - camera.up.copy(this._cubeUps[viewportIndex]); - camera.lookAt(_lookTarget); - camera.updateMatrixWorld(); - shadowMatrix.makeTranslation(-_lightPositionWorld.x, -_lightPositionWorld.y, -_lightPositionWorld.z); - _projScreenMatrix.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse); - this._frustum.setFromProjectionMatrix(_projScreenMatrix); - } -} -class PointLight extends Light { - static { - __name(this, "PointLight"); - } - constructor(color, intensity, distance = 0, decay = 2) { - super(color, intensity); - this.isPointLight = true; - this.type = "PointLight"; - this.distance = distance; - this.decay = decay; - this.shadow = new PointLightShadow(); - } - get power() { - return this.intensity * 4 * Math.PI; - } - set power(power) { - this.intensity = power / (4 * Math.PI); - } - dispose() { - this.shadow.dispose(); - } - copy(source, recursive) { - super.copy(source, recursive); - this.distance = source.distance; - this.decay = source.decay; - this.shadow = source.shadow.clone(); - return this; - } -} -class DirectionalLightShadow extends LightShadow { - static { - __name(this, "DirectionalLightShadow"); - } - constructor() { - super(new OrthographicCamera(-5, 5, 5, -5, 0.5, 500)); - this.isDirectionalLightShadow = true; - } -} -class DirectionalLight extends Light { - static { - __name(this, "DirectionalLight"); - } - constructor(color, intensity) { - super(color, intensity); - this.isDirectionalLight = true; - this.type = "DirectionalLight"; - this.position.copy(Object3D.DEFAULT_UP); - this.updateMatrix(); - this.target = new Object3D(); - this.shadow = new DirectionalLightShadow(); - } - dispose() { - this.shadow.dispose(); - } - copy(source) { - super.copy(source); - this.target = source.target.clone(); - this.shadow = source.shadow.clone(); - return this; - } -} -class AmbientLight extends Light { - static { - __name(this, "AmbientLight"); - } - constructor(color, intensity) { - super(color, intensity); - this.isAmbientLight = true; - this.type = "AmbientLight"; - } -} -class RectAreaLight extends Light { - static { - __name(this, "RectAreaLight"); - } - constructor(color, intensity, width = 10, height = 10) { - super(color, intensity); - this.isRectAreaLight = true; - this.type = "RectAreaLight"; - this.width = width; - this.height = height; - } - get power() { - return this.intensity * this.width * this.height * Math.PI; - } - set power(power) { - this.intensity = power / (this.width * this.height * Math.PI); - } - copy(source) { - super.copy(source); - this.width = source.width; - this.height = source.height; - return this; - } - toJSON(meta) { - const data = super.toJSON(meta); - data.object.width = this.width; - data.object.height = this.height; - return data; - } -} -class SphericalHarmonics3 { - static { - __name(this, "SphericalHarmonics3"); - } - constructor() { - this.isSphericalHarmonics3 = true; - this.coefficients = []; - for (let i = 0; i < 9; i++) { - this.coefficients.push(new Vector3()); } - } - set(coefficients) { - for (let i = 0; i < 9; i++) { - this.coefficients[i].copy(coefficients[i]); + __name(projectObject, "projectObject"); + function renderScene(currentRenderList2, scene, camera, viewport) { + const opaqueObjects = currentRenderList2.opaque; + const transmissiveObjects = currentRenderList2.transmissive; + const transparentObjects = currentRenderList2.transparent; + currentRenderState.setupLightsView(camera); + if (_clippingEnabled === true) clipping.setGlobalState(_this.clippingPlanes, camera); + if (viewport) state.viewport(_currentViewport.copy(viewport)); + if (opaqueObjects.length > 0) renderObjects(opaqueObjects, scene, camera); + if (transmissiveObjects.length > 0) renderObjects(transmissiveObjects, scene, camera); + if (transparentObjects.length > 0) renderObjects(transparentObjects, scene, camera); + state.buffers.depth.setTest(true); + state.buffers.depth.setMask(true); + state.buffers.color.setMask(true); + state.setPolygonOffset(false); } - return this; - } - zero() { - for (let i = 0; i < 9; i++) { - this.coefficients[i].set(0, 0, 0); + __name(renderScene, "renderScene"); + function renderTransmissionPass(opaqueObjects, transmissiveObjects, scene, camera) { + const overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null; + if (overrideMaterial !== null) { + return; + } + if (currentRenderState.state.transmissionRenderTarget[camera.id] === void 0) { + currentRenderState.state.transmissionRenderTarget[camera.id] = new WebGLRenderTarget(1, 1, { + generateMipmaps: true, + type: extensions.has("EXT_color_buffer_half_float") || extensions.has("EXT_color_buffer_float") ? HalfFloatType : UnsignedByteType, + minFilter: LinearMipmapLinearFilter, + samples: 4, + stencilBuffer: stencil, + resolveDepthBuffer: false, + resolveStencilBuffer: false, + colorSpace: ColorManagement.workingColorSpace + }); + } + const transmissionRenderTarget = currentRenderState.state.transmissionRenderTarget[camera.id]; + const activeViewport = camera.viewport || _currentViewport; + transmissionRenderTarget.setSize(activeViewport.z, activeViewport.w); + const currentRenderTarget = _this.getRenderTarget(); + _this.setRenderTarget(transmissionRenderTarget); + _this.getClearColor(_currentClearColor); + _currentClearAlpha = _this.getClearAlpha(); + if (_currentClearAlpha < 1) _this.setClearColor(16777215, 0.5); + _this.clear(); + if (_renderBackground) background.render(scene); + const currentToneMapping = _this.toneMapping; + _this.toneMapping = NoToneMapping; + const currentCameraViewport = camera.viewport; + if (camera.viewport !== void 0) camera.viewport = void 0; + currentRenderState.setupLightsView(camera); + if (_clippingEnabled === true) clipping.setGlobalState(_this.clippingPlanes, camera); + renderObjects(opaqueObjects, scene, camera); + textures.updateMultisampleRenderTarget(transmissionRenderTarget); + textures.updateRenderTargetMipmap(transmissionRenderTarget); + if (extensions.has("WEBGL_multisampled_render_to_texture") === false) { + let renderTargetNeedsUpdate = false; + for (let i = 0, l = transmissiveObjects.length; i < l; i++) { + const renderItem = transmissiveObjects[i]; + const object = renderItem.object; + const geometry = renderItem.geometry; + const material = renderItem.material; + const group = renderItem.group; + if (material.side === DoubleSide && object.layers.test(camera.layers)) { + const currentSide = material.side; + material.side = BackSide; + material.needsUpdate = true; + renderObject(object, scene, camera, geometry, material, group); + material.side = currentSide; + material.needsUpdate = true; + renderTargetNeedsUpdate = true; + } + } + if (renderTargetNeedsUpdate === true) { + textures.updateMultisampleRenderTarget(transmissionRenderTarget); + textures.updateRenderTargetMipmap(transmissionRenderTarget); + } + } + _this.setRenderTarget(currentRenderTarget); + _this.setClearColor(_currentClearColor, _currentClearAlpha); + if (currentCameraViewport !== void 0) camera.viewport = currentCameraViewport; + _this.toneMapping = currentToneMapping; } - return this; - } - // get the radiance in the direction of the normal - // target is a Vector3 - getAt(normal, target) { - const x = normal.x, y = normal.y, z = normal.z; - const coeff = this.coefficients; - target.copy(coeff[0]).multiplyScalar(0.282095); - target.addScaledVector(coeff[1], 0.488603 * y); - target.addScaledVector(coeff[2], 0.488603 * z); - target.addScaledVector(coeff[3], 0.488603 * x); - target.addScaledVector(coeff[4], 1.092548 * (x * y)); - target.addScaledVector(coeff[5], 1.092548 * (y * z)); - target.addScaledVector(coeff[6], 0.315392 * (3 * z * z - 1)); - target.addScaledVector(coeff[7], 1.092548 * (x * z)); - target.addScaledVector(coeff[8], 0.546274 * (x * x - y * y)); - return target; - } - // get the irradiance (radiance convolved with cosine lobe) in the direction of the normal - // target is a Vector3 - // https://graphics.stanford.edu/papers/envmap/envmap.pdf - getIrradianceAt(normal, target) { - const x = normal.x, y = normal.y, z = normal.z; - const coeff = this.coefficients; - target.copy(coeff[0]).multiplyScalar(0.886227); - target.addScaledVector(coeff[1], 2 * 0.511664 * y); - target.addScaledVector(coeff[2], 2 * 0.511664 * z); - target.addScaledVector(coeff[3], 2 * 0.511664 * x); - target.addScaledVector(coeff[4], 2 * 0.429043 * x * y); - target.addScaledVector(coeff[5], 2 * 0.429043 * y * z); - target.addScaledVector(coeff[6], 0.743125 * z * z - 0.247708); - target.addScaledVector(coeff[7], 2 * 0.429043 * x * z); - target.addScaledVector(coeff[8], 0.429043 * (x * x - y * y)); - return target; - } - add(sh) { - for (let i = 0; i < 9; i++) { - this.coefficients[i].add(sh.coefficients[i]); + __name(renderTransmissionPass, "renderTransmissionPass"); + function renderObjects(renderList, scene, camera) { + const overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null; + for (let i = 0, l = renderList.length; i < l; i++) { + const renderItem = renderList[i]; + const object = renderItem.object; + const geometry = renderItem.geometry; + const material = overrideMaterial === null ? renderItem.material : overrideMaterial; + const group = renderItem.group; + if (object.layers.test(camera.layers)) { + renderObject(object, scene, camera, geometry, material, group); + } + } } - return this; - } - addScaledSH(sh, s) { - for (let i = 0; i < 9; i++) { - this.coefficients[i].addScaledVector(sh.coefficients[i], s); + __name(renderObjects, "renderObjects"); + function renderObject(object, scene, camera, geometry, material, group) { + object.onBeforeRender(_this, scene, camera, geometry, material, group); + object.modelViewMatrix.multiplyMatrices(camera.matrixWorldInverse, object.matrixWorld); + object.normalMatrix.getNormalMatrix(object.modelViewMatrix); + material.onBeforeRender(_this, scene, camera, geometry, object, group); + if (material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false) { + material.side = BackSide; + material.needsUpdate = true; + _this.renderBufferDirect(camera, scene, geometry, material, object, group); + material.side = FrontSide; + material.needsUpdate = true; + _this.renderBufferDirect(camera, scene, geometry, material, object, group); + material.side = DoubleSide; + } else { + _this.renderBufferDirect(camera, scene, geometry, material, object, group); + } + object.onAfterRender(_this, scene, camera, geometry, material, group); } - return this; - } - scale(s) { - for (let i = 0; i < 9; i++) { - this.coefficients[i].multiplyScalar(s); + __name(renderObject, "renderObject"); + function getProgram(material, scene, object) { + if (scene.isScene !== true) scene = _emptyScene; + const materialProperties = properties.get(material); + const lights = currentRenderState.state.lights; + const shadowsArray = currentRenderState.state.shadowsArray; + const lightsStateVersion = lights.state.version; + const parameters2 = programCache.getParameters(material, lights.state, shadowsArray, scene, object); + const programCacheKey = programCache.getProgramCacheKey(parameters2); + let programs = materialProperties.programs; + materialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null; + materialProperties.fog = scene.fog; + materialProperties.envMap = (material.isMeshStandardMaterial ? cubeuvmaps : cubemaps).get(material.envMap || materialProperties.environment); + materialProperties.envMapRotation = materialProperties.environment !== null && material.envMap === null ? scene.environmentRotation : material.envMapRotation; + if (programs === void 0) { + material.addEventListener("dispose", onMaterialDispose); + programs = /* @__PURE__ */ new Map(); + materialProperties.programs = programs; + } + let program = programs.get(programCacheKey); + if (program !== void 0) { + if (materialProperties.currentProgram === program && materialProperties.lightsStateVersion === lightsStateVersion) { + updateCommonMaterialProperties(material, parameters2); + return program; + } + } else { + parameters2.uniforms = programCache.getUniforms(material); + material.onBeforeCompile(parameters2, _this); + program = programCache.acquireProgram(parameters2, programCacheKey); + programs.set(programCacheKey, program); + materialProperties.uniforms = parameters2.uniforms; + } + const uniforms = materialProperties.uniforms; + if (!material.isShaderMaterial && !material.isRawShaderMaterial || material.clipping === true) { + uniforms.clippingPlanes = clipping.uniform; + } + updateCommonMaterialProperties(material, parameters2); + materialProperties.needsLights = materialNeedsLights(material); + materialProperties.lightsStateVersion = lightsStateVersion; + if (materialProperties.needsLights) { + uniforms.ambientLightColor.value = lights.state.ambient; + uniforms.lightProbe.value = lights.state.probe; + uniforms.directionalLights.value = lights.state.directional; + uniforms.directionalLightShadows.value = lights.state.directionalShadow; + uniforms.spotLights.value = lights.state.spot; + uniforms.spotLightShadows.value = lights.state.spotShadow; + uniforms.rectAreaLights.value = lights.state.rectArea; + uniforms.ltc_1.value = lights.state.rectAreaLTC1; + uniforms.ltc_2.value = lights.state.rectAreaLTC2; + uniforms.pointLights.value = lights.state.point; + uniforms.pointLightShadows.value = lights.state.pointShadow; + uniforms.hemisphereLights.value = lights.state.hemi; + uniforms.directionalShadowMap.value = lights.state.directionalShadowMap; + uniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix; + uniforms.spotShadowMap.value = lights.state.spotShadowMap; + uniforms.spotLightMatrix.value = lights.state.spotLightMatrix; + uniforms.spotLightMap.value = lights.state.spotLightMap; + uniforms.pointShadowMap.value = lights.state.pointShadowMap; + uniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix; + } + materialProperties.currentProgram = program; + materialProperties.uniformsList = null; + return program; } - return this; - } - lerp(sh, alpha) { - for (let i = 0; i < 9; i++) { - this.coefficients[i].lerp(sh.coefficients[i], alpha); + __name(getProgram, "getProgram"); + function getUniformList(materialProperties) { + if (materialProperties.uniformsList === null) { + const progUniforms = materialProperties.currentProgram.getUniforms(); + materialProperties.uniformsList = WebGLUniforms.seqWithValue(progUniforms.seq, materialProperties.uniforms); + } + return materialProperties.uniformsList; } - return this; - } - equals(sh) { - for (let i = 0; i < 9; i++) { - if (!this.coefficients[i].equals(sh.coefficients[i])) { - return false; + __name(getUniformList, "getUniformList"); + function updateCommonMaterialProperties(material, parameters2) { + const materialProperties = properties.get(material); + materialProperties.outputColorSpace = parameters2.outputColorSpace; + materialProperties.batching = parameters2.batching; + materialProperties.batchingColor = parameters2.batchingColor; + materialProperties.instancing = parameters2.instancing; + materialProperties.instancingColor = parameters2.instancingColor; + materialProperties.instancingMorph = parameters2.instancingMorph; + materialProperties.skinning = parameters2.skinning; + materialProperties.morphTargets = parameters2.morphTargets; + materialProperties.morphNormals = parameters2.morphNormals; + materialProperties.morphColors = parameters2.morphColors; + materialProperties.morphTargetsCount = parameters2.morphTargetsCount; + materialProperties.numClippingPlanes = parameters2.numClippingPlanes; + materialProperties.numIntersection = parameters2.numClipIntersection; + materialProperties.vertexAlphas = parameters2.vertexAlphas; + materialProperties.vertexTangents = parameters2.vertexTangents; + materialProperties.toneMapping = parameters2.toneMapping; + } + __name(updateCommonMaterialProperties, "updateCommonMaterialProperties"); + function setProgram(camera, scene, geometry, material, object) { + if (scene.isScene !== true) scene = _emptyScene; + textures.resetTextureUnits(); + const fog = scene.fog; + const environment = material.isMeshStandardMaterial ? scene.environment : null; + const colorSpace = _currentRenderTarget === null ? _this.outputColorSpace : _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace; + const envMap = (material.isMeshStandardMaterial ? cubeuvmaps : cubemaps).get(material.envMap || environment); + const vertexAlphas = material.vertexColors === true && !!geometry.attributes.color && geometry.attributes.color.itemSize === 4; + const vertexTangents = !!geometry.attributes.tangent && (!!material.normalMap || material.anisotropy > 0); + const morphTargets = !!geometry.morphAttributes.position; + const morphNormals = !!geometry.morphAttributes.normal; + const morphColors = !!geometry.morphAttributes.color; + let toneMapping = NoToneMapping; + if (material.toneMapped) { + if (_currentRenderTarget === null || _currentRenderTarget.isXRRenderTarget === true) { + toneMapping = _this.toneMapping; + } + } + const morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color; + const morphTargetsCount = morphAttribute !== void 0 ? morphAttribute.length : 0; + const materialProperties = properties.get(material); + const lights = currentRenderState.state.lights; + if (_clippingEnabled === true) { + if (_localClippingEnabled === true || camera !== _currentCamera) { + const useCache = camera === _currentCamera && material.id === _currentMaterialId; + clipping.setState(material, camera, useCache); + } + } + let needsProgramChange = false; + if (material.version === materialProperties.__version) { + if (materialProperties.needsLights && materialProperties.lightsStateVersion !== lights.state.version) { + needsProgramChange = true; + } else if (materialProperties.outputColorSpace !== colorSpace) { + needsProgramChange = true; + } else if (object.isBatchedMesh && materialProperties.batching === false) { + needsProgramChange = true; + } else if (!object.isBatchedMesh && materialProperties.batching === true) { + needsProgramChange = true; + } else if (object.isBatchedMesh && materialProperties.batchingColor === true && object.colorTexture === null) { + needsProgramChange = true; + } else if (object.isBatchedMesh && materialProperties.batchingColor === false && object.colorTexture !== null) { + needsProgramChange = true; + } else if (object.isInstancedMesh && materialProperties.instancing === false) { + needsProgramChange = true; + } else if (!object.isInstancedMesh && materialProperties.instancing === true) { + needsProgramChange = true; + } else if (object.isSkinnedMesh && materialProperties.skinning === false) { + needsProgramChange = true; + } else if (!object.isSkinnedMesh && materialProperties.skinning === true) { + needsProgramChange = true; + } else if (object.isInstancedMesh && materialProperties.instancingColor === true && object.instanceColor === null) { + needsProgramChange = true; + } else if (object.isInstancedMesh && materialProperties.instancingColor === false && object.instanceColor !== null) { + needsProgramChange = true; + } else if (object.isInstancedMesh && materialProperties.instancingMorph === true && object.morphTexture === null) { + needsProgramChange = true; + } else if (object.isInstancedMesh && materialProperties.instancingMorph === false && object.morphTexture !== null) { + needsProgramChange = true; + } else if (materialProperties.envMap !== envMap) { + needsProgramChange = true; + } else if (material.fog === true && materialProperties.fog !== fog) { + needsProgramChange = true; + } else if (materialProperties.numClippingPlanes !== void 0 && (materialProperties.numClippingPlanes !== clipping.numPlanes || materialProperties.numIntersection !== clipping.numIntersection)) { + needsProgramChange = true; + } else if (materialProperties.vertexAlphas !== vertexAlphas) { + needsProgramChange = true; + } else if (materialProperties.vertexTangents !== vertexTangents) { + needsProgramChange = true; + } else if (materialProperties.morphTargets !== morphTargets) { + needsProgramChange = true; + } else if (materialProperties.morphNormals !== morphNormals) { + needsProgramChange = true; + } else if (materialProperties.morphColors !== morphColors) { + needsProgramChange = true; + } else if (materialProperties.toneMapping !== toneMapping) { + needsProgramChange = true; + } else if (materialProperties.morphTargetsCount !== morphTargetsCount) { + needsProgramChange = true; + } + } else { + needsProgramChange = true; + materialProperties.__version = material.version; + } + let program = materialProperties.currentProgram; + if (needsProgramChange === true) { + program = getProgram(material, scene, object); + } + let refreshProgram = false; + let refreshMaterial = false; + let refreshLights = false; + const p_uniforms = program.getUniforms(), m_uniforms = materialProperties.uniforms; + if (state.useProgram(program.program)) { + refreshProgram = true; + refreshMaterial = true; + refreshLights = true; + } + if (material.id !== _currentMaterialId) { + _currentMaterialId = material.id; + refreshMaterial = true; + } + if (refreshProgram || _currentCamera !== camera) { + const reverseDepthBuffer2 = state.buffers.depth.getReversed(); + if (reverseDepthBuffer2) { + _currentProjectionMatrix.copy(camera.projectionMatrix); + toNormalizedProjectionMatrix(_currentProjectionMatrix); + toReversedProjectionMatrix(_currentProjectionMatrix); + p_uniforms.setValue(_gl, "projectionMatrix", _currentProjectionMatrix); + } else { + p_uniforms.setValue(_gl, "projectionMatrix", camera.projectionMatrix); + } + p_uniforms.setValue(_gl, "viewMatrix", camera.matrixWorldInverse); + const uCamPos = p_uniforms.map.cameraPosition; + if (uCamPos !== void 0) { + uCamPos.setValue(_gl, _vector32.setFromMatrixPosition(camera.matrixWorld)); + } + if (capabilities.logarithmicDepthBuffer) { + p_uniforms.setValue( + _gl, + "logDepthBufFC", + 2 / (Math.log(camera.far + 1) / Math.LN2) + ); + } + if (material.isMeshPhongMaterial || material.isMeshToonMaterial || material.isMeshLambertMaterial || material.isMeshBasicMaterial || material.isMeshStandardMaterial || material.isShaderMaterial) { + p_uniforms.setValue(_gl, "isOrthographic", camera.isOrthographicCamera === true); + } + if (_currentCamera !== camera) { + _currentCamera = camera; + refreshMaterial = true; + refreshLights = true; + } + } + if (object.isSkinnedMesh) { + p_uniforms.setOptional(_gl, object, "bindMatrix"); + p_uniforms.setOptional(_gl, object, "bindMatrixInverse"); + const skeleton = object.skeleton; + if (skeleton) { + if (skeleton.boneTexture === null) skeleton.computeBoneTexture(); + p_uniforms.setValue(_gl, "boneTexture", skeleton.boneTexture, textures); + } + } + if (object.isBatchedMesh) { + p_uniforms.setOptional(_gl, object, "batchingTexture"); + p_uniforms.setValue(_gl, "batchingTexture", object._matricesTexture, textures); + p_uniforms.setOptional(_gl, object, "batchingIdTexture"); + p_uniforms.setValue(_gl, "batchingIdTexture", object._indirectTexture, textures); + p_uniforms.setOptional(_gl, object, "batchingColorTexture"); + if (object._colorsTexture !== null) { + p_uniforms.setValue(_gl, "batchingColorTexture", object._colorsTexture, textures); + } + } + const morphAttributes = geometry.morphAttributes; + if (morphAttributes.position !== void 0 || morphAttributes.normal !== void 0 || morphAttributes.color !== void 0) { + morphtargets.update(object, geometry, program); + } + if (refreshMaterial || materialProperties.receiveShadow !== object.receiveShadow) { + materialProperties.receiveShadow = object.receiveShadow; + p_uniforms.setValue(_gl, "receiveShadow", object.receiveShadow); + } + if (material.isMeshGouraudMaterial && material.envMap !== null) { + m_uniforms.envMap.value = envMap; + m_uniforms.flipEnvMap.value = envMap.isCubeTexture && envMap.isRenderTargetTexture === false ? -1 : 1; + } + if (material.isMeshStandardMaterial && material.envMap === null && scene.environment !== null) { + m_uniforms.envMapIntensity.value = scene.environmentIntensity; + } + if (refreshMaterial) { + p_uniforms.setValue(_gl, "toneMappingExposure", _this.toneMappingExposure); + if (materialProperties.needsLights) { + markUniformsLightsNeedsUpdate(m_uniforms, refreshLights); + } + if (fog && material.fog === true) { + materials.refreshFogUniforms(m_uniforms, fog); + } + materials.refreshMaterialUniforms(m_uniforms, material, _pixelRatio, _height, currentRenderState.state.transmissionRenderTarget[camera.id]); + WebGLUniforms.upload(_gl, getUniformList(materialProperties), m_uniforms, textures); + } + if (material.isShaderMaterial && material.uniformsNeedUpdate === true) { + WebGLUniforms.upload(_gl, getUniformList(materialProperties), m_uniforms, textures); + material.uniformsNeedUpdate = false; + } + if (material.isSpriteMaterial) { + p_uniforms.setValue(_gl, "center", object.center); + } + p_uniforms.setValue(_gl, "modelViewMatrix", object.modelViewMatrix); + p_uniforms.setValue(_gl, "normalMatrix", object.normalMatrix); + p_uniforms.setValue(_gl, "modelMatrix", object.matrixWorld); + if (material.isShaderMaterial || material.isRawShaderMaterial) { + const groups = material.uniformsGroups; + for (let i = 0, l = groups.length; i < l; i++) { + const group = groups[i]; + uniformsGroups.update(group, program); + uniformsGroups.bind(group, program); + } } + return program; } - return true; - } - copy(sh) { - return this.set(sh.coefficients); - } - clone() { - return new this.constructor().copy(this); - } - fromArray(array, offset = 0) { - const coefficients = this.coefficients; - for (let i = 0; i < 9; i++) { - coefficients[i].fromArray(array, offset + i * 3); + __name(setProgram, "setProgram"); + function markUniformsLightsNeedsUpdate(uniforms, value) { + uniforms.ambientLightColor.needsUpdate = value; + uniforms.lightProbe.needsUpdate = value; + uniforms.directionalLights.needsUpdate = value; + uniforms.directionalLightShadows.needsUpdate = value; + uniforms.pointLights.needsUpdate = value; + uniforms.pointLightShadows.needsUpdate = value; + uniforms.spotLights.needsUpdate = value; + uniforms.spotLightShadows.needsUpdate = value; + uniforms.rectAreaLights.needsUpdate = value; + uniforms.hemisphereLights.needsUpdate = value; } - return this; - } - toArray(array = [], offset = 0) { - const coefficients = this.coefficients; - for (let i = 0; i < 9; i++) { - coefficients[i].toArray(array, offset + i * 3); + __name(markUniformsLightsNeedsUpdate, "markUniformsLightsNeedsUpdate"); + function materialNeedsLights(material) { + return material.isMeshLambertMaterial || material.isMeshToonMaterial || material.isMeshPhongMaterial || material.isMeshStandardMaterial || material.isShadowMaterial || material.isShaderMaterial && material.lights === true; } - return array; - } - // evaluate the basis functions - // shBasis is an Array[ 9 ] - static getBasisAt(normal, shBasis) { - const x = normal.x, y = normal.y, z = normal.z; - shBasis[0] = 0.282095; - shBasis[1] = 0.488603 * y; - shBasis[2] = 0.488603 * z; - shBasis[3] = 0.488603 * x; - shBasis[4] = 1.092548 * x * y; - shBasis[5] = 1.092548 * y * z; - shBasis[6] = 0.315392 * (3 * z * z - 1); - shBasis[7] = 1.092548 * x * z; - shBasis[8] = 0.546274 * (x * x - y * y); - } -} -class LightProbe extends Light { - static { - __name(this, "LightProbe"); - } - constructor(sh = new SphericalHarmonics3(), intensity = 1) { - super(void 0, intensity); - this.isLightProbe = true; - this.sh = sh; - } - copy(source) { - super.copy(source); - this.sh.copy(source.sh); - return this; - } - fromJSON(json) { - this.intensity = json.intensity; - this.sh.fromArray(json.sh); - return this; - } - toJSON(meta) { - const data = super.toJSON(meta); - data.object.sh = this.sh.toArray(); - return data; - } -} -class MaterialLoader extends Loader { - static { - __name(this, "MaterialLoader"); - } - constructor(manager) { - super(manager); - this.textures = {}; - } - load(url, onLoad, onProgress, onError) { - const scope = this; - const loader = new FileLoader(scope.manager); - loader.setPath(scope.path); - loader.setRequestHeader(scope.requestHeader); - loader.setWithCredentials(scope.withCredentials); - loader.load(url, function(text) { - try { - onLoad(scope.parse(JSON.parse(text))); - } catch (e) { - if (onError) { - onError(e); + __name(materialNeedsLights, "materialNeedsLights"); + this.getActiveCubeFace = function() { + return _currentActiveCubeFace; + }; + this.getActiveMipmapLevel = function() { + return _currentActiveMipmapLevel; + }; + this.getRenderTarget = function() { + return _currentRenderTarget; + }; + this.setRenderTargetTextures = function(renderTarget, colorTexture, depthTexture) { + properties.get(renderTarget.texture).__webglTexture = colorTexture; + properties.get(renderTarget.depthTexture).__webglTexture = depthTexture; + const renderTargetProperties = properties.get(renderTarget); + renderTargetProperties.__hasExternalTextures = true; + renderTargetProperties.__autoAllocateDepthBuffer = depthTexture === void 0; + if (!renderTargetProperties.__autoAllocateDepthBuffer) { + if (extensions.has("WEBGL_multisampled_render_to_texture") === true) { + console.warn("THREE.WebGLRenderer: Render-to-texture extension was disabled because an external texture was provided"); + renderTargetProperties.__useRenderToTexture = false; + } + } + }; + this.setRenderTargetFramebuffer = function(renderTarget, defaultFramebuffer) { + const renderTargetProperties = properties.get(renderTarget); + renderTargetProperties.__webglFramebuffer = defaultFramebuffer; + renderTargetProperties.__useDefaultFramebuffer = defaultFramebuffer === void 0; + }; + this.setRenderTarget = function(renderTarget, activeCubeFace = 0, activeMipmapLevel = 0) { + _currentRenderTarget = renderTarget; + _currentActiveCubeFace = activeCubeFace; + _currentActiveMipmapLevel = activeMipmapLevel; + let useDefaultFramebuffer = true; + let framebuffer = null; + let isCube = false; + let isRenderTarget3D = false; + if (renderTarget) { + const renderTargetProperties = properties.get(renderTarget); + if (renderTargetProperties.__useDefaultFramebuffer !== void 0) { + state.bindFramebuffer(_gl.FRAMEBUFFER, null); + useDefaultFramebuffer = false; + } else if (renderTargetProperties.__webglFramebuffer === void 0) { + textures.setupRenderTarget(renderTarget); + } else if (renderTargetProperties.__hasExternalTextures) { + textures.rebindTextures(renderTarget, properties.get(renderTarget.texture).__webglTexture, properties.get(renderTarget.depthTexture).__webglTexture); + } else if (renderTarget.depthBuffer) { + const depthTexture = renderTarget.depthTexture; + if (renderTargetProperties.__boundDepthTexture !== depthTexture) { + if (depthTexture !== null && properties.has(depthTexture) && (renderTarget.width !== depthTexture.image.width || renderTarget.height !== depthTexture.image.height)) { + throw new Error("WebGLRenderTarget: Attached DepthTexture is initialized to the incorrect size."); + } + textures.setupDepthRenderbuffer(renderTarget); + } + } + const texture = renderTarget.texture; + if (texture.isData3DTexture || texture.isDataArrayTexture || texture.isCompressedArrayTexture) { + isRenderTarget3D = true; + } + const __webglFramebuffer = properties.get(renderTarget).__webglFramebuffer; + if (renderTarget.isWebGLCubeRenderTarget) { + if (Array.isArray(__webglFramebuffer[activeCubeFace])) { + framebuffer = __webglFramebuffer[activeCubeFace][activeMipmapLevel]; + } else { + framebuffer = __webglFramebuffer[activeCubeFace]; + } + isCube = true; + } else if (renderTarget.samples > 0 && textures.useMultisampledRTT(renderTarget) === false) { + framebuffer = properties.get(renderTarget).__webglMultisampledFramebuffer; } else { - console.error(e); + if (Array.isArray(__webglFramebuffer)) { + framebuffer = __webglFramebuffer[activeMipmapLevel]; + } else { + framebuffer = __webglFramebuffer; + } } - scope.manager.itemError(url); + _currentViewport.copy(renderTarget.viewport); + _currentScissor.copy(renderTarget.scissor); + _currentScissorTest = renderTarget.scissorTest; + } else { + _currentViewport.copy(_viewport).multiplyScalar(_pixelRatio).floor(); + _currentScissor.copy(_scissor).multiplyScalar(_pixelRatio).floor(); + _currentScissorTest = _scissorTest; } - }, onProgress, onError); - } - parse(json) { - const textures = this.textures; - function getTexture(name) { - if (textures[name] === void 0) { - console.warn("THREE.MaterialLoader: Undefined texture", name); + const framebufferBound = state.bindFramebuffer(_gl.FRAMEBUFFER, framebuffer); + if (framebufferBound && useDefaultFramebuffer) { + state.drawBuffers(renderTarget, framebuffer); } - return textures[name]; - } - __name(getTexture, "getTexture"); - const material = this.createMaterialFromType(json.type); - if (json.uuid !== void 0) material.uuid = json.uuid; - if (json.name !== void 0) material.name = json.name; - if (json.color !== void 0 && material.color !== void 0) material.color.setHex(json.color); - if (json.roughness !== void 0) material.roughness = json.roughness; - if (json.metalness !== void 0) material.metalness = json.metalness; - if (json.sheen !== void 0) material.sheen = json.sheen; - if (json.sheenColor !== void 0) material.sheenColor = new Color().setHex(json.sheenColor); - if (json.sheenRoughness !== void 0) material.sheenRoughness = json.sheenRoughness; - if (json.emissive !== void 0 && material.emissive !== void 0) material.emissive.setHex(json.emissive); - if (json.specular !== void 0 && material.specular !== void 0) material.specular.setHex(json.specular); - if (json.specularIntensity !== void 0) material.specularIntensity = json.specularIntensity; - if (json.specularColor !== void 0 && material.specularColor !== void 0) material.specularColor.setHex(json.specularColor); - if (json.shininess !== void 0) material.shininess = json.shininess; - if (json.clearcoat !== void 0) material.clearcoat = json.clearcoat; - if (json.clearcoatRoughness !== void 0) material.clearcoatRoughness = json.clearcoatRoughness; - if (json.dispersion !== void 0) material.dispersion = json.dispersion; - if (json.iridescence !== void 0) material.iridescence = json.iridescence; - if (json.iridescenceIOR !== void 0) material.iridescenceIOR = json.iridescenceIOR; - if (json.iridescenceThicknessRange !== void 0) material.iridescenceThicknessRange = json.iridescenceThicknessRange; - if (json.transmission !== void 0) material.transmission = json.transmission; - if (json.thickness !== void 0) material.thickness = json.thickness; - if (json.attenuationDistance !== void 0) material.attenuationDistance = json.attenuationDistance; - if (json.attenuationColor !== void 0 && material.attenuationColor !== void 0) material.attenuationColor.setHex(json.attenuationColor); - if (json.anisotropy !== void 0) material.anisotropy = json.anisotropy; - if (json.anisotropyRotation !== void 0) material.anisotropyRotation = json.anisotropyRotation; - if (json.fog !== void 0) material.fog = json.fog; - if (json.flatShading !== void 0) material.flatShading = json.flatShading; - if (json.blending !== void 0) material.blending = json.blending; - if (json.combine !== void 0) material.combine = json.combine; - if (json.side !== void 0) material.side = json.side; - if (json.shadowSide !== void 0) material.shadowSide = json.shadowSide; - if (json.opacity !== void 0) material.opacity = json.opacity; - if (json.transparent !== void 0) material.transparent = json.transparent; - if (json.alphaTest !== void 0) material.alphaTest = json.alphaTest; - if (json.alphaHash !== void 0) material.alphaHash = json.alphaHash; - if (json.depthFunc !== void 0) material.depthFunc = json.depthFunc; - if (json.depthTest !== void 0) material.depthTest = json.depthTest; - if (json.depthWrite !== void 0) material.depthWrite = json.depthWrite; - if (json.colorWrite !== void 0) material.colorWrite = json.colorWrite; - if (json.blendSrc !== void 0) material.blendSrc = json.blendSrc; - if (json.blendDst !== void 0) material.blendDst = json.blendDst; - if (json.blendEquation !== void 0) material.blendEquation = json.blendEquation; - if (json.blendSrcAlpha !== void 0) material.blendSrcAlpha = json.blendSrcAlpha; - if (json.blendDstAlpha !== void 0) material.blendDstAlpha = json.blendDstAlpha; - if (json.blendEquationAlpha !== void 0) material.blendEquationAlpha = json.blendEquationAlpha; - if (json.blendColor !== void 0 && material.blendColor !== void 0) material.blendColor.setHex(json.blendColor); - if (json.blendAlpha !== void 0) material.blendAlpha = json.blendAlpha; - if (json.stencilWriteMask !== void 0) material.stencilWriteMask = json.stencilWriteMask; - if (json.stencilFunc !== void 0) material.stencilFunc = json.stencilFunc; - if (json.stencilRef !== void 0) material.stencilRef = json.stencilRef; - if (json.stencilFuncMask !== void 0) material.stencilFuncMask = json.stencilFuncMask; - if (json.stencilFail !== void 0) material.stencilFail = json.stencilFail; - if (json.stencilZFail !== void 0) material.stencilZFail = json.stencilZFail; - if (json.stencilZPass !== void 0) material.stencilZPass = json.stencilZPass; - if (json.stencilWrite !== void 0) material.stencilWrite = json.stencilWrite; - if (json.wireframe !== void 0) material.wireframe = json.wireframe; - if (json.wireframeLinewidth !== void 0) material.wireframeLinewidth = json.wireframeLinewidth; - if (json.wireframeLinecap !== void 0) material.wireframeLinecap = json.wireframeLinecap; - if (json.wireframeLinejoin !== void 0) material.wireframeLinejoin = json.wireframeLinejoin; - if (json.rotation !== void 0) material.rotation = json.rotation; - if (json.linewidth !== void 0) material.linewidth = json.linewidth; - if (json.dashSize !== void 0) material.dashSize = json.dashSize; - if (json.gapSize !== void 0) material.gapSize = json.gapSize; - if (json.scale !== void 0) material.scale = json.scale; - if (json.polygonOffset !== void 0) material.polygonOffset = json.polygonOffset; - if (json.polygonOffsetFactor !== void 0) material.polygonOffsetFactor = json.polygonOffsetFactor; - if (json.polygonOffsetUnits !== void 0) material.polygonOffsetUnits = json.polygonOffsetUnits; - if (json.dithering !== void 0) material.dithering = json.dithering; - if (json.alphaToCoverage !== void 0) material.alphaToCoverage = json.alphaToCoverage; - if (json.premultipliedAlpha !== void 0) material.premultipliedAlpha = json.premultipliedAlpha; - if (json.forceSinglePass !== void 0) material.forceSinglePass = json.forceSinglePass; - if (json.visible !== void 0) material.visible = json.visible; - if (json.toneMapped !== void 0) material.toneMapped = json.toneMapped; - if (json.userData !== void 0) material.userData = json.userData; - if (json.vertexColors !== void 0) { - if (typeof json.vertexColors === "number") { - material.vertexColors = json.vertexColors > 0 ? true : false; + state.viewport(_currentViewport); + state.scissor(_currentScissor); + state.setScissorTest(_currentScissorTest); + if (isCube) { + const textureProperties = properties.get(renderTarget.texture); + _gl.framebufferTexture2D(_gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + activeCubeFace, textureProperties.__webglTexture, activeMipmapLevel); + } else if (isRenderTarget3D) { + const textureProperties = properties.get(renderTarget.texture); + const layer = activeCubeFace || 0; + _gl.framebufferTextureLayer(_gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, textureProperties.__webglTexture, activeMipmapLevel || 0, layer); + } + _currentMaterialId = -1; + }; + this.readRenderTargetPixels = function(renderTarget, x, y, width, height, buffer, activeCubeFaceIndex) { + if (!(renderTarget && renderTarget.isWebGLRenderTarget)) { + console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget."); + return; + } + let framebuffer = properties.get(renderTarget).__webglFramebuffer; + if (renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== void 0) { + framebuffer = framebuffer[activeCubeFaceIndex]; + } + if (framebuffer) { + state.bindFramebuffer(_gl.FRAMEBUFFER, framebuffer); + try { + const texture = renderTarget.texture; + const textureFormat = texture.format; + const textureType = texture.type; + if (!capabilities.textureFormatReadable(textureFormat)) { + console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format."); + return; + } + if (!capabilities.textureTypeReadable(textureType)) { + console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type."); + return; + } + if (x >= 0 && x <= renderTarget.width - width && (y >= 0 && y <= renderTarget.height - height)) { + _gl.readPixels(x, y, width, height, utils.convert(textureFormat), utils.convert(textureType), buffer); + } + } finally { + const framebuffer2 = _currentRenderTarget !== null ? properties.get(_currentRenderTarget).__webglFramebuffer : null; + state.bindFramebuffer(_gl.FRAMEBUFFER, framebuffer2); + } + } + }; + this.readRenderTargetPixelsAsync = async function(renderTarget, x, y, width, height, buffer, activeCubeFaceIndex) { + if (!(renderTarget && renderTarget.isWebGLRenderTarget)) { + throw new Error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget."); + } + let framebuffer = properties.get(renderTarget).__webglFramebuffer; + if (renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== void 0) { + framebuffer = framebuffer[activeCubeFaceIndex]; + } + if (framebuffer) { + const texture = renderTarget.texture; + const textureFormat = texture.format; + const textureType = texture.type; + if (!capabilities.textureFormatReadable(textureFormat)) { + throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format."); + } + if (!capabilities.textureTypeReadable(textureType)) { + throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type."); + } + if (x >= 0 && x <= renderTarget.width - width && (y >= 0 && y <= renderTarget.height - height)) { + state.bindFramebuffer(_gl.FRAMEBUFFER, framebuffer); + const glBuffer = _gl.createBuffer(); + _gl.bindBuffer(_gl.PIXEL_PACK_BUFFER, glBuffer); + _gl.bufferData(_gl.PIXEL_PACK_BUFFER, buffer.byteLength, _gl.STREAM_READ); + _gl.readPixels(x, y, width, height, utils.convert(textureFormat), utils.convert(textureType), 0); + const currFramebuffer = _currentRenderTarget !== null ? properties.get(_currentRenderTarget).__webglFramebuffer : null; + state.bindFramebuffer(_gl.FRAMEBUFFER, currFramebuffer); + const sync = _gl.fenceSync(_gl.SYNC_GPU_COMMANDS_COMPLETE, 0); + _gl.flush(); + await probeAsync(_gl, sync, 4); + _gl.bindBuffer(_gl.PIXEL_PACK_BUFFER, glBuffer); + _gl.getBufferSubData(_gl.PIXEL_PACK_BUFFER, 0, buffer); + _gl.deleteBuffer(glBuffer); + _gl.deleteSync(sync); + return buffer; + } else { + throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range."); + } + } + }; + this.copyFramebufferToTexture = function(texture, position = null, level = 0) { + if (texture.isTexture !== true) { + warnOnce("WebGLRenderer: copyFramebufferToTexture function signature has changed."); + position = arguments[0] || null; + texture = arguments[1]; + } + const levelScale = Math.pow(2, -level); + const width = Math.floor(texture.image.width * levelScale); + const height = Math.floor(texture.image.height * levelScale); + const x = position !== null ? position.x : 0; + const y = position !== null ? position.y : 0; + textures.setTexture2D(texture, 0); + _gl.copyTexSubImage2D(_gl.TEXTURE_2D, level, 0, 0, x, y, width, height); + state.unbindTexture(); + }; + this.copyTextureToTexture = function(srcTexture, dstTexture, srcRegion = null, dstPosition = null, level = 0) { + if (srcTexture.isTexture !== true) { + warnOnce("WebGLRenderer: copyTextureToTexture function signature has changed."); + dstPosition = arguments[0] || null; + srcTexture = arguments[1]; + dstTexture = arguments[2]; + level = arguments[3] || 0; + srcRegion = null; + } + let width, height, depth2, minX, minY, minZ; + let dstX, dstY, dstZ; + const image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[level] : srcTexture.image; + if (srcRegion !== null) { + width = srcRegion.max.x - srcRegion.min.x; + height = srcRegion.max.y - srcRegion.min.y; + depth2 = srcRegion.isBox3 ? srcRegion.max.z - srcRegion.min.z : 1; + minX = srcRegion.min.x; + minY = srcRegion.min.y; + minZ = srcRegion.isBox3 ? srcRegion.min.z : 0; } else { - material.vertexColors = json.vertexColors; + width = image.width; + height = image.height; + depth2 = image.depth || 1; + minX = 0; + minY = 0; + minZ = 0; } - } - if (json.uniforms !== void 0) { - for (const name in json.uniforms) { - const uniform = json.uniforms[name]; - material.uniforms[name] = {}; - switch (uniform.type) { - case "t": - material.uniforms[name].value = getTexture(uniform.value); - break; - case "c": - material.uniforms[name].value = new Color().setHex(uniform.value); - break; - case "v2": - material.uniforms[name].value = new Vector2().fromArray(uniform.value); - break; - case "v3": - material.uniforms[name].value = new Vector3().fromArray(uniform.value); - break; - case "v4": - material.uniforms[name].value = new Vector4().fromArray(uniform.value); - break; - case "m3": - material.uniforms[name].value = new Matrix3().fromArray(uniform.value); - break; - case "m4": - material.uniforms[name].value = new Matrix4().fromArray(uniform.value); - break; - default: - material.uniforms[name].value = uniform.value; + if (dstPosition !== null) { + dstX = dstPosition.x; + dstY = dstPosition.y; + dstZ = dstPosition.z; + } else { + dstX = 0; + dstY = 0; + dstZ = 0; + } + const glFormat = utils.convert(dstTexture.format); + const glType = utils.convert(dstTexture.type); + let glTarget; + if (dstTexture.isData3DTexture) { + textures.setTexture3D(dstTexture, 0); + glTarget = _gl.TEXTURE_3D; + } else if (dstTexture.isDataArrayTexture || dstTexture.isCompressedArrayTexture) { + textures.setTexture2DArray(dstTexture, 0); + glTarget = _gl.TEXTURE_2D_ARRAY; + } else { + textures.setTexture2D(dstTexture, 0); + glTarget = _gl.TEXTURE_2D; + } + _gl.pixelStorei(_gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY); + _gl.pixelStorei(_gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha); + _gl.pixelStorei(_gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment); + const currentUnpackRowLen = _gl.getParameter(_gl.UNPACK_ROW_LENGTH); + const currentUnpackImageHeight = _gl.getParameter(_gl.UNPACK_IMAGE_HEIGHT); + const currentUnpackSkipPixels = _gl.getParameter(_gl.UNPACK_SKIP_PIXELS); + const currentUnpackSkipRows = _gl.getParameter(_gl.UNPACK_SKIP_ROWS); + const currentUnpackSkipImages = _gl.getParameter(_gl.UNPACK_SKIP_IMAGES); + _gl.pixelStorei(_gl.UNPACK_ROW_LENGTH, image.width); + _gl.pixelStorei(_gl.UNPACK_IMAGE_HEIGHT, image.height); + _gl.pixelStorei(_gl.UNPACK_SKIP_PIXELS, minX); + _gl.pixelStorei(_gl.UNPACK_SKIP_ROWS, minY); + _gl.pixelStorei(_gl.UNPACK_SKIP_IMAGES, minZ); + const isSrc3D = srcTexture.isDataArrayTexture || srcTexture.isData3DTexture; + const isDst3D = dstTexture.isDataArrayTexture || dstTexture.isData3DTexture; + if (srcTexture.isRenderTargetTexture || srcTexture.isDepthTexture) { + const srcTextureProperties = properties.get(srcTexture); + const dstTextureProperties = properties.get(dstTexture); + const srcRenderTargetProperties = properties.get(srcTextureProperties.__renderTarget); + const dstRenderTargetProperties = properties.get(dstTextureProperties.__renderTarget); + state.bindFramebuffer(_gl.READ_FRAMEBUFFER, srcRenderTargetProperties.__webglFramebuffer); + state.bindFramebuffer(_gl.DRAW_FRAMEBUFFER, dstRenderTargetProperties.__webglFramebuffer); + for (let i = 0; i < depth2; i++) { + if (isSrc3D) { + _gl.framebufferTextureLayer(_gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, properties.get(srcTexture).__webglTexture, level, minZ + i); + } + if (srcTexture.isDepthTexture) { + if (isDst3D) { + _gl.framebufferTextureLayer(_gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, properties.get(dstTexture).__webglTexture, level, dstZ + i); + } + _gl.blitFramebuffer(minX, minY, width, height, dstX, dstY, width, height, _gl.DEPTH_BUFFER_BIT, _gl.NEAREST); + } else if (isDst3D) { + _gl.copyTexSubImage3D(glTarget, level, dstX, dstY, dstZ + i, minX, minY, width, height); + } else { + _gl.copyTexSubImage2D(glTarget, level, dstX, dstY, dstZ + i, minX, minY, width, height); + } + } + state.bindFramebuffer(_gl.READ_FRAMEBUFFER, null); + state.bindFramebuffer(_gl.DRAW_FRAMEBUFFER, null); + } else { + if (isDst3D) { + if (srcTexture.isDataTexture || srcTexture.isData3DTexture) { + _gl.texSubImage3D(glTarget, level, dstX, dstY, dstZ, width, height, depth2, glFormat, glType, image.data); + } else if (dstTexture.isCompressedArrayTexture) { + _gl.compressedTexSubImage3D(glTarget, level, dstX, dstY, dstZ, width, height, depth2, glFormat, image.data); + } else { + _gl.texSubImage3D(glTarget, level, dstX, dstY, dstZ, width, height, depth2, glFormat, glType, image); + } + } else { + if (srcTexture.isDataTexture) { + _gl.texSubImage2D(_gl.TEXTURE_2D, level, dstX, dstY, width, height, glFormat, glType, image.data); + } else if (srcTexture.isCompressedTexture) { + _gl.compressedTexSubImage2D(_gl.TEXTURE_2D, level, dstX, dstY, image.width, image.height, glFormat, image.data); + } else { + _gl.texSubImage2D(_gl.TEXTURE_2D, level, dstX, dstY, width, height, glFormat, glType, image); + } } } - } - if (json.defines !== void 0) material.defines = json.defines; - if (json.vertexShader !== void 0) material.vertexShader = json.vertexShader; - if (json.fragmentShader !== void 0) material.fragmentShader = json.fragmentShader; - if (json.glslVersion !== void 0) material.glslVersion = json.glslVersion; - if (json.extensions !== void 0) { - for (const key in json.extensions) { - material.extensions[key] = json.extensions[key]; + _gl.pixelStorei(_gl.UNPACK_ROW_LENGTH, currentUnpackRowLen); + _gl.pixelStorei(_gl.UNPACK_IMAGE_HEIGHT, currentUnpackImageHeight); + _gl.pixelStorei(_gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels); + _gl.pixelStorei(_gl.UNPACK_SKIP_ROWS, currentUnpackSkipRows); + _gl.pixelStorei(_gl.UNPACK_SKIP_IMAGES, currentUnpackSkipImages); + if (level === 0 && dstTexture.generateMipmaps) { + _gl.generateMipmap(glTarget); + } + state.unbindTexture(); + }; + this.copyTextureToTexture3D = function(srcTexture, dstTexture, srcRegion = null, dstPosition = null, level = 0) { + if (srcTexture.isTexture !== true) { + warnOnce("WebGLRenderer: copyTextureToTexture3D function signature has changed."); + srcRegion = arguments[0] || null; + dstPosition = arguments[1] || null; + srcTexture = arguments[2]; + dstTexture = arguments[3]; + level = arguments[4] || 0; } - } - if (json.lights !== void 0) material.lights = json.lights; - if (json.clipping !== void 0) material.clipping = json.clipping; - if (json.size !== void 0) material.size = json.size; - if (json.sizeAttenuation !== void 0) material.sizeAttenuation = json.sizeAttenuation; - if (json.map !== void 0) material.map = getTexture(json.map); - if (json.matcap !== void 0) material.matcap = getTexture(json.matcap); - if (json.alphaMap !== void 0) material.alphaMap = getTexture(json.alphaMap); - if (json.bumpMap !== void 0) material.bumpMap = getTexture(json.bumpMap); - if (json.bumpScale !== void 0) material.bumpScale = json.bumpScale; - if (json.normalMap !== void 0) material.normalMap = getTexture(json.normalMap); - if (json.normalMapType !== void 0) material.normalMapType = json.normalMapType; - if (json.normalScale !== void 0) { - let normalScale = json.normalScale; - if (Array.isArray(normalScale) === false) { - normalScale = [normalScale, normalScale]; + warnOnce('WebGLRenderer: copyTextureToTexture3D function has been deprecated. Use "copyTextureToTexture" instead.'); + return this.copyTextureToTexture(srcTexture, dstTexture, srcRegion, dstPosition, level); + }; + this.initRenderTarget = function(target) { + if (properties.get(target).__webglFramebuffer === void 0) { + textures.setupRenderTarget(target); } - material.normalScale = new Vector2().fromArray(normalScale); + }; + this.initTexture = function(texture) { + if (texture.isCubeTexture) { + textures.setTextureCube(texture, 0); + } else if (texture.isData3DTexture) { + textures.setTexture3D(texture, 0); + } else if (texture.isDataArrayTexture || texture.isCompressedArrayTexture) { + textures.setTexture2DArray(texture, 0); + } else { + textures.setTexture2D(texture, 0); + } + state.unbindTexture(); + }; + this.resetState = function() { + _currentActiveCubeFace = 0; + _currentActiveMipmapLevel = 0; + _currentRenderTarget = null; + state.reset(); + bindingStates.reset(); + }; + if (typeof __THREE_DEVTOOLS__ !== "undefined") { + __THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe", { detail: this })); } - if (json.displacementMap !== void 0) material.displacementMap = getTexture(json.displacementMap); - if (json.displacementScale !== void 0) material.displacementScale = json.displacementScale; - if (json.displacementBias !== void 0) material.displacementBias = json.displacementBias; - if (json.roughnessMap !== void 0) material.roughnessMap = getTexture(json.roughnessMap); - if (json.metalnessMap !== void 0) material.metalnessMap = getTexture(json.metalnessMap); - if (json.emissiveMap !== void 0) material.emissiveMap = getTexture(json.emissiveMap); - if (json.emissiveIntensity !== void 0) material.emissiveIntensity = json.emissiveIntensity; - if (json.specularMap !== void 0) material.specularMap = getTexture(json.specularMap); - if (json.specularIntensityMap !== void 0) material.specularIntensityMap = getTexture(json.specularIntensityMap); - if (json.specularColorMap !== void 0) material.specularColorMap = getTexture(json.specularColorMap); - if (json.envMap !== void 0) material.envMap = getTexture(json.envMap); - if (json.envMapRotation !== void 0) material.envMapRotation.fromArray(json.envMapRotation); - if (json.envMapIntensity !== void 0) material.envMapIntensity = json.envMapIntensity; - if (json.reflectivity !== void 0) material.reflectivity = json.reflectivity; - if (json.refractionRatio !== void 0) material.refractionRatio = json.refractionRatio; - if (json.lightMap !== void 0) material.lightMap = getTexture(json.lightMap); - if (json.lightMapIntensity !== void 0) material.lightMapIntensity = json.lightMapIntensity; - if (json.aoMap !== void 0) material.aoMap = getTexture(json.aoMap); - if (json.aoMapIntensity !== void 0) material.aoMapIntensity = json.aoMapIntensity; - if (json.gradientMap !== void 0) material.gradientMap = getTexture(json.gradientMap); - if (json.clearcoatMap !== void 0) material.clearcoatMap = getTexture(json.clearcoatMap); - if (json.clearcoatRoughnessMap !== void 0) material.clearcoatRoughnessMap = getTexture(json.clearcoatRoughnessMap); - if (json.clearcoatNormalMap !== void 0) material.clearcoatNormalMap = getTexture(json.clearcoatNormalMap); - if (json.clearcoatNormalScale !== void 0) material.clearcoatNormalScale = new Vector2().fromArray(json.clearcoatNormalScale); - if (json.iridescenceMap !== void 0) material.iridescenceMap = getTexture(json.iridescenceMap); - if (json.iridescenceThicknessMap !== void 0) material.iridescenceThicknessMap = getTexture(json.iridescenceThicknessMap); - if (json.transmissionMap !== void 0) material.transmissionMap = getTexture(json.transmissionMap); - if (json.thicknessMap !== void 0) material.thicknessMap = getTexture(json.thicknessMap); - if (json.anisotropyMap !== void 0) material.anisotropyMap = getTexture(json.anisotropyMap); - if (json.sheenColorMap !== void 0) material.sheenColorMap = getTexture(json.sheenColorMap); - if (json.sheenRoughnessMap !== void 0) material.sheenRoughnessMap = getTexture(json.sheenRoughnessMap); - return material; } - setTextures(value) { - this.textures = value; - return this; + get coordinateSystem() { + return WebGLCoordinateSystem; } - createMaterialFromType(type) { - return MaterialLoader.createMaterialFromType(type); + get outputColorSpace() { + return this._outputColorSpace; } - static createMaterialFromType(type) { - const materialLib = { - ShadowMaterial, - SpriteMaterial, - RawShaderMaterial, - ShaderMaterial, - PointsMaterial, - MeshPhysicalMaterial, - MeshStandardMaterial, - MeshPhongMaterial, - MeshToonMaterial, - MeshNormalMaterial, - MeshLambertMaterial, - MeshDepthMaterial, - MeshDistanceMaterial, - MeshBasicMaterial, - MeshMatcapMaterial, - LineDashedMaterial, - LineBasicMaterial, - Material - }; - return new materialLib[type](); + set outputColorSpace(colorSpace) { + this._outputColorSpace = colorSpace; + const gl = this.getContext(); + gl.drawingBufferColorspace = ColorManagement._getDrawingBufferColorSpace(colorSpace); + gl.unpackColorSpace = ColorManagement._getUnpackColorSpace(); } } -class LoaderUtils { +class FogExp2 { static { - __name(this, "LoaderUtils"); + __name(this, "FogExp2"); } - static decodeText(array) { - console.warn("THREE.LoaderUtils: decodeText() has been deprecated with r165 and will be removed with r175. Use TextDecoder instead."); - if (typeof TextDecoder !== "undefined") { - return new TextDecoder().decode(array); - } - let s = ""; - for (let i = 0, il = array.length; i < il; i++) { - s += String.fromCharCode(array[i]); - } - try { - return decodeURIComponent(escape(s)); - } catch (e) { - return s; - } + constructor(color, density = 25e-5) { + this.isFogExp2 = true; + this.name = ""; + this.color = new Color(color); + this.density = density; } - static extractUrlBase(url) { - const index = url.lastIndexOf("/"); - if (index === -1) return "./"; - return url.slice(0, index + 1); + clone() { + return new FogExp2(this.color, this.density); } - static resolveURL(url, path) { - if (typeof url !== "string" || url === "") return ""; - if (/^https?:\/\//i.test(path) && /^\//.test(url)) { - path = path.replace(/(^https?:\/\/[^\/]+).*/i, "$1"); - } - if (/^(https?:)?\/\//i.test(url)) return url; - if (/^data:.*,.*$/i.test(url)) return url; - if (/^blob:.*$/i.test(url)) return url; - return path + url; + toJSON() { + return { + type: "FogExp2", + name: this.name, + color: this.color.getHex(), + density: this.density + }; } } -class InstancedBufferGeometry extends BufferGeometry { +class Fog { static { - __name(this, "InstancedBufferGeometry"); + __name(this, "Fog"); } - constructor() { - super(); - this.isInstancedBufferGeometry = true; - this.type = "InstancedBufferGeometry"; - this.instanceCount = Infinity; + constructor(color, near = 1, far = 1e3) { + this.isFog = true; + this.name = ""; + this.color = new Color(color); + this.near = near; + this.far = far; } - copy(source) { - super.copy(source); - this.instanceCount = source.instanceCount; - return this; + clone() { + return new Fog(this.color, this.near, this.far); } toJSON() { - const data = super.toJSON(); - data.instanceCount = this.instanceCount; - data.isInstancedBufferGeometry = true; - return data; + return { + type: "Fog", + name: this.name, + color: this.color.getHex(), + near: this.near, + far: this.far + }; } } -class BufferGeometryLoader extends Loader { +class Scene extends Object3D { static { - __name(this, "BufferGeometryLoader"); + __name(this, "Scene"); } - constructor(manager) { - super(manager); + constructor() { + super(); + this.isScene = true; + this.type = "Scene"; + this.background = null; + this.environment = null; + this.fog = null; + this.backgroundBlurriness = 0; + this.backgroundIntensity = 1; + this.backgroundRotation = new Euler(); + this.environmentIntensity = 1; + this.environmentRotation = new Euler(); + this.overrideMaterial = null; + if (typeof __THREE_DEVTOOLS__ !== "undefined") { + __THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe", { detail: this })); + } } - load(url, onLoad, onProgress, onError) { - const scope = this; - const loader = new FileLoader(scope.manager); - loader.setPath(scope.path); - loader.setRequestHeader(scope.requestHeader); - loader.setWithCredentials(scope.withCredentials); - loader.load(url, function(text) { - try { - onLoad(scope.parse(JSON.parse(text))); - } catch (e) { - if (onError) { - onError(e); - } else { - console.error(e); - } - scope.manager.itemError(url); - } - }, onProgress, onError); + copy(source, recursive) { + super.copy(source, recursive); + if (source.background !== null) this.background = source.background.clone(); + if (source.environment !== null) this.environment = source.environment.clone(); + if (source.fog !== null) this.fog = source.fog.clone(); + this.backgroundBlurriness = source.backgroundBlurriness; + this.backgroundIntensity = source.backgroundIntensity; + this.backgroundRotation.copy(source.backgroundRotation); + this.environmentIntensity = source.environmentIntensity; + this.environmentRotation.copy(source.environmentRotation); + if (source.overrideMaterial !== null) this.overrideMaterial = source.overrideMaterial.clone(); + this.matrixAutoUpdate = source.matrixAutoUpdate; + return this; } - parse(json) { - const interleavedBufferMap = {}; - const arrayBufferMap = {}; - function getInterleavedBuffer(json2, uuid) { - if (interleavedBufferMap[uuid] !== void 0) return interleavedBufferMap[uuid]; - const interleavedBuffers = json2.interleavedBuffers; - const interleavedBuffer = interleavedBuffers[uuid]; - const buffer = getArrayBuffer(json2, interleavedBuffer.buffer); - const array = getTypedArray(interleavedBuffer.type, buffer); - const ib = new InterleavedBuffer(array, interleavedBuffer.stride); - ib.uuid = interleavedBuffer.uuid; - interleavedBufferMap[uuid] = ib; - return ib; - } - __name(getInterleavedBuffer, "getInterleavedBuffer"); - function getArrayBuffer(json2, uuid) { - if (arrayBufferMap[uuid] !== void 0) return arrayBufferMap[uuid]; - const arrayBuffers = json2.arrayBuffers; - const arrayBuffer = arrayBuffers[uuid]; - const ab = new Uint32Array(arrayBuffer).buffer; - arrayBufferMap[uuid] = ab; - return ab; - } - __name(getArrayBuffer, "getArrayBuffer"); - const geometry = json.isInstancedBufferGeometry ? new InstancedBufferGeometry() : new BufferGeometry(); - const index = json.data.index; - if (index !== void 0) { - const typedArray = getTypedArray(index.type, index.array); - geometry.setIndex(new BufferAttribute(typedArray, 1)); - } - const attributes = json.data.attributes; - for (const key in attributes) { - const attribute = attributes[key]; - let bufferAttribute; - if (attribute.isInterleavedBufferAttribute) { - const interleavedBuffer = getInterleavedBuffer(json.data, attribute.data); - bufferAttribute = new InterleavedBufferAttribute(interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized); - } else { - const typedArray = getTypedArray(attribute.type, attribute.array); - const bufferAttributeConstr = attribute.isInstancedBufferAttribute ? InstancedBufferAttribute : BufferAttribute; - bufferAttribute = new bufferAttributeConstr(typedArray, attribute.itemSize, attribute.normalized); - } - if (attribute.name !== void 0) bufferAttribute.name = attribute.name; - if (attribute.usage !== void 0) bufferAttribute.setUsage(attribute.usage); - geometry.setAttribute(key, bufferAttribute); - } - const morphAttributes = json.data.morphAttributes; - if (morphAttributes) { - for (const key in morphAttributes) { - const attributeArray = morphAttributes[key]; - const array = []; - for (let i = 0, il = attributeArray.length; i < il; i++) { - const attribute = attributeArray[i]; - let bufferAttribute; - if (attribute.isInterleavedBufferAttribute) { - const interleavedBuffer = getInterleavedBuffer(json.data, attribute.data); - bufferAttribute = new InterleavedBufferAttribute(interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized); - } else { - const typedArray = getTypedArray(attribute.type, attribute.array); - bufferAttribute = new BufferAttribute(typedArray, attribute.itemSize, attribute.normalized); - } - if (attribute.name !== void 0) bufferAttribute.name = attribute.name; - array.push(bufferAttribute); - } - geometry.morphAttributes[key] = array; - } - } - const morphTargetsRelative = json.data.morphTargetsRelative; - if (morphTargetsRelative) { - geometry.morphTargetsRelative = true; - } - const groups = json.data.groups || json.data.drawcalls || json.data.offsets; - if (groups !== void 0) { - for (let i = 0, n = groups.length; i !== n; ++i) { - const group = groups[i]; - geometry.addGroup(group.start, group.count, group.materialIndex); - } - } - const boundingSphere = json.data.boundingSphere; - if (boundingSphere !== void 0) { - const center = new Vector3(); - if (boundingSphere.center !== void 0) { - center.fromArray(boundingSphere.center); - } - geometry.boundingSphere = new Sphere(center, boundingSphere.radius); - } - if (json.name) geometry.name = json.name; - if (json.userData) geometry.userData = json.userData; - return geometry; + toJSON(meta) { + const data = super.toJSON(meta); + if (this.fog !== null) data.object.fog = this.fog.toJSON(); + if (this.backgroundBlurriness > 0) data.object.backgroundBlurriness = this.backgroundBlurriness; + if (this.backgroundIntensity !== 1) data.object.backgroundIntensity = this.backgroundIntensity; + data.object.backgroundRotation = this.backgroundRotation.toArray(); + if (this.environmentIntensity !== 1) data.object.environmentIntensity = this.environmentIntensity; + data.object.environmentRotation = this.environmentRotation.toArray(); + return data; } } -class ObjectLoader extends Loader { +class InterleavedBuffer { static { - __name(this, "ObjectLoader"); - } - constructor(manager) { - super(manager); + __name(this, "InterleavedBuffer"); } - load(url, onLoad, onProgress, onError) { - const scope = this; - const path = this.path === "" ? LoaderUtils.extractUrlBase(url) : this.path; - this.resourcePath = this.resourcePath || path; - const loader = new FileLoader(this.manager); - loader.setPath(this.path); - loader.setRequestHeader(this.requestHeader); - loader.setWithCredentials(this.withCredentials); - loader.load(url, function(text) { - let json = null; - try { - json = JSON.parse(text); - } catch (error) { - if (onError !== void 0) onError(error); - console.error("THREE:ObjectLoader: Can't parse " + url + ".", error.message); - return; - } - const metadata = json.metadata; - if (metadata === void 0 || metadata.type === void 0 || metadata.type.toLowerCase() === "geometry") { - if (onError !== void 0) onError(new Error("THREE.ObjectLoader: Can't load " + url)); - console.error("THREE.ObjectLoader: Can't load " + url); - return; - } - scope.parse(json, onLoad); - }, onProgress, onError); + constructor(array, stride) { + this.isInterleavedBuffer = true; + this.array = array; + this.stride = stride; + this.count = array !== void 0 ? array.length / stride : 0; + this.usage = StaticDrawUsage; + this.updateRanges = []; + this.version = 0; + this.uuid = generateUUID(); } - async loadAsync(url, onProgress) { - const scope = this; - const path = this.path === "" ? LoaderUtils.extractUrlBase(url) : this.path; - this.resourcePath = this.resourcePath || path; - const loader = new FileLoader(this.manager); - loader.setPath(this.path); - loader.setRequestHeader(this.requestHeader); - loader.setWithCredentials(this.withCredentials); - const text = await loader.loadAsync(url, onProgress); - const json = JSON.parse(text); - const metadata = json.metadata; - if (metadata === void 0 || metadata.type === void 0 || metadata.type.toLowerCase() === "geometry") { - throw new Error("THREE.ObjectLoader: Can't load " + url); - } - return await scope.parseAsync(json); + onUploadCallback() { } - parse(json, onLoad) { - const animations = this.parseAnimations(json.animations); - const shapes = this.parseShapes(json.shapes); - const geometries = this.parseGeometries(json.geometries, shapes); - const images = this.parseImages(json.images, function() { - if (onLoad !== void 0) onLoad(object); - }); - const textures = this.parseTextures(json.textures, images); - const materials = this.parseMaterials(json.materials, textures); - const object = this.parseObject(json.object, geometries, materials, textures, animations); - const skeletons = this.parseSkeletons(json.skeletons, object); - this.bindSkeletons(object, skeletons); - this.bindLightTargets(object); - if (onLoad !== void 0) { - let hasImages = false; - for (const uuid in images) { - if (images[uuid].data instanceof HTMLImageElement) { - hasImages = true; - break; - } - } - if (hasImages === false) onLoad(object); - } - return object; + set needsUpdate(value) { + if (value === true) this.version++; } - async parseAsync(json) { - const animations = this.parseAnimations(json.animations); - const shapes = this.parseShapes(json.shapes); - const geometries = this.parseGeometries(json.geometries, shapes); - const images = await this.parseImagesAsync(json.images); - const textures = this.parseTextures(json.textures, images); - const materials = this.parseMaterials(json.materials, textures); - const object = this.parseObject(json.object, geometries, materials, textures, animations); - const skeletons = this.parseSkeletons(json.skeletons, object); - this.bindSkeletons(object, skeletons); - this.bindLightTargets(object); - return object; + setUsage(value) { + this.usage = value; + return this; } - parseShapes(json) { - const shapes = {}; - if (json !== void 0) { - for (let i = 0, l = json.length; i < l; i++) { - const shape = new Shape().fromJSON(json[i]); - shapes[shape.uuid] = shape; - } - } - return shapes; + addUpdateRange(start, count) { + this.updateRanges.push({ start, count }); } - parseSkeletons(json, object) { - const skeletons = {}; - const bones = {}; - object.traverse(function(child) { - if (child.isBone) bones[child.uuid] = child; - }); - if (json !== void 0) { - for (let i = 0, l = json.length; i < l; i++) { - const skeleton = new Skeleton().fromJSON(json[i], bones); - skeletons[skeleton.uuid] = skeleton; - } - } - return skeletons; + clearUpdateRanges() { + this.updateRanges.length = 0; } - parseGeometries(json, shapes) { - const geometries = {}; - if (json !== void 0) { - const bufferGeometryLoader = new BufferGeometryLoader(); - for (let i = 0, l = json.length; i < l; i++) { - let geometry; - const data = json[i]; - switch (data.type) { - case "BufferGeometry": - case "InstancedBufferGeometry": - geometry = bufferGeometryLoader.parse(data); - break; - default: - if (data.type in Geometries) { - geometry = Geometries[data.type].fromJSON(data, shapes); - } else { - console.warn(`THREE.ObjectLoader: Unsupported geometry type "${data.type}"`); - } - } - geometry.uuid = data.uuid; - if (data.name !== void 0) geometry.name = data.name; - if (data.userData !== void 0) geometry.userData = data.userData; - geometries[data.uuid] = geometry; - } - } - return geometries; + copy(source) { + this.array = new source.array.constructor(source.array); + this.count = source.count; + this.stride = source.stride; + this.usage = source.usage; + return this; } - parseMaterials(json, textures) { - const cache = {}; - const materials = {}; - if (json !== void 0) { - const loader = new MaterialLoader(); - loader.setTextures(textures); - for (let i = 0, l = json.length; i < l; i++) { - const data = json[i]; - if (cache[data.uuid] === void 0) { - cache[data.uuid] = loader.parse(data); - } - materials[data.uuid] = cache[data.uuid]; - } + copyAt(index1, attribute, index2) { + index1 *= this.stride; + index2 *= attribute.stride; + for (let i = 0, l = this.stride; i < l; i++) { + this.array[index1 + i] = attribute.array[index2 + i]; } - return materials; + return this; } - parseAnimations(json) { - const animations = {}; - if (json !== void 0) { - for (let i = 0; i < json.length; i++) { - const data = json[i]; - const clip = AnimationClip.parse(data); - animations[clip.uuid] = clip; - } - } - return animations; + set(value, offset = 0) { + this.array.set(value, offset); + return this; } - parseImages(json, onLoad) { - const scope = this; - const images = {}; - let loader; - function loadImage2(url) { - scope.manager.itemStart(url); - return loader.load(url, function() { - scope.manager.itemEnd(url); - }, void 0, function() { - scope.manager.itemError(url); - scope.manager.itemEnd(url); - }); + clone(data) { + if (data.arrayBuffers === void 0) { + data.arrayBuffers = {}; } - __name(loadImage2, "loadImage"); - function deserializeImage(image) { - if (typeof image === "string") { - const url = image; - const path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test(url) ? url : scope.resourcePath + url; - return loadImage2(path); - } else { - if (image.data) { - return { - data: getTypedArray(image.type, image.data), - width: image.width, - height: image.height - }; - } else { - return null; - } - } + if (this.array.buffer._uuid === void 0) { + this.array.buffer._uuid = generateUUID(); } - __name(deserializeImage, "deserializeImage"); - if (json !== void 0 && json.length > 0) { - const manager = new LoadingManager(onLoad); - loader = new ImageLoader(manager); - loader.setCrossOrigin(this.crossOrigin); - for (let i = 0, il = json.length; i < il; i++) { - const image = json[i]; - const url = image.url; - if (Array.isArray(url)) { - const imageArray = []; - for (let j = 0, jl = url.length; j < jl; j++) { - const currentUrl = url[j]; - const deserializedImage = deserializeImage(currentUrl); - if (deserializedImage !== null) { - if (deserializedImage instanceof HTMLImageElement) { - imageArray.push(deserializedImage); - } else { - imageArray.push(new DataTexture(deserializedImage.data, deserializedImage.width, deserializedImage.height)); - } - } - } - images[image.uuid] = new Source(imageArray); - } else { - const deserializedImage = deserializeImage(image.url); - images[image.uuid] = new Source(deserializedImage); - } - } + if (data.arrayBuffers[this.array.buffer._uuid] === void 0) { + data.arrayBuffers[this.array.buffer._uuid] = this.array.slice(0).buffer; } - return images; + const array = new this.array.constructor(data.arrayBuffers[this.array.buffer._uuid]); + const ib = new this.constructor(array, this.stride); + ib.setUsage(this.usage); + return ib; } - async parseImagesAsync(json) { - const scope = this; - const images = {}; - let loader; - async function deserializeImage(image) { - if (typeof image === "string") { - const url = image; - const path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test(url) ? url : scope.resourcePath + url; - return await loader.loadAsync(path); - } else { - if (image.data) { - return { - data: getTypedArray(image.type, image.data), - width: image.width, - height: image.height - }; - } else { - return null; - } - } - } - __name(deserializeImage, "deserializeImage"); - if (json !== void 0 && json.length > 0) { - loader = new ImageLoader(this.manager); - loader.setCrossOrigin(this.crossOrigin); - for (let i = 0, il = json.length; i < il; i++) { - const image = json[i]; - const url = image.url; - if (Array.isArray(url)) { - const imageArray = []; - for (let j = 0, jl = url.length; j < jl; j++) { - const currentUrl = url[j]; - const deserializedImage = await deserializeImage(currentUrl); - if (deserializedImage !== null) { - if (deserializedImage instanceof HTMLImageElement) { - imageArray.push(deserializedImage); - } else { - imageArray.push(new DataTexture(deserializedImage.data, deserializedImage.width, deserializedImage.height)); - } - } - } - images[image.uuid] = new Source(imageArray); - } else { - const deserializedImage = await deserializeImage(image.url); - images[image.uuid] = new Source(deserializedImage); - } - } - } - return images; + onUpload(callback) { + this.onUploadCallback = callback; + return this; } - parseTextures(json, images) { - function parseConstant(value, type) { - if (typeof value === "number") return value; - console.warn("THREE.ObjectLoader.parseTexture: Constant should be in numeric form.", value); - return type[value]; - } - __name(parseConstant, "parseConstant"); - const textures = {}; - if (json !== void 0) { - for (let i = 0, l = json.length; i < l; i++) { - const data = json[i]; - if (data.image === void 0) { - console.warn('THREE.ObjectLoader: No "image" specified for', data.uuid); - } - if (images[data.image] === void 0) { - console.warn("THREE.ObjectLoader: Undefined image", data.image); - } - const source = images[data.image]; - const image = source.data; - let texture; - if (Array.isArray(image)) { - texture = new CubeTexture(); - if (image.length === 6) texture.needsUpdate = true; - } else { - if (image && image.data) { - texture = new DataTexture(); - } else { - texture = new Texture(); - } - if (image) texture.needsUpdate = true; - } - texture.source = source; - texture.uuid = data.uuid; - if (data.name !== void 0) texture.name = data.name; - if (data.mapping !== void 0) texture.mapping = parseConstant(data.mapping, TEXTURE_MAPPING); - if (data.channel !== void 0) texture.channel = data.channel; - if (data.offset !== void 0) texture.offset.fromArray(data.offset); - if (data.repeat !== void 0) texture.repeat.fromArray(data.repeat); - if (data.center !== void 0) texture.center.fromArray(data.center); - if (data.rotation !== void 0) texture.rotation = data.rotation; - if (data.wrap !== void 0) { - texture.wrapS = parseConstant(data.wrap[0], TEXTURE_WRAPPING); - texture.wrapT = parseConstant(data.wrap[1], TEXTURE_WRAPPING); - } - if (data.format !== void 0) texture.format = data.format; - if (data.internalFormat !== void 0) texture.internalFormat = data.internalFormat; - if (data.type !== void 0) texture.type = data.type; - if (data.colorSpace !== void 0) texture.colorSpace = data.colorSpace; - if (data.minFilter !== void 0) texture.minFilter = parseConstant(data.minFilter, TEXTURE_FILTER); - if (data.magFilter !== void 0) texture.magFilter = parseConstant(data.magFilter, TEXTURE_FILTER); - if (data.anisotropy !== void 0) texture.anisotropy = data.anisotropy; - if (data.flipY !== void 0) texture.flipY = data.flipY; - if (data.generateMipmaps !== void 0) texture.generateMipmaps = data.generateMipmaps; - if (data.premultiplyAlpha !== void 0) texture.premultiplyAlpha = data.premultiplyAlpha; - if (data.unpackAlignment !== void 0) texture.unpackAlignment = data.unpackAlignment; - if (data.compareFunction !== void 0) texture.compareFunction = data.compareFunction; - if (data.userData !== void 0) texture.userData = data.userData; - textures[data.uuid] = texture; - } + toJSON(data) { + if (data.arrayBuffers === void 0) { + data.arrayBuffers = {}; } - return textures; - } - parseObject(data, geometries, materials, textures, animations) { - let object; - function getGeometry(name) { - if (geometries[name] === void 0) { - console.warn("THREE.ObjectLoader: Undefined geometry", name); - } - return geometries[name]; + if (this.array.buffer._uuid === void 0) { + this.array.buffer._uuid = generateUUID(); } - __name(getGeometry, "getGeometry"); - function getMaterial(name) { - if (name === void 0) return void 0; - if (Array.isArray(name)) { - const array = []; - for (let i = 0, l = name.length; i < l; i++) { - const uuid = name[i]; - if (materials[uuid] === void 0) { - console.warn("THREE.ObjectLoader: Undefined material", uuid); - } - array.push(materials[uuid]); - } - return array; - } - if (materials[name] === void 0) { - console.warn("THREE.ObjectLoader: Undefined material", name); - } - return materials[name]; + if (data.arrayBuffers[this.array.buffer._uuid] === void 0) { + data.arrayBuffers[this.array.buffer._uuid] = Array.from(new Uint32Array(this.array.buffer)); } - __name(getMaterial, "getMaterial"); - function getTexture(uuid) { - if (textures[uuid] === void 0) { - console.warn("THREE.ObjectLoader: Undefined texture", uuid); - } - return textures[uuid]; + return { + uuid: this.uuid, + buffer: this.array.buffer._uuid, + type: this.array.constructor.name, + stride: this.stride + }; + } +} +const _vector$6 = /* @__PURE__ */ new Vector3(); +class InterleavedBufferAttribute { + static { + __name(this, "InterleavedBufferAttribute"); + } + constructor(interleavedBuffer, itemSize, offset, normalized = false) { + this.isInterleavedBufferAttribute = true; + this.name = ""; + this.data = interleavedBuffer; + this.itemSize = itemSize; + this.offset = offset; + this.normalized = normalized; + } + get count() { + return this.data.count; + } + get array() { + return this.data.array; + } + set needsUpdate(value) { + this.data.needsUpdate = value; + } + applyMatrix4(m) { + for (let i = 0, l = this.data.count; i < l; i++) { + _vector$6.fromBufferAttribute(this, i); + _vector$6.applyMatrix4(m); + this.setXYZ(i, _vector$6.x, _vector$6.y, _vector$6.z); } - __name(getTexture, "getTexture"); - let geometry, material; - switch (data.type) { - case "Scene": - object = new Scene(); - if (data.background !== void 0) { - if (Number.isInteger(data.background)) { - object.background = new Color(data.background); - } else { - object.background = getTexture(data.background); - } - } - if (data.environment !== void 0) { - object.environment = getTexture(data.environment); - } - if (data.fog !== void 0) { - if (data.fog.type === "Fog") { - object.fog = new Fog(data.fog.color, data.fog.near, data.fog.far); - } else if (data.fog.type === "FogExp2") { - object.fog = new FogExp2(data.fog.color, data.fog.density); - } - if (data.fog.name !== "") { - object.fog.name = data.fog.name; - } - } - if (data.backgroundBlurriness !== void 0) object.backgroundBlurriness = data.backgroundBlurriness; - if (data.backgroundIntensity !== void 0) object.backgroundIntensity = data.backgroundIntensity; - if (data.backgroundRotation !== void 0) object.backgroundRotation.fromArray(data.backgroundRotation); - if (data.environmentIntensity !== void 0) object.environmentIntensity = data.environmentIntensity; - if (data.environmentRotation !== void 0) object.environmentRotation.fromArray(data.environmentRotation); - break; - case "PerspectiveCamera": - object = new PerspectiveCamera(data.fov, data.aspect, data.near, data.far); - if (data.focus !== void 0) object.focus = data.focus; - if (data.zoom !== void 0) object.zoom = data.zoom; - if (data.filmGauge !== void 0) object.filmGauge = data.filmGauge; - if (data.filmOffset !== void 0) object.filmOffset = data.filmOffset; - if (data.view !== void 0) object.view = Object.assign({}, data.view); - break; - case "OrthographicCamera": - object = new OrthographicCamera(data.left, data.right, data.top, data.bottom, data.near, data.far); - if (data.zoom !== void 0) object.zoom = data.zoom; - if (data.view !== void 0) object.view = Object.assign({}, data.view); - break; - case "AmbientLight": - object = new AmbientLight(data.color, data.intensity); - break; - case "DirectionalLight": - object = new DirectionalLight(data.color, data.intensity); - object.target = data.target || ""; - break; - case "PointLight": - object = new PointLight(data.color, data.intensity, data.distance, data.decay); - break; - case "RectAreaLight": - object = new RectAreaLight(data.color, data.intensity, data.width, data.height); - break; - case "SpotLight": - object = new SpotLight(data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay); - object.target = data.target || ""; - break; - case "HemisphereLight": - object = new HemisphereLight(data.color, data.groundColor, data.intensity); - break; - case "LightProbe": - object = new LightProbe().fromJSON(data); - break; - case "SkinnedMesh": - geometry = getGeometry(data.geometry); - material = getMaterial(data.material); - object = new SkinnedMesh(geometry, material); - if (data.bindMode !== void 0) object.bindMode = data.bindMode; - if (data.bindMatrix !== void 0) object.bindMatrix.fromArray(data.bindMatrix); - if (data.skeleton !== void 0) object.skeleton = data.skeleton; - break; - case "Mesh": - geometry = getGeometry(data.geometry); - material = getMaterial(data.material); - object = new Mesh(geometry, material); - break; - case "InstancedMesh": - geometry = getGeometry(data.geometry); - material = getMaterial(data.material); - const count = data.count; - const instanceMatrix = data.instanceMatrix; - const instanceColor = data.instanceColor; - object = new InstancedMesh(geometry, material, count); - object.instanceMatrix = new InstancedBufferAttribute(new Float32Array(instanceMatrix.array), 16); - if (instanceColor !== void 0) object.instanceColor = new InstancedBufferAttribute(new Float32Array(instanceColor.array), instanceColor.itemSize); - break; - case "BatchedMesh": - geometry = getGeometry(data.geometry); - material = getMaterial(data.material); - object = new BatchedMesh(data.maxInstanceCount, data.maxVertexCount, data.maxIndexCount, material); - object.geometry = geometry; - object.perObjectFrustumCulled = data.perObjectFrustumCulled; - object.sortObjects = data.sortObjects; - object._drawRanges = data.drawRanges; - object._reservedRanges = data.reservedRanges; - object._visibility = data.visibility; - object._active = data.active; - object._bounds = data.bounds.map((bound) => { - const box = new Box3(); - box.min.fromArray(bound.boxMin); - box.max.fromArray(bound.boxMax); - const sphere = new Sphere(); - sphere.radius = bound.sphereRadius; - sphere.center.fromArray(bound.sphereCenter); - return { - boxInitialized: bound.boxInitialized, - box, - sphereInitialized: bound.sphereInitialized, - sphere - }; - }); - object._maxInstanceCount = data.maxInstanceCount; - object._maxVertexCount = data.maxVertexCount; - object._maxIndexCount = data.maxIndexCount; - object._geometryInitialized = data.geometryInitialized; - object._geometryCount = data.geometryCount; - object._matricesTexture = getTexture(data.matricesTexture.uuid); - if (data.colorsTexture !== void 0) object._colorsTexture = getTexture(data.colorsTexture.uuid); - break; - case "LOD": - object = new LOD(); - break; - case "Line": - object = new Line(getGeometry(data.geometry), getMaterial(data.material)); - break; - case "LineLoop": - object = new LineLoop(getGeometry(data.geometry), getMaterial(data.material)); - break; - case "LineSegments": - object = new LineSegments(getGeometry(data.geometry), getMaterial(data.material)); - break; - case "PointCloud": - case "Points": - object = new Points(getGeometry(data.geometry), getMaterial(data.material)); - break; - case "Sprite": - object = new Sprite(getMaterial(data.material)); - break; - case "Group": - object = new Group(); - break; - case "Bone": - object = new Bone(); - break; - default: - object = new Object3D(); + return this; + } + applyNormalMatrix(m) { + for (let i = 0, l = this.count; i < l; i++) { + _vector$6.fromBufferAttribute(this, i); + _vector$6.applyNormalMatrix(m); + this.setXYZ(i, _vector$6.x, _vector$6.y, _vector$6.z); } - object.uuid = data.uuid; - if (data.name !== void 0) object.name = data.name; - if (data.matrix !== void 0) { - object.matrix.fromArray(data.matrix); - if (data.matrixAutoUpdate !== void 0) object.matrixAutoUpdate = data.matrixAutoUpdate; - if (object.matrixAutoUpdate) object.matrix.decompose(object.position, object.quaternion, object.scale); - } else { - if (data.position !== void 0) object.position.fromArray(data.position); - if (data.rotation !== void 0) object.rotation.fromArray(data.rotation); - if (data.quaternion !== void 0) object.quaternion.fromArray(data.quaternion); - if (data.scale !== void 0) object.scale.fromArray(data.scale); + return this; + } + transformDirection(m) { + for (let i = 0, l = this.count; i < l; i++) { + _vector$6.fromBufferAttribute(this, i); + _vector$6.transformDirection(m); + this.setXYZ(i, _vector$6.x, _vector$6.y, _vector$6.z); } - if (data.up !== void 0) object.up.fromArray(data.up); - if (data.castShadow !== void 0) object.castShadow = data.castShadow; - if (data.receiveShadow !== void 0) object.receiveShadow = data.receiveShadow; - if (data.shadow) { - if (data.shadow.intensity !== void 0) object.shadow.intensity = data.shadow.intensity; - if (data.shadow.bias !== void 0) object.shadow.bias = data.shadow.bias; - if (data.shadow.normalBias !== void 0) object.shadow.normalBias = data.shadow.normalBias; - if (data.shadow.radius !== void 0) object.shadow.radius = data.shadow.radius; - if (data.shadow.mapSize !== void 0) object.shadow.mapSize.fromArray(data.shadow.mapSize); - if (data.shadow.camera !== void 0) object.shadow.camera = this.parseObject(data.shadow.camera); + return this; + } + getComponent(index, component) { + let value = this.array[index * this.data.stride + this.offset + component]; + if (this.normalized) value = denormalize(value, this.array); + return value; + } + setComponent(index, component, value) { + if (this.normalized) value = normalize(value, this.array); + this.data.array[index * this.data.stride + this.offset + component] = value; + return this; + } + setX(index, x) { + if (this.normalized) x = normalize(x, this.array); + this.data.array[index * this.data.stride + this.offset] = x; + return this; + } + setY(index, y) { + if (this.normalized) y = normalize(y, this.array); + this.data.array[index * this.data.stride + this.offset + 1] = y; + return this; + } + setZ(index, z) { + if (this.normalized) z = normalize(z, this.array); + this.data.array[index * this.data.stride + this.offset + 2] = z; + return this; + } + setW(index, w) { + if (this.normalized) w = normalize(w, this.array); + this.data.array[index * this.data.stride + this.offset + 3] = w; + return this; + } + getX(index) { + let x = this.data.array[index * this.data.stride + this.offset]; + if (this.normalized) x = denormalize(x, this.array); + return x; + } + getY(index) { + let y = this.data.array[index * this.data.stride + this.offset + 1]; + if (this.normalized) y = denormalize(y, this.array); + return y; + } + getZ(index) { + let z = this.data.array[index * this.data.stride + this.offset + 2]; + if (this.normalized) z = denormalize(z, this.array); + return z; + } + getW(index) { + let w = this.data.array[index * this.data.stride + this.offset + 3]; + if (this.normalized) w = denormalize(w, this.array); + return w; + } + setXY(index, x, y) { + index = index * this.data.stride + this.offset; + if (this.normalized) { + x = normalize(x, this.array); + y = normalize(y, this.array); } - if (data.visible !== void 0) object.visible = data.visible; - if (data.frustumCulled !== void 0) object.frustumCulled = data.frustumCulled; - if (data.renderOrder !== void 0) object.renderOrder = data.renderOrder; - if (data.userData !== void 0) object.userData = data.userData; - if (data.layers !== void 0) object.layers.mask = data.layers; - if (data.children !== void 0) { - const children = data.children; - for (let i = 0; i < children.length; i++) { - object.add(this.parseObject(children[i], geometries, materials, textures, animations)); - } + this.data.array[index + 0] = x; + this.data.array[index + 1] = y; + return this; + } + setXYZ(index, x, y, z) { + index = index * this.data.stride + this.offset; + if (this.normalized) { + x = normalize(x, this.array); + y = normalize(y, this.array); + z = normalize(z, this.array); } - if (data.animations !== void 0) { - const objectAnimations = data.animations; - for (let i = 0; i < objectAnimations.length; i++) { - const uuid = objectAnimations[i]; - object.animations.push(animations[uuid]); - } + this.data.array[index + 0] = x; + this.data.array[index + 1] = y; + this.data.array[index + 2] = z; + return this; + } + setXYZW(index, x, y, z, w) { + index = index * this.data.stride + this.offset; + if (this.normalized) { + x = normalize(x, this.array); + y = normalize(y, this.array); + z = normalize(z, this.array); + w = normalize(w, this.array); } - if (data.type === "LOD") { - if (data.autoUpdate !== void 0) object.autoUpdate = data.autoUpdate; - const levels = data.levels; - for (let l = 0; l < levels.length; l++) { - const level = levels[l]; - const child = object.getObjectByProperty("uuid", level.object); - if (child !== void 0) { - object.addLevel(child, level.distance, level.hysteresis); + this.data.array[index + 0] = x; + this.data.array[index + 1] = y; + this.data.array[index + 2] = z; + this.data.array[index + 3] = w; + return this; + } + clone(data) { + if (data === void 0) { + console.log("THREE.InterleavedBufferAttribute.clone(): Cloning an interleaved buffer attribute will de-interleave buffer data."); + const array = []; + for (let i = 0; i < this.count; i++) { + const index = i * this.data.stride + this.offset; + for (let j = 0; j < this.itemSize; j++) { + array.push(this.data.array[index + j]); } } + return new BufferAttribute(new this.array.constructor(array), this.itemSize, this.normalized); + } else { + if (data.interleavedBuffers === void 0) { + data.interleavedBuffers = {}; + } + if (data.interleavedBuffers[this.data.uuid] === void 0) { + data.interleavedBuffers[this.data.uuid] = this.data.clone(data); + } + return new InterleavedBufferAttribute(data.interleavedBuffers[this.data.uuid], this.itemSize, this.offset, this.normalized); } - return object; } - bindSkeletons(object, skeletons) { - if (Object.keys(skeletons).length === 0) return; - object.traverse(function(child) { - if (child.isSkinnedMesh === true && child.skeleton !== void 0) { - const skeleton = skeletons[child.skeleton]; - if (skeleton === void 0) { - console.warn("THREE.ObjectLoader: No skeleton found with UUID:", child.skeleton); - } else { - child.bind(skeleton, child.bindMatrix); + toJSON(data) { + if (data === void 0) { + console.log("THREE.InterleavedBufferAttribute.toJSON(): Serializing an interleaved buffer attribute will de-interleave buffer data."); + const array = []; + for (let i = 0; i < this.count; i++) { + const index = i * this.data.stride + this.offset; + for (let j = 0; j < this.itemSize; j++) { + array.push(this.data.array[index + j]); } } - }); - } - bindLightTargets(object) { - object.traverse(function(child) { - if (child.isDirectionalLight || child.isSpotLight) { - const uuid = child.target; - const target = object.getObjectByProperty("uuid", uuid); - if (target !== void 0) { - child.target = target; - } else { - child.target = new Object3D(); - } + return { + itemSize: this.itemSize, + type: this.array.constructor.name, + array, + normalized: this.normalized + }; + } else { + if (data.interleavedBuffers === void 0) { + data.interleavedBuffers = {}; } - }); - } -} -const TEXTURE_MAPPING = { - UVMapping, - CubeReflectionMapping, - CubeRefractionMapping, - EquirectangularReflectionMapping, - EquirectangularRefractionMapping, - CubeUVReflectionMapping -}; -const TEXTURE_WRAPPING = { - RepeatWrapping, - ClampToEdgeWrapping, - MirroredRepeatWrapping -}; -const TEXTURE_FILTER = { - NearestFilter, - NearestMipmapNearestFilter, - NearestMipmapLinearFilter, - LinearFilter, - LinearMipmapNearestFilter, - LinearMipmapLinearFilter -}; -class ImageBitmapLoader extends Loader { - static { - __name(this, "ImageBitmapLoader"); - } - constructor(manager) { - super(manager); - this.isImageBitmapLoader = true; - if (typeof createImageBitmap === "undefined") { - console.warn("THREE.ImageBitmapLoader: createImageBitmap() not supported."); - } - if (typeof fetch === "undefined") { - console.warn("THREE.ImageBitmapLoader: fetch() not supported."); - } - this.options = { premultiplyAlpha: "none" }; - } - setOptions(options) { - this.options = options; - return this; - } - load(url, onLoad, onProgress, onError) { - if (url === void 0) url = ""; - if (this.path !== void 0) url = this.path + url; - url = this.manager.resolveURL(url); - const scope = this; - const cached = Cache.get(url); - if (cached !== void 0) { - scope.manager.itemStart(url); - if (cached.then) { - cached.then((imageBitmap) => { - if (onLoad) onLoad(imageBitmap); - scope.manager.itemEnd(url); - }).catch((e) => { - if (onError) onError(e); - }); - return; + if (data.interleavedBuffers[this.data.uuid] === void 0) { + data.interleavedBuffers[this.data.uuid] = this.data.toJSON(data); } - setTimeout(function() { - if (onLoad) onLoad(cached); - scope.manager.itemEnd(url); - }, 0); - return cached; + return { + isInterleavedBufferAttribute: true, + itemSize: this.itemSize, + data: this.data.uuid, + offset: this.offset, + normalized: this.normalized + }; } - const fetchOptions = {}; - fetchOptions.credentials = this.crossOrigin === "anonymous" ? "same-origin" : "include"; - fetchOptions.headers = this.requestHeader; - const promise = fetch(url, fetchOptions).then(function(res) { - return res.blob(); - }).then(function(blob) { - return createImageBitmap(blob, Object.assign(scope.options, { colorSpaceConversion: "none" })); - }).then(function(imageBitmap) { - Cache.add(url, imageBitmap); - if (onLoad) onLoad(imageBitmap); - scope.manager.itemEnd(url); - return imageBitmap; - }).catch(function(e) { - if (onError) onError(e); - Cache.remove(url); - scope.manager.itemError(url); - scope.manager.itemEnd(url); - }); - Cache.add(url, promise); - scope.manager.itemStart(url); } } -let _context; -class AudioContext { +class SpriteMaterial extends Material { static { - __name(this, "AudioContext"); + __name(this, "SpriteMaterial"); } - static getContext() { - if (_context === void 0) { - _context = new (window.AudioContext || window.webkitAudioContext)(); - } - return _context; + static get type() { + return "SpriteMaterial"; } - static setContext(value) { - _context = value; + constructor(parameters) { + super(); + this.isSpriteMaterial = true; + this.color = new Color(16777215); + this.map = null; + this.alphaMap = null; + this.rotation = 0; + this.sizeAttenuation = true; + this.transparent = true; + this.fog = true; + this.setValues(parameters); + } + copy(source) { + super.copy(source); + this.color.copy(source.color); + this.map = source.map; + this.alphaMap = source.alphaMap; + this.rotation = source.rotation; + this.sizeAttenuation = source.sizeAttenuation; + this.fog = source.fog; + return this; } } -class AudioLoader extends Loader { +let _geometry; +const _intersectPoint = /* @__PURE__ */ new Vector3(); +const _worldScale = /* @__PURE__ */ new Vector3(); +const _mvPosition = /* @__PURE__ */ new Vector3(); +const _alignedPosition = /* @__PURE__ */ new Vector2(); +const _rotatedPosition = /* @__PURE__ */ new Vector2(); +const _viewWorldMatrix = /* @__PURE__ */ new Matrix4(); +const _vA$2 = /* @__PURE__ */ new Vector3(); +const _vB$2 = /* @__PURE__ */ new Vector3(); +const _vC$2 = /* @__PURE__ */ new Vector3(); +const _uvA = /* @__PURE__ */ new Vector2(); +const _uvB = /* @__PURE__ */ new Vector2(); +const _uvC = /* @__PURE__ */ new Vector2(); +class Sprite extends Object3D { static { - __name(this, "AudioLoader"); + __name(this, "Sprite"); } - constructor(manager) { - super(manager); + constructor(material = new SpriteMaterial()) { + super(); + this.isSprite = true; + this.type = "Sprite"; + if (_geometry === void 0) { + _geometry = new BufferGeometry(); + const float32Array = new Float32Array([ + -0.5, + -0.5, + 0, + 0, + 0, + 0.5, + -0.5, + 0, + 1, + 0, + 0.5, + 0.5, + 0, + 1, + 1, + -0.5, + 0.5, + 0, + 0, + 1 + ]); + const interleavedBuffer = new InterleavedBuffer(float32Array, 5); + _geometry.setIndex([0, 1, 2, 0, 2, 3]); + _geometry.setAttribute("position", new InterleavedBufferAttribute(interleavedBuffer, 3, 0, false)); + _geometry.setAttribute("uv", new InterleavedBufferAttribute(interleavedBuffer, 2, 3, false)); + } + this.geometry = _geometry; + this.material = material; + this.center = new Vector2(0.5, 0.5); } - load(url, onLoad, onProgress, onError) { - const scope = this; - const loader = new FileLoader(this.manager); - loader.setResponseType("arraybuffer"); - loader.setPath(this.path); - loader.setRequestHeader(this.requestHeader); - loader.setWithCredentials(this.withCredentials); - loader.load(url, function(buffer) { - try { - const bufferCopy = buffer.slice(0); - const context = AudioContext.getContext(); - context.decodeAudioData(bufferCopy, function(audioBuffer) { - onLoad(audioBuffer); - }).catch(handleError); - } catch (e) { - handleError(e); - } - }, onProgress, onError); - function handleError(e) { - if (onError) { - onError(e); - } else { - console.error(e); + raycast(raycaster, intersects2) { + if (raycaster.camera === null) { + console.error('THREE.Sprite: "Raycaster.camera" needs to be set in order to raycast against sprites.'); + } + _worldScale.setFromMatrixScale(this.matrixWorld); + _viewWorldMatrix.copy(raycaster.camera.matrixWorld); + this.modelViewMatrix.multiplyMatrices(raycaster.camera.matrixWorldInverse, this.matrixWorld); + _mvPosition.setFromMatrixPosition(this.modelViewMatrix); + if (raycaster.camera.isPerspectiveCamera && this.material.sizeAttenuation === false) { + _worldScale.multiplyScalar(-_mvPosition.z); + } + const rotation = this.material.rotation; + let sin, cos; + if (rotation !== 0) { + cos = Math.cos(rotation); + sin = Math.sin(rotation); + } + const center = this.center; + transformVertex(_vA$2.set(-0.5, -0.5, 0), _mvPosition, center, _worldScale, sin, cos); + transformVertex(_vB$2.set(0.5, -0.5, 0), _mvPosition, center, _worldScale, sin, cos); + transformVertex(_vC$2.set(0.5, 0.5, 0), _mvPosition, center, _worldScale, sin, cos); + _uvA.set(0, 0); + _uvB.set(1, 0); + _uvC.set(1, 1); + let intersect2 = raycaster.ray.intersectTriangle(_vA$2, _vB$2, _vC$2, false, _intersectPoint); + if (intersect2 === null) { + transformVertex(_vB$2.set(-0.5, 0.5, 0), _mvPosition, center, _worldScale, sin, cos); + _uvB.set(0, 1); + intersect2 = raycaster.ray.intersectTriangle(_vA$2, _vC$2, _vB$2, false, _intersectPoint); + if (intersect2 === null) { + return; } - scope.manager.itemError(url); } - __name(handleError, "handleError"); + const distance = raycaster.ray.origin.distanceTo(_intersectPoint); + if (distance < raycaster.near || distance > raycaster.far) return; + intersects2.push({ + distance, + point: _intersectPoint.clone(), + uv: Triangle.getInterpolation(_intersectPoint, _vA$2, _vB$2, _vC$2, _uvA, _uvB, _uvC, new Vector2()), + face: null, + object: this + }); + } + copy(source, recursive) { + super.copy(source, recursive); + if (source.center !== void 0) this.center.copy(source.center); + this.material = source.material; + return this; } } -const _eyeRight = /* @__PURE__ */ new Matrix4(); -const _eyeLeft = /* @__PURE__ */ new Matrix4(); -const _projectionMatrix = /* @__PURE__ */ new Matrix4(); -class StereoCamera { +function transformVertex(vertexPosition, mvPosition, center, scale, sin, cos) { + _alignedPosition.subVectors(vertexPosition, center).addScalar(0.5).multiply(scale); + if (sin !== void 0) { + _rotatedPosition.x = cos * _alignedPosition.x - sin * _alignedPosition.y; + _rotatedPosition.y = sin * _alignedPosition.x + cos * _alignedPosition.y; + } else { + _rotatedPosition.copy(_alignedPosition); + } + vertexPosition.copy(mvPosition); + vertexPosition.x += _rotatedPosition.x; + vertexPosition.y += _rotatedPosition.y; + vertexPosition.applyMatrix4(_viewWorldMatrix); +} +__name(transformVertex, "transformVertex"); +const _v1$2 = /* @__PURE__ */ new Vector3(); +const _v2$1 = /* @__PURE__ */ new Vector3(); +class LOD extends Object3D { static { - __name(this, "StereoCamera"); + __name(this, "LOD"); } constructor() { - this.type = "StereoCamera"; - this.aspect = 1; - this.eyeSep = 0.064; - this.cameraL = new PerspectiveCamera(); - this.cameraL.layers.enable(1); - this.cameraL.matrixAutoUpdate = false; - this.cameraR = new PerspectiveCamera(); - this.cameraR.layers.enable(2); - this.cameraR.matrixAutoUpdate = false; - this._cache = { - focus: null, - fov: null, - aspect: null, - near: null, - far: null, - zoom: null, - eyeSep: null - }; + super(); + this._currentLevel = 0; + this.type = "LOD"; + Object.defineProperties(this, { + levels: { + enumerable: true, + value: [] + }, + isLOD: { + value: true + } + }); + this.autoUpdate = true; } - update(camera) { - const cache = this._cache; - const needsUpdate = cache.focus !== camera.focus || cache.fov !== camera.fov || cache.aspect !== camera.aspect * this.aspect || cache.near !== camera.near || cache.far !== camera.far || cache.zoom !== camera.zoom || cache.eyeSep !== this.eyeSep; - if (needsUpdate) { - cache.focus = camera.focus; - cache.fov = camera.fov; - cache.aspect = camera.aspect * this.aspect; - cache.near = camera.near; - cache.far = camera.far; - cache.zoom = camera.zoom; - cache.eyeSep = this.eyeSep; - _projectionMatrix.copy(camera.projectionMatrix); - const eyeSepHalf = cache.eyeSep / 2; - const eyeSepOnProjection = eyeSepHalf * cache.near / cache.focus; - const ymax = cache.near * Math.tan(DEG2RAD * cache.fov * 0.5) / cache.zoom; - let xmin, xmax; - _eyeLeft.elements[12] = -eyeSepHalf; - _eyeRight.elements[12] = eyeSepHalf; - xmin = -ymax * cache.aspect + eyeSepOnProjection; - xmax = ymax * cache.aspect + eyeSepOnProjection; - _projectionMatrix.elements[0] = 2 * cache.near / (xmax - xmin); - _projectionMatrix.elements[8] = (xmax + xmin) / (xmax - xmin); - this.cameraL.projectionMatrix.copy(_projectionMatrix); - xmin = -ymax * cache.aspect - eyeSepOnProjection; - xmax = ymax * cache.aspect - eyeSepOnProjection; - _projectionMatrix.elements[0] = 2 * cache.near / (xmax - xmin); - _projectionMatrix.elements[8] = (xmax + xmin) / (xmax - xmin); - this.cameraR.projectionMatrix.copy(_projectionMatrix); + copy(source) { + super.copy(source, false); + const levels = source.levels; + for (let i = 0, l = levels.length; i < l; i++) { + const level = levels[i]; + this.addLevel(level.object.clone(), level.distance, level.hysteresis); } - this.cameraL.matrixWorld.copy(camera.matrixWorld).multiply(_eyeLeft); - this.cameraR.matrixWorld.copy(camera.matrixWorld).multiply(_eyeRight); - } -} -class Clock { - static { - __name(this, "Clock"); + this.autoUpdate = source.autoUpdate; + return this; } - constructor(autoStart = true) { - this.autoStart = autoStart; - this.startTime = 0; - this.oldTime = 0; - this.elapsedTime = 0; - this.running = false; + addLevel(object, distance = 0, hysteresis = 0) { + distance = Math.abs(distance); + const levels = this.levels; + let l; + for (l = 0; l < levels.length; l++) { + if (distance < levels[l].distance) { + break; + } + } + levels.splice(l, 0, { distance, hysteresis, object }); + this.add(object); + return this; } - start() { - this.startTime = now(); - this.oldTime = this.startTime; - this.elapsedTime = 0; - this.running = true; + removeLevel(distance) { + const levels = this.levels; + for (let i = 0; i < levels.length; i++) { + if (levels[i].distance === distance) { + const removedElements = levels.splice(i, 1); + this.remove(removedElements[0].object); + return true; + } + } + return false; } - stop() { - this.getElapsedTime(); - this.running = false; - this.autoStart = false; + getCurrentLevel() { + return this._currentLevel; } - getElapsedTime() { - this.getDelta(); - return this.elapsedTime; + getObjectForDistance(distance) { + const levels = this.levels; + if (levels.length > 0) { + let i, l; + for (i = 1, l = levels.length; i < l; i++) { + let levelDistance = levels[i].distance; + if (levels[i].object.visible) { + levelDistance -= levelDistance * levels[i].hysteresis; + } + if (distance < levelDistance) { + break; + } + } + return levels[i - 1].object; + } + return null; } - getDelta() { - let diff = 0; - if (this.autoStart && !this.running) { - this.start(); - return 0; + raycast(raycaster, intersects2) { + const levels = this.levels; + if (levels.length > 0) { + _v1$2.setFromMatrixPosition(this.matrixWorld); + const distance = raycaster.ray.origin.distanceTo(_v1$2); + this.getObjectForDistance(distance).raycast(raycaster, intersects2); } - if (this.running) { - const newTime = now(); - diff = (newTime - this.oldTime) / 1e3; - this.oldTime = newTime; - this.elapsedTime += diff; + } + update(camera) { + const levels = this.levels; + if (levels.length > 1) { + _v1$2.setFromMatrixPosition(camera.matrixWorld); + _v2$1.setFromMatrixPosition(this.matrixWorld); + const distance = _v1$2.distanceTo(_v2$1) / camera.zoom; + levels[0].object.visible = true; + let i, l; + for (i = 1, l = levels.length; i < l; i++) { + let levelDistance = levels[i].distance; + if (levels[i].object.visible) { + levelDistance -= levelDistance * levels[i].hysteresis; + } + if (distance >= levelDistance) { + levels[i - 1].object.visible = false; + levels[i].object.visible = true; + } else { + break; + } + } + this._currentLevel = i - 1; + for (; i < l; i++) { + levels[i].object.visible = false; + } } - return diff; + } + toJSON(meta) { + const data = super.toJSON(meta); + if (this.autoUpdate === false) data.object.autoUpdate = false; + data.object.levels = []; + const levels = this.levels; + for (let i = 0, l = levels.length; i < l; i++) { + const level = levels[i]; + data.object.levels.push({ + object: level.object.uuid, + distance: level.distance, + hysteresis: level.hysteresis + }); + } + return data; } } -function now() { - return performance.now(); -} -__name(now, "now"); -const _position$1 = /* @__PURE__ */ new Vector3(); -const _quaternion$1 = /* @__PURE__ */ new Quaternion(); -const _scale$1 = /* @__PURE__ */ new Vector3(); -const _orientation$1 = /* @__PURE__ */ new Vector3(); -class AudioListener extends Object3D { +const _basePosition = /* @__PURE__ */ new Vector3(); +const _skinIndex = /* @__PURE__ */ new Vector4(); +const _skinWeight = /* @__PURE__ */ new Vector4(); +const _vector3 = /* @__PURE__ */ new Vector3(); +const _matrix4 = /* @__PURE__ */ new Matrix4(); +const _vertex = /* @__PURE__ */ new Vector3(); +const _sphere$4 = /* @__PURE__ */ new Sphere(); +const _inverseMatrix$2 = /* @__PURE__ */ new Matrix4(); +const _ray$2 = /* @__PURE__ */ new Ray(); +class SkinnedMesh extends Mesh { static { - __name(this, "AudioListener"); + __name(this, "SkinnedMesh"); } - constructor() { - super(); - this.type = "AudioListener"; - this.context = AudioContext.getContext(); - this.gain = this.context.createGain(); - this.gain.connect(this.context.destination); - this.filter = null; - this.timeDelta = 0; - this._clock = new Clock(); + constructor(geometry, material) { + super(geometry, material); + this.isSkinnedMesh = true; + this.type = "SkinnedMesh"; + this.bindMode = AttachedBindMode; + this.bindMatrix = new Matrix4(); + this.bindMatrixInverse = new Matrix4(); + this.boundingBox = null; + this.boundingSphere = null; } - getInput() { - return this.gain; + computeBoundingBox() { + const geometry = this.geometry; + if (this.boundingBox === null) { + this.boundingBox = new Box3(); + } + this.boundingBox.makeEmpty(); + const positionAttribute = geometry.getAttribute("position"); + for (let i = 0; i < positionAttribute.count; i++) { + this.getVertexPosition(i, _vertex); + this.boundingBox.expandByPoint(_vertex); + } } - removeFilter() { - if (this.filter !== null) { - this.gain.disconnect(this.filter); - this.filter.disconnect(this.context.destination); - this.gain.connect(this.context.destination); - this.filter = null; + computeBoundingSphere() { + const geometry = this.geometry; + if (this.boundingSphere === null) { + this.boundingSphere = new Sphere(); } + this.boundingSphere.makeEmpty(); + const positionAttribute = geometry.getAttribute("position"); + for (let i = 0; i < positionAttribute.count; i++) { + this.getVertexPosition(i, _vertex); + this.boundingSphere.expandByPoint(_vertex); + } + } + copy(source, recursive) { + super.copy(source, recursive); + this.bindMode = source.bindMode; + this.bindMatrix.copy(source.bindMatrix); + this.bindMatrixInverse.copy(source.bindMatrixInverse); + this.skeleton = source.skeleton; + if (source.boundingBox !== null) this.boundingBox = source.boundingBox.clone(); + if (source.boundingSphere !== null) this.boundingSphere = source.boundingSphere.clone(); return this; } - getFilter() { - return this.filter; + raycast(raycaster, intersects2) { + const material = this.material; + const matrixWorld = this.matrixWorld; + if (material === void 0) return; + if (this.boundingSphere === null) this.computeBoundingSphere(); + _sphere$4.copy(this.boundingSphere); + _sphere$4.applyMatrix4(matrixWorld); + if (raycaster.ray.intersectsSphere(_sphere$4) === false) return; + _inverseMatrix$2.copy(matrixWorld).invert(); + _ray$2.copy(raycaster.ray).applyMatrix4(_inverseMatrix$2); + if (this.boundingBox !== null) { + if (_ray$2.intersectsBox(this.boundingBox) === false) return; + } + this._computeIntersections(raycaster, intersects2, _ray$2); } - setFilter(value) { - if (this.filter !== null) { - this.gain.disconnect(this.filter); - this.filter.disconnect(this.context.destination); - } else { - this.gain.disconnect(this.context.destination); + getVertexPosition(index, target) { + super.getVertexPosition(index, target); + this.applyBoneTransform(index, target); + return target; + } + bind(skeleton, bindMatrix) { + this.skeleton = skeleton; + if (bindMatrix === void 0) { + this.updateMatrixWorld(true); + this.skeleton.calculateInverses(); + bindMatrix = this.matrixWorld; } - this.filter = value; - this.gain.connect(this.filter); - this.filter.connect(this.context.destination); - return this; + this.bindMatrix.copy(bindMatrix); + this.bindMatrixInverse.copy(bindMatrix).invert(); } - getMasterVolume() { - return this.gain.gain.value; + pose() { + this.skeleton.pose(); } - setMasterVolume(value) { - this.gain.gain.setTargetAtTime(value, this.context.currentTime, 0.01); - return this; + normalizeSkinWeights() { + const vector = new Vector4(); + const skinWeight = this.geometry.attributes.skinWeight; + for (let i = 0, l = skinWeight.count; i < l; i++) { + vector.fromBufferAttribute(skinWeight, i); + const scale = 1 / vector.manhattanLength(); + if (scale !== Infinity) { + vector.multiplyScalar(scale); + } else { + vector.set(1, 0, 0, 0); + } + skinWeight.setXYZW(i, vector.x, vector.y, vector.z, vector.w); + } } updateMatrixWorld(force) { super.updateMatrixWorld(force); - const listener = this.context.listener; - const up = this.up; - this.timeDelta = this._clock.getDelta(); - this.matrixWorld.decompose(_position$1, _quaternion$1, _scale$1); - _orientation$1.set(0, 0, -1).applyQuaternion(_quaternion$1); - if (listener.positionX) { - const endTime = this.context.currentTime + this.timeDelta; - listener.positionX.linearRampToValueAtTime(_position$1.x, endTime); - listener.positionY.linearRampToValueAtTime(_position$1.y, endTime); - listener.positionZ.linearRampToValueAtTime(_position$1.z, endTime); - listener.forwardX.linearRampToValueAtTime(_orientation$1.x, endTime); - listener.forwardY.linearRampToValueAtTime(_orientation$1.y, endTime); - listener.forwardZ.linearRampToValueAtTime(_orientation$1.z, endTime); - listener.upX.linearRampToValueAtTime(up.x, endTime); - listener.upY.linearRampToValueAtTime(up.y, endTime); - listener.upZ.linearRampToValueAtTime(up.z, endTime); + if (this.bindMode === AttachedBindMode) { + this.bindMatrixInverse.copy(this.matrixWorld).invert(); + } else if (this.bindMode === DetachedBindMode) { + this.bindMatrixInverse.copy(this.bindMatrix).invert(); } else { - listener.setPosition(_position$1.x, _position$1.y, _position$1.z); - listener.setOrientation(_orientation$1.x, _orientation$1.y, _orientation$1.z, up.x, up.y, up.z); + console.warn("THREE.SkinnedMesh: Unrecognized bindMode: " + this.bindMode); + } + } + applyBoneTransform(index, vector) { + const skeleton = this.skeleton; + const geometry = this.geometry; + _skinIndex.fromBufferAttribute(geometry.attributes.skinIndex, index); + _skinWeight.fromBufferAttribute(geometry.attributes.skinWeight, index); + _basePosition.copy(vector).applyMatrix4(this.bindMatrix); + vector.set(0, 0, 0); + for (let i = 0; i < 4; i++) { + const weight = _skinWeight.getComponent(i); + if (weight !== 0) { + const boneIndex = _skinIndex.getComponent(i); + _matrix4.multiplyMatrices(skeleton.bones[boneIndex].matrixWorld, skeleton.boneInverses[boneIndex]); + vector.addScaledVector(_vector3.copy(_basePosition).applyMatrix4(_matrix4), weight); + } } + return vector.applyMatrix4(this.bindMatrixInverse); } } -class Audio extends Object3D { +class Bone extends Object3D { static { - __name(this, "Audio"); + __name(this, "Bone"); } - constructor(listener) { + constructor() { super(); - this.type = "Audio"; - this.listener = listener; - this.context = listener.context; - this.gain = this.context.createGain(); - this.gain.connect(listener.getInput()); - this.autoplay = false; - this.buffer = null; - this.detune = 0; - this.loop = false; - this.loopStart = 0; - this.loopEnd = 0; - this.offset = 0; - this.duration = void 0; - this.playbackRate = 1; - this.isPlaying = false; - this.hasPlaybackControl = true; - this.source = null; - this.sourceType = "empty"; - this._startedAt = 0; - this._progress = 0; - this._connected = false; - this.filters = []; - } - getOutput() { - return this.gain; + this.isBone = true; + this.type = "Bone"; } - setNodeSource(audioNode) { - this.hasPlaybackControl = false; - this.sourceType = "audioNode"; - this.source = audioNode; - this.connect(); - return this; +} +class DataTexture extends Texture { + static { + __name(this, "DataTexture"); } - setMediaElementSource(mediaElement) { - this.hasPlaybackControl = false; - this.sourceType = "mediaNode"; - this.source = this.context.createMediaElementSource(mediaElement); - this.connect(); - return this; + constructor(data = null, width = 1, height = 1, format, type, mapping, wrapS, wrapT, magFilter = NearestFilter, minFilter = NearestFilter, anisotropy, colorSpace) { + super(null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace); + this.isDataTexture = true; + this.image = { data, width, height }; + this.generateMipmaps = false; + this.flipY = false; + this.unpackAlignment = 1; } - setMediaStreamSource(mediaStream) { - this.hasPlaybackControl = false; - this.sourceType = "mediaStreamNode"; - this.source = this.context.createMediaStreamSource(mediaStream); - this.connect(); - return this; +} +const _offsetMatrix = /* @__PURE__ */ new Matrix4(); +const _identityMatrix$1 = /* @__PURE__ */ new Matrix4(); +class Skeleton { + static { + __name(this, "Skeleton"); } - setBuffer(audioBuffer) { - this.buffer = audioBuffer; - this.sourceType = "buffer"; - if (this.autoplay) this.play(); - return this; + constructor(bones = [], boneInverses = []) { + this.uuid = generateUUID(); + this.bones = bones.slice(0); + this.boneInverses = boneInverses; + this.boneMatrices = null; + this.boneTexture = null; + this.init(); } - play(delay = 0) { - if (this.isPlaying === true) { - console.warn("THREE.Audio: Audio is already playing."); - return; + init() { + const bones = this.bones; + const boneInverses = this.boneInverses; + this.boneMatrices = new Float32Array(bones.length * 16); + if (boneInverses.length === 0) { + this.calculateInverses(); + } else { + if (bones.length !== boneInverses.length) { + console.warn("THREE.Skeleton: Number of inverse bone matrices does not match amount of bones."); + this.boneInverses = []; + for (let i = 0, il = this.bones.length; i < il; i++) { + this.boneInverses.push(new Matrix4()); + } + } } - if (this.hasPlaybackControl === false) { - console.warn("THREE.Audio: this Audio has no playback control."); - return; + } + calculateInverses() { + this.boneInverses.length = 0; + for (let i = 0, il = this.bones.length; i < il; i++) { + const inverse = new Matrix4(); + if (this.bones[i]) { + inverse.copy(this.bones[i].matrixWorld).invert(); + } + this.boneInverses.push(inverse); } - this._startedAt = this.context.currentTime + delay; - const source = this.context.createBufferSource(); - source.buffer = this.buffer; - source.loop = this.loop; - source.loopStart = this.loopStart; - source.loopEnd = this.loopEnd; - source.onended = this.onEnded.bind(this); - source.start(this._startedAt, this._progress + this.offset, this.duration); - this.isPlaying = true; - this.source = source; - this.setDetune(this.detune); - this.setPlaybackRate(this.playbackRate); - return this.connect(); } - pause() { - if (this.hasPlaybackControl === false) { - console.warn("THREE.Audio: this Audio has no playback control."); - return; + pose() { + for (let i = 0, il = this.bones.length; i < il; i++) { + const bone = this.bones[i]; + if (bone) { + bone.matrixWorld.copy(this.boneInverses[i]).invert(); + } } - if (this.isPlaying === true) { - this._progress += Math.max(this.context.currentTime - this._startedAt, 0) * this.playbackRate; - if (this.loop === true) { - this._progress = this._progress % (this.duration || this.buffer.duration); + for (let i = 0, il = this.bones.length; i < il; i++) { + const bone = this.bones[i]; + if (bone) { + if (bone.parent && bone.parent.isBone) { + bone.matrix.copy(bone.parent.matrixWorld).invert(); + bone.matrix.multiply(bone.matrixWorld); + } else { + bone.matrix.copy(bone.matrixWorld); + } + bone.matrix.decompose(bone.position, bone.quaternion, bone.scale); } - this.source.stop(); - this.source.onended = null; - this.isPlaying = false; } - return this; } - stop(delay = 0) { - if (this.hasPlaybackControl === false) { - console.warn("THREE.Audio: this Audio has no playback control."); - return; + update() { + const bones = this.bones; + const boneInverses = this.boneInverses; + const boneMatrices = this.boneMatrices; + const boneTexture = this.boneTexture; + for (let i = 0, il = bones.length; i < il; i++) { + const matrix = bones[i] ? bones[i].matrixWorld : _identityMatrix$1; + _offsetMatrix.multiplyMatrices(matrix, boneInverses[i]); + _offsetMatrix.toArray(boneMatrices, i * 16); } - this._progress = 0; - if (this.source !== null) { - this.source.stop(this.context.currentTime + delay); - this.source.onended = null; + if (boneTexture !== null) { + boneTexture.needsUpdate = true; } - this.isPlaying = false; + } + clone() { + return new Skeleton(this.bones, this.boneInverses); + } + computeBoneTexture() { + let size = Math.sqrt(this.bones.length * 4); + size = Math.ceil(size / 4) * 4; + size = Math.max(size, 4); + const boneMatrices = new Float32Array(size * size * 4); + boneMatrices.set(this.boneMatrices); + const boneTexture = new DataTexture(boneMatrices, size, size, RGBAFormat, FloatType); + boneTexture.needsUpdate = true; + this.boneMatrices = boneMatrices; + this.boneTexture = boneTexture; return this; } - connect() { - if (this.filters.length > 0) { - this.source.connect(this.filters[0]); - for (let i = 1, l = this.filters.length; i < l; i++) { - this.filters[i - 1].connect(this.filters[i]); + getBoneByName(name) { + for (let i = 0, il = this.bones.length; i < il; i++) { + const bone = this.bones[i]; + if (bone.name === name) { + return bone; } - this.filters[this.filters.length - 1].connect(this.getOutput()); - } else { - this.source.connect(this.getOutput()); } - this._connected = true; - return this; + return void 0; } - disconnect() { - if (this._connected === false) { - return; + dispose() { + if (this.boneTexture !== null) { + this.boneTexture.dispose(); + this.boneTexture = null; } - if (this.filters.length > 0) { - this.source.disconnect(this.filters[0]); - for (let i = 1, l = this.filters.length; i < l; i++) { - this.filters[i - 1].disconnect(this.filters[i]); + } + fromJSON(json, bones) { + this.uuid = json.uuid; + for (let i = 0, l = json.bones.length; i < l; i++) { + const uuid = json.bones[i]; + let bone = bones[uuid]; + if (bone === void 0) { + console.warn("THREE.Skeleton: No bone found with UUID:", uuid); + bone = new Bone(); } - this.filters[this.filters.length - 1].disconnect(this.getOutput()); - } else { - this.source.disconnect(this.getOutput()); + this.bones.push(bone); + this.boneInverses.push(new Matrix4().fromArray(json.boneInverses[i])); } - this._connected = false; + this.init(); return this; } - getFilters() { - return this.filters; + toJSON() { + const data = { + metadata: { + version: 4.6, + type: "Skeleton", + generator: "Skeleton.toJSON" + }, + bones: [], + boneInverses: [] + }; + data.uuid = this.uuid; + const bones = this.bones; + const boneInverses = this.boneInverses; + for (let i = 0, l = bones.length; i < l; i++) { + const bone = bones[i]; + data.bones.push(bone.uuid); + const boneInverse = boneInverses[i]; + data.boneInverses.push(boneInverse.toArray()); + } + return data; + } +} +class InstancedBufferAttribute extends BufferAttribute { + static { + __name(this, "InstancedBufferAttribute"); + } + constructor(array, itemSize, normalized, meshPerAttribute = 1) { + super(array, itemSize, normalized); + this.isInstancedBufferAttribute = true; + this.meshPerAttribute = meshPerAttribute; } - setFilters(value) { - if (!value) value = []; - if (this._connected === true) { - this.disconnect(); - this.filters = value.slice(); - this.connect(); - } else { - this.filters = value.slice(); - } + copy(source) { + super.copy(source); + this.meshPerAttribute = source.meshPerAttribute; return this; } - setDetune(value) { - this.detune = value; - if (this.isPlaying === true && this.source.detune !== void 0) { - this.source.detune.setTargetAtTime(this.detune, this.context.currentTime, 0.01); - } - return this; + toJSON() { + const data = super.toJSON(); + data.meshPerAttribute = this.meshPerAttribute; + data.isInstancedBufferAttribute = true; + return data; } - getDetune() { - return this.detune; +} +const _instanceLocalMatrix = /* @__PURE__ */ new Matrix4(); +const _instanceWorldMatrix = /* @__PURE__ */ new Matrix4(); +const _instanceIntersects = []; +const _box3 = /* @__PURE__ */ new Box3(); +const _identity = /* @__PURE__ */ new Matrix4(); +const _mesh$1 = /* @__PURE__ */ new Mesh(); +const _sphere$3 = /* @__PURE__ */ new Sphere(); +class InstancedMesh extends Mesh { + static { + __name(this, "InstancedMesh"); } - getFilter() { - return this.getFilters()[0]; + constructor(geometry, material, count) { + super(geometry, material); + this.isInstancedMesh = true; + this.instanceMatrix = new InstancedBufferAttribute(new Float32Array(count * 16), 16); + this.instanceColor = null; + this.morphTexture = null; + this.count = count; + this.boundingBox = null; + this.boundingSphere = null; + for (let i = 0; i < count; i++) { + this.setMatrixAt(i, _identity); + } } - setFilter(filter) { - return this.setFilters(filter ? [filter] : []); + computeBoundingBox() { + const geometry = this.geometry; + const count = this.count; + if (this.boundingBox === null) { + this.boundingBox = new Box3(); + } + if (geometry.boundingBox === null) { + geometry.computeBoundingBox(); + } + this.boundingBox.makeEmpty(); + for (let i = 0; i < count; i++) { + this.getMatrixAt(i, _instanceLocalMatrix); + _box3.copy(geometry.boundingBox).applyMatrix4(_instanceLocalMatrix); + this.boundingBox.union(_box3); + } } - setPlaybackRate(value) { - if (this.hasPlaybackControl === false) { - console.warn("THREE.Audio: this Audio has no playback control."); - return; + computeBoundingSphere() { + const geometry = this.geometry; + const count = this.count; + if (this.boundingSphere === null) { + this.boundingSphere = new Sphere(); } - this.playbackRate = value; - if (this.isPlaying === true) { - this.source.playbackRate.setTargetAtTime(this.playbackRate, this.context.currentTime, 0.01); + if (geometry.boundingSphere === null) { + geometry.computeBoundingSphere(); + } + this.boundingSphere.makeEmpty(); + for (let i = 0; i < count; i++) { + this.getMatrixAt(i, _instanceLocalMatrix); + _sphere$3.copy(geometry.boundingSphere).applyMatrix4(_instanceLocalMatrix); + this.boundingSphere.union(_sphere$3); } + } + copy(source, recursive) { + super.copy(source, recursive); + this.instanceMatrix.copy(source.instanceMatrix); + if (source.morphTexture !== null) this.morphTexture = source.morphTexture.clone(); + if (source.instanceColor !== null) this.instanceColor = source.instanceColor.clone(); + this.count = source.count; + if (source.boundingBox !== null) this.boundingBox = source.boundingBox.clone(); + if (source.boundingSphere !== null) this.boundingSphere = source.boundingSphere.clone(); return this; } - getPlaybackRate() { - return this.playbackRate; + getColorAt(index, color) { + color.fromArray(this.instanceColor.array, index * 3); } - onEnded() { - this.isPlaying = false; + getMatrixAt(index, matrix) { + matrix.fromArray(this.instanceMatrix.array, index * 16); } - getLoop() { - if (this.hasPlaybackControl === false) { - console.warn("THREE.Audio: this Audio has no playback control."); - return false; + getMorphAt(index, object) { + const objectInfluences = object.morphTargetInfluences; + const array = this.morphTexture.source.data.data; + const len = objectInfluences.length + 1; + const dataIndex = index * len + 1; + for (let i = 0; i < objectInfluences.length; i++) { + objectInfluences[i] = array[dataIndex + i]; } - return this.loop; } - setLoop(value) { - if (this.hasPlaybackControl === false) { - console.warn("THREE.Audio: this Audio has no playback control."); - return; + raycast(raycaster, intersects2) { + const matrixWorld = this.matrixWorld; + const raycastTimes = this.count; + _mesh$1.geometry = this.geometry; + _mesh$1.material = this.material; + if (_mesh$1.material === void 0) return; + if (this.boundingSphere === null) this.computeBoundingSphere(); + _sphere$3.copy(this.boundingSphere); + _sphere$3.applyMatrix4(matrixWorld); + if (raycaster.ray.intersectsSphere(_sphere$3) === false) return; + for (let instanceId = 0; instanceId < raycastTimes; instanceId++) { + this.getMatrixAt(instanceId, _instanceLocalMatrix); + _instanceWorldMatrix.multiplyMatrices(matrixWorld, _instanceLocalMatrix); + _mesh$1.matrixWorld = _instanceWorldMatrix; + _mesh$1.raycast(raycaster, _instanceIntersects); + for (let i = 0, l = _instanceIntersects.length; i < l; i++) { + const intersect2 = _instanceIntersects[i]; + intersect2.instanceId = instanceId; + intersect2.object = this; + intersects2.push(intersect2); + } + _instanceIntersects.length = 0; } - this.loop = value; - if (this.isPlaying === true) { - this.source.loop = this.loop; + } + setColorAt(index, color) { + if (this.instanceColor === null) { + this.instanceColor = new InstancedBufferAttribute(new Float32Array(this.instanceMatrix.count * 3).fill(1), 3); } - return this; + color.toArray(this.instanceColor.array, index * 3); } - setLoopStart(value) { - this.loopStart = value; - return this; + setMatrixAt(index, matrix) { + matrix.toArray(this.instanceMatrix.array, index * 16); } - setLoopEnd(value) { - this.loopEnd = value; - return this; + setMorphAt(index, object) { + const objectInfluences = object.morphTargetInfluences; + const len = objectInfluences.length + 1; + if (this.morphTexture === null) { + this.morphTexture = new DataTexture(new Float32Array(len * this.count), len, this.count, RedFormat, FloatType); + } + const array = this.morphTexture.source.data.data; + let morphInfluencesSum = 0; + for (let i = 0; i < objectInfluences.length; i++) { + morphInfluencesSum += objectInfluences[i]; + } + const morphBaseInfluence = this.geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum; + const dataIndex = len * index; + array[dataIndex] = morphBaseInfluence; + array.set(objectInfluences, dataIndex + 1); } - getVolume() { - return this.gain.gain.value; + updateMorphTargets() { } - setVolume(value) { - this.gain.gain.setTargetAtTime(value, this.context.currentTime, 0.01); + dispose() { + this.dispatchEvent({ type: "dispose" }); + if (this.morphTexture !== null) { + this.morphTexture.dispose(); + this.morphTexture = null; + } return this; } } -const _position = /* @__PURE__ */ new Vector3(); -const _quaternion = /* @__PURE__ */ new Quaternion(); -const _scale = /* @__PURE__ */ new Vector3(); -const _orientation = /* @__PURE__ */ new Vector3(); -class PositionalAudio extends Audio { +function ascIdSort(a, b) { + return a - b; +} +__name(ascIdSort, "ascIdSort"); +function sortOpaque(a, b) { + return a.z - b.z; +} +__name(sortOpaque, "sortOpaque"); +function sortTransparent(a, b) { + return b.z - a.z; +} +__name(sortTransparent, "sortTransparent"); +class MultiDrawRenderList { static { - __name(this, "PositionalAudio"); + __name(this, "MultiDrawRenderList"); } - constructor(listener) { - super(listener); - this.panner = this.context.createPanner(); - this.panner.panningModel = "HRTF"; - this.panner.connect(this.gain); + constructor() { + this.index = 0; + this.pool = []; + this.list = []; } - connect() { - super.connect(); - this.panner.connect(this.gain); + push(start, count, z, index) { + const pool = this.pool; + const list = this.list; + if (this.index >= pool.length) { + pool.push({ + start: -1, + count: -1, + z: -1, + index: -1 + }); + } + const item = pool[this.index]; + list.push(item); + this.index++; + item.start = start; + item.count = count; + item.z = z; + item.index = index; } - disconnect() { - super.disconnect(); - this.panner.disconnect(this.gain); + reset() { + this.list.length = 0; + this.index = 0; } - getOutput() { - return this.panner; +} +const _matrix$1 = /* @__PURE__ */ new Matrix4(); +const _whiteColor = /* @__PURE__ */ new Color(1, 1, 1); +const _frustum = /* @__PURE__ */ new Frustum(); +const _box$1 = /* @__PURE__ */ new Box3(); +const _sphere$2 = /* @__PURE__ */ new Sphere(); +const _vector$5 = /* @__PURE__ */ new Vector3(); +const _forward = /* @__PURE__ */ new Vector3(); +const _temp = /* @__PURE__ */ new Vector3(); +const _renderList = /* @__PURE__ */ new MultiDrawRenderList(); +const _mesh = /* @__PURE__ */ new Mesh(); +const _batchIntersects = []; +function copyAttributeData(src, target, targetOffset = 0) { + const itemSize = target.itemSize; + if (src.isInterleavedBufferAttribute || src.array.constructor !== target.array.constructor) { + const vertexCount = src.count; + for (let i = 0; i < vertexCount; i++) { + for (let c = 0; c < itemSize; c++) { + target.setComponent(i + targetOffset, c, src.getComponent(i, c)); + } + } + } else { + target.array.set(src.array, targetOffset * itemSize); } - getRefDistance() { - return this.panner.refDistance; + target.needsUpdate = true; +} +__name(copyAttributeData, "copyAttributeData"); +function copyArrayContents(src, target) { + if (src.constructor !== target.constructor) { + const len = Math.min(src.length, target.length); + for (let i = 0; i < len; i++) { + target[i] = src[i]; + } + } else { + const len = Math.min(src.length, target.length); + target.set(new src.constructor(src.buffer, 0, len)); } - setRefDistance(value) { - this.panner.refDistance = value; - return this; +} +__name(copyArrayContents, "copyArrayContents"); +class BatchedMesh extends Mesh { + static { + __name(this, "BatchedMesh"); } - getRolloffFactor() { - return this.panner.rolloffFactor; + get maxInstanceCount() { + return this._maxInstanceCount; } - setRolloffFactor(value) { - this.panner.rolloffFactor = value; - return this; + get instanceCount() { + return this._instanceInfo.length - this._availableInstanceIds.length; } - getDistanceModel() { - return this.panner.distanceModel; + get unusedVertexCount() { + return this._maxVertexCount - this._nextVertexStart; } - setDistanceModel(value) { - this.panner.distanceModel = value; - return this; + get unusedIndexCount() { + return this._maxIndexCount - this._nextIndexStart; } - getMaxDistance() { - return this.panner.maxDistance; + constructor(maxInstanceCount, maxVertexCount, maxIndexCount = maxVertexCount * 2, material) { + super(new BufferGeometry(), material); + this.isBatchedMesh = true; + this.perObjectFrustumCulled = true; + this.sortObjects = true; + this.boundingBox = null; + this.boundingSphere = null; + this.customSort = null; + this._instanceInfo = []; + this._geometryInfo = []; + this._availableInstanceIds = []; + this._availableGeometryIds = []; + this._nextIndexStart = 0; + this._nextVertexStart = 0; + this._geometryCount = 0; + this._visibilityChanged = true; + this._geometryInitialized = false; + this._maxInstanceCount = maxInstanceCount; + this._maxVertexCount = maxVertexCount; + this._maxIndexCount = maxIndexCount; + this._multiDrawCounts = new Int32Array(maxInstanceCount); + this._multiDrawStarts = new Int32Array(maxInstanceCount); + this._multiDrawCount = 0; + this._multiDrawInstances = null; + this._matricesTexture = null; + this._indirectTexture = null; + this._colorsTexture = null; + this._initMatricesTexture(); + this._initIndirectTexture(); } - setMaxDistance(value) { - this.panner.maxDistance = value; - return this; + _initMatricesTexture() { + let size = Math.sqrt(this._maxInstanceCount * 4); + size = Math.ceil(size / 4) * 4; + size = Math.max(size, 4); + const matricesArray = new Float32Array(size * size * 4); + const matricesTexture = new DataTexture(matricesArray, size, size, RGBAFormat, FloatType); + this._matricesTexture = matricesTexture; } - setDirectionalCone(coneInnerAngle, coneOuterAngle, coneOuterGain) { - this.panner.coneInnerAngle = coneInnerAngle; - this.panner.coneOuterAngle = coneOuterAngle; - this.panner.coneOuterGain = coneOuterGain; - return this; + _initIndirectTexture() { + let size = Math.sqrt(this._maxInstanceCount); + size = Math.ceil(size); + const indirectArray = new Uint32Array(size * size); + const indirectTexture = new DataTexture(indirectArray, size, size, RedIntegerFormat, UnsignedIntType); + this._indirectTexture = indirectTexture; } - updateMatrixWorld(force) { - super.updateMatrixWorld(force); - if (this.hasPlaybackControl === true && this.isPlaying === false) return; - this.matrixWorld.decompose(_position, _quaternion, _scale); - _orientation.set(0, 0, 1).applyQuaternion(_quaternion); - const panner = this.panner; - if (panner.positionX) { - const endTime = this.context.currentTime + this.listener.timeDelta; - panner.positionX.linearRampToValueAtTime(_position.x, endTime); - panner.positionY.linearRampToValueAtTime(_position.y, endTime); - panner.positionZ.linearRampToValueAtTime(_position.z, endTime); - panner.orientationX.linearRampToValueAtTime(_orientation.x, endTime); - panner.orientationY.linearRampToValueAtTime(_orientation.y, endTime); - panner.orientationZ.linearRampToValueAtTime(_orientation.z, endTime); - } else { - panner.setPosition(_position.x, _position.y, _position.z); - panner.setOrientation(_orientation.x, _orientation.y, _orientation.z); - } + _initColorsTexture() { + let size = Math.sqrt(this._maxInstanceCount); + size = Math.ceil(size); + const colorsArray = new Float32Array(size * size * 4).fill(1); + const colorsTexture = new DataTexture(colorsArray, size, size, RGBAFormat, FloatType); + colorsTexture.colorSpace = ColorManagement.workingColorSpace; + this._colorsTexture = colorsTexture; } -} -class AudioAnalyser { - static { - __name(this, "AudioAnalyser"); + _initializeGeometry(reference) { + const geometry = this.geometry; + const maxVertexCount = this._maxVertexCount; + const maxIndexCount = this._maxIndexCount; + if (this._geometryInitialized === false) { + for (const attributeName in reference.attributes) { + const srcAttribute = reference.getAttribute(attributeName); + const { array, itemSize, normalized } = srcAttribute; + const dstArray = new array.constructor(maxVertexCount * itemSize); + const dstAttribute = new BufferAttribute(dstArray, itemSize, normalized); + geometry.setAttribute(attributeName, dstAttribute); + } + if (reference.getIndex() !== null) { + const indexArray = maxVertexCount > 65535 ? new Uint32Array(maxIndexCount) : new Uint16Array(maxIndexCount); + geometry.setIndex(new BufferAttribute(indexArray, 1)); + } + this._geometryInitialized = true; + } } - constructor(audio, fftSize = 2048) { - this.analyser = audio.context.createAnalyser(); - this.analyser.fftSize = fftSize; - this.data = new Uint8Array(this.analyser.frequencyBinCount); - audio.getOutput().connect(this.analyser); + // Make sure the geometry is compatible with the existing combined geometry attributes + _validateGeometry(geometry) { + const batchGeometry = this.geometry; + if (Boolean(geometry.getIndex()) !== Boolean(batchGeometry.getIndex())) { + throw new Error('BatchedMesh: All geometries must consistently have "index".'); + } + for (const attributeName in batchGeometry.attributes) { + if (!geometry.hasAttribute(attributeName)) { + throw new Error(`BatchedMesh: Added geometry missing "${attributeName}". All geometries must have consistent attributes.`); + } + const srcAttribute = geometry.getAttribute(attributeName); + const dstAttribute = batchGeometry.getAttribute(attributeName); + if (srcAttribute.itemSize !== dstAttribute.itemSize || srcAttribute.normalized !== dstAttribute.normalized) { + throw new Error("BatchedMesh: All attributes must have a consistent itemSize and normalized value."); + } + } } - getFrequencyData() { - this.analyser.getByteFrequencyData(this.data); - return this.data; + setCustomSort(func) { + this.customSort = func; + return this; } - getAverageFrequency() { - let value = 0; - const data = this.getFrequencyData(); - for (let i = 0; i < data.length; i++) { - value += data[i]; + computeBoundingBox() { + if (this.boundingBox === null) { + this.boundingBox = new Box3(); + } + const boundingBox = this.boundingBox; + const instanceInfo = this._instanceInfo; + boundingBox.makeEmpty(); + for (let i = 0, l = instanceInfo.length; i < l; i++) { + if (instanceInfo[i].active === false) continue; + const geometryId = instanceInfo[i].geometryIndex; + this.getMatrixAt(i, _matrix$1); + this.getBoundingBoxAt(geometryId, _box$1).applyMatrix4(_matrix$1); + boundingBox.union(_box$1); } - return value / data.length; } -} -class PropertyMixer { - static { - __name(this, "PropertyMixer"); + computeBoundingSphere() { + if (this.boundingSphere === null) { + this.boundingSphere = new Sphere(); + } + const boundingSphere = this.boundingSphere; + const instanceInfo = this._instanceInfo; + boundingSphere.makeEmpty(); + for (let i = 0, l = instanceInfo.length; i < l; i++) { + if (instanceInfo[i].active === false) continue; + const geometryId = instanceInfo[i].geometryIndex; + this.getMatrixAt(i, _matrix$1); + this.getBoundingSphereAt(geometryId, _sphere$2).applyMatrix4(_matrix$1); + boundingSphere.union(_sphere$2); + } } - constructor(binding, typeName, valueSize) { - this.binding = binding; - this.valueSize = valueSize; - let mixFunction, mixFunctionAdditive, setIdentity; - switch (typeName) { - case "quaternion": - mixFunction = this._slerp; - mixFunctionAdditive = this._slerpAdditive; - setIdentity = this._setAdditiveIdentityQuaternion; - this.buffer = new Float64Array(valueSize * 6); - this._workIndex = 5; - break; - case "string": - case "bool": - mixFunction = this._select; - mixFunctionAdditive = this._select; - setIdentity = this._setAdditiveIdentityOther; - this.buffer = new Array(valueSize * 5); - break; - default: - mixFunction = this._lerp; - mixFunctionAdditive = this._lerpAdditive; - setIdentity = this._setAdditiveIdentityNumeric; - this.buffer = new Float64Array(valueSize * 5); + addInstance(geometryId) { + const atCapacity = this._instanceInfo.length >= this.maxInstanceCount; + if (atCapacity && this._availableInstanceIds.length === 0) { + throw new Error("BatchedMesh: Maximum item count reached."); + } + const instanceInfo = { + visible: true, + active: true, + geometryIndex: geometryId + }; + let drawId = null; + if (this._availableInstanceIds.length > 0) { + this._availableInstanceIds.sort(ascIdSort); + drawId = this._availableInstanceIds.shift(); + this._instanceInfo[drawId] = instanceInfo; + } else { + drawId = this._instanceInfo.length; + this._instanceInfo.push(instanceInfo); } - this._mixBufferRegion = mixFunction; - this._mixBufferRegionAdditive = mixFunctionAdditive; - this._setIdentity = setIdentity; - this._origIndex = 3; - this._addIndex = 4; - this.cumulativeWeight = 0; - this.cumulativeWeightAdditive = 0; - this.useCount = 0; - this.referenceCount = 0; + const matricesTexture = this._matricesTexture; + _matrix$1.identity().toArray(matricesTexture.image.data, drawId * 16); + matricesTexture.needsUpdate = true; + const colorsTexture = this._colorsTexture; + if (colorsTexture) { + _whiteColor.toArray(colorsTexture.image.data, drawId * 4); + colorsTexture.needsUpdate = true; + } + this._visibilityChanged = true; + return drawId; } - // accumulate data in the 'incoming' region into 'accu' - accumulate(accuIndex, weight) { - const buffer = this.buffer, stride = this.valueSize, offset = accuIndex * stride + stride; - let currentWeight = this.cumulativeWeight; - if (currentWeight === 0) { - for (let i = 0; i !== stride; ++i) { - buffer[offset + i] = buffer[i]; - } - currentWeight = weight; + addGeometry(geometry, reservedVertexCount = -1, reservedIndexCount = -1) { + this._initializeGeometry(geometry); + this._validateGeometry(geometry); + const geometryInfo = { + // geometry information + vertexStart: -1, + vertexCount: -1, + reservedVertexCount: -1, + indexStart: -1, + indexCount: -1, + reservedIndexCount: -1, + // draw range information + start: -1, + count: -1, + // state + boundingBox: null, + boundingSphere: null, + active: true + }; + const geometryInfoList = this._geometryInfo; + geometryInfo.vertexStart = this._nextVertexStart; + geometryInfo.reservedVertexCount = reservedVertexCount === -1 ? geometry.getAttribute("position").count : reservedVertexCount; + const index = geometry.getIndex(); + const hasIndex = index !== null; + if (hasIndex) { + geometryInfo.indexStart = this._nextIndexStart; + geometryInfo.reservedIndexCount = reservedIndexCount === -1 ? index.count : reservedIndexCount; + } + if (geometryInfo.indexStart !== -1 && geometryInfo.indexStart + geometryInfo.reservedIndexCount > this._maxIndexCount || geometryInfo.vertexStart + geometryInfo.reservedVertexCount > this._maxVertexCount) { + throw new Error("BatchedMesh: Reserved space request exceeds the maximum buffer size."); + } + let geometryId; + if (this._availableGeometryIds.length > 0) { + this._availableGeometryIds.sort(ascIdSort); + geometryId = this._availableGeometryIds.shift(); + geometryInfoList[geometryId] = geometryInfo; } else { - currentWeight += weight; - const mix = weight / currentWeight; - this._mixBufferRegion(buffer, offset, 0, mix, stride); + geometryId = this._geometryCount; + this._geometryCount++; + geometryInfoList.push(geometryInfo); } - this.cumulativeWeight = currentWeight; + this.setGeometryAt(geometryId, geometry); + this._nextIndexStart = geometryInfo.indexStart + geometryInfo.reservedIndexCount; + this._nextVertexStart = geometryInfo.vertexStart + geometryInfo.reservedVertexCount; + return geometryId; } - // accumulate data in the 'incoming' region into 'add' - accumulateAdditive(weight) { - const buffer = this.buffer, stride = this.valueSize, offset = stride * this._addIndex; - if (this.cumulativeWeightAdditive === 0) { - this._setIdentity(); + setGeometryAt(geometryId, geometry) { + if (geometryId >= this._geometryCount) { + throw new Error("BatchedMesh: Maximum geometry count reached."); } - this._mixBufferRegionAdditive(buffer, offset, 0, weight, stride); - this.cumulativeWeightAdditive += weight; - } - // apply the state of 'accu' to the binding when accus differ - apply(accuIndex) { - const stride = this.valueSize, buffer = this.buffer, offset = accuIndex * stride + stride, weight = this.cumulativeWeight, weightAdditive = this.cumulativeWeightAdditive, binding = this.binding; - this.cumulativeWeight = 0; - this.cumulativeWeightAdditive = 0; - if (weight < 1) { - const originalValueOffset = stride * this._origIndex; - this._mixBufferRegion( - buffer, - offset, - originalValueOffset, - 1 - weight, - stride - ); + this._validateGeometry(geometry); + const batchGeometry = this.geometry; + const hasIndex = batchGeometry.getIndex() !== null; + const dstIndex = batchGeometry.getIndex(); + const srcIndex = geometry.getIndex(); + const geometryInfo = this._geometryInfo[geometryId]; + if (hasIndex && srcIndex.count > geometryInfo.reservedIndexCount || geometry.attributes.position.count > geometryInfo.reservedVertexCount) { + throw new Error("BatchedMesh: Reserved space not large enough for provided geometry."); } - if (weightAdditive > 0) { - this._mixBufferRegionAdditive(buffer, offset, this._addIndex * stride, 1, stride); + const vertexStart = geometryInfo.vertexStart; + const reservedVertexCount = geometryInfo.reservedVertexCount; + geometryInfo.vertexCount = geometry.getAttribute("position").count; + for (const attributeName in batchGeometry.attributes) { + const srcAttribute = geometry.getAttribute(attributeName); + const dstAttribute = batchGeometry.getAttribute(attributeName); + copyAttributeData(srcAttribute, dstAttribute, vertexStart); + const itemSize = srcAttribute.itemSize; + for (let i = srcAttribute.count, l = reservedVertexCount; i < l; i++) { + const index = vertexStart + i; + for (let c = 0; c < itemSize; c++) { + dstAttribute.setComponent(index, c, 0); + } + } + dstAttribute.needsUpdate = true; + dstAttribute.addUpdateRange(vertexStart * itemSize, reservedVertexCount * itemSize); } - for (let i = stride, e = stride + stride; i !== e; ++i) { - if (buffer[i] !== buffer[i + stride]) { - binding.setValue(buffer, offset); - break; + if (hasIndex) { + const indexStart = geometryInfo.indexStart; + const reservedIndexCount = geometryInfo.reservedIndexCount; + geometryInfo.indexCount = geometry.getIndex().count; + for (let i = 0; i < srcIndex.count; i++) { + dstIndex.setX(indexStart + i, vertexStart + srcIndex.getX(i)); + } + for (let i = srcIndex.count, l = reservedIndexCount; i < l; i++) { + dstIndex.setX(indexStart + i, vertexStart); } + dstIndex.needsUpdate = true; + dstIndex.addUpdateRange(indexStart, geometryInfo.reservedIndexCount); } - } - // remember the state of the bound property and copy it to both accus - saveOriginalState() { - const binding = this.binding; - const buffer = this.buffer, stride = this.valueSize, originalValueOffset = stride * this._origIndex; - binding.getValue(buffer, originalValueOffset); - for (let i = stride, e = originalValueOffset; i !== e; ++i) { - buffer[i] = buffer[originalValueOffset + i % stride]; + geometryInfo.start = hasIndex ? geometryInfo.indexStart : geometryInfo.vertexStart; + geometryInfo.count = hasIndex ? geometryInfo.indexCount : geometryInfo.vertexCount; + geometryInfo.boundingBox = null; + if (geometry.boundingBox !== null) { + geometryInfo.boundingBox = geometry.boundingBox.clone(); } - this._setIdentity(); - this.cumulativeWeight = 0; - this.cumulativeWeightAdditive = 0; - } - // apply the state previously taken via 'saveOriginalState' to the binding - restoreOriginalState() { - const originalValueOffset = this.valueSize * 3; - this.binding.setValue(this.buffer, originalValueOffset); - } - _setAdditiveIdentityNumeric() { - const startIndex = this._addIndex * this.valueSize; - const endIndex = startIndex + this.valueSize; - for (let i = startIndex; i < endIndex; i++) { - this.buffer[i] = 0; + geometryInfo.boundingSphere = null; + if (geometry.boundingSphere !== null) { + geometryInfo.boundingSphere = geometry.boundingSphere.clone(); } + this._visibilityChanged = true; + return geometryId; } - _setAdditiveIdentityQuaternion() { - this._setAdditiveIdentityNumeric(); - this.buffer[this._addIndex * this.valueSize + 3] = 1; - } - _setAdditiveIdentityOther() { - const startIndex = this._origIndex * this.valueSize; - const targetIndex = this._addIndex * this.valueSize; - for (let i = 0; i < this.valueSize; i++) { - this.buffer[targetIndex + i] = this.buffer[startIndex + i]; + deleteGeometry(geometryId) { + const geometryInfoList = this._geometryInfo; + if (geometryId >= geometryInfoList.length || geometryInfoList[geometryId].active === false) { + return this; } - } - // mix functions - _select(buffer, dstOffset, srcOffset, t2, stride) { - if (t2 >= 0.5) { - for (let i = 0; i !== stride; ++i) { - buffer[dstOffset + i] = buffer[srcOffset + i]; + const instanceInfo = this._instanceInfo; + for (let i = 0, l = instanceInfo.length; i < l; i++) { + if (instanceInfo[i].geometryIndex === geometryId) { + this.deleteInstance(i); } } + geometryInfoList[geometryId].active = false; + this._availableGeometryIds.push(geometryId); + this._visibilityChanged = true; + return this; } - _slerp(buffer, dstOffset, srcOffset, t2) { - Quaternion.slerpFlat(buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t2); - } - _slerpAdditive(buffer, dstOffset, srcOffset, t2, stride) { - const workOffset = this._workIndex * stride; - Quaternion.multiplyQuaternionsFlat(buffer, workOffset, buffer, dstOffset, buffer, srcOffset); - Quaternion.slerpFlat(buffer, dstOffset, buffer, dstOffset, buffer, workOffset, t2); + deleteInstance(instanceId) { + const instanceInfo = this._instanceInfo; + if (instanceId >= instanceInfo.length || instanceInfo[instanceId].active === false) { + return this; + } + instanceInfo[instanceId].active = false; + this._availableInstanceIds.push(instanceId); + this._visibilityChanged = true; + return this; } - _lerp(buffer, dstOffset, srcOffset, t2, stride) { - const s = 1 - t2; - for (let i = 0; i !== stride; ++i) { - const j = dstOffset + i; - buffer[j] = buffer[j] * s + buffer[srcOffset + i] * t2; + optimize() { + let nextVertexStart = 0; + let nextIndexStart = 0; + const geometryInfoList = this._geometryInfo; + const indices = geometryInfoList.map((e, i) => i).sort((a, b) => { + return geometryInfoList[a].vertexStart - geometryInfoList[b].vertexStart; + }); + const geometry = this.geometry; + for (let i = 0, l = geometryInfoList.length; i < l; i++) { + const index = indices[i]; + const geometryInfo = geometryInfoList[index]; + if (geometryInfo.active === false) { + continue; + } + if (geometry.index !== null) { + if (geometryInfo.indexStart !== nextIndexStart) { + const { indexStart, vertexStart, reservedIndexCount } = geometryInfo; + const index2 = geometry.index; + const array = index2.array; + const elementDelta = nextVertexStart - vertexStart; + for (let j = indexStart; j < indexStart + reservedIndexCount; j++) { + array[j] = array[j] + elementDelta; + } + index2.array.copyWithin(nextIndexStart, indexStart, indexStart + reservedIndexCount); + index2.addUpdateRange(nextIndexStart, reservedIndexCount); + geometryInfo.indexStart = nextIndexStart; + } + nextIndexStart += geometryInfo.reservedIndexCount; + } + if (geometryInfo.vertexStart !== nextVertexStart) { + const { vertexStart, reservedVertexCount } = geometryInfo; + const attributes = geometry.attributes; + for (const key in attributes) { + const attribute = attributes[key]; + const { array, itemSize } = attribute; + array.copyWithin(nextVertexStart * itemSize, vertexStart * itemSize, (vertexStart + reservedVertexCount) * itemSize); + attribute.addUpdateRange(nextVertexStart * itemSize, reservedVertexCount * itemSize); + } + geometryInfo.vertexStart = nextVertexStart; + } + nextVertexStart += geometryInfo.reservedVertexCount; + geometryInfo.start = geometry.index ? geometryInfo.indexStart : geometryInfo.vertexStart; + this._nextIndexStart = geometry.index ? geometryInfo.indexStart + geometryInfo.reservedIndexCount : 0; + this._nextVertexStart = geometryInfo.vertexStart + geometryInfo.reservedVertexCount; } + return this; } - _lerpAdditive(buffer, dstOffset, srcOffset, t2, stride) { - for (let i = 0; i !== stride; ++i) { - const j = dstOffset + i; - buffer[j] = buffer[j] + buffer[srcOffset + i] * t2; + // get bounding box and compute it if it doesn't exist + getBoundingBoxAt(geometryId, target) { + if (geometryId >= this._geometryCount) { + return null; + } + const geometry = this.geometry; + const geometryInfo = this._geometryInfo[geometryId]; + if (geometryInfo.boundingBox === null) { + const box = new Box3(); + const index = geometry.index; + const position = geometry.attributes.position; + for (let i = geometryInfo.start, l = geometryInfo.start + geometryInfo.count; i < l; i++) { + let iv = i; + if (index) { + iv = index.getX(iv); + } + box.expandByPoint(_vector$5.fromBufferAttribute(position, iv)); + } + geometryInfo.boundingBox = box; } + target.copy(geometryInfo.boundingBox); + return target; } -} -const _RESERVED_CHARS_RE = "\\[\\]\\.:\\/"; -const _reservedRe = new RegExp("[" + _RESERVED_CHARS_RE + "]", "g"); -const _wordChar = "[^" + _RESERVED_CHARS_RE + "]"; -const _wordCharOrDot = "[^" + _RESERVED_CHARS_RE.replace("\\.", "") + "]"; -const _directoryRe = /* @__PURE__ */ /((?:WC+[\/:])*)/.source.replace("WC", _wordChar); -const _nodeRe = /* @__PURE__ */ /(WCOD+)?/.source.replace("WCOD", _wordCharOrDot); -const _objectRe = /* @__PURE__ */ /(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC", _wordChar); -const _propertyRe = /* @__PURE__ */ /\.(WC+)(?:\[(.+)\])?/.source.replace("WC", _wordChar); -const _trackRe = new RegExp( - "^" + _directoryRe + _nodeRe + _objectRe + _propertyRe + "$" -); -const _supportedObjectNames = ["material", "materials", "bones", "map"]; -class Composite { - static { - __name(this, "Composite"); + // get bounding sphere and compute it if it doesn't exist + getBoundingSphereAt(geometryId, target) { + if (geometryId >= this._geometryCount) { + return null; + } + const geometry = this.geometry; + const geometryInfo = this._geometryInfo[geometryId]; + if (geometryInfo.boundingSphere === null) { + const sphere = new Sphere(); + this.getBoundingBoxAt(geometryId, _box$1); + _box$1.getCenter(sphere.center); + const index = geometry.index; + const position = geometry.attributes.position; + let maxRadiusSq = 0; + for (let i = geometryInfo.start, l = geometryInfo.start + geometryInfo.count; i < l; i++) { + let iv = i; + if (index) { + iv = index.getX(iv); + } + _vector$5.fromBufferAttribute(position, iv); + maxRadiusSq = Math.max(maxRadiusSq, sphere.center.distanceToSquared(_vector$5)); + } + sphere.radius = Math.sqrt(maxRadiusSq); + geometryInfo.boundingSphere = sphere; + } + target.copy(geometryInfo.boundingSphere); + return target; } - constructor(targetGroup, path, optionalParsedPath) { - const parsedPath = optionalParsedPath || PropertyBinding.parseTrackName(path); - this._targetGroup = targetGroup; - this._bindings = targetGroup.subscribe_(path, parsedPath); + setMatrixAt(instanceId, matrix) { + const instanceInfo = this._instanceInfo; + const matricesTexture = this._matricesTexture; + const matricesArray = this._matricesTexture.image.data; + if (instanceId >= instanceInfo.length || instanceInfo[instanceId].active === false) { + return this; + } + matrix.toArray(matricesArray, instanceId * 16); + matricesTexture.needsUpdate = true; + return this; } - getValue(array, offset) { - this.bind(); - const firstValidIndex = this._targetGroup.nCachedObjects_, binding = this._bindings[firstValidIndex]; - if (binding !== void 0) binding.getValue(array, offset); + getMatrixAt(instanceId, matrix) { + const instanceInfo = this._instanceInfo; + const matricesArray = this._matricesTexture.image.data; + if (instanceId >= instanceInfo.length || instanceInfo[instanceId].active === false) { + return null; + } + return matrix.fromArray(matricesArray, instanceId * 16); } - setValue(array, offset) { - const bindings = this._bindings; - for (let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++i) { - bindings[i].setValue(array, offset); + setColorAt(instanceId, color) { + if (this._colorsTexture === null) { + this._initColorsTexture(); + } + const colorsTexture = this._colorsTexture; + const colorsArray = this._colorsTexture.image.data; + const instanceInfo = this._instanceInfo; + if (instanceId >= instanceInfo.length || instanceInfo[instanceId].active === false) { + return this; } + color.toArray(colorsArray, instanceId * 4); + colorsTexture.needsUpdate = true; + return this; } - bind() { - const bindings = this._bindings; - for (let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++i) { - bindings[i].bind(); + getColorAt(instanceId, color) { + const colorsArray = this._colorsTexture.image.data; + const instanceInfo = this._instanceInfo; + if (instanceId >= instanceInfo.length || instanceInfo[instanceId].active === false) { + return null; } + return color.fromArray(colorsArray, instanceId * 4); } - unbind() { - const bindings = this._bindings; - for (let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++i) { - bindings[i].unbind(); + setVisibleAt(instanceId, value) { + const instanceInfo = this._instanceInfo; + if (instanceId >= instanceInfo.length || instanceInfo[instanceId].active === false || instanceInfo[instanceId].visible === value) { + return this; } + instanceInfo[instanceId].visible = value; + this._visibilityChanged = true; + return this; } -} -class PropertyBinding { - static { - __name(this, "PropertyBinding"); + getVisibleAt(instanceId) { + const instanceInfo = this._instanceInfo; + if (instanceId >= instanceInfo.length || instanceInfo[instanceId].active === false) { + return false; + } + return instanceInfo[instanceId].visible; } - constructor(rootNode, path, parsedPath) { - this.path = path; - this.parsedPath = parsedPath || PropertyBinding.parseTrackName(path); - this.node = PropertyBinding.findNode(rootNode, this.parsedPath.nodeName); - this.rootNode = rootNode; - this.getValue = this._getValue_unbound; - this.setValue = this._setValue_unbound; + setGeometryIdAt(instanceId, geometryId) { + const instanceInfo = this._instanceInfo; + const geometryInfoList = this._geometryInfo; + if (instanceId >= instanceInfo.length || instanceInfo[instanceId].active === false) { + return null; + } + if (geometryId >= geometryInfoList.length || geometryInfoList[geometryId].active === false) { + return null; + } + instanceInfo[instanceId].geometryIndex = geometryId; + return this; } - static create(root, path, parsedPath) { - if (!(root && root.isAnimationObjectGroup)) { - return new PropertyBinding(root, path, parsedPath); - } else { - return new PropertyBinding.Composite(root, path, parsedPath); + getGeometryIdAt(instanceId) { + const instanceInfo = this._instanceInfo; + if (instanceId >= instanceInfo.length || instanceInfo[instanceId].active === false) { + return -1; } + return instanceInfo[instanceId].geometryIndex; } - /** - * Replaces spaces with underscores and removes unsupported characters from - * node names, to ensure compatibility with parseTrackName(). - * - * @param {string} name Node name to be sanitized. - * @return {string} - */ - static sanitizeNodeName(name) { - return name.replace(/\s/g, "_").replace(_reservedRe, ""); + getGeometryRangeAt(geometryId, target = {}) { + if (geometryId < 0 || geometryId >= this._geometryCount) { + return null; + } + const geometryInfo = this._geometryInfo[geometryId]; + target.vertexStart = geometryInfo.vertexStart; + target.vertexCount = geometryInfo.vertexCount; + target.reservedVertexCount = geometryInfo.reservedVertexCount; + target.indexStart = geometryInfo.indexStart; + target.indexCount = geometryInfo.indexCount; + target.reservedIndexCount = geometryInfo.reservedIndexCount; + target.start = geometryInfo.start; + target.count = geometryInfo.count; + return target; } - static parseTrackName(trackName) { - const matches = _trackRe.exec(trackName); - if (matches === null) { - throw new Error("PropertyBinding: Cannot parse trackName: " + trackName); + setInstanceCount(maxInstanceCount) { + const availableInstanceIds = this._availableInstanceIds; + const instanceInfo = this._instanceInfo; + availableInstanceIds.sort(ascIdSort); + while (availableInstanceIds[availableInstanceIds.length - 1] === instanceInfo.length) { + instanceInfo.pop(); + availableInstanceIds.pop(); } - const results = { - // directoryName: matches[ 1 ], // (tschw) currently unused - nodeName: matches[2], - objectName: matches[3], - objectIndex: matches[4], - propertyName: matches[5], - // required - propertyIndex: matches[6] - }; - const lastDot = results.nodeName && results.nodeName.lastIndexOf("."); - if (lastDot !== void 0 && lastDot !== -1) { - const objectName = results.nodeName.substring(lastDot + 1); - if (_supportedObjectNames.indexOf(objectName) !== -1) { - results.nodeName = results.nodeName.substring(0, lastDot); - results.objectName = objectName; - } + if (maxInstanceCount < instanceInfo.length) { + throw new Error(`BatchedMesh: Instance ids outside the range ${maxInstanceCount} are being used. Cannot shrink instance count.`); } - if (results.propertyName === null || results.propertyName.length === 0) { - throw new Error("PropertyBinding: can not parse propertyName from trackName: " + trackName); + const multiDrawCounts = new Int32Array(maxInstanceCount); + const multiDrawStarts = new Int32Array(maxInstanceCount); + copyArrayContents(this._multiDrawCounts, multiDrawCounts); + copyArrayContents(this._multiDrawStarts, multiDrawStarts); + this._multiDrawCounts = multiDrawCounts; + this._multiDrawStarts = multiDrawStarts; + this._maxInstanceCount = maxInstanceCount; + const indirectTexture = this._indirectTexture; + const matricesTexture = this._matricesTexture; + const colorsTexture = this._colorsTexture; + indirectTexture.dispose(); + this._initIndirectTexture(); + copyArrayContents(indirectTexture.image.data, this._indirectTexture.image.data); + matricesTexture.dispose(); + this._initMatricesTexture(); + copyArrayContents(matricesTexture.image.data, this._matricesTexture.image.data); + if (colorsTexture) { + colorsTexture.dispose(); + this._initColorsTexture(); + copyArrayContents(colorsTexture.image.data, this._colorsTexture.image.data); } - return results; } - static findNode(root, nodeName) { - if (nodeName === void 0 || nodeName === "" || nodeName === "." || nodeName === -1 || nodeName === root.name || nodeName === root.uuid) { - return root; + setGeometrySize(maxVertexCount, maxIndexCount) { + const validRanges = [...this._geometryInfo].filter((info) => info.active); + const requiredVertexLength = Math.max(...validRanges.map((range) => range.vertexStart + range.reservedVertexCount)); + if (requiredVertexLength > maxVertexCount) { + throw new Error(`BatchedMesh: Geometry vertex values are being used outside the range ${maxIndexCount}. Cannot shrink further.`); } - if (root.skeleton) { - const bone = root.skeleton.getBoneByName(nodeName); - if (bone !== void 0) { - return bone; + if (this.geometry.index) { + const requiredIndexLength = Math.max(...validRanges.map((range) => range.indexStart + range.reservedIndexCount)); + if (requiredIndexLength > maxIndexCount) { + throw new Error(`BatchedMesh: Geometry index values are being used outside the range ${maxIndexCount}. Cannot shrink further.`); } } - if (root.children) { - const searchNodeSubtree = /* @__PURE__ */ __name(function(children) { - for (let i = 0; i < children.length; i++) { - const childNode = children[i]; - if (childNode.name === nodeName || childNode.uuid === nodeName) { - return childNode; - } - const result = searchNodeSubtree(childNode.children); - if (result) return result; - } - return null; - }, "searchNodeSubtree"); - const subTreeNode = searchNodeSubtree(root.children); - if (subTreeNode) { - return subTreeNode; - } + const oldGeometry = this.geometry; + oldGeometry.dispose(); + this._maxVertexCount = maxVertexCount; + this._maxIndexCount = maxIndexCount; + if (this._geometryInitialized) { + this._geometryInitialized = false; + this.geometry = new BufferGeometry(); + this._initializeGeometry(oldGeometry); } - return null; - } - // these are used to "bind" a nonexistent property - _getValue_unavailable() { - } - _setValue_unavailable() { - } - // Getters - _getValue_direct(buffer, offset) { - buffer[offset] = this.targetObject[this.propertyName]; - } - _getValue_array(buffer, offset) { - const source = this.resolvedProperty; - for (let i = 0, n = source.length; i !== n; ++i) { - buffer[offset++] = source[i]; + const geometry = this.geometry; + if (oldGeometry.index) { + copyArrayContents(oldGeometry.index.array, geometry.index.array); } - } - _getValue_arrayElement(buffer, offset) { - buffer[offset] = this.resolvedProperty[this.propertyIndex]; - } - _getValue_toArray(buffer, offset) { - this.resolvedProperty.toArray(buffer, offset); - } - // Direct - _setValue_direct(buffer, offset) { - this.targetObject[this.propertyName] = buffer[offset]; - } - _setValue_direct_setNeedsUpdate(buffer, offset) { - this.targetObject[this.propertyName] = buffer[offset]; - this.targetObject.needsUpdate = true; - } - _setValue_direct_setMatrixWorldNeedsUpdate(buffer, offset) { - this.targetObject[this.propertyName] = buffer[offset]; - this.targetObject.matrixWorldNeedsUpdate = true; - } - // EntireArray - _setValue_array(buffer, offset) { - const dest = this.resolvedProperty; - for (let i = 0, n = dest.length; i !== n; ++i) { - dest[i] = buffer[offset++]; + for (const key in oldGeometry.attributes) { + copyArrayContents(oldGeometry.attributes[key].array, geometry.attributes[key].array); } } - _setValue_array_setNeedsUpdate(buffer, offset) { - const dest = this.resolvedProperty; - for (let i = 0, n = dest.length; i !== n; ++i) { - dest[i] = buffer[offset++]; + raycast(raycaster, intersects2) { + const instanceInfo = this._instanceInfo; + const geometryInfoList = this._geometryInfo; + const matrixWorld = this.matrixWorld; + const batchGeometry = this.geometry; + _mesh.material = this.material; + _mesh.geometry.index = batchGeometry.index; + _mesh.geometry.attributes = batchGeometry.attributes; + if (_mesh.geometry.boundingBox === null) { + _mesh.geometry.boundingBox = new Box3(); } - this.targetObject.needsUpdate = true; - } - _setValue_array_setMatrixWorldNeedsUpdate(buffer, offset) { - const dest = this.resolvedProperty; - for (let i = 0, n = dest.length; i !== n; ++i) { - dest[i] = buffer[offset++]; + if (_mesh.geometry.boundingSphere === null) { + _mesh.geometry.boundingSphere = new Sphere(); } - this.targetObject.matrixWorldNeedsUpdate = true; - } - // ArrayElement - _setValue_arrayElement(buffer, offset) { - this.resolvedProperty[this.propertyIndex] = buffer[offset]; - } - _setValue_arrayElement_setNeedsUpdate(buffer, offset) { - this.resolvedProperty[this.propertyIndex] = buffer[offset]; - this.targetObject.needsUpdate = true; - } - _setValue_arrayElement_setMatrixWorldNeedsUpdate(buffer, offset) { - this.resolvedProperty[this.propertyIndex] = buffer[offset]; - this.targetObject.matrixWorldNeedsUpdate = true; - } - // HasToFromArray - _setValue_fromArray(buffer, offset) { - this.resolvedProperty.fromArray(buffer, offset); - } - _setValue_fromArray_setNeedsUpdate(buffer, offset) { - this.resolvedProperty.fromArray(buffer, offset); - this.targetObject.needsUpdate = true; - } - _setValue_fromArray_setMatrixWorldNeedsUpdate(buffer, offset) { - this.resolvedProperty.fromArray(buffer, offset); - this.targetObject.matrixWorldNeedsUpdate = true; - } - _getValue_unbound(targetArray, offset) { - this.bind(); - this.getValue(targetArray, offset); + for (let i = 0, l = instanceInfo.length; i < l; i++) { + if (!instanceInfo[i].visible || !instanceInfo[i].active) { + continue; + } + const geometryId = instanceInfo[i].geometryIndex; + const geometryInfo = geometryInfoList[geometryId]; + _mesh.geometry.setDrawRange(geometryInfo.start, geometryInfo.count); + this.getMatrixAt(i, _mesh.matrixWorld).premultiply(matrixWorld); + this.getBoundingBoxAt(geometryId, _mesh.geometry.boundingBox); + this.getBoundingSphereAt(geometryId, _mesh.geometry.boundingSphere); + _mesh.raycast(raycaster, _batchIntersects); + for (let j = 0, l2 = _batchIntersects.length; j < l2; j++) { + const intersect2 = _batchIntersects[j]; + intersect2.object = this; + intersect2.batchId = i; + intersects2.push(intersect2); + } + _batchIntersects.length = 0; + } + _mesh.material = null; + _mesh.geometry.index = null; + _mesh.geometry.attributes = {}; + _mesh.geometry.setDrawRange(0, Infinity); } - _setValue_unbound(sourceArray, offset) { - this.bind(); - this.setValue(sourceArray, offset); + copy(source) { + super.copy(source); + this.geometry = source.geometry.clone(); + this.perObjectFrustumCulled = source.perObjectFrustumCulled; + this.sortObjects = source.sortObjects; + this.boundingBox = source.boundingBox !== null ? source.boundingBox.clone() : null; + this.boundingSphere = source.boundingSphere !== null ? source.boundingSphere.clone() : null; + this._geometryInfo = source._geometryInfo.map((info) => ({ + ...info, + boundingBox: info.boundingBox !== null ? info.boundingBox.clone() : null, + boundingSphere: info.boundingSphere !== null ? info.boundingSphere.clone() : null + })); + this._instanceInfo = source._instanceInfo.map((info) => ({ ...info })); + this._maxInstanceCount = source._maxInstanceCount; + this._maxVertexCount = source._maxVertexCount; + this._maxIndexCount = source._maxIndexCount; + this._geometryInitialized = source._geometryInitialized; + this._geometryCount = source._geometryCount; + this._multiDrawCounts = source._multiDrawCounts.slice(); + this._multiDrawStarts = source._multiDrawStarts.slice(); + this._matricesTexture = source._matricesTexture.clone(); + this._matricesTexture.image.data = this._matricesTexture.image.data.slice(); + if (this._colorsTexture !== null) { + this._colorsTexture = source._colorsTexture.clone(); + this._colorsTexture.image.data = this._colorsTexture.image.data.slice(); + } + return this; } - // create getter / setter pair for a property in the scene graph - bind() { - let targetObject = this.node; - const parsedPath = this.parsedPath; - const objectName = parsedPath.objectName; - const propertyName = parsedPath.propertyName; - let propertyIndex = parsedPath.propertyIndex; - if (!targetObject) { - targetObject = PropertyBinding.findNode(this.rootNode, parsedPath.nodeName); - this.node = targetObject; + dispose() { + this.geometry.dispose(); + this._matricesTexture.dispose(); + this._matricesTexture = null; + this._indirectTexture.dispose(); + this._indirectTexture = null; + if (this._colorsTexture !== null) { + this._colorsTexture.dispose(); + this._colorsTexture = null; } - this.getValue = this._getValue_unavailable; - this.setValue = this._setValue_unavailable; - if (!targetObject) { - console.warn("THREE.PropertyBinding: No target node found for track: " + this.path + "."); + return this; + } + onBeforeRender(renderer, scene, camera, geometry, material) { + if (!this._visibilityChanged && !this.perObjectFrustumCulled && !this.sortObjects) { return; } - if (objectName) { - let objectIndex = parsedPath.objectIndex; - switch (objectName) { - case "materials": - if (!targetObject.material) { - console.error("THREE.PropertyBinding: Can not bind to material as node does not have a material.", this); - return; - } - if (!targetObject.material.materials) { - console.error("THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.", this); - return; - } - targetObject = targetObject.material.materials; - break; - case "bones": - if (!targetObject.skeleton) { - console.error("THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.", this); - return; - } - targetObject = targetObject.skeleton.bones; - for (let i = 0; i < targetObject.length; i++) { - if (targetObject[i].name === objectIndex) { - objectIndex = i; - break; - } - } - break; - case "map": - if ("map" in targetObject) { - targetObject = targetObject.map; - break; - } - if (!targetObject.material) { - console.error("THREE.PropertyBinding: Can not bind to material as node does not have a material.", this); - return; - } - if (!targetObject.material.map) { - console.error("THREE.PropertyBinding: Can not bind to material.map as node.material does not have a map.", this); - return; + const index = geometry.getIndex(); + const bytesPerElement = index === null ? 1 : index.array.BYTES_PER_ELEMENT; + const instanceInfo = this._instanceInfo; + const multiDrawStarts = this._multiDrawStarts; + const multiDrawCounts = this._multiDrawCounts; + const geometryInfoList = this._geometryInfo; + const perObjectFrustumCulled = this.perObjectFrustumCulled; + const indirectTexture = this._indirectTexture; + const indirectArray = indirectTexture.image.data; + if (perObjectFrustumCulled) { + _matrix$1.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse).multiply(this.matrixWorld); + _frustum.setFromProjectionMatrix( + _matrix$1, + renderer.coordinateSystem + ); + } + let multiDrawCount = 0; + if (this.sortObjects) { + _matrix$1.copy(this.matrixWorld).invert(); + _vector$5.setFromMatrixPosition(camera.matrixWorld).applyMatrix4(_matrix$1); + _forward.set(0, 0, -1).transformDirection(camera.matrixWorld).transformDirection(_matrix$1); + for (let i = 0, l = instanceInfo.length; i < l; i++) { + if (instanceInfo[i].visible && instanceInfo[i].active) { + const geometryId = instanceInfo[i].geometryIndex; + this.getMatrixAt(i, _matrix$1); + this.getBoundingSphereAt(geometryId, _sphere$2).applyMatrix4(_matrix$1); + let culled = false; + if (perObjectFrustumCulled) { + culled = !_frustum.intersectsSphere(_sphere$2); } - targetObject = targetObject.material.map; - break; - default: - if (targetObject[objectName] === void 0) { - console.error("THREE.PropertyBinding: Can not bind to objectName of node undefined.", this); - return; + if (!culled) { + const geometryInfo = geometryInfoList[geometryId]; + const z = _temp.subVectors(_sphere$2.center, _vector$5).dot(_forward); + _renderList.push(geometryInfo.start, geometryInfo.count, z, i); } - targetObject = targetObject[objectName]; - } - if (objectIndex !== void 0) { - if (targetObject[objectIndex] === void 0) { - console.error("THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.", this, targetObject); - return; } - targetObject = targetObject[objectIndex]; } - } - const nodeProperty = targetObject[propertyName]; - if (nodeProperty === void 0) { - const nodeName = parsedPath.nodeName; - console.error("THREE.PropertyBinding: Trying to update property for track: " + nodeName + "." + propertyName + " but it wasn't found.", targetObject); - return; - } - let versioning = this.Versioning.None; - this.targetObject = targetObject; - if (targetObject.needsUpdate !== void 0) { - versioning = this.Versioning.NeedsUpdate; - } else if (targetObject.matrixWorldNeedsUpdate !== void 0) { - versioning = this.Versioning.MatrixWorldNeedsUpdate; - } - let bindingType = this.BindingType.Direct; - if (propertyIndex !== void 0) { - if (propertyName === "morphTargetInfluences") { - if (!targetObject.geometry) { - console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.", this); - return; - } - if (!targetObject.geometry.morphAttributes) { - console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.", this); - return; - } - if (targetObject.morphTargetDictionary[propertyIndex] !== void 0) { - propertyIndex = targetObject.morphTargetDictionary[propertyIndex]; - } + const list = _renderList.list; + const customSort = this.customSort; + if (customSort === null) { + list.sort(material.transparent ? sortTransparent : sortOpaque); + } else { + customSort.call(this, list, camera); } - bindingType = this.BindingType.ArrayElement; - this.resolvedProperty = nodeProperty; - this.propertyIndex = propertyIndex; - } else if (nodeProperty.fromArray !== void 0 && nodeProperty.toArray !== void 0) { - bindingType = this.BindingType.HasFromToArray; - this.resolvedProperty = nodeProperty; - } else if (Array.isArray(nodeProperty)) { - bindingType = this.BindingType.EntireArray; - this.resolvedProperty = nodeProperty; + for (let i = 0, l = list.length; i < l; i++) { + const item = list[i]; + multiDrawStarts[multiDrawCount] = item.start * bytesPerElement; + multiDrawCounts[multiDrawCount] = item.count; + indirectArray[multiDrawCount] = item.index; + multiDrawCount++; + } + _renderList.reset(); } else { - this.propertyName = propertyName; + for (let i = 0, l = instanceInfo.length; i < l; i++) { + if (instanceInfo[i].visible && instanceInfo[i].active) { + const geometryId = instanceInfo[i].geometryIndex; + let culled = false; + if (perObjectFrustumCulled) { + this.getMatrixAt(i, _matrix$1); + this.getBoundingSphereAt(geometryId, _sphere$2).applyMatrix4(_matrix$1); + culled = !_frustum.intersectsSphere(_sphere$2); + } + if (!culled) { + const geometryInfo = geometryInfoList[geometryId]; + multiDrawStarts[multiDrawCount] = geometryInfo.start * bytesPerElement; + multiDrawCounts[multiDrawCount] = geometryInfo.count; + indirectArray[multiDrawCount] = i; + multiDrawCount++; + } + } + } } - this.getValue = this.GetterByBindingType[bindingType]; - this.setValue = this.SetterByBindingTypeAndVersioning[bindingType][versioning]; + indirectTexture.needsUpdate = true; + this._multiDrawCount = multiDrawCount; + this._visibilityChanged = false; } - unbind() { - this.node = null; - this.getValue = this._getValue_unbound; - this.setValue = this._setValue_unbound; + onBeforeShadow(renderer, object, camera, shadowCamera, geometry, depthMaterial) { + this.onBeforeRender(renderer, null, shadowCamera, geometry, depthMaterial); } } -PropertyBinding.Composite = Composite; -PropertyBinding.prototype.BindingType = { - Direct: 0, - EntireArray: 1, - ArrayElement: 2, - HasFromToArray: 3 -}; -PropertyBinding.prototype.Versioning = { - None: 0, - NeedsUpdate: 1, - MatrixWorldNeedsUpdate: 2 -}; -PropertyBinding.prototype.GetterByBindingType = [ - PropertyBinding.prototype._getValue_direct, - PropertyBinding.prototype._getValue_array, - PropertyBinding.prototype._getValue_arrayElement, - PropertyBinding.prototype._getValue_toArray -]; -PropertyBinding.prototype.SetterByBindingTypeAndVersioning = [ - [ - // Direct - PropertyBinding.prototype._setValue_direct, - PropertyBinding.prototype._setValue_direct_setNeedsUpdate, - PropertyBinding.prototype._setValue_direct_setMatrixWorldNeedsUpdate - ], - [ - // EntireArray - PropertyBinding.prototype._setValue_array, - PropertyBinding.prototype._setValue_array_setNeedsUpdate, - PropertyBinding.prototype._setValue_array_setMatrixWorldNeedsUpdate - ], - [ - // ArrayElement - PropertyBinding.prototype._setValue_arrayElement, - PropertyBinding.prototype._setValue_arrayElement_setNeedsUpdate, - PropertyBinding.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate - ], - [ - // HasToFromArray - PropertyBinding.prototype._setValue_fromArray, - PropertyBinding.prototype._setValue_fromArray_setNeedsUpdate, - PropertyBinding.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate - ] -]; -class AnimationObjectGroup { +class LineBasicMaterial extends Material { static { - __name(this, "AnimationObjectGroup"); + __name(this, "LineBasicMaterial"); } - constructor() { - this.isAnimationObjectGroup = true; - this.uuid = generateUUID(); - this._objects = Array.prototype.slice.call(arguments); - this.nCachedObjects_ = 0; - const indices = {}; - this._indicesByUUID = indices; - for (let i = 0, n = arguments.length; i !== n; ++i) { - indices[arguments[i].uuid] = i; - } - this._paths = []; - this._parsedPaths = []; - this._bindings = []; - this._bindingsIndicesByPath = {}; - const scope = this; - this.stats = { - objects: { - get total() { - return scope._objects.length; - }, - get inUse() { - return this.total - scope.nCachedObjects_; - } - }, - get bindingsPerObject() { - return scope._bindings.length; + static get type() { + return "LineBasicMaterial"; + } + constructor(parameters) { + super(); + this.isLineBasicMaterial = true; + this.color = new Color(16777215); + this.map = null; + this.linewidth = 1; + this.linecap = "round"; + this.linejoin = "round"; + this.fog = true; + this.setValues(parameters); + } + copy(source) { + super.copy(source); + this.color.copy(source.color); + this.map = source.map; + this.linewidth = source.linewidth; + this.linecap = source.linecap; + this.linejoin = source.linejoin; + this.fog = source.fog; + return this; + } +} +const _vStart = /* @__PURE__ */ new Vector3(); +const _vEnd = /* @__PURE__ */ new Vector3(); +const _inverseMatrix$1 = /* @__PURE__ */ new Matrix4(); +const _ray$1 = /* @__PURE__ */ new Ray(); +const _sphere$1 = /* @__PURE__ */ new Sphere(); +const _intersectPointOnRay = /* @__PURE__ */ new Vector3(); +const _intersectPointOnSegment = /* @__PURE__ */ new Vector3(); +class Line extends Object3D { + static { + __name(this, "Line"); + } + constructor(geometry = new BufferGeometry(), material = new LineBasicMaterial()) { + super(); + this.isLine = true; + this.type = "Line"; + this.geometry = geometry; + this.material = material; + this.updateMorphTargets(); + } + copy(source, recursive) { + super.copy(source, recursive); + this.material = Array.isArray(source.material) ? source.material.slice() : source.material; + this.geometry = source.geometry; + return this; + } + computeLineDistances() { + const geometry = this.geometry; + if (geometry.index === null) { + const positionAttribute = geometry.attributes.position; + const lineDistances = [0]; + for (let i = 1, l = positionAttribute.count; i < l; i++) { + _vStart.fromBufferAttribute(positionAttribute, i - 1); + _vEnd.fromBufferAttribute(positionAttribute, i); + lineDistances[i] = lineDistances[i - 1]; + lineDistances[i] += _vStart.distanceTo(_vEnd); } - }; + geometry.setAttribute("lineDistance", new Float32BufferAttribute(lineDistances, 1)); + } else { + console.warn("THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry."); + } + return this; } - add() { - const objects = this._objects, indicesByUUID = this._indicesByUUID, paths = this._paths, parsedPaths = this._parsedPaths, bindings = this._bindings, nBindings = bindings.length; - let knownObject = void 0, nObjects = objects.length, nCachedObjects = this.nCachedObjects_; - for (let i = 0, n = arguments.length; i !== n; ++i) { - const object = arguments[i], uuid = object.uuid; - let index = indicesByUUID[uuid]; - if (index === void 0) { - index = nObjects++; - indicesByUUID[uuid] = index; - objects.push(object); - for (let j = 0, m = nBindings; j !== m; ++j) { - bindings[j].push(new PropertyBinding(object, paths[j], parsedPaths[j])); + raycast(raycaster, intersects2) { + const geometry = this.geometry; + const matrixWorld = this.matrixWorld; + const threshold = raycaster.params.Line.threshold; + const drawRange = geometry.drawRange; + if (geometry.boundingSphere === null) geometry.computeBoundingSphere(); + _sphere$1.copy(geometry.boundingSphere); + _sphere$1.applyMatrix4(matrixWorld); + _sphere$1.radius += threshold; + if (raycaster.ray.intersectsSphere(_sphere$1) === false) return; + _inverseMatrix$1.copy(matrixWorld).invert(); + _ray$1.copy(raycaster.ray).applyMatrix4(_inverseMatrix$1); + const localThreshold = threshold / ((this.scale.x + this.scale.y + this.scale.z) / 3); + const localThresholdSq = localThreshold * localThreshold; + const step = this.isLineSegments ? 2 : 1; + const index = geometry.index; + const attributes = geometry.attributes; + const positionAttribute = attributes.position; + if (index !== null) { + const start = Math.max(0, drawRange.start); + const end = Math.min(index.count, drawRange.start + drawRange.count); + for (let i = start, l = end - 1; i < l; i += step) { + const a = index.getX(i); + const b = index.getX(i + 1); + const intersect2 = checkIntersection(this, raycaster, _ray$1, localThresholdSq, a, b); + if (intersect2) { + intersects2.push(intersect2); } - } else if (index < nCachedObjects) { - knownObject = objects[index]; - const firstActiveIndex = --nCachedObjects, lastCachedObject = objects[firstActiveIndex]; - indicesByUUID[lastCachedObject.uuid] = index; - objects[index] = lastCachedObject; - indicesByUUID[uuid] = firstActiveIndex; - objects[firstActiveIndex] = object; - for (let j = 0, m = nBindings; j !== m; ++j) { - const bindingsForPath = bindings[j], lastCached = bindingsForPath[firstActiveIndex]; - let binding = bindingsForPath[index]; - bindingsForPath[index] = lastCached; - if (binding === void 0) { - binding = new PropertyBinding(object, paths[j], parsedPaths[j]); - } - bindingsForPath[firstActiveIndex] = binding; + } + if (this.isLineLoop) { + const a = index.getX(end - 1); + const b = index.getX(start); + const intersect2 = checkIntersection(this, raycaster, _ray$1, localThresholdSq, a, b); + if (intersect2) { + intersects2.push(intersect2); } - } else if (objects[index] !== knownObject) { - console.error("THREE.AnimationObjectGroup: Different objects with the same UUID detected. Clean the caches or recreate your infrastructure when reloading scenes."); } - } - this.nCachedObjects_ = nCachedObjects; - } - remove() { - const objects = this._objects, indicesByUUID = this._indicesByUUID, bindings = this._bindings, nBindings = bindings.length; - let nCachedObjects = this.nCachedObjects_; - for (let i = 0, n = arguments.length; i !== n; ++i) { - const object = arguments[i], uuid = object.uuid, index = indicesByUUID[uuid]; - if (index !== void 0 && index >= nCachedObjects) { - const lastCachedIndex = nCachedObjects++, firstActiveObject = objects[lastCachedIndex]; - indicesByUUID[firstActiveObject.uuid] = index; - objects[index] = firstActiveObject; - indicesByUUID[uuid] = lastCachedIndex; - objects[lastCachedIndex] = object; - for (let j = 0, m = nBindings; j !== m; ++j) { - const bindingsForPath = bindings[j], firstActive = bindingsForPath[lastCachedIndex], binding = bindingsForPath[index]; - bindingsForPath[index] = firstActive; - bindingsForPath[lastCachedIndex] = binding; + } else { + const start = Math.max(0, drawRange.start); + const end = Math.min(positionAttribute.count, drawRange.start + drawRange.count); + for (let i = start, l = end - 1; i < l; i += step) { + const intersect2 = checkIntersection(this, raycaster, _ray$1, localThresholdSq, i, i + 1); + if (intersect2) { + intersects2.push(intersect2); + } + } + if (this.isLineLoop) { + const intersect2 = checkIntersection(this, raycaster, _ray$1, localThresholdSq, end - 1, start); + if (intersect2) { + intersects2.push(intersect2); } } } - this.nCachedObjects_ = nCachedObjects; } - // remove & forget - uncache() { - const objects = this._objects, indicesByUUID = this._indicesByUUID, bindings = this._bindings, nBindings = bindings.length; - let nCachedObjects = this.nCachedObjects_, nObjects = objects.length; - for (let i = 0, n = arguments.length; i !== n; ++i) { - const object = arguments[i], uuid = object.uuid, index = indicesByUUID[uuid]; - if (index !== void 0) { - delete indicesByUUID[uuid]; - if (index < nCachedObjects) { - const firstActiveIndex = --nCachedObjects, lastCachedObject = objects[firstActiveIndex], lastIndex = --nObjects, lastObject = objects[lastIndex]; - indicesByUUID[lastCachedObject.uuid] = index; - objects[index] = lastCachedObject; - indicesByUUID[lastObject.uuid] = firstActiveIndex; - objects[firstActiveIndex] = lastObject; - objects.pop(); - for (let j = 0, m = nBindings; j !== m; ++j) { - const bindingsForPath = bindings[j], lastCached = bindingsForPath[firstActiveIndex], last = bindingsForPath[lastIndex]; - bindingsForPath[index] = lastCached; - bindingsForPath[firstActiveIndex] = last; - bindingsForPath.pop(); - } - } else { - const lastIndex = --nObjects, lastObject = objects[lastIndex]; - if (lastIndex > 0) { - indicesByUUID[lastObject.uuid] = index; - } - objects[index] = lastObject; - objects.pop(); - for (let j = 0, m = nBindings; j !== m; ++j) { - const bindingsForPath = bindings[j]; - bindingsForPath[index] = bindingsForPath[lastIndex]; - bindingsForPath.pop(); - } + updateMorphTargets() { + const geometry = this.geometry; + const morphAttributes = geometry.morphAttributes; + const keys = Object.keys(morphAttributes); + if (keys.length > 0) { + const morphAttribute = morphAttributes[keys[0]]; + if (morphAttribute !== void 0) { + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + for (let m = 0, ml = morphAttribute.length; m < ml; m++) { + const name = morphAttribute[m].name || String(m); + this.morphTargetInfluences.push(0); + this.morphTargetDictionary[name] = m; } } } - this.nCachedObjects_ = nCachedObjects; } - // Internal interface used by befriended PropertyBinding.Composite: - subscribe_(path, parsedPath) { - const indicesByPath = this._bindingsIndicesByPath; - let index = indicesByPath[path]; - const bindings = this._bindings; - if (index !== void 0) return bindings[index]; - const paths = this._paths, parsedPaths = this._parsedPaths, objects = this._objects, nObjects = objects.length, nCachedObjects = this.nCachedObjects_, bindingsForPath = new Array(nObjects); - index = bindings.length; - indicesByPath[path] = index; - paths.push(path); - parsedPaths.push(parsedPath); - bindings.push(bindingsForPath); - for (let i = nCachedObjects, n = objects.length; i !== n; ++i) { - const object = objects[i]; - bindingsForPath[i] = new PropertyBinding(object, path, parsedPath); - } - return bindingsForPath; +} +function checkIntersection(object, raycaster, ray, thresholdSq, a, b) { + const positionAttribute = object.geometry.attributes.position; + _vStart.fromBufferAttribute(positionAttribute, a); + _vEnd.fromBufferAttribute(positionAttribute, b); + const distSq = ray.distanceSqToSegment(_vStart, _vEnd, _intersectPointOnRay, _intersectPointOnSegment); + if (distSq > thresholdSq) return; + _intersectPointOnRay.applyMatrix4(object.matrixWorld); + const distance = raycaster.ray.origin.distanceTo(_intersectPointOnRay); + if (distance < raycaster.near || distance > raycaster.far) return; + return { + distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: _intersectPointOnSegment.clone().applyMatrix4(object.matrixWorld), + index: a, + face: null, + faceIndex: null, + barycoord: null, + object + }; +} +__name(checkIntersection, "checkIntersection"); +const _start = /* @__PURE__ */ new Vector3(); +const _end = /* @__PURE__ */ new Vector3(); +class LineSegments extends Line { + static { + __name(this, "LineSegments"); } - unsubscribe_(path) { - const indicesByPath = this._bindingsIndicesByPath, index = indicesByPath[path]; - if (index !== void 0) { - const paths = this._paths, parsedPaths = this._parsedPaths, bindings = this._bindings, lastBindingsIndex = bindings.length - 1, lastBindings = bindings[lastBindingsIndex], lastBindingsPath = path[lastBindingsIndex]; - indicesByPath[lastBindingsPath] = index; - bindings[index] = lastBindings; - bindings.pop(); - parsedPaths[index] = parsedPaths[lastBindingsIndex]; - parsedPaths.pop(); - paths[index] = paths[lastBindingsIndex]; - paths.pop(); + constructor(geometry, material) { + super(geometry, material); + this.isLineSegments = true; + this.type = "LineSegments"; + } + computeLineDistances() { + const geometry = this.geometry; + if (geometry.index === null) { + const positionAttribute = geometry.attributes.position; + const lineDistances = []; + for (let i = 0, l = positionAttribute.count; i < l; i += 2) { + _start.fromBufferAttribute(positionAttribute, i); + _end.fromBufferAttribute(positionAttribute, i + 1); + lineDistances[i] = i === 0 ? 0 : lineDistances[i - 1]; + lineDistances[i + 1] = lineDistances[i] + _start.distanceTo(_end); + } + geometry.setAttribute("lineDistance", new Float32BufferAttribute(lineDistances, 1)); + } else { + console.warn("THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry."); } + return this; } } -class AnimationAction { +class LineLoop extends Line { static { - __name(this, "AnimationAction"); + __name(this, "LineLoop"); } - constructor(mixer, clip, localRoot = null, blendMode = clip.blendMode) { - this._mixer = mixer; - this._clip = clip; - this._localRoot = localRoot; - this.blendMode = blendMode; - const tracks = clip.tracks, nTracks = tracks.length, interpolants = new Array(nTracks); - const interpolantSettings = { - endingStart: ZeroCurvatureEnding, - endingEnd: ZeroCurvatureEnding - }; - for (let i = 0; i !== nTracks; ++i) { - const interpolant = tracks[i].createInterpolant(null); - interpolants[i] = interpolant; - interpolant.settings = interpolantSettings; - } - this._interpolantSettings = interpolantSettings; - this._interpolants = interpolants; - this._propertyBindings = new Array(nTracks); - this._cacheIndex = null; - this._byClipCacheIndex = null; - this._timeScaleInterpolant = null; - this._weightInterpolant = null; - this.loop = LoopRepeat; - this._loopCount = -1; - this._startTime = null; - this.time = 0; - this.timeScale = 1; - this._effectiveTimeScale = 1; - this.weight = 1; - this._effectiveWeight = 1; - this.repetitions = Infinity; - this.paused = false; - this.enabled = true; - this.clampWhenFinished = false; - this.zeroSlopeAtStart = true; - this.zeroSlopeAtEnd = true; + constructor(geometry, material) { + super(geometry, material); + this.isLineLoop = true; + this.type = "LineLoop"; } - // State & Scheduling - play() { - this._mixer._activateAction(this); - return this; +} +class PointsMaterial extends Material { + static { + __name(this, "PointsMaterial"); } - stop() { - this._mixer._deactivateAction(this); - return this.reset(); + static get type() { + return "PointsMaterial"; } - reset() { - this.paused = false; - this.enabled = true; - this.time = 0; - this._loopCount = -1; - this._startTime = null; - return this.stopFading().stopWarping(); + constructor(parameters) { + super(); + this.isPointsMaterial = true; + this.color = new Color(16777215); + this.map = null; + this.alphaMap = null; + this.size = 1; + this.sizeAttenuation = true; + this.fog = true; + this.setValues(parameters); } - isRunning() { - return this.enabled && !this.paused && this.timeScale !== 0 && this._startTime === null && this._mixer._isActiveAction(this); + copy(source) { + super.copy(source); + this.color.copy(source.color); + this.map = source.map; + this.alphaMap = source.alphaMap; + this.size = source.size; + this.sizeAttenuation = source.sizeAttenuation; + this.fog = source.fog; + return this; } - // return true when play has been called - isScheduled() { - return this._mixer._isActiveAction(this); +} +const _inverseMatrix = /* @__PURE__ */ new Matrix4(); +const _ray$4 = /* @__PURE__ */ new Ray(); +const _sphere = /* @__PURE__ */ new Sphere(); +const _position$2 = /* @__PURE__ */ new Vector3(); +class Points extends Object3D { + static { + __name(this, "Points"); } - startAt(time) { - this._startTime = time; - return this; + constructor(geometry = new BufferGeometry(), material = new PointsMaterial()) { + super(); + this.isPoints = true; + this.type = "Points"; + this.geometry = geometry; + this.material = material; + this.updateMorphTargets(); } - setLoop(mode, repetitions) { - this.loop = mode; - this.repetitions = repetitions; + copy(source, recursive) { + super.copy(source, recursive); + this.material = Array.isArray(source.material) ? source.material.slice() : source.material; + this.geometry = source.geometry; return this; } - // Weight - // set the weight stopping any scheduled fading - // although .enabled = false yields an effective weight of zero, this - // method does *not* change .enabled, because it would be confusing - setEffectiveWeight(weight) { - this.weight = weight; - this._effectiveWeight = this.enabled ? weight : 0; - return this.stopFading(); + raycast(raycaster, intersects2) { + const geometry = this.geometry; + const matrixWorld = this.matrixWorld; + const threshold = raycaster.params.Points.threshold; + const drawRange = geometry.drawRange; + if (geometry.boundingSphere === null) geometry.computeBoundingSphere(); + _sphere.copy(geometry.boundingSphere); + _sphere.applyMatrix4(matrixWorld); + _sphere.radius += threshold; + if (raycaster.ray.intersectsSphere(_sphere) === false) return; + _inverseMatrix.copy(matrixWorld).invert(); + _ray$4.copy(raycaster.ray).applyMatrix4(_inverseMatrix); + const localThreshold = threshold / ((this.scale.x + this.scale.y + this.scale.z) / 3); + const localThresholdSq = localThreshold * localThreshold; + const index = geometry.index; + const attributes = geometry.attributes; + const positionAttribute = attributes.position; + if (index !== null) { + const start = Math.max(0, drawRange.start); + const end = Math.min(index.count, drawRange.start + drawRange.count); + for (let i = start, il = end; i < il; i++) { + const a = index.getX(i); + _position$2.fromBufferAttribute(positionAttribute, a); + testPoint(_position$2, a, localThresholdSq, matrixWorld, raycaster, intersects2, this); + } + } else { + const start = Math.max(0, drawRange.start); + const end = Math.min(positionAttribute.count, drawRange.start + drawRange.count); + for (let i = start, l = end; i < l; i++) { + _position$2.fromBufferAttribute(positionAttribute, i); + testPoint(_position$2, i, localThresholdSq, matrixWorld, raycaster, intersects2, this); + } + } } - // return the weight considering fading and .enabled - getEffectiveWeight() { - return this._effectiveWeight; + updateMorphTargets() { + const geometry = this.geometry; + const morphAttributes = geometry.morphAttributes; + const keys = Object.keys(morphAttributes); + if (keys.length > 0) { + const morphAttribute = morphAttributes[keys[0]]; + if (morphAttribute !== void 0) { + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + for (let m = 0, ml = morphAttribute.length; m < ml; m++) { + const name = morphAttribute[m].name || String(m); + this.morphTargetInfluences.push(0); + this.morphTargetDictionary[name] = m; + } + } + } } - fadeIn(duration) { - return this._scheduleFading(duration, 0, 1); +} +function testPoint(point, index, localThresholdSq, matrixWorld, raycaster, intersects2, object) { + const rayPointDistanceSq = _ray$4.distanceSqToPoint(point); + if (rayPointDistanceSq < localThresholdSq) { + const intersectPoint = new Vector3(); + _ray$4.closestPointToPoint(point, intersectPoint); + intersectPoint.applyMatrix4(matrixWorld); + const distance = raycaster.ray.origin.distanceTo(intersectPoint); + if (distance < raycaster.near || distance > raycaster.far) return; + intersects2.push({ + distance, + distanceToRay: Math.sqrt(rayPointDistanceSq), + point: intersectPoint, + index, + face: null, + faceIndex: null, + barycoord: null, + object + }); } - fadeOut(duration) { - return this._scheduleFading(duration, 1, 0); +} +__name(testPoint, "testPoint"); +class VideoTexture extends Texture { + static { + __name(this, "VideoTexture"); } - crossFadeFrom(fadeOutAction, duration, warp) { - fadeOutAction.fadeOut(duration); - this.fadeIn(duration); - if (warp) { - const fadeInDuration = this._clip.duration, fadeOutDuration = fadeOutAction._clip.duration, startEndRatio = fadeOutDuration / fadeInDuration, endStartRatio = fadeInDuration / fadeOutDuration; - fadeOutAction.warp(1, startEndRatio, duration); - this.warp(endStartRatio, 1, duration); + constructor(video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy) { + super(video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy); + this.isVideoTexture = true; + this.minFilter = minFilter !== void 0 ? minFilter : LinearFilter; + this.magFilter = magFilter !== void 0 ? magFilter : LinearFilter; + this.generateMipmaps = false; + const scope = this; + function updateVideo() { + scope.needsUpdate = true; + video.requestVideoFrameCallback(updateVideo); + } + __name(updateVideo, "updateVideo"); + if ("requestVideoFrameCallback" in video) { + video.requestVideoFrameCallback(updateVideo); } - return this; } - crossFadeTo(fadeInAction, duration, warp) { - return fadeInAction.crossFadeFrom(this, duration, warp); + clone() { + return new this.constructor(this.image).copy(this); } - stopFading() { - const weightInterpolant = this._weightInterpolant; - if (weightInterpolant !== null) { - this._weightInterpolant = null; - this._mixer._takeBackControlInterpolant(weightInterpolant); + update() { + const video = this.image; + const hasVideoFrameCallback = "requestVideoFrameCallback" in video; + if (hasVideoFrameCallback === false && video.readyState >= video.HAVE_CURRENT_DATA) { + this.needsUpdate = true; } - return this; } - // Time Scale Control - // set the time scale stopping any scheduled warping - // although .paused = true yields an effective time scale of zero, this - // method does *not* change .paused, because it would be confusing - setEffectiveTimeScale(timeScale) { - this.timeScale = timeScale; - this._effectiveTimeScale = this.paused ? 0 : timeScale; - return this.stopWarping(); +} +class FramebufferTexture extends Texture { + static { + __name(this, "FramebufferTexture"); + } + constructor(width, height) { + super({ width, height }); + this.isFramebufferTexture = true; + this.magFilter = NearestFilter; + this.minFilter = NearestFilter; + this.generateMipmaps = false; + this.needsUpdate = true; + } +} +class CompressedTexture extends Texture { + static { + __name(this, "CompressedTexture"); + } + constructor(mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, colorSpace) { + super(null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace); + this.isCompressedTexture = true; + this.image = { width, height }; + this.mipmaps = mipmaps; + this.flipY = false; + this.generateMipmaps = false; + } +} +class CompressedArrayTexture extends CompressedTexture { + static { + __name(this, "CompressedArrayTexture"); + } + constructor(mipmaps, width, height, depth, format, type) { + super(mipmaps, width, height, format, type); + this.isCompressedArrayTexture = true; + this.image.depth = depth; + this.wrapR = ClampToEdgeWrapping; + this.layerUpdates = /* @__PURE__ */ new Set(); } - // return the time scale considering warping and .paused - getEffectiveTimeScale() { - return this._effectiveTimeScale; + addLayerUpdate(layerIndex) { + this.layerUpdates.add(layerIndex); } - setDuration(duration) { - this.timeScale = this._clip.duration / duration; - return this.stopWarping(); + clearLayerUpdates() { + this.layerUpdates.clear(); } - syncWith(action) { - this.time = action.time; - this.timeScale = action.timeScale; - return this.stopWarping(); +} +class CompressedCubeTexture extends CompressedTexture { + static { + __name(this, "CompressedCubeTexture"); } - halt(duration) { - return this.warp(this._effectiveTimeScale, 0, duration); + constructor(images, format, type) { + super(void 0, images[0].width, images[0].height, format, type, CubeReflectionMapping); + this.isCompressedCubeTexture = true; + this.isCubeTexture = true; + this.image = images; } - warp(startTimeScale, endTimeScale, duration) { - const mixer = this._mixer, now2 = mixer.time, timeScale = this.timeScale; - let interpolant = this._timeScaleInterpolant; - if (interpolant === null) { - interpolant = mixer._lendControlInterpolant(); - this._timeScaleInterpolant = interpolant; - } - const times = interpolant.parameterPositions, values = interpolant.sampleValues; - times[0] = now2; - times[1] = now2 + duration; - values[0] = startTimeScale / timeScale; - values[1] = endTimeScale / timeScale; - return this; +} +class CanvasTexture extends Texture { + static { + __name(this, "CanvasTexture"); } - stopWarping() { - const timeScaleInterpolant = this._timeScaleInterpolant; - if (timeScaleInterpolant !== null) { - this._timeScaleInterpolant = null; - this._mixer._takeBackControlInterpolant(timeScaleInterpolant); - } - return this; + constructor(canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy) { + super(canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy); + this.isCanvasTexture = true; + this.needsUpdate = true; } - // Object Accessors - getMixer() { - return this._mixer; +} +class Curve { + static { + __name(this, "Curve"); } - getClip() { - return this._clip; + constructor() { + this.type = "Curve"; + this.arcLengthDivisions = 200; } - getRoot() { - return this._localRoot || this._mixer._root; + // Virtual base class method to overwrite and implement in subclasses + // - t [0 .. 1] + getPoint() { + console.warn("THREE.Curve: .getPoint() not implemented."); + return null; } - // Interna - _update(time, deltaTime, timeDirection, accuIndex) { - if (!this.enabled) { - this._updateWeight(time); - return; - } - const startTime = this._startTime; - if (startTime !== null) { - const timeRunning = (time - startTime) * timeDirection; - if (timeRunning < 0 || timeDirection === 0) { - deltaTime = 0; - } else { - this._startTime = null; - deltaTime = timeDirection * timeRunning; - } - } - deltaTime *= this._updateTimeScale(time); - const clipTime = this._updateTime(deltaTime); - const weight = this._updateWeight(time); - if (weight > 0) { - const interpolants = this._interpolants; - const propertyMixers = this._propertyBindings; - switch (this.blendMode) { - case AdditiveAnimationBlendMode: - for (let j = 0, m = interpolants.length; j !== m; ++j) { - interpolants[j].evaluate(clipTime); - propertyMixers[j].accumulateAdditive(weight); - } - break; - case NormalAnimationBlendMode: - default: - for (let j = 0, m = interpolants.length; j !== m; ++j) { - interpolants[j].evaluate(clipTime); - propertyMixers[j].accumulate(accuIndex, weight); - } - } - } + // Get point at relative position in curve according to arc length + // - u [0 .. 1] + getPointAt(u, optionalTarget) { + const t2 = this.getUtoTmapping(u); + return this.getPoint(t2, optionalTarget); } - _updateWeight(time) { - let weight = 0; - if (this.enabled) { - weight = this.weight; - const interpolant = this._weightInterpolant; - if (interpolant !== null) { - const interpolantValue = interpolant.evaluate(time)[0]; - weight *= interpolantValue; - if (time > interpolant.parameterPositions[1]) { - this.stopFading(); - if (interpolantValue === 0) { - this.enabled = false; - } - } - } + // Get sequence of points using getPoint( t ) + getPoints(divisions = 5) { + const points = []; + for (let d = 0; d <= divisions; d++) { + points.push(this.getPoint(d / divisions)); } - this._effectiveWeight = weight; - return weight; + return points; } - _updateTimeScale(time) { - let timeScale = 0; - if (!this.paused) { - timeScale = this.timeScale; - const interpolant = this._timeScaleInterpolant; - if (interpolant !== null) { - const interpolantValue = interpolant.evaluate(time)[0]; - timeScale *= interpolantValue; - if (time > interpolant.parameterPositions[1]) { - this.stopWarping(); - if (timeScale === 0) { - this.paused = true; - } else { - this.timeScale = timeScale; - } - } - } + // Get sequence of points using getPointAt( u ) + getSpacedPoints(divisions = 5) { + const points = []; + for (let d = 0; d <= divisions; d++) { + points.push(this.getPointAt(d / divisions)); } - this._effectiveTimeScale = timeScale; - return timeScale; + return points; } - _updateTime(deltaTime) { - const duration = this._clip.duration; - const loop = this.loop; - let time = this.time + deltaTime; - let loopCount = this._loopCount; - const pingPong = loop === LoopPingPong; - if (deltaTime === 0) { - if (loopCount === -1) return time; - return pingPong && (loopCount & 1) === 1 ? duration - time : time; - } - if (loop === LoopOnce) { - if (loopCount === -1) { - this._loopCount = 0; - this._setEndings(true, true, false); - } - handle_stop: { - if (time >= duration) { - time = duration; - } else if (time < 0) { - time = 0; - } else { - this.time = time; - break handle_stop; - } - if (this.clampWhenFinished) this.paused = true; - else this.enabled = false; - this.time = time; - this._mixer.dispatchEvent({ - type: "finished", - action: this, - direction: deltaTime < 0 ? -1 : 1 - }); - } - } else { - if (loopCount === -1) { - if (deltaTime >= 0) { - loopCount = 0; - this._setEndings(true, this.repetitions === 0, pingPong); - } else { - this._setEndings(this.repetitions === 0, true, pingPong); - } - } - if (time >= duration || time < 0) { - const loopDelta = Math.floor(time / duration); - time -= duration * loopDelta; - loopCount += Math.abs(loopDelta); - const pending = this.repetitions - loopCount; - if (pending <= 0) { - if (this.clampWhenFinished) this.paused = true; - else this.enabled = false; - time = deltaTime > 0 ? duration : 0; - this.time = time; - this._mixer.dispatchEvent({ - type: "finished", - action: this, - direction: deltaTime > 0 ? 1 : -1 - }); - } else { - if (pending === 1) { - const atStart = deltaTime < 0; - this._setEndings(atStart, !atStart, pingPong); - } else { - this._setEndings(false, false, pingPong); - } - this._loopCount = loopCount; - this.time = time; - this._mixer.dispatchEvent({ - type: "loop", - action: this, - loopDelta - }); - } - } else { - this.time = time; - } - if (pingPong && (loopCount & 1) === 1) { - return duration - time; - } - } - return time; + // Get total curve arc length + getLength() { + const lengths = this.getLengths(); + return lengths[lengths.length - 1]; } - _setEndings(atStart, atEnd, pingPong) { - const settings = this._interpolantSettings; - if (pingPong) { - settings.endingStart = ZeroSlopeEnding; - settings.endingEnd = ZeroSlopeEnding; - } else { - if (atStart) { - settings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding; - } else { - settings.endingStart = WrapAroundEnding; - } - if (atEnd) { - settings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding; - } else { - settings.endingEnd = WrapAroundEnding; - } + // Get list of cumulative segment lengths + getLengths(divisions = this.arcLengthDivisions) { + if (this.cacheArcLengths && this.cacheArcLengths.length === divisions + 1 && !this.needsUpdate) { + return this.cacheArcLengths; } - } - _scheduleFading(duration, weightNow, weightThen) { - const mixer = this._mixer, now2 = mixer.time; - let interpolant = this._weightInterpolant; - if (interpolant === null) { - interpolant = mixer._lendControlInterpolant(); - this._weightInterpolant = interpolant; + this.needsUpdate = false; + const cache = []; + let current, last = this.getPoint(0); + let sum = 0; + cache.push(0); + for (let p = 1; p <= divisions; p++) { + current = this.getPoint(p / divisions); + sum += current.distanceTo(last); + cache.push(sum); + last = current; } - const times = interpolant.parameterPositions, values = interpolant.sampleValues; - times[0] = now2; - values[0] = weightNow; - times[1] = now2 + duration; - values[1] = weightThen; - return this; - } -} -const _controlInterpolantsResultBuffer = new Float32Array(1); -class AnimationMixer extends EventDispatcher { - static { - __name(this, "AnimationMixer"); + this.cacheArcLengths = cache; + return cache; } - constructor(root) { - super(); - this._root = root; - this._initMemoryManager(); - this._accuIndex = 0; - this.time = 0; - this.timeScale = 1; + updateArcLengths() { + this.needsUpdate = true; + this.getLengths(); } - _bindAction(action, prototypeAction) { - const root = action._localRoot || this._root, tracks = action._clip.tracks, nTracks = tracks.length, bindings = action._propertyBindings, interpolants = action._interpolants, rootUuid = root.uuid, bindingsByRoot = this._bindingsByRootAndName; - let bindingsByName = bindingsByRoot[rootUuid]; - if (bindingsByName === void 0) { - bindingsByName = {}; - bindingsByRoot[rootUuid] = bindingsByName; + // Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant + getUtoTmapping(u, distance) { + const arcLengths = this.getLengths(); + let i = 0; + const il = arcLengths.length; + let targetArcLength; + if (distance) { + targetArcLength = distance; + } else { + targetArcLength = u * arcLengths[il - 1]; } - for (let i = 0; i !== nTracks; ++i) { - const track = tracks[i], trackName = track.name; - let binding = bindingsByName[trackName]; - if (binding !== void 0) { - ++binding.referenceCount; - bindings[i] = binding; + let low = 0, high = il - 1, comparison; + while (low <= high) { + i = Math.floor(low + (high - low) / 2); + comparison = arcLengths[i] - targetArcLength; + if (comparison < 0) { + low = i + 1; + } else if (comparison > 0) { + high = i - 1; } else { - binding = bindings[i]; - if (binding !== void 0) { - if (binding._cacheIndex === null) { - ++binding.referenceCount; - this._addInactiveBinding(binding, rootUuid, trackName); - } - continue; - } - const path = prototypeAction && prototypeAction._propertyBindings[i].binding.parsedPath; - binding = new PropertyMixer( - PropertyBinding.create(root, trackName, path), - track.ValueTypeName, - track.getValueSize() - ); - ++binding.referenceCount; - this._addInactiveBinding(binding, rootUuid, trackName); - bindings[i] = binding; - } - interpolants[i].resultBuffer = binding.buffer; - } - } - _activateAction(action) { - if (!this._isActiveAction(action)) { - if (action._cacheIndex === null) { - const rootUuid = (action._localRoot || this._root).uuid, clipUuid = action._clip.uuid, actionsForClip = this._actionsByClip[clipUuid]; - this._bindAction( - action, - actionsForClip && actionsForClip.knownActions[0] - ); - this._addInactiveAction(action, clipUuid, rootUuid); - } - const bindings = action._propertyBindings; - for (let i = 0, n = bindings.length; i !== n; ++i) { - const binding = bindings[i]; - if (binding.useCount++ === 0) { - this._lendBinding(binding); - binding.saveOriginalState(); - } + high = i; + break; } - this._lendAction(action); } - } - _deactivateAction(action) { - if (this._isActiveAction(action)) { - const bindings = action._propertyBindings; - for (let i = 0, n = bindings.length; i !== n; ++i) { - const binding = bindings[i]; - if (--binding.useCount === 0) { - binding.restoreOriginalState(); - this._takeBackBinding(binding); - } - } - this._takeBackAction(action); + i = high; + if (arcLengths[i] === targetArcLength) { + return i / (il - 1); } + const lengthBefore = arcLengths[i]; + const lengthAfter = arcLengths[i + 1]; + const segmentLength = lengthAfter - lengthBefore; + const segmentFraction = (targetArcLength - lengthBefore) / segmentLength; + const t2 = (i + segmentFraction) / (il - 1); + return t2; } - // Memory manager - _initMemoryManager() { - this._actions = []; - this._nActiveActions = 0; - this._actionsByClip = {}; - this._bindings = []; - this._nActiveBindings = 0; - this._bindingsByRootAndName = {}; - this._controlInterpolants = []; - this._nActiveControlInterpolants = 0; - const scope = this; - this.stats = { - actions: { - get total() { - return scope._actions.length; - }, - get inUse() { - return scope._nActiveActions; - } - }, - bindings: { - get total() { - return scope._bindings.length; - }, - get inUse() { - return scope._nActiveBindings; - } - }, - controlInterpolants: { - get total() { - return scope._controlInterpolants.length; - }, - get inUse() { - return scope._nActiveControlInterpolants; - } - } - }; + // Returns a unit vector tangent at t + // In case any sub curve does not implement its tangent derivation, + // 2 points a small delta apart will be used to find its gradient + // which seems to give a reasonable approximation + getTangent(t2, optionalTarget) { + const delta = 1e-4; + let t1 = t2 - delta; + let t22 = t2 + delta; + if (t1 < 0) t1 = 0; + if (t22 > 1) t22 = 1; + const pt1 = this.getPoint(t1); + const pt2 = this.getPoint(t22); + const tangent = optionalTarget || (pt1.isVector2 ? new Vector2() : new Vector3()); + tangent.copy(pt2).sub(pt1).normalize(); + return tangent; } - // Memory management for AnimationAction objects - _isActiveAction(action) { - const index = action._cacheIndex; - return index !== null && index < this._nActiveActions; + getTangentAt(u, optionalTarget) { + const t2 = this.getUtoTmapping(u); + return this.getTangent(t2, optionalTarget); } - _addInactiveAction(action, clipUuid, rootUuid) { - const actions = this._actions, actionsByClip = this._actionsByClip; - let actionsForClip = actionsByClip[clipUuid]; - if (actionsForClip === void 0) { - actionsForClip = { - knownActions: [action], - actionByRoot: {} - }; - action._byClipCacheIndex = 0; - actionsByClip[clipUuid] = actionsForClip; - } else { - const knownActions = actionsForClip.knownActions; - action._byClipCacheIndex = knownActions.length; - knownActions.push(action); + computeFrenetFrames(segments, closed) { + const normal = new Vector3(); + const tangents = []; + const normals = []; + const binormals = []; + const vec = new Vector3(); + const mat = new Matrix4(); + for (let i = 0; i <= segments; i++) { + const u = i / segments; + tangents[i] = this.getTangentAt(u, new Vector3()); } - action._cacheIndex = actions.length; - actions.push(action); - actionsForClip.actionByRoot[rootUuid] = action; - } - _removeInactiveAction(action) { - const actions = this._actions, lastInactiveAction = actions[actions.length - 1], cacheIndex = action._cacheIndex; - lastInactiveAction._cacheIndex = cacheIndex; - actions[cacheIndex] = lastInactiveAction; - actions.pop(); - action._cacheIndex = null; - const clipUuid = action._clip.uuid, actionsByClip = this._actionsByClip, actionsForClip = actionsByClip[clipUuid], knownActionsForClip = actionsForClip.knownActions, lastKnownAction = knownActionsForClip[knownActionsForClip.length - 1], byClipCacheIndex = action._byClipCacheIndex; - lastKnownAction._byClipCacheIndex = byClipCacheIndex; - knownActionsForClip[byClipCacheIndex] = lastKnownAction; - knownActionsForClip.pop(); - action._byClipCacheIndex = null; - const actionByRoot = actionsForClip.actionByRoot, rootUuid = (action._localRoot || this._root).uuid; - delete actionByRoot[rootUuid]; - if (knownActionsForClip.length === 0) { - delete actionsByClip[clipUuid]; + normals[0] = new Vector3(); + binormals[0] = new Vector3(); + let min = Number.MAX_VALUE; + const tx = Math.abs(tangents[0].x); + const ty = Math.abs(tangents[0].y); + const tz = Math.abs(tangents[0].z); + if (tx <= min) { + min = tx; + normal.set(1, 0, 0); + } + if (ty <= min) { + min = ty; + normal.set(0, 1, 0); } - this._removeInactiveBindingsForAction(action); - } - _removeInactiveBindingsForAction(action) { - const bindings = action._propertyBindings; - for (let i = 0, n = bindings.length; i !== n; ++i) { - const binding = bindings[i]; - if (--binding.referenceCount === 0) { - this._removeInactiveBinding(binding); + if (tz <= min) { + normal.set(0, 0, 1); + } + vec.crossVectors(tangents[0], normal).normalize(); + normals[0].crossVectors(tangents[0], vec); + binormals[0].crossVectors(tangents[0], normals[0]); + for (let i = 1; i <= segments; i++) { + normals[i] = normals[i - 1].clone(); + binormals[i] = binormals[i - 1].clone(); + vec.crossVectors(tangents[i - 1], tangents[i]); + if (vec.length() > Number.EPSILON) { + vec.normalize(); + const theta = Math.acos(clamp(tangents[i - 1].dot(tangents[i]), -1, 1)); + normals[i].applyMatrix4(mat.makeRotationAxis(vec, theta)); } + binormals[i].crossVectors(tangents[i], normals[i]); } - } - _lendAction(action) { - const actions = this._actions, prevIndex = action._cacheIndex, lastActiveIndex = this._nActiveActions++, firstInactiveAction = actions[lastActiveIndex]; - action._cacheIndex = lastActiveIndex; - actions[lastActiveIndex] = action; - firstInactiveAction._cacheIndex = prevIndex; - actions[prevIndex] = firstInactiveAction; - } - _takeBackAction(action) { - const actions = this._actions, prevIndex = action._cacheIndex, firstInactiveIndex = --this._nActiveActions, lastActiveAction = actions[firstInactiveIndex]; - action._cacheIndex = firstInactiveIndex; - actions[firstInactiveIndex] = action; - lastActiveAction._cacheIndex = prevIndex; - actions[prevIndex] = lastActiveAction; - } - // Memory management for PropertyMixer objects - _addInactiveBinding(binding, rootUuid, trackName) { - const bindingsByRoot = this._bindingsByRootAndName, bindings = this._bindings; - let bindingByName = bindingsByRoot[rootUuid]; - if (bindingByName === void 0) { - bindingByName = {}; - bindingsByRoot[rootUuid] = bindingByName; + if (closed === true) { + let theta = Math.acos(clamp(normals[0].dot(normals[segments]), -1, 1)); + theta /= segments; + if (tangents[0].dot(vec.crossVectors(normals[0], normals[segments])) > 0) { + theta = -theta; + } + for (let i = 1; i <= segments; i++) { + normals[i].applyMatrix4(mat.makeRotationAxis(tangents[i], theta * i)); + binormals[i].crossVectors(tangents[i], normals[i]); + } } - bindingByName[trackName] = binding; - binding._cacheIndex = bindings.length; - bindings.push(binding); + return { + tangents, + normals, + binormals + }; } - _removeInactiveBinding(binding) { - const bindings = this._bindings, propBinding = binding.binding, rootUuid = propBinding.rootNode.uuid, trackName = propBinding.path, bindingsByRoot = this._bindingsByRootAndName, bindingByName = bindingsByRoot[rootUuid], lastInactiveBinding = bindings[bindings.length - 1], cacheIndex = binding._cacheIndex; - lastInactiveBinding._cacheIndex = cacheIndex; - bindings[cacheIndex] = lastInactiveBinding; - bindings.pop(); - delete bindingByName[trackName]; - if (Object.keys(bindingByName).length === 0) { - delete bindingsByRoot[rootUuid]; - } + clone() { + return new this.constructor().copy(this); } - _lendBinding(binding) { - const bindings = this._bindings, prevIndex = binding._cacheIndex, lastActiveIndex = this._nActiveBindings++, firstInactiveBinding = bindings[lastActiveIndex]; - binding._cacheIndex = lastActiveIndex; - bindings[lastActiveIndex] = binding; - firstInactiveBinding._cacheIndex = prevIndex; - bindings[prevIndex] = firstInactiveBinding; + copy(source) { + this.arcLengthDivisions = source.arcLengthDivisions; + return this; } - _takeBackBinding(binding) { - const bindings = this._bindings, prevIndex = binding._cacheIndex, firstInactiveIndex = --this._nActiveBindings, lastActiveBinding = bindings[firstInactiveIndex]; - binding._cacheIndex = firstInactiveIndex; - bindings[firstInactiveIndex] = binding; - lastActiveBinding._cacheIndex = prevIndex; - bindings[prevIndex] = lastActiveBinding; + toJSON() { + const data = { + metadata: { + version: 4.6, + type: "Curve", + generator: "Curve.toJSON" + } + }; + data.arcLengthDivisions = this.arcLengthDivisions; + data.type = this.type; + return data; } - // Memory management of Interpolants for weight and time scale - _lendControlInterpolant() { - const interpolants = this._controlInterpolants, lastActiveIndex = this._nActiveControlInterpolants++; - let interpolant = interpolants[lastActiveIndex]; - if (interpolant === void 0) { - interpolant = new LinearInterpolant( - new Float32Array(2), - new Float32Array(2), - 1, - _controlInterpolantsResultBuffer - ); - interpolant.__cacheIndex = lastActiveIndex; - interpolants[lastActiveIndex] = interpolant; - } - return interpolant; + fromJSON(json) { + this.arcLengthDivisions = json.arcLengthDivisions; + return this; } - _takeBackControlInterpolant(interpolant) { - const interpolants = this._controlInterpolants, prevIndex = interpolant.__cacheIndex, firstInactiveIndex = --this._nActiveControlInterpolants, lastActiveInterpolant = interpolants[firstInactiveIndex]; - interpolant.__cacheIndex = firstInactiveIndex; - interpolants[firstInactiveIndex] = interpolant; - lastActiveInterpolant.__cacheIndex = prevIndex; - interpolants[prevIndex] = lastActiveInterpolant; +} +class EllipseCurve extends Curve { + static { + __name(this, "EllipseCurve"); } - // return an action for a clip optionally using a custom root target - // object (this method allocates a lot of dynamic memory in case a - // previously unknown clip/root combination is specified) - clipAction(clip, optionalRoot, blendMode) { - const root = optionalRoot || this._root, rootUuid = root.uuid; - let clipObject = typeof clip === "string" ? AnimationClip.findByName(root, clip) : clip; - const clipUuid = clipObject !== null ? clipObject.uuid : clip; - const actionsForClip = this._actionsByClip[clipUuid]; - let prototypeAction = null; - if (blendMode === void 0) { - if (clipObject !== null) { - blendMode = clipObject.blendMode; + constructor(aX = 0, aY = 0, xRadius = 1, yRadius = 1, aStartAngle = 0, aEndAngle = Math.PI * 2, aClockwise = false, aRotation = 0) { + super(); + this.isEllipseCurve = true; + this.type = "EllipseCurve"; + this.aX = aX; + this.aY = aY; + this.xRadius = xRadius; + this.yRadius = yRadius; + this.aStartAngle = aStartAngle; + this.aEndAngle = aEndAngle; + this.aClockwise = aClockwise; + this.aRotation = aRotation; + } + getPoint(t2, optionalTarget = new Vector2()) { + const point = optionalTarget; + const twoPi = Math.PI * 2; + let deltaAngle = this.aEndAngle - this.aStartAngle; + const samePoints = Math.abs(deltaAngle) < Number.EPSILON; + while (deltaAngle < 0) deltaAngle += twoPi; + while (deltaAngle > twoPi) deltaAngle -= twoPi; + if (deltaAngle < Number.EPSILON) { + if (samePoints) { + deltaAngle = 0; } else { - blendMode = NormalAnimationBlendMode; + deltaAngle = twoPi; } } - if (actionsForClip !== void 0) { - const existingAction = actionsForClip.actionByRoot[rootUuid]; - if (existingAction !== void 0 && existingAction.blendMode === blendMode) { - return existingAction; + if (this.aClockwise === true && !samePoints) { + if (deltaAngle === twoPi) { + deltaAngle = -twoPi; + } else { + deltaAngle = deltaAngle - twoPi; } - prototypeAction = actionsForClip.knownActions[0]; - if (clipObject === null) - clipObject = prototypeAction._clip; } - if (clipObject === null) return null; - const newAction = new AnimationAction(this, clipObject, optionalRoot, blendMode); - this._bindAction(newAction, prototypeAction); - this._addInactiveAction(newAction, clipUuid, rootUuid); - return newAction; - } - // get an existing action - existingAction(clip, optionalRoot) { - const root = optionalRoot || this._root, rootUuid = root.uuid, clipObject = typeof clip === "string" ? AnimationClip.findByName(root, clip) : clip, clipUuid = clipObject ? clipObject.uuid : clip, actionsForClip = this._actionsByClip[clipUuid]; - if (actionsForClip !== void 0) { - return actionsForClip.actionByRoot[rootUuid] || null; + const angle = this.aStartAngle + t2 * deltaAngle; + let x = this.aX + this.xRadius * Math.cos(angle); + let y = this.aY + this.yRadius * Math.sin(angle); + if (this.aRotation !== 0) { + const cos = Math.cos(this.aRotation); + const sin = Math.sin(this.aRotation); + const tx = x - this.aX; + const ty = y - this.aY; + x = tx * cos - ty * sin + this.aX; + y = tx * sin + ty * cos + this.aY; } - return null; + return point.set(x, y); } - // deactivates all previously scheduled actions - stopAllAction() { - const actions = this._actions, nActions = this._nActiveActions; - for (let i = nActions - 1; i >= 0; --i) { - actions[i].stop(); - } + copy(source) { + super.copy(source); + this.aX = source.aX; + this.aY = source.aY; + this.xRadius = source.xRadius; + this.yRadius = source.yRadius; + this.aStartAngle = source.aStartAngle; + this.aEndAngle = source.aEndAngle; + this.aClockwise = source.aClockwise; + this.aRotation = source.aRotation; return this; } - // advance the time and update apply the animation - update(deltaTime) { - deltaTime *= this.timeScale; - const actions = this._actions, nActions = this._nActiveActions, time = this.time += deltaTime, timeDirection = Math.sign(deltaTime), accuIndex = this._accuIndex ^= 1; - for (let i = 0; i !== nActions; ++i) { - const action = actions[i]; - action._update(time, deltaTime, timeDirection, accuIndex); - } - const bindings = this._bindings, nBindings = this._nActiveBindings; - for (let i = 0; i !== nBindings; ++i) { - bindings[i].apply(accuIndex); - } + toJSON() { + const data = super.toJSON(); + data.aX = this.aX; + data.aY = this.aY; + data.xRadius = this.xRadius; + data.yRadius = this.yRadius; + data.aStartAngle = this.aStartAngle; + data.aEndAngle = this.aEndAngle; + data.aClockwise = this.aClockwise; + data.aRotation = this.aRotation; + return data; + } + fromJSON(json) { + super.fromJSON(json); + this.aX = json.aX; + this.aY = json.aY; + this.xRadius = json.xRadius; + this.yRadius = json.yRadius; + this.aStartAngle = json.aStartAngle; + this.aEndAngle = json.aEndAngle; + this.aClockwise = json.aClockwise; + this.aRotation = json.aRotation; return this; } - // Allows you to seek to a specific time in an animation. - setTime(timeInSeconds) { - this.time = 0; - for (let i = 0; i < this._actions.length; i++) { - this._actions[i].time = 0; - } - return this.update(timeInSeconds); +} +class ArcCurve extends EllipseCurve { + static { + __name(this, "ArcCurve"); } - // return this mixer's root target object - getRoot() { - return this._root; + constructor(aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise) { + super(aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise); + this.isArcCurve = true; + this.type = "ArcCurve"; } - // free all resources specific to a particular clip - uncacheClip(clip) { - const actions = this._actions, clipUuid = clip.uuid, actionsByClip = this._actionsByClip, actionsForClip = actionsByClip[clipUuid]; - if (actionsForClip !== void 0) { - const actionsToRemove = actionsForClip.knownActions; - for (let i = 0, n = actionsToRemove.length; i !== n; ++i) { - const action = actionsToRemove[i]; - this._deactivateAction(action); - const cacheIndex = action._cacheIndex, lastInactiveAction = actions[actions.length - 1]; - action._cacheIndex = null; - action._byClipCacheIndex = null; - lastInactiveAction._cacheIndex = cacheIndex; - actions[cacheIndex] = lastInactiveAction; - actions.pop(); - this._removeInactiveBindingsForAction(action); - } - delete actionsByClip[clipUuid]; +} +function CubicPoly() { + let c0 = 0, c1 = 0, c2 = 0, c3 = 0; + function init(x0, x1, t0, t1) { + c0 = x0; + c1 = t0; + c2 = -3 * x0 + 3 * x1 - 2 * t0 - t1; + c3 = 2 * x0 - 2 * x1 + t0 + t1; + } + __name(init, "init"); + return { + initCatmullRom: /* @__PURE__ */ __name(function(x0, x1, x2, x3, tension) { + init(x1, x2, tension * (x2 - x0), tension * (x3 - x1)); + }, "initCatmullRom"), + initNonuniformCatmullRom: /* @__PURE__ */ __name(function(x0, x1, x2, x3, dt0, dt1, dt2) { + let t1 = (x1 - x0) / dt0 - (x2 - x0) / (dt0 + dt1) + (x2 - x1) / dt1; + let t2 = (x2 - x1) / dt1 - (x3 - x1) / (dt1 + dt2) + (x3 - x2) / dt2; + t1 *= dt1; + t2 *= dt1; + init(x1, x2, t1, t2); + }, "initNonuniformCatmullRom"), + calc: /* @__PURE__ */ __name(function(t2) { + const t22 = t2 * t2; + const t3 = t22 * t2; + return c0 + c1 * t2 + c2 * t22 + c3 * t3; + }, "calc") + }; +} +__name(CubicPoly, "CubicPoly"); +const tmp = /* @__PURE__ */ new Vector3(); +const px = /* @__PURE__ */ new CubicPoly(); +const py = /* @__PURE__ */ new CubicPoly(); +const pz = /* @__PURE__ */ new CubicPoly(); +class CatmullRomCurve3 extends Curve { + static { + __name(this, "CatmullRomCurve3"); + } + constructor(points = [], closed = false, curveType = "centripetal", tension = 0.5) { + super(); + this.isCatmullRomCurve3 = true; + this.type = "CatmullRomCurve3"; + this.points = points; + this.closed = closed; + this.curveType = curveType; + this.tension = tension; + } + getPoint(t2, optionalTarget = new Vector3()) { + const point = optionalTarget; + const points = this.points; + const l = points.length; + const p = (l - (this.closed ? 0 : 1)) * t2; + let intPoint = Math.floor(p); + let weight = p - intPoint; + if (this.closed) { + intPoint += intPoint > 0 ? 0 : (Math.floor(Math.abs(intPoint) / l) + 1) * l; + } else if (weight === 0 && intPoint === l - 1) { + intPoint = l - 2; + weight = 1; + } + let p0, p3; + if (this.closed || intPoint > 0) { + p0 = points[(intPoint - 1) % l]; + } else { + tmp.subVectors(points[0], points[1]).add(points[0]); + p0 = tmp; } + const p1 = points[intPoint % l]; + const p2 = points[(intPoint + 1) % l]; + if (this.closed || intPoint + 2 < l) { + p3 = points[(intPoint + 2) % l]; + } else { + tmp.subVectors(points[l - 1], points[l - 2]).add(points[l - 1]); + p3 = tmp; + } + if (this.curveType === "centripetal" || this.curveType === "chordal") { + const pow = this.curveType === "chordal" ? 0.5 : 0.25; + let dt0 = Math.pow(p0.distanceToSquared(p1), pow); + let dt1 = Math.pow(p1.distanceToSquared(p2), pow); + let dt2 = Math.pow(p2.distanceToSquared(p3), pow); + if (dt1 < 1e-4) dt1 = 1; + if (dt0 < 1e-4) dt0 = dt1; + if (dt2 < 1e-4) dt2 = dt1; + px.initNonuniformCatmullRom(p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2); + py.initNonuniformCatmullRom(p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2); + pz.initNonuniformCatmullRom(p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2); + } else if (this.curveType === "catmullrom") { + px.initCatmullRom(p0.x, p1.x, p2.x, p3.x, this.tension); + py.initCatmullRom(p0.y, p1.y, p2.y, p3.y, this.tension); + pz.initCatmullRom(p0.z, p1.z, p2.z, p3.z, this.tension); + } + point.set( + px.calc(weight), + py.calc(weight), + pz.calc(weight) + ); + return point; } - // free all resources specific to a particular root target object - uncacheRoot(root) { - const rootUuid = root.uuid, actionsByClip = this._actionsByClip; - for (const clipUuid in actionsByClip) { - const actionByRoot = actionsByClip[clipUuid].actionByRoot, action = actionByRoot[rootUuid]; - if (action !== void 0) { - this._deactivateAction(action); - this._removeInactiveAction(action); - } + copy(source) { + super.copy(source); + this.points = []; + for (let i = 0, l = source.points.length; i < l; i++) { + const point = source.points[i]; + this.points.push(point.clone()); } - const bindingsByRoot = this._bindingsByRootAndName, bindingByName = bindingsByRoot[rootUuid]; - if (bindingByName !== void 0) { - for (const trackName in bindingByName) { - const binding = bindingByName[trackName]; - binding.restoreOriginalState(); - this._removeInactiveBinding(binding); - } + this.closed = source.closed; + this.curveType = source.curveType; + this.tension = source.tension; + return this; + } + toJSON() { + const data = super.toJSON(); + data.points = []; + for (let i = 0, l = this.points.length; i < l; i++) { + const point = this.points[i]; + data.points.push(point.toArray()); } + data.closed = this.closed; + data.curveType = this.curveType; + data.tension = this.tension; + return data; } - // remove a targeted clip from the cache - uncacheAction(clip, optionalRoot) { - const action = this.existingAction(clip, optionalRoot); - if (action !== null) { - this._deactivateAction(action); - this._removeInactiveAction(action); + fromJSON(json) { + super.fromJSON(json); + this.points = []; + for (let i = 0, l = json.points.length; i < l; i++) { + const point = json.points[i]; + this.points.push(new Vector3().fromArray(point)); } + this.closed = json.closed; + this.curveType = json.curveType; + this.tension = json.tension; + return this; } } -class Uniform { +function CatmullRom(t2, p0, p1, p2, p3) { + const v0 = (p2 - p0) * 0.5; + const v1 = (p3 - p1) * 0.5; + const t22 = t2 * t2; + const t3 = t2 * t22; + return (2 * p1 - 2 * p2 + v0 + v1) * t3 + (-3 * p1 + 3 * p2 - 2 * v0 - v1) * t22 + v0 * t2 + p1; +} +__name(CatmullRom, "CatmullRom"); +function QuadraticBezierP0(t2, p) { + const k = 1 - t2; + return k * k * p; +} +__name(QuadraticBezierP0, "QuadraticBezierP0"); +function QuadraticBezierP1(t2, p) { + return 2 * (1 - t2) * t2 * p; +} +__name(QuadraticBezierP1, "QuadraticBezierP1"); +function QuadraticBezierP2(t2, p) { + return t2 * t2 * p; +} +__name(QuadraticBezierP2, "QuadraticBezierP2"); +function QuadraticBezier(t2, p0, p1, p2) { + return QuadraticBezierP0(t2, p0) + QuadraticBezierP1(t2, p1) + QuadraticBezierP2(t2, p2); +} +__name(QuadraticBezier, "QuadraticBezier"); +function CubicBezierP0(t2, p) { + const k = 1 - t2; + return k * k * k * p; +} +__name(CubicBezierP0, "CubicBezierP0"); +function CubicBezierP1(t2, p) { + const k = 1 - t2; + return 3 * k * k * t2 * p; +} +__name(CubicBezierP1, "CubicBezierP1"); +function CubicBezierP2(t2, p) { + return 3 * (1 - t2) * t2 * t2 * p; +} +__name(CubicBezierP2, "CubicBezierP2"); +function CubicBezierP3(t2, p) { + return t2 * t2 * t2 * p; +} +__name(CubicBezierP3, "CubicBezierP3"); +function CubicBezier(t2, p0, p1, p2, p3) { + return CubicBezierP0(t2, p0) + CubicBezierP1(t2, p1) + CubicBezierP2(t2, p2) + CubicBezierP3(t2, p3); +} +__name(CubicBezier, "CubicBezier"); +class CubicBezierCurve extends Curve { static { - __name(this, "Uniform"); + __name(this, "CubicBezierCurve"); + } + constructor(v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2(), v3 = new Vector2()) { + super(); + this.isCubicBezierCurve = true; + this.type = "CubicBezierCurve"; + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + this.v3 = v3; + } + getPoint(t2, optionalTarget = new Vector2()) { + const point = optionalTarget; + const v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; + point.set( + CubicBezier(t2, v0.x, v1.x, v2.x, v3.x), + CubicBezier(t2, v0.y, v1.y, v2.y, v3.y) + ); + return point; + } + copy(source) { + super.copy(source); + this.v0.copy(source.v0); + this.v1.copy(source.v1); + this.v2.copy(source.v2); + this.v3.copy(source.v3); + return this; } - constructor(value) { - this.value = value; + toJSON() { + const data = super.toJSON(); + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + data.v3 = this.v3.toArray(); + return data; } - clone() { - return new Uniform(this.value.clone === void 0 ? this.value : this.value.clone()); + fromJSON(json) { + super.fromJSON(json); + this.v0.fromArray(json.v0); + this.v1.fromArray(json.v1); + this.v2.fromArray(json.v2); + this.v3.fromArray(json.v3); + return this; } } -let _id = 0; -class UniformsGroup extends EventDispatcher { +class CubicBezierCurve3 extends Curve { static { - __name(this, "UniformsGroup"); + __name(this, "CubicBezierCurve3"); } - constructor() { + constructor(v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3(), v3 = new Vector3()) { super(); - this.isUniformsGroup = true; - Object.defineProperty(this, "id", { value: _id++ }); - this.name = ""; - this.usage = StaticDrawUsage; - this.uniforms = []; + this.isCubicBezierCurve3 = true; + this.type = "CubicBezierCurve3"; + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + this.v3 = v3; } - add(uniform) { - this.uniforms.push(uniform); - return this; + getPoint(t2, optionalTarget = new Vector3()) { + const point = optionalTarget; + const v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; + point.set( + CubicBezier(t2, v0.x, v1.x, v2.x, v3.x), + CubicBezier(t2, v0.y, v1.y, v2.y, v3.y), + CubicBezier(t2, v0.z, v1.z, v2.z, v3.z) + ); + return point; } - remove(uniform) { - const index = this.uniforms.indexOf(uniform); - if (index !== -1) this.uniforms.splice(index, 1); + copy(source) { + super.copy(source); + this.v0.copy(source.v0); + this.v1.copy(source.v1); + this.v2.copy(source.v2); + this.v3.copy(source.v3); return this; } - setName(name) { - this.name = name; - return this; + toJSON() { + const data = super.toJSON(); + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + data.v3 = this.v3.toArray(); + return data; } - setUsage(value) { - this.usage = value; + fromJSON(json) { + super.fromJSON(json); + this.v0.fromArray(json.v0); + this.v1.fromArray(json.v1); + this.v2.fromArray(json.v2); + this.v3.fromArray(json.v3); return this; } - dispose() { - this.dispatchEvent({ type: "dispose" }); - return this; +} +class LineCurve extends Curve { + static { + __name(this, "LineCurve"); } - copy(source) { - this.name = source.name; - this.usage = source.usage; - const uniformsSource = source.uniforms; - this.uniforms.length = 0; - for (let i = 0, l = uniformsSource.length; i < l; i++) { - const uniforms = Array.isArray(uniformsSource[i]) ? uniformsSource[i] : [uniformsSource[i]]; - for (let j = 0; j < uniforms.length; j++) { - this.uniforms.push(uniforms[j].clone()); - } + constructor(v1 = new Vector2(), v2 = new Vector2()) { + super(); + this.isLineCurve = true; + this.type = "LineCurve"; + this.v1 = v1; + this.v2 = v2; + } + getPoint(t2, optionalTarget = new Vector2()) { + const point = optionalTarget; + if (t2 === 1) { + point.copy(this.v2); + } else { + point.copy(this.v2).sub(this.v1); + point.multiplyScalar(t2).add(this.v1); } - return this; + return point; } - clone() { - return new this.constructor().copy(this); + // Line curve is linear, so we can overwrite default getPointAt + getPointAt(u, optionalTarget) { + return this.getPoint(u, optionalTarget); } -} -class InstancedInterleavedBuffer extends InterleavedBuffer { - static { - __name(this, "InstancedInterleavedBuffer"); + getTangent(t2, optionalTarget = new Vector2()) { + return optionalTarget.subVectors(this.v2, this.v1).normalize(); } - constructor(array, stride, meshPerAttribute = 1) { - super(array, stride); - this.isInstancedInterleavedBuffer = true; - this.meshPerAttribute = meshPerAttribute; + getTangentAt(u, optionalTarget) { + return this.getTangent(u, optionalTarget); } copy(source) { super.copy(source); - this.meshPerAttribute = source.meshPerAttribute; + this.v1.copy(source.v1); + this.v2.copy(source.v2); return this; } - clone(data) { - const ib = super.clone(data); - ib.meshPerAttribute = this.meshPerAttribute; - return ib; + toJSON() { + const data = super.toJSON(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + return data; } - toJSON(data) { - const json = super.toJSON(data); - json.isInstancedInterleavedBuffer = true; - json.meshPerAttribute = this.meshPerAttribute; - return json; + fromJSON(json) { + super.fromJSON(json); + this.v1.fromArray(json.v1); + this.v2.fromArray(json.v2); + return this; } } -class GLBufferAttribute { +class LineCurve3 extends Curve { static { - __name(this, "GLBufferAttribute"); + __name(this, "LineCurve3"); } - constructor(buffer, type, itemSize, elementSize, count) { - this.isGLBufferAttribute = true; - this.name = ""; - this.buffer = buffer; - this.type = type; - this.itemSize = itemSize; - this.elementSize = elementSize; - this.count = count; - this.version = 0; + constructor(v1 = new Vector3(), v2 = new Vector3()) { + super(); + this.isLineCurve3 = true; + this.type = "LineCurve3"; + this.v1 = v1; + this.v2 = v2; } - set needsUpdate(value) { - if (value === true) this.version++; + getPoint(t2, optionalTarget = new Vector3()) { + const point = optionalTarget; + if (t2 === 1) { + point.copy(this.v2); + } else { + point.copy(this.v2).sub(this.v1); + point.multiplyScalar(t2).add(this.v1); + } + return point; } - setBuffer(buffer) { - this.buffer = buffer; - return this; + // Line curve is linear, so we can overwrite default getPointAt + getPointAt(u, optionalTarget) { + return this.getPoint(u, optionalTarget); } - setType(type, elementSize) { - this.type = type; - this.elementSize = elementSize; - return this; + getTangent(t2, optionalTarget = new Vector3()) { + return optionalTarget.subVectors(this.v2, this.v1).normalize(); } - setItemSize(itemSize) { - this.itemSize = itemSize; + getTangentAt(u, optionalTarget) { + return this.getTangent(u, optionalTarget); + } + copy(source) { + super.copy(source); + this.v1.copy(source.v1); + this.v2.copy(source.v2); return this; } - setCount(count) { - this.count = count; + toJSON() { + const data = super.toJSON(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + return data; + } + fromJSON(json) { + super.fromJSON(json); + this.v1.fromArray(json.v1); + this.v2.fromArray(json.v2); return this; } } -const _matrix = /* @__PURE__ */ new Matrix4(); -class Raycaster { +class QuadraticBezierCurve extends Curve { static { - __name(this, "Raycaster"); - } - constructor(origin, direction, near = 0, far = Infinity) { - this.ray = new Ray(origin, direction); - this.near = near; - this.far = far; - this.camera = null; - this.layers = new Layers(); - this.params = { - Mesh: {}, - Line: { threshold: 1 }, - LOD: {}, - Points: { threshold: 1 }, - Sprite: {} - }; + __name(this, "QuadraticBezierCurve"); } - set(origin, direction) { - this.ray.set(origin, direction); + constructor(v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2()) { + super(); + this.isQuadraticBezierCurve = true; + this.type = "QuadraticBezierCurve"; + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; } - setFromCamera(coords, camera) { - if (camera.isPerspectiveCamera) { - this.ray.origin.setFromMatrixPosition(camera.matrixWorld); - this.ray.direction.set(coords.x, coords.y, 0.5).unproject(camera).sub(this.ray.origin).normalize(); - this.camera = camera; - } else if (camera.isOrthographicCamera) { - this.ray.origin.set(coords.x, coords.y, (camera.near + camera.far) / (camera.near - camera.far)).unproject(camera); - this.ray.direction.set(0, 0, -1).transformDirection(camera.matrixWorld); - this.camera = camera; - } else { - console.error("THREE.Raycaster: Unsupported camera type: " + camera.type); - } + getPoint(t2, optionalTarget = new Vector2()) { + const point = optionalTarget; + const v0 = this.v0, v1 = this.v1, v2 = this.v2; + point.set( + QuadraticBezier(t2, v0.x, v1.x, v2.x), + QuadraticBezier(t2, v0.y, v1.y, v2.y) + ); + return point; } - setFromXRController(controller) { - _matrix.identity().extractRotation(controller.matrixWorld); - this.ray.origin.setFromMatrixPosition(controller.matrixWorld); - this.ray.direction.set(0, 0, -1).applyMatrix4(_matrix); + copy(source) { + super.copy(source); + this.v0.copy(source.v0); + this.v1.copy(source.v1); + this.v2.copy(source.v2); return this; } - intersectObject(object, recursive = true, intersects2 = []) { - intersect(object, this, intersects2, recursive); - intersects2.sort(ascSort); - return intersects2; + toJSON() { + const data = super.toJSON(); + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + return data; } - intersectObjects(objects, recursive = true, intersects2 = []) { - for (let i = 0, l = objects.length; i < l; i++) { - intersect(objects[i], this, intersects2, recursive); - } - intersects2.sort(ascSort); - return intersects2; + fromJSON(json) { + super.fromJSON(json); + this.v0.fromArray(json.v0); + this.v1.fromArray(json.v1); + this.v2.fromArray(json.v2); + return this; } } -function ascSort(a, b) { - return a.distance - b.distance; -} -__name(ascSort, "ascSort"); -function intersect(object, raycaster, intersects2, recursive) { - let propagate = true; - if (object.layers.test(raycaster.layers)) { - const result = object.raycast(raycaster, intersects2); - if (result === false) propagate = false; +class QuadraticBezierCurve3 extends Curve { + static { + __name(this, "QuadraticBezierCurve3"); } - if (propagate === true && recursive === true) { - const children = object.children; - for (let i = 0, l = children.length; i < l; i++) { - intersect(children[i], raycaster, intersects2, true); - } + constructor(v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3()) { + super(); + this.isQuadraticBezierCurve3 = true; + this.type = "QuadraticBezierCurve3"; + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; } -} -__name(intersect, "intersect"); -class Spherical { - static { - __name(this, "Spherical"); + getPoint(t2, optionalTarget = new Vector3()) { + const point = optionalTarget; + const v0 = this.v0, v1 = this.v1, v2 = this.v2; + point.set( + QuadraticBezier(t2, v0.x, v1.x, v2.x), + QuadraticBezier(t2, v0.y, v1.y, v2.y), + QuadraticBezier(t2, v0.z, v1.z, v2.z) + ); + return point; } - constructor(radius = 1, phi = 0, theta = 0) { - this.radius = radius; - this.phi = phi; - this.theta = theta; + copy(source) { + super.copy(source); + this.v0.copy(source.v0); + this.v1.copy(source.v1); + this.v2.copy(source.v2); return this; } - set(radius, phi, theta) { - this.radius = radius; - this.phi = phi; - this.theta = theta; - return this; + toJSON() { + const data = super.toJSON(); + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + return data; } - copy(other) { - this.radius = other.radius; - this.phi = other.phi; - this.theta = other.theta; + fromJSON(json) { + super.fromJSON(json); + this.v0.fromArray(json.v0); + this.v1.fromArray(json.v1); + this.v2.fromArray(json.v2); return this; } - // restrict phi to be between EPS and PI-EPS - makeSafe() { - const EPS = 1e-6; - this.phi = Math.max(EPS, Math.min(Math.PI - EPS, this.phi)); - return this; +} +class SplineCurve extends Curve { + static { + __name(this, "SplineCurve"); } - setFromVector3(v) { - return this.setFromCartesianCoords(v.x, v.y, v.z); + constructor(points = []) { + super(); + this.isSplineCurve = true; + this.type = "SplineCurve"; + this.points = points; } - setFromCartesianCoords(x, y, z) { - this.radius = Math.sqrt(x * x + y * y + z * z); - if (this.radius === 0) { - this.theta = 0; - this.phi = 0; - } else { - this.theta = Math.atan2(x, z); - this.phi = Math.acos(clamp(y / this.radius, -1, 1)); + getPoint(t2, optionalTarget = new Vector2()) { + const point = optionalTarget; + const points = this.points; + const p = (points.length - 1) * t2; + const intPoint = Math.floor(p); + const weight = p - intPoint; + const p0 = points[intPoint === 0 ? intPoint : intPoint - 1]; + const p1 = points[intPoint]; + const p2 = points[intPoint > points.length - 2 ? points.length - 1 : intPoint + 1]; + const p3 = points[intPoint > points.length - 3 ? points.length - 1 : intPoint + 2]; + point.set( + CatmullRom(weight, p0.x, p1.x, p2.x, p3.x), + CatmullRom(weight, p0.y, p1.y, p2.y, p3.y) + ); + return point; + } + copy(source) { + super.copy(source); + this.points = []; + for (let i = 0, l = source.points.length; i < l; i++) { + const point = source.points[i]; + this.points.push(point.clone()); } return this; } - clone() { - return new this.constructor().copy(this); + toJSON() { + const data = super.toJSON(); + data.points = []; + for (let i = 0, l = this.points.length; i < l; i++) { + const point = this.points[i]; + data.points.push(point.toArray()); + } + return data; + } + fromJSON(json) { + super.fromJSON(json); + this.points = []; + for (let i = 0, l = json.points.length; i < l; i++) { + const point = json.points[i]; + this.points.push(new Vector2().fromArray(point)); + } + return this; } } -class Cylindrical { +var Curves = /* @__PURE__ */ Object.freeze({ + __proto__: null, + ArcCurve, + CatmullRomCurve3, + CubicBezierCurve, + CubicBezierCurve3, + EllipseCurve, + LineCurve, + LineCurve3, + QuadraticBezierCurve, + QuadraticBezierCurve3, + SplineCurve +}); +class CurvePath extends Curve { static { - __name(this, "Cylindrical"); + __name(this, "CurvePath"); } - constructor(radius = 1, theta = 0, y = 0) { - this.radius = radius; - this.theta = theta; - this.y = y; - return this; + constructor() { + super(); + this.type = "CurvePath"; + this.curves = []; + this.autoClose = false; } - set(radius, theta, y) { - this.radius = radius; - this.theta = theta; - this.y = y; - return this; + add(curve) { + this.curves.push(curve); } - copy(other) { - this.radius = other.radius; - this.theta = other.theta; - this.y = other.y; + closePath() { + const startPoint = this.curves[0].getPoint(0); + const endPoint = this.curves[this.curves.length - 1].getPoint(1); + if (!startPoint.equals(endPoint)) { + const lineType = startPoint.isVector2 === true ? "LineCurve" : "LineCurve3"; + this.curves.push(new Curves[lineType](endPoint, startPoint)); + } return this; } - setFromVector3(v) { - return this.setFromCartesianCoords(v.x, v.y, v.z); + // To get accurate point with reference to + // entire path distance at time t, + // following has to be done: + // 1. Length of each sub path have to be known + // 2. Locate and identify type of curve + // 3. Get t for the curve + // 4. Return curve.getPointAt(t') + getPoint(t2, optionalTarget) { + const d = t2 * this.getLength(); + const curveLengths = this.getCurveLengths(); + let i = 0; + while (i < curveLengths.length) { + if (curveLengths[i] >= d) { + const diff = curveLengths[i] - d; + const curve = this.curves[i]; + const segmentLength = curve.getLength(); + const u = segmentLength === 0 ? 0 : 1 - diff / segmentLength; + return curve.getPointAt(u, optionalTarget); + } + i++; + } + return null; } - setFromCartesianCoords(x, y, z) { - this.radius = Math.sqrt(x * x + z * z); - this.theta = Math.atan2(x, z); - this.y = y; - return this; + // We cannot use the default THREE.Curve getPoint() with getLength() because in + // THREE.Curve, getLength() depends on getPoint() but in THREE.CurvePath + // getPoint() depends on getLength + getLength() { + const lens = this.getCurveLengths(); + return lens[lens.length - 1]; } - clone() { - return new this.constructor().copy(this); + // cacheLengths must be recalculated. + updateArcLengths() { + this.needsUpdate = true; + this.cacheLengths = null; + this.getCurveLengths(); + } + // Compute lengths and cache them + // We cannot overwrite getLengths() because UtoT mapping uses it. + getCurveLengths() { + if (this.cacheLengths && this.cacheLengths.length === this.curves.length) { + return this.cacheLengths; + } + const lengths = []; + let sums = 0; + for (let i = 0, l = this.curves.length; i < l; i++) { + sums += this.curves[i].getLength(); + lengths.push(sums); + } + this.cacheLengths = lengths; + return lengths; } -} -class Matrix2 { - static { - __name(this, "Matrix2"); + getSpacedPoints(divisions = 40) { + const points = []; + for (let i = 0; i <= divisions; i++) { + points.push(this.getPoint(i / divisions)); + } + if (this.autoClose) { + points.push(points[0]); + } + return points; } - constructor(n11, n12, n21, n22) { - Matrix2.prototype.isMatrix2 = true; - this.elements = [ - 1, - 0, - 0, - 1 - ]; - if (n11 !== void 0) { - this.set(n11, n12, n21, n22); + getPoints(divisions = 12) { + const points = []; + let last; + for (let i = 0, curves = this.curves; i < curves.length; i++) { + const curve = curves[i]; + const resolution = curve.isEllipseCurve ? divisions * 2 : curve.isLineCurve || curve.isLineCurve3 ? 1 : curve.isSplineCurve ? divisions * curve.points.length : divisions; + const pts = curve.getPoints(resolution); + for (let j = 0; j < pts.length; j++) { + const point = pts[j]; + if (last && last.equals(point)) continue; + points.push(point); + last = point; + } + } + if (this.autoClose && points.length > 1 && !points[points.length - 1].equals(points[0])) { + points.push(points[0]); } + return points; } - identity() { - this.set( - 1, - 0, - 0, - 1 - ); + copy(source) { + super.copy(source); + this.curves = []; + for (let i = 0, l = source.curves.length; i < l; i++) { + const curve = source.curves[i]; + this.curves.push(curve.clone()); + } + this.autoClose = source.autoClose; return this; } - fromArray(array, offset = 0) { - for (let i = 0; i < 4; i++) { - this.elements[i] = array[i + offset]; + toJSON() { + const data = super.toJSON(); + data.autoClose = this.autoClose; + data.curves = []; + for (let i = 0, l = this.curves.length; i < l; i++) { + const curve = this.curves[i]; + data.curves.push(curve.toJSON()); } - return this; + return data; } - set(n11, n12, n21, n22) { - const te2 = this.elements; - te2[0] = n11; - te2[2] = n12; - te2[1] = n21; - te2[3] = n22; + fromJSON(json) { + super.fromJSON(json); + this.autoClose = json.autoClose; + this.curves = []; + for (let i = 0, l = json.curves.length; i < l; i++) { + const curve = json.curves[i]; + this.curves.push(new Curves[curve.type]().fromJSON(curve)); + } return this; } } -const _vector$4 = /* @__PURE__ */ new Vector2(); -class Box2 { +class Path extends CurvePath { static { - __name(this, "Box2"); - } - constructor(min = new Vector2(Infinity, Infinity), max2 = new Vector2(-Infinity, -Infinity)) { - this.isBox2 = true; - this.min = min; - this.max = max2; + __name(this, "Path"); } - set(min, max2) { - this.min.copy(min); - this.max.copy(max2); - return this; + constructor(points) { + super(); + this.type = "Path"; + this.currentPoint = new Vector2(); + if (points) { + this.setFromPoints(points); + } } setFromPoints(points) { - this.makeEmpty(); - for (let i = 0, il = points.length; i < il; i++) { - this.expandByPoint(points[i]); + this.moveTo(points[0].x, points[0].y); + for (let i = 1, l = points.length; i < l; i++) { + this.lineTo(points[i].x, points[i].y); } return this; } - setFromCenterAndSize(center, size) { - const halfSize = _vector$4.copy(size).multiplyScalar(0.5); - this.min.copy(center).sub(halfSize); - this.max.copy(center).add(halfSize); - return this; - } - clone() { - return new this.constructor().copy(this); - } - copy(box) { - this.min.copy(box.min); - this.max.copy(box.max); + moveTo(x, y) { + this.currentPoint.set(x, y); return this; } - makeEmpty() { - this.min.x = this.min.y = Infinity; - this.max.x = this.max.y = -Infinity; + lineTo(x, y) { + const curve = new LineCurve(this.currentPoint.clone(), new Vector2(x, y)); + this.curves.push(curve); + this.currentPoint.set(x, y); return this; } - isEmpty() { - return this.max.x < this.min.x || this.max.y < this.min.y; - } - getCenter(target) { - return this.isEmpty() ? target.set(0, 0) : target.addVectors(this.min, this.max).multiplyScalar(0.5); - } - getSize(target) { - return this.isEmpty() ? target.set(0, 0) : target.subVectors(this.max, this.min); - } - expandByPoint(point) { - this.min.min(point); - this.max.max(point); + quadraticCurveTo(aCPx, aCPy, aX, aY) { + const curve = new QuadraticBezierCurve( + this.currentPoint.clone(), + new Vector2(aCPx, aCPy), + new Vector2(aX, aY) + ); + this.curves.push(curve); + this.currentPoint.set(aX, aY); return this; } - expandByVector(vector) { - this.min.sub(vector); - this.max.add(vector); + bezierCurveTo(aCP1x, aCP1y, aCP2x, aCP2y, aX, aY) { + const curve = new CubicBezierCurve( + this.currentPoint.clone(), + new Vector2(aCP1x, aCP1y), + new Vector2(aCP2x, aCP2y), + new Vector2(aX, aY) + ); + this.curves.push(curve); + this.currentPoint.set(aX, aY); return this; } - expandByScalar(scalar) { - this.min.addScalar(-scalar); - this.max.addScalar(scalar); + splineThru(pts) { + const npts = [this.currentPoint.clone()].concat(pts); + const curve = new SplineCurve(npts); + this.curves.push(curve); + this.currentPoint.copy(pts[pts.length - 1]); return this; } - containsPoint(point) { - return point.x >= this.min.x && point.x <= this.max.x && point.y >= this.min.y && point.y <= this.max.y; - } - containsBox(box) { - return this.min.x <= box.min.x && box.max.x <= this.max.x && this.min.y <= box.min.y && box.max.y <= this.max.y; - } - getParameter(point, target) { - return target.set( - (point.x - this.min.x) / (this.max.x - this.min.x), - (point.y - this.min.y) / (this.max.y - this.min.y) + arc(aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise) { + const x0 = this.currentPoint.x; + const y0 = this.currentPoint.y; + this.absarc( + aX + x0, + aY + y0, + aRadius, + aStartAngle, + aEndAngle, + aClockwise ); - } - intersectsBox(box) { - return box.max.x >= this.min.x && box.min.x <= this.max.x && box.max.y >= this.min.y && box.min.y <= this.max.y; - } - clampPoint(point, target) { - return target.copy(point).clamp(this.min, this.max); - } - distanceToPoint(point) { - return this.clampPoint(point, _vector$4).distanceTo(point); - } - intersect(box) { - this.min.max(box.min); - this.max.min(box.max); - if (this.isEmpty()) this.makeEmpty(); return this; } - union(box) { - this.min.min(box.min); - this.max.max(box.max); + absarc(aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise) { + this.absellipse(aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise); return this; } - translate(offset) { - this.min.add(offset); - this.max.add(offset); + ellipse(aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation) { + const x0 = this.currentPoint.x; + const y0 = this.currentPoint.y; + this.absellipse(aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation); return this; } - equals(box) { - return box.min.equals(this.min) && box.max.equals(this.max); - } -} -const _startP = /* @__PURE__ */ new Vector3(); -const _startEnd = /* @__PURE__ */ new Vector3(); -class Line3 { - static { - __name(this, "Line3"); - } - constructor(start = new Vector3(), end = new Vector3()) { - this.start = start; - this.end = end; - } - set(start, end) { - this.start.copy(start); - this.end.copy(end); + absellipse(aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation) { + const curve = new EllipseCurve(aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation); + if (this.curves.length > 0) { + const firstPoint = curve.getPoint(0); + if (!firstPoint.equals(this.currentPoint)) { + this.lineTo(firstPoint.x, firstPoint.y); + } + } + this.curves.push(curve); + const lastPoint = curve.getPoint(1); + this.currentPoint.copy(lastPoint); return this; } - copy(line) { - this.start.copy(line.start); - this.end.copy(line.end); + copy(source) { + super.copy(source); + this.currentPoint.copy(source.currentPoint); return this; } - getCenter(target) { - return target.addVectors(this.start, this.end).multiplyScalar(0.5); - } - delta(target) { - return target.subVectors(this.end, this.start); - } - distanceSq() { - return this.start.distanceToSquared(this.end); + toJSON() { + const data = super.toJSON(); + data.currentPoint = this.currentPoint.toArray(); + return data; } - distance() { - return this.start.distanceTo(this.end); + fromJSON(json) { + super.fromJSON(json); + this.currentPoint.fromArray(json.currentPoint); + return this; } - at(t2, target) { - return this.delta(target).multiplyScalar(t2).add(this.start); +} +class LatheGeometry extends BufferGeometry { + static { + __name(this, "LatheGeometry"); } - closestPointToPointParameter(point, clampToLine) { - _startP.subVectors(point, this.start); - _startEnd.subVectors(this.end, this.start); - const startEnd2 = _startEnd.dot(_startEnd); - const startEnd_startP = _startEnd.dot(_startP); - let t2 = startEnd_startP / startEnd2; - if (clampToLine) { - t2 = clamp(t2, 0, 1); + constructor(points = [new Vector2(0, -0.5), new Vector2(0.5, 0), new Vector2(0, 0.5)], segments = 12, phiStart = 0, phiLength = Math.PI * 2) { + super(); + this.type = "LatheGeometry"; + this.parameters = { + points, + segments, + phiStart, + phiLength + }; + segments = Math.floor(segments); + phiLength = clamp(phiLength, 0, Math.PI * 2); + const indices = []; + const vertices = []; + const uvs = []; + const initNormals = []; + const normals = []; + const inverseSegments = 1 / segments; + const vertex2 = new Vector3(); + const uv = new Vector2(); + const normal = new Vector3(); + const curNormal = new Vector3(); + const prevNormal = new Vector3(); + let dx = 0; + let dy = 0; + for (let j = 0; j <= points.length - 1; j++) { + switch (j) { + case 0: + dx = points[j + 1].x - points[j].x; + dy = points[j + 1].y - points[j].y; + normal.x = dy * 1; + normal.y = -dx; + normal.z = dy * 0; + prevNormal.copy(normal); + normal.normalize(); + initNormals.push(normal.x, normal.y, normal.z); + break; + case points.length - 1: + initNormals.push(prevNormal.x, prevNormal.y, prevNormal.z); + break; + default: + dx = points[j + 1].x - points[j].x; + dy = points[j + 1].y - points[j].y; + normal.x = dy * 1; + normal.y = -dx; + normal.z = dy * 0; + curNormal.copy(normal); + normal.x += prevNormal.x; + normal.y += prevNormal.y; + normal.z += prevNormal.z; + normal.normalize(); + initNormals.push(normal.x, normal.y, normal.z); + prevNormal.copy(curNormal); + } } - return t2; - } - closestPointToPoint(point, clampToLine, target) { - const t2 = this.closestPointToPointParameter(point, clampToLine); - return this.delta(target).multiplyScalar(t2).add(this.start); + for (let i = 0; i <= segments; i++) { + const phi = phiStart + i * inverseSegments * phiLength; + const sin = Math.sin(phi); + const cos = Math.cos(phi); + for (let j = 0; j <= points.length - 1; j++) { + vertex2.x = points[j].x * sin; + vertex2.y = points[j].y; + vertex2.z = points[j].x * cos; + vertices.push(vertex2.x, vertex2.y, vertex2.z); + uv.x = i / segments; + uv.y = j / (points.length - 1); + uvs.push(uv.x, uv.y); + const x = initNormals[3 * j + 0] * sin; + const y = initNormals[3 * j + 1]; + const z = initNormals[3 * j + 0] * cos; + normals.push(x, y, z); + } + } + for (let i = 0; i < segments; i++) { + for (let j = 0; j < points.length - 1; j++) { + const base = j + i * points.length; + const a = base; + const b = base + points.length; + const c = base + points.length + 1; + const d = base + 1; + indices.push(a, b, d); + indices.push(c, d, b); + } + } + this.setIndex(indices); + this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + this.setAttribute("uv", new Float32BufferAttribute(uvs, 2)); + this.setAttribute("normal", new Float32BufferAttribute(normals, 3)); } - applyMatrix4(matrix) { - this.start.applyMatrix4(matrix); - this.end.applyMatrix4(matrix); + copy(source) { + super.copy(source); + this.parameters = Object.assign({}, source.parameters); return this; } - equals(line) { - return line.start.equals(this.start) && line.end.equals(this.end); - } - clone() { - return new this.constructor().copy(this); + static fromJSON(data) { + return new LatheGeometry(data.points, data.segments, data.phiStart, data.phiLength); } } -const _vector$3 = /* @__PURE__ */ new Vector3(); -class SpotLightHelper extends Object3D { +class CapsuleGeometry extends LatheGeometry { static { - __name(this, "SpotLightHelper"); + __name(this, "CapsuleGeometry"); } - constructor(light, color) { - super(); - this.light = light; - this.matrixAutoUpdate = false; - this.color = color; - this.type = "SpotLightHelper"; - const geometry = new BufferGeometry(); - const positions = [ - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 1, - 0, - 1, - 0, - 0, - 0, - -1, - 0, - 1, - 0, - 0, - 0, - 0, - 1, - 1, - 0, - 0, - 0, - 0, - -1, - 1 - ]; - for (let i = 0, j = 1, l = 32; i < l; i++, j++) { - const p1 = i / l * Math.PI * 2; - const p2 = j / l * Math.PI * 2; - positions.push( - Math.cos(p1), - Math.sin(p1), - 1, - Math.cos(p2), - Math.sin(p2), - 1 - ); - } - geometry.setAttribute("position", new Float32BufferAttribute(positions, 3)); - const material = new LineBasicMaterial({ fog: false, toneMapped: false }); - this.cone = new LineSegments(geometry, material); - this.add(this.cone); - this.update(); + constructor(radius = 1, length = 1, capSegments = 4, radialSegments = 8) { + const path = new Path(); + path.absarc(0, -length / 2, radius, Math.PI * 1.5, 0); + path.absarc(0, length / 2, radius, 0, Math.PI * 0.5); + super(path.getPoints(capSegments), radialSegments); + this.type = "CapsuleGeometry"; + this.parameters = { + radius, + length, + capSegments, + radialSegments + }; } - dispose() { - this.cone.geometry.dispose(); - this.cone.material.dispose(); + static fromJSON(data) { + return new CapsuleGeometry(data.radius, data.length, data.capSegments, data.radialSegments); } - update() { - this.light.updateWorldMatrix(true, false); - this.light.target.updateWorldMatrix(true, false); - if (this.parent) { - this.parent.updateWorldMatrix(true); - this.matrix.copy(this.parent.matrixWorld).invert().multiply(this.light.matrixWorld); - } else { - this.matrix.copy(this.light.matrixWorld); +} +class CircleGeometry extends BufferGeometry { + static { + __name(this, "CircleGeometry"); + } + constructor(radius = 1, segments = 32, thetaStart = 0, thetaLength = Math.PI * 2) { + super(); + this.type = "CircleGeometry"; + this.parameters = { + radius, + segments, + thetaStart, + thetaLength + }; + segments = Math.max(3, segments); + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + const vertex2 = new Vector3(); + const uv = new Vector2(); + vertices.push(0, 0, 0); + normals.push(0, 0, 1); + uvs.push(0.5, 0.5); + for (let s = 0, i = 3; s <= segments; s++, i += 3) { + const segment = thetaStart + s / segments * thetaLength; + vertex2.x = radius * Math.cos(segment); + vertex2.y = radius * Math.sin(segment); + vertices.push(vertex2.x, vertex2.y, vertex2.z); + normals.push(0, 0, 1); + uv.x = (vertices[i] / radius + 1) / 2; + uv.y = (vertices[i + 1] / radius + 1) / 2; + uvs.push(uv.x, uv.y); } - this.matrixWorld.copy(this.light.matrixWorld); - const coneLength = this.light.distance ? this.light.distance : 1e3; - const coneWidth = coneLength * Math.tan(this.light.angle); - this.cone.scale.set(coneWidth, coneWidth, coneLength); - _vector$3.setFromMatrixPosition(this.light.target.matrixWorld); - this.cone.lookAt(_vector$3); - if (this.color !== void 0) { - this.cone.material.color.set(this.color); - } else { - this.cone.material.color.copy(this.light.color); + for (let i = 1; i <= segments; i++) { + indices.push(i, i + 1, 0); } + this.setIndex(indices); + this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + this.setAttribute("normal", new Float32BufferAttribute(normals, 3)); + this.setAttribute("uv", new Float32BufferAttribute(uvs, 2)); + } + copy(source) { + super.copy(source); + this.parameters = Object.assign({}, source.parameters); + return this; + } + static fromJSON(data) { + return new CircleGeometry(data.radius, data.segments, data.thetaStart, data.thetaLength); } } -const _vector$2 = /* @__PURE__ */ new Vector3(); -const _boneMatrix = /* @__PURE__ */ new Matrix4(); -const _matrixWorldInv = /* @__PURE__ */ new Matrix4(); -class SkeletonHelper extends LineSegments { +class CylinderGeometry extends BufferGeometry { static { - __name(this, "SkeletonHelper"); + __name(this, "CylinderGeometry"); } - constructor(object) { - const bones = getBoneList(object); - const geometry = new BufferGeometry(); + constructor(radiusTop = 1, radiusBottom = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2) { + super(); + this.type = "CylinderGeometry"; + this.parameters = { + radiusTop, + radiusBottom, + height, + radialSegments, + heightSegments, + openEnded, + thetaStart, + thetaLength + }; + const scope = this; + radialSegments = Math.floor(radialSegments); + heightSegments = Math.floor(heightSegments); + const indices = []; const vertices = []; - const colors = []; - const color1 = new Color(0, 0, 1); - const color2 = new Color(0, 1, 0); - for (let i = 0; i < bones.length; i++) { - const bone = bones[i]; - if (bone.parent && bone.parent.isBone) { - vertices.push(0, 0, 0); - vertices.push(0, 0, 0); - colors.push(color1.r, color1.g, color1.b); - colors.push(color2.r, color2.g, color2.b); + const normals = []; + const uvs = []; + let index = 0; + const indexArray = []; + const halfHeight = height / 2; + let groupStart = 0; + generateTorso(); + if (openEnded === false) { + if (radiusTop > 0) generateCap(true); + if (radiusBottom > 0) generateCap(false); + } + this.setIndex(indices); + this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + this.setAttribute("normal", new Float32BufferAttribute(normals, 3)); + this.setAttribute("uv", new Float32BufferAttribute(uvs, 2)); + function generateTorso() { + const normal = new Vector3(); + const vertex2 = new Vector3(); + let groupCount = 0; + const slope = (radiusBottom - radiusTop) / height; + for (let y = 0; y <= heightSegments; y++) { + const indexRow = []; + const v = y / heightSegments; + const radius = v * (radiusBottom - radiusTop) + radiusTop; + for (let x = 0; x <= radialSegments; x++) { + const u = x / radialSegments; + const theta = u * thetaLength + thetaStart; + const sinTheta = Math.sin(theta); + const cosTheta = Math.cos(theta); + vertex2.x = radius * sinTheta; + vertex2.y = -v * height + halfHeight; + vertex2.z = radius * cosTheta; + vertices.push(vertex2.x, vertex2.y, vertex2.z); + normal.set(sinTheta, slope, cosTheta).normalize(); + normals.push(normal.x, normal.y, normal.z); + uvs.push(u, 1 - v); + indexRow.push(index++); + } + indexArray.push(indexRow); + } + for (let x = 0; x < radialSegments; x++) { + for (let y = 0; y < heightSegments; y++) { + const a = indexArray[y][x]; + const b = indexArray[y + 1][x]; + const c = indexArray[y + 1][x + 1]; + const d = indexArray[y][x + 1]; + if (radiusTop > 0 || y !== 0) { + indices.push(a, b, d); + groupCount += 3; + } + if (radiusBottom > 0 || y !== heightSegments - 1) { + indices.push(b, c, d); + groupCount += 3; + } + } } + scope.addGroup(groupStart, groupCount, 0); + groupStart += groupCount; } - geometry.setAttribute("position", new Float32BufferAttribute(vertices, 3)); - geometry.setAttribute("color", new Float32BufferAttribute(colors, 3)); - const material = new LineBasicMaterial({ vertexColors: true, depthTest: false, depthWrite: false, toneMapped: false, transparent: true }); - super(geometry, material); - this.isSkeletonHelper = true; - this.type = "SkeletonHelper"; - this.root = object; - this.bones = bones; - this.matrix = object.matrixWorld; - this.matrixAutoUpdate = false; - } - updateMatrixWorld(force) { - const bones = this.bones; - const geometry = this.geometry; - const position = geometry.getAttribute("position"); - _matrixWorldInv.copy(this.root.matrixWorld).invert(); - for (let i = 0, j = 0; i < bones.length; i++) { - const bone = bones[i]; - if (bone.parent && bone.parent.isBone) { - _boneMatrix.multiplyMatrices(_matrixWorldInv, bone.matrixWorld); - _vector$2.setFromMatrixPosition(_boneMatrix); - position.setXYZ(j, _vector$2.x, _vector$2.y, _vector$2.z); - _boneMatrix.multiplyMatrices(_matrixWorldInv, bone.parent.matrixWorld); - _vector$2.setFromMatrixPosition(_boneMatrix); - position.setXYZ(j + 1, _vector$2.x, _vector$2.y, _vector$2.z); - j += 2; + __name(generateTorso, "generateTorso"); + function generateCap(top) { + const centerIndexStart = index; + const uv = new Vector2(); + const vertex2 = new Vector3(); + let groupCount = 0; + const radius = top === true ? radiusTop : radiusBottom; + const sign2 = top === true ? 1 : -1; + for (let x = 1; x <= radialSegments; x++) { + vertices.push(0, halfHeight * sign2, 0); + normals.push(0, sign2, 0); + uvs.push(0.5, 0.5); + index++; } + const centerIndexEnd = index; + for (let x = 0; x <= radialSegments; x++) { + const u = x / radialSegments; + const theta = u * thetaLength + thetaStart; + const cosTheta = Math.cos(theta); + const sinTheta = Math.sin(theta); + vertex2.x = radius * sinTheta; + vertex2.y = halfHeight * sign2; + vertex2.z = radius * cosTheta; + vertices.push(vertex2.x, vertex2.y, vertex2.z); + normals.push(0, sign2, 0); + uv.x = cosTheta * 0.5 + 0.5; + uv.y = sinTheta * 0.5 * sign2 + 0.5; + uvs.push(uv.x, uv.y); + index++; + } + for (let x = 0; x < radialSegments; x++) { + const c = centerIndexStart + x; + const i = centerIndexEnd + x; + if (top === true) { + indices.push(i, i + 1, c); + } else { + indices.push(i + 1, i, c); + } + groupCount += 3; + } + scope.addGroup(groupStart, groupCount, top === true ? 1 : 2); + groupStart += groupCount; } - geometry.getAttribute("position").needsUpdate = true; - super.updateMatrixWorld(force); - } - dispose() { - this.geometry.dispose(); - this.material.dispose(); + __name(generateCap, "generateCap"); } -} -function getBoneList(object) { - const boneList = []; - if (object.isBone === true) { - boneList.push(object); + copy(source) { + super.copy(source); + this.parameters = Object.assign({}, source.parameters); + return this; } - for (let i = 0; i < object.children.length; i++) { - boneList.push.apply(boneList, getBoneList(object.children[i])); + static fromJSON(data) { + return new CylinderGeometry(data.radiusTop, data.radiusBottom, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength); } - return boneList; } -__name(getBoneList, "getBoneList"); -class PointLightHelper extends Mesh { +class ConeGeometry extends CylinderGeometry { static { - __name(this, "PointLightHelper"); - } - constructor(light, sphereSize, color) { - const geometry = new SphereGeometry(sphereSize, 4, 2); - const material = new MeshBasicMaterial({ wireframe: true, fog: false, toneMapped: false }); - super(geometry, material); - this.light = light; - this.color = color; - this.type = "PointLightHelper"; - this.matrix = this.light.matrixWorld; - this.matrixAutoUpdate = false; - this.update(); + __name(this, "ConeGeometry"); } - dispose() { - this.geometry.dispose(); - this.material.dispose(); + constructor(radius = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2) { + super(0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength); + this.type = "ConeGeometry"; + this.parameters = { + radius, + height, + radialSegments, + heightSegments, + openEnded, + thetaStart, + thetaLength + }; } - update() { - this.light.updateWorldMatrix(true, false); - if (this.color !== void 0) { - this.material.color.set(this.color); - } else { - this.material.color.copy(this.light.color); - } + static fromJSON(data) { + return new ConeGeometry(data.radius, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength); } } -const _vector$1 = /* @__PURE__ */ new Vector3(); -const _color1 = /* @__PURE__ */ new Color(); -const _color2 = /* @__PURE__ */ new Color(); -class HemisphereLightHelper extends Object3D { +class PolyhedronGeometry extends BufferGeometry { static { - __name(this, "HemisphereLightHelper"); + __name(this, "PolyhedronGeometry"); } - constructor(light, size, color) { + constructor(vertices = [], indices = [], radius = 1, detail = 0) { super(); - this.light = light; - this.matrix = light.matrixWorld; - this.matrixAutoUpdate = false; - this.color = color; - this.type = "HemisphereLightHelper"; - const geometry = new OctahedronGeometry(size); - geometry.rotateY(Math.PI * 0.5); - this.material = new MeshBasicMaterial({ wireframe: true, fog: false, toneMapped: false }); - if (this.color === void 0) this.material.vertexColors = true; - const position = geometry.getAttribute("position"); - const colors = new Float32Array(position.count * 3); - geometry.setAttribute("color", new BufferAttribute(colors, 3)); - this.add(new Mesh(geometry, this.material)); - this.update(); - } - dispose() { - this.children[0].geometry.dispose(); - this.children[0].material.dispose(); - } - update() { - const mesh = this.children[0]; - if (this.color !== void 0) { - this.material.color.set(this.color); + this.type = "PolyhedronGeometry"; + this.parameters = { + vertices, + indices, + radius, + detail + }; + const vertexBuffer = []; + const uvBuffer = []; + subdivide(detail); + applyRadius(radius); + generateUVs(); + this.setAttribute("position", new Float32BufferAttribute(vertexBuffer, 3)); + this.setAttribute("normal", new Float32BufferAttribute(vertexBuffer.slice(), 3)); + this.setAttribute("uv", new Float32BufferAttribute(uvBuffer, 2)); + if (detail === 0) { + this.computeVertexNormals(); } else { - const colors = mesh.geometry.getAttribute("color"); - _color1.copy(this.light.color); - _color2.copy(this.light.groundColor); - for (let i = 0, l = colors.count; i < l; i++) { - const color = i < l / 2 ? _color1 : _color2; - colors.setXYZ(i, color.r, color.g, color.b); + this.normalizeNormals(); + } + function subdivide(detail2) { + const a = new Vector3(); + const b = new Vector3(); + const c = new Vector3(); + for (let i = 0; i < indices.length; i += 3) { + getVertexByIndex(indices[i + 0], a); + getVertexByIndex(indices[i + 1], b); + getVertexByIndex(indices[i + 2], c); + subdivideFace(a, b, c, detail2); } - colors.needsUpdate = true; } - this.light.updateWorldMatrix(true, false); - mesh.lookAt(_vector$1.setFromMatrixPosition(this.light.matrixWorld).negate()); - } -} -class GridHelper extends LineSegments { - static { - __name(this, "GridHelper"); - } - constructor(size = 10, divisions = 10, color1 = 4473924, color2 = 8947848) { - color1 = new Color(color1); - color2 = new Color(color2); - const center = divisions / 2; - const step = size / divisions; - const halfSize = size / 2; - const vertices = [], colors = []; - for (let i = 0, j = 0, k = -halfSize; i <= divisions; i++, k += step) { - vertices.push(-halfSize, 0, k, halfSize, 0, k); - vertices.push(k, 0, -halfSize, k, 0, halfSize); - const color = i === center ? color1 : color2; - color.toArray(colors, j); - j += 3; - color.toArray(colors, j); - j += 3; - color.toArray(colors, j); - j += 3; - color.toArray(colors, j); - j += 3; + __name(subdivide, "subdivide"); + function subdivideFace(a, b, c, detail2) { + const cols = detail2 + 1; + const v = []; + for (let i = 0; i <= cols; i++) { + v[i] = []; + const aj = a.clone().lerp(c, i / cols); + const bj = b.clone().lerp(c, i / cols); + const rows = cols - i; + for (let j = 0; j <= rows; j++) { + if (j === 0 && i === cols) { + v[i][j] = aj; + } else { + v[i][j] = aj.clone().lerp(bj, j / rows); + } + } + } + for (let i = 0; i < cols; i++) { + for (let j = 0; j < 2 * (cols - i) - 1; j++) { + const k = Math.floor(j / 2); + if (j % 2 === 0) { + pushVertex(v[i][k + 1]); + pushVertex(v[i + 1][k]); + pushVertex(v[i][k]); + } else { + pushVertex(v[i][k + 1]); + pushVertex(v[i + 1][k + 1]); + pushVertex(v[i + 1][k]); + } + } + } } - const geometry = new BufferGeometry(); - geometry.setAttribute("position", new Float32BufferAttribute(vertices, 3)); - geometry.setAttribute("color", new Float32BufferAttribute(colors, 3)); - const material = new LineBasicMaterial({ vertexColors: true, toneMapped: false }); - super(geometry, material); - this.type = "GridHelper"; - } - dispose() { - this.geometry.dispose(); - this.material.dispose(); - } -} -class PolarGridHelper extends LineSegments { - static { - __name(this, "PolarGridHelper"); - } - constructor(radius = 10, sectors = 16, rings = 8, divisions = 64, color1 = 4473924, color2 = 8947848) { - color1 = new Color(color1); - color2 = new Color(color2); - const vertices = []; - const colors = []; - if (sectors > 1) { - for (let i = 0; i < sectors; i++) { - const v = i / sectors * (Math.PI * 2); - const x = Math.sin(v) * radius; - const z = Math.cos(v) * radius; - vertices.push(0, 0, 0); - vertices.push(x, 0, z); - const color = i & 1 ? color1 : color2; - colors.push(color.r, color.g, color.b); - colors.push(color.r, color.g, color.b); + __name(subdivideFace, "subdivideFace"); + function applyRadius(radius2) { + const vertex2 = new Vector3(); + for (let i = 0; i < vertexBuffer.length; i += 3) { + vertex2.x = vertexBuffer[i + 0]; + vertex2.y = vertexBuffer[i + 1]; + vertex2.z = vertexBuffer[i + 2]; + vertex2.normalize().multiplyScalar(radius2); + vertexBuffer[i + 0] = vertex2.x; + vertexBuffer[i + 1] = vertex2.y; + vertexBuffer[i + 2] = vertex2.z; } } - for (let i = 0; i < rings; i++) { - const color = i & 1 ? color1 : color2; - const r = radius - radius / rings * i; - for (let j = 0; j < divisions; j++) { - let v = j / divisions * (Math.PI * 2); - let x = Math.sin(v) * r; - let z = Math.cos(v) * r; - vertices.push(x, 0, z); - colors.push(color.r, color.g, color.b); - v = (j + 1) / divisions * (Math.PI * 2); - x = Math.sin(v) * r; - z = Math.cos(v) * r; - vertices.push(x, 0, z); - colors.push(color.r, color.g, color.b); + __name(applyRadius, "applyRadius"); + function generateUVs() { + const vertex2 = new Vector3(); + for (let i = 0; i < vertexBuffer.length; i += 3) { + vertex2.x = vertexBuffer[i + 0]; + vertex2.y = vertexBuffer[i + 1]; + vertex2.z = vertexBuffer[i + 2]; + const u = azimuth(vertex2) / 2 / Math.PI + 0.5; + const v = inclination(vertex2) / Math.PI + 0.5; + uvBuffer.push(u, 1 - v); } + correctUVs(); + correctSeam(); } - const geometry = new BufferGeometry(); - geometry.setAttribute("position", new Float32BufferAttribute(vertices, 3)); - geometry.setAttribute("color", new Float32BufferAttribute(colors, 3)); - const material = new LineBasicMaterial({ vertexColors: true, toneMapped: false }); - super(geometry, material); - this.type = "PolarGridHelper"; + __name(generateUVs, "generateUVs"); + function correctSeam() { + for (let i = 0; i < uvBuffer.length; i += 6) { + const x0 = uvBuffer[i + 0]; + const x1 = uvBuffer[i + 2]; + const x2 = uvBuffer[i + 4]; + const max2 = Math.max(x0, x1, x2); + const min = Math.min(x0, x1, x2); + if (max2 > 0.9 && min < 0.1) { + if (x0 < 0.2) uvBuffer[i + 0] += 1; + if (x1 < 0.2) uvBuffer[i + 2] += 1; + if (x2 < 0.2) uvBuffer[i + 4] += 1; + } + } + } + __name(correctSeam, "correctSeam"); + function pushVertex(vertex2) { + vertexBuffer.push(vertex2.x, vertex2.y, vertex2.z); + } + __name(pushVertex, "pushVertex"); + function getVertexByIndex(index, vertex2) { + const stride = index * 3; + vertex2.x = vertices[stride + 0]; + vertex2.y = vertices[stride + 1]; + vertex2.z = vertices[stride + 2]; + } + __name(getVertexByIndex, "getVertexByIndex"); + function correctUVs() { + const a = new Vector3(); + const b = new Vector3(); + const c = new Vector3(); + const centroid = new Vector3(); + const uvA = new Vector2(); + const uvB = new Vector2(); + const uvC = new Vector2(); + for (let i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6) { + a.set(vertexBuffer[i + 0], vertexBuffer[i + 1], vertexBuffer[i + 2]); + b.set(vertexBuffer[i + 3], vertexBuffer[i + 4], vertexBuffer[i + 5]); + c.set(vertexBuffer[i + 6], vertexBuffer[i + 7], vertexBuffer[i + 8]); + uvA.set(uvBuffer[j + 0], uvBuffer[j + 1]); + uvB.set(uvBuffer[j + 2], uvBuffer[j + 3]); + uvC.set(uvBuffer[j + 4], uvBuffer[j + 5]); + centroid.copy(a).add(b).add(c).divideScalar(3); + const azi = azimuth(centroid); + correctUV(uvA, j + 0, a, azi); + correctUV(uvB, j + 2, b, azi); + correctUV(uvC, j + 4, c, azi); + } + } + __name(correctUVs, "correctUVs"); + function correctUV(uv, stride, vector, azimuth2) { + if (azimuth2 < 0 && uv.x === 1) { + uvBuffer[stride] = uv.x - 1; + } + if (vector.x === 0 && vector.z === 0) { + uvBuffer[stride] = azimuth2 / 2 / Math.PI + 0.5; + } + } + __name(correctUV, "correctUV"); + function azimuth(vector) { + return Math.atan2(vector.z, -vector.x); + } + __name(azimuth, "azimuth"); + function inclination(vector) { + return Math.atan2(-vector.y, Math.sqrt(vector.x * vector.x + vector.z * vector.z)); + } + __name(inclination, "inclination"); } - dispose() { - this.geometry.dispose(); - this.material.dispose(); + copy(source) { + super.copy(source); + this.parameters = Object.assign({}, source.parameters); + return this; + } + static fromJSON(data) { + return new PolyhedronGeometry(data.vertices, data.indices, data.radius, data.details); } } -const _v1 = /* @__PURE__ */ new Vector3(); -const _v2 = /* @__PURE__ */ new Vector3(); -const _v3 = /* @__PURE__ */ new Vector3(); -class DirectionalLightHelper extends Object3D { +class DodecahedronGeometry extends PolyhedronGeometry { static { - __name(this, "DirectionalLightHelper"); + __name(this, "DodecahedronGeometry"); } - constructor(light, size, color) { - super(); - this.light = light; - this.matrix = light.matrixWorld; - this.matrixAutoUpdate = false; - this.color = color; - this.type = "DirectionalLightHelper"; - if (size === void 0) size = 1; - let geometry = new BufferGeometry(); - geometry.setAttribute("position", new Float32BufferAttribute([ - -size, - size, + constructor(radius = 1, detail = 0) { + const t2 = (1 + Math.sqrt(5)) / 2; + const r = 1 / t2; + const vertices = [ + // (±1, ±1, ±1) + -1, + -1, + -1, + -1, + -1, + 1, + -1, + 1, + -1, + -1, + 1, + 1, + 1, + -1, + -1, + 1, + -1, + 1, + 1, + 1, + -1, + 1, + 1, + 1, + // (0, ±1/φ, ±φ) 0, - size, - size, + -r, + -t2, 0, - size, - -size, + -r, + t2, 0, - -size, - -size, + r, + -t2, 0, - -size, - size, - 0 - ], 3)); - const material = new LineBasicMaterial({ fog: false, toneMapped: false }); - this.lightPlane = new Line(geometry, material); - this.add(this.lightPlane); - geometry = new BufferGeometry(); - geometry.setAttribute("position", new Float32BufferAttribute([0, 0, 0, 0, 0, 1], 3)); - this.targetLine = new Line(geometry, material); - this.add(this.targetLine); - this.update(); + r, + t2, + // (±1/φ, ±φ, 0) + -r, + -t2, + 0, + -r, + t2, + 0, + r, + -t2, + 0, + r, + t2, + 0, + // (±φ, 0, ±1/φ) + -t2, + 0, + -r, + t2, + 0, + -r, + -t2, + 0, + r, + t2, + 0, + r + ]; + const indices = [ + 3, + 11, + 7, + 3, + 7, + 15, + 3, + 15, + 13, + 7, + 19, + 17, + 7, + 17, + 6, + 7, + 6, + 15, + 17, + 4, + 8, + 17, + 8, + 10, + 17, + 10, + 6, + 8, + 0, + 16, + 8, + 16, + 2, + 8, + 2, + 10, + 0, + 12, + 1, + 0, + 1, + 18, + 0, + 18, + 16, + 6, + 10, + 2, + 6, + 2, + 13, + 6, + 13, + 15, + 2, + 16, + 18, + 2, + 18, + 3, + 2, + 3, + 13, + 18, + 1, + 9, + 18, + 9, + 11, + 18, + 11, + 3, + 4, + 14, + 12, + 4, + 12, + 0, + 4, + 0, + 8, + 11, + 9, + 5, + 11, + 5, + 19, + 11, + 19, + 7, + 19, + 5, + 14, + 19, + 14, + 4, + 19, + 4, + 17, + 1, + 12, + 14, + 1, + 14, + 5, + 1, + 5, + 9 + ]; + super(vertices, indices, radius, detail); + this.type = "DodecahedronGeometry"; + this.parameters = { + radius, + detail + }; } - dispose() { - this.lightPlane.geometry.dispose(); - this.lightPlane.material.dispose(); - this.targetLine.geometry.dispose(); - this.targetLine.material.dispose(); + static fromJSON(data) { + return new DodecahedronGeometry(data.radius, data.detail); } - update() { - this.light.updateWorldMatrix(true, false); - this.light.target.updateWorldMatrix(true, false); - _v1.setFromMatrixPosition(this.light.matrixWorld); - _v2.setFromMatrixPosition(this.light.target.matrixWorld); - _v3.subVectors(_v2, _v1); - this.lightPlane.lookAt(_v2); - if (this.color !== void 0) { - this.lightPlane.material.color.set(this.color); - this.targetLine.material.color.set(this.color); - } else { - this.lightPlane.material.color.copy(this.light.color); - this.targetLine.material.color.copy(this.light.color); +} +const _v0 = /* @__PURE__ */ new Vector3(); +const _v1$1 = /* @__PURE__ */ new Vector3(); +const _normal = /* @__PURE__ */ new Vector3(); +const _triangle = /* @__PURE__ */ new Triangle(); +class EdgesGeometry extends BufferGeometry { + static { + __name(this, "EdgesGeometry"); + } + constructor(geometry = null, thresholdAngle = 1) { + super(); + this.type = "EdgesGeometry"; + this.parameters = { + geometry, + thresholdAngle + }; + if (geometry !== null) { + const precisionPoints = 4; + const precision = Math.pow(10, precisionPoints); + const thresholdDot = Math.cos(DEG2RAD * thresholdAngle); + const indexAttr = geometry.getIndex(); + const positionAttr = geometry.getAttribute("position"); + const indexCount = indexAttr ? indexAttr.count : positionAttr.count; + const indexArr = [0, 0, 0]; + const vertKeys = ["a", "b", "c"]; + const hashes = new Array(3); + const edgeData = {}; + const vertices = []; + for (let i = 0; i < indexCount; i += 3) { + if (indexAttr) { + indexArr[0] = indexAttr.getX(i); + indexArr[1] = indexAttr.getX(i + 1); + indexArr[2] = indexAttr.getX(i + 2); + } else { + indexArr[0] = i; + indexArr[1] = i + 1; + indexArr[2] = i + 2; + } + const { a, b, c } = _triangle; + a.fromBufferAttribute(positionAttr, indexArr[0]); + b.fromBufferAttribute(positionAttr, indexArr[1]); + c.fromBufferAttribute(positionAttr, indexArr[2]); + _triangle.getNormal(_normal); + hashes[0] = `${Math.round(a.x * precision)},${Math.round(a.y * precision)},${Math.round(a.z * precision)}`; + hashes[1] = `${Math.round(b.x * precision)},${Math.round(b.y * precision)},${Math.round(b.z * precision)}`; + hashes[2] = `${Math.round(c.x * precision)},${Math.round(c.y * precision)},${Math.round(c.z * precision)}`; + if (hashes[0] === hashes[1] || hashes[1] === hashes[2] || hashes[2] === hashes[0]) { + continue; + } + for (let j = 0; j < 3; j++) { + const jNext = (j + 1) % 3; + const vecHash0 = hashes[j]; + const vecHash1 = hashes[jNext]; + const v0 = _triangle[vertKeys[j]]; + const v1 = _triangle[vertKeys[jNext]]; + const hash = `${vecHash0}_${vecHash1}`; + const reverseHash = `${vecHash1}_${vecHash0}`; + if (reverseHash in edgeData && edgeData[reverseHash]) { + if (_normal.dot(edgeData[reverseHash].normal) <= thresholdDot) { + vertices.push(v0.x, v0.y, v0.z); + vertices.push(v1.x, v1.y, v1.z); + } + edgeData[reverseHash] = null; + } else if (!(hash in edgeData)) { + edgeData[hash] = { + index0: indexArr[j], + index1: indexArr[jNext], + normal: _normal.clone() + }; + } + } + } + for (const key in edgeData) { + if (edgeData[key]) { + const { index0, index1 } = edgeData[key]; + _v0.fromBufferAttribute(positionAttr, index0); + _v1$1.fromBufferAttribute(positionAttr, index1); + vertices.push(_v0.x, _v0.y, _v0.z); + vertices.push(_v1$1.x, _v1$1.y, _v1$1.z); + } + } + this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); } - this.targetLine.lookAt(_v2); - this.targetLine.scale.z = _v3.length(); + } + copy(source) { + super.copy(source); + this.parameters = Object.assign({}, source.parameters); + return this; } } -const _vector = /* @__PURE__ */ new Vector3(); -const _camera = /* @__PURE__ */ new Camera(); -class CameraHelper extends LineSegments { +class Shape extends Path { static { - __name(this, "CameraHelper"); + __name(this, "Shape"); } - constructor(camera) { - const geometry = new BufferGeometry(); - const material = new LineBasicMaterial({ color: 16777215, vertexColors: true, toneMapped: false }); - const vertices = []; - const colors = []; - const pointMap = {}; - addLine("n1", "n2"); - addLine("n2", "n4"); - addLine("n4", "n3"); - addLine("n3", "n1"); - addLine("f1", "f2"); - addLine("f2", "f4"); - addLine("f4", "f3"); - addLine("f3", "f1"); - addLine("n1", "f1"); - addLine("n2", "f2"); - addLine("n3", "f3"); - addLine("n4", "f4"); - addLine("p", "n1"); - addLine("p", "n2"); - addLine("p", "n3"); - addLine("p", "n4"); - addLine("u1", "u2"); - addLine("u2", "u3"); - addLine("u3", "u1"); - addLine("c", "t"); - addLine("p", "c"); - addLine("cn1", "cn2"); - addLine("cn3", "cn4"); - addLine("cf1", "cf2"); - addLine("cf3", "cf4"); - function addLine(a, b) { - addPoint(a); - addPoint(b); - } - __name(addLine, "addLine"); - function addPoint(id2) { - vertices.push(0, 0, 0); - colors.push(0, 0, 0); - if (pointMap[id2] === void 0) { - pointMap[id2] = []; - } - pointMap[id2].push(vertices.length / 3 - 1); + constructor(points) { + super(points); + this.uuid = generateUUID(); + this.type = "Shape"; + this.holes = []; + } + getPointsHoles(divisions) { + const holesPts = []; + for (let i = 0, l = this.holes.length; i < l; i++) { + holesPts[i] = this.holes[i].getPoints(divisions); } - __name(addPoint, "addPoint"); - geometry.setAttribute("position", new Float32BufferAttribute(vertices, 3)); - geometry.setAttribute("color", new Float32BufferAttribute(colors, 3)); - super(geometry, material); - this.type = "CameraHelper"; - this.camera = camera; - if (this.camera.updateProjectionMatrix) this.camera.updateProjectionMatrix(); - this.matrix = camera.matrixWorld; - this.matrixAutoUpdate = false; - this.pointMap = pointMap; - this.update(); - const colorFrustum = new Color(16755200); - const colorCone = new Color(16711680); - const colorUp = new Color(43775); - const colorTarget = new Color(16777215); - const colorCross = new Color(3355443); - this.setColors(colorFrustum, colorCone, colorUp, colorTarget, colorCross); + return holesPts; } - setColors(frustum, cone, up, target, cross) { - const geometry = this.geometry; - const colorAttribute = geometry.getAttribute("color"); - colorAttribute.setXYZ(0, frustum.r, frustum.g, frustum.b); - colorAttribute.setXYZ(1, frustum.r, frustum.g, frustum.b); - colorAttribute.setXYZ(2, frustum.r, frustum.g, frustum.b); - colorAttribute.setXYZ(3, frustum.r, frustum.g, frustum.b); - colorAttribute.setXYZ(4, frustum.r, frustum.g, frustum.b); - colorAttribute.setXYZ(5, frustum.r, frustum.g, frustum.b); - colorAttribute.setXYZ(6, frustum.r, frustum.g, frustum.b); - colorAttribute.setXYZ(7, frustum.r, frustum.g, frustum.b); - colorAttribute.setXYZ(8, frustum.r, frustum.g, frustum.b); - colorAttribute.setXYZ(9, frustum.r, frustum.g, frustum.b); - colorAttribute.setXYZ(10, frustum.r, frustum.g, frustum.b); - colorAttribute.setXYZ(11, frustum.r, frustum.g, frustum.b); - colorAttribute.setXYZ(12, frustum.r, frustum.g, frustum.b); - colorAttribute.setXYZ(13, frustum.r, frustum.g, frustum.b); - colorAttribute.setXYZ(14, frustum.r, frustum.g, frustum.b); - colorAttribute.setXYZ(15, frustum.r, frustum.g, frustum.b); - colorAttribute.setXYZ(16, frustum.r, frustum.g, frustum.b); - colorAttribute.setXYZ(17, frustum.r, frustum.g, frustum.b); - colorAttribute.setXYZ(18, frustum.r, frustum.g, frustum.b); - colorAttribute.setXYZ(19, frustum.r, frustum.g, frustum.b); - colorAttribute.setXYZ(20, frustum.r, frustum.g, frustum.b); - colorAttribute.setXYZ(21, frustum.r, frustum.g, frustum.b); - colorAttribute.setXYZ(22, frustum.r, frustum.g, frustum.b); - colorAttribute.setXYZ(23, frustum.r, frustum.g, frustum.b); - colorAttribute.setXYZ(24, cone.r, cone.g, cone.b); - colorAttribute.setXYZ(25, cone.r, cone.g, cone.b); - colorAttribute.setXYZ(26, cone.r, cone.g, cone.b); - colorAttribute.setXYZ(27, cone.r, cone.g, cone.b); - colorAttribute.setXYZ(28, cone.r, cone.g, cone.b); - colorAttribute.setXYZ(29, cone.r, cone.g, cone.b); - colorAttribute.setXYZ(30, cone.r, cone.g, cone.b); - colorAttribute.setXYZ(31, cone.r, cone.g, cone.b); - colorAttribute.setXYZ(32, up.r, up.g, up.b); - colorAttribute.setXYZ(33, up.r, up.g, up.b); - colorAttribute.setXYZ(34, up.r, up.g, up.b); - colorAttribute.setXYZ(35, up.r, up.g, up.b); - colorAttribute.setXYZ(36, up.r, up.g, up.b); - colorAttribute.setXYZ(37, up.r, up.g, up.b); - colorAttribute.setXYZ(38, target.r, target.g, target.b); - colorAttribute.setXYZ(39, target.r, target.g, target.b); - colorAttribute.setXYZ(40, cross.r, cross.g, cross.b); - colorAttribute.setXYZ(41, cross.r, cross.g, cross.b); - colorAttribute.setXYZ(42, cross.r, cross.g, cross.b); - colorAttribute.setXYZ(43, cross.r, cross.g, cross.b); - colorAttribute.setXYZ(44, cross.r, cross.g, cross.b); - colorAttribute.setXYZ(45, cross.r, cross.g, cross.b); - colorAttribute.setXYZ(46, cross.r, cross.g, cross.b); - colorAttribute.setXYZ(47, cross.r, cross.g, cross.b); - colorAttribute.setXYZ(48, cross.r, cross.g, cross.b); - colorAttribute.setXYZ(49, cross.r, cross.g, cross.b); - colorAttribute.needsUpdate = true; + // get points of shape and holes (keypoints based on segments parameter) + extractPoints(divisions) { + return { + shape: this.getPoints(divisions), + holes: this.getPointsHoles(divisions) + }; } - update() { - const geometry = this.geometry; - const pointMap = this.pointMap; - const w = 1, h = 1; - _camera.projectionMatrixInverse.copy(this.camera.projectionMatrixInverse); - setPoint("c", pointMap, geometry, _camera, 0, 0, -1); - setPoint("t", pointMap, geometry, _camera, 0, 0, 1); - setPoint("n1", pointMap, geometry, _camera, -w, -h, -1); - setPoint("n2", pointMap, geometry, _camera, w, -h, -1); - setPoint("n3", pointMap, geometry, _camera, -w, h, -1); - setPoint("n4", pointMap, geometry, _camera, w, h, -1); - setPoint("f1", pointMap, geometry, _camera, -w, -h, 1); - setPoint("f2", pointMap, geometry, _camera, w, -h, 1); - setPoint("f3", pointMap, geometry, _camera, -w, h, 1); - setPoint("f4", pointMap, geometry, _camera, w, h, 1); - setPoint("u1", pointMap, geometry, _camera, w * 0.7, h * 1.1, -1); - setPoint("u2", pointMap, geometry, _camera, -w * 0.7, h * 1.1, -1); - setPoint("u3", pointMap, geometry, _camera, 0, h * 2, -1); - setPoint("cf1", pointMap, geometry, _camera, -w, 0, 1); - setPoint("cf2", pointMap, geometry, _camera, w, 0, 1); - setPoint("cf3", pointMap, geometry, _camera, 0, -h, 1); - setPoint("cf4", pointMap, geometry, _camera, 0, h, 1); - setPoint("cn1", pointMap, geometry, _camera, -w, 0, -1); - setPoint("cn2", pointMap, geometry, _camera, w, 0, -1); - setPoint("cn3", pointMap, geometry, _camera, 0, -h, -1); - setPoint("cn4", pointMap, geometry, _camera, 0, h, -1); - geometry.getAttribute("position").needsUpdate = true; + copy(source) { + super.copy(source); + this.holes = []; + for (let i = 0, l = source.holes.length; i < l; i++) { + const hole = source.holes[i]; + this.holes.push(hole.clone()); + } + return this; } - dispose() { - this.geometry.dispose(); - this.material.dispose(); + toJSON() { + const data = super.toJSON(); + data.uuid = this.uuid; + data.holes = []; + for (let i = 0, l = this.holes.length; i < l; i++) { + const hole = this.holes[i]; + data.holes.push(hole.toJSON()); + } + return data; } -} -function setPoint(point, pointMap, geometry, camera, x, y, z) { - _vector.set(x, y, z).unproject(camera); - const points = pointMap[point]; - if (points !== void 0) { - const position = geometry.getAttribute("position"); - for (let i = 0, l = points.length; i < l; i++) { - position.setXYZ(points[i], _vector.x, _vector.y, _vector.z); + fromJSON(json) { + super.fromJSON(json); + this.uuid = json.uuid; + this.holes = []; + for (let i = 0, l = json.holes.length; i < l; i++) { + const hole = json.holes[i]; + this.holes.push(new Path().fromJSON(hole)); } + return this; } } -__name(setPoint, "setPoint"); -const _box = /* @__PURE__ */ new Box3(); -class BoxHelper extends LineSegments { - static { - __name(this, "BoxHelper"); +const Earcut = { + triangulate: /* @__PURE__ */ __name(function(data, holeIndices, dim = 2) { + const hasHoles = holeIndices && holeIndices.length; + const outerLen = hasHoles ? holeIndices[0] * dim : data.length; + let outerNode = linkedList(data, 0, outerLen, dim, true); + const triangles = []; + if (!outerNode || outerNode.next === outerNode.prev) return triangles; + let minX, minY, maxX, maxY, x, y, invSize; + if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim); + if (data.length > 80 * dim) { + minX = maxX = data[0]; + minY = maxY = data[1]; + for (let i = dim; i < outerLen; i += dim) { + x = data[i]; + y = data[i + 1]; + if (x < minX) minX = x; + if (y < minY) minY = y; + if (x > maxX) maxX = x; + if (y > maxY) maxY = y; + } + invSize = Math.max(maxX - minX, maxY - minY); + invSize = invSize !== 0 ? 32767 / invSize : 0; + } + earcutLinked(outerNode, triangles, dim, minX, minY, invSize, 0); + return triangles; + }, "triangulate") +}; +function linkedList(data, start, end, dim, clockwise) { + let i, last; + if (clockwise === signedArea(data, start, end, dim) > 0) { + for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last); + } else { + for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last); } - constructor(object, color = 16776960) { - const 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]); - const positions = new Float32Array(8 * 3); - const geometry = new BufferGeometry(); - geometry.setIndex(new BufferAttribute(indices, 1)); - geometry.setAttribute("position", new BufferAttribute(positions, 3)); - super(geometry, new LineBasicMaterial({ color, toneMapped: false })); - this.object = object; - this.type = "BoxHelper"; - this.matrixAutoUpdate = false; - this.update(); + if (last && equals(last, last.next)) { + removeNode(last); + last = last.next; } - update(object) { - if (object !== void 0) { - console.warn("THREE.BoxHelper: .update() has no longer arguments."); + return last; +} +__name(linkedList, "linkedList"); +function filterPoints(start, end) { + if (!start) return start; + if (!end) end = start; + let p = start, again; + do { + again = false; + if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) { + removeNode(p); + p = end = p.prev; + if (p === p.next) break; + again = true; + } else { + p = p.next; } - if (this.object !== void 0) { - _box.setFromObject(this.object); + } while (again || p !== end); + return end; +} +__name(filterPoints, "filterPoints"); +function earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) { + if (!ear) return; + if (!pass && invSize) indexCurve(ear, minX, minY, invSize); + let stop = ear, prev, next; + while (ear.prev !== ear.next) { + prev = ear.prev; + next = ear.next; + if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) { + triangles.push(prev.i / dim | 0); + triangles.push(ear.i / dim | 0); + triangles.push(next.i / dim | 0); + removeNode(ear); + ear = next.next; + stop = next.next; + continue; + } + ear = next; + if (ear === stop) { + if (!pass) { + earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1); + } else if (pass === 1) { + ear = cureLocalIntersections(filterPoints(ear), triangles, dim); + earcutLinked(ear, triangles, dim, minX, minY, invSize, 2); + } else if (pass === 2) { + splitEarcut(ear, triangles, dim, minX, minY, invSize); + } + break; } - if (_box.isEmpty()) return; - const min = _box.min; - const max2 = _box.max; - const position = this.geometry.attributes.position; - const array = position.array; - array[0] = max2.x; - array[1] = max2.y; - array[2] = max2.z; - array[3] = min.x; - array[4] = max2.y; - array[5] = max2.z; - array[6] = min.x; - array[7] = min.y; - array[8] = max2.z; - array[9] = max2.x; - array[10] = min.y; - array[11] = max2.z; - array[12] = max2.x; - array[13] = max2.y; - array[14] = min.z; - array[15] = min.x; - array[16] = max2.y; - array[17] = min.z; - array[18] = min.x; - array[19] = min.y; - array[20] = min.z; - array[21] = max2.x; - array[22] = min.y; - array[23] = min.z; - position.needsUpdate = true; - this.geometry.computeBoundingSphere(); } - setFromObject(object) { - this.object = object; - this.update(); - return this; +} +__name(earcutLinked, "earcutLinked"); +function isEar(ear) { + const a = ear.prev, b = ear, c = ear.next; + if (area(a, b, c) >= 0) return false; + const ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y; + const x0 = ax < bx ? ax < cx ? ax : cx : bx < cx ? bx : cx, y0 = ay < by ? ay < cy ? ay : cy : by < cy ? by : cy, x1 = ax > bx ? ax > cx ? ax : cx : bx > cx ? bx : cx, y1 = ay > by ? ay > cy ? ay : cy : by > cy ? by : cy; + let p = c.next; + while (p !== a) { + if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && pointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false; + p = p.next; } - copy(source, recursive) { - super.copy(source, recursive); - this.object = source.object; - return this; + return true; +} +__name(isEar, "isEar"); +function isEarHashed(ear, minX, minY, invSize) { + const a = ear.prev, b = ear, c = ear.next; + if (area(a, b, c) >= 0) return false; + const ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y; + const x0 = ax < bx ? ax < cx ? ax : cx : bx < cx ? bx : cx, y0 = ay < by ? ay < cy ? ay : cy : by < cy ? by : cy, x1 = ax > bx ? ax > cx ? ax : cx : bx > cx ? bx : cx, y1 = ay > by ? ay > cy ? ay : cy : by > cy ? by : cy; + const minZ = zOrder(x0, y0, minX, minY, invSize), maxZ = zOrder(x1, y1, minX, minY, invSize); + let p = ear.prevZ, n = ear.nextZ; + while (p && p.z >= minZ && n && n.z <= maxZ) { + if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c && pointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false; + p = p.prevZ; + if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c && pointInTriangle(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false; + n = n.nextZ; } - dispose() { - this.geometry.dispose(); - this.material.dispose(); + while (p && p.z >= minZ) { + if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c && pointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false; + p = p.prevZ; + } + while (n && n.z <= maxZ) { + if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c && pointInTriangle(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false; + n = n.nextZ; } + return true; } -class Box3Helper extends LineSegments { - static { - __name(this, "Box3Helper"); +__name(isEarHashed, "isEarHashed"); +function cureLocalIntersections(start, triangles, dim) { + let p = start; + do { + const a = p.prev, b = p.next.next; + if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) { + triangles.push(a.i / dim | 0); + triangles.push(p.i / dim | 0); + triangles.push(b.i / dim | 0); + removeNode(p); + removeNode(p.next); + p = start = b; + } + p = p.next; + } while (p !== start); + return filterPoints(p); +} +__name(cureLocalIntersections, "cureLocalIntersections"); +function splitEarcut(start, triangles, dim, minX, minY, invSize) { + let a = start; + do { + let b = a.next.next; + while (b !== a.prev) { + if (a.i !== b.i && isValidDiagonal(a, b)) { + let c = splitPolygon(a, b); + a = filterPoints(a, a.next); + c = filterPoints(c, c.next); + earcutLinked(a, triangles, dim, minX, minY, invSize, 0); + earcutLinked(c, triangles, dim, minX, minY, invSize, 0); + return; + } + b = b.next; + } + a = a.next; + } while (a !== start); +} +__name(splitEarcut, "splitEarcut"); +function eliminateHoles(data, holeIndices, outerNode, dim) { + const queue = []; + let i, len, start, end, list; + for (i = 0, len = holeIndices.length; i < len; i++) { + start = holeIndices[i] * dim; + end = i < len - 1 ? holeIndices[i + 1] * dim : data.length; + list = linkedList(data, start, end, dim, false); + if (list === list.next) list.steiner = true; + queue.push(getLeftmost(list)); } - constructor(box, color = 16776960) { - const 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]); - const 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]; - const geometry = new BufferGeometry(); - geometry.setIndex(new BufferAttribute(indices, 1)); - geometry.setAttribute("position", new Float32BufferAttribute(positions, 3)); - super(geometry, new LineBasicMaterial({ color, toneMapped: false })); - this.box = box; - this.type = "Box3Helper"; - this.geometry.computeBoundingSphere(); + queue.sort(compareX); + for (i = 0; i < queue.length; i++) { + outerNode = eliminateHole(queue[i], outerNode); } - updateMatrixWorld(force) { - const box = this.box; - if (box.isEmpty()) return; - box.getCenter(this.position); - box.getSize(this.scale); - this.scale.multiplyScalar(0.5); - super.updateMatrixWorld(force); + return outerNode; +} +__name(eliminateHoles, "eliminateHoles"); +function compareX(a, b) { + return a.x - b.x; +} +__name(compareX, "compareX"); +function eliminateHole(hole, outerNode) { + const bridge = findHoleBridge(hole, outerNode); + if (!bridge) { + return outerNode; } - dispose() { - this.geometry.dispose(); - this.material.dispose(); + const bridgeReverse = splitPolygon(bridge, hole); + filterPoints(bridgeReverse, bridgeReverse.next); + return filterPoints(bridge, bridge.next); +} +__name(eliminateHole, "eliminateHole"); +function findHoleBridge(hole, outerNode) { + let p = outerNode, qx = -Infinity, m; + const hx = hole.x, hy = hole.y; + do { + if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) { + const x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y); + if (x <= hx && x > qx) { + qx = x; + m = p.x < p.next.x ? p : p.next; + if (x === hx) return m; + } + } + p = p.next; + } while (p !== outerNode); + if (!m) return null; + const stop = m, mx = m.x, my = m.y; + let tanMin = Infinity, tan; + p = m; + do { + if (hx >= p.x && p.x >= mx && hx !== p.x && pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) { + tan = Math.abs(hy - p.y) / (hx - p.x); + if (locallyInside(p, hole) && (tan < tanMin || tan === tanMin && (p.x > m.x || p.x === m.x && sectorContainsSector(m, p)))) { + m = p; + tanMin = tan; + } + } + p = p.next; + } while (p !== stop); + return m; +} +__name(findHoleBridge, "findHoleBridge"); +function sectorContainsSector(m, p) { + return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0; +} +__name(sectorContainsSector, "sectorContainsSector"); +function indexCurve(start, minX, minY, invSize) { + let p = start; + do { + if (p.z === 0) p.z = zOrder(p.x, p.y, minX, minY, invSize); + p.prevZ = p.prev; + p.nextZ = p.next; + p = p.next; + } while (p !== start); + p.prevZ.nextZ = null; + p.prevZ = null; + sortLinked(p); +} +__name(indexCurve, "indexCurve"); +function sortLinked(list) { + let i, p, q, e, tail, numMerges, pSize, qSize, inSize = 1; + do { + p = list; + list = null; + tail = null; + numMerges = 0; + while (p) { + numMerges++; + q = p; + pSize = 0; + for (i = 0; i < inSize; i++) { + pSize++; + q = q.nextZ; + if (!q) break; + } + qSize = inSize; + while (pSize > 0 || qSize > 0 && q) { + if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) { + e = p; + p = p.nextZ; + pSize--; + } else { + e = q; + q = q.nextZ; + qSize--; + } + if (tail) tail.nextZ = e; + else list = e; + e.prevZ = tail; + tail = e; + } + p = q; + } + tail.nextZ = null; + inSize *= 2; + } while (numMerges > 1); + return list; +} +__name(sortLinked, "sortLinked"); +function zOrder(x, y, minX, minY, invSize) { + x = (x - minX) * invSize | 0; + y = (y - minY) * invSize | 0; + x = (x | x << 8) & 16711935; + x = (x | x << 4) & 252645135; + x = (x | x << 2) & 858993459; + x = (x | x << 1) & 1431655765; + y = (y | y << 8) & 16711935; + y = (y | y << 4) & 252645135; + y = (y | y << 2) & 858993459; + y = (y | y << 1) & 1431655765; + return x | y << 1; +} +__name(zOrder, "zOrder"); +function getLeftmost(start) { + let p = start, leftmost = start; + do { + if (p.x < leftmost.x || p.x === leftmost.x && p.y < leftmost.y) leftmost = p; + p = p.next; + } while (p !== start); + return leftmost; +} +__name(getLeftmost, "getLeftmost"); +function pointInTriangle(ax, ay, bx, by, cx, cy, px2, py2) { + return (cx - px2) * (ay - py2) >= (ax - px2) * (cy - py2) && (ax - px2) * (by - py2) >= (bx - px2) * (ay - py2) && (bx - px2) * (cy - py2) >= (cx - px2) * (by - py2); +} +__name(pointInTriangle, "pointInTriangle"); +function isValidDiagonal(a, b) { + return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // dones't intersect other edges + (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible + (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors + equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); +} +__name(isValidDiagonal, "isValidDiagonal"); +function area(p, q, r) { + return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y); +} +__name(area, "area"); +function equals(p1, p2) { + return p1.x === p2.x && p1.y === p2.y; +} +__name(equals, "equals"); +function intersects(p1, q1, p2, q2) { + const o1 = sign(area(p1, q1, p2)); + const o2 = sign(area(p1, q1, q2)); + const o3 = sign(area(p2, q2, p1)); + const o4 = sign(area(p2, q2, q1)); + if (o1 !== o2 && o3 !== o4) return true; + if (o1 === 0 && onSegment(p1, p2, q1)) return true; + if (o2 === 0 && onSegment(p1, q2, q1)) return true; + if (o3 === 0 && onSegment(p2, p1, q2)) return true; + if (o4 === 0 && onSegment(p2, q1, q2)) return true; + return false; +} +__name(intersects, "intersects"); +function onSegment(p, q, r) { + return 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); +} +__name(onSegment, "onSegment"); +function sign(num) { + return num > 0 ? 1 : num < 0 ? -1 : 0; +} +__name(sign, "sign"); +function intersectsPolygon(a, b) { + let p = a; + do { + if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i && intersects(p, p.next, a, b)) return true; + p = p.next; + } while (p !== a); + return false; +} +__name(intersectsPolygon, "intersectsPolygon"); +function locallyInside(a, b) { + return area(a.prev, a, a.next) < 0 ? area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 : area(a, b, a.prev) < 0 || area(a, a.next, b) < 0; +} +__name(locallyInside, "locallyInside"); +function middleInside(a, b) { + let p = a, inside = false; + const px2 = (a.x + b.x) / 2, py2 = (a.y + b.y) / 2; + do { + if (p.y > py2 !== p.next.y > py2 && p.next.y !== p.y && px2 < (p.next.x - p.x) * (py2 - p.y) / (p.next.y - p.y) + p.x) + inside = !inside; + p = p.next; + } while (p !== a); + return inside; +} +__name(middleInside, "middleInside"); +function splitPolygon(a, b) { + const a2 = new Node(a.i, a.x, a.y), b22 = new Node(b.i, b.x, b.y), an = a.next, bp = b.prev; + a.next = b; + b.prev = a; + a2.next = an; + an.prev = a2; + b22.next = a2; + a2.prev = b22; + bp.next = b22; + b22.prev = bp; + return b22; +} +__name(splitPolygon, "splitPolygon"); +function insertNode(i, x, y, last) { + const p = new Node(i, x, y); + if (!last) { + p.prev = p; + p.next = p; + } else { + p.next = last.next; + p.prev = last; + last.next.prev = p; + last.next = p; + } + return p; +} +__name(insertNode, "insertNode"); +function removeNode(p) { + p.next.prev = p.prev; + p.prev.next = p.next; + if (p.prevZ) p.prevZ.nextZ = p.nextZ; + if (p.nextZ) p.nextZ.prevZ = p.prevZ; +} +__name(removeNode, "removeNode"); +function Node(i, x, y) { + this.i = i; + this.x = x; + this.y = y; + this.prev = null; + this.next = null; + this.z = 0; + this.prevZ = null; + this.nextZ = null; + this.steiner = false; +} +__name(Node, "Node"); +function signedArea(data, start, end, dim) { + let sum = 0; + for (let i = start, j = end - dim; i < end; i += dim) { + sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]); + j = i; } + return sum; } -class PlaneHelper extends Line { +__name(signedArea, "signedArea"); +class ShapeUtils { static { - __name(this, "PlaneHelper"); + __name(this, "ShapeUtils"); } - constructor(plane, size = 1, hex = 16776960) { - const color = hex; - const 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]; - const geometry = new BufferGeometry(); - geometry.setAttribute("position", new Float32BufferAttribute(positions, 3)); - geometry.computeBoundingSphere(); - super(geometry, new LineBasicMaterial({ color, toneMapped: false })); - this.type = "PlaneHelper"; - this.plane = plane; - this.size = size; - const positions2 = [1, 1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, -1, 0, 1, -1, 0]; - const geometry2 = new BufferGeometry(); - geometry2.setAttribute("position", new Float32BufferAttribute(positions2, 3)); - geometry2.computeBoundingSphere(); - this.add(new Mesh(geometry2, new MeshBasicMaterial({ color, opacity: 0.2, transparent: true, depthWrite: false, toneMapped: false }))); + // calculate area of the contour polygon + static area(contour) { + const n = contour.length; + let a = 0; + for (let p = n - 1, q = 0; q < n; p = q++) { + a += contour[p].x * contour[q].y - contour[q].x * contour[p].y; + } + return a * 0.5; } - updateMatrixWorld(force) { - this.position.set(0, 0, 0); - this.scale.set(0.5 * this.size, 0.5 * this.size, 1); - this.lookAt(this.plane.normal); - this.translateZ(-this.plane.constant); - super.updateMatrixWorld(force); + static isClockWise(pts) { + return ShapeUtils.area(pts) < 0; } - dispose() { - this.geometry.dispose(); - this.material.dispose(); - this.children[0].geometry.dispose(); - this.children[0].material.dispose(); + static triangulateShape(contour, holes) { + const vertices = []; + const holeIndices = []; + const faces = []; + removeDupEndPts(contour); + addContour(vertices, contour); + let holeIndex = contour.length; + holes.forEach(removeDupEndPts); + for (let i = 0; i < holes.length; i++) { + holeIndices.push(holeIndex); + holeIndex += holes[i].length; + addContour(vertices, holes[i]); + } + const triangles = Earcut.triangulate(vertices, holeIndices); + for (let i = 0; i < triangles.length; i += 3) { + faces.push(triangles.slice(i, i + 3)); + } + return faces; } } -const _axis = /* @__PURE__ */ new Vector3(); -let _lineGeometry, _coneGeometry; -class ArrowHelper extends Object3D { +function removeDupEndPts(points) { + const l = points.length; + if (l > 2 && points[l - 1].equals(points[0])) { + points.pop(); + } +} +__name(removeDupEndPts, "removeDupEndPts"); +function addContour(vertices, contour) { + for (let i = 0; i < contour.length; i++) { + vertices.push(contour[i].x); + vertices.push(contour[i].y); + } +} +__name(addContour, "addContour"); +class ExtrudeGeometry extends BufferGeometry { static { - __name(this, "ArrowHelper"); + __name(this, "ExtrudeGeometry"); } - // dir is assumed to be normalized - constructor(dir = new Vector3(0, 0, 1), origin = new Vector3(0, 0, 0), length = 1, color = 16776960, headLength = length * 0.2, headWidth = headLength * 0.2) { + constructor(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 = {}) { super(); - this.type = "ArrowHelper"; - if (_lineGeometry === void 0) { - _lineGeometry = new BufferGeometry(); - _lineGeometry.setAttribute("position", new Float32BufferAttribute([0, 0, 0, 0, 1, 0], 3)); - _coneGeometry = new CylinderGeometry(0, 0.5, 1, 5, 1); - _coneGeometry.translate(0, -0.5, 0); + this.type = "ExtrudeGeometry"; + this.parameters = { + shapes, + options + }; + shapes = Array.isArray(shapes) ? shapes : [shapes]; + const scope = this; + const verticesArray = []; + const uvArray = []; + for (let i = 0, l = shapes.length; i < l; i++) { + const shape = shapes[i]; + addShape(shape); } - this.position.copy(origin); - this.line = new Line(_lineGeometry, new LineBasicMaterial({ color, toneMapped: false })); - this.line.matrixAutoUpdate = false; - this.add(this.line); - this.cone = new Mesh(_coneGeometry, new MeshBasicMaterial({ color, toneMapped: false })); - this.cone.matrixAutoUpdate = false; - this.add(this.cone); - this.setDirection(dir); - this.setLength(length, headLength, headWidth); - } - setDirection(dir) { - if (dir.y > 0.99999) { - this.quaternion.set(0, 0, 0, 1); - } else if (dir.y < -0.99999) { - this.quaternion.set(1, 0, 0, 0); - } else { - _axis.set(dir.z, 0, -dir.x).normalize(); - const radians = Math.acos(dir.y); - this.quaternion.setFromAxisAngle(_axis, radians); + this.setAttribute("position", new Float32BufferAttribute(verticesArray, 3)); + this.setAttribute("uv", new Float32BufferAttribute(uvArray, 2)); + this.computeVertexNormals(); + function addShape(shape) { + const placeholder = []; + const curveSegments = options.curveSegments !== void 0 ? options.curveSegments : 12; + const steps = options.steps !== void 0 ? options.steps : 1; + const depth = options.depth !== void 0 ? options.depth : 1; + let bevelEnabled = options.bevelEnabled !== void 0 ? options.bevelEnabled : true; + let bevelThickness = options.bevelThickness !== void 0 ? options.bevelThickness : 0.2; + let bevelSize = options.bevelSize !== void 0 ? options.bevelSize : bevelThickness - 0.1; + let bevelOffset = options.bevelOffset !== void 0 ? options.bevelOffset : 0; + let bevelSegments = options.bevelSegments !== void 0 ? options.bevelSegments : 3; + const extrudePath = options.extrudePath; + const uvgen = options.UVGenerator !== void 0 ? options.UVGenerator : WorldUVGenerator; + let extrudePts, extrudeByPath = false; + let splineTube, binormal, normal, position2; + if (extrudePath) { + extrudePts = extrudePath.getSpacedPoints(steps); + extrudeByPath = true; + bevelEnabled = false; + splineTube = extrudePath.computeFrenetFrames(steps, false); + binormal = new Vector3(); + normal = new Vector3(); + position2 = new Vector3(); + } + if (!bevelEnabled) { + bevelSegments = 0; + bevelThickness = 0; + bevelSize = 0; + bevelOffset = 0; + } + const shapePoints = shape.extractPoints(curveSegments); + let vertices = shapePoints.shape; + const holes = shapePoints.holes; + const reverse = !ShapeUtils.isClockWise(vertices); + if (reverse) { + vertices = vertices.reverse(); + for (let h = 0, hl = holes.length; h < hl; h++) { + const ahole = holes[h]; + if (ShapeUtils.isClockWise(ahole)) { + holes[h] = ahole.reverse(); + } + } + } + const faces = ShapeUtils.triangulateShape(vertices, holes); + const contour = vertices; + for (let h = 0, hl = holes.length; h < hl; h++) { + const ahole = holes[h]; + vertices = vertices.concat(ahole); + } + function scalePt2(pt, vec, size) { + if (!vec) console.error("THREE.ExtrudeGeometry: vec does not exist"); + return pt.clone().addScaledVector(vec, size); + } + __name(scalePt2, "scalePt2"); + const vlen = vertices.length, flen = faces.length; + function getBevelVec(inPt, inPrev, inNext) { + let v_trans_x, v_trans_y, shrink_by; + const v_prev_x = inPt.x - inPrev.x, v_prev_y = inPt.y - inPrev.y; + const v_next_x = inNext.x - inPt.x, v_next_y = inNext.y - inPt.y; + const v_prev_lensq = v_prev_x * v_prev_x + v_prev_y * v_prev_y; + const collinear0 = v_prev_x * v_next_y - v_prev_y * v_next_x; + if (Math.abs(collinear0) > Number.EPSILON) { + const v_prev_len = Math.sqrt(v_prev_lensq); + const v_next_len = Math.sqrt(v_next_x * v_next_x + v_next_y * v_next_y); + const ptPrevShift_x = inPrev.x - v_prev_y / v_prev_len; + const ptPrevShift_y = inPrev.y + v_prev_x / v_prev_len; + const ptNextShift_x = inNext.x - v_next_y / v_next_len; + const ptNextShift_y = inNext.y + v_next_x / v_next_len; + const sf = ((ptNextShift_x - ptPrevShift_x) * v_next_y - (ptNextShift_y - ptPrevShift_y) * v_next_x) / (v_prev_x * v_next_y - v_prev_y * v_next_x); + v_trans_x = ptPrevShift_x + v_prev_x * sf - inPt.x; + v_trans_y = ptPrevShift_y + v_prev_y * sf - inPt.y; + const v_trans_lensq = v_trans_x * v_trans_x + v_trans_y * v_trans_y; + if (v_trans_lensq <= 2) { + return new Vector2(v_trans_x, v_trans_y); + } else { + shrink_by = Math.sqrt(v_trans_lensq / 2); + } + } else { + let direction_eq = false; + if (v_prev_x > Number.EPSILON) { + if (v_next_x > Number.EPSILON) { + direction_eq = true; + } + } else { + if (v_prev_x < -Number.EPSILON) { + if (v_next_x < -Number.EPSILON) { + direction_eq = true; + } + } else { + if (Math.sign(v_prev_y) === Math.sign(v_next_y)) { + direction_eq = true; + } + } + } + if (direction_eq) { + v_trans_x = -v_prev_y; + v_trans_y = v_prev_x; + shrink_by = Math.sqrt(v_prev_lensq); + } else { + v_trans_x = v_prev_x; + v_trans_y = v_prev_y; + shrink_by = Math.sqrt(v_prev_lensq / 2); + } + } + return new Vector2(v_trans_x / shrink_by, v_trans_y / shrink_by); + } + __name(getBevelVec, "getBevelVec"); + const contourMovements = []; + for (let i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i++, j++, k++) { + if (j === il) j = 0; + if (k === il) k = 0; + contourMovements[i] = getBevelVec(contour[i], contour[j], contour[k]); + } + const holesMovements = []; + let oneHoleMovements, verticesMovements = contourMovements.concat(); + for (let h = 0, hl = holes.length; h < hl; h++) { + const ahole = holes[h]; + oneHoleMovements = []; + for (let i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i++, j++, k++) { + if (j === il) j = 0; + if (k === il) k = 0; + oneHoleMovements[i] = getBevelVec(ahole[i], ahole[j], ahole[k]); + } + holesMovements.push(oneHoleMovements); + verticesMovements = verticesMovements.concat(oneHoleMovements); + } + for (let b = 0; b < bevelSegments; b++) { + const t2 = b / bevelSegments; + const z = bevelThickness * Math.cos(t2 * Math.PI / 2); + const bs2 = bevelSize * Math.sin(t2 * Math.PI / 2) + bevelOffset; + for (let i = 0, il = contour.length; i < il; i++) { + const vert = scalePt2(contour[i], contourMovements[i], bs2); + v(vert.x, vert.y, -z); + } + for (let h = 0, hl = holes.length; h < hl; h++) { + const ahole = holes[h]; + oneHoleMovements = holesMovements[h]; + for (let i = 0, il = ahole.length; i < il; i++) { + const vert = scalePt2(ahole[i], oneHoleMovements[i], bs2); + v(vert.x, vert.y, -z); + } + } + } + const bs = bevelSize + bevelOffset; + for (let i = 0; i < vlen; i++) { + const vert = bevelEnabled ? scalePt2(vertices[i], verticesMovements[i], bs) : vertices[i]; + if (!extrudeByPath) { + v(vert.x, vert.y, 0); + } else { + normal.copy(splineTube.normals[0]).multiplyScalar(vert.x); + binormal.copy(splineTube.binormals[0]).multiplyScalar(vert.y); + position2.copy(extrudePts[0]).add(normal).add(binormal); + v(position2.x, position2.y, position2.z); + } + } + for (let s = 1; s <= steps; s++) { + for (let i = 0; i < vlen; i++) { + const vert = bevelEnabled ? scalePt2(vertices[i], verticesMovements[i], bs) : vertices[i]; + if (!extrudeByPath) { + v(vert.x, vert.y, depth / steps * s); + } else { + normal.copy(splineTube.normals[s]).multiplyScalar(vert.x); + binormal.copy(splineTube.binormals[s]).multiplyScalar(vert.y); + position2.copy(extrudePts[s]).add(normal).add(binormal); + v(position2.x, position2.y, position2.z); + } + } + } + for (let b = bevelSegments - 1; b >= 0; b--) { + const t2 = b / bevelSegments; + const z = bevelThickness * Math.cos(t2 * Math.PI / 2); + const bs2 = bevelSize * Math.sin(t2 * Math.PI / 2) + bevelOffset; + for (let i = 0, il = contour.length; i < il; i++) { + const vert = scalePt2(contour[i], contourMovements[i], bs2); + v(vert.x, vert.y, depth + z); + } + for (let h = 0, hl = holes.length; h < hl; h++) { + const ahole = holes[h]; + oneHoleMovements = holesMovements[h]; + for (let i = 0, il = ahole.length; i < il; i++) { + const vert = scalePt2(ahole[i], oneHoleMovements[i], bs2); + if (!extrudeByPath) { + v(vert.x, vert.y, depth + z); + } else { + v(vert.x, vert.y + extrudePts[steps - 1].y, extrudePts[steps - 1].x + z); + } + } + } + } + buildLidFaces(); + buildSideFaces(); + function buildLidFaces() { + const start = verticesArray.length / 3; + if (bevelEnabled) { + let layer = 0; + let offset = vlen * layer; + for (let i = 0; i < flen; i++) { + const face = faces[i]; + f3(face[2] + offset, face[1] + offset, face[0] + offset); + } + layer = steps + bevelSegments * 2; + offset = vlen * layer; + for (let i = 0; i < flen; i++) { + const face = faces[i]; + f3(face[0] + offset, face[1] + offset, face[2] + offset); + } + } else { + for (let i = 0; i < flen; i++) { + const face = faces[i]; + f3(face[2], face[1], face[0]); + } + for (let i = 0; i < flen; i++) { + const face = faces[i]; + f3(face[0] + vlen * steps, face[1] + vlen * steps, face[2] + vlen * steps); + } + } + scope.addGroup(start, verticesArray.length / 3 - start, 0); + } + __name(buildLidFaces, "buildLidFaces"); + function buildSideFaces() { + const start = verticesArray.length / 3; + let layeroffset = 0; + sidewalls(contour, layeroffset); + layeroffset += contour.length; + for (let h = 0, hl = holes.length; h < hl; h++) { + const ahole = holes[h]; + sidewalls(ahole, layeroffset); + layeroffset += ahole.length; + } + scope.addGroup(start, verticesArray.length / 3 - start, 1); + } + __name(buildSideFaces, "buildSideFaces"); + function sidewalls(contour2, layeroffset) { + let i = contour2.length; + while (--i >= 0) { + const j = i; + let k = i - 1; + if (k < 0) k = contour2.length - 1; + for (let s = 0, sl = steps + bevelSegments * 2; s < sl; s++) { + const slen1 = vlen * s; + const slen2 = vlen * (s + 1); + const a = layeroffset + j + slen1, b = layeroffset + k + slen1, c = layeroffset + k + slen2, d = layeroffset + j + slen2; + f4(a, b, c, d); + } + } + } + __name(sidewalls, "sidewalls"); + function v(x, y, z) { + placeholder.push(x); + placeholder.push(y); + placeholder.push(z); + } + __name(v, "v"); + function f3(a, b, c) { + addVertex(a); + addVertex(b); + addVertex(c); + const nextIndex = verticesArray.length / 3; + const uvs = uvgen.generateTopUV(scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1); + addUV(uvs[0]); + addUV(uvs[1]); + addUV(uvs[2]); + } + __name(f3, "f3"); + function f4(a, b, c, d) { + addVertex(a); + addVertex(b); + addVertex(d); + addVertex(b); + addVertex(c); + addVertex(d); + const nextIndex = verticesArray.length / 3; + const uvs = uvgen.generateSideWallUV(scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1); + addUV(uvs[0]); + addUV(uvs[1]); + addUV(uvs[3]); + addUV(uvs[1]); + addUV(uvs[2]); + addUV(uvs[3]); + } + __name(f4, "f4"); + function addVertex(index) { + verticesArray.push(placeholder[index * 3 + 0]); + verticesArray.push(placeholder[index * 3 + 1]); + verticesArray.push(placeholder[index * 3 + 2]); + } + __name(addVertex, "addVertex"); + function addUV(vector2) { + uvArray.push(vector2.x); + uvArray.push(vector2.y); + } + __name(addUV, "addUV"); } - } - setLength(length, headLength = length * 0.2, headWidth = headLength * 0.2) { - this.line.scale.set(1, Math.max(1e-4, length - headLength), 1); - this.line.updateMatrix(); - this.cone.scale.set(headWidth, headLength, headWidth); - this.cone.position.y = length; - this.cone.updateMatrix(); - } - setColor(color) { - this.line.material.color.set(color); - this.cone.material.color.set(color); + __name(addShape, "addShape"); } copy(source) { - super.copy(source, false); - this.line.copy(source.line); - this.cone.copy(source.cone); + super.copy(source); + this.parameters = Object.assign({}, source.parameters); return this; } - dispose() { - this.line.geometry.dispose(); - this.line.material.dispose(); - this.cone.geometry.dispose(); - this.cone.material.dispose(); + toJSON() { + const data = super.toJSON(); + const shapes = this.parameters.shapes; + const options = this.parameters.options; + return toJSON$1(shapes, options, data); + } + static fromJSON(data, shapes) { + const geometryShapes = []; + for (let j = 0, jl = data.shapes.length; j < jl; j++) { + const shape = shapes[data.shapes[j]]; + geometryShapes.push(shape); + } + const extrudePath = data.options.extrudePath; + if (extrudePath !== void 0) { + data.options.extrudePath = new Curves[extrudePath.type]().fromJSON(extrudePath); + } + return new ExtrudeGeometry(geometryShapes, data.options); + } +} +const WorldUVGenerator = { + generateTopUV: /* @__PURE__ */ __name(function(geometry, vertices, indexA, indexB, indexC) { + const a_x = vertices[indexA * 3]; + const a_y = vertices[indexA * 3 + 1]; + const b_x = vertices[indexB * 3]; + const b_y = vertices[indexB * 3 + 1]; + const c_x = vertices[indexC * 3]; + const c_y = vertices[indexC * 3 + 1]; + return [ + new Vector2(a_x, a_y), + new Vector2(b_x, b_y), + new Vector2(c_x, c_y) + ]; + }, "generateTopUV"), + generateSideWallUV: /* @__PURE__ */ __name(function(geometry, vertices, indexA, indexB, indexC, indexD) { + const a_x = vertices[indexA * 3]; + const a_y = vertices[indexA * 3 + 1]; + const a_z = vertices[indexA * 3 + 2]; + const b_x = vertices[indexB * 3]; + const b_y = vertices[indexB * 3 + 1]; + const b_z = vertices[indexB * 3 + 2]; + const c_x = vertices[indexC * 3]; + const c_y = vertices[indexC * 3 + 1]; + const c_z = vertices[indexC * 3 + 2]; + const d_x = vertices[indexD * 3]; + const d_y = vertices[indexD * 3 + 1]; + const d_z = vertices[indexD * 3 + 2]; + if (Math.abs(a_y - b_y) < Math.abs(a_x - b_x)) { + return [ + new Vector2(a_x, 1 - a_z), + new Vector2(b_x, 1 - b_z), + new Vector2(c_x, 1 - c_z), + new Vector2(d_x, 1 - d_z) + ]; + } else { + return [ + new Vector2(a_y, 1 - a_z), + new Vector2(b_y, 1 - b_z), + new Vector2(c_y, 1 - c_z), + new Vector2(d_y, 1 - d_z) + ]; + } + }, "generateSideWallUV") +}; +function toJSON$1(shapes, options, data) { + data.shapes = []; + if (Array.isArray(shapes)) { + for (let i = 0, l = shapes.length; i < l; i++) { + const shape = shapes[i]; + data.shapes.push(shape.uuid); + } + } else { + data.shapes.push(shapes.uuid); } + data.options = Object.assign({}, options); + if (options.extrudePath !== void 0) data.options.extrudePath = options.extrudePath.toJSON(); + return data; } -class AxesHelper extends LineSegments { +__name(toJSON$1, "toJSON$1"); +class IcosahedronGeometry extends PolyhedronGeometry { static { - __name(this, "AxesHelper"); + __name(this, "IcosahedronGeometry"); } - constructor(size = 1) { + constructor(radius = 1, detail = 0) { + const t2 = (1 + Math.sqrt(5)) / 2; const vertices = [ + -1, + t2, 0, + 1, + t2, 0, + -1, + -t2, 0, - size, + 1, + -t2, 0, 0, + -1, + t2, 0, + 1, + t2, 0, + -1, + -t2, 0, + 1, + -t2, + t2, 0, - size, + -1, + t2, 0, + 1, + -t2, 0, + -1, + -t2, 0, + 1 + ]; + const indices = [ 0, + 11, + 5, 0, + 5, + 1, 0, - size - ]; - const colors = [ 1, + 7, 0, + 7, + 10, 0, + 10, + 11, + 1, + 5, + 9, + 5, + 11, + 4, + 11, + 10, + 2, + 10, + 7, + 6, + 7, + 1, + 8, + 3, + 9, + 4, + 3, + 4, + 2, + 3, + 2, + 6, + 3, + 6, + 8, + 3, + 8, + 9, + 4, + 9, + 5, + 2, + 4, + 11, + 6, + 2, + 10, + 8, + 6, + 7, + 9, + 8, + 1 + ]; + super(vertices, indices, radius, detail); + this.type = "IcosahedronGeometry"; + this.parameters = { + radius, + detail + }; + } + static fromJSON(data) { + return new IcosahedronGeometry(data.radius, data.detail); + } +} +class OctahedronGeometry extends PolyhedronGeometry { + static { + __name(this, "OctahedronGeometry"); + } + constructor(radius = 1, detail = 0) { + const vertices = [ 1, - 0.6, 0, 0, - 1, + -1, + 0, + 0, 0, - 0.6, 1, 0, 0, + -1, + 0, + 0, 0, 1, 0, - 0.6, - 1 + 0, + -1 ]; - const geometry = new BufferGeometry(); - geometry.setAttribute("position", new Float32BufferAttribute(vertices, 3)); - geometry.setAttribute("color", new Float32BufferAttribute(colors, 3)); - const material = new LineBasicMaterial({ vertexColors: true, toneMapped: false }); - super(geometry, material); - this.type = "AxesHelper"; - } - setColors(xAxisColor, yAxisColor, zAxisColor) { - const color = new Color(); - const array = this.geometry.attributes.color.array; - color.set(xAxisColor); - color.toArray(array, 0); - color.toArray(array, 3); - color.set(yAxisColor); - color.toArray(array, 6); - color.toArray(array, 9); - color.set(zAxisColor); - color.toArray(array, 12); - color.toArray(array, 15); - this.geometry.attributes.color.needsUpdate = true; - return this; + const indices = [ + 0, + 2, + 4, + 0, + 4, + 3, + 0, + 3, + 5, + 0, + 5, + 2, + 1, + 2, + 5, + 1, + 5, + 3, + 1, + 3, + 4, + 1, + 4, + 2 + ]; + super(vertices, indices, radius, detail); + this.type = "OctahedronGeometry"; + this.parameters = { + radius, + detail + }; } - dispose() { - this.geometry.dispose(); - this.material.dispose(); + static fromJSON(data) { + return new OctahedronGeometry(data.radius, data.detail); } } -class ShapePath { +class RingGeometry extends BufferGeometry { static { - __name(this, "ShapePath"); - } - constructor() { - this.type = "ShapePath"; - this.color = new Color(); - this.subPaths = []; - this.currentPath = null; - } - moveTo(x, y) { - this.currentPath = new Path(); - this.subPaths.push(this.currentPath); - this.currentPath.moveTo(x, y); - return this; + __name(this, "RingGeometry"); } - lineTo(x, y) { - this.currentPath.lineTo(x, y); - return this; + constructor(innerRadius = 0.5, outerRadius = 1, thetaSegments = 32, phiSegments = 1, thetaStart = 0, thetaLength = Math.PI * 2) { + super(); + this.type = "RingGeometry"; + this.parameters = { + innerRadius, + outerRadius, + thetaSegments, + phiSegments, + thetaStart, + thetaLength + }; + thetaSegments = Math.max(3, thetaSegments); + phiSegments = Math.max(1, phiSegments); + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + let radius = innerRadius; + const radiusStep = (outerRadius - innerRadius) / phiSegments; + const vertex2 = new Vector3(); + const uv = new Vector2(); + for (let j = 0; j <= phiSegments; j++) { + for (let i = 0; i <= thetaSegments; i++) { + const segment = thetaStart + i / thetaSegments * thetaLength; + vertex2.x = radius * Math.cos(segment); + vertex2.y = radius * Math.sin(segment); + vertices.push(vertex2.x, vertex2.y, vertex2.z); + normals.push(0, 0, 1); + uv.x = (vertex2.x / outerRadius + 1) / 2; + uv.y = (vertex2.y / outerRadius + 1) / 2; + uvs.push(uv.x, uv.y); + } + radius += radiusStep; + } + for (let j = 0; j < phiSegments; j++) { + const thetaSegmentLevel = j * (thetaSegments + 1); + for (let i = 0; i < thetaSegments; i++) { + const segment = i + thetaSegmentLevel; + const a = segment; + const b = segment + thetaSegments + 1; + const c = segment + thetaSegments + 2; + const d = segment + 1; + indices.push(a, b, d); + indices.push(b, c, d); + } + } + this.setIndex(indices); + this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + this.setAttribute("normal", new Float32BufferAttribute(normals, 3)); + this.setAttribute("uv", new Float32BufferAttribute(uvs, 2)); } - quadraticCurveTo(aCPx, aCPy, aX, aY) { - this.currentPath.quadraticCurveTo(aCPx, aCPy, aX, aY); + copy(source) { + super.copy(source); + this.parameters = Object.assign({}, source.parameters); return this; } - bezierCurveTo(aCP1x, aCP1y, aCP2x, aCP2y, aX, aY) { - this.currentPath.bezierCurveTo(aCP1x, aCP1y, aCP2x, aCP2y, aX, aY); - return this; + static fromJSON(data) { + return new RingGeometry(data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength); } - splineThru(pts) { - this.currentPath.splineThru(pts); - return this; +} +class ShapeGeometry extends BufferGeometry { + static { + __name(this, "ShapeGeometry"); } - toShapes(isCCW) { - function toShapesNoHoles(inSubpaths) { - const shapes2 = []; - for (let i = 0, l = inSubpaths.length; i < l; i++) { - const tmpPath2 = inSubpaths[i]; - const tmpShape2 = new Shape(); - tmpShape2.curves = tmpPath2.curves; - shapes2.push(tmpShape2); + constructor(shapes = new Shape([new Vector2(0, 0.5), new Vector2(-0.5, -0.5), new Vector2(0.5, -0.5)]), curveSegments = 12) { + super(); + this.type = "ShapeGeometry"; + this.parameters = { + shapes, + curveSegments + }; + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + let groupStart = 0; + let groupCount = 0; + if (Array.isArray(shapes) === false) { + addShape(shapes); + } else { + for (let i = 0; i < shapes.length; i++) { + addShape(shapes[i]); + this.addGroup(groupStart, groupCount, i); + groupStart += groupCount; + groupCount = 0; } - return shapes2; } - __name(toShapesNoHoles, "toShapesNoHoles"); - function isPointInsidePolygon(inPt, inPolygon) { - const polyLen = inPolygon.length; - let inside = false; - for (let p = polyLen - 1, q = 0; q < polyLen; p = q++) { - let edgeLowPt = inPolygon[p]; - let edgeHighPt = inPolygon[q]; - let edgeDx = edgeHighPt.x - edgeLowPt.x; - let edgeDy = edgeHighPt.y - edgeLowPt.y; - if (Math.abs(edgeDy) > Number.EPSILON) { - if (edgeDy < 0) { - edgeLowPt = inPolygon[q]; - edgeDx = -edgeDx; - edgeHighPt = inPolygon[p]; - edgeDy = -edgeDy; - } - if (inPt.y < edgeLowPt.y || inPt.y > edgeHighPt.y) continue; - if (inPt.y === edgeLowPt.y) { - if (inPt.x === edgeLowPt.x) return true; - } else { - const perpEdge = edgeDy * (inPt.x - edgeLowPt.x) - edgeDx * (inPt.y - edgeLowPt.y); - if (perpEdge === 0) return true; - if (perpEdge < 0) continue; - inside = !inside; - } - } else { - if (inPt.y !== edgeLowPt.y) continue; - if (edgeHighPt.x <= inPt.x && inPt.x <= edgeLowPt.x || edgeLowPt.x <= inPt.x && inPt.x <= edgeHighPt.x) return true; + this.setIndex(indices); + this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + this.setAttribute("normal", new Float32BufferAttribute(normals, 3)); + this.setAttribute("uv", new Float32BufferAttribute(uvs, 2)); + function addShape(shape) { + const indexOffset = vertices.length / 3; + const points = shape.extractPoints(curveSegments); + let shapeVertices = points.shape; + const shapeHoles = points.holes; + if (ShapeUtils.isClockWise(shapeVertices) === false) { + shapeVertices = shapeVertices.reverse(); + } + for (let i = 0, l = shapeHoles.length; i < l; i++) { + const shapeHole = shapeHoles[i]; + if (ShapeUtils.isClockWise(shapeHole) === true) { + shapeHoles[i] = shapeHole.reverse(); } } - return inside; + const faces = ShapeUtils.triangulateShape(shapeVertices, shapeHoles); + for (let i = 0, l = shapeHoles.length; i < l; i++) { + const shapeHole = shapeHoles[i]; + shapeVertices = shapeVertices.concat(shapeHole); + } + for (let i = 0, l = shapeVertices.length; i < l; i++) { + const vertex2 = shapeVertices[i]; + vertices.push(vertex2.x, vertex2.y, 0); + normals.push(0, 0, 1); + uvs.push(vertex2.x, vertex2.y); + } + for (let i = 0, l = faces.length; i < l; i++) { + const face = faces[i]; + const a = face[0] + indexOffset; + const b = face[1] + indexOffset; + const c = face[2] + indexOffset; + indices.push(a, b, c); + groupCount += 3; + } } - __name(isPointInsidePolygon, "isPointInsidePolygon"); - const isClockWise = ShapeUtils.isClockWise; - const subPaths = this.subPaths; - if (subPaths.length === 0) return []; - let solid, tmpPath, tmpShape; - const shapes = []; - if (subPaths.length === 1) { - tmpPath = subPaths[0]; - tmpShape = new Shape(); - tmpShape.curves = tmpPath.curves; - shapes.push(tmpShape); - return shapes; + __name(addShape, "addShape"); + } + copy(source) { + super.copy(source); + this.parameters = Object.assign({}, source.parameters); + return this; + } + toJSON() { + const data = super.toJSON(); + const shapes = this.parameters.shapes; + return toJSON(shapes, data); + } + static fromJSON(data, shapes) { + const geometryShapes = []; + for (let j = 0, jl = data.shapes.length; j < jl; j++) { + const shape = shapes[data.shapes[j]]; + geometryShapes.push(shape); } - let holesFirst = !isClockWise(subPaths[0].getPoints()); - holesFirst = isCCW ? !holesFirst : holesFirst; - const betterShapeHoles = []; - const newShapes = []; - let newShapeHoles = []; - let mainIdx = 0; - let tmpPoints; - newShapes[mainIdx] = void 0; - newShapeHoles[mainIdx] = []; - for (let i = 0, l = subPaths.length; i < l; i++) { - tmpPath = subPaths[i]; - tmpPoints = tmpPath.getPoints(); - solid = isClockWise(tmpPoints); - solid = isCCW ? !solid : solid; - if (solid) { - if (!holesFirst && newShapes[mainIdx]) mainIdx++; - newShapes[mainIdx] = { s: new Shape(), p: tmpPoints }; - newShapes[mainIdx].s.curves = tmpPath.curves; - if (holesFirst) mainIdx++; - newShapeHoles[mainIdx] = []; - } else { - newShapeHoles[mainIdx].push({ h: tmpPath, p: tmpPoints[0] }); - } + return new ShapeGeometry(geometryShapes, data.curveSegments); + } +} +function toJSON(shapes, data) { + data.shapes = []; + if (Array.isArray(shapes)) { + for (let i = 0, l = shapes.length; i < l; i++) { + const shape = shapes[i]; + data.shapes.push(shape.uuid); } - if (!newShapes[0]) return toShapesNoHoles(subPaths); - if (newShapes.length > 1) { - let ambiguous = false; - let toChange = 0; - for (let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx++) { - betterShapeHoles[sIdx] = []; - } - for (let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx++) { - const sho = newShapeHoles[sIdx]; - for (let hIdx = 0; hIdx < sho.length; hIdx++) { - const ho = sho[hIdx]; - let hole_unassigned = true; - for (let s2Idx = 0; s2Idx < newShapes.length; s2Idx++) { - if (isPointInsidePolygon(ho.p, newShapes[s2Idx].p)) { - if (sIdx !== s2Idx) toChange++; - if (hole_unassigned) { - hole_unassigned = false; - betterShapeHoles[s2Idx].push(ho); - } else { - ambiguous = true; - } - } - } - if (hole_unassigned) { - betterShapeHoles[sIdx].push(ho); - } - } + } else { + data.shapes.push(shapes.uuid); + } + return data; +} +__name(toJSON, "toJSON"); +class SphereGeometry extends BufferGeometry { + static { + __name(this, "SphereGeometry"); + } + constructor(radius = 1, widthSegments = 32, heightSegments = 16, phiStart = 0, phiLength = Math.PI * 2, thetaStart = 0, thetaLength = Math.PI) { + super(); + this.type = "SphereGeometry"; + this.parameters = { + radius, + widthSegments, + heightSegments, + phiStart, + phiLength, + thetaStart, + thetaLength + }; + widthSegments = Math.max(3, Math.floor(widthSegments)); + heightSegments = Math.max(2, Math.floor(heightSegments)); + const thetaEnd = Math.min(thetaStart + thetaLength, Math.PI); + let index = 0; + const grid = []; + const vertex2 = new Vector3(); + const normal = new Vector3(); + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + for (let iy = 0; iy <= heightSegments; iy++) { + const verticesRow = []; + const v = iy / heightSegments; + let uOffset = 0; + if (iy === 0 && thetaStart === 0) { + uOffset = 0.5 / widthSegments; + } else if (iy === heightSegments && thetaEnd === Math.PI) { + uOffset = -0.5 / widthSegments; } - if (toChange > 0 && ambiguous === false) { - newShapeHoles = betterShapeHoles; + for (let ix = 0; ix <= widthSegments; ix++) { + const u = ix / widthSegments; + vertex2.x = -radius * Math.cos(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength); + vertex2.y = radius * Math.cos(thetaStart + v * thetaLength); + vertex2.z = radius * Math.sin(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength); + vertices.push(vertex2.x, vertex2.y, vertex2.z); + normal.copy(vertex2).normalize(); + normals.push(normal.x, normal.y, normal.z); + uvs.push(u + uOffset, 1 - v); + verticesRow.push(index++); } + grid.push(verticesRow); } - let tmpHoles; - for (let i = 0, il = newShapes.length; i < il; i++) { - tmpShape = newShapes[i].s; - shapes.push(tmpShape); - tmpHoles = newShapeHoles[i]; - for (let j = 0, jl = tmpHoles.length; j < jl; j++) { - tmpShape.holes.push(tmpHoles[j].h); + for (let iy = 0; iy < heightSegments; iy++) { + for (let ix = 0; ix < widthSegments; ix++) { + const a = grid[iy][ix + 1]; + const b = grid[iy][ix]; + const c = grid[iy + 1][ix]; + const d = grid[iy + 1][ix + 1]; + if (iy !== 0 || thetaStart > 0) indices.push(a, b, d); + if (iy !== heightSegments - 1 || thetaEnd < Math.PI) indices.push(b, c, d); } } - return shapes; - } -} -class Controls extends EventDispatcher { - static { - __name(this, "Controls"); - } - constructor(object, domElement = null) { - super(); - this.object = object; - this.domElement = domElement; - this.enabled = true; - this.state = -1; - this.keys = {}; - this.mouseButtons = { LEFT: null, MIDDLE: null, RIGHT: null }; - this.touches = { ONE: null, TWO: null }; - } - connect() { - } - disconnect() { + this.setIndex(indices); + this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + this.setAttribute("normal", new Float32BufferAttribute(normals, 3)); + this.setAttribute("uv", new Float32BufferAttribute(uvs, 2)); } - dispose() { + copy(source) { + super.copy(source); + this.parameters = Object.assign({}, source.parameters); + return this; } - update() { + static fromJSON(data) { + return new SphereGeometry(data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength); } } -class WebGLMultipleRenderTargets extends WebGLRenderTarget { +class TetrahedronGeometry extends PolyhedronGeometry { static { - __name(this, "WebGLMultipleRenderTargets"); - } - // @deprecated, r162 - constructor(width = 1, height = 1, count = 1, options = {}) { - console.warn('THREE.WebGLMultipleRenderTargets has been deprecated and will be removed in r172. Use THREE.WebGLRenderTarget and set the "count" parameter to enable MRT.'); - super(width, height, { ...options, count }); - this.isWebGLMultipleRenderTargets = true; + __name(this, "TetrahedronGeometry"); } - get texture() { - return this.textures; + constructor(radius = 1, detail = 0) { + const vertices = [ + 1, + 1, + 1, + -1, + -1, + 1, + -1, + 1, + -1, + 1, + -1, + -1 + ]; + const indices = [ + 2, + 1, + 0, + 0, + 3, + 2, + 1, + 3, + 0, + 2, + 3, + 1 + ]; + super(vertices, indices, radius, detail); + this.type = "TetrahedronGeometry"; + this.parameters = { + radius, + detail + }; } -} -if (typeof __THREE_DEVTOOLS__ !== "undefined") { - __THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register", { detail: { - revision: REVISION - } })); -} -if (typeof window !== "undefined") { - if (window.__THREE__) { - console.warn("WARNING: Multiple instances of Three.js being imported."); - } else { - window.__THREE__ = REVISION; + static fromJSON(data) { + return new TetrahedronGeometry(data.radius, data.detail); } } -const _changeEvent = { type: "change" }; -const _startEvent = { type: "start" }; -const _endEvent = { type: "end" }; -const _ray = new Ray(); -const _plane = new Plane(); -const _TILT_LIMIT = Math.cos(70 * MathUtils.DEG2RAD); -const _v = new Vector3(); -const _twoPI = 2 * Math.PI; -const _STATE = { - NONE: -1, - ROTATE: 0, - DOLLY: 1, - PAN: 2, - TOUCH_ROTATE: 3, - TOUCH_PAN: 4, - TOUCH_DOLLY_PAN: 5, - TOUCH_DOLLY_ROTATE: 6 -}; -const _EPS = 1e-6; -class OrbitControls extends Controls { +class TorusGeometry extends BufferGeometry { static { - __name(this, "OrbitControls"); + __name(this, "TorusGeometry"); } - constructor(object, domElement = null) { - super(object, domElement); - this.state = _STATE.NONE; - this.enabled = true; - this.target = new Vector3(); - this.cursor = new Vector3(); - this.minDistance = 0; - this.maxDistance = Infinity; - this.minZoom = 0; - this.maxZoom = Infinity; - this.minTargetRadius = 0; - this.maxTargetRadius = Infinity; - this.minPolarAngle = 0; - this.maxPolarAngle = Math.PI; - this.minAzimuthAngle = -Infinity; - this.maxAzimuthAngle = Infinity; - this.enableDamping = false; - this.dampingFactor = 0.05; - this.enableZoom = true; - this.zoomSpeed = 1; - this.enableRotate = true; - this.rotateSpeed = 1; - this.enablePan = true; - this.panSpeed = 1; - this.screenSpacePanning = true; - this.keyPanSpeed = 7; - this.zoomToCursor = false; - this.autoRotate = false; - this.autoRotateSpeed = 2; - this.keys = { LEFT: "ArrowLeft", UP: "ArrowUp", RIGHT: "ArrowRight", BOTTOM: "ArrowDown" }; - this.mouseButtons = { LEFT: MOUSE.ROTATE, MIDDLE: MOUSE.DOLLY, RIGHT: MOUSE.PAN }; - this.touches = { ONE: TOUCH.ROTATE, TWO: TOUCH.DOLLY_PAN }; - this.target0 = this.target.clone(); - this.position0 = this.object.position.clone(); - this.zoom0 = this.object.zoom; - this._domElementKeyEvents = null; - this._lastPosition = new Vector3(); - this._lastQuaternion = new Quaternion(); - this._lastTargetPosition = new Vector3(); - this._quat = new Quaternion().setFromUnitVectors(object.up, new Vector3(0, 1, 0)); - this._quatInverse = this._quat.clone().invert(); - this._spherical = new Spherical(); - this._sphericalDelta = new Spherical(); - this._scale = 1; - this._panOffset = new Vector3(); - this._rotateStart = new Vector2(); - this._rotateEnd = new Vector2(); - this._rotateDelta = new Vector2(); - this._panStart = new Vector2(); - this._panEnd = new Vector2(); - this._panDelta = new Vector2(); - this._dollyStart = new Vector2(); - this._dollyEnd = new Vector2(); - this._dollyDelta = new Vector2(); - this._dollyDirection = new Vector3(); - this._mouse = new Vector2(); - this._performCursorZoom = false; - this._pointers = []; - this._pointerPositions = {}; - this._controlActive = false; - this._onPointerMove = onPointerMove.bind(this); - this._onPointerDown = onPointerDown.bind(this); - this._onPointerUp = onPointerUp.bind(this); - this._onContextMenu = onContextMenu.bind(this); - this._onMouseWheel = onMouseWheel.bind(this); - this._onKeyDown = onKeyDown.bind(this); - this._onTouchStart = onTouchStart.bind(this); - this._onTouchMove = onTouchMove.bind(this); - this._onMouseDown = onMouseDown.bind(this); - this._onMouseMove = onMouseMove.bind(this); - this._interceptControlDown = interceptControlDown.bind(this); - this._interceptControlUp = interceptControlUp.bind(this); - if (this.domElement !== null) { - this.connect(); + constructor(radius = 1, tube = 0.4, radialSegments = 12, tubularSegments = 48, arc = Math.PI * 2) { + super(); + this.type = "TorusGeometry"; + this.parameters = { + radius, + tube, + radialSegments, + tubularSegments, + arc + }; + radialSegments = Math.floor(radialSegments); + tubularSegments = Math.floor(tubularSegments); + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + const center = new Vector3(); + const vertex2 = new Vector3(); + const normal = new Vector3(); + for (let j = 0; j <= radialSegments; j++) { + for (let i = 0; i <= tubularSegments; i++) { + const u = i / tubularSegments * arc; + const v = j / radialSegments * Math.PI * 2; + vertex2.x = (radius + tube * Math.cos(v)) * Math.cos(u); + vertex2.y = (radius + tube * Math.cos(v)) * Math.sin(u); + vertex2.z = tube * Math.sin(v); + vertices.push(vertex2.x, vertex2.y, vertex2.z); + center.x = radius * Math.cos(u); + center.y = radius * Math.sin(u); + normal.subVectors(vertex2, center).normalize(); + normals.push(normal.x, normal.y, normal.z); + uvs.push(i / tubularSegments); + uvs.push(j / radialSegments); + } } - this.update(); - } - connect() { - this.domElement.addEventListener("pointerdown", this._onPointerDown); - this.domElement.addEventListener("pointercancel", this._onPointerUp); - this.domElement.addEventListener("contextmenu", this._onContextMenu); - this.domElement.addEventListener("wheel", this._onMouseWheel, { passive: false }); - const document2 = this.domElement.getRootNode(); - document2.addEventListener("keydown", this._interceptControlDown, { passive: true, capture: true }); - this.domElement.style.touchAction = "none"; - } - disconnect() { - this.domElement.removeEventListener("pointerdown", this._onPointerDown); - this.domElement.removeEventListener("pointermove", this._onPointerMove); - this.domElement.removeEventListener("pointerup", this._onPointerUp); - this.domElement.removeEventListener("pointercancel", this._onPointerUp); - this.domElement.removeEventListener("wheel", this._onMouseWheel); - this.domElement.removeEventListener("contextmenu", this._onContextMenu); - this.stopListenToKeyEvents(); - const document2 = this.domElement.getRootNode(); - document2.removeEventListener("keydown", this._interceptControlDown, { capture: true }); - this.domElement.style.touchAction = "auto"; - } - dispose() { - this.disconnect(); - } - getPolarAngle() { - return this._spherical.phi; - } - getAzimuthalAngle() { - return this._spherical.theta; - } - getDistance() { - return this.object.position.distanceTo(this.target); - } - listenToKeyEvents(domElement) { - domElement.addEventListener("keydown", this._onKeyDown); - this._domElementKeyEvents = domElement; - } - stopListenToKeyEvents() { - if (this._domElementKeyEvents !== null) { - this._domElementKeyEvents.removeEventListener("keydown", this._onKeyDown); - this._domElementKeyEvents = null; + for (let j = 1; j <= radialSegments; j++) { + for (let i = 1; i <= tubularSegments; i++) { + const a = (tubularSegments + 1) * j + i - 1; + const b = (tubularSegments + 1) * (j - 1) + i - 1; + const c = (tubularSegments + 1) * (j - 1) + i; + const d = (tubularSegments + 1) * j + i; + indices.push(a, b, d); + indices.push(b, c, d); + } } + this.setIndex(indices); + this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + this.setAttribute("normal", new Float32BufferAttribute(normals, 3)); + this.setAttribute("uv", new Float32BufferAttribute(uvs, 2)); } - saveState() { - this.target0.copy(this.target); - this.position0.copy(this.object.position); - this.zoom0 = this.object.zoom; + copy(source) { + super.copy(source); + this.parameters = Object.assign({}, source.parameters); + return this; } - reset() { - this.target.copy(this.target0); - this.object.position.copy(this.position0); - this.object.zoom = this.zoom0; - this.object.updateProjectionMatrix(); - this.dispatchEvent(_changeEvent); - this.update(); - this.state = _STATE.NONE; + static fromJSON(data) { + return new TorusGeometry(data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc); } - update(deltaTime = null) { - const position = this.object.position; - _v.copy(position).sub(this.target); - _v.applyQuaternion(this._quat); - this._spherical.setFromVector3(_v); - if (this.autoRotate && this.state === _STATE.NONE) { - this._rotateLeft(this._getAutoRotationAngle(deltaTime)); - } - if (this.enableDamping) { - this._spherical.theta += this._sphericalDelta.theta * this.dampingFactor; - this._spherical.phi += this._sphericalDelta.phi * this.dampingFactor; - } else { - this._spherical.theta += this._sphericalDelta.theta; - this._spherical.phi += this._sphericalDelta.phi; - } - let min = this.minAzimuthAngle; - let max2 = this.maxAzimuthAngle; - if (isFinite(min) && isFinite(max2)) { - if (min < -Math.PI) min += _twoPI; - else if (min > Math.PI) min -= _twoPI; - if (max2 < -Math.PI) max2 += _twoPI; - else if (max2 > Math.PI) max2 -= _twoPI; - if (min <= max2) { - this._spherical.theta = Math.max(min, Math.min(max2, this._spherical.theta)); - } else { - this._spherical.theta = this._spherical.theta > (min + max2) / 2 ? Math.max(min, this._spherical.theta) : Math.min(max2, this._spherical.theta); +} +class TorusKnotGeometry extends BufferGeometry { + static { + __name(this, "TorusKnotGeometry"); + } + constructor(radius = 1, tube = 0.4, tubularSegments = 64, radialSegments = 8, p = 2, q = 3) { + super(); + this.type = "TorusKnotGeometry"; + this.parameters = { + radius, + tube, + tubularSegments, + radialSegments, + p, + q + }; + tubularSegments = Math.floor(tubularSegments); + radialSegments = Math.floor(radialSegments); + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + const vertex2 = new Vector3(); + const normal = new Vector3(); + const P1 = new Vector3(); + const P2 = new Vector3(); + const B = new Vector3(); + const T = new Vector3(); + const N = new Vector3(); + for (let i = 0; i <= tubularSegments; ++i) { + const u = i / tubularSegments * p * Math.PI * 2; + calculatePositionOnCurve(u, p, q, radius, P1); + calculatePositionOnCurve(u + 0.01, p, q, radius, P2); + T.subVectors(P2, P1); + N.addVectors(P2, P1); + B.crossVectors(T, N); + N.crossVectors(B, T); + B.normalize(); + N.normalize(); + for (let j = 0; j <= radialSegments; ++j) { + const v = j / radialSegments * Math.PI * 2; + const cx = -tube * Math.cos(v); + const cy = tube * Math.sin(v); + vertex2.x = P1.x + (cx * N.x + cy * B.x); + vertex2.y = P1.y + (cx * N.y + cy * B.y); + vertex2.z = P1.z + (cx * N.z + cy * B.z); + vertices.push(vertex2.x, vertex2.y, vertex2.z); + normal.subVectors(vertex2, P1).normalize(); + normals.push(normal.x, normal.y, normal.z); + uvs.push(i / tubularSegments); + uvs.push(j / radialSegments); } } - this._spherical.phi = Math.max(this.minPolarAngle, Math.min(this.maxPolarAngle, this._spherical.phi)); - this._spherical.makeSafe(); - if (this.enableDamping === true) { - this.target.addScaledVector(this._panOffset, this.dampingFactor); - } else { - this.target.add(this._panOffset); - } - this.target.sub(this.cursor); - this.target.clampLength(this.minTargetRadius, this.maxTargetRadius); - this.target.add(this.cursor); - let zoomChanged = false; - if (this.zoomToCursor && this._performCursorZoom || this.object.isOrthographicCamera) { - this._spherical.radius = this._clampDistance(this._spherical.radius); - } else { - const prevRadius = this._spherical.radius; - this._spherical.radius = this._clampDistance(this._spherical.radius * this._scale); - zoomChanged = prevRadius != this._spherical.radius; + for (let j = 1; j <= tubularSegments; j++) { + for (let i = 1; i <= radialSegments; i++) { + const a = (radialSegments + 1) * (j - 1) + (i - 1); + const b = (radialSegments + 1) * j + (i - 1); + const c = (radialSegments + 1) * j + i; + const d = (radialSegments + 1) * (j - 1) + i; + indices.push(a, b, d); + indices.push(b, c, d); + } } - _v.setFromSpherical(this._spherical); - _v.applyQuaternion(this._quatInverse); - position.copy(this.target).add(_v); - this.object.lookAt(this.target); - if (this.enableDamping === true) { - this._sphericalDelta.theta *= 1 - this.dampingFactor; - this._sphericalDelta.phi *= 1 - this.dampingFactor; - this._panOffset.multiplyScalar(1 - this.dampingFactor); - } else { - this._sphericalDelta.set(0, 0, 0); - this._panOffset.set(0, 0, 0); + this.setIndex(indices); + this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + this.setAttribute("normal", new Float32BufferAttribute(normals, 3)); + this.setAttribute("uv", new Float32BufferAttribute(uvs, 2)); + function calculatePositionOnCurve(u, p2, q2, radius2, position) { + const cu = Math.cos(u); + const su = Math.sin(u); + const quOverP = q2 / p2 * u; + const cs = Math.cos(quOverP); + position.x = radius2 * (2 + cs) * 0.5 * cu; + position.y = radius2 * (2 + cs) * su * 0.5; + position.z = radius2 * Math.sin(quOverP) * 0.5; } - if (this.zoomToCursor && this._performCursorZoom) { - let newRadius = null; - if (this.object.isPerspectiveCamera) { - const prevRadius = _v.length(); - newRadius = this._clampDistance(prevRadius * this._scale); - const radiusDelta = prevRadius - newRadius; - this.object.position.addScaledVector(this._dollyDirection, radiusDelta); - this.object.updateMatrixWorld(); - zoomChanged = !!radiusDelta; - } else if (this.object.isOrthographicCamera) { - const mouseBefore = new Vector3(this._mouse.x, this._mouse.y, 0); - mouseBefore.unproject(this.object); - const prevZoom = this.object.zoom; - this.object.zoom = Math.max(this.minZoom, Math.min(this.maxZoom, this.object.zoom / this._scale)); - this.object.updateProjectionMatrix(); - zoomChanged = prevZoom !== this.object.zoom; - const mouseAfter = new Vector3(this._mouse.x, this._mouse.y, 0); - mouseAfter.unproject(this.object); - this.object.position.sub(mouseAfter).add(mouseBefore); - this.object.updateMatrixWorld(); - newRadius = _v.length(); - } else { - console.warn("WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled."); - this.zoomToCursor = false; - } - if (newRadius !== null) { - if (this.screenSpacePanning) { - this.target.set(0, 0, -1).transformDirection(this.object.matrix).multiplyScalar(newRadius).add(this.object.position); - } else { - _ray.origin.copy(this.object.position); - _ray.direction.set(0, 0, -1).transformDirection(this.object.matrix); - if (Math.abs(this.object.up.dot(_ray.direction)) < _TILT_LIMIT) { - this.object.lookAt(this.target); - } else { - _plane.setFromNormalAndCoplanarPoint(this.object.up, this.target); - _ray.intersectPlane(_plane, this.target); - } - } + __name(calculatePositionOnCurve, "calculatePositionOnCurve"); + } + copy(source) { + super.copy(source); + this.parameters = Object.assign({}, source.parameters); + return this; + } + static fromJSON(data) { + return new TorusKnotGeometry(data.radius, data.tube, data.tubularSegments, data.radialSegments, data.p, data.q); + } +} +class TubeGeometry extends BufferGeometry { + static { + __name(this, "TubeGeometry"); + } + constructor(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) { + super(); + this.type = "TubeGeometry"; + this.parameters = { + path, + tubularSegments, + radius, + radialSegments, + closed + }; + const frames = path.computeFrenetFrames(tubularSegments, closed); + this.tangents = frames.tangents; + this.normals = frames.normals; + this.binormals = frames.binormals; + const vertex2 = new Vector3(); + const normal = new Vector3(); + const uv = new Vector2(); + let P = new Vector3(); + const vertices = []; + const normals = []; + const uvs = []; + const indices = []; + generateBufferData(); + this.setIndex(indices); + this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + this.setAttribute("normal", new Float32BufferAttribute(normals, 3)); + this.setAttribute("uv", new Float32BufferAttribute(uvs, 2)); + function generateBufferData() { + for (let i = 0; i < tubularSegments; i++) { + generateSegment(i); } - } else if (this.object.isOrthographicCamera) { - const prevZoom = this.object.zoom; - this.object.zoom = Math.max(this.minZoom, Math.min(this.maxZoom, this.object.zoom / this._scale)); - if (prevZoom !== this.object.zoom) { - this.object.updateProjectionMatrix(); - zoomChanged = true; + generateSegment(closed === false ? tubularSegments : 0); + generateUVs(); + generateIndices(); + } + __name(generateBufferData, "generateBufferData"); + function generateSegment(i) { + P = path.getPointAt(i / tubularSegments, P); + const N = frames.normals[i]; + const B = frames.binormals[i]; + for (let j = 0; j <= radialSegments; j++) { + const v = j / radialSegments * Math.PI * 2; + const sin = Math.sin(v); + const cos = -Math.cos(v); + normal.x = cos * N.x + sin * B.x; + normal.y = cos * N.y + sin * B.y; + normal.z = cos * N.z + sin * B.z; + normal.normalize(); + normals.push(normal.x, normal.y, normal.z); + vertex2.x = P.x + radius * normal.x; + vertex2.y = P.y + radius * normal.y; + vertex2.z = P.z + radius * normal.z; + vertices.push(vertex2.x, vertex2.y, vertex2.z); } } - this._scale = 1; - this._performCursorZoom = false; - if (zoomChanged || this._lastPosition.distanceToSquared(this.object.position) > _EPS || 8 * (1 - this._lastQuaternion.dot(this.object.quaternion)) > _EPS || this._lastTargetPosition.distanceToSquared(this.target) > _EPS) { - this.dispatchEvent(_changeEvent); - this._lastPosition.copy(this.object.position); - this._lastQuaternion.copy(this.object.quaternion); - this._lastTargetPosition.copy(this.target); - return true; + __name(generateSegment, "generateSegment"); + function generateIndices() { + for (let j = 1; j <= tubularSegments; j++) { + for (let i = 1; i <= radialSegments; i++) { + const a = (radialSegments + 1) * (j - 1) + (i - 1); + const b = (radialSegments + 1) * j + (i - 1); + const c = (radialSegments + 1) * j + i; + const d = (radialSegments + 1) * (j - 1) + i; + indices.push(a, b, d); + indices.push(b, c, d); + } + } } - return false; - } - _getAutoRotationAngle(deltaTime) { - if (deltaTime !== null) { - return _twoPI / 60 * this.autoRotateSpeed * deltaTime; - } else { - return _twoPI / 60 / 60 * this.autoRotateSpeed; + __name(generateIndices, "generateIndices"); + function generateUVs() { + for (let i = 0; i <= tubularSegments; i++) { + for (let j = 0; j <= radialSegments; j++) { + uv.x = i / tubularSegments; + uv.y = j / radialSegments; + uvs.push(uv.x, uv.y); + } + } } + __name(generateUVs, "generateUVs"); } - _getZoomScale(delta) { - const normalizedDelta = Math.abs(delta * 0.01); - return Math.pow(0.95, this.zoomSpeed * normalizedDelta); - } - _rotateLeft(angle) { - this._sphericalDelta.theta -= angle; + copy(source) { + super.copy(source); + this.parameters = Object.assign({}, source.parameters); + return this; } - _rotateUp(angle) { - this._sphericalDelta.phi -= angle; + toJSON() { + const data = super.toJSON(); + data.path = this.parameters.path.toJSON(); + return data; } - _panLeft(distance, objectMatrix) { - _v.setFromMatrixColumn(objectMatrix, 0); - _v.multiplyScalar(-distance); - this._panOffset.add(_v); + static fromJSON(data) { + return new TubeGeometry( + new Curves[data.path.type]().fromJSON(data.path), + data.tubularSegments, + data.radius, + data.radialSegments, + data.closed + ); } - _panUp(distance, objectMatrix) { - if (this.screenSpacePanning === true) { - _v.setFromMatrixColumn(objectMatrix, 1); - } else { - _v.setFromMatrixColumn(objectMatrix, 0); - _v.crossVectors(this.object.up, _v); - } - _v.multiplyScalar(distance); - this._panOffset.add(_v); +} +class WireframeGeometry extends BufferGeometry { + static { + __name(this, "WireframeGeometry"); } - // deltaX and deltaY are in pixels; right and down are positive - _pan(deltaX, deltaY) { - const element = this.domElement; - if (this.object.isPerspectiveCamera) { - const position = this.object.position; - _v.copy(position).sub(this.target); - let targetDistance = _v.length(); - targetDistance *= Math.tan(this.object.fov / 2 * Math.PI / 180); - this._panLeft(2 * deltaX * targetDistance / element.clientHeight, this.object.matrix); - this._panUp(2 * deltaY * targetDistance / element.clientHeight, this.object.matrix); - } else if (this.object.isOrthographicCamera) { - this._panLeft(deltaX * (this.object.right - this.object.left) / this.object.zoom / element.clientWidth, this.object.matrix); - this._panUp(deltaY * (this.object.top - this.object.bottom) / this.object.zoom / element.clientHeight, this.object.matrix); - } else { - console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."); - this.enablePan = false; + constructor(geometry = null) { + super(); + this.type = "WireframeGeometry"; + this.parameters = { + geometry + }; + if (geometry !== null) { + const vertices = []; + const edges = /* @__PURE__ */ new Set(); + const start = new Vector3(); + const end = new Vector3(); + if (geometry.index !== null) { + const position = geometry.attributes.position; + const indices = geometry.index; + let groups = geometry.groups; + if (groups.length === 0) { + groups = [{ start: 0, count: indices.count, materialIndex: 0 }]; + } + for (let o = 0, ol = groups.length; o < ol; ++o) { + const group = groups[o]; + const groupStart = group.start; + const groupCount = group.count; + for (let i = groupStart, l = groupStart + groupCount; i < l; i += 3) { + for (let j = 0; j < 3; j++) { + const index1 = indices.getX(i + j); + const index2 = indices.getX(i + (j + 1) % 3); + start.fromBufferAttribute(position, index1); + end.fromBufferAttribute(position, index2); + if (isUniqueEdge(start, end, edges) === true) { + vertices.push(start.x, start.y, start.z); + vertices.push(end.x, end.y, end.z); + } + } + } + } + } else { + const position = geometry.attributes.position; + for (let i = 0, l = position.count / 3; i < l; i++) { + for (let j = 0; j < 3; j++) { + const index1 = 3 * i + j; + const index2 = 3 * i + (j + 1) % 3; + start.fromBufferAttribute(position, index1); + end.fromBufferAttribute(position, index2); + if (isUniqueEdge(start, end, edges) === true) { + vertices.push(start.x, start.y, start.z); + vertices.push(end.x, end.y, end.z); + } + } + } + } + this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); } } - _dollyOut(dollyScale) { - if (this.object.isPerspectiveCamera || this.object.isOrthographicCamera) { - this._scale /= dollyScale; - } else { - console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."); - this.enableZoom = false; - } + copy(source) { + super.copy(source); + this.parameters = Object.assign({}, source.parameters); + return this; } - _dollyIn(dollyScale) { - if (this.object.isPerspectiveCamera || this.object.isOrthographicCamera) { - this._scale *= dollyScale; - } else { - console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."); - this.enableZoom = false; - } +} +function isUniqueEdge(start, end, edges) { + const hash1 = `${start.x},${start.y},${start.z}-${end.x},${end.y},${end.z}`; + const hash2 = `${end.x},${end.y},${end.z}-${start.x},${start.y},${start.z}`; + if (edges.has(hash1) === true || edges.has(hash2) === true) { + return false; + } else { + edges.add(hash1); + edges.add(hash2); + return true; } - _updateZoomParameters(x, y) { - if (!this.zoomToCursor) { - return; - } - this._performCursorZoom = true; - const rect = this.domElement.getBoundingClientRect(); - const dx = x - rect.left; - const dy = y - rect.top; - const w = rect.width; - const h = rect.height; - this._mouse.x = dx / w * 2 - 1; - this._mouse.y = -(dy / h) * 2 + 1; - this._dollyDirection.set(this._mouse.x, this._mouse.y, 1).unproject(this.object).sub(this.object.position).normalize(); +} +__name(isUniqueEdge, "isUniqueEdge"); +var Geometries = /* @__PURE__ */ Object.freeze({ + __proto__: null, + BoxGeometry, + CapsuleGeometry, + CircleGeometry, + ConeGeometry, + CylinderGeometry, + DodecahedronGeometry, + EdgesGeometry, + ExtrudeGeometry, + IcosahedronGeometry, + LatheGeometry, + OctahedronGeometry, + PlaneGeometry, + PolyhedronGeometry, + RingGeometry, + ShapeGeometry, + SphereGeometry, + TetrahedronGeometry, + TorusGeometry, + TorusKnotGeometry, + TubeGeometry, + WireframeGeometry +}); +class ShadowMaterial extends Material { + static { + __name(this, "ShadowMaterial"); } - _clampDistance(dist) { - return Math.max(this.minDistance, Math.min(this.maxDistance, dist)); + static get type() { + return "ShadowMaterial"; } - // - // event callbacks - update the object state - // - _handleMouseDownRotate(event) { - this._rotateStart.set(event.clientX, event.clientY); + constructor(parameters) { + super(); + this.isShadowMaterial = true; + this.color = new Color(0); + this.transparent = true; + this.fog = true; + this.setValues(parameters); } - _handleMouseDownDolly(event) { - this._updateZoomParameters(event.clientX, event.clientX); - this._dollyStart.set(event.clientX, event.clientY); + copy(source) { + super.copy(source); + this.color.copy(source.color); + this.fog = source.fog; + return this; } - _handleMouseDownPan(event) { - this._panStart.set(event.clientX, event.clientY); +} +class RawShaderMaterial extends ShaderMaterial { + static { + __name(this, "RawShaderMaterial"); } - _handleMouseMoveRotate(event) { - this._rotateEnd.set(event.clientX, event.clientY); - this._rotateDelta.subVectors(this._rotateEnd, this._rotateStart).multiplyScalar(this.rotateSpeed); - const element = this.domElement; - this._rotateLeft(_twoPI * this._rotateDelta.x / element.clientHeight); - this._rotateUp(_twoPI * this._rotateDelta.y / element.clientHeight); - this._rotateStart.copy(this._rotateEnd); - this.update(); + static get type() { + return "RawShaderMaterial"; } - _handleMouseMoveDolly(event) { - this._dollyEnd.set(event.clientX, event.clientY); - this._dollyDelta.subVectors(this._dollyEnd, this._dollyStart); - if (this._dollyDelta.y > 0) { - this._dollyOut(this._getZoomScale(this._dollyDelta.y)); - } else if (this._dollyDelta.y < 0) { - this._dollyIn(this._getZoomScale(this._dollyDelta.y)); - } - this._dollyStart.copy(this._dollyEnd); - this.update(); + constructor(parameters) { + super(parameters); + this.isRawShaderMaterial = true; } - _handleMouseMovePan(event) { - this._panEnd.set(event.clientX, event.clientY); - this._panDelta.subVectors(this._panEnd, this._panStart).multiplyScalar(this.panSpeed); - this._pan(this._panDelta.x, this._panDelta.y); - this._panStart.copy(this._panEnd); - this.update(); +} +class MeshStandardMaterial extends Material { + static { + __name(this, "MeshStandardMaterial"); } - _handleMouseWheel(event) { - this._updateZoomParameters(event.clientX, event.clientY); - if (event.deltaY < 0) { - this._dollyIn(this._getZoomScale(event.deltaY)); - } else if (event.deltaY > 0) { - this._dollyOut(this._getZoomScale(event.deltaY)); - } - this.update(); + static get type() { + return "MeshStandardMaterial"; } - _handleKeyDown(event) { - let needsUpdate = false; - switch (event.code) { - case this.keys.UP: - if (event.ctrlKey || event.metaKey || event.shiftKey) { - this._rotateUp(_twoPI * this.rotateSpeed / this.domElement.clientHeight); - } else { - this._pan(0, this.keyPanSpeed); - } - needsUpdate = true; - break; - case this.keys.BOTTOM: - if (event.ctrlKey || event.metaKey || event.shiftKey) { - this._rotateUp(-_twoPI * this.rotateSpeed / this.domElement.clientHeight); - } else { - this._pan(0, -this.keyPanSpeed); - } - needsUpdate = true; - break; - case this.keys.LEFT: - if (event.ctrlKey || event.metaKey || event.shiftKey) { - this._rotateLeft(_twoPI * this.rotateSpeed / this.domElement.clientHeight); - } else { - this._pan(this.keyPanSpeed, 0); - } - needsUpdate = true; - break; - case this.keys.RIGHT: - if (event.ctrlKey || event.metaKey || event.shiftKey) { - this._rotateLeft(-_twoPI * this.rotateSpeed / this.domElement.clientHeight); - } else { - this._pan(-this.keyPanSpeed, 0); - } - needsUpdate = true; - break; - } - if (needsUpdate) { - event.preventDefault(); - this.update(); - } + constructor(parameters) { + super(); + this.isMeshStandardMaterial = true; + this.defines = { "STANDARD": "" }; + this.color = new Color(16777215); + this.roughness = 1; + this.metalness = 0; + this.map = null; + this.lightMap = null; + this.lightMapIntensity = 1; + this.aoMap = null; + this.aoMapIntensity = 1; + this.emissive = new Color(0); + this.emissiveIntensity = 1; + this.emissiveMap = null; + this.bumpMap = null; + this.bumpScale = 1; + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2(1, 1); + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + this.roughnessMap = null; + this.metalnessMap = null; + this.alphaMap = null; + this.envMap = null; + this.envMapRotation = new Euler(); + this.envMapIntensity = 1; + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = "round"; + this.wireframeLinejoin = "round"; + this.flatShading = false; + this.fog = true; + this.setValues(parameters); } - _handleTouchStartRotate(event) { - if (this._pointers.length === 1) { - this._rotateStart.set(event.pageX, event.pageY); - } else { - const position = this._getSecondPointerPosition(event); - const x = 0.5 * (event.pageX + position.x); - const y = 0.5 * (event.pageY + position.y); - this._rotateStart.set(x, y); - } + copy(source) { + super.copy(source); + this.defines = { "STANDARD": "" }; + this.color.copy(source.color); + this.roughness = source.roughness; + this.metalness = source.metalness; + this.map = source.map; + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + this.emissive.copy(source.emissive); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy(source.normalScale); + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + this.roughnessMap = source.roughnessMap; + this.metalnessMap = source.metalnessMap; + this.alphaMap = source.alphaMap; + this.envMap = source.envMap; + this.envMapRotation.copy(source.envMapRotation); + this.envMapIntensity = source.envMapIntensity; + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + this.flatShading = source.flatShading; + this.fog = source.fog; + return this; } - _handleTouchStartPan(event) { - if (this._pointers.length === 1) { - this._panStart.set(event.pageX, event.pageY); - } else { - const position = this._getSecondPointerPosition(event); - const x = 0.5 * (event.pageX + position.x); - const y = 0.5 * (event.pageY + position.y); - this._panStart.set(x, y); - } +} +class MeshPhysicalMaterial extends MeshStandardMaterial { + static { + __name(this, "MeshPhysicalMaterial"); } - _handleTouchStartDolly(event) { - const position = this._getSecondPointerPosition(event); - const dx = event.pageX - position.x; - const dy = event.pageY - position.y; - const distance = Math.sqrt(dx * dx + dy * dy); - this._dollyStart.set(0, distance); + static get type() { + return "MeshPhysicalMaterial"; } - _handleTouchStartDollyPan(event) { - if (this.enableZoom) this._handleTouchStartDolly(event); - if (this.enablePan) this._handleTouchStartPan(event); + constructor(parameters) { + super(); + this.isMeshPhysicalMaterial = true; + this.defines = { + "STANDARD": "", + "PHYSICAL": "" + }; + this.anisotropyRotation = 0; + this.anisotropyMap = null; + this.clearcoatMap = null; + this.clearcoatRoughness = 0; + this.clearcoatRoughnessMap = null; + this.clearcoatNormalScale = new Vector2(1, 1); + this.clearcoatNormalMap = null; + this.ior = 1.5; + Object.defineProperty(this, "reflectivity", { + get: /* @__PURE__ */ __name(function() { + return clamp(2.5 * (this.ior - 1) / (this.ior + 1), 0, 1); + }, "get"), + set: /* @__PURE__ */ __name(function(reflectivity) { + this.ior = (1 + 0.4 * reflectivity) / (1 - 0.4 * reflectivity); + }, "set") + }); + this.iridescenceMap = null; + this.iridescenceIOR = 1.3; + this.iridescenceThicknessRange = [100, 400]; + this.iridescenceThicknessMap = null; + this.sheenColor = new Color(0); + this.sheenColorMap = null; + this.sheenRoughness = 1; + this.sheenRoughnessMap = null; + this.transmissionMap = null; + this.thickness = 0; + this.thicknessMap = null; + this.attenuationDistance = Infinity; + this.attenuationColor = new Color(1, 1, 1); + this.specularIntensity = 1; + this.specularIntensityMap = null; + this.specularColor = new Color(1, 1, 1); + this.specularColorMap = null; + this._anisotropy = 0; + this._clearcoat = 0; + this._dispersion = 0; + this._iridescence = 0; + this._sheen = 0; + this._transmission = 0; + this.setValues(parameters); } - _handleTouchStartDollyRotate(event) { - if (this.enableZoom) this._handleTouchStartDolly(event); - if (this.enableRotate) this._handleTouchStartRotate(event); + get anisotropy() { + return this._anisotropy; } - _handleTouchMoveRotate(event) { - if (this._pointers.length == 1) { - this._rotateEnd.set(event.pageX, event.pageY); - } else { - const position = this._getSecondPointerPosition(event); - const x = 0.5 * (event.pageX + position.x); - const y = 0.5 * (event.pageY + position.y); - this._rotateEnd.set(x, y); + set anisotropy(value) { + if (this._anisotropy > 0 !== value > 0) { + this.version++; } - this._rotateDelta.subVectors(this._rotateEnd, this._rotateStart).multiplyScalar(this.rotateSpeed); - const element = this.domElement; - this._rotateLeft(_twoPI * this._rotateDelta.x / element.clientHeight); - this._rotateUp(_twoPI * this._rotateDelta.y / element.clientHeight); - this._rotateStart.copy(this._rotateEnd); + this._anisotropy = value; } - _handleTouchMovePan(event) { - if (this._pointers.length === 1) { - this._panEnd.set(event.pageX, event.pageY); - } else { - const position = this._getSecondPointerPosition(event); - const x = 0.5 * (event.pageX + position.x); - const y = 0.5 * (event.pageY + position.y); - this._panEnd.set(x, y); - } - this._panDelta.subVectors(this._panEnd, this._panStart).multiplyScalar(this.panSpeed); - this._pan(this._panDelta.x, this._panDelta.y); - this._panStart.copy(this._panEnd); + get clearcoat() { + return this._clearcoat; } - _handleTouchMoveDolly(event) { - const position = this._getSecondPointerPosition(event); - const dx = event.pageX - position.x; - const dy = event.pageY - position.y; - const distance = Math.sqrt(dx * dx + dy * dy); - this._dollyEnd.set(0, distance); - this._dollyDelta.set(0, Math.pow(this._dollyEnd.y / this._dollyStart.y, this.zoomSpeed)); - this._dollyOut(this._dollyDelta.y); - this._dollyStart.copy(this._dollyEnd); - const centerX = (event.pageX + position.x) * 0.5; - const centerY = (event.pageY + position.y) * 0.5; - this._updateZoomParameters(centerX, centerY); + set clearcoat(value) { + if (this._clearcoat > 0 !== value > 0) { + this.version++; + } + this._clearcoat = value; } - _handleTouchMoveDollyPan(event) { - if (this.enableZoom) this._handleTouchMoveDolly(event); - if (this.enablePan) this._handleTouchMovePan(event); + get iridescence() { + return this._iridescence; } - _handleTouchMoveDollyRotate(event) { - if (this.enableZoom) this._handleTouchMoveDolly(event); - if (this.enableRotate) this._handleTouchMoveRotate(event); + set iridescence(value) { + if (this._iridescence > 0 !== value > 0) { + this.version++; + } + this._iridescence = value; } - // pointers - _addPointer(event) { - this._pointers.push(event.pointerId); + get dispersion() { + return this._dispersion; } - _removePointer(event) { - delete this._pointerPositions[event.pointerId]; - for (let i = 0; i < this._pointers.length; i++) { - if (this._pointers[i] == event.pointerId) { - this._pointers.splice(i, 1); - return; - } + set dispersion(value) { + if (this._dispersion > 0 !== value > 0) { + this.version++; } + this._dispersion = value; } - _isTrackingPointer(event) { - for (let i = 0; i < this._pointers.length; i++) { - if (this._pointers[i] == event.pointerId) return true; - } - return false; + get sheen() { + return this._sheen; } - _trackPointer(event) { - let position = this._pointerPositions[event.pointerId]; - if (position === void 0) { - position = new Vector2(); - this._pointerPositions[event.pointerId] = position; + set sheen(value) { + if (this._sheen > 0 !== value > 0) { + this.version++; } - position.set(event.pageX, event.pageY); + this._sheen = value; } - _getSecondPointerPosition(event) { - const pointerId = event.pointerId === this._pointers[0] ? this._pointers[1] : this._pointers[0]; - return this._pointerPositions[pointerId]; + get transmission() { + return this._transmission; } - // - _customWheelEvent(event) { - const mode = event.deltaMode; - const newEvent = { - clientX: event.clientX, - clientY: event.clientY, - deltaY: event.deltaY - }; - switch (mode) { - case 1: - newEvent.deltaY *= 16; - break; - case 2: - newEvent.deltaY *= 100; - break; - } - if (event.ctrlKey && !this._controlActive) { - newEvent.deltaY *= 10; + set transmission(value) { + if (this._transmission > 0 !== value > 0) { + this.version++; } - return newEvent; + this._transmission = value; + } + copy(source) { + super.copy(source); + this.defines = { + "STANDARD": "", + "PHYSICAL": "" + }; + this.anisotropy = source.anisotropy; + this.anisotropyRotation = source.anisotropyRotation; + this.anisotropyMap = source.anisotropyMap; + this.clearcoat = source.clearcoat; + this.clearcoatMap = source.clearcoatMap; + this.clearcoatRoughness = source.clearcoatRoughness; + this.clearcoatRoughnessMap = source.clearcoatRoughnessMap; + this.clearcoatNormalMap = source.clearcoatNormalMap; + this.clearcoatNormalScale.copy(source.clearcoatNormalScale); + this.dispersion = source.dispersion; + this.ior = source.ior; + this.iridescence = source.iridescence; + this.iridescenceMap = source.iridescenceMap; + this.iridescenceIOR = source.iridescenceIOR; + this.iridescenceThicknessRange = [...source.iridescenceThicknessRange]; + this.iridescenceThicknessMap = source.iridescenceThicknessMap; + this.sheen = source.sheen; + this.sheenColor.copy(source.sheenColor); + this.sheenColorMap = source.sheenColorMap; + this.sheenRoughness = source.sheenRoughness; + this.sheenRoughnessMap = source.sheenRoughnessMap; + this.transmission = source.transmission; + this.transmissionMap = source.transmissionMap; + this.thickness = source.thickness; + this.thicknessMap = source.thicknessMap; + this.attenuationDistance = source.attenuationDistance; + this.attenuationColor.copy(source.attenuationColor); + this.specularIntensity = source.specularIntensity; + this.specularIntensityMap = source.specularIntensityMap; + this.specularColor.copy(source.specularColor); + this.specularColorMap = source.specularColorMap; + return this; } } -function onPointerDown(event) { - if (this.enabled === false) return; - if (this._pointers.length === 0) { - this.domElement.setPointerCapture(event.pointerId); - this.domElement.addEventListener("pointermove", this._onPointerMove); - this.domElement.addEventListener("pointerup", this._onPointerUp); +class MeshPhongMaterial extends Material { + static { + __name(this, "MeshPhongMaterial"); } - if (this._isTrackingPointer(event)) return; - this._addPointer(event); - if (event.pointerType === "touch") { - this._onTouchStart(event); - } else { - this._onMouseDown(event); + static get type() { + return "MeshPhongMaterial"; } -} -__name(onPointerDown, "onPointerDown"); -function onPointerMove(event) { - if (this.enabled === false) return; - if (event.pointerType === "touch") { - this._onTouchMove(event); - } else { - this._onMouseMove(event); + constructor(parameters) { + super(); + this.isMeshPhongMaterial = true; + this.color = new Color(16777215); + this.specular = new Color(1118481); + this.shininess = 30; + this.map = null; + this.lightMap = null; + this.lightMapIntensity = 1; + this.aoMap = null; + this.aoMapIntensity = 1; + this.emissive = new Color(0); + this.emissiveIntensity = 1; + this.emissiveMap = null; + this.bumpMap = null; + this.bumpScale = 1; + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2(1, 1); + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + this.specularMap = null; + this.alphaMap = null; + this.envMap = null; + this.envMapRotation = new Euler(); + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = "round"; + this.wireframeLinejoin = "round"; + this.flatShading = false; + this.fog = true; + this.setValues(parameters); } -} -__name(onPointerMove, "onPointerMove"); -function onPointerUp(event) { - this._removePointer(event); - switch (this._pointers.length) { - case 0: - this.domElement.releasePointerCapture(event.pointerId); - this.domElement.removeEventListener("pointermove", this._onPointerMove); - this.domElement.removeEventListener("pointerup", this._onPointerUp); - this.dispatchEvent(_endEvent); - this.state = _STATE.NONE; - break; - case 1: - const pointerId = this._pointers[0]; - const position = this._pointerPositions[pointerId]; - this._onTouchStart({ pointerId, pageX: position.x, pageY: position.y }); - break; + copy(source) { + super.copy(source); + this.color.copy(source.color); + this.specular.copy(source.specular); + this.shininess = source.shininess; + this.map = source.map; + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + this.emissive.copy(source.emissive); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy(source.normalScale); + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + this.specularMap = source.specularMap; + this.alphaMap = source.alphaMap; + this.envMap = source.envMap; + this.envMapRotation.copy(source.envMapRotation); + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + this.flatShading = source.flatShading; + this.fog = source.fog; + return this; } } -__name(onPointerUp, "onPointerUp"); -function onMouseDown(event) { - let mouseAction; - switch (event.button) { - case 0: - mouseAction = this.mouseButtons.LEFT; - break; - case 1: - mouseAction = this.mouseButtons.MIDDLE; - break; - case 2: - mouseAction = this.mouseButtons.RIGHT; - break; - default: - mouseAction = -1; +class MeshToonMaterial extends Material { + static { + __name(this, "MeshToonMaterial"); } - switch (mouseAction) { - case MOUSE.DOLLY: - if (this.enableZoom === false) return; - this._handleMouseDownDolly(event); - this.state = _STATE.DOLLY; - break; - case MOUSE.ROTATE: - if (event.ctrlKey || event.metaKey || event.shiftKey) { - if (this.enablePan === false) return; - this._handleMouseDownPan(event); - this.state = _STATE.PAN; - } else { - if (this.enableRotate === false) return; - this._handleMouseDownRotate(event); - this.state = _STATE.ROTATE; - } - break; - case MOUSE.PAN: - if (event.ctrlKey || event.metaKey || event.shiftKey) { - if (this.enableRotate === false) return; - this._handleMouseDownRotate(event); - this.state = _STATE.ROTATE; - } else { - if (this.enablePan === false) return; - this._handleMouseDownPan(event); - this.state = _STATE.PAN; - } - break; - default: - this.state = _STATE.NONE; + static get type() { + return "MeshToonMaterial"; } - if (this.state !== _STATE.NONE) { - this.dispatchEvent(_startEvent); + constructor(parameters) { + super(); + this.isMeshToonMaterial = true; + this.defines = { "TOON": "" }; + this.color = new Color(16777215); + this.map = null; + this.gradientMap = null; + this.lightMap = null; + this.lightMapIntensity = 1; + this.aoMap = null; + this.aoMapIntensity = 1; + this.emissive = new Color(0); + this.emissiveIntensity = 1; + this.emissiveMap = null; + this.bumpMap = null; + this.bumpScale = 1; + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2(1, 1); + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + this.alphaMap = null; + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = "round"; + this.wireframeLinejoin = "round"; + this.fog = true; + this.setValues(parameters); } -} -__name(onMouseDown, "onMouseDown"); -function onMouseMove(event) { - switch (this.state) { - case _STATE.ROTATE: - if (this.enableRotate === false) return; - this._handleMouseMoveRotate(event); - break; - case _STATE.DOLLY: - if (this.enableZoom === false) return; - this._handleMouseMoveDolly(event); - break; - case _STATE.PAN: - if (this.enablePan === false) return; - this._handleMouseMovePan(event); - break; + copy(source) { + super.copy(source); + this.color.copy(source.color); + this.map = source.map; + this.gradientMap = source.gradientMap; + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + this.emissive.copy(source.emissive); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy(source.normalScale); + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + this.alphaMap = source.alphaMap; + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + this.fog = source.fog; + return this; } } -__name(onMouseMove, "onMouseMove"); -function onMouseWheel(event) { - if (this.enabled === false || this.enableZoom === false || this.state !== _STATE.NONE) return; - event.preventDefault(); - this.dispatchEvent(_startEvent); - this._handleMouseWheel(this._customWheelEvent(event)); - this.dispatchEvent(_endEvent); -} -__name(onMouseWheel, "onMouseWheel"); -function onKeyDown(event) { - if (this.enabled === false || this.enablePan === false) return; - this._handleKeyDown(event); +class MeshNormalMaterial extends Material { + static { + __name(this, "MeshNormalMaterial"); + } + static get type() { + return "MeshNormalMaterial"; + } + constructor(parameters) { + super(); + this.isMeshNormalMaterial = true; + this.bumpMap = null; + this.bumpScale = 1; + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2(1, 1); + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + this.wireframe = false; + this.wireframeLinewidth = 1; + this.flatShading = false; + this.setValues(parameters); + } + copy(source) { + super.copy(source); + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy(source.normalScale); + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.flatShading = source.flatShading; + return this; + } } -__name(onKeyDown, "onKeyDown"); -function onTouchStart(event) { - this._trackPointer(event); - switch (this._pointers.length) { - case 1: - switch (this.touches.ONE) { - case TOUCH.ROTATE: - if (this.enableRotate === false) return; - this._handleTouchStartRotate(event); - this.state = _STATE.TOUCH_ROTATE; - break; - case TOUCH.PAN: - if (this.enablePan === false) return; - this._handleTouchStartPan(event); - this.state = _STATE.TOUCH_PAN; - break; - default: - this.state = _STATE.NONE; - } - break; - case 2: - switch (this.touches.TWO) { - case TOUCH.DOLLY_PAN: - if (this.enableZoom === false && this.enablePan === false) return; - this._handleTouchStartDollyPan(event); - this.state = _STATE.TOUCH_DOLLY_PAN; - break; - case TOUCH.DOLLY_ROTATE: - if (this.enableZoom === false && this.enableRotate === false) return; - this._handleTouchStartDollyRotate(event); - this.state = _STATE.TOUCH_DOLLY_ROTATE; - break; - default: - this.state = _STATE.NONE; - } - break; - default: - this.state = _STATE.NONE; +class MeshLambertMaterial extends Material { + static { + __name(this, "MeshLambertMaterial"); + } + static get type() { + return "MeshLambertMaterial"; + } + constructor(parameters) { + super(); + this.isMeshLambertMaterial = true; + this.color = new Color(16777215); + this.map = null; + this.lightMap = null; + this.lightMapIntensity = 1; + this.aoMap = null; + this.aoMapIntensity = 1; + this.emissive = new Color(0); + this.emissiveIntensity = 1; + this.emissiveMap = null; + this.bumpMap = null; + this.bumpScale = 1; + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2(1, 1); + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + this.specularMap = null; + this.alphaMap = null; + this.envMap = null; + this.envMapRotation = new Euler(); + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = "round"; + this.wireframeLinejoin = "round"; + this.flatShading = false; + this.fog = true; + this.setValues(parameters); } - if (this.state !== _STATE.NONE) { - this.dispatchEvent(_startEvent); + copy(source) { + super.copy(source); + this.color.copy(source.color); + this.map = source.map; + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + this.emissive.copy(source.emissive); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy(source.normalScale); + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + this.specularMap = source.specularMap; + this.alphaMap = source.alphaMap; + this.envMap = source.envMap; + this.envMapRotation.copy(source.envMapRotation); + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + this.flatShading = source.flatShading; + this.fog = source.fog; + return this; } } -__name(onTouchStart, "onTouchStart"); -function onTouchMove(event) { - this._trackPointer(event); - switch (this.state) { - case _STATE.TOUCH_ROTATE: - if (this.enableRotate === false) return; - this._handleTouchMoveRotate(event); - this.update(); - break; - case _STATE.TOUCH_PAN: - if (this.enablePan === false) return; - this._handleTouchMovePan(event); - this.update(); - break; - case _STATE.TOUCH_DOLLY_PAN: - if (this.enableZoom === false && this.enablePan === false) return; - this._handleTouchMoveDollyPan(event); - this.update(); - break; - case _STATE.TOUCH_DOLLY_ROTATE: - if (this.enableZoom === false && this.enableRotate === false) return; - this._handleTouchMoveDollyRotate(event); - this.update(); - break; - default: - this.state = _STATE.NONE; +class MeshMatcapMaterial extends Material { + static { + __name(this, "MeshMatcapMaterial"); } -} -__name(onTouchMove, "onTouchMove"); -function onContextMenu(event) { - if (this.enabled === false) return; - event.preventDefault(); -} -__name(onContextMenu, "onContextMenu"); -function interceptControlDown(event) { - if (event.key === "Control") { - this._controlActive = true; - const document2 = this.domElement.getRootNode(); - document2.addEventListener("keyup", this._interceptControlUp, { passive: true, capture: true }); + static get type() { + return "MeshMatcapMaterial"; } -} -__name(interceptControlDown, "interceptControlDown"); -function interceptControlUp(event) { - if (event.key === "Control") { - this._controlActive = false; - const document2 = this.domElement.getRootNode(); - document2.removeEventListener("keyup", this._interceptControlUp, { passive: true, capture: true }); + constructor(parameters) { + super(); + this.isMeshMatcapMaterial = true; + this.defines = { "MATCAP": "" }; + this.color = new Color(16777215); + this.matcap = null; + this.map = null; + this.bumpMap = null; + this.bumpScale = 1; + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2(1, 1); + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + this.alphaMap = null; + this.flatShading = false; + this.fog = true; + this.setValues(parameters); + } + copy(source) { + super.copy(source); + this.defines = { "MATCAP": "" }; + this.color.copy(source.color); + this.matcap = source.matcap; + this.map = source.map; + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy(source.normalScale); + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + this.alphaMap = source.alphaMap; + this.flatShading = source.flatShading; + this.fog = source.fog; + return this; } } -__name(interceptControlUp, "interceptControlUp"); -/*! -fflate - fast JavaScript compression/decompression - -Licensed under MIT. https://github.com/101arrowz/fflate/blob/master/LICENSE -version 0.8.2 -*/ -var ch2 = {}; -var wk = /* @__PURE__ */ __name(function(c, id2, msg, transfer, cb) { - var w = new Worker(ch2[id2] || (ch2[id2] = URL.createObjectURL(new Blob([ - c + ';addEventListener("error",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})' - ], { type: "text/javascript" })))); - w.onmessage = function(e) { - var d = e.data, ed = d.$e$; - if (ed) { - var err2 = new Error(ed[0]); - err2["code"] = ed[1]; - err2.stack = ed[2]; - cb(err2, null); - } else - cb(null, d); - }; - w.postMessage(msg, transfer); - return w; -}, "wk"); -var u8 = Uint8Array, u16 = Uint16Array, i32 = Int32Array; -var 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 -]); -var 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 -]); -var clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]); -var freb = /* @__PURE__ */ __name(function(eb, start) { - var b = new u16(31); - for (var i = 0; i < 31; ++i) { - b[i] = start += 1 << eb[i - 1]; +class LineDashedMaterial extends LineBasicMaterial { + static { + __name(this, "LineDashedMaterial"); } - var r = new i32(b[30]); - for (var i = 1; i < 30; ++i) { - for (var j = b[i]; j < b[i + 1]; ++j) { - r[j] = j - b[i] << 5 | i; - } + static get type() { + return "LineDashedMaterial"; } - return { b, r }; -}, "freb"); -var _a = freb(fleb, 2), fl = _a.b, revfl = _a.r; -fl[28] = 258, revfl[258] = 28; -var _b = freb(fdeb, 0), fd = _b.b, revfd = _b.r; -var rev = new u16(32768); -for (var i = 0; i < 32768; ++i) { - var x = (i & 43690) >> 1 | (i & 21845) << 1; - x = (x & 52428) >> 2 | (x & 13107) << 2; - x = (x & 61680) >> 4 | (x & 3855) << 4; - rev[i] = ((x & 65280) >> 8 | (x & 255) << 8) >> 1; -} -var hMap = /* @__PURE__ */ __name(function(cd, mb, r) { - var s = cd.length; - var i = 0; - var l = new u16(mb); - for (; i < s; ++i) { - if (cd[i]) - ++l[cd[i] - 1]; + constructor(parameters) { + super(); + this.isLineDashedMaterial = true; + this.scale = 1; + this.dashSize = 3; + this.gapSize = 1; + this.setValues(parameters); } - var le = new u16(mb); - for (i = 1; i < mb; ++i) { - le[i] = le[i - 1] + l[i - 1] << 1; + copy(source) { + super.copy(source); + this.scale = source.scale; + this.dashSize = source.dashSize; + this.gapSize = source.gapSize; + return this; } - var co; - if (r) { - co = new u16(1 << mb); - var rvb = 15 - mb; - for (i = 0; i < s; ++i) { - if (cd[i]) { - var sv = i << 4 | cd[i]; - var r_1 = mb - cd[i]; - var v = le[cd[i] - 1]++ << r_1; - for (var m = v | (1 << r_1) - 1; v <= m; ++v) { - co[rev[v] >> rvb] = sv; - } - } - } - } else { - co = new u16(s); - for (i = 0; i < s; ++i) { - if (cd[i]) { - co[i] = rev[le[cd[i] - 1]++] >> 15 - cd[i]; - } - } +} +function convertArray(array, type, forceClone) { + if (!array || // let 'undefined' and 'null' pass + !forceClone && array.constructor === type) return array; + if (typeof type.BYTES_PER_ELEMENT === "number") { + return new type(array); } - return co; -}, "hMap"); -var flt = new u8(288); -for (var i = 0; i < 144; ++i) - flt[i] = 8; -for (var i = 144; i < 256; ++i) - flt[i] = 9; -for (var i = 256; i < 280; ++i) - flt[i] = 7; -for (var i = 280; i < 288; ++i) - flt[i] = 8; -var fdt = new u8(32); -for (var i = 0; i < 32; ++i) - fdt[i] = 5; -var flm = /* @__PURE__ */ hMap(flt, 9, 0), flrm = /* @__PURE__ */ hMap(flt, 9, 1); -var fdm = /* @__PURE__ */ hMap(fdt, 5, 0), fdrm = /* @__PURE__ */ hMap(fdt, 5, 1); -var max = /* @__PURE__ */ __name(function(a) { - var m = a[0]; - for (var i = 1; i < a.length; ++i) { - if (a[i] > m) - m = a[i]; + return Array.prototype.slice.call(array); +} +__name(convertArray, "convertArray"); +function isTypedArray(object) { + return ArrayBuffer.isView(object) && !(object instanceof DataView); +} +__name(isTypedArray, "isTypedArray"); +function getKeyframeOrder(times) { + function compareTime(i, j) { + return times[i] - times[j]; } - return m; -}, "max"); -var bits = /* @__PURE__ */ __name(function(d, p, m) { - var o = p / 8 | 0; - return (d[o] | d[o + 1] << 8) >> (p & 7) & m; -}, "bits"); -var bits16 = /* @__PURE__ */ __name(function(d, p) { - var o = p / 8 | 0; - return (d[o] | d[o + 1] << 8 | d[o + 2] << 16) >> (p & 7); -}, "bits16"); -var shft = /* @__PURE__ */ __name(function(p) { - return (p + 7) / 8 | 0; -}, "shft"); -var slc = /* @__PURE__ */ __name(function(v, s, e) { - if (s == null || s < 0) - s = 0; - if (e == null || e > v.length) - e = v.length; - return new u8(v.subarray(s, e)); -}, "slc"); -var FlateErrorCode = { - UnexpectedEOF: 0, - InvalidBlockType: 1, - InvalidLengthLiteral: 2, - InvalidDistance: 3, - StreamFinished: 4, - NoStreamHandler: 5, - InvalidHeader: 6, - NoCallback: 7, - InvalidUTF8: 8, - ExtraFieldTooLong: 9, - InvalidDate: 10, - FilenameTooLong: 11, - StreamFinishing: 12, - InvalidZipData: 13, - UnknownCompressionMethod: 14 -}; -var ec = [ - "unexpected EOF", - "invalid block type", - "invalid length/literal", - "invalid distance", - "stream finished", - "no stream handler", - , - "no callback", - "invalid UTF-8 data", - "extra field too long", - "date not in range 1980-2099", - "filename too long", - "stream finishing", - "invalid zip data" - // determined by unknown compression method -]; -; -var err = /* @__PURE__ */ __name(function(ind, msg, nt) { - var e = new Error(msg || ec[ind]); - e.code = ind; - if (Error.captureStackTrace) - Error.captureStackTrace(e, err); - if (!nt) - throw e; - return e; -}, "err"); -var inflt = /* @__PURE__ */ __name(function(dat, st, buf, dict) { - var sl = dat.length, dl = dict ? dict.length : 0; - if (!sl || st.f && !st.l) - return buf || new u8(0); - var noBuf = !buf; - var resize = noBuf || st.i != 2; - var noSt = st.i; - if (noBuf) - buf = new u8(sl * 3); - var cbuf = /* @__PURE__ */ __name(function(l2) { - var bl = buf.length; - if (l2 > bl) { - var nbuf = new u8(Math.max(bl * 2, l2)); - nbuf.set(buf); - buf = nbuf; - } - }, "cbuf"); - 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; - var tbts = sl * 8; - do { - if (!lm) { - final = bits(dat, pos, 1); - var type = bits(dat, pos + 1, 3); - pos += 3; - if (!type) { - var s = shft(pos) + 4, l = dat[s - 4] | dat[s - 3] << 8, t2 = s + l; - if (t2 > sl) { - if (noSt) - err(0); - break; - } - if (resize) - cbuf(bt + l); - buf.set(dat.subarray(s, t2), bt); - st.b = bt += l, st.p = pos = t2 * 8, st.f = final; - continue; - } else if (type == 1) - lm = flrm, dm = fdrm, lbt = 9, dbt = 5; - else if (type == 2) { - var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4; - var tl = hLit + bits(dat, pos + 5, 31) + 1; - pos += 14; - var ldt = new u8(tl); - var clt = new u8(19); - for (var i = 0; i < hcLen; ++i) { - clt[clim[i]] = bits(dat, pos + i * 3, 7); - } - pos += hcLen * 3; - var clb = max(clt), clbmsk = (1 << clb) - 1; - var clm = hMap(clt, clb, 1); - for (var i = 0; i < tl; ) { - var r = clm[bits(dat, pos, clbmsk)]; - pos += r & 15; - var s = r >> 4; - if (s < 16) { - ldt[i++] = s; - } else { - var c = 0, n = 0; - if (s == 16) - n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1]; - else if (s == 17) - n = 3 + bits(dat, pos, 7), pos += 3; - else if (s == 18) - n = 11 + bits(dat, pos, 127), pos += 7; - while (n--) - ldt[i++] = c; - } - } - var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit); - lbt = max(lt); - dbt = max(dt); - lm = hMap(lt, lbt, 1); - dm = hMap(dt, dbt, 1); - } else - err(1); - if (pos > tbts) { - if (noSt) - err(0); - break; - } + __name(compareTime, "compareTime"); + const n = times.length; + const result = new Array(n); + for (let i = 0; i !== n; ++i) result[i] = i; + result.sort(compareTime); + return result; +} +__name(getKeyframeOrder, "getKeyframeOrder"); +function sortedArray(values, stride, order) { + const nValues = values.length; + const result = new values.constructor(nValues); + for (let i = 0, dstOffset = 0; dstOffset !== nValues; ++i) { + const srcOffset = order[i] * stride; + for (let j = 0; j !== stride; ++j) { + result[dstOffset++] = values[srcOffset + j]; } - if (resize) - cbuf(bt + 131072); - var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1; - var lpos = pos; - for (; ; lpos = pos) { - var c = lm[bits16(dat, pos) & lms], sym = c >> 4; - pos += c & 15; - if (pos > tbts) { - if (noSt) - err(0); - break; + } + return result; +} +__name(sortedArray, "sortedArray"); +function flattenJSON(jsonKeys, times, values, valuePropertyName) { + let i = 1, key = jsonKeys[0]; + while (key !== void 0 && key[valuePropertyName] === void 0) { + key = jsonKeys[i++]; + } + if (key === void 0) return; + let value = key[valuePropertyName]; + if (value === void 0) return; + if (Array.isArray(value)) { + do { + value = key[valuePropertyName]; + if (value !== void 0) { + times.push(key.time); + values.push.apply(values, value); } - if (!c) - err(2); - if (sym < 256) - buf[bt++] = sym; - else if (sym == 256) { - lpos = pos, lm = null; - break; - } else { - var add = sym - 254; - if (sym > 264) { - var i = sym - 257, b = fleb[i]; - add = bits(dat, pos, (1 << b) - 1) + fl[i]; - pos += b; - } - var d = dm[bits16(dat, pos) & dms], dsym = d >> 4; - if (!d) - err(3); - pos += d & 15; - var dt = fd[dsym]; - if (dsym > 3) { - var b = fdeb[dsym]; - dt += bits16(dat, pos) & (1 << b) - 1, pos += b; - } - if (pos > tbts) { - if (noSt) - err(0); - break; - } - if (resize) - cbuf(bt + 131072); - var end = bt + add; - if (bt < dt) { - var shift = dl - dt, dend = Math.min(dt, end); - if (shift + bt < 0) - err(3); - for (; bt < dend; ++bt) - buf[bt] = dict[shift + bt]; - } - for (; bt < end; ++bt) - buf[bt] = buf[bt - dt]; + key = jsonKeys[i++]; + } while (key !== void 0); + } else if (value.toArray !== void 0) { + do { + value = key[valuePropertyName]; + if (value !== void 0) { + times.push(key.time); + value.toArray(values, values.length); } - } - st.l = lm, st.p = lpos, st.b = bt, st.f = final; - if (lm) - final = 1, st.m = lbt, st.d = dm, st.n = dbt; - } while (!final); - return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt); -}, "inflt"); -var wbits = /* @__PURE__ */ __name(function(d, p, v) { - v <<= p & 7; - var o = p / 8 | 0; - d[o] |= v; - d[o + 1] |= v >> 8; -}, "wbits"); -var wbits16 = /* @__PURE__ */ __name(function(d, p, v) { - v <<= p & 7; - var o = p / 8 | 0; - d[o] |= v; - d[o + 1] |= v >> 8; - d[o + 2] |= v >> 16; -}, "wbits16"); -var hTree = /* @__PURE__ */ __name(function(d, mb) { - var t2 = []; - for (var i = 0; i < d.length; ++i) { - if (d[i]) - t2.push({ s: i, f: d[i] }); + key = jsonKeys[i++]; + } while (key !== void 0); + } else { + do { + value = key[valuePropertyName]; + if (value !== void 0) { + times.push(key.time); + values.push(value); + } + key = jsonKeys[i++]; + } while (key !== void 0); } - var s = t2.length; - var t22 = t2.slice(); - if (!s) - return { t: et, l: 0 }; - if (s == 1) { - var v = new u8(t2[0].s + 1); - v[t2[0].s] = 1; - return { t: v, l: 1 }; +} +__name(flattenJSON, "flattenJSON"); +function subclip(sourceClip, name, startFrame, endFrame, fps = 30) { + const clip = sourceClip.clone(); + clip.name = name; + const tracks = []; + for (let i = 0; i < clip.tracks.length; ++i) { + const track = clip.tracks[i]; + const valueSize = track.getValueSize(); + const times = []; + const values = []; + for (let j = 0; j < track.times.length; ++j) { + const frame = track.times[j] * fps; + if (frame < startFrame || frame >= endFrame) continue; + times.push(track.times[j]); + for (let k = 0; k < valueSize; ++k) { + values.push(track.values[j * valueSize + k]); + } + } + if (times.length === 0) continue; + track.times = convertArray(times, track.times.constructor); + track.values = convertArray(values, track.values.constructor); + tracks.push(track); } - t2.sort(function(a, b) { - return a.f - b.f; - }); - t2.push({ s: -1, f: 25001 }); - var l = t2[0], r = t2[1], i0 = 0, i1 = 1, i2 = 2; - t2[0] = { s: -1, f: l.f + r.f, l, r }; - while (i1 != s - 1) { - l = t2[t2[i0].f < t2[i2].f ? i0++ : i2++]; - r = t2[i0 != i1 && t2[i0].f < t2[i2].f ? i0++ : i2++]; - t2[i1++] = { s: -1, f: l.f + r.f, l, r }; + clip.tracks = tracks; + let minStartTime = Infinity; + for (let i = 0; i < clip.tracks.length; ++i) { + if (minStartTime > clip.tracks[i].times[0]) { + minStartTime = clip.tracks[i].times[0]; + } } - var maxSym = t22[0].s; - for (var i = 1; i < s; ++i) { - if (t22[i].s > maxSym) - maxSym = t22[i].s; + for (let i = 0; i < clip.tracks.length; ++i) { + clip.tracks[i].shift(-1 * minStartTime); } - var tr = new u16(maxSym + 1); - var mbt = ln(t2[i1 - 1], tr, 0); - if (mbt > mb) { - var i = 0, dt = 0; - var lft = mbt - mb, cst = 1 << lft; - t22.sort(function(a, b) { - return tr[b.s] - tr[a.s] || a.f - b.f; + clip.resetDuration(); + return clip; +} +__name(subclip, "subclip"); +function makeClipAdditive(targetClip, referenceFrame = 0, referenceClip = targetClip, fps = 30) { + if (fps <= 0) fps = 30; + const numTracks = referenceClip.tracks.length; + const referenceTime = referenceFrame / fps; + for (let i = 0; i < numTracks; ++i) { + const referenceTrack = referenceClip.tracks[i]; + const referenceTrackType = referenceTrack.ValueTypeName; + if (referenceTrackType === "bool" || referenceTrackType === "string") continue; + const targetTrack = targetClip.tracks.find(function(track) { + return track.name === referenceTrack.name && track.ValueTypeName === referenceTrackType; }); - for (; i < s; ++i) { - var i2_1 = t22[i].s; - if (tr[i2_1] > mb) { - dt += cst - (1 << mbt - tr[i2_1]); - tr[i2_1] = mb; - } else - break; + if (targetTrack === void 0) continue; + let referenceOffset = 0; + const referenceValueSize = referenceTrack.getValueSize(); + if (referenceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline) { + referenceOffset = referenceValueSize / 3; } - dt >>= lft; - while (dt > 0) { - var i2_2 = t22[i].s; - if (tr[i2_2] < mb) - dt -= 1 << mb - tr[i2_2]++ - 1; - else - ++i; + let targetOffset = 0; + const targetValueSize = targetTrack.getValueSize(); + if (targetTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline) { + targetOffset = targetValueSize / 3; } - for (; i >= 0 && dt; --i) { - var i2_3 = t22[i].s; - if (tr[i2_3] == mb) { - --tr[i2_3]; - ++dt; - } + const lastIndex = referenceTrack.times.length - 1; + let referenceValue; + if (referenceTime <= referenceTrack.times[0]) { + const startIndex = referenceOffset; + const endIndex = referenceValueSize - referenceOffset; + referenceValue = referenceTrack.values.slice(startIndex, endIndex); + } else if (referenceTime >= referenceTrack.times[lastIndex]) { + const startIndex = lastIndex * referenceValueSize + referenceOffset; + const endIndex = startIndex + referenceValueSize - referenceOffset; + referenceValue = referenceTrack.values.slice(startIndex, endIndex); + } else { + const interpolant = referenceTrack.createInterpolant(); + const startIndex = referenceOffset; + const endIndex = referenceValueSize - referenceOffset; + interpolant.evaluate(referenceTime); + referenceValue = interpolant.resultBuffer.slice(startIndex, endIndex); } - mbt = mb; - } - return { t: new u8(tr), l: mbt }; -}, "hTree"); -var ln = /* @__PURE__ */ __name(function(n, l, d) { - return n.s == -1 ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1)) : l[n.s] = d; -}, "ln"); -var lc = /* @__PURE__ */ __name(function(c) { - var s = c.length; - while (s && !c[--s]) - ; - var cl = new u16(++s); - var cli = 0, cln = c[0], cls = 1; - var w = /* @__PURE__ */ __name(function(v) { - cl[cli++] = v; - }, "w"); - for (var i = 1; i <= s; ++i) { - if (c[i] == cln && i != s) - ++cls; - else { - if (!cln && cls > 2) { - for (; cls > 138; cls -= 138) - w(32754); - if (cls > 2) { - w(cls > 10 ? cls - 11 << 5 | 28690 : cls - 3 << 5 | 12305); - cls = 0; + if (referenceTrackType === "quaternion") { + const referenceQuat = new Quaternion().fromArray(referenceValue).normalize().conjugate(); + referenceQuat.toArray(referenceValue); + } + const numTimes = targetTrack.times.length; + for (let j = 0; j < numTimes; ++j) { + const valueStart = j * targetValueSize + targetOffset; + if (referenceTrackType === "quaternion") { + Quaternion.multiplyQuaternionsFlat( + targetTrack.values, + valueStart, + referenceValue, + 0, + targetTrack.values, + valueStart + ); + } else { + const valueEnd = targetValueSize - targetOffset * 2; + for (let k = 0; k < valueEnd; ++k) { + targetTrack.values[valueStart + k] -= referenceValue[k]; } - } else if (cls > 3) { - w(cln), --cls; - for (; cls > 6; cls -= 6) - w(8304); - if (cls > 2) - w(cls - 3 << 5 | 8208), cls = 0; } - while (cls--) - w(cln); - cls = 1; - cln = c[i]; } } - return { c: cl.subarray(0, cli), n: s }; -}, "lc"); -var clen = /* @__PURE__ */ __name(function(cf, cl) { - var l = 0; - for (var i = 0; i < cl.length; ++i) - l += cf[i] * cl[i]; - return l; -}, "clen"); -var wfblk = /* @__PURE__ */ __name(function(out, pos, dat) { - var s = dat.length; - var o = shft(pos + 2); - out[o] = s & 255; - out[o + 1] = s >> 8; - out[o + 2] = out[o] ^ 255; - out[o + 3] = out[o + 1] ^ 255; - for (var i = 0; i < s; ++i) - out[o + i + 4] = dat[i]; - return (o + 4 + s) * 8; -}, "wfblk"); -var wblk = /* @__PURE__ */ __name(function(dat, out, final, syms, lf, df, eb, li, bs, bl, p) { - wbits(out, p++, final); - ++lf[256]; - var _a2 = hTree(lf, 15), dlt = _a2.t, mlb = _a2.l; - var _b2 = hTree(df, 15), ddt = _b2.t, mdb = _b2.l; - var _c = lc(dlt), lclt = _c.c, nlc = _c.n; - var _d = lc(ddt), lcdt = _d.c, ndc = _d.n; - var lcfreq = new u16(19); - for (var i = 0; i < lclt.length; ++i) - ++lcfreq[lclt[i] & 31]; - for (var i = 0; i < lcdt.length; ++i) - ++lcfreq[lcdt[i] & 31]; - var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l; - var nlcc = 19; - for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc) - ; - var flen = bl + 5 << 3; - var ftlen = clen(lf, flt) + clen(df, fdt) + eb; - var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18]; - if (bs >= 0 && flen <= ftlen && flen <= dtlen) - return wfblk(out, p, dat.subarray(bs, bs + bl)); - var lm, ll, dm, dl; - wbits(out, p, 1 + (dtlen < ftlen)), p += 2; - if (dtlen < ftlen) { - lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt; - var llm = hMap(lct, mlcb, 0); - wbits(out, p, nlc - 257); - wbits(out, p + 5, ndc - 1); - wbits(out, p + 10, nlcc - 4); - p += 14; - for (var i = 0; i < nlcc; ++i) - wbits(out, p + 3 * i, lct[clim[i]]); - p += 3 * nlcc; - var lcts = [lclt, lcdt]; - for (var it = 0; it < 2; ++it) { - var clct = lcts[it]; - for (var i = 0; i < clct.length; ++i) { - var len = clct[i] & 31; - wbits(out, p, llm[len]), p += lct[len]; - if (len > 15) - wbits(out, p, clct[i] >> 5 & 127), p += clct[i] >> 12; - } - } - } else { - lm = flm, ll = flt, dm = fdm, dl = fdt; + targetClip.blendMode = AdditiveAnimationBlendMode; + return targetClip; +} +__name(makeClipAdditive, "makeClipAdditive"); +const AnimationUtils = { + convertArray, + isTypedArray, + getKeyframeOrder, + sortedArray, + flattenJSON, + subclip, + makeClipAdditive +}; +class Interpolant { + static { + __name(this, "Interpolant"); } - for (var i = 0; i < li; ++i) { - var sym = syms[i]; - if (sym > 255) { - var len = sym >> 18 & 31; - wbits16(out, p, lm[len + 257]), p += ll[len + 257]; - if (len > 7) - wbits(out, p, sym >> 23 & 31), p += fleb[len]; - var dst = sym & 31; - wbits16(out, p, dm[dst]), p += dl[dst]; - if (dst > 3) - wbits16(out, p, sym >> 5 & 8191), p += fdeb[dst]; - } else { - wbits16(out, p, lm[sym]), p += ll[sym]; - } + constructor(parameterPositions, sampleValues, sampleSize, resultBuffer) { + this.parameterPositions = parameterPositions; + this._cachedIndex = 0; + this.resultBuffer = resultBuffer !== void 0 ? resultBuffer : new sampleValues.constructor(sampleSize); + this.sampleValues = sampleValues; + this.valueSize = sampleSize; + this.settings = null; + this.DefaultSettings_ = {}; } - wbits16(out, p, lm[256]); - return p + ll[256]; -}, "wblk"); -var deo = /* @__PURE__ */ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]); -var et = /* @__PURE__ */ new u8(0); -var dflt = /* @__PURE__ */ __name(function(dat, lvl, plvl, pre, post, st) { - var s = st.z || dat.length; - var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7e3)) + post); - var w = o.subarray(pre, o.length - post); - var lst = st.l; - var pos = (st.r || 0) & 7; - if (lvl) { - if (pos) - w[0] = st.r >> 3; - var opt = deo[lvl - 1]; - var n = opt >> 13, c = opt & 8191; - var msk_1 = (1 << plvl) - 1; - var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1); - var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1; - var hsh = /* @__PURE__ */ __name(function(i2) { - return (dat[i2] ^ dat[i2 + 1] << bs1_1 ^ dat[i2 + 2] << bs2_1) & msk_1; - }, "hsh"); - var syms = new i32(25e3); - var lf = new u16(288), df = new u16(32); - var lc_1 = 0, eb = 0, i = st.i || 0, li = 0, wi = st.w || 0, bs = 0; - for (; i + 2 < s; ++i) { - var hv = hsh(i); - var imod = i & 32767, pimod = head[hv]; - prev[imod] = pimod; - head[hv] = imod; - if (wi <= i) { - var rem = s - i; - if ((lc_1 > 7e3 || li > 24576) && (rem > 423 || !lst)) { - pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos); - li = lc_1 = eb = 0, bs = i; - for (var j = 0; j < 286; ++j) - lf[j] = 0; - for (var j = 0; j < 30; ++j) - df[j] = 0; - } - var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767; - if (rem > 2 && hv == hsh(i - dif)) { - var maxn = Math.min(n, rem) - 1; - var maxd = Math.min(32767, i); - var ml = Math.min(258, rem); - while (dif <= maxd && --ch_1 && imod != pimod) { - if (dat[i + l] == dat[i + l - dif]) { - var nl = 0; - for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl) - ; - if (nl > l) { - l = nl, d = dif; - if (nl > maxn) - break; - var mmd = Math.min(dif, nl - 2); - var md = 0; - for (var j = 0; j < mmd; ++j) { - var ti = i - dif + j & 32767; - var pti = prev[ti]; - var cd = ti - pti & 32767; - if (cd > md) - md = cd, pimod = ti; - } + evaluate(t2) { + const pp = this.parameterPositions; + let i1 = this._cachedIndex, t1 = pp[i1], t0 = pp[i1 - 1]; + validate_interval: { + seek: { + let right; + linear_scan: { + forward_scan: if (!(t2 < t1)) { + for (let giveUpAt = i1 + 2; ; ) { + if (t1 === void 0) { + if (t2 < t0) break forward_scan; + i1 = pp.length; + this._cachedIndex = i1; + return this.copySampleValue_(i1 - 1); + } + if (i1 === giveUpAt) break; + t0 = t1; + t1 = pp[++i1]; + if (t2 < t1) { + break seek; } } - imod = pimod, pimod = prev[imod]; - dif += imod - pimod & 32767; + right = pp.length; + break linear_scan; + } + if (!(t2 >= t0)) { + const t1global = pp[1]; + if (t2 < t1global) { + i1 = 2; + t0 = t1global; + } + for (let giveUpAt = i1 - 2; ; ) { + if (t0 === void 0) { + this._cachedIndex = 0; + return this.copySampleValue_(0); + } + if (i1 === giveUpAt) break; + t1 = t0; + t0 = pp[--i1 - 1]; + if (t2 >= t0) { + break seek; + } + } + right = i1; + i1 = 0; + break linear_scan; + } + break validate_interval; + } + while (i1 < right) { + const mid = i1 + right >>> 1; + if (t2 < pp[mid]) { + right = mid; + } else { + i1 = mid + 1; } } - if (d) { - syms[li++] = 268435456 | revfl[l] << 18 | revfd[d]; - var lin = revfl[l] & 31, din = revfd[d] & 31; - eb += fleb[lin] + fdeb[din]; - ++lf[257 + lin]; - ++df[din]; - wi = i + l; - ++lc_1; - } else { - syms[li++] = dat[i]; - ++lf[dat[i]]; + t1 = pp[i1]; + t0 = pp[i1 - 1]; + if (t0 === void 0) { + this._cachedIndex = 0; + return this.copySampleValue_(0); + } + if (t1 === void 0) { + i1 = pp.length; + this._cachedIndex = i1; + return this.copySampleValue_(i1 - 1); } } + this._cachedIndex = i1; + this.intervalChanged_(i1, t0, t1); } - for (i = Math.max(i, wi); i < s; ++i) { - syms[li++] = dat[i]; - ++lf[dat[i]]; + return this.interpolate_(i1, t0, t2, t1); + } + getSettings_() { + return this.settings || this.DefaultSettings_; + } + copySampleValue_(index) { + const result = this.resultBuffer, values = this.sampleValues, stride = this.valueSize, offset = index * stride; + for (let i = 0; i !== stride; ++i) { + result[i] = values[offset + i]; } - pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos); - if (!lst) { - st.r = pos & 7 | w[pos / 8 | 0] << 3; - pos -= 7; - st.h = head, st.p = prev, st.i = i, st.w = wi; + return result; + } + // Template methods for derived classes: + interpolate_() { + throw new Error("call to abstract method"); + } + intervalChanged_() { + } +} +class CubicInterpolant extends Interpolant { + static { + __name(this, "CubicInterpolant"); + } + constructor(parameterPositions, sampleValues, sampleSize, resultBuffer) { + super(parameterPositions, sampleValues, sampleSize, resultBuffer); + this._weightPrev = -0; + this._offsetPrev = -0; + this._weightNext = -0; + this._offsetNext = -0; + this.DefaultSettings_ = { + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + }; + } + intervalChanged_(i1, t0, t1) { + const pp = this.parameterPositions; + let iPrev = i1 - 2, iNext = i1 + 1, tPrev = pp[iPrev], tNext = pp[iNext]; + if (tPrev === void 0) { + switch (this.getSettings_().endingStart) { + case ZeroSlopeEnding: + iPrev = i1; + tPrev = 2 * t0 - t1; + break; + case WrapAroundEnding: + iPrev = pp.length - 2; + tPrev = t0 + pp[iPrev] - pp[iPrev + 1]; + break; + default: + iPrev = i1; + tPrev = t1; + } } - } else { - for (var i = st.w || 0; i < s + lst; i += 65535) { - var e = i + 65535; - if (e >= s) { - w[pos / 8 | 0] = lst; - e = s; + if (tNext === void 0) { + switch (this.getSettings_().endingEnd) { + case ZeroSlopeEnding: + iNext = i1; + tNext = 2 * t1 - t0; + break; + case WrapAroundEnding: + iNext = 1; + tNext = t1 + pp[1] - pp[0]; + break; + default: + iNext = i1 - 1; + tNext = t0; } - pos = wfblk(w, pos + 1, dat.subarray(i, e)); } - st.i = s; + const halfDt = (t1 - t0) * 0.5, stride = this.valueSize; + this._weightPrev = halfDt / (t0 - tPrev); + this._weightNext = halfDt / (tNext - t1); + this._offsetPrev = iPrev * stride; + this._offsetNext = iNext * stride; } - return slc(o, 0, pre + shft(pos) + post); -}, "dflt"); -var crct = /* @__PURE__ */ function() { - var t2 = new Int32Array(256); - for (var i = 0; i < 256; ++i) { - var c = i, k = 9; - while (--k) - c = (c & 1 && -306674912) ^ c >>> 1; - t2[i] = c; + interpolate_(i1, t0, t2, t1) { + const result = this.resultBuffer, values = this.sampleValues, stride = this.valueSize, o1 = i1 * stride, o0 = o1 - stride, oP = this._offsetPrev, oN = this._offsetNext, wP = this._weightPrev, wN = this._weightNext, p = (t2 - t0) / (t1 - t0), pp = p * p, ppp = pp * p; + const sP = -wP * ppp + 2 * wP * pp - wP * p; + const s0 = (1 + wP) * ppp + (-1.5 - 2 * wP) * pp + (-0.5 + wP) * p + 1; + const s1 = (-1 - wN) * ppp + (1.5 + wN) * pp + 0.5 * p; + const sN = wN * ppp - wN * pp; + for (let i = 0; i !== stride; ++i) { + result[i] = sP * values[oP + i] + s0 * values[o0 + i] + s1 * values[o1 + i] + sN * values[oN + i]; + } + return result; } - return t2; -}(); -var crc = /* @__PURE__ */ __name(function() { - var c = -1; - return { - p: /* @__PURE__ */ __name(function(d) { - var cr = c; - for (var i = 0; i < d.length; ++i) - cr = crct[cr & 255 ^ d[i]] ^ cr >>> 8; - c = cr; - }, "p"), - d: /* @__PURE__ */ __name(function() { - return ~c; - }, "d") - }; -}, "crc"); -var adler = /* @__PURE__ */ __name(function() { - var a = 1, b = 0; - return { - p: /* @__PURE__ */ __name(function(d) { - var n = a, m = b; - var l = d.length | 0; - for (var i = 0; i != l; ) { - var e = Math.min(i + 2655, l); - for (; i < e; ++i) - m += n += d[i]; - n = (n & 65535) + 15 * (n >> 16), m = (m & 65535) + 15 * (m >> 16); +} +class LinearInterpolant extends Interpolant { + static { + __name(this, "LinearInterpolant"); + } + constructor(parameterPositions, sampleValues, sampleSize, resultBuffer) { + super(parameterPositions, sampleValues, sampleSize, resultBuffer); + } + interpolate_(i1, t0, t2, t1) { + const result = this.resultBuffer, values = this.sampleValues, stride = this.valueSize, offset1 = i1 * stride, offset0 = offset1 - stride, weight1 = (t2 - t0) / (t1 - t0), weight0 = 1 - weight1; + for (let i = 0; i !== stride; ++i) { + result[i] = values[offset0 + i] * weight0 + values[offset1 + i] * weight1; + } + return result; + } +} +class DiscreteInterpolant extends Interpolant { + static { + __name(this, "DiscreteInterpolant"); + } + constructor(parameterPositions, sampleValues, sampleSize, resultBuffer) { + super(parameterPositions, sampleValues, sampleSize, resultBuffer); + } + interpolate_(i1) { + return this.copySampleValue_(i1 - 1); + } +} +class KeyframeTrack { + static { + __name(this, "KeyframeTrack"); + } + constructor(name, times, values, interpolation) { + if (name === void 0) throw new Error("THREE.KeyframeTrack: track name is undefined"); + if (times === void 0 || times.length === 0) throw new Error("THREE.KeyframeTrack: no keyframes in track named " + name); + this.name = name; + this.times = convertArray(times, this.TimeBufferType); + this.values = convertArray(values, this.ValueBufferType); + this.setInterpolation(interpolation || this.DefaultInterpolation); + } + // Serialization (in static context, because of constructor invocation + // and automatic invocation of .toJSON): + static toJSON(track) { + const trackType = track.constructor; + let json; + if (trackType.toJSON !== this.toJSON) { + json = trackType.toJSON(track); + } else { + json = { + "name": track.name, + "times": convertArray(track.times, Array), + "values": convertArray(track.values, Array) + }; + const interpolation = track.getInterpolation(); + if (interpolation !== track.DefaultInterpolation) { + json.interpolation = interpolation; } - a = n, b = m; - }, "p"), - d: /* @__PURE__ */ __name(function() { - a %= 65521, b %= 65521; - return (a & 255) << 24 | (a & 65280) << 8 | (b & 255) << 8 | b >> 8; - }, "d") - }; -}, "adler"); -; -var dopt = /* @__PURE__ */ __name(function(dat, opt, pre, post, st) { - if (!st) { - st = { l: 1 }; - if (opt.dictionary) { - var dict = opt.dictionary.subarray(-32768); - var newDat = new u8(dict.length + dat.length); - newDat.set(dict); - newDat.set(dat, dict.length); - dat = newDat; - st.w = dict.length; } + json.type = track.ValueTypeName; + return json; } - 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); -}, "dopt"); -var mrg = /* @__PURE__ */ __name(function(a, b) { - var o = {}; - for (var k in a) - o[k] = a[k]; - for (var k in b) - o[k] = b[k]; - return o; -}, "mrg"); -var wcln = /* @__PURE__ */ __name(function(fn, fnStr, td2) { - var dt = fn(); - var st = fn.toString(); - var ks = st.slice(st.indexOf("[") + 1, st.lastIndexOf("]")).replace(/\s+/g, "").split(","); - for (var i = 0; i < dt.length; ++i) { - var v = dt[i], k = ks[i]; - if (typeof v == "function") { - fnStr += ";" + k + "="; - var st_1 = v.toString(); - if (v.prototype) { - if (st_1.indexOf("[native code]") != -1) { - var spInd = st_1.indexOf(" ", 8) + 1; - fnStr += st_1.slice(spInd, st_1.indexOf("(", spInd)); + InterpolantFactoryMethodDiscrete(result) { + return new DiscreteInterpolant(this.times, this.values, this.getValueSize(), result); + } + InterpolantFactoryMethodLinear(result) { + return new LinearInterpolant(this.times, this.values, this.getValueSize(), result); + } + InterpolantFactoryMethodSmooth(result) { + return new CubicInterpolant(this.times, this.values, this.getValueSize(), result); + } + setInterpolation(interpolation) { + let factoryMethod; + switch (interpolation) { + case InterpolateDiscrete: + factoryMethod = this.InterpolantFactoryMethodDiscrete; + break; + case InterpolateLinear: + factoryMethod = this.InterpolantFactoryMethodLinear; + break; + case InterpolateSmooth: + factoryMethod = this.InterpolantFactoryMethodSmooth; + break; + } + if (factoryMethod === void 0) { + const message = "unsupported interpolation for " + this.ValueTypeName + " keyframe track named " + this.name; + if (this.createInterpolant === void 0) { + if (interpolation !== this.DefaultInterpolation) { + this.setInterpolation(this.DefaultInterpolation); } else { - fnStr += st_1; - for (var t2 in v.prototype) - fnStr += ";" + k + ".prototype." + t2 + "=" + v.prototype[t2].toString(); + throw new Error(message); } - } else - fnStr += st_1; - } else - td2[k] = v; + } + console.warn("THREE.KeyframeTrack:", message); + return this; + } + this.createInterpolant = factoryMethod; + return this; } - return fnStr; -}, "wcln"); -var ch = []; -var cbfs = /* @__PURE__ */ __name(function(v) { - var tl = []; - for (var k in v) { - if (v[k].buffer) { - tl.push((v[k] = new v[k].constructor(v[k])).buffer); + getInterpolation() { + switch (this.createInterpolant) { + case this.InterpolantFactoryMethodDiscrete: + return InterpolateDiscrete; + case this.InterpolantFactoryMethodLinear: + return InterpolateLinear; + case this.InterpolantFactoryMethodSmooth: + return InterpolateSmooth; } } - return tl; -}, "cbfs"); -var wrkr = /* @__PURE__ */ __name(function(fns, init, id2, cb) { - if (!ch[id2]) { - var fnStr = "", td_1 = {}, m = fns.length - 1; - for (var i = 0; i < m; ++i) - fnStr = wcln(fns[i], fnStr, td_1); - ch[id2] = { c: wcln(fns[m], fnStr, td_1), e: td_1 }; + getValueSize() { + return this.values.length / this.times.length; } - var td2 = mrg({}, ch[id2].e); - return wk(ch[id2].c + ";onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=" + init.toString() + "}", id2, td2, cbfs(td2), cb); -}, "wrkr"); -var bInflt = /* @__PURE__ */ __name(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]; -}, "bInflt"); -var bDflt = /* @__PURE__ */ __name(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]; -}, "bDflt"); -var gze = /* @__PURE__ */ __name(function() { - return [gzh, gzhl, wbytes, crc, crct]; -}, "gze"); -var guze = /* @__PURE__ */ __name(function() { - return [gzs, gzl]; -}, "guze"); -var zle = /* @__PURE__ */ __name(function() { - return [zlh, wbytes, adler]; -}, "zle"); -var zule = /* @__PURE__ */ __name(function() { - return [zls]; -}, "zule"); -var pbf = /* @__PURE__ */ __name(function(msg) { - return postMessage(msg, [msg.buffer]); -}, "pbf"); -var gopt = /* @__PURE__ */ __name(function(o) { - return o && { - out: o.size && new u8(o.size), - dictionary: o.dictionary - }; -}, "gopt"); -var cbify = /* @__PURE__ */ __name(function(dat, opts, fns, init, id2, cb) { - var w = wrkr(fns, init, id2, function(err2, dat2) { - w.terminate(); - cb(err2, dat2); - }); - w.postMessage([dat, opts], opts.consume ? [dat.buffer] : []); - return function() { - w.terminate(); - }; -}, "cbify"); -var astrm = /* @__PURE__ */ __name(function(strm) { - strm.ondata = function(dat, final) { - return postMessage([dat, final], [dat.buffer]); - }; - return function(ev) { - if (ev.data.length) { - strm.push(ev.data[0], ev.data[1]); - postMessage([ev.data[0].length]); - } else - strm.flush(); - }; -}, "astrm"); -var astrmify = /* @__PURE__ */ __name(function(fns, strm, opts, init, id2, flush, ext2) { - var t2; - var w = wrkr(fns, init, id2, function(err2, dat) { - if (err2) - w.terminate(), strm.ondata.call(strm, err2); - else if (!Array.isArray(dat)) - ext2(dat); - else if (dat.length == 1) { - strm.queuedSize -= dat[0]; - if (strm.ondrain) - strm.ondrain(dat[0]); - } else { - if (dat[1]) - w.terminate(); - strm.ondata.call(strm, err2, dat[0], dat[1]); + // move all keyframes either forwards or backwards in time + shift(timeOffset) { + if (timeOffset !== 0) { + const times = this.times; + for (let i = 0, n = times.length; i !== n; ++i) { + times[i] += timeOffset; + } } - }); - w.postMessage(opts); - strm.queuedSize = 0; - strm.push = function(d, f) { - if (!strm.ondata) - err(5); - if (t2) - strm.ondata(err(4, 0, 1), null, !!f); - strm.queuedSize += d.length; - w.postMessage([d, t2 = f], [d.buffer]); - }; - strm.terminate = function() { - w.terminate(); - }; - if (flush) { - strm.flush = function() { - w.postMessage([]); - }; - } -}, "astrmify"); -var b2 = /* @__PURE__ */ __name(function(d, b) { - return d[b] | d[b + 1] << 8; -}, "b2"); -var b4 = /* @__PURE__ */ __name(function(d, b) { - return (d[b] | d[b + 1] << 8 | d[b + 2] << 16 | d[b + 3] << 24) >>> 0; -}, "b4"); -var b8 = /* @__PURE__ */ __name(function(d, b) { - return b4(d, b) + b4(d, b + 4) * 4294967296; -}, "b8"); -var wbytes = /* @__PURE__ */ __name(function(d, b, v) { - for (; v; ++b) - d[b] = v, v >>>= 8; -}, "wbytes"); -var gzh = /* @__PURE__ */ __name(function(c, o) { - var fn = o.filename; - c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; - if (o.mtime != 0) - wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1e3)); - if (fn) { - c[3] = 8; - for (var i = 0; i <= fn.length; ++i) - c[i + 10] = fn.charCodeAt(i); + return this; } -}, "gzh"); -var gzs = /* @__PURE__ */ __name(function(d) { - if (d[0] != 31 || d[1] != 139 || d[2] != 8) - err(6, "invalid gzip data"); - var flg = d[3]; - var st = 10; - if (flg & 4) - st += (d[10] | d[11] << 8) + 2; - for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++]) - ; - return st + (flg & 2); -}, "gzs"); -var gzl = /* @__PURE__ */ __name(function(d) { - var l = d.length; - return (d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16 | d[l - 1] << 24) >>> 0; -}, "gzl"); -var gzhl = /* @__PURE__ */ __name(function(o) { - return 10 + (o.filename ? o.filename.length + 1 : 0); -}, "gzhl"); -var zlh = /* @__PURE__ */ __name(function(c, o) { - var lv = o.level, fl2 = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2; - c[0] = 120, c[1] = fl2 << 6 | (o.dictionary && 32); - c[1] |= 31 - (c[0] << 8 | c[1]) % 31; - if (o.dictionary) { - var h = adler(); - h.p(o.dictionary); - wbytes(c, 2, h.d()); + // scale all keyframe times by a factor (useful for frame <-> seconds conversions) + scale(timeScale) { + if (timeScale !== 1) { + const times = this.times; + for (let i = 0, n = times.length; i !== n; ++i) { + times[i] *= timeScale; + } + } + return this; } -}, "zlh"); -var zls = /* @__PURE__ */ __name(function(d, dict) { - if ((d[0] & 15) != 8 || d[0] >> 4 > 7 || (d[0] << 8 | d[1]) % 31) - err(6, "invalid zlib data"); - if ((d[1] >> 5 & 1) == +!dict) - err(6, "invalid zlib data: " + (d[1] & 32 ? "need" : "unexpected") + " dictionary"); - return (d[1] >> 3 & 4) + 2; -}, "zls"); -function StrmOpt(opts, cb) { - if (typeof opts == "function") - cb = opts, opts = {}; - this.ondata = cb; - return opts; -} -__name(StrmOpt, "StrmOpt"); -var Deflate = /* @__PURE__ */ function() { - function Deflate2(opts, cb) { - if (typeof opts == "function") - cb = opts, opts = {}; - this.ondata = cb; - this.o = opts || {}; - this.s = { l: 0, i: 32768, w: 32768, z: 32768 }; - this.b = new u8(98304); - if (this.o.dictionary) { - var dict = this.o.dictionary.subarray(-32768); - this.b.set(dict, 32768 - dict.length); - this.s.i = 32768 - dict.length; + // removes keyframes before and after animation without changing any values within the range [startTime, endTime]. + // IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values + trim(startTime, endTime) { + const times = this.times, nKeys = times.length; + let from = 0, to = nKeys - 1; + while (from !== nKeys && times[from] < startTime) { + ++from; + } + while (to !== -1 && times[to] > endTime) { + --to; + } + ++to; + if (from !== 0 || to !== nKeys) { + if (from >= to) { + to = Math.max(to, 1); + from = to - 1; + } + const stride = this.getValueSize(); + this.times = times.slice(from, to); + this.values = this.values.slice(from * stride, to * stride); } + return this; } - __name(Deflate2, "Deflate"); - Deflate2.prototype.p = function(c, f) { - this.ondata(dopt(c, this.o, 0, 0, this.s), f); - }; - Deflate2.prototype.push = function(chunk, final) { - if (!this.ondata) - err(5); - if (this.s.l) - err(4); - var endLen = chunk.length + this.s.z; - if (endLen > this.b.length) { - if (endLen > 2 * this.b.length - 32768) { - var newBuf = new u8(endLen & -32768); - newBuf.set(this.b.subarray(0, this.s.z)); - this.b = newBuf; + // ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable + validate() { + let valid = true; + const valueSize = this.getValueSize(); + if (valueSize - Math.floor(valueSize) !== 0) { + console.error("THREE.KeyframeTrack: Invalid value size in track.", this); + valid = false; + } + const times = this.times, values = this.values, nKeys = times.length; + if (nKeys === 0) { + console.error("THREE.KeyframeTrack: Track is empty.", this); + valid = false; + } + let prevTime = null; + for (let i = 0; i !== nKeys; i++) { + const currTime = times[i]; + if (typeof currTime === "number" && isNaN(currTime)) { + console.error("THREE.KeyframeTrack: Time is not a valid number.", this, i, currTime); + valid = false; + break; } - var split = this.b.length - this.s.z; - this.b.set(chunk.subarray(0, split), this.s.z); - this.s.z = this.b.length; - this.p(this.b, false); - this.b.set(this.b.subarray(-32768)); - this.b.set(chunk.subarray(split), 32768); - this.s.z = chunk.length - split + 32768; - this.s.i = 32766, this.s.w = 32768; - } else { - this.b.set(chunk, this.s.z); - this.s.z += chunk.length; + if (prevTime !== null && prevTime > currTime) { + console.error("THREE.KeyframeTrack: Out of order keys.", this, i, currTime, prevTime); + valid = false; + break; + } + prevTime = currTime; } - this.s.l = final & 1; - if (this.s.z > this.s.w + 8191 || final) { - this.p(this.b, final || false); - this.s.w = this.s.i, this.s.i -= 2; + if (values !== void 0) { + if (isTypedArray(values)) { + for (let i = 0, n = values.length; i !== n; ++i) { + const value = values[i]; + if (isNaN(value)) { + console.error("THREE.KeyframeTrack: Value is not a valid number.", this, i, value); + valid = false; + break; + } + } + } } - }; - Deflate2.prototype.flush = function() { - if (!this.ondata) - err(5); - if (this.s.l) - err(4); - this.p(this.b, false); - this.s.w = this.s.i, this.s.i -= 2; - }; - return Deflate2; -}(); -var AsyncDeflate = /* @__PURE__ */ function() { - function AsyncDeflate2(opts, cb) { - astrmify([ - bDflt, - function() { - return [astrm, Deflate]; + return valid; + } + // removes equivalent sequential keys as common in morph target sequences + // (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0) + optimize() { + const times = this.times.slice(), values = this.values.slice(), stride = this.getValueSize(), smoothInterpolation = this.getInterpolation() === InterpolateSmooth, lastIndex = times.length - 1; + let writeIndex = 1; + for (let i = 1; i < lastIndex; ++i) { + let keep = false; + const time = times[i]; + const timeNext = times[i + 1]; + if (time !== timeNext && (i !== 1 || time !== times[0])) { + if (!smoothInterpolation) { + const offset = i * stride, offsetP = offset - stride, offsetN = offset + stride; + for (let j = 0; j !== stride; ++j) { + const value = values[offset + j]; + if (value !== values[offsetP + j] || value !== values[offsetN + j]) { + keep = true; + break; + } + } + } else { + keep = true; + } } - ], this, StrmOpt.call(this, opts, cb), function(ev) { - var strm = new Deflate(ev.data); - onmessage = astrm(strm); - }, 6, 1); + if (keep) { + if (i !== writeIndex) { + times[writeIndex] = times[i]; + const readOffset = i * stride, writeOffset = writeIndex * stride; + for (let j = 0; j !== stride; ++j) { + values[writeOffset + j] = values[readOffset + j]; + } + } + ++writeIndex; + } + } + if (lastIndex > 0) { + times[writeIndex] = times[lastIndex]; + for (let readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++j) { + values[writeOffset + j] = values[readOffset + j]; + } + ++writeIndex; + } + if (writeIndex !== times.length) { + this.times = times.slice(0, writeIndex); + this.values = values.slice(0, writeIndex * stride); + } else { + this.times = times; + this.values = values; + } + return this; + } + clone() { + const times = this.times.slice(); + const values = this.values.slice(); + const TypedKeyframeTrack = this.constructor; + const track = new TypedKeyframeTrack(this.name, times, values); + track.createInterpolant = this.createInterpolant; + return track; } - __name(AsyncDeflate2, "AsyncDeflate"); - return AsyncDeflate2; -}(); -function deflate(data, opts, cb) { - if (!cb) - cb = opts, opts = {}; - if (typeof cb != "function") - err(7); - return cbify(data, opts, [ - bDflt - ], function(ev) { - return pbf(deflateSync(ev.data[0], ev.data[1])); - }, 0, cb); } -__name(deflate, "deflate"); -function deflateSync(data, opts) { - return dopt(data, opts || {}, 0, 0); +KeyframeTrack.prototype.TimeBufferType = Float32Array; +KeyframeTrack.prototype.ValueBufferType = Float32Array; +KeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear; +class BooleanKeyframeTrack extends KeyframeTrack { + static { + __name(this, "BooleanKeyframeTrack"); + } + // No interpolation parameter because only InterpolateDiscrete is valid. + constructor(name, times, values) { + super(name, times, values); + } } -__name(deflateSync, "deflateSync"); -var Inflate = /* @__PURE__ */ function() { - function Inflate2(opts, cb) { - if (typeof opts == "function") - cb = opts, opts = {}; - this.ondata = cb; - var dict = opts && opts.dictionary && opts.dictionary.subarray(-32768); - this.s = { i: 0, b: dict ? dict.length : 0 }; - this.o = new u8(32768); - this.p = new u8(0); - if (dict) - this.o.set(dict); +BooleanKeyframeTrack.prototype.ValueTypeName = "bool"; +BooleanKeyframeTrack.prototype.ValueBufferType = Array; +BooleanKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete; +BooleanKeyframeTrack.prototype.InterpolantFactoryMethodLinear = void 0; +BooleanKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = void 0; +class ColorKeyframeTrack extends KeyframeTrack { + static { + __name(this, "ColorKeyframeTrack"); } - __name(Inflate2, "Inflate"); - Inflate2.prototype.e = function(c) { - if (!this.ondata) - err(5); - if (this.d) - err(4); - if (!this.p.length) - this.p = c; - else if (c.length) { - var n = new u8(this.p.length + c.length); - n.set(this.p), n.set(c, this.p.length), this.p = n; +} +ColorKeyframeTrack.prototype.ValueTypeName = "color"; +class NumberKeyframeTrack extends KeyframeTrack { + static { + __name(this, "NumberKeyframeTrack"); + } +} +NumberKeyframeTrack.prototype.ValueTypeName = "number"; +class QuaternionLinearInterpolant extends Interpolant { + static { + __name(this, "QuaternionLinearInterpolant"); + } + constructor(parameterPositions, sampleValues, sampleSize, resultBuffer) { + super(parameterPositions, sampleValues, sampleSize, resultBuffer); + } + interpolate_(i1, t0, t2, t1) { + const result = this.resultBuffer, values = this.sampleValues, stride = this.valueSize, alpha = (t2 - t0) / (t1 - t0); + let offset = i1 * stride; + for (let end = offset + stride; offset !== end; offset += 4) { + Quaternion.slerpFlat(result, 0, values, offset - stride, values, offset, alpha); } - }; - Inflate2.prototype.c = function(final) { - this.s.i = +(this.d = final || false); - var bts = this.s.b; - var dt = inflt(this.p, this.s, this.o); - this.ondata(slc(dt, bts, this.s.b), this.d); - this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length; - this.p = slc(this.p, this.s.p / 8 | 0), this.s.p &= 7; - }; - Inflate2.prototype.push = function(chunk, final) { - this.e(chunk), this.c(final); - }; - return Inflate2; -}(); -var AsyncInflate = /* @__PURE__ */ function() { - function AsyncInflate2(opts, cb) { - astrmify([ - bInflt, - function() { - return [astrm, Inflate]; - } - ], this, StrmOpt.call(this, opts, cb), function(ev) { - var strm = new Inflate(ev.data); - onmessage = astrm(strm); - }, 7, 0); + return result; } - __name(AsyncInflate2, "AsyncInflate"); - return AsyncInflate2; -}(); -function inflate(data, opts, cb) { - if (!cb) - cb = opts, opts = {}; - if (typeof cb != "function") - err(7); - return cbify(data, opts, [ - bInflt - ], function(ev) { - return pbf(inflateSync(ev.data[0], gopt(ev.data[1]))); - }, 1, cb); } -__name(inflate, "inflate"); -function inflateSync(data, opts) { - return inflt(data, { i: 2 }, opts && opts.out, opts && opts.dictionary); +class QuaternionKeyframeTrack extends KeyframeTrack { + static { + __name(this, "QuaternionKeyframeTrack"); + } + InterpolantFactoryMethodLinear(result) { + return new QuaternionLinearInterpolant(this.times, this.values, this.getValueSize(), result); + } } -__name(inflateSync, "inflateSync"); -var Gzip = /* @__PURE__ */ function() { - function Gzip2(opts, cb) { - this.c = crc(); - this.l = 0; - this.v = 1; - Deflate.call(this, opts, cb); +QuaternionKeyframeTrack.prototype.ValueTypeName = "quaternion"; +QuaternionKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = void 0; +class StringKeyframeTrack extends KeyframeTrack { + static { + __name(this, "StringKeyframeTrack"); } - __name(Gzip2, "Gzip"); - Gzip2.prototype.push = function(chunk, final) { - this.c.p(chunk); - this.l += chunk.length; - Deflate.prototype.push.call(this, chunk, final); - }; - Gzip2.prototype.p = function(c, f) { - var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, this.s); - if (this.v) - gzh(raw, this.o), this.v = 0; - if (f) - wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l); - this.ondata(raw, f); - }; - Gzip2.prototype.flush = function() { - Deflate.prototype.flush.call(this); - }; - return Gzip2; -}(); -var AsyncGzip = /* @__PURE__ */ function() { - function AsyncGzip2(opts, cb) { - astrmify([ - bDflt, - gze, - function() { - return [astrm, Deflate, Gzip]; - } - ], this, StrmOpt.call(this, opts, cb), function(ev) { - var strm = new Gzip(ev.data); - onmessage = astrm(strm); - }, 8, 1); + // No interpolation parameter because only InterpolateDiscrete is valid. + constructor(name, times, values) { + super(name, times, values); } - __name(AsyncGzip2, "AsyncGzip"); - return AsyncGzip2; -}(); -function gzip(data, opts, cb) { - if (!cb) - cb = opts, opts = {}; - if (typeof cb != "function") - err(7); - return cbify(data, opts, [ - bDflt, - gze, - function() { - return [gzipSync]; - } - ], function(ev) { - return pbf(gzipSync(ev.data[0], ev.data[1])); - }, 2, cb); } -__name(gzip, "gzip"); -function gzipSync(data, opts) { - if (!opts) - opts = {}; - var c = crc(), l = data.length; - c.p(data); - var d = dopt(data, opts, gzhl(opts), 8), s = d.length; - return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d; +StringKeyframeTrack.prototype.ValueTypeName = "string"; +StringKeyframeTrack.prototype.ValueBufferType = Array; +StringKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete; +StringKeyframeTrack.prototype.InterpolantFactoryMethodLinear = void 0; +StringKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = void 0; +class VectorKeyframeTrack extends KeyframeTrack { + static { + __name(this, "VectorKeyframeTrack"); + } } -__name(gzipSync, "gzipSync"); -var Gunzip = /* @__PURE__ */ function() { - function Gunzip2(opts, cb) { - this.v = 1; - this.r = 0; - Inflate.call(this, opts, cb); +VectorKeyframeTrack.prototype.ValueTypeName = "vector"; +class AnimationClip { + static { + __name(this, "AnimationClip"); } - __name(Gunzip2, "Gunzip"); - Gunzip2.prototype.push = function(chunk, final) { - Inflate.prototype.e.call(this, chunk); - this.r += chunk.length; - if (this.v) { - var p = this.p.subarray(this.v - 1); - var s = p.length > 3 ? gzs(p) : 4; - if (s > p.length) { - if (!final) - return; - } else if (this.v > 1 && this.onmember) { - this.onmember(this.r - p.length); + constructor(name = "", duration = -1, tracks = [], blendMode = NormalAnimationBlendMode) { + this.name = name; + this.tracks = tracks; + this.duration = duration; + this.blendMode = blendMode; + this.uuid = generateUUID(); + if (this.duration < 0) { + this.resetDuration(); + } + } + static parse(json) { + const tracks = [], jsonTracks = json.tracks, frameTime = 1 / (json.fps || 1); + for (let i = 0, n = jsonTracks.length; i !== n; ++i) { + tracks.push(parseKeyframeTrack(jsonTracks[i]).scale(frameTime)); + } + const clip = new this(json.name, json.duration, tracks, json.blendMode); + clip.uuid = json.uuid; + return clip; + } + static toJSON(clip) { + const tracks = [], clipTracks = clip.tracks; + const json = { + "name": clip.name, + "duration": clip.duration, + "tracks": tracks, + "uuid": clip.uuid, + "blendMode": clip.blendMode + }; + for (let i = 0, n = clipTracks.length; i !== n; ++i) { + tracks.push(KeyframeTrack.toJSON(clipTracks[i])); + } + return json; + } + static CreateFromMorphTargetSequence(name, morphTargetSequence, fps, noLoop) { + const numMorphTargets = morphTargetSequence.length; + const tracks = []; + for (let i = 0; i < numMorphTargets; i++) { + let times = []; + let values = []; + times.push( + (i + numMorphTargets - 1) % numMorphTargets, + i, + (i + 1) % numMorphTargets + ); + values.push(0, 1, 0); + const order = getKeyframeOrder(times); + times = sortedArray(times, 1, order); + values = sortedArray(values, 1, order); + if (!noLoop && times[0] === 0) { + times.push(numMorphTargets); + values.push(values[0]); + } + tracks.push( + new NumberKeyframeTrack( + ".morphTargetInfluences[" + morphTargetSequence[i].name + "]", + times, + values + ).scale(1 / fps) + ); + } + return new this(name, -1, tracks); + } + static findByName(objectOrClipArray, name) { + let clipArray = objectOrClipArray; + if (!Array.isArray(objectOrClipArray)) { + const o = objectOrClipArray; + clipArray = o.geometry && o.geometry.animations || o.animations; + } + for (let i = 0; i < clipArray.length; i++) { + if (clipArray[i].name === name) { + return clipArray[i]; + } + } + return null; + } + static CreateClipsFromMorphTargetSequences(morphTargets, fps, noLoop) { + const animationToMorphTargets = {}; + const pattern = /^([\w-]*?)([\d]+)$/; + for (let i = 0, il = morphTargets.length; i < il; i++) { + const morphTarget = morphTargets[i]; + const parts = morphTarget.name.match(pattern); + if (parts && parts.length > 1) { + const name = parts[1]; + let animationMorphTargets = animationToMorphTargets[name]; + if (!animationMorphTargets) { + animationToMorphTargets[name] = animationMorphTargets = []; + } + animationMorphTargets.push(morphTarget); + } + } + const clips = []; + for (const name in animationToMorphTargets) { + clips.push(this.CreateFromMorphTargetSequence(name, animationToMorphTargets[name], fps, noLoop)); + } + return clips; + } + // parse the animation.hierarchy format + static parseAnimation(animation, bones) { + if (!animation) { + console.error("THREE.AnimationClip: No animation in JSONLoader data."); + return null; + } + const addNonemptyTrack = /* @__PURE__ */ __name(function(trackType, trackName, animationKeys, propertyName, destTracks) { + if (animationKeys.length !== 0) { + const times = []; + const values = []; + flattenJSON(animationKeys, times, values, propertyName); + if (times.length !== 0) { + destTracks.push(new trackType(trackName, times, values)); + } + } + }, "addNonemptyTrack"); + const tracks = []; + const clipName = animation.name || "default"; + const fps = animation.fps || 30; + const blendMode = animation.blendMode; + let duration = animation.length || -1; + const hierarchyTracks = animation.hierarchy || []; + for (let h = 0; h < hierarchyTracks.length; h++) { + const animationKeys = hierarchyTracks[h].keys; + if (!animationKeys || animationKeys.length === 0) continue; + if (animationKeys[0].morphTargets) { + const morphTargetNames = {}; + let k; + for (k = 0; k < animationKeys.length; k++) { + if (animationKeys[k].morphTargets) { + for (let m = 0; m < animationKeys[k].morphTargets.length; m++) { + morphTargetNames[animationKeys[k].morphTargets[m]] = -1; + } + } + } + for (const morphTargetName in morphTargetNames) { + const times = []; + const values = []; + for (let m = 0; m !== animationKeys[k].morphTargets.length; ++m) { + const animationKey = animationKeys[k]; + times.push(animationKey.time); + values.push(animationKey.morphTarget === morphTargetName ? 1 : 0); + } + tracks.push(new NumberKeyframeTrack(".morphTargetInfluence[" + morphTargetName + "]", times, values)); + } + duration = morphTargetNames.length * fps; + } else { + const boneName = ".bones[" + bones[h].name + "]"; + addNonemptyTrack( + VectorKeyframeTrack, + boneName + ".position", + animationKeys, + "pos", + tracks + ); + addNonemptyTrack( + QuaternionKeyframeTrack, + boneName + ".quaternion", + animationKeys, + "rot", + tracks + ); + addNonemptyTrack( + VectorKeyframeTrack, + boneName + ".scale", + animationKeys, + "scl", + tracks + ); } - this.p = p.subarray(s), this.v = 0; } - Inflate.prototype.c.call(this, final); - if (this.s.f && !this.s.l && !final) { - this.v = shft(this.s.p) + 9; - this.s = { i: 0 }; - this.o = new u8(0); - this.push(new u8(0), final); + if (tracks.length === 0) { + return null; } - }; - return Gunzip2; -}(); -var AsyncGunzip = /* @__PURE__ */ function() { - function AsyncGunzip2(opts, cb) { - var _this = this; - astrmify([ - bInflt, - guze, - function() { - return [astrm, Inflate, Gunzip]; - } - ], this, StrmOpt.call(this, opts, cb), function(ev) { - var strm = new Gunzip(ev.data); - strm.onmember = function(offset) { - return postMessage(offset); - }; - onmessage = astrm(strm); - }, 9, 0, function(offset) { - return _this.onmember && _this.onmember(offset); - }); + const clip = new this(clipName, duration, tracks, blendMode); + return clip; } - __name(AsyncGunzip2, "AsyncGunzip"); - return AsyncGunzip2; -}(); -function gunzip(data, opts, cb) { - if (!cb) - cb = opts, opts = {}; - if (typeof cb != "function") - err(7); - return cbify(data, opts, [ - bInflt, - guze, - function() { - return [gunzipSync]; + resetDuration() { + const tracks = this.tracks; + let duration = 0; + for (let i = 0, n = tracks.length; i !== n; ++i) { + const track = this.tracks[i]; + duration = Math.max(duration, track.times[track.times.length - 1]); } - ], function(ev) { - return pbf(gunzipSync(ev.data[0], ev.data[1])); - }, 3, cb); -} -__name(gunzip, "gunzip"); -function gunzipSync(data, opts) { - var st = gzs(data); - if (st + 8 > data.length) - err(6, "invalid gzip data"); - return inflt(data.subarray(st, -8), { i: 2 }, opts && opts.out || new u8(gzl(data)), opts && opts.dictionary); -} -__name(gunzipSync, "gunzipSync"); -var Zlib = /* @__PURE__ */ function() { - function Zlib2(opts, cb) { - this.c = adler(); - this.v = 1; - Deflate.call(this, opts, cb); - } - __name(Zlib2, "Zlib"); - Zlib2.prototype.push = function(chunk, final) { - this.c.p(chunk); - Deflate.prototype.push.call(this, chunk, final); - }; - Zlib2.prototype.p = function(c, f) { - var raw = dopt(c, this.o, this.v && (this.o.dictionary ? 6 : 2), f && 4, this.s); - if (this.v) - zlh(raw, this.o), this.v = 0; - if (f) - wbytes(raw, raw.length - 4, this.c.d()); - this.ondata(raw, f); - }; - Zlib2.prototype.flush = function() { - Deflate.prototype.flush.call(this); - }; - return Zlib2; -}(); -var AsyncZlib = /* @__PURE__ */ function() { - function AsyncZlib2(opts, cb) { - astrmify([ - bDflt, - zle, - function() { - return [astrm, Deflate, Zlib]; - } - ], this, StrmOpt.call(this, opts, cb), function(ev) { - var strm = new Zlib(ev.data); - onmessage = astrm(strm); - }, 10, 1); + this.duration = duration; + return this; } - __name(AsyncZlib2, "AsyncZlib"); - return AsyncZlib2; -}(); -function zlib(data, opts, cb) { - if (!cb) - cb = opts, opts = {}; - if (typeof cb != "function") - err(7); - return cbify(data, opts, [ - bDflt, - zle, - function() { - return [zlibSync]; + trim() { + for (let i = 0; i < this.tracks.length; i++) { + this.tracks[i].trim(0, this.duration); } - ], function(ev) { - return pbf(zlibSync(ev.data[0], ev.data[1])); - }, 4, cb); -} -__name(zlib, "zlib"); -function zlibSync(data, opts) { - if (!opts) - opts = {}; - var a = adler(); - a.p(data); - var d = dopt(data, opts, opts.dictionary ? 6 : 2, 4); - return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d; -} -__name(zlibSync, "zlibSync"); -var Unzlib = /* @__PURE__ */ function() { - function Unzlib2(opts, cb) { - Inflate.call(this, opts, cb); - this.v = opts && opts.dictionary ? 2 : 1; + return this; } - __name(Unzlib2, "Unzlib"); - Unzlib2.prototype.push = function(chunk, final) { - Inflate.prototype.e.call(this, chunk); - if (this.v) { - if (this.p.length < 6 && !final) - return; - this.p = this.p.subarray(zls(this.p, this.v - 1)), this.v = 0; + validate() { + let valid = true; + for (let i = 0; i < this.tracks.length; i++) { + valid = valid && this.tracks[i].validate(); } - if (final) { - if (this.p.length < 4) - err(6, "invalid zlib data"); - this.p = this.p.subarray(0, -4); + return valid; + } + optimize() { + for (let i = 0; i < this.tracks.length; i++) { + this.tracks[i].optimize(); } - Inflate.prototype.c.call(this, final); - }; - return Unzlib2; -}(); -var AsyncUnzlib = /* @__PURE__ */ function() { - function AsyncUnzlib2(opts, cb) { - astrmify([ - bInflt, - zule, - function() { - return [astrm, Inflate, Unzlib]; - } - ], this, StrmOpt.call(this, opts, cb), function(ev) { - var strm = new Unzlib(ev.data); - onmessage = astrm(strm); - }, 11, 0); + return this; } - __name(AsyncUnzlib2, "AsyncUnzlib"); - return AsyncUnzlib2; -}(); -function unzlib(data, opts, cb) { - if (!cb) - cb = opts, opts = {}; - if (typeof cb != "function") - err(7); - return cbify(data, opts, [ - bInflt, - zule, - function() { - return [unzlibSync]; + clone() { + const tracks = []; + for (let i = 0; i < this.tracks.length; i++) { + tracks.push(this.tracks[i].clone()); } - ], function(ev) { - return pbf(unzlibSync(ev.data[0], gopt(ev.data[1]))); - }, 5, cb); + return new this.constructor(this.name, this.duration, tracks, this.blendMode); + } + toJSON() { + return this.constructor.toJSON(this); + } } -__name(unzlib, "unzlib"); -function unzlibSync(data, opts) { - return inflt(data.subarray(zls(data, opts && opts.dictionary), -4), { i: 2 }, opts && opts.out, opts && opts.dictionary); +function getTrackTypeForValueTypeName(typeName) { + switch (typeName.toLowerCase()) { + case "scalar": + case "double": + case "float": + case "number": + case "integer": + return NumberKeyframeTrack; + case "vector": + case "vector2": + case "vector3": + case "vector4": + return VectorKeyframeTrack; + case "color": + return ColorKeyframeTrack; + case "quaternion": + return QuaternionKeyframeTrack; + case "bool": + case "boolean": + return BooleanKeyframeTrack; + case "string": + return StringKeyframeTrack; + } + throw new Error("THREE.KeyframeTrack: Unsupported typeName: " + typeName); } -__name(unzlibSync, "unzlibSync"); -var Decompress = /* @__PURE__ */ function() { - function Decompress2(opts, cb) { - this.o = StrmOpt.call(this, opts, cb) || {}; - this.G = Gunzip; - this.I = Inflate; - this.Z = Unzlib; +__name(getTrackTypeForValueTypeName, "getTrackTypeForValueTypeName"); +function parseKeyframeTrack(json) { + if (json.type === void 0) { + throw new Error("THREE.KeyframeTrack: track type undefined, can not parse"); } - __name(Decompress2, "Decompress"); - Decompress2.prototype.i = function() { - var _this = this; - this.s.ondata = function(dat, final) { - _this.ondata(dat, final); + const trackType = getTrackTypeForValueTypeName(json.type); + if (json.times === void 0) { + const times = [], values = []; + flattenJSON(json.keys, times, values, "value"); + json.times = times; + json.values = values; + } + if (trackType.parse !== void 0) { + return trackType.parse(json); + } else { + return new trackType(json.name, json.times, json.values, json.interpolation); + } +} +__name(parseKeyframeTrack, "parseKeyframeTrack"); +const Cache = { + enabled: false, + files: {}, + add: /* @__PURE__ */ __name(function(key, file2) { + if (this.enabled === false) return; + this.files[key] = file2; + }, "add"), + get: /* @__PURE__ */ __name(function(key) { + if (this.enabled === false) return; + return this.files[key]; + }, "get"), + remove: /* @__PURE__ */ __name(function(key) { + delete this.files[key]; + }, "remove"), + clear: /* @__PURE__ */ __name(function() { + this.files = {}; + }, "clear") +}; +class LoadingManager { + static { + __name(this, "LoadingManager"); + } + constructor(onLoad, onProgress, onError) { + const scope = this; + let isLoading = false; + let itemsLoaded = 0; + let itemsTotal = 0; + let urlModifier = void 0; + const handlers = []; + this.onStart = void 0; + this.onLoad = onLoad; + this.onProgress = onProgress; + this.onError = onError; + this.itemStart = function(url) { + itemsTotal++; + if (isLoading === false) { + if (scope.onStart !== void 0) { + scope.onStart(url, itemsLoaded, itemsTotal); + } + } + isLoading = true; }; - }; - Decompress2.prototype.push = function(chunk, final) { - if (!this.ondata) - err(5); - if (!this.s) { - if (this.p && this.p.length) { - var n = new u8(this.p.length + chunk.length); - n.set(this.p), n.set(chunk, this.p.length); - } else - this.p = chunk; - if (this.p.length > 2) { - this.s = this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8 ? new this.G(this.o) : (this.p[0] & 15) != 8 || this.p[0] >> 4 > 7 || (this.p[0] << 8 | this.p[1]) % 31 ? new this.I(this.o) : new this.Z(this.o); - this.i(); - this.s.push(this.p, final); - this.p = null; + this.itemEnd = function(url) { + itemsLoaded++; + if (scope.onProgress !== void 0) { + scope.onProgress(url, itemsLoaded, itemsTotal); + } + if (itemsLoaded === itemsTotal) { + isLoading = false; + if (scope.onLoad !== void 0) { + scope.onLoad(); + } } - } else - this.s.push(chunk, final); - }; - return Decompress2; -}(); -var AsyncDecompress = /* @__PURE__ */ function() { - function AsyncDecompress2(opts, cb) { - Decompress.call(this, opts, cb); - this.queuedSize = 0; - this.G = AsyncGunzip; - this.I = AsyncInflate; - this.Z = AsyncUnzlib; - } - __name(AsyncDecompress2, "AsyncDecompress"); - AsyncDecompress2.prototype.i = function() { - var _this = this; - this.s.ondata = function(err2, dat, final) { - _this.ondata(err2, dat, final); }; - this.s.ondrain = function(size) { - _this.queuedSize -= size; - if (_this.ondrain) - _this.ondrain(size); + this.itemError = function(url) { + if (scope.onError !== void 0) { + scope.onError(url); + } + }; + this.resolveURL = function(url) { + if (urlModifier) { + return urlModifier(url); + } + return url; + }; + this.setURLModifier = function(transform) { + urlModifier = transform; + return this; + }; + this.addHandler = function(regex, loader) { + handlers.push(regex, loader); + return this; + }; + this.removeHandler = function(regex) { + const index = handlers.indexOf(regex); + if (index !== -1) { + handlers.splice(index, 2); + } + return this; + }; + this.getHandler = function(file2) { + for (let i = 0, l = handlers.length; i < l; i += 2) { + const regex = handlers[i]; + const loader = handlers[i + 1]; + if (regex.global) regex.lastIndex = 0; + if (regex.test(file2)) { + return loader; + } + } + return null; }; - }; - AsyncDecompress2.prototype.push = function(chunk, final) { - this.queuedSize += chunk.length; - Decompress.prototype.push.call(this, chunk, final); - }; - return AsyncDecompress2; -}(); -function decompress(data, opts, cb) { - if (!cb) - cb = opts, opts = {}; - if (typeof cb != "function") - err(7); - return data[0] == 31 && data[1] == 139 && data[2] == 8 ? gunzip(data, opts, cb) : (data[0] & 15) != 8 || data[0] >> 4 > 7 || (data[0] << 8 | data[1]) % 31 ? inflate(data, opts, cb) : unzlib(data, opts, cb); -} -__name(decompress, "decompress"); -function decompressSync(data, opts) { - return data[0] == 31 && data[1] == 139 && data[2] == 8 ? gunzipSync(data, opts) : (data[0] & 15) != 8 || data[0] >> 4 > 7 || (data[0] << 8 | data[1]) % 31 ? inflateSync(data, opts) : unzlibSync(data, opts); -} -__name(decompressSync, "decompressSync"); -var fltn = /* @__PURE__ */ __name(function(d, p, t2, o) { - for (var k in d) { - var val = d[k], n = p + k, op = o; - if (Array.isArray(val)) - op = mrg(o, val[1]), val = val[0]; - if (val instanceof u8) - t2[n] = [val, op]; - else { - t2[n += "/"] = [new u8(0), op]; - fltn(val, n, t2, o); - } } -}, "fltn"); -var te = typeof TextEncoder != "undefined" && /* @__PURE__ */ new TextEncoder(); -var td = typeof TextDecoder != "undefined" && /* @__PURE__ */ new TextDecoder(); -var tds = 0; -try { - td.decode(et, { stream: true }); - tds = 1; -} catch (e) { } -var dutf8 = /* @__PURE__ */ __name(function(d) { - for (var r = "", i = 0; ; ) { - var c = d[i++]; - var eb = (c > 127) + (c > 223) + (c > 239); - if (i + eb > d.length) - return { s: r, r: slc(d, i - 1) }; - if (!eb) - r += String.fromCharCode(c); - else if (eb == 3) { - c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | d[i++] & 63) - 65536, r += String.fromCharCode(55296 | c >> 10, 56320 | c & 1023); - } else if (eb & 1) - r += String.fromCharCode((c & 31) << 6 | d[i++] & 63); - else - r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | d[i++] & 63); - } -}, "dutf8"); -var DecodeUTF8 = /* @__PURE__ */ function() { - function DecodeUTF82(cb) { - this.ondata = cb; - if (tds) - this.t = new TextDecoder(); - else - this.p = et; +const DefaultLoadingManager = /* @__PURE__ */ new LoadingManager(); +class Loader { + static { + __name(this, "Loader"); } - __name(DecodeUTF82, "DecodeUTF8"); - DecodeUTF82.prototype.push = function(chunk, final) { - if (!this.ondata) - err(5); - final = !!final; - if (this.t) { - this.ondata(this.t.decode(chunk, { stream: true }), final); - if (final) { - if (this.t.decode().length) - err(8); - this.t = null; - } - return; - } - if (!this.p) - err(4); - var dat = new u8(this.p.length + chunk.length); - dat.set(this.p); - dat.set(chunk, this.p.length); - var _a2 = dutf8(dat), s = _a2.s, r = _a2.r; - if (final) { - if (r.length) - err(8); - this.p = null; - } else - this.p = r; - this.ondata(s, final); - }; - return DecodeUTF82; -}(); -var EncodeUTF8 = /* @__PURE__ */ function() { - function EncodeUTF82(cb) { - this.ondata = cb; + constructor(manager) { + this.manager = manager !== void 0 ? manager : DefaultLoadingManager; + this.crossOrigin = "anonymous"; + this.withCredentials = false; + this.path = ""; + this.resourcePath = ""; + this.requestHeader = {}; } - __name(EncodeUTF82, "EncodeUTF8"); - EncodeUTF82.prototype.push = function(chunk, final) { - if (!this.ondata) - err(5); - if (this.d) - err(4); - this.ondata(strToU8(chunk), this.d = final || false); - }; - return EncodeUTF82; -}(); -function strToU8(str, latin1) { - if (latin1) { - var ar_1 = new u8(str.length); - for (var i = 0; i < str.length; ++i) - ar_1[i] = str.charCodeAt(i); - return ar_1; + load() { } - if (te) - return te.encode(str); - var l = str.length; - var ar = new u8(str.length + (str.length >> 1)); - var ai = 0; - var w = /* @__PURE__ */ __name(function(v) { - ar[ai++] = v; - }, "w"); - for (var i = 0; i < l; ++i) { - if (ai + 5 > ar.length) { - var n = new u8(ai + 8 + (l - i << 1)); - n.set(ar); - ar = n; - } - var c = str.charCodeAt(i); - if (c < 128 || latin1) - w(c); - else if (c < 2048) - w(192 | c >> 6), w(128 | c & 63); - else if (c > 55295 && c < 57344) - c = 65536 + (c & 1023 << 10) | str.charCodeAt(++i) & 1023, w(240 | c >> 18), w(128 | c >> 12 & 63), w(128 | c >> 6 & 63), w(128 | c & 63); - else - w(224 | c >> 12), w(128 | c >> 6 & 63), w(128 | c & 63); + loadAsync(url, onProgress) { + const scope = this; + return new Promise(function(resolve, reject) { + scope.load(url, resolve, onProgress, reject); + }); } - return slc(ar, 0, ai); -} -__name(strToU8, "strToU8"); -function strFromU8(dat, latin1) { - if (latin1) { - var r = ""; - for (var i = 0; i < dat.length; i += 16384) - r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384)); - return r; - } else if (td) { - return td.decode(dat); - } else { - var _a2 = dutf8(dat), s = _a2.s, r = _a2.r; - if (r.length) - err(8); - return s; + parse() { } -} -__name(strFromU8, "strFromU8"); -; -var dbf = /* @__PURE__ */ __name(function(l) { - return l == 1 ? 3 : l < 6 ? 2 : l == 9 ? 1 : 0; -}, "dbf"); -var slzh = /* @__PURE__ */ __name(function(d, b) { - return b + 30 + b2(d, b + 26) + b2(d, b + 28); -}, "slzh"); -var zh = /* @__PURE__ */ __name(function(d, b, z) { - 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); - var _a2 = z && bs == 4294967295 ? z64e(d, es) : [bs, b4(d, b + 24), b4(d, b + 42)], sc = _a2[0], su = _a2[1], off = _a2[2]; - return [b2(d, b + 10), sc, su, fn, es + b2(d, b + 30) + b2(d, b + 32), off]; -}, "zh"); -var z64e = /* @__PURE__ */ __name(function(d, b) { - for (; b2(d, b) != 1; b += 4 + b2(d, b + 2)) - ; - return [b8(d, b + 12), b8(d, b + 4), b8(d, b + 20)]; -}, "z64e"); -var exfl = /* @__PURE__ */ __name(function(ex) { - var le = 0; - if (ex) { - for (var k in ex) { - var l = ex[k].length; - if (l > 65535) - err(9); - le += l + 4; - } + setCrossOrigin(crossOrigin) { + this.crossOrigin = crossOrigin; + return this; } - return le; -}, "exfl"); -var wzh = /* @__PURE__ */ __name(function(d, b, f, fn, u, c, ce, co) { - var fl2 = fn.length, ex = f.extra, col = co && co.length; - var exl = exfl(ex); - wbytes(d, b, ce != null ? 33639248 : 67324752), b += 4; - if (ce != null) - d[b++] = 20, d[b++] = f.os; - d[b] = 20, b += 2; - d[b++] = f.flag << 1 | (c < 0 && 8), d[b++] = u && 8; - d[b++] = f.compression & 255, d[b++] = f.compression >> 8; - var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980; - if (y < 0 || y > 119) - err(10); - wbytes(d, b, y << 25 | dt.getMonth() + 1 << 21 | dt.getDate() << 16 | dt.getHours() << 11 | dt.getMinutes() << 5 | dt.getSeconds() >> 1), b += 4; - if (c != -1) { - wbytes(d, b, f.crc); - wbytes(d, b + 4, c < 0 ? -c - 2 : c); - wbytes(d, b + 8, f.size); + setWithCredentials(value) { + this.withCredentials = value; + return this; } - wbytes(d, b + 12, fl2); - wbytes(d, b + 14, exl), b += 16; - if (ce != null) { - wbytes(d, b, col); - wbytes(d, b + 6, f.attrs); - wbytes(d, b + 10, ce), b += 14; + setPath(path) { + this.path = path; + return this; } - d.set(fn, b); - b += fl2; - if (exl) { - for (var k in ex) { - var exf = ex[k], l = exf.length; - wbytes(d, b, +k); - wbytes(d, b + 2, l); - d.set(exf, b + 4), b += 4 + l; - } + setResourcePath(resourcePath) { + this.resourcePath = resourcePath; + return this; } - if (col) - d.set(co, b), b += col; - return b; -}, "wzh"); -var wzf = /* @__PURE__ */ __name(function(o, b, c, d, e) { - wbytes(o, b, 101010256); - wbytes(o, b + 8, c); - wbytes(o, b + 10, c); - wbytes(o, b + 12, d); - wbytes(o, b + 16, e); -}, "wzf"); -var ZipPassThrough = /* @__PURE__ */ function() { - function ZipPassThrough2(filename) { - this.filename = filename; - this.c = crc(); - this.size = 0; - this.compression = 0; + setRequestHeader(requestHeader) { + this.requestHeader = requestHeader; + return this; } - __name(ZipPassThrough2, "ZipPassThrough"); - ZipPassThrough2.prototype.process = function(chunk, final) { - this.ondata(null, chunk, final); - }; - ZipPassThrough2.prototype.push = function(chunk, final) { - if (!this.ondata) - err(5); - this.c.p(chunk); - this.size += chunk.length; - if (final) - this.crc = this.c.d(); - this.process(chunk, final || false); - }; - return ZipPassThrough2; -}(); -var ZipDeflate = /* @__PURE__ */ function() { - function ZipDeflate2(filename, opts) { - var _this = this; - if (!opts) - opts = {}; - ZipPassThrough.call(this, filename); - this.d = new Deflate(opts, function(dat, final) { - _this.ondata(null, dat, final); - }); - this.compression = 8; - this.flag = dbf(opts.level); +} +Loader.DEFAULT_MATERIAL_NAME = "__DEFAULT"; +const loading = {}; +class HttpError extends Error { + static { + __name(this, "HttpError"); } - __name(ZipDeflate2, "ZipDeflate"); - ZipDeflate2.prototype.process = function(chunk, final) { - try { - this.d.push(chunk, final); - } catch (e) { - this.ondata(e, null, final); - } - }; - ZipDeflate2.prototype.push = function(chunk, final) { - ZipPassThrough.prototype.push.call(this, chunk, final); - }; - return ZipDeflate2; -}(); -var AsyncZipDeflate = /* @__PURE__ */ function() { - function AsyncZipDeflate2(filename, opts) { - var _this = this; - if (!opts) - opts = {}; - ZipPassThrough.call(this, filename); - this.d = new AsyncDeflate(opts, function(err2, dat, final) { - _this.ondata(err2, dat, final); - }); - this.compression = 8; - this.flag = dbf(opts.level); - this.terminate = this.d.terminate; + constructor(message, response) { + super(message); + this.response = response; } - __name(AsyncZipDeflate2, "AsyncZipDeflate"); - AsyncZipDeflate2.prototype.process = function(chunk, final) { - this.d.push(chunk, final); - }; - AsyncZipDeflate2.prototype.push = function(chunk, final) { - ZipPassThrough.prototype.push.call(this, chunk, final); - }; - return AsyncZipDeflate2; -}(); -var Zip = /* @__PURE__ */ function() { - function Zip2(cb) { - this.ondata = cb; - this.u = []; - this.d = 1; +} +class FileLoader extends Loader { + static { + __name(this, "FileLoader"); } - __name(Zip2, "Zip"); - Zip2.prototype.add = function(file2) { - var _this = this; - if (!this.ondata) - err(5); - if (this.d & 2) - this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, false); - else { - var f = strToU8(file2.filename), fl_1 = f.length; - var com = file2.comment, o = com && strToU8(com); - var u = fl_1 != file2.filename.length || o && com.length != o.length; - var hl_1 = fl_1 + exfl(file2.extra) + 30; - if (fl_1 > 65535) - this.ondata(err(11, 0, 1), null, false); - var header = new u8(hl_1); - wzh(header, 0, file2, f, u, -1); - var chks_1 = [header]; - var pAll_1 = /* @__PURE__ */ __name(function() { - for (var _i = 0, chks_2 = chks_1; _i < chks_2.length; _i++) { - var chk = chks_2[_i]; - _this.ondata(null, chk, false); - } - chks_1 = []; - }, "pAll_1"); - var tr_1 = this.d; - this.d = 0; - var ind_1 = this.u.length; - var uf_1 = mrg(file2, { - f, - u, - o, - t: /* @__PURE__ */ __name(function() { - if (file2.terminate) - file2.terminate(); - }, "t"), - r: /* @__PURE__ */ __name(function() { - pAll_1(); - if (tr_1) { - var nxt = _this.u[ind_1 + 1]; - if (nxt) - nxt.r(); - else - _this.d = 1; - } - tr_1 = 1; - }, "r") - }); - var cl_1 = 0; - file2.ondata = function(err2, dat, final) { - if (err2) { - _this.ondata(err2, dat, final); - _this.terminate(); - } else { - cl_1 += dat.length; - chks_1.push(dat); - if (final) { - var dd = new u8(16); - wbytes(dd, 0, 134695760); - wbytes(dd, 4, file2.crc); - wbytes(dd, 8, cl_1); - wbytes(dd, 12, file2.size); - chks_1.push(dd); - uf_1.c = cl_1, uf_1.b = hl_1 + cl_1 + 16, uf_1.crc = file2.crc, uf_1.size = file2.size; - if (tr_1) - uf_1.r(); - tr_1 = 1; - } else if (tr_1) - pAll_1(); - } - }; - this.u.push(uf_1); - } - }; - Zip2.prototype.end = function() { - var _this = this; - if (this.d & 2) { - this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, true); - return; + constructor(manager) { + super(manager); + } + load(url, onLoad, onProgress, onError) { + if (url === void 0) url = ""; + if (this.path !== void 0) url = this.path + url; + url = this.manager.resolveURL(url); + const cached = Cache.get(url); + if (cached !== void 0) { + this.manager.itemStart(url); + setTimeout(() => { + if (onLoad) onLoad(cached); + this.manager.itemEnd(url); + }, 0); + return cached; } - if (this.d) - this.e(); - else - this.u.push({ - r: /* @__PURE__ */ __name(function() { - if (!(_this.d & 1)) - return; - _this.u.splice(-1, 1); - _this.e(); - }, "r"), - t: /* @__PURE__ */ __name(function() { - }, "t") + if (loading[url] !== void 0) { + loading[url].push({ + onLoad, + onProgress, + onError }); - this.d = 3; - }; - Zip2.prototype.e = function() { - var bt = 0, l = 0, tl = 0; - for (var _i = 0, _a2 = this.u; _i < _a2.length; _i++) { - var f = _a2[_i]; - tl += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0); - } - var out = new u8(tl + 22); - for (var _b2 = 0, _c = this.u; _b2 < _c.length; _b2++) { - var f = _c[_b2]; - wzh(out, bt, f, f.f, f.u, -f.c - 2, l, f.o); - bt += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0), l += f.b; - } - wzf(out, bt, this.u.length, tl, l); - this.ondata(null, out, true); - this.d = 2; - }; - Zip2.prototype.terminate = function() { - for (var _i = 0, _a2 = this.u; _i < _a2.length; _i++) { - var f = _a2[_i]; - f.t(); + return; } - this.d = 2; - }; - return Zip2; -}(); -function zip(data, opts, cb) { - if (!cb) - cb = opts, opts = {}; - if (typeof cb != "function") - err(7); - var r = {}; - fltn(data, "", r, opts); - var k = Object.keys(r); - var lft = k.length, o = 0, tot = 0; - var slft = lft, files = new Array(lft); - var term = []; - var tAll = /* @__PURE__ */ __name(function() { - for (var i2 = 0; i2 < term.length; ++i2) - term[i2](); - }, "tAll"); - var cbd = /* @__PURE__ */ __name(function(a, b) { - mt(function() { - cb(a, b); + loading[url] = []; + loading[url].push({ + onLoad, + onProgress, + onError }); - }, "cbd"); - mt(function() { - cbd = cb; - }); - var cbf = /* @__PURE__ */ __name(function() { - var out = new u8(tot + 22), oe = o, cdl = tot - o; - tot = 0; - for (var i2 = 0; i2 < slft; ++i2) { - var f = files[i2]; - try { - var l = f.c.length; - wzh(out, tot, f, f.f, f.u, l); - var badd = 30 + f.f.length + exfl(f.extra); - var loc = tot + badd; - out.set(f.c, loc); - wzh(out, o, f, f.f, f.u, l, tot, f.m), o += 16 + badd + (f.m ? f.m.length : 0), tot = loc + l; - } catch (e) { - return cbd(e, null); - } - } - wzf(out, o, files.length, cdl, oe); - cbd(null, out); - }, "cbf"); - if (!lft) - cbf(); - var _loop_1 = /* @__PURE__ */ __name(function(i2) { - var fn = k[i2]; - var _a2 = r[fn], file2 = _a2[0], p = _a2[1]; - var c = crc(), size = file2.length; - c.p(file2); - var f = strToU8(fn), s = f.length; - var com = p.comment, m = com && strToU8(com), ms = m && m.length; - var exl = exfl(p.extra); - var compression = p.level == 0 ? 0 : 8; - var cbl = /* @__PURE__ */ __name(function(e, d) { - if (e) { - tAll(); - cbd(e, null); - } else { - var l = d.length; - files[i2] = mrg(p, { - size, - crc: c.d(), - c: d, - f, - m, - u: s != fn.length || m && com.length != ms, - compression + const req = new Request(url, { + headers: new Headers(this.requestHeader), + credentials: this.withCredentials ? "include" : "same-origin" + // An abort controller could be added within a future PR + }); + const mimeType = this.mimeType; + const responseType = this.responseType; + fetch(req).then((response) => { + if (response.status === 200 || response.status === 0) { + if (response.status === 0) { + console.warn("THREE.FileLoader: HTTP Status 0 received."); + } + if (typeof ReadableStream === "undefined" || response.body === void 0 || response.body.getReader === void 0) { + return response; + } + const callbacks = loading[url]; + const reader = response.body.getReader(); + const contentLength = response.headers.get("X-File-Size") || response.headers.get("Content-Length"); + const total = contentLength ? parseInt(contentLength) : 0; + const lengthComputable = total !== 0; + let loaded = 0; + const stream = new ReadableStream({ + start(controller) { + readData(); + function readData() { + reader.read().then(({ done, value }) => { + if (done) { + controller.close(); + } else { + loaded += value.byteLength; + const event = new ProgressEvent("progress", { lengthComputable, loaded, total }); + for (let i = 0, il = callbacks.length; i < il; i++) { + const callback = callbacks[i]; + if (callback.onProgress) callback.onProgress(event); + } + controller.enqueue(value); + readData(); + } + }, (e) => { + controller.error(e); + }); + } + __name(readData, "readData"); + } }); - o += 30 + s + exl + l; - tot += 76 + 2 * (s + exl) + (ms || 0) + l; - if (!--lft) - cbf(); + return new Response(stream); + } else { + throw new HttpError(`fetch for "${response.url}" responded with ${response.status}: ${response.statusText}`, response); + } + }).then((response) => { + switch (responseType) { + case "arraybuffer": + return response.arrayBuffer(); + case "blob": + return response.blob(); + case "document": + return response.text().then((text) => { + const parser = new DOMParser(); + return parser.parseFromString(text, mimeType); + }); + case "json": + return response.json(); + default: + if (mimeType === void 0) { + return response.text(); + } else { + const re = /charset="?([^;"\s]*)"?/i; + const exec = re.exec(mimeType); + const label = exec && exec[1] ? exec[1].toLowerCase() : void 0; + const decoder = new TextDecoder(label); + return response.arrayBuffer().then((ab) => decoder.decode(ab)); + } } - }, "cbl"); - if (s > 65535) - cbl(err(11, 0, 1), null); - if (!compression) - cbl(null, file2); - else if (size < 16e4) { - try { - cbl(null, deflateSync(file2, p)); - } catch (e) { - cbl(e, null); + }).then((data) => { + Cache.add(url, data); + const callbacks = loading[url]; + delete loading[url]; + for (let i = 0, il = callbacks.length; i < il; i++) { + const callback = callbacks[i]; + if (callback.onLoad) callback.onLoad(data); } - } else - term.push(deflate(file2, p, cbl)); - }, "_loop_1"); - for (var i = 0; i < slft; ++i) { - _loop_1(i); + }).catch((err2) => { + const callbacks = loading[url]; + if (callbacks === void 0) { + this.manager.itemError(url); + throw err2; + } + delete loading[url]; + for (let i = 0, il = callbacks.length; i < il; i++) { + const callback = callbacks[i]; + if (callback.onError) callback.onError(err2); + } + this.manager.itemError(url); + }).finally(() => { + this.manager.itemEnd(url); + }); + this.manager.itemStart(url); } - return tAll; -} -__name(zip, "zip"); -function zipSync(data, opts) { - if (!opts) - opts = {}; - var r = {}; - var files = []; - fltn(data, "", r, opts); - var o = 0; - var tot = 0; - for (var fn in r) { - var _a2 = r[fn], file2 = _a2[0], p = _a2[1]; - var compression = p.level == 0 ? 0 : 8; - var f = strToU8(fn), s = f.length; - var com = p.comment, m = com && strToU8(com), ms = m && m.length; - var exl = exfl(p.extra); - if (s > 65535) - err(11); - var d = compression ? deflateSync(file2, p) : file2, l = d.length; - var c = crc(); - c.p(file2); - files.push(mrg(p, { - size: file2.length, - crc: c.d(), - c: d, - f, - m, - u: s != fn.length || m && com.length != ms, - o, - compression - })); - o += 30 + s + exl + l; - tot += 76 + 2 * (s + exl) + (ms || 0) + l; + setResponseType(value) { + this.responseType = value; + return this; } - var out = new u8(tot + 22), oe = o, cdl = tot - o; - for (var i = 0; i < files.length; ++i) { - var f = files[i]; - wzh(out, f.o, f, f.f, f.u, f.c.length); - var badd = 30 + f.f.length + exfl(f.extra); - out.set(f.c, f.o + badd); - wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0); + setMimeType(value) { + this.mimeType = value; + return this; } - wzf(out, o, files.length, cdl, oe); - return out; } -__name(zipSync, "zipSync"); -var UnzipPassThrough = /* @__PURE__ */ function() { - function UnzipPassThrough2() { +class AnimationLoader extends Loader { + static { + __name(this, "AnimationLoader"); } - __name(UnzipPassThrough2, "UnzipPassThrough"); - UnzipPassThrough2.prototype.push = function(data, final) { - this.ondata(null, data, final); - }; - UnzipPassThrough2.compression = 0; - return UnzipPassThrough2; -}(); -var UnzipInflate = /* @__PURE__ */ function() { - function UnzipInflate2() { - var _this = this; - this.i = new Inflate(function(dat, final) { - _this.ondata(null, dat, final); - }); + constructor(manager) { + super(manager); } - __name(UnzipInflate2, "UnzipInflate"); - UnzipInflate2.prototype.push = function(data, final) { - try { - this.i.push(data, final); - } catch (e) { - this.ondata(e, null, final); - } - }; - UnzipInflate2.compression = 8; - return UnzipInflate2; -}(); -var AsyncUnzipInflate = /* @__PURE__ */ function() { - function AsyncUnzipInflate2(_, sz) { - var _this = this; - if (sz < 32e4) { - this.i = new Inflate(function(dat, final) { - _this.ondata(null, dat, final); - }); - } else { - this.i = new AsyncInflate(function(err2, dat, final) { - _this.ondata(err2, dat, final); - }); - this.terminate = this.i.terminate; + load(url, onLoad, onProgress, onError) { + const scope = this; + const loader = new FileLoader(this.manager); + loader.setPath(this.path); + loader.setRequestHeader(this.requestHeader); + loader.setWithCredentials(this.withCredentials); + loader.load(url, function(text) { + try { + onLoad(scope.parse(JSON.parse(text))); + } catch (e) { + if (onError) { + onError(e); + } else { + console.error(e); + } + scope.manager.itemError(url); + } + }, onProgress, onError); + } + parse(json) { + const animations = []; + for (let i = 0; i < json.length; i++) { + const clip = AnimationClip.parse(json[i]); + animations.push(clip); } + return animations; } - __name(AsyncUnzipInflate2, "AsyncUnzipInflate"); - AsyncUnzipInflate2.prototype.push = function(data, final) { - if (this.i.terminate) - data = slc(data, 0); - this.i.push(data, final); - }; - AsyncUnzipInflate2.compression = 8; - return AsyncUnzipInflate2; -}(); -var Unzip = /* @__PURE__ */ function() { - function Unzip2(cb) { - this.onfile = cb; - this.k = []; - this.o = { - 0: UnzipPassThrough - }; - this.p = et; +} +class CompressedTextureLoader extends Loader { + static { + __name(this, "CompressedTextureLoader"); } - __name(Unzip2, "Unzip"); - Unzip2.prototype.push = function(chunk, final) { - var _this = this; - if (!this.onfile) - err(5); - if (!this.p) - err(4); - if (this.c > 0) { - var len = Math.min(this.c, chunk.length); - var toAdd = chunk.subarray(0, len); - this.c -= len; - if (this.d) - this.d.push(toAdd, !this.c); - else - this.k[0].push(toAdd); - chunk = chunk.subarray(len); - if (chunk.length) - return this.push(chunk, final); - } else { - var f = 0, i = 0, is = void 0, buf = void 0; - if (!this.p.length) - buf = chunk; - else if (!chunk.length) - buf = this.p; - else { - buf = new u8(this.p.length + chunk.length); - buf.set(this.p), buf.set(chunk, this.p.length); - } - var l = buf.length, oc = this.c, add = oc && this.d; - var _loop_2 = /* @__PURE__ */ __name(function() { - var _a2; - var sig = b4(buf, i); - if (sig == 67324752) { - f = 1, is = i; - this_1.d = null; - this_1.c = 0; - 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); - if (l > i + 30 + fnl + es) { - var chks_3 = []; - this_1.k.unshift(chks_3); - f = 2; - var sc_1 = b4(buf, i + 18), su_1 = b4(buf, i + 22); - var fn_1 = strFromU8(buf.subarray(i + 30, i += 30 + fnl), !u); - if (sc_1 == 4294967295) { - _a2 = dd ? [-2] : z64e(buf, i), sc_1 = _a2[0], su_1 = _a2[1]; - } else if (dd) - sc_1 = -1; - i += es; - this_1.c = sc_1; - var d_1; - var file_1 = { - name: fn_1, - compression: cmp_1, - start: /* @__PURE__ */ __name(function() { - if (!file_1.ondata) - err(5); - if (!sc_1) - file_1.ondata(null, et, true); - else { - var ctr = _this.o[cmp_1]; - if (!ctr) - file_1.ondata(err(14, "unknown compression type " + cmp_1, 1), null, false); - d_1 = sc_1 < 0 ? new ctr(fn_1) : new ctr(fn_1, sc_1, su_1); - d_1.ondata = function(err2, dat3, final2) { - file_1.ondata(err2, dat3, final2); - }; - for (var _i = 0, chks_4 = chks_3; _i < chks_4.length; _i++) { - var dat2 = chks_4[_i]; - d_1.push(dat2, false); - } - if (_this.k[0] == chks_3 && _this.c) - _this.d = d_1; - else - d_1.push(et, true); - } - }, "start"), - terminate: /* @__PURE__ */ __name(function() { - if (d_1 && d_1.terminate) - d_1.terminate(); - }, "terminate") - }; - if (sc_1 >= 0) - file_1.size = sc_1, file_1.originalSize = su_1; - this_1.onfile(file_1); - } - return "break"; - } else if (oc) { - if (sig == 134695760) { - is = i += 12 + (oc == -2 && 8), f = 3, this_1.c = 0; - return "break"; - } else if (sig == 33639248) { - is = i -= 4, f = 3, this_1.c = 0; - return "break"; - } + constructor(manager) { + super(manager); + } + load(url, onLoad, onProgress, onError) { + const scope = this; + const images = []; + const texture = new CompressedTexture(); + const loader = new FileLoader(this.manager); + loader.setPath(this.path); + loader.setResponseType("arraybuffer"); + loader.setRequestHeader(this.requestHeader); + loader.setWithCredentials(scope.withCredentials); + let loaded = 0; + function loadTexture(i) { + loader.load(url[i], function(buffer) { + const texDatas = scope.parse(buffer, true); + images[i] = { + width: texDatas.width, + height: texDatas.height, + format: texDatas.format, + mipmaps: texDatas.mipmaps + }; + loaded += 1; + if (loaded === 6) { + if (texDatas.mipmapCount === 1) texture.minFilter = LinearFilter; + texture.image = images; + texture.format = texDatas.format; + texture.needsUpdate = true; + if (onLoad) onLoad(texture); } - }, "_loop_2"); - var this_1 = this; - for (; i < l - 4; ++i) { - var state_1 = _loop_2(); - if (state_1 === "break") - break; - } - this.p = et; - if (oc < 0) { - var dat = f ? buf.subarray(0, is - 12 - (oc == -2 && 8) - (b4(buf, is - 16) == 134695760 && 4)) : buf.subarray(0, i); - if (add) - add.push(dat, !!f); - else - this.k[+(f == 2)].push(dat); - } - if (f & 2) - return this.push(buf.subarray(i), final); - this.p = buf.subarray(i); - } - if (final) { - if (this.c) - err(13); - this.p = null; - } - }; - Unzip2.prototype.register = function(decoder) { - this.o[decoder.compression] = decoder; - }; - return Unzip2; -}(); -var mt = typeof queueMicrotask == "function" ? queueMicrotask : typeof setTimeout == "function" ? setTimeout : function(fn) { - fn(); -}; -function unzip(data, opts, cb) { - if (!cb) - cb = opts, opts = {}; - if (typeof cb != "function") - err(7); - var term = []; - var tAll = /* @__PURE__ */ __name(function() { - for (var i2 = 0; i2 < term.length; ++i2) - term[i2](); - }, "tAll"); - var files = {}; - var cbd = /* @__PURE__ */ __name(function(a, b) { - mt(function() { - cb(a, b); - }); - }, "cbd"); - mt(function() { - cbd = cb; - }); - var e = data.length - 22; - for (; b4(data, e) != 101010256; --e) { - if (!e || data.length - e > 65558) { - cbd(err(13, 0, 1), null); - return tAll; + }, onProgress, onError); } - } - ; - var lft = b2(data, e + 8); - if (lft) { - var c = lft; - var o = b4(data, e + 16); - var z = o == 4294967295 || c == 65535; - if (z) { - var ze = b4(data, e - 12); - z = b4(data, ze) == 101075792; - if (z) { - c = lft = b4(data, ze + 32); - o = b4(data, ze + 48); + __name(loadTexture, "loadTexture"); + if (Array.isArray(url)) { + for (let i = 0, il = url.length; i < il; ++i) { + loadTexture(i); } - } - var fltr = opts && opts.filter; - var _loop_3 = /* @__PURE__ */ __name(function(i2) { - var _a2 = zh(data, o, z), c_1 = _a2[0], sc = _a2[1], su = _a2[2], fn = _a2[3], no = _a2[4], off = _a2[5], b = slzh(data, off); - o = no; - var cbl = /* @__PURE__ */ __name(function(e2, d) { - if (e2) { - tAll(); - cbd(e2, null); + } else { + loader.load(url, function(buffer) { + const texDatas = scope.parse(buffer, true); + if (texDatas.isCubemap) { + const faces = texDatas.mipmaps.length / texDatas.mipmapCount; + for (let f = 0; f < faces; f++) { + images[f] = { mipmaps: [] }; + for (let i = 0; i < texDatas.mipmapCount; i++) { + images[f].mipmaps.push(texDatas.mipmaps[f * texDatas.mipmapCount + i]); + images[f].format = texDatas.format; + images[f].width = texDatas.width; + images[f].height = texDatas.height; + } + } + texture.image = images; } else { - if (d) - files[fn] = d; - if (!--lft) - cbd(null, files); + texture.image.width = texDatas.width; + texture.image.height = texDatas.height; + texture.mipmaps = texDatas.mipmaps; } - }, "cbl"); - if (!fltr || fltr({ - name: fn, - size: sc, - originalSize: su, - compression: c_1 - })) { - if (!c_1) - cbl(null, slc(data, b, b + sc)); - else if (c_1 == 8) { - var infl = data.subarray(b, b + sc); - if (su < 524288 || sc > 0.8 * su) { - try { - cbl(null, inflateSync(infl, { out: new u8(su) })); - } catch (e2) { - cbl(e2, null); - } - } else - term.push(inflate(infl, { size: su }, cbl)); - } else - cbl(err(14, "unknown compression type " + c_1, 1), null); - } else - cbl(null, null); - }, "_loop_3"); - for (var i = 0; i < c; ++i) { - _loop_3(i); + if (texDatas.mipmapCount === 1) { + texture.minFilter = LinearFilter; + } + texture.format = texDatas.format; + texture.needsUpdate = true; + if (onLoad) onLoad(texture); + }, onProgress, onError); } - } else - cbd(null, {}); - return tAll; + return texture; + } } -__name(unzip, "unzip"); -function unzipSync(data, opts) { - var files = {}; - var e = data.length - 22; - for (; b4(data, e) != 101010256; --e) { - if (!e || data.length - e > 65558) - err(13); +class ImageLoader extends Loader { + static { + __name(this, "ImageLoader"); } - ; - var c = b2(data, e + 8); - if (!c) - return {}; - var o = b4(data, e + 16); - var z = o == 4294967295 || c == 65535; - if (z) { - var ze = b4(data, e - 12); - z = b4(data, ze) == 101075792; - if (z) { - c = b4(data, ze + 32); - o = b4(data, ze + 48); - } + constructor(manager) { + super(manager); } - var fltr = opts && opts.filter; - for (var i = 0; i < c; ++i) { - var _a2 = zh(data, o, z), c_2 = _a2[0], sc = _a2[1], su = _a2[2], fn = _a2[3], no = _a2[4], off = _a2[5], b = slzh(data, off); - o = no; - if (!fltr || fltr({ - name: fn, - size: sc, - originalSize: su, - compression: c_2 - })) { - if (!c_2) - files[fn] = slc(data, b, b + sc); - else if (c_2 == 8) - files[fn] = inflateSync(data.subarray(b, b + sc), { out: new u8(su) }); - else - err(14, "unknown compression type " + c_2); + load(url, onLoad, onProgress, onError) { + if (this.path !== void 0) url = this.path + url; + url = this.manager.resolveURL(url); + const scope = this; + const cached = Cache.get(url); + if (cached !== void 0) { + scope.manager.itemStart(url); + setTimeout(function() { + if (onLoad) onLoad(cached); + scope.manager.itemEnd(url); + }, 0); + return cached; + } + const image = createElementNS("img"); + function onImageLoad() { + removeEventListeners(); + Cache.add(url, this); + if (onLoad) onLoad(this); + scope.manager.itemEnd(url); + } + __name(onImageLoad, "onImageLoad"); + function onImageError(event) { + removeEventListeners(); + if (onError) onError(event); + scope.manager.itemError(url); + scope.manager.itemEnd(url); + } + __name(onImageError, "onImageError"); + function removeEventListeners() { + image.removeEventListener("load", onImageLoad, false); + image.removeEventListener("error", onImageError, false); + } + __name(removeEventListeners, "removeEventListeners"); + image.addEventListener("load", onImageLoad, false); + image.addEventListener("error", onImageError, false); + if (url.slice(0, 5) !== "data:") { + if (this.crossOrigin !== void 0) image.crossOrigin = this.crossOrigin; } + scope.manager.itemStart(url); + image.src = url; + return image; } - return files; } -__name(unzipSync, "unzipSync"); -function findSpan(p, u, U) { - const n = U.length - p - 1; - if (u >= U[n]) { - return n - 1; +class CubeTextureLoader extends Loader { + static { + __name(this, "CubeTextureLoader"); } - if (u <= U[p]) { - return p; + constructor(manager) { + super(manager); } - let low = p; - let high = n; - let mid = Math.floor((low + high) / 2); - while (u < U[mid] || u >= U[mid + 1]) { - if (u < U[mid]) { - high = mid; - } else { - low = mid; + load(urls, onLoad, onProgress, onError) { + const texture = new CubeTexture(); + texture.colorSpace = SRGBColorSpace; + const loader = new ImageLoader(this.manager); + loader.setCrossOrigin(this.crossOrigin); + loader.setPath(this.path); + let loaded = 0; + function loadTexture(i) { + loader.load(urls[i], function(image) { + texture.images[i] = image; + loaded++; + if (loaded === 6) { + texture.needsUpdate = true; + if (onLoad) onLoad(texture); + } + }, void 0, onError); } - mid = Math.floor((low + high) / 2); - } - return mid; -} -__name(findSpan, "findSpan"); -function calcBasisFunctions(span, u, p, U) { - const N = []; - const left = []; - const right = []; - N[0] = 1; - for (let j = 1; j <= p; ++j) { - left[j] = u - U[span + 1 - j]; - right[j] = U[span + j] - u; - let saved = 0; - for (let r = 0; r < j; ++r) { - const rv = right[r + 1]; - const lv = left[j - r]; - const temp = N[r] / (rv + lv); - N[r] = saved + rv * temp; - saved = lv * temp; + __name(loadTexture, "loadTexture"); + for (let i = 0; i < urls.length; ++i) { + loadTexture(i); } - N[j] = saved; - } - return N; -} -__name(calcBasisFunctions, "calcBasisFunctions"); -function calcBSplinePoint(p, U, P, u) { - const span = findSpan(p, u, U); - const N = calcBasisFunctions(span, u, p, U); - const C = new Vector4(0, 0, 0, 0); - for (let j = 0; j <= p; ++j) { - const point = P[span - p + j]; - const Nj = N[j]; - const wNj = point.w * Nj; - C.x += point.x * wNj; - C.y += point.y * wNj; - C.z += point.z * wNj; - C.w += point.w * Nj; + return texture; } - return C; } -__name(calcBSplinePoint, "calcBSplinePoint"); -function calcBasisFunctionDerivatives(span, u, p, n, U) { - const zeroArr = []; - for (let i = 0; i <= p; ++i) - zeroArr[i] = 0; - const ders = []; - for (let i = 0; i <= n; ++i) - ders[i] = zeroArr.slice(0); - const ndu = []; - for (let i = 0; i <= p; ++i) - ndu[i] = zeroArr.slice(0); - ndu[0][0] = 1; - const left = zeroArr.slice(0); - const right = zeroArr.slice(0); - for (let j = 1; j <= p; ++j) { - left[j] = u - U[span + 1 - j]; - right[j] = U[span + j] - u; - let saved = 0; - for (let r2 = 0; r2 < j; ++r2) { - const rv = right[r2 + 1]; - const lv = left[j - r2]; - ndu[j][r2] = rv + lv; - const temp = ndu[r2][j - 1] / ndu[j][r2]; - ndu[r2][j] = saved + rv * temp; - saved = lv * temp; - } - ndu[j][j] = saved; +class DataTextureLoader extends Loader { + static { + __name(this, "DataTextureLoader"); } - for (let j = 0; j <= p; ++j) { - ders[0][j] = ndu[j][p]; + constructor(manager) { + super(manager); } - for (let r2 = 0; r2 <= p; ++r2) { - let s1 = 0; - let s2 = 1; - const a = []; - for (let i = 0; i <= p; ++i) { - a[i] = zeroArr.slice(0); - } - a[0][0] = 1; - for (let k = 1; k <= n; ++k) { - let d = 0; - const rk = r2 - k; - const pk = p - k; - if (r2 >= k) { - a[s2][0] = a[s1][0] / ndu[pk + 1][rk]; - d = a[s2][0] * ndu[rk][pk]; + load(url, onLoad, onProgress, onError) { + const scope = this; + const texture = new DataTexture(); + const loader = new FileLoader(this.manager); + loader.setResponseType("arraybuffer"); + loader.setRequestHeader(this.requestHeader); + loader.setPath(this.path); + loader.setWithCredentials(scope.withCredentials); + loader.load(url, function(buffer) { + let texData; + try { + texData = scope.parse(buffer); + } catch (error) { + if (onError !== void 0) { + onError(error); + } else { + console.error(error); + return; + } } - const j1 = rk >= -1 ? 1 : -rk; - const j2 = r2 - 1 <= pk ? k - 1 : p - r2; - for (let j3 = j1; j3 <= j2; ++j3) { - a[s2][j3] = (a[s1][j3] - a[s1][j3 - 1]) / ndu[pk + 1][rk + j3]; - d += a[s2][j3] * ndu[rk + j3][pk]; + if (texData.image !== void 0) { + texture.image = texData.image; + } else if (texData.data !== void 0) { + texture.image.width = texData.width; + texture.image.height = texData.height; + texture.image.data = texData.data; } - if (r2 <= pk) { - a[s2][k] = -a[s1][k - 1] / ndu[pk + 1][r2]; - d += a[s2][k] * ndu[r2][pk]; + texture.wrapS = texData.wrapS !== void 0 ? texData.wrapS : ClampToEdgeWrapping; + texture.wrapT = texData.wrapT !== void 0 ? texData.wrapT : ClampToEdgeWrapping; + texture.magFilter = texData.magFilter !== void 0 ? texData.magFilter : LinearFilter; + texture.minFilter = texData.minFilter !== void 0 ? texData.minFilter : LinearFilter; + texture.anisotropy = texData.anisotropy !== void 0 ? texData.anisotropy : 1; + if (texData.colorSpace !== void 0) { + texture.colorSpace = texData.colorSpace; } - ders[k][r2] = d; - const j = s1; - s1 = s2; - s2 = j; - } - } - let r = p; - for (let k = 1; k <= n; ++k) { - for (let j = 0; j <= p; ++j) { - ders[k][j] *= r; - } - r *= p - k; + if (texData.flipY !== void 0) { + texture.flipY = texData.flipY; + } + if (texData.format !== void 0) { + texture.format = texData.format; + } + if (texData.type !== void 0) { + texture.type = texData.type; + } + if (texData.mipmaps !== void 0) { + texture.mipmaps = texData.mipmaps; + texture.minFilter = LinearMipmapLinearFilter; + } + if (texData.mipmapCount === 1) { + texture.minFilter = LinearFilter; + } + if (texData.generateMipmaps !== void 0) { + texture.generateMipmaps = texData.generateMipmaps; + } + texture.needsUpdate = true; + if (onLoad) onLoad(texture, texData); + }, onProgress, onError); + return texture; } - return ders; } -__name(calcBasisFunctionDerivatives, "calcBasisFunctionDerivatives"); -function calcBSplineDerivatives(p, U, P, u, nd) { - const du = nd < p ? nd : p; - const CK = []; - const span = findSpan(p, u, U); - const nders = calcBasisFunctionDerivatives(span, u, p, du, U); - const Pw = []; - for (let i = 0; i < P.length; ++i) { - const point = P[i].clone(); - const w = point.w; - point.x *= w; - point.y *= w; - point.z *= w; - Pw[i] = point; +class TextureLoader extends Loader { + static { + __name(this, "TextureLoader"); } - for (let k = 0; k <= du; ++k) { - const point = Pw[span - p].clone().multiplyScalar(nders[k][0]); - for (let j = 1; j <= p; ++j) { - point.add(Pw[span - p + j].clone().multiplyScalar(nders[k][j])); - } - CK[k] = point; + constructor(manager) { + super(manager); } - for (let k = du + 1; k <= nd + 1; ++k) { - CK[k] = new Vector4(0, 0, 0); + load(url, onLoad, onProgress, onError) { + const texture = new Texture(); + const loader = new ImageLoader(this.manager); + loader.setCrossOrigin(this.crossOrigin); + loader.setPath(this.path); + loader.load(url, function(image) { + texture.image = image; + texture.needsUpdate = true; + if (onLoad !== void 0) { + onLoad(texture); + } + }, onProgress, onError); + return texture; } - return CK; } -__name(calcBSplineDerivatives, "calcBSplineDerivatives"); -function calcKoverI(k, i) { - let nom = 1; - for (let j = 2; j <= k; ++j) { - nom *= j; +class Light extends Object3D { + static { + __name(this, "Light"); } - let denom = 1; - for (let j = 2; j <= i; ++j) { - denom *= j; + constructor(color, intensity = 1) { + super(); + this.isLight = true; + this.type = "Light"; + this.color = new Color(color); + this.intensity = intensity; } - for (let j = 2; j <= k - i; ++j) { - denom *= j; + dispose() { } - return nom / denom; -} -__name(calcKoverI, "calcKoverI"); -function calcRationalCurveDerivatives(Pders) { - const nd = Pders.length; - const Aders = []; - const wders = []; - for (let i = 0; i < nd; ++i) { - const point = Pders[i]; - Aders[i] = new Vector3(point.x, point.y, point.z); - wders[i] = point.w; + copy(source, recursive) { + super.copy(source, recursive); + this.color.copy(source.color); + this.intensity = source.intensity; + return this; } - const CK = []; - for (let k = 0; k < nd; ++k) { - const v = Aders[k].clone(); - for (let i = 1; i <= k; ++i) { - v.sub(CK[k - i].clone().multiplyScalar(calcKoverI(k, i) * wders[i])); - } - CK[k] = v.divideScalar(wders[0]); + toJSON(meta) { + const data = super.toJSON(meta); + data.object.color = this.color.getHex(); + data.object.intensity = this.intensity; + if (this.groundColor !== void 0) data.object.groundColor = this.groundColor.getHex(); + if (this.distance !== void 0) data.object.distance = this.distance; + if (this.angle !== void 0) data.object.angle = this.angle; + if (this.decay !== void 0) data.object.decay = this.decay; + if (this.penumbra !== void 0) data.object.penumbra = this.penumbra; + if (this.shadow !== void 0) data.object.shadow = this.shadow.toJSON(); + if (this.target !== void 0) data.object.target = this.target.uuid; + return data; } - return CK; -} -__name(calcRationalCurveDerivatives, "calcRationalCurveDerivatives"); -function calcNURBSDerivatives(p, U, P, u, nd) { - const Pders = calcBSplineDerivatives(p, U, P, u, nd); - return calcRationalCurveDerivatives(Pders); } -__name(calcNURBSDerivatives, "calcNURBSDerivatives"); -function calcSurfacePoint(p, q, U, V, P, u, v, target) { - const uspan = findSpan(p, u, U); - const vspan = findSpan(q, v, V); - const Nu = calcBasisFunctions(uspan, u, p, U); - const Nv = calcBasisFunctions(vspan, v, q, V); - const temp = []; - for (let l = 0; l <= q; ++l) { - temp[l] = new Vector4(0, 0, 0, 0); - for (let k = 0; k <= p; ++k) { - const point = P[uspan - p + k][vspan - q + l].clone(); - const w = point.w; - point.x *= w; - point.y *= w; - point.z *= w; - temp[l].add(point.multiplyScalar(Nu[k])); - } - } - const Sw = new Vector4(0, 0, 0, 0); - for (let l = 0; l <= q; ++l) { - Sw.add(temp[l].multiplyScalar(Nv[l])); +class HemisphereLight extends Light { + static { + __name(this, "HemisphereLight"); } - Sw.divideScalar(Sw.w); - target.set(Sw.x, Sw.y, Sw.z); -} -__name(calcSurfacePoint, "calcSurfacePoint"); -function calcVolumePoint(p, q, r, U, V, W, P, u, v, w, target) { - const uspan = findSpan(p, u, U); - const vspan = findSpan(q, v, V); - const wspan = findSpan(r, w, W); - const Nu = calcBasisFunctions(uspan, u, p, U); - const Nv = calcBasisFunctions(vspan, v, q, V); - const Nw = calcBasisFunctions(wspan, w, r, W); - const temp = []; - for (let m = 0; m <= r; ++m) { - temp[m] = []; - for (let l = 0; l <= q; ++l) { - temp[m][l] = new Vector4(0, 0, 0, 0); - for (let k = 0; k <= p; ++k) { - const point = P[uspan - p + k][vspan - q + l][wspan - r + m].clone(); - const w2 = point.w; - point.x *= w2; - point.y *= w2; - point.z *= w2; - temp[m][l].add(point.multiplyScalar(Nu[k])); - } - } + constructor(skyColor, groundColor, intensity) { + super(skyColor, intensity); + this.isHemisphereLight = true; + this.type = "HemisphereLight"; + this.position.copy(Object3D.DEFAULT_UP); + this.updateMatrix(); + this.groundColor = new Color(groundColor); } - const Sw = new Vector4(0, 0, 0, 0); - for (let m = 0; m <= r; ++m) { - for (let l = 0; l <= q; ++l) { - Sw.add(temp[m][l].multiplyScalar(Nw[m]).multiplyScalar(Nv[l])); - } + copy(source, recursive) { + super.copy(source, recursive); + this.groundColor.copy(source.groundColor); + return this; } - Sw.divideScalar(Sw.w); - target.set(Sw.x, Sw.y, Sw.z); } -__name(calcVolumePoint, "calcVolumePoint"); -class NURBSCurve extends Curve { +const _projScreenMatrix$1 = /* @__PURE__ */ new Matrix4(); +const _lightPositionWorld$1 = /* @__PURE__ */ new Vector3(); +const _lookTarget$1 = /* @__PURE__ */ new Vector3(); +class LightShadow { static { - __name(this, "NURBSCurve"); + __name(this, "LightShadow"); } - constructor(degree, knots, controlPoints, startKnot, endKnot) { - super(); - const knotsLength = knots ? knots.length - 1 : 0; - const pointsLength = controlPoints ? controlPoints.length : 0; - this.degree = degree; - this.knots = knots; - this.controlPoints = []; - this.startKnot = startKnot || 0; - this.endKnot = endKnot || knotsLength; - for (let i = 0; i < pointsLength; ++i) { - const point = controlPoints[i]; - this.controlPoints[i] = new Vector4(point.x, point.y, point.z, point.w); - } + constructor(camera) { + this.camera = camera; + this.intensity = 1; + this.bias = 0; + this.normalBias = 0; + this.radius = 1; + this.blurSamples = 8; + this.mapSize = new Vector2(512, 512); + this.map = null; + this.mapPass = null; + this.matrix = new Matrix4(); + this.autoUpdate = true; + this.needsUpdate = false; + this._frustum = new Frustum(); + this._frameExtents = new Vector2(1, 1); + this._viewportCount = 1; + this._viewports = [ + new Vector4(0, 0, 1, 1) + ]; } - getPoint(t2, optionalTarget = new Vector3()) { - const point = optionalTarget; - const u = this.knots[this.startKnot] + t2 * (this.knots[this.endKnot] - this.knots[this.startKnot]); - const hpoint = calcBSplinePoint(this.degree, this.knots, this.controlPoints, u); - if (hpoint.w !== 1) { - hpoint.divideScalar(hpoint.w); - } - return point.set(hpoint.x, hpoint.y, hpoint.z); + getViewportCount() { + return this._viewportCount; } - getTangent(t2, optionalTarget = new Vector3()) { - const tangent = optionalTarget; - const u = this.knots[0] + t2 * (this.knots[this.knots.length - 1] - this.knots[0]); - const ders = calcNURBSDerivatives(this.degree, this.knots, this.controlPoints, u, 1); - tangent.copy(ders[1]).normalize(); - return tangent; + getFrustum() { + return this._frustum; } - toJSON() { - const data = super.toJSON(); - data.degree = this.degree; - data.knots = [...this.knots]; - data.controlPoints = this.controlPoints.map((p) => p.toArray()); - data.startKnot = this.startKnot; - data.endKnot = this.endKnot; - return data; + updateMatrices(light) { + const shadowCamera = this.camera; + const shadowMatrix = this.matrix; + _lightPositionWorld$1.setFromMatrixPosition(light.matrixWorld); + shadowCamera.position.copy(_lightPositionWorld$1); + _lookTarget$1.setFromMatrixPosition(light.target.matrixWorld); + shadowCamera.lookAt(_lookTarget$1); + shadowCamera.updateMatrixWorld(); + _projScreenMatrix$1.multiplyMatrices(shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse); + this._frustum.setFromProjectionMatrix(_projScreenMatrix$1); + shadowMatrix.set( + 0.5, + 0, + 0, + 0.5, + 0, + 0.5, + 0, + 0.5, + 0, + 0, + 0.5, + 0.5, + 0, + 0, + 0, + 1 + ); + shadowMatrix.multiply(_projScreenMatrix$1); } - fromJSON(json) { - super.fromJSON(json); - this.degree = json.degree; - this.knots = [...json.knots]; - this.controlPoints = json.controlPoints.map((p) => new Vector4(p[0], p[1], p[2], p[3])); - this.startKnot = json.startKnot; - this.endKnot = json.endKnot; + getViewport(viewportIndex) { + return this._viewports[viewportIndex]; + } + getFrameExtents() { + return this._frameExtents; + } + dispose() { + if (this.map) { + this.map.dispose(); + } + if (this.mapPass) { + this.mapPass.dispose(); + } + } + copy(source) { + this.camera = source.camera.clone(); + this.intensity = source.intensity; + this.bias = source.bias; + this.radius = source.radius; + this.mapSize.copy(source.mapSize); return this; } + clone() { + return new this.constructor().copy(this); + } + toJSON() { + const object = {}; + if (this.intensity !== 1) object.intensity = this.intensity; + if (this.bias !== 0) object.bias = this.bias; + if (this.normalBias !== 0) object.normalBias = this.normalBias; + if (this.radius !== 1) object.radius = this.radius; + if (this.mapSize.x !== 512 || this.mapSize.y !== 512) object.mapSize = this.mapSize.toArray(); + object.camera = this.camera.toJSON(false).object; + delete object.camera.matrix; + return object; + } } -let fbxTree; -let connections; -let sceneGraph; -class FBXLoader extends Loader { +class SpotLightShadow extends LightShadow { static { - __name(this, "FBXLoader"); - } - constructor(manager) { - super(manager); + __name(this, "SpotLightShadow"); } - load(url, onLoad, onProgress, onError) { - const scope = this; - const path = scope.path === "" ? LoaderUtils.extractUrlBase(url) : scope.path; - const loader = new FileLoader(this.manager); - loader.setPath(scope.path); - loader.setResponseType("arraybuffer"); - loader.setRequestHeader(scope.requestHeader); - loader.setWithCredentials(scope.withCredentials); - loader.load(url, function(buffer) { - try { - onLoad(scope.parse(buffer, path)); - } catch (e) { - if (onError) { - onError(e); - } else { - console.error(e); - } - scope.manager.itemError(url); - } - }, onProgress, onError); + constructor() { + super(new PerspectiveCamera(50, 1, 0.5, 500)); + this.isSpotLightShadow = true; + this.focus = 1; } - parse(FBXBuffer, path) { - if (isFbxFormatBinary(FBXBuffer)) { - fbxTree = new BinaryParser().parse(FBXBuffer); - } else { - const FBXText = convertArrayBufferToString(FBXBuffer); - if (!isFbxFormatASCII(FBXText)) { - throw new Error("THREE.FBXLoader: Unknown format."); - } - if (getFbxVersion(FBXText) < 7e3) { - throw new Error("THREE.FBXLoader: FBX version not supported, FileVersion: " + getFbxVersion(FBXText)); - } - fbxTree = new TextParser().parse(FBXText); + updateMatrices(light) { + const camera = this.camera; + const fov2 = RAD2DEG * 2 * light.angle * this.focus; + const aspect2 = this.mapSize.width / this.mapSize.height; + const far = light.distance || camera.far; + if (fov2 !== camera.fov || aspect2 !== camera.aspect || far !== camera.far) { + camera.fov = fov2; + camera.aspect = aspect2; + camera.far = far; + camera.updateProjectionMatrix(); } - const textureLoader = new TextureLoader(this.manager).setPath(this.resourcePath || path).setCrossOrigin(this.crossOrigin); - return new FBXTreeParser(textureLoader, this.manager).parse(fbxTree); + super.updateMatrices(light); + } + copy(source) { + super.copy(source); + this.focus = source.focus; + return this; } } -class FBXTreeParser { +class SpotLight extends Light { static { - __name(this, "FBXTreeParser"); + __name(this, "SpotLight"); } - constructor(textureLoader, manager) { - this.textureLoader = textureLoader; - this.manager = manager; + constructor(color, intensity, distance = 0, angle = Math.PI / 3, penumbra = 0, decay = 2) { + super(color, intensity); + this.isSpotLight = true; + this.type = "SpotLight"; + this.position.copy(Object3D.DEFAULT_UP); + this.updateMatrix(); + this.target = new Object3D(); + this.distance = distance; + this.angle = angle; + this.penumbra = penumbra; + this.decay = decay; + this.map = null; + this.shadow = new SpotLightShadow(); } - parse() { - connections = this.parseConnections(); - const images = this.parseImages(); - const textures = this.parseTextures(images); - const materials = this.parseMaterials(textures); - const deformers = this.parseDeformers(); - const geometryMap = new GeometryParser().parse(deformers); - this.parseScene(deformers, geometryMap, materials); - return sceneGraph; + get power() { + return this.intensity * Math.PI; } - // Parses FBXTree.Connections which holds parent-child connections between objects (e.g. material -> texture, model->geometry ) - // and details the connection type - parseConnections() { - const connectionMap = /* @__PURE__ */ new Map(); - if ("Connections" in fbxTree) { - const rawConnections = fbxTree.Connections.connections; - rawConnections.forEach(function(rawConnection) { - const fromID = rawConnection[0]; - const toID = rawConnection[1]; - const relationship = rawConnection[2]; - if (!connectionMap.has(fromID)) { - connectionMap.set(fromID, { - parents: [], - children: [] - }); - } - const parentRelationship = { ID: toID, relationship }; - connectionMap.get(fromID).parents.push(parentRelationship); - if (!connectionMap.has(toID)) { - connectionMap.set(toID, { - parents: [], - children: [] - }); - } - const childRelationship = { ID: fromID, relationship }; - connectionMap.get(toID).children.push(childRelationship); - }); - } - return connectionMap; + set power(power) { + this.intensity = power / Math.PI; } - // Parse FBXTree.Objects.Video for embedded image data - // These images are connected to textures in FBXTree.Objects.Textures - // via FBXTree.Connections. - parseImages() { - const images = {}; - const blobs = {}; - if ("Video" in fbxTree.Objects) { - const videoNodes = fbxTree.Objects.Video; - for (const nodeID in videoNodes) { - const videoNode = videoNodes[nodeID]; - const id2 = parseInt(nodeID); - images[id2] = videoNode.RelativeFilename || videoNode.Filename; - if ("Content" in videoNode) { - const arrayBufferContent = videoNode.Content instanceof ArrayBuffer && videoNode.Content.byteLength > 0; - const base64Content = typeof videoNode.Content === "string" && videoNode.Content !== ""; - if (arrayBufferContent || base64Content) { - const image = this.parseImage(videoNodes[nodeID]); - blobs[videoNode.RelativeFilename || videoNode.Filename] = image; - } - } - } - } - for (const id2 in images) { - const filename = images[id2]; - if (blobs[filename] !== void 0) images[id2] = blobs[filename]; - else images[id2] = images[id2].split("\\").pop(); - } - return images; + dispose() { + this.shadow.dispose(); } - // Parse embedded image data in FBXTree.Video.Content - parseImage(videoNode) { - const content = videoNode.Content; - const fileName = videoNode.RelativeFilename || videoNode.Filename; - const extension = fileName.slice(fileName.lastIndexOf(".") + 1).toLowerCase(); - let type; - switch (extension) { - case "bmp": - type = "image/bmp"; - break; - case "jpg": - case "jpeg": - type = "image/jpeg"; - break; - case "png": - type = "image/png"; - break; - case "tif": - type = "image/tiff"; - break; - case "tga": - if (this.manager.getHandler(".tga") === null) { - console.warn("FBXLoader: TGA loader not found, skipping ", fileName); - } - type = "image/tga"; - break; - default: - console.warn('FBXLoader: Image type "' + extension + '" is not supported.'); - return; - } - if (typeof content === "string") { - return "data:" + type + ";base64," + content; - } else { - const array = new Uint8Array(content); - return window.URL.createObjectURL(new Blob([array], { type })); - } + copy(source, recursive) { + super.copy(source, recursive); + this.distance = source.distance; + this.angle = source.angle; + this.penumbra = source.penumbra; + this.decay = source.decay; + this.target = source.target.clone(); + this.shadow = source.shadow.clone(); + return this; } - // Parse nodes in FBXTree.Objects.Texture - // These contain details such as UV scaling, cropping, rotation etc and are connected - // to images in FBXTree.Objects.Video - parseTextures(images) { - const textureMap = /* @__PURE__ */ new Map(); - if ("Texture" in fbxTree.Objects) { - const textureNodes = fbxTree.Objects.Texture; - for (const nodeID in textureNodes) { - const texture = this.parseTexture(textureNodes[nodeID], images); - textureMap.set(parseInt(nodeID), texture); - } - } - return textureMap; +} +const _projScreenMatrix = /* @__PURE__ */ new Matrix4(); +const _lightPositionWorld = /* @__PURE__ */ new Vector3(); +const _lookTarget = /* @__PURE__ */ new Vector3(); +class PointLightShadow extends LightShadow { + static { + __name(this, "PointLightShadow"); } - // Parse individual node in FBXTree.Objects.Texture - parseTexture(textureNode, images) { - const texture = this.loadTexture(textureNode, images); - texture.ID = textureNode.id; - texture.name = textureNode.attrName; - const wrapModeU = textureNode.WrapModeU; - const wrapModeV = textureNode.WrapModeV; - const valueU = wrapModeU !== void 0 ? wrapModeU.value : 0; - const valueV = wrapModeV !== void 0 ? wrapModeV.value : 0; - texture.wrapS = valueU === 0 ? RepeatWrapping : ClampToEdgeWrapping; - texture.wrapT = valueV === 0 ? RepeatWrapping : ClampToEdgeWrapping; - if ("Scaling" in textureNode) { - const values = textureNode.Scaling.value; - texture.repeat.x = values[0]; - texture.repeat.y = values[1]; - } - if ("Translation" in textureNode) { - const values = textureNode.Translation.value; - texture.offset.x = values[0]; - texture.offset.y = values[1]; - } - return texture; + constructor() { + super(new PerspectiveCamera(90, 1, 0.5, 500)); + this.isPointLightShadow = true; + this._frameExtents = new Vector2(4, 2); + this._viewportCount = 6; + this._viewports = [ + // These viewports map a cube-map onto a 2D texture with the + // following orientation: + // + // xzXZ + // y Y + // + // X - Positive x direction + // x - Negative x direction + // Y - Positive y direction + // y - Negative y direction + // Z - Positive z direction + // z - Negative z direction + // positive X + new Vector4(2, 1, 1, 1), + // negative X + new Vector4(0, 1, 1, 1), + // positive Z + new Vector4(3, 1, 1, 1), + // negative Z + new Vector4(1, 1, 1, 1), + // positive Y + new Vector4(3, 0, 1, 1), + // negative Y + new Vector4(1, 0, 1, 1) + ]; + this._cubeDirections = [ + new Vector3(1, 0, 0), + new Vector3(-1, 0, 0), + new Vector3(0, 0, 1), + new Vector3(0, 0, -1), + new Vector3(0, 1, 0), + new Vector3(0, -1, 0) + ]; + this._cubeUps = [ + new Vector3(0, 1, 0), + new Vector3(0, 1, 0), + new Vector3(0, 1, 0), + new Vector3(0, 1, 0), + new Vector3(0, 0, 1), + new Vector3(0, 0, -1) + ]; } - // load a texture specified as a blob or data URI, or via an external URL using TextureLoader - loadTexture(textureNode, images) { - const nonNativeExtensions = /* @__PURE__ */ new Set(["tga", "tif", "tiff", "exr", "dds", "hdr", "ktx2"]); - const extension = textureNode.FileName.split(".").pop().toLowerCase(); - const loader = nonNativeExtensions.has(extension) ? this.manager.getHandler(`.${extension}`) : this.textureLoader; - if (!loader) { - console.warn( - `FBXLoader: ${extension.toUpperCase()} loader not found, creating placeholder texture for`, - textureNode.RelativeFilename - ); - return new Texture(); - } - const loaderPath = loader.path; - if (!loaderPath) { - loader.setPath(this.textureLoader.path); - } - const children = connections.get(textureNode.id).children; - let fileName; - if (children !== void 0 && children.length > 0 && images[children[0].ID] !== void 0) { - fileName = images[children[0].ID]; - if (fileName.indexOf("blob:") === 0 || fileName.indexOf("data:") === 0) { - loader.setPath(void 0); - } + updateMatrices(light, viewportIndex = 0) { + const camera = this.camera; + const shadowMatrix = this.matrix; + const far = light.distance || camera.far; + if (far !== camera.far) { + camera.far = far; + camera.updateProjectionMatrix(); } - const texture = loader.load(fileName); - loader.setPath(loaderPath); - return texture; + _lightPositionWorld.setFromMatrixPosition(light.matrixWorld); + camera.position.copy(_lightPositionWorld); + _lookTarget.copy(camera.position); + _lookTarget.add(this._cubeDirections[viewportIndex]); + camera.up.copy(this._cubeUps[viewportIndex]); + camera.lookAt(_lookTarget); + camera.updateMatrixWorld(); + shadowMatrix.makeTranslation(-_lightPositionWorld.x, -_lightPositionWorld.y, -_lightPositionWorld.z); + _projScreenMatrix.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse); + this._frustum.setFromProjectionMatrix(_projScreenMatrix); } - // Parse nodes in FBXTree.Objects.Material - parseMaterials(textureMap) { - const materialMap = /* @__PURE__ */ new Map(); - if ("Material" in fbxTree.Objects) { - const materialNodes = fbxTree.Objects.Material; - for (const nodeID in materialNodes) { - const material = this.parseMaterial(materialNodes[nodeID], textureMap); - if (material !== null) materialMap.set(parseInt(nodeID), material); - } - } - return materialMap; +} +class PointLight extends Light { + static { + __name(this, "PointLight"); } - // Parse single node in FBXTree.Objects.Material - // Materials are connected to texture maps in FBXTree.Objects.Textures - // FBX format currently only supports Lambert and Phong shading models - parseMaterial(materialNode, textureMap) { - const ID = materialNode.id; - const name = materialNode.attrName; - let type = materialNode.ShadingModel; - if (typeof type === "object") { - type = type.value; - } - if (!connections.has(ID)) return null; - const parameters = this.parseParameters(materialNode, textureMap, ID); - let material; - switch (type.toLowerCase()) { - case "phong": - material = new MeshPhongMaterial(); - break; - case "lambert": - material = new MeshLambertMaterial(); - break; - default: - console.warn('THREE.FBXLoader: unknown material type "%s". Defaulting to MeshPhongMaterial.', type); - material = new MeshPhongMaterial(); - break; - } - material.setValues(parameters); - material.name = name; - return material; + constructor(color, intensity, distance = 0, decay = 2) { + super(color, intensity); + this.isPointLight = true; + this.type = "PointLight"; + this.distance = distance; + this.decay = decay; + this.shadow = new PointLightShadow(); } - // Parse FBX material and return parameters suitable for a three.js material - // Also parse the texture map and return any textures associated with the material - parseParameters(materialNode, textureMap, ID) { - const parameters = {}; - if (materialNode.BumpFactor) { - parameters.bumpScale = materialNode.BumpFactor.value; - } - if (materialNode.Diffuse) { - parameters.color = ColorManagement.toWorkingColorSpace(new Color().fromArray(materialNode.Diffuse.value), SRGBColorSpace); - } else if (materialNode.DiffuseColor && (materialNode.DiffuseColor.type === "Color" || materialNode.DiffuseColor.type === "ColorRGB")) { - parameters.color = ColorManagement.toWorkingColorSpace(new Color().fromArray(materialNode.DiffuseColor.value), SRGBColorSpace); - } - if (materialNode.DisplacementFactor) { - parameters.displacementScale = materialNode.DisplacementFactor.value; - } - if (materialNode.Emissive) { - parameters.emissive = ColorManagement.toWorkingColorSpace(new Color().fromArray(materialNode.Emissive.value), SRGBColorSpace); - } else if (materialNode.EmissiveColor && (materialNode.EmissiveColor.type === "Color" || materialNode.EmissiveColor.type === "ColorRGB")) { - parameters.emissive = ColorManagement.toWorkingColorSpace(new Color().fromArray(materialNode.EmissiveColor.value), SRGBColorSpace); - } - if (materialNode.EmissiveFactor) { - parameters.emissiveIntensity = parseFloat(materialNode.EmissiveFactor.value); - } - parameters.opacity = 1 - (materialNode.TransparencyFactor ? parseFloat(materialNode.TransparencyFactor.value) : 0); - if (parameters.opacity === 1 || parameters.opacity === 0) { - parameters.opacity = materialNode.Opacity ? parseFloat(materialNode.Opacity.value) : null; - if (parameters.opacity === null) { - parameters.opacity = 1 - (materialNode.TransparentColor ? parseFloat(materialNode.TransparentColor.value[0]) : 0); - } - } - if (parameters.opacity < 1) { - parameters.transparent = true; - } - if (materialNode.ReflectionFactor) { - parameters.reflectivity = materialNode.ReflectionFactor.value; - } - if (materialNode.Shininess) { - parameters.shininess = materialNode.Shininess.value; - } - if (materialNode.Specular) { - parameters.specular = ColorManagement.toWorkingColorSpace(new Color().fromArray(materialNode.Specular.value), SRGBColorSpace); - } else if (materialNode.SpecularColor && materialNode.SpecularColor.type === "Color") { - parameters.specular = ColorManagement.toWorkingColorSpace(new Color().fromArray(materialNode.SpecularColor.value), SRGBColorSpace); - } - const scope = this; - connections.get(ID).children.forEach(function(child) { - const type = child.relationship; - switch (type) { - case "Bump": - parameters.bumpMap = scope.getTexture(textureMap, child.ID); - break; - case "Maya|TEX_ao_map": - parameters.aoMap = scope.getTexture(textureMap, child.ID); - break; - case "DiffuseColor": - case "Maya|TEX_color_map": - parameters.map = scope.getTexture(textureMap, child.ID); - if (parameters.map !== void 0) { - parameters.map.colorSpace = SRGBColorSpace; - } - break; - case "DisplacementColor": - parameters.displacementMap = scope.getTexture(textureMap, child.ID); - break; - case "EmissiveColor": - parameters.emissiveMap = scope.getTexture(textureMap, child.ID); - if (parameters.emissiveMap !== void 0) { - parameters.emissiveMap.colorSpace = SRGBColorSpace; - } - break; - case "NormalMap": - case "Maya|TEX_normal_map": - parameters.normalMap = scope.getTexture(textureMap, child.ID); - break; - case "ReflectionColor": - parameters.envMap = scope.getTexture(textureMap, child.ID); - if (parameters.envMap !== void 0) { - parameters.envMap.mapping = EquirectangularReflectionMapping; - parameters.envMap.colorSpace = SRGBColorSpace; - } - break; - case "SpecularColor": - parameters.specularMap = scope.getTexture(textureMap, child.ID); - if (parameters.specularMap !== void 0) { - parameters.specularMap.colorSpace = SRGBColorSpace; - } - break; - case "TransparentColor": - case "TransparencyFactor": - parameters.alphaMap = scope.getTexture(textureMap, child.ID); - parameters.transparent = true; - break; - case "AmbientColor": - case "ShininessExponent": - case "SpecularFactor": - case "VectorDisplacementColor": - default: - console.warn("THREE.FBXLoader: %s map is not supported in three.js, skipping texture.", type); - break; - } - }); - return parameters; + get power() { + return this.intensity * 4 * Math.PI; + } + set power(power) { + this.intensity = power / (4 * Math.PI); + } + dispose() { + this.shadow.dispose(); } - // get a texture from the textureMap for use by a material. - getTexture(textureMap, id2) { - if ("LayeredTexture" in fbxTree.Objects && id2 in fbxTree.Objects.LayeredTexture) { - console.warn("THREE.FBXLoader: layered textures are not supported in three.js. Discarding all but first layer."); - id2 = connections.get(id2).children[0].ID; - } - return textureMap.get(id2); + copy(source, recursive) { + super.copy(source, recursive); + this.distance = source.distance; + this.decay = source.decay; + this.shadow = source.shadow.clone(); + return this; } - // Parse nodes in FBXTree.Objects.Deformer - // Deformer node can contain skinning or Vertex Cache animation data, however only skinning is supported here - // Generates map of Skeleton-like objects for use later when generating and binding skeletons. - parseDeformers() { - const skeletons = {}; - const morphTargets = {}; - if ("Deformer" in fbxTree.Objects) { - const DeformerNodes = fbxTree.Objects.Deformer; - for (const nodeID in DeformerNodes) { - const deformerNode = DeformerNodes[nodeID]; - const relationships = connections.get(parseInt(nodeID)); - if (deformerNode.attrType === "Skin") { - const skeleton = this.parseSkeleton(relationships, DeformerNodes); - skeleton.ID = nodeID; - if (relationships.parents.length > 1) console.warn("THREE.FBXLoader: skeleton attached to more than one geometry is not supported."); - skeleton.geometryID = relationships.parents[0].ID; - skeletons[nodeID] = skeleton; - } else if (deformerNode.attrType === "BlendShape") { - const morphTarget = { - id: nodeID - }; - morphTarget.rawTargets = this.parseMorphTargets(relationships, DeformerNodes); - morphTarget.id = nodeID; - if (relationships.parents.length > 1) console.warn("THREE.FBXLoader: morph target attached to more than one geometry is not supported."); - morphTargets[nodeID] = morphTarget; - } - } - } - return { - skeletons, - morphTargets - }; +} +class DirectionalLightShadow extends LightShadow { + static { + __name(this, "DirectionalLightShadow"); } - // Parse single nodes in FBXTree.Objects.Deformer - // The top level skeleton node has type 'Skin' and sub nodes have type 'Cluster' - // Each skin node represents a skeleton and each cluster node represents a bone - parseSkeleton(relationships, deformerNodes) { - const rawBones = []; - relationships.children.forEach(function(child) { - const boneNode = deformerNodes[child.ID]; - if (boneNode.attrType !== "Cluster") return; - const rawBone = { - ID: child.ID, - indices: [], - weights: [], - transformLink: new Matrix4().fromArray(boneNode.TransformLink.a) - // transform: new Matrix4().fromArray( boneNode.Transform.a ), - // linkMode: boneNode.Mode, - }; - if ("Indexes" in boneNode) { - rawBone.indices = boneNode.Indexes.a; - rawBone.weights = boneNode.Weights.a; - } - rawBones.push(rawBone); - }); - return { - rawBones, - bones: [] - }; + constructor() { + super(new OrthographicCamera(-5, 5, 5, -5, 0.5, 500)); + this.isDirectionalLightShadow = true; } - // The top level morph deformer node has type "BlendShape" and sub nodes have type "BlendShapeChannel" - parseMorphTargets(relationships, deformerNodes) { - const rawMorphTargets = []; - for (let i = 0; i < relationships.children.length; i++) { - const child = relationships.children[i]; - const morphTargetNode = deformerNodes[child.ID]; - const rawMorphTarget = { - name: morphTargetNode.attrName, - initialWeight: morphTargetNode.DeformPercent, - id: morphTargetNode.id, - fullWeights: morphTargetNode.FullWeights.a - }; - if (morphTargetNode.attrType !== "BlendShapeChannel") return; - rawMorphTarget.geoID = connections.get(parseInt(child.ID)).children.filter(function(child2) { - return child2.relationship === void 0; - })[0].ID; - rawMorphTargets.push(rawMorphTarget); - } - return rawMorphTargets; +} +class DirectionalLight extends Light { + static { + __name(this, "DirectionalLight"); } - // create the main Group() to be returned by the loader - parseScene(deformers, geometryMap, materialMap) { - sceneGraph = new Group(); - const modelMap = this.parseModels(deformers.skeletons, geometryMap, materialMap); - const modelNodes = fbxTree.Objects.Model; - const scope = this; - modelMap.forEach(function(model) { - const modelNode = modelNodes[model.ID]; - scope.setLookAtProperties(model, modelNode); - const parentConnections = connections.get(model.ID).parents; - parentConnections.forEach(function(connection) { - const parent = modelMap.get(connection.ID); - if (parent !== void 0) parent.add(model); - }); - if (model.parent === null) { - sceneGraph.add(model); - } - }); - this.bindSkeleton(deformers.skeletons, geometryMap, modelMap); - this.addGlobalSceneSettings(); - sceneGraph.traverse(function(node) { - if (node.userData.transformData) { - if (node.parent) { - node.userData.transformData.parentMatrix = node.parent.matrix; - node.userData.transformData.parentMatrixWorld = node.parent.matrixWorld; - } - const transform = generateTransform(node.userData.transformData); - node.applyMatrix4(transform); - node.updateWorldMatrix(); - } - }); - const animations = new AnimationParser().parse(); - if (sceneGraph.children.length === 1 && sceneGraph.children[0].isGroup) { - sceneGraph.children[0].animations = animations; - sceneGraph = sceneGraph.children[0]; - } - sceneGraph.animations = animations; + constructor(color, intensity) { + super(color, intensity); + this.isDirectionalLight = true; + this.type = "DirectionalLight"; + this.position.copy(Object3D.DEFAULT_UP); + this.updateMatrix(); + this.target = new Object3D(); + this.shadow = new DirectionalLightShadow(); } - // parse nodes in FBXTree.Objects.Model - parseModels(skeletons, geometryMap, materialMap) { - const modelMap = /* @__PURE__ */ new Map(); - const modelNodes = fbxTree.Objects.Model; - for (const nodeID in modelNodes) { - const id2 = parseInt(nodeID); - const node = modelNodes[nodeID]; - const relationships = connections.get(id2); - let model = this.buildSkeleton(relationships, skeletons, id2, node.attrName); - if (!model) { - switch (node.attrType) { - case "Camera": - model = this.createCamera(relationships); - break; - case "Light": - model = this.createLight(relationships); - break; - case "Mesh": - model = this.createMesh(relationships, geometryMap, materialMap); - break; - case "NurbsCurve": - model = this.createCurve(relationships, geometryMap); - break; - case "LimbNode": - case "Root": - model = new Bone(); - break; - case "Null": - default: - model = new Group(); - break; - } - model.name = node.attrName ? PropertyBinding.sanitizeNodeName(node.attrName) : ""; - model.userData.originalName = node.attrName; - model.ID = id2; - } - this.getTransformData(model, node); - modelMap.set(id2, model); - } - return modelMap; + dispose() { + this.shadow.dispose(); } - buildSkeleton(relationships, skeletons, id2, name) { - let bone = null; - relationships.parents.forEach(function(parent) { - for (const ID in skeletons) { - const skeleton = skeletons[ID]; - skeleton.rawBones.forEach(function(rawBone, i) { - if (rawBone.ID === parent.ID) { - const subBone = bone; - bone = new Bone(); - bone.matrixWorld.copy(rawBone.transformLink); - bone.name = name ? PropertyBinding.sanitizeNodeName(name) : ""; - bone.userData.originalName = name; - bone.ID = id2; - skeleton.bones[i] = bone; - if (subBone !== null) { - bone.add(subBone); - } - } - }); - } - }); - return bone; + copy(source) { + super.copy(source); + this.target = source.target.clone(); + this.shadow = source.shadow.clone(); + return this; } - // create a PerspectiveCamera or OrthographicCamera - createCamera(relationships) { - let model; - let cameraAttribute; - relationships.children.forEach(function(child) { - const attr = fbxTree.Objects.NodeAttribute[child.ID]; - if (attr !== void 0) { - cameraAttribute = attr; - } - }); - if (cameraAttribute === void 0) { - model = new Object3D(); - } else { - let type = 0; - if (cameraAttribute.CameraProjectionType !== void 0 && cameraAttribute.CameraProjectionType.value === 1) { - type = 1; - } - let nearClippingPlane = 1; - if (cameraAttribute.NearPlane !== void 0) { - nearClippingPlane = cameraAttribute.NearPlane.value / 1e3; - } - let farClippingPlane = 1e3; - if (cameraAttribute.FarPlane !== void 0) { - farClippingPlane = cameraAttribute.FarPlane.value / 1e3; - } - let width = window.innerWidth; - let height = window.innerHeight; - if (cameraAttribute.AspectWidth !== void 0 && cameraAttribute.AspectHeight !== void 0) { - width = cameraAttribute.AspectWidth.value; - height = cameraAttribute.AspectHeight.value; - } - const aspect2 = width / height; - let fov2 = 45; - if (cameraAttribute.FieldOfView !== void 0) { - fov2 = cameraAttribute.FieldOfView.value; - } - const focalLength = cameraAttribute.FocalLength ? cameraAttribute.FocalLength.value : null; - switch (type) { - case 0: - model = new PerspectiveCamera(fov2, aspect2, nearClippingPlane, farClippingPlane); - if (focalLength !== null) model.setFocalLength(focalLength); - break; - case 1: - console.warn("THREE.FBXLoader: Orthographic cameras not supported yet."); - model = new Object3D(); - break; - default: - console.warn("THREE.FBXLoader: Unknown camera type " + type + "."); - model = new Object3D(); - break; - } - } - return model; +} +class AmbientLight extends Light { + static { + __name(this, "AmbientLight"); } - // Create a DirectionalLight, PointLight or SpotLight - createLight(relationships) { - let model; - let lightAttribute; - relationships.children.forEach(function(child) { - const attr = fbxTree.Objects.NodeAttribute[child.ID]; - if (attr !== void 0) { - lightAttribute = attr; - } - }); - if (lightAttribute === void 0) { - model = new Object3D(); - } else { - let type; - if (lightAttribute.LightType === void 0) { - type = 0; - } else { - type = lightAttribute.LightType.value; - } - let color = 16777215; - if (lightAttribute.Color !== void 0) { - color = ColorManagement.toWorkingColorSpace(new Color().fromArray(lightAttribute.Color.value), SRGBColorSpace); - } - let intensity = lightAttribute.Intensity === void 0 ? 1 : lightAttribute.Intensity.value / 100; - if (lightAttribute.CastLightOnObject !== void 0 && lightAttribute.CastLightOnObject.value === 0) { - intensity = 0; - } - let distance = 0; - if (lightAttribute.FarAttenuationEnd !== void 0) { - if (lightAttribute.EnableFarAttenuation !== void 0 && lightAttribute.EnableFarAttenuation.value === 0) { - distance = 0; - } else { - distance = lightAttribute.FarAttenuationEnd.value; - } - } - const decay = 1; - switch (type) { - case 0: - model = new PointLight(color, intensity, distance, decay); - break; - case 1: - model = new DirectionalLight(color, intensity); - break; - case 2: - let angle = Math.PI / 3; - if (lightAttribute.InnerAngle !== void 0) { - angle = MathUtils.degToRad(lightAttribute.InnerAngle.value); - } - let penumbra = 0; - if (lightAttribute.OuterAngle !== void 0) { - penumbra = MathUtils.degToRad(lightAttribute.OuterAngle.value); - penumbra = Math.max(penumbra, 1); - } - model = new SpotLight(color, intensity, distance, angle, penumbra, decay); - break; - default: - console.warn("THREE.FBXLoader: Unknown light type " + lightAttribute.LightType.value + ", defaulting to a PointLight."); - model = new PointLight(color, intensity); - break; - } - if (lightAttribute.CastShadows !== void 0 && lightAttribute.CastShadows.value === 1) { - model.castShadow = true; - } - } - return model; + constructor(color, intensity) { + super(color, intensity); + this.isAmbientLight = true; + this.type = "AmbientLight"; } - createMesh(relationships, geometryMap, materialMap) { - let model; - let geometry = null; - let material = null; - const materials = []; - relationships.children.forEach(function(child) { - if (geometryMap.has(child.ID)) { - geometry = geometryMap.get(child.ID); - } - if (materialMap.has(child.ID)) { - materials.push(materialMap.get(child.ID)); - } - }); - if (materials.length > 1) { - material = materials; - } else if (materials.length > 0) { - material = materials[0]; - } else { - material = new MeshPhongMaterial({ - name: Loader.DEFAULT_MATERIAL_NAME, - color: 13421772 - }); - materials.push(material); +} +class RectAreaLight extends Light { + static { + __name(this, "RectAreaLight"); + } + constructor(color, intensity, width = 10, height = 10) { + super(color, intensity); + this.isRectAreaLight = true; + this.type = "RectAreaLight"; + this.width = width; + this.height = height; + } + get power() { + return this.intensity * this.width * this.height * Math.PI; + } + set power(power) { + this.intensity = power / (this.width * this.height * Math.PI); + } + copy(source) { + super.copy(source); + this.width = source.width; + this.height = source.height; + return this; + } + toJSON(meta) { + const data = super.toJSON(meta); + data.object.width = this.width; + data.object.height = this.height; + return data; + } +} +class SphericalHarmonics3 { + static { + __name(this, "SphericalHarmonics3"); + } + constructor() { + this.isSphericalHarmonics3 = true; + this.coefficients = []; + for (let i = 0; i < 9; i++) { + this.coefficients.push(new Vector3()); } - if ("color" in geometry.attributes) { - materials.forEach(function(material2) { - material2.vertexColors = true; - }); + } + set(coefficients) { + for (let i = 0; i < 9; i++) { + this.coefficients[i].copy(coefficients[i]); } - if (geometry.FBX_Deformer) { - model = new SkinnedMesh(geometry, material); - model.normalizeSkinWeights(); - } else { - model = new Mesh(geometry, material); + return this; + } + zero() { + for (let i = 0; i < 9; i++) { + this.coefficients[i].set(0, 0, 0); } - return model; + return this; } - createCurve(relationships, geometryMap) { - const geometry = relationships.children.reduce(function(geo, child) { - if (geometryMap.has(child.ID)) geo = geometryMap.get(child.ID); - return geo; - }, null); - const material = new LineBasicMaterial({ - name: Loader.DEFAULT_MATERIAL_NAME, - color: 3342591, - linewidth: 1 - }); - return new Line(geometry, material); + // get the radiance in the direction of the normal + // target is a Vector3 + getAt(normal, target) { + const x = normal.x, y = normal.y, z = normal.z; + const coeff = this.coefficients; + target.copy(coeff[0]).multiplyScalar(0.282095); + target.addScaledVector(coeff[1], 0.488603 * y); + target.addScaledVector(coeff[2], 0.488603 * z); + target.addScaledVector(coeff[3], 0.488603 * x); + target.addScaledVector(coeff[4], 1.092548 * (x * y)); + target.addScaledVector(coeff[5], 1.092548 * (y * z)); + target.addScaledVector(coeff[6], 0.315392 * (3 * z * z - 1)); + target.addScaledVector(coeff[7], 1.092548 * (x * z)); + target.addScaledVector(coeff[8], 0.546274 * (x * x - y * y)); + return target; } - // parse the model node for transform data - getTransformData(model, modelNode) { - const transformData = {}; - if ("InheritType" in modelNode) transformData.inheritType = parseInt(modelNode.InheritType.value); - if ("RotationOrder" in modelNode) transformData.eulerOrder = getEulerOrder(modelNode.RotationOrder.value); - else transformData.eulerOrder = getEulerOrder(0); - if ("Lcl_Translation" in modelNode) transformData.translation = modelNode.Lcl_Translation.value; - if ("PreRotation" in modelNode) transformData.preRotation = modelNode.PreRotation.value; - if ("Lcl_Rotation" in modelNode) transformData.rotation = modelNode.Lcl_Rotation.value; - if ("PostRotation" in modelNode) transformData.postRotation = modelNode.PostRotation.value; - if ("Lcl_Scaling" in modelNode) transformData.scale = modelNode.Lcl_Scaling.value; - if ("ScalingOffset" in modelNode) transformData.scalingOffset = modelNode.ScalingOffset.value; - if ("ScalingPivot" in modelNode) transformData.scalingPivot = modelNode.ScalingPivot.value; - if ("RotationOffset" in modelNode) transformData.rotationOffset = modelNode.RotationOffset.value; - if ("RotationPivot" in modelNode) transformData.rotationPivot = modelNode.RotationPivot.value; - model.userData.transformData = transformData; + // get the irradiance (radiance convolved with cosine lobe) in the direction of the normal + // target is a Vector3 + // https://graphics.stanford.edu/papers/envmap/envmap.pdf + getIrradianceAt(normal, target) { + const x = normal.x, y = normal.y, z = normal.z; + const coeff = this.coefficients; + target.copy(coeff[0]).multiplyScalar(0.886227); + target.addScaledVector(coeff[1], 2 * 0.511664 * y); + target.addScaledVector(coeff[2], 2 * 0.511664 * z); + target.addScaledVector(coeff[3], 2 * 0.511664 * x); + target.addScaledVector(coeff[4], 2 * 0.429043 * x * y); + target.addScaledVector(coeff[5], 2 * 0.429043 * y * z); + target.addScaledVector(coeff[6], 0.743125 * z * z - 0.247708); + target.addScaledVector(coeff[7], 2 * 0.429043 * x * z); + target.addScaledVector(coeff[8], 0.429043 * (x * x - y * y)); + return target; } - setLookAtProperties(model, modelNode) { - if ("LookAtProperty" in modelNode) { - const children = connections.get(model.ID).children; - children.forEach(function(child) { - if (child.relationship === "LookAtProperty") { - const lookAtTarget = fbxTree.Objects.Model[child.ID]; - if ("Lcl_Translation" in lookAtTarget) { - const pos = lookAtTarget.Lcl_Translation.value; - if (model.target !== void 0) { - model.target.position.fromArray(pos); - sceneGraph.add(model.target); - } else { - model.lookAt(new Vector3().fromArray(pos)); - } - } - } - }); + add(sh) { + for (let i = 0; i < 9; i++) { + this.coefficients[i].add(sh.coefficients[i]); + } + return this; + } + addScaledSH(sh, s) { + for (let i = 0; i < 9; i++) { + this.coefficients[i].addScaledVector(sh.coefficients[i], s); + } + return this; + } + scale(s) { + for (let i = 0; i < 9; i++) { + this.coefficients[i].multiplyScalar(s); } + return this; } - bindSkeleton(skeletons, geometryMap, modelMap) { - const bindMatrices = this.parsePoseNodes(); - for (const ID in skeletons) { - const skeleton = skeletons[ID]; - const parents = connections.get(parseInt(skeleton.ID)).parents; - parents.forEach(function(parent) { - if (geometryMap.has(parent.ID)) { - const geoID = parent.ID; - const geoRelationships = connections.get(geoID); - geoRelationships.parents.forEach(function(geoConnParent) { - if (modelMap.has(geoConnParent.ID)) { - const model = modelMap.get(geoConnParent.ID); - model.bind(new Skeleton(skeleton.bones), bindMatrices[geoConnParent.ID]); - } - }); - } - }); + lerp(sh, alpha) { + for (let i = 0; i < 9; i++) { + this.coefficients[i].lerp(sh.coefficients[i], alpha); } + return this; } - parsePoseNodes() { - const bindMatrices = {}; - if ("Pose" in fbxTree.Objects) { - const BindPoseNode = fbxTree.Objects.Pose; - for (const nodeID in BindPoseNode) { - if (BindPoseNode[nodeID].attrType === "BindPose" && BindPoseNode[nodeID].NbPoseNodes > 0) { - const poseNodes = BindPoseNode[nodeID].PoseNode; - if (Array.isArray(poseNodes)) { - poseNodes.forEach(function(poseNode) { - bindMatrices[poseNode.Node] = new Matrix4().fromArray(poseNode.Matrix.a); - }); - } else { - bindMatrices[poseNodes.Node] = new Matrix4().fromArray(poseNodes.Matrix.a); - } - } + equals(sh) { + for (let i = 0; i < 9; i++) { + if (!this.coefficients[i].equals(sh.coefficients[i])) { + return false; } } - return bindMatrices; + return true; } - addGlobalSceneSettings() { - if ("GlobalSettings" in fbxTree) { - if ("AmbientColor" in fbxTree.GlobalSettings) { - const ambientColor = fbxTree.GlobalSettings.AmbientColor.value; - const r = ambientColor[0]; - const g = ambientColor[1]; - const b = ambientColor[2]; - if (r !== 0 || g !== 0 || b !== 0) { - const color = new Color().setRGB(r, g, b, SRGBColorSpace); - sceneGraph.add(new AmbientLight(color, 1)); - } - } - if ("UnitScaleFactor" in fbxTree.GlobalSettings) { - sceneGraph.userData.unitScaleFactor = fbxTree.GlobalSettings.UnitScaleFactor.value; - } + copy(sh) { + return this.set(sh.coefficients); + } + clone() { + return new this.constructor().copy(this); + } + fromArray(array, offset = 0) { + const coefficients = this.coefficients; + for (let i = 0; i < 9; i++) { + coefficients[i].fromArray(array, offset + i * 3); + } + return this; + } + toArray(array = [], offset = 0) { + const coefficients = this.coefficients; + for (let i = 0; i < 9; i++) { + coefficients[i].toArray(array, offset + i * 3); } + return array; + } + // evaluate the basis functions + // shBasis is an Array[ 9 ] + static getBasisAt(normal, shBasis) { + const x = normal.x, y = normal.y, z = normal.z; + shBasis[0] = 0.282095; + shBasis[1] = 0.488603 * y; + shBasis[2] = 0.488603 * z; + shBasis[3] = 0.488603 * x; + shBasis[4] = 1.092548 * x * y; + shBasis[5] = 1.092548 * y * z; + shBasis[6] = 0.315392 * (3 * z * z - 1); + shBasis[7] = 1.092548 * x * z; + shBasis[8] = 0.546274 * (x * x - y * y); } } -class GeometryParser { +class LightProbe extends Light { static { - __name(this, "GeometryParser"); + __name(this, "LightProbe"); } - constructor() { - this.negativeMaterialIndices = false; + constructor(sh = new SphericalHarmonics3(), intensity = 1) { + super(void 0, intensity); + this.isLightProbe = true; + this.sh = sh; } - // Parse nodes in FBXTree.Objects.Geometry - parse(deformers) { - const geometryMap = /* @__PURE__ */ new Map(); - if ("Geometry" in fbxTree.Objects) { - const geoNodes = fbxTree.Objects.Geometry; - for (const nodeID in geoNodes) { - const relationships = connections.get(parseInt(nodeID)); - const geo = this.parseGeometry(relationships, geoNodes[nodeID], deformers); - geometryMap.set(parseInt(nodeID), geo); - } - } - if (this.negativeMaterialIndices === true) { - console.warn("THREE.FBXLoader: The FBX file contains invalid (negative) material indices. The asset might not render as expected."); - } - return geometryMap; + copy(source) { + super.copy(source); + this.sh.copy(source.sh); + return this; } - // Parse single node in FBXTree.Objects.Geometry - parseGeometry(relationships, geoNode, deformers) { - switch (geoNode.attrType) { - case "Mesh": - return this.parseMeshGeometry(relationships, geoNode, deformers); - break; - case "NurbsCurve": - return this.parseNurbsGeometry(geoNode); - break; - } + fromJSON(json) { + this.intensity = json.intensity; + this.sh.fromArray(json.sh); + return this; } - // Parse single node mesh geometry in FBXTree.Objects.Geometry - parseMeshGeometry(relationships, geoNode, deformers) { - const skeletons = deformers.skeletons; - const morphTargets = []; - const modelNodes = relationships.parents.map(function(parent) { - return fbxTree.Objects.Model[parent.ID]; - }); - if (modelNodes.length === 0) return; - const skeleton = relationships.children.reduce(function(skeleton2, child) { - if (skeletons[child.ID] !== void 0) skeleton2 = skeletons[child.ID]; - return skeleton2; - }, null); - relationships.children.forEach(function(child) { - if (deformers.morphTargets[child.ID] !== void 0) { - morphTargets.push(deformers.morphTargets[child.ID]); - } - }); - const modelNode = modelNodes[0]; - const transformData = {}; - if ("RotationOrder" in modelNode) transformData.eulerOrder = getEulerOrder(modelNode.RotationOrder.value); - if ("InheritType" in modelNode) transformData.inheritType = parseInt(modelNode.InheritType.value); - if ("GeometricTranslation" in modelNode) transformData.translation = modelNode.GeometricTranslation.value; - if ("GeometricRotation" in modelNode) transformData.rotation = modelNode.GeometricRotation.value; - if ("GeometricScaling" in modelNode) transformData.scale = modelNode.GeometricScaling.value; - const transform = generateTransform(transformData); - return this.genGeometry(geoNode, skeleton, morphTargets, transform); + toJSON(meta) { + const data = super.toJSON(meta); + data.object.sh = this.sh.toArray(); + return data; } - // Generate a BufferGeometry from a node in FBXTree.Objects.Geometry - genGeometry(geoNode, skeleton, morphTargets, preTransform) { - const geo = new BufferGeometry(); - if (geoNode.attrName) geo.name = geoNode.attrName; - const geoInfo = this.parseGeoNode(geoNode, skeleton); - const buffers = this.genBuffers(geoInfo); - const positionAttribute = new Float32BufferAttribute(buffers.vertex, 3); - positionAttribute.applyMatrix4(preTransform); - geo.setAttribute("position", positionAttribute); - if (buffers.colors.length > 0) { - geo.setAttribute("color", new Float32BufferAttribute(buffers.colors, 3)); - } - if (skeleton) { - geo.setAttribute("skinIndex", new Uint16BufferAttribute(buffers.weightsIndices, 4)); - geo.setAttribute("skinWeight", new Float32BufferAttribute(buffers.vertexWeights, 4)); - geo.FBX_Deformer = skeleton; - } - if (buffers.normal.length > 0) { - const normalMatrix = new Matrix3().getNormalMatrix(preTransform); - const normalAttribute = new Float32BufferAttribute(buffers.normal, 3); - normalAttribute.applyNormalMatrix(normalMatrix); - geo.setAttribute("normal", normalAttribute); - } - buffers.uvs.forEach(function(uvBuffer, i) { - const name = i === 0 ? "uv" : `uv${i}`; - geo.setAttribute(name, new Float32BufferAttribute(buffers.uvs[i], 2)); - }); - if (geoInfo.material && geoInfo.material.mappingType !== "AllSame") { - let prevMaterialIndex = buffers.materialIndex[0]; - let startIndex = 0; - buffers.materialIndex.forEach(function(currentIndex, i) { - if (currentIndex !== prevMaterialIndex) { - geo.addGroup(startIndex, i - startIndex, prevMaterialIndex); - prevMaterialIndex = currentIndex; - startIndex = i; - } - }); - if (geo.groups.length > 0) { - const lastGroup = geo.groups[geo.groups.length - 1]; - const lastIndex = lastGroup.start + lastGroup.count; - if (lastIndex !== buffers.materialIndex.length) { - geo.addGroup(lastIndex, buffers.materialIndex.length - lastIndex, prevMaterialIndex); - } - } - if (geo.groups.length === 0) { - geo.addGroup(0, buffers.materialIndex.length, buffers.materialIndex[0]); - } - } - this.addMorphTargets(geo, geoNode, morphTargets, preTransform); - return geo; +} +class MaterialLoader extends Loader { + static { + __name(this, "MaterialLoader"); } - parseGeoNode(geoNode, skeleton) { - const geoInfo = {}; - geoInfo.vertexPositions = geoNode.Vertices !== void 0 ? geoNode.Vertices.a : []; - geoInfo.vertexIndices = geoNode.PolygonVertexIndex !== void 0 ? geoNode.PolygonVertexIndex.a : []; - if (geoNode.LayerElementColor) { - geoInfo.color = this.parseVertexColors(geoNode.LayerElementColor[0]); - } - if (geoNode.LayerElementMaterial) { - geoInfo.material = this.parseMaterialIndices(geoNode.LayerElementMaterial[0]); - } - if (geoNode.LayerElementNormal) { - geoInfo.normal = this.parseNormals(geoNode.LayerElementNormal[0]); - } - if (geoNode.LayerElementUV) { - geoInfo.uv = []; - let i = 0; - while (geoNode.LayerElementUV[i]) { - if (geoNode.LayerElementUV[i].UV) { - geoInfo.uv.push(this.parseUVs(geoNode.LayerElementUV[i])); - } - i++; - } - } - geoInfo.weightTable = {}; - if (skeleton !== null) { - geoInfo.skeleton = skeleton; - skeleton.rawBones.forEach(function(rawBone, i) { - rawBone.indices.forEach(function(index, j) { - if (geoInfo.weightTable[index] === void 0) geoInfo.weightTable[index] = []; - geoInfo.weightTable[index].push({ - id: i, - weight: rawBone.weights[j] - }); - }); - }); - } - return geoInfo; + constructor(manager) { + super(manager); + this.textures = {}; } - genBuffers(geoInfo) { - const buffers = { - vertex: [], - normal: [], - colors: [], - uvs: [], - materialIndex: [], - vertexWeights: [], - weightsIndices: [] - }; - let polygonIndex = 0; - let faceLength = 0; - let displayedWeightsWarning = false; - let facePositionIndexes = []; - let faceNormals = []; - let faceColors = []; - let faceUVs = []; - let faceWeights = []; - let faceWeightIndices = []; + load(url, onLoad, onProgress, onError) { const scope = this; - geoInfo.vertexIndices.forEach(function(vertexIndex, polygonVertexIndex) { - let materialIndex; - let endOfFace = false; - if (vertexIndex < 0) { - vertexIndex = vertexIndex ^ -1; - endOfFace = true; - } - let weightIndices = []; - let weights = []; - facePositionIndexes.push(vertexIndex * 3, vertexIndex * 3 + 1, vertexIndex * 3 + 2); - if (geoInfo.color) { - const data = getData(polygonVertexIndex, polygonIndex, vertexIndex, geoInfo.color); - faceColors.push(data[0], data[1], data[2]); - } - if (geoInfo.skeleton) { - if (geoInfo.weightTable[vertexIndex] !== void 0) { - geoInfo.weightTable[vertexIndex].forEach(function(wt) { - weights.push(wt.weight); - weightIndices.push(wt.id); - }); - } - if (weights.length > 4) { - if (!displayedWeightsWarning) { - console.warn("THREE.FBXLoader: Vertex has more than 4 skinning weights assigned to vertex. Deleting additional weights."); - displayedWeightsWarning = true; - } - const wIndex = [0, 0, 0, 0]; - const Weight = [0, 0, 0, 0]; - weights.forEach(function(weight, weightIndex) { - let currentWeight = weight; - let currentIndex = weightIndices[weightIndex]; - Weight.forEach(function(comparedWeight, comparedWeightIndex, comparedWeightArray) { - if (currentWeight > comparedWeight) { - comparedWeightArray[comparedWeightIndex] = currentWeight; - currentWeight = comparedWeight; - const tmp2 = wIndex[comparedWeightIndex]; - wIndex[comparedWeightIndex] = currentIndex; - currentIndex = tmp2; - } - }); - }); - weightIndices = wIndex; - weights = Weight; - } - while (weights.length < 4) { - weights.push(0); - weightIndices.push(0); - } - for (let i = 0; i < 4; ++i) { - faceWeights.push(weights[i]); - faceWeightIndices.push(weightIndices[i]); - } - } - if (geoInfo.normal) { - const data = getData(polygonVertexIndex, polygonIndex, vertexIndex, geoInfo.normal); - faceNormals.push(data[0], data[1], data[2]); - } - if (geoInfo.material && geoInfo.material.mappingType !== "AllSame") { - materialIndex = getData(polygonVertexIndex, polygonIndex, vertexIndex, geoInfo.material)[0]; - if (materialIndex < 0) { - scope.negativeMaterialIndices = true; - materialIndex = 0; + const loader = new FileLoader(scope.manager); + loader.setPath(scope.path); + loader.setRequestHeader(scope.requestHeader); + loader.setWithCredentials(scope.withCredentials); + loader.load(url, function(text) { + try { + onLoad(scope.parse(JSON.parse(text))); + } catch (e) { + if (onError) { + onError(e); + } else { + console.error(e); } + scope.manager.itemError(url); } - if (geoInfo.uv) { - geoInfo.uv.forEach(function(uv, i) { - const data = getData(polygonVertexIndex, polygonIndex, vertexIndex, uv); - if (faceUVs[i] === void 0) { - faceUVs[i] = []; - } - faceUVs[i].push(data[0]); - faceUVs[i].push(data[1]); - }); - } - faceLength++; - if (endOfFace) { - scope.genFace(buffers, geoInfo, facePositionIndexes, materialIndex, faceNormals, faceColors, faceUVs, faceWeights, faceWeightIndices, faceLength); - polygonIndex++; - faceLength = 0; - facePositionIndexes = []; - faceNormals = []; - faceColors = []; - faceUVs = []; - faceWeights = []; - faceWeightIndices = []; - } - }); - return buffers; - } - // See https://www.khronos.org/opengl/wiki/Calculating_a_Surface_Normal - getNormalNewell(vertices) { - const normal = new Vector3(0, 0, 0); - for (let i = 0; i < vertices.length; i++) { - const current = vertices[i]; - const next = vertices[(i + 1) % vertices.length]; - normal.x += (current.y - next.y) * (current.z + next.z); - normal.y += (current.z - next.z) * (current.x + next.x); - normal.z += (current.x - next.x) * (current.y + next.y); - } - normal.normalize(); - return normal; - } - getNormalTangentAndBitangent(vertices) { - const normalVector = this.getNormalNewell(vertices); - const up = Math.abs(normalVector.z) > 0.5 ? new Vector3(0, 1, 0) : new Vector3(0, 0, 1); - const tangent = up.cross(normalVector).normalize(); - const bitangent = normalVector.clone().cross(tangent).normalize(); - return { - normal: normalVector, - tangent, - bitangent - }; - } - flattenVertex(vertex2, normalTangent, normalBitangent) { - return new Vector2( - vertex2.dot(normalTangent), - vertex2.dot(normalBitangent) - ); + }, onProgress, onError); } - // Generate data for a single face in a geometry. If the face is a quad then split it into 2 tris - genFace(buffers, geoInfo, facePositionIndexes, materialIndex, faceNormals, faceColors, faceUVs, faceWeights, faceWeightIndices, faceLength) { - let triangles; - if (faceLength > 3) { - const vertices = []; - const positions = geoInfo.baseVertexPositions || geoInfo.vertexPositions; - for (let i = 0; i < facePositionIndexes.length; i += 3) { - vertices.push( - new Vector3( - positions[facePositionIndexes[i]], - positions[facePositionIndexes[i + 1]], - positions[facePositionIndexes[i + 2]] - ) - ); + parse(json) { + const textures = this.textures; + function getTexture(name) { + if (textures[name] === void 0) { + console.warn("THREE.MaterialLoader: Undefined texture", name); } - const { tangent, bitangent } = this.getNormalTangentAndBitangent(vertices); - const triangulationInput = []; - for (const vertex2 of vertices) { - triangulationInput.push(this.flattenVertex(vertex2, tangent, bitangent)); + return textures[name]; + } + __name(getTexture, "getTexture"); + const material = this.createMaterialFromType(json.type); + if (json.uuid !== void 0) material.uuid = json.uuid; + if (json.name !== void 0) material.name = json.name; + if (json.color !== void 0 && material.color !== void 0) material.color.setHex(json.color); + if (json.roughness !== void 0) material.roughness = json.roughness; + if (json.metalness !== void 0) material.metalness = json.metalness; + if (json.sheen !== void 0) material.sheen = json.sheen; + if (json.sheenColor !== void 0) material.sheenColor = new Color().setHex(json.sheenColor); + if (json.sheenRoughness !== void 0) material.sheenRoughness = json.sheenRoughness; + if (json.emissive !== void 0 && material.emissive !== void 0) material.emissive.setHex(json.emissive); + if (json.specular !== void 0 && material.specular !== void 0) material.specular.setHex(json.specular); + if (json.specularIntensity !== void 0) material.specularIntensity = json.specularIntensity; + if (json.specularColor !== void 0 && material.specularColor !== void 0) material.specularColor.setHex(json.specularColor); + if (json.shininess !== void 0) material.shininess = json.shininess; + if (json.clearcoat !== void 0) material.clearcoat = json.clearcoat; + if (json.clearcoatRoughness !== void 0) material.clearcoatRoughness = json.clearcoatRoughness; + if (json.dispersion !== void 0) material.dispersion = json.dispersion; + if (json.iridescence !== void 0) material.iridescence = json.iridescence; + if (json.iridescenceIOR !== void 0) material.iridescenceIOR = json.iridescenceIOR; + if (json.iridescenceThicknessRange !== void 0) material.iridescenceThicknessRange = json.iridescenceThicknessRange; + if (json.transmission !== void 0) material.transmission = json.transmission; + if (json.thickness !== void 0) material.thickness = json.thickness; + if (json.attenuationDistance !== void 0) material.attenuationDistance = json.attenuationDistance; + if (json.attenuationColor !== void 0 && material.attenuationColor !== void 0) material.attenuationColor.setHex(json.attenuationColor); + if (json.anisotropy !== void 0) material.anisotropy = json.anisotropy; + if (json.anisotropyRotation !== void 0) material.anisotropyRotation = json.anisotropyRotation; + if (json.fog !== void 0) material.fog = json.fog; + if (json.flatShading !== void 0) material.flatShading = json.flatShading; + if (json.blending !== void 0) material.blending = json.blending; + if (json.combine !== void 0) material.combine = json.combine; + if (json.side !== void 0) material.side = json.side; + if (json.shadowSide !== void 0) material.shadowSide = json.shadowSide; + if (json.opacity !== void 0) material.opacity = json.opacity; + if (json.transparent !== void 0) material.transparent = json.transparent; + if (json.alphaTest !== void 0) material.alphaTest = json.alphaTest; + if (json.alphaHash !== void 0) material.alphaHash = json.alphaHash; + if (json.depthFunc !== void 0) material.depthFunc = json.depthFunc; + if (json.depthTest !== void 0) material.depthTest = json.depthTest; + if (json.depthWrite !== void 0) material.depthWrite = json.depthWrite; + if (json.colorWrite !== void 0) material.colorWrite = json.colorWrite; + if (json.blendSrc !== void 0) material.blendSrc = json.blendSrc; + if (json.blendDst !== void 0) material.blendDst = json.blendDst; + if (json.blendEquation !== void 0) material.blendEquation = json.blendEquation; + if (json.blendSrcAlpha !== void 0) material.blendSrcAlpha = json.blendSrcAlpha; + if (json.blendDstAlpha !== void 0) material.blendDstAlpha = json.blendDstAlpha; + if (json.blendEquationAlpha !== void 0) material.blendEquationAlpha = json.blendEquationAlpha; + if (json.blendColor !== void 0 && material.blendColor !== void 0) material.blendColor.setHex(json.blendColor); + if (json.blendAlpha !== void 0) material.blendAlpha = json.blendAlpha; + if (json.stencilWriteMask !== void 0) material.stencilWriteMask = json.stencilWriteMask; + if (json.stencilFunc !== void 0) material.stencilFunc = json.stencilFunc; + if (json.stencilRef !== void 0) material.stencilRef = json.stencilRef; + if (json.stencilFuncMask !== void 0) material.stencilFuncMask = json.stencilFuncMask; + if (json.stencilFail !== void 0) material.stencilFail = json.stencilFail; + if (json.stencilZFail !== void 0) material.stencilZFail = json.stencilZFail; + if (json.stencilZPass !== void 0) material.stencilZPass = json.stencilZPass; + if (json.stencilWrite !== void 0) material.stencilWrite = json.stencilWrite; + if (json.wireframe !== void 0) material.wireframe = json.wireframe; + if (json.wireframeLinewidth !== void 0) material.wireframeLinewidth = json.wireframeLinewidth; + if (json.wireframeLinecap !== void 0) material.wireframeLinecap = json.wireframeLinecap; + if (json.wireframeLinejoin !== void 0) material.wireframeLinejoin = json.wireframeLinejoin; + if (json.rotation !== void 0) material.rotation = json.rotation; + if (json.linewidth !== void 0) material.linewidth = json.linewidth; + if (json.dashSize !== void 0) material.dashSize = json.dashSize; + if (json.gapSize !== void 0) material.gapSize = json.gapSize; + if (json.scale !== void 0) material.scale = json.scale; + if (json.polygonOffset !== void 0) material.polygonOffset = json.polygonOffset; + if (json.polygonOffsetFactor !== void 0) material.polygonOffsetFactor = json.polygonOffsetFactor; + if (json.polygonOffsetUnits !== void 0) material.polygonOffsetUnits = json.polygonOffsetUnits; + if (json.dithering !== void 0) material.dithering = json.dithering; + if (json.alphaToCoverage !== void 0) material.alphaToCoverage = json.alphaToCoverage; + if (json.premultipliedAlpha !== void 0) material.premultipliedAlpha = json.premultipliedAlpha; + if (json.forceSinglePass !== void 0) material.forceSinglePass = json.forceSinglePass; + if (json.visible !== void 0) material.visible = json.visible; + if (json.toneMapped !== void 0) material.toneMapped = json.toneMapped; + if (json.userData !== void 0) material.userData = json.userData; + if (json.vertexColors !== void 0) { + if (typeof json.vertexColors === "number") { + material.vertexColors = json.vertexColors > 0 ? true : false; + } else { + material.vertexColors = json.vertexColors; } - triangles = ShapeUtils.triangulateShape(triangulationInput, []); - } else { - triangles = [[0, 1, 2]]; } - for (const [i0, i1, i2] of triangles) { - buffers.vertex.push(geoInfo.vertexPositions[facePositionIndexes[i0 * 3]]); - buffers.vertex.push(geoInfo.vertexPositions[facePositionIndexes[i0 * 3 + 1]]); - buffers.vertex.push(geoInfo.vertexPositions[facePositionIndexes[i0 * 3 + 2]]); - buffers.vertex.push(geoInfo.vertexPositions[facePositionIndexes[i1 * 3]]); - buffers.vertex.push(geoInfo.vertexPositions[facePositionIndexes[i1 * 3 + 1]]); - buffers.vertex.push(geoInfo.vertexPositions[facePositionIndexes[i1 * 3 + 2]]); - buffers.vertex.push(geoInfo.vertexPositions[facePositionIndexes[i2 * 3]]); - buffers.vertex.push(geoInfo.vertexPositions[facePositionIndexes[i2 * 3 + 1]]); - buffers.vertex.push(geoInfo.vertexPositions[facePositionIndexes[i2 * 3 + 2]]); - if (geoInfo.skeleton) { - buffers.vertexWeights.push(faceWeights[i0 * 4]); - buffers.vertexWeights.push(faceWeights[i0 * 4 + 1]); - buffers.vertexWeights.push(faceWeights[i0 * 4 + 2]); - buffers.vertexWeights.push(faceWeights[i0 * 4 + 3]); - buffers.vertexWeights.push(faceWeights[i1 * 4]); - buffers.vertexWeights.push(faceWeights[i1 * 4 + 1]); - buffers.vertexWeights.push(faceWeights[i1 * 4 + 2]); - buffers.vertexWeights.push(faceWeights[i1 * 4 + 3]); - buffers.vertexWeights.push(faceWeights[i2 * 4]); - buffers.vertexWeights.push(faceWeights[i2 * 4 + 1]); - buffers.vertexWeights.push(faceWeights[i2 * 4 + 2]); - buffers.vertexWeights.push(faceWeights[i2 * 4 + 3]); - buffers.weightsIndices.push(faceWeightIndices[i0 * 4]); - buffers.weightsIndices.push(faceWeightIndices[i0 * 4 + 1]); - buffers.weightsIndices.push(faceWeightIndices[i0 * 4 + 2]); - buffers.weightsIndices.push(faceWeightIndices[i0 * 4 + 3]); - buffers.weightsIndices.push(faceWeightIndices[i1 * 4]); - buffers.weightsIndices.push(faceWeightIndices[i1 * 4 + 1]); - buffers.weightsIndices.push(faceWeightIndices[i1 * 4 + 2]); - buffers.weightsIndices.push(faceWeightIndices[i1 * 4 + 3]); - buffers.weightsIndices.push(faceWeightIndices[i2 * 4]); - buffers.weightsIndices.push(faceWeightIndices[i2 * 4 + 1]); - buffers.weightsIndices.push(faceWeightIndices[i2 * 4 + 2]); - buffers.weightsIndices.push(faceWeightIndices[i2 * 4 + 3]); - } - if (geoInfo.color) { - buffers.colors.push(faceColors[i0 * 3]); - buffers.colors.push(faceColors[i0 * 3 + 1]); - buffers.colors.push(faceColors[i0 * 3 + 2]); - buffers.colors.push(faceColors[i1 * 3]); - buffers.colors.push(faceColors[i1 * 3 + 1]); - buffers.colors.push(faceColors[i1 * 3 + 2]); - buffers.colors.push(faceColors[i2 * 3]); - buffers.colors.push(faceColors[i2 * 3 + 1]); - buffers.colors.push(faceColors[i2 * 3 + 2]); - } - if (geoInfo.material && geoInfo.material.mappingType !== "AllSame") { - buffers.materialIndex.push(materialIndex); - buffers.materialIndex.push(materialIndex); - buffers.materialIndex.push(materialIndex); + if (json.uniforms !== void 0) { + for (const name in json.uniforms) { + const uniform = json.uniforms[name]; + material.uniforms[name] = {}; + switch (uniform.type) { + case "t": + material.uniforms[name].value = getTexture(uniform.value); + break; + case "c": + material.uniforms[name].value = new Color().setHex(uniform.value); + break; + case "v2": + material.uniforms[name].value = new Vector2().fromArray(uniform.value); + break; + case "v3": + material.uniforms[name].value = new Vector3().fromArray(uniform.value); + break; + case "v4": + material.uniforms[name].value = new Vector4().fromArray(uniform.value); + break; + case "m3": + material.uniforms[name].value = new Matrix3().fromArray(uniform.value); + break; + case "m4": + material.uniforms[name].value = new Matrix4().fromArray(uniform.value); + break; + default: + material.uniforms[name].value = uniform.value; + } } - if (geoInfo.normal) { - buffers.normal.push(faceNormals[i0 * 3]); - buffers.normal.push(faceNormals[i0 * 3 + 1]); - buffers.normal.push(faceNormals[i0 * 3 + 2]); - buffers.normal.push(faceNormals[i1 * 3]); - buffers.normal.push(faceNormals[i1 * 3 + 1]); - buffers.normal.push(faceNormals[i1 * 3 + 2]); - buffers.normal.push(faceNormals[i2 * 3]); - buffers.normal.push(faceNormals[i2 * 3 + 1]); - buffers.normal.push(faceNormals[i2 * 3 + 2]); + } + if (json.defines !== void 0) material.defines = json.defines; + if (json.vertexShader !== void 0) material.vertexShader = json.vertexShader; + if (json.fragmentShader !== void 0) material.fragmentShader = json.fragmentShader; + if (json.glslVersion !== void 0) material.glslVersion = json.glslVersion; + if (json.extensions !== void 0) { + for (const key in json.extensions) { + material.extensions[key] = json.extensions[key]; } - if (geoInfo.uv) { - geoInfo.uv.forEach(function(uv, j) { - if (buffers.uvs[j] === void 0) buffers.uvs[j] = []; - buffers.uvs[j].push(faceUVs[j][i0 * 2]); - buffers.uvs[j].push(faceUVs[j][i0 * 2 + 1]); - buffers.uvs[j].push(faceUVs[j][i1 * 2]); - buffers.uvs[j].push(faceUVs[j][i1 * 2 + 1]); - buffers.uvs[j].push(faceUVs[j][i2 * 2]); - buffers.uvs[j].push(faceUVs[j][i2 * 2 + 1]); - }); + } + if (json.lights !== void 0) material.lights = json.lights; + if (json.clipping !== void 0) material.clipping = json.clipping; + if (json.size !== void 0) material.size = json.size; + if (json.sizeAttenuation !== void 0) material.sizeAttenuation = json.sizeAttenuation; + if (json.map !== void 0) material.map = getTexture(json.map); + if (json.matcap !== void 0) material.matcap = getTexture(json.matcap); + if (json.alphaMap !== void 0) material.alphaMap = getTexture(json.alphaMap); + if (json.bumpMap !== void 0) material.bumpMap = getTexture(json.bumpMap); + if (json.bumpScale !== void 0) material.bumpScale = json.bumpScale; + if (json.normalMap !== void 0) material.normalMap = getTexture(json.normalMap); + if (json.normalMapType !== void 0) material.normalMapType = json.normalMapType; + if (json.normalScale !== void 0) { + let normalScale = json.normalScale; + if (Array.isArray(normalScale) === false) { + normalScale = [normalScale, normalScale]; } + material.normalScale = new Vector2().fromArray(normalScale); } + if (json.displacementMap !== void 0) material.displacementMap = getTexture(json.displacementMap); + if (json.displacementScale !== void 0) material.displacementScale = json.displacementScale; + if (json.displacementBias !== void 0) material.displacementBias = json.displacementBias; + if (json.roughnessMap !== void 0) material.roughnessMap = getTexture(json.roughnessMap); + if (json.metalnessMap !== void 0) material.metalnessMap = getTexture(json.metalnessMap); + if (json.emissiveMap !== void 0) material.emissiveMap = getTexture(json.emissiveMap); + if (json.emissiveIntensity !== void 0) material.emissiveIntensity = json.emissiveIntensity; + if (json.specularMap !== void 0) material.specularMap = getTexture(json.specularMap); + if (json.specularIntensityMap !== void 0) material.specularIntensityMap = getTexture(json.specularIntensityMap); + if (json.specularColorMap !== void 0) material.specularColorMap = getTexture(json.specularColorMap); + if (json.envMap !== void 0) material.envMap = getTexture(json.envMap); + if (json.envMapRotation !== void 0) material.envMapRotation.fromArray(json.envMapRotation); + if (json.envMapIntensity !== void 0) material.envMapIntensity = json.envMapIntensity; + if (json.reflectivity !== void 0) material.reflectivity = json.reflectivity; + if (json.refractionRatio !== void 0) material.refractionRatio = json.refractionRatio; + if (json.lightMap !== void 0) material.lightMap = getTexture(json.lightMap); + if (json.lightMapIntensity !== void 0) material.lightMapIntensity = json.lightMapIntensity; + if (json.aoMap !== void 0) material.aoMap = getTexture(json.aoMap); + if (json.aoMapIntensity !== void 0) material.aoMapIntensity = json.aoMapIntensity; + if (json.gradientMap !== void 0) material.gradientMap = getTexture(json.gradientMap); + if (json.clearcoatMap !== void 0) material.clearcoatMap = getTexture(json.clearcoatMap); + if (json.clearcoatRoughnessMap !== void 0) material.clearcoatRoughnessMap = getTexture(json.clearcoatRoughnessMap); + if (json.clearcoatNormalMap !== void 0) material.clearcoatNormalMap = getTexture(json.clearcoatNormalMap); + if (json.clearcoatNormalScale !== void 0) material.clearcoatNormalScale = new Vector2().fromArray(json.clearcoatNormalScale); + if (json.iridescenceMap !== void 0) material.iridescenceMap = getTexture(json.iridescenceMap); + if (json.iridescenceThicknessMap !== void 0) material.iridescenceThicknessMap = getTexture(json.iridescenceThicknessMap); + if (json.transmissionMap !== void 0) material.transmissionMap = getTexture(json.transmissionMap); + if (json.thicknessMap !== void 0) material.thicknessMap = getTexture(json.thicknessMap); + if (json.anisotropyMap !== void 0) material.anisotropyMap = getTexture(json.anisotropyMap); + if (json.sheenColorMap !== void 0) material.sheenColorMap = getTexture(json.sheenColorMap); + if (json.sheenRoughnessMap !== void 0) material.sheenRoughnessMap = getTexture(json.sheenRoughnessMap); + return material; } - addMorphTargets(parentGeo, parentGeoNode, morphTargets, preTransform) { - if (morphTargets.length === 0) return; - parentGeo.morphTargetsRelative = true; - parentGeo.morphAttributes.position = []; - const scope = this; - morphTargets.forEach(function(morphTarget) { - morphTarget.rawTargets.forEach(function(rawTarget) { - const morphGeoNode = fbxTree.Objects.Geometry[rawTarget.geoID]; - if (morphGeoNode !== void 0) { - scope.genMorphGeometry(parentGeo, parentGeoNode, morphGeoNode, preTransform, rawTarget.name); - } - }); - }); + setTextures(value) { + this.textures = value; + return this; } - // a morph geometry node is similar to a standard node, and the node is also contained - // in FBXTree.Objects.Geometry, however it can only have attributes for position, normal - // and a special attribute Index defining which vertices of the original geometry are affected - // Normal and position attributes only have data for the vertices that are affected by the morph - genMorphGeometry(parentGeo, parentGeoNode, morphGeoNode, preTransform, name) { - const basePositions = parentGeoNode.Vertices !== void 0 ? parentGeoNode.Vertices.a : []; - const baseIndices = parentGeoNode.PolygonVertexIndex !== void 0 ? parentGeoNode.PolygonVertexIndex.a : []; - const morphPositionsSparse = morphGeoNode.Vertices !== void 0 ? morphGeoNode.Vertices.a : []; - const morphIndices = morphGeoNode.Indexes !== void 0 ? morphGeoNode.Indexes.a : []; - const length = parentGeo.attributes.position.count * 3; - const morphPositions = new Float32Array(length); - for (let i = 0; i < morphIndices.length; i++) { - const morphIndex = morphIndices[i] * 3; - morphPositions[morphIndex] = morphPositionsSparse[i * 3]; - morphPositions[morphIndex + 1] = morphPositionsSparse[i * 3 + 1]; - morphPositions[morphIndex + 2] = morphPositionsSparse[i * 3 + 2]; - } - const morphGeoInfo = { - vertexIndices: baseIndices, - vertexPositions: morphPositions, - baseVertexPositions: basePositions - }; - const morphBuffers = this.genBuffers(morphGeoInfo); - const positionAttribute = new Float32BufferAttribute(morphBuffers.vertex, 3); - positionAttribute.name = name || morphGeoNode.attrName; - positionAttribute.applyMatrix4(preTransform); - parentGeo.morphAttributes.position.push(positionAttribute); + createMaterialFromType(type) { + return MaterialLoader.createMaterialFromType(type); } - // Parse normal from FBXTree.Objects.Geometry.LayerElementNormal if it exists - parseNormals(NormalNode) { - const mappingType = NormalNode.MappingInformationType; - const referenceType = NormalNode.ReferenceInformationType; - const buffer = NormalNode.Normals.a; - let indexBuffer = []; - if (referenceType === "IndexToDirect") { - if ("NormalIndex" in NormalNode) { - indexBuffer = NormalNode.NormalIndex.a; - } else if ("NormalsIndex" in NormalNode) { - indexBuffer = NormalNode.NormalsIndex.a; - } - } - return { - dataSize: 3, - buffer, - indices: indexBuffer, - mappingType, - referenceType + static createMaterialFromType(type) { + const materialLib = { + ShadowMaterial, + SpriteMaterial, + RawShaderMaterial, + ShaderMaterial, + PointsMaterial, + MeshPhysicalMaterial, + MeshStandardMaterial, + MeshPhongMaterial, + MeshToonMaterial, + MeshNormalMaterial, + MeshLambertMaterial, + MeshDepthMaterial, + MeshDistanceMaterial, + MeshBasicMaterial, + MeshMatcapMaterial, + LineDashedMaterial, + LineBasicMaterial, + Material }; + return new materialLib[type](); } - // Parse UVs from FBXTree.Objects.Geometry.LayerElementUV if it exists - parseUVs(UVNode) { - const mappingType = UVNode.MappingInformationType; - const referenceType = UVNode.ReferenceInformationType; - const buffer = UVNode.UV.a; - let indexBuffer = []; - if (referenceType === "IndexToDirect") { - indexBuffer = UVNode.UVIndex.a; - } - return { - dataSize: 2, - buffer, - indices: indexBuffer, - mappingType, - referenceType - }; +} +class LoaderUtils { + static { + __name(this, "LoaderUtils"); } - // Parse Vertex Colors from FBXTree.Objects.Geometry.LayerElementColor if it exists - parseVertexColors(ColorNode) { - const mappingType = ColorNode.MappingInformationType; - const referenceType = ColorNode.ReferenceInformationType; - const buffer = ColorNode.Colors.a; - let indexBuffer = []; - if (referenceType === "IndexToDirect") { - indexBuffer = ColorNode.ColorIndex.a; - } - for (let i = 0, c = new Color(); i < buffer.length; i += 4) { - c.fromArray(buffer, i); - ColorManagement.toWorkingColorSpace(c, SRGBColorSpace); - c.toArray(buffer, i); + static decodeText(array) { + console.warn("THREE.LoaderUtils: decodeText() has been deprecated with r165 and will be removed with r175. Use TextDecoder instead."); + if (typeof TextDecoder !== "undefined") { + return new TextDecoder().decode(array); } - return { - dataSize: 4, - buffer, - indices: indexBuffer, - mappingType, - referenceType - }; - } - // Parse mapping and material data in FBXTree.Objects.Geometry.LayerElementMaterial if it exists - parseMaterialIndices(MaterialNode) { - const mappingType = MaterialNode.MappingInformationType; - const referenceType = MaterialNode.ReferenceInformationType; - if (mappingType === "NoMappingInformation") { - return { - dataSize: 1, - buffer: [0], - indices: [0], - mappingType: "AllSame", - referenceType - }; + let s = ""; + for (let i = 0, il = array.length; i < il; i++) { + s += String.fromCharCode(array[i]); } - const materialIndexBuffer = MaterialNode.Materials.a; - const materialIndices = []; - for (let i = 0; i < materialIndexBuffer.length; ++i) { - materialIndices.push(i); + try { + return decodeURIComponent(escape(s)); + } catch (e) { + return s; } - return { - dataSize: 1, - buffer: materialIndexBuffer, - indices: materialIndices, - mappingType, - referenceType - }; } - // Generate a NurbGeometry from a node in FBXTree.Objects.Geometry - parseNurbsGeometry(geoNode) { - const order = parseInt(geoNode.Order); - if (isNaN(order)) { - console.error("THREE.FBXLoader: Invalid Order %s given for geometry ID: %s", geoNode.Order, geoNode.id); - return new BufferGeometry(); - } - const degree = order - 1; - const knots = geoNode.KnotVector.a; - const controlPoints = []; - const pointsValues = geoNode.Points.a; - for (let i = 0, l = pointsValues.length; i < l; i += 4) { - controlPoints.push(new Vector4().fromArray(pointsValues, i)); - } - let startKnot, endKnot; - if (geoNode.Form === "Closed") { - controlPoints.push(controlPoints[0]); - } else if (geoNode.Form === "Periodic") { - startKnot = degree; - endKnot = knots.length - 1 - startKnot; - for (let i = 0; i < degree; ++i) { - controlPoints.push(controlPoints[i]); - } + static extractUrlBase(url) { + const index = url.lastIndexOf("/"); + if (index === -1) return "./"; + return url.slice(0, index + 1); + } + static resolveURL(url, path) { + if (typeof url !== "string" || url === "") return ""; + if (/^https?:\/\//i.test(path) && /^\//.test(url)) { + path = path.replace(/(^https?:\/\/[^\/]+).*/i, "$1"); } - const curve = new NURBSCurve(degree, knots, controlPoints, startKnot, endKnot); - const points = curve.getPoints(controlPoints.length * 12); - return new BufferGeometry().setFromPoints(points); + if (/^(https?:)?\/\//i.test(url)) return url; + if (/^data:.*,.*$/i.test(url)) return url; + if (/^blob:.*$/i.test(url)) return url; + return path + url; } } -class AnimationParser { +class InstancedBufferGeometry extends BufferGeometry { static { - __name(this, "AnimationParser"); - } - // take raw animation clips and turn them into three.js animation clips - parse() { - const animationClips = []; - const rawClips = this.parseClips(); - if (rawClips !== void 0) { - for (const key in rawClips) { - const rawClip = rawClips[key]; - const clip = this.addClip(rawClip); - animationClips.push(clip); - } - } - return animationClips; + __name(this, "InstancedBufferGeometry"); } - parseClips() { - if (fbxTree.Objects.AnimationCurve === void 0) return void 0; - const curveNodesMap = this.parseAnimationCurveNodes(); - this.parseAnimationCurves(curveNodesMap); - const layersMap = this.parseAnimationLayers(curveNodesMap); - const rawClips = this.parseAnimStacks(layersMap); - return rawClips; + constructor() { + super(); + this.isInstancedBufferGeometry = true; + this.type = "InstancedBufferGeometry"; + this.instanceCount = Infinity; } - // parse nodes in FBXTree.Objects.AnimationCurveNode - // each AnimationCurveNode holds data for an animation transform for a model (e.g. left arm rotation ) - // and is referenced by an AnimationLayer - parseAnimationCurveNodes() { - const rawCurveNodes = fbxTree.Objects.AnimationCurveNode; - const curveNodesMap = /* @__PURE__ */ new Map(); - for (const nodeID in rawCurveNodes) { - const rawCurveNode = rawCurveNodes[nodeID]; - if (rawCurveNode.attrName.match(/S|R|T|DeformPercent/) !== null) { - const curveNode = { - id: rawCurveNode.id, - attr: rawCurveNode.attrName, - curves: {} - }; - curveNodesMap.set(curveNode.id, curveNode); - } - } - return curveNodesMap; + copy(source) { + super.copy(source); + this.instanceCount = source.instanceCount; + return this; } - // parse nodes in FBXTree.Objects.AnimationCurve and connect them up to - // previously parsed AnimationCurveNodes. Each AnimationCurve holds data for a single animated - // axis ( e.g. times and values of x rotation) - parseAnimationCurves(curveNodesMap) { - const rawCurves = fbxTree.Objects.AnimationCurve; - for (const nodeID in rawCurves) { - const animationCurve = { - id: rawCurves[nodeID].id, - times: rawCurves[nodeID].KeyTime.a.map(convertFBXTimeToSeconds), - values: rawCurves[nodeID].KeyValueFloat.a - }; - const relationships = connections.get(animationCurve.id); - if (relationships !== void 0) { - const animationCurveID = relationships.parents[0].ID; - const animationCurveRelationship = relationships.parents[0].relationship; - if (animationCurveRelationship.match(/X/)) { - curveNodesMap.get(animationCurveID).curves["x"] = animationCurve; - } else if (animationCurveRelationship.match(/Y/)) { - curveNodesMap.get(animationCurveID).curves["y"] = animationCurve; - } else if (animationCurveRelationship.match(/Z/)) { - curveNodesMap.get(animationCurveID).curves["z"] = animationCurve; - } else if (animationCurveRelationship.match(/DeformPercent/) && curveNodesMap.has(animationCurveID)) { - curveNodesMap.get(animationCurveID).curves["morph"] = animationCurve; - } - } - } + toJSON() { + const data = super.toJSON(); + data.instanceCount = this.instanceCount; + data.isInstancedBufferGeometry = true; + return data; } - // parse nodes in FBXTree.Objects.AnimationLayer. Each layers holds references - // to various AnimationCurveNodes and is referenced by an AnimationStack node - // note: theoretically a stack can have multiple layers, however in practice there always seems to be one per stack - parseAnimationLayers(curveNodesMap) { - const rawLayers = fbxTree.Objects.AnimationLayer; - const layersMap = /* @__PURE__ */ new Map(); - for (const nodeID in rawLayers) { - const layerCurveNodes = []; - const connection = connections.get(parseInt(nodeID)); - if (connection !== void 0) { - const children = connection.children; - children.forEach(function(child, i) { - if (curveNodesMap.has(child.ID)) { - const curveNode = curveNodesMap.get(child.ID); - if (curveNode.curves.x !== void 0 || curveNode.curves.y !== void 0 || curveNode.curves.z !== void 0) { - if (layerCurveNodes[i] === void 0) { - const modelID = connections.get(child.ID).parents.filter(function(parent) { - return parent.relationship !== void 0; - })[0].ID; - if (modelID !== void 0) { - const rawModel = fbxTree.Objects.Model[modelID.toString()]; - if (rawModel === void 0) { - console.warn("THREE.FBXLoader: Encountered a unused curve.", child); - return; - } - const node = { - modelName: rawModel.attrName ? PropertyBinding.sanitizeNodeName(rawModel.attrName) : "", - ID: rawModel.id, - initialPosition: [0, 0, 0], - initialRotation: [0, 0, 0], - initialScale: [1, 1, 1] - }; - sceneGraph.traverse(function(child2) { - if (child2.ID === rawModel.id) { - node.transform = child2.matrix; - if (child2.userData.transformData) node.eulerOrder = child2.userData.transformData.eulerOrder; - } - }); - if (!node.transform) node.transform = new Matrix4(); - if ("PreRotation" in rawModel) node.preRotation = rawModel.PreRotation.value; - if ("PostRotation" in rawModel) node.postRotation = rawModel.PostRotation.value; - layerCurveNodes[i] = node; - } - } - if (layerCurveNodes[i]) layerCurveNodes[i][curveNode.attr] = curveNode; - } else if (curveNode.curves.morph !== void 0) { - if (layerCurveNodes[i] === void 0) { - const deformerID = connections.get(child.ID).parents.filter(function(parent) { - return parent.relationship !== void 0; - })[0].ID; - const morpherID = connections.get(deformerID).parents[0].ID; - const geoID = connections.get(morpherID).parents[0].ID; - const modelID = connections.get(geoID).parents[0].ID; - const rawModel = fbxTree.Objects.Model[modelID]; - const node = { - modelName: rawModel.attrName ? PropertyBinding.sanitizeNodeName(rawModel.attrName) : "", - morphName: fbxTree.Objects.Deformer[deformerID].attrName - }; - layerCurveNodes[i] = node; - } - layerCurveNodes[i][curveNode.attr] = curveNode; - } - } - }); - layersMap.set(parseInt(nodeID), layerCurveNodes); - } - } - return layersMap; +} +class BufferGeometryLoader extends Loader { + static { + __name(this, "BufferGeometryLoader"); } - // parse nodes in FBXTree.Objects.AnimationStack. These are the top level node in the animation - // hierarchy. Each Stack node will be used to create a AnimationClip - parseAnimStacks(layersMap) { - const rawStacks = fbxTree.Objects.AnimationStack; - const rawClips = {}; - for (const nodeID in rawStacks) { - const children = connections.get(parseInt(nodeID)).children; - if (children.length > 1) { - console.warn("THREE.FBXLoader: Encountered an animation stack with multiple layers, this is currently not supported. Ignoring subsequent layers."); - } - const layer = layersMap.get(children[0].ID); - rawClips[nodeID] = { - name: rawStacks[nodeID].attrName, - layer - }; - } - return rawClips; + constructor(manager) { + super(manager); } - addClip(rawClip) { - let tracks = []; + load(url, onLoad, onProgress, onError) { const scope = this; - rawClip.layer.forEach(function(rawTracks) { - tracks = tracks.concat(scope.generateTracks(rawTracks)); - }); - return new AnimationClip(rawClip.name, -1, tracks); + const loader = new FileLoader(scope.manager); + loader.setPath(scope.path); + loader.setRequestHeader(scope.requestHeader); + loader.setWithCredentials(scope.withCredentials); + loader.load(url, function(text) { + try { + onLoad(scope.parse(JSON.parse(text))); + } catch (e) { + if (onError) { + onError(e); + } else { + console.error(e); + } + scope.manager.itemError(url); + } + }, onProgress, onError); } - generateTracks(rawTracks) { - const tracks = []; - let initialPosition = new Vector3(); - let initialScale = new Vector3(); - if (rawTracks.transform) rawTracks.transform.decompose(initialPosition, new Quaternion(), initialScale); - initialPosition = initialPosition.toArray(); - initialScale = initialScale.toArray(); - if (rawTracks.T !== void 0 && Object.keys(rawTracks.T.curves).length > 0) { - const positionTrack = this.generateVectorTrack(rawTracks.modelName, rawTracks.T.curves, initialPosition, "position"); - if (positionTrack !== void 0) tracks.push(positionTrack); + parse(json) { + const interleavedBufferMap = {}; + const arrayBufferMap = {}; + function getInterleavedBuffer(json2, uuid) { + if (interleavedBufferMap[uuid] !== void 0) return interleavedBufferMap[uuid]; + const interleavedBuffers = json2.interleavedBuffers; + const interleavedBuffer = interleavedBuffers[uuid]; + const buffer = getArrayBuffer(json2, interleavedBuffer.buffer); + const array = getTypedArray(interleavedBuffer.type, buffer); + const ib = new InterleavedBuffer(array, interleavedBuffer.stride); + ib.uuid = interleavedBuffer.uuid; + interleavedBufferMap[uuid] = ib; + return ib; } - if (rawTracks.R !== void 0 && Object.keys(rawTracks.R.curves).length > 0) { - const rotationTrack = this.generateRotationTrack(rawTracks.modelName, rawTracks.R.curves, rawTracks.preRotation, rawTracks.postRotation, rawTracks.eulerOrder); - if (rotationTrack !== void 0) tracks.push(rotationTrack); + __name(getInterleavedBuffer, "getInterleavedBuffer"); + function getArrayBuffer(json2, uuid) { + if (arrayBufferMap[uuid] !== void 0) return arrayBufferMap[uuid]; + const arrayBuffers = json2.arrayBuffers; + const arrayBuffer = arrayBuffers[uuid]; + const ab = new Uint32Array(arrayBuffer).buffer; + arrayBufferMap[uuid] = ab; + return ab; } - if (rawTracks.S !== void 0 && Object.keys(rawTracks.S.curves).length > 0) { - const scaleTrack = this.generateVectorTrack(rawTracks.modelName, rawTracks.S.curves, initialScale, "scale"); - if (scaleTrack !== void 0) tracks.push(scaleTrack); + __name(getArrayBuffer, "getArrayBuffer"); + const geometry = json.isInstancedBufferGeometry ? new InstancedBufferGeometry() : new BufferGeometry(); + const index = json.data.index; + if (index !== void 0) { + const typedArray = getTypedArray(index.type, index.array); + geometry.setIndex(new BufferAttribute(typedArray, 1)); } - if (rawTracks.DeformPercent !== void 0) { - const morphTrack = this.generateMorphTrack(rawTracks); - if (morphTrack !== void 0) tracks.push(morphTrack); + const attributes = json.data.attributes; + for (const key in attributes) { + const attribute = attributes[key]; + let bufferAttribute; + if (attribute.isInterleavedBufferAttribute) { + const interleavedBuffer = getInterleavedBuffer(json.data, attribute.data); + bufferAttribute = new InterleavedBufferAttribute(interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized); + } else { + const typedArray = getTypedArray(attribute.type, attribute.array); + const bufferAttributeConstr = attribute.isInstancedBufferAttribute ? InstancedBufferAttribute : BufferAttribute; + bufferAttribute = new bufferAttributeConstr(typedArray, attribute.itemSize, attribute.normalized); + } + if (attribute.name !== void 0) bufferAttribute.name = attribute.name; + if (attribute.usage !== void 0) bufferAttribute.setUsage(attribute.usage); + geometry.setAttribute(key, bufferAttribute); } - return tracks; - } - generateVectorTrack(modelName, curves, initialValue, type) { - const times = this.getTimesForAllAxes(curves); - const values = this.getKeyframeTrackValues(times, curves, initialValue); - return new VectorKeyframeTrack(modelName + "." + type, times, values); - } - generateRotationTrack(modelName, curves, preRotation, postRotation, eulerOrder) { - let times; - let values; - if (curves.x !== void 0 && curves.y !== void 0 && curves.z !== void 0) { - const result = this.interpolateRotations(curves.x, curves.y, curves.z, eulerOrder); - times = result[0]; - values = result[1]; + const morphAttributes = json.data.morphAttributes; + if (morphAttributes) { + for (const key in morphAttributes) { + const attributeArray = morphAttributes[key]; + const array = []; + for (let i = 0, il = attributeArray.length; i < il; i++) { + const attribute = attributeArray[i]; + let bufferAttribute; + if (attribute.isInterleavedBufferAttribute) { + const interleavedBuffer = getInterleavedBuffer(json.data, attribute.data); + bufferAttribute = new InterleavedBufferAttribute(interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized); + } else { + const typedArray = getTypedArray(attribute.type, attribute.array); + bufferAttribute = new BufferAttribute(typedArray, attribute.itemSize, attribute.normalized); + } + if (attribute.name !== void 0) bufferAttribute.name = attribute.name; + array.push(bufferAttribute); + } + geometry.morphAttributes[key] = array; + } } - const defaultEulerOrder = getEulerOrder(0); - if (preRotation !== void 0) { - preRotation = preRotation.map(MathUtils.degToRad); - preRotation.push(defaultEulerOrder); - preRotation = new Euler().fromArray(preRotation); - preRotation = new Quaternion().setFromEuler(preRotation); + const morphTargetsRelative = json.data.morphTargetsRelative; + if (morphTargetsRelative) { + geometry.morphTargetsRelative = true; } - if (postRotation !== void 0) { - postRotation = postRotation.map(MathUtils.degToRad); - postRotation.push(defaultEulerOrder); - postRotation = new Euler().fromArray(postRotation); - postRotation = new Quaternion().setFromEuler(postRotation).invert(); + const groups = json.data.groups || json.data.drawcalls || json.data.offsets; + if (groups !== void 0) { + for (let i = 0, n = groups.length; i !== n; ++i) { + const group = groups[i]; + geometry.addGroup(group.start, group.count, group.materialIndex); + } } - const quaternion = new Quaternion(); - const euler = new Euler(); - const quaternionValues = []; - if (!values || !times) return new QuaternionKeyframeTrack(modelName + ".quaternion", [0], [0]); - for (let i = 0; i < values.length; i += 3) { - euler.set(values[i], values[i + 1], values[i + 2], eulerOrder); - quaternion.setFromEuler(euler); - if (preRotation !== void 0) quaternion.premultiply(preRotation); - if (postRotation !== void 0) quaternion.multiply(postRotation); - if (i > 2) { - const prevQuat = new Quaternion().fromArray( - quaternionValues, - (i - 3) / 3 * 4 - ); - if (prevQuat.dot(quaternion) < 0) { - quaternion.set(-quaternion.x, -quaternion.y, -quaternion.z, -quaternion.w); - } + const boundingSphere = json.data.boundingSphere; + if (boundingSphere !== void 0) { + const center = new Vector3(); + if (boundingSphere.center !== void 0) { + center.fromArray(boundingSphere.center); } - quaternion.toArray(quaternionValues, i / 3 * 4); + geometry.boundingSphere = new Sphere(center, boundingSphere.radius); } - return new QuaternionKeyframeTrack(modelName + ".quaternion", times, quaternionValues); + if (json.name) geometry.name = json.name; + if (json.userData) geometry.userData = json.userData; + return geometry; } - generateMorphTrack(rawTracks) { - const curves = rawTracks.DeformPercent.curves.morph; - const values = curves.values.map(function(val) { - return val / 100; - }); - const morphNum = sceneGraph.getObjectByName(rawTracks.modelName).morphTargetDictionary[rawTracks.morphName]; - return new NumberKeyframeTrack(rawTracks.modelName + ".morphTargetInfluences[" + morphNum + "]", curves.times, values); +} +class ObjectLoader extends Loader { + static { + __name(this, "ObjectLoader"); } - // For all animated objects, times are defined separately for each axis - // Here we'll combine the times into one sorted array without duplicates - getTimesForAllAxes(curves) { - let times = []; - if (curves.x !== void 0) times = times.concat(curves.x.times); - if (curves.y !== void 0) times = times.concat(curves.y.times); - if (curves.z !== void 0) times = times.concat(curves.z.times); - times = times.sort(function(a, b) { - return a - b; + constructor(manager) { + super(manager); + } + load(url, onLoad, onProgress, onError) { + const scope = this; + const path = this.path === "" ? LoaderUtils.extractUrlBase(url) : this.path; + this.resourcePath = this.resourcePath || path; + const loader = new FileLoader(this.manager); + loader.setPath(this.path); + loader.setRequestHeader(this.requestHeader); + loader.setWithCredentials(this.withCredentials); + loader.load(url, function(text) { + let json = null; + try { + json = JSON.parse(text); + } catch (error) { + if (onError !== void 0) onError(error); + console.error("THREE:ObjectLoader: Can't parse " + url + ".", error.message); + return; + } + const metadata = json.metadata; + if (metadata === void 0 || metadata.type === void 0 || metadata.type.toLowerCase() === "geometry") { + if (onError !== void 0) onError(new Error("THREE.ObjectLoader: Can't load " + url)); + console.error("THREE.ObjectLoader: Can't load " + url); + return; + } + scope.parse(json, onLoad); + }, onProgress, onError); + } + async loadAsync(url, onProgress) { + const scope = this; + const path = this.path === "" ? LoaderUtils.extractUrlBase(url) : this.path; + this.resourcePath = this.resourcePath || path; + const loader = new FileLoader(this.manager); + loader.setPath(this.path); + loader.setRequestHeader(this.requestHeader); + loader.setWithCredentials(this.withCredentials); + const text = await loader.loadAsync(url, onProgress); + const json = JSON.parse(text); + const metadata = json.metadata; + if (metadata === void 0 || metadata.type === void 0 || metadata.type.toLowerCase() === "geometry") { + throw new Error("THREE.ObjectLoader: Can't load " + url); + } + return await scope.parseAsync(json); + } + parse(json, onLoad) { + const animations = this.parseAnimations(json.animations); + const shapes = this.parseShapes(json.shapes); + const geometries = this.parseGeometries(json.geometries, shapes); + const images = this.parseImages(json.images, function() { + if (onLoad !== void 0) onLoad(object); }); - if (times.length > 1) { - let targetIndex = 1; - let lastValue = times[0]; - for (let i = 1; i < times.length; i++) { - const currentValue = times[i]; - if (currentValue !== lastValue) { - times[targetIndex] = currentValue; - lastValue = currentValue; - targetIndex++; + const textures = this.parseTextures(json.textures, images); + const materials = this.parseMaterials(json.materials, textures); + const object = this.parseObject(json.object, geometries, materials, textures, animations); + const skeletons = this.parseSkeletons(json.skeletons, object); + this.bindSkeletons(object, skeletons); + this.bindLightTargets(object); + if (onLoad !== void 0) { + let hasImages = false; + for (const uuid in images) { + if (images[uuid].data instanceof HTMLImageElement) { + hasImages = true; + break; } } - times = times.slice(0, targetIndex); + if (hasImages === false) onLoad(object); } - return times; + return object; } - getKeyframeTrackValues(times, curves, initialValue) { - const prevValue = initialValue; - const values = []; - let xIndex = -1; - let yIndex = -1; - let zIndex = -1; - times.forEach(function(time) { - if (curves.x) xIndex = curves.x.times.indexOf(time); - if (curves.y) yIndex = curves.y.times.indexOf(time); - if (curves.z) zIndex = curves.z.times.indexOf(time); - if (xIndex !== -1) { - const xValue = curves.x.values[xIndex]; - values.push(xValue); - prevValue[0] = xValue; - } else { - values.push(prevValue[0]); + async parseAsync(json) { + const animations = this.parseAnimations(json.animations); + const shapes = this.parseShapes(json.shapes); + const geometries = this.parseGeometries(json.geometries, shapes); + const images = await this.parseImagesAsync(json.images); + const textures = this.parseTextures(json.textures, images); + const materials = this.parseMaterials(json.materials, textures); + const object = this.parseObject(json.object, geometries, materials, textures, animations); + const skeletons = this.parseSkeletons(json.skeletons, object); + this.bindSkeletons(object, skeletons); + this.bindLightTargets(object); + return object; + } + parseShapes(json) { + const shapes = {}; + if (json !== void 0) { + for (let i = 0, l = json.length; i < l; i++) { + const shape = new Shape().fromJSON(json[i]); + shapes[shape.uuid] = shape; } - if (yIndex !== -1) { - const yValue = curves.y.values[yIndex]; - values.push(yValue); - prevValue[1] = yValue; - } else { - values.push(prevValue[1]); + } + return shapes; + } + parseSkeletons(json, object) { + const skeletons = {}; + const bones = {}; + object.traverse(function(child) { + if (child.isBone) bones[child.uuid] = child; + }); + if (json !== void 0) { + for (let i = 0, l = json.length; i < l; i++) { + const skeleton = new Skeleton().fromJSON(json[i], bones); + skeletons[skeleton.uuid] = skeleton; } - if (zIndex !== -1) { - const zValue = curves.z.values[zIndex]; - values.push(zValue); - prevValue[2] = zValue; - } else { - values.push(prevValue[2]); + } + return skeletons; + } + parseGeometries(json, shapes) { + const geometries = {}; + if (json !== void 0) { + const bufferGeometryLoader = new BufferGeometryLoader(); + for (let i = 0, l = json.length; i < l; i++) { + let geometry; + const data = json[i]; + switch (data.type) { + case "BufferGeometry": + case "InstancedBufferGeometry": + geometry = bufferGeometryLoader.parse(data); + break; + default: + if (data.type in Geometries) { + geometry = Geometries[data.type].fromJSON(data, shapes); + } else { + console.warn(`THREE.ObjectLoader: Unsupported geometry type "${data.type}"`); + } + } + geometry.uuid = data.uuid; + if (data.name !== void 0) geometry.name = data.name; + if (data.userData !== void 0) geometry.userData = data.userData; + geometries[data.uuid] = geometry; } - }); - return values; + } + return geometries; } - // Rotations are defined as Euler angles which can have values of any size - // These will be converted to quaternions which don't support values greater than - // PI, so we'll interpolate large rotations - interpolateRotations(curvex, curvey, curvez, eulerOrder) { - const times = []; - const values = []; - times.push(curvex.times[0]); - values.push(MathUtils.degToRad(curvex.values[0])); - values.push(MathUtils.degToRad(curvey.values[0])); - values.push(MathUtils.degToRad(curvez.values[0])); - for (let i = 1; i < curvex.values.length; i++) { - const initialValue = [ - curvex.values[i - 1], - curvey.values[i - 1], - curvez.values[i - 1] - ]; - if (isNaN(initialValue[0]) || isNaN(initialValue[1]) || isNaN(initialValue[2])) { - continue; + parseMaterials(json, textures) { + const cache = {}; + const materials = {}; + if (json !== void 0) { + const loader = new MaterialLoader(); + loader.setTextures(textures); + for (let i = 0, l = json.length; i < l; i++) { + const data = json[i]; + if (cache[data.uuid] === void 0) { + cache[data.uuid] = loader.parse(data); + } + materials[data.uuid] = cache[data.uuid]; } - const initialValueRad = initialValue.map(MathUtils.degToRad); - const currentValue = [ - curvex.values[i], - curvey.values[i], - curvez.values[i] - ]; - if (isNaN(currentValue[0]) || isNaN(currentValue[1]) || isNaN(currentValue[2])) { - continue; + } + return materials; + } + parseAnimations(json) { + const animations = {}; + if (json !== void 0) { + for (let i = 0; i < json.length; i++) { + const data = json[i]; + const clip = AnimationClip.parse(data); + animations[clip.uuid] = clip; } - const currentValueRad = currentValue.map(MathUtils.degToRad); - const valuesSpan = [ - currentValue[0] - initialValue[0], - currentValue[1] - initialValue[1], - currentValue[2] - initialValue[2] - ]; - const absoluteSpan = [ - Math.abs(valuesSpan[0]), - Math.abs(valuesSpan[1]), - Math.abs(valuesSpan[2]) - ]; - if (absoluteSpan[0] >= 180 || absoluteSpan[1] >= 180 || absoluteSpan[2] >= 180) { - const maxAbsSpan = Math.max(...absoluteSpan); - const numSubIntervals = maxAbsSpan / 180; - const E1 = new Euler(...initialValueRad, eulerOrder); - const E2 = new Euler(...currentValueRad, eulerOrder); - const Q1 = new Quaternion().setFromEuler(E1); - const Q2 = new Quaternion().setFromEuler(E2); - if (Q1.dot(Q2)) { - Q2.set(-Q2.x, -Q2.y, -Q2.z, -Q2.w); + } + return animations; + } + parseImages(json, onLoad) { + const scope = this; + const images = {}; + let loader; + function loadImage2(url) { + scope.manager.itemStart(url); + return loader.load(url, function() { + scope.manager.itemEnd(url); + }, void 0, function() { + scope.manager.itemError(url); + scope.manager.itemEnd(url); + }); + } + __name(loadImage2, "loadImage"); + function deserializeImage(image) { + if (typeof image === "string") { + const url = image; + const path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test(url) ? url : scope.resourcePath + url; + return loadImage2(path); + } else { + if (image.data) { + return { + data: getTypedArray(image.type, image.data), + width: image.width, + height: image.height + }; + } else { + return null; } - const initialTime = curvex.times[i - 1]; - const timeSpan = curvex.times[i] - initialTime; - const Q = new Quaternion(); - const E = new Euler(); - for (let t2 = 0; t2 < 1; t2 += 1 / numSubIntervals) { - Q.copy(Q1.clone().slerp(Q2.clone(), t2)); - times.push(initialTime + t2 * timeSpan); - E.setFromQuaternion(Q, eulerOrder); - values.push(E.x); - values.push(E.y); - values.push(E.z); + } + } + __name(deserializeImage, "deserializeImage"); + if (json !== void 0 && json.length > 0) { + const manager = new LoadingManager(onLoad); + loader = new ImageLoader(manager); + loader.setCrossOrigin(this.crossOrigin); + for (let i = 0, il = json.length; i < il; i++) { + const image = json[i]; + const url = image.url; + if (Array.isArray(url)) { + const imageArray = []; + for (let j = 0, jl = url.length; j < jl; j++) { + const currentUrl = url[j]; + const deserializedImage = deserializeImage(currentUrl); + if (deserializedImage !== null) { + if (deserializedImage instanceof HTMLImageElement) { + imageArray.push(deserializedImage); + } else { + imageArray.push(new DataTexture(deserializedImage.data, deserializedImage.width, deserializedImage.height)); + } + } + } + images[image.uuid] = new Source(imageArray); + } else { + const deserializedImage = deserializeImage(image.url); + images[image.uuid] = new Source(deserializedImage); } - } else { - times.push(curvex.times[i]); - values.push(MathUtils.degToRad(curvex.values[i])); - values.push(MathUtils.degToRad(curvey.values[i])); - values.push(MathUtils.degToRad(curvez.values[i])); } } - return [times, values]; - } -} -class TextParser { - static { - __name(this, "TextParser"); - } - getPrevNode() { - return this.nodeStack[this.currentIndent - 2]; - } - getCurrentNode() { - return this.nodeStack[this.currentIndent - 1]; - } - getCurrentProp() { - return this.currentProp; - } - pushStack(node) { - this.nodeStack.push(node); - this.currentIndent += 1; - } - popStack() { - this.nodeStack.pop(); - this.currentIndent -= 1; - } - setCurrentProp(val, name) { - this.currentProp = val; - this.currentPropName = name; + return images; } - parse(text) { - this.currentIndent = 0; - this.allNodes = new FBXTree(); - this.nodeStack = []; - this.currentProp = []; - this.currentPropName = ""; + async parseImagesAsync(json) { const scope = this; - const split = text.split(/[\r\n]+/); - split.forEach(function(line, i) { - const matchComment = line.match(/^[\s\t]*;/); - const matchEmpty = line.match(/^[\s\t]*$/); - if (matchComment || matchEmpty) return; - const matchBeginning = line.match("^\\t{" + scope.currentIndent + "}(\\w+):(.*){", ""); - const matchProperty = line.match("^\\t{" + scope.currentIndent + "}(\\w+):[\\s\\t\\r\\n](.*)"); - const matchEnd = line.match("^\\t{" + (scope.currentIndent - 1) + "}}"); - if (matchBeginning) { - scope.parseNodeBegin(line, matchBeginning); - } else if (matchProperty) { - scope.parseNodeProperty(line, matchProperty, split[++i]); - } else if (matchEnd) { - scope.popStack(); - } else if (line.match(/^[^\s\t}]/)) { - scope.parseNodePropertyContinued(line); - } - }); - return this.allNodes; - } - parseNodeBegin(line, property) { - const nodeName = property[1].trim().replace(/^"/, "").replace(/"$/, ""); - const nodeAttrs = property[2].split(",").map(function(attr) { - return attr.trim().replace(/^"/, "").replace(/"$/, ""); - }); - const node = { name: nodeName }; - const attrs = this.parseNodeAttr(nodeAttrs); - const currentNode = this.getCurrentNode(); - if (this.currentIndent === 0) { - this.allNodes.add(nodeName, node); - } else { - if (nodeName in currentNode) { - if (nodeName === "PoseNode") { - currentNode.PoseNode.push(node); - } else if (currentNode[nodeName].id !== void 0) { - currentNode[nodeName] = {}; - currentNode[nodeName][currentNode[nodeName].id] = currentNode[nodeName]; + const images = {}; + let loader; + async function deserializeImage(image) { + if (typeof image === "string") { + const url = image; + const path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test(url) ? url : scope.resourcePath + url; + return await loader.loadAsync(path); + } else { + if (image.data) { + return { + data: getTypedArray(image.type, image.data), + width: image.width, + height: image.height + }; + } else { + return null; } - if (attrs.id !== "") currentNode[nodeName][attrs.id] = node; - } else if (typeof attrs.id === "number") { - currentNode[nodeName] = {}; - currentNode[nodeName][attrs.id] = node; - } else if (nodeName !== "Properties70") { - if (nodeName === "PoseNode") currentNode[nodeName] = [node]; - else currentNode[nodeName] = node; } } - if (typeof attrs.id === "number") node.id = attrs.id; - if (attrs.name !== "") node.attrName = attrs.name; - if (attrs.type !== "") node.attrType = attrs.type; - this.pushStack(node); - } - parseNodeAttr(attrs) { - let id2 = attrs[0]; - if (attrs[0] !== "") { - id2 = parseInt(attrs[0]); - if (isNaN(id2)) { - id2 = attrs[0]; + __name(deserializeImage, "deserializeImage"); + if (json !== void 0 && json.length > 0) { + loader = new ImageLoader(this.manager); + loader.setCrossOrigin(this.crossOrigin); + for (let i = 0, il = json.length; i < il; i++) { + const image = json[i]; + const url = image.url; + if (Array.isArray(url)) { + const imageArray = []; + for (let j = 0, jl = url.length; j < jl; j++) { + const currentUrl = url[j]; + const deserializedImage = await deserializeImage(currentUrl); + if (deserializedImage !== null) { + if (deserializedImage instanceof HTMLImageElement) { + imageArray.push(deserializedImage); + } else { + imageArray.push(new DataTexture(deserializedImage.data, deserializedImage.width, deserializedImage.height)); + } + } + } + images[image.uuid] = new Source(imageArray); + } else { + const deserializedImage = await deserializeImage(image.url); + images[image.uuid] = new Source(deserializedImage); + } } } - let name = "", type = ""; - if (attrs.length > 1) { - name = attrs[1].replace(/^(\w+)::/, ""); - type = attrs[2]; - } - return { id: id2, name, type }; + return images; } - parseNodeProperty(line, property, contentLine) { - let propName = property[1].replace(/^"/, "").replace(/"$/, "").trim(); - let propValue = property[2].replace(/^"/, "").replace(/"$/, "").trim(); - if (propName === "Content" && propValue === ",") { - propValue = contentLine.replace(/"/g, "").replace(/,$/, "").trim(); - } - const currentNode = this.getCurrentNode(); - const parentName = currentNode.name; - if (parentName === "Properties70") { - this.parseNodeSpecialProperty(line, propName, propValue); - return; + parseTextures(json, images) { + function parseConstant(value, type) { + if (typeof value === "number") return value; + console.warn("THREE.ObjectLoader.parseTexture: Constant should be in numeric form.", value); + return type[value]; } - if (propName === "C") { - const connProps = propValue.split(",").slice(1); - const from = parseInt(connProps[0]); - const to = parseInt(connProps[1]); - let rest = propValue.split(",").slice(3); - rest = rest.map(function(elem) { - return elem.trim().replace(/^"/, ""); - }); - propName = "connections"; - propValue = [from, to]; - append(propValue, rest); - if (currentNode[propName] === void 0) { - currentNode[propName] = []; + __name(parseConstant, "parseConstant"); + const textures = {}; + if (json !== void 0) { + for (let i = 0, l = json.length; i < l; i++) { + const data = json[i]; + if (data.image === void 0) { + console.warn('THREE.ObjectLoader: No "image" specified for', data.uuid); + } + if (images[data.image] === void 0) { + console.warn("THREE.ObjectLoader: Undefined image", data.image); + } + const source = images[data.image]; + const image = source.data; + let texture; + if (Array.isArray(image)) { + texture = new CubeTexture(); + if (image.length === 6) texture.needsUpdate = true; + } else { + if (image && image.data) { + texture = new DataTexture(); + } else { + texture = new Texture(); + } + if (image) texture.needsUpdate = true; + } + texture.source = source; + texture.uuid = data.uuid; + if (data.name !== void 0) texture.name = data.name; + if (data.mapping !== void 0) texture.mapping = parseConstant(data.mapping, TEXTURE_MAPPING); + if (data.channel !== void 0) texture.channel = data.channel; + if (data.offset !== void 0) texture.offset.fromArray(data.offset); + if (data.repeat !== void 0) texture.repeat.fromArray(data.repeat); + if (data.center !== void 0) texture.center.fromArray(data.center); + if (data.rotation !== void 0) texture.rotation = data.rotation; + if (data.wrap !== void 0) { + texture.wrapS = parseConstant(data.wrap[0], TEXTURE_WRAPPING); + texture.wrapT = parseConstant(data.wrap[1], TEXTURE_WRAPPING); + } + if (data.format !== void 0) texture.format = data.format; + if (data.internalFormat !== void 0) texture.internalFormat = data.internalFormat; + if (data.type !== void 0) texture.type = data.type; + if (data.colorSpace !== void 0) texture.colorSpace = data.colorSpace; + if (data.minFilter !== void 0) texture.minFilter = parseConstant(data.minFilter, TEXTURE_FILTER); + if (data.magFilter !== void 0) texture.magFilter = parseConstant(data.magFilter, TEXTURE_FILTER); + if (data.anisotropy !== void 0) texture.anisotropy = data.anisotropy; + if (data.flipY !== void 0) texture.flipY = data.flipY; + if (data.generateMipmaps !== void 0) texture.generateMipmaps = data.generateMipmaps; + if (data.premultiplyAlpha !== void 0) texture.premultiplyAlpha = data.premultiplyAlpha; + if (data.unpackAlignment !== void 0) texture.unpackAlignment = data.unpackAlignment; + if (data.compareFunction !== void 0) texture.compareFunction = data.compareFunction; + if (data.userData !== void 0) texture.userData = data.userData; + textures[data.uuid] = texture; } } - if (propName === "Node") currentNode.id = propValue; - if (propName in currentNode && Array.isArray(currentNode[propName])) { - currentNode[propName].push(propValue); - } else { - if (propName !== "a") currentNode[propName] = propValue; - else currentNode.a = propValue; + return textures; + } + parseObject(data, geometries, materials, textures, animations) { + let object; + function getGeometry(name) { + if (geometries[name] === void 0) { + console.warn("THREE.ObjectLoader: Undefined geometry", name); + } + return geometries[name]; } - this.setCurrentProp(currentNode, propName); - if (propName === "a" && propValue.slice(-1) !== ",") { - currentNode.a = parseNumberArray(propValue); + __name(getGeometry, "getGeometry"); + function getMaterial(name) { + if (name === void 0) return void 0; + if (Array.isArray(name)) { + const array = []; + for (let i = 0, l = name.length; i < l; i++) { + const uuid = name[i]; + if (materials[uuid] === void 0) { + console.warn("THREE.ObjectLoader: Undefined material", uuid); + } + array.push(materials[uuid]); + } + return array; + } + if (materials[name] === void 0) { + console.warn("THREE.ObjectLoader: Undefined material", name); + } + return materials[name]; } - } - parseNodePropertyContinued(line) { - const currentNode = this.getCurrentNode(); - currentNode.a += line; - if (line.slice(-1) !== ",") { - currentNode.a = parseNumberArray(currentNode.a); + __name(getMaterial, "getMaterial"); + function getTexture(uuid) { + if (textures[uuid] === void 0) { + console.warn("THREE.ObjectLoader: Undefined texture", uuid); + } + return textures[uuid]; } - } - // parse "Property70" - parseNodeSpecialProperty(line, propName, propValue) { - const props = propValue.split('",').map(function(prop) { - return prop.trim().replace(/^\"/, "").replace(/\s/, "_"); - }); - const innerPropName = props[0]; - const innerPropType1 = props[1]; - const innerPropType2 = props[2]; - const innerPropFlag = props[3]; - let innerPropValue = props[4]; - switch (innerPropType1) { - case "int": - case "enum": - case "bool": - case "ULongLong": - case "double": - case "Number": - case "FieldOfView": - innerPropValue = parseFloat(innerPropValue); + __name(getTexture, "getTexture"); + let geometry, material; + switch (data.type) { + case "Scene": + object = new Scene(); + if (data.background !== void 0) { + if (Number.isInteger(data.background)) { + object.background = new Color(data.background); + } else { + object.background = getTexture(data.background); + } + } + if (data.environment !== void 0) { + object.environment = getTexture(data.environment); + } + if (data.fog !== void 0) { + if (data.fog.type === "Fog") { + object.fog = new Fog(data.fog.color, data.fog.near, data.fog.far); + } else if (data.fog.type === "FogExp2") { + object.fog = new FogExp2(data.fog.color, data.fog.density); + } + if (data.fog.name !== "") { + object.fog.name = data.fog.name; + } + } + if (data.backgroundBlurriness !== void 0) object.backgroundBlurriness = data.backgroundBlurriness; + if (data.backgroundIntensity !== void 0) object.backgroundIntensity = data.backgroundIntensity; + if (data.backgroundRotation !== void 0) object.backgroundRotation.fromArray(data.backgroundRotation); + if (data.environmentIntensity !== void 0) object.environmentIntensity = data.environmentIntensity; + if (data.environmentRotation !== void 0) object.environmentRotation.fromArray(data.environmentRotation); break; - case "Color": - case "ColorRGB": - case "Vector3D": - case "Lcl_Translation": - case "Lcl_Rotation": - case "Lcl_Scaling": - innerPropValue = parseNumberArray(innerPropValue); + case "PerspectiveCamera": + object = new PerspectiveCamera(data.fov, data.aspect, data.near, data.far); + if (data.focus !== void 0) object.focus = data.focus; + if (data.zoom !== void 0) object.zoom = data.zoom; + if (data.filmGauge !== void 0) object.filmGauge = data.filmGauge; + if (data.filmOffset !== void 0) object.filmOffset = data.filmOffset; + if (data.view !== void 0) object.view = Object.assign({}, data.view); break; + case "OrthographicCamera": + object = new OrthographicCamera(data.left, data.right, data.top, data.bottom, data.near, data.far); + if (data.zoom !== void 0) object.zoom = data.zoom; + if (data.view !== void 0) object.view = Object.assign({}, data.view); + break; + case "AmbientLight": + object = new AmbientLight(data.color, data.intensity); + break; + case "DirectionalLight": + object = new DirectionalLight(data.color, data.intensity); + object.target = data.target || ""; + break; + case "PointLight": + object = new PointLight(data.color, data.intensity, data.distance, data.decay); + break; + case "RectAreaLight": + object = new RectAreaLight(data.color, data.intensity, data.width, data.height); + break; + case "SpotLight": + object = new SpotLight(data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay); + object.target = data.target || ""; + break; + case "HemisphereLight": + object = new HemisphereLight(data.color, data.groundColor, data.intensity); + break; + case "LightProbe": + object = new LightProbe().fromJSON(data); + break; + case "SkinnedMesh": + geometry = getGeometry(data.geometry); + material = getMaterial(data.material); + object = new SkinnedMesh(geometry, material); + if (data.bindMode !== void 0) object.bindMode = data.bindMode; + if (data.bindMatrix !== void 0) object.bindMatrix.fromArray(data.bindMatrix); + if (data.skeleton !== void 0) object.skeleton = data.skeleton; + break; + case "Mesh": + geometry = getGeometry(data.geometry); + material = getMaterial(data.material); + object = new Mesh(geometry, material); + break; + case "InstancedMesh": + geometry = getGeometry(data.geometry); + material = getMaterial(data.material); + const count = data.count; + const instanceMatrix = data.instanceMatrix; + const instanceColor = data.instanceColor; + object = new InstancedMesh(geometry, material, count); + object.instanceMatrix = new InstancedBufferAttribute(new Float32Array(instanceMatrix.array), 16); + if (instanceColor !== void 0) object.instanceColor = new InstancedBufferAttribute(new Float32Array(instanceColor.array), instanceColor.itemSize); + break; + case "BatchedMesh": + geometry = getGeometry(data.geometry); + material = getMaterial(data.material); + object = new BatchedMesh(data.maxInstanceCount, data.maxVertexCount, data.maxIndexCount, material); + object.geometry = geometry; + object.perObjectFrustumCulled = data.perObjectFrustumCulled; + object.sortObjects = data.sortObjects; + object._drawRanges = data.drawRanges; + object._reservedRanges = data.reservedRanges; + object._visibility = data.visibility; + object._active = data.active; + object._bounds = data.bounds.map((bound) => { + const box = new Box3(); + box.min.fromArray(bound.boxMin); + box.max.fromArray(bound.boxMax); + const sphere = new Sphere(); + sphere.radius = bound.sphereRadius; + sphere.center.fromArray(bound.sphereCenter); + return { + boxInitialized: bound.boxInitialized, + box, + sphereInitialized: bound.sphereInitialized, + sphere + }; + }); + object._maxInstanceCount = data.maxInstanceCount; + object._maxVertexCount = data.maxVertexCount; + object._maxIndexCount = data.maxIndexCount; + object._geometryInitialized = data.geometryInitialized; + object._geometryCount = data.geometryCount; + object._matricesTexture = getTexture(data.matricesTexture.uuid); + if (data.colorsTexture !== void 0) object._colorsTexture = getTexture(data.colorsTexture.uuid); + break; + case "LOD": + object = new LOD(); + break; + case "Line": + object = new Line(getGeometry(data.geometry), getMaterial(data.material)); + break; + case "LineLoop": + object = new LineLoop(getGeometry(data.geometry), getMaterial(data.material)); + break; + case "LineSegments": + object = new LineSegments(getGeometry(data.geometry), getMaterial(data.material)); + break; + case "PointCloud": + case "Points": + object = new Points(getGeometry(data.geometry), getMaterial(data.material)); + break; + case "Sprite": + object = new Sprite(getMaterial(data.material)); + break; + case "Group": + object = new Group(); + break; + case "Bone": + object = new Bone(); + break; + default: + object = new Object3D(); } - this.getPrevNode()[innerPropName] = { - "type": innerPropType1, - "type2": innerPropType2, - "flag": innerPropFlag, - "value": innerPropValue - }; - this.setCurrentProp(this.getPrevNode(), innerPropName); - } -} -class BinaryParser { - static { - __name(this, "BinaryParser"); - } - parse(buffer) { - const reader = new BinaryReader(buffer); - reader.skip(23); - const version = reader.getUint32(); - if (version < 6400) { - throw new Error("THREE.FBXLoader: FBX version not supported, FileVersion: " + version); - } - const allNodes = new FBXTree(); - while (!this.endOfContent(reader)) { - const node = this.parseNode(reader, version); - if (node !== null) allNodes.add(node.name, node); - } - return allNodes; - } - // Check if reader has reached the end of content. - endOfContent(reader) { - if (reader.size() % 16 === 0) { - return (reader.getOffset() + 160 + 16 & ~15) >= reader.size(); + object.uuid = data.uuid; + if (data.name !== void 0) object.name = data.name; + if (data.matrix !== void 0) { + object.matrix.fromArray(data.matrix); + if (data.matrixAutoUpdate !== void 0) object.matrixAutoUpdate = data.matrixAutoUpdate; + if (object.matrixAutoUpdate) object.matrix.decompose(object.position, object.quaternion, object.scale); } else { - return reader.getOffset() + 160 + 16 >= reader.size(); - } - } - // recursively parse nodes until the end of the file is reached - parseNode(reader, version) { - const node = {}; - const endOffset = version >= 7500 ? reader.getUint64() : reader.getUint32(); - const numProperties = version >= 7500 ? reader.getUint64() : reader.getUint32(); - version >= 7500 ? reader.getUint64() : reader.getUint32(); - const nameLen = reader.getUint8(); - const name = reader.getString(nameLen); - if (endOffset === 0) return null; - const propertyList = []; - for (let i = 0; i < numProperties; i++) { - propertyList.push(this.parseProperty(reader)); + if (data.position !== void 0) object.position.fromArray(data.position); + if (data.rotation !== void 0) object.rotation.fromArray(data.rotation); + if (data.quaternion !== void 0) object.quaternion.fromArray(data.quaternion); + if (data.scale !== void 0) object.scale.fromArray(data.scale); } - const id2 = propertyList.length > 0 ? propertyList[0] : ""; - const attrName = propertyList.length > 1 ? propertyList[1] : ""; - const attrType = propertyList.length > 2 ? propertyList[2] : ""; - node.singleProperty = numProperties === 1 && reader.getOffset() === endOffset ? true : false; - while (endOffset > reader.getOffset()) { - const subNode = this.parseNode(reader, version); - if (subNode !== null) this.parseSubNode(name, node, subNode); + if (data.up !== void 0) object.up.fromArray(data.up); + if (data.castShadow !== void 0) object.castShadow = data.castShadow; + if (data.receiveShadow !== void 0) object.receiveShadow = data.receiveShadow; + if (data.shadow) { + if (data.shadow.intensity !== void 0) object.shadow.intensity = data.shadow.intensity; + if (data.shadow.bias !== void 0) object.shadow.bias = data.shadow.bias; + if (data.shadow.normalBias !== void 0) object.shadow.normalBias = data.shadow.normalBias; + if (data.shadow.radius !== void 0) object.shadow.radius = data.shadow.radius; + if (data.shadow.mapSize !== void 0) object.shadow.mapSize.fromArray(data.shadow.mapSize); + if (data.shadow.camera !== void 0) object.shadow.camera = this.parseObject(data.shadow.camera); } - node.propertyList = propertyList; - if (typeof id2 === "number") node.id = id2; - if (attrName !== "") node.attrName = attrName; - if (attrType !== "") node.attrType = attrType; - if (name !== "") node.name = name; - return node; - } - parseSubNode(name, node, subNode) { - if (subNode.singleProperty === true) { - const value = subNode.propertyList[0]; - if (Array.isArray(value)) { - node[subNode.name] = subNode; - subNode.a = value; - } else { - node[subNode.name] = value; - } - } else if (name === "Connections" && subNode.name === "C") { - const array = []; - subNode.propertyList.forEach(function(property, i) { - if (i !== 0) array.push(property); - }); - if (node.connections === void 0) { - node.connections = []; - } - node.connections.push(array); - } else if (subNode.name === "Properties70") { - const keys = Object.keys(subNode); - keys.forEach(function(key) { - node[key] = subNode[key]; - }); - } else if (name === "Properties70" && subNode.name === "P") { - let innerPropName = subNode.propertyList[0]; - let innerPropType1 = subNode.propertyList[1]; - const innerPropType2 = subNode.propertyList[2]; - const innerPropFlag = subNode.propertyList[3]; - let innerPropValue; - if (innerPropName.indexOf("Lcl ") === 0) innerPropName = innerPropName.replace("Lcl ", "Lcl_"); - if (innerPropType1.indexOf("Lcl ") === 0) innerPropType1 = innerPropType1.replace("Lcl ", "Lcl_"); - if (innerPropType1 === "Color" || innerPropType1 === "ColorRGB" || innerPropType1 === "Vector" || innerPropType1 === "Vector3D" || innerPropType1.indexOf("Lcl_") === 0) { - innerPropValue = [ - subNode.propertyList[4], - subNode.propertyList[5], - subNode.propertyList[6] - ]; - } else { - innerPropValue = subNode.propertyList[4]; + if (data.visible !== void 0) object.visible = data.visible; + if (data.frustumCulled !== void 0) object.frustumCulled = data.frustumCulled; + if (data.renderOrder !== void 0) object.renderOrder = data.renderOrder; + if (data.userData !== void 0) object.userData = data.userData; + if (data.layers !== void 0) object.layers.mask = data.layers; + if (data.children !== void 0) { + const children = data.children; + for (let i = 0; i < children.length; i++) { + object.add(this.parseObject(children[i], geometries, materials, textures, animations)); } - node[innerPropName] = { - "type": innerPropType1, - "type2": innerPropType2, - "flag": innerPropFlag, - "value": innerPropValue - }; - } else if (node[subNode.name] === void 0) { - if (typeof subNode.id === "number") { - node[subNode.name] = {}; - node[subNode.name][subNode.id] = subNode; - } else { - node[subNode.name] = subNode; + } + if (data.animations !== void 0) { + const objectAnimations = data.animations; + for (let i = 0; i < objectAnimations.length; i++) { + const uuid = objectAnimations[i]; + object.animations.push(animations[uuid]); } - } else { - if (subNode.name === "PoseNode") { - if (!Array.isArray(node[subNode.name])) { - node[subNode.name] = [node[subNode.name]]; + } + if (data.type === "LOD") { + if (data.autoUpdate !== void 0) object.autoUpdate = data.autoUpdate; + const levels = data.levels; + for (let l = 0; l < levels.length; l++) { + const level = levels[l]; + const child = object.getObjectByProperty("uuid", level.object); + if (child !== void 0) { + object.addLevel(child, level.distance, level.hysteresis); } - node[subNode.name].push(subNode); - } else if (node[subNode.name][subNode.id] === void 0) { - node[subNode.name][subNode.id] = subNode; } } + return object; } - parseProperty(reader) { - const type = reader.getString(1); - let length; - switch (type) { - case "C": - return reader.getBoolean(); - case "D": - return reader.getFloat64(); - case "F": - return reader.getFloat32(); - case "I": - return reader.getInt32(); - case "L": - return reader.getInt64(); - case "R": - length = reader.getUint32(); - return reader.getArrayBuffer(length); - case "S": - length = reader.getUint32(); - return reader.getString(length); - case "Y": - return reader.getInt16(); - case "b": - case "c": - case "d": - case "f": - case "i": - case "l": - const arrayLength = reader.getUint32(); - const encoding = reader.getUint32(); - const compressedLength = reader.getUint32(); - if (encoding === 0) { - switch (type) { - case "b": - case "c": - return reader.getBooleanArray(arrayLength); - case "d": - return reader.getFloat64Array(arrayLength); - case "f": - return reader.getFloat32Array(arrayLength); - case "i": - return reader.getInt32Array(arrayLength); - case "l": - return reader.getInt64Array(arrayLength); - } + bindSkeletons(object, skeletons) { + if (Object.keys(skeletons).length === 0) return; + object.traverse(function(child) { + if (child.isSkinnedMesh === true && child.skeleton !== void 0) { + const skeleton = skeletons[child.skeleton]; + if (skeleton === void 0) { + console.warn("THREE.ObjectLoader: No skeleton found with UUID:", child.skeleton); + } else { + child.bind(skeleton, child.bindMatrix); } - const data = unzlibSync(new Uint8Array(reader.getArrayBuffer(compressedLength))); - const reader2 = new BinaryReader(data.buffer); - switch (type) { - case "b": - case "c": - return reader2.getBooleanArray(arrayLength); - case "d": - return reader2.getFloat64Array(arrayLength); - case "f": - return reader2.getFloat32Array(arrayLength); - case "i": - return reader2.getInt32Array(arrayLength); - case "l": - return reader2.getInt64Array(arrayLength); + } + }); + } + bindLightTargets(object) { + object.traverse(function(child) { + if (child.isDirectionalLight || child.isSpotLight) { + const uuid = child.target; + const target = object.getObjectByProperty("uuid", uuid); + if (target !== void 0) { + child.target = target; + } else { + child.target = new Object3D(); } - break; - default: - throw new Error("THREE.FBXLoader: Unknown property type " + type); - } + } + }); } } -class BinaryReader { +const TEXTURE_MAPPING = { + UVMapping, + CubeReflectionMapping, + CubeRefractionMapping, + EquirectangularReflectionMapping, + EquirectangularRefractionMapping, + CubeUVReflectionMapping +}; +const TEXTURE_WRAPPING = { + RepeatWrapping, + ClampToEdgeWrapping, + MirroredRepeatWrapping +}; +const TEXTURE_FILTER = { + NearestFilter, + NearestMipmapNearestFilter, + NearestMipmapLinearFilter, + LinearFilter, + LinearMipmapNearestFilter, + LinearMipmapLinearFilter +}; +class ImageBitmapLoader extends Loader { static { - __name(this, "BinaryReader"); - } - constructor(buffer, littleEndian) { - this.dv = new DataView(buffer); - this.offset = 0; - this.littleEndian = littleEndian !== void 0 ? littleEndian : true; - this._textDecoder = new TextDecoder(); + __name(this, "ImageBitmapLoader"); } - getOffset() { - return this.offset; + constructor(manager) { + super(manager); + this.isImageBitmapLoader = true; + if (typeof createImageBitmap === "undefined") { + console.warn("THREE.ImageBitmapLoader: createImageBitmap() not supported."); + } + if (typeof fetch === "undefined") { + console.warn("THREE.ImageBitmapLoader: fetch() not supported."); + } + this.options = { premultiplyAlpha: "none" }; } - size() { - return this.dv.buffer.byteLength; + setOptions(options) { + this.options = options; + return this; } - skip(length) { - this.offset += length; + load(url, onLoad, onProgress, onError) { + if (url === void 0) url = ""; + if (this.path !== void 0) url = this.path + url; + url = this.manager.resolveURL(url); + const scope = this; + const cached = Cache.get(url); + if (cached !== void 0) { + scope.manager.itemStart(url); + if (cached.then) { + cached.then((imageBitmap) => { + if (onLoad) onLoad(imageBitmap); + scope.manager.itemEnd(url); + }).catch((e) => { + if (onError) onError(e); + }); + return; + } + setTimeout(function() { + if (onLoad) onLoad(cached); + scope.manager.itemEnd(url); + }, 0); + return cached; + } + const fetchOptions = {}; + fetchOptions.credentials = this.crossOrigin === "anonymous" ? "same-origin" : "include"; + fetchOptions.headers = this.requestHeader; + const promise = fetch(url, fetchOptions).then(function(res) { + return res.blob(); + }).then(function(blob) { + return createImageBitmap(blob, Object.assign(scope.options, { colorSpaceConversion: "none" })); + }).then(function(imageBitmap) { + Cache.add(url, imageBitmap); + if (onLoad) onLoad(imageBitmap); + scope.manager.itemEnd(url); + return imageBitmap; + }).catch(function(e) { + if (onError) onError(e); + Cache.remove(url); + scope.manager.itemError(url); + scope.manager.itemEnd(url); + }); + Cache.add(url, promise); + scope.manager.itemStart(url); } - // seems like true/false representation depends on exporter. - // true: 1 or 'Y'(=0x59), false: 0 or 'T'(=0x54) - // then sees LSB. - getBoolean() { - return (this.getUint8() & 1) === 1; +} +let _context; +class AudioContext { + static { + __name(this, "AudioContext"); } - getBooleanArray(size) { - const a = []; - for (let i = 0; i < size; i++) { - a.push(this.getBoolean()); + static getContext() { + if (_context === void 0) { + _context = new (window.AudioContext || window.webkitAudioContext)(); } - return a; + return _context; } - getUint8() { - const value = this.dv.getUint8(this.offset); - this.offset += 1; - return value; + static setContext(value) { + _context = value; } - getInt16() { - const value = this.dv.getInt16(this.offset, this.littleEndian); - this.offset += 2; - return value; +} +class AudioLoader extends Loader { + static { + __name(this, "AudioLoader"); } - getInt32() { - const value = this.dv.getInt32(this.offset, this.littleEndian); - this.offset += 4; - return value; + constructor(manager) { + super(manager); } - getInt32Array(size) { - const a = []; - for (let i = 0; i < size; i++) { - a.push(this.getInt32()); + load(url, onLoad, onProgress, onError) { + const scope = this; + const loader = new FileLoader(this.manager); + loader.setResponseType("arraybuffer"); + loader.setPath(this.path); + loader.setRequestHeader(this.requestHeader); + loader.setWithCredentials(this.withCredentials); + loader.load(url, function(buffer) { + try { + const bufferCopy = buffer.slice(0); + const context = AudioContext.getContext(); + context.decodeAudioData(bufferCopy, function(audioBuffer) { + onLoad(audioBuffer); + }).catch(handleError); + } catch (e) { + handleError(e); + } + }, onProgress, onError); + function handleError(e) { + if (onError) { + onError(e); + } else { + console.error(e); + } + scope.manager.itemError(url); } - return a; - } - getUint32() { - const value = this.dv.getUint32(this.offset, this.littleEndian); - this.offset += 4; - return value; + __name(handleError, "handleError"); } - // JavaScript doesn't support 64-bit integer so calculate this here - // 1 << 32 will return 1 so using multiply operation instead here. - // There's a possibility that this method returns wrong value if the value - // is out of the range between Number.MAX_SAFE_INTEGER and Number.MIN_SAFE_INTEGER. - // TODO: safely handle 64-bit integer - getInt64() { - let low, high; - if (this.littleEndian) { - low = this.getUint32(); - high = this.getUint32(); - } else { - high = this.getUint32(); - low = this.getUint32(); - } - if (high & 2147483648) { - high = ~high & 4294967295; - low = ~low & 4294967295; - if (low === 4294967295) high = high + 1 & 4294967295; - low = low + 1 & 4294967295; - return -(high * 4294967296 + low); - } - return high * 4294967296 + low; +} +const _eyeRight = /* @__PURE__ */ new Matrix4(); +const _eyeLeft = /* @__PURE__ */ new Matrix4(); +const _projectionMatrix = /* @__PURE__ */ new Matrix4(); +class StereoCamera { + static { + __name(this, "StereoCamera"); } - getInt64Array(size) { - const a = []; - for (let i = 0; i < size; i++) { - a.push(this.getInt64()); - } - return a; + constructor() { + this.type = "StereoCamera"; + this.aspect = 1; + this.eyeSep = 0.064; + this.cameraL = new PerspectiveCamera(); + this.cameraL.layers.enable(1); + this.cameraL.matrixAutoUpdate = false; + this.cameraR = new PerspectiveCamera(); + this.cameraR.layers.enable(2); + this.cameraR.matrixAutoUpdate = false; + this._cache = { + focus: null, + fov: null, + aspect: null, + near: null, + far: null, + zoom: null, + eyeSep: null + }; } - // Note: see getInt64() comment - getUint64() { - let low, high; - if (this.littleEndian) { - low = this.getUint32(); - high = this.getUint32(); - } else { - high = this.getUint32(); - low = this.getUint32(); + update(camera) { + const cache = this._cache; + const needsUpdate = cache.focus !== camera.focus || cache.fov !== camera.fov || cache.aspect !== camera.aspect * this.aspect || cache.near !== camera.near || cache.far !== camera.far || cache.zoom !== camera.zoom || cache.eyeSep !== this.eyeSep; + if (needsUpdate) { + cache.focus = camera.focus; + cache.fov = camera.fov; + cache.aspect = camera.aspect * this.aspect; + cache.near = camera.near; + cache.far = camera.far; + cache.zoom = camera.zoom; + cache.eyeSep = this.eyeSep; + _projectionMatrix.copy(camera.projectionMatrix); + const eyeSepHalf = cache.eyeSep / 2; + const eyeSepOnProjection = eyeSepHalf * cache.near / cache.focus; + const ymax = cache.near * Math.tan(DEG2RAD * cache.fov * 0.5) / cache.zoom; + let xmin, xmax; + _eyeLeft.elements[12] = -eyeSepHalf; + _eyeRight.elements[12] = eyeSepHalf; + xmin = -ymax * cache.aspect + eyeSepOnProjection; + xmax = ymax * cache.aspect + eyeSepOnProjection; + _projectionMatrix.elements[0] = 2 * cache.near / (xmax - xmin); + _projectionMatrix.elements[8] = (xmax + xmin) / (xmax - xmin); + this.cameraL.projectionMatrix.copy(_projectionMatrix); + xmin = -ymax * cache.aspect - eyeSepOnProjection; + xmax = ymax * cache.aspect - eyeSepOnProjection; + _projectionMatrix.elements[0] = 2 * cache.near / (xmax - xmin); + _projectionMatrix.elements[8] = (xmax + xmin) / (xmax - xmin); + this.cameraR.projectionMatrix.copy(_projectionMatrix); } - return high * 4294967296 + low; + this.cameraL.matrixWorld.copy(camera.matrixWorld).multiply(_eyeLeft); + this.cameraR.matrixWorld.copy(camera.matrixWorld).multiply(_eyeRight); } - getFloat32() { - const value = this.dv.getFloat32(this.offset, this.littleEndian); - this.offset += 4; - return value; +} +class Clock { + static { + __name(this, "Clock"); } - getFloat32Array(size) { - const a = []; - for (let i = 0; i < size; i++) { - a.push(this.getFloat32()); - } - return a; + constructor(autoStart = true) { + this.autoStart = autoStart; + this.startTime = 0; + this.oldTime = 0; + this.elapsedTime = 0; + this.running = false; } - getFloat64() { - const value = this.dv.getFloat64(this.offset, this.littleEndian); - this.offset += 8; - return value; + start() { + this.startTime = now(); + this.oldTime = this.startTime; + this.elapsedTime = 0; + this.running = true; } - getFloat64Array(size) { - const a = []; - for (let i = 0; i < size; i++) { - a.push(this.getFloat64()); - } - return a; + stop() { + this.getElapsedTime(); + this.running = false; + this.autoStart = false; } - getArrayBuffer(size) { - const value = this.dv.buffer.slice(this.offset, this.offset + size); - this.offset += size; - return value; + getElapsedTime() { + this.getDelta(); + return this.elapsedTime; } - getString(size) { - const start = this.offset; - let a = new Uint8Array(this.dv.buffer, start, size); - this.skip(size); - const nullByte = a.indexOf(0); - if (nullByte >= 0) a = new Uint8Array(this.dv.buffer, start, nullByte); - return this._textDecoder.decode(a); + getDelta() { + let diff = 0; + if (this.autoStart && !this.running) { + this.start(); + return 0; + } + if (this.running) { + const newTime = now(); + diff = (newTime - this.oldTime) / 1e3; + this.oldTime = newTime; + this.elapsedTime += diff; + } + return diff; } } -class FBXTree { +function now() { + return performance.now(); +} +__name(now, "now"); +const _position$1 = /* @__PURE__ */ new Vector3(); +const _quaternion$1 = /* @__PURE__ */ new Quaternion(); +const _scale$1 = /* @__PURE__ */ new Vector3(); +const _orientation$1 = /* @__PURE__ */ new Vector3(); +class AudioListener extends Object3D { static { - __name(this, "FBXTree"); + __name(this, "AudioListener"); } - add(key, val) { - this[key] = val; + constructor() { + super(); + this.type = "AudioListener"; + this.context = AudioContext.getContext(); + this.gain = this.context.createGain(); + this.gain.connect(this.context.destination); + this.filter = null; + this.timeDelta = 0; + this._clock = new Clock(); } -} -function isFbxFormatBinary(buffer) { - const CORRECT = "Kaydara FBX Binary \0"; - return buffer.byteLength >= CORRECT.length && CORRECT === convertArrayBufferToString(buffer, 0, CORRECT.length); -} -__name(isFbxFormatBinary, "isFbxFormatBinary"); -function isFbxFormatASCII(text) { - const CORRECT = ["K", "a", "y", "d", "a", "r", "a", "\\", "F", "B", "X", "\\", "B", "i", "n", "a", "r", "y", "\\", "\\"]; - let cursor = 0; - function read(offset) { - const result = text[offset - 1]; - text = text.slice(cursor + offset); - cursor++; - return result; + getInput() { + return this.gain; } - __name(read, "read"); - for (let i = 0; i < CORRECT.length; ++i) { - const num = read(1); - if (num === CORRECT[i]) { - return false; + removeFilter() { + if (this.filter !== null) { + this.gain.disconnect(this.filter); + this.filter.disconnect(this.context.destination); + this.gain.connect(this.context.destination); + this.filter = null; } + return this; } - return true; -} -__name(isFbxFormatASCII, "isFbxFormatASCII"); -function getFbxVersion(text) { - const versionRegExp = /FBXVersion: (\d+)/; - const match = text.match(versionRegExp); - if (match) { - const version = parseInt(match[1]); - return version; - } - throw new Error("THREE.FBXLoader: Cannot find the version number for the file given."); -} -__name(getFbxVersion, "getFbxVersion"); -function convertFBXTimeToSeconds(time) { - return time / 46186158e3; -} -__name(convertFBXTimeToSeconds, "convertFBXTimeToSeconds"); -const dataArray = []; -function getData(polygonVertexIndex, polygonIndex, vertexIndex, infoObject) { - let index; - switch (infoObject.mappingType) { - case "ByPolygonVertex": - index = polygonVertexIndex; - break; - case "ByPolygon": - index = polygonIndex; - break; - case "ByVertice": - index = vertexIndex; - break; - case "AllSame": - index = infoObject.indices[0]; - break; - default: - console.warn("THREE.FBXLoader: unknown attribute mapping type " + infoObject.mappingType); - } - if (infoObject.referenceType === "IndexToDirect") index = infoObject.indices[index]; - const from = index * infoObject.dataSize; - const to = from + infoObject.dataSize; - return slice(dataArray, infoObject.buffer, from, to); -} -__name(getData, "getData"); -const tempEuler = new Euler(); -const tempVec = new Vector3(); -function generateTransform(transformData) { - const lTranslationM = new Matrix4(); - const lPreRotationM = new Matrix4(); - const lRotationM = new Matrix4(); - const lPostRotationM = new Matrix4(); - const lScalingM = new Matrix4(); - const lScalingPivotM = new Matrix4(); - const lScalingOffsetM = new Matrix4(); - const lRotationOffsetM = new Matrix4(); - const lRotationPivotM = new Matrix4(); - const lParentGX = new Matrix4(); - const lParentLX = new Matrix4(); - const lGlobalT = new Matrix4(); - const inheritType = transformData.inheritType ? transformData.inheritType : 0; - if (transformData.translation) lTranslationM.setPosition(tempVec.fromArray(transformData.translation)); - const defaultEulerOrder = getEulerOrder(0); - if (transformData.preRotation) { - const array = transformData.preRotation.map(MathUtils.degToRad); - array.push(defaultEulerOrder); - lPreRotationM.makeRotationFromEuler(tempEuler.fromArray(array)); - } - if (transformData.rotation) { - const array = transformData.rotation.map(MathUtils.degToRad); - array.push(transformData.eulerOrder || defaultEulerOrder); - lRotationM.makeRotationFromEuler(tempEuler.fromArray(array)); + getFilter() { + return this.filter; } - if (transformData.postRotation) { - const array = transformData.postRotation.map(MathUtils.degToRad); - array.push(defaultEulerOrder); - lPostRotationM.makeRotationFromEuler(tempEuler.fromArray(array)); - lPostRotationM.invert(); + setFilter(value) { + if (this.filter !== null) { + this.gain.disconnect(this.filter); + this.filter.disconnect(this.context.destination); + } else { + this.gain.disconnect(this.context.destination); + } + this.filter = value; + this.gain.connect(this.filter); + this.filter.connect(this.context.destination); + return this; } - if (transformData.scale) lScalingM.scale(tempVec.fromArray(transformData.scale)); - if (transformData.scalingOffset) lScalingOffsetM.setPosition(tempVec.fromArray(transformData.scalingOffset)); - if (transformData.scalingPivot) lScalingPivotM.setPosition(tempVec.fromArray(transformData.scalingPivot)); - if (transformData.rotationOffset) lRotationOffsetM.setPosition(tempVec.fromArray(transformData.rotationOffset)); - if (transformData.rotationPivot) lRotationPivotM.setPosition(tempVec.fromArray(transformData.rotationPivot)); - if (transformData.parentMatrixWorld) { - lParentLX.copy(transformData.parentMatrix); - lParentGX.copy(transformData.parentMatrixWorld); + getMasterVolume() { + return this.gain.gain.value; } - const lLRM = lPreRotationM.clone().multiply(lRotationM).multiply(lPostRotationM); - const lParentGRM = new Matrix4(); - lParentGRM.extractRotation(lParentGX); - const lParentTM = new Matrix4(); - lParentTM.copyPosition(lParentGX); - const lParentGRSM = lParentTM.clone().invert().multiply(lParentGX); - const lParentGSM = lParentGRM.clone().invert().multiply(lParentGRSM); - const lLSM = lScalingM; - const lGlobalRS = new Matrix4(); - if (inheritType === 0) { - lGlobalRS.copy(lParentGRM).multiply(lLRM).multiply(lParentGSM).multiply(lLSM); - } else if (inheritType === 1) { - lGlobalRS.copy(lParentGRM).multiply(lParentGSM).multiply(lLRM).multiply(lLSM); - } else { - const lParentLSM = new Matrix4().scale(new Vector3().setFromMatrixScale(lParentLX)); - const lParentLSM_inv = lParentLSM.clone().invert(); - const lParentGSM_noLocal = lParentGSM.clone().multiply(lParentLSM_inv); - lGlobalRS.copy(lParentGRM).multiply(lLRM).multiply(lParentGSM_noLocal).multiply(lLSM); + setMasterVolume(value) { + this.gain.gain.setTargetAtTime(value, this.context.currentTime, 0.01); + return this; } - const lRotationPivotM_inv = lRotationPivotM.clone().invert(); - const lScalingPivotM_inv = lScalingPivotM.clone().invert(); - let 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); - const lLocalTWithAllPivotAndOffsetInfo = new Matrix4().copyPosition(lTransform); - const lGlobalTranslation = lParentGX.clone().multiply(lLocalTWithAllPivotAndOffsetInfo); - lGlobalT.copyPosition(lGlobalTranslation); - lTransform = lGlobalT.clone().multiply(lGlobalRS); - lTransform.premultiply(lParentGX.invert()); - return lTransform; -} -__name(generateTransform, "generateTransform"); -function getEulerOrder(order) { - order = order || 0; - const enums = [ - "ZYX", - // -> XYZ extrinsic - "YZX", - // -> XZY extrinsic - "XZY", - // -> YZX extrinsic - "ZXY", - // -> YXZ extrinsic - "YXZ", - // -> ZXY extrinsic - "XYZ" - // -> ZYX extrinsic - //'SphericXYZ', // not possible to support - ]; - if (order === 6) { - console.warn("THREE.FBXLoader: unsupported Euler Order: Spherical XYZ. Animations and rotations may be incorrect."); - return enums[0]; + updateMatrixWorld(force) { + super.updateMatrixWorld(force); + const listener = this.context.listener; + const up = this.up; + this.timeDelta = this._clock.getDelta(); + this.matrixWorld.decompose(_position$1, _quaternion$1, _scale$1); + _orientation$1.set(0, 0, -1).applyQuaternion(_quaternion$1); + if (listener.positionX) { + const endTime = this.context.currentTime + this.timeDelta; + listener.positionX.linearRampToValueAtTime(_position$1.x, endTime); + listener.positionY.linearRampToValueAtTime(_position$1.y, endTime); + listener.positionZ.linearRampToValueAtTime(_position$1.z, endTime); + listener.forwardX.linearRampToValueAtTime(_orientation$1.x, endTime); + listener.forwardY.linearRampToValueAtTime(_orientation$1.y, endTime); + listener.forwardZ.linearRampToValueAtTime(_orientation$1.z, endTime); + listener.upX.linearRampToValueAtTime(up.x, endTime); + listener.upY.linearRampToValueAtTime(up.y, endTime); + listener.upZ.linearRampToValueAtTime(up.z, endTime); + } else { + listener.setPosition(_position$1.x, _position$1.y, _position$1.z); + listener.setOrientation(_orientation$1.x, _orientation$1.y, _orientation$1.z, up.x, up.y, up.z); + } } - return enums[order]; -} -__name(getEulerOrder, "getEulerOrder"); -function parseNumberArray(value) { - const array = value.split(",").map(function(val) { - return parseFloat(val); - }); - return array; -} -__name(parseNumberArray, "parseNumberArray"); -function convertArrayBufferToString(buffer, from, to) { - if (from === void 0) from = 0; - if (to === void 0) to = buffer.byteLength; - return new TextDecoder().decode(new Uint8Array(buffer, from, to)); } -__name(convertArrayBufferToString, "convertArrayBufferToString"); -function append(a, b) { - for (let i = 0, j = a.length, l = b.length; i < l; i++, j++) { - a[j] = b[i]; +class Audio extends Object3D { + static { + __name(this, "Audio"); } -} -__name(append, "append"); -function slice(a, b, from, to) { - for (let i = from, j = 0; i < to; i++, j++) { - a[j] = b[i]; + constructor(listener) { + super(); + this.type = "Audio"; + this.listener = listener; + this.context = listener.context; + this.gain = this.context.createGain(); + this.gain.connect(listener.getInput()); + this.autoplay = false; + this.buffer = null; + this.detune = 0; + this.loop = false; + this.loopStart = 0; + this.loopEnd = 0; + this.offset = 0; + this.duration = void 0; + this.playbackRate = 1; + this.isPlaying = false; + this.hasPlaybackControl = true; + this.source = null; + this.sourceType = "empty"; + this._startedAt = 0; + this._progress = 0; + this._connected = false; + this.filters = []; } - return a; -} -__name(slice, "slice"); -function computeMikkTSpaceTangents(geometry, MikkTSpace, negateSign = true) { - if (!MikkTSpace || !MikkTSpace.isReady) { - throw new Error("BufferGeometryUtils: Initialized MikkTSpace library required."); + getOutput() { + return this.gain; } - if (!geometry.hasAttribute("position") || !geometry.hasAttribute("normal") || !geometry.hasAttribute("uv")) { - throw new Error('BufferGeometryUtils: Tangents require "position", "normal", and "uv" attributes.'); + setNodeSource(audioNode) { + this.hasPlaybackControl = false; + this.sourceType = "audioNode"; + this.source = audioNode; + this.connect(); + return this; } - function getAttributeArray(attribute) { - if (attribute.normalized || attribute.isInterleavedBufferAttribute) { - const dstArray = new Float32Array(attribute.count * attribute.itemSize); - for (let i = 0, j = 0; i < attribute.count; i++) { - dstArray[j++] = attribute.getX(i); - dstArray[j++] = attribute.getY(i); - if (attribute.itemSize > 2) { - dstArray[j++] = attribute.getZ(i); - } - } - return dstArray; - } - if (attribute.array instanceof Float32Array) { - return attribute.array; - } - return new Float32Array(attribute.array); + setMediaElementSource(mediaElement) { + this.hasPlaybackControl = false; + this.sourceType = "mediaNode"; + this.source = this.context.createMediaElementSource(mediaElement); + this.connect(); + return this; } - __name(getAttributeArray, "getAttributeArray"); - const _geometry2 = geometry.index ? geometry.toNonIndexed() : geometry; - const tangents = MikkTSpace.generateTangents( - getAttributeArray(_geometry2.attributes.position), - getAttributeArray(_geometry2.attributes.normal), - getAttributeArray(_geometry2.attributes.uv) - ); - if (negateSign) { - for (let i = 3; i < tangents.length; i += 4) { - tangents[i] *= -1; - } + setMediaStreamSource(mediaStream) { + this.hasPlaybackControl = false; + this.sourceType = "mediaStreamNode"; + this.source = this.context.createMediaStreamSource(mediaStream); + this.connect(); + return this; } - _geometry2.setAttribute("tangent", new BufferAttribute(tangents, 4)); - if (geometry !== _geometry2) { - geometry.copy(_geometry2); + setBuffer(audioBuffer) { + this.buffer = audioBuffer; + this.sourceType = "buffer"; + if (this.autoplay) this.play(); + return this; } - return geometry; -} -__name(computeMikkTSpaceTangents, "computeMikkTSpaceTangents"); -function mergeGeometries(geometries, useGroups = false) { - const isIndexed = geometries[0].index !== null; - const attributesUsed = new Set(Object.keys(geometries[0].attributes)); - const morphAttributesUsed = new Set(Object.keys(geometries[0].morphAttributes)); - const attributes = {}; - const morphAttributes = {}; - const morphTargetsRelative = geometries[0].morphTargetsRelative; - const mergedGeometry = new BufferGeometry(); - let offset = 0; - for (let i = 0; i < geometries.length; ++i) { - const geometry = geometries[i]; - let attributesCount = 0; - if (isIndexed !== (geometry.index !== null)) { - console.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."); - return null; - } - for (const name in geometry.attributes) { - if (!attributesUsed.has(name)) { - console.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.'); - return null; - } - if (attributes[name] === void 0) attributes[name] = []; - attributes[name].push(geometry.attributes[name]); - attributesCount++; - } - if (attributesCount !== attributesUsed.size) { - console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index " + i + ". Make sure all geometries have the same number of attributes."); - return null; - } - if (morphTargetsRelative !== geometry.morphTargetsRelative) { - console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index " + i + ". .morphTargetsRelative must be consistent throughout all geometries."); - return null; - } - for (const name in geometry.morphAttributes) { - if (!morphAttributesUsed.has(name)) { - console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index " + i + ". .morphAttributes must be consistent throughout all geometries."); - return null; - } - if (morphAttributes[name] === void 0) morphAttributes[name] = []; - morphAttributes[name].push(geometry.morphAttributes[name]); - } - if (useGroups) { - let count; - if (isIndexed) { - count = geometry.index.count; - } else if (geometry.attributes.position !== void 0) { - count = geometry.attributes.position.count; - } else { - console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index " + i + ". The geometry must have either an index or a position attribute"); - return null; - } - mergedGeometry.addGroup(offset, count, i); - offset += count; + play(delay = 0) { + if (this.isPlaying === true) { + console.warn("THREE.Audio: Audio is already playing."); + return; } - } - if (isIndexed) { - let indexOffset = 0; - const mergedIndex = []; - for (let i = 0; i < geometries.length; ++i) { - const index = geometries[i].index; - for (let j = 0; j < index.count; ++j) { - mergedIndex.push(index.getX(j) + indexOffset); - } - indexOffset += geometries[i].attributes.position.count; + if (this.hasPlaybackControl === false) { + console.warn("THREE.Audio: this Audio has no playback control."); + return; } - mergedGeometry.setIndex(mergedIndex); + this._startedAt = this.context.currentTime + delay; + const source = this.context.createBufferSource(); + source.buffer = this.buffer; + source.loop = this.loop; + source.loopStart = this.loopStart; + source.loopEnd = this.loopEnd; + source.onended = this.onEnded.bind(this); + source.start(this._startedAt, this._progress + this.offset, this.duration); + this.isPlaying = true; + this.source = source; + this.setDetune(this.detune); + this.setPlaybackRate(this.playbackRate); + return this.connect(); } - for (const name in attributes) { - const mergedAttribute = mergeAttributes(attributes[name]); - if (!mergedAttribute) { - console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the " + name + " attribute."); - return null; + pause() { + if (this.hasPlaybackControl === false) { + console.warn("THREE.Audio: this Audio has no playback control."); + return; } - mergedGeometry.setAttribute(name, mergedAttribute); - } - for (const name in morphAttributes) { - const numMorphTargets = morphAttributes[name][0].length; - if (numMorphTargets === 0) break; - mergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {}; - mergedGeometry.morphAttributes[name] = []; - for (let i = 0; i < numMorphTargets; ++i) { - const morphAttributesToMerge = []; - for (let j = 0; j < morphAttributes[name].length; ++j) { - morphAttributesToMerge.push(morphAttributes[name][j][i]); - } - const mergedMorphAttribute = mergeAttributes(morphAttributesToMerge); - if (!mergedMorphAttribute) { - console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the " + name + " morphAttribute."); - return null; + if (this.isPlaying === true) { + this._progress += Math.max(this.context.currentTime - this._startedAt, 0) * this.playbackRate; + if (this.loop === true) { + this._progress = this._progress % (this.duration || this.buffer.duration); } - mergedGeometry.morphAttributes[name].push(mergedMorphAttribute); + this.source.stop(); + this.source.onended = null; + this.isPlaying = false; } + return this; } - return mergedGeometry; -} -__name(mergeGeometries, "mergeGeometries"); -function mergeAttributes(attributes) { - let TypedArray; - let itemSize; - let normalized; - let gpuType = -1; - let arrayLength = 0; - for (let i = 0; i < attributes.length; ++i) { - const attribute = attributes[i]; - if (TypedArray === void 0) TypedArray = attribute.array.constructor; - if (TypedArray !== attribute.array.constructor) { - console.error("THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes."); - return null; - } - if (itemSize === void 0) itemSize = attribute.itemSize; - if (itemSize !== attribute.itemSize) { - console.error("THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes."); - return null; - } - if (normalized === void 0) normalized = attribute.normalized; - if (normalized !== attribute.normalized) { - console.error("THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes."); - return null; + stop(delay = 0) { + if (this.hasPlaybackControl === false) { + console.warn("THREE.Audio: this Audio has no playback control."); + return; } - if (gpuType === -1) gpuType = attribute.gpuType; - if (gpuType !== attribute.gpuType) { - console.error("THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.gpuType must be consistent across matching attributes."); - return null; + this._progress = 0; + if (this.source !== null) { + this.source.stop(this.context.currentTime + delay); + this.source.onended = null; } - arrayLength += attribute.count * itemSize; + this.isPlaying = false; + return this; } - const array = new TypedArray(arrayLength); - const result = new BufferAttribute(array, itemSize, normalized); - let offset = 0; - for (let i = 0; i < attributes.length; ++i) { - const attribute = attributes[i]; - if (attribute.isInterleavedBufferAttribute) { - const tupleOffset = offset / itemSize; - for (let j = 0, l = attribute.count; j < l; j++) { - for (let c = 0; c < itemSize; c++) { - const value = attribute.getComponent(j, c); - result.setComponent(j + tupleOffset, c, value); - } + connect() { + if (this.filters.length > 0) { + this.source.connect(this.filters[0]); + for (let i = 1, l = this.filters.length; i < l; i++) { + this.filters[i - 1].connect(this.filters[i]); } + this.filters[this.filters.length - 1].connect(this.getOutput()); } else { - array.set(attribute.array, offset); + this.source.connect(this.getOutput()); } - offset += attribute.count * itemSize; - } - if (gpuType !== void 0) { - result.gpuType = gpuType; + this._connected = true; + return this; } - return result; -} -__name(mergeAttributes, "mergeAttributes"); -function deepCloneAttribute(attribute) { - if (attribute.isInstancedInterleavedBufferAttribute || attribute.isInterleavedBufferAttribute) { - return deinterleaveAttribute(attribute); + disconnect() { + if (this._connected === false) { + return; + } + if (this.filters.length > 0) { + this.source.disconnect(this.filters[0]); + for (let i = 1, l = this.filters.length; i < l; i++) { + this.filters[i - 1].disconnect(this.filters[i]); + } + this.filters[this.filters.length - 1].disconnect(this.getOutput()); + } else { + this.source.disconnect(this.getOutput()); + } + this._connected = false; + return this; } - if (attribute.isInstancedBufferAttribute) { - return new InstancedBufferAttribute().copy(attribute); + getFilters() { + return this.filters; } - return new BufferAttribute().copy(attribute); -} -__name(deepCloneAttribute, "deepCloneAttribute"); -function interleaveAttributes(attributes) { - let TypedArray; - let arrayLength = 0; - let stride = 0; - for (let i = 0, l = attributes.length; i < l; ++i) { - const attribute = attributes[i]; - if (TypedArray === void 0) TypedArray = attribute.array.constructor; - if (TypedArray !== attribute.array.constructor) { - console.error("AttributeBuffers of different types cannot be interleaved"); - return null; + setFilters(value) { + if (!value) value = []; + if (this._connected === true) { + this.disconnect(); + this.filters = value.slice(); + this.connect(); + } else { + this.filters = value.slice(); } - arrayLength += attribute.array.length; - stride += attribute.itemSize; + return this; } - const interleavedBuffer = new InterleavedBuffer(new TypedArray(arrayLength), stride); - let offset = 0; - const res = []; - const getters = ["getX", "getY", "getZ", "getW"]; - const setters = ["setX", "setY", "setZ", "setW"]; - for (let j = 0, l = attributes.length; j < l; j++) { - const attribute = attributes[j]; - const itemSize = attribute.itemSize; - const count = attribute.count; - const iba = new InterleavedBufferAttribute(interleavedBuffer, itemSize, offset, attribute.normalized); - res.push(iba); - offset += itemSize; - for (let c = 0; c < count; c++) { - for (let k = 0; k < itemSize; k++) { - iba[setters[k]](c, attribute[getters[k]](c)); - } + setDetune(value) { + this.detune = value; + if (this.isPlaying === true && this.source.detune !== void 0) { + this.source.detune.setTargetAtTime(this.detune, this.context.currentTime, 0.01); } + return this; } - return res; -} -__name(interleaveAttributes, "interleaveAttributes"); -function deinterleaveAttribute(attribute) { - const cons = attribute.data.array.constructor; - const count = attribute.count; - const itemSize = attribute.itemSize; - const normalized = attribute.normalized; - const array = new cons(count * itemSize); - let newAttribute; - if (attribute.isInstancedInterleavedBufferAttribute) { - newAttribute = new InstancedBufferAttribute(array, itemSize, normalized, attribute.meshPerAttribute); - } else { - newAttribute = new BufferAttribute(array, itemSize, normalized); + getDetune() { + return this.detune; } - for (let i = 0; i < count; i++) { - newAttribute.setX(i, attribute.getX(i)); - if (itemSize >= 2) { - newAttribute.setY(i, attribute.getY(i)); - } - if (itemSize >= 3) { - newAttribute.setZ(i, attribute.getZ(i)); + getFilter() { + return this.getFilters()[0]; + } + setFilter(filter) { + return this.setFilters(filter ? [filter] : []); + } + setPlaybackRate(value) { + if (this.hasPlaybackControl === false) { + console.warn("THREE.Audio: this Audio has no playback control."); + return; } - if (itemSize >= 4) { - newAttribute.setW(i, attribute.getW(i)); + this.playbackRate = value; + if (this.isPlaying === true) { + this.source.playbackRate.setTargetAtTime(this.playbackRate, this.context.currentTime, 0.01); } + return this; } - return newAttribute; -} -__name(deinterleaveAttribute, "deinterleaveAttribute"); -function deinterleaveGeometry(geometry) { - const attributes = geometry.attributes; - const morphTargets = geometry.morphTargets; - const attrMap = /* @__PURE__ */ new Map(); - for (const key in attributes) { - const attr = attributes[key]; - if (attr.isInterleavedBufferAttribute) { - if (!attrMap.has(attr)) { - attrMap.set(attr, deinterleaveAttribute(attr)); - } - attributes[key] = attrMap.get(attr); + getPlaybackRate() { + return this.playbackRate; + } + onEnded() { + this.isPlaying = false; + } + getLoop() { + if (this.hasPlaybackControl === false) { + console.warn("THREE.Audio: this Audio has no playback control."); + return false; } + return this.loop; } - for (const key in morphTargets) { - const attr = morphTargets[key]; - if (attr.isInterleavedBufferAttribute) { - if (!attrMap.has(attr)) { - attrMap.set(attr, deinterleaveAttribute(attr)); - } - morphTargets[key] = attrMap.get(attr); + setLoop(value) { + if (this.hasPlaybackControl === false) { + console.warn("THREE.Audio: this Audio has no playback control."); + return; + } + this.loop = value; + if (this.isPlaying === true) { + this.source.loop = this.loop; } + return this; } -} -__name(deinterleaveGeometry, "deinterleaveGeometry"); -function estimateBytesUsed(geometry) { - let mem = 0; - for (const name in geometry.attributes) { - const attr = geometry.getAttribute(name); - mem += attr.count * attr.itemSize * attr.array.BYTES_PER_ELEMENT; + setLoopStart(value) { + this.loopStart = value; + return this; + } + setLoopEnd(value) { + this.loopEnd = value; + return this; + } + getVolume() { + return this.gain.gain.value; + } + setVolume(value) { + this.gain.gain.setTargetAtTime(value, this.context.currentTime, 0.01); + return this; } - const indices = geometry.getIndex(); - mem += indices ? indices.count * indices.itemSize * indices.array.BYTES_PER_ELEMENT : 0; - return mem; } -__name(estimateBytesUsed, "estimateBytesUsed"); -function mergeVertices(geometry, tolerance = 1e-4) { - tolerance = Math.max(tolerance, Number.EPSILON); - const hashToIndex = {}; - const indices = geometry.getIndex(); - const positions = geometry.getAttribute("position"); - const vertexCount = indices ? indices.count : positions.count; - let nextIndex = 0; - const attributeNames = Object.keys(geometry.attributes); - const tmpAttributes = {}; - const tmpMorphAttributes = {}; - const newIndices = []; - const getters = ["getX", "getY", "getZ", "getW"]; - const setters = ["setX", "setY", "setZ", "setW"]; - for (let i = 0, l = attributeNames.length; i < l; i++) { - const name = attributeNames[i]; - const attr = geometry.attributes[name]; - tmpAttributes[name] = new attr.constructor( - new attr.array.constructor(attr.count * attr.itemSize), - attr.itemSize, - attr.normalized - ); - const morphAttributes = geometry.morphAttributes[name]; - if (morphAttributes) { - if (!tmpMorphAttributes[name]) tmpMorphAttributes[name] = []; - morphAttributes.forEach((morphAttr, i2) => { - const array = new morphAttr.array.constructor(morphAttr.count * morphAttr.itemSize); - tmpMorphAttributes[name][i2] = new morphAttr.constructor(array, morphAttr.itemSize, morphAttr.normalized); - }); - } +const _position = /* @__PURE__ */ new Vector3(); +const _quaternion = /* @__PURE__ */ new Quaternion(); +const _scale = /* @__PURE__ */ new Vector3(); +const _orientation = /* @__PURE__ */ new Vector3(); +class PositionalAudio extends Audio { + static { + __name(this, "PositionalAudio"); } - const halfTolerance = tolerance * 0.5; - const exponent = Math.log10(1 / tolerance); - const hashMultiplier = Math.pow(10, exponent); - const hashAdditive = halfTolerance * hashMultiplier; - for (let i = 0; i < vertexCount; i++) { - const index = indices ? indices.getX(i) : i; - let hash = ""; - for (let j = 0, l = attributeNames.length; j < l; j++) { - const name = attributeNames[j]; - const attribute = geometry.getAttribute(name); - const itemSize = attribute.itemSize; - for (let k = 0; k < itemSize; k++) { - hash += `${~~(attribute[getters[k]](index) * hashMultiplier + hashAdditive)},`; - } - } - if (hash in hashToIndex) { - newIndices.push(hashToIndex[hash]); + constructor(listener) { + super(listener); + this.panner = this.context.createPanner(); + this.panner.panningModel = "HRTF"; + this.panner.connect(this.gain); + } + connect() { + super.connect(); + this.panner.connect(this.gain); + } + disconnect() { + super.disconnect(); + this.panner.disconnect(this.gain); + } + getOutput() { + return this.panner; + } + getRefDistance() { + return this.panner.refDistance; + } + setRefDistance(value) { + this.panner.refDistance = value; + return this; + } + getRolloffFactor() { + return this.panner.rolloffFactor; + } + setRolloffFactor(value) { + this.panner.rolloffFactor = value; + return this; + } + getDistanceModel() { + return this.panner.distanceModel; + } + setDistanceModel(value) { + this.panner.distanceModel = value; + return this; + } + getMaxDistance() { + return this.panner.maxDistance; + } + setMaxDistance(value) { + this.panner.maxDistance = value; + return this; + } + setDirectionalCone(coneInnerAngle, coneOuterAngle, coneOuterGain) { + this.panner.coneInnerAngle = coneInnerAngle; + this.panner.coneOuterAngle = coneOuterAngle; + this.panner.coneOuterGain = coneOuterGain; + return this; + } + updateMatrixWorld(force) { + super.updateMatrixWorld(force); + if (this.hasPlaybackControl === true && this.isPlaying === false) return; + this.matrixWorld.decompose(_position, _quaternion, _scale); + _orientation.set(0, 0, 1).applyQuaternion(_quaternion); + const panner = this.panner; + if (panner.positionX) { + const endTime = this.context.currentTime + this.listener.timeDelta; + panner.positionX.linearRampToValueAtTime(_position.x, endTime); + panner.positionY.linearRampToValueAtTime(_position.y, endTime); + panner.positionZ.linearRampToValueAtTime(_position.z, endTime); + panner.orientationX.linearRampToValueAtTime(_orientation.x, endTime); + panner.orientationY.linearRampToValueAtTime(_orientation.y, endTime); + panner.orientationZ.linearRampToValueAtTime(_orientation.z, endTime); } else { - for (let j = 0, l = attributeNames.length; j < l; j++) { - const name = attributeNames[j]; - const attribute = geometry.getAttribute(name); - const morphAttributes = geometry.morphAttributes[name]; - const itemSize = attribute.itemSize; - const newArray = tmpAttributes[name]; - const newMorphArrays = tmpMorphAttributes[name]; - for (let k = 0; k < itemSize; k++) { - const getterFunc = getters[k]; - const setterFunc = setters[k]; - newArray[setterFunc](nextIndex, attribute[getterFunc](index)); - if (morphAttributes) { - for (let m = 0, ml = morphAttributes.length; m < ml; m++) { - newMorphArrays[m][setterFunc](nextIndex, morphAttributes[m][getterFunc](index)); - } - } - } - } - hashToIndex[hash] = nextIndex; - newIndices.push(nextIndex); - nextIndex++; + panner.setPosition(_position.x, _position.y, _position.z); + panner.setOrientation(_orientation.x, _orientation.y, _orientation.z); } } - const result = geometry.clone(); - for (const name in geometry.attributes) { - const tmpAttribute = tmpAttributes[name]; - result.setAttribute(name, new tmpAttribute.constructor( - tmpAttribute.array.slice(0, nextIndex * tmpAttribute.itemSize), - tmpAttribute.itemSize, - tmpAttribute.normalized - )); - if (!(name in tmpMorphAttributes)) continue; - for (let j = 0; j < tmpMorphAttributes[name].length; j++) { - const tmpMorphAttribute = tmpMorphAttributes[name][j]; - result.morphAttributes[name][j] = new tmpMorphAttribute.constructor( - tmpMorphAttribute.array.slice(0, nextIndex * tmpMorphAttribute.itemSize), - tmpMorphAttribute.itemSize, - tmpMorphAttribute.normalized - ); +} +class AudioAnalyser { + static { + __name(this, "AudioAnalyser"); + } + constructor(audio, fftSize = 2048) { + this.analyser = audio.context.createAnalyser(); + this.analyser.fftSize = fftSize; + this.data = new Uint8Array(this.analyser.frequencyBinCount); + audio.getOutput().connect(this.analyser); + } + getFrequencyData() { + this.analyser.getByteFrequencyData(this.data); + return this.data; + } + getAverageFrequency() { + let value = 0; + const data = this.getFrequencyData(); + for (let i = 0; i < data.length; i++) { + value += data[i]; } + return value / data.length; } - result.setIndex(newIndices); - return result; } -__name(mergeVertices, "mergeVertices"); -function toTrianglesDrawMode(geometry, drawMode) { - if (drawMode === TrianglesDrawMode) { - console.warn("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles."); - return geometry; +class PropertyMixer { + static { + __name(this, "PropertyMixer"); } - if (drawMode === TriangleFanDrawMode || drawMode === TriangleStripDrawMode) { - let index = geometry.getIndex(); - if (index === null) { - const indices = []; - const position = geometry.getAttribute("position"); - if (position !== void 0) { - for (let i = 0; i < position.count; i++) { - indices.push(i); - } - geometry.setIndex(indices); - index = geometry.getIndex(); - } else { - console.error("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible."); - return geometry; - } + constructor(binding, typeName, valueSize) { + this.binding = binding; + this.valueSize = valueSize; + let mixFunction, mixFunctionAdditive, setIdentity; + switch (typeName) { + case "quaternion": + mixFunction = this._slerp; + mixFunctionAdditive = this._slerpAdditive; + setIdentity = this._setAdditiveIdentityQuaternion; + this.buffer = new Float64Array(valueSize * 6); + this._workIndex = 5; + break; + case "string": + case "bool": + mixFunction = this._select; + mixFunctionAdditive = this._select; + setIdentity = this._setAdditiveIdentityOther; + this.buffer = new Array(valueSize * 5); + break; + default: + mixFunction = this._lerp; + mixFunctionAdditive = this._lerpAdditive; + setIdentity = this._setAdditiveIdentityNumeric; + this.buffer = new Float64Array(valueSize * 5); } - const numberOfTriangles = index.count - 2; - const newIndices = []; - if (drawMode === TriangleFanDrawMode) { - for (let i = 1; i <= numberOfTriangles; i++) { - newIndices.push(index.getX(0)); - newIndices.push(index.getX(i)); - newIndices.push(index.getX(i + 1)); + this._mixBufferRegion = mixFunction; + this._mixBufferRegionAdditive = mixFunctionAdditive; + this._setIdentity = setIdentity; + this._origIndex = 3; + this._addIndex = 4; + this.cumulativeWeight = 0; + this.cumulativeWeightAdditive = 0; + this.useCount = 0; + this.referenceCount = 0; + } + // accumulate data in the 'incoming' region into 'accu' + accumulate(accuIndex, weight) { + const buffer = this.buffer, stride = this.valueSize, offset = accuIndex * stride + stride; + let currentWeight = this.cumulativeWeight; + if (currentWeight === 0) { + for (let i = 0; i !== stride; ++i) { + buffer[offset + i] = buffer[i]; } + currentWeight = weight; } else { - for (let i = 0; i < numberOfTriangles; i++) { - if (i % 2 === 0) { - newIndices.push(index.getX(i)); - newIndices.push(index.getX(i + 1)); - newIndices.push(index.getX(i + 2)); - } else { - newIndices.push(index.getX(i + 2)); - newIndices.push(index.getX(i + 1)); - newIndices.push(index.getX(i)); - } - } + currentWeight += weight; + const mix = weight / currentWeight; + this._mixBufferRegion(buffer, offset, 0, mix, stride); } - if (newIndices.length / 3 !== numberOfTriangles) { - console.error("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles."); + this.cumulativeWeight = currentWeight; + } + // accumulate data in the 'incoming' region into 'add' + accumulateAdditive(weight) { + const buffer = this.buffer, stride = this.valueSize, offset = stride * this._addIndex; + if (this.cumulativeWeightAdditive === 0) { + this._setIdentity(); } - const newGeometry = geometry.clone(); - newGeometry.setIndex(newIndices); - newGeometry.clearGroups(); - return newGeometry; - } else { - console.error("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:", drawMode); - return geometry; + this._mixBufferRegionAdditive(buffer, offset, 0, weight, stride); + this.cumulativeWeightAdditive += weight; } -} -__name(toTrianglesDrawMode, "toTrianglesDrawMode"); -function computeMorphedAttributes(object) { - const _vA2 = new Vector3(); - const _vB2 = new Vector3(); - const _vC2 = new Vector3(); - const _tempA2 = new Vector3(); - const _tempB = new Vector3(); - const _tempC = new Vector3(); - const _morphA2 = new Vector3(); - const _morphB = new Vector3(); - const _morphC = new Vector3(); - function _calculateMorphedAttributeData(object2, attribute, morphAttribute, morphTargetsRelative2, a2, b3, c2, modifiedAttributeArray) { - _vA2.fromBufferAttribute(attribute, a2); - _vB2.fromBufferAttribute(attribute, b3); - _vC2.fromBufferAttribute(attribute, c2); - const morphInfluences = object2.morphTargetInfluences; - if (morphAttribute && morphInfluences) { - _morphA2.set(0, 0, 0); - _morphB.set(0, 0, 0); - _morphC.set(0, 0, 0); - for (let i2 = 0, il2 = morphAttribute.length; i2 < il2; i2++) { - const influence = morphInfluences[i2]; - const morph = morphAttribute[i2]; - if (influence === 0) continue; - _tempA2.fromBufferAttribute(morph, a2); - _tempB.fromBufferAttribute(morph, b3); - _tempC.fromBufferAttribute(morph, c2); - if (morphTargetsRelative2) { - _morphA2.addScaledVector(_tempA2, influence); - _morphB.addScaledVector(_tempB, influence); - _morphC.addScaledVector(_tempC, influence); - } else { - _morphA2.addScaledVector(_tempA2.sub(_vA2), influence); - _morphB.addScaledVector(_tempB.sub(_vB2), influence); - _morphC.addScaledVector(_tempC.sub(_vC2), influence); - } + // apply the state of 'accu' to the binding when accus differ + apply(accuIndex) { + const stride = this.valueSize, buffer = this.buffer, offset = accuIndex * stride + stride, weight = this.cumulativeWeight, weightAdditive = this.cumulativeWeightAdditive, binding = this.binding; + this.cumulativeWeight = 0; + this.cumulativeWeightAdditive = 0; + if (weight < 1) { + const originalValueOffset = stride * this._origIndex; + this._mixBufferRegion( + buffer, + offset, + originalValueOffset, + 1 - weight, + stride + ); + } + if (weightAdditive > 0) { + this._mixBufferRegionAdditive(buffer, offset, this._addIndex * stride, 1, stride); + } + for (let i = stride, e = stride + stride; i !== e; ++i) { + if (buffer[i] !== buffer[i + stride]) { + binding.setValue(buffer, offset); + break; } - _vA2.add(_morphA2); - _vB2.add(_morphB); - _vC2.add(_morphC); } - if (object2.isSkinnedMesh) { - object2.applyBoneTransform(a2, _vA2); - object2.applyBoneTransform(b3, _vB2); - object2.applyBoneTransform(c2, _vC2); + } + // remember the state of the bound property and copy it to both accus + saveOriginalState() { + const binding = this.binding; + const buffer = this.buffer, stride = this.valueSize, originalValueOffset = stride * this._origIndex; + binding.getValue(buffer, originalValueOffset); + for (let i = stride, e = originalValueOffset; i !== e; ++i) { + buffer[i] = buffer[originalValueOffset + i % stride]; } - modifiedAttributeArray[a2 * 3 + 0] = _vA2.x; - modifiedAttributeArray[a2 * 3 + 1] = _vA2.y; - modifiedAttributeArray[a2 * 3 + 2] = _vA2.z; - modifiedAttributeArray[b3 * 3 + 0] = _vB2.x; - modifiedAttributeArray[b3 * 3 + 1] = _vB2.y; - modifiedAttributeArray[b3 * 3 + 2] = _vB2.z; - modifiedAttributeArray[c2 * 3 + 0] = _vC2.x; - modifiedAttributeArray[c2 * 3 + 1] = _vC2.y; - modifiedAttributeArray[c2 * 3 + 2] = _vC2.z; + this._setIdentity(); + this.cumulativeWeight = 0; + this.cumulativeWeightAdditive = 0; } - __name(_calculateMorphedAttributeData, "_calculateMorphedAttributeData"); - const geometry = object.geometry; - const material = object.material; - let a, b, c; - const index = geometry.index; - const positionAttribute = geometry.attributes.position; - const morphPosition = geometry.morphAttributes.position; - const morphTargetsRelative = geometry.morphTargetsRelative; - const normalAttribute = geometry.attributes.normal; - const morphNormal = geometry.morphAttributes.position; - const groups = geometry.groups; - const drawRange = geometry.drawRange; - let i, j, il, jl; - let group; - let start, end; - const modifiedPosition = new Float32Array(positionAttribute.count * positionAttribute.itemSize); - const modifiedNormal = new Float32Array(normalAttribute.count * normalAttribute.itemSize); - if (index !== null) { - if (Array.isArray(material)) { - for (i = 0, il = groups.length; i < il; i++) { - group = groups[i]; - start = Math.max(group.start, drawRange.start); - end = Math.min(group.start + group.count, drawRange.start + drawRange.count); - for (j = start, jl = end; j < jl; j += 3) { - a = index.getX(j); - b = index.getX(j + 1); - c = index.getX(j + 2); - _calculateMorphedAttributeData( - object, - positionAttribute, - morphPosition, - morphTargetsRelative, - a, - b, - c, - modifiedPosition - ); - _calculateMorphedAttributeData( - object, - normalAttribute, - morphNormal, - morphTargetsRelative, - a, - b, - c, - modifiedNormal - ); - } - } - } else { - start = Math.max(0, drawRange.start); - end = Math.min(index.count, drawRange.start + drawRange.count); - for (i = start, il = end; i < il; i += 3) { - a = index.getX(i); - b = index.getX(i + 1); - c = index.getX(i + 2); - _calculateMorphedAttributeData( - object, - positionAttribute, - morphPosition, - morphTargetsRelative, - a, - b, - c, - modifiedPosition - ); - _calculateMorphedAttributeData( - object, - normalAttribute, - morphNormal, - morphTargetsRelative, - a, - b, - c, - modifiedNormal - ); - } + // apply the state previously taken via 'saveOriginalState' to the binding + restoreOriginalState() { + const originalValueOffset = this.valueSize * 3; + this.binding.setValue(this.buffer, originalValueOffset); + } + _setAdditiveIdentityNumeric() { + const startIndex = this._addIndex * this.valueSize; + const endIndex = startIndex + this.valueSize; + for (let i = startIndex; i < endIndex; i++) { + this.buffer[i] = 0; } - } else { - if (Array.isArray(material)) { - for (i = 0, il = groups.length; i < il; i++) { - group = groups[i]; - start = Math.max(group.start, drawRange.start); - end = Math.min(group.start + group.count, drawRange.start + drawRange.count); - for (j = start, jl = end; j < jl; j += 3) { - a = j; - b = j + 1; - c = j + 2; - _calculateMorphedAttributeData( - object, - positionAttribute, - morphPosition, - morphTargetsRelative, - a, - b, - c, - modifiedPosition - ); - _calculateMorphedAttributeData( - object, - normalAttribute, - morphNormal, - morphTargetsRelative, - a, - b, - c, - modifiedNormal - ); - } - } - } else { - start = Math.max(0, drawRange.start); - end = Math.min(positionAttribute.count, drawRange.start + drawRange.count); - for (i = start, il = end; i < il; i += 3) { - a = i; - b = i + 1; - c = i + 2; - _calculateMorphedAttributeData( - object, - positionAttribute, - morphPosition, - morphTargetsRelative, - a, - b, - c, - modifiedPosition - ); - _calculateMorphedAttributeData( - object, - normalAttribute, - morphNormal, - morphTargetsRelative, - a, - b, - c, - modifiedNormal - ); + } + _setAdditiveIdentityQuaternion() { + this._setAdditiveIdentityNumeric(); + this.buffer[this._addIndex * this.valueSize + 3] = 1; + } + _setAdditiveIdentityOther() { + const startIndex = this._origIndex * this.valueSize; + const targetIndex = this._addIndex * this.valueSize; + for (let i = 0; i < this.valueSize; i++) { + this.buffer[targetIndex + i] = this.buffer[startIndex + i]; + } + } + // mix functions + _select(buffer, dstOffset, srcOffset, t2, stride) { + if (t2 >= 0.5) { + for (let i = 0; i !== stride; ++i) { + buffer[dstOffset + i] = buffer[srcOffset + i]; } } } - const morphedPositionAttribute = new Float32BufferAttribute(modifiedPosition, 3); - const morphedNormalAttribute = new Float32BufferAttribute(modifiedNormal, 3); - return { - positionAttribute, - normalAttribute, - morphedPositionAttribute, - morphedNormalAttribute - }; + _slerp(buffer, dstOffset, srcOffset, t2) { + Quaternion.slerpFlat(buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t2); + } + _slerpAdditive(buffer, dstOffset, srcOffset, t2, stride) { + const workOffset = this._workIndex * stride; + Quaternion.multiplyQuaternionsFlat(buffer, workOffset, buffer, dstOffset, buffer, srcOffset); + Quaternion.slerpFlat(buffer, dstOffset, buffer, dstOffset, buffer, workOffset, t2); + } + _lerp(buffer, dstOffset, srcOffset, t2, stride) { + const s = 1 - t2; + for (let i = 0; i !== stride; ++i) { + const j = dstOffset + i; + buffer[j] = buffer[j] * s + buffer[srcOffset + i] * t2; + } + } + _lerpAdditive(buffer, dstOffset, srcOffset, t2, stride) { + for (let i = 0; i !== stride; ++i) { + const j = dstOffset + i; + buffer[j] = buffer[j] + buffer[srcOffset + i] * t2; + } + } } -__name(computeMorphedAttributes, "computeMorphedAttributes"); -function mergeGroups(geometry) { - if (geometry.groups.length === 0) { - console.warn("THREE.BufferGeometryUtils.mergeGroups(): No groups are defined. Nothing to merge."); - return geometry; +const _RESERVED_CHARS_RE = "\\[\\]\\.:\\/"; +const _reservedRe = new RegExp("[" + _RESERVED_CHARS_RE + "]", "g"); +const _wordChar = "[^" + _RESERVED_CHARS_RE + "]"; +const _wordCharOrDot = "[^" + _RESERVED_CHARS_RE.replace("\\.", "") + "]"; +const _directoryRe = /* @__PURE__ */ /((?:WC+[\/:])*)/.source.replace("WC", _wordChar); +const _nodeRe = /* @__PURE__ */ /(WCOD+)?/.source.replace("WCOD", _wordCharOrDot); +const _objectRe = /* @__PURE__ */ /(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC", _wordChar); +const _propertyRe = /* @__PURE__ */ /\.(WC+)(?:\[(.+)\])?/.source.replace("WC", _wordChar); +const _trackRe = new RegExp( + "^" + _directoryRe + _nodeRe + _objectRe + _propertyRe + "$" +); +const _supportedObjectNames = ["material", "materials", "bones", "map"]; +class Composite { + static { + __name(this, "Composite"); } - let groups = geometry.groups; - groups = groups.sort((a, b) => { - if (a.materialIndex !== b.materialIndex) return a.materialIndex - b.materialIndex; - return a.start - b.start; - }); - if (geometry.getIndex() === null) { - const positionAttribute = geometry.getAttribute("position"); - const indices = []; - for (let i = 0; i < positionAttribute.count; i += 3) { - indices.push(i, i + 1, i + 2); + constructor(targetGroup, path, optionalParsedPath) { + const parsedPath = optionalParsedPath || PropertyBinding.parseTrackName(path); + this._targetGroup = targetGroup; + this._bindings = targetGroup.subscribe_(path, parsedPath); + } + getValue(array, offset) { + this.bind(); + const firstValidIndex = this._targetGroup.nCachedObjects_, binding = this._bindings[firstValidIndex]; + if (binding !== void 0) binding.getValue(array, offset); + } + setValue(array, offset) { + const bindings = this._bindings; + for (let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++i) { + bindings[i].setValue(array, offset); } - geometry.setIndex(indices); } - const index = geometry.getIndex(); - const newIndices = []; - for (let i = 0; i < groups.length; i++) { - const group = groups[i]; - const groupStart = group.start; - const groupLength = groupStart + group.count; - for (let j = groupStart; j < groupLength; j++) { - newIndices.push(index.getX(j)); + bind() { + const bindings = this._bindings; + for (let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++i) { + bindings[i].bind(); } } - geometry.dispose(); - geometry.setIndex(newIndices); - let start = 0; - for (let i = 0; i < groups.length; i++) { - const group = groups[i]; - group.start = start; - start += group.count; + unbind() { + const bindings = this._bindings; + for (let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++i) { + bindings[i].unbind(); + } } - let currentGroup = groups[0]; - geometry.groups = [currentGroup]; - for (let i = 1; i < groups.length; i++) { - const group = groups[i]; - if (currentGroup.materialIndex === group.materialIndex) { - currentGroup.count += group.count; +} +class PropertyBinding { + static { + __name(this, "PropertyBinding"); + } + constructor(rootNode, path, parsedPath) { + this.path = path; + this.parsedPath = parsedPath || PropertyBinding.parseTrackName(path); + this.node = PropertyBinding.findNode(rootNode, this.parsedPath.nodeName); + this.rootNode = rootNode; + this.getValue = this._getValue_unbound; + this.setValue = this._setValue_unbound; + } + static create(root, path, parsedPath) { + if (!(root && root.isAnimationObjectGroup)) { + return new PropertyBinding(root, path, parsedPath); } else { - currentGroup = group; - geometry.groups.push(currentGroup); + return new PropertyBinding.Composite(root, path, parsedPath); } } - return geometry; -} -__name(mergeGroups, "mergeGroups"); -function toCreasedNormals(geometry, creaseAngle = Math.PI / 3) { - const creaseDot = Math.cos(creaseAngle); - const hashMultiplier = (1 + 1e-10) * 100; - const verts = [new Vector3(), new Vector3(), new Vector3()]; - const tempVec1 = new Vector3(); - const tempVec2 = new Vector3(); - const tempNorm = new Vector3(); - const tempNorm2 = new Vector3(); - function hashVertex(v) { - const x = ~~(v.x * hashMultiplier); - const y = ~~(v.y * hashMultiplier); - const z = ~~(v.z * hashMultiplier); - return `${x},${y},${z}`; + /** + * Replaces spaces with underscores and removes unsupported characters from + * node names, to ensure compatibility with parseTrackName(). + * + * @param {string} name Node name to be sanitized. + * @return {string} + */ + static sanitizeNodeName(name) { + return name.replace(/\s/g, "_").replace(_reservedRe, ""); } - __name(hashVertex, "hashVertex"); - const resultGeometry = geometry.index ? geometry.toNonIndexed() : geometry; - const posAttr = resultGeometry.attributes.position; - const vertexMap = {}; - for (let i = 0, l = posAttr.count / 3; i < l; i++) { - const i3 = 3 * i; - const a = verts[0].fromBufferAttribute(posAttr, i3 + 0); - const b = verts[1].fromBufferAttribute(posAttr, i3 + 1); - const c = verts[2].fromBufferAttribute(posAttr, i3 + 2); - tempVec1.subVectors(c, b); - tempVec2.subVectors(a, b); - const normal = new Vector3().crossVectors(tempVec1, tempVec2).normalize(); - for (let n = 0; n < 3; n++) { - const vert = verts[n]; - const hash = hashVertex(vert); - if (!(hash in vertexMap)) { - vertexMap[hash] = []; + static parseTrackName(trackName) { + const matches = _trackRe.exec(trackName); + if (matches === null) { + throw new Error("PropertyBinding: Cannot parse trackName: " + trackName); + } + const results = { + // directoryName: matches[ 1 ], // (tschw) currently unused + nodeName: matches[2], + objectName: matches[3], + objectIndex: matches[4], + propertyName: matches[5], + // required + propertyIndex: matches[6] + }; + const lastDot = results.nodeName && results.nodeName.lastIndexOf("."); + if (lastDot !== void 0 && lastDot !== -1) { + const objectName = results.nodeName.substring(lastDot + 1); + if (_supportedObjectNames.indexOf(objectName) !== -1) { + results.nodeName = results.nodeName.substring(0, lastDot); + results.objectName = objectName; } - vertexMap[hash].push(normal); } + if (results.propertyName === null || results.propertyName.length === 0) { + throw new Error("PropertyBinding: can not parse propertyName from trackName: " + trackName); + } + return results; } - const normalArray = new Float32Array(posAttr.count * 3); - const normAttr = new BufferAttribute(normalArray, 3, false); - for (let i = 0, l = posAttr.count / 3; i < l; i++) { - const i3 = 3 * i; - const a = verts[0].fromBufferAttribute(posAttr, i3 + 0); - const b = verts[1].fromBufferAttribute(posAttr, i3 + 1); - const c = verts[2].fromBufferAttribute(posAttr, i3 + 2); - tempVec1.subVectors(c, b); - tempVec2.subVectors(a, b); - tempNorm.crossVectors(tempVec1, tempVec2).normalize(); - for (let n = 0; n < 3; n++) { - const vert = verts[n]; - const hash = hashVertex(vert); - const otherNormals = vertexMap[hash]; - tempNorm2.set(0, 0, 0); - for (let k = 0, lk = otherNormals.length; k < lk; k++) { - const otherNorm = otherNormals[k]; - if (tempNorm.dot(otherNorm) > creaseDot) { - tempNorm2.add(otherNorm); + static findNode(root, nodeName) { + if (nodeName === void 0 || nodeName === "" || nodeName === "." || nodeName === -1 || nodeName === root.name || nodeName === root.uuid) { + return root; + } + if (root.skeleton) { + const bone = root.skeleton.getBoneByName(nodeName); + if (bone !== void 0) { + return bone; + } + } + if (root.children) { + const searchNodeSubtree = /* @__PURE__ */ __name(function(children) { + for (let i = 0; i < children.length; i++) { + const childNode = children[i]; + if (childNode.name === nodeName || childNode.uuid === nodeName) { + return childNode; + } + const result = searchNodeSubtree(childNode.children); + if (result) return result; } + return null; + }, "searchNodeSubtree"); + const subTreeNode = searchNodeSubtree(root.children); + if (subTreeNode) { + return subTreeNode; } - tempNorm2.normalize(); - normAttr.setXYZ(i3 + n, tempNorm2.x, tempNorm2.y, tempNorm2.z); } + return null; } - resultGeometry.setAttribute("normal", normAttr); - return resultGeometry; -} -__name(toCreasedNormals, "toCreasedNormals"); -class GLTFLoader extends Loader { - static { - __name(this, "GLTFLoader"); + // these are used to "bind" a nonexistent property + _getValue_unavailable() { } - constructor(manager) { - super(manager); - this.dracoLoader = null; - this.ktx2Loader = null; - this.meshoptDecoder = null; - this.pluginCallbacks = []; - this.register(function(parser) { - return new GLTFMaterialsClearcoatExtension(parser); - }); - this.register(function(parser) { - return new GLTFMaterialsDispersionExtension(parser); - }); - this.register(function(parser) { - return new GLTFTextureBasisUExtension(parser); - }); - this.register(function(parser) { - return new GLTFTextureWebPExtension(parser); - }); - this.register(function(parser) { - return new GLTFTextureAVIFExtension(parser); - }); - this.register(function(parser) { - return new GLTFMaterialsSheenExtension(parser); - }); - this.register(function(parser) { - return new GLTFMaterialsTransmissionExtension(parser); - }); - this.register(function(parser) { - return new GLTFMaterialsVolumeExtension(parser); - }); - this.register(function(parser) { - return new GLTFMaterialsIorExtension(parser); - }); - this.register(function(parser) { - return new GLTFMaterialsEmissiveStrengthExtension(parser); - }); - this.register(function(parser) { - return new GLTFMaterialsSpecularExtension(parser); - }); - this.register(function(parser) { - return new GLTFMaterialsIridescenceExtension(parser); - }); - this.register(function(parser) { - return new GLTFMaterialsAnisotropyExtension(parser); - }); - this.register(function(parser) { - return new GLTFMaterialsBumpExtension(parser); - }); - this.register(function(parser) { - return new GLTFLightsExtension(parser); - }); - this.register(function(parser) { - return new GLTFMeshoptCompression(parser); - }); - this.register(function(parser) { - return new GLTFMeshGpuInstancing(parser); - }); + _setValue_unavailable() { + } + // Getters + _getValue_direct(buffer, offset) { + buffer[offset] = this.targetObject[this.propertyName]; } - load(url, onLoad, onProgress, onError) { - const scope = this; - let resourcePath; - if (this.resourcePath !== "") { - resourcePath = this.resourcePath; - } else if (this.path !== "") { - const relativeUrl = LoaderUtils.extractUrlBase(url); - resourcePath = LoaderUtils.resolveURL(relativeUrl, this.path); - } else { - resourcePath = LoaderUtils.extractUrlBase(url); + _getValue_array(buffer, offset) { + const source = this.resolvedProperty; + for (let i = 0, n = source.length; i !== n; ++i) { + buffer[offset++] = source[i]; } - this.manager.itemStart(url); - const _onError = /* @__PURE__ */ __name(function(e) { - if (onError) { - onError(e); - } else { - console.error(e); - } - scope.manager.itemError(url); - scope.manager.itemEnd(url); - }, "_onError"); - const loader = new FileLoader(this.manager); - loader.setPath(this.path); - loader.setResponseType("arraybuffer"); - loader.setRequestHeader(this.requestHeader); - loader.setWithCredentials(this.withCredentials); - loader.load(url, function(data) { - try { - scope.parse(data, resourcePath, function(gltf) { - onLoad(gltf); - scope.manager.itemEnd(url); - }, _onError); - } catch (e) { - _onError(e); - } - }, onProgress, _onError); } - setDRACOLoader(dracoLoader) { - this.dracoLoader = dracoLoader; - return this; + _getValue_arrayElement(buffer, offset) { + buffer[offset] = this.resolvedProperty[this.propertyIndex]; } - setKTX2Loader(ktx2Loader) { - this.ktx2Loader = ktx2Loader; - return this; + _getValue_toArray(buffer, offset) { + this.resolvedProperty.toArray(buffer, offset); } - setMeshoptDecoder(meshoptDecoder) { - this.meshoptDecoder = meshoptDecoder; - return this; + // Direct + _setValue_direct(buffer, offset) { + this.targetObject[this.propertyName] = buffer[offset]; } - register(callback) { - if (this.pluginCallbacks.indexOf(callback) === -1) { - this.pluginCallbacks.push(callback); + _setValue_direct_setNeedsUpdate(buffer, offset) { + this.targetObject[this.propertyName] = buffer[offset]; + this.targetObject.needsUpdate = true; + } + _setValue_direct_setMatrixWorldNeedsUpdate(buffer, offset) { + this.targetObject[this.propertyName] = buffer[offset]; + this.targetObject.matrixWorldNeedsUpdate = true; + } + // EntireArray + _setValue_array(buffer, offset) { + const dest = this.resolvedProperty; + for (let i = 0, n = dest.length; i !== n; ++i) { + dest[i] = buffer[offset++]; } - return this; } - unregister(callback) { - if (this.pluginCallbacks.indexOf(callback) !== -1) { - this.pluginCallbacks.splice(this.pluginCallbacks.indexOf(callback), 1); + _setValue_array_setNeedsUpdate(buffer, offset) { + const dest = this.resolvedProperty; + for (let i = 0, n = dest.length; i !== n; ++i) { + dest[i] = buffer[offset++]; } - return this; + this.targetObject.needsUpdate = true; } - parse(data, path, onLoad, onError) { - let json; - const extensions = {}; - const plugins = {}; - const textDecoder = new TextDecoder(); - if (typeof data === "string") { - json = JSON.parse(data); - } else if (data instanceof ArrayBuffer) { - const magic = textDecoder.decode(new Uint8Array(data, 0, 4)); - if (magic === BINARY_EXTENSION_HEADER_MAGIC) { - try { - extensions[EXTENSIONS.KHR_BINARY_GLTF] = new GLTFBinaryExtension(data); - } catch (error) { - if (onError) onError(error); + _setValue_array_setMatrixWorldNeedsUpdate(buffer, offset) { + const dest = this.resolvedProperty; + for (let i = 0, n = dest.length; i !== n; ++i) { + dest[i] = buffer[offset++]; + } + this.targetObject.matrixWorldNeedsUpdate = true; + } + // ArrayElement + _setValue_arrayElement(buffer, offset) { + this.resolvedProperty[this.propertyIndex] = buffer[offset]; + } + _setValue_arrayElement_setNeedsUpdate(buffer, offset) { + this.resolvedProperty[this.propertyIndex] = buffer[offset]; + this.targetObject.needsUpdate = true; + } + _setValue_arrayElement_setMatrixWorldNeedsUpdate(buffer, offset) { + this.resolvedProperty[this.propertyIndex] = buffer[offset]; + this.targetObject.matrixWorldNeedsUpdate = true; + } + // HasToFromArray + _setValue_fromArray(buffer, offset) { + this.resolvedProperty.fromArray(buffer, offset); + } + _setValue_fromArray_setNeedsUpdate(buffer, offset) { + this.resolvedProperty.fromArray(buffer, offset); + this.targetObject.needsUpdate = true; + } + _setValue_fromArray_setMatrixWorldNeedsUpdate(buffer, offset) { + this.resolvedProperty.fromArray(buffer, offset); + this.targetObject.matrixWorldNeedsUpdate = true; + } + _getValue_unbound(targetArray, offset) { + this.bind(); + this.getValue(targetArray, offset); + } + _setValue_unbound(sourceArray, offset) { + this.bind(); + this.setValue(sourceArray, offset); + } + // create getter / setter pair for a property in the scene graph + bind() { + let targetObject = this.node; + const parsedPath = this.parsedPath; + const objectName = parsedPath.objectName; + const propertyName = parsedPath.propertyName; + let propertyIndex = parsedPath.propertyIndex; + if (!targetObject) { + targetObject = PropertyBinding.findNode(this.rootNode, parsedPath.nodeName); + this.node = targetObject; + } + this.getValue = this._getValue_unavailable; + this.setValue = this._setValue_unavailable; + if (!targetObject) { + console.warn("THREE.PropertyBinding: No target node found for track: " + this.path + "."); + return; + } + if (objectName) { + let objectIndex = parsedPath.objectIndex; + switch (objectName) { + case "materials": + if (!targetObject.material) { + console.error("THREE.PropertyBinding: Can not bind to material as node does not have a material.", this); + return; + } + if (!targetObject.material.materials) { + console.error("THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.", this); + return; + } + targetObject = targetObject.material.materials; + break; + case "bones": + if (!targetObject.skeleton) { + console.error("THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.", this); + return; + } + targetObject = targetObject.skeleton.bones; + for (let i = 0; i < targetObject.length; i++) { + if (targetObject[i].name === objectIndex) { + objectIndex = i; + break; + } + } + break; + case "map": + if ("map" in targetObject) { + targetObject = targetObject.map; + break; + } + if (!targetObject.material) { + console.error("THREE.PropertyBinding: Can not bind to material as node does not have a material.", this); + return; + } + if (!targetObject.material.map) { + console.error("THREE.PropertyBinding: Can not bind to material.map as node.material does not have a map.", this); + return; + } + targetObject = targetObject.material.map; + break; + default: + if (targetObject[objectName] === void 0) { + console.error("THREE.PropertyBinding: Can not bind to objectName of node undefined.", this); + return; + } + targetObject = targetObject[objectName]; + } + if (objectIndex !== void 0) { + if (targetObject[objectIndex] === void 0) { + console.error("THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.", this, targetObject); return; } - json = JSON.parse(extensions[EXTENSIONS.KHR_BINARY_GLTF].content); - } else { - json = JSON.parse(textDecoder.decode(data)); + targetObject = targetObject[objectIndex]; } - } else { - json = data; } - if (json.asset === void 0 || json.asset.version[0] < 2) { - if (onError) onError(new Error("THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.")); + const nodeProperty = targetObject[propertyName]; + if (nodeProperty === void 0) { + const nodeName = parsedPath.nodeName; + console.error("THREE.PropertyBinding: Trying to update property for track: " + nodeName + "." + propertyName + " but it wasn't found.", targetObject); return; } - const parser = new GLTFParser(json, { - path: path || this.resourcePath || "", - crossOrigin: this.crossOrigin, - requestHeader: this.requestHeader, - manager: this.manager, - ktx2Loader: this.ktx2Loader, - meshoptDecoder: this.meshoptDecoder - }); - parser.fileLoader.setRequestHeader(this.requestHeader); - for (let i = 0; i < this.pluginCallbacks.length; i++) { - const plugin = this.pluginCallbacks[i](parser); - if (!plugin.name) console.error("THREE.GLTFLoader: Invalid plugin found: missing name"); - plugins[plugin.name] = plugin; - extensions[plugin.name] = true; + let versioning = this.Versioning.None; + this.targetObject = targetObject; + if (targetObject.needsUpdate !== void 0) { + versioning = this.Versioning.NeedsUpdate; + } else if (targetObject.matrixWorldNeedsUpdate !== void 0) { + versioning = this.Versioning.MatrixWorldNeedsUpdate; } - if (json.extensionsUsed) { - for (let i = 0; i < json.extensionsUsed.length; ++i) { - const extensionName = json.extensionsUsed[i]; - const extensionsRequired = json.extensionsRequired || []; - switch (extensionName) { - case EXTENSIONS.KHR_MATERIALS_UNLIT: - extensions[extensionName] = new GLTFMaterialsUnlitExtension(); - break; - case EXTENSIONS.KHR_DRACO_MESH_COMPRESSION: - extensions[extensionName] = new GLTFDracoMeshCompressionExtension(json, this.dracoLoader); - break; - case EXTENSIONS.KHR_TEXTURE_TRANSFORM: - extensions[extensionName] = new GLTFTextureTransformExtension(); - break; - case EXTENSIONS.KHR_MESH_QUANTIZATION: - extensions[extensionName] = new GLTFMeshQuantizationExtension(); - break; - default: - if (extensionsRequired.indexOf(extensionName) >= 0 && plugins[extensionName] === void 0) { - console.warn('THREE.GLTFLoader: Unknown extension "' + extensionName + '".'); - } + let bindingType = this.BindingType.Direct; + if (propertyIndex !== void 0) { + if (propertyName === "morphTargetInfluences") { + if (!targetObject.geometry) { + console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.", this); + return; + } + if (!targetObject.geometry.morphAttributes) { + console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.", this); + return; + } + if (targetObject.morphTargetDictionary[propertyIndex] !== void 0) { + propertyIndex = targetObject.morphTargetDictionary[propertyIndex]; } } + bindingType = this.BindingType.ArrayElement; + this.resolvedProperty = nodeProperty; + this.propertyIndex = propertyIndex; + } else if (nodeProperty.fromArray !== void 0 && nodeProperty.toArray !== void 0) { + bindingType = this.BindingType.HasFromToArray; + this.resolvedProperty = nodeProperty; + } else if (Array.isArray(nodeProperty)) { + bindingType = this.BindingType.EntireArray; + this.resolvedProperty = nodeProperty; + } else { + this.propertyName = propertyName; } - parser.setExtensions(extensions); - parser.setPlugins(plugins); - parser.parse(onLoad, onError); + this.getValue = this.GetterByBindingType[bindingType]; + this.setValue = this.SetterByBindingTypeAndVersioning[bindingType][versioning]; } - parseAsync(data, path) { - const scope = this; - return new Promise(function(resolve, reject) { - scope.parse(data, path, resolve, reject); - }); + unbind() { + this.node = null; + this.getValue = this._getValue_unbound; + this.setValue = this._setValue_unbound; } } -function GLTFRegistry() { - let objects = {}; - return { - get: /* @__PURE__ */ __name(function(key) { - return objects[key]; - }, "get"), - add: /* @__PURE__ */ __name(function(key, object) { - objects[key] = object; - }, "add"), - remove: /* @__PURE__ */ __name(function(key) { - delete objects[key]; - }, "remove"), - removeAll: /* @__PURE__ */ __name(function() { - objects = {}; - }, "removeAll") - }; -} -__name(GLTFRegistry, "GLTFRegistry"); -const EXTENSIONS = { - KHR_BINARY_GLTF: "KHR_binary_glTF", - KHR_DRACO_MESH_COMPRESSION: "KHR_draco_mesh_compression", - KHR_LIGHTS_PUNCTUAL: "KHR_lights_punctual", - KHR_MATERIALS_CLEARCOAT: "KHR_materials_clearcoat", - KHR_MATERIALS_DISPERSION: "KHR_materials_dispersion", - KHR_MATERIALS_IOR: "KHR_materials_ior", - KHR_MATERIALS_SHEEN: "KHR_materials_sheen", - KHR_MATERIALS_SPECULAR: "KHR_materials_specular", - KHR_MATERIALS_TRANSMISSION: "KHR_materials_transmission", - KHR_MATERIALS_IRIDESCENCE: "KHR_materials_iridescence", - KHR_MATERIALS_ANISOTROPY: "KHR_materials_anisotropy", - KHR_MATERIALS_UNLIT: "KHR_materials_unlit", - KHR_MATERIALS_VOLUME: "KHR_materials_volume", - KHR_TEXTURE_BASISU: "KHR_texture_basisu", - KHR_TEXTURE_TRANSFORM: "KHR_texture_transform", - KHR_MESH_QUANTIZATION: "KHR_mesh_quantization", - KHR_MATERIALS_EMISSIVE_STRENGTH: "KHR_materials_emissive_strength", - EXT_MATERIALS_BUMP: "EXT_materials_bump", - EXT_TEXTURE_WEBP: "EXT_texture_webp", - EXT_TEXTURE_AVIF: "EXT_texture_avif", - EXT_MESHOPT_COMPRESSION: "EXT_meshopt_compression", - EXT_MESH_GPU_INSTANCING: "EXT_mesh_gpu_instancing" +PropertyBinding.Composite = Composite; +PropertyBinding.prototype.BindingType = { + Direct: 0, + EntireArray: 1, + ArrayElement: 2, + HasFromToArray: 3 }; -class GLTFLightsExtension { +PropertyBinding.prototype.Versioning = { + None: 0, + NeedsUpdate: 1, + MatrixWorldNeedsUpdate: 2 +}; +PropertyBinding.prototype.GetterByBindingType = [ + PropertyBinding.prototype._getValue_direct, + PropertyBinding.prototype._getValue_array, + PropertyBinding.prototype._getValue_arrayElement, + PropertyBinding.prototype._getValue_toArray +]; +PropertyBinding.prototype.SetterByBindingTypeAndVersioning = [ + [ + // Direct + PropertyBinding.prototype._setValue_direct, + PropertyBinding.prototype._setValue_direct_setNeedsUpdate, + PropertyBinding.prototype._setValue_direct_setMatrixWorldNeedsUpdate + ], + [ + // EntireArray + PropertyBinding.prototype._setValue_array, + PropertyBinding.prototype._setValue_array_setNeedsUpdate, + PropertyBinding.prototype._setValue_array_setMatrixWorldNeedsUpdate + ], + [ + // ArrayElement + PropertyBinding.prototype._setValue_arrayElement, + PropertyBinding.prototype._setValue_arrayElement_setNeedsUpdate, + PropertyBinding.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate + ], + [ + // HasToFromArray + PropertyBinding.prototype._setValue_fromArray, + PropertyBinding.prototype._setValue_fromArray_setNeedsUpdate, + PropertyBinding.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate + ] +]; +class AnimationObjectGroup { static { - __name(this, "GLTFLightsExtension"); + __name(this, "AnimationObjectGroup"); } - constructor(parser) { - this.parser = parser; - this.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL; - this.cache = { refs: {}, uses: {} }; + constructor() { + this.isAnimationObjectGroup = true; + this.uuid = generateUUID(); + this._objects = Array.prototype.slice.call(arguments); + this.nCachedObjects_ = 0; + const indices = {}; + this._indicesByUUID = indices; + for (let i = 0, n = arguments.length; i !== n; ++i) { + indices[arguments[i].uuid] = i; + } + this._paths = []; + this._parsedPaths = []; + this._bindings = []; + this._bindingsIndicesByPath = {}; + const scope = this; + this.stats = { + objects: { + get total() { + return scope._objects.length; + }, + get inUse() { + return this.total - scope.nCachedObjects_; + } + }, + get bindingsPerObject() { + return scope._bindings.length; + } + }; } - _markDefs() { - const parser = this.parser; - const nodeDefs = this.parser.json.nodes || []; - for (let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex++) { - const nodeDef = nodeDefs[nodeIndex]; - if (nodeDef.extensions && nodeDef.extensions[this.name] && nodeDef.extensions[this.name].light !== void 0) { - parser._addNodeRef(this.cache, nodeDef.extensions[this.name].light); + add() { + const objects = this._objects, indicesByUUID = this._indicesByUUID, paths = this._paths, parsedPaths = this._parsedPaths, bindings = this._bindings, nBindings = bindings.length; + let knownObject = void 0, nObjects = objects.length, nCachedObjects = this.nCachedObjects_; + for (let i = 0, n = arguments.length; i !== n; ++i) { + const object = arguments[i], uuid = object.uuid; + let index = indicesByUUID[uuid]; + if (index === void 0) { + index = nObjects++; + indicesByUUID[uuid] = index; + objects.push(object); + for (let j = 0, m = nBindings; j !== m; ++j) { + bindings[j].push(new PropertyBinding(object, paths[j], parsedPaths[j])); + } + } else if (index < nCachedObjects) { + knownObject = objects[index]; + const firstActiveIndex = --nCachedObjects, lastCachedObject = objects[firstActiveIndex]; + indicesByUUID[lastCachedObject.uuid] = index; + objects[index] = lastCachedObject; + indicesByUUID[uuid] = firstActiveIndex; + objects[firstActiveIndex] = object; + for (let j = 0, m = nBindings; j !== m; ++j) { + const bindingsForPath = bindings[j], lastCached = bindingsForPath[firstActiveIndex]; + let binding = bindingsForPath[index]; + bindingsForPath[index] = lastCached; + if (binding === void 0) { + binding = new PropertyBinding(object, paths[j], parsedPaths[j]); + } + bindingsForPath[firstActiveIndex] = binding; + } + } else if (objects[index] !== knownObject) { + console.error("THREE.AnimationObjectGroup: Different objects with the same UUID detected. Clean the caches or recreate your infrastructure when reloading scenes."); } } + this.nCachedObjects_ = nCachedObjects; } - _loadLight(lightIndex) { - const parser = this.parser; - const cacheKey = "light:" + lightIndex; - let dependency = parser.cache.get(cacheKey); - if (dependency) return dependency; - const json = parser.json; - const extensions = json.extensions && json.extensions[this.name] || {}; - const lightDefs = extensions.lights || []; - const lightDef = lightDefs[lightIndex]; - let lightNode; - const color = new Color(16777215); - if (lightDef.color !== void 0) color.setRGB(lightDef.color[0], lightDef.color[1], lightDef.color[2], LinearSRGBColorSpace); - const range = lightDef.range !== void 0 ? lightDef.range : 0; - switch (lightDef.type) { - case "directional": - lightNode = new DirectionalLight(color); - lightNode.target.position.set(0, 0, -1); - lightNode.add(lightNode.target); - break; - case "point": - lightNode = new PointLight(color); - lightNode.distance = range; - break; - case "spot": - lightNode = new SpotLight(color); - lightNode.distance = range; - lightDef.spot = lightDef.spot || {}; - lightDef.spot.innerConeAngle = lightDef.spot.innerConeAngle !== void 0 ? lightDef.spot.innerConeAngle : 0; - lightDef.spot.outerConeAngle = lightDef.spot.outerConeAngle !== void 0 ? lightDef.spot.outerConeAngle : Math.PI / 4; - lightNode.angle = lightDef.spot.outerConeAngle; - lightNode.penumbra = 1 - lightDef.spot.innerConeAngle / lightDef.spot.outerConeAngle; - lightNode.target.position.set(0, 0, -1); - lightNode.add(lightNode.target); - break; - default: - throw new Error("THREE.GLTFLoader: Unexpected light type: " + lightDef.type); + remove() { + const objects = this._objects, indicesByUUID = this._indicesByUUID, bindings = this._bindings, nBindings = bindings.length; + let nCachedObjects = this.nCachedObjects_; + for (let i = 0, n = arguments.length; i !== n; ++i) { + const object = arguments[i], uuid = object.uuid, index = indicesByUUID[uuid]; + if (index !== void 0 && index >= nCachedObjects) { + const lastCachedIndex = nCachedObjects++, firstActiveObject = objects[lastCachedIndex]; + indicesByUUID[firstActiveObject.uuid] = index; + objects[index] = firstActiveObject; + indicesByUUID[uuid] = lastCachedIndex; + objects[lastCachedIndex] = object; + for (let j = 0, m = nBindings; j !== m; ++j) { + const bindingsForPath = bindings[j], firstActive = bindingsForPath[lastCachedIndex], binding = bindingsForPath[index]; + bindingsForPath[index] = firstActive; + bindingsForPath[lastCachedIndex] = binding; + } + } + } + this.nCachedObjects_ = nCachedObjects; + } + // remove & forget + uncache() { + const objects = this._objects, indicesByUUID = this._indicesByUUID, bindings = this._bindings, nBindings = bindings.length; + let nCachedObjects = this.nCachedObjects_, nObjects = objects.length; + for (let i = 0, n = arguments.length; i !== n; ++i) { + const object = arguments[i], uuid = object.uuid, index = indicesByUUID[uuid]; + if (index !== void 0) { + delete indicesByUUID[uuid]; + if (index < nCachedObjects) { + const firstActiveIndex = --nCachedObjects, lastCachedObject = objects[firstActiveIndex], lastIndex = --nObjects, lastObject = objects[lastIndex]; + indicesByUUID[lastCachedObject.uuid] = index; + objects[index] = lastCachedObject; + indicesByUUID[lastObject.uuid] = firstActiveIndex; + objects[firstActiveIndex] = lastObject; + objects.pop(); + for (let j = 0, m = nBindings; j !== m; ++j) { + const bindingsForPath = bindings[j], lastCached = bindingsForPath[firstActiveIndex], last = bindingsForPath[lastIndex]; + bindingsForPath[index] = lastCached; + bindingsForPath[firstActiveIndex] = last; + bindingsForPath.pop(); + } + } else { + const lastIndex = --nObjects, lastObject = objects[lastIndex]; + if (lastIndex > 0) { + indicesByUUID[lastObject.uuid] = index; + } + objects[index] = lastObject; + objects.pop(); + for (let j = 0, m = nBindings; j !== m; ++j) { + const bindingsForPath = bindings[j]; + bindingsForPath[index] = bindingsForPath[lastIndex]; + bindingsForPath.pop(); + } + } + } } - lightNode.position.set(0, 0, 0); - lightNode.decay = 2; - assignExtrasToUserData(lightNode, lightDef); - if (lightDef.intensity !== void 0) lightNode.intensity = lightDef.intensity; - lightNode.name = parser.createUniqueName(lightDef.name || "light_" + lightIndex); - dependency = Promise.resolve(lightNode); - parser.cache.add(cacheKey, dependency); - return dependency; + this.nCachedObjects_ = nCachedObjects; } - getDependency(type, index) { - if (type !== "light") return; - return this._loadLight(index); + // Internal interface used by befriended PropertyBinding.Composite: + subscribe_(path, parsedPath) { + const indicesByPath = this._bindingsIndicesByPath; + let index = indicesByPath[path]; + const bindings = this._bindings; + if (index !== void 0) return bindings[index]; + const paths = this._paths, parsedPaths = this._parsedPaths, objects = this._objects, nObjects = objects.length, nCachedObjects = this.nCachedObjects_, bindingsForPath = new Array(nObjects); + index = bindings.length; + indicesByPath[path] = index; + paths.push(path); + parsedPaths.push(parsedPath); + bindings.push(bindingsForPath); + for (let i = nCachedObjects, n = objects.length; i !== n; ++i) { + const object = objects[i]; + bindingsForPath[i] = new PropertyBinding(object, path, parsedPath); + } + return bindingsForPath; } - createNodeAttachment(nodeIndex) { - const self2 = this; - const parser = this.parser; - const json = parser.json; - const nodeDef = json.nodes[nodeIndex]; - const lightDef = nodeDef.extensions && nodeDef.extensions[this.name] || {}; - const lightIndex = lightDef.light; - if (lightIndex === void 0) return null; - return this._loadLight(lightIndex).then(function(light) { - return parser._getNodeRef(self2.cache, lightIndex, light); - }); + unsubscribe_(path) { + const indicesByPath = this._bindingsIndicesByPath, index = indicesByPath[path]; + if (index !== void 0) { + const paths = this._paths, parsedPaths = this._parsedPaths, bindings = this._bindings, lastBindingsIndex = bindings.length - 1, lastBindings = bindings[lastBindingsIndex], lastBindingsPath = path[lastBindingsIndex]; + indicesByPath[lastBindingsPath] = index; + bindings[index] = lastBindings; + bindings.pop(); + parsedPaths[index] = parsedPaths[lastBindingsIndex]; + parsedPaths.pop(); + paths[index] = paths[lastBindingsIndex]; + paths.pop(); + } } } -class GLTFMaterialsUnlitExtension { +class AnimationAction { static { - __name(this, "GLTFMaterialsUnlitExtension"); + __name(this, "AnimationAction"); } - constructor() { - this.name = EXTENSIONS.KHR_MATERIALS_UNLIT; + constructor(mixer, clip, localRoot = null, blendMode = clip.blendMode) { + this._mixer = mixer; + this._clip = clip; + this._localRoot = localRoot; + this.blendMode = blendMode; + const tracks = clip.tracks, nTracks = tracks.length, interpolants = new Array(nTracks); + const interpolantSettings = { + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + }; + for (let i = 0; i !== nTracks; ++i) { + const interpolant = tracks[i].createInterpolant(null); + interpolants[i] = interpolant; + interpolant.settings = interpolantSettings; + } + this._interpolantSettings = interpolantSettings; + this._interpolants = interpolants; + this._propertyBindings = new Array(nTracks); + this._cacheIndex = null; + this._byClipCacheIndex = null; + this._timeScaleInterpolant = null; + this._weightInterpolant = null; + this.loop = LoopRepeat; + this._loopCount = -1; + this._startTime = null; + this.time = 0; + this.timeScale = 1; + this._effectiveTimeScale = 1; + this.weight = 1; + this._effectiveWeight = 1; + this.repetitions = Infinity; + this.paused = false; + this.enabled = true; + this.clampWhenFinished = false; + this.zeroSlopeAtStart = true; + this.zeroSlopeAtEnd = true; } - getMaterialType() { - return MeshBasicMaterial; + // State & Scheduling + play() { + this._mixer._activateAction(this); + return this; } - extendParams(materialParams, materialDef, parser) { - const pending = []; - materialParams.color = new Color(1, 1, 1); - materialParams.opacity = 1; - const metallicRoughness = materialDef.pbrMetallicRoughness; - if (metallicRoughness) { - if (Array.isArray(metallicRoughness.baseColorFactor)) { - const array = metallicRoughness.baseColorFactor; - materialParams.color.setRGB(array[0], array[1], array[2], LinearSRGBColorSpace); - materialParams.opacity = array[3]; - } - if (metallicRoughness.baseColorTexture !== void 0) { - pending.push(parser.assignTexture(materialParams, "map", metallicRoughness.baseColorTexture, SRGBColorSpace)); - } - } - return Promise.all(pending); + stop() { + this._mixer._deactivateAction(this); + return this.reset(); } -} -class GLTFMaterialsEmissiveStrengthExtension { - static { - __name(this, "GLTFMaterialsEmissiveStrengthExtension"); + reset() { + this.paused = false; + this.enabled = true; + this.time = 0; + this._loopCount = -1; + this._startTime = null; + return this.stopFading().stopWarping(); } - constructor(parser) { - this.parser = parser; - this.name = EXTENSIONS.KHR_MATERIALS_EMISSIVE_STRENGTH; + isRunning() { + return this.enabled && !this.paused && this.timeScale !== 0 && this._startTime === null && this._mixer._isActiveAction(this); } - extendMaterialParams(materialIndex, materialParams) { - const parser = this.parser; - const materialDef = parser.json.materials[materialIndex]; - if (!materialDef.extensions || !materialDef.extensions[this.name]) { - return Promise.resolve(); - } - const emissiveStrength = materialDef.extensions[this.name].emissiveStrength; - if (emissiveStrength !== void 0) { - materialParams.emissiveIntensity = emissiveStrength; - } - return Promise.resolve(); + // return true when play has been called + isScheduled() { + return this._mixer._isActiveAction(this); } -} -class GLTFMaterialsClearcoatExtension { - static { - __name(this, "GLTFMaterialsClearcoatExtension"); + startAt(time) { + this._startTime = time; + return this; } - constructor(parser) { - this.parser = parser; - this.name = EXTENSIONS.KHR_MATERIALS_CLEARCOAT; + setLoop(mode, repetitions) { + this.loop = mode; + this.repetitions = repetitions; + return this; } - getMaterialType(materialIndex) { - const parser = this.parser; - const materialDef = parser.json.materials[materialIndex]; - if (!materialDef.extensions || !materialDef.extensions[this.name]) return null; - return MeshPhysicalMaterial; + // Weight + // set the weight stopping any scheduled fading + // although .enabled = false yields an effective weight of zero, this + // method does *not* change .enabled, because it would be confusing + setEffectiveWeight(weight) { + this.weight = weight; + this._effectiveWeight = this.enabled ? weight : 0; + return this.stopFading(); } - extendMaterialParams(materialIndex, materialParams) { - const parser = this.parser; - const materialDef = parser.json.materials[materialIndex]; - if (!materialDef.extensions || !materialDef.extensions[this.name]) { - return Promise.resolve(); - } - const pending = []; - const extension = materialDef.extensions[this.name]; - if (extension.clearcoatFactor !== void 0) { - materialParams.clearcoat = extension.clearcoatFactor; - } - if (extension.clearcoatTexture !== void 0) { - pending.push(parser.assignTexture(materialParams, "clearcoatMap", extension.clearcoatTexture)); - } - if (extension.clearcoatRoughnessFactor !== void 0) { - materialParams.clearcoatRoughness = extension.clearcoatRoughnessFactor; - } - if (extension.clearcoatRoughnessTexture !== void 0) { - pending.push(parser.assignTexture(materialParams, "clearcoatRoughnessMap", extension.clearcoatRoughnessTexture)); + // return the weight considering fading and .enabled + getEffectiveWeight() { + return this._effectiveWeight; + } + fadeIn(duration) { + return this._scheduleFading(duration, 0, 1); + } + fadeOut(duration) { + return this._scheduleFading(duration, 1, 0); + } + crossFadeFrom(fadeOutAction, duration, warp) { + fadeOutAction.fadeOut(duration); + this.fadeIn(duration); + if (warp) { + const fadeInDuration = this._clip.duration, fadeOutDuration = fadeOutAction._clip.duration, startEndRatio = fadeOutDuration / fadeInDuration, endStartRatio = fadeInDuration / fadeOutDuration; + fadeOutAction.warp(1, startEndRatio, duration); + this.warp(endStartRatio, 1, duration); } - if (extension.clearcoatNormalTexture !== void 0) { - pending.push(parser.assignTexture(materialParams, "clearcoatNormalMap", extension.clearcoatNormalTexture)); - if (extension.clearcoatNormalTexture.scale !== void 0) { - const scale = extension.clearcoatNormalTexture.scale; - materialParams.clearcoatNormalScale = new Vector2(scale, scale); - } + return this; + } + crossFadeTo(fadeInAction, duration, warp) { + return fadeInAction.crossFadeFrom(this, duration, warp); + } + stopFading() { + const weightInterpolant = this._weightInterpolant; + if (weightInterpolant !== null) { + this._weightInterpolant = null; + this._mixer._takeBackControlInterpolant(weightInterpolant); } - return Promise.all(pending); + return this; } -} -class GLTFMaterialsDispersionExtension { - static { - __name(this, "GLTFMaterialsDispersionExtension"); + // Time Scale Control + // set the time scale stopping any scheduled warping + // although .paused = true yields an effective time scale of zero, this + // method does *not* change .paused, because it would be confusing + setEffectiveTimeScale(timeScale) { + this.timeScale = timeScale; + this._effectiveTimeScale = this.paused ? 0 : timeScale; + return this.stopWarping(); } - constructor(parser) { - this.parser = parser; - this.name = EXTENSIONS.KHR_MATERIALS_DISPERSION; + // return the time scale considering warping and .paused + getEffectiveTimeScale() { + return this._effectiveTimeScale; } - getMaterialType(materialIndex) { - const parser = this.parser; - const materialDef = parser.json.materials[materialIndex]; - if (!materialDef.extensions || !materialDef.extensions[this.name]) return null; - return MeshPhysicalMaterial; + setDuration(duration) { + this.timeScale = this._clip.duration / duration; + return this.stopWarping(); } - extendMaterialParams(materialIndex, materialParams) { - const parser = this.parser; - const materialDef = parser.json.materials[materialIndex]; - if (!materialDef.extensions || !materialDef.extensions[this.name]) { - return Promise.resolve(); + syncWith(action) { + this.time = action.time; + this.timeScale = action.timeScale; + return this.stopWarping(); + } + halt(duration) { + return this.warp(this._effectiveTimeScale, 0, duration); + } + warp(startTimeScale, endTimeScale, duration) { + const mixer = this._mixer, now2 = mixer.time, timeScale = this.timeScale; + let interpolant = this._timeScaleInterpolant; + if (interpolant === null) { + interpolant = mixer._lendControlInterpolant(); + this._timeScaleInterpolant = interpolant; } - const extension = materialDef.extensions[this.name]; - materialParams.dispersion = extension.dispersion !== void 0 ? extension.dispersion : 0; - return Promise.resolve(); + const times = interpolant.parameterPositions, values = interpolant.sampleValues; + times[0] = now2; + times[1] = now2 + duration; + values[0] = startTimeScale / timeScale; + values[1] = endTimeScale / timeScale; + return this; } -} -class GLTFMaterialsIridescenceExtension { - static { - __name(this, "GLTFMaterialsIridescenceExtension"); + stopWarping() { + const timeScaleInterpolant = this._timeScaleInterpolant; + if (timeScaleInterpolant !== null) { + this._timeScaleInterpolant = null; + this._mixer._takeBackControlInterpolant(timeScaleInterpolant); + } + return this; } - constructor(parser) { - this.parser = parser; - this.name = EXTENSIONS.KHR_MATERIALS_IRIDESCENCE; + // Object Accessors + getMixer() { + return this._mixer; } - getMaterialType(materialIndex) { - const parser = this.parser; - const materialDef = parser.json.materials[materialIndex]; - if (!materialDef.extensions || !materialDef.extensions[this.name]) return null; - return MeshPhysicalMaterial; + getClip() { + return this._clip; } - extendMaterialParams(materialIndex, materialParams) { - const parser = this.parser; - const materialDef = parser.json.materials[materialIndex]; - if (!materialDef.extensions || !materialDef.extensions[this.name]) { - return Promise.resolve(); + getRoot() { + return this._localRoot || this._mixer._root; + } + // Interna + _update(time, deltaTime, timeDirection, accuIndex) { + if (!this.enabled) { + this._updateWeight(time); + return; } - const pending = []; - const extension = materialDef.extensions[this.name]; - if (extension.iridescenceFactor !== void 0) { - materialParams.iridescence = extension.iridescenceFactor; + const startTime = this._startTime; + if (startTime !== null) { + const timeRunning = (time - startTime) * timeDirection; + if (timeRunning < 0 || timeDirection === 0) { + deltaTime = 0; + } else { + this._startTime = null; + deltaTime = timeDirection * timeRunning; + } } - if (extension.iridescenceTexture !== void 0) { - pending.push(parser.assignTexture(materialParams, "iridescenceMap", extension.iridescenceTexture)); + deltaTime *= this._updateTimeScale(time); + const clipTime = this._updateTime(deltaTime); + const weight = this._updateWeight(time); + if (weight > 0) { + const interpolants = this._interpolants; + const propertyMixers = this._propertyBindings; + switch (this.blendMode) { + case AdditiveAnimationBlendMode: + for (let j = 0, m = interpolants.length; j !== m; ++j) { + interpolants[j].evaluate(clipTime); + propertyMixers[j].accumulateAdditive(weight); + } + break; + case NormalAnimationBlendMode: + default: + for (let j = 0, m = interpolants.length; j !== m; ++j) { + interpolants[j].evaluate(clipTime); + propertyMixers[j].accumulate(accuIndex, weight); + } + } } - if (extension.iridescenceIor !== void 0) { - materialParams.iridescenceIOR = extension.iridescenceIor; + } + _updateWeight(time) { + let weight = 0; + if (this.enabled) { + weight = this.weight; + const interpolant = this._weightInterpolant; + if (interpolant !== null) { + const interpolantValue = interpolant.evaluate(time)[0]; + weight *= interpolantValue; + if (time > interpolant.parameterPositions[1]) { + this.stopFading(); + if (interpolantValue === 0) { + this.enabled = false; + } + } + } } - if (materialParams.iridescenceThicknessRange === void 0) { - materialParams.iridescenceThicknessRange = [100, 400]; + this._effectiveWeight = weight; + return weight; + } + _updateTimeScale(time) { + let timeScale = 0; + if (!this.paused) { + timeScale = this.timeScale; + const interpolant = this._timeScaleInterpolant; + if (interpolant !== null) { + const interpolantValue = interpolant.evaluate(time)[0]; + timeScale *= interpolantValue; + if (time > interpolant.parameterPositions[1]) { + this.stopWarping(); + if (timeScale === 0) { + this.paused = true; + } else { + this.timeScale = timeScale; + } + } + } } - if (extension.iridescenceThicknessMinimum !== void 0) { - materialParams.iridescenceThicknessRange[0] = extension.iridescenceThicknessMinimum; + this._effectiveTimeScale = timeScale; + return timeScale; + } + _updateTime(deltaTime) { + const duration = this._clip.duration; + const loop = this.loop; + let time = this.time + deltaTime; + let loopCount = this._loopCount; + const pingPong = loop === LoopPingPong; + if (deltaTime === 0) { + if (loopCount === -1) return time; + return pingPong && (loopCount & 1) === 1 ? duration - time : time; + } + if (loop === LoopOnce) { + if (loopCount === -1) { + this._loopCount = 0; + this._setEndings(true, true, false); + } + handle_stop: { + if (time >= duration) { + time = duration; + } else if (time < 0) { + time = 0; + } else { + this.time = time; + break handle_stop; + } + if (this.clampWhenFinished) this.paused = true; + else this.enabled = false; + this.time = time; + this._mixer.dispatchEvent({ + type: "finished", + action: this, + direction: deltaTime < 0 ? -1 : 1 + }); + } + } else { + if (loopCount === -1) { + if (deltaTime >= 0) { + loopCount = 0; + this._setEndings(true, this.repetitions === 0, pingPong); + } else { + this._setEndings(this.repetitions === 0, true, pingPong); + } + } + if (time >= duration || time < 0) { + const loopDelta = Math.floor(time / duration); + time -= duration * loopDelta; + loopCount += Math.abs(loopDelta); + const pending = this.repetitions - loopCount; + if (pending <= 0) { + if (this.clampWhenFinished) this.paused = true; + else this.enabled = false; + time = deltaTime > 0 ? duration : 0; + this.time = time; + this._mixer.dispatchEvent({ + type: "finished", + action: this, + direction: deltaTime > 0 ? 1 : -1 + }); + } else { + if (pending === 1) { + const atStart = deltaTime < 0; + this._setEndings(atStart, !atStart, pingPong); + } else { + this._setEndings(false, false, pingPong); + } + this._loopCount = loopCount; + this.time = time; + this._mixer.dispatchEvent({ + type: "loop", + action: this, + loopDelta + }); + } + } else { + this.time = time; + } + if (pingPong && (loopCount & 1) === 1) { + return duration - time; + } } - if (extension.iridescenceThicknessMaximum !== void 0) { - materialParams.iridescenceThicknessRange[1] = extension.iridescenceThicknessMaximum; + return time; + } + _setEndings(atStart, atEnd, pingPong) { + const settings = this._interpolantSettings; + if (pingPong) { + settings.endingStart = ZeroSlopeEnding; + settings.endingEnd = ZeroSlopeEnding; + } else { + if (atStart) { + settings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding; + } else { + settings.endingStart = WrapAroundEnding; + } + if (atEnd) { + settings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding; + } else { + settings.endingEnd = WrapAroundEnding; + } } - if (extension.iridescenceThicknessTexture !== void 0) { - pending.push(parser.assignTexture(materialParams, "iridescenceThicknessMap", extension.iridescenceThicknessTexture)); + } + _scheduleFading(duration, weightNow, weightThen) { + const mixer = this._mixer, now2 = mixer.time; + let interpolant = this._weightInterpolant; + if (interpolant === null) { + interpolant = mixer._lendControlInterpolant(); + this._weightInterpolant = interpolant; } - return Promise.all(pending); + const times = interpolant.parameterPositions, values = interpolant.sampleValues; + times[0] = now2; + values[0] = weightNow; + times[1] = now2 + duration; + values[1] = weightThen; + return this; } } -class GLTFMaterialsSheenExtension { +const _controlInterpolantsResultBuffer = new Float32Array(1); +class AnimationMixer extends EventDispatcher { static { - __name(this, "GLTFMaterialsSheenExtension"); - } - constructor(parser) { - this.parser = parser; - this.name = EXTENSIONS.KHR_MATERIALS_SHEEN; + __name(this, "AnimationMixer"); } - getMaterialType(materialIndex) { - const parser = this.parser; - const materialDef = parser.json.materials[materialIndex]; - if (!materialDef.extensions || !materialDef.extensions[this.name]) return null; - return MeshPhysicalMaterial; + constructor(root) { + super(); + this._root = root; + this._initMemoryManager(); + this._accuIndex = 0; + this.time = 0; + this.timeScale = 1; } - extendMaterialParams(materialIndex, materialParams) { - const parser = this.parser; - const materialDef = parser.json.materials[materialIndex]; - if (!materialDef.extensions || !materialDef.extensions[this.name]) { - return Promise.resolve(); - } - const pending = []; - materialParams.sheenColor = new Color(0, 0, 0); - materialParams.sheenRoughness = 0; - materialParams.sheen = 1; - const extension = materialDef.extensions[this.name]; - if (extension.sheenColorFactor !== void 0) { - const colorFactor = extension.sheenColorFactor; - materialParams.sheenColor.setRGB(colorFactor[0], colorFactor[1], colorFactor[2], LinearSRGBColorSpace); - } - if (extension.sheenRoughnessFactor !== void 0) { - materialParams.sheenRoughness = extension.sheenRoughnessFactor; + _bindAction(action, prototypeAction) { + const root = action._localRoot || this._root, tracks = action._clip.tracks, nTracks = tracks.length, bindings = action._propertyBindings, interpolants = action._interpolants, rootUuid = root.uuid, bindingsByRoot = this._bindingsByRootAndName; + let bindingsByName = bindingsByRoot[rootUuid]; + if (bindingsByName === void 0) { + bindingsByName = {}; + bindingsByRoot[rootUuid] = bindingsByName; } - if (extension.sheenColorTexture !== void 0) { - pending.push(parser.assignTexture(materialParams, "sheenColorMap", extension.sheenColorTexture, SRGBColorSpace)); + for (let i = 0; i !== nTracks; ++i) { + const track = tracks[i], trackName = track.name; + let binding = bindingsByName[trackName]; + if (binding !== void 0) { + ++binding.referenceCount; + bindings[i] = binding; + } else { + binding = bindings[i]; + if (binding !== void 0) { + if (binding._cacheIndex === null) { + ++binding.referenceCount; + this._addInactiveBinding(binding, rootUuid, trackName); + } + continue; + } + const path = prototypeAction && prototypeAction._propertyBindings[i].binding.parsedPath; + binding = new PropertyMixer( + PropertyBinding.create(root, trackName, path), + track.ValueTypeName, + track.getValueSize() + ); + ++binding.referenceCount; + this._addInactiveBinding(binding, rootUuid, trackName); + bindings[i] = binding; + } + interpolants[i].resultBuffer = binding.buffer; } - if (extension.sheenRoughnessTexture !== void 0) { - pending.push(parser.assignTexture(materialParams, "sheenRoughnessMap", extension.sheenRoughnessTexture)); + } + _activateAction(action) { + if (!this._isActiveAction(action)) { + if (action._cacheIndex === null) { + const rootUuid = (action._localRoot || this._root).uuid, clipUuid = action._clip.uuid, actionsForClip = this._actionsByClip[clipUuid]; + this._bindAction( + action, + actionsForClip && actionsForClip.knownActions[0] + ); + this._addInactiveAction(action, clipUuid, rootUuid); + } + const bindings = action._propertyBindings; + for (let i = 0, n = bindings.length; i !== n; ++i) { + const binding = bindings[i]; + if (binding.useCount++ === 0) { + this._lendBinding(binding); + binding.saveOriginalState(); + } + } + this._lendAction(action); } - return Promise.all(pending); } -} -class GLTFMaterialsTransmissionExtension { - static { - __name(this, "GLTFMaterialsTransmissionExtension"); + _deactivateAction(action) { + if (this._isActiveAction(action)) { + const bindings = action._propertyBindings; + for (let i = 0, n = bindings.length; i !== n; ++i) { + const binding = bindings[i]; + if (--binding.useCount === 0) { + binding.restoreOriginalState(); + this._takeBackBinding(binding); + } + } + this._takeBackAction(action); + } } - constructor(parser) { - this.parser = parser; - this.name = EXTENSIONS.KHR_MATERIALS_TRANSMISSION; + // Memory manager + _initMemoryManager() { + this._actions = []; + this._nActiveActions = 0; + this._actionsByClip = {}; + this._bindings = []; + this._nActiveBindings = 0; + this._bindingsByRootAndName = {}; + this._controlInterpolants = []; + this._nActiveControlInterpolants = 0; + const scope = this; + this.stats = { + actions: { + get total() { + return scope._actions.length; + }, + get inUse() { + return scope._nActiveActions; + } + }, + bindings: { + get total() { + return scope._bindings.length; + }, + get inUse() { + return scope._nActiveBindings; + } + }, + controlInterpolants: { + get total() { + return scope._controlInterpolants.length; + }, + get inUse() { + return scope._nActiveControlInterpolants; + } + } + }; } - getMaterialType(materialIndex) { - const parser = this.parser; - const materialDef = parser.json.materials[materialIndex]; - if (!materialDef.extensions || !materialDef.extensions[this.name]) return null; - return MeshPhysicalMaterial; + // Memory management for AnimationAction objects + _isActiveAction(action) { + const index = action._cacheIndex; + return index !== null && index < this._nActiveActions; } - extendMaterialParams(materialIndex, materialParams) { - const parser = this.parser; - const materialDef = parser.json.materials[materialIndex]; - if (!materialDef.extensions || !materialDef.extensions[this.name]) { - return Promise.resolve(); - } - const pending = []; - const extension = materialDef.extensions[this.name]; - if (extension.transmissionFactor !== void 0) { - materialParams.transmission = extension.transmissionFactor; + _addInactiveAction(action, clipUuid, rootUuid) { + const actions = this._actions, actionsByClip = this._actionsByClip; + let actionsForClip = actionsByClip[clipUuid]; + if (actionsForClip === void 0) { + actionsForClip = { + knownActions: [action], + actionByRoot: {} + }; + action._byClipCacheIndex = 0; + actionsByClip[clipUuid] = actionsForClip; + } else { + const knownActions = actionsForClip.knownActions; + action._byClipCacheIndex = knownActions.length; + knownActions.push(action); } - if (extension.transmissionTexture !== void 0) { - pending.push(parser.assignTexture(materialParams, "transmissionMap", extension.transmissionTexture)); + action._cacheIndex = actions.length; + actions.push(action); + actionsForClip.actionByRoot[rootUuid] = action; + } + _removeInactiveAction(action) { + const actions = this._actions, lastInactiveAction = actions[actions.length - 1], cacheIndex = action._cacheIndex; + lastInactiveAction._cacheIndex = cacheIndex; + actions[cacheIndex] = lastInactiveAction; + actions.pop(); + action._cacheIndex = null; + const clipUuid = action._clip.uuid, actionsByClip = this._actionsByClip, actionsForClip = actionsByClip[clipUuid], knownActionsForClip = actionsForClip.knownActions, lastKnownAction = knownActionsForClip[knownActionsForClip.length - 1], byClipCacheIndex = action._byClipCacheIndex; + lastKnownAction._byClipCacheIndex = byClipCacheIndex; + knownActionsForClip[byClipCacheIndex] = lastKnownAction; + knownActionsForClip.pop(); + action._byClipCacheIndex = null; + const actionByRoot = actionsForClip.actionByRoot, rootUuid = (action._localRoot || this._root).uuid; + delete actionByRoot[rootUuid]; + if (knownActionsForClip.length === 0) { + delete actionsByClip[clipUuid]; } - return Promise.all(pending); + this._removeInactiveBindingsForAction(action); } -} -class GLTFMaterialsVolumeExtension { - static { - __name(this, "GLTFMaterialsVolumeExtension"); + _removeInactiveBindingsForAction(action) { + const bindings = action._propertyBindings; + for (let i = 0, n = bindings.length; i !== n; ++i) { + const binding = bindings[i]; + if (--binding.referenceCount === 0) { + this._removeInactiveBinding(binding); + } + } } - constructor(parser) { - this.parser = parser; - this.name = EXTENSIONS.KHR_MATERIALS_VOLUME; + _lendAction(action) { + const actions = this._actions, prevIndex = action._cacheIndex, lastActiveIndex = this._nActiveActions++, firstInactiveAction = actions[lastActiveIndex]; + action._cacheIndex = lastActiveIndex; + actions[lastActiveIndex] = action; + firstInactiveAction._cacheIndex = prevIndex; + actions[prevIndex] = firstInactiveAction; } - getMaterialType(materialIndex) { - const parser = this.parser; - const materialDef = parser.json.materials[materialIndex]; - if (!materialDef.extensions || !materialDef.extensions[this.name]) return null; - return MeshPhysicalMaterial; + _takeBackAction(action) { + const actions = this._actions, prevIndex = action._cacheIndex, firstInactiveIndex = --this._nActiveActions, lastActiveAction = actions[firstInactiveIndex]; + action._cacheIndex = firstInactiveIndex; + actions[firstInactiveIndex] = action; + lastActiveAction._cacheIndex = prevIndex; + actions[prevIndex] = lastActiveAction; } - extendMaterialParams(materialIndex, materialParams) { - const parser = this.parser; - const materialDef = parser.json.materials[materialIndex]; - if (!materialDef.extensions || !materialDef.extensions[this.name]) { - return Promise.resolve(); - } - const pending = []; - const extension = materialDef.extensions[this.name]; - materialParams.thickness = extension.thicknessFactor !== void 0 ? extension.thicknessFactor : 0; - if (extension.thicknessTexture !== void 0) { - pending.push(parser.assignTexture(materialParams, "thicknessMap", extension.thicknessTexture)); + // Memory management for PropertyMixer objects + _addInactiveBinding(binding, rootUuid, trackName) { + const bindingsByRoot = this._bindingsByRootAndName, bindings = this._bindings; + let bindingByName = bindingsByRoot[rootUuid]; + if (bindingByName === void 0) { + bindingByName = {}; + bindingsByRoot[rootUuid] = bindingByName; } - materialParams.attenuationDistance = extension.attenuationDistance || Infinity; - const colorArray = extension.attenuationColor || [1, 1, 1]; - materialParams.attenuationColor = new Color().setRGB(colorArray[0], colorArray[1], colorArray[2], LinearSRGBColorSpace); - return Promise.all(pending); + bindingByName[trackName] = binding; + binding._cacheIndex = bindings.length; + bindings.push(binding); } -} -class GLTFMaterialsIorExtension { - static { - __name(this, "GLTFMaterialsIorExtension"); + _removeInactiveBinding(binding) { + const bindings = this._bindings, propBinding = binding.binding, rootUuid = propBinding.rootNode.uuid, trackName = propBinding.path, bindingsByRoot = this._bindingsByRootAndName, bindingByName = bindingsByRoot[rootUuid], lastInactiveBinding = bindings[bindings.length - 1], cacheIndex = binding._cacheIndex; + lastInactiveBinding._cacheIndex = cacheIndex; + bindings[cacheIndex] = lastInactiveBinding; + bindings.pop(); + delete bindingByName[trackName]; + if (Object.keys(bindingByName).length === 0) { + delete bindingsByRoot[rootUuid]; + } } - constructor(parser) { - this.parser = parser; - this.name = EXTENSIONS.KHR_MATERIALS_IOR; + _lendBinding(binding) { + const bindings = this._bindings, prevIndex = binding._cacheIndex, lastActiveIndex = this._nActiveBindings++, firstInactiveBinding = bindings[lastActiveIndex]; + binding._cacheIndex = lastActiveIndex; + bindings[lastActiveIndex] = binding; + firstInactiveBinding._cacheIndex = prevIndex; + bindings[prevIndex] = firstInactiveBinding; } - getMaterialType(materialIndex) { - const parser = this.parser; - const materialDef = parser.json.materials[materialIndex]; - if (!materialDef.extensions || !materialDef.extensions[this.name]) return null; - return MeshPhysicalMaterial; + _takeBackBinding(binding) { + const bindings = this._bindings, prevIndex = binding._cacheIndex, firstInactiveIndex = --this._nActiveBindings, lastActiveBinding = bindings[firstInactiveIndex]; + binding._cacheIndex = firstInactiveIndex; + bindings[firstInactiveIndex] = binding; + lastActiveBinding._cacheIndex = prevIndex; + bindings[prevIndex] = lastActiveBinding; } - extendMaterialParams(materialIndex, materialParams) { - const parser = this.parser; - const materialDef = parser.json.materials[materialIndex]; - if (!materialDef.extensions || !materialDef.extensions[this.name]) { - return Promise.resolve(); + // Memory management of Interpolants for weight and time scale + _lendControlInterpolant() { + const interpolants = this._controlInterpolants, lastActiveIndex = this._nActiveControlInterpolants++; + let interpolant = interpolants[lastActiveIndex]; + if (interpolant === void 0) { + interpolant = new LinearInterpolant( + new Float32Array(2), + new Float32Array(2), + 1, + _controlInterpolantsResultBuffer + ); + interpolant.__cacheIndex = lastActiveIndex; + interpolants[lastActiveIndex] = interpolant; } - const extension = materialDef.extensions[this.name]; - materialParams.ior = extension.ior !== void 0 ? extension.ior : 1.5; - return Promise.resolve(); + return interpolant; } -} -class GLTFMaterialsSpecularExtension { - static { - __name(this, "GLTFMaterialsSpecularExtension"); + _takeBackControlInterpolant(interpolant) { + const interpolants = this._controlInterpolants, prevIndex = interpolant.__cacheIndex, firstInactiveIndex = --this._nActiveControlInterpolants, lastActiveInterpolant = interpolants[firstInactiveIndex]; + interpolant.__cacheIndex = firstInactiveIndex; + interpolants[firstInactiveIndex] = interpolant; + lastActiveInterpolant.__cacheIndex = prevIndex; + interpolants[prevIndex] = lastActiveInterpolant; } - constructor(parser) { - this.parser = parser; - this.name = EXTENSIONS.KHR_MATERIALS_SPECULAR; + // return an action for a clip optionally using a custom root target + // object (this method allocates a lot of dynamic memory in case a + // previously unknown clip/root combination is specified) + clipAction(clip, optionalRoot, blendMode) { + const root = optionalRoot || this._root, rootUuid = root.uuid; + let clipObject = typeof clip === "string" ? AnimationClip.findByName(root, clip) : clip; + const clipUuid = clipObject !== null ? clipObject.uuid : clip; + const actionsForClip = this._actionsByClip[clipUuid]; + let prototypeAction = null; + if (blendMode === void 0) { + if (clipObject !== null) { + blendMode = clipObject.blendMode; + } else { + blendMode = NormalAnimationBlendMode; + } + } + if (actionsForClip !== void 0) { + const existingAction = actionsForClip.actionByRoot[rootUuid]; + if (existingAction !== void 0 && existingAction.blendMode === blendMode) { + return existingAction; + } + prototypeAction = actionsForClip.knownActions[0]; + if (clipObject === null) + clipObject = prototypeAction._clip; + } + if (clipObject === null) return null; + const newAction = new AnimationAction(this, clipObject, optionalRoot, blendMode); + this._bindAction(newAction, prototypeAction); + this._addInactiveAction(newAction, clipUuid, rootUuid); + return newAction; } - getMaterialType(materialIndex) { - const parser = this.parser; - const materialDef = parser.json.materials[materialIndex]; - if (!materialDef.extensions || !materialDef.extensions[this.name]) return null; - return MeshPhysicalMaterial; + // get an existing action + existingAction(clip, optionalRoot) { + const root = optionalRoot || this._root, rootUuid = root.uuid, clipObject = typeof clip === "string" ? AnimationClip.findByName(root, clip) : clip, clipUuid = clipObject ? clipObject.uuid : clip, actionsForClip = this._actionsByClip[clipUuid]; + if (actionsForClip !== void 0) { + return actionsForClip.actionByRoot[rootUuid] || null; + } + return null; } - extendMaterialParams(materialIndex, materialParams) { - const parser = this.parser; - const materialDef = parser.json.materials[materialIndex]; - if (!materialDef.extensions || !materialDef.extensions[this.name]) { - return Promise.resolve(); + // deactivates all previously scheduled actions + stopAllAction() { + const actions = this._actions, nActions = this._nActiveActions; + for (let i = nActions - 1; i >= 0; --i) { + actions[i].stop(); } - const pending = []; - const extension = materialDef.extensions[this.name]; - materialParams.specularIntensity = extension.specularFactor !== void 0 ? extension.specularFactor : 1; - if (extension.specularTexture !== void 0) { - pending.push(parser.assignTexture(materialParams, "specularIntensityMap", extension.specularTexture)); + return this; + } + // advance the time and update apply the animation + update(deltaTime) { + deltaTime *= this.timeScale; + const actions = this._actions, nActions = this._nActiveActions, time = this.time += deltaTime, timeDirection = Math.sign(deltaTime), accuIndex = this._accuIndex ^= 1; + for (let i = 0; i !== nActions; ++i) { + const action = actions[i]; + action._update(time, deltaTime, timeDirection, accuIndex); } - const colorArray = extension.specularColorFactor || [1, 1, 1]; - materialParams.specularColor = new Color().setRGB(colorArray[0], colorArray[1], colorArray[2], LinearSRGBColorSpace); - if (extension.specularColorTexture !== void 0) { - pending.push(parser.assignTexture(materialParams, "specularColorMap", extension.specularColorTexture, SRGBColorSpace)); + const bindings = this._bindings, nBindings = this._nActiveBindings; + for (let i = 0; i !== nBindings; ++i) { + bindings[i].apply(accuIndex); } - return Promise.all(pending); + return this; } -} -class GLTFMaterialsBumpExtension { - static { - __name(this, "GLTFMaterialsBumpExtension"); + // Allows you to seek to a specific time in an animation. + setTime(timeInSeconds) { + this.time = 0; + for (let i = 0; i < this._actions.length; i++) { + this._actions[i].time = 0; + } + return this.update(timeInSeconds); } - constructor(parser) { - this.parser = parser; - this.name = EXTENSIONS.EXT_MATERIALS_BUMP; + // return this mixer's root target object + getRoot() { + return this._root; } - getMaterialType(materialIndex) { - const parser = this.parser; - const materialDef = parser.json.materials[materialIndex]; - if (!materialDef.extensions || !materialDef.extensions[this.name]) return null; - return MeshPhysicalMaterial; + // free all resources specific to a particular clip + uncacheClip(clip) { + const actions = this._actions, clipUuid = clip.uuid, actionsByClip = this._actionsByClip, actionsForClip = actionsByClip[clipUuid]; + if (actionsForClip !== void 0) { + const actionsToRemove = actionsForClip.knownActions; + for (let i = 0, n = actionsToRemove.length; i !== n; ++i) { + const action = actionsToRemove[i]; + this._deactivateAction(action); + const cacheIndex = action._cacheIndex, lastInactiveAction = actions[actions.length - 1]; + action._cacheIndex = null; + action._byClipCacheIndex = null; + lastInactiveAction._cacheIndex = cacheIndex; + actions[cacheIndex] = lastInactiveAction; + actions.pop(); + this._removeInactiveBindingsForAction(action); + } + delete actionsByClip[clipUuid]; + } } - extendMaterialParams(materialIndex, materialParams) { - const parser = this.parser; - const materialDef = parser.json.materials[materialIndex]; - if (!materialDef.extensions || !materialDef.extensions[this.name]) { - return Promise.resolve(); + // free all resources specific to a particular root target object + uncacheRoot(root) { + const rootUuid = root.uuid, actionsByClip = this._actionsByClip; + for (const clipUuid in actionsByClip) { + const actionByRoot = actionsByClip[clipUuid].actionByRoot, action = actionByRoot[rootUuid]; + if (action !== void 0) { + this._deactivateAction(action); + this._removeInactiveAction(action); + } } - const pending = []; - const extension = materialDef.extensions[this.name]; - materialParams.bumpScale = extension.bumpFactor !== void 0 ? extension.bumpFactor : 1; - if (extension.bumpTexture !== void 0) { - pending.push(parser.assignTexture(materialParams, "bumpMap", extension.bumpTexture)); + const bindingsByRoot = this._bindingsByRootAndName, bindingByName = bindingsByRoot[rootUuid]; + if (bindingByName !== void 0) { + for (const trackName in bindingByName) { + const binding = bindingByName[trackName]; + binding.restoreOriginalState(); + this._removeInactiveBinding(binding); + } + } + } + // remove a targeted clip from the cache + uncacheAction(clip, optionalRoot) { + const action = this.existingAction(clip, optionalRoot); + if (action !== null) { + this._deactivateAction(action); + this._removeInactiveAction(action); } - return Promise.all(pending); } } -class GLTFMaterialsAnisotropyExtension { +class Uniform { static { - __name(this, "GLTFMaterialsAnisotropyExtension"); - } - constructor(parser) { - this.parser = parser; - this.name = EXTENSIONS.KHR_MATERIALS_ANISOTROPY; + __name(this, "Uniform"); } - getMaterialType(materialIndex) { - const parser = this.parser; - const materialDef = parser.json.materials[materialIndex]; - if (!materialDef.extensions || !materialDef.extensions[this.name]) return null; - return MeshPhysicalMaterial; + constructor(value) { + this.value = value; } - extendMaterialParams(materialIndex, materialParams) { - const parser = this.parser; - const materialDef = parser.json.materials[materialIndex]; - if (!materialDef.extensions || !materialDef.extensions[this.name]) { - return Promise.resolve(); - } - const pending = []; - const extension = materialDef.extensions[this.name]; - if (extension.anisotropyStrength !== void 0) { - materialParams.anisotropy = extension.anisotropyStrength; - } - if (extension.anisotropyRotation !== void 0) { - materialParams.anisotropyRotation = extension.anisotropyRotation; - } - if (extension.anisotropyTexture !== void 0) { - pending.push(parser.assignTexture(materialParams, "anisotropyMap", extension.anisotropyTexture)); - } - return Promise.all(pending); + clone() { + return new Uniform(this.value.clone === void 0 ? this.value : this.value.clone()); } } -class GLTFTextureBasisUExtension { +let _id = 0; +class UniformsGroup extends EventDispatcher { static { - __name(this, "GLTFTextureBasisUExtension"); + __name(this, "UniformsGroup"); } - constructor(parser) { - this.parser = parser; - this.name = EXTENSIONS.KHR_TEXTURE_BASISU; + constructor() { + super(); + this.isUniformsGroup = true; + Object.defineProperty(this, "id", { value: _id++ }); + this.name = ""; + this.usage = StaticDrawUsage; + this.uniforms = []; } - loadTexture(textureIndex) { - const parser = this.parser; - const json = parser.json; - const textureDef = json.textures[textureIndex]; - if (!textureDef.extensions || !textureDef.extensions[this.name]) { - return null; - } - const extension = textureDef.extensions[this.name]; - const loader = parser.options.ktx2Loader; - if (!loader) { - if (json.extensionsRequired && json.extensionsRequired.indexOf(this.name) >= 0) { - throw new Error("THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures"); - } else { - return null; + add(uniform) { + this.uniforms.push(uniform); + return this; + } + remove(uniform) { + const index = this.uniforms.indexOf(uniform); + if (index !== -1) this.uniforms.splice(index, 1); + return this; + } + setName(name) { + this.name = name; + return this; + } + setUsage(value) { + this.usage = value; + return this; + } + dispose() { + this.dispatchEvent({ type: "dispose" }); + return this; + } + copy(source) { + this.name = source.name; + this.usage = source.usage; + const uniformsSource = source.uniforms; + this.uniforms.length = 0; + for (let i = 0, l = uniformsSource.length; i < l; i++) { + const uniforms = Array.isArray(uniformsSource[i]) ? uniformsSource[i] : [uniformsSource[i]]; + for (let j = 0; j < uniforms.length; j++) { + this.uniforms.push(uniforms[j].clone()); } } - return parser.loadTextureImage(textureIndex, extension.source, loader); + return this; + } + clone() { + return new this.constructor().copy(this); } } -class GLTFTextureWebPExtension { +class InstancedInterleavedBuffer extends InterleavedBuffer { static { - __name(this, "GLTFTextureWebPExtension"); + __name(this, "InstancedInterleavedBuffer"); } - constructor(parser) { - this.parser = parser; - this.name = EXTENSIONS.EXT_TEXTURE_WEBP; - this.isSupported = null; + constructor(array, stride, meshPerAttribute = 1) { + super(array, stride); + this.isInstancedInterleavedBuffer = true; + this.meshPerAttribute = meshPerAttribute; } - loadTexture(textureIndex) { - const name = this.name; - const parser = this.parser; - const json = parser.json; - const textureDef = json.textures[textureIndex]; - if (!textureDef.extensions || !textureDef.extensions[name]) { - return null; - } - const extension = textureDef.extensions[name]; - const source = json.images[extension.source]; - let loader = parser.textureLoader; - if (source.uri) { - const handler = parser.options.manager.getHandler(source.uri); - if (handler !== null) loader = handler; - } - return this.detectSupport().then(function(isSupported) { - if (isSupported) return parser.loadTextureImage(textureIndex, extension.source, loader); - if (json.extensionsRequired && json.extensionsRequired.indexOf(name) >= 0) { - throw new Error("THREE.GLTFLoader: WebP required by asset but unsupported."); - } - return parser.loadTexture(textureIndex); - }); + copy(source) { + super.copy(source); + this.meshPerAttribute = source.meshPerAttribute; + return this; } - detectSupport() { - if (!this.isSupported) { - this.isSupported = new Promise(function(resolve) { - const image = new Image(); - image.src = "data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA"; - image.onload = image.onerror = function() { - resolve(image.height === 1); - }; - }); - } - return this.isSupported; + clone(data) { + const ib = super.clone(data); + ib.meshPerAttribute = this.meshPerAttribute; + return ib; + } + toJSON(data) { + const json = super.toJSON(data); + json.isInstancedInterleavedBuffer = true; + json.meshPerAttribute = this.meshPerAttribute; + return json; } } -class GLTFTextureAVIFExtension { +class GLBufferAttribute { static { - __name(this, "GLTFTextureAVIFExtension"); + __name(this, "GLBufferAttribute"); } - constructor(parser) { - this.parser = parser; - this.name = EXTENSIONS.EXT_TEXTURE_AVIF; - this.isSupported = null; + constructor(buffer, type, itemSize, elementSize, count) { + this.isGLBufferAttribute = true; + this.name = ""; + this.buffer = buffer; + this.type = type; + this.itemSize = itemSize; + this.elementSize = elementSize; + this.count = count; + this.version = 0; } - loadTexture(textureIndex) { - const name = this.name; - const parser = this.parser; - const json = parser.json; - const textureDef = json.textures[textureIndex]; - if (!textureDef.extensions || !textureDef.extensions[name]) { - return null; - } - const extension = textureDef.extensions[name]; - const source = json.images[extension.source]; - let loader = parser.textureLoader; - if (source.uri) { - const handler = parser.options.manager.getHandler(source.uri); - if (handler !== null) loader = handler; - } - return this.detectSupport().then(function(isSupported) { - if (isSupported) return parser.loadTextureImage(textureIndex, extension.source, loader); - if (json.extensionsRequired && json.extensionsRequired.indexOf(name) >= 0) { - throw new Error("THREE.GLTFLoader: AVIF required by asset but unsupported."); - } - return parser.loadTexture(textureIndex); - }); + set needsUpdate(value) { + if (value === true) this.version++; } - detectSupport() { - if (!this.isSupported) { - this.isSupported = new Promise(function(resolve) { - const image = new Image(); - image.src = "data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAABcAAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAEAAAABAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQAMAAAAABNjb2xybmNseAACAAIABoAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAAB9tZGF0EgAKCBgABogQEDQgMgkQAAAAB8dSLfI="; - image.onload = image.onerror = function() { - resolve(image.height === 1); - }; - }); - } - return this.isSupported; + setBuffer(buffer) { + this.buffer = buffer; + return this; + } + setType(type, elementSize) { + this.type = type; + this.elementSize = elementSize; + return this; + } + setItemSize(itemSize) { + this.itemSize = itemSize; + return this; + } + setCount(count) { + this.count = count; + return this; } } -class GLTFMeshoptCompression { +const _matrix = /* @__PURE__ */ new Matrix4(); +class Raycaster { static { - __name(this, "GLTFMeshoptCompression"); + __name(this, "Raycaster"); } - constructor(parser) { - this.name = EXTENSIONS.EXT_MESHOPT_COMPRESSION; - this.parser = parser; + constructor(origin, direction, near = 0, far = Infinity) { + this.ray = new Ray(origin, direction); + this.near = near; + this.far = far; + this.camera = null; + this.layers = new Layers(); + this.params = { + Mesh: {}, + Line: { threshold: 1 }, + LOD: {}, + Points: { threshold: 1 }, + Sprite: {} + }; } - loadBufferView(index) { - const json = this.parser.json; - const bufferView = json.bufferViews[index]; - if (bufferView.extensions && bufferView.extensions[this.name]) { - const extensionDef = bufferView.extensions[this.name]; - const buffer = this.parser.getDependency("buffer", extensionDef.buffer); - const decoder = this.parser.options.meshoptDecoder; - if (!decoder || !decoder.supported) { - if (json.extensionsRequired && json.extensionsRequired.indexOf(this.name) >= 0) { - throw new Error("THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files"); - } else { - return null; - } - } - return buffer.then(function(res) { - const byteOffset = extensionDef.byteOffset || 0; - const byteLength = extensionDef.byteLength || 0; - const count = extensionDef.count; - const stride = extensionDef.byteStride; - const source = new Uint8Array(res, byteOffset, byteLength); - if (decoder.decodeGltfBufferAsync) { - return decoder.decodeGltfBufferAsync(count, stride, source, extensionDef.mode, extensionDef.filter).then(function(res2) { - return res2.buffer; - }); - } else { - return decoder.ready.then(function() { - const result = new ArrayBuffer(count * stride); - decoder.decodeGltfBuffer(new Uint8Array(result), count, stride, source, extensionDef.mode, extensionDef.filter); - return result; - }); - } - }); + set(origin, direction) { + this.ray.set(origin, direction); + } + setFromCamera(coords, camera) { + if (camera.isPerspectiveCamera) { + this.ray.origin.setFromMatrixPosition(camera.matrixWorld); + this.ray.direction.set(coords.x, coords.y, 0.5).unproject(camera).sub(this.ray.origin).normalize(); + this.camera = camera; + } else if (camera.isOrthographicCamera) { + this.ray.origin.set(coords.x, coords.y, (camera.near + camera.far) / (camera.near - camera.far)).unproject(camera); + this.ray.direction.set(0, 0, -1).transformDirection(camera.matrixWorld); + this.camera = camera; } else { - return null; + console.error("THREE.Raycaster: Unsupported camera type: " + camera.type); } } -} -class GLTFMeshGpuInstancing { - static { - __name(this, "GLTFMeshGpuInstancing"); + setFromXRController(controller) { + _matrix.identity().extractRotation(controller.matrixWorld); + this.ray.origin.setFromMatrixPosition(controller.matrixWorld); + this.ray.direction.set(0, 0, -1).applyMatrix4(_matrix); + return this; } - constructor(parser) { - this.name = EXTENSIONS.EXT_MESH_GPU_INSTANCING; - this.parser = parser; + intersectObject(object, recursive = true, intersects2 = []) { + intersect(object, this, intersects2, recursive); + intersects2.sort(ascSort); + return intersects2; } - createNodeMesh(nodeIndex) { - const json = this.parser.json; - const nodeDef = json.nodes[nodeIndex]; - if (!nodeDef.extensions || !nodeDef.extensions[this.name] || nodeDef.mesh === void 0) { - return null; - } - const meshDef = json.meshes[nodeDef.mesh]; - for (const primitive of meshDef.primitives) { - if (primitive.mode !== WEBGL_CONSTANTS.TRIANGLES && primitive.mode !== WEBGL_CONSTANTS.TRIANGLE_STRIP && primitive.mode !== WEBGL_CONSTANTS.TRIANGLE_FAN && primitive.mode !== void 0) { - return null; - } - } - const extensionDef = nodeDef.extensions[this.name]; - const attributesDef = extensionDef.attributes; - const pending = []; - const attributes = {}; - for (const key in attributesDef) { - pending.push(this.parser.getDependency("accessor", attributesDef[key]).then((accessor) => { - attributes[key] = accessor; - return attributes[key]; - })); - } - if (pending.length < 1) { - return null; + intersectObjects(objects, recursive = true, intersects2 = []) { + for (let i = 0, l = objects.length; i < l; i++) { + intersect(objects[i], this, intersects2, recursive); } - pending.push(this.parser.createNodeMesh(nodeIndex)); - return Promise.all(pending).then((results) => { - const nodeObject = results.pop(); - const meshes = nodeObject.isGroup ? nodeObject.children : [nodeObject]; - const count = results[0].count; - const instancedMeshes = []; - for (const mesh of meshes) { - const m = new Matrix4(); - const p = new Vector3(); - const q = new Quaternion(); - const s = new Vector3(1, 1, 1); - const instancedMesh = new InstancedMesh(mesh.geometry, mesh.material, count); - for (let i = 0; i < count; i++) { - if (attributes.TRANSLATION) { - p.fromBufferAttribute(attributes.TRANSLATION, i); - } - if (attributes.ROTATION) { - q.fromBufferAttribute(attributes.ROTATION, i); - } - if (attributes.SCALE) { - s.fromBufferAttribute(attributes.SCALE, i); - } - instancedMesh.setMatrixAt(i, m.compose(p, q, s)); - } - for (const attributeName in attributes) { - if (attributeName === "_COLOR_0") { - const attr = attributes[attributeName]; - instancedMesh.instanceColor = new InstancedBufferAttribute(attr.array, attr.itemSize, attr.normalized); - } else if (attributeName !== "TRANSLATION" && attributeName !== "ROTATION" && attributeName !== "SCALE") { - mesh.geometry.setAttribute(attributeName, attributes[attributeName]); - } - } - Object3D.prototype.copy.call(instancedMesh, mesh); - this.parser.assignFinalMaterial(instancedMesh); - instancedMeshes.push(instancedMesh); - } - if (nodeObject.isGroup) { - nodeObject.clear(); - nodeObject.add(...instancedMeshes); - return nodeObject; - } - return instancedMeshes[0]; - }); + intersects2.sort(ascSort); + return intersects2; } } -const BINARY_EXTENSION_HEADER_MAGIC = "glTF"; -const BINARY_EXTENSION_HEADER_LENGTH = 12; -const BINARY_EXTENSION_CHUNK_TYPES = { JSON: 1313821514, BIN: 5130562 }; -class GLTFBinaryExtension { - static { - __name(this, "GLTFBinaryExtension"); +function ascSort(a, b) { + return a.distance - b.distance; +} +__name(ascSort, "ascSort"); +function intersect(object, raycaster, intersects2, recursive) { + let propagate = true; + if (object.layers.test(raycaster.layers)) { + const result = object.raycast(raycaster, intersects2); + if (result === false) propagate = false; } - constructor(data) { - this.name = EXTENSIONS.KHR_BINARY_GLTF; - this.content = null; - this.body = null; - const headerView = new DataView(data, 0, BINARY_EXTENSION_HEADER_LENGTH); - const textDecoder = new TextDecoder(); - this.header = { - magic: textDecoder.decode(new Uint8Array(data.slice(0, 4))), - version: headerView.getUint32(4, true), - length: headerView.getUint32(8, true) - }; - if (this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC) { - throw new Error("THREE.GLTFLoader: Unsupported glTF-Binary header."); - } else if (this.header.version < 2) { - throw new Error("THREE.GLTFLoader: Legacy binary file detected."); - } - const chunkContentsLength = this.header.length - BINARY_EXTENSION_HEADER_LENGTH; - const chunkView = new DataView(data, BINARY_EXTENSION_HEADER_LENGTH); - let chunkIndex = 0; - while (chunkIndex < chunkContentsLength) { - const chunkLength = chunkView.getUint32(chunkIndex, true); - chunkIndex += 4; - const chunkType = chunkView.getUint32(chunkIndex, true); - chunkIndex += 4; - if (chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON) { - const contentArray = new Uint8Array(data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength); - this.content = textDecoder.decode(contentArray); - } else if (chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN) { - const byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex; - this.body = data.slice(byteOffset, byteOffset + chunkLength); - } - chunkIndex += chunkLength; - } - if (this.content === null) { - throw new Error("THREE.GLTFLoader: JSON content not found."); + if (propagate === true && recursive === true) { + const children = object.children; + for (let i = 0, l = children.length; i < l; i++) { + intersect(children[i], raycaster, intersects2, true); } } } -class GLTFDracoMeshCompressionExtension { +__name(intersect, "intersect"); +class Spherical { static { - __name(this, "GLTFDracoMeshCompressionExtension"); + __name(this, "Spherical"); } - constructor(json, dracoLoader) { - if (!dracoLoader) { - throw new Error("THREE.GLTFLoader: No DRACOLoader instance provided."); - } - this.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION; - this.json = json; - this.dracoLoader = dracoLoader; - this.dracoLoader.preload(); + constructor(radius = 1, phi = 0, theta = 0) { + this.radius = radius; + this.phi = phi; + this.theta = theta; + return this; } - decodePrimitive(primitive, parser) { - const json = this.json; - const dracoLoader = this.dracoLoader; - const bufferViewIndex = primitive.extensions[this.name].bufferView; - const gltfAttributeMap = primitive.extensions[this.name].attributes; - const threeAttributeMap = {}; - const attributeNormalizedMap = {}; - const attributeTypeMap = {}; - for (const attributeName in gltfAttributeMap) { - const threeAttributeName = ATTRIBUTES[attributeName] || attributeName.toLowerCase(); - threeAttributeMap[threeAttributeName] = gltfAttributeMap[attributeName]; - } - for (const attributeName in primitive.attributes) { - const threeAttributeName = ATTRIBUTES[attributeName] || attributeName.toLowerCase(); - if (gltfAttributeMap[attributeName] !== void 0) { - const accessorDef = json.accessors[primitive.attributes[attributeName]]; - const componentType = WEBGL_COMPONENT_TYPES[accessorDef.componentType]; - attributeTypeMap[threeAttributeName] = componentType.name; - attributeNormalizedMap[threeAttributeName] = accessorDef.normalized === true; - } - } - return parser.getDependency("bufferView", bufferViewIndex).then(function(bufferView) { - return new Promise(function(resolve, reject) { - dracoLoader.decodeDracoFile(bufferView, function(geometry) { - for (const attributeName in geometry.attributes) { - const attribute = geometry.attributes[attributeName]; - const normalized = attributeNormalizedMap[attributeName]; - if (normalized !== void 0) attribute.normalized = normalized; - } - resolve(geometry); - }, threeAttributeMap, attributeTypeMap, LinearSRGBColorSpace, reject); - }); - }); + set(radius, phi, theta) { + this.radius = radius; + this.phi = phi; + this.theta = theta; + return this; } -} -class GLTFTextureTransformExtension { - static { - __name(this, "GLTFTextureTransformExtension"); + copy(other) { + this.radius = other.radius; + this.phi = other.phi; + this.theta = other.theta; + return this; + } + // restrict phi to be between EPS and PI-EPS + makeSafe() { + const EPS = 1e-6; + this.phi = Math.max(EPS, Math.min(Math.PI - EPS, this.phi)); + return this; } - constructor() { - this.name = EXTENSIONS.KHR_TEXTURE_TRANSFORM; + setFromVector3(v) { + return this.setFromCartesianCoords(v.x, v.y, v.z); } - extendTexture(texture, transform) { - if ((transform.texCoord === void 0 || transform.texCoord === texture.channel) && transform.offset === void 0 && transform.rotation === void 0 && transform.scale === void 0) { - return texture; - } - texture = texture.clone(); - if (transform.texCoord !== void 0) { - texture.channel = transform.texCoord; - } - if (transform.offset !== void 0) { - texture.offset.fromArray(transform.offset); - } - if (transform.rotation !== void 0) { - texture.rotation = transform.rotation; - } - if (transform.scale !== void 0) { - texture.repeat.fromArray(transform.scale); + setFromCartesianCoords(x, y, z) { + this.radius = Math.sqrt(x * x + y * y + z * z); + if (this.radius === 0) { + this.theta = 0; + this.phi = 0; + } else { + this.theta = Math.atan2(x, z); + this.phi = Math.acos(clamp(y / this.radius, -1, 1)); } - texture.needsUpdate = true; - return texture; + return this; + } + clone() { + return new this.constructor().copy(this); } } -class GLTFMeshQuantizationExtension { +class Cylindrical { static { - __name(this, "GLTFMeshQuantizationExtension"); + __name(this, "Cylindrical"); } - constructor() { - this.name = EXTENSIONS.KHR_MESH_QUANTIZATION; + constructor(radius = 1, theta = 0, y = 0) { + this.radius = radius; + this.theta = theta; + this.y = y; + return this; + } + set(radius, theta, y) { + this.radius = radius; + this.theta = theta; + this.y = y; + return this; + } + copy(other) { + this.radius = other.radius; + this.theta = other.theta; + this.y = other.y; + return this; + } + setFromVector3(v) { + return this.setFromCartesianCoords(v.x, v.y, v.z); + } + setFromCartesianCoords(x, y, z) { + this.radius = Math.sqrt(x * x + z * z); + this.theta = Math.atan2(x, z); + this.y = y; + return this; + } + clone() { + return new this.constructor().copy(this); } } -class GLTFCubicSplineInterpolant extends Interpolant { +class Matrix2 { static { - __name(this, "GLTFCubicSplineInterpolant"); - } - constructor(parameterPositions, sampleValues, sampleSize, resultBuffer) { - super(parameterPositions, sampleValues, sampleSize, resultBuffer); + __name(this, "Matrix2"); } - copySampleValue_(index) { - const result = this.resultBuffer, values = this.sampleValues, valueSize = this.valueSize, offset = index * valueSize * 3 + valueSize; - for (let i = 0; i !== valueSize; i++) { - result[i] = values[offset + i]; + constructor(n11, n12, n21, n22) { + Matrix2.prototype.isMatrix2 = true; + this.elements = [ + 1, + 0, + 0, + 1 + ]; + if (n11 !== void 0) { + this.set(n11, n12, n21, n22); } - return result; } - interpolate_(i1, t0, t2, t1) { - const result = this.resultBuffer; - const values = this.sampleValues; - const stride = this.valueSize; - const stride2 = stride * 2; - const stride3 = stride * 3; - const td2 = t1 - t0; - const p = (t2 - t0) / td2; - const pp = p * p; - const ppp = pp * p; - const offset1 = i1 * stride3; - const offset0 = offset1 - stride3; - const s2 = -2 * ppp + 3 * pp; - const s3 = ppp - pp; - const s0 = 1 - s2; - const s1 = s3 - pp + p; - for (let i = 0; i !== stride; i++) { - const p0 = values[offset0 + i + stride]; - const m0 = values[offset0 + i + stride2] * td2; - const p1 = values[offset1 + i + stride]; - const m1 = values[offset1 + i] * td2; - result[i] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1; + identity() { + this.set( + 1, + 0, + 0, + 1 + ); + return this; + } + fromArray(array, offset = 0) { + for (let i = 0; i < 4; i++) { + this.elements[i] = array[i + offset]; } - return result; + return this; + } + set(n11, n12, n21, n22) { + const te2 = this.elements; + te2[0] = n11; + te2[2] = n12; + te2[1] = n21; + te2[3] = n22; + return this; } } -const _q = new Quaternion(); -class GLTFCubicSplineQuaternionInterpolant extends GLTFCubicSplineInterpolant { +const _vector$4 = /* @__PURE__ */ new Vector2(); +class Box2 { static { - __name(this, "GLTFCubicSplineQuaternionInterpolant"); + __name(this, "Box2"); } - interpolate_(i1, t0, t2, t1) { - const result = super.interpolate_(i1, t0, t2, t1); - _q.fromArray(result).normalize().toArray(result); - return result; + constructor(min = new Vector2(Infinity, Infinity), max2 = new Vector2(-Infinity, -Infinity)) { + this.isBox2 = true; + this.min = min; + this.max = max2; } -} -const WEBGL_CONSTANTS = { - FLOAT: 5126, - //FLOAT_MAT2: 35674, - FLOAT_MAT3: 35675, - FLOAT_MAT4: 35676, - FLOAT_VEC2: 35664, - FLOAT_VEC3: 35665, - FLOAT_VEC4: 35666, - LINEAR: 9729, - REPEAT: 10497, - SAMPLER_2D: 35678, - POINTS: 0, - LINES: 1, - LINE_LOOP: 2, - LINE_STRIP: 3, - TRIANGLES: 4, - TRIANGLE_STRIP: 5, - TRIANGLE_FAN: 6, - UNSIGNED_BYTE: 5121, - UNSIGNED_SHORT: 5123 -}; -const WEBGL_COMPONENT_TYPES = { - 5120: Int8Array, - 5121: Uint8Array, - 5122: Int16Array, - 5123: Uint16Array, - 5125: Uint32Array, - 5126: Float32Array -}; -const WEBGL_FILTERS = { - 9728: NearestFilter, - 9729: LinearFilter, - 9984: NearestMipmapNearestFilter, - 9985: LinearMipmapNearestFilter, - 9986: NearestMipmapLinearFilter, - 9987: LinearMipmapLinearFilter -}; -const WEBGL_WRAPPINGS = { - 33071: ClampToEdgeWrapping, - 33648: MirroredRepeatWrapping, - 10497: RepeatWrapping -}; -const WEBGL_TYPE_SIZES = { - "SCALAR": 1, - "VEC2": 2, - "VEC3": 3, - "VEC4": 4, - "MAT2": 4, - "MAT3": 9, - "MAT4": 16 -}; -const ATTRIBUTES = { - POSITION: "position", - NORMAL: "normal", - TANGENT: "tangent", - TEXCOORD_0: "uv", - TEXCOORD_1: "uv1", - TEXCOORD_2: "uv2", - TEXCOORD_3: "uv3", - COLOR_0: "color", - WEIGHTS_0: "skinWeight", - JOINTS_0: "skinIndex" -}; -const PATH_PROPERTIES = { - scale: "scale", - translation: "position", - rotation: "quaternion", - weights: "morphTargetInfluences" -}; -const INTERPOLATION = { - CUBICSPLINE: void 0, - // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each - // keyframe track will be initialized with a default interpolation type, then modified. - LINEAR: InterpolateLinear, - STEP: InterpolateDiscrete -}; -const ALPHA_MODES = { - OPAQUE: "OPAQUE", - MASK: "MASK", - BLEND: "BLEND" -}; -function createDefaultMaterial(cache) { - if (cache["DefaultMaterial"] === void 0) { - cache["DefaultMaterial"] = new MeshStandardMaterial({ - color: 16777215, - emissive: 0, - metalness: 1, - roughness: 1, - transparent: false, - depthTest: true, - side: FrontSide - }); + set(min, max2) { + this.min.copy(min); + this.max.copy(max2); + return this; } - return cache["DefaultMaterial"]; -} -__name(createDefaultMaterial, "createDefaultMaterial"); -function addUnknownExtensionsToUserData(knownExtensions, object, objectDef) { - for (const name in objectDef.extensions) { - if (knownExtensions[name] === void 0) { - object.userData.gltfExtensions = object.userData.gltfExtensions || {}; - object.userData.gltfExtensions[name] = objectDef.extensions[name]; + setFromPoints(points) { + this.makeEmpty(); + for (let i = 0, il = points.length; i < il; i++) { + this.expandByPoint(points[i]); } + return this; } -} -__name(addUnknownExtensionsToUserData, "addUnknownExtensionsToUserData"); -function assignExtrasToUserData(object, gltfDef) { - if (gltfDef.extras !== void 0) { - if (typeof gltfDef.extras === "object") { - Object.assign(object.userData, gltfDef.extras); - } else { - console.warn("THREE.GLTFLoader: Ignoring primitive type .extras, " + gltfDef.extras); - } + setFromCenterAndSize(center, size) { + const halfSize = _vector$4.copy(size).multiplyScalar(0.5); + this.min.copy(center).sub(halfSize); + this.max.copy(center).add(halfSize); + return this; } -} -__name(assignExtrasToUserData, "assignExtrasToUserData"); -function addMorphTargets(geometry, targets, parser) { - let hasMorphPosition = false; - let hasMorphNormal = false; - let hasMorphColor = false; - for (let i = 0, il = targets.length; i < il; i++) { - const target = targets[i]; - if (target.POSITION !== void 0) hasMorphPosition = true; - if (target.NORMAL !== void 0) hasMorphNormal = true; - if (target.COLOR_0 !== void 0) hasMorphColor = true; - if (hasMorphPosition && hasMorphNormal && hasMorphColor) break; + clone() { + return new this.constructor().copy(this); } - if (!hasMorphPosition && !hasMorphNormal && !hasMorphColor) return Promise.resolve(geometry); - const pendingPositionAccessors = []; - const pendingNormalAccessors = []; - const pendingColorAccessors = []; - for (let i = 0, il = targets.length; i < il; i++) { - const target = targets[i]; - if (hasMorphPosition) { - const pendingAccessor = target.POSITION !== void 0 ? parser.getDependency("accessor", target.POSITION) : geometry.attributes.position; - pendingPositionAccessors.push(pendingAccessor); - } - if (hasMorphNormal) { - const pendingAccessor = target.NORMAL !== void 0 ? parser.getDependency("accessor", target.NORMAL) : geometry.attributes.normal; - pendingNormalAccessors.push(pendingAccessor); - } - if (hasMorphColor) { - const pendingAccessor = target.COLOR_0 !== void 0 ? parser.getDependency("accessor", target.COLOR_0) : geometry.attributes.color; - pendingColorAccessors.push(pendingAccessor); - } + copy(box) { + this.min.copy(box.min); + this.max.copy(box.max); + return this; } - return Promise.all([ - Promise.all(pendingPositionAccessors), - Promise.all(pendingNormalAccessors), - Promise.all(pendingColorAccessors) - ]).then(function(accessors) { - const morphPositions = accessors[0]; - const morphNormals = accessors[1]; - const morphColors = accessors[2]; - if (hasMorphPosition) geometry.morphAttributes.position = morphPositions; - if (hasMorphNormal) geometry.morphAttributes.normal = morphNormals; - if (hasMorphColor) geometry.morphAttributes.color = morphColors; - geometry.morphTargetsRelative = true; - return geometry; - }); -} -__name(addMorphTargets, "addMorphTargets"); -function updateMorphTargets(mesh, meshDef) { - mesh.updateMorphTargets(); - if (meshDef.weights !== void 0) { - for (let i = 0, il = meshDef.weights.length; i < il; i++) { - mesh.morphTargetInfluences[i] = meshDef.weights[i]; - } + makeEmpty() { + this.min.x = this.min.y = Infinity; + this.max.x = this.max.y = -Infinity; + return this; } - if (meshDef.extras && Array.isArray(meshDef.extras.targetNames)) { - const targetNames = meshDef.extras.targetNames; - if (mesh.morphTargetInfluences.length === targetNames.length) { - mesh.morphTargetDictionary = {}; - for (let i = 0, il = targetNames.length; i < il; i++) { - mesh.morphTargetDictionary[targetNames[i]] = i; - } - } else { - console.warn("THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names."); - } + isEmpty() { + return this.max.x < this.min.x || this.max.y < this.min.y; } -} -__name(updateMorphTargets, "updateMorphTargets"); -function createPrimitiveKey(primitiveDef) { - let geometryKey; - const dracoExtension = primitiveDef.extensions && primitiveDef.extensions[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION]; - if (dracoExtension) { - geometryKey = "draco:" + dracoExtension.bufferView + ":" + dracoExtension.indices + ":" + createAttributesKey(dracoExtension.attributes); - } else { - geometryKey = primitiveDef.indices + ":" + createAttributesKey(primitiveDef.attributes) + ":" + primitiveDef.mode; + getCenter(target) { + return this.isEmpty() ? target.set(0, 0) : target.addVectors(this.min, this.max).multiplyScalar(0.5); } - if (primitiveDef.targets !== void 0) { - for (let i = 0, il = primitiveDef.targets.length; i < il; i++) { - geometryKey += ":" + createAttributesKey(primitiveDef.targets[i]); - } + getSize(target) { + return this.isEmpty() ? target.set(0, 0) : target.subVectors(this.max, this.min); } - return geometryKey; -} -__name(createPrimitiveKey, "createPrimitiveKey"); -function createAttributesKey(attributes) { - let attributesKey = ""; - const keys = Object.keys(attributes).sort(); - for (let i = 0, il = keys.length; i < il; i++) { - attributesKey += keys[i] + ":" + attributes[keys[i]] + ";"; + expandByPoint(point) { + this.min.min(point); + this.max.max(point); + return this; } - return attributesKey; -} -__name(createAttributesKey, "createAttributesKey"); -function getNormalizedComponentScale(constructor) { - switch (constructor) { - case Int8Array: - return 1 / 127; - case Uint8Array: - return 1 / 255; - case Int16Array: - return 1 / 32767; - case Uint16Array: - return 1 / 65535; - default: - throw new Error("THREE.GLTFLoader: Unsupported normalized accessor component type."); + expandByVector(vector) { + this.min.sub(vector); + this.max.add(vector); + return this; } -} -__name(getNormalizedComponentScale, "getNormalizedComponentScale"); -function getImageURIMimeType(uri) { - if (uri.search(/\.jpe?g($|\?)/i) > 0 || uri.search(/^data\:image\/jpeg/) === 0) return "image/jpeg"; - if (uri.search(/\.webp($|\?)/i) > 0 || uri.search(/^data\:image\/webp/) === 0) return "image/webp"; - if (uri.search(/\.ktx2($|\?)/i) > 0 || uri.search(/^data\:image\/ktx2/) === 0) return "image/ktx2"; - return "image/png"; -} -__name(getImageURIMimeType, "getImageURIMimeType"); -const _identityMatrix = new Matrix4(); -class GLTFParser { - static { - __name(this, "GLTFParser"); + expandByScalar(scalar) { + this.min.addScalar(-scalar); + this.max.addScalar(scalar); + return this; } - constructor(json = {}, options = {}) { - this.json = json; - this.extensions = {}; - this.plugins = {}; - this.options = options; - this.cache = new GLTFRegistry(); - this.associations = /* @__PURE__ */ new Map(); - this.primitiveCache = {}; - this.nodeCache = {}; - this.meshCache = { refs: {}, uses: {} }; - this.cameraCache = { refs: {}, uses: {} }; - this.lightCache = { refs: {}, uses: {} }; - this.sourceCache = {}; - this.textureCache = {}; - this.nodeNamesUsed = {}; - let isSafari = false; - let safariVersion = -1; - let isFirefox = false; - let firefoxVersion = -1; - if (typeof navigator !== "undefined") { - const userAgent = navigator.userAgent; - isSafari = /^((?!chrome|android).)*safari/i.test(userAgent) === true; - const safariMatch = userAgent.match(/Version\/(\d+)/); - safariVersion = isSafari && safariMatch ? parseInt(safariMatch[1], 10) : -1; - isFirefox = userAgent.indexOf("Firefox") > -1; - firefoxVersion = isFirefox ? userAgent.match(/Firefox\/([0-9]+)\./)[1] : -1; - } - if (typeof createImageBitmap === "undefined" || isSafari && safariVersion < 17 || isFirefox && firefoxVersion < 98) { - this.textureLoader = new TextureLoader(this.options.manager); - } else { - this.textureLoader = new ImageBitmapLoader(this.options.manager); - } - this.textureLoader.setCrossOrigin(this.options.crossOrigin); - this.textureLoader.setRequestHeader(this.options.requestHeader); - this.fileLoader = new FileLoader(this.options.manager); - this.fileLoader.setResponseType("arraybuffer"); - if (this.options.crossOrigin === "use-credentials") { - this.fileLoader.setWithCredentials(true); - } + containsPoint(point) { + return point.x >= this.min.x && point.x <= this.max.x && point.y >= this.min.y && point.y <= this.max.y; } - setExtensions(extensions) { - this.extensions = extensions; + containsBox(box) { + return this.min.x <= box.min.x && box.max.x <= this.max.x && this.min.y <= box.min.y && box.max.y <= this.max.y; } - setPlugins(plugins) { - this.plugins = plugins; + getParameter(point, target) { + return target.set( + (point.x - this.min.x) / (this.max.x - this.min.x), + (point.y - this.min.y) / (this.max.y - this.min.y) + ); } - parse(onLoad, onError) { - const parser = this; - const json = this.json; - const extensions = this.extensions; - this.cache.removeAll(); - this.nodeCache = {}; - this._invokeAll(function(ext2) { - return ext2._markDefs && ext2._markDefs(); - }); - Promise.all(this._invokeAll(function(ext2) { - return ext2.beforeRoot && ext2.beforeRoot(); - })).then(function() { - return Promise.all([ - parser.getDependencies("scene"), - parser.getDependencies("animation"), - parser.getDependencies("camera") - ]); - }).then(function(dependencies) { - const result = { - scene: dependencies[0][json.scene || 0], - scenes: dependencies[0], - animations: dependencies[1], - cameras: dependencies[2], - asset: json.asset, - parser, - userData: {} - }; - addUnknownExtensionsToUserData(extensions, result, json); - assignExtrasToUserData(result, json); - return Promise.all(parser._invokeAll(function(ext2) { - return ext2.afterRoot && ext2.afterRoot(result); - })).then(function() { - for (const scene of result.scenes) { - scene.updateMatrixWorld(); - } - onLoad(result); - }); - }).catch(onError); + intersectsBox(box) { + return box.max.x >= this.min.x && box.min.x <= this.max.x && box.max.y >= this.min.y && box.min.y <= this.max.y; + } + clampPoint(point, target) { + return target.copy(point).clamp(this.min, this.max); + } + distanceToPoint(point) { + return this.clampPoint(point, _vector$4).distanceTo(point); + } + intersect(box) { + this.min.max(box.min); + this.max.min(box.max); + if (this.isEmpty()) this.makeEmpty(); + return this; } - /** - * Marks the special nodes/meshes in json for efficient parse. - */ - _markDefs() { - const nodeDefs = this.json.nodes || []; - const skinDefs = this.json.skins || []; - const meshDefs = this.json.meshes || []; - for (let skinIndex = 0, skinLength = skinDefs.length; skinIndex < skinLength; skinIndex++) { - const joints = skinDefs[skinIndex].joints; - for (let i = 0, il = joints.length; i < il; i++) { - nodeDefs[joints[i]].isBone = true; - } - } - for (let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex++) { - const nodeDef = nodeDefs[nodeIndex]; - if (nodeDef.mesh !== void 0) { - this._addNodeRef(this.meshCache, nodeDef.mesh); - if (nodeDef.skin !== void 0) { - meshDefs[nodeDef.mesh].isSkinnedMesh = true; - } - } - if (nodeDef.camera !== void 0) { - this._addNodeRef(this.cameraCache, nodeDef.camera); - } - } + union(box) { + this.min.min(box.min); + this.max.max(box.max); + return this; } - /** - * Counts references to shared node / Object3D resources. These resources - * can be reused, or "instantiated", at multiple nodes in the scene - * hierarchy. Mesh, Camera, and Light instances are instantiated and must - * be marked. Non-scenegraph resources (like Materials, Geometries, and - * Textures) can be reused directly and are not marked here. - * - * Example: CesiumMilkTruck sample model reuses "Wheel" meshes. - */ - _addNodeRef(cache, index) { - if (index === void 0) return; - if (cache.refs[index] === void 0) { - cache.refs[index] = cache.uses[index] = 0; - } - cache.refs[index]++; + translate(offset) { + this.min.add(offset); + this.max.add(offset); + return this; } - /** Returns a reference to a shared resource, cloning it if necessary. */ - _getNodeRef(cache, index, object) { - if (cache.refs[index] <= 1) return object; - const ref = object.clone(); - const updateMappings = /* @__PURE__ */ __name((original, clone) => { - const mappings = this.associations.get(original); - if (mappings != null) { - this.associations.set(clone, mappings); - } - for (const [i, child] of original.children.entries()) { - updateMappings(child, clone.children[i]); - } - }, "updateMappings"); - updateMappings(object, ref); - ref.name += "_instance_" + cache.uses[index]++; - return ref; + equals(box) { + return box.min.equals(this.min) && box.max.equals(this.max); } - _invokeOne(func) { - const extensions = Object.values(this.plugins); - extensions.push(this); - for (let i = 0; i < extensions.length; i++) { - const result = func(extensions[i]); - if (result) return result; - } - return null; +} +const _startP = /* @__PURE__ */ new Vector3(); +const _startEnd = /* @__PURE__ */ new Vector3(); +class Line3 { + static { + __name(this, "Line3"); } - _invokeAll(func) { - const extensions = Object.values(this.plugins); - extensions.unshift(this); - const pending = []; - for (let i = 0; i < extensions.length; i++) { - const result = func(extensions[i]); - if (result) pending.push(result); - } - return pending; + constructor(start = new Vector3(), end = new Vector3()) { + this.start = start; + this.end = end; } - /** - * Requests the specified dependency asynchronously, with caching. - * @param {string} type - * @param {number} index - * @return {Promise} - */ - getDependency(type, index) { - const cacheKey = type + ":" + index; - let dependency = this.cache.get(cacheKey); - if (!dependency) { - switch (type) { - case "scene": - dependency = this.loadScene(index); - break; - case "node": - dependency = this._invokeOne(function(ext2) { - return ext2.loadNode && ext2.loadNode(index); - }); - break; - case "mesh": - dependency = this._invokeOne(function(ext2) { - return ext2.loadMesh && ext2.loadMesh(index); - }); - break; - case "accessor": - dependency = this.loadAccessor(index); - break; - case "bufferView": - dependency = this._invokeOne(function(ext2) { - return ext2.loadBufferView && ext2.loadBufferView(index); - }); - break; - case "buffer": - dependency = this.loadBuffer(index); - break; - case "material": - dependency = this._invokeOne(function(ext2) { - return ext2.loadMaterial && ext2.loadMaterial(index); - }); - break; - case "texture": - dependency = this._invokeOne(function(ext2) { - return ext2.loadTexture && ext2.loadTexture(index); - }); - break; - case "skin": - dependency = this.loadSkin(index); - break; - case "animation": - dependency = this._invokeOne(function(ext2) { - return ext2.loadAnimation && ext2.loadAnimation(index); - }); - break; - case "camera": - dependency = this.loadCamera(index); - break; - default: - dependency = this._invokeOne(function(ext2) { - return ext2 != this && ext2.getDependency && ext2.getDependency(type, index); - }); - if (!dependency) { - throw new Error("Unknown type: " + type); - } - break; - } - this.cache.add(cacheKey, dependency); - } - return dependency; + set(start, end) { + this.start.copy(start); + this.end.copy(end); + return this; } - /** - * Requests all dependencies of the specified type asynchronously, with caching. - * @param {string} type - * @return {Promise>} - */ - getDependencies(type) { - let dependencies = this.cache.get(type); - if (!dependencies) { - const parser = this; - const defs = this.json[type + (type === "mesh" ? "es" : "s")] || []; - dependencies = Promise.all(defs.map(function(def, index) { - return parser.getDependency(type, index); - })); - this.cache.add(type, dependencies); - } - return dependencies; + copy(line) { + this.start.copy(line.start); + this.end.copy(line.end); + return this; } - /** - * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views - * @param {number} bufferIndex - * @return {Promise} - */ - loadBuffer(bufferIndex) { - const bufferDef = this.json.buffers[bufferIndex]; - const loader = this.fileLoader; - if (bufferDef.type && bufferDef.type !== "arraybuffer") { - throw new Error("THREE.GLTFLoader: " + bufferDef.type + " buffer type is not supported."); - } - if (bufferDef.uri === void 0 && bufferIndex === 0) { - return Promise.resolve(this.extensions[EXTENSIONS.KHR_BINARY_GLTF].body); - } - const options = this.options; - return new Promise(function(resolve, reject) { - loader.load(LoaderUtils.resolveURL(bufferDef.uri, options.path), resolve, void 0, function() { - reject(new Error('THREE.GLTFLoader: Failed to load buffer "' + bufferDef.uri + '".')); - }); - }); + getCenter(target) { + return target.addVectors(this.start, this.end).multiplyScalar(0.5); } - /** - * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views - * @param {number} bufferViewIndex - * @return {Promise} - */ - loadBufferView(bufferViewIndex) { - const bufferViewDef = this.json.bufferViews[bufferViewIndex]; - return this.getDependency("buffer", bufferViewDef.buffer).then(function(buffer) { - const byteLength = bufferViewDef.byteLength || 0; - const byteOffset = bufferViewDef.byteOffset || 0; - return buffer.slice(byteOffset, byteOffset + byteLength); - }); + delta(target) { + return target.subVectors(this.end, this.start); } - /** - * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors - * @param {number} accessorIndex - * @return {Promise} - */ - loadAccessor(accessorIndex) { - const parser = this; - const json = this.json; - const accessorDef = this.json.accessors[accessorIndex]; - if (accessorDef.bufferView === void 0 && accessorDef.sparse === void 0) { - const itemSize = WEBGL_TYPE_SIZES[accessorDef.type]; - const TypedArray = WEBGL_COMPONENT_TYPES[accessorDef.componentType]; - const normalized = accessorDef.normalized === true; - const array = new TypedArray(accessorDef.count * itemSize); - return Promise.resolve(new BufferAttribute(array, itemSize, normalized)); - } - const pendingBufferViews = []; - if (accessorDef.bufferView !== void 0) { - pendingBufferViews.push(this.getDependency("bufferView", accessorDef.bufferView)); - } else { - pendingBufferViews.push(null); - } - if (accessorDef.sparse !== void 0) { - pendingBufferViews.push(this.getDependency("bufferView", accessorDef.sparse.indices.bufferView)); - pendingBufferViews.push(this.getDependency("bufferView", accessorDef.sparse.values.bufferView)); - } - return Promise.all(pendingBufferViews).then(function(bufferViews) { - const bufferView = bufferViews[0]; - const itemSize = WEBGL_TYPE_SIZES[accessorDef.type]; - const TypedArray = WEBGL_COMPONENT_TYPES[accessorDef.componentType]; - const elementBytes = TypedArray.BYTES_PER_ELEMENT; - const itemBytes = elementBytes * itemSize; - const byteOffset = accessorDef.byteOffset || 0; - const byteStride = accessorDef.bufferView !== void 0 ? json.bufferViews[accessorDef.bufferView].byteStride : void 0; - const normalized = accessorDef.normalized === true; - let array, bufferAttribute; - if (byteStride && byteStride !== itemBytes) { - const ibSlice = Math.floor(byteOffset / byteStride); - const ibCacheKey = "InterleavedBuffer:" + accessorDef.bufferView + ":" + accessorDef.componentType + ":" + ibSlice + ":" + accessorDef.count; - let ib = parser.cache.get(ibCacheKey); - if (!ib) { - array = new TypedArray(bufferView, ibSlice * byteStride, accessorDef.count * byteStride / elementBytes); - ib = new InterleavedBuffer(array, byteStride / elementBytes); - parser.cache.add(ibCacheKey, ib); - } - bufferAttribute = new InterleavedBufferAttribute(ib, itemSize, byteOffset % byteStride / elementBytes, normalized); - } else { - if (bufferView === null) { - array = new TypedArray(accessorDef.count * itemSize); - } else { - array = new TypedArray(bufferView, byteOffset, accessorDef.count * itemSize); - } - bufferAttribute = new BufferAttribute(array, itemSize, normalized); - } - if (accessorDef.sparse !== void 0) { - const itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR; - const TypedArrayIndices = WEBGL_COMPONENT_TYPES[accessorDef.sparse.indices.componentType]; - const byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0; - const byteOffsetValues = accessorDef.sparse.values.byteOffset || 0; - const sparseIndices = new TypedArrayIndices(bufferViews[1], byteOffsetIndices, accessorDef.sparse.count * itemSizeIndices); - const sparseValues = new TypedArray(bufferViews[2], byteOffsetValues, accessorDef.sparse.count * itemSize); - if (bufferView !== null) { - bufferAttribute = new BufferAttribute(bufferAttribute.array.slice(), bufferAttribute.itemSize, bufferAttribute.normalized); - } - bufferAttribute.normalized = false; - for (let i = 0, il = sparseIndices.length; i < il; i++) { - const index = sparseIndices[i]; - bufferAttribute.setX(index, sparseValues[i * itemSize]); - if (itemSize >= 2) bufferAttribute.setY(index, sparseValues[i * itemSize + 1]); - if (itemSize >= 3) bufferAttribute.setZ(index, sparseValues[i * itemSize + 2]); - if (itemSize >= 4) bufferAttribute.setW(index, sparseValues[i * itemSize + 3]); - if (itemSize >= 5) throw new Error("THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute."); - } - bufferAttribute.normalized = normalized; - } - return bufferAttribute; - }); + distanceSq() { + return this.start.distanceToSquared(this.end); } - /** - * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures - * @param {number} textureIndex - * @return {Promise} - */ - loadTexture(textureIndex) { - const json = this.json; - const options = this.options; - const textureDef = json.textures[textureIndex]; - const sourceIndex = textureDef.source; - const sourceDef = json.images[sourceIndex]; - let loader = this.textureLoader; - if (sourceDef.uri) { - const handler = options.manager.getHandler(sourceDef.uri); - if (handler !== null) loader = handler; - } - return this.loadTextureImage(textureIndex, sourceIndex, loader); + distance() { + return this.start.distanceTo(this.end); } - loadTextureImage(textureIndex, sourceIndex, loader) { - const parser = this; - const json = this.json; - const textureDef = json.textures[textureIndex]; - const sourceDef = json.images[sourceIndex]; - const cacheKey = (sourceDef.uri || sourceDef.bufferView) + ":" + textureDef.sampler; - if (this.textureCache[cacheKey]) { - return this.textureCache[cacheKey]; - } - const promise = this.loadImageSource(sourceIndex, loader).then(function(texture) { - texture.flipY = false; - texture.name = textureDef.name || sourceDef.name || ""; - if (texture.name === "" && typeof sourceDef.uri === "string" && sourceDef.uri.startsWith("data:image/") === false) { - texture.name = sourceDef.uri; - } - const samplers = json.samplers || {}; - const sampler = samplers[textureDef.sampler] || {}; - texture.magFilter = WEBGL_FILTERS[sampler.magFilter] || LinearFilter; - texture.minFilter = WEBGL_FILTERS[sampler.minFilter] || LinearMipmapLinearFilter; - texture.wrapS = WEBGL_WRAPPINGS[sampler.wrapS] || RepeatWrapping; - texture.wrapT = WEBGL_WRAPPINGS[sampler.wrapT] || RepeatWrapping; - texture.generateMipmaps = !texture.isCompressedTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter; - parser.associations.set(texture, { textures: textureIndex }); - return texture; - }).catch(function() { - return null; - }); - this.textureCache[cacheKey] = promise; - return promise; + at(t2, target) { + return this.delta(target).multiplyScalar(t2).add(this.start); } - loadImageSource(sourceIndex, loader) { - const parser = this; - const json = this.json; - const options = this.options; - if (this.sourceCache[sourceIndex] !== void 0) { - return this.sourceCache[sourceIndex].then((texture) => texture.clone()); - } - const sourceDef = json.images[sourceIndex]; - const URL2 = self.URL || self.webkitURL; - let sourceURI = sourceDef.uri || ""; - let isObjectURL = false; - if (sourceDef.bufferView !== void 0) { - sourceURI = parser.getDependency("bufferView", sourceDef.bufferView).then(function(bufferView) { - isObjectURL = true; - const blob = new Blob([bufferView], { type: sourceDef.mimeType }); - sourceURI = URL2.createObjectURL(blob); - return sourceURI; - }); - } else if (sourceDef.uri === void 0) { - throw new Error("THREE.GLTFLoader: Image " + sourceIndex + " is missing URI and bufferView"); + closestPointToPointParameter(point, clampToLine) { + _startP.subVectors(point, this.start); + _startEnd.subVectors(this.end, this.start); + const startEnd2 = _startEnd.dot(_startEnd); + const startEnd_startP = _startEnd.dot(_startP); + let t2 = startEnd_startP / startEnd2; + if (clampToLine) { + t2 = clamp(t2, 0, 1); } - const promise = Promise.resolve(sourceURI).then(function(sourceURI2) { - return new Promise(function(resolve, reject) { - let onLoad = resolve; - if (loader.isImageBitmapLoader === true) { - onLoad = /* @__PURE__ */ __name(function(imageBitmap) { - const texture = new Texture(imageBitmap); - texture.needsUpdate = true; - resolve(texture); - }, "onLoad"); - } - loader.load(LoaderUtils.resolveURL(sourceURI2, options.path), onLoad, void 0, reject); - }); - }).then(function(texture) { - if (isObjectURL === true) { - URL2.revokeObjectURL(sourceURI); - } - assignExtrasToUserData(texture, sourceDef); - texture.userData.mimeType = sourceDef.mimeType || getImageURIMimeType(sourceDef.uri); - return texture; - }).catch(function(error) { - console.error("THREE.GLTFLoader: Couldn't load texture", sourceURI); - throw error; - }); - this.sourceCache[sourceIndex] = promise; - return promise; + return t2; } - /** - * Asynchronously assigns a texture to the given material parameters. - * @param {Object} materialParams - * @param {string} mapName - * @param {Object} mapDef - * @return {Promise} - */ - assignTexture(materialParams, mapName, mapDef, colorSpace) { - const parser = this; - return this.getDependency("texture", mapDef.index).then(function(texture) { - if (!texture) return null; - if (mapDef.texCoord !== void 0 && mapDef.texCoord > 0) { - texture = texture.clone(); - texture.channel = mapDef.texCoord; - } - if (parser.extensions[EXTENSIONS.KHR_TEXTURE_TRANSFORM]) { - const transform = mapDef.extensions !== void 0 ? mapDef.extensions[EXTENSIONS.KHR_TEXTURE_TRANSFORM] : void 0; - if (transform) { - const gltfReference = parser.associations.get(texture); - texture = parser.extensions[EXTENSIONS.KHR_TEXTURE_TRANSFORM].extendTexture(texture, transform); - parser.associations.set(texture, gltfReference); - } - } - if (colorSpace !== void 0) { - texture.colorSpace = colorSpace; - } - materialParams[mapName] = texture; - return texture; - }); + closestPointToPoint(point, clampToLine, target) { + const t2 = this.closestPointToPointParameter(point, clampToLine); + return this.delta(target).multiplyScalar(t2).add(this.start); } - /** - * Assigns final material to a Mesh, Line, or Points instance. The instance - * already has a material (generated from the glTF material options alone) - * but reuse of the same glTF material may require multiple threejs materials - * to accommodate different primitive types, defines, etc. New materials will - * be created if necessary, and reused from a cache. - * @param {Object3D} mesh Mesh, Line, or Points instance. - */ - assignFinalMaterial(mesh) { - const geometry = mesh.geometry; - let material = mesh.material; - const useDerivativeTangents = geometry.attributes.tangent === void 0; - const useVertexColors = geometry.attributes.color !== void 0; - const useFlatShading = geometry.attributes.normal === void 0; - if (mesh.isPoints) { - const cacheKey = "PointsMaterial:" + material.uuid; - let pointsMaterial = this.cache.get(cacheKey); - if (!pointsMaterial) { - pointsMaterial = new PointsMaterial(); - Material.prototype.copy.call(pointsMaterial, material); - pointsMaterial.color.copy(material.color); - pointsMaterial.map = material.map; - pointsMaterial.sizeAttenuation = false; - this.cache.add(cacheKey, pointsMaterial); - } - material = pointsMaterial; - } else if (mesh.isLine) { - const cacheKey = "LineBasicMaterial:" + material.uuid; - let lineMaterial = this.cache.get(cacheKey); - if (!lineMaterial) { - lineMaterial = new LineBasicMaterial(); - Material.prototype.copy.call(lineMaterial, material); - lineMaterial.color.copy(material.color); - lineMaterial.map = material.map; - this.cache.add(cacheKey, lineMaterial); - } - material = lineMaterial; - } - if (useDerivativeTangents || useVertexColors || useFlatShading) { - let cacheKey = "ClonedMaterial:" + material.uuid + ":"; - if (useDerivativeTangents) cacheKey += "derivative-tangents:"; - if (useVertexColors) cacheKey += "vertex-colors:"; - if (useFlatShading) cacheKey += "flat-shading:"; - let cachedMaterial = this.cache.get(cacheKey); - if (!cachedMaterial) { - cachedMaterial = material.clone(); - if (useVertexColors) cachedMaterial.vertexColors = true; - if (useFlatShading) cachedMaterial.flatShading = true; - if (useDerivativeTangents) { - if (cachedMaterial.normalScale) cachedMaterial.normalScale.y *= -1; - if (cachedMaterial.clearcoatNormalScale) cachedMaterial.clearcoatNormalScale.y *= -1; - } - this.cache.add(cacheKey, cachedMaterial); - this.associations.set(cachedMaterial, this.associations.get(material)); - } - material = cachedMaterial; + applyMatrix4(matrix) { + this.start.applyMatrix4(matrix); + this.end.applyMatrix4(matrix); + return this; + } + equals(line) { + return line.start.equals(this.start) && line.end.equals(this.end); + } + clone() { + return new this.constructor().copy(this); + } +} +const _vector$3 = /* @__PURE__ */ new Vector3(); +class SpotLightHelper extends Object3D { + static { + __name(this, "SpotLightHelper"); + } + constructor(light, color) { + super(); + this.light = light; + this.matrixAutoUpdate = false; + this.color = color; + this.type = "SpotLightHelper"; + const geometry = new BufferGeometry(); + const positions = [ + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + -1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + -1, + 1 + ]; + for (let i = 0, j = 1, l = 32; i < l; i++, j++) { + const p1 = i / l * Math.PI * 2; + const p2 = j / l * Math.PI * 2; + positions.push( + Math.cos(p1), + Math.sin(p1), + 1, + Math.cos(p2), + Math.sin(p2), + 1 + ); } - mesh.material = material; + geometry.setAttribute("position", new Float32BufferAttribute(positions, 3)); + const material = new LineBasicMaterial({ fog: false, toneMapped: false }); + this.cone = new LineSegments(geometry, material); + this.add(this.cone); + this.update(); } - getMaterialType() { - return MeshStandardMaterial; + dispose() { + this.cone.geometry.dispose(); + this.cone.material.dispose(); } - /** - * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials - * @param {number} materialIndex - * @return {Promise} - */ - loadMaterial(materialIndex) { - const parser = this; - const json = this.json; - const extensions = this.extensions; - const materialDef = json.materials[materialIndex]; - let materialType; - const materialParams = {}; - const materialExtensions = materialDef.extensions || {}; - const pending = []; - if (materialExtensions[EXTENSIONS.KHR_MATERIALS_UNLIT]) { - const kmuExtension = extensions[EXTENSIONS.KHR_MATERIALS_UNLIT]; - materialType = kmuExtension.getMaterialType(); - pending.push(kmuExtension.extendParams(materialParams, materialDef, parser)); + update() { + this.light.updateWorldMatrix(true, false); + this.light.target.updateWorldMatrix(true, false); + if (this.parent) { + this.parent.updateWorldMatrix(true); + this.matrix.copy(this.parent.matrixWorld).invert().multiply(this.light.matrixWorld); } else { - const metallicRoughness = materialDef.pbrMetallicRoughness || {}; - materialParams.color = new Color(1, 1, 1); - materialParams.opacity = 1; - if (Array.isArray(metallicRoughness.baseColorFactor)) { - const array = metallicRoughness.baseColorFactor; - materialParams.color.setRGB(array[0], array[1], array[2], LinearSRGBColorSpace); - materialParams.opacity = array[3]; - } - if (metallicRoughness.baseColorTexture !== void 0) { - pending.push(parser.assignTexture(materialParams, "map", metallicRoughness.baseColorTexture, SRGBColorSpace)); - } - materialParams.metalness = metallicRoughness.metallicFactor !== void 0 ? metallicRoughness.metallicFactor : 1; - materialParams.roughness = metallicRoughness.roughnessFactor !== void 0 ? metallicRoughness.roughnessFactor : 1; - if (metallicRoughness.metallicRoughnessTexture !== void 0) { - pending.push(parser.assignTexture(materialParams, "metalnessMap", metallicRoughness.metallicRoughnessTexture)); - pending.push(parser.assignTexture(materialParams, "roughnessMap", metallicRoughness.metallicRoughnessTexture)); - } - materialType = this._invokeOne(function(ext2) { - return ext2.getMaterialType && ext2.getMaterialType(materialIndex); - }); - pending.push(Promise.all(this._invokeAll(function(ext2) { - return ext2.extendMaterialParams && ext2.extendMaterialParams(materialIndex, materialParams); - }))); - } - if (materialDef.doubleSided === true) { - materialParams.side = DoubleSide; + this.matrix.copy(this.light.matrixWorld); } - const alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE; - if (alphaMode === ALPHA_MODES.BLEND) { - materialParams.transparent = true; - materialParams.depthWrite = false; + this.matrixWorld.copy(this.light.matrixWorld); + const coneLength = this.light.distance ? this.light.distance : 1e3; + const coneWidth = coneLength * Math.tan(this.light.angle); + this.cone.scale.set(coneWidth, coneWidth, coneLength); + _vector$3.setFromMatrixPosition(this.light.target.matrixWorld); + this.cone.lookAt(_vector$3); + if (this.color !== void 0) { + this.cone.material.color.set(this.color); } else { - materialParams.transparent = false; - if (alphaMode === ALPHA_MODES.MASK) { - materialParams.alphaTest = materialDef.alphaCutoff !== void 0 ? materialDef.alphaCutoff : 0.5; - } + this.cone.material.color.copy(this.light.color); } - if (materialDef.normalTexture !== void 0 && materialType !== MeshBasicMaterial) { - pending.push(parser.assignTexture(materialParams, "normalMap", materialDef.normalTexture)); - materialParams.normalScale = new Vector2(1, 1); - if (materialDef.normalTexture.scale !== void 0) { - const scale = materialDef.normalTexture.scale; - materialParams.normalScale.set(scale, scale); + } +} +const _vector$2 = /* @__PURE__ */ new Vector3(); +const _boneMatrix = /* @__PURE__ */ new Matrix4(); +const _matrixWorldInv = /* @__PURE__ */ new Matrix4(); +class SkeletonHelper extends LineSegments { + static { + __name(this, "SkeletonHelper"); + } + constructor(object) { + const bones = getBoneList(object); + const geometry = new BufferGeometry(); + const vertices = []; + const colors = []; + const color1 = new Color(0, 0, 1); + const color2 = new Color(0, 1, 0); + for (let i = 0; i < bones.length; i++) { + const bone = bones[i]; + if (bone.parent && bone.parent.isBone) { + vertices.push(0, 0, 0); + vertices.push(0, 0, 0); + colors.push(color1.r, color1.g, color1.b); + colors.push(color2.r, color2.g, color2.b); } } - if (materialDef.occlusionTexture !== void 0 && materialType !== MeshBasicMaterial) { - pending.push(parser.assignTexture(materialParams, "aoMap", materialDef.occlusionTexture)); - if (materialDef.occlusionTexture.strength !== void 0) { - materialParams.aoMapIntensity = materialDef.occlusionTexture.strength; + geometry.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + geometry.setAttribute("color", new Float32BufferAttribute(colors, 3)); + const material = new LineBasicMaterial({ vertexColors: true, depthTest: false, depthWrite: false, toneMapped: false, transparent: true }); + super(geometry, material); + this.isSkeletonHelper = true; + this.type = "SkeletonHelper"; + this.root = object; + this.bones = bones; + this.matrix = object.matrixWorld; + this.matrixAutoUpdate = false; + } + updateMatrixWorld(force) { + const bones = this.bones; + const geometry = this.geometry; + const position = geometry.getAttribute("position"); + _matrixWorldInv.copy(this.root.matrixWorld).invert(); + for (let i = 0, j = 0; i < bones.length; i++) { + const bone = bones[i]; + if (bone.parent && bone.parent.isBone) { + _boneMatrix.multiplyMatrices(_matrixWorldInv, bone.matrixWorld); + _vector$2.setFromMatrixPosition(_boneMatrix); + position.setXYZ(j, _vector$2.x, _vector$2.y, _vector$2.z); + _boneMatrix.multiplyMatrices(_matrixWorldInv, bone.parent.matrixWorld); + _vector$2.setFromMatrixPosition(_boneMatrix); + position.setXYZ(j + 1, _vector$2.x, _vector$2.y, _vector$2.z); + j += 2; } } - if (materialDef.emissiveFactor !== void 0 && materialType !== MeshBasicMaterial) { - const emissiveFactor = materialDef.emissiveFactor; - materialParams.emissive = new Color().setRGB(emissiveFactor[0], emissiveFactor[1], emissiveFactor[2], LinearSRGBColorSpace); - } - if (materialDef.emissiveTexture !== void 0 && materialType !== MeshBasicMaterial) { - pending.push(parser.assignTexture(materialParams, "emissiveMap", materialDef.emissiveTexture, SRGBColorSpace)); - } - return Promise.all(pending).then(function() { - const material = new materialType(materialParams); - if (materialDef.name) material.name = materialDef.name; - assignExtrasToUserData(material, materialDef); - parser.associations.set(material, { materials: materialIndex }); - if (materialDef.extensions) addUnknownExtensionsToUserData(extensions, material, materialDef); - return material; - }); + geometry.getAttribute("position").needsUpdate = true; + super.updateMatrixWorld(force); } - /** When Object3D instances are targeted by animation, they need unique names. */ - createUniqueName(originalName) { - const sanitizedName = PropertyBinding.sanitizeNodeName(originalName || ""); - if (sanitizedName in this.nodeNamesUsed) { - return sanitizedName + "_" + ++this.nodeNamesUsed[sanitizedName]; - } else { - this.nodeNamesUsed[sanitizedName] = 0; - return sanitizedName; - } + dispose() { + this.geometry.dispose(); + this.material.dispose(); } - /** - * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry - * - * Creates BufferGeometries from primitives. - * - * @param {Array} primitives - * @return {Promise>} - */ - loadGeometries(primitives) { - const parser = this; - const extensions = this.extensions; - const cache = this.primitiveCache; - function createDracoPrimitive(primitive) { - return extensions[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION].decodePrimitive(primitive, parser).then(function(geometry) { - return addPrimitiveAttributes(geometry, primitive, parser); - }); - } - __name(createDracoPrimitive, "createDracoPrimitive"); - const pending = []; - for (let i = 0, il = primitives.length; i < il; i++) { - const primitive = primitives[i]; - const cacheKey = createPrimitiveKey(primitive); - const cached = cache[cacheKey]; - if (cached) { - pending.push(cached.promise); - } else { - let geometryPromise; - if (primitive.extensions && primitive.extensions[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION]) { - geometryPromise = createDracoPrimitive(primitive); - } else { - geometryPromise = addPrimitiveAttributes(new BufferGeometry(), primitive, parser); - } - cache[cacheKey] = { primitive, promise: geometryPromise }; - pending.push(geometryPromise); - } - } - return Promise.all(pending); +} +function getBoneList(object) { + const boneList = []; + if (object.isBone === true) { + boneList.push(object); } - /** - * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes - * @param {number} meshIndex - * @return {Promise} - */ - loadMesh(meshIndex) { - const parser = this; - const json = this.json; - const extensions = this.extensions; - const meshDef = json.meshes[meshIndex]; - const primitives = meshDef.primitives; - const pending = []; - for (let i = 0, il = primitives.length; i < il; i++) { - const material = primitives[i].material === void 0 ? createDefaultMaterial(this.cache) : this.getDependency("material", primitives[i].material); - pending.push(material); - } - pending.push(parser.loadGeometries(primitives)); - return Promise.all(pending).then(function(results) { - const materials = results.slice(0, results.length - 1); - const geometries = results[results.length - 1]; - const meshes = []; - for (let i = 0, il = geometries.length; i < il; i++) { - const geometry = geometries[i]; - const primitive = primitives[i]; - let mesh; - const material = materials[i]; - if (primitive.mode === WEBGL_CONSTANTS.TRIANGLES || primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP || primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN || primitive.mode === void 0) { - mesh = meshDef.isSkinnedMesh === true ? new SkinnedMesh(geometry, material) : new Mesh(geometry, material); - if (mesh.isSkinnedMesh === true) { - mesh.normalizeSkinWeights(); - } - if (primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP) { - mesh.geometry = toTrianglesDrawMode(mesh.geometry, TriangleStripDrawMode); - } else if (primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN) { - mesh.geometry = toTrianglesDrawMode(mesh.geometry, TriangleFanDrawMode); - } - } else if (primitive.mode === WEBGL_CONSTANTS.LINES) { - mesh = new LineSegments(geometry, material); - } else if (primitive.mode === WEBGL_CONSTANTS.LINE_STRIP) { - mesh = new Line(geometry, material); - } else if (primitive.mode === WEBGL_CONSTANTS.LINE_LOOP) { - mesh = new LineLoop(geometry, material); - } else if (primitive.mode === WEBGL_CONSTANTS.POINTS) { - mesh = new Points(geometry, material); - } else { - throw new Error("THREE.GLTFLoader: Primitive mode unsupported: " + primitive.mode); - } - if (Object.keys(mesh.geometry.morphAttributes).length > 0) { - updateMorphTargets(mesh, meshDef); - } - mesh.name = parser.createUniqueName(meshDef.name || "mesh_" + meshIndex); - assignExtrasToUserData(mesh, meshDef); - if (primitive.extensions) addUnknownExtensionsToUserData(extensions, mesh, primitive); - parser.assignFinalMaterial(mesh); - meshes.push(mesh); - } - for (let i = 0, il = meshes.length; i < il; i++) { - parser.associations.set(meshes[i], { - meshes: meshIndex, - primitives: i - }); - } - if (meshes.length === 1) { - if (meshDef.extensions) addUnknownExtensionsToUserData(extensions, meshes[0], meshDef); - return meshes[0]; - } - const group = new Group(); - if (meshDef.extensions) addUnknownExtensionsToUserData(extensions, group, meshDef); - parser.associations.set(group, { meshes: meshIndex }); - for (let i = 0, il = meshes.length; i < il; i++) { - group.add(meshes[i]); - } - return group; - }); + for (let i = 0; i < object.children.length; i++) { + boneList.push.apply(boneList, getBoneList(object.children[i])); } - /** - * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras - * @param {number} cameraIndex - * @return {Promise} - */ - loadCamera(cameraIndex) { - let camera; - const cameraDef = this.json.cameras[cameraIndex]; - const params = cameraDef[cameraDef.type]; - if (!params) { - console.warn("THREE.GLTFLoader: Missing camera parameters."); - return; - } - if (cameraDef.type === "perspective") { - camera = new PerspectiveCamera(MathUtils.radToDeg(params.yfov), params.aspectRatio || 1, params.znear || 1, params.zfar || 2e6); - } else if (cameraDef.type === "orthographic") { - camera = new OrthographicCamera(-params.xmag, params.xmag, params.ymag, -params.ymag, params.znear, params.zfar); - } - if (cameraDef.name) camera.name = this.createUniqueName(cameraDef.name); - assignExtrasToUserData(camera, cameraDef); - return Promise.resolve(camera); + return boneList; +} +__name(getBoneList, "getBoneList"); +class PointLightHelper extends Mesh { + static { + __name(this, "PointLightHelper"); } - /** - * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins - * @param {number} skinIndex - * @return {Promise} - */ - loadSkin(skinIndex) { - const skinDef = this.json.skins[skinIndex]; - const pending = []; - for (let i = 0, il = skinDef.joints.length; i < il; i++) { - pending.push(this._loadNodeShallow(skinDef.joints[i])); - } - if (skinDef.inverseBindMatrices !== void 0) { - pending.push(this.getDependency("accessor", skinDef.inverseBindMatrices)); + constructor(light, sphereSize, color) { + const geometry = new SphereGeometry(sphereSize, 4, 2); + const material = new MeshBasicMaterial({ wireframe: true, fog: false, toneMapped: false }); + super(geometry, material); + this.light = light; + this.color = color; + this.type = "PointLightHelper"; + this.matrix = this.light.matrixWorld; + this.matrixAutoUpdate = false; + this.update(); + } + dispose() { + this.geometry.dispose(); + this.material.dispose(); + } + update() { + this.light.updateWorldMatrix(true, false); + if (this.color !== void 0) { + this.material.color.set(this.color); } else { - pending.push(null); + this.material.color.copy(this.light.color); } - return Promise.all(pending).then(function(results) { - const inverseBindMatrices = results.pop(); - const jointNodes = results; - const bones = []; - const boneInverses = []; - for (let i = 0, il = jointNodes.length; i < il; i++) { - const jointNode = jointNodes[i]; - if (jointNode) { - bones.push(jointNode); - const mat = new Matrix4(); - if (inverseBindMatrices !== null) { - mat.fromArray(inverseBindMatrices.array, i * 16); - } - boneInverses.push(mat); - } else { - console.warn('THREE.GLTFLoader: Joint "%s" could not be found.', skinDef.joints[i]); - } - } - return new Skeleton(bones, boneInverses); - }); } - /** - * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations - * @param {number} animationIndex - * @return {Promise} - */ - loadAnimation(animationIndex) { - const json = this.json; - const parser = this; - const animationDef = json.animations[animationIndex]; - const animationName = animationDef.name ? animationDef.name : "animation_" + animationIndex; - const pendingNodes = []; - const pendingInputAccessors = []; - const pendingOutputAccessors = []; - const pendingSamplers = []; - const pendingTargets = []; - for (let i = 0, il = animationDef.channels.length; i < il; i++) { - const channel = animationDef.channels[i]; - const sampler = animationDef.samplers[channel.sampler]; - const target = channel.target; - const name = target.node; - const input = animationDef.parameters !== void 0 ? animationDef.parameters[sampler.input] : sampler.input; - const output = animationDef.parameters !== void 0 ? animationDef.parameters[sampler.output] : sampler.output; - if (target.node === void 0) continue; - pendingNodes.push(this.getDependency("node", name)); - pendingInputAccessors.push(this.getDependency("accessor", input)); - pendingOutputAccessors.push(this.getDependency("accessor", output)); - pendingSamplers.push(sampler); - pendingTargets.push(target); - } - return Promise.all([ - Promise.all(pendingNodes), - Promise.all(pendingInputAccessors), - Promise.all(pendingOutputAccessors), - Promise.all(pendingSamplers), - Promise.all(pendingTargets) - ]).then(function(dependencies) { - const nodes = dependencies[0]; - const inputAccessors = dependencies[1]; - const outputAccessors = dependencies[2]; - const samplers = dependencies[3]; - const targets = dependencies[4]; - const tracks = []; - for (let i = 0, il = nodes.length; i < il; i++) { - const node = nodes[i]; - const inputAccessor = inputAccessors[i]; - const outputAccessor = outputAccessors[i]; - const sampler = samplers[i]; - const target = targets[i]; - if (node === void 0) continue; - if (node.updateMatrix) { - node.updateMatrix(); - } - const createdTracks = parser._createAnimationTracks(node, inputAccessor, outputAccessor, sampler, target); - if (createdTracks) { - for (let k = 0; k < createdTracks.length; k++) { - tracks.push(createdTracks[k]); - } - } +} +const _vector$1 = /* @__PURE__ */ new Vector3(); +const _color1 = /* @__PURE__ */ new Color(); +const _color2 = /* @__PURE__ */ new Color(); +class HemisphereLightHelper extends Object3D { + static { + __name(this, "HemisphereLightHelper"); + } + constructor(light, size, color) { + super(); + this.light = light; + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + this.color = color; + this.type = "HemisphereLightHelper"; + const geometry = new OctahedronGeometry(size); + geometry.rotateY(Math.PI * 0.5); + this.material = new MeshBasicMaterial({ wireframe: true, fog: false, toneMapped: false }); + if (this.color === void 0) this.material.vertexColors = true; + const position = geometry.getAttribute("position"); + const colors = new Float32Array(position.count * 3); + geometry.setAttribute("color", new BufferAttribute(colors, 3)); + this.add(new Mesh(geometry, this.material)); + this.update(); + } + dispose() { + this.children[0].geometry.dispose(); + this.children[0].material.dispose(); + } + update() { + const mesh = this.children[0]; + if (this.color !== void 0) { + this.material.color.set(this.color); + } else { + const colors = mesh.geometry.getAttribute("color"); + _color1.copy(this.light.color); + _color2.copy(this.light.groundColor); + for (let i = 0, l = colors.count; i < l; i++) { + const color = i < l / 2 ? _color1 : _color2; + colors.setXYZ(i, color.r, color.g, color.b); } - return new AnimationClip(animationName, void 0, tracks); - }); + colors.needsUpdate = true; + } + this.light.updateWorldMatrix(true, false); + mesh.lookAt(_vector$1.setFromMatrixPosition(this.light.matrixWorld).negate()); } - createNodeMesh(nodeIndex) { - const json = this.json; - const parser = this; - const nodeDef = json.nodes[nodeIndex]; - if (nodeDef.mesh === void 0) return null; - return parser.getDependency("mesh", nodeDef.mesh).then(function(mesh) { - const node = parser._getNodeRef(parser.meshCache, nodeDef.mesh, mesh); - if (nodeDef.weights !== void 0) { - node.traverse(function(o) { - if (!o.isMesh) return; - for (let i = 0, il = nodeDef.weights.length; i < il; i++) { - o.morphTargetInfluences[i] = nodeDef.weights[i]; - } - }); - } - return node; - }); +} +class GridHelper extends LineSegments { + static { + __name(this, "GridHelper"); } - /** - * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy - * @param {number} nodeIndex - * @return {Promise} - */ - loadNode(nodeIndex) { - const json = this.json; - const parser = this; - const nodeDef = json.nodes[nodeIndex]; - const nodePending = parser._loadNodeShallow(nodeIndex); - const childPending = []; - const childrenDef = nodeDef.children || []; - for (let i = 0, il = childrenDef.length; i < il; i++) { - childPending.push(parser.getDependency("node", childrenDef[i])); + constructor(size = 10, divisions = 10, color1 = 4473924, color2 = 8947848) { + color1 = new Color(color1); + color2 = new Color(color2); + const center = divisions / 2; + const step = size / divisions; + const halfSize = size / 2; + const vertices = [], colors = []; + for (let i = 0, j = 0, k = -halfSize; i <= divisions; i++, k += step) { + vertices.push(-halfSize, 0, k, halfSize, 0, k); + vertices.push(k, 0, -halfSize, k, 0, halfSize); + const color = i === center ? color1 : color2; + color.toArray(colors, j); + j += 3; + color.toArray(colors, j); + j += 3; + color.toArray(colors, j); + j += 3; + color.toArray(colors, j); + j += 3; } - const skeletonPending = nodeDef.skin === void 0 ? Promise.resolve(null) : parser.getDependency("skin", nodeDef.skin); - return Promise.all([ - nodePending, - Promise.all(childPending), - skeletonPending - ]).then(function(results) { - const node = results[0]; - const children = results[1]; - const skeleton = results[2]; - if (skeleton !== null) { - node.traverse(function(mesh) { - if (!mesh.isSkinnedMesh) return; - mesh.bind(skeleton, _identityMatrix); - }); - } - for (let i = 0, il = children.length; i < il; i++) { - node.add(children[i]); - } - return node; - }); + const geometry = new BufferGeometry(); + geometry.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + geometry.setAttribute("color", new Float32BufferAttribute(colors, 3)); + const material = new LineBasicMaterial({ vertexColors: true, toneMapped: false }); + super(geometry, material); + this.type = "GridHelper"; } - // ._loadNodeShallow() parses a single node. - // skin and child nodes are created and added in .loadNode() (no '_' prefix). - _loadNodeShallow(nodeIndex) { - const json = this.json; - const extensions = this.extensions; - const parser = this; - if (this.nodeCache[nodeIndex] !== void 0) { - return this.nodeCache[nodeIndex]; - } - const nodeDef = json.nodes[nodeIndex]; - const nodeName = nodeDef.name ? parser.createUniqueName(nodeDef.name) : ""; - const pending = []; - const meshPromise = parser._invokeOne(function(ext2) { - return ext2.createNodeMesh && ext2.createNodeMesh(nodeIndex); - }); - if (meshPromise) { - pending.push(meshPromise); - } - if (nodeDef.camera !== void 0) { - pending.push(parser.getDependency("camera", nodeDef.camera).then(function(camera) { - return parser._getNodeRef(parser.cameraCache, nodeDef.camera, camera); - })); - } - parser._invokeAll(function(ext2) { - return ext2.createNodeAttachment && ext2.createNodeAttachment(nodeIndex); - }).forEach(function(promise) { - pending.push(promise); - }); - this.nodeCache[nodeIndex] = Promise.all(pending).then(function(objects) { - let node; - if (nodeDef.isBone === true) { - node = new Bone(); - } else if (objects.length > 1) { - node = new Group(); - } else if (objects.length === 1) { - node = objects[0]; - } else { - node = new Object3D(); - } - if (node !== objects[0]) { - for (let i = 0, il = objects.length; i < il; i++) { - node.add(objects[i]); - } - } - if (nodeDef.name) { - node.userData.name = nodeDef.name; - node.name = nodeName; - } - assignExtrasToUserData(node, nodeDef); - if (nodeDef.extensions) addUnknownExtensionsToUserData(extensions, node, nodeDef); - if (nodeDef.matrix !== void 0) { - const matrix = new Matrix4(); - matrix.fromArray(nodeDef.matrix); - node.applyMatrix4(matrix); - } else { - if (nodeDef.translation !== void 0) { - node.position.fromArray(nodeDef.translation); - } - if (nodeDef.rotation !== void 0) { - node.quaternion.fromArray(nodeDef.rotation); - } - if (nodeDef.scale !== void 0) { - node.scale.fromArray(nodeDef.scale); - } - } - if (!parser.associations.has(node)) { - parser.associations.set(node, {}); - } - parser.associations.get(node).nodes = nodeIndex; - return node; - }); - return this.nodeCache[nodeIndex]; + dispose() { + this.geometry.dispose(); + this.material.dispose(); } - /** - * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes - * @param {number} sceneIndex - * @return {Promise} - */ - loadScene(sceneIndex) { - const extensions = this.extensions; - const sceneDef = this.json.scenes[sceneIndex]; - const parser = this; - const scene = new Group(); - if (sceneDef.name) scene.name = parser.createUniqueName(sceneDef.name); - assignExtrasToUserData(scene, sceneDef); - if (sceneDef.extensions) addUnknownExtensionsToUserData(extensions, scene, sceneDef); - const nodeIds = sceneDef.nodes || []; - const pending = []; - for (let i = 0, il = nodeIds.length; i < il; i++) { - pending.push(parser.getDependency("node", nodeIds[i])); +} +class PolarGridHelper extends LineSegments { + static { + __name(this, "PolarGridHelper"); + } + constructor(radius = 10, sectors = 16, rings = 8, divisions = 64, color1 = 4473924, color2 = 8947848) { + color1 = new Color(color1); + color2 = new Color(color2); + const vertices = []; + const colors = []; + if (sectors > 1) { + for (let i = 0; i < sectors; i++) { + const v = i / sectors * (Math.PI * 2); + const x = Math.sin(v) * radius; + const z = Math.cos(v) * radius; + vertices.push(0, 0, 0); + vertices.push(x, 0, z); + const color = i & 1 ? color1 : color2; + colors.push(color.r, color.g, color.b); + colors.push(color.r, color.g, color.b); + } } - return Promise.all(pending).then(function(nodes) { - for (let i = 0, il = nodes.length; i < il; i++) { - scene.add(nodes[i]); + for (let i = 0; i < rings; i++) { + const color = i & 1 ? color1 : color2; + const r = radius - radius / rings * i; + for (let j = 0; j < divisions; j++) { + let v = j / divisions * (Math.PI * 2); + let x = Math.sin(v) * r; + let z = Math.cos(v) * r; + vertices.push(x, 0, z); + colors.push(color.r, color.g, color.b); + v = (j + 1) / divisions * (Math.PI * 2); + x = Math.sin(v) * r; + z = Math.cos(v) * r; + vertices.push(x, 0, z); + colors.push(color.r, color.g, color.b); } - const reduceAssociations = /* @__PURE__ */ __name((node) => { - const reducedAssociations = /* @__PURE__ */ new Map(); - for (const [key, value] of parser.associations) { - if (key instanceof Material || key instanceof Texture) { - reducedAssociations.set(key, value); - } - } - node.traverse((node2) => { - const mappings = parser.associations.get(node2); - if (mappings != null) { - reducedAssociations.set(node2, mappings); - } - }); - return reducedAssociations; - }, "reduceAssociations"); - parser.associations = reduceAssociations(scene); - return scene; - }); + } + const geometry = new BufferGeometry(); + geometry.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + geometry.setAttribute("color", new Float32BufferAttribute(colors, 3)); + const material = new LineBasicMaterial({ vertexColors: true, toneMapped: false }); + super(geometry, material); + this.type = "PolarGridHelper"; } - _createAnimationTracks(node, inputAccessor, outputAccessor, sampler, target) { - const tracks = []; - const targetName = node.name ? node.name : node.uuid; - const targetNames = []; - if (PATH_PROPERTIES[target.path] === PATH_PROPERTIES.weights) { - node.traverse(function(object) { - if (object.morphTargetInfluences) { - targetNames.push(object.name ? object.name : object.uuid); - } - }); + dispose() { + this.geometry.dispose(); + this.material.dispose(); + } +} +const _v1 = /* @__PURE__ */ new Vector3(); +const _v2 = /* @__PURE__ */ new Vector3(); +const _v3 = /* @__PURE__ */ new Vector3(); +class DirectionalLightHelper extends Object3D { + static { + __name(this, "DirectionalLightHelper"); + } + constructor(light, size, color) { + super(); + this.light = light; + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + this.color = color; + this.type = "DirectionalLightHelper"; + if (size === void 0) size = 1; + let geometry = new BufferGeometry(); + geometry.setAttribute("position", new Float32BufferAttribute([ + -size, + size, + 0, + size, + size, + 0, + size, + -size, + 0, + -size, + -size, + 0, + -size, + size, + 0 + ], 3)); + const material = new LineBasicMaterial({ fog: false, toneMapped: false }); + this.lightPlane = new Line(geometry, material); + this.add(this.lightPlane); + geometry = new BufferGeometry(); + geometry.setAttribute("position", new Float32BufferAttribute([0, 0, 0, 0, 0, 1], 3)); + this.targetLine = new Line(geometry, material); + this.add(this.targetLine); + this.update(); + } + dispose() { + this.lightPlane.geometry.dispose(); + this.lightPlane.material.dispose(); + this.targetLine.geometry.dispose(); + this.targetLine.material.dispose(); + } + update() { + this.light.updateWorldMatrix(true, false); + this.light.target.updateWorldMatrix(true, false); + _v1.setFromMatrixPosition(this.light.matrixWorld); + _v2.setFromMatrixPosition(this.light.target.matrixWorld); + _v3.subVectors(_v2, _v1); + this.lightPlane.lookAt(_v2); + if (this.color !== void 0) { + this.lightPlane.material.color.set(this.color); + this.targetLine.material.color.set(this.color); } else { - targetNames.push(targetName); + this.lightPlane.material.color.copy(this.light.color); + this.targetLine.material.color.copy(this.light.color); } - let TypedKeyframeTrack; - switch (PATH_PROPERTIES[target.path]) { - case PATH_PROPERTIES.weights: - TypedKeyframeTrack = NumberKeyframeTrack; - break; - case PATH_PROPERTIES.rotation: - TypedKeyframeTrack = QuaternionKeyframeTrack; - break; - case PATH_PROPERTIES.position: - case PATH_PROPERTIES.scale: - TypedKeyframeTrack = VectorKeyframeTrack; - break; - default: - switch (outputAccessor.itemSize) { - case 1: - TypedKeyframeTrack = NumberKeyframeTrack; - break; - case 2: - case 3: - default: - TypedKeyframeTrack = VectorKeyframeTrack; - break; - } - break; + this.targetLine.lookAt(_v2); + this.targetLine.scale.z = _v3.length(); + } +} +const _vector = /* @__PURE__ */ new Vector3(); +const _camera = /* @__PURE__ */ new Camera(); +class CameraHelper extends LineSegments { + static { + __name(this, "CameraHelper"); + } + constructor(camera) { + const geometry = new BufferGeometry(); + const material = new LineBasicMaterial({ color: 16777215, vertexColors: true, toneMapped: false }); + const vertices = []; + const colors = []; + const pointMap = {}; + addLine("n1", "n2"); + addLine("n2", "n4"); + addLine("n4", "n3"); + addLine("n3", "n1"); + addLine("f1", "f2"); + addLine("f2", "f4"); + addLine("f4", "f3"); + addLine("f3", "f1"); + addLine("n1", "f1"); + addLine("n2", "f2"); + addLine("n3", "f3"); + addLine("n4", "f4"); + addLine("p", "n1"); + addLine("p", "n2"); + addLine("p", "n3"); + addLine("p", "n4"); + addLine("u1", "u2"); + addLine("u2", "u3"); + addLine("u3", "u1"); + addLine("c", "t"); + addLine("p", "c"); + addLine("cn1", "cn2"); + addLine("cn3", "cn4"); + addLine("cf1", "cf2"); + addLine("cf3", "cf4"); + function addLine(a, b) { + addPoint(a); + addPoint(b); } - const interpolation = sampler.interpolation !== void 0 ? INTERPOLATION[sampler.interpolation] : InterpolateLinear; - const outputArray = this._getArrayFromAccessor(outputAccessor); - for (let j = 0, jl = targetNames.length; j < jl; j++) { - const track = new TypedKeyframeTrack( - targetNames[j] + "." + PATH_PROPERTIES[target.path], - inputAccessor.array, - outputArray, - interpolation - ); - if (sampler.interpolation === "CUBICSPLINE") { - this._createCubicSplineTrackInterpolant(track); + __name(addLine, "addLine"); + function addPoint(id2) { + vertices.push(0, 0, 0); + colors.push(0, 0, 0); + if (pointMap[id2] === void 0) { + pointMap[id2] = []; } - tracks.push(track); + pointMap[id2].push(vertices.length / 3 - 1); + } + __name(addPoint, "addPoint"); + geometry.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + geometry.setAttribute("color", new Float32BufferAttribute(colors, 3)); + super(geometry, material); + this.type = "CameraHelper"; + this.camera = camera; + if (this.camera.updateProjectionMatrix) this.camera.updateProjectionMatrix(); + this.matrix = camera.matrixWorld; + this.matrixAutoUpdate = false; + this.pointMap = pointMap; + this.update(); + const colorFrustum = new Color(16755200); + const colorCone = new Color(16711680); + const colorUp = new Color(43775); + const colorTarget = new Color(16777215); + const colorCross = new Color(3355443); + this.setColors(colorFrustum, colorCone, colorUp, colorTarget, colorCross); + } + setColors(frustum, cone, up, target, cross) { + const geometry = this.geometry; + const colorAttribute = geometry.getAttribute("color"); + colorAttribute.setXYZ(0, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(1, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(2, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(3, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(4, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(5, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(6, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(7, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(8, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(9, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(10, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(11, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(12, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(13, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(14, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(15, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(16, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(17, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(18, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(19, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(20, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(21, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(22, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(23, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(24, cone.r, cone.g, cone.b); + colorAttribute.setXYZ(25, cone.r, cone.g, cone.b); + colorAttribute.setXYZ(26, cone.r, cone.g, cone.b); + colorAttribute.setXYZ(27, cone.r, cone.g, cone.b); + colorAttribute.setXYZ(28, cone.r, cone.g, cone.b); + colorAttribute.setXYZ(29, cone.r, cone.g, cone.b); + colorAttribute.setXYZ(30, cone.r, cone.g, cone.b); + colorAttribute.setXYZ(31, cone.r, cone.g, cone.b); + colorAttribute.setXYZ(32, up.r, up.g, up.b); + colorAttribute.setXYZ(33, up.r, up.g, up.b); + colorAttribute.setXYZ(34, up.r, up.g, up.b); + colorAttribute.setXYZ(35, up.r, up.g, up.b); + colorAttribute.setXYZ(36, up.r, up.g, up.b); + colorAttribute.setXYZ(37, up.r, up.g, up.b); + colorAttribute.setXYZ(38, target.r, target.g, target.b); + colorAttribute.setXYZ(39, target.r, target.g, target.b); + colorAttribute.setXYZ(40, cross.r, cross.g, cross.b); + colorAttribute.setXYZ(41, cross.r, cross.g, cross.b); + colorAttribute.setXYZ(42, cross.r, cross.g, cross.b); + colorAttribute.setXYZ(43, cross.r, cross.g, cross.b); + colorAttribute.setXYZ(44, cross.r, cross.g, cross.b); + colorAttribute.setXYZ(45, cross.r, cross.g, cross.b); + colorAttribute.setXYZ(46, cross.r, cross.g, cross.b); + colorAttribute.setXYZ(47, cross.r, cross.g, cross.b); + colorAttribute.setXYZ(48, cross.r, cross.g, cross.b); + colorAttribute.setXYZ(49, cross.r, cross.g, cross.b); + colorAttribute.needsUpdate = true; + } + update() { + const geometry = this.geometry; + const pointMap = this.pointMap; + const w = 1, h = 1; + _camera.projectionMatrixInverse.copy(this.camera.projectionMatrixInverse); + setPoint("c", pointMap, geometry, _camera, 0, 0, -1); + setPoint("t", pointMap, geometry, _camera, 0, 0, 1); + setPoint("n1", pointMap, geometry, _camera, -w, -h, -1); + setPoint("n2", pointMap, geometry, _camera, w, -h, -1); + setPoint("n3", pointMap, geometry, _camera, -w, h, -1); + setPoint("n4", pointMap, geometry, _camera, w, h, -1); + setPoint("f1", pointMap, geometry, _camera, -w, -h, 1); + setPoint("f2", pointMap, geometry, _camera, w, -h, 1); + setPoint("f3", pointMap, geometry, _camera, -w, h, 1); + setPoint("f4", pointMap, geometry, _camera, w, h, 1); + setPoint("u1", pointMap, geometry, _camera, w * 0.7, h * 1.1, -1); + setPoint("u2", pointMap, geometry, _camera, -w * 0.7, h * 1.1, -1); + setPoint("u3", pointMap, geometry, _camera, 0, h * 2, -1); + setPoint("cf1", pointMap, geometry, _camera, -w, 0, 1); + setPoint("cf2", pointMap, geometry, _camera, w, 0, 1); + setPoint("cf3", pointMap, geometry, _camera, 0, -h, 1); + setPoint("cf4", pointMap, geometry, _camera, 0, h, 1); + setPoint("cn1", pointMap, geometry, _camera, -w, 0, -1); + setPoint("cn2", pointMap, geometry, _camera, w, 0, -1); + setPoint("cn3", pointMap, geometry, _camera, 0, -h, -1); + setPoint("cn4", pointMap, geometry, _camera, 0, h, -1); + geometry.getAttribute("position").needsUpdate = true; + } + dispose() { + this.geometry.dispose(); + this.material.dispose(); + } +} +function setPoint(point, pointMap, geometry, camera, x, y, z) { + _vector.set(x, y, z).unproject(camera); + const points = pointMap[point]; + if (points !== void 0) { + const position = geometry.getAttribute("position"); + for (let i = 0, l = points.length; i < l; i++) { + position.setXYZ(points[i], _vector.x, _vector.y, _vector.z); } - return tracks; } - _getArrayFromAccessor(accessor) { - let outputArray = accessor.array; - if (accessor.normalized) { - const scale = getNormalizedComponentScale(outputArray.constructor); - const scaled = new Float32Array(outputArray.length); - for (let j = 0, jl = outputArray.length; j < jl; j++) { - scaled[j] = outputArray[j] * scale; - } - outputArray = scaled; +} +__name(setPoint, "setPoint"); +const _box = /* @__PURE__ */ new Box3(); +class BoxHelper extends LineSegments { + static { + __name(this, "BoxHelper"); + } + constructor(object, color = 16776960) { + const 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]); + const positions = new Float32Array(8 * 3); + const geometry = new BufferGeometry(); + geometry.setIndex(new BufferAttribute(indices, 1)); + geometry.setAttribute("position", new BufferAttribute(positions, 3)); + super(geometry, new LineBasicMaterial({ color, toneMapped: false })); + this.object = object; + this.type = "BoxHelper"; + this.matrixAutoUpdate = false; + this.update(); + } + update(object) { + if (object !== void 0) { + console.warn("THREE.BoxHelper: .update() has no longer arguments."); } - return outputArray; + if (this.object !== void 0) { + _box.setFromObject(this.object); + } + if (_box.isEmpty()) return; + const min = _box.min; + const max2 = _box.max; + const position = this.geometry.attributes.position; + const array = position.array; + array[0] = max2.x; + array[1] = max2.y; + array[2] = max2.z; + array[3] = min.x; + array[4] = max2.y; + array[5] = max2.z; + array[6] = min.x; + array[7] = min.y; + array[8] = max2.z; + array[9] = max2.x; + array[10] = min.y; + array[11] = max2.z; + array[12] = max2.x; + array[13] = max2.y; + array[14] = min.z; + array[15] = min.x; + array[16] = max2.y; + array[17] = min.z; + array[18] = min.x; + array[19] = min.y; + array[20] = min.z; + array[21] = max2.x; + array[22] = min.y; + array[23] = min.z; + position.needsUpdate = true; + this.geometry.computeBoundingSphere(); } - _createCubicSplineTrackInterpolant(track) { - track.createInterpolant = /* @__PURE__ */ __name(function InterpolantFactoryMethodGLTFCubicSpline(result) { - const interpolantType = this instanceof QuaternionKeyframeTrack ? GLTFCubicSplineQuaternionInterpolant : GLTFCubicSplineInterpolant; - return new interpolantType(this.times, this.values, this.getValueSize() / 3, result); - }, "InterpolantFactoryMethodGLTFCubicSpline"); - track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true; + setFromObject(object) { + this.object = object; + this.update(); + return this; + } + copy(source, recursive) { + super.copy(source, recursive); + this.object = source.object; + return this; + } + dispose() { + this.geometry.dispose(); + this.material.dispose(); } } -function computeBounds(geometry, primitiveDef, parser) { - const attributes = primitiveDef.attributes; - const box = new Box3(); - if (attributes.POSITION !== void 0) { - const accessor = parser.json.accessors[attributes.POSITION]; - const min = accessor.min; - const max2 = accessor.max; - if (min !== void 0 && max2 !== void 0) { - box.set( - new Vector3(min[0], min[1], min[2]), - new Vector3(max2[0], max2[1], max2[2]) - ); - if (accessor.normalized) { - const boxScale = getNormalizedComponentScale(WEBGL_COMPONENT_TYPES[accessor.componentType]); - box.min.multiplyScalar(boxScale); - box.max.multiplyScalar(boxScale); - } - } else { - console.warn("THREE.GLTFLoader: Missing min/max properties for accessor POSITION."); - return; - } - } else { - return; +class Box3Helper extends LineSegments { + static { + __name(this, "Box3Helper"); } - const targets = primitiveDef.targets; - if (targets !== void 0) { - const maxDisplacement = new Vector3(); - const vector = new Vector3(); - for (let i = 0, il = targets.length; i < il; i++) { - const target = targets[i]; - if (target.POSITION !== void 0) { - const accessor = parser.json.accessors[target.POSITION]; - const min = accessor.min; - const max2 = accessor.max; - if (min !== void 0 && max2 !== void 0) { - vector.setX(Math.max(Math.abs(min[0]), Math.abs(max2[0]))); - vector.setY(Math.max(Math.abs(min[1]), Math.abs(max2[1]))); - vector.setZ(Math.max(Math.abs(min[2]), Math.abs(max2[2]))); - if (accessor.normalized) { - const boxScale = getNormalizedComponentScale(WEBGL_COMPONENT_TYPES[accessor.componentType]); - vector.multiplyScalar(boxScale); - } - maxDisplacement.max(vector); - } else { - console.warn("THREE.GLTFLoader: Missing min/max properties for accessor POSITION."); - } - } - } - box.expandByVector(maxDisplacement); + constructor(box, color = 16776960) { + const 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]); + const 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]; + const geometry = new BufferGeometry(); + geometry.setIndex(new BufferAttribute(indices, 1)); + geometry.setAttribute("position", new Float32BufferAttribute(positions, 3)); + super(geometry, new LineBasicMaterial({ color, toneMapped: false })); + this.box = box; + this.type = "Box3Helper"; + this.geometry.computeBoundingSphere(); + } + updateMatrixWorld(force) { + const box = this.box; + if (box.isEmpty()) return; + box.getCenter(this.position); + box.getSize(this.scale); + this.scale.multiplyScalar(0.5); + super.updateMatrixWorld(force); + } + dispose() { + this.geometry.dispose(); + this.material.dispose(); } - geometry.boundingBox = box; - const sphere = new Sphere(); - box.getCenter(sphere.center); - sphere.radius = box.min.distanceTo(box.max) / 2; - geometry.boundingSphere = sphere; } -__name(computeBounds, "computeBounds"); -function addPrimitiveAttributes(geometry, primitiveDef, parser) { - const attributes = primitiveDef.attributes; - const pending = []; - function assignAttributeAccessor(accessorIndex, attributeName) { - return parser.getDependency("accessor", accessorIndex).then(function(accessor) { - geometry.setAttribute(attributeName, accessor); - }); +class PlaneHelper extends Line { + static { + __name(this, "PlaneHelper"); } - __name(assignAttributeAccessor, "assignAttributeAccessor"); - for (const gltfAttributeName in attributes) { - const threeAttributeName = ATTRIBUTES[gltfAttributeName] || gltfAttributeName.toLowerCase(); - if (threeAttributeName in geometry.attributes) continue; - pending.push(assignAttributeAccessor(attributes[gltfAttributeName], threeAttributeName)); + constructor(plane, size = 1, hex = 16776960) { + const color = hex; + const 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]; + const geometry = new BufferGeometry(); + geometry.setAttribute("position", new Float32BufferAttribute(positions, 3)); + geometry.computeBoundingSphere(); + super(geometry, new LineBasicMaterial({ color, toneMapped: false })); + this.type = "PlaneHelper"; + this.plane = plane; + this.size = size; + const positions2 = [1, 1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, -1, 0, 1, -1, 0]; + const geometry2 = new BufferGeometry(); + geometry2.setAttribute("position", new Float32BufferAttribute(positions2, 3)); + geometry2.computeBoundingSphere(); + this.add(new Mesh(geometry2, new MeshBasicMaterial({ color, opacity: 0.2, transparent: true, depthWrite: false, toneMapped: false }))); } - if (primitiveDef.indices !== void 0 && !geometry.index) { - const accessor = parser.getDependency("accessor", primitiveDef.indices).then(function(accessor2) { - geometry.setIndex(accessor2); - }); - pending.push(accessor); + updateMatrixWorld(force) { + this.position.set(0, 0, 0); + this.scale.set(0.5 * this.size, 0.5 * this.size, 1); + this.lookAt(this.plane.normal); + this.translateZ(-this.plane.constant); + super.updateMatrixWorld(force); } - if (ColorManagement.workingColorSpace !== LinearSRGBColorSpace && "COLOR_0" in attributes) { - console.warn(`THREE.GLTFLoader: Converting vertex colors from "srgb-linear" to "${ColorManagement.workingColorSpace}" not supported.`); + dispose() { + this.geometry.dispose(); + this.material.dispose(); + this.children[0].geometry.dispose(); + this.children[0].material.dispose(); } - assignExtrasToUserData(geometry, primitiveDef); - computeBounds(geometry, primitiveDef, parser); - return Promise.all(pending).then(function() { - return primitiveDef.targets !== void 0 ? addMorphTargets(geometry, primitiveDef.targets, parser) : geometry; - }); } -__name(addPrimitiveAttributes, "addPrimitiveAttributes"); -class MTLLoader extends Loader { +const _axis = /* @__PURE__ */ new Vector3(); +let _lineGeometry, _coneGeometry; +class ArrowHelper extends Object3D { static { - __name(this, "MTLLoader"); + __name(this, "ArrowHelper"); } - constructor(manager) { - super(manager); + // dir is assumed to be normalized + constructor(dir = new Vector3(0, 0, 1), origin = new Vector3(0, 0, 0), length = 1, color = 16776960, headLength = length * 0.2, headWidth = headLength * 0.2) { + super(); + this.type = "ArrowHelper"; + if (_lineGeometry === void 0) { + _lineGeometry = new BufferGeometry(); + _lineGeometry.setAttribute("position", new Float32BufferAttribute([0, 0, 0, 0, 1, 0], 3)); + _coneGeometry = new CylinderGeometry(0, 0.5, 1, 5, 1); + _coneGeometry.translate(0, -0.5, 0); + } + this.position.copy(origin); + this.line = new Line(_lineGeometry, new LineBasicMaterial({ color, toneMapped: false })); + this.line.matrixAutoUpdate = false; + this.add(this.line); + this.cone = new Mesh(_coneGeometry, new MeshBasicMaterial({ color, toneMapped: false })); + this.cone.matrixAutoUpdate = false; + this.add(this.cone); + this.setDirection(dir); + this.setLength(length, headLength, headWidth); } - /** - * Loads and parses a MTL asset from a URL. - * - * @param {String} url - URL to the MTL file. - * @param {Function} [onLoad] - Callback invoked with the loaded object. - * @param {Function} [onProgress] - Callback for download progress. - * @param {Function} [onError] - Callback for download errors. - * - * @see setPath setResourcePath - * - * @note In order for relative texture references to resolve correctly - * you must call setResourcePath() explicitly prior to load. - */ - load(url, onLoad, onProgress, onError) { - const scope = this; - const path = this.path === "" ? LoaderUtils.extractUrlBase(url) : this.path; - const loader = new FileLoader(this.manager); - loader.setPath(this.path); - loader.setRequestHeader(this.requestHeader); - loader.setWithCredentials(this.withCredentials); - loader.load(url, function(text) { - try { - onLoad(scope.parse(text, path)); - } catch (e) { - if (onError) { - onError(e); - } else { - console.error(e); - } - scope.manager.itemError(url); - } - }, onProgress, onError); + setDirection(dir) { + if (dir.y > 0.99999) { + this.quaternion.set(0, 0, 0, 1); + } else if (dir.y < -0.99999) { + this.quaternion.set(1, 0, 0, 0); + } else { + _axis.set(dir.z, 0, -dir.x).normalize(); + const radians = Math.acos(dir.y); + this.quaternion.setFromAxisAngle(_axis, radians); + } } - setMaterialOptions(value) { - this.materialOptions = value; + setLength(length, headLength = length * 0.2, headWidth = headLength * 0.2) { + this.line.scale.set(1, Math.max(1e-4, length - headLength), 1); + this.line.updateMatrix(); + this.cone.scale.set(headWidth, headLength, headWidth); + this.cone.position.y = length; + this.cone.updateMatrix(); + } + setColor(color) { + this.line.material.color.set(color); + this.cone.material.color.set(color); + } + copy(source) { + super.copy(source, false); + this.line.copy(source.line); + this.cone.copy(source.cone); return this; } - /** - * Parses a MTL file. - * - * @param {String} text - Content of MTL file - * @return {MaterialCreator} - * - * @see setPath setResourcePath - * - * @note In order for relative texture references to resolve correctly - * you must call setResourcePath() explicitly prior to parse. - */ - parse(text, path) { - const lines = text.split("\n"); - let info = {}; - const delimiter_pattern = /\s+/; - const materialsInfo = {}; - for (let i = 0; i < lines.length; i++) { - let line = lines[i]; - line = line.trim(); - if (line.length === 0 || line.charAt(0) === "#") { - continue; - } - const pos = line.indexOf(" "); - let key = pos >= 0 ? line.substring(0, pos) : line; - key = key.toLowerCase(); - let value = pos >= 0 ? line.substring(pos + 1) : ""; - value = value.trim(); - if (key === "newmtl") { - info = { name: value }; - materialsInfo[value] = info; - } else { - if (key === "ka" || key === "kd" || key === "ks" || key === "ke") { - const ss = value.split(delimiter_pattern, 3); - info[key] = [parseFloat(ss[0]), parseFloat(ss[1]), parseFloat(ss[2])]; - } else { - info[key] = value; - } - } - } - const materialCreator = new MaterialCreator(this.resourcePath || path, this.materialOptions); - materialCreator.setCrossOrigin(this.crossOrigin); - materialCreator.setManager(this.manager); - materialCreator.setMaterials(materialsInfo); - return materialCreator; + dispose() { + this.line.geometry.dispose(); + this.line.material.dispose(); + this.cone.geometry.dispose(); + this.cone.material.dispose(); } } -class MaterialCreator { +class AxesHelper extends LineSegments { static { - __name(this, "MaterialCreator"); + __name(this, "AxesHelper"); } - constructor(baseUrl = "", options = {}) { - this.baseUrl = baseUrl; - this.options = options; - this.materialsInfo = {}; - this.materials = {}; - this.materialsArray = []; - this.nameLookup = {}; - this.crossOrigin = "anonymous"; - this.side = this.options.side !== void 0 ? this.options.side : FrontSide; - this.wrap = this.options.wrap !== void 0 ? this.options.wrap : RepeatWrapping; + constructor(size = 1) { + const vertices = [ + 0, + 0, + 0, + size, + 0, + 0, + 0, + 0, + 0, + 0, + size, + 0, + 0, + 0, + 0, + 0, + 0, + size + ]; + const colors = [ + 1, + 0, + 0, + 1, + 0.6, + 0, + 0, + 1, + 0, + 0.6, + 1, + 0, + 0, + 0, + 1, + 0, + 0.6, + 1 + ]; + const geometry = new BufferGeometry(); + geometry.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + geometry.setAttribute("color", new Float32BufferAttribute(colors, 3)); + const material = new LineBasicMaterial({ vertexColors: true, toneMapped: false }); + super(geometry, material); + this.type = "AxesHelper"; } - setCrossOrigin(value) { - this.crossOrigin = value; + setColors(xAxisColor, yAxisColor, zAxisColor) { + const color = new Color(); + const array = this.geometry.attributes.color.array; + color.set(xAxisColor); + color.toArray(array, 0); + color.toArray(array, 3); + color.set(yAxisColor); + color.toArray(array, 6); + color.toArray(array, 9); + color.set(zAxisColor); + color.toArray(array, 12); + color.toArray(array, 15); + this.geometry.attributes.color.needsUpdate = true; return this; } - setManager(value) { - this.manager = value; + dispose() { + this.geometry.dispose(); + this.material.dispose(); } - setMaterials(materialsInfo) { - this.materialsInfo = this.convert(materialsInfo); - this.materials = {}; - this.materialsArray = []; - this.nameLookup = {}; +} +class ShapePath { + static { + __name(this, "ShapePath"); } - convert(materialsInfo) { - if (!this.options) return materialsInfo; - const converted = {}; - for (const mn in materialsInfo) { - const mat = materialsInfo[mn]; - const covmat = {}; - converted[mn] = covmat; - for (const prop in mat) { - let save = true; - let value = mat[prop]; - const lprop = prop.toLowerCase(); - switch (lprop) { - case "kd": - case "ka": - case "ks": - if (this.options && this.options.normalizeRGB) { - value = [value[0] / 255, value[1] / 255, value[2] / 255]; - } - if (this.options && this.options.ignoreZeroRGBs) { - if (value[0] === 0 && value[1] === 0 && value[2] === 0) { - save = false; - } - } - break; - default: - break; - } - if (save) { - covmat[lprop] = value; - } - } - } - return converted; + constructor() { + this.type = "ShapePath"; + this.color = new Color(); + this.subPaths = []; + this.currentPath = null; } - preload() { - for (const mn in this.materialsInfo) { - this.create(mn); - } + moveTo(x, y) { + this.currentPath = new Path(); + this.subPaths.push(this.currentPath); + this.currentPath.moveTo(x, y); + return this; } - getIndex(materialName) { - return this.nameLookup[materialName]; + lineTo(x, y) { + this.currentPath.lineTo(x, y); + return this; } - getAsArray() { - let index = 0; - for (const mn in this.materialsInfo) { - this.materialsArray[index] = this.create(mn); - this.nameLookup[mn] = index; - index++; - } - return this.materialsArray; + quadraticCurveTo(aCPx, aCPy, aX, aY) { + this.currentPath.quadraticCurveTo(aCPx, aCPy, aX, aY); + return this; } - create(materialName) { - if (this.materials[materialName] === void 0) { - this.createMaterial_(materialName); - } - return this.materials[materialName]; + bezierCurveTo(aCP1x, aCP1y, aCP2x, aCP2y, aX, aY) { + this.currentPath.bezierCurveTo(aCP1x, aCP1y, aCP2x, aCP2y, aX, aY); + return this; } - createMaterial_(materialName) { - const scope = this; - const mat = this.materialsInfo[materialName]; - const params = { - name: materialName, - side: this.side - }; - function resolveURL(baseUrl, url) { - if (typeof url !== "string" || url === "") - return ""; - if (/^https?:\/\//i.test(url)) return url; - return baseUrl + url; - } - __name(resolveURL, "resolveURL"); - function setMapForType(mapType, value) { - if (params[mapType]) return; - const texParams = scope.getTextureParams(value, params); - const map = scope.loadTexture(resolveURL(scope.baseUrl, texParams.url)); - map.repeat.copy(texParams.scale); - map.offset.copy(texParams.offset); - map.wrapS = scope.wrap; - map.wrapT = scope.wrap; - if (mapType === "map" || mapType === "emissiveMap") { - map.colorSpace = SRGBColorSpace; + splineThru(pts) { + this.currentPath.splineThru(pts); + return this; + } + toShapes(isCCW) { + function toShapesNoHoles(inSubpaths) { + const shapes2 = []; + for (let i = 0, l = inSubpaths.length; i < l; i++) { + const tmpPath2 = inSubpaths[i]; + const tmpShape2 = new Shape(); + tmpShape2.curves = tmpPath2.curves; + shapes2.push(tmpShape2); } - params[mapType] = map; + return shapes2; } - __name(setMapForType, "setMapForType"); - for (const prop in mat) { - const value = mat[prop]; - let n; - if (value === "") continue; - switch (prop.toLowerCase()) { - case "kd": - params.color = ColorManagement.toWorkingColorSpace(new Color().fromArray(value), SRGBColorSpace); - break; - case "ks": - params.specular = ColorManagement.toWorkingColorSpace(new Color().fromArray(value), SRGBColorSpace); - break; - case "ke": - params.emissive = ColorManagement.toWorkingColorSpace(new Color().fromArray(value), SRGBColorSpace); - break; - case "map_kd": - setMapForType("map", value); - break; - case "map_ks": - setMapForType("specularMap", value); - break; - case "map_ke": - setMapForType("emissiveMap", value); - break; - case "norm": - setMapForType("normalMap", value); - break; - case "map_bump": - case "bump": - setMapForType("bumpMap", value); - break; - case "map_d": - setMapForType("alphaMap", value); - params.transparent = true; - break; - case "ns": - params.shininess = parseFloat(value); - break; - case "d": - n = parseFloat(value); - if (n < 1) { - params.opacity = n; - params.transparent = true; + __name(toShapesNoHoles, "toShapesNoHoles"); + function isPointInsidePolygon(inPt, inPolygon) { + const polyLen = inPolygon.length; + let inside = false; + for (let p = polyLen - 1, q = 0; q < polyLen; p = q++) { + let edgeLowPt = inPolygon[p]; + let edgeHighPt = inPolygon[q]; + let edgeDx = edgeHighPt.x - edgeLowPt.x; + let edgeDy = edgeHighPt.y - edgeLowPt.y; + if (Math.abs(edgeDy) > Number.EPSILON) { + if (edgeDy < 0) { + edgeLowPt = inPolygon[q]; + edgeDx = -edgeDx; + edgeHighPt = inPolygon[p]; + edgeDy = -edgeDy; } - break; - case "tr": - n = parseFloat(value); - if (this.options && this.options.invertTrProperty) n = 1 - n; - if (n > 0) { - params.opacity = 1 - n; - params.transparent = true; + if (inPt.y < edgeLowPt.y || inPt.y > edgeHighPt.y) continue; + if (inPt.y === edgeLowPt.y) { + if (inPt.x === edgeLowPt.x) return true; + } else { + const perpEdge = edgeDy * (inPt.x - edgeLowPt.x) - edgeDx * (inPt.y - edgeLowPt.y); + if (perpEdge === 0) return true; + if (perpEdge < 0) continue; + inside = !inside; } - break; - default: - break; + } else { + if (inPt.y !== edgeLowPt.y) continue; + if (edgeHighPt.x <= inPt.x && inPt.x <= edgeLowPt.x || edgeLowPt.x <= inPt.x && inPt.x <= edgeHighPt.x) return true; + } } + return inside; } - this.materials[materialName] = new MeshPhongMaterial(params); - return this.materials[materialName]; - } - getTextureParams(value, matParams) { - const texParams = { - scale: new Vector2(1, 1), - offset: new Vector2(0, 0) - }; - const items = value.split(/\s+/); - let pos; - pos = items.indexOf("-bm"); - if (pos >= 0) { - matParams.bumpScale = parseFloat(items[pos + 1]); - items.splice(pos, 2); - } - pos = items.indexOf("-s"); - if (pos >= 0) { - texParams.scale.set(parseFloat(items[pos + 1]), parseFloat(items[pos + 2])); - items.splice(pos, 4); - } - pos = items.indexOf("-o"); - if (pos >= 0) { - texParams.offset.set(parseFloat(items[pos + 1]), parseFloat(items[pos + 2])); - items.splice(pos, 4); - } - texParams.url = items.join(" ").trim(); - return texParams; - } - loadTexture(url, mapping, onLoad, onProgress, onError) { - const manager = this.manager !== void 0 ? this.manager : DefaultLoadingManager; - let loader = manager.getHandler(url); - if (loader === null) { - loader = new TextureLoader(manager); + __name(isPointInsidePolygon, "isPointInsidePolygon"); + const isClockWise = ShapeUtils.isClockWise; + const subPaths = this.subPaths; + if (subPaths.length === 0) return []; + let solid, tmpPath, tmpShape; + const shapes = []; + if (subPaths.length === 1) { + tmpPath = subPaths[0]; + tmpShape = new Shape(); + tmpShape.curves = tmpPath.curves; + shapes.push(tmpShape); + return shapes; } - if (loader.setCrossOrigin) loader.setCrossOrigin(this.crossOrigin); - const texture = loader.load(url, onLoad, onProgress, onError); - if (mapping !== void 0) texture.mapping = mapping; - return texture; - } -} -const _object_pattern = /^[og]\s*(.+)?/; -const _material_library_pattern = /^mtllib /; -const _material_use_pattern = /^usemtl /; -const _map_use_pattern = /^usemap /; -const _face_vertex_data_separator_pattern = /\s+/; -const _vA = new Vector3(); -const _vB = new Vector3(); -const _vC = new Vector3(); -const _ab = new Vector3(); -const _cb = new Vector3(); -const _color = new Color(); -function ParserState() { - const state = { - objects: [], - object: {}, - vertices: [], - normals: [], - colors: [], - uvs: [], - materials: {}, - materialLibraries: [], - startObject: /* @__PURE__ */ __name(function(name, fromDeclaration) { - if (this.object && this.object.fromDeclaration === false) { - this.object.name = name; - this.object.fromDeclaration = fromDeclaration !== false; - return; + let holesFirst = !isClockWise(subPaths[0].getPoints()); + holesFirst = isCCW ? !holesFirst : holesFirst; + const betterShapeHoles = []; + const newShapes = []; + let newShapeHoles = []; + let mainIdx = 0; + let tmpPoints; + newShapes[mainIdx] = void 0; + newShapeHoles[mainIdx] = []; + for (let i = 0, l = subPaths.length; i < l; i++) { + tmpPath = subPaths[i]; + tmpPoints = tmpPath.getPoints(); + solid = isClockWise(tmpPoints); + solid = isCCW ? !solid : solid; + if (solid) { + if (!holesFirst && newShapes[mainIdx]) mainIdx++; + newShapes[mainIdx] = { s: new Shape(), p: tmpPoints }; + newShapes[mainIdx].s.curves = tmpPath.curves; + if (holesFirst) mainIdx++; + newShapeHoles[mainIdx] = []; + } else { + newShapeHoles[mainIdx].push({ h: tmpPath, p: tmpPoints[0] }); } - const previousMaterial = this.object && typeof this.object.currentMaterial === "function" ? this.object.currentMaterial() : void 0; - if (this.object && typeof this.object._finalize === "function") { - this.object._finalize(true); + } + if (!newShapes[0]) return toShapesNoHoles(subPaths); + if (newShapes.length > 1) { + let ambiguous = false; + let toChange = 0; + for (let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx++) { + betterShapeHoles[sIdx] = []; } - this.object = { - name: name || "", - fromDeclaration: fromDeclaration !== false, - geometry: { - vertices: [], - normals: [], - colors: [], - uvs: [], - hasUVIndices: false - }, - materials: [], - smooth: true, - startMaterial: /* @__PURE__ */ __name(function(name2, libraries) { - const previous = this._finalize(false); - if (previous && (previous.inherited || previous.groupCount <= 0)) { - this.materials.splice(previous.index, 1); - } - const material = { - index: this.materials.length, - name: name2 || "", - mtllib: Array.isArray(libraries) && libraries.length > 0 ? libraries[libraries.length - 1] : "", - smooth: previous !== void 0 ? previous.smooth : this.smooth, - groupStart: previous !== void 0 ? previous.groupEnd : 0, - groupEnd: -1, - groupCount: -1, - inherited: false, - clone: /* @__PURE__ */ __name(function(index) { - const cloned = { - index: typeof index === "number" ? index : this.index, - name: this.name, - mtllib: this.mtllib, - smooth: this.smooth, - groupStart: 0, - groupEnd: -1, - groupCount: -1, - inherited: false - }; - cloned.clone = this.clone.bind(cloned); - return cloned; - }, "clone") - }; - this.materials.push(material); - return material; - }, "startMaterial"), - currentMaterial: /* @__PURE__ */ __name(function() { - if (this.materials.length > 0) { - return this.materials[this.materials.length - 1]; - } - return void 0; - }, "currentMaterial"), - _finalize: /* @__PURE__ */ __name(function(end) { - const lastMultiMaterial = this.currentMaterial(); - if (lastMultiMaterial && lastMultiMaterial.groupEnd === -1) { - lastMultiMaterial.groupEnd = this.geometry.vertices.length / 3; - lastMultiMaterial.groupCount = lastMultiMaterial.groupEnd - lastMultiMaterial.groupStart; - lastMultiMaterial.inherited = false; - } - if (end && this.materials.length > 1) { - for (let mi = this.materials.length - 1; mi >= 0; mi--) { - if (this.materials[mi].groupCount <= 0) { - this.materials.splice(mi, 1); + for (let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx++) { + const sho = newShapeHoles[sIdx]; + for (let hIdx = 0; hIdx < sho.length; hIdx++) { + const ho = sho[hIdx]; + let hole_unassigned = true; + for (let s2Idx = 0; s2Idx < newShapes.length; s2Idx++) { + if (isPointInsidePolygon(ho.p, newShapes[s2Idx].p)) { + if (sIdx !== s2Idx) toChange++; + if (hole_unassigned) { + hole_unassigned = false; + betterShapeHoles[s2Idx].push(ho); + } else { + ambiguous = true; } } } - if (end && this.materials.length === 0) { - this.materials.push({ - name: "", - smooth: this.smooth - }); + if (hole_unassigned) { + betterShapeHoles[sIdx].push(ho); } - return lastMultiMaterial; - }, "_finalize") - }; - if (previousMaterial && previousMaterial.name && typeof previousMaterial.clone === "function") { - const declared = previousMaterial.clone(0); - declared.inherited = true; - this.object.materials.push(declared); - } - this.objects.push(this.object); - }, "startObject"), - finalize: /* @__PURE__ */ __name(function() { - if (this.object && typeof this.object._finalize === "function") { - this.object._finalize(true); - } - }, "finalize"), - parseVertexIndex: /* @__PURE__ */ __name(function(value, len) { - const index = parseInt(value, 10); - return (index >= 0 ? index - 1 : index + len / 3) * 3; - }, "parseVertexIndex"), - parseNormalIndex: /* @__PURE__ */ __name(function(value, len) { - const index = parseInt(value, 10); - return (index >= 0 ? index - 1 : index + len / 3) * 3; - }, "parseNormalIndex"), - parseUVIndex: /* @__PURE__ */ __name(function(value, len) { - const index = parseInt(value, 10); - return (index >= 0 ? index - 1 : index + len / 2) * 2; - }, "parseUVIndex"), - addVertex: /* @__PURE__ */ __name(function(a, b, c) { - const src = this.vertices; - const dst = this.object.geometry.vertices; - dst.push(src[a + 0], src[a + 1], src[a + 2]); - dst.push(src[b + 0], src[b + 1], src[b + 2]); - dst.push(src[c + 0], src[c + 1], src[c + 2]); - }, "addVertex"), - addVertexPoint: /* @__PURE__ */ __name(function(a) { - const src = this.vertices; - const dst = this.object.geometry.vertices; - dst.push(src[a + 0], src[a + 1], src[a + 2]); - }, "addVertexPoint"), - addVertexLine: /* @__PURE__ */ __name(function(a) { - const src = this.vertices; - const dst = this.object.geometry.vertices; - dst.push(src[a + 0], src[a + 1], src[a + 2]); - }, "addVertexLine"), - addNormal: /* @__PURE__ */ __name(function(a, b, c) { - const src = this.normals; - const dst = this.object.geometry.normals; - dst.push(src[a + 0], src[a + 1], src[a + 2]); - dst.push(src[b + 0], src[b + 1], src[b + 2]); - dst.push(src[c + 0], src[c + 1], src[c + 2]); - }, "addNormal"), - addFaceNormal: /* @__PURE__ */ __name(function(a, b, c) { - const src = this.vertices; - const dst = this.object.geometry.normals; - _vA.fromArray(src, a); - _vB.fromArray(src, b); - _vC.fromArray(src, c); - _cb.subVectors(_vC, _vB); - _ab.subVectors(_vA, _vB); - _cb.cross(_ab); - _cb.normalize(); - dst.push(_cb.x, _cb.y, _cb.z); - dst.push(_cb.x, _cb.y, _cb.z); - dst.push(_cb.x, _cb.y, _cb.z); - }, "addFaceNormal"), - addColor: /* @__PURE__ */ __name(function(a, b, c) { - const src = this.colors; - const dst = this.object.geometry.colors; - if (src[a] !== void 0) dst.push(src[a + 0], src[a + 1], src[a + 2]); - if (src[b] !== void 0) dst.push(src[b + 0], src[b + 1], src[b + 2]); - if (src[c] !== void 0) dst.push(src[c + 0], src[c + 1], src[c + 2]); - }, "addColor"), - addUV: /* @__PURE__ */ __name(function(a, b, c) { - const src = this.uvs; - const dst = this.object.geometry.uvs; - dst.push(src[a + 0], src[a + 1]); - dst.push(src[b + 0], src[b + 1]); - dst.push(src[c + 0], src[c + 1]); - }, "addUV"), - addDefaultUV: /* @__PURE__ */ __name(function() { - const dst = this.object.geometry.uvs; - dst.push(0, 0); - dst.push(0, 0); - dst.push(0, 0); - }, "addDefaultUV"), - addUVLine: /* @__PURE__ */ __name(function(a) { - const src = this.uvs; - const dst = this.object.geometry.uvs; - dst.push(src[a + 0], src[a + 1]); - }, "addUVLine"), - addFace: /* @__PURE__ */ __name(function(a, b, c, ua, ub, uc, na, nb, nc) { - const vLen = this.vertices.length; - let ia = this.parseVertexIndex(a, vLen); - let ib = this.parseVertexIndex(b, vLen); - let ic = this.parseVertexIndex(c, vLen); - this.addVertex(ia, ib, ic); - this.addColor(ia, ib, ic); - if (na !== void 0 && na !== "") { - const nLen = this.normals.length; - ia = this.parseNormalIndex(na, nLen); - ib = this.parseNormalIndex(nb, nLen); - ic = this.parseNormalIndex(nc, nLen); - this.addNormal(ia, ib, ic); - } else { - this.addFaceNormal(ia, ib, ic); - } - if (ua !== void 0 && ua !== "") { - const uvLen = this.uvs.length; - ia = this.parseUVIndex(ua, uvLen); - ib = this.parseUVIndex(ub, uvLen); - ic = this.parseUVIndex(uc, uvLen); - this.addUV(ia, ib, ic); - this.object.geometry.hasUVIndices = true; - } else { - this.addDefaultUV(); - } - }, "addFace"), - addPointGeometry: /* @__PURE__ */ __name(function(vertices) { - this.object.geometry.type = "Points"; - const vLen = this.vertices.length; - for (let vi = 0, l = vertices.length; vi < l; vi++) { - const index = this.parseVertexIndex(vertices[vi], vLen); - this.addVertexPoint(index); - this.addColor(index); + } } - }, "addPointGeometry"), - addLineGeometry: /* @__PURE__ */ __name(function(vertices, uvs) { - this.object.geometry.type = "Line"; - const vLen = this.vertices.length; - const uvLen = this.uvs.length; - for (let vi = 0, l = vertices.length; vi < l; vi++) { - this.addVertexLine(this.parseVertexIndex(vertices[vi], vLen)); + if (toChange > 0 && ambiguous === false) { + newShapeHoles = betterShapeHoles; } - for (let uvi = 0, l = uvs.length; uvi < l; uvi++) { - this.addUVLine(this.parseUVIndex(uvs[uvi], uvLen)); + } + let tmpHoles; + for (let i = 0, il = newShapes.length; i < il; i++) { + tmpShape = newShapes[i].s; + shapes.push(tmpShape); + tmpHoles = newShapeHoles[i]; + for (let j = 0, jl = tmpHoles.length; j < jl; j++) { + tmpShape.holes.push(tmpHoles[j].h); } - }, "addLineGeometry") - }; - state.startObject("", false); - return state; + } + return shapes; + } +} +class Controls extends EventDispatcher { + static { + __name(this, "Controls"); + } + constructor(object, domElement = null) { + super(); + this.object = object; + this.domElement = domElement; + this.enabled = true; + this.state = -1; + this.keys = {}; + this.mouseButtons = { LEFT: null, MIDDLE: null, RIGHT: null }; + this.touches = { ONE: null, TWO: null }; + } + connect() { + } + disconnect() { + } + dispose() { + } + update() { + } +} +class WebGLMultipleRenderTargets extends WebGLRenderTarget { + static { + __name(this, "WebGLMultipleRenderTargets"); + } + // @deprecated, r162 + constructor(width = 1, height = 1, count = 1, options = {}) { + console.warn('THREE.WebGLMultipleRenderTargets has been deprecated and will be removed in r172. Use THREE.WebGLRenderTarget and set the "count" parameter to enable MRT.'); + super(width, height, { ...options, count }); + this.isWebGLMultipleRenderTargets = true; + } + get texture() { + return this.textures; + } +} +if (typeof __THREE_DEVTOOLS__ !== "undefined") { + __THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register", { detail: { + revision: REVISION + } })); } -__name(ParserState, "ParserState"); -class OBJLoader extends Loader { +if (typeof window !== "undefined") { + if (window.__THREE__) { + console.warn("WARNING: Multiple instances of Three.js being imported."); + } else { + window.__THREE__ = REVISION; + } +} +const _changeEvent = { type: "change" }; +const _startEvent = { type: "start" }; +const _endEvent = { type: "end" }; +const _ray = new Ray(); +const _plane = new Plane(); +const _TILT_LIMIT = Math.cos(70 * MathUtils.DEG2RAD); +const _v = new Vector3(); +const _twoPI = 2 * Math.PI; +const _STATE = { + NONE: -1, + ROTATE: 0, + DOLLY: 1, + PAN: 2, + TOUCH_ROTATE: 3, + TOUCH_PAN: 4, + TOUCH_DOLLY_PAN: 5, + TOUCH_DOLLY_ROTATE: 6 +}; +const _EPS = 1e-6; +class OrbitControls extends Controls { static { - __name(this, "OBJLoader"); + __name(this, "OrbitControls"); } - constructor(manager) { - super(manager); - this.materials = null; + constructor(object, domElement = null) { + super(object, domElement); + this.state = _STATE.NONE; + this.enabled = true; + this.target = new Vector3(); + this.cursor = new Vector3(); + this.minDistance = 0; + this.maxDistance = Infinity; + this.minZoom = 0; + this.maxZoom = Infinity; + this.minTargetRadius = 0; + this.maxTargetRadius = Infinity; + this.minPolarAngle = 0; + this.maxPolarAngle = Math.PI; + this.minAzimuthAngle = -Infinity; + this.maxAzimuthAngle = Infinity; + this.enableDamping = false; + this.dampingFactor = 0.05; + this.enableZoom = true; + this.zoomSpeed = 1; + this.enableRotate = true; + this.rotateSpeed = 1; + this.enablePan = true; + this.panSpeed = 1; + this.screenSpacePanning = true; + this.keyPanSpeed = 7; + this.zoomToCursor = false; + this.autoRotate = false; + this.autoRotateSpeed = 2; + this.keys = { LEFT: "ArrowLeft", UP: "ArrowUp", RIGHT: "ArrowRight", BOTTOM: "ArrowDown" }; + this.mouseButtons = { LEFT: MOUSE.ROTATE, MIDDLE: MOUSE.DOLLY, RIGHT: MOUSE.PAN }; + this.touches = { ONE: TOUCH.ROTATE, TWO: TOUCH.DOLLY_PAN }; + this.target0 = this.target.clone(); + this.position0 = this.object.position.clone(); + this.zoom0 = this.object.zoom; + this._domElementKeyEvents = null; + this._lastPosition = new Vector3(); + this._lastQuaternion = new Quaternion(); + this._lastTargetPosition = new Vector3(); + this._quat = new Quaternion().setFromUnitVectors(object.up, new Vector3(0, 1, 0)); + this._quatInverse = this._quat.clone().invert(); + this._spherical = new Spherical(); + this._sphericalDelta = new Spherical(); + this._scale = 1; + this._panOffset = new Vector3(); + this._rotateStart = new Vector2(); + this._rotateEnd = new Vector2(); + this._rotateDelta = new Vector2(); + this._panStart = new Vector2(); + this._panEnd = new Vector2(); + this._panDelta = new Vector2(); + this._dollyStart = new Vector2(); + this._dollyEnd = new Vector2(); + this._dollyDelta = new Vector2(); + this._dollyDirection = new Vector3(); + this._mouse = new Vector2(); + this._performCursorZoom = false; + this._pointers = []; + this._pointerPositions = {}; + this._controlActive = false; + this._onPointerMove = onPointerMove.bind(this); + this._onPointerDown = onPointerDown.bind(this); + this._onPointerUp = onPointerUp.bind(this); + this._onContextMenu = onContextMenu.bind(this); + this._onMouseWheel = onMouseWheel.bind(this); + this._onKeyDown = onKeyDown.bind(this); + this._onTouchStart = onTouchStart.bind(this); + this._onTouchMove = onTouchMove.bind(this); + this._onMouseDown = onMouseDown.bind(this); + this._onMouseMove = onMouseMove.bind(this); + this._interceptControlDown = interceptControlDown.bind(this); + this._interceptControlUp = interceptControlUp.bind(this); + if (this.domElement !== null) { + this.connect(); + } + this.update(); } - load(url, onLoad, onProgress, onError) { - const scope = this; - const loader = new FileLoader(this.manager); - loader.setPath(this.path); - loader.setRequestHeader(this.requestHeader); - loader.setWithCredentials(this.withCredentials); - loader.load(url, function(text) { - try { - onLoad(scope.parse(text)); - } catch (e) { - if (onError) { - onError(e); - } else { - console.error(e); - } - scope.manager.itemError(url); - } - }, onProgress, onError); + connect() { + this.domElement.addEventListener("pointerdown", this._onPointerDown); + this.domElement.addEventListener("pointercancel", this._onPointerUp); + this.domElement.addEventListener("contextmenu", this._onContextMenu); + this.domElement.addEventListener("wheel", this._onMouseWheel, { passive: false }); + const document2 = this.domElement.getRootNode(); + document2.addEventListener("keydown", this._interceptControlDown, { passive: true, capture: true }); + this.domElement.style.touchAction = "none"; } - setMaterials(materials) { - this.materials = materials; - return this; + disconnect() { + this.domElement.removeEventListener("pointerdown", this._onPointerDown); + this.domElement.removeEventListener("pointermove", this._onPointerMove); + this.domElement.removeEventListener("pointerup", this._onPointerUp); + this.domElement.removeEventListener("pointercancel", this._onPointerUp); + this.domElement.removeEventListener("wheel", this._onMouseWheel); + this.domElement.removeEventListener("contextmenu", this._onContextMenu); + this.stopListenToKeyEvents(); + const document2 = this.domElement.getRootNode(); + document2.removeEventListener("keydown", this._interceptControlDown, { capture: true }); + this.domElement.style.touchAction = "auto"; } - parse(text) { - const state = new ParserState(); - if (text.indexOf("\r\n") !== -1) { - text = text.replace(/\r\n/g, "\n"); + dispose() { + this.disconnect(); + } + getPolarAngle() { + return this._spherical.phi; + } + getAzimuthalAngle() { + return this._spherical.theta; + } + getDistance() { + return this.object.position.distanceTo(this.target); + } + listenToKeyEvents(domElement) { + domElement.addEventListener("keydown", this._onKeyDown); + this._domElementKeyEvents = domElement; + } + stopListenToKeyEvents() { + if (this._domElementKeyEvents !== null) { + this._domElementKeyEvents.removeEventListener("keydown", this._onKeyDown); + this._domElementKeyEvents = null; } - if (text.indexOf("\\\n") !== -1) { - text = text.replace(/\\\n/g, ""); + } + saveState() { + this.target0.copy(this.target); + this.position0.copy(this.object.position); + this.zoom0 = this.object.zoom; + } + reset() { + this.target.copy(this.target0); + this.object.position.copy(this.position0); + this.object.zoom = this.zoom0; + this.object.updateProjectionMatrix(); + this.dispatchEvent(_changeEvent); + this.update(); + this.state = _STATE.NONE; + } + update(deltaTime = null) { + const position = this.object.position; + _v.copy(position).sub(this.target); + _v.applyQuaternion(this._quat); + this._spherical.setFromVector3(_v); + if (this.autoRotate && this.state === _STATE.NONE) { + this._rotateLeft(this._getAutoRotationAngle(deltaTime)); } - const lines = text.split("\n"); - let result = []; - for (let i = 0, l = lines.length; i < l; i++) { - const line = lines[i].trimStart(); - if (line.length === 0) continue; - const lineFirstChar = line.charAt(0); - if (lineFirstChar === "#") continue; - if (lineFirstChar === "v") { - const data = line.split(_face_vertex_data_separator_pattern); - switch (data[0]) { - case "v": - state.vertices.push( - parseFloat(data[1]), - parseFloat(data[2]), - parseFloat(data[3]) - ); - if (data.length >= 7) { - _color.setRGB( - parseFloat(data[4]), - parseFloat(data[5]), - parseFloat(data[6]), - SRGBColorSpace - ); - state.colors.push(_color.r, _color.g, _color.b); - } else { - state.colors.push(void 0, void 0, void 0); - } - break; - case "vn": - state.normals.push( - parseFloat(data[1]), - parseFloat(data[2]), - parseFloat(data[3]) - ); - break; - case "vt": - state.uvs.push( - parseFloat(data[1]), - parseFloat(data[2]) - ); - break; - } - } else if (lineFirstChar === "f") { - const lineData = line.slice(1).trim(); - const vertexData = lineData.split(_face_vertex_data_separator_pattern); - const faceVertices = []; - for (let j = 0, jl = vertexData.length; j < jl; j++) { - const vertex2 = vertexData[j]; - if (vertex2.length > 0) { - const vertexParts = vertex2.split("/"); - faceVertices.push(vertexParts); - } - } - const v1 = faceVertices[0]; - for (let j = 1, jl = faceVertices.length - 1; j < jl; j++) { - const v2 = faceVertices[j]; - const v3 = faceVertices[j + 1]; - state.addFace( - v1[0], - v2[0], - v3[0], - v1[1], - v2[1], - v3[1], - v1[2], - v2[2], - v3[2] - ); - } - } else if (lineFirstChar === "l") { - const lineParts = line.substring(1).trim().split(" "); - let lineVertices = []; - const lineUVs = []; - if (line.indexOf("/") === -1) { - lineVertices = lineParts; - } else { - for (let li = 0, llen = lineParts.length; li < llen; li++) { - const parts = lineParts[li].split("/"); - if (parts[0] !== "") lineVertices.push(parts[0]); - if (parts[1] !== "") lineUVs.push(parts[1]); - } - } - state.addLineGeometry(lineVertices, lineUVs); - } else if (lineFirstChar === "p") { - const lineData = line.slice(1).trim(); - const pointData = lineData.split(" "); - state.addPointGeometry(pointData); - } else if ((result = _object_pattern.exec(line)) !== null) { - const name = (" " + result[0].slice(1).trim()).slice(1); - state.startObject(name); - } else if (_material_use_pattern.test(line)) { - state.object.startMaterial(line.substring(7).trim(), state.materialLibraries); - } else if (_material_library_pattern.test(line)) { - state.materialLibraries.push(line.substring(7).trim()); - } else if (_map_use_pattern.test(line)) { - console.warn('THREE.OBJLoader: Rendering identifier "usemap" not supported. Textures must be defined in MTL files.'); - } else if (lineFirstChar === "s") { - result = line.split(" "); - if (result.length > 1) { - const value = result[1].trim().toLowerCase(); - state.object.smooth = value !== "0" && value !== "off"; - } else { - state.object.smooth = true; - } - const material = state.object.currentMaterial(); - if (material) material.smooth = state.object.smooth; + if (this.enableDamping) { + this._spherical.theta += this._sphericalDelta.theta * this.dampingFactor; + this._spherical.phi += this._sphericalDelta.phi * this.dampingFactor; + } else { + this._spherical.theta += this._sphericalDelta.theta; + this._spherical.phi += this._sphericalDelta.phi; + } + let min = this.minAzimuthAngle; + let max2 = this.maxAzimuthAngle; + if (isFinite(min) && isFinite(max2)) { + if (min < -Math.PI) min += _twoPI; + else if (min > Math.PI) min -= _twoPI; + if (max2 < -Math.PI) max2 += _twoPI; + else if (max2 > Math.PI) max2 -= _twoPI; + if (min <= max2) { + this._spherical.theta = Math.max(min, Math.min(max2, this._spherical.theta)); } else { - if (line === "\0") continue; - console.warn('THREE.OBJLoader: Unexpected line: "' + line + '"'); + this._spherical.theta = this._spherical.theta > (min + max2) / 2 ? Math.max(min, this._spherical.theta) : Math.min(max2, this._spherical.theta); } } - state.finalize(); - const container = new Group(); - container.materialLibraries = [].concat(state.materialLibraries); - const hasPrimitives = !(state.objects.length === 1 && state.objects[0].geometry.vertices.length === 0); - if (hasPrimitives === true) { - for (let i = 0, l = state.objects.length; i < l; i++) { - const object = state.objects[i]; - const geometry = object.geometry; - const materials = object.materials; - const isLine = geometry.type === "Line"; - const isPoints = geometry.type === "Points"; - let hasVertexColors = false; - if (geometry.vertices.length === 0) continue; - const buffergeometry = new BufferGeometry(); - buffergeometry.setAttribute("position", new Float32BufferAttribute(geometry.vertices, 3)); - if (geometry.normals.length > 0) { - buffergeometry.setAttribute("normal", new Float32BufferAttribute(geometry.normals, 3)); - } - if (geometry.colors.length > 0) { - hasVertexColors = true; - buffergeometry.setAttribute("color", new Float32BufferAttribute(geometry.colors, 3)); - } - if (geometry.hasUVIndices === true) { - buffergeometry.setAttribute("uv", new Float32BufferAttribute(geometry.uvs, 2)); - } - const createdMaterials = []; - for (let mi = 0, miLen = materials.length; mi < miLen; mi++) { - const sourceMaterial = materials[mi]; - const materialHash = sourceMaterial.name + "_" + sourceMaterial.smooth + "_" + hasVertexColors; - let material = state.materials[materialHash]; - if (this.materials !== null) { - material = this.materials.create(sourceMaterial.name); - if (isLine && material && !(material instanceof LineBasicMaterial)) { - const materialLine = new LineBasicMaterial(); - Material.prototype.copy.call(materialLine, material); - materialLine.color.copy(material.color); - material = materialLine; - } else if (isPoints && material && !(material instanceof PointsMaterial)) { - const materialPoints = new PointsMaterial({ size: 10, sizeAttenuation: false }); - Material.prototype.copy.call(materialPoints, material); - materialPoints.color.copy(material.color); - materialPoints.map = material.map; - material = materialPoints; - } - } - if (material === void 0) { - if (isLine) { - material = new LineBasicMaterial(); - } else if (isPoints) { - material = new PointsMaterial({ size: 1, sizeAttenuation: false }); - } else { - material = new MeshPhongMaterial(); - } - material.name = sourceMaterial.name; - material.flatShading = sourceMaterial.smooth ? false : true; - material.vertexColors = hasVertexColors; - state.materials[materialHash] = material; - } - createdMaterials.push(material); - } - let mesh; - if (createdMaterials.length > 1) { - for (let mi = 0, miLen = materials.length; mi < miLen; mi++) { - const sourceMaterial = materials[mi]; - buffergeometry.addGroup(sourceMaterial.groupStart, sourceMaterial.groupCount, mi); - } - if (isLine) { - mesh = new LineSegments(buffergeometry, createdMaterials); - } else if (isPoints) { - mesh = new Points(buffergeometry, createdMaterials); - } else { - mesh = new Mesh(buffergeometry, createdMaterials); - } + this._spherical.phi = Math.max(this.minPolarAngle, Math.min(this.maxPolarAngle, this._spherical.phi)); + this._spherical.makeSafe(); + if (this.enableDamping === true) { + this.target.addScaledVector(this._panOffset, this.dampingFactor); + } else { + this.target.add(this._panOffset); + } + this.target.sub(this.cursor); + this.target.clampLength(this.minTargetRadius, this.maxTargetRadius); + this.target.add(this.cursor); + let zoomChanged = false; + if (this.zoomToCursor && this._performCursorZoom || this.object.isOrthographicCamera) { + this._spherical.radius = this._clampDistance(this._spherical.radius); + } else { + const prevRadius = this._spherical.radius; + this._spherical.radius = this._clampDistance(this._spherical.radius * this._scale); + zoomChanged = prevRadius != this._spherical.radius; + } + _v.setFromSpherical(this._spherical); + _v.applyQuaternion(this._quatInverse); + position.copy(this.target).add(_v); + this.object.lookAt(this.target); + if (this.enableDamping === true) { + this._sphericalDelta.theta *= 1 - this.dampingFactor; + this._sphericalDelta.phi *= 1 - this.dampingFactor; + this._panOffset.multiplyScalar(1 - this.dampingFactor); + } else { + this._sphericalDelta.set(0, 0, 0); + this._panOffset.set(0, 0, 0); + } + if (this.zoomToCursor && this._performCursorZoom) { + let newRadius = null; + if (this.object.isPerspectiveCamera) { + const prevRadius = _v.length(); + newRadius = this._clampDistance(prevRadius * this._scale); + const radiusDelta = prevRadius - newRadius; + this.object.position.addScaledVector(this._dollyDirection, radiusDelta); + this.object.updateMatrixWorld(); + zoomChanged = !!radiusDelta; + } else if (this.object.isOrthographicCamera) { + const mouseBefore = new Vector3(this._mouse.x, this._mouse.y, 0); + mouseBefore.unproject(this.object); + const prevZoom = this.object.zoom; + this.object.zoom = Math.max(this.minZoom, Math.min(this.maxZoom, this.object.zoom / this._scale)); + this.object.updateProjectionMatrix(); + zoomChanged = prevZoom !== this.object.zoom; + const mouseAfter = new Vector3(this._mouse.x, this._mouse.y, 0); + mouseAfter.unproject(this.object); + this.object.position.sub(mouseAfter).add(mouseBefore); + this.object.updateMatrixWorld(); + newRadius = _v.length(); + } else { + console.warn("WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled."); + this.zoomToCursor = false; + } + if (newRadius !== null) { + if (this.screenSpacePanning) { + this.target.set(0, 0, -1).transformDirection(this.object.matrix).multiplyScalar(newRadius).add(this.object.position); } else { - if (isLine) { - mesh = new LineSegments(buffergeometry, createdMaterials[0]); - } else if (isPoints) { - mesh = new Points(buffergeometry, createdMaterials[0]); + _ray.origin.copy(this.object.position); + _ray.direction.set(0, 0, -1).transformDirection(this.object.matrix); + if (Math.abs(this.object.up.dot(_ray.direction)) < _TILT_LIMIT) { + this.object.lookAt(this.target); } else { - mesh = new Mesh(buffergeometry, createdMaterials[0]); + _plane.setFromNormalAndCoplanarPoint(this.object.up, this.target); + _ray.intersectPlane(_plane, this.target); } } - mesh.name = object.name; - container.add(mesh); } + } else if (this.object.isOrthographicCamera) { + const prevZoom = this.object.zoom; + this.object.zoom = Math.max(this.minZoom, Math.min(this.maxZoom, this.object.zoom / this._scale)); + if (prevZoom !== this.object.zoom) { + this.object.updateProjectionMatrix(); + zoomChanged = true; + } + } + this._scale = 1; + this._performCursorZoom = false; + if (zoomChanged || this._lastPosition.distanceToSquared(this.object.position) > _EPS || 8 * (1 - this._lastQuaternion.dot(this.object.quaternion)) > _EPS || this._lastTargetPosition.distanceToSquared(this.target) > _EPS) { + this.dispatchEvent(_changeEvent); + this._lastPosition.copy(this.object.position); + this._lastQuaternion.copy(this.object.quaternion); + this._lastTargetPosition.copy(this.target); + return true; + } + return false; + } + _getAutoRotationAngle(deltaTime) { + if (deltaTime !== null) { + return _twoPI / 60 * this.autoRotateSpeed * deltaTime; + } else { + return _twoPI / 60 / 60 * this.autoRotateSpeed; + } + } + _getZoomScale(delta) { + const normalizedDelta = Math.abs(delta * 0.01); + return Math.pow(0.95, this.zoomSpeed * normalizedDelta); + } + _rotateLeft(angle) { + this._sphericalDelta.theta -= angle; + } + _rotateUp(angle) { + this._sphericalDelta.phi -= angle; + } + _panLeft(distance, objectMatrix) { + _v.setFromMatrixColumn(objectMatrix, 0); + _v.multiplyScalar(-distance); + this._panOffset.add(_v); + } + _panUp(distance, objectMatrix) { + if (this.screenSpacePanning === true) { + _v.setFromMatrixColumn(objectMatrix, 1); } else { - if (state.vertices.length > 0) { - const material = new PointsMaterial({ size: 1, sizeAttenuation: false }); - const buffergeometry = new BufferGeometry(); - buffergeometry.setAttribute("position", new Float32BufferAttribute(state.vertices, 3)); - if (state.colors.length > 0 && state.colors[0] !== void 0) { - buffergeometry.setAttribute("color", new Float32BufferAttribute(state.colors, 3)); - material.vertexColors = true; - } - const points = new Points(buffergeometry, material); - container.add(points); - } + _v.setFromMatrixColumn(objectMatrix, 0); + _v.crossVectors(this.object.up, _v); } - return container; + _v.multiplyScalar(distance); + this._panOffset.add(_v); } -} -class STLLoader extends Loader { - static { - __name(this, "STLLoader"); + // deltaX and deltaY are in pixels; right and down are positive + _pan(deltaX, deltaY) { + const element = this.domElement; + if (this.object.isPerspectiveCamera) { + const position = this.object.position; + _v.copy(position).sub(this.target); + let targetDistance = _v.length(); + targetDistance *= Math.tan(this.object.fov / 2 * Math.PI / 180); + this._panLeft(2 * deltaX * targetDistance / element.clientHeight, this.object.matrix); + this._panUp(2 * deltaY * targetDistance / element.clientHeight, this.object.matrix); + } else if (this.object.isOrthographicCamera) { + this._panLeft(deltaX * (this.object.right - this.object.left) / this.object.zoom / element.clientWidth, this.object.matrix); + this._panUp(deltaY * (this.object.top - this.object.bottom) / this.object.zoom / element.clientHeight, this.object.matrix); + } else { + console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."); + this.enablePan = false; + } } - constructor(manager) { - super(manager); + _dollyOut(dollyScale) { + if (this.object.isPerspectiveCamera || this.object.isOrthographicCamera) { + this._scale /= dollyScale; + } else { + console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."); + this.enableZoom = false; + } } - load(url, onLoad, onProgress, onError) { - const scope = this; - const loader = new FileLoader(this.manager); - loader.setPath(this.path); - loader.setResponseType("arraybuffer"); - loader.setRequestHeader(this.requestHeader); - loader.setWithCredentials(this.withCredentials); - loader.load(url, function(text) { - try { - onLoad(scope.parse(text)); - } catch (e) { - if (onError) { - onError(e); - } else { - console.error(e); - } - scope.manager.itemError(url); - } - }, onProgress, onError); + _dollyIn(dollyScale) { + if (this.object.isPerspectiveCamera || this.object.isOrthographicCamera) { + this._scale *= dollyScale; + } else { + console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."); + this.enableZoom = false; + } } - parse(data) { - function isBinary(data2) { - const reader = new DataView(data2); - const face_size = 32 / 8 * 3 + 32 / 8 * 3 * 3 + 16 / 8; - const n_faces = reader.getUint32(80, true); - const expect = 80 + 32 / 8 + n_faces * face_size; - if (expect === reader.byteLength) { - return true; - } - const solid = [115, 111, 108, 105, 100]; - for (let off = 0; off < 5; off++) { - if (matchDataViewAt(solid, reader, off)) return false; - } - return true; + _updateZoomParameters(x, y) { + if (!this.zoomToCursor) { + return; } - __name(isBinary, "isBinary"); - function matchDataViewAt(query, reader, offset) { - for (let i = 0, il = query.length; i < il; i++) { - if (query[i] !== reader.getUint8(offset + i)) return false; - } - return true; + this._performCursorZoom = true; + const rect = this.domElement.getBoundingClientRect(); + const dx = x - rect.left; + const dy = y - rect.top; + const w = rect.width; + const h = rect.height; + this._mouse.x = dx / w * 2 - 1; + this._mouse.y = -(dy / h) * 2 + 1; + this._dollyDirection.set(this._mouse.x, this._mouse.y, 1).unproject(this.object).sub(this.object.position).normalize(); + } + _clampDistance(dist) { + return Math.max(this.minDistance, Math.min(this.maxDistance, dist)); + } + // + // event callbacks - update the object state + // + _handleMouseDownRotate(event) { + this._rotateStart.set(event.clientX, event.clientY); + } + _handleMouseDownDolly(event) { + this._updateZoomParameters(event.clientX, event.clientX); + this._dollyStart.set(event.clientX, event.clientY); + } + _handleMouseDownPan(event) { + this._panStart.set(event.clientX, event.clientY); + } + _handleMouseMoveRotate(event) { + this._rotateEnd.set(event.clientX, event.clientY); + this._rotateDelta.subVectors(this._rotateEnd, this._rotateStart).multiplyScalar(this.rotateSpeed); + const element = this.domElement; + this._rotateLeft(_twoPI * this._rotateDelta.x / element.clientHeight); + this._rotateUp(_twoPI * this._rotateDelta.y / element.clientHeight); + this._rotateStart.copy(this._rotateEnd); + this.update(); + } + _handleMouseMoveDolly(event) { + this._dollyEnd.set(event.clientX, event.clientY); + this._dollyDelta.subVectors(this._dollyEnd, this._dollyStart); + if (this._dollyDelta.y > 0) { + this._dollyOut(this._getZoomScale(this._dollyDelta.y)); + } else if (this._dollyDelta.y < 0) { + this._dollyIn(this._getZoomScale(this._dollyDelta.y)); } - __name(matchDataViewAt, "matchDataViewAt"); - function parseBinary(data2) { - const reader = new DataView(data2); - const faces = reader.getUint32(80, true); - let r, g, b, hasColors = false, colors; - let defaultR, defaultG, defaultB, alpha; - for (let index = 0; index < 80 - 10; index++) { - if (reader.getUint32(index, false) == 1129270351 && reader.getUint8(index + 4) == 82 && reader.getUint8(index + 5) == 61) { - hasColors = true; - colors = new Float32Array(faces * 3 * 3); - defaultR = reader.getUint8(index + 6) / 255; - defaultG = reader.getUint8(index + 7) / 255; - defaultB = reader.getUint8(index + 8) / 255; - alpha = reader.getUint8(index + 9) / 255; + this._dollyStart.copy(this._dollyEnd); + this.update(); + } + _handleMouseMovePan(event) { + this._panEnd.set(event.clientX, event.clientY); + this._panDelta.subVectors(this._panEnd, this._panStart).multiplyScalar(this.panSpeed); + this._pan(this._panDelta.x, this._panDelta.y); + this._panStart.copy(this._panEnd); + this.update(); + } + _handleMouseWheel(event) { + this._updateZoomParameters(event.clientX, event.clientY); + if (event.deltaY < 0) { + this._dollyIn(this._getZoomScale(event.deltaY)); + } else if (event.deltaY > 0) { + this._dollyOut(this._getZoomScale(event.deltaY)); + } + this.update(); + } + _handleKeyDown(event) { + let needsUpdate = false; + switch (event.code) { + case this.keys.UP: + if (event.ctrlKey || event.metaKey || event.shiftKey) { + this._rotateUp(_twoPI * this.rotateSpeed / this.domElement.clientHeight); + } else { + this._pan(0, this.keyPanSpeed); } - } - const dataOffset = 84; - const faceLength = 12 * 4 + 2; - const geometry = new BufferGeometry(); - const vertices = new Float32Array(faces * 3 * 3); - const normals = new Float32Array(faces * 3 * 3); - const color = new Color(); - for (let face = 0; face < faces; face++) { - const start = dataOffset + face * faceLength; - const normalX = reader.getFloat32(start, true); - const normalY = reader.getFloat32(start + 4, true); - const normalZ = reader.getFloat32(start + 8, true); - if (hasColors) { - const packedColor = reader.getUint16(start + 48, true); - if ((packedColor & 32768) === 0) { - r = (packedColor & 31) / 31; - g = (packedColor >> 5 & 31) / 31; - b = (packedColor >> 10 & 31) / 31; - } else { - r = defaultR; - g = defaultG; - b = defaultB; - } + needsUpdate = true; + break; + case this.keys.BOTTOM: + if (event.ctrlKey || event.metaKey || event.shiftKey) { + this._rotateUp(-_twoPI * this.rotateSpeed / this.domElement.clientHeight); + } else { + this._pan(0, -this.keyPanSpeed); } - for (let i = 1; i <= 3; i++) { - const vertexstart = start + i * 12; - const componentIdx = face * 3 * 3 + (i - 1) * 3; - vertices[componentIdx] = reader.getFloat32(vertexstart, true); - vertices[componentIdx + 1] = reader.getFloat32(vertexstart + 4, true); - vertices[componentIdx + 2] = reader.getFloat32(vertexstart + 8, true); - normals[componentIdx] = normalX; - normals[componentIdx + 1] = normalY; - normals[componentIdx + 2] = normalZ; - if (hasColors) { - color.setRGB(r, g, b, SRGBColorSpace); - colors[componentIdx] = color.r; - colors[componentIdx + 1] = color.g; - colors[componentIdx + 2] = color.b; - } + needsUpdate = true; + break; + case this.keys.LEFT: + if (event.ctrlKey || event.metaKey || event.shiftKey) { + this._rotateLeft(_twoPI * this.rotateSpeed / this.domElement.clientHeight); + } else { + this._pan(this.keyPanSpeed, 0); } - } - geometry.setAttribute("position", new BufferAttribute(vertices, 3)); - geometry.setAttribute("normal", new BufferAttribute(normals, 3)); - if (hasColors) { - geometry.setAttribute("color", new BufferAttribute(colors, 3)); - geometry.hasColors = true; - geometry.alpha = alpha; - } - return geometry; - } - __name(parseBinary, "parseBinary"); - function parseASCII(data2) { - const geometry = new BufferGeometry(); - const patternSolid = /solid([\s\S]*?)endsolid/g; - const patternFace = /facet([\s\S]*?)endfacet/g; - const patternName = /solid\s(.+)/; - let faceCounter = 0; - const patternFloat = /[\s]+([+-]?(?:\d*)(?:\.\d*)?(?:[eE][+-]?\d+)?)/.source; - const patternVertex = new RegExp("vertex" + patternFloat + patternFloat + patternFloat, "g"); - const patternNormal = new RegExp("normal" + patternFloat + patternFloat + patternFloat, "g"); - const vertices = []; - const normals = []; - const groupNames = []; - const normal = new Vector3(); - let result; - let groupCount = 0; - let startVertex = 0; - let endVertex = 0; - while ((result = patternSolid.exec(data2)) !== null) { - startVertex = endVertex; - const solid = result[0]; - const name = (result = patternName.exec(solid)) !== null ? result[1] : ""; - groupNames.push(name); - while ((result = patternFace.exec(solid)) !== null) { - let vertexCountPerFace = 0; - let normalCountPerFace = 0; - const text = result[0]; - while ((result = patternNormal.exec(text)) !== null) { - normal.x = parseFloat(result[1]); - normal.y = parseFloat(result[2]); - normal.z = parseFloat(result[3]); - normalCountPerFace++; - } - while ((result = patternVertex.exec(text)) !== null) { - vertices.push(parseFloat(result[1]), parseFloat(result[2]), parseFloat(result[3])); - normals.push(normal.x, normal.y, normal.z); - vertexCountPerFace++; - endVertex++; - } - if (normalCountPerFace !== 1) { - console.error("THREE.STLLoader: Something isn't right with the normal of face number " + faceCounter); - } - if (vertexCountPerFace !== 3) { - console.error("THREE.STLLoader: Something isn't right with the vertices of face number " + faceCounter); - } - faceCounter++; + needsUpdate = true; + break; + case this.keys.RIGHT: + if (event.ctrlKey || event.metaKey || event.shiftKey) { + this._rotateLeft(-_twoPI * this.rotateSpeed / this.domElement.clientHeight); + } else { + this._pan(-this.keyPanSpeed, 0); } - const start = startVertex; - const count = endVertex - startVertex; - geometry.userData.groupNames = groupNames; - geometry.addGroup(start, count, groupCount); - groupCount++; - } - geometry.setAttribute("position", new Float32BufferAttribute(vertices, 3)); - geometry.setAttribute("normal", new Float32BufferAttribute(normals, 3)); - return geometry; - } - __name(parseASCII, "parseASCII"); - function ensureString(buffer) { - if (typeof buffer !== "string") { - return new TextDecoder().decode(buffer); - } - return buffer; + needsUpdate = true; + break; } - __name(ensureString, "ensureString"); - function ensureBinary(buffer) { - if (typeof buffer === "string") { - const array_buffer = new Uint8Array(buffer.length); - for (let i = 0; i < buffer.length; i++) { - array_buffer[i] = buffer.charCodeAt(i) & 255; - } - return array_buffer.buffer || array_buffer; - } else { - return buffer; - } + if (needsUpdate) { + event.preventDefault(); + this.update(); } - __name(ensureBinary, "ensureBinary"); - const binData = ensureBinary(data); - return isBinary(binData) ? parseBinary(binData) : parseASCII(ensureString(data)); } -} -async function uploadTempImage(imageData, prefix) { - const blob = await fetch(imageData).then((r) => r.blob()); - const name = `${prefix}_${Date.now()}.png`; - const file2 = new File([blob], name); - const body = new FormData(); - body.append("image", file2); - body.append("subfolder", "threed"); - body.append("type", "temp"); - const resp = await api.fetchApi("/upload/image", { - method: "POST", - body - }); - if (resp.status !== 200) { - const err2 = `Error uploading temp image: ${resp.status} - ${resp.statusText}`; - useToastStore().addAlert(err2); - throw new Error(err2); + _handleTouchStartRotate(event) { + if (this._pointers.length === 1) { + this._rotateStart.set(event.pageX, event.pageY); + } else { + const position = this._getSecondPointerPosition(event); + const x = 0.5 * (event.pageX + position.x); + const y = 0.5 * (event.pageY + position.y); + this._rotateStart.set(x, y); + } } - return await resp.json(); -} -__name(uploadTempImage, "uploadTempImage"); -async function uploadFile$1(load3d, file2, fileInput) { - let uploadPath; - try { - const body = new FormData(); - body.append("image", file2); - body.append("subfolder", "3d"); - const resp = await api.fetchApi("/upload/image", { - method: "POST", - body - }); - if (resp.status === 200) { - const data = await resp.json(); - let path = data.name; - if (data.subfolder) path = data.subfolder + "/" + path; - uploadPath = path; - const modelUrl = api.apiURL( - getResourceURL$1(...splitFilePath$1(path), "input") - ); - await load3d.loadModel(modelUrl, file2.name); - const fileExt = file2.name.split(".").pop()?.toLowerCase(); - if (fileExt === "obj" && fileInput?.files) { - try { - const mtlFile = Array.from(fileInput.files).find( - (f) => f.name.toLowerCase().endsWith(".mtl") - ); - if (mtlFile) { - const mtlFormData = new FormData(); - mtlFormData.append("image", mtlFile); - mtlFormData.append("subfolder", "3d"); - await api.fetchApi("/upload/image", { - method: "POST", - body: mtlFormData - }); - } - } catch (mtlError) { - console.warn("Failed to upload MTL file:", mtlError); - } - } + _handleTouchStartPan(event) { + if (this._pointers.length === 1) { + this._panStart.set(event.pageX, event.pageY); } else { - useToastStore().addAlert(resp.status + " - " + resp.statusText); + const position = this._getSecondPointerPosition(event); + const x = 0.5 * (event.pageX + position.x); + const y = 0.5 * (event.pageY + position.y); + this._panStart.set(x, y); } - } catch (error) { - console.error("Upload error:", error); - useToastStore().addAlert( - error instanceof Error ? error.message : "Upload failed" - ); } - return uploadPath; -} -__name(uploadFile$1, "uploadFile$1"); -class Load3d { - static { - __name(this, "Load3d"); + _handleTouchStartDolly(event) { + const position = this._getSecondPointerPosition(event); + const dx = event.pageX - position.x; + const dy = event.pageY - position.y; + const distance = Math.sqrt(dx * dx + dy * dy); + this._dollyStart.set(0, distance); } - scene; - perspectiveCamera; - orthographicCamera; - activeCamera; - renderer; - controls; - gltfLoader; - objLoader; - mtlLoader; - fbxLoader; - stlLoader; - currentModel = null; - originalModel = null; - node; - animationFrameId = null; - gridHelper; - lights = []; - clock; - normalMaterial; - standardMaterial; - wireframeMaterial; - depthMaterial; - originalMaterials = /* @__PURE__ */ new WeakMap(); - materialMode = "original"; - currentUpDirection = "original"; - originalRotation = null; - constructor(container) { - this.scene = new Scene(); - this.perspectiveCamera = new PerspectiveCamera(75, 1, 0.1, 1e3); - this.perspectiveCamera.position.set(5, 5, 5); - const frustumSize = 10; - this.orthographicCamera = new OrthographicCamera( - -frustumSize / 2, - frustumSize / 2, - frustumSize / 2, - -frustumSize / 2, - 0.1, - 1e3 - ); - this.orthographicCamera.position.set(5, 5, 5); - this.activeCamera = this.perspectiveCamera; - this.perspectiveCamera.lookAt(0, 0, 0); - this.orthographicCamera.lookAt(0, 0, 0); - this.renderer = new WebGLRenderer({ alpha: true, antialias: true }); - this.renderer.setSize(300, 300); - this.renderer.setClearColor(2631720); - const rendererDomElement = this.renderer.domElement; - container.appendChild(rendererDomElement); - this.controls = new OrbitControls( - this.activeCamera, - this.renderer.domElement - ); - this.controls.enableDamping = true; - this.gltfLoader = new GLTFLoader(); - this.objLoader = new OBJLoader(); - this.mtlLoader = new MTLLoader(); - this.fbxLoader = new FBXLoader(); - this.stlLoader = new STLLoader(); - this.clock = new Clock(); - this.setupLights(); - this.gridHelper = new GridHelper(10, 10); - this.gridHelper.position.set(0, 0, 0); - this.scene.add(this.gridHelper); - this.normalMaterial = new MeshNormalMaterial({ - flatShading: false, - side: DoubleSide, - normalScale: new Vector2(1, 1), - transparent: false, - opacity: 1 - }); - this.wireframeMaterial = new MeshBasicMaterial({ - color: 16777215, - wireframe: true, - transparent: false, - opacity: 1 - }); - this.depthMaterial = new MeshDepthMaterial({ - depthPacking: BasicDepthPacking, - side: DoubleSide - }); - this.standardMaterial = this.createSTLMaterial(); - this.animate(); - this.handleResize(); - this.startAnimation(); + _handleTouchStartDollyPan(event) { + if (this.enableZoom) this._handleTouchStartDolly(event); + if (this.enablePan) this._handleTouchStartPan(event); } - setFOV(fov2) { - if (this.activeCamera === this.perspectiveCamera) { - this.perspectiveCamera.fov = fov2; - this.perspectiveCamera.updateProjectionMatrix(); - this.renderer.render(this.scene, this.activeCamera); + _handleTouchStartDollyRotate(event) { + if (this.enableZoom) this._handleTouchStartDolly(event); + if (this.enableRotate) this._handleTouchStartRotate(event); + } + _handleTouchMoveRotate(event) { + if (this._pointers.length == 1) { + this._rotateEnd.set(event.pageX, event.pageY); + } else { + const position = this._getSecondPointerPosition(event); + const x = 0.5 * (event.pageX + position.x); + const y = 0.5 * (event.pageY + position.y); + this._rotateEnd.set(x, y); + } + this._rotateDelta.subVectors(this._rotateEnd, this._rotateStart).multiplyScalar(this.rotateSpeed); + const element = this.domElement; + this._rotateLeft(_twoPI * this._rotateDelta.x / element.clientHeight); + this._rotateUp(_twoPI * this._rotateDelta.y / element.clientHeight); + this._rotateStart.copy(this._rotateEnd); + } + _handleTouchMovePan(event) { + if (this._pointers.length === 1) { + this._panEnd.set(event.pageX, event.pageY); + } else { + const position = this._getSecondPointerPosition(event); + const x = 0.5 * (event.pageX + position.x); + const y = 0.5 * (event.pageY + position.y); + this._panEnd.set(x, y); } + this._panDelta.subVectors(this._panEnd, this._panStart).multiplyScalar(this.panSpeed); + this._pan(this._panDelta.x, this._panDelta.y); + this._panStart.copy(this._panEnd); } - getCameraState() { - const currentType = this.getCurrentCameraType(); - return { - position: this.activeCamera.position.clone(), - target: this.controls.target.clone(), - zoom: this.activeCamera instanceof OrthographicCamera ? this.activeCamera.zoom : this.activeCamera.zoom, - cameraType: currentType - }; + _handleTouchMoveDolly(event) { + const position = this._getSecondPointerPosition(event); + const dx = event.pageX - position.x; + const dy = event.pageY - position.y; + const distance = Math.sqrt(dx * dx + dy * dy); + this._dollyEnd.set(0, distance); + this._dollyDelta.set(0, Math.pow(this._dollyEnd.y / this._dollyStart.y, this.zoomSpeed)); + this._dollyOut(this._dollyDelta.y); + this._dollyStart.copy(this._dollyEnd); + const centerX = (event.pageX + position.x) * 0.5; + const centerY = (event.pageY + position.y) * 0.5; + this._updateZoomParameters(centerX, centerY); } - setCameraState(state) { - if (this.activeCamera !== (state.cameraType === "perspective" ? this.perspectiveCamera : this.orthographicCamera)) { - this.toggleCamera(state.cameraType); - } - this.activeCamera.position.copy(state.position); - this.controls.target.copy(state.target); - if (this.activeCamera instanceof OrthographicCamera) { - this.activeCamera.zoom = state.zoom; - this.activeCamera.updateProjectionMatrix(); - } else if (this.activeCamera instanceof PerspectiveCamera) { - this.activeCamera.zoom = state.zoom; - this.activeCamera.updateProjectionMatrix(); + _handleTouchMoveDollyPan(event) { + if (this.enableZoom) this._handleTouchMoveDolly(event); + if (this.enablePan) this._handleTouchMovePan(event); + } + _handleTouchMoveDollyRotate(event) { + if (this.enableZoom) this._handleTouchMoveDolly(event); + if (this.enableRotate) this._handleTouchMoveRotate(event); + } + // pointers + _addPointer(event) { + this._pointers.push(event.pointerId); + } + _removePointer(event) { + delete this._pointerPositions[event.pointerId]; + for (let i = 0; i < this._pointers.length; i++) { + if (this._pointers[i] == event.pointerId) { + this._pointers.splice(i, 1); + return; + } } - this.controls.update(); } - setUpDirection(direction) { - if (!this.currentModel) return; - if (!this.originalRotation && this.currentModel.rotation) { - this.originalRotation = this.currentModel.rotation.clone(); + _isTrackingPointer(event) { + for (let i = 0; i < this._pointers.length; i++) { + if (this._pointers[i] == event.pointerId) return true; } - this.currentUpDirection = direction; - if (this.originalRotation) { - this.currentModel.rotation.copy(this.originalRotation); + return false; + } + _trackPointer(event) { + let position = this._pointerPositions[event.pointerId]; + if (position === void 0) { + position = new Vector2(); + this._pointerPositions[event.pointerId] = position; } - switch (direction) { - case "original": - break; - case "-x": - this.currentModel.rotation.z = Math.PI / 2; - break; - case "+x": - this.currentModel.rotation.z = -Math.PI / 2; - break; - case "-y": - this.currentModel.rotation.x = Math.PI; - break; - case "+y": - break; - case "-z": - this.currentModel.rotation.x = Math.PI / 2; + position.set(event.pageX, event.pageY); + } + _getSecondPointerPosition(event) { + const pointerId = event.pointerId === this._pointers[0] ? this._pointers[1] : this._pointers[0]; + return this._pointerPositions[pointerId]; + } + // + _customWheelEvent(event) { + const mode = event.deltaMode; + const newEvent = { + clientX: event.clientX, + clientY: event.clientY, + deltaY: event.deltaY + }; + switch (mode) { + case 1: + newEvent.deltaY *= 16; break; - case "+z": - this.currentModel.rotation.x = -Math.PI / 2; + case 2: + newEvent.deltaY *= 100; break; } - this.renderer.render(this.scene, this.activeCamera); - } - setMaterialMode(mode) { - this.materialMode = mode; - if (this.currentModel) { - if (mode === "depth") { - this.renderer.outputColorSpace = LinearSRGBColorSpace; - } else { - this.renderer.outputColorSpace = SRGBColorSpace; - } - this.currentModel.traverse((child) => { - if (child instanceof Mesh) { - switch (mode) { - case "depth": - if (!this.originalMaterials.has(child)) { - this.originalMaterials.set(child, child.material); - } - const depthMat = new MeshDepthMaterial({ - depthPacking: BasicDepthPacking, - side: DoubleSide - }); - depthMat.onBeforeCompile = (shader) => { - shader.uniforms.cameraType = { - value: this.activeCamera instanceof OrthographicCamera ? 1 : 0 - }; - shader.fragmentShader = ` - uniform float cameraType; - ${shader.fragmentShader} - `; - shader.fragmentShader = shader.fragmentShader.replace( - /gl_FragColor\s*=\s*vec4\(\s*vec3\(\s*1.0\s*-\s*fragCoordZ\s*\)\s*,\s*opacity\s*\)\s*;/, - ` - float depth = 1.0 - fragCoordZ; - if (cameraType > 0.5) { - depth = pow(depth, 400.0); - } else { - depth = pow(depth, 0.6); - } - gl_FragColor = vec4(vec3(depth), opacity); - ` - ); - }; - depthMat.customProgramCacheKey = () => { - return this.activeCamera instanceof OrthographicCamera ? "ortho" : "persp"; - }; - child.material = depthMat; - break; - case "normal": - if (!this.originalMaterials.has(child)) { - this.originalMaterials.set(child, child.material); - } - child.material = new MeshNormalMaterial({ - flatShading: false, - side: DoubleSide, - normalScale: new Vector2(1, 1), - transparent: false, - opacity: 1 - }); - child.geometry.computeVertexNormals(); - break; - case "wireframe": - if (!this.originalMaterials.has(child)) { - this.originalMaterials.set(child, child.material); - } - child.material = new MeshBasicMaterial({ - color: 16777215, - wireframe: true, - transparent: false, - opacity: 1 - }); - break; - case "original": - const originalMaterial = this.originalMaterials.get(child); - if (originalMaterial) { - child.material = originalMaterial; - } else { - child.material = this.standardMaterial; - } - break; - } - } - }); - this.renderer.render(this.scene, this.activeCamera); + if (event.ctrlKey && !this._controlActive) { + newEvent.deltaY *= 10; } + return newEvent; } - setupLights() { - const ambientLight = new AmbientLight(16777215, 0.5); - this.scene.add(ambientLight); - this.lights.push(ambientLight); - const mainLight = new DirectionalLight(16777215, 0.8); - mainLight.position.set(0, 10, 10); - this.scene.add(mainLight); - this.lights.push(mainLight); - const backLight = new DirectionalLight(16777215, 0.5); - backLight.position.set(0, 10, -10); - this.scene.add(backLight); - this.lights.push(backLight); - const leftFillLight = new DirectionalLight(16777215, 0.3); - leftFillLight.position.set(-10, 0, 0); - this.scene.add(leftFillLight); - this.lights.push(leftFillLight); - const rightFillLight = new DirectionalLight(16777215, 0.3); - rightFillLight.position.set(10, 0, 0); - this.scene.add(rightFillLight); - this.lights.push(rightFillLight); - const bottomLight = new DirectionalLight(16777215, 0.2); - bottomLight.position.set(0, -10, 0); - this.scene.add(bottomLight); - this.lights.push(bottomLight); +} +function onPointerDown(event) { + if (this.enabled === false) return; + if (this._pointers.length === 0) { + this.domElement.setPointerCapture(event.pointerId); + this.domElement.addEventListener("pointermove", this._onPointerMove); + this.domElement.addEventListener("pointerup", this._onPointerUp); } - toggleCamera(cameraType) { - const oldCamera = this.activeCamera; - const position = oldCamera.position.clone(); - const rotation = oldCamera.rotation.clone(); - const target = this.controls.target.clone(); - if (!cameraType) { - this.activeCamera = oldCamera === this.perspectiveCamera ? this.orthographicCamera : this.perspectiveCamera; - } else { - this.activeCamera = cameraType === "perspective" ? this.perspectiveCamera : this.orthographicCamera; - if (oldCamera === this.activeCamera) { - return; - } - } - this.activeCamera.position.copy(position); - this.activeCamera.rotation.copy(rotation); - if (this.materialMode === "depth" && oldCamera !== this.activeCamera) { - this.setMaterialMode("depth"); - } - this.controls.object = this.activeCamera; - this.controls.target.copy(target); - this.controls.update(); - this.handleResize(); + if (this._isTrackingPointer(event)) return; + this._addPointer(event); + if (event.pointerType === "touch") { + this._onTouchStart(event); + } else { + this._onMouseDown(event); } - getCurrentCameraType() { - return this.activeCamera === this.perspectiveCamera ? "perspective" : "orthographic"; +} +__name(onPointerDown, "onPointerDown"); +function onPointerMove(event) { + if (this.enabled === false) return; + if (event.pointerType === "touch") { + this._onTouchMove(event); + } else { + this._onMouseMove(event); } - toggleGrid(showGrid) { - if (this.gridHelper) { - this.gridHelper.visible = showGrid; - } +} +__name(onPointerMove, "onPointerMove"); +function onPointerUp(event) { + this._removePointer(event); + switch (this._pointers.length) { + case 0: + this.domElement.releasePointerCapture(event.pointerId); + this.domElement.removeEventListener("pointermove", this._onPointerMove); + this.domElement.removeEventListener("pointerup", this._onPointerUp); + this.dispatchEvent(_endEvent); + this.state = _STATE.NONE; + break; + case 1: + const pointerId = this._pointers[0]; + const position = this._pointerPositions[pointerId]; + this._onTouchStart({ pointerId, pageX: position.x, pageY: position.y }); + break; } - setLightIntensity(intensity) { - this.lights.forEach((light) => { - if (light instanceof DirectionalLight) { - if (light === this.lights[1]) { - light.intensity = intensity * 0.8; - } else if (light === this.lights[2]) { - light.intensity = intensity * 0.5; - } else if (light === this.lights[5]) { - light.intensity = intensity * 0.2; - } else { - light.intensity = intensity * 0.3; - } - } else if (light instanceof AmbientLight) { - light.intensity = intensity * 0.5; +} +__name(onPointerUp, "onPointerUp"); +function onMouseDown(event) { + let mouseAction; + switch (event.button) { + case 0: + mouseAction = this.mouseButtons.LEFT; + break; + case 1: + mouseAction = this.mouseButtons.MIDDLE; + break; + case 2: + mouseAction = this.mouseButtons.RIGHT; + break; + default: + mouseAction = -1; + } + switch (mouseAction) { + case MOUSE.DOLLY: + if (this.enableZoom === false) return; + this._handleMouseDownDolly(event); + this.state = _STATE.DOLLY; + break; + case MOUSE.ROTATE: + if (event.ctrlKey || event.metaKey || event.shiftKey) { + if (this.enablePan === false) return; + this._handleMouseDownPan(event); + this.state = _STATE.PAN; + } else { + if (this.enableRotate === false) return; + this._handleMouseDownRotate(event); + this.state = _STATE.ROTATE; } - }); + break; + case MOUSE.PAN: + if (event.ctrlKey || event.metaKey || event.shiftKey) { + if (this.enableRotate === false) return; + this._handleMouseDownRotate(event); + this.state = _STATE.ROTATE; + } else { + if (this.enablePan === false) return; + this._handleMouseDownPan(event); + this.state = _STATE.PAN; + } + break; + default: + this.state = _STATE.NONE; } - startAnimation() { - const animate = /* @__PURE__ */ __name(() => { - this.animationFrameId = requestAnimationFrame(animate); - this.controls.update(); - this.renderer.render(this.scene, this.activeCamera); - }, "animate"); - animate(); + if (this.state !== _STATE.NONE) { + this.dispatchEvent(_startEvent); } - clearModel() { - const objectsToRemove = []; - this.scene.traverse((object) => { - const isEnvironmentObject = object === this.gridHelper || this.lights.includes(object) || object === this.perspectiveCamera || object === this.orthographicCamera; - if (!isEnvironmentObject) { - objectsToRemove.push(object); +} +__name(onMouseDown, "onMouseDown"); +function onMouseMove(event) { + switch (this.state) { + case _STATE.ROTATE: + if (this.enableRotate === false) return; + this._handleMouseMoveRotate(event); + break; + case _STATE.DOLLY: + if (this.enableZoom === false) return; + this._handleMouseMoveDolly(event); + break; + case _STATE.PAN: + if (this.enablePan === false) return; + this._handleMouseMovePan(event); + break; + } +} +__name(onMouseMove, "onMouseMove"); +function onMouseWheel(event) { + if (this.enabled === false || this.enableZoom === false || this.state !== _STATE.NONE) return; + event.preventDefault(); + this.dispatchEvent(_startEvent); + this._handleMouseWheel(this._customWheelEvent(event)); + this.dispatchEvent(_endEvent); +} +__name(onMouseWheel, "onMouseWheel"); +function onKeyDown(event) { + if (this.enabled === false || this.enablePan === false) return; + this._handleKeyDown(event); +} +__name(onKeyDown, "onKeyDown"); +function onTouchStart(event) { + this._trackPointer(event); + switch (this._pointers.length) { + case 1: + switch (this.touches.ONE) { + case TOUCH.ROTATE: + if (this.enableRotate === false) return; + this._handleTouchStartRotate(event); + this.state = _STATE.TOUCH_ROTATE; + break; + case TOUCH.PAN: + if (this.enablePan === false) return; + this._handleTouchStartPan(event); + this.state = _STATE.TOUCH_PAN; + break; + default: + this.state = _STATE.NONE; } - }); - objectsToRemove.forEach((obj) => { - if (obj.parent && obj.parent !== this.scene) { - obj.parent.remove(obj); - } else { - this.scene.remove(obj); + break; + case 2: + switch (this.touches.TWO) { + case TOUCH.DOLLY_PAN: + if (this.enableZoom === false && this.enablePan === false) return; + this._handleTouchStartDollyPan(event); + this.state = _STATE.TOUCH_DOLLY_PAN; + break; + case TOUCH.DOLLY_ROTATE: + if (this.enableZoom === false && this.enableRotate === false) return; + this._handleTouchStartDollyRotate(event); + this.state = _STATE.TOUCH_DOLLY_ROTATE; + break; + default: + this.state = _STATE.NONE; } - if (obj instanceof Mesh) { - obj.geometry?.dispose(); - if (Array.isArray(obj.material)) { - obj.material.forEach((material) => material.dispose()); - } else { - obj.material?.dispose(); + break; + default: + this.state = _STATE.NONE; + } + if (this.state !== _STATE.NONE) { + this.dispatchEvent(_startEvent); + } +} +__name(onTouchStart, "onTouchStart"); +function onTouchMove(event) { + this._trackPointer(event); + switch (this.state) { + case _STATE.TOUCH_ROTATE: + if (this.enableRotate === false) return; + this._handleTouchMoveRotate(event); + this.update(); + break; + case _STATE.TOUCH_PAN: + if (this.enablePan === false) return; + this._handleTouchMovePan(event); + this.update(); + break; + case _STATE.TOUCH_DOLLY_PAN: + if (this.enableZoom === false && this.enablePan === false) return; + this._handleTouchMoveDollyPan(event); + this.update(); + break; + case _STATE.TOUCH_DOLLY_ROTATE: + if (this.enableZoom === false && this.enableRotate === false) return; + this._handleTouchMoveDollyRotate(event); + this.update(); + break; + default: + this.state = _STATE.NONE; + } +} +__name(onTouchMove, "onTouchMove"); +function onContextMenu(event) { + if (this.enabled === false) return; + event.preventDefault(); +} +__name(onContextMenu, "onContextMenu"); +function interceptControlDown(event) { + if (event.key === "Control") { + this._controlActive = true; + const document2 = this.domElement.getRootNode(); + document2.addEventListener("keyup", this._interceptControlUp, { passive: true, capture: true }); + } +} +__name(interceptControlDown, "interceptControlDown"); +function interceptControlUp(event) { + if (event.key === "Control") { + this._controlActive = false; + const document2 = this.domElement.getRootNode(); + document2.removeEventListener("keyup", this._interceptControlUp, { passive: true, capture: true }); + } +} +__name(interceptControlUp, "interceptControlUp"); +function computeMikkTSpaceTangents(geometry, MikkTSpace, negateSign = true) { + if (!MikkTSpace || !MikkTSpace.isReady) { + throw new Error("BufferGeometryUtils: Initialized MikkTSpace library required."); + } + if (!geometry.hasAttribute("position") || !geometry.hasAttribute("normal") || !geometry.hasAttribute("uv")) { + throw new Error('BufferGeometryUtils: Tangents require "position", "normal", and "uv" attributes.'); + } + function getAttributeArray(attribute) { + if (attribute.normalized || attribute.isInterleavedBufferAttribute) { + const dstArray = new Float32Array(attribute.count * attribute.itemSize); + for (let i = 0, j = 0; i < attribute.count; i++) { + dstArray[j++] = attribute.getX(i); + dstArray[j++] = attribute.getY(i); + if (attribute.itemSize > 2) { + dstArray[j++] = attribute.getZ(i); } } - }); - this.resetScene(); - } - resetScene() { - this.currentModel = null; - this.originalRotation = null; - const defaultDistance = 10; - this.perspectiveCamera.position.set( - defaultDistance, - defaultDistance, - defaultDistance - ); - this.orthographicCamera.position.set( - defaultDistance, - defaultDistance, - defaultDistance - ); - this.perspectiveCamera.lookAt(0, 0, 0); - this.orthographicCamera.lookAt(0, 0, 0); - const frustumSize = 10; - const aspect2 = this.renderer.domElement.width / this.renderer.domElement.height; - this.orthographicCamera.left = -frustumSize * aspect2 / 2; - this.orthographicCamera.right = frustumSize * aspect2 / 2; - this.orthographicCamera.top = frustumSize / 2; - this.orthographicCamera.bottom = -frustumSize / 2; - this.perspectiveCamera.updateProjectionMatrix(); - this.orthographicCamera.updateProjectionMatrix(); - this.controls.target.set(0, 0, 0); - this.controls.update(); - this.renderer.render(this.scene, this.activeCamera); - this.materialMode = "original"; - this.originalMaterials = /* @__PURE__ */ new WeakMap(); - this.renderer.outputColorSpace = SRGBColorSpace; - } - remove() { - if (this.animationFrameId !== null) { - cancelAnimationFrame(this.animationFrameId); + return dstArray; } - this.controls.dispose(); - this.renderer.dispose(); - this.renderer.domElement.remove(); - this.scene.clear(); + if (attribute.array instanceof Float32Array) { + return attribute.array; + } + return new Float32Array(attribute.array); } - async loadModelInternal(url, fileExtension) { - let model = null; - switch (fileExtension) { - case "stl": - const geometry = await this.stlLoader.loadAsync(url); - this.originalModel = geometry; - geometry.computeVertexNormals(); - const mesh = new Mesh(geometry, this.standardMaterial); - const group = new Group(); - group.add(mesh); - model = group; - break; - case "fbx": - const fbxModel = await this.fbxLoader.loadAsync(url); - this.originalModel = fbxModel; - model = fbxModel; - fbxModel.traverse((child) => { - if (child instanceof Mesh) { - this.originalMaterials.set(child, child.material); - } - }); - break; - case "obj": - if (this.materialMode === "original") { - const mtlUrl = url.replace(/\.obj([^.]*$)/, ".mtl$1"); - try { - const materials = await this.mtlLoader.loadAsync(mtlUrl); - materials.preload(); - this.objLoader.setMaterials(materials); - } catch (e) { - console.log( - "No MTL file found or error loading it, continuing without materials" - ); - } - } - model = await this.objLoader.loadAsync(url); - model.traverse((child) => { - if (child instanceof Mesh) { - this.originalMaterials.set(child, child.material); - } - }); - break; - case "gltf": - case "glb": - const gltf = await this.gltfLoader.loadAsync(url); - this.originalModel = gltf; - model = gltf.scene; - gltf.scene.traverse((child) => { - if (child instanceof Mesh) { - child.geometry.computeVertexNormals(); - this.originalMaterials.set(child, child.material); - } - }); - break; + __name(getAttributeArray, "getAttributeArray"); + const _geometry2 = geometry.index ? geometry.toNonIndexed() : geometry; + const tangents = MikkTSpace.generateTangents( + getAttributeArray(_geometry2.attributes.position), + getAttributeArray(_geometry2.attributes.normal), + getAttributeArray(_geometry2.attributes.uv) + ); + if (negateSign) { + for (let i = 3; i < tangents.length; i += 4) { + tangents[i] *= -1; } - return model; } - async loadModel(url, originalFileName) { - try { - this.clearModel(); - let fileExtension; - if (originalFileName) { - fileExtension = originalFileName.split(".").pop()?.toLowerCase(); - } else { - const filename = new URLSearchParams(url.split("?")[1]).get("filename"); - fileExtension = filename?.split(".").pop()?.toLowerCase(); + _geometry2.setAttribute("tangent", new BufferAttribute(tangents, 4)); + if (geometry !== _geometry2) { + geometry.copy(_geometry2); + } + return geometry; +} +__name(computeMikkTSpaceTangents, "computeMikkTSpaceTangents"); +function mergeGeometries(geometries, useGroups = false) { + const isIndexed = geometries[0].index !== null; + const attributesUsed = new Set(Object.keys(geometries[0].attributes)); + const morphAttributesUsed = new Set(Object.keys(geometries[0].morphAttributes)); + const attributes = {}; + const morphAttributes = {}; + const morphTargetsRelative = geometries[0].morphTargetsRelative; + const mergedGeometry = new BufferGeometry(); + let offset = 0; + for (let i = 0; i < geometries.length; ++i) { + const geometry = geometries[i]; + let attributesCount = 0; + if (isIndexed !== (geometry.index !== null)) { + console.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."); + return null; + } + for (const name in geometry.attributes) { + if (!attributesUsed.has(name)) { + console.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.'); + return null; } - if (!fileExtension) { - useToastStore().addAlert("Could not determine file type"); - return; + if (attributes[name] === void 0) attributes[name] = []; + attributes[name].push(geometry.attributes[name]); + attributesCount++; + } + if (attributesCount !== attributesUsed.size) { + console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index " + i + ". Make sure all geometries have the same number of attributes."); + return null; + } + if (morphTargetsRelative !== geometry.morphTargetsRelative) { + console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index " + i + ". .morphTargetsRelative must be consistent throughout all geometries."); + return null; + } + for (const name in geometry.morphAttributes) { + if (!morphAttributesUsed.has(name)) { + console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index " + i + ". .morphAttributes must be consistent throughout all geometries."); + return null; } - let model = await this.loadModelInternal(url, fileExtension); - if (model) { - this.currentModel = model; - await this.setupModel(model); + if (morphAttributes[name] === void 0) morphAttributes[name] = []; + morphAttributes[name].push(geometry.morphAttributes[name]); + } + if (useGroups) { + let count; + if (isIndexed) { + count = geometry.index.count; + } else if (geometry.attributes.position !== void 0) { + count = geometry.attributes.position.count; + } else { + console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index " + i + ". The geometry must have either an index or a position attribute"); + return null; } - } catch (error) { - console.error("Error loading model:", error); + mergedGeometry.addGroup(offset, count, i); + offset += count; } } - async setupModel(model) { - const box = new Box3().setFromObject(model); - const size = box.getSize(new Vector3()); - const center = box.getCenter(new Vector3()); - const maxDim = Math.max(size.x, size.y, size.z); - const targetSize = 5; - const scale = targetSize / maxDim; - model.scale.multiplyScalar(scale); - box.setFromObject(model); - box.getCenter(center); - box.getSize(size); - model.position.set(-center.x, -box.min.y, -center.z); - this.scene.add(model); - if (this.materialMode !== "original") { - this.setMaterialMode(this.materialMode); + if (isIndexed) { + let indexOffset = 0; + const mergedIndex = []; + for (let i = 0; i < geometries.length; ++i) { + const index = geometries[i].index; + for (let j = 0; j < index.count; ++j) { + mergedIndex.push(index.getX(j) + indexOffset); + } + indexOffset += geometries[i].attributes.position.count; } - if (this.currentUpDirection !== "original") { - this.setUpDirection(this.currentUpDirection); + mergedGeometry.setIndex(mergedIndex); + } + for (const name in attributes) { + const mergedAttribute = mergeAttributes(attributes[name]); + if (!mergedAttribute) { + console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the " + name + " attribute."); + return null; } - await this.setupCamera(size); + mergedGeometry.setAttribute(name, mergedAttribute); } - async setupCamera(size) { - const distance = Math.max(size.x, size.z) * 2; - const height = size.y * 2; - this.perspectiveCamera.position.set(distance, height, distance); - this.orthographicCamera.position.set(distance, height, distance); - if (this.activeCamera === this.perspectiveCamera) { - this.perspectiveCamera.lookAt(0, size.y / 2, 0); - this.perspectiveCamera.updateProjectionMatrix(); - } else { - const frustumSize = Math.max(size.x, size.y, size.z) * 2; - const aspect2 = this.renderer.domElement.width / this.renderer.domElement.height; - this.orthographicCamera.left = -frustumSize * aspect2 / 2; - this.orthographicCamera.right = frustumSize * aspect2 / 2; - this.orthographicCamera.top = frustumSize / 2; - this.orthographicCamera.bottom = -frustumSize / 2; - this.orthographicCamera.lookAt(0, size.y / 2, 0); - this.orthographicCamera.updateProjectionMatrix(); + for (const name in morphAttributes) { + const numMorphTargets = morphAttributes[name][0].length; + if (numMorphTargets === 0) break; + mergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {}; + mergedGeometry.morphAttributes[name] = []; + for (let i = 0; i < numMorphTargets; ++i) { + const morphAttributesToMerge = []; + for (let j = 0; j < morphAttributes[name].length; ++j) { + morphAttributesToMerge.push(morphAttributes[name][j][i]); + } + const mergedMorphAttribute = mergeAttributes(morphAttributesToMerge); + if (!mergedMorphAttribute) { + console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the " + name + " morphAttribute."); + return null; + } + mergedGeometry.morphAttributes[name].push(mergedMorphAttribute); } - this.controls.target.set(0, size.y / 2, 0); - this.controls.update(); - this.renderer.outputColorSpace = SRGBColorSpace; - this.renderer.toneMapping = ACESFilmicToneMapping; - this.renderer.toneMappingExposure = 1; - this.handleResize(); } - handleResize() { - const parentElement = this.renderer?.domElement?.parentElement; - if (!parentElement) { - console.warn("Parent element not found"); - return; + return mergedGeometry; +} +__name(mergeGeometries, "mergeGeometries"); +function mergeAttributes(attributes) { + let TypedArray; + let itemSize; + let normalized; + let gpuType = -1; + let arrayLength = 0; + for (let i = 0; i < attributes.length; ++i) { + const attribute = attributes[i]; + if (TypedArray === void 0) TypedArray = attribute.array.constructor; + if (TypedArray !== attribute.array.constructor) { + console.error("THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes."); + return null; } - const width = parentElement?.clientWidth; - const height = parentElement?.clientHeight; - if (this.activeCamera === this.perspectiveCamera) { - this.perspectiveCamera.aspect = width / height; - this.perspectiveCamera.updateProjectionMatrix(); - } else { - const frustumSize = 10; - const aspect2 = width / height; - this.orthographicCamera.left = -frustumSize * aspect2 / 2; - this.orthographicCamera.right = frustumSize * aspect2 / 2; - this.orthographicCamera.top = frustumSize / 2; - this.orthographicCamera.bottom = -frustumSize / 2; - this.orthographicCamera.updateProjectionMatrix(); + if (itemSize === void 0) itemSize = attribute.itemSize; + if (itemSize !== attribute.itemSize) { + console.error("THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes."); + return null; } - this.renderer.setSize(width, height); + if (normalized === void 0) normalized = attribute.normalized; + if (normalized !== attribute.normalized) { + console.error("THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes."); + return null; + } + if (gpuType === -1) gpuType = attribute.gpuType; + if (gpuType !== attribute.gpuType) { + console.error("THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.gpuType must be consistent across matching attributes."); + return null; + } + arrayLength += attribute.count * itemSize; } - animate = /* @__PURE__ */ __name(() => { - requestAnimationFrame(this.animate); - this.controls.update(); - this.renderer.render(this.scene, this.activeCamera); - }, "animate"); - captureScene(width, height) { - return new Promise(async (resolve, reject) => { - try { - const originalWidth = this.renderer.domElement.width; - const originalHeight = this.renderer.domElement.height; - const originalClearColor = this.renderer.getClearColor( - new Color() - ); - const originalClearAlpha = this.renderer.getClearAlpha(); - this.renderer.setSize(width, height); - if (this.activeCamera === this.perspectiveCamera) { - this.perspectiveCamera.aspect = width / height; - this.perspectiveCamera.updateProjectionMatrix(); - } else { - const frustumSize = 10; - const aspect2 = width / height; - this.orthographicCamera.left = -frustumSize * aspect2 / 2; - this.orthographicCamera.right = frustumSize * aspect2 / 2; - this.orthographicCamera.top = frustumSize / 2; - this.orthographicCamera.bottom = -frustumSize / 2; - this.orthographicCamera.updateProjectionMatrix(); + const array = new TypedArray(arrayLength); + const result = new BufferAttribute(array, itemSize, normalized); + let offset = 0; + for (let i = 0; i < attributes.length; ++i) { + const attribute = attributes[i]; + if (attribute.isInterleavedBufferAttribute) { + const tupleOffset = offset / itemSize; + for (let j = 0, l = attribute.count; j < l; j++) { + for (let c = 0; c < itemSize; c++) { + const value = attribute.getComponent(j, c); + result.setComponent(j + tupleOffset, c, value); } - this.renderer.render(this.scene, this.activeCamera); - const sceneData = this.renderer.domElement.toDataURL("image/png"); - this.renderer.setClearColor(0, 0); - this.renderer.render(this.scene, this.activeCamera); - const maskData = this.renderer.domElement.toDataURL("image/png"); - this.renderer.setClearColor(originalClearColor, originalClearAlpha); - this.renderer.setSize(originalWidth, originalHeight); - this.handleResize(); - resolve({ scene: sceneData, mask: maskData }); - } catch (error) { - reject(error); } - }); - } - createSTLMaterial() { - return new MeshStandardMaterial({ - color: 8421504, - metalness: 0.1, - roughness: 0.8, - flatShading: false, - side: DoubleSide - }); - } - setViewPosition(position) { - if (!this.currentModel) { - return; - } - const box = new Box3(); - let center = new Vector3(); - let size = new Vector3(); - if (this.currentModel) { - box.setFromObject(this.currentModel); - box.getCenter(center); - box.getSize(size); - } - const maxDim = Math.max(size.x, size.y, size.z); - const distance = maxDim * 2; - switch (position) { - case "front": - this.activeCamera.position.set(0, 0, distance); - break; - case "top": - this.activeCamera.position.set(0, distance, 0); - break; - case "right": - this.activeCamera.position.set(distance, 0, 0); - break; - case "isometric": - this.activeCamera.position.set(distance, distance, distance); - break; + } else { + array.set(attribute.array, offset); } - this.activeCamera.lookAt(center); - this.controls.target.copy(center); - this.controls.update(); + offset += attribute.count * itemSize; } - setBackgroundColor(color) { - this.renderer.setClearColor(new Color(color)); - this.renderer.render(this.scene, this.activeCamera); + if (gpuType !== void 0) { + result.gpuType = gpuType; } + return result; } -class Load3dAnimation extends Load3d { - static { - __name(this, "Load3dAnimation"); - } - currentAnimation = null; - animationActions = []; - animationClips = []; - selectedAnimationIndex = 0; - isAnimationPlaying = false; - animationSpeed = 1; - constructor(container) { - super(container); - } - async setupModel(model) { - await super.setupModel(model); - if (this.currentAnimation) { - this.currentAnimation.stopAllAction(); - this.animationActions = []; - } - let animations = []; - if (model.animations?.length > 0) { - animations = model.animations; - } else if (this.originalModel && "animations" in this.originalModel) { - animations = this.originalModel.animations; - } - if (animations.length > 0) { - this.animationClips = animations; - if (model.type === "Scene") { - this.currentAnimation = new AnimationMixer(model); - } else { - this.currentAnimation = new AnimationMixer(this.currentModel); - } - if (this.animationClips.length > 0) { - this.updateSelectedAnimation(0); - } - } +__name(mergeAttributes, "mergeAttributes"); +function deepCloneAttribute(attribute) { + if (attribute.isInstancedInterleavedBufferAttribute || attribute.isInterleavedBufferAttribute) { + return deinterleaveAttribute(attribute); } - setAnimationSpeed(speed) { - this.animationSpeed = speed; - this.animationActions.forEach((action) => { - action.setEffectiveTimeScale(speed); - }); + if (attribute.isInstancedBufferAttribute) { + return new InstancedBufferAttribute().copy(attribute); } - updateSelectedAnimation(index) { - if (!this.currentAnimation || !this.animationClips || index >= this.animationClips.length) { - console.warn("Invalid animation update request"); - return; - } - this.animationActions.forEach((action2) => { - action2.stop(); - }); - this.currentAnimation.stopAllAction(); - this.animationActions = []; - this.selectedAnimationIndex = index; - const clip = this.animationClips[index]; - const action = this.currentAnimation.clipAction(clip); - action.setEffectiveTimeScale(this.animationSpeed); - action.reset(); - action.clampWhenFinished = false; - action.loop = LoopRepeat; - if (this.isAnimationPlaying) { - action.play(); - } else { - action.play(); - action.paused = true; + return new BufferAttribute().copy(attribute); +} +__name(deepCloneAttribute, "deepCloneAttribute"); +function interleaveAttributes(attributes) { + let TypedArray; + let arrayLength = 0; + let stride = 0; + for (let i = 0, l = attributes.length; i < l; ++i) { + const attribute = attributes[i]; + if (TypedArray === void 0) TypedArray = attribute.array.constructor; + if (TypedArray !== attribute.array.constructor) { + console.error("AttributeBuffers of different types cannot be interleaved"); + return null; } - this.animationActions = [action]; + arrayLength += attribute.array.length; + stride += attribute.itemSize; } - clearModel() { - if (this.currentAnimation) { - this.animationActions.forEach((action) => { - action.stop(); - }); - this.currentAnimation = null; - } - this.animationActions = []; - this.animationClips = []; - this.selectedAnimationIndex = 0; - this.isAnimationPlaying = false; - this.animationSpeed = 1; - super.clearModel(); + const interleavedBuffer = new InterleavedBuffer(new TypedArray(arrayLength), stride); + let offset = 0; + const res = []; + const getters = ["getX", "getY", "getZ", "getW"]; + const setters = ["setX", "setY", "setZ", "setW"]; + for (let j = 0, l = attributes.length; j < l; j++) { + const attribute = attributes[j]; + const itemSize = attribute.itemSize; + const count = attribute.count; + const iba = new InterleavedBufferAttribute(interleavedBuffer, itemSize, offset, attribute.normalized); + res.push(iba); + offset += itemSize; + for (let c = 0; c < count; c++) { + for (let k = 0; k < itemSize; k++) { + iba[setters[k]](c, attribute[getters[k]](c)); + } + } } - getAnimationNames() { - return this.animationClips.map((clip, index) => { - return clip.name || `Animation ${index + 1}`; - }); + return res; +} +__name(interleaveAttributes, "interleaveAttributes"); +function deinterleaveAttribute(attribute) { + const cons = attribute.data.array.constructor; + const count = attribute.count; + const itemSize = attribute.itemSize; + const normalized = attribute.normalized; + const array = new cons(count * itemSize); + let newAttribute; + if (attribute.isInstancedInterleavedBufferAttribute) { + newAttribute = new InstancedBufferAttribute(array, itemSize, normalized, attribute.meshPerAttribute); + } else { + newAttribute = new BufferAttribute(array, itemSize, normalized); } - toggleAnimation(play) { - if (!this.currentAnimation || this.animationActions.length === 0) { - console.warn("No animation to toggle"); - return; + for (let i = 0; i < count; i++) { + newAttribute.setX(i, attribute.getX(i)); + if (itemSize >= 2) { + newAttribute.setY(i, attribute.getY(i)); } - this.isAnimationPlaying = play ?? !this.isAnimationPlaying; - this.animationActions.forEach((action) => { - if (this.isAnimationPlaying) { - action.paused = false; - if (action.time === 0 || action.time === action.getClip().duration) { - action.reset(); - } - } else { - action.paused = true; - } - }); - } - animate = /* @__PURE__ */ __name(() => { - requestAnimationFrame(this.animate); - if (this.currentAnimation && this.isAnimationPlaying) { - const delta = this.clock.getDelta(); - this.currentAnimation.update(delta); + if (itemSize >= 3) { + newAttribute.setZ(i, attribute.getZ(i)); + } + if (itemSize >= 4) { + newAttribute.setW(i, attribute.getW(i)); } - this.controls.update(); - this.renderer.render(this.scene, this.activeCamera); - }, "animate"); -} -function splitFilePath$1(path) { - const folder_separator = path.lastIndexOf("/"); - if (folder_separator === -1) { - return ["", path]; } - return [ - path.substring(0, folder_separator), - path.substring(folder_separator + 1) - ]; -} -__name(splitFilePath$1, "splitFilePath$1"); -function getResourceURL$1(subfolder, filename, type = "input") { - const params = [ - "filename=" + encodeURIComponent(filename), - "type=" + type, - "subfolder=" + subfolder, - app.getRandParam().substring(1) - ].join("&"); - return `/view?${params}`; + return newAttribute; } -__name(getResourceURL$1, "getResourceURL$1"); -const load3dCSSCLASS = `display: flex; - flex-direction: column; - background: transparent; - flex: 1; - position: relative; - overflow: hidden;`; -const load3dCanvasCSSCLASS = `display: flex; - width: 100% !important; - height: 100% !important;`; -const containerToLoad3D = /* @__PURE__ */ new Map(); -function configureLoad3D(load3d, loadFolder, modelWidget, showGrid, cameraType, view, material, bgColor, lightIntensity, upDirection, fov2, cameraState, postModelUpdateFunc) { - const createModelUpdateHandler = /* @__PURE__ */ __name(() => { - let isFirstLoad = true; - return async (value) => { - if (!value) return; - const filename = value; - const modelUrl = api.apiURL( - getResourceURL$1(...splitFilePath$1(filename), loadFolder) - ); - await load3d.loadModel(modelUrl, filename); - load3d.setMaterialMode( - material.value - ); - load3d.setUpDirection( - upDirection.value - ); - if (postModelUpdateFunc) { - postModelUpdateFunc(load3d); - } - if (isFirstLoad && cameraState && typeof cameraState === "object") { - try { - load3d.setCameraState(cameraState); - } catch (error) { - console.warn("Failed to restore camera state:", error); - } - isFirstLoad = false; +__name(deinterleaveAttribute, "deinterleaveAttribute"); +function deinterleaveGeometry(geometry) { + const attributes = geometry.attributes; + const morphTargets = geometry.morphTargets; + const attrMap = /* @__PURE__ */ new Map(); + for (const key in attributes) { + const attr = attributes[key]; + if (attr.isInterleavedBufferAttribute) { + if (!attrMap.has(attr)) { + attrMap.set(attr, deinterleaveAttribute(attr)); } - }; - }, "createModelUpdateHandler"); - const onModelWidgetUpdate = createModelUpdateHandler(); - if (modelWidget.value) { - onModelWidgetUpdate(modelWidget.value); + attributes[key] = attrMap.get(attr); + } } - modelWidget.callback = onModelWidgetUpdate; - load3d.toggleGrid(showGrid.value); - showGrid.callback = (value) => { - load3d.toggleGrid(value); - }; - load3d.toggleCamera(cameraType.value); - cameraType.callback = (value) => { - load3d.toggleCamera(value); - }; - view.callback = (value) => { - load3d.setViewPosition(value); - }; - material.callback = (value) => { - load3d.setMaterialMode(value); - }; - load3d.setMaterialMode(material.value); - load3d.setBackgroundColor(bgColor.value); - bgColor.callback = (value) => { - load3d.setBackgroundColor(value); - }; - load3d.setLightIntensity(lightIntensity.value); - lightIntensity.callback = (value) => { - load3d.setLightIntensity(value); - }; - upDirection.callback = (value) => { - load3d.setUpDirection(value); - }; - load3d.setUpDirection( - upDirection.value - ); - fov2.callback = (value) => { - load3d.setFOV(value); - }; - load3d.setFOV(fov2.value); -} -__name(configureLoad3D, "configureLoad3D"); -app.registerExtension({ - name: "Comfy.Load3D", - getCustomWidgets(app2) { - return { - LOAD_3D(node, inputName) { - let load3dNode = app2.graph._nodes.filter((wi) => wi.type == "Load3D"); - node.addProperty("Camera Info", ""); - const container = document.createElement("div"); - container.id = `comfy-load-3d-${load3dNode.length}`; - container.classList.add("comfy-load-3d"); - const load3d = new Load3d(container); - containerToLoad3D.set(container.id, load3d); - node.onResize = function() { - if (load3d) { - load3d.handleResize(); - } - }; - const origOnRemoved = node.onRemoved; - node.onRemoved = function() { - if (load3d) { - load3d.remove(); - } - containerToLoad3D.delete(container.id); - origOnRemoved?.apply(this, []); - }; - node.onDrawBackground = function() { - load3d.renderer.domElement.hidden = this.flags.collapsed ?? false; - }; - const fileInput = document.createElement("input"); - fileInput.type = "file"; - fileInput.accept = ".gltf,.glb,.obj,.mtl,.fbx,.stl"; - fileInput.style.display = "none"; - fileInput.onchange = async () => { - if (fileInput.files?.length) { - const modelWidget = node.widgets?.find( - (w) => w.name === "model_file" - ); - const uploadPath = await uploadFile$1( - load3d, - fileInput.files[0], - fileInput - ).catch((error) => { - console.error("File upload failed:", error); - useToastStore().addAlert("File upload failed"); - }); - if (uploadPath && modelWidget) { - if (!modelWidget.options?.values?.includes(uploadPath)) { - modelWidget.options?.values?.push(uploadPath); - } - modelWidget.value = uploadPath; - } - } - }; - node.addWidget("button", "upload 3d model", "upload3dmodel", () => { - fileInput.click(); - }); - node.addWidget("button", "clear", "clear", () => { - load3d.clearModel(); - const modelWidget = node.widgets?.find( - (w) => w.name === "model_file" - ); - if (modelWidget) { - modelWidget.value = ""; - } - }); - return { - widget: node.addDOMWidget(inputName, "LOAD_3D", container) - }; - } - }; - }, - init() { - const style = document.createElement("style"); - style.innerText = ` - .comfy-load-3d { - ${load3dCSSCLASS} - } - - .comfy-load-3d canvas { - ${load3dCanvasCSSCLASS} - } - `; - document.head.appendChild(style); - }, - async nodeCreated(node) { - if (node.constructor.comfyClass !== "Load3D") return; - const [oldWidth, oldHeight] = node.size; - node.setSize([Math.max(oldWidth, 300), Math.max(oldHeight, 600)]); - await nextTick(); - const sceneWidget = node.widgets.find((w2) => w2.name === "image"); - const container = sceneWidget.element; - const load3d = containerToLoad3D.get(container.id); - const modelWidget = node.widgets.find( - (w2) => w2.name === "model_file" - ); - const showGrid = node.widgets.find((w2) => w2.name === "show_grid"); - const cameraType = node.widgets.find( - (w2) => w2.name === "camera_type" - ); - const view = node.widgets.find((w2) => w2.name === "view"); - const material = node.widgets.find((w2) => w2.name === "material"); - const bgColor = node.widgets.find((w2) => w2.name === "bg_color"); - const lightIntensity = node.widgets.find( - (w2) => w2.name === "light_intensity" - ); - const upDirection = node.widgets.find( - (w2) => w2.name === "up_direction" - ); - const fov2 = node.widgets.find((w2) => w2.name === "fov"); - let cameraState; - try { - const cameraInfo = node.properties["Camera Info"]; - if (cameraInfo && typeof cameraInfo === "string" && cameraInfo.trim() !== "") { - cameraState = JSON.parse(cameraInfo); + for (const key in morphTargets) { + const attr = morphTargets[key]; + if (attr.isInterleavedBufferAttribute) { + if (!attrMap.has(attr)) { + attrMap.set(attr, deinterleaveAttribute(attr)); } - } catch (error) { - console.warn("Failed to parse camera state:", error); - cameraState = void 0; + morphTargets[key] = attrMap.get(attr); } - configureLoad3D( - load3d, - "input", - modelWidget, - showGrid, - cameraType, - view, - material, - bgColor, - lightIntensity, - upDirection, - fov2, - cameraState - ); - const w = node.widgets.find((w2) => w2.name === "width"); - const h = node.widgets.find((w2) => w2.name === "height"); - sceneWidget.serializeValue = async () => { - node.properties["Camera Info"] = JSON.stringify(load3d.getCameraState()); - const { scene: imageData, mask: maskData } = await load3d.captureScene( - w.value, - h.value - ); - const [data, dataMask] = await Promise.all([ - uploadTempImage(imageData, "scene"), - uploadTempImage(maskData, "scene_mask") - ]); - return { - image: `threed/${data.name} [temp]`, - mask: `threed/${dataMask.name} [temp]` - }; - }; } -}); -app.registerExtension({ - name: "Comfy.Load3DAnimation", - getCustomWidgets(app2) { - return { - LOAD_3D_ANIMATION(node, inputName) { - let load3dNode = app2.graph._nodes.filter( - (wi) => wi.type == "Load3DAnimation" - ); - node.addProperty("Camera Info", ""); - const container = document.createElement("div"); - container.id = `comfy-load-3d-animation-${load3dNode.length}`; - container.classList.add("comfy-load-3d-animation"); - const load3d = new Load3dAnimation(container); - containerToLoad3D.set(container.id, load3d); - node.onResize = function() { - if (load3d) { - load3d.handleResize(); - } - }; - const origOnRemoved = node.onRemoved; - node.onRemoved = function() { - if (load3d) { - load3d.remove(); - } - containerToLoad3D.delete(container.id); - origOnRemoved?.apply(this, []); - }; - node.onDrawBackground = function() { - load3d.renderer.domElement.hidden = this.flags.collapsed ?? false; - }; - const fileInput = document.createElement("input"); - fileInput.type = "file"; - fileInput.accept = ".fbx,glb,gltf"; - fileInput.style.display = "none"; - fileInput.onchange = async () => { - if (fileInput.files?.length) { - const modelWidget = node.widgets?.find( - (w) => w.name === "model_file" - ); - const uploadPath = await uploadFile$1( - load3d, - fileInput.files[0], - fileInput - ).catch((error) => { - console.error("File upload failed:", error); - useToastStore().addAlert("File upload failed"); - }); - if (uploadPath && modelWidget) { - if (!modelWidget.options?.values?.includes(uploadPath)) { - modelWidget.options?.values?.push(uploadPath); - } - modelWidget.value = uploadPath; - } - } - }; - node.addWidget("button", "upload 3d model", "upload3dmodel", () => { - fileInput.click(); - }); - node.addWidget("button", "clear", "clear", () => { - load3d.clearModel(); - const modelWidget = node.widgets?.find( - (w) => w.name === "model_file" - ); - if (modelWidget) { - modelWidget.value = ""; - } - const animationSelect2 = node.widgets?.find( - (w) => w.name === "animation" - ); - if (animationSelect2) { - animationSelect2.options.values = []; - animationSelect2.value = ""; - } - const speedSelect = node.widgets?.find( - (w) => w.name === "animation_speed" - ); - if (speedSelect) { - speedSelect.value = "1"; - } - }); - node.addWidget( - "button", - "Play/Pause Animation", - "toggle_animation", - () => { - load3d.toggleAnimation(); - } - ); - const animationSelect = node.addWidget( - "combo", - "animation", - "", - () => "", - { - values: [] - } - ); - animationSelect.callback = (value) => { - const names = load3d.getAnimationNames(); - const index = names.indexOf(value); - if (index !== -1) { - const wasPlaying = load3d.isAnimationPlaying; - if (wasPlaying) { - load3d.toggleAnimation(false); - } - load3d.updateSelectedAnimation(index); - if (wasPlaying) { - load3d.toggleAnimation(true); - } - } - }; - return { - widget: node.addDOMWidget(inputName, "LOAD_3D_ANIMATION", container) - }; - } - }; - }, - init() { - const style = document.createElement("style"); - style.innerText = ` - .comfy-load-3d-animation { - ${load3dCSSCLASS} - } - - .comfy-load-3d-animation canvas { - ${load3dCanvasCSSCLASS} - } - `; - document.head.appendChild(style); - }, - async nodeCreated(node) { - if (node.constructor.comfyClass !== "Load3DAnimation") return; - const [oldWidth, oldHeight] = node.size; - node.setSize([Math.max(oldWidth, 300), Math.max(oldHeight, 700)]); - await nextTick(); - const sceneWidget = node.widgets.find((w2) => w2.name === "image"); - const container = sceneWidget.element; - const load3d = containerToLoad3D.get(container.id); - const modelWidget = node.widgets.find( - (w2) => w2.name === "model_file" - ); - const showGrid = node.widgets.find((w2) => w2.name === "show_grid"); - const cameraType = node.widgets.find( - (w2) => w2.name === "camera_type" - ); - const view = node.widgets.find((w2) => w2.name === "view"); - const material = node.widgets.find((w2) => w2.name === "material"); - const bgColor = node.widgets.find((w2) => w2.name === "bg_color"); - const lightIntensity = node.widgets.find( - (w2) => w2.name === "light_intensity" - ); - const upDirection = node.widgets.find( - (w2) => w2.name === "up_direction" - ); - const speedSelect = node.widgets.find( - (w2) => w2.name === "animation_speed" +} +__name(deinterleaveGeometry, "deinterleaveGeometry"); +function estimateBytesUsed(geometry) { + let mem = 0; + for (const name in geometry.attributes) { + const attr = geometry.getAttribute(name); + mem += attr.count * attr.itemSize * attr.array.BYTES_PER_ELEMENT; + } + const indices = geometry.getIndex(); + mem += indices ? indices.count * indices.itemSize * indices.array.BYTES_PER_ELEMENT : 0; + return mem; +} +__name(estimateBytesUsed, "estimateBytesUsed"); +function mergeVertices(geometry, tolerance = 1e-4) { + tolerance = Math.max(tolerance, Number.EPSILON); + const hashToIndex = {}; + const indices = geometry.getIndex(); + const positions = geometry.getAttribute("position"); + const vertexCount = indices ? indices.count : positions.count; + let nextIndex = 0; + const attributeNames = Object.keys(geometry.attributes); + const tmpAttributes = {}; + const tmpMorphAttributes = {}; + const newIndices = []; + const getters = ["getX", "getY", "getZ", "getW"]; + const setters = ["setX", "setY", "setZ", "setW"]; + for (let i = 0, l = attributeNames.length; i < l; i++) { + const name = attributeNames[i]; + const attr = geometry.attributes[name]; + tmpAttributes[name] = new attr.constructor( + new attr.array.constructor(attr.count * attr.itemSize), + attr.itemSize, + attr.normalized ); - speedSelect.callback = (value) => { - const load3d2 = containerToLoad3D.get(container.id); - if (load3d2) { - load3d2.setAnimationSpeed(parseFloat(value)); - } - }; - const fov2 = node.widgets.find((w2) => w2.name === "fov"); - let cameraState; - try { - const cameraInfo = node.properties["Camera Info"]; - if (cameraInfo && typeof cameraInfo === "string" && cameraInfo.trim() !== "") { - cameraState = JSON.parse(cameraInfo); + const morphAttributes = geometry.morphAttributes[name]; + if (morphAttributes) { + if (!tmpMorphAttributes[name]) tmpMorphAttributes[name] = []; + morphAttributes.forEach((morphAttr, i2) => { + const array = new morphAttr.array.constructor(morphAttr.count * morphAttr.itemSize); + tmpMorphAttributes[name][i2] = new morphAttr.constructor(array, morphAttr.itemSize, morphAttr.normalized); + }); + } + } + const halfTolerance = tolerance * 0.5; + const exponent = Math.log10(1 / tolerance); + const hashMultiplier = Math.pow(10, exponent); + const hashAdditive = halfTolerance * hashMultiplier; + for (let i = 0; i < vertexCount; i++) { + const index = indices ? indices.getX(i) : i; + let hash = ""; + for (let j = 0, l = attributeNames.length; j < l; j++) { + const name = attributeNames[j]; + const attribute = geometry.getAttribute(name); + const itemSize = attribute.itemSize; + for (let k = 0; k < itemSize; k++) { + hash += `${~~(attribute[getters[k]](index) * hashMultiplier + hashAdditive)},`; } - } catch (error) { - console.warn("Failed to parse camera state:", error); - cameraState = void 0; } - configureLoad3D( - load3d, - "input", - modelWidget, - showGrid, - cameraType, - view, - material, - bgColor, - lightIntensity, - upDirection, - fov2, - cameraState, - (load3d2) => { - const animationLoad3d = load3d2; - const names = animationLoad3d.getAnimationNames(); - const animationSelect = node.widgets.find( - (w2) => w2.name === "animation" - ); - animationSelect.options.values = names; - if (names.length) { - animationSelect.value = names[0]; + if (hash in hashToIndex) { + newIndices.push(hashToIndex[hash]); + } else { + for (let j = 0, l = attributeNames.length; j < l; j++) { + const name = attributeNames[j]; + const attribute = geometry.getAttribute(name); + const morphAttributes = geometry.morphAttributes[name]; + const itemSize = attribute.itemSize; + const newArray = tmpAttributes[name]; + const newMorphArrays = tmpMorphAttributes[name]; + for (let k = 0; k < itemSize; k++) { + const getterFunc = getters[k]; + const setterFunc = setters[k]; + newArray[setterFunc](nextIndex, attribute[getterFunc](index)); + if (morphAttributes) { + for (let m = 0, ml = morphAttributes.length; m < ml; m++) { + newMorphArrays[m][setterFunc](nextIndex, morphAttributes[m][getterFunc](index)); + } + } } } - ); - const w = node.widgets.find((w2) => w2.name === "width"); - const h = node.widgets.find((w2) => w2.name === "height"); - sceneWidget.serializeValue = async () => { - node.properties["Camera Info"] = JSON.stringify(load3d.getCameraState()); - const { scene: imageData, mask: maskData } = await load3d.captureScene( - w.value, - h.value + hashToIndex[hash] = nextIndex; + newIndices.push(nextIndex); + nextIndex++; + } + } + const result = geometry.clone(); + for (const name in geometry.attributes) { + const tmpAttribute = tmpAttributes[name]; + result.setAttribute(name, new tmpAttribute.constructor( + tmpAttribute.array.slice(0, nextIndex * tmpAttribute.itemSize), + tmpAttribute.itemSize, + tmpAttribute.normalized + )); + if (!(name in tmpMorphAttributes)) continue; + for (let j = 0; j < tmpMorphAttributes[name].length; j++) { + const tmpMorphAttribute = tmpMorphAttributes[name][j]; + result.morphAttributes[name][j] = new tmpMorphAttribute.constructor( + tmpMorphAttribute.array.slice(0, nextIndex * tmpMorphAttribute.itemSize), + tmpMorphAttribute.itemSize, + tmpMorphAttribute.normalized ); - const [data, dataMask] = await Promise.all([ - uploadTempImage(imageData, "scene"), - uploadTempImage(maskData, "scene_mask") - ]); - return { - image: `threed/${data.name} [temp]`, - mask: `threed/${dataMask.name} [temp]` - }; - }; + } } -}); -app.registerExtension({ - name: "Comfy.Preview3D", - async beforeRegisterNodeDef(nodeType, nodeData) { - if ( - // @ts-expect-error ComfyNode - ["Preview3D"].includes(nodeType.comfyClass) - ) { - nodeData.input.required.image = ["PREVIEW_3D"]; + result.setIndex(newIndices); + return result; +} +__name(mergeVertices, "mergeVertices"); +function toTrianglesDrawMode(geometry, drawMode) { + if (drawMode === TrianglesDrawMode) { + console.warn("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles."); + return geometry; + } + if (drawMode === TriangleFanDrawMode || drawMode === TriangleStripDrawMode) { + let index = geometry.getIndex(); + if (index === null) { + const indices = []; + const position = geometry.getAttribute("position"); + if (position !== void 0) { + for (let i = 0; i < position.count; i++) { + indices.push(i); + } + geometry.setIndex(indices); + index = geometry.getIndex(); + } else { + console.error("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible."); + return geometry; + } } - }, - getCustomWidgets(app2) { - return { - PREVIEW_3D(node, inputName) { - let load3dNode = app2.graph._nodes.filter((wi) => wi.type == "Preview3D"); - const container = document.createElement("div"); - container.id = `comfy-preview-3d-${load3dNode.length}`; - container.classList.add("comfy-preview-3d"); - const load3d = new Load3d(container); - containerToLoad3D.set(container.id, load3d); - node.onResize = function() { - if (load3d) { - load3d.handleResize(); - } - }; - const origOnRemoved = node.onRemoved; - node.onRemoved = function() { - if (load3d) { - load3d.remove(); - } - containerToLoad3D.delete(container.id); - origOnRemoved?.apply(this, []); - }; - node.onDrawBackground = function() { - load3d.renderer.domElement.hidden = this.flags.collapsed ?? false; - }; - return { - widget: node.addDOMWidget(inputName, "PREVIEW_3D", container) - }; + const numberOfTriangles = index.count - 2; + const newIndices = []; + if (drawMode === TriangleFanDrawMode) { + for (let i = 1; i <= numberOfTriangles; i++) { + newIndices.push(index.getX(0)); + newIndices.push(index.getX(i)); + newIndices.push(index.getX(i + 1)); } - }; - }, - init() { - const style = document.createElement("style"); - style.innerText = ` - .comfy-preview-3d { - ${load3dCSSCLASS} + } else { + for (let i = 0; i < numberOfTriangles; i++) { + if (i % 2 === 0) { + newIndices.push(index.getX(i)); + newIndices.push(index.getX(i + 1)); + newIndices.push(index.getX(i + 2)); + } else { + newIndices.push(index.getX(i + 2)); + newIndices.push(index.getX(i + 1)); + newIndices.push(index.getX(i)); } - - .comfy-preview-3d canvas { - ${load3dCanvasCSSCLASS} + } + } + if (newIndices.length / 3 !== numberOfTriangles) { + console.error("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles."); + } + const newGeometry = geometry.clone(); + newGeometry.setIndex(newIndices); + newGeometry.clearGroups(); + return newGeometry; + } else { + console.error("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:", drawMode); + return geometry; + } +} +__name(toTrianglesDrawMode, "toTrianglesDrawMode"); +function computeMorphedAttributes(object) { + const _vA2 = new Vector3(); + const _vB2 = new Vector3(); + const _vC2 = new Vector3(); + const _tempA2 = new Vector3(); + const _tempB = new Vector3(); + const _tempC = new Vector3(); + const _morphA2 = new Vector3(); + const _morphB = new Vector3(); + const _morphC = new Vector3(); + function _calculateMorphedAttributeData(object2, attribute, morphAttribute, morphTargetsRelative2, a2, b3, c2, modifiedAttributeArray) { + _vA2.fromBufferAttribute(attribute, a2); + _vB2.fromBufferAttribute(attribute, b3); + _vC2.fromBufferAttribute(attribute, c2); + const morphInfluences = object2.morphTargetInfluences; + if (morphAttribute && morphInfluences) { + _morphA2.set(0, 0, 0); + _morphB.set(0, 0, 0); + _morphC.set(0, 0, 0); + for (let i2 = 0, il2 = morphAttribute.length; i2 < il2; i2++) { + const influence = morphInfluences[i2]; + const morph = morphAttribute[i2]; + if (influence === 0) continue; + _tempA2.fromBufferAttribute(morph, a2); + _tempB.fromBufferAttribute(morph, b3); + _tempC.fromBufferAttribute(morph, c2); + if (morphTargetsRelative2) { + _morphA2.addScaledVector(_tempA2, influence); + _morphB.addScaledVector(_tempB, influence); + _morphC.addScaledVector(_tempC, influence); + } else { + _morphA2.addScaledVector(_tempA2.sub(_vA2), influence); + _morphB.addScaledVector(_tempB.sub(_vB2), influence); + _morphC.addScaledVector(_tempC.sub(_vC2), influence); } - `; - document.head.appendChild(style); - }, - async nodeCreated(node) { - if (node.constructor.comfyClass !== "Preview3D") return; - const [oldWidth, oldHeight] = node.size; - node.setSize([Math.max(oldWidth, 300), Math.max(oldHeight, 550)]); - await nextTick(); - const sceneWidget = node.widgets.find((w) => w.name === "image"); - const container = sceneWidget.element; - const load3d = containerToLoad3D.get(container.id); - const modelWidget = node.widgets.find( - (w) => w.name === "model_file" - ); - const showGrid = node.widgets.find((w) => w.name === "show_grid"); - const cameraType = node.widgets.find( - (w) => w.name === "camera_type" - ); - const view = node.widgets.find((w) => w.name === "view"); - const material = node.widgets.find((w) => w.name === "material"); - const bgColor = node.widgets.find((w) => w.name === "bg_color"); - const lightIntensity = node.widgets.find( - (w) => w.name === "light_intensity" - ); - const upDirection = node.widgets.find( - (w) => w.name === "up_direction" - ); - const fov2 = node.widgets.find((w) => w.name === "fov"); - const onExecuted = node.onExecuted; - node.onExecuted = function(message) { - onExecuted?.apply(this, arguments); - let filePath = message.model_file[0]; - if (!filePath) { - const msg = "unable to get model file path."; - console.error(msg); - useToastStore().addAlert(msg); } - modelWidget.value = filePath.replaceAll("\\", "/"); - configureLoad3D( - load3d, - "output", - modelWidget, - showGrid, - cameraType, - view, - material, - bgColor, - lightIntensity, - upDirection, - fov2 - ); - }; + _vA2.add(_morphA2); + _vB2.add(_morphB); + _vC2.add(_morphC); + } + if (object2.isSkinnedMesh) { + object2.applyBoneTransform(a2, _vA2); + object2.applyBoneTransform(b3, _vB2); + object2.applyBoneTransform(c2, _vC2); + } + modifiedAttributeArray[a2 * 3 + 0] = _vA2.x; + modifiedAttributeArray[a2 * 3 + 1] = _vA2.y; + modifiedAttributeArray[a2 * 3 + 2] = _vA2.z; + modifiedAttributeArray[b3 * 3 + 0] = _vB2.x; + modifiedAttributeArray[b3 * 3 + 1] = _vB2.y; + modifiedAttributeArray[b3 * 3 + 2] = _vB2.z; + modifiedAttributeArray[c2 * 3 + 0] = _vC2.x; + modifiedAttributeArray[c2 * 3 + 1] = _vC2.y; + modifiedAttributeArray[c2 * 3 + 2] = _vC2.z; } -}); -function dataURLToBlob(dataURL) { - const parts = dataURL.split(";base64,"); - const contentType = parts[0].split(":")[1]; - const byteString = atob(parts[1]); - const arrayBuffer = new ArrayBuffer(byteString.length); - const uint8Array = new Uint8Array(arrayBuffer); - for (let i = 0; i < byteString.length; i++) { - uint8Array[i] = byteString.charCodeAt(i); + __name(_calculateMorphedAttributeData, "_calculateMorphedAttributeData"); + const geometry = object.geometry; + const material = object.material; + let a, b, c; + const index = geometry.index; + const positionAttribute = geometry.attributes.position; + const morphPosition = geometry.morphAttributes.position; + const morphTargetsRelative = geometry.morphTargetsRelative; + const normalAttribute = geometry.attributes.normal; + const morphNormal = geometry.morphAttributes.position; + const groups = geometry.groups; + const drawRange = geometry.drawRange; + let i, j, il, jl; + let group; + let start, end; + const modifiedPosition = new Float32Array(positionAttribute.count * positionAttribute.itemSize); + const modifiedNormal = new Float32Array(normalAttribute.count * normalAttribute.itemSize); + if (index !== null) { + if (Array.isArray(material)) { + for (i = 0, il = groups.length; i < il; i++) { + group = groups[i]; + start = Math.max(group.start, drawRange.start); + end = Math.min(group.start + group.count, drawRange.start + drawRange.count); + for (j = start, jl = end; j < jl; j += 3) { + a = index.getX(j); + b = index.getX(j + 1); + c = index.getX(j + 2); + _calculateMorphedAttributeData( + object, + positionAttribute, + morphPosition, + morphTargetsRelative, + a, + b, + c, + modifiedPosition + ); + _calculateMorphedAttributeData( + object, + normalAttribute, + morphNormal, + morphTargetsRelative, + a, + b, + c, + modifiedNormal + ); + } + } + } else { + start = Math.max(0, drawRange.start); + end = Math.min(index.count, drawRange.start + drawRange.count); + for (i = start, il = end; i < il; i += 3) { + a = index.getX(i); + b = index.getX(i + 1); + c = index.getX(i + 2); + _calculateMorphedAttributeData( + object, + positionAttribute, + morphPosition, + morphTargetsRelative, + a, + b, + c, + modifiedPosition + ); + _calculateMorphedAttributeData( + object, + normalAttribute, + morphNormal, + morphTargetsRelative, + a, + b, + c, + modifiedNormal + ); + } + } + } else { + if (Array.isArray(material)) { + for (i = 0, il = groups.length; i < il; i++) { + group = groups[i]; + start = Math.max(group.start, drawRange.start); + end = Math.min(group.start + group.count, drawRange.start + drawRange.count); + for (j = start, jl = end; j < jl; j += 3) { + a = j; + b = j + 1; + c = j + 2; + _calculateMorphedAttributeData( + object, + positionAttribute, + morphPosition, + morphTargetsRelative, + a, + b, + c, + modifiedPosition + ); + _calculateMorphedAttributeData( + object, + normalAttribute, + morphNormal, + morphTargetsRelative, + a, + b, + c, + modifiedNormal + ); + } + } + } else { + start = Math.max(0, drawRange.start); + end = Math.min(positionAttribute.count, drawRange.start + drawRange.count); + for (i = start, il = end; i < il; i += 3) { + a = i; + b = i + 1; + c = i + 2; + _calculateMorphedAttributeData( + object, + positionAttribute, + morphPosition, + morphTargetsRelative, + a, + b, + c, + modifiedPosition + ); + _calculateMorphedAttributeData( + object, + normalAttribute, + morphNormal, + morphTargetsRelative, + a, + b, + c, + modifiedNormal + ); + } + } } - return new Blob([arrayBuffer], { type: contentType }); -} -__name(dataURLToBlob, "dataURLToBlob"); -function loadedImageToBlob(image) { - const canvas = document.createElement("canvas"); - canvas.width = image.width; - canvas.height = image.height; - const ctx = canvas.getContext("2d"); - ctx.drawImage(image, 0, 0); - const dataURL = canvas.toDataURL("image/png", 1); - const blob = dataURLToBlob(dataURL); - return blob; -} -__name(loadedImageToBlob, "loadedImageToBlob"); -function loadImage(imagePath) { - return new Promise((resolve, reject) => { - const image = new Image(); - image.onload = function() { - resolve(image); - }; - image.src = imagePath; - }); + const morphedPositionAttribute = new Float32BufferAttribute(modifiedPosition, 3); + const morphedNormalAttribute = new Float32BufferAttribute(modifiedNormal, 3); + return { + positionAttribute, + normalAttribute, + morphedPositionAttribute, + morphedNormalAttribute + }; } -__name(loadImage, "loadImage"); -async function uploadMask(filepath, formData) { - await api.fetchApi("/upload/mask", { - method: "POST", - body: formData - }).then((response) => { - }).catch((error) => { - console.error("Error:", error); +__name(computeMorphedAttributes, "computeMorphedAttributes"); +function mergeGroups(geometry) { + if (geometry.groups.length === 0) { + console.warn("THREE.BufferGeometryUtils.mergeGroups(): No groups are defined. Nothing to merge."); + return geometry; + } + let groups = geometry.groups; + groups = groups.sort((a, b) => { + if (a.materialIndex !== b.materialIndex) return a.materialIndex - b.materialIndex; + return a.start - b.start; }); - ComfyApp.clipspace.imgs[ComfyApp.clipspace["selectedIndex"]] = new Image(); - ComfyApp.clipspace.imgs[ComfyApp.clipspace["selectedIndex"]].src = api.apiURL( - "/view?" + new URLSearchParams(filepath).toString() + app.getPreviewFormatParam() + app.getRandParam() - ); - if (ComfyApp.clipspace.images) - ComfyApp.clipspace.images[ComfyApp.clipspace["selectedIndex"]] = filepath; - ClipspaceDialog.invalidatePreview(); + if (geometry.getIndex() === null) { + const positionAttribute = geometry.getAttribute("position"); + const indices = []; + for (let i = 0; i < positionAttribute.count; i += 3) { + indices.push(i, i + 1, i + 2); + } + geometry.setIndex(indices); + } + const index = geometry.getIndex(); + const newIndices = []; + for (let i = 0; i < groups.length; i++) { + const group = groups[i]; + const groupStart = group.start; + const groupLength = groupStart + group.count; + for (let j = groupStart; j < groupLength; j++) { + newIndices.push(index.getX(j)); + } + } + geometry.dispose(); + geometry.setIndex(newIndices); + let start = 0; + for (let i = 0; i < groups.length; i++) { + const group = groups[i]; + group.start = start; + start += group.count; + } + let currentGroup = groups[0]; + geometry.groups = [currentGroup]; + for (let i = 1; i < groups.length; i++) { + const group = groups[i]; + if (currentGroup.materialIndex === group.materialIndex) { + currentGroup.count += group.count; + } else { + currentGroup = group; + geometry.groups.push(currentGroup); + } + } + return geometry; } -__name(uploadMask, "uploadMask"); -function prepare_mask(image, maskCanvas, maskCtx, maskColor) { - maskCtx.drawImage(image, 0, 0, maskCanvas.width, maskCanvas.height); - const maskData = maskCtx.getImageData( - 0, - 0, - maskCanvas.width, - maskCanvas.height - ); - for (let i = 0; i < maskData.data.length; i += 4) { - if (maskData.data[i + 3] == 255) maskData.data[i + 3] = 0; - else maskData.data[i + 3] = 255; - maskData.data[i] = maskColor.r; - maskData.data[i + 1] = maskColor.g; - maskData.data[i + 2] = maskColor.b; +__name(mergeGroups, "mergeGroups"); +function toCreasedNormals(geometry, creaseAngle = Math.PI / 3) { + const creaseDot = Math.cos(creaseAngle); + const hashMultiplier = (1 + 1e-10) * 100; + const verts = [new Vector3(), new Vector3(), new Vector3()]; + const tempVec1 = new Vector3(); + const tempVec2 = new Vector3(); + const tempNorm = new Vector3(); + const tempNorm2 = new Vector3(); + function hashVertex(v) { + const x = ~~(v.x * hashMultiplier); + const y = ~~(v.y * hashMultiplier); + const z = ~~(v.z * hashMultiplier); + return `${x},${y},${z}`; } - maskCtx.globalCompositeOperation = "source-over"; - maskCtx.putImageData(maskData, 0, 0); + __name(hashVertex, "hashVertex"); + const resultGeometry = geometry.index ? geometry.toNonIndexed() : geometry; + const posAttr = resultGeometry.attributes.position; + const vertexMap = {}; + for (let i = 0, l = posAttr.count / 3; i < l; i++) { + const i3 = 3 * i; + const a = verts[0].fromBufferAttribute(posAttr, i3 + 0); + const b = verts[1].fromBufferAttribute(posAttr, i3 + 1); + const c = verts[2].fromBufferAttribute(posAttr, i3 + 2); + tempVec1.subVectors(c, b); + tempVec2.subVectors(a, b); + const normal = new Vector3().crossVectors(tempVec1, tempVec2).normalize(); + for (let n = 0; n < 3; n++) { + const vert = verts[n]; + const hash = hashVertex(vert); + if (!(hash in vertexMap)) { + vertexMap[hash] = []; + } + vertexMap[hash].push(normal); + } + } + const normalArray = new Float32Array(posAttr.count * 3); + const normAttr = new BufferAttribute(normalArray, 3, false); + for (let i = 0, l = posAttr.count / 3; i < l; i++) { + const i3 = 3 * i; + const a = verts[0].fromBufferAttribute(posAttr, i3 + 0); + const b = verts[1].fromBufferAttribute(posAttr, i3 + 1); + const c = verts[2].fromBufferAttribute(posAttr, i3 + 2); + tempVec1.subVectors(c, b); + tempVec2.subVectors(a, b); + tempNorm.crossVectors(tempVec1, tempVec2).normalize(); + for (let n = 0; n < 3; n++) { + const vert = verts[n]; + const hash = hashVertex(vert); + const otherNormals = vertexMap[hash]; + tempNorm2.set(0, 0, 0); + for (let k = 0, lk = otherNormals.length; k < lk; k++) { + const otherNorm = otherNormals[k]; + if (tempNorm.dot(otherNorm) > creaseDot) { + tempNorm2.add(otherNorm); + } + } + tempNorm2.normalize(); + normAttr.setXYZ(i3 + n, tempNorm2.x, tempNorm2.y, tempNorm2.z); + } + } + resultGeometry.setAttribute("normal", normAttr); + return resultGeometry; } -__name(prepare_mask, "prepare_mask"); -var PointerType = /* @__PURE__ */ ((PointerType2) => { - PointerType2["Arc"] = "arc"; - PointerType2["Rect"] = "rect"; - return PointerType2; -})(PointerType || {}); -var CompositionOperation$1 = /* @__PURE__ */ ((CompositionOperation2) => { - CompositionOperation2["SourceOver"] = "source-over"; - CompositionOperation2["DestinationOut"] = "destination-out"; - return CompositionOperation2; -})(CompositionOperation$1 || {}); -class MaskEditorDialogOld extends ComfyDialog { +__name(toCreasedNormals, "toCreasedNormals"); +class GLTFLoader extends Loader { static { - __name(this, "MaskEditorDialogOld"); + __name(this, "GLTFLoader"); } - static instance = null; - static mousedown_x = null; - static mousedown_y = null; - brush; - maskCtx; - maskCanvas; - brush_size_slider; - brush_opacity_slider; - colorButton; - saveButton; - zoom_ratio; - pan_x; - pan_y; - imgCanvas; - last_display_style; - is_visible; - image; - handler_registered; - brush_slider_input; - cursorX; - cursorY; - mousedown_pan_x; - mousedown_pan_y; - last_pressure; - pointer_type; - brush_pointer_type_select; - static getInstance() { - if (!MaskEditorDialogOld.instance) { - MaskEditorDialogOld.instance = new MaskEditorDialogOld(); - } - return MaskEditorDialogOld.instance; + constructor(manager) { + super(manager); + this.dracoLoader = null; + this.ktx2Loader = null; + this.meshoptDecoder = null; + this.pluginCallbacks = []; + this.register(function(parser) { + return new GLTFMaterialsClearcoatExtension(parser); + }); + this.register(function(parser) { + return new GLTFMaterialsDispersionExtension(parser); + }); + this.register(function(parser) { + return new GLTFTextureBasisUExtension(parser); + }); + this.register(function(parser) { + return new GLTFTextureWebPExtension(parser); + }); + this.register(function(parser) { + return new GLTFTextureAVIFExtension(parser); + }); + this.register(function(parser) { + return new GLTFMaterialsSheenExtension(parser); + }); + this.register(function(parser) { + return new GLTFMaterialsTransmissionExtension(parser); + }); + this.register(function(parser) { + return new GLTFMaterialsVolumeExtension(parser); + }); + this.register(function(parser) { + return new GLTFMaterialsIorExtension(parser); + }); + this.register(function(parser) { + return new GLTFMaterialsEmissiveStrengthExtension(parser); + }); + this.register(function(parser) { + return new GLTFMaterialsSpecularExtension(parser); + }); + this.register(function(parser) { + return new GLTFMaterialsIridescenceExtension(parser); + }); + this.register(function(parser) { + return new GLTFMaterialsAnisotropyExtension(parser); + }); + this.register(function(parser) { + return new GLTFMaterialsBumpExtension(parser); + }); + this.register(function(parser) { + return new GLTFLightsExtension(parser); + }); + this.register(function(parser) { + return new GLTFMeshoptCompression(parser); + }); + this.register(function(parser) { + return new GLTFMeshGpuInstancing(parser); + }); } - is_layout_created = false; - constructor() { - super(); - this.element = $el("div.comfy-modal", { parent: document.body }, [ - $el("div.comfy-modal-content", [...this.createButtons()]) - ]); + load(url, onLoad, onProgress, onError) { + const scope = this; + let resourcePath; + if (this.resourcePath !== "") { + resourcePath = this.resourcePath; + } else if (this.path !== "") { + const relativeUrl = LoaderUtils.extractUrlBase(url); + resourcePath = LoaderUtils.resolveURL(relativeUrl, this.path); + } else { + resourcePath = LoaderUtils.extractUrlBase(url); + } + this.manager.itemStart(url); + const _onError = /* @__PURE__ */ __name(function(e) { + if (onError) { + onError(e); + } else { + console.error(e); + } + scope.manager.itemError(url); + scope.manager.itemEnd(url); + }, "_onError"); + const loader = new FileLoader(this.manager); + loader.setPath(this.path); + loader.setResponseType("arraybuffer"); + loader.setRequestHeader(this.requestHeader); + loader.setWithCredentials(this.withCredentials); + loader.load(url, function(data) { + try { + scope.parse(data, resourcePath, function(gltf) { + onLoad(gltf); + scope.manager.itemEnd(url); + }, _onError); + } catch (e) { + _onError(e); + } + }, onProgress, _onError); } - createButtons() { - return []; + setDRACOLoader(dracoLoader) { + this.dracoLoader = dracoLoader; + return this; } - createButton(name, callback) { - var button = document.createElement("button"); - button.style.pointerEvents = "auto"; - button.innerText = name; - button.addEventListener("click", callback); - return button; + setKTX2Loader(ktx2Loader) { + this.ktx2Loader = ktx2Loader; + return this; } - createLeftButton(name, callback) { - var button = this.createButton(name, callback); - button.style.cssFloat = "left"; - button.style.marginRight = "4px"; - return button; + setMeshoptDecoder(meshoptDecoder) { + this.meshoptDecoder = meshoptDecoder; + return this; } - createRightButton(name, callback) { - var button = this.createButton(name, callback); - button.style.cssFloat = "right"; - button.style.marginLeft = "4px"; - return button; + register(callback) { + if (this.pluginCallbacks.indexOf(callback) === -1) { + this.pluginCallbacks.push(callback); + } + return this; } - createLeftSlider(self2, name, callback) { - const divElement = document.createElement("div"); - divElement.id = "maskeditor-slider"; - divElement.style.cssFloat = "left"; - divElement.style.fontFamily = "sans-serif"; - divElement.style.marginRight = "4px"; - divElement.style.color = "var(--input-text)"; - divElement.style.backgroundColor = "var(--comfy-input-bg)"; - divElement.style.borderRadius = "8px"; - divElement.style.borderColor = "var(--border-color)"; - divElement.style.borderStyle = "solid"; - divElement.style.fontSize = "15px"; - divElement.style.height = "25px"; - divElement.style.padding = "1px 6px"; - divElement.style.display = "flex"; - divElement.style.position = "relative"; - divElement.style.top = "2px"; - divElement.style.pointerEvents = "auto"; - self2.brush_slider_input = document.createElement("input"); - self2.brush_slider_input.setAttribute("type", "range"); - self2.brush_slider_input.setAttribute("min", "1"); - self2.brush_slider_input.setAttribute("max", "100"); - self2.brush_slider_input.setAttribute("value", "10"); - const labelElement = document.createElement("label"); - labelElement.textContent = name; - divElement.appendChild(labelElement); - divElement.appendChild(self2.brush_slider_input); - self2.brush_slider_input.addEventListener("change", callback); - return divElement; + unregister(callback) { + if (this.pluginCallbacks.indexOf(callback) !== -1) { + this.pluginCallbacks.splice(this.pluginCallbacks.indexOf(callback), 1); + } + return this; } - createOpacitySlider(self2, name, callback) { - const divElement = document.createElement("div"); - divElement.id = "maskeditor-opacity-slider"; - divElement.style.cssFloat = "left"; - divElement.style.fontFamily = "sans-serif"; - divElement.style.marginRight = "4px"; - divElement.style.color = "var(--input-text)"; - divElement.style.backgroundColor = "var(--comfy-input-bg)"; - divElement.style.borderRadius = "8px"; - divElement.style.borderColor = "var(--border-color)"; - divElement.style.borderStyle = "solid"; - divElement.style.fontSize = "15px"; - divElement.style.height = "25px"; - divElement.style.padding = "1px 6px"; - divElement.style.display = "flex"; - divElement.style.position = "relative"; - divElement.style.top = "2px"; - divElement.style.pointerEvents = "auto"; - self2.opacity_slider_input = document.createElement("input"); - self2.opacity_slider_input.setAttribute("type", "range"); - self2.opacity_slider_input.setAttribute("min", "0.1"); - self2.opacity_slider_input.setAttribute("max", "1.0"); - self2.opacity_slider_input.setAttribute("step", "0.01"); - self2.opacity_slider_input.setAttribute("value", "0.7"); - const labelElement = document.createElement("label"); - labelElement.textContent = name; - divElement.appendChild(labelElement); - divElement.appendChild(self2.opacity_slider_input); - self2.opacity_slider_input.addEventListener("input", callback); - return divElement; + parse(data, path, onLoad, onError) { + let json; + const extensions = {}; + const plugins = {}; + const textDecoder = new TextDecoder(); + if (typeof data === "string") { + json = JSON.parse(data); + } else if (data instanceof ArrayBuffer) { + const magic = textDecoder.decode(new Uint8Array(data, 0, 4)); + if (magic === BINARY_EXTENSION_HEADER_MAGIC) { + try { + extensions[EXTENSIONS.KHR_BINARY_GLTF] = new GLTFBinaryExtension(data); + } catch (error) { + if (onError) onError(error); + return; + } + json = JSON.parse(extensions[EXTENSIONS.KHR_BINARY_GLTF].content); + } else { + json = JSON.parse(textDecoder.decode(data)); + } + } else { + json = data; + } + if (json.asset === void 0 || json.asset.version[0] < 2) { + if (onError) onError(new Error("THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.")); + return; + } + const parser = new GLTFParser(json, { + path: path || this.resourcePath || "", + crossOrigin: this.crossOrigin, + requestHeader: this.requestHeader, + manager: this.manager, + ktx2Loader: this.ktx2Loader, + meshoptDecoder: this.meshoptDecoder + }); + parser.fileLoader.setRequestHeader(this.requestHeader); + for (let i = 0; i < this.pluginCallbacks.length; i++) { + const plugin = this.pluginCallbacks[i](parser); + if (!plugin.name) console.error("THREE.GLTFLoader: Invalid plugin found: missing name"); + plugins[plugin.name] = plugin; + extensions[plugin.name] = true; + } + if (json.extensionsUsed) { + for (let i = 0; i < json.extensionsUsed.length; ++i) { + const extensionName = json.extensionsUsed[i]; + const extensionsRequired = json.extensionsRequired || []; + switch (extensionName) { + case EXTENSIONS.KHR_MATERIALS_UNLIT: + extensions[extensionName] = new GLTFMaterialsUnlitExtension(); + break; + case EXTENSIONS.KHR_DRACO_MESH_COMPRESSION: + extensions[extensionName] = new GLTFDracoMeshCompressionExtension(json, this.dracoLoader); + break; + case EXTENSIONS.KHR_TEXTURE_TRANSFORM: + extensions[extensionName] = new GLTFTextureTransformExtension(); + break; + case EXTENSIONS.KHR_MESH_QUANTIZATION: + extensions[extensionName] = new GLTFMeshQuantizationExtension(); + break; + default: + if (extensionsRequired.indexOf(extensionName) >= 0 && plugins[extensionName] === void 0) { + console.warn('THREE.GLTFLoader: Unknown extension "' + extensionName + '".'); + } + } + } + } + parser.setExtensions(extensions); + parser.setPlugins(plugins); + parser.parse(onLoad, onError); } - createPointerTypeSelect(self2) { - const divElement = document.createElement("div"); - divElement.id = "maskeditor-pointer-type"; - divElement.style.cssFloat = "left"; - divElement.style.fontFamily = "sans-serif"; - divElement.style.marginRight = "4px"; - divElement.style.color = "var(--input-text)"; - divElement.style.backgroundColor = "var(--comfy-input-bg)"; - divElement.style.borderRadius = "8px"; - divElement.style.borderColor = "var(--border-color)"; - divElement.style.borderStyle = "solid"; - divElement.style.fontSize = "15px"; - divElement.style.height = "25px"; - divElement.style.padding = "1px 6px"; - divElement.style.display = "flex"; - divElement.style.position = "relative"; - divElement.style.top = "2px"; - divElement.style.pointerEvents = "auto"; - const labelElement = document.createElement("label"); - labelElement.textContent = "Pointer Type:"; - const selectElement = document.createElement("select"); - selectElement.style.borderRadius = "0"; - selectElement.style.borderColor = "transparent"; - selectElement.style.borderStyle = "unset"; - selectElement.style.fontSize = "0.9em"; - const optionArc = document.createElement("option"); - optionArc.value = "arc"; - optionArc.text = "Circle"; - optionArc.selected = true; - const optionRect = document.createElement("option"); - optionRect.value = "rect"; - optionRect.text = "Square"; - selectElement.appendChild(optionArc); - selectElement.appendChild(optionRect); - selectElement.addEventListener("change", (event) => { - const target = event.target; - self2.pointer_type = target.value; - this.setBrushBorderRadius(self2); + parseAsync(data, path) { + const scope = this; + return new Promise(function(resolve, reject) { + scope.parse(data, path, resolve, reject); }); - divElement.appendChild(labelElement); - divElement.appendChild(selectElement); - return divElement; } - setBrushBorderRadius(self2) { - if (self2.pointer_type === "rect") { - this.brush.style.borderRadius = "0%"; - this.brush.style.MozBorderRadius = "0%"; - this.brush.style.WebkitBorderRadius = "0%"; - } else { - this.brush.style.borderRadius = "50%"; - this.brush.style.MozBorderRadius = "50%"; - this.brush.style.WebkitBorderRadius = "50%"; +} +function GLTFRegistry() { + let objects = {}; + return { + get: /* @__PURE__ */ __name(function(key) { + return objects[key]; + }, "get"), + add: /* @__PURE__ */ __name(function(key, object) { + objects[key] = object; + }, "add"), + remove: /* @__PURE__ */ __name(function(key) { + delete objects[key]; + }, "remove"), + removeAll: /* @__PURE__ */ __name(function() { + objects = {}; + }, "removeAll") + }; +} +__name(GLTFRegistry, "GLTFRegistry"); +const EXTENSIONS = { + KHR_BINARY_GLTF: "KHR_binary_glTF", + KHR_DRACO_MESH_COMPRESSION: "KHR_draco_mesh_compression", + KHR_LIGHTS_PUNCTUAL: "KHR_lights_punctual", + KHR_MATERIALS_CLEARCOAT: "KHR_materials_clearcoat", + KHR_MATERIALS_DISPERSION: "KHR_materials_dispersion", + KHR_MATERIALS_IOR: "KHR_materials_ior", + KHR_MATERIALS_SHEEN: "KHR_materials_sheen", + KHR_MATERIALS_SPECULAR: "KHR_materials_specular", + KHR_MATERIALS_TRANSMISSION: "KHR_materials_transmission", + KHR_MATERIALS_IRIDESCENCE: "KHR_materials_iridescence", + KHR_MATERIALS_ANISOTROPY: "KHR_materials_anisotropy", + KHR_MATERIALS_UNLIT: "KHR_materials_unlit", + KHR_MATERIALS_VOLUME: "KHR_materials_volume", + KHR_TEXTURE_BASISU: "KHR_texture_basisu", + KHR_TEXTURE_TRANSFORM: "KHR_texture_transform", + KHR_MESH_QUANTIZATION: "KHR_mesh_quantization", + KHR_MATERIALS_EMISSIVE_STRENGTH: "KHR_materials_emissive_strength", + EXT_MATERIALS_BUMP: "EXT_materials_bump", + EXT_TEXTURE_WEBP: "EXT_texture_webp", + EXT_TEXTURE_AVIF: "EXT_texture_avif", + EXT_MESHOPT_COMPRESSION: "EXT_meshopt_compression", + EXT_MESH_GPU_INSTANCING: "EXT_mesh_gpu_instancing" +}; +class GLTFLightsExtension { + static { + __name(this, "GLTFLightsExtension"); + } + constructor(parser) { + this.parser = parser; + this.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL; + this.cache = { refs: {}, uses: {} }; + } + _markDefs() { + const parser = this.parser; + const nodeDefs = this.parser.json.nodes || []; + for (let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex++) { + const nodeDef = nodeDefs[nodeIndex]; + if (nodeDef.extensions && nodeDef.extensions[this.name] && nodeDef.extensions[this.name].light !== void 0) { + parser._addNodeRef(this.cache, nodeDef.extensions[this.name].light); + } + } + } + _loadLight(lightIndex) { + const parser = this.parser; + const cacheKey = "light:" + lightIndex; + let dependency = parser.cache.get(cacheKey); + if (dependency) return dependency; + const json = parser.json; + const extensions = json.extensions && json.extensions[this.name] || {}; + const lightDefs = extensions.lights || []; + const lightDef = lightDefs[lightIndex]; + let lightNode; + const color = new Color(16777215); + if (lightDef.color !== void 0) color.setRGB(lightDef.color[0], lightDef.color[1], lightDef.color[2], LinearSRGBColorSpace); + const range = lightDef.range !== void 0 ? lightDef.range : 0; + switch (lightDef.type) { + case "directional": + lightNode = new DirectionalLight(color); + lightNode.target.position.set(0, 0, -1); + lightNode.add(lightNode.target); + break; + case "point": + lightNode = new PointLight(color); + lightNode.distance = range; + break; + case "spot": + lightNode = new SpotLight(color); + lightNode.distance = range; + lightDef.spot = lightDef.spot || {}; + lightDef.spot.innerConeAngle = lightDef.spot.innerConeAngle !== void 0 ? lightDef.spot.innerConeAngle : 0; + lightDef.spot.outerConeAngle = lightDef.spot.outerConeAngle !== void 0 ? lightDef.spot.outerConeAngle : Math.PI / 4; + lightNode.angle = lightDef.spot.outerConeAngle; + lightNode.penumbra = 1 - lightDef.spot.innerConeAngle / lightDef.spot.outerConeAngle; + lightNode.target.position.set(0, 0, -1); + lightNode.add(lightNode.target); + break; + default: + throw new Error("THREE.GLTFLoader: Unexpected light type: " + lightDef.type); } + lightNode.position.set(0, 0, 0); + lightNode.decay = 2; + assignExtrasToUserData(lightNode, lightDef); + if (lightDef.intensity !== void 0) lightNode.intensity = lightDef.intensity; + lightNode.name = parser.createUniqueName(lightDef.name || "light_" + lightIndex); + dependency = Promise.resolve(lightNode); + parser.cache.add(cacheKey, dependency); + return dependency; } - setlayout(imgCanvas, maskCanvas) { + getDependency(type, index) { + if (type !== "light") return; + return this._loadLight(index); + } + createNodeAttachment(nodeIndex) { const self2 = this; - self2.pointer_type = "arc"; - var bottom_panel = document.createElement("div"); - bottom_panel.style.position = "absolute"; - bottom_panel.style.bottom = "0px"; - bottom_panel.style.left = "20px"; - bottom_panel.style.right = "20px"; - bottom_panel.style.height = "50px"; - bottom_panel.style.pointerEvents = "none"; - var brush = document.createElement("div"); - brush.id = "brush"; - brush.style.backgroundColor = "transparent"; - brush.style.outline = "1px dashed black"; - brush.style.boxShadow = "0 0 0 1px white"; - brush.style.position = "absolute"; - brush.style.zIndex = "8889"; - brush.style.pointerEvents = "none"; - this.brush = brush; - this.setBrushBorderRadius(self2); - this.element.appendChild(imgCanvas); - this.element.appendChild(maskCanvas); - this.element.appendChild(bottom_panel); - document.body.appendChild(brush); - var clearButton = this.createLeftButton("Clear", () => { - self2.maskCtx.clearRect( - 0, - 0, - self2.maskCanvas.width, - self2.maskCanvas.height - ); + const parser = this.parser; + const json = parser.json; + const nodeDef = json.nodes[nodeIndex]; + const lightDef = nodeDef.extensions && nodeDef.extensions[this.name] || {}; + const lightIndex = lightDef.light; + if (lightIndex === void 0) return null; + return this._loadLight(lightIndex).then(function(light) { + return parser._getNodeRef(self2.cache, lightIndex, light); }); - this.brush_size_slider = this.createLeftSlider( - self2, - "Thickness", - (event) => { - self2.brush_size = event.target.value; - self2.updateBrushPreview(self2); - } - ); - this.brush_opacity_slider = this.createOpacitySlider( - self2, - "Opacity", - (event) => { - self2.brush_opacity = event.target.value; - if (self2.brush_color_mode !== "negative") { - self2.maskCanvas.style.opacity = self2.brush_opacity.toString(); - } + } +} +class GLTFMaterialsUnlitExtension { + static { + __name(this, "GLTFMaterialsUnlitExtension"); + } + constructor() { + this.name = EXTENSIONS.KHR_MATERIALS_UNLIT; + } + getMaterialType() { + return MeshBasicMaterial; + } + extendParams(materialParams, materialDef, parser) { + const pending = []; + materialParams.color = new Color(1, 1, 1); + materialParams.opacity = 1; + const metallicRoughness = materialDef.pbrMetallicRoughness; + if (metallicRoughness) { + if (Array.isArray(metallicRoughness.baseColorFactor)) { + const array = metallicRoughness.baseColorFactor; + materialParams.color.setRGB(array[0], array[1], array[2], LinearSRGBColorSpace); + materialParams.opacity = array[3]; } - ); - this.brush_pointer_type_select = this.createPointerTypeSelect(self2); - this.colorButton = this.createLeftButton(this.getColorButtonText(), () => { - if (self2.brush_color_mode === "black") { - self2.brush_color_mode = "white"; - } else if (self2.brush_color_mode === "white") { - self2.brush_color_mode = "negative"; - } else { - self2.brush_color_mode = "black"; + if (metallicRoughness.baseColorTexture !== void 0) { + pending.push(parser.assignTexture(materialParams, "map", metallicRoughness.baseColorTexture, SRGBColorSpace)); } - self2.updateWhenBrushColorModeChanged(); - }); - var cancelButton = this.createRightButton("Cancel", () => { - document.removeEventListener("keydown", MaskEditorDialogOld.handleKeyDown); - self2.close(); - }); - this.saveButton = this.createRightButton("Save", () => { - document.removeEventListener("keydown", MaskEditorDialogOld.handleKeyDown); - self2.save(); - }); - this.element.appendChild(imgCanvas); - this.element.appendChild(maskCanvas); - this.element.appendChild(bottom_panel); - bottom_panel.appendChild(clearButton); - bottom_panel.appendChild(this.saveButton); - bottom_panel.appendChild(cancelButton); - bottom_panel.appendChild(this.brush_size_slider); - bottom_panel.appendChild(this.brush_opacity_slider); - bottom_panel.appendChild(this.brush_pointer_type_select); - bottom_panel.appendChild(this.colorButton); - imgCanvas.style.position = "absolute"; - maskCanvas.style.position = "absolute"; - imgCanvas.style.top = "200"; - imgCanvas.style.left = "0"; - maskCanvas.style.top = imgCanvas.style.top; - maskCanvas.style.left = imgCanvas.style.left; - const maskCanvasStyle = this.getMaskCanvasStyle(); - maskCanvas.style.mixBlendMode = maskCanvasStyle.mixBlendMode; - maskCanvas.style.opacity = maskCanvasStyle.opacity.toString(); + } + return Promise.all(pending); } - async show() { - this.zoom_ratio = 1; - this.pan_x = 0; - this.pan_y = 0; - if (!this.is_layout_created) { - const imgCanvas = document.createElement("canvas"); - const maskCanvas = document.createElement("canvas"); - imgCanvas.id = "imageCanvas"; - maskCanvas.id = "maskCanvas"; - this.setlayout(imgCanvas, maskCanvas); - this.imgCanvas = imgCanvas; - this.maskCanvas = maskCanvas; - this.maskCtx = maskCanvas.getContext("2d", { willReadFrequently: true }); - this.setEventHandler(maskCanvas); - this.is_layout_created = true; - const self2 = this; - const observer = new MutationObserver(function(mutations) { - mutations.forEach(function(mutation) { - if (mutation.type === "attributes" && mutation.attributeName === "style") { - if (self2.last_display_style && self2.last_display_style != "none" && self2.element.style.display == "none") { - self2.brush.style.display = "none"; - ComfyApp.onClipspaceEditorClosed(); - } - self2.last_display_style = self2.element.style.display; - } - }); - }); - const config = { attributes: true }; - observer.observe(this.element, config); +} +class GLTFMaterialsEmissiveStrengthExtension { + static { + __name(this, "GLTFMaterialsEmissiveStrengthExtension"); + } + constructor(parser) { + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_EMISSIVE_STRENGTH; + } + extendMaterialParams(materialIndex, materialParams) { + const parser = this.parser; + const materialDef = parser.json.materials[materialIndex]; + if (!materialDef.extensions || !materialDef.extensions[this.name]) { + return Promise.resolve(); } - document.addEventListener("keydown", MaskEditorDialogOld.handleKeyDown); - if (ComfyApp.clipspace_return_node) { - this.saveButton.innerText = "Save to node"; - } else { - this.saveButton.innerText = "Save"; + const emissiveStrength = materialDef.extensions[this.name].emissiveStrength; + if (emissiveStrength !== void 0) { + materialParams.emissiveIntensity = emissiveStrength; } - this.saveButton.disabled = false; - this.element.style.display = "block"; - this.element.style.width = "85%"; - this.element.style.margin = "0 7.5%"; - this.element.style.height = "100vh"; - this.element.style.top = "50%"; - this.element.style.left = "42%"; - this.element.style.zIndex = "8888"; - await this.setImages(this.imgCanvas); - this.is_visible = true; + return Promise.resolve(); } - isOpened() { - return this.element.style.display == "block"; +} +class GLTFMaterialsClearcoatExtension { + static { + __name(this, "GLTFMaterialsClearcoatExtension"); } - invalidateCanvas(orig_image, mask_image) { - this.imgCanvas.width = orig_image.width; - this.imgCanvas.height = orig_image.height; - this.maskCanvas.width = orig_image.width; - this.maskCanvas.height = orig_image.height; - let imgCtx = this.imgCanvas.getContext("2d", { willReadFrequently: true }); - let maskCtx = this.maskCanvas.getContext("2d", { - willReadFrequently: true - }); - imgCtx.drawImage(orig_image, 0, 0, orig_image.width, orig_image.height); - prepare_mask(mask_image, this.maskCanvas, maskCtx, this.getMaskColor()); + constructor(parser) { + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_CLEARCOAT; } - async setImages(imgCanvas) { - let self2 = this; - const imgCtx = imgCanvas.getContext("2d", { willReadFrequently: true }); - const maskCtx = this.maskCtx; - const maskCanvas = this.maskCanvas; - imgCtx.clearRect(0, 0, this.imgCanvas.width, this.imgCanvas.height); - maskCtx.clearRect(0, 0, this.maskCanvas.width, this.maskCanvas.height); - const filepath = ComfyApp.clipspace.images; - const alpha_url = new URL( - ComfyApp.clipspace.imgs[ComfyApp.clipspace["selectedIndex"]].src - ); - alpha_url.searchParams.delete("channel"); - alpha_url.searchParams.delete("preview"); - alpha_url.searchParams.set("channel", "a"); - let mask_image = await loadImage(alpha_url); - const rgb_url = new URL( - ComfyApp.clipspace.imgs[ComfyApp.clipspace["selectedIndex"]].src - ); - rgb_url.searchParams.delete("channel"); - rgb_url.searchParams.set("channel", "rgb"); - this.image = new Image(); - this.image.onload = function() { - maskCanvas.width = self2.image.width; - maskCanvas.height = self2.image.height; - self2.invalidateCanvas(self2.image, mask_image); - self2.initializeCanvasPanZoom(); - }; - this.image.src = rgb_url.toString(); + getMaterialType(materialIndex) { + const parser = this.parser; + const materialDef = parser.json.materials[materialIndex]; + if (!materialDef.extensions || !materialDef.extensions[this.name]) return null; + return MeshPhysicalMaterial; } - initializeCanvasPanZoom() { - let drawWidth = this.image.width; - let drawHeight = this.image.height; - let width = this.element.clientWidth; - let height = this.element.clientHeight; - if (this.image.width > width) { - drawWidth = width; - drawHeight = drawWidth / this.image.width * this.image.height; + extendMaterialParams(materialIndex, materialParams) { + const parser = this.parser; + const materialDef = parser.json.materials[materialIndex]; + if (!materialDef.extensions || !materialDef.extensions[this.name]) { + return Promise.resolve(); } - if (drawHeight > height) { - drawHeight = height; - drawWidth = drawHeight / this.image.height * this.image.width; + const pending = []; + const extension = materialDef.extensions[this.name]; + if (extension.clearcoatFactor !== void 0) { + materialParams.clearcoat = extension.clearcoatFactor; } - this.zoom_ratio = drawWidth / this.image.width; - const canvasX = (width - drawWidth) / 2; - const canvasY = (height - drawHeight) / 2; - this.pan_x = canvasX; - this.pan_y = canvasY; - this.invalidatePanZoom(); - } - invalidatePanZoom() { - let raw_width = this.image.width * this.zoom_ratio; - let raw_height = this.image.height * this.zoom_ratio; - if (this.pan_x + raw_width < 10) { - this.pan_x = 10 - raw_width; + if (extension.clearcoatTexture !== void 0) { + pending.push(parser.assignTexture(materialParams, "clearcoatMap", extension.clearcoatTexture)); } - if (this.pan_y + raw_height < 10) { - this.pan_y = 10 - raw_height; + if (extension.clearcoatRoughnessFactor !== void 0) { + materialParams.clearcoatRoughness = extension.clearcoatRoughnessFactor; } - let width = `${raw_width}px`; - let height = `${raw_height}px`; - let left = `${this.pan_x}px`; - let top = `${this.pan_y}px`; - this.maskCanvas.style.width = width; - this.maskCanvas.style.height = height; - this.maskCanvas.style.left = left; - this.maskCanvas.style.top = top; - this.imgCanvas.style.width = width; - this.imgCanvas.style.height = height; - this.imgCanvas.style.left = left; - this.imgCanvas.style.top = top; + if (extension.clearcoatRoughnessTexture !== void 0) { + pending.push(parser.assignTexture(materialParams, "clearcoatRoughnessMap", extension.clearcoatRoughnessTexture)); + } + if (extension.clearcoatNormalTexture !== void 0) { + pending.push(parser.assignTexture(materialParams, "clearcoatNormalMap", extension.clearcoatNormalTexture)); + if (extension.clearcoatNormalTexture.scale !== void 0) { + const scale = extension.clearcoatNormalTexture.scale; + materialParams.clearcoatNormalScale = new Vector2(scale, scale); + } + } + return Promise.all(pending); } - setEventHandler(maskCanvas) { - const self2 = this; - if (!this.handler_registered) { - maskCanvas.addEventListener("contextmenu", (event) => { - event.preventDefault(); - }); - this.element.addEventListener( - "wheel", - (event) => this.handleWheelEvent(self2, event) - ); - this.element.addEventListener( - "pointermove", - (event) => this.pointMoveEvent(self2, event) - ); - this.element.addEventListener( - "touchmove", - (event) => this.pointMoveEvent(self2, event) - ); - this.element.addEventListener("dragstart", (event) => { - if (event.ctrlKey) { - event.preventDefault(); - } - }); - maskCanvas.addEventListener( - "pointerdown", - (event) => this.handlePointerDown(self2, event) - ); - maskCanvas.addEventListener( - "pointermove", - (event) => this.draw_move(self2, event) - ); - maskCanvas.addEventListener( - "touchmove", - (event) => this.draw_move(self2, event) - ); - maskCanvas.addEventListener("pointerover", (event) => { - this.brush.style.display = "block"; - }); - maskCanvas.addEventListener("pointerleave", (event) => { - this.brush.style.display = "none"; - }); - document.addEventListener( - "pointerup", - MaskEditorDialogOld.handlePointerUp - ); - this.handler_registered = true; +} +class GLTFMaterialsDispersionExtension { + static { + __name(this, "GLTFMaterialsDispersionExtension"); + } + constructor(parser) { + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_DISPERSION; + } + getMaterialType(materialIndex) { + const parser = this.parser; + const materialDef = parser.json.materials[materialIndex]; + if (!materialDef.extensions || !materialDef.extensions[this.name]) return null; + return MeshPhysicalMaterial; + } + extendMaterialParams(materialIndex, materialParams) { + const parser = this.parser; + const materialDef = parser.json.materials[materialIndex]; + if (!materialDef.extensions || !materialDef.extensions[this.name]) { + return Promise.resolve(); } + const extension = materialDef.extensions[this.name]; + materialParams.dispersion = extension.dispersion !== void 0 ? extension.dispersion : 0; + return Promise.resolve(); } - getMaskCanvasStyle() { - if (this.brush_color_mode === "negative") { - return { - mixBlendMode: "difference", - opacity: "1" - }; - } else { - return { - mixBlendMode: "initial", - opacity: this.brush_opacity - }; +} +class GLTFMaterialsIridescenceExtension { + static { + __name(this, "GLTFMaterialsIridescenceExtension"); + } + constructor(parser) { + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_IRIDESCENCE; + } + getMaterialType(materialIndex) { + const parser = this.parser; + const materialDef = parser.json.materials[materialIndex]; + if (!materialDef.extensions || !materialDef.extensions[this.name]) return null; + return MeshPhysicalMaterial; + } + extendMaterialParams(materialIndex, materialParams) { + const parser = this.parser; + const materialDef = parser.json.materials[materialIndex]; + if (!materialDef.extensions || !materialDef.extensions[this.name]) { + return Promise.resolve(); + } + const pending = []; + const extension = materialDef.extensions[this.name]; + if (extension.iridescenceFactor !== void 0) { + materialParams.iridescence = extension.iridescenceFactor; + } + if (extension.iridescenceTexture !== void 0) { + pending.push(parser.assignTexture(materialParams, "iridescenceMap", extension.iridescenceTexture)); + } + if (extension.iridescenceIor !== void 0) { + materialParams.iridescenceIOR = extension.iridescenceIor; + } + if (materialParams.iridescenceThicknessRange === void 0) { + materialParams.iridescenceThicknessRange = [100, 400]; + } + if (extension.iridescenceThicknessMinimum !== void 0) { + materialParams.iridescenceThicknessRange[0] = extension.iridescenceThicknessMinimum; + } + if (extension.iridescenceThicknessMaximum !== void 0) { + materialParams.iridescenceThicknessRange[1] = extension.iridescenceThicknessMaximum; + } + if (extension.iridescenceThicknessTexture !== void 0) { + pending.push(parser.assignTexture(materialParams, "iridescenceThicknessMap", extension.iridescenceThicknessTexture)); + } + return Promise.all(pending); + } +} +class GLTFMaterialsSheenExtension { + static { + __name(this, "GLTFMaterialsSheenExtension"); + } + constructor(parser) { + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_SHEEN; + } + getMaterialType(materialIndex) { + const parser = this.parser; + const materialDef = parser.json.materials[materialIndex]; + if (!materialDef.extensions || !materialDef.extensions[this.name]) return null; + return MeshPhysicalMaterial; + } + extendMaterialParams(materialIndex, materialParams) { + const parser = this.parser; + const materialDef = parser.json.materials[materialIndex]; + if (!materialDef.extensions || !materialDef.extensions[this.name]) { + return Promise.resolve(); + } + const pending = []; + materialParams.sheenColor = new Color(0, 0, 0); + materialParams.sheenRoughness = 0; + materialParams.sheen = 1; + const extension = materialDef.extensions[this.name]; + if (extension.sheenColorFactor !== void 0) { + const colorFactor = extension.sheenColorFactor; + materialParams.sheenColor.setRGB(colorFactor[0], colorFactor[1], colorFactor[2], LinearSRGBColorSpace); } - } - getMaskColor() { - if (this.brush_color_mode === "black") { - return { r: 0, g: 0, b: 0 }; + if (extension.sheenRoughnessFactor !== void 0) { + materialParams.sheenRoughness = extension.sheenRoughnessFactor; } - if (this.brush_color_mode === "white") { - return { r: 255, g: 255, b: 255 }; + if (extension.sheenColorTexture !== void 0) { + pending.push(parser.assignTexture(materialParams, "sheenColorMap", extension.sheenColorTexture, SRGBColorSpace)); } - if (this.brush_color_mode === "negative") { - return { r: 255, g: 255, b: 255 }; + if (extension.sheenRoughnessTexture !== void 0) { + pending.push(parser.assignTexture(materialParams, "sheenRoughnessMap", extension.sheenRoughnessTexture)); } - return { r: 0, g: 0, b: 0 }; + return Promise.all(pending); } - getMaskFillStyle() { - const maskColor = this.getMaskColor(); - return "rgb(" + maskColor.r + "," + maskColor.g + "," + maskColor.b + ")"; +} +class GLTFMaterialsTransmissionExtension { + static { + __name(this, "GLTFMaterialsTransmissionExtension"); } - getColorButtonText() { - let colorCaption = "unknown"; - if (this.brush_color_mode === "black") { - colorCaption = "black"; - } else if (this.brush_color_mode === "white") { - colorCaption = "white"; - } else if (this.brush_color_mode === "negative") { - colorCaption = "negative"; + constructor(parser) { + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_TRANSMISSION; + } + getMaterialType(materialIndex) { + const parser = this.parser; + const materialDef = parser.json.materials[materialIndex]; + if (!materialDef.extensions || !materialDef.extensions[this.name]) return null; + return MeshPhysicalMaterial; + } + extendMaterialParams(materialIndex, materialParams) { + const parser = this.parser; + const materialDef = parser.json.materials[materialIndex]; + if (!materialDef.extensions || !materialDef.extensions[this.name]) { + return Promise.resolve(); } - return "Color: " + colorCaption; + const pending = []; + const extension = materialDef.extensions[this.name]; + if (extension.transmissionFactor !== void 0) { + materialParams.transmission = extension.transmissionFactor; + } + if (extension.transmissionTexture !== void 0) { + pending.push(parser.assignTexture(materialParams, "transmissionMap", extension.transmissionTexture)); + } + return Promise.all(pending); } - updateWhenBrushColorModeChanged() { - this.colorButton.innerText = this.getColorButtonText(); - const maskCanvasStyle = this.getMaskCanvasStyle(); - this.maskCanvas.style.mixBlendMode = maskCanvasStyle.mixBlendMode; - this.maskCanvas.style.opacity = maskCanvasStyle.opacity.toString(); - const maskColor = this.getMaskColor(); - const maskData = this.maskCtx.getImageData( - 0, - 0, - this.maskCanvas.width, - this.maskCanvas.height - ); - for (let i = 0; i < maskData.data.length; i += 4) { - maskData.data[i] = maskColor.r; - maskData.data[i + 1] = maskColor.g; - maskData.data[i + 2] = maskColor.b; +} +class GLTFMaterialsVolumeExtension { + static { + __name(this, "GLTFMaterialsVolumeExtension"); + } + constructor(parser) { + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_VOLUME; + } + getMaterialType(materialIndex) { + const parser = this.parser; + const materialDef = parser.json.materials[materialIndex]; + if (!materialDef.extensions || !materialDef.extensions[this.name]) return null; + return MeshPhysicalMaterial; + } + extendMaterialParams(materialIndex, materialParams) { + const parser = this.parser; + const materialDef = parser.json.materials[materialIndex]; + if (!materialDef.extensions || !materialDef.extensions[this.name]) { + return Promise.resolve(); } - this.maskCtx.putImageData(maskData, 0, 0); + const pending = []; + const extension = materialDef.extensions[this.name]; + materialParams.thickness = extension.thicknessFactor !== void 0 ? extension.thicknessFactor : 0; + if (extension.thicknessTexture !== void 0) { + pending.push(parser.assignTexture(materialParams, "thicknessMap", extension.thicknessTexture)); + } + materialParams.attenuationDistance = extension.attenuationDistance || Infinity; + const colorArray = extension.attenuationColor || [1, 1, 1]; + materialParams.attenuationColor = new Color().setRGB(colorArray[0], colorArray[1], colorArray[2], LinearSRGBColorSpace); + return Promise.all(pending); } - brush_opacity = 0.7; - brush_size = 10; - brush_color_mode = "black"; - drawing_mode = false; - lastx = -1; - lasty = -1; - lasttime = 0; - static handleKeyDown(event) { - const self2 = MaskEditorDialogOld.instance; - if (event.key === "]") { - self2.brush_size = Math.min(self2.brush_size + 2, 100); - self2.brush_slider_input.value = self2.brush_size; - } else if (event.key === "[") { - self2.brush_size = Math.max(self2.brush_size - 2, 1); - self2.brush_slider_input.value = self2.brush_size; - } else if (event.key === "Enter") { - self2.save(); +} +class GLTFMaterialsIorExtension { + static { + __name(this, "GLTFMaterialsIorExtension"); + } + constructor(parser) { + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_IOR; + } + getMaterialType(materialIndex) { + const parser = this.parser; + const materialDef = parser.json.materials[materialIndex]; + if (!materialDef.extensions || !materialDef.extensions[this.name]) return null; + return MeshPhysicalMaterial; + } + extendMaterialParams(materialIndex, materialParams) { + const parser = this.parser; + const materialDef = parser.json.materials[materialIndex]; + if (!materialDef.extensions || !materialDef.extensions[this.name]) { + return Promise.resolve(); } - self2.updateBrushPreview(self2); + const extension = materialDef.extensions[this.name]; + materialParams.ior = extension.ior !== void 0 ? extension.ior : 1.5; + return Promise.resolve(); } - static handlePointerUp(event) { - event.preventDefault(); - this.mousedown_x = null; - this.mousedown_y = null; - MaskEditorDialogOld.instance.drawing_mode = false; +} +class GLTFMaterialsSpecularExtension { + static { + __name(this, "GLTFMaterialsSpecularExtension"); } - updateBrushPreview(self2) { - const brush = self2.brush; - var centerX = self2.cursorX; - var centerY = self2.cursorY; - brush.style.width = self2.brush_size * 2 * this.zoom_ratio + "px"; - brush.style.height = self2.brush_size * 2 * this.zoom_ratio + "px"; - brush.style.left = centerX - self2.brush_size * this.zoom_ratio + "px"; - brush.style.top = centerY - self2.brush_size * this.zoom_ratio + "px"; + constructor(parser) { + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_SPECULAR; } - handleWheelEvent(self2, event) { - event.preventDefault(); - if (event.ctrlKey) { - if (event.deltaY < 0) { - this.zoom_ratio = Math.min(10, this.zoom_ratio + 0.2); - } else { - this.zoom_ratio = Math.max(0.2, this.zoom_ratio - 0.2); - } - this.invalidatePanZoom(); - } else { - if (event.deltaY < 0) this.brush_size = Math.min(this.brush_size + 2, 100); - else this.brush_size = Math.max(this.brush_size - 2, 1); - this.brush_slider_input.value = this.brush_size.toString(); - this.updateBrushPreview(this); + getMaterialType(materialIndex) { + const parser = this.parser; + const materialDef = parser.json.materials[materialIndex]; + if (!materialDef.extensions || !materialDef.extensions[this.name]) return null; + return MeshPhysicalMaterial; + } + extendMaterialParams(materialIndex, materialParams) { + const parser = this.parser; + const materialDef = parser.json.materials[materialIndex]; + if (!materialDef.extensions || !materialDef.extensions[this.name]) { + return Promise.resolve(); + } + const pending = []; + const extension = materialDef.extensions[this.name]; + materialParams.specularIntensity = extension.specularFactor !== void 0 ? extension.specularFactor : 1; + if (extension.specularTexture !== void 0) { + pending.push(parser.assignTexture(materialParams, "specularIntensityMap", extension.specularTexture)); + } + const colorArray = extension.specularColorFactor || [1, 1, 1]; + materialParams.specularColor = new Color().setRGB(colorArray[0], colorArray[1], colorArray[2], LinearSRGBColorSpace); + if (extension.specularColorTexture !== void 0) { + pending.push(parser.assignTexture(materialParams, "specularColorMap", extension.specularColorTexture, SRGBColorSpace)); } + return Promise.all(pending); } - pointMoveEvent(self2, event) { - this.cursorX = event.pageX; - this.cursorY = event.pageY; - self2.updateBrushPreview(self2); - if (event.ctrlKey) { - event.preventDefault(); - self2.pan_move(self2, event); +} +class GLTFMaterialsBumpExtension { + static { + __name(this, "GLTFMaterialsBumpExtension"); + } + constructor(parser) { + this.parser = parser; + this.name = EXTENSIONS.EXT_MATERIALS_BUMP; + } + getMaterialType(materialIndex) { + const parser = this.parser; + const materialDef = parser.json.materials[materialIndex]; + if (!materialDef.extensions || !materialDef.extensions[this.name]) return null; + return MeshPhysicalMaterial; + } + extendMaterialParams(materialIndex, materialParams) { + const parser = this.parser; + const materialDef = parser.json.materials[materialIndex]; + if (!materialDef.extensions || !materialDef.extensions[this.name]) { + return Promise.resolve(); } - let left_button_down = window.TouchEvent && event instanceof TouchEvent || event.buttons == 1; - if (event.shiftKey && left_button_down) { - self2.drawing_mode = false; - const y = event.clientY; - let delta = (self2.zoom_lasty - y) * 5e-3; - self2.zoom_ratio = Math.max( - Math.min(10, self2.last_zoom_ratio - delta), - 0.2 - ); - this.invalidatePanZoom(); - return; + const pending = []; + const extension = materialDef.extensions[this.name]; + materialParams.bumpScale = extension.bumpFactor !== void 0 ? extension.bumpFactor : 1; + if (extension.bumpTexture !== void 0) { + pending.push(parser.assignTexture(materialParams, "bumpMap", extension.bumpTexture)); } + return Promise.all(pending); } - pan_move(self2, event) { - if (event.buttons == 1) { - if (MaskEditorDialogOld.mousedown_x) { - let deltaX = MaskEditorDialogOld.mousedown_x - event.clientX; - let deltaY = MaskEditorDialogOld.mousedown_y - event.clientY; - self2.pan_x = this.mousedown_pan_x - deltaX; - self2.pan_y = this.mousedown_pan_y - deltaY; - self2.invalidatePanZoom(); - } +} +class GLTFMaterialsAnisotropyExtension { + static { + __name(this, "GLTFMaterialsAnisotropyExtension"); + } + constructor(parser) { + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_ANISOTROPY; + } + getMaterialType(materialIndex) { + const parser = this.parser; + const materialDef = parser.json.materials[materialIndex]; + if (!materialDef.extensions || !materialDef.extensions[this.name]) return null; + return MeshPhysicalMaterial; + } + extendMaterialParams(materialIndex, materialParams) { + const parser = this.parser; + const materialDef = parser.json.materials[materialIndex]; + if (!materialDef.extensions || !materialDef.extensions[this.name]) { + return Promise.resolve(); + } + const pending = []; + const extension = materialDef.extensions[this.name]; + if (extension.anisotropyStrength !== void 0) { + materialParams.anisotropy = extension.anisotropyStrength; + } + if (extension.anisotropyRotation !== void 0) { + materialParams.anisotropyRotation = extension.anisotropyRotation; + } + if (extension.anisotropyTexture !== void 0) { + pending.push(parser.assignTexture(materialParams, "anisotropyMap", extension.anisotropyTexture)); } + return Promise.all(pending); } - draw_move(self2, event) { - if (event.ctrlKey || event.shiftKey) { - return; +} +class GLTFTextureBasisUExtension { + static { + __name(this, "GLTFTextureBasisUExtension"); + } + constructor(parser) { + this.parser = parser; + this.name = EXTENSIONS.KHR_TEXTURE_BASISU; + } + loadTexture(textureIndex) { + const parser = this.parser; + const json = parser.json; + const textureDef = json.textures[textureIndex]; + if (!textureDef.extensions || !textureDef.extensions[this.name]) { + return null; } - event.preventDefault(); - this.cursorX = event.pageX; - this.cursorY = event.pageY; - self2.updateBrushPreview(self2); - let left_button_down = window.TouchEvent && event instanceof TouchEvent || event.buttons == 1; - let right_button_down = [2, 5, 32].includes(event.buttons); - if (!event.altKey && left_button_down) { - var diff = performance.now() - self2.lasttime; - const maskRect = self2.maskCanvas.getBoundingClientRect(); - var x = event.offsetX; - var y = event.offsetY; - if (event.offsetX == null) { - x = event.targetTouches[0].clientX - maskRect.left; - } - if (event.offsetY == null) { - y = event.targetTouches[0].clientY - maskRect.top; - } - x /= self2.zoom_ratio; - y /= self2.zoom_ratio; - var brush_size = this.brush_size; - if (event instanceof PointerEvent && event.pointerType == "pen") { - brush_size *= event.pressure; - this.last_pressure = event.pressure; - } else if (window.TouchEvent && event instanceof TouchEvent && diff < 20) { - brush_size *= this.last_pressure; - } else { - brush_size = this.brush_size; - } - if (diff > 20 && !this.drawing_mode) - requestAnimationFrame(() => { - self2.init_shape( - self2, - "source-over" - /* SourceOver */ - ); - self2.draw_shape(self2, x, y, brush_size); - self2.lastx = x; - self2.lasty = y; - }); - else - requestAnimationFrame(() => { - self2.init_shape( - self2, - "source-over" - /* SourceOver */ - ); - var dx = x - self2.lastx; - var dy = y - self2.lasty; - var distance = Math.sqrt(dx * dx + dy * dy); - var directionX = dx / distance; - var directionY = dy / distance; - for (var i = 0; i < distance; i += 5) { - var px2 = self2.lastx + directionX * i; - var py2 = self2.lasty + directionY * i; - self2.draw_shape(self2, px2, py2, brush_size); - } - self2.lastx = x; - self2.lasty = y; - }); - self2.lasttime = performance.now(); - } else if (event.altKey && left_button_down || right_button_down) { - const maskRect = self2.maskCanvas.getBoundingClientRect(); - const x2 = (event.offsetX || event.targetTouches[0].clientX - maskRect.left) / self2.zoom_ratio; - const y2 = (event.offsetY || event.targetTouches[0].clientY - maskRect.top) / self2.zoom_ratio; - var brush_size = this.brush_size; - if (event instanceof PointerEvent && event.pointerType == "pen") { - brush_size *= event.pressure; - this.last_pressure = event.pressure; - } else if (window.TouchEvent && event instanceof TouchEvent && diff < 20) { - brush_size *= this.last_pressure; + const extension = textureDef.extensions[this.name]; + const loader = parser.options.ktx2Loader; + if (!loader) { + if (json.extensionsRequired && json.extensionsRequired.indexOf(this.name) >= 0) { + throw new Error("THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures"); } else { - brush_size = this.brush_size; + return null; } - if (diff > 20 && !this.drawing_mode) - requestAnimationFrame(() => { - self2.init_shape( - self2, - "destination-out" - /* DestinationOut */ - ); - self2.draw_shape(self2, x2, y2, brush_size); - self2.lastx = x2; - self2.lasty = y2; - }); - else - requestAnimationFrame(() => { - self2.init_shape( - self2, - "destination-out" - /* DestinationOut */ - ); - var dx = x2 - self2.lastx; - var dy = y2 - self2.lasty; - var distance = Math.sqrt(dx * dx + dy * dy); - var directionX = dx / distance; - var directionY = dy / distance; - for (var i = 0; i < distance; i += 5) { - var px2 = self2.lastx + directionX * i; - var py2 = self2.lasty + directionY * i; - self2.draw_shape(self2, px2, py2, brush_size); - } - self2.lastx = x2; - self2.lasty = y2; - }); - self2.lasttime = performance.now(); } + return parser.loadTextureImage(textureIndex, extension.source, loader); } - handlePointerDown(self2, event) { - if (event.ctrlKey) { - if (event.buttons == 1) { - MaskEditorDialogOld.mousedown_x = event.clientX; - MaskEditorDialogOld.mousedown_y = event.clientY; - this.mousedown_pan_x = this.pan_x; - this.mousedown_pan_y = this.pan_y; - } - return; +} +class GLTFTextureWebPExtension { + static { + __name(this, "GLTFTextureWebPExtension"); + } + constructor(parser) { + this.parser = parser; + this.name = EXTENSIONS.EXT_TEXTURE_WEBP; + this.isSupported = null; + } + loadTexture(textureIndex) { + const name = this.name; + const parser = this.parser; + const json = parser.json; + const textureDef = json.textures[textureIndex]; + if (!textureDef.extensions || !textureDef.extensions[name]) { + return null; } - var brush_size = this.brush_size; - if (event instanceof PointerEvent && event.pointerType == "pen") { - brush_size *= event.pressure; - this.last_pressure = event.pressure; + const extension = textureDef.extensions[name]; + const source = json.images[extension.source]; + let loader = parser.textureLoader; + if (source.uri) { + const handler = parser.options.manager.getHandler(source.uri); + if (handler !== null) loader = handler; } - if ([0, 2, 5].includes(event.button)) { - self2.drawing_mode = true; - event.preventDefault(); - if (event.shiftKey) { - self2.zoom_lasty = event.clientY; - self2.last_zoom_ratio = self2.zoom_ratio; - return; - } - const maskRect = self2.maskCanvas.getBoundingClientRect(); - const x = (event.offsetX || event.targetTouches[0].clientX - maskRect.left) / self2.zoom_ratio; - const y = (event.offsetY || event.targetTouches[0].clientY - maskRect.top) / self2.zoom_ratio; - if (!event.altKey && event.button == 0) { - self2.init_shape( - self2, - "source-over" - /* SourceOver */ - ); - } else { - self2.init_shape( - self2, - "destination-out" - /* DestinationOut */ - ); + return this.detectSupport().then(function(isSupported) { + if (isSupported) return parser.loadTextureImage(textureIndex, extension.source, loader); + if (json.extensionsRequired && json.extensionsRequired.indexOf(name) >= 0) { + throw new Error("THREE.GLTFLoader: WebP required by asset but unsupported."); } - self2.draw_shape(self2, x, y, brush_size); - self2.lastx = x; - self2.lasty = y; - self2.lasttime = performance.now(); + return parser.loadTexture(textureIndex); + }); + } + detectSupport() { + if (!this.isSupported) { + this.isSupported = new Promise(function(resolve) { + const image = new Image(); + image.src = "data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA"; + image.onload = image.onerror = function() { + resolve(image.height === 1); + }; + }); } + return this.isSupported; } - init_shape(self2, compositionOperation) { - self2.maskCtx.beginPath(); - if (compositionOperation == "source-over") { - self2.maskCtx.fillStyle = this.getMaskFillStyle(); - self2.maskCtx.globalCompositeOperation = "source-over"; - } else if (compositionOperation == "destination-out") { - self2.maskCtx.globalCompositeOperation = "destination-out"; +} +class GLTFTextureAVIFExtension { + static { + __name(this, "GLTFTextureAVIFExtension"); + } + constructor(parser) { + this.parser = parser; + this.name = EXTENSIONS.EXT_TEXTURE_AVIF; + this.isSupported = null; + } + loadTexture(textureIndex) { + const name = this.name; + const parser = this.parser; + const json = parser.json; + const textureDef = json.textures[textureIndex]; + if (!textureDef.extensions || !textureDef.extensions[name]) { + return null; } - } - draw_shape(self2, x, y, brush_size) { - if (self2.pointer_type === "rect") { - self2.maskCtx.rect( - x - brush_size, - y - brush_size, - brush_size * 2, - brush_size * 2 - ); - } else { - self2.maskCtx.arc(x, y, brush_size, 0, Math.PI * 2, false); + const extension = textureDef.extensions[name]; + const source = json.images[extension.source]; + let loader = parser.textureLoader; + if (source.uri) { + const handler = parser.options.manager.getHandler(source.uri); + if (handler !== null) loader = handler; } - self2.maskCtx.fill(); - } - async save() { - const backupCanvas = document.createElement("canvas"); - const backupCtx = backupCanvas.getContext("2d", { - willReadFrequently: true + return this.detectSupport().then(function(isSupported) { + if (isSupported) return parser.loadTextureImage(textureIndex, extension.source, loader); + if (json.extensionsRequired && json.extensionsRequired.indexOf(name) >= 0) { + throw new Error("THREE.GLTFLoader: AVIF required by asset but unsupported."); + } + return parser.loadTexture(textureIndex); }); - backupCanvas.width = this.image.width; - backupCanvas.height = this.image.height; - backupCtx.clearRect(0, 0, backupCanvas.width, backupCanvas.height); - backupCtx.drawImage( - this.maskCanvas, - 0, - 0, - this.maskCanvas.width, - this.maskCanvas.height, - 0, - 0, - backupCanvas.width, - backupCanvas.height - ); - const backupData = backupCtx.getImageData( - 0, - 0, - backupCanvas.width, - backupCanvas.height - ); - for (let i = 0; i < backupData.data.length; i += 4) { - if (backupData.data[i + 3] == 255) backupData.data[i + 3] = 0; - else backupData.data[i + 3] = 255; - backupData.data[i] = 0; - backupData.data[i + 1] = 0; - backupData.data[i + 2] = 0; - } - backupCtx.globalCompositeOperation = "source-over"; - backupCtx.putImageData(backupData, 0, 0); - const formData = new FormData(); - const filename = "clipspace-mask-" + performance.now() + ".png"; - const item = { - filename, - subfolder: "clipspace", - type: "input" - }; - if (ComfyApp.clipspace.images) ComfyApp.clipspace.images[0] = item; - if (ComfyApp.clipspace.widgets) { - const index = ComfyApp.clipspace.widgets.findIndex( - (obj) => obj.name === "image" - ); - if (index >= 0) ComfyApp.clipspace.widgets[index].value = item; + } + detectSupport() { + if (!this.isSupported) { + this.isSupported = new Promise(function(resolve) { + const image = new Image(); + image.src = "data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAABcAAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAEAAAABAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQAMAAAAABNjb2xybmNseAACAAIABoAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAAB9tZGF0EgAKCBgABogQEDQgMgkQAAAAB8dSLfI="; + image.onload = image.onerror = function() { + resolve(image.height === 1); + }; + }); } - const dataURL = backupCanvas.toDataURL(); - const blob = dataURLToBlob(dataURL); - let original_url = new URL(this.image.src); - const original_ref = { - filename: original_url.searchParams.get("filename") - }; - let original_subfolder = original_url.searchParams.get("subfolder"); - if (original_subfolder) original_ref.subfolder = original_subfolder; - let original_type = original_url.searchParams.get("type"); - if (original_type) original_ref.type = original_type; - formData.append("image", blob, filename); - formData.append("original_ref", JSON.stringify(original_ref)); - formData.append("type", "input"); - formData.append("subfolder", "clipspace"); - this.saveButton.innerText = "Saving..."; - this.saveButton.disabled = true; - await uploadMask(item, formData); - ComfyApp.onClipspaceEditorSave(); - this.close(); + return this.isSupported; } } -window.comfyAPI = window.comfyAPI || {}; -window.comfyAPI.maskEditorOld = window.comfyAPI.maskEditorOld || {}; -window.comfyAPI.maskEditorOld.MaskEditorDialogOld = MaskEditorDialogOld; -var styles = ` - #maskEditorContainer { - display: fixed; +class GLTFMeshoptCompression { + static { + __name(this, "GLTFMeshoptCompression"); } - #maskEditor_brush { - position: absolute; - backgroundColor: transparent; - z-index: 8889; - pointer-events: none; - border-radius: 50%; - overflow: visible; - outline: 1px dashed black; - box-shadow: 0 0 0 1px white; + constructor(parser) { + this.name = EXTENSIONS.EXT_MESHOPT_COMPRESSION; + this.parser = parser; } - #maskEditor_brushPreviewGradient { - position: absolute; - width: 100%; - height: 100%; - border-radius: 50%; - display: none; + loadBufferView(index) { + const json = this.parser.json; + const bufferView = json.bufferViews[index]; + if (bufferView.extensions && bufferView.extensions[this.name]) { + const extensionDef = bufferView.extensions[this.name]; + const buffer = this.parser.getDependency("buffer", extensionDef.buffer); + const decoder = this.parser.options.meshoptDecoder; + if (!decoder || !decoder.supported) { + if (json.extensionsRequired && json.extensionsRequired.indexOf(this.name) >= 0) { + throw new Error("THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files"); + } else { + return null; + } + } + return buffer.then(function(res) { + const byteOffset = extensionDef.byteOffset || 0; + const byteLength = extensionDef.byteLength || 0; + const count = extensionDef.count; + const stride = extensionDef.byteStride; + const source = new Uint8Array(res, byteOffset, byteLength); + if (decoder.decodeGltfBufferAsync) { + return decoder.decodeGltfBufferAsync(count, stride, source, extensionDef.mode, extensionDef.filter).then(function(res2) { + return res2.buffer; + }); + } else { + return decoder.ready.then(function() { + const result = new ArrayBuffer(count * stride); + decoder.decodeGltfBuffer(new Uint8Array(result), count, stride, source, extensionDef.mode, extensionDef.filter); + return result; + }); + } + }); + } else { + return null; + } } - #maskEditor { - display: block; - width: 100%; - height: 100vh; - left: 0; - z-index: 8888; - position: fixed; - background: rgba(50,50,50,0.75); - backdrop-filter: blur(10px); - overflow: hidden; - user-select: none; +} +class GLTFMeshGpuInstancing { + static { + __name(this, "GLTFMeshGpuInstancing"); } - #maskEditor_sidePanelContainer { - height: 100%; - width: 220px; - z-index: 8888; - display: flex; - flex-direction: column; + constructor(parser) { + this.name = EXTENSIONS.EXT_MESH_GPU_INSTANCING; + this.parser = parser; } - #maskEditor_sidePanel { - background: var(--comfy-menu-bg); - height: 100%; - display: flex; - align-items: center; - overflow-y: hidden; - width: 220px; + createNodeMesh(nodeIndex) { + const json = this.parser.json; + const nodeDef = json.nodes[nodeIndex]; + if (!nodeDef.extensions || !nodeDef.extensions[this.name] || nodeDef.mesh === void 0) { + return null; + } + const meshDef = json.meshes[nodeDef.mesh]; + for (const primitive of meshDef.primitives) { + if (primitive.mode !== WEBGL_CONSTANTS.TRIANGLES && primitive.mode !== WEBGL_CONSTANTS.TRIANGLE_STRIP && primitive.mode !== WEBGL_CONSTANTS.TRIANGLE_FAN && primitive.mode !== void 0) { + return null; + } + } + const extensionDef = nodeDef.extensions[this.name]; + const attributesDef = extensionDef.attributes; + const pending = []; + const attributes = {}; + for (const key in attributesDef) { + pending.push(this.parser.getDependency("accessor", attributesDef[key]).then((accessor) => { + attributes[key] = accessor; + return attributes[key]; + })); + } + if (pending.length < 1) { + return null; + } + pending.push(this.parser.createNodeMesh(nodeIndex)); + return Promise.all(pending).then((results) => { + const nodeObject = results.pop(); + const meshes = nodeObject.isGroup ? nodeObject.children : [nodeObject]; + const count = results[0].count; + const instancedMeshes = []; + for (const mesh of meshes) { + const m = new Matrix4(); + const p = new Vector3(); + const q = new Quaternion(); + const s = new Vector3(1, 1, 1); + const instancedMesh = new InstancedMesh(mesh.geometry, mesh.material, count); + for (let i = 0; i < count; i++) { + if (attributes.TRANSLATION) { + p.fromBufferAttribute(attributes.TRANSLATION, i); + } + if (attributes.ROTATION) { + q.fromBufferAttribute(attributes.ROTATION, i); + } + if (attributes.SCALE) { + s.fromBufferAttribute(attributes.SCALE, i); + } + instancedMesh.setMatrixAt(i, m.compose(p, q, s)); + } + for (const attributeName in attributes) { + if (attributeName === "_COLOR_0") { + const attr = attributes[attributeName]; + instancedMesh.instanceColor = new InstancedBufferAttribute(attr.array, attr.itemSize, attr.normalized); + } else if (attributeName !== "TRANSLATION" && attributeName !== "ROTATION" && attributeName !== "SCALE") { + mesh.geometry.setAttribute(attributeName, attributes[attributeName]); + } + } + Object3D.prototype.copy.call(instancedMesh, mesh); + this.parser.assignFinalMaterial(instancedMesh); + instancedMeshes.push(instancedMesh); + } + if (nodeObject.isGroup) { + nodeObject.clear(); + nodeObject.add(...instancedMeshes); + return nodeObject; + } + return instancedMeshes[0]; + }); } - #maskEditor_sidePanelShortcuts { - display: flex; - flex-direction: row; - width: 200px; - margin-top: 10px; - gap: 10px; - justify-content: center; +} +const BINARY_EXTENSION_HEADER_MAGIC = "glTF"; +const BINARY_EXTENSION_HEADER_LENGTH = 12; +const BINARY_EXTENSION_CHUNK_TYPES = { JSON: 1313821514, BIN: 5130562 }; +class GLTFBinaryExtension { + static { + __name(this, "GLTFBinaryExtension"); } - .maskEditor_sidePanelIconButton { - width: 40px; - height: 40px; - pointer-events: auto; - display: flex; - justify-content: center; - align-items: center; - transition: background-color 0.1s; + constructor(data) { + this.name = EXTENSIONS.KHR_BINARY_GLTF; + this.content = null; + this.body = null; + const headerView = new DataView(data, 0, BINARY_EXTENSION_HEADER_LENGTH); + const textDecoder = new TextDecoder(); + this.header = { + magic: textDecoder.decode(new Uint8Array(data.slice(0, 4))), + version: headerView.getUint32(4, true), + length: headerView.getUint32(8, true) + }; + if (this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC) { + throw new Error("THREE.GLTFLoader: Unsupported glTF-Binary header."); + } else if (this.header.version < 2) { + throw new Error("THREE.GLTFLoader: Legacy binary file detected."); + } + const chunkContentsLength = this.header.length - BINARY_EXTENSION_HEADER_LENGTH; + const chunkView = new DataView(data, BINARY_EXTENSION_HEADER_LENGTH); + let chunkIndex = 0; + while (chunkIndex < chunkContentsLength) { + const chunkLength = chunkView.getUint32(chunkIndex, true); + chunkIndex += 4; + const chunkType = chunkView.getUint32(chunkIndex, true); + chunkIndex += 4; + if (chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON) { + const contentArray = new Uint8Array(data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength); + this.content = textDecoder.decode(contentArray); + } else if (chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN) { + const byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex; + this.body = data.slice(byteOffset, byteOffset + chunkLength); + } + chunkIndex += chunkLength; + } + if (this.content === null) { + throw new Error("THREE.GLTFLoader: JSON content not found."); + } } - .maskEditor_sidePanelIconButton:hover { - background-color: rgba(0, 0, 0, 0.2); +} +class GLTFDracoMeshCompressionExtension { + static { + __name(this, "GLTFDracoMeshCompressionExtension"); } - #maskEditor_sidePanelBrushSettings { - display: flex; - flex-direction: column; - gap: 10px; - width: 200px; - padding: 10px; + constructor(json, dracoLoader) { + if (!dracoLoader) { + throw new Error("THREE.GLTFLoader: No DRACOLoader instance provided."); + } + this.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION; + this.json = json; + this.dracoLoader = dracoLoader; + this.dracoLoader.preload(); } - .maskEditor_sidePanelTitle { - text-align: center; - font-size: 15px; - font-family: sans-serif; - color: var(--descrip-text); - margin-top: 10px; + decodePrimitive(primitive, parser) { + const json = this.json; + const dracoLoader = this.dracoLoader; + const bufferViewIndex = primitive.extensions[this.name].bufferView; + const gltfAttributeMap = primitive.extensions[this.name].attributes; + const threeAttributeMap = {}; + const attributeNormalizedMap = {}; + const attributeTypeMap = {}; + for (const attributeName in gltfAttributeMap) { + const threeAttributeName = ATTRIBUTES[attributeName] || attributeName.toLowerCase(); + threeAttributeMap[threeAttributeName] = gltfAttributeMap[attributeName]; + } + for (const attributeName in primitive.attributes) { + const threeAttributeName = ATTRIBUTES[attributeName] || attributeName.toLowerCase(); + if (gltfAttributeMap[attributeName] !== void 0) { + const accessorDef = json.accessors[primitive.attributes[attributeName]]; + const componentType = WEBGL_COMPONENT_TYPES[accessorDef.componentType]; + attributeTypeMap[threeAttributeName] = componentType.name; + attributeNormalizedMap[threeAttributeName] = accessorDef.normalized === true; + } + } + return parser.getDependency("bufferView", bufferViewIndex).then(function(bufferView) { + return new Promise(function(resolve, reject) { + dracoLoader.decodeDracoFile(bufferView, function(geometry) { + for (const attributeName in geometry.attributes) { + const attribute = geometry.attributes[attributeName]; + const normalized = attributeNormalizedMap[attributeName]; + if (normalized !== void 0) attribute.normalized = normalized; + } + resolve(geometry); + }, threeAttributeMap, attributeTypeMap, LinearSRGBColorSpace, reject); + }); + }); } - #maskEditor_sidePanelBrushShapeContainer { - display: flex; - width: 180px; - height: 50px; - border: 1px solid var(--border-color); - pointer-events: auto; - background: rgba(0, 0, 0, 0.2); +} +class GLTFTextureTransformExtension { + static { + __name(this, "GLTFTextureTransformExtension"); } - #maskEditor_sidePanelBrushShapeCircle { - width: 35px; - height: 35px; - border-radius: 50%; - border: 1px solid var(--border-color); - pointer-events: auto; - transition: background 0.1s; - margin-left: 7.5px; + constructor() { + this.name = EXTENSIONS.KHR_TEXTURE_TRANSFORM; } - .maskEditor_sidePanelBrushRange { - width: 180px; - -webkit-appearance: none; - appearance: none; - background: transparent; - cursor: pointer; + extendTexture(texture, transform) { + if ((transform.texCoord === void 0 || transform.texCoord === texture.channel) && transform.offset === void 0 && transform.rotation === void 0 && transform.scale === void 0) { + return texture; + } + texture = texture.clone(); + if (transform.texCoord !== void 0) { + texture.channel = transform.texCoord; + } + if (transform.offset !== void 0) { + texture.offset.fromArray(transform.offset); + } + if (transform.rotation !== void 0) { + texture.rotation = transform.rotation; + } + if (transform.scale !== void 0) { + texture.repeat.fromArray(transform.scale); + } + texture.needsUpdate = true; + return texture; } - .maskEditor_sidePanelBrushRange::-webkit-slider-thumb { - height: 20px; - width: 20px; - border-radius: 50%; - cursor: grab; - margin-top: -8px; - background: var(--p-surface-700); - border: 1px solid var(--border-color); +} +class GLTFMeshQuantizationExtension { + static { + __name(this, "GLTFMeshQuantizationExtension"); } - .maskEditor_sidePanelBrushRange::-moz-range-thumb { - height: 20px; - width: 20px; - border-radius: 50%; - cursor: grab; - background: var(--p-surface-800); - border: 1px solid var(--border-color); + constructor() { + this.name = EXTENSIONS.KHR_MESH_QUANTIZATION; } - .maskEditor_sidePanelBrushRange::-webkit-slider-runnable-track { - background: var(--p-surface-700); - height: 3px; +} +class GLTFCubicSplineInterpolant extends Interpolant { + static { + __name(this, "GLTFCubicSplineInterpolant"); } - .maskEditor_sidePanelBrushRange::-moz-range-track { - background: var(--p-surface-700); - height: 3px; + constructor(parameterPositions, sampleValues, sampleSize, resultBuffer) { + super(parameterPositions, sampleValues, sampleSize, resultBuffer); } - - #maskEditor_sidePanelBrushShapeSquare { - width: 35px; - height: 35px; - margin: 5px; - border: 1px solid var(--border-color); - pointer-events: auto; - transition: background 0.1s; + copySampleValue_(index) { + const result = this.resultBuffer, values = this.sampleValues, valueSize = this.valueSize, offset = index * valueSize * 3 + valueSize; + for (let i = 0; i !== valueSize; i++) { + result[i] = values[offset + i]; + } + return result; } - - .maskEditor_brushShape_dark { - background: transparent; + interpolate_(i1, t0, t2, t1) { + const result = this.resultBuffer; + const values = this.sampleValues; + const stride = this.valueSize; + const stride2 = stride * 2; + const stride3 = stride * 3; + const td2 = t1 - t0; + const p = (t2 - t0) / td2; + const pp = p * p; + const ppp = pp * p; + const offset1 = i1 * stride3; + const offset0 = offset1 - stride3; + const s2 = -2 * ppp + 3 * pp; + const s3 = ppp - pp; + const s0 = 1 - s2; + const s1 = s3 - pp + p; + for (let i = 0; i !== stride; i++) { + const p0 = values[offset0 + i + stride]; + const m0 = values[offset0 + i + stride2] * td2; + const p1 = values[offset1 + i + stride]; + const m1 = values[offset1 + i] * td2; + result[i] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1; + } + return result; } - - .maskEditor_brushShape_dark:hover { - background: var(--p-surface-900); +} +const _q = new Quaternion(); +class GLTFCubicSplineQuaternionInterpolant extends GLTFCubicSplineInterpolant { + static { + __name(this, "GLTFCubicSplineQuaternionInterpolant"); } - - .maskEditor_brushShape_light { - background: transparent; + interpolate_(i1, t0, t2, t1) { + const result = super.interpolate_(i1, t0, t2, t1); + _q.fromArray(result).normalize().toArray(result); + return result; } - - .maskEditor_brushShape_light:hover { - background: var(--comfy-menu-bg); +} +const WEBGL_CONSTANTS = { + FLOAT: 5126, + //FLOAT_MAT2: 35674, + FLOAT_MAT3: 35675, + FLOAT_MAT4: 35676, + FLOAT_VEC2: 35664, + FLOAT_VEC3: 35665, + FLOAT_VEC4: 35666, + LINEAR: 9729, + REPEAT: 10497, + SAMPLER_2D: 35678, + POINTS: 0, + LINES: 1, + LINE_LOOP: 2, + LINE_STRIP: 3, + TRIANGLES: 4, + TRIANGLE_STRIP: 5, + TRIANGLE_FAN: 6, + UNSIGNED_BYTE: 5121, + UNSIGNED_SHORT: 5123 +}; +const WEBGL_COMPONENT_TYPES = { + 5120: Int8Array, + 5121: Uint8Array, + 5122: Int16Array, + 5123: Uint16Array, + 5125: Uint32Array, + 5126: Float32Array +}; +const WEBGL_FILTERS = { + 9728: NearestFilter, + 9729: LinearFilter, + 9984: NearestMipmapNearestFilter, + 9985: LinearMipmapNearestFilter, + 9986: NearestMipmapLinearFilter, + 9987: LinearMipmapLinearFilter +}; +const WEBGL_WRAPPINGS = { + 33071: ClampToEdgeWrapping, + 33648: MirroredRepeatWrapping, + 10497: RepeatWrapping +}; +const WEBGL_TYPE_SIZES = { + "SCALAR": 1, + "VEC2": 2, + "VEC3": 3, + "VEC4": 4, + "MAT2": 4, + "MAT3": 9, + "MAT4": 16 +}; +const ATTRIBUTES = { + POSITION: "position", + NORMAL: "normal", + TANGENT: "tangent", + TEXCOORD_0: "uv", + TEXCOORD_1: "uv1", + TEXCOORD_2: "uv2", + TEXCOORD_3: "uv3", + COLOR_0: "color", + WEIGHTS_0: "skinWeight", + JOINTS_0: "skinIndex" +}; +const PATH_PROPERTIES = { + scale: "scale", + translation: "position", + rotation: "quaternion", + weights: "morphTargetInfluences" +}; +const INTERPOLATION = { + CUBICSPLINE: void 0, + // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each + // keyframe track will be initialized with a default interpolation type, then modified. + LINEAR: InterpolateLinear, + STEP: InterpolateDiscrete +}; +const ALPHA_MODES = { + OPAQUE: "OPAQUE", + MASK: "MASK", + BLEND: "BLEND" +}; +function createDefaultMaterial(cache) { + if (cache["DefaultMaterial"] === void 0) { + cache["DefaultMaterial"] = new MeshStandardMaterial({ + color: 16777215, + emissive: 0, + metalness: 1, + roughness: 1, + transparent: false, + depthTest: true, + side: FrontSide + }); } - - #maskEditor_sidePanelImageLayerSettings { - display: flex; - flex-direction: column; - gap: 10px; - width: 200px; - align-items: center; + return cache["DefaultMaterial"]; +} +__name(createDefaultMaterial, "createDefaultMaterial"); +function addUnknownExtensionsToUserData(knownExtensions, object, objectDef) { + for (const name in objectDef.extensions) { + if (knownExtensions[name] === void 0) { + object.userData.gltfExtensions = object.userData.gltfExtensions || {}; + object.userData.gltfExtensions[name] = objectDef.extensions[name]; + } } - .maskEditor_sidePanelLayer { - display: flex; - width: 200px; - height: 50px; +} +__name(addUnknownExtensionsToUserData, "addUnknownExtensionsToUserData"); +function assignExtrasToUserData(object, gltfDef) { + if (gltfDef.extras !== void 0) { + if (typeof gltfDef.extras === "object") { + Object.assign(object.userData, gltfDef.extras); + } else { + console.warn("THREE.GLTFLoader: Ignoring primitive type .extras, " + gltfDef.extras); + } } - .maskEditor_sidePanelLayerVisibilityContainer { - width: 50px; - height: 50px; - border-radius: 8px; - display: flex; - justify-content: center; - align-items: center; +} +__name(assignExtrasToUserData, "assignExtrasToUserData"); +function addMorphTargets(geometry, targets, parser) { + let hasMorphPosition = false; + let hasMorphNormal = false; + let hasMorphColor = false; + for (let i = 0, il = targets.length; i < il; i++) { + const target = targets[i]; + if (target.POSITION !== void 0) hasMorphPosition = true; + if (target.NORMAL !== void 0) hasMorphNormal = true; + if (target.COLOR_0 !== void 0) hasMorphColor = true; + if (hasMorphPosition && hasMorphNormal && hasMorphColor) break; } - .maskEditor_sidePanelVisibilityToggle { - width: 12px; - height: 12px; - border-radius: 50%; - pointer-events: auto; + if (!hasMorphPosition && !hasMorphNormal && !hasMorphColor) return Promise.resolve(geometry); + const pendingPositionAccessors = []; + const pendingNormalAccessors = []; + const pendingColorAccessors = []; + for (let i = 0, il = targets.length; i < il; i++) { + const target = targets[i]; + if (hasMorphPosition) { + const pendingAccessor = target.POSITION !== void 0 ? parser.getDependency("accessor", target.POSITION) : geometry.attributes.position; + pendingPositionAccessors.push(pendingAccessor); + } + if (hasMorphNormal) { + const pendingAccessor = target.NORMAL !== void 0 ? parser.getDependency("accessor", target.NORMAL) : geometry.attributes.normal; + pendingNormalAccessors.push(pendingAccessor); + } + if (hasMorphColor) { + const pendingAccessor = target.COLOR_0 !== void 0 ? parser.getDependency("accessor", target.COLOR_0) : geometry.attributes.color; + pendingColorAccessors.push(pendingAccessor); + } } - .maskEditor_sidePanelLayerIconContainer { - width: 60px; - height: 50px; - border-radius: 8px; - display: flex; - justify-content: center; - align-items: center; - fill: var(--input-text); + return Promise.all([ + Promise.all(pendingPositionAccessors), + Promise.all(pendingNormalAccessors), + Promise.all(pendingColorAccessors) + ]).then(function(accessors) { + const morphPositions = accessors[0]; + const morphNormals = accessors[1]; + const morphColors = accessors[2]; + if (hasMorphPosition) geometry.morphAttributes.position = morphPositions; + if (hasMorphNormal) geometry.morphAttributes.normal = morphNormals; + if (hasMorphColor) geometry.morphAttributes.color = morphColors; + geometry.morphTargetsRelative = true; + return geometry; + }); +} +__name(addMorphTargets, "addMorphTargets"); +function updateMorphTargets(mesh, meshDef) { + mesh.updateMorphTargets(); + if (meshDef.weights !== void 0) { + for (let i = 0, il = meshDef.weights.length; i < il; i++) { + mesh.morphTargetInfluences[i] = meshDef.weights[i]; + } } - .maskEditor_sidePanelLayerIconContainer svg { - width: 30px; - height: 30px; + if (meshDef.extras && Array.isArray(meshDef.extras.targetNames)) { + const targetNames = meshDef.extras.targetNames; + if (mesh.morphTargetInfluences.length === targetNames.length) { + mesh.morphTargetDictionary = {}; + for (let i = 0, il = targetNames.length; i < il; i++) { + mesh.morphTargetDictionary[targetNames[i]] = i; + } + } else { + console.warn("THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names."); + } } - #maskEditor_sidePanelMaskLayerBlendingContainer { - width: 80px; - height: 50px; - border-radius: 8px; - display: flex; - justify-content: center; - align-items: center; +} +__name(updateMorphTargets, "updateMorphTargets"); +function createPrimitiveKey(primitiveDef) { + let geometryKey; + const dracoExtension = primitiveDef.extensions && primitiveDef.extensions[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION]; + if (dracoExtension) { + geometryKey = "draco:" + dracoExtension.bufferView + ":" + dracoExtension.indices + ":" + createAttributesKey(dracoExtension.attributes); + } else { + geometryKey = primitiveDef.indices + ":" + createAttributesKey(primitiveDef.attributes) + ":" + primitiveDef.mode; } - #maskEditor_sidePanelMaskLayerBlendingSelect { - width: 80px; - height: 30px; - border: 1px solid var(--border-color); - background-color: rgba(0, 0, 0, 0.2); - color: var(--input-text); - font-family: sans-serif; - font-size: 15px; - pointer-events: auto; - transition: background-color border 0.1s; + if (primitiveDef.targets !== void 0) { + for (let i = 0, il = primitiveDef.targets.length; i < il; i++) { + geometryKey += ":" + createAttributesKey(primitiveDef.targets[i]); + } } - #maskEditor_sidePanelClearCanvasButton:hover { - background-color: var(--p-overlaybadge-outline-color); - border: none; + return geometryKey; +} +__name(createPrimitiveKey, "createPrimitiveKey"); +function createAttributesKey(attributes) { + let attributesKey = ""; + const keys = Object.keys(attributes).sort(); + for (let i = 0, il = keys.length; i < il; i++) { + attributesKey += keys[i] + ":" + attributes[keys[i]] + ";"; } - #maskEditor_sidePanelClearCanvasButton { - width: 180px; - height: 30px; - border: none; - background: rgba(0, 0, 0, 0.2); - border: 1px solid var(--border-color); - color: var(--input-text); - font-family: sans-serif; - font-size: 15px; - pointer-events: auto; - transition: background-color 0.1s; + return attributesKey; +} +__name(createAttributesKey, "createAttributesKey"); +function getNormalizedComponentScale(constructor) { + switch (constructor) { + case Int8Array: + return 1 / 127; + case Uint8Array: + return 1 / 255; + case Int16Array: + return 1 / 32767; + case Uint16Array: + return 1 / 65535; + default: + throw new Error("THREE.GLTFLoader: Unsupported normalized accessor component type."); } - #maskEditor_sidePanelClearCanvasButton:hover { - background-color: var(--p-overlaybadge-outline-color); +} +__name(getNormalizedComponentScale, "getNormalizedComponentScale"); +function getImageURIMimeType(uri) { + if (uri.search(/\.jpe?g($|\?)/i) > 0 || uri.search(/^data\:image\/jpeg/) === 0) return "image/jpeg"; + if (uri.search(/\.webp($|\?)/i) > 0 || uri.search(/^data\:image\/webp/) === 0) return "image/webp"; + if (uri.search(/\.ktx2($|\?)/i) > 0 || uri.search(/^data\:image\/ktx2/) === 0) return "image/ktx2"; + return "image/png"; +} +__name(getImageURIMimeType, "getImageURIMimeType"); +const _identityMatrix = new Matrix4(); +class GLTFParser { + static { + __name(this, "GLTFParser"); } - #maskEditor_sidePanelHorizontalButtonContainer { - display: flex; - gap: 10px; - height: 40px; + constructor(json = {}, options = {}) { + this.json = json; + this.extensions = {}; + this.plugins = {}; + this.options = options; + this.cache = new GLTFRegistry(); + this.associations = /* @__PURE__ */ new Map(); + this.primitiveCache = {}; + this.nodeCache = {}; + this.meshCache = { refs: {}, uses: {} }; + this.cameraCache = { refs: {}, uses: {} }; + this.lightCache = { refs: {}, uses: {} }; + this.sourceCache = {}; + this.textureCache = {}; + this.nodeNamesUsed = {}; + let isSafari = false; + let safariVersion = -1; + let isFirefox = false; + let firefoxVersion = -1; + if (typeof navigator !== "undefined") { + const userAgent = navigator.userAgent; + isSafari = /^((?!chrome|android).)*safari/i.test(userAgent) === true; + const safariMatch = userAgent.match(/Version\/(\d+)/); + safariVersion = isSafari && safariMatch ? parseInt(safariMatch[1], 10) : -1; + isFirefox = userAgent.indexOf("Firefox") > -1; + firefoxVersion = isFirefox ? userAgent.match(/Firefox\/([0-9]+)\./)[1] : -1; + } + if (typeof createImageBitmap === "undefined" || isSafari && safariVersion < 17 || isFirefox && firefoxVersion < 98) { + this.textureLoader = new TextureLoader(this.options.manager); + } else { + this.textureLoader = new ImageBitmapLoader(this.options.manager); + } + this.textureLoader.setCrossOrigin(this.options.crossOrigin); + this.textureLoader.setRequestHeader(this.options.requestHeader); + this.fileLoader = new FileLoader(this.options.manager); + this.fileLoader.setResponseType("arraybuffer"); + if (this.options.crossOrigin === "use-credentials") { + this.fileLoader.setWithCredentials(true); + } } - .maskEditor_sidePanelBigButton { - width: 85px; - height: 30px; - border: none; - background: rgba(0, 0, 0, 0.2); - border: 1px solid var(--border-color); - color: var(--input-text); - font-family: sans-serif; - font-size: 15px; - pointer-events: auto; - transition: background-color border 0.1s; + setExtensions(extensions) { + this.extensions = extensions; } - .maskEditor_sidePanelBigButton:hover { - background-color: var(--p-overlaybadge-outline-color); - border: none; + setPlugins(plugins) { + this.plugins = plugins; } - #maskEditor_toolPanel { - height: 100%; - width: var(--sidebar-width); - z-index: 8888; - background: var(--comfy-menu-bg); - display: flex; - flex-direction: column; + parse(onLoad, onError) { + const parser = this; + const json = this.json; + const extensions = this.extensions; + this.cache.removeAll(); + this.nodeCache = {}; + this._invokeAll(function(ext2) { + return ext2._markDefs && ext2._markDefs(); + }); + Promise.all(this._invokeAll(function(ext2) { + return ext2.beforeRoot && ext2.beforeRoot(); + })).then(function() { + return Promise.all([ + parser.getDependencies("scene"), + parser.getDependencies("animation"), + parser.getDependencies("camera") + ]); + }).then(function(dependencies) { + const result = { + scene: dependencies[0][json.scene || 0], + scenes: dependencies[0], + animations: dependencies[1], + cameras: dependencies[2], + asset: json.asset, + parser, + userData: {} + }; + addUnknownExtensionsToUserData(extensions, result, json); + assignExtrasToUserData(result, json); + return Promise.all(parser._invokeAll(function(ext2) { + return ext2.afterRoot && ext2.afterRoot(result); + })).then(function() { + for (const scene of result.scenes) { + scene.updateMatrixWorld(); + } + onLoad(result); + }); + }).catch(onError); } - .maskEditor_toolPanelContainer { - width: var(--sidebar-width); - height: var(--sidebar-width); - display: flex; - justify-content: center; - align-items: center; - position: relative; - transition: background-color 0.2s; + /** + * Marks the special nodes/meshes in json for efficient parse. + */ + _markDefs() { + const nodeDefs = this.json.nodes || []; + const skinDefs = this.json.skins || []; + const meshDefs = this.json.meshes || []; + for (let skinIndex = 0, skinLength = skinDefs.length; skinIndex < skinLength; skinIndex++) { + const joints = skinDefs[skinIndex].joints; + for (let i = 0, il = joints.length; i < il; i++) { + nodeDefs[joints[i]].isBone = true; + } + } + for (let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex++) { + const nodeDef = nodeDefs[nodeIndex]; + if (nodeDef.mesh !== void 0) { + this._addNodeRef(this.meshCache, nodeDef.mesh); + if (nodeDef.skin !== void 0) { + meshDefs[nodeDef.mesh].isSkinnedMesh = true; + } + } + if (nodeDef.camera !== void 0) { + this._addNodeRef(this.cameraCache, nodeDef.camera); + } + } } - .maskEditor_toolPanelContainerSelected svg { - fill: var(--p-button-text-primary-color) !important; + /** + * Counts references to shared node / Object3D resources. These resources + * can be reused, or "instantiated", at multiple nodes in the scene + * hierarchy. Mesh, Camera, and Light instances are instantiated and must + * be marked. Non-scenegraph resources (like Materials, Geometries, and + * Textures) can be reused directly and are not marked here. + * + * Example: CesiumMilkTruck sample model reuses "Wheel" meshes. + */ + _addNodeRef(cache, index) { + if (index === void 0) return; + if (cache.refs[index] === void 0) { + cache.refs[index] = cache.uses[index] = 0; + } + cache.refs[index]++; } - .maskEditor_toolPanelContainerSelected .maskEditor_toolPanelIndicator { - display: block; + /** Returns a reference to a shared resource, cloning it if necessary. */ + _getNodeRef(cache, index, object) { + if (cache.refs[index] <= 1) return object; + const ref = object.clone(); + const updateMappings = /* @__PURE__ */ __name((original, clone) => { + const mappings = this.associations.get(original); + if (mappings != null) { + this.associations.set(clone, mappings); + } + for (const [i, child] of original.children.entries()) { + updateMappings(child, clone.children[i]); + } + }, "updateMappings"); + updateMappings(object, ref); + ref.name += "_instance_" + cache.uses[index]++; + return ref; } - .maskEditor_toolPanelContainer svg { - width: 75%; - aspect-ratio: 1/1; - fill: var(--p-button-text-secondary-color); + _invokeOne(func) { + const extensions = Object.values(this.plugins); + extensions.push(this); + for (let i = 0; i < extensions.length; i++) { + const result = func(extensions[i]); + if (result) return result; + } + return null; } - - .maskEditor_toolPanelContainerDark:hover { - background-color: var(--p-surface-800); + _invokeAll(func) { + const extensions = Object.values(this.plugins); + extensions.unshift(this); + const pending = []; + for (let i = 0; i < extensions.length; i++) { + const result = func(extensions[i]); + if (result) pending.push(result); + } + return pending; } - - .maskEditor_toolPanelContainerLight:hover { - background-color: var(--p-surface-300); + /** + * Requests the specified dependency asynchronously, with caching. + * @param {string} type + * @param {number} index + * @return {Promise} + */ + getDependency(type, index) { + const cacheKey = type + ":" + index; + let dependency = this.cache.get(cacheKey); + if (!dependency) { + switch (type) { + case "scene": + dependency = this.loadScene(index); + break; + case "node": + dependency = this._invokeOne(function(ext2) { + return ext2.loadNode && ext2.loadNode(index); + }); + break; + case "mesh": + dependency = this._invokeOne(function(ext2) { + return ext2.loadMesh && ext2.loadMesh(index); + }); + break; + case "accessor": + dependency = this.loadAccessor(index); + break; + case "bufferView": + dependency = this._invokeOne(function(ext2) { + return ext2.loadBufferView && ext2.loadBufferView(index); + }); + break; + case "buffer": + dependency = this.loadBuffer(index); + break; + case "material": + dependency = this._invokeOne(function(ext2) { + return ext2.loadMaterial && ext2.loadMaterial(index); + }); + break; + case "texture": + dependency = this._invokeOne(function(ext2) { + return ext2.loadTexture && ext2.loadTexture(index); + }); + break; + case "skin": + dependency = this.loadSkin(index); + break; + case "animation": + dependency = this._invokeOne(function(ext2) { + return ext2.loadAnimation && ext2.loadAnimation(index); + }); + break; + case "camera": + dependency = this.loadCamera(index); + break; + default: + dependency = this._invokeOne(function(ext2) { + return ext2 != this && ext2.getDependency && ext2.getDependency(type, index); + }); + if (!dependency) { + throw new Error("Unknown type: " + type); + } + break; + } + this.cache.add(cacheKey, dependency); + } + return dependency; } - - .maskEditor_toolPanelIndicator { - display: none; - height: 100%; - width: 4px; - position: absolute; - left: 0; - background: var(--p-button-text-primary-color); + /** + * Requests all dependencies of the specified type asynchronously, with caching. + * @param {string} type + * @return {Promise>} + */ + getDependencies(type) { + let dependencies = this.cache.get(type); + if (!dependencies) { + const parser = this; + const defs = this.json[type + (type === "mesh" ? "es" : "s")] || []; + dependencies = Promise.all(defs.map(function(def, index) { + return parser.getDependency(type, index); + })); + this.cache.add(type, dependencies); + } + return dependencies; } - #maskEditor_sidePanelPaintBucketSettings { - display: flex; - flex-direction: column; - gap: 10px; - width: 200px; - padding: 10px; + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views + * @param {number} bufferIndex + * @return {Promise} + */ + loadBuffer(bufferIndex) { + const bufferDef = this.json.buffers[bufferIndex]; + const loader = this.fileLoader; + if (bufferDef.type && bufferDef.type !== "arraybuffer") { + throw new Error("THREE.GLTFLoader: " + bufferDef.type + " buffer type is not supported."); + } + if (bufferDef.uri === void 0 && bufferIndex === 0) { + return Promise.resolve(this.extensions[EXTENSIONS.KHR_BINARY_GLTF].body); + } + const options = this.options; + return new Promise(function(resolve, reject) { + loader.load(LoaderUtils.resolveURL(bufferDef.uri, options.path), resolve, void 0, function() { + reject(new Error('THREE.GLTFLoader: Failed to load buffer "' + bufferDef.uri + '".')); + }); + }); } - #canvasBackground { - background: white; - width: 100%; - height: 100%; + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views + * @param {number} bufferViewIndex + * @return {Promise} + */ + loadBufferView(bufferViewIndex) { + const bufferViewDef = this.json.bufferViews[bufferViewIndex]; + return this.getDependency("buffer", bufferViewDef.buffer).then(function(buffer) { + const byteLength = bufferViewDef.byteLength || 0; + const byteOffset = bufferViewDef.byteOffset || 0; + return buffer.slice(byteOffset, byteOffset + byteLength); + }); } - #maskEditor_sidePanelButtonsContainer { - display: flex; - flex-direction: column; - gap: 10px; - margin-top: 10px; + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors + * @param {number} accessorIndex + * @return {Promise} + */ + loadAccessor(accessorIndex) { + const parser = this; + const json = this.json; + const accessorDef = this.json.accessors[accessorIndex]; + if (accessorDef.bufferView === void 0 && accessorDef.sparse === void 0) { + const itemSize = WEBGL_TYPE_SIZES[accessorDef.type]; + const TypedArray = WEBGL_COMPONENT_TYPES[accessorDef.componentType]; + const normalized = accessorDef.normalized === true; + const array = new TypedArray(accessorDef.count * itemSize); + return Promise.resolve(new BufferAttribute(array, itemSize, normalized)); + } + const pendingBufferViews = []; + if (accessorDef.bufferView !== void 0) { + pendingBufferViews.push(this.getDependency("bufferView", accessorDef.bufferView)); + } else { + pendingBufferViews.push(null); + } + if (accessorDef.sparse !== void 0) { + pendingBufferViews.push(this.getDependency("bufferView", accessorDef.sparse.indices.bufferView)); + pendingBufferViews.push(this.getDependency("bufferView", accessorDef.sparse.values.bufferView)); + } + return Promise.all(pendingBufferViews).then(function(bufferViews) { + const bufferView = bufferViews[0]; + const itemSize = WEBGL_TYPE_SIZES[accessorDef.type]; + const TypedArray = WEBGL_COMPONENT_TYPES[accessorDef.componentType]; + const elementBytes = TypedArray.BYTES_PER_ELEMENT; + const itemBytes = elementBytes * itemSize; + const byteOffset = accessorDef.byteOffset || 0; + const byteStride = accessorDef.bufferView !== void 0 ? json.bufferViews[accessorDef.bufferView].byteStride : void 0; + const normalized = accessorDef.normalized === true; + let array, bufferAttribute; + if (byteStride && byteStride !== itemBytes) { + const ibSlice = Math.floor(byteOffset / byteStride); + const ibCacheKey = "InterleavedBuffer:" + accessorDef.bufferView + ":" + accessorDef.componentType + ":" + ibSlice + ":" + accessorDef.count; + let ib = parser.cache.get(ibCacheKey); + if (!ib) { + array = new TypedArray(bufferView, ibSlice * byteStride, accessorDef.count * byteStride / elementBytes); + ib = new InterleavedBuffer(array, byteStride / elementBytes); + parser.cache.add(ibCacheKey, ib); + } + bufferAttribute = new InterleavedBufferAttribute(ib, itemSize, byteOffset % byteStride / elementBytes, normalized); + } else { + if (bufferView === null) { + array = new TypedArray(accessorDef.count * itemSize); + } else { + array = new TypedArray(bufferView, byteOffset, accessorDef.count * itemSize); + } + bufferAttribute = new BufferAttribute(array, itemSize, normalized); + } + if (accessorDef.sparse !== void 0) { + const itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR; + const TypedArrayIndices = WEBGL_COMPONENT_TYPES[accessorDef.sparse.indices.componentType]; + const byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0; + const byteOffsetValues = accessorDef.sparse.values.byteOffset || 0; + const sparseIndices = new TypedArrayIndices(bufferViews[1], byteOffsetIndices, accessorDef.sparse.count * itemSizeIndices); + const sparseValues = new TypedArray(bufferViews[2], byteOffsetValues, accessorDef.sparse.count * itemSize); + if (bufferView !== null) { + bufferAttribute = new BufferAttribute(bufferAttribute.array.slice(), bufferAttribute.itemSize, bufferAttribute.normalized); + } + bufferAttribute.normalized = false; + for (let i = 0, il = sparseIndices.length; i < il; i++) { + const index = sparseIndices[i]; + bufferAttribute.setX(index, sparseValues[i * itemSize]); + if (itemSize >= 2) bufferAttribute.setY(index, sparseValues[i * itemSize + 1]); + if (itemSize >= 3) bufferAttribute.setZ(index, sparseValues[i * itemSize + 2]); + if (itemSize >= 4) bufferAttribute.setW(index, sparseValues[i * itemSize + 3]); + if (itemSize >= 5) throw new Error("THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute."); + } + bufferAttribute.normalized = normalized; + } + return bufferAttribute; + }); } - .maskEditor_sidePanelSeparator { - width: 200px; - height: 2px; - background: var(--border-color); - margin-top: 5px; - margin-bottom: 5px; + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures + * @param {number} textureIndex + * @return {Promise} + */ + loadTexture(textureIndex) { + const json = this.json; + const options = this.options; + const textureDef = json.textures[textureIndex]; + const sourceIndex = textureDef.source; + const sourceDef = json.images[sourceIndex]; + let loader = this.textureLoader; + if (sourceDef.uri) { + const handler = options.manager.getHandler(sourceDef.uri); + if (handler !== null) loader = handler; + } + return this.loadTextureImage(textureIndex, sourceIndex, loader); } - #maskEditor_pointerZone { - width: calc(100% - var(--sidebar-width) - 220px); - height: 100%; + loadTextureImage(textureIndex, sourceIndex, loader) { + const parser = this; + const json = this.json; + const textureDef = json.textures[textureIndex]; + const sourceDef = json.images[sourceIndex]; + const cacheKey = (sourceDef.uri || sourceDef.bufferView) + ":" + textureDef.sampler; + if (this.textureCache[cacheKey]) { + return this.textureCache[cacheKey]; + } + const promise = this.loadImageSource(sourceIndex, loader).then(function(texture) { + texture.flipY = false; + texture.name = textureDef.name || sourceDef.name || ""; + if (texture.name === "" && typeof sourceDef.uri === "string" && sourceDef.uri.startsWith("data:image/") === false) { + texture.name = sourceDef.uri; + } + const samplers = json.samplers || {}; + const sampler = samplers[textureDef.sampler] || {}; + texture.magFilter = WEBGL_FILTERS[sampler.magFilter] || LinearFilter; + texture.minFilter = WEBGL_FILTERS[sampler.minFilter] || LinearMipmapLinearFilter; + texture.wrapS = WEBGL_WRAPPINGS[sampler.wrapS] || RepeatWrapping; + texture.wrapT = WEBGL_WRAPPINGS[sampler.wrapT] || RepeatWrapping; + texture.generateMipmaps = !texture.isCompressedTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter; + parser.associations.set(texture, { textures: textureIndex }); + return texture; + }).catch(function() { + return null; + }); + this.textureCache[cacheKey] = promise; + return promise; } - #maskEditor_uiContainer { - width: 100%; - height: 100%; - position: absolute; - z-index: 8888; - display: flex; - flex-direction: column; + loadImageSource(sourceIndex, loader) { + const parser = this; + const json = this.json; + const options = this.options; + if (this.sourceCache[sourceIndex] !== void 0) { + return this.sourceCache[sourceIndex].then((texture) => texture.clone()); + } + const sourceDef = json.images[sourceIndex]; + const URL2 = self.URL || self.webkitURL; + let sourceURI = sourceDef.uri || ""; + let isObjectURL = false; + if (sourceDef.bufferView !== void 0) { + sourceURI = parser.getDependency("bufferView", sourceDef.bufferView).then(function(bufferView) { + isObjectURL = true; + const blob = new Blob([bufferView], { type: sourceDef.mimeType }); + sourceURI = URL2.createObjectURL(blob); + return sourceURI; + }); + } else if (sourceDef.uri === void 0) { + throw new Error("THREE.GLTFLoader: Image " + sourceIndex + " is missing URI and bufferView"); + } + const promise = Promise.resolve(sourceURI).then(function(sourceURI2) { + return new Promise(function(resolve, reject) { + let onLoad = resolve; + if (loader.isImageBitmapLoader === true) { + onLoad = /* @__PURE__ */ __name(function(imageBitmap) { + const texture = new Texture(imageBitmap); + texture.needsUpdate = true; + resolve(texture); + }, "onLoad"); + } + loader.load(LoaderUtils.resolveURL(sourceURI2, options.path), onLoad, void 0, reject); + }); + }).then(function(texture) { + if (isObjectURL === true) { + URL2.revokeObjectURL(sourceURI); + } + assignExtrasToUserData(texture, sourceDef); + texture.userData.mimeType = sourceDef.mimeType || getImageURIMimeType(sourceDef.uri); + return texture; + }).catch(function(error) { + console.error("THREE.GLTFLoader: Couldn't load texture", sourceURI); + throw error; + }); + this.sourceCache[sourceIndex] = promise; + return promise; } - #maskEditorCanvasContainer { - position: absolute; - width: 1000px; - height: 667px; - left: 359px; - top: 280px; + /** + * Asynchronously assigns a texture to the given material parameters. + * @param {Object} materialParams + * @param {string} mapName + * @param {Object} mapDef + * @return {Promise} + */ + assignTexture(materialParams, mapName, mapDef, colorSpace) { + const parser = this; + return this.getDependency("texture", mapDef.index).then(function(texture) { + if (!texture) return null; + if (mapDef.texCoord !== void 0 && mapDef.texCoord > 0) { + texture = texture.clone(); + texture.channel = mapDef.texCoord; + } + if (parser.extensions[EXTENSIONS.KHR_TEXTURE_TRANSFORM]) { + const transform = mapDef.extensions !== void 0 ? mapDef.extensions[EXTENSIONS.KHR_TEXTURE_TRANSFORM] : void 0; + if (transform) { + const gltfReference = parser.associations.get(texture); + texture = parser.extensions[EXTENSIONS.KHR_TEXTURE_TRANSFORM].extendTexture(texture, transform); + parser.associations.set(texture, gltfReference); + } + } + if (colorSpace !== void 0) { + texture.colorSpace = colorSpace; + } + materialParams[mapName] = texture; + return texture; + }); } - #imageCanvas { - width: 100%; - height: 100%; + /** + * Assigns final material to a Mesh, Line, or Points instance. The instance + * already has a material (generated from the glTF material options alone) + * but reuse of the same glTF material may require multiple threejs materials + * to accommodate different primitive types, defines, etc. New materials will + * be created if necessary, and reused from a cache. + * @param {Object3D} mesh Mesh, Line, or Points instance. + */ + assignFinalMaterial(mesh) { + const geometry = mesh.geometry; + let material = mesh.material; + const useDerivativeTangents = geometry.attributes.tangent === void 0; + const useVertexColors = geometry.attributes.color !== void 0; + const useFlatShading = geometry.attributes.normal === void 0; + if (mesh.isPoints) { + const cacheKey = "PointsMaterial:" + material.uuid; + let pointsMaterial = this.cache.get(cacheKey); + if (!pointsMaterial) { + pointsMaterial = new PointsMaterial(); + Material.prototype.copy.call(pointsMaterial, material); + pointsMaterial.color.copy(material.color); + pointsMaterial.map = material.map; + pointsMaterial.sizeAttenuation = false; + this.cache.add(cacheKey, pointsMaterial); + } + material = pointsMaterial; + } else if (mesh.isLine) { + const cacheKey = "LineBasicMaterial:" + material.uuid; + let lineMaterial = this.cache.get(cacheKey); + if (!lineMaterial) { + lineMaterial = new LineBasicMaterial(); + Material.prototype.copy.call(lineMaterial, material); + lineMaterial.color.copy(material.color); + lineMaterial.map = material.map; + this.cache.add(cacheKey, lineMaterial); + } + material = lineMaterial; + } + if (useDerivativeTangents || useVertexColors || useFlatShading) { + let cacheKey = "ClonedMaterial:" + material.uuid + ":"; + if (useDerivativeTangents) cacheKey += "derivative-tangents:"; + if (useVertexColors) cacheKey += "vertex-colors:"; + if (useFlatShading) cacheKey += "flat-shading:"; + let cachedMaterial = this.cache.get(cacheKey); + if (!cachedMaterial) { + cachedMaterial = material.clone(); + if (useVertexColors) cachedMaterial.vertexColors = true; + if (useFlatShading) cachedMaterial.flatShading = true; + if (useDerivativeTangents) { + if (cachedMaterial.normalScale) cachedMaterial.normalScale.y *= -1; + if (cachedMaterial.clearcoatNormalScale) cachedMaterial.clearcoatNormalScale.y *= -1; + } + this.cache.add(cacheKey, cachedMaterial); + this.associations.set(cachedMaterial, this.associations.get(material)); + } + material = cachedMaterial; + } + mesh.material = material; } - #maskCanvas { - width: 100%; - height: 100%; + getMaterialType() { + return MeshStandardMaterial; } - #maskEditor_uiHorizontalContainer { - width: 100%; - height: 100%; - display: flex; + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials + * @param {number} materialIndex + * @return {Promise} + */ + loadMaterial(materialIndex) { + const parser = this; + const json = this.json; + const extensions = this.extensions; + const materialDef = json.materials[materialIndex]; + let materialType; + const materialParams = {}; + const materialExtensions = materialDef.extensions || {}; + const pending = []; + if (materialExtensions[EXTENSIONS.KHR_MATERIALS_UNLIT]) { + const kmuExtension = extensions[EXTENSIONS.KHR_MATERIALS_UNLIT]; + materialType = kmuExtension.getMaterialType(); + pending.push(kmuExtension.extendParams(materialParams, materialDef, parser)); + } else { + const metallicRoughness = materialDef.pbrMetallicRoughness || {}; + materialParams.color = new Color(1, 1, 1); + materialParams.opacity = 1; + if (Array.isArray(metallicRoughness.baseColorFactor)) { + const array = metallicRoughness.baseColorFactor; + materialParams.color.setRGB(array[0], array[1], array[2], LinearSRGBColorSpace); + materialParams.opacity = array[3]; + } + if (metallicRoughness.baseColorTexture !== void 0) { + pending.push(parser.assignTexture(materialParams, "map", metallicRoughness.baseColorTexture, SRGBColorSpace)); + } + materialParams.metalness = metallicRoughness.metallicFactor !== void 0 ? metallicRoughness.metallicFactor : 1; + materialParams.roughness = metallicRoughness.roughnessFactor !== void 0 ? metallicRoughness.roughnessFactor : 1; + if (metallicRoughness.metallicRoughnessTexture !== void 0) { + pending.push(parser.assignTexture(materialParams, "metalnessMap", metallicRoughness.metallicRoughnessTexture)); + pending.push(parser.assignTexture(materialParams, "roughnessMap", metallicRoughness.metallicRoughnessTexture)); + } + materialType = this._invokeOne(function(ext2) { + return ext2.getMaterialType && ext2.getMaterialType(materialIndex); + }); + pending.push(Promise.all(this._invokeAll(function(ext2) { + return ext2.extendMaterialParams && ext2.extendMaterialParams(materialIndex, materialParams); + }))); + } + if (materialDef.doubleSided === true) { + materialParams.side = DoubleSide; + } + const alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE; + if (alphaMode === ALPHA_MODES.BLEND) { + materialParams.transparent = true; + materialParams.depthWrite = false; + } else { + materialParams.transparent = false; + if (alphaMode === ALPHA_MODES.MASK) { + materialParams.alphaTest = materialDef.alphaCutoff !== void 0 ? materialDef.alphaCutoff : 0.5; + } + } + if (materialDef.normalTexture !== void 0 && materialType !== MeshBasicMaterial) { + pending.push(parser.assignTexture(materialParams, "normalMap", materialDef.normalTexture)); + materialParams.normalScale = new Vector2(1, 1); + if (materialDef.normalTexture.scale !== void 0) { + const scale = materialDef.normalTexture.scale; + materialParams.normalScale.set(scale, scale); + } + } + if (materialDef.occlusionTexture !== void 0 && materialType !== MeshBasicMaterial) { + pending.push(parser.assignTexture(materialParams, "aoMap", materialDef.occlusionTexture)); + if (materialDef.occlusionTexture.strength !== void 0) { + materialParams.aoMapIntensity = materialDef.occlusionTexture.strength; + } + } + if (materialDef.emissiveFactor !== void 0 && materialType !== MeshBasicMaterial) { + const emissiveFactor = materialDef.emissiveFactor; + materialParams.emissive = new Color().setRGB(emissiveFactor[0], emissiveFactor[1], emissiveFactor[2], LinearSRGBColorSpace); + } + if (materialDef.emissiveTexture !== void 0 && materialType !== MeshBasicMaterial) { + pending.push(parser.assignTexture(materialParams, "emissiveMap", materialDef.emissiveTexture, SRGBColorSpace)); + } + return Promise.all(pending).then(function() { + const material = new materialType(materialParams); + if (materialDef.name) material.name = materialDef.name; + assignExtrasToUserData(material, materialDef); + parser.associations.set(material, { materials: materialIndex }); + if (materialDef.extensions) addUnknownExtensionsToUserData(extensions, material, materialDef); + return material; + }); } - #maskEditor_topBar { - display: flex; - height: 44px; - align-items: center; - background: var(--comfy-menu-bg); + /** When Object3D instances are targeted by animation, they need unique names. */ + createUniqueName(originalName) { + const sanitizedName = PropertyBinding.sanitizeNodeName(originalName || ""); + if (sanitizedName in this.nodeNamesUsed) { + return sanitizedName + "_" + ++this.nodeNamesUsed[sanitizedName]; + } else { + this.nodeNamesUsed[sanitizedName] = 0; + return sanitizedName; + } } - #maskEditor_topBarTitle { - margin: 0; - margin-left: 0.5rem; - margin-right: 0.5rem; - font-size: 1.2em; + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry + * + * Creates BufferGeometries from primitives. + * + * @param {Array} primitives + * @return {Promise>} + */ + loadGeometries(primitives) { + const parser = this; + const extensions = this.extensions; + const cache = this.primitiveCache; + function createDracoPrimitive(primitive) { + return extensions[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION].decodePrimitive(primitive, parser).then(function(geometry) { + return addPrimitiveAttributes(geometry, primitive, parser); + }); + } + __name(createDracoPrimitive, "createDracoPrimitive"); + const pending = []; + for (let i = 0, il = primitives.length; i < il; i++) { + const primitive = primitives[i]; + const cacheKey = createPrimitiveKey(primitive); + const cached = cache[cacheKey]; + if (cached) { + pending.push(cached.promise); + } else { + let geometryPromise; + if (primitive.extensions && primitive.extensions[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION]) { + geometryPromise = createDracoPrimitive(primitive); + } else { + geometryPromise = addPrimitiveAttributes(new BufferGeometry(), primitive, parser); + } + cache[cacheKey] = { primitive, promise: geometryPromise }; + pending.push(geometryPromise); + } + } + return Promise.all(pending); } - #maskEditor_topBarButtonContainer { - display: flex; - gap: 10px; - margin-right: 0.5rem; - position: absolute; - right: 0; - width: 200px; + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes + * @param {number} meshIndex + * @return {Promise} + */ + loadMesh(meshIndex) { + const parser = this; + const json = this.json; + const extensions = this.extensions; + const meshDef = json.meshes[meshIndex]; + const primitives = meshDef.primitives; + const pending = []; + for (let i = 0, il = primitives.length; i < il; i++) { + const material = primitives[i].material === void 0 ? createDefaultMaterial(this.cache) : this.getDependency("material", primitives[i].material); + pending.push(material); + } + pending.push(parser.loadGeometries(primitives)); + return Promise.all(pending).then(function(results) { + const materials = results.slice(0, results.length - 1); + const geometries = results[results.length - 1]; + const meshes = []; + for (let i = 0, il = geometries.length; i < il; i++) { + const geometry = geometries[i]; + const primitive = primitives[i]; + let mesh; + const material = materials[i]; + if (primitive.mode === WEBGL_CONSTANTS.TRIANGLES || primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP || primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN || primitive.mode === void 0) { + mesh = meshDef.isSkinnedMesh === true ? new SkinnedMesh(geometry, material) : new Mesh(geometry, material); + if (mesh.isSkinnedMesh === true) { + mesh.normalizeSkinWeights(); + } + if (primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP) { + mesh.geometry = toTrianglesDrawMode(mesh.geometry, TriangleStripDrawMode); + } else if (primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN) { + mesh.geometry = toTrianglesDrawMode(mesh.geometry, TriangleFanDrawMode); + } + } else if (primitive.mode === WEBGL_CONSTANTS.LINES) { + mesh = new LineSegments(geometry, material); + } else if (primitive.mode === WEBGL_CONSTANTS.LINE_STRIP) { + mesh = new Line(geometry, material); + } else if (primitive.mode === WEBGL_CONSTANTS.LINE_LOOP) { + mesh = new LineLoop(geometry, material); + } else if (primitive.mode === WEBGL_CONSTANTS.POINTS) { + mesh = new Points(geometry, material); + } else { + throw new Error("THREE.GLTFLoader: Primitive mode unsupported: " + primitive.mode); + } + if (Object.keys(mesh.geometry.morphAttributes).length > 0) { + updateMorphTargets(mesh, meshDef); + } + mesh.name = parser.createUniqueName(meshDef.name || "mesh_" + meshIndex); + assignExtrasToUserData(mesh, meshDef); + if (primitive.extensions) addUnknownExtensionsToUserData(extensions, mesh, primitive); + parser.assignFinalMaterial(mesh); + meshes.push(mesh); + } + for (let i = 0, il = meshes.length; i < il; i++) { + parser.associations.set(meshes[i], { + meshes: meshIndex, + primitives: i + }); + } + if (meshes.length === 1) { + if (meshDef.extensions) addUnknownExtensionsToUserData(extensions, meshes[0], meshDef); + return meshes[0]; + } + const group = new Group(); + if (meshDef.extensions) addUnknownExtensionsToUserData(extensions, group, meshDef); + parser.associations.set(group, { meshes: meshIndex }); + for (let i = 0, il = meshes.length; i < il; i++) { + group.add(meshes[i]); + } + return group; + }); } - #maskEditor_topBarShortcutsContainer { - display: flex; - gap: 10px; - margin-left: 5px; + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras + * @param {number} cameraIndex + * @return {Promise} + */ + loadCamera(cameraIndex) { + let camera; + const cameraDef = this.json.cameras[cameraIndex]; + const params = cameraDef[cameraDef.type]; + if (!params) { + console.warn("THREE.GLTFLoader: Missing camera parameters."); + return; + } + if (cameraDef.type === "perspective") { + camera = new PerspectiveCamera(MathUtils.radToDeg(params.yfov), params.aspectRatio || 1, params.znear || 1, params.zfar || 2e6); + } else if (cameraDef.type === "orthographic") { + camera = new OrthographicCamera(-params.xmag, params.xmag, params.ymag, -params.ymag, params.znear, params.zfar); + } + if (cameraDef.name) camera.name = this.createUniqueName(cameraDef.name); + assignExtrasToUserData(camera, cameraDef); + return Promise.resolve(camera); } - - .maskEditor_topPanelIconButton_dark { - width: 50px; - height: 30px; - pointer-events: auto; - display: flex; - justify-content: center; - align-items: center; - transition: background-color 0.1s; - background: var(--p-surface-800); - border: 1px solid var(--p-form-field-border-color); - border-radius: 10px; + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins + * @param {number} skinIndex + * @return {Promise} + */ + loadSkin(skinIndex) { + const skinDef = this.json.skins[skinIndex]; + const pending = []; + for (let i = 0, il = skinDef.joints.length; i < il; i++) { + pending.push(this._loadNodeShallow(skinDef.joints[i])); + } + if (skinDef.inverseBindMatrices !== void 0) { + pending.push(this.getDependency("accessor", skinDef.inverseBindMatrices)); + } else { + pending.push(null); + } + return Promise.all(pending).then(function(results) { + const inverseBindMatrices = results.pop(); + const jointNodes = results; + const bones = []; + const boneInverses = []; + for (let i = 0, il = jointNodes.length; i < il; i++) { + const jointNode = jointNodes[i]; + if (jointNode) { + bones.push(jointNode); + const mat = new Matrix4(); + if (inverseBindMatrices !== null) { + mat.fromArray(inverseBindMatrices.array, i * 16); + } + boneInverses.push(mat); + } else { + console.warn('THREE.GLTFLoader: Joint "%s" could not be found.', skinDef.joints[i]); + } + } + return new Skeleton(bones, boneInverses); + }); } - - .maskEditor_topPanelIconButton_dark:hover { - background-color: var(--p-surface-900); + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations + * @param {number} animationIndex + * @return {Promise} + */ + loadAnimation(animationIndex) { + const json = this.json; + const parser = this; + const animationDef = json.animations[animationIndex]; + const animationName = animationDef.name ? animationDef.name : "animation_" + animationIndex; + const pendingNodes = []; + const pendingInputAccessors = []; + const pendingOutputAccessors = []; + const pendingSamplers = []; + const pendingTargets = []; + for (let i = 0, il = animationDef.channels.length; i < il; i++) { + const channel = animationDef.channels[i]; + const sampler = animationDef.samplers[channel.sampler]; + const target = channel.target; + const name = target.node; + const input = animationDef.parameters !== void 0 ? animationDef.parameters[sampler.input] : sampler.input; + const output = animationDef.parameters !== void 0 ? animationDef.parameters[sampler.output] : sampler.output; + if (target.node === void 0) continue; + pendingNodes.push(this.getDependency("node", name)); + pendingInputAccessors.push(this.getDependency("accessor", input)); + pendingOutputAccessors.push(this.getDependency("accessor", output)); + pendingSamplers.push(sampler); + pendingTargets.push(target); + } + return Promise.all([ + Promise.all(pendingNodes), + Promise.all(pendingInputAccessors), + Promise.all(pendingOutputAccessors), + Promise.all(pendingSamplers), + Promise.all(pendingTargets) + ]).then(function(dependencies) { + const nodes = dependencies[0]; + const inputAccessors = dependencies[1]; + const outputAccessors = dependencies[2]; + const samplers = dependencies[3]; + const targets = dependencies[4]; + const tracks = []; + for (let i = 0, il = nodes.length; i < il; i++) { + const node = nodes[i]; + const inputAccessor = inputAccessors[i]; + const outputAccessor = outputAccessors[i]; + const sampler = samplers[i]; + const target = targets[i]; + if (node === void 0) continue; + if (node.updateMatrix) { + node.updateMatrix(); + } + const createdTracks = parser._createAnimationTracks(node, inputAccessor, outputAccessor, sampler, target); + if (createdTracks) { + for (let k = 0; k < createdTracks.length; k++) { + tracks.push(createdTracks[k]); + } + } + } + return new AnimationClip(animationName, void 0, tracks); + }); } - - .maskEditor_topPanelIconButton_dark svg { - width: 25px; - height: 25px; - pointer-events: none; - fill: var(--input-text); + createNodeMesh(nodeIndex) { + const json = this.json; + const parser = this; + const nodeDef = json.nodes[nodeIndex]; + if (nodeDef.mesh === void 0) return null; + return parser.getDependency("mesh", nodeDef.mesh).then(function(mesh) { + const node = parser._getNodeRef(parser.meshCache, nodeDef.mesh, mesh); + if (nodeDef.weights !== void 0) { + node.traverse(function(o) { + if (!o.isMesh) return; + for (let i = 0, il = nodeDef.weights.length; i < il; i++) { + o.morphTargetInfluences[i] = nodeDef.weights[i]; + } + }); + } + return node; + }); } - - .maskEditor_topPanelIconButton_light { - width: 50px; - height: 30px; - pointer-events: auto; - display: flex; - justify-content: center; - align-items: center; - transition: background-color 0.1s; - background: var(--comfy-menu-bg); - border: 1px solid var(--p-form-field-border-color); - border-radius: 10px; + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy + * @param {number} nodeIndex + * @return {Promise} + */ + loadNode(nodeIndex) { + const json = this.json; + const parser = this; + const nodeDef = json.nodes[nodeIndex]; + const nodePending = parser._loadNodeShallow(nodeIndex); + const childPending = []; + const childrenDef = nodeDef.children || []; + for (let i = 0, il = childrenDef.length; i < il; i++) { + childPending.push(parser.getDependency("node", childrenDef[i])); + } + const skeletonPending = nodeDef.skin === void 0 ? Promise.resolve(null) : parser.getDependency("skin", nodeDef.skin); + return Promise.all([ + nodePending, + Promise.all(childPending), + skeletonPending + ]).then(function(results) { + const node = results[0]; + const children = results[1]; + const skeleton = results[2]; + if (skeleton !== null) { + node.traverse(function(mesh) { + if (!mesh.isSkinnedMesh) return; + mesh.bind(skeleton, _identityMatrix); + }); + } + for (let i = 0, il = children.length; i < il; i++) { + node.add(children[i]); + } + return node; + }); } - - .maskEditor_topPanelIconButton_light:hover { - background-color: var(--p-surface-300); + // ._loadNodeShallow() parses a single node. + // skin and child nodes are created and added in .loadNode() (no '_' prefix). + _loadNodeShallow(nodeIndex) { + const json = this.json; + const extensions = this.extensions; + const parser = this; + if (this.nodeCache[nodeIndex] !== void 0) { + return this.nodeCache[nodeIndex]; + } + const nodeDef = json.nodes[nodeIndex]; + const nodeName = nodeDef.name ? parser.createUniqueName(nodeDef.name) : ""; + const pending = []; + const meshPromise = parser._invokeOne(function(ext2) { + return ext2.createNodeMesh && ext2.createNodeMesh(nodeIndex); + }); + if (meshPromise) { + pending.push(meshPromise); + } + if (nodeDef.camera !== void 0) { + pending.push(parser.getDependency("camera", nodeDef.camera).then(function(camera) { + return parser._getNodeRef(parser.cameraCache, nodeDef.camera, camera); + })); + } + parser._invokeAll(function(ext2) { + return ext2.createNodeAttachment && ext2.createNodeAttachment(nodeIndex); + }).forEach(function(promise) { + pending.push(promise); + }); + this.nodeCache[nodeIndex] = Promise.all(pending).then(function(objects) { + let node; + if (nodeDef.isBone === true) { + node = new Bone(); + } else if (objects.length > 1) { + node = new Group(); + } else if (objects.length === 1) { + node = objects[0]; + } else { + node = new Object3D(); + } + if (node !== objects[0]) { + for (let i = 0, il = objects.length; i < il; i++) { + node.add(objects[i]); + } + } + if (nodeDef.name) { + node.userData.name = nodeDef.name; + node.name = nodeName; + } + assignExtrasToUserData(node, nodeDef); + if (nodeDef.extensions) addUnknownExtensionsToUserData(extensions, node, nodeDef); + if (nodeDef.matrix !== void 0) { + const matrix = new Matrix4(); + matrix.fromArray(nodeDef.matrix); + node.applyMatrix4(matrix); + } else { + if (nodeDef.translation !== void 0) { + node.position.fromArray(nodeDef.translation); + } + if (nodeDef.rotation !== void 0) { + node.quaternion.fromArray(nodeDef.rotation); + } + if (nodeDef.scale !== void 0) { + node.scale.fromArray(nodeDef.scale); + } + } + if (!parser.associations.has(node)) { + parser.associations.set(node, {}); + } + parser.associations.get(node).nodes = nodeIndex; + return node; + }); + return this.nodeCache[nodeIndex]; } - - .maskEditor_topPanelIconButton_light svg { - width: 25px; - height: 25px; - pointer-events: none; - fill: var(--input-text); + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes + * @param {number} sceneIndex + * @return {Promise} + */ + loadScene(sceneIndex) { + const extensions = this.extensions; + const sceneDef = this.json.scenes[sceneIndex]; + const parser = this; + const scene = new Group(); + if (sceneDef.name) scene.name = parser.createUniqueName(sceneDef.name); + assignExtrasToUserData(scene, sceneDef); + if (sceneDef.extensions) addUnknownExtensionsToUserData(extensions, scene, sceneDef); + const nodeIds = sceneDef.nodes || []; + const pending = []; + for (let i = 0, il = nodeIds.length; i < il; i++) { + pending.push(parser.getDependency("node", nodeIds[i])); + } + return Promise.all(pending).then(function(nodes) { + for (let i = 0, il = nodes.length; i < il; i++) { + scene.add(nodes[i]); + } + const reduceAssociations = /* @__PURE__ */ __name((node) => { + const reducedAssociations = /* @__PURE__ */ new Map(); + for (const [key, value] of parser.associations) { + if (key instanceof Material || key instanceof Texture) { + reducedAssociations.set(key, value); + } + } + node.traverse((node2) => { + const mappings = parser.associations.get(node2); + if (mappings != null) { + reducedAssociations.set(node2, mappings); + } + }); + return reducedAssociations; + }, "reduceAssociations"); + parser.associations = reduceAssociations(scene); + return scene; + }); } - - .maskEditor_topPanelButton_dark { - height: 30px; - background: var(--p-surface-800); - border: 1px solid var(--p-form-field-border-color); - border-radius: 10px; - color: var(--input-text); - font-family: sans-serif; - pointer-events: auto; - transition: 0.1s; - width: 60px; + _createAnimationTracks(node, inputAccessor, outputAccessor, sampler, target) { + const tracks = []; + const targetName = node.name ? node.name : node.uuid; + const targetNames = []; + if (PATH_PROPERTIES[target.path] === PATH_PROPERTIES.weights) { + node.traverse(function(object) { + if (object.morphTargetInfluences) { + targetNames.push(object.name ? object.name : object.uuid); + } + }); + } else { + targetNames.push(targetName); + } + let TypedKeyframeTrack; + switch (PATH_PROPERTIES[target.path]) { + case PATH_PROPERTIES.weights: + TypedKeyframeTrack = NumberKeyframeTrack; + break; + case PATH_PROPERTIES.rotation: + TypedKeyframeTrack = QuaternionKeyframeTrack; + break; + case PATH_PROPERTIES.position: + case PATH_PROPERTIES.scale: + TypedKeyframeTrack = VectorKeyframeTrack; + break; + default: + switch (outputAccessor.itemSize) { + case 1: + TypedKeyframeTrack = NumberKeyframeTrack; + break; + case 2: + case 3: + default: + TypedKeyframeTrack = VectorKeyframeTrack; + break; + } + break; + } + const interpolation = sampler.interpolation !== void 0 ? INTERPOLATION[sampler.interpolation] : InterpolateLinear; + const outputArray = this._getArrayFromAccessor(outputAccessor); + for (let j = 0, jl = targetNames.length; j < jl; j++) { + const track = new TypedKeyframeTrack( + targetNames[j] + "." + PATH_PROPERTIES[target.path], + inputAccessor.array, + outputArray, + interpolation + ); + if (sampler.interpolation === "CUBICSPLINE") { + this._createCubicSplineTrackInterpolant(track); + } + tracks.push(track); + } + return tracks; } - - .maskEditor_topPanelButton_dark:hover { - background-color: var(--p-surface-900); + _getArrayFromAccessor(accessor) { + let outputArray = accessor.array; + if (accessor.normalized) { + const scale = getNormalizedComponentScale(outputArray.constructor); + const scaled = new Float32Array(outputArray.length); + for (let j = 0, jl = outputArray.length; j < jl; j++) { + scaled[j] = outputArray[j] * scale; + } + outputArray = scaled; + } + return outputArray; } - - .maskEditor_topPanelButton_light { - height: 30px; - background: var(--comfy-menu-bg); - border: 1px solid var(--p-form-field-border-color); - border-radius: 10px; - color: var(--input-text); - font-family: sans-serif; - pointer-events: auto; - transition: 0.1s; - width: 60px; + _createCubicSplineTrackInterpolant(track) { + track.createInterpolant = /* @__PURE__ */ __name(function InterpolantFactoryMethodGLTFCubicSpline(result) { + const interpolantType = this instanceof QuaternionKeyframeTrack ? GLTFCubicSplineQuaternionInterpolant : GLTFCubicSplineInterpolant; + return new interpolantType(this.times, this.values, this.getValueSize() / 3, result); + }, "InterpolantFactoryMethodGLTFCubicSpline"); + track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true; } - - .maskEditor_topPanelButton_light:hover { - background-color: var(--p-surface-300); +} +function computeBounds(geometry, primitiveDef, parser) { + const attributes = primitiveDef.attributes; + const box = new Box3(); + if (attributes.POSITION !== void 0) { + const accessor = parser.json.accessors[attributes.POSITION]; + const min = accessor.min; + const max2 = accessor.max; + if (min !== void 0 && max2 !== void 0) { + box.set( + new Vector3(min[0], min[1], min[2]), + new Vector3(max2[0], max2[1], max2[2]) + ); + if (accessor.normalized) { + const boxScale = getNormalizedComponentScale(WEBGL_COMPONENT_TYPES[accessor.componentType]); + box.min.multiplyScalar(boxScale); + box.max.multiplyScalar(boxScale); + } + } else { + console.warn("THREE.GLTFLoader: Missing min/max properties for accessor POSITION."); + return; + } + } else { + return; } - - - #maskEditor_sidePanelColorSelectSettings { - flex-direction: column; + const targets = primitiveDef.targets; + if (targets !== void 0) { + const maxDisplacement = new Vector3(); + const vector = new Vector3(); + for (let i = 0, il = targets.length; i < il; i++) { + const target = targets[i]; + if (target.POSITION !== void 0) { + const accessor = parser.json.accessors[target.POSITION]; + const min = accessor.min; + const max2 = accessor.max; + if (min !== void 0 && max2 !== void 0) { + vector.setX(Math.max(Math.abs(min[0]), Math.abs(max2[0]))); + vector.setY(Math.max(Math.abs(min[1]), Math.abs(max2[1]))); + vector.setZ(Math.max(Math.abs(min[2]), Math.abs(max2[2]))); + if (accessor.normalized) { + const boxScale = getNormalizedComponentScale(WEBGL_COMPONENT_TYPES[accessor.componentType]); + vector.multiplyScalar(boxScale); + } + maxDisplacement.max(vector); + } else { + console.warn("THREE.GLTFLoader: Missing min/max properties for accessor POSITION."); + } + } + } + box.expandByVector(maxDisplacement); } - - .maskEditor_sidePanel_paintBucket_Container { - width: 180px; - display: flex; - flex-direction: column; - position: relative; + geometry.boundingBox = box; + const sphere = new Sphere(); + box.getCenter(sphere.center); + sphere.radius = box.min.distanceTo(box.max) / 2; + geometry.boundingSphere = sphere; +} +__name(computeBounds, "computeBounds"); +function addPrimitiveAttributes(geometry, primitiveDef, parser) { + const attributes = primitiveDef.attributes; + const pending = []; + function assignAttributeAccessor(accessorIndex, attributeName) { + return parser.getDependency("accessor", accessorIndex).then(function(accessor) { + geometry.setAttribute(attributeName, accessor); + }); } - - .maskEditor_sidePanel_colorSelect_Container { - display: flex; - width: 180px; - align-items: center; - gap: 5px; - height: 30px; + __name(assignAttributeAccessor, "assignAttributeAccessor"); + for (const gltfAttributeName in attributes) { + const threeAttributeName = ATTRIBUTES[gltfAttributeName] || gltfAttributeName.toLowerCase(); + if (threeAttributeName in geometry.attributes) continue; + pending.push(assignAttributeAccessor(attributes[gltfAttributeName], threeAttributeName)); } - - #maskEditor_sidePanelVisibilityToggle { - position: absolute; - right: 0; + if (primitiveDef.indices !== void 0 && !geometry.index) { + const accessor = parser.getDependency("accessor", primitiveDef.indices).then(function(accessor2) { + geometry.setIndex(accessor2); + }); + pending.push(accessor); } - - #maskEditor_sidePanelColorSelectMethodSelect { - position: absolute; - right: 0; - height: 30px; - border-radius: 0; - border: 1px solid var(--border-color); - background: rgba(0,0,0,0.2); + if (ColorManagement.workingColorSpace !== LinearSRGBColorSpace && "COLOR_0" in attributes) { + console.warn(`THREE.GLTFLoader: Converting vertex colors from "srgb-linear" to "${ColorManagement.workingColorSpace}" not supported.`); } - - #maskEditor_sidePanelVisibilityToggle { - position: absolute; - right: 0; + assignExtrasToUserData(geometry, primitiveDef); + computeBounds(geometry, primitiveDef, parser); + return Promise.all(pending).then(function() { + return primitiveDef.targets !== void 0 ? addMorphTargets(geometry, primitiveDef.targets, parser) : geometry; + }); +} +__name(addPrimitiveAttributes, "addPrimitiveAttributes"); +const _object_pattern = /^[og]\s*(.+)?/; +const _material_library_pattern = /^mtllib /; +const _material_use_pattern = /^usemtl /; +const _map_use_pattern = /^usemap /; +const _face_vertex_data_separator_pattern = /\s+/; +const _vA = new Vector3(); +const _vB = new Vector3(); +const _vC = new Vector3(); +const _ab = new Vector3(); +const _cb = new Vector3(); +const _color = new Color(); +function ParserState() { + const state = { + objects: [], + object: {}, + vertices: [], + normals: [], + colors: [], + uvs: [], + materials: {}, + materialLibraries: [], + startObject: /* @__PURE__ */ __name(function(name, fromDeclaration) { + if (this.object && this.object.fromDeclaration === false) { + this.object.name = name; + this.object.fromDeclaration = fromDeclaration !== false; + return; + } + const previousMaterial = this.object && typeof this.object.currentMaterial === "function" ? this.object.currentMaterial() : void 0; + if (this.object && typeof this.object._finalize === "function") { + this.object._finalize(true); + } + this.object = { + name: name || "", + fromDeclaration: fromDeclaration !== false, + geometry: { + vertices: [], + normals: [], + colors: [], + uvs: [], + hasUVIndices: false + }, + materials: [], + smooth: true, + startMaterial: /* @__PURE__ */ __name(function(name2, libraries) { + const previous = this._finalize(false); + if (previous && (previous.inherited || previous.groupCount <= 0)) { + this.materials.splice(previous.index, 1); + } + const material = { + index: this.materials.length, + name: name2 || "", + mtllib: Array.isArray(libraries) && libraries.length > 0 ? libraries[libraries.length - 1] : "", + smooth: previous !== void 0 ? previous.smooth : this.smooth, + groupStart: previous !== void 0 ? previous.groupEnd : 0, + groupEnd: -1, + groupCount: -1, + inherited: false, + clone: /* @__PURE__ */ __name(function(index) { + const cloned = { + index: typeof index === "number" ? index : this.index, + name: this.name, + mtllib: this.mtllib, + smooth: this.smooth, + groupStart: 0, + groupEnd: -1, + groupCount: -1, + inherited: false + }; + cloned.clone = this.clone.bind(cloned); + return cloned; + }, "clone") + }; + this.materials.push(material); + return material; + }, "startMaterial"), + currentMaterial: /* @__PURE__ */ __name(function() { + if (this.materials.length > 0) { + return this.materials[this.materials.length - 1]; + } + return void 0; + }, "currentMaterial"), + _finalize: /* @__PURE__ */ __name(function(end) { + const lastMultiMaterial = this.currentMaterial(); + if (lastMultiMaterial && lastMultiMaterial.groupEnd === -1) { + lastMultiMaterial.groupEnd = this.geometry.vertices.length / 3; + lastMultiMaterial.groupCount = lastMultiMaterial.groupEnd - lastMultiMaterial.groupStart; + lastMultiMaterial.inherited = false; + } + if (end && this.materials.length > 1) { + for (let mi = this.materials.length - 1; mi >= 0; mi--) { + if (this.materials[mi].groupCount <= 0) { + this.materials.splice(mi, 1); + } + } + } + if (end && this.materials.length === 0) { + this.materials.push({ + name: "", + smooth: this.smooth + }); + } + return lastMultiMaterial; + }, "_finalize") + }; + if (previousMaterial && previousMaterial.name && typeof previousMaterial.clone === "function") { + const declared = previousMaterial.clone(0); + declared.inherited = true; + this.object.materials.push(declared); + } + this.objects.push(this.object); + }, "startObject"), + finalize: /* @__PURE__ */ __name(function() { + if (this.object && typeof this.object._finalize === "function") { + this.object._finalize(true); + } + }, "finalize"), + parseVertexIndex: /* @__PURE__ */ __name(function(value, len) { + const index = parseInt(value, 10); + return (index >= 0 ? index - 1 : index + len / 3) * 3; + }, "parseVertexIndex"), + parseNormalIndex: /* @__PURE__ */ __name(function(value, len) { + const index = parseInt(value, 10); + return (index >= 0 ? index - 1 : index + len / 3) * 3; + }, "parseNormalIndex"), + parseUVIndex: /* @__PURE__ */ __name(function(value, len) { + const index = parseInt(value, 10); + return (index >= 0 ? index - 1 : index + len / 2) * 2; + }, "parseUVIndex"), + addVertex: /* @__PURE__ */ __name(function(a, b, c) { + const src = this.vertices; + const dst = this.object.geometry.vertices; + dst.push(src[a + 0], src[a + 1], src[a + 2]); + dst.push(src[b + 0], src[b + 1], src[b + 2]); + dst.push(src[c + 0], src[c + 1], src[c + 2]); + }, "addVertex"), + addVertexPoint: /* @__PURE__ */ __name(function(a) { + const src = this.vertices; + const dst = this.object.geometry.vertices; + dst.push(src[a + 0], src[a + 1], src[a + 2]); + }, "addVertexPoint"), + addVertexLine: /* @__PURE__ */ __name(function(a) { + const src = this.vertices; + const dst = this.object.geometry.vertices; + dst.push(src[a + 0], src[a + 1], src[a + 2]); + }, "addVertexLine"), + addNormal: /* @__PURE__ */ __name(function(a, b, c) { + const src = this.normals; + const dst = this.object.geometry.normals; + dst.push(src[a + 0], src[a + 1], src[a + 2]); + dst.push(src[b + 0], src[b + 1], src[b + 2]); + dst.push(src[c + 0], src[c + 1], src[c + 2]); + }, "addNormal"), + addFaceNormal: /* @__PURE__ */ __name(function(a, b, c) { + const src = this.vertices; + const dst = this.object.geometry.normals; + _vA.fromArray(src, a); + _vB.fromArray(src, b); + _vC.fromArray(src, c); + _cb.subVectors(_vC, _vB); + _ab.subVectors(_vA, _vB); + _cb.cross(_ab); + _cb.normalize(); + dst.push(_cb.x, _cb.y, _cb.z); + dst.push(_cb.x, _cb.y, _cb.z); + dst.push(_cb.x, _cb.y, _cb.z); + }, "addFaceNormal"), + addColor: /* @__PURE__ */ __name(function(a, b, c) { + const src = this.colors; + const dst = this.object.geometry.colors; + if (src[a] !== void 0) dst.push(src[a + 0], src[a + 1], src[a + 2]); + if (src[b] !== void 0) dst.push(src[b + 0], src[b + 1], src[b + 2]); + if (src[c] !== void 0) dst.push(src[c + 0], src[c + 1], src[c + 2]); + }, "addColor"), + addUV: /* @__PURE__ */ __name(function(a, b, c) { + const src = this.uvs; + const dst = this.object.geometry.uvs; + dst.push(src[a + 0], src[a + 1]); + dst.push(src[b + 0], src[b + 1]); + dst.push(src[c + 0], src[c + 1]); + }, "addUV"), + addDefaultUV: /* @__PURE__ */ __name(function() { + const dst = this.object.geometry.uvs; + dst.push(0, 0); + dst.push(0, 0); + dst.push(0, 0); + }, "addDefaultUV"), + addUVLine: /* @__PURE__ */ __name(function(a) { + const src = this.uvs; + const dst = this.object.geometry.uvs; + dst.push(src[a + 0], src[a + 1]); + }, "addUVLine"), + addFace: /* @__PURE__ */ __name(function(a, b, c, ua, ub, uc, na, nb, nc) { + const vLen = this.vertices.length; + let ia = this.parseVertexIndex(a, vLen); + let ib = this.parseVertexIndex(b, vLen); + let ic = this.parseVertexIndex(c, vLen); + this.addVertex(ia, ib, ic); + this.addColor(ia, ib, ic); + if (na !== void 0 && na !== "") { + const nLen = this.normals.length; + ia = this.parseNormalIndex(na, nLen); + ib = this.parseNormalIndex(nb, nLen); + ic = this.parseNormalIndex(nc, nLen); + this.addNormal(ia, ib, ic); + } else { + this.addFaceNormal(ia, ib, ic); + } + if (ua !== void 0 && ua !== "") { + const uvLen = this.uvs.length; + ia = this.parseUVIndex(ua, uvLen); + ib = this.parseUVIndex(ub, uvLen); + ic = this.parseUVIndex(uc, uvLen); + this.addUV(ia, ib, ic); + this.object.geometry.hasUVIndices = true; + } else { + this.addDefaultUV(); + } + }, "addFace"), + addPointGeometry: /* @__PURE__ */ __name(function(vertices) { + this.object.geometry.type = "Points"; + const vLen = this.vertices.length; + for (let vi = 0, l = vertices.length; vi < l; vi++) { + const index = this.parseVertexIndex(vertices[vi], vLen); + this.addVertexPoint(index); + this.addColor(index); + } + }, "addPointGeometry"), + addLineGeometry: /* @__PURE__ */ __name(function(vertices, uvs) { + this.object.geometry.type = "Line"; + const vLen = this.vertices.length; + const uvLen = this.uvs.length; + for (let vi = 0, l = vertices.length; vi < l; vi++) { + this.addVertexLine(this.parseVertexIndex(vertices[vi], vLen)); + } + for (let uvi = 0, l = uvs.length; uvi < l; uvi++) { + this.addUVLine(this.parseUVIndex(uvs[uvi], uvLen)); + } + }, "addLineGeometry") + }; + state.startObject("", false); + return state; +} +__name(ParserState, "ParserState"); +class OBJLoader extends Loader { + static { + __name(this, "OBJLoader"); } - - .maskEditor_sidePanel_colorSelect_tolerance_container { - display: flex; - flex-direction: column; - gap: 10px; - margin-bottom: 10px; + constructor(manager) { + super(manager); + this.materials = null; } - - .maskEditor_sidePanelContainerColumn { - display: flex; - flex-direction: column; - gap: 12px; + load(url, onLoad, onProgress, onError) { + const scope = this; + const loader = new FileLoader(this.manager); + loader.setPath(this.path); + loader.setRequestHeader(this.requestHeader); + loader.setWithCredentials(this.withCredentials); + loader.load(url, function(text) { + try { + onLoad(scope.parse(text)); + } catch (e) { + if (onError) { + onError(e); + } else { + console.error(e); + } + scope.manager.itemError(url); + } + }, onProgress, onError); } - - .maskEditor_sidePanelContainerRow { - display: flex; - flex-direction: row; - gap: 10px; - align-items: center; - min-height: 24px; - position: relative; + setMaterials(materials) { + this.materials = materials; + return this; } - - .maskEditor_accent_bg_dark { - background: var(--p-surface-800); + parse(text) { + const state = new ParserState(); + if (text.indexOf("\r\n") !== -1) { + text = text.replace(/\r\n/g, "\n"); + } + if (text.indexOf("\\\n") !== -1) { + text = text.replace(/\\\n/g, ""); + } + const lines = text.split("\n"); + let result = []; + for (let i = 0, l = lines.length; i < l; i++) { + const line = lines[i].trimStart(); + if (line.length === 0) continue; + const lineFirstChar = line.charAt(0); + if (lineFirstChar === "#") continue; + if (lineFirstChar === "v") { + const data = line.split(_face_vertex_data_separator_pattern); + switch (data[0]) { + case "v": + state.vertices.push( + parseFloat(data[1]), + parseFloat(data[2]), + parseFloat(data[3]) + ); + if (data.length >= 7) { + _color.setRGB( + parseFloat(data[4]), + parseFloat(data[5]), + parseFloat(data[6]), + SRGBColorSpace + ); + state.colors.push(_color.r, _color.g, _color.b); + } else { + state.colors.push(void 0, void 0, void 0); + } + break; + case "vn": + state.normals.push( + parseFloat(data[1]), + parseFloat(data[2]), + parseFloat(data[3]) + ); + break; + case "vt": + state.uvs.push( + parseFloat(data[1]), + parseFloat(data[2]) + ); + break; + } + } else if (lineFirstChar === "f") { + const lineData = line.slice(1).trim(); + const vertexData = lineData.split(_face_vertex_data_separator_pattern); + const faceVertices = []; + for (let j = 0, jl = vertexData.length; j < jl; j++) { + const vertex2 = vertexData[j]; + if (vertex2.length > 0) { + const vertexParts = vertex2.split("/"); + faceVertices.push(vertexParts); + } + } + const v1 = faceVertices[0]; + for (let j = 1, jl = faceVertices.length - 1; j < jl; j++) { + const v2 = faceVertices[j]; + const v3 = faceVertices[j + 1]; + state.addFace( + v1[0], + v2[0], + v3[0], + v1[1], + v2[1], + v3[1], + v1[2], + v2[2], + v3[2] + ); + } + } else if (lineFirstChar === "l") { + const lineParts = line.substring(1).trim().split(" "); + let lineVertices = []; + const lineUVs = []; + if (line.indexOf("/") === -1) { + lineVertices = lineParts; + } else { + for (let li = 0, llen = lineParts.length; li < llen; li++) { + const parts = lineParts[li].split("/"); + if (parts[0] !== "") lineVertices.push(parts[0]); + if (parts[1] !== "") lineUVs.push(parts[1]); + } + } + state.addLineGeometry(lineVertices, lineUVs); + } else if (lineFirstChar === "p") { + const lineData = line.slice(1).trim(); + const pointData = lineData.split(" "); + state.addPointGeometry(pointData); + } else if ((result = _object_pattern.exec(line)) !== null) { + const name = (" " + result[0].slice(1).trim()).slice(1); + state.startObject(name); + } else if (_material_use_pattern.test(line)) { + state.object.startMaterial(line.substring(7).trim(), state.materialLibraries); + } else if (_material_library_pattern.test(line)) { + state.materialLibraries.push(line.substring(7).trim()); + } else if (_map_use_pattern.test(line)) { + console.warn('THREE.OBJLoader: Rendering identifier "usemap" not supported. Textures must be defined in MTL files.'); + } else if (lineFirstChar === "s") { + result = line.split(" "); + if (result.length > 1) { + const value = result[1].trim().toLowerCase(); + state.object.smooth = value !== "0" && value !== "off"; + } else { + state.object.smooth = true; + } + const material = state.object.currentMaterial(); + if (material) material.smooth = state.object.smooth; + } else { + if (line === "\0") continue; + console.warn('THREE.OBJLoader: Unexpected line: "' + line + '"'); + } + } + state.finalize(); + const container = new Group(); + container.materialLibraries = [].concat(state.materialLibraries); + const hasPrimitives = !(state.objects.length === 1 && state.objects[0].geometry.vertices.length === 0); + if (hasPrimitives === true) { + for (let i = 0, l = state.objects.length; i < l; i++) { + const object = state.objects[i]; + const geometry = object.geometry; + const materials = object.materials; + const isLine = geometry.type === "Line"; + const isPoints = geometry.type === "Points"; + let hasVertexColors = false; + if (geometry.vertices.length === 0) continue; + const buffergeometry = new BufferGeometry(); + buffergeometry.setAttribute("position", new Float32BufferAttribute(geometry.vertices, 3)); + if (geometry.normals.length > 0) { + buffergeometry.setAttribute("normal", new Float32BufferAttribute(geometry.normals, 3)); + } + if (geometry.colors.length > 0) { + hasVertexColors = true; + buffergeometry.setAttribute("color", new Float32BufferAttribute(geometry.colors, 3)); + } + if (geometry.hasUVIndices === true) { + buffergeometry.setAttribute("uv", new Float32BufferAttribute(geometry.uvs, 2)); + } + const createdMaterials = []; + for (let mi = 0, miLen = materials.length; mi < miLen; mi++) { + const sourceMaterial = materials[mi]; + const materialHash = sourceMaterial.name + "_" + sourceMaterial.smooth + "_" + hasVertexColors; + let material = state.materials[materialHash]; + if (this.materials !== null) { + material = this.materials.create(sourceMaterial.name); + if (isLine && material && !(material instanceof LineBasicMaterial)) { + const materialLine = new LineBasicMaterial(); + Material.prototype.copy.call(materialLine, material); + materialLine.color.copy(material.color); + material = materialLine; + } else if (isPoints && material && !(material instanceof PointsMaterial)) { + const materialPoints = new PointsMaterial({ size: 10, sizeAttenuation: false }); + Material.prototype.copy.call(materialPoints, material); + materialPoints.color.copy(material.color); + materialPoints.map = material.map; + material = materialPoints; + } + } + if (material === void 0) { + if (isLine) { + material = new LineBasicMaterial(); + } else if (isPoints) { + material = new PointsMaterial({ size: 1, sizeAttenuation: false }); + } else { + material = new MeshPhongMaterial(); + } + material.name = sourceMaterial.name; + material.flatShading = sourceMaterial.smooth ? false : true; + material.vertexColors = hasVertexColors; + state.materials[materialHash] = material; + } + createdMaterials.push(material); + } + let mesh; + if (createdMaterials.length > 1) { + for (let mi = 0, miLen = materials.length; mi < miLen; mi++) { + const sourceMaterial = materials[mi]; + buffergeometry.addGroup(sourceMaterial.groupStart, sourceMaterial.groupCount, mi); + } + if (isLine) { + mesh = new LineSegments(buffergeometry, createdMaterials); + } else if (isPoints) { + mesh = new Points(buffergeometry, createdMaterials); + } else { + mesh = new Mesh(buffergeometry, createdMaterials); + } + } else { + if (isLine) { + mesh = new LineSegments(buffergeometry, createdMaterials[0]); + } else if (isPoints) { + mesh = new Points(buffergeometry, createdMaterials[0]); + } else { + mesh = new Mesh(buffergeometry, createdMaterials[0]); + } + } + mesh.name = object.name; + container.add(mesh); + } + } else { + if (state.vertices.length > 0) { + const material = new PointsMaterial({ size: 1, sizeAttenuation: false }); + const buffergeometry = new BufferGeometry(); + buffergeometry.setAttribute("position", new Float32BufferAttribute(state.vertices, 3)); + if (state.colors.length > 0 && state.colors[0] !== void 0) { + buffergeometry.setAttribute("color", new Float32BufferAttribute(state.colors, 3)); + material.vertexColors = true; + } + const points = new Points(buffergeometry, material); + container.add(points); + } + } + return container; } - - .maskEditor_accent_bg_very_dark { - background: var(--p-surface-900); +} +class MTLLoader extends Loader { + static { + __name(this, "MTLLoader"); } - - .maskEditor_accent_bg_light { - background: var(--p-surface-300); + constructor(manager) { + super(manager); } - - .maskEditor_accent_bg_very_light { - background: var(--comfy-menu-bg); + /** + * Loads and parses a MTL asset from a URL. + * + * @param {String} url - URL to the MTL file. + * @param {Function} [onLoad] - Callback invoked with the loaded object. + * @param {Function} [onProgress] - Callback for download progress. + * @param {Function} [onError] - Callback for download errors. + * + * @see setPath setResourcePath + * + * @note In order for relative texture references to resolve correctly + * you must call setResourcePath() explicitly prior to load. + */ + load(url, onLoad, onProgress, onError) { + const scope = this; + const path = this.path === "" ? LoaderUtils.extractUrlBase(url) : this.path; + const loader = new FileLoader(this.manager); + loader.setPath(this.path); + loader.setRequestHeader(this.requestHeader); + loader.setWithCredentials(this.withCredentials); + loader.load(url, function(text) { + try { + onLoad(scope.parse(text, path)); + } catch (e) { + if (onError) { + onError(e); + } else { + console.error(e); + } + scope.manager.itemError(url); + } + }, onProgress, onError); } - - #maskEditor_paintBucketSettings { - display: none; + setMaterialOptions(value) { + this.materialOptions = value; + return this; } - - #maskEditor_colorSelectSettings { - display: none; + /** + * Parses a MTL file. + * + * @param {String} text - Content of MTL file + * @return {MaterialCreator} + * + * @see setPath setResourcePath + * + * @note In order for relative texture references to resolve correctly + * you must call setResourcePath() explicitly prior to parse. + */ + parse(text, path) { + const lines = text.split("\n"); + let info = {}; + const delimiter_pattern = /\s+/; + const materialsInfo = {}; + for (let i = 0; i < lines.length; i++) { + let line = lines[i]; + line = line.trim(); + if (line.length === 0 || line.charAt(0) === "#") { + continue; + } + const pos = line.indexOf(" "); + let key = pos >= 0 ? line.substring(0, pos) : line; + key = key.toLowerCase(); + let value = pos >= 0 ? line.substring(pos + 1) : ""; + value = value.trim(); + if (key === "newmtl") { + info = { name: value }; + materialsInfo[value] = info; + } else { + if (key === "ka" || key === "kd" || key === "ks" || key === "ke") { + const ss = value.split(delimiter_pattern, 3); + info[key] = [parseFloat(ss[0]), parseFloat(ss[1]), parseFloat(ss[2])]; + } else { + info[key] = value; + } + } + } + const materialCreator = new MaterialCreator(this.resourcePath || path, this.materialOptions); + materialCreator.setCrossOrigin(this.crossOrigin); + materialCreator.setManager(this.manager); + materialCreator.setMaterials(materialsInfo); + return materialCreator; } - - .maskEditor_sidePanelToggleContainer { - cursor: pointer; - display: inline-block; - position: absolute; - right: 0; +} +class MaterialCreator { + static { + __name(this, "MaterialCreator"); } - - .maskEditor_toggle_bg_dark { - background: var(--p-surface-700); + constructor(baseUrl = "", options = {}) { + this.baseUrl = baseUrl; + this.options = options; + this.materialsInfo = {}; + this.materials = {}; + this.materialsArray = []; + this.nameLookup = {}; + this.crossOrigin = "anonymous"; + this.side = this.options.side !== void 0 ? this.options.side : FrontSide; + this.wrap = this.options.wrap !== void 0 ? this.options.wrap : RepeatWrapping; } - - .maskEditor_toggle_bg_light { - background: var(--p-surface-300); + setCrossOrigin(value) { + this.crossOrigin = value; + return this; } - - .maskEditor_sidePanelToggleSwitch { - display: inline-block; - border-radius: 16px; - width: 40px; - height: 24px; - position: relative; - vertical-align: middle; - transition: background 0.25s; + setManager(value) { + this.manager = value; } - .maskEditor_sidePanelToggleSwitch:before, .maskEditor_sidePanelToggleSwitch:after { - content: ""; + setMaterials(materialsInfo) { + this.materialsInfo = this.convert(materialsInfo); + this.materials = {}; + this.materialsArray = []; + this.nameLookup = {}; } - .maskEditor_sidePanelToggleSwitch:before { - display: block; - background: linear-gradient(to bottom, #fff 0%, #eee 100%); - border-radius: 50%; - width: 16px; - height: 16px; - position: absolute; - top: 4px; - left: 4px; - transition: ease 0.2s; + convert(materialsInfo) { + if (!this.options) return materialsInfo; + const converted = {}; + for (const mn in materialsInfo) { + const mat = materialsInfo[mn]; + const covmat = {}; + converted[mn] = covmat; + for (const prop in mat) { + let save = true; + let value = mat[prop]; + const lprop = prop.toLowerCase(); + switch (lprop) { + case "kd": + case "ka": + case "ks": + if (this.options && this.options.normalizeRGB) { + value = [value[0] / 255, value[1] / 255, value[2] / 255]; + } + if (this.options && this.options.ignoreZeroRGBs) { + if (value[0] === 0 && value[1] === 0 && value[2] === 0) { + save = false; + } + } + break; + default: + break; + } + if (save) { + covmat[lprop] = value; + } + } + } + return converted; } - .maskEditor_sidePanelToggleContainer:hover .maskEditor_sidePanelToggleSwitch:before { - background: linear-gradient(to bottom, #fff 0%, #fff 100%); + preload() { + for (const mn in this.materialsInfo) { + this.create(mn); + } } - .maskEditor_sidePanelToggleCheckbox:checked + .maskEditor_sidePanelToggleSwitch { - background: var(--p-button-text-primary-color); + getIndex(materialName) { + return this.nameLookup[materialName]; } - .maskEditor_sidePanelToggleCheckbox:checked + .maskEditor_toggle_bg_dark:before { - background: var(--p-surface-900); + getAsArray() { + let index = 0; + for (const mn in this.materialsInfo) { + this.materialsArray[index] = this.create(mn); + this.nameLookup[mn] = index; + index++; + } + return this.materialsArray; } - .maskEditor_sidePanelToggleCheckbox:checked + .maskEditor_toggle_bg_light:before { - background: var(--comfy-menu-bg); + create(materialName) { + if (this.materials[materialName] === void 0) { + this.createMaterial_(materialName); + } + return this.materials[materialName]; } - .maskEditor_sidePanelToggleCheckbox:checked + .maskEditor_sidePanelToggleSwitch:before { - left: 20px; + createMaterial_(materialName) { + const scope = this; + const mat = this.materialsInfo[materialName]; + const params = { + name: materialName, + side: this.side + }; + function resolveURL(baseUrl, url) { + if (typeof url !== "string" || url === "") + return ""; + if (/^https?:\/\//i.test(url)) return url; + return baseUrl + url; + } + __name(resolveURL, "resolveURL"); + function setMapForType(mapType, value) { + if (params[mapType]) return; + const texParams = scope.getTextureParams(value, params); + const map = scope.loadTexture(resolveURL(scope.baseUrl, texParams.url)); + map.repeat.copy(texParams.scale); + map.offset.copy(texParams.offset); + map.wrapS = scope.wrap; + map.wrapT = scope.wrap; + if (mapType === "map" || mapType === "emissiveMap") { + map.colorSpace = SRGBColorSpace; + } + params[mapType] = map; + } + __name(setMapForType, "setMapForType"); + for (const prop in mat) { + const value = mat[prop]; + let n; + if (value === "") continue; + switch (prop.toLowerCase()) { + case "kd": + params.color = ColorManagement.toWorkingColorSpace(new Color().fromArray(value), SRGBColorSpace); + break; + case "ks": + params.specular = ColorManagement.toWorkingColorSpace(new Color().fromArray(value), SRGBColorSpace); + break; + case "ke": + params.emissive = ColorManagement.toWorkingColorSpace(new Color().fromArray(value), SRGBColorSpace); + break; + case "map_kd": + setMapForType("map", value); + break; + case "map_ks": + setMapForType("specularMap", value); + break; + case "map_ke": + setMapForType("emissiveMap", value); + break; + case "norm": + setMapForType("normalMap", value); + break; + case "map_bump": + case "bump": + setMapForType("bumpMap", value); + break; + case "map_d": + setMapForType("alphaMap", value); + params.transparent = true; + break; + case "ns": + params.shininess = parseFloat(value); + break; + case "d": + n = parseFloat(value); + if (n < 1) { + params.opacity = n; + params.transparent = true; + } + break; + case "tr": + n = parseFloat(value); + if (this.options && this.options.invertTrProperty) n = 1 - n; + if (n > 0) { + params.opacity = 1 - n; + params.transparent = true; + } + break; + default: + break; + } + } + this.materials[materialName] = new MeshPhongMaterial(params); + return this.materials[materialName]; } - - .maskEditor_sidePanelToggleCheckbox { - position: absolute; - visibility: hidden; + getTextureParams(value, matParams) { + const texParams = { + scale: new Vector2(1, 1), + offset: new Vector2(0, 0) + }; + const items = value.split(/\s+/); + let pos; + pos = items.indexOf("-bm"); + if (pos >= 0) { + matParams.bumpScale = parseFloat(items[pos + 1]); + items.splice(pos, 2); + } + pos = items.indexOf("-s"); + if (pos >= 0) { + texParams.scale.set(parseFloat(items[pos + 1]), parseFloat(items[pos + 2])); + items.splice(pos, 4); + } + pos = items.indexOf("-o"); + if (pos >= 0) { + texParams.offset.set(parseFloat(items[pos + 1]), parseFloat(items[pos + 2])); + items.splice(pos, 4); + } + texParams.url = items.join(" ").trim(); + return texParams; } - - .maskEditor_sidePanelDropdown_dark { - border: 1px solid var(--p-form-field-border-color); - background: var(--p-surface-900); - height: 24px; - padding-left: 5px; - padding-right: 5px; - border-radius: 6px; - transition: background 0.1s; + loadTexture(url, mapping, onLoad, onProgress, onError) { + const manager = this.manager !== void 0 ? this.manager : DefaultLoadingManager; + let loader = manager.getHandler(url); + if (loader === null) { + loader = new TextureLoader(manager); + } + if (loader.setCrossOrigin) loader.setCrossOrigin(this.crossOrigin); + const texture = loader.load(url, onLoad, onProgress, onError); + if (mapping !== void 0) texture.mapping = mapping; + return texture; } - - .maskEditor_sidePanelDropdown_dark option { - background: var(--p-surface-900); +} +/*! +fflate - fast JavaScript compression/decompression + +Licensed under MIT. https://github.com/101arrowz/fflate/blob/master/LICENSE +version 0.8.2 +*/ +var ch2 = {}; +var wk = /* @__PURE__ */ __name(function(c, id2, msg, transfer, cb) { + var w = new Worker(ch2[id2] || (ch2[id2] = URL.createObjectURL(new Blob([ + c + ';addEventListener("error",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})' + ], { type: "text/javascript" })))); + w.onmessage = function(e) { + var d = e.data, ed = d.$e$; + if (ed) { + var err2 = new Error(ed[0]); + err2["code"] = ed[1]; + err2.stack = ed[2]; + cb(err2, null); + } else + cb(null, d); + }; + w.postMessage(msg, transfer); + return w; +}, "wk"); +var u8 = Uint8Array, u16 = Uint16Array, i32 = Int32Array; +var 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 +]); +var 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 +]); +var clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]); +var freb = /* @__PURE__ */ __name(function(eb, start) { + var b = new u16(31); + for (var i = 0; i < 31; ++i) { + b[i] = start += 1 << eb[i - 1]; } - - .maskEditor_sidePanelDropdown_dark:focus { - outline: 1px solid var(--p-button-text-primary-color); + var r = new i32(b[30]); + for (var i = 1; i < 30; ++i) { + for (var j = b[i]; j < b[i + 1]; ++j) { + r[j] = j - b[i] << 5 | i; + } } - - .maskEditor_sidePanelDropdown_dark option:hover { - background: white; + return { b, r }; +}, "freb"); +var _a = freb(fleb, 2), fl = _a.b, revfl = _a.r; +fl[28] = 258, revfl[258] = 28; +var _b = freb(fdeb, 0), fd = _b.b, revfd = _b.r; +var rev = new u16(32768); +for (var i = 0; i < 32768; ++i) { + var x = (i & 43690) >> 1 | (i & 21845) << 1; + x = (x & 52428) >> 2 | (x & 13107) << 2; + x = (x & 61680) >> 4 | (x & 3855) << 4; + rev[i] = ((x & 65280) >> 8 | (x & 255) << 8) >> 1; +} +var hMap = /* @__PURE__ */ __name(function(cd, mb, r) { + var s = cd.length; + var i = 0; + var l = new u16(mb); + for (; i < s; ++i) { + if (cd[i]) + ++l[cd[i] - 1]; } - .maskEditor_sidePanelDropdown_dark option:active { - background: var(--p-highlight-background); + var le = new u16(mb); + for (i = 1; i < mb; ++i) { + le[i] = le[i - 1] + l[i - 1] << 1; } - - .maskEditor_sidePanelDropdown_light { - border: 1px solid var(--p-form-field-border-color); - background: var(--comfy-menu-bg); - height: 24px; - padding-left: 5px; - padding-right: 5px; - border-radius: 6px; - transition: background 0.1s; + var co; + if (r) { + co = new u16(1 << mb); + var rvb = 15 - mb; + for (i = 0; i < s; ++i) { + if (cd[i]) { + var sv = i << 4 | cd[i]; + var r_1 = mb - cd[i]; + var v = le[cd[i] - 1]++ << r_1; + for (var m = v | (1 << r_1) - 1; v <= m; ++v) { + co[rev[v] >> rvb] = sv; + } + } + } + } else { + co = new u16(s); + for (i = 0; i < s; ++i) { + if (cd[i]) { + co[i] = rev[le[cd[i] - 1]++] >> 15 - cd[i]; + } + } } - - .maskEditor_sidePanelDropdown_light option { - background: var(--comfy-menu-bg); + return co; +}, "hMap"); +var flt = new u8(288); +for (var i = 0; i < 144; ++i) + flt[i] = 8; +for (var i = 144; i < 256; ++i) + flt[i] = 9; +for (var i = 256; i < 280; ++i) + flt[i] = 7; +for (var i = 280; i < 288; ++i) + flt[i] = 8; +var fdt = new u8(32); +for (var i = 0; i < 32; ++i) + fdt[i] = 5; +var flm = /* @__PURE__ */ hMap(flt, 9, 0), flrm = /* @__PURE__ */ hMap(flt, 9, 1); +var fdm = /* @__PURE__ */ hMap(fdt, 5, 0), fdrm = /* @__PURE__ */ hMap(fdt, 5, 1); +var max = /* @__PURE__ */ __name(function(a) { + var m = a[0]; + for (var i = 1; i < a.length; ++i) { + if (a[i] > m) + m = a[i]; } - - .maskEditor_sidePanelDropdown_light:focus { - outline: 1px solid var(--p-surface-300); + return m; +}, "max"); +var bits = /* @__PURE__ */ __name(function(d, p, m) { + var o = p / 8 | 0; + return (d[o] | d[o + 1] << 8) >> (p & 7) & m; +}, "bits"); +var bits16 = /* @__PURE__ */ __name(function(d, p) { + var o = p / 8 | 0; + return (d[o] | d[o + 1] << 8 | d[o + 2] << 16) >> (p & 7); +}, "bits16"); +var shft = /* @__PURE__ */ __name(function(p) { + return (p + 7) / 8 | 0; +}, "shft"); +var slc = /* @__PURE__ */ __name(function(v, s, e) { + if (s == null || s < 0) + s = 0; + if (e == null || e > v.length) + e = v.length; + return new u8(v.subarray(s, e)); +}, "slc"); +var FlateErrorCode = { + UnexpectedEOF: 0, + InvalidBlockType: 1, + InvalidLengthLiteral: 2, + InvalidDistance: 3, + StreamFinished: 4, + NoStreamHandler: 5, + InvalidHeader: 6, + NoCallback: 7, + InvalidUTF8: 8, + ExtraFieldTooLong: 9, + InvalidDate: 10, + FilenameTooLong: 11, + StreamFinishing: 12, + InvalidZipData: 13, + UnknownCompressionMethod: 14 +}; +var ec = [ + "unexpected EOF", + "invalid block type", + "invalid length/literal", + "invalid distance", + "stream finished", + "no stream handler", + , + "no callback", + "invalid UTF-8 data", + "extra field too long", + "date not in range 1980-2099", + "filename too long", + "stream finishing", + "invalid zip data" + // determined by unknown compression method +]; +; +var err = /* @__PURE__ */ __name(function(ind, msg, nt) { + var e = new Error(msg || ec[ind]); + e.code = ind; + if (Error.captureStackTrace) + Error.captureStackTrace(e, err); + if (!nt) + throw e; + return e; +}, "err"); +var inflt = /* @__PURE__ */ __name(function(dat, st, buf, dict) { + var sl = dat.length, dl = dict ? dict.length : 0; + if (!sl || st.f && !st.l) + return buf || new u8(0); + var noBuf = !buf; + var resize = noBuf || st.i != 2; + var noSt = st.i; + if (noBuf) + buf = new u8(sl * 3); + var cbuf = /* @__PURE__ */ __name(function(l2) { + var bl = buf.length; + if (l2 > bl) { + var nbuf = new u8(Math.max(bl * 2, l2)); + nbuf.set(buf); + buf = nbuf; + } + }, "cbuf"); + 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; + var tbts = sl * 8; + do { + if (!lm) { + final = bits(dat, pos, 1); + var type = bits(dat, pos + 1, 3); + pos += 3; + if (!type) { + var s = shft(pos) + 4, l = dat[s - 4] | dat[s - 3] << 8, t2 = s + l; + if (t2 > sl) { + if (noSt) + err(0); + break; + } + if (resize) + cbuf(bt + l); + buf.set(dat.subarray(s, t2), bt); + st.b = bt += l, st.p = pos = t2 * 8, st.f = final; + continue; + } else if (type == 1) + lm = flrm, dm = fdrm, lbt = 9, dbt = 5; + else if (type == 2) { + var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4; + var tl = hLit + bits(dat, pos + 5, 31) + 1; + pos += 14; + var ldt = new u8(tl); + var clt = new u8(19); + for (var i = 0; i < hcLen; ++i) { + clt[clim[i]] = bits(dat, pos + i * 3, 7); + } + pos += hcLen * 3; + var clb = max(clt), clbmsk = (1 << clb) - 1; + var clm = hMap(clt, clb, 1); + for (var i = 0; i < tl; ) { + var r = clm[bits(dat, pos, clbmsk)]; + pos += r & 15; + var s = r >> 4; + if (s < 16) { + ldt[i++] = s; + } else { + var c = 0, n = 0; + if (s == 16) + n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1]; + else if (s == 17) + n = 3 + bits(dat, pos, 7), pos += 3; + else if (s == 18) + n = 11 + bits(dat, pos, 127), pos += 7; + while (n--) + ldt[i++] = c; + } + } + var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit); + lbt = max(lt); + dbt = max(dt); + lm = hMap(lt, lbt, 1); + dm = hMap(dt, dbt, 1); + } else + err(1); + if (pos > tbts) { + if (noSt) + err(0); + break; + } + } + if (resize) + cbuf(bt + 131072); + var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1; + var lpos = pos; + for (; ; lpos = pos) { + var c = lm[bits16(dat, pos) & lms], sym = c >> 4; + pos += c & 15; + if (pos > tbts) { + if (noSt) + err(0); + break; + } + if (!c) + err(2); + if (sym < 256) + buf[bt++] = sym; + else if (sym == 256) { + lpos = pos, lm = null; + break; + } else { + var add = sym - 254; + if (sym > 264) { + var i = sym - 257, b = fleb[i]; + add = bits(dat, pos, (1 << b) - 1) + fl[i]; + pos += b; + } + var d = dm[bits16(dat, pos) & dms], dsym = d >> 4; + if (!d) + err(3); + pos += d & 15; + var dt = fd[dsym]; + if (dsym > 3) { + var b = fdeb[dsym]; + dt += bits16(dat, pos) & (1 << b) - 1, pos += b; + } + if (pos > tbts) { + if (noSt) + err(0); + break; + } + if (resize) + cbuf(bt + 131072); + var end = bt + add; + if (bt < dt) { + var shift = dl - dt, dend = Math.min(dt, end); + if (shift + bt < 0) + err(3); + for (; bt < dend; ++bt) + buf[bt] = dict[shift + bt]; + } + for (; bt < end; ++bt) + buf[bt] = buf[bt - dt]; + } + } + st.l = lm, st.p = lpos, st.b = bt, st.f = final; + if (lm) + final = 1, st.m = lbt, st.d = dm, st.n = dbt; + } while (!final); + return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt); +}, "inflt"); +var wbits = /* @__PURE__ */ __name(function(d, p, v) { + v <<= p & 7; + var o = p / 8 | 0; + d[o] |= v; + d[o + 1] |= v >> 8; +}, "wbits"); +var wbits16 = /* @__PURE__ */ __name(function(d, p, v) { + v <<= p & 7; + var o = p / 8 | 0; + d[o] |= v; + d[o + 1] |= v >> 8; + d[o + 2] |= v >> 16; +}, "wbits16"); +var hTree = /* @__PURE__ */ __name(function(d, mb) { + var t2 = []; + for (var i = 0; i < d.length; ++i) { + if (d[i]) + t2.push({ s: i, f: d[i] }); } - - .maskEditor_sidePanelDropdown_light option:hover { - background: white; + var s = t2.length; + var t22 = t2.slice(); + if (!s) + return { t: et, l: 0 }; + if (s == 1) { + var v = new u8(t2[0].s + 1); + v[t2[0].s] = 1; + return { t: v, l: 1 }; } - .maskEditor_sidePanelDropdown_light option:active { - background: var(--p-surface-300); + t2.sort(function(a, b) { + return a.f - b.f; + }); + t2.push({ s: -1, f: 25001 }); + var l = t2[0], r = t2[1], i0 = 0, i1 = 1, i2 = 2; + t2[0] = { s: -1, f: l.f + r.f, l, r }; + while (i1 != s - 1) { + l = t2[t2[i0].f < t2[i2].f ? i0++ : i2++]; + r = t2[i0 != i1 && t2[i0].f < t2[i2].f ? i0++ : i2++]; + t2[i1++] = { s: -1, f: l.f + r.f, l, r }; } - - .maskEditor_layerRow { - height: 50px; - width: 200px; - border-radius: 10px; + var maxSym = t22[0].s; + for (var i = 1; i < s; ++i) { + if (t22[i].s > maxSym) + maxSym = t22[i].s; } - - .maskEditor_sidePanelLayerPreviewContainer { - width: 40px; - height: 30px; + var tr = new u16(maxSym + 1); + var mbt = ln(t2[i1 - 1], tr, 0); + if (mbt > mb) { + var i = 0, dt = 0; + var lft = mbt - mb, cst = 1 << lft; + t22.sort(function(a, b) { + return tr[b.s] - tr[a.s] || a.f - b.f; + }); + for (; i < s; ++i) { + var i2_1 = t22[i].s; + if (tr[i2_1] > mb) { + dt += cst - (1 << mbt - tr[i2_1]); + tr[i2_1] = mb; + } else + break; + } + dt >>= lft; + while (dt > 0) { + var i2_2 = t22[i].s; + if (tr[i2_2] < mb) + dt -= 1 << mb - tr[i2_2]++ - 1; + else + ++i; + } + for (; i >= 0 && dt; --i) { + var i2_3 = t22[i].s; + if (tr[i2_3] == mb) { + --tr[i2_3]; + ++dt; + } + } + mbt = mb; } - - .maskEditor_sidePanelLayerPreviewContainer > svg{ - width: 100%; - height: 100%; - object-fit: contain; - fill: var(--p-surface-100); + return { t: new u8(tr), l: mbt }; +}, "hTree"); +var ln = /* @__PURE__ */ __name(function(n, l, d) { + return n.s == -1 ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1)) : l[n.s] = d; +}, "ln"); +var lc = /* @__PURE__ */ __name(function(c) { + var s = c.length; + while (s && !c[--s]) + ; + var cl = new u16(++s); + var cli = 0, cln = c[0], cls = 1; + var w = /* @__PURE__ */ __name(function(v) { + cl[cli++] = v; + }, "w"); + for (var i = 1; i <= s; ++i) { + if (c[i] == cln && i != s) + ++cls; + else { + if (!cln && cls > 2) { + for (; cls > 138; cls -= 138) + w(32754); + if (cls > 2) { + w(cls > 10 ? cls - 11 << 5 | 28690 : cls - 3 << 5 | 12305); + cls = 0; + } + } else if (cls > 3) { + w(cln), --cls; + for (; cls > 6; cls -= 6) + w(8304); + if (cls > 2) + w(cls - 3 << 5 | 8208), cls = 0; + } + while (cls--) + w(cln); + cls = 1; + cln = c[i]; + } } - - #maskEditor_sidePanelImageLayerImage { - width: 100%; - height: 100%; - object-fit: contain; + return { c: cl.subarray(0, cli), n: s }; +}, "lc"); +var clen = /* @__PURE__ */ __name(function(cf, cl) { + var l = 0; + for (var i = 0; i < cl.length; ++i) + l += cf[i] * cl[i]; + return l; +}, "clen"); +var wfblk = /* @__PURE__ */ __name(function(out, pos, dat) { + var s = dat.length; + var o = shft(pos + 2); + out[o] = s & 255; + out[o + 1] = s >> 8; + out[o + 2] = out[o] ^ 255; + out[o + 3] = out[o + 1] ^ 255; + for (var i = 0; i < s; ++i) + out[o + i + 4] = dat[i]; + return (o + 4 + s) * 8; +}, "wfblk"); +var wblk = /* @__PURE__ */ __name(function(dat, out, final, syms, lf, df, eb, li, bs, bl, p) { + wbits(out, p++, final); + ++lf[256]; + var _a2 = hTree(lf, 15), dlt = _a2.t, mlb = _a2.l; + var _b2 = hTree(df, 15), ddt = _b2.t, mdb = _b2.l; + var _c = lc(dlt), lclt = _c.c, nlc = _c.n; + var _d = lc(ddt), lcdt = _d.c, ndc = _d.n; + var lcfreq = new u16(19); + for (var i = 0; i < lclt.length; ++i) + ++lcfreq[lclt[i] & 31]; + for (var i = 0; i < lcdt.length; ++i) + ++lcfreq[lcdt[i] & 31]; + var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l; + var nlcc = 19; + for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc) + ; + var flen = bl + 5 << 3; + var ftlen = clen(lf, flt) + clen(df, fdt) + eb; + var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18]; + if (bs >= 0 && flen <= ftlen && flen <= dtlen) + return wfblk(out, p, dat.subarray(bs, bs + bl)); + var lm, ll, dm, dl; + wbits(out, p, 1 + (dtlen < ftlen)), p += 2; + if (dtlen < ftlen) { + lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt; + var llm = hMap(lct, mlcb, 0); + wbits(out, p, nlc - 257); + wbits(out, p + 5, ndc - 1); + wbits(out, p + 10, nlcc - 4); + p += 14; + for (var i = 0; i < nlcc; ++i) + wbits(out, p + 3 * i, lct[clim[i]]); + p += 3 * nlcc; + var lcts = [lclt, lcdt]; + for (var it = 0; it < 2; ++it) { + var clct = lcts[it]; + for (var i = 0; i < clct.length; ++i) { + var len = clct[i] & 31; + wbits(out, p, llm[len]), p += lct[len]; + if (len > 15) + wbits(out, p, clct[i] >> 5 & 127), p += clct[i] >> 12; + } + } + } else { + lm = flm, ll = flt, dm = fdm, dl = fdt; } - - .maskEditor_sidePanelSubTitle { - text-align: left; - font-size: 12px; - font-family: sans-serif; - color: var(--descrip-text); + for (var i = 0; i < li; ++i) { + var sym = syms[i]; + if (sym > 255) { + var len = sym >> 18 & 31; + wbits16(out, p, lm[len + 257]), p += ll[len + 257]; + if (len > 7) + wbits(out, p, sym >> 23 & 31), p += fleb[len]; + var dst = sym & 31; + wbits16(out, p, dm[dst]), p += dl[dst]; + if (dst > 3) + wbits16(out, p, sym >> 5 & 8191), p += fdeb[dst]; + } else { + wbits16(out, p, lm[sym]), p += ll[sym]; + } } - - .maskEditor_containerDropdown { - position: absolute; - right: 0; + wbits16(out, p, lm[256]); + return p + ll[256]; +}, "wblk"); +var deo = /* @__PURE__ */ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]); +var et = /* @__PURE__ */ new u8(0); +var dflt = /* @__PURE__ */ __name(function(dat, lvl, plvl, pre, post, st) { + var s = st.z || dat.length; + var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7e3)) + post); + var w = o.subarray(pre, o.length - post); + var lst = st.l; + var pos = (st.r || 0) & 7; + if (lvl) { + if (pos) + w[0] = st.r >> 3; + var opt = deo[lvl - 1]; + var n = opt >> 13, c = opt & 8191; + var msk_1 = (1 << plvl) - 1; + var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1); + var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1; + var hsh = /* @__PURE__ */ __name(function(i2) { + return (dat[i2] ^ dat[i2 + 1] << bs1_1 ^ dat[i2 + 2] << bs2_1) & msk_1; + }, "hsh"); + var syms = new i32(25e3); + var lf = new u16(288), df = new u16(32); + var lc_1 = 0, eb = 0, i = st.i || 0, li = 0, wi = st.w || 0, bs = 0; + for (; i + 2 < s; ++i) { + var hv = hsh(i); + var imod = i & 32767, pimod = head[hv]; + prev[imod] = pimod; + head[hv] = imod; + if (wi <= i) { + var rem = s - i; + if ((lc_1 > 7e3 || li > 24576) && (rem > 423 || !lst)) { + pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos); + li = lc_1 = eb = 0, bs = i; + for (var j = 0; j < 286; ++j) + lf[j] = 0; + for (var j = 0; j < 30; ++j) + df[j] = 0; + } + var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767; + if (rem > 2 && hv == hsh(i - dif)) { + var maxn = Math.min(n, rem) - 1; + var maxd = Math.min(32767, i); + var ml = Math.min(258, rem); + while (dif <= maxd && --ch_1 && imod != pimod) { + if (dat[i + l] == dat[i + l - dif]) { + var nl = 0; + for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl) + ; + if (nl > l) { + l = nl, d = dif; + if (nl > maxn) + break; + var mmd = Math.min(dif, nl - 2); + var md = 0; + for (var j = 0; j < mmd; ++j) { + var ti = i - dif + j & 32767; + var pti = prev[ti]; + var cd = ti - pti & 32767; + if (cd > md) + md = cd, pimod = ti; + } + } + } + imod = pimod, pimod = prev[imod]; + dif += imod - pimod & 32767; + } + } + if (d) { + syms[li++] = 268435456 | revfl[l] << 18 | revfd[d]; + var lin = revfl[l] & 31, din = revfd[d] & 31; + eb += fleb[lin] + fdeb[din]; + ++lf[257 + lin]; + ++df[din]; + wi = i + l; + ++lc_1; + } else { + syms[li++] = dat[i]; + ++lf[dat[i]]; + } + } + } + for (i = Math.max(i, wi); i < s; ++i) { + syms[li++] = dat[i]; + ++lf[dat[i]]; + } + pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos); + if (!lst) { + st.r = pos & 7 | w[pos / 8 | 0] << 3; + pos -= 7; + st.h = head, st.p = prev, st.i = i, st.w = wi; + } + } else { + for (var i = st.w || 0; i < s + lst; i += 65535) { + var e = i + 65535; + if (e >= s) { + w[pos / 8 | 0] = lst; + e = s; + } + pos = wfblk(w, pos + 1, dat.subarray(i, e)); + } + st.i = s; } - - .maskEditor_sidePanelLayerCheckbox { - margin-left: 15px; + return slc(o, 0, pre + shft(pos) + post); +}, "dflt"); +var crct = /* @__PURE__ */ function() { + var t2 = new Int32Array(256); + for (var i = 0; i < 256; ++i) { + var c = i, k = 9; + while (--k) + c = (c & 1 && -306674912) ^ c >>> 1; + t2[i] = c; } - - .maskEditor_toolPanelZoomIndicator { - width: var(--sidebar-width); - height: var(--sidebar-width); - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - gap: 5px; - color: var(--p-button-text-secondary-color); - position: absolute; - bottom: 0; - transition: background-color 0.2s; + return t2; +}(); +var crc = /* @__PURE__ */ __name(function() { + var c = -1; + return { + p: /* @__PURE__ */ __name(function(d) { + var cr = c; + for (var i = 0; i < d.length; ++i) + cr = crct[cr & 255 ^ d[i]] ^ cr >>> 8; + c = cr; + }, "p"), + d: /* @__PURE__ */ __name(function() { + return ~c; + }, "d") + }; +}, "crc"); +var adler = /* @__PURE__ */ __name(function() { + var a = 1, b = 0; + return { + p: /* @__PURE__ */ __name(function(d) { + var n = a, m = b; + var l = d.length | 0; + for (var i = 0; i != l; ) { + var e = Math.min(i + 2655, l); + for (; i < e; ++i) + m += n += d[i]; + n = (n & 65535) + 15 * (n >> 16), m = (m & 65535) + 15 * (m >> 16); + } + a = n, b = m; + }, "p"), + d: /* @__PURE__ */ __name(function() { + a %= 65521, b %= 65521; + return (a & 255) << 24 | (a & 65280) << 8 | (b & 255) << 8 | b >> 8; + }, "d") + }; +}, "adler"); +; +var dopt = /* @__PURE__ */ __name(function(dat, opt, pre, post, st) { + if (!st) { + st = { l: 1 }; + if (opt.dictionary) { + var dict = opt.dictionary.subarray(-32768); + var newDat = new u8(dict.length + dat.length); + newDat.set(dict); + newDat.set(dat, dict.length); + dat = newDat; + st.w = dict.length; + } } - - #maskEditor_toolPanelDimensionsText { - font-size: 12px; + 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); +}, "dopt"); +var mrg = /* @__PURE__ */ __name(function(a, b) { + var o = {}; + for (var k in a) + o[k] = a[k]; + for (var k in b) + o[k] = b[k]; + return o; +}, "mrg"); +var wcln = /* @__PURE__ */ __name(function(fn, fnStr, td2) { + var dt = fn(); + var st = fn.toString(); + var ks = st.slice(st.indexOf("[") + 1, st.lastIndexOf("]")).replace(/\s+/g, "").split(","); + for (var i = 0; i < dt.length; ++i) { + var v = dt[i], k = ks[i]; + if (typeof v == "function") { + fnStr += ";" + k + "="; + var st_1 = v.toString(); + if (v.prototype) { + if (st_1.indexOf("[native code]") != -1) { + var spInd = st_1.indexOf(" ", 8) + 1; + fnStr += st_1.slice(spInd, st_1.indexOf("(", spInd)); + } else { + fnStr += st_1; + for (var t2 in v.prototype) + fnStr += ";" + k + ".prototype." + t2 + "=" + v.prototype[t2].toString(); + } + } else + fnStr += st_1; + } else + td2[k] = v; } - - #maskEditor_topBarSaveButton { - background: var(--p-primary-color) !important; - color: var(--p-button-primary-color) !important; + return fnStr; +}, "wcln"); +var ch = []; +var cbfs = /* @__PURE__ */ __name(function(v) { + var tl = []; + for (var k in v) { + if (v[k].buffer) { + tl.push((v[k] = new v[k].constructor(v[k])).buffer); + } } - - #maskEditor_topBarSaveButton:hover { - background: var(--p-primary-hover-color) !important; + return tl; +}, "cbfs"); +var wrkr = /* @__PURE__ */ __name(function(fns, init, id2, cb) { + if (!ch[id2]) { + var fnStr = "", td_1 = {}, m = fns.length - 1; + for (var i = 0; i < m; ++i) + fnStr = wcln(fns[i], fnStr, td_1); + ch[id2] = { c: wcln(fns[m], fnStr, td_1), e: td_1 }; } - -`; -var styleSheet = document.createElement("style"); -styleSheet.type = "text/css"; -styleSheet.innerText = styles; -document.head.appendChild(styleSheet); -var BrushShape = /* @__PURE__ */ ((BrushShape2) => { - BrushShape2["Arc"] = "arc"; - BrushShape2["Rect"] = "rect"; - return BrushShape2; -})(BrushShape || {}); -var Tools = /* @__PURE__ */ ((Tools2) => { - Tools2["Pen"] = "pen"; - Tools2["Eraser"] = "eraser"; - Tools2["PaintBucket"] = "paintBucket"; - Tools2["ColorSelect"] = "colorSelect"; - return Tools2; -})(Tools || {}); -var CompositionOperation = /* @__PURE__ */ ((CompositionOperation2) => { - CompositionOperation2["SourceOver"] = "source-over"; - CompositionOperation2["DestinationOut"] = "destination-out"; - return CompositionOperation2; -})(CompositionOperation || {}); -var MaskBlendMode = /* @__PURE__ */ ((MaskBlendMode2) => { - MaskBlendMode2["Black"] = "black"; - MaskBlendMode2["White"] = "white"; - MaskBlendMode2["Negative"] = "negative"; - return MaskBlendMode2; -})(MaskBlendMode || {}); -var ColorComparisonMethod = /* @__PURE__ */ ((ColorComparisonMethod2) => { - ColorComparisonMethod2["Simple"] = "simple"; - ColorComparisonMethod2["HSL"] = "hsl"; - ColorComparisonMethod2["LAB"] = "lab"; - return ColorComparisonMethod2; -})(ColorComparisonMethod || {}); -class MaskEditorDialog extends ComfyDialog { - static { - __name(this, "MaskEditorDialog"); + var td2 = mrg({}, ch[id2].e); + return wk(ch[id2].c + ";onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=" + init.toString() + "}", id2, td2, cbfs(td2), cb); +}, "wrkr"); +var bInflt = /* @__PURE__ */ __name(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]; +}, "bInflt"); +var bDflt = /* @__PURE__ */ __name(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]; +}, "bDflt"); +var gze = /* @__PURE__ */ __name(function() { + return [gzh, gzhl, wbytes, crc, crct]; +}, "gze"); +var guze = /* @__PURE__ */ __name(function() { + return [gzs, gzl]; +}, "guze"); +var zle = /* @__PURE__ */ __name(function() { + return [zlh, wbytes, adler]; +}, "zle"); +var zule = /* @__PURE__ */ __name(function() { + return [zls]; +}, "zule"); +var pbf = /* @__PURE__ */ __name(function(msg) { + return postMessage(msg, [msg.buffer]); +}, "pbf"); +var gopt = /* @__PURE__ */ __name(function(o) { + return o && { + out: o.size && new u8(o.size), + dictionary: o.dictionary + }; +}, "gopt"); +var cbify = /* @__PURE__ */ __name(function(dat, opts, fns, init, id2, cb) { + var w = wrkr(fns, init, id2, function(err2, dat2) { + w.terminate(); + cb(err2, dat2); + }); + w.postMessage([dat, opts], opts.consume ? [dat.buffer] : []); + return function() { + w.terminate(); + }; +}, "cbify"); +var astrm = /* @__PURE__ */ __name(function(strm) { + strm.ondata = function(dat, final) { + return postMessage([dat, final], [dat.buffer]); + }; + return function(ev) { + if (ev.data.length) { + strm.push(ev.data[0], ev.data[1]); + postMessage([ev.data[0].length]); + } else + strm.flush(); + }; +}, "astrm"); +var astrmify = /* @__PURE__ */ __name(function(fns, strm, opts, init, id2, flush, ext2) { + var t2; + var w = wrkr(fns, init, id2, function(err2, dat) { + if (err2) + w.terminate(), strm.ondata.call(strm, err2); + else if (!Array.isArray(dat)) + ext2(dat); + else if (dat.length == 1) { + strm.queuedSize -= dat[0]; + if (strm.ondrain) + strm.ondrain(dat[0]); + } else { + if (dat[1]) + w.terminate(); + strm.ondata.call(strm, err2, dat[0], dat[1]); + } + }); + w.postMessage(opts); + strm.queuedSize = 0; + strm.push = function(d, f) { + if (!strm.ondata) + err(5); + if (t2) + strm.ondata(err(4, 0, 1), null, !!f); + strm.queuedSize += d.length; + w.postMessage([d, t2 = f], [d.buffer]); + }; + strm.terminate = function() { + w.terminate(); + }; + if (flush) { + strm.flush = function() { + w.postMessage([]); + }; } - static instance = null; - //new - uiManager; - toolManager; - panAndZoomManager; - brushTool; - paintBucketTool; - colorSelectTool; - canvasHistory; - messageBroker; - keyboardManager; - rootElement; - imageURL; - isLayoutCreated = false; - isOpen = false; - //variables needed? - last_display_style = null; - constructor() { - super(); - this.rootElement = $el( - "div.maskEditor_hidden", - { parent: document.body }, - [] - ); - this.element = this.rootElement; +}, "astrmify"); +var b2 = /* @__PURE__ */ __name(function(d, b) { + return d[b] | d[b + 1] << 8; +}, "b2"); +var b4 = /* @__PURE__ */ __name(function(d, b) { + return (d[b] | d[b + 1] << 8 | d[b + 2] << 16 | d[b + 3] << 24) >>> 0; +}, "b4"); +var b8 = /* @__PURE__ */ __name(function(d, b) { + return b4(d, b) + b4(d, b + 4) * 4294967296; +}, "b8"); +var wbytes = /* @__PURE__ */ __name(function(d, b, v) { + for (; v; ++b) + d[b] = v, v >>>= 8; +}, "wbytes"); +var gzh = /* @__PURE__ */ __name(function(c, o) { + var fn = o.filename; + c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; + if (o.mtime != 0) + wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1e3)); + if (fn) { + c[3] = 8; + for (var i = 0; i <= fn.length; ++i) + c[i + 10] = fn.charCodeAt(i); } - static getInstance() { - if (!ComfyApp.clipspace || !ComfyApp.clipspace.imgs) { - throw new Error("No clipspace images found"); - } - const currentSrc = ComfyApp.clipspace.imgs[ComfyApp.clipspace["selectedIndex"]].src; - if (!MaskEditorDialog.instance || currentSrc !== MaskEditorDialog.instance.imageURL) { - MaskEditorDialog.instance = new MaskEditorDialog(); +}, "gzh"); +var gzs = /* @__PURE__ */ __name(function(d) { + if (d[0] != 31 || d[1] != 139 || d[2] != 8) + err(6, "invalid gzip data"); + var flg = d[3]; + var st = 10; + if (flg & 4) + st += (d[10] | d[11] << 8) + 2; + for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++]) + ; + return st + (flg & 2); +}, "gzs"); +var gzl = /* @__PURE__ */ __name(function(d) { + var l = d.length; + return (d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16 | d[l - 1] << 24) >>> 0; +}, "gzl"); +var gzhl = /* @__PURE__ */ __name(function(o) { + return 10 + (o.filename ? o.filename.length + 1 : 0); +}, "gzhl"); +var zlh = /* @__PURE__ */ __name(function(c, o) { + var lv = o.level, fl2 = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2; + c[0] = 120, c[1] = fl2 << 6 | (o.dictionary && 32); + c[1] |= 31 - (c[0] << 8 | c[1]) % 31; + if (o.dictionary) { + var h = adler(); + h.p(o.dictionary); + wbytes(c, 2, h.d()); + } +}, "zlh"); +var zls = /* @__PURE__ */ __name(function(d, dict) { + if ((d[0] & 15) != 8 || d[0] >> 4 > 7 || (d[0] << 8 | d[1]) % 31) + err(6, "invalid zlib data"); + if ((d[1] >> 5 & 1) == +!dict) + err(6, "invalid zlib data: " + (d[1] & 32 ? "need" : "unexpected") + " dictionary"); + return (d[1] >> 3 & 4) + 2; +}, "zls"); +function StrmOpt(opts, cb) { + if (typeof opts == "function") + cb = opts, opts = {}; + this.ondata = cb; + return opts; +} +__name(StrmOpt, "StrmOpt"); +var Deflate = /* @__PURE__ */ function() { + function Deflate2(opts, cb) { + if (typeof opts == "function") + cb = opts, opts = {}; + this.ondata = cb; + this.o = opts || {}; + this.s = { l: 0, i: 32768, w: 32768, z: 32768 }; + this.b = new u8(98304); + if (this.o.dictionary) { + var dict = this.o.dictionary.subarray(-32768); + this.b.set(dict, 32768 - dict.length); + this.s.i = 32768 - dict.length; } - return MaskEditorDialog.instance; } - async show() { - this.cleanup(); - if (!this.isLayoutCreated) { - this.messageBroker = new MessageBroker(); - this.canvasHistory = new CanvasHistory(this, 20); - this.paintBucketTool = new PaintBucketTool(this); - this.brushTool = new BrushTool(this); - this.panAndZoomManager = new PanAndZoomManager(this); - this.toolManager = new ToolManager(this); - this.keyboardManager = new KeyboardManager(this); - this.uiManager = new UIManager(this.rootElement, this); - this.colorSelectTool = new ColorSelectTool(this); - const self2 = this; - const observer = new MutationObserver(function(mutations) { - mutations.forEach(function(mutation) { - if (mutation.type === "attributes" && mutation.attributeName === "style") { - if (self2.last_display_style && self2.last_display_style != "none" && self2.element.style.display == "none") { - ComfyApp.onClipspaceEditorClosed(); - } - self2.last_display_style = self2.element.style.display; - } - }); - }); - const config = { attributes: true }; - observer.observe(this.rootElement, config); - this.isLayoutCreated = true; - await this.uiManager.setlayout(); + __name(Deflate2, "Deflate"); + Deflate2.prototype.p = function(c, f) { + this.ondata(dopt(c, this.o, 0, 0, this.s), f); + }; + Deflate2.prototype.push = function(chunk, final) { + if (!this.ondata) + err(5); + if (this.s.l) + err(4); + var endLen = chunk.length + this.s.z; + if (endLen > this.b.length) { + if (endLen > 2 * this.b.length - 32768) { + var newBuf = new u8(endLen & -32768); + newBuf.set(this.b.subarray(0, this.s.z)); + this.b = newBuf; + } + var split = this.b.length - this.s.z; + this.b.set(chunk.subarray(0, split), this.s.z); + this.s.z = this.b.length; + this.p(this.b, false); + this.b.set(this.b.subarray(-32768)); + this.b.set(chunk.subarray(split), 32768); + this.s.z = chunk.length - split + 32768; + this.s.i = 32766, this.s.w = 32768; + } else { + this.b.set(chunk, this.s.z); + this.s.z += chunk.length; } - this.rootElement.id = "maskEditor"; - this.rootElement.style.display = "flex"; - this.element.style.display = "flex"; - await this.uiManager.initUI(); - this.paintBucketTool.initPaintBucketTool(); - this.colorSelectTool.initColorSelectTool(); - await this.canvasHistory.saveInitialState(); - this.isOpen = true; - if (ComfyApp.clipspace && ComfyApp.clipspace.imgs) { - this.uiManager.setSidebarImage(); + this.s.l = final & 1; + if (this.s.z > this.s.w + 8191 || final) { + this.p(this.b, final || false); + this.s.w = this.s.i, this.s.i -= 2; } - this.keyboardManager.addListeners(); - } - cleanup() { - const maskEditors = document.querySelectorAll('[id^="maskEditor"]'); - maskEditors.forEach((element) => element.remove()); - const brushElements = document.querySelectorAll("#maskEditor_brush"); - brushElements.forEach((element) => element.remove()); + }; + Deflate2.prototype.flush = function() { + if (!this.ondata) + err(5); + if (this.s.l) + err(4); + this.p(this.b, false); + this.s.w = this.s.i, this.s.i -= 2; + }; + return Deflate2; +}(); +var AsyncDeflate = /* @__PURE__ */ function() { + function AsyncDeflate2(opts, cb) { + astrmify([ + bDflt, + function() { + return [astrm, Deflate]; + } + ], this, StrmOpt.call(this, opts, cb), function(ev) { + var strm = new Deflate(ev.data); + onmessage = astrm(strm); + }, 6, 1); } - isOpened() { - return this.isOpen; + __name(AsyncDeflate2, "AsyncDeflate"); + return AsyncDeflate2; +}(); +function deflate(data, opts, cb) { + if (!cb) + cb = opts, opts = {}; + if (typeof cb != "function") + err(7); + return cbify(data, opts, [ + bDflt + ], function(ev) { + return pbf(deflateSync(ev.data[0], ev.data[1])); + }, 0, cb); +} +__name(deflate, "deflate"); +function deflateSync(data, opts) { + return dopt(data, opts || {}, 0, 0); +} +__name(deflateSync, "deflateSync"); +var Inflate = /* @__PURE__ */ function() { + function Inflate2(opts, cb) { + if (typeof opts == "function") + cb = opts, opts = {}; + this.ondata = cb; + var dict = opts && opts.dictionary && opts.dictionary.subarray(-32768); + this.s = { i: 0, b: dict ? dict.length : 0 }; + this.o = new u8(32768); + this.p = new u8(0); + if (dict) + this.o.set(dict); } - async save() { - const backupCanvas = document.createElement("canvas"); - const imageCanvas = this.uiManager.getImgCanvas(); - const maskCanvas = this.uiManager.getMaskCanvas(); - const image = this.uiManager.getImage(); - const backupCtx = backupCanvas.getContext("2d", { - willReadFrequently: true - }); - backupCanvas.width = imageCanvas.width; - backupCanvas.height = imageCanvas.height; - if (!backupCtx) { - return; - } - const maskImageLoaded = new Promise((resolve, reject) => { - const maskImage = new Image(); - maskImage.src = maskCanvas.toDataURL(); - maskImage.onload = () => { - resolve(); - }; - maskImage.onerror = (error) => { - reject(error); - }; - }); - try { - await maskImageLoaded; - } catch (error) { - console.error("Error loading mask image:", error); - return; + __name(Inflate2, "Inflate"); + Inflate2.prototype.e = function(c) { + if (!this.ondata) + err(5); + if (this.d) + err(4); + if (!this.p.length) + this.p = c; + else if (c.length) { + var n = new u8(this.p.length + c.length); + n.set(this.p), n.set(c, this.p.length), this.p = n; } - backupCtx.clearRect(0, 0, backupCanvas.width, backupCanvas.height); - backupCtx.drawImage( - maskCanvas, - 0, - 0, - maskCanvas.width, - maskCanvas.height, - 0, - 0, - backupCanvas.width, - backupCanvas.height - ); - let maskHasContent = false; - const maskData = backupCtx.getImageData( - 0, - 0, - backupCanvas.width, - backupCanvas.height - ); - for (let i = 0; i < maskData.data.length; i += 4) { - if (maskData.data[i + 3] !== 0) { - maskHasContent = true; - break; + }; + Inflate2.prototype.c = function(final) { + this.s.i = +(this.d = final || false); + var bts = this.s.b; + var dt = inflt(this.p, this.s, this.o); + this.ondata(slc(dt, bts, this.s.b), this.d); + this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length; + this.p = slc(this.p, this.s.p / 8 | 0), this.s.p &= 7; + }; + Inflate2.prototype.push = function(chunk, final) { + this.e(chunk), this.c(final); + }; + return Inflate2; +}(); +var AsyncInflate = /* @__PURE__ */ function() { + function AsyncInflate2(opts, cb) { + astrmify([ + bInflt, + function() { + return [astrm, Inflate]; } - } - const backupData = backupCtx.getImageData( - 0, - 0, - backupCanvas.width, - backupCanvas.height - ); - let backupHasContent = false; - for (let i = 0; i < backupData.data.length; i += 4) { - if (backupData.data[i + 3] !== 0) { - backupHasContent = true; - break; + ], this, StrmOpt.call(this, opts, cb), function(ev) { + var strm = new Inflate(ev.data); + onmessage = astrm(strm); + }, 7, 0); + } + __name(AsyncInflate2, "AsyncInflate"); + return AsyncInflate2; +}(); +function inflate(data, opts, cb) { + if (!cb) + cb = opts, opts = {}; + if (typeof cb != "function") + err(7); + return cbify(data, opts, [ + bInflt + ], function(ev) { + return pbf(inflateSync(ev.data[0], gopt(ev.data[1]))); + }, 1, cb); +} +__name(inflate, "inflate"); +function inflateSync(data, opts) { + return inflt(data, { i: 2 }, opts && opts.out, opts && opts.dictionary); +} +__name(inflateSync, "inflateSync"); +var Gzip = /* @__PURE__ */ function() { + function Gzip2(opts, cb) { + this.c = crc(); + this.l = 0; + this.v = 1; + Deflate.call(this, opts, cb); + } + __name(Gzip2, "Gzip"); + Gzip2.prototype.push = function(chunk, final) { + this.c.p(chunk); + this.l += chunk.length; + Deflate.prototype.push.call(this, chunk, final); + }; + Gzip2.prototype.p = function(c, f) { + var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, this.s); + if (this.v) + gzh(raw, this.o), this.v = 0; + if (f) + wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l); + this.ondata(raw, f); + }; + Gzip2.prototype.flush = function() { + Deflate.prototype.flush.call(this); + }; + return Gzip2; +}(); +var AsyncGzip = /* @__PURE__ */ function() { + function AsyncGzip2(opts, cb) { + astrmify([ + bDflt, + gze, + function() { + return [astrm, Deflate, Gzip]; } + ], this, StrmOpt.call(this, opts, cb), function(ev) { + var strm = new Gzip(ev.data); + onmessage = astrm(strm); + }, 8, 1); + } + __name(AsyncGzip2, "AsyncGzip"); + return AsyncGzip2; +}(); +function gzip(data, opts, cb) { + if (!cb) + cb = opts, opts = {}; + if (typeof cb != "function") + err(7); + return cbify(data, opts, [ + bDflt, + gze, + function() { + return [gzipSync]; } - if (maskHasContent && !backupHasContent) { - console.error("Mask appears to be empty"); - alert("Cannot save empty mask"); - return; - } - for (let i = 0; i < backupData.data.length; i += 4) { - const alpha = backupData.data[i + 3]; - backupData.data[i] = 0; - backupData.data[i + 1] = 0; - backupData.data[i + 2] = 0; - backupData.data[i + 3] = 255 - alpha; - } - backupCtx.globalCompositeOperation = "source-over"; - backupCtx.putImageData(backupData, 0, 0); - const formData = new FormData(); - const filename = "clipspace-mask-" + performance.now() + ".png"; - const item = { - filename, - subfolder: "clipspace", - type: "input" - }; - if (ComfyApp?.clipspace?.widgets?.length) { - const index = ComfyApp.clipspace.widgets.findIndex( - (obj) => obj?.name === "image" - ); - if (index >= 0 && item !== void 0) { - try { - ComfyApp.clipspace.widgets[index].value = item; - } catch (err2) { - console.warn("Failed to set widget value:", err2); - } + ], function(ev) { + return pbf(gzipSync(ev.data[0], ev.data[1])); + }, 2, cb); +} +__name(gzip, "gzip"); +function gzipSync(data, opts) { + if (!opts) + opts = {}; + var c = crc(), l = data.length; + c.p(data); + var d = dopt(data, opts, gzhl(opts), 8), s = d.length; + return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d; +} +__name(gzipSync, "gzipSync"); +var Gunzip = /* @__PURE__ */ function() { + function Gunzip2(opts, cb) { + this.v = 1; + this.r = 0; + Inflate.call(this, opts, cb); + } + __name(Gunzip2, "Gunzip"); + Gunzip2.prototype.push = function(chunk, final) { + Inflate.prototype.e.call(this, chunk); + this.r += chunk.length; + if (this.v) { + var p = this.p.subarray(this.v - 1); + var s = p.length > 3 ? gzs(p) : 4; + if (s > p.length) { + if (!final) + return; + } else if (this.v > 1 && this.onmember) { + this.onmember(this.r - p.length); } + this.p = p.subarray(s), this.v = 0; } - const dataURL = backupCanvas.toDataURL(); - const blob = this.dataURLToBlob(dataURL); - let original_url = new URL(image.src); - this.uiManager.setBrushOpacity(0); - const filenameRef = original_url.searchParams.get("filename"); - if (!filenameRef) { - throw new Error("filename parameter is required"); + Inflate.prototype.c.call(this, final); + if (this.s.f && !this.s.l && !final) { + this.v = shft(this.s.p) + 9; + this.s = { i: 0 }; + this.o = new u8(0); + this.push(new u8(0), final); } - const original_ref = { - filename: filenameRef - }; - let original_subfolder = original_url.searchParams.get("subfolder"); - if (original_subfolder) original_ref.subfolder = original_subfolder; - let original_type = original_url.searchParams.get("type"); - if (original_type) original_ref.type = original_type; - formData.append("image", blob, filename); - formData.append("original_ref", JSON.stringify(original_ref)); - formData.append("type", "input"); - formData.append("subfolder", "clipspace"); - this.uiManager.setSaveButtonText("Saving"); - this.uiManager.setSaveButtonEnabled(false); - this.keyboardManager.removeListeners(); - const maxRetries = 3; - let attempt = 0; - let success = false; - while (attempt < maxRetries && !success) { - try { - await this.uploadMask(item, formData); - success = true; - } catch (error) { - console.error(`Upload attempt ${attempt + 1} failed:`, error); - attempt++; - if (attempt < maxRetries) { - console.log("Retrying upload..."); - } else { - console.log("Max retries reached. Upload failed."); - } + }; + return Gunzip2; +}(); +var AsyncGunzip = /* @__PURE__ */ function() { + function AsyncGunzip2(opts, cb) { + var _this = this; + astrmify([ + bInflt, + guze, + function() { + return [astrm, Inflate, Gunzip]; } + ], this, StrmOpt.call(this, opts, cb), function(ev) { + var strm = new Gunzip(ev.data); + strm.onmember = function(offset) { + return postMessage(offset); + }; + onmessage = astrm(strm); + }, 9, 0, function(offset) { + return _this.onmember && _this.onmember(offset); + }); + } + __name(AsyncGunzip2, "AsyncGunzip"); + return AsyncGunzip2; +}(); +function gunzip(data, opts, cb) { + if (!cb) + cb = opts, opts = {}; + if (typeof cb != "function") + err(7); + return cbify(data, opts, [ + bInflt, + guze, + function() { + return [gunzipSync]; } - if (success) { - ComfyApp.onClipspaceEditorSave(); - this.close(); - this.isOpen = false; - } else { - this.uiManager.setSaveButtonText("Save"); - this.uiManager.setSaveButtonEnabled(true); - this.keyboardManager.addListeners(); - } + ], function(ev) { + return pbf(gunzipSync(ev.data[0], ev.data[1])); + }, 3, cb); +} +__name(gunzip, "gunzip"); +function gunzipSync(data, opts) { + var st = gzs(data); + if (st + 8 > data.length) + err(6, "invalid gzip data"); + return inflt(data.subarray(st, -8), { i: 2 }, opts && opts.out || new u8(gzl(data)), opts && opts.dictionary); +} +__name(gunzipSync, "gunzipSync"); +var Zlib = /* @__PURE__ */ function() { + function Zlib2(opts, cb) { + this.c = adler(); + this.v = 1; + Deflate.call(this, opts, cb); } - getMessageBroker() { - return this.messageBroker; + __name(Zlib2, "Zlib"); + Zlib2.prototype.push = function(chunk, final) { + this.c.p(chunk); + Deflate.prototype.push.call(this, chunk, final); + }; + Zlib2.prototype.p = function(c, f) { + var raw = dopt(c, this.o, this.v && (this.o.dictionary ? 6 : 2), f && 4, this.s); + if (this.v) + zlh(raw, this.o), this.v = 0; + if (f) + wbytes(raw, raw.length - 4, this.c.d()); + this.ondata(raw, f); + }; + Zlib2.prototype.flush = function() { + Deflate.prototype.flush.call(this); + }; + return Zlib2; +}(); +var AsyncZlib = /* @__PURE__ */ function() { + function AsyncZlib2(opts, cb) { + astrmify([ + bDflt, + zle, + function() { + return [astrm, Deflate, Zlib]; + } + ], this, StrmOpt.call(this, opts, cb), function(ev) { + var strm = new Zlib(ev.data); + onmessage = astrm(strm); + }, 10, 1); } - // Helper function to convert a data URL to a Blob object - dataURLToBlob(dataURL) { - const parts = dataURL.split(";base64,"); - const contentType = parts[0].split(":")[1]; - const byteString = atob(parts[1]); - const arrayBuffer = new ArrayBuffer(byteString.length); - const uint8Array = new Uint8Array(arrayBuffer); - for (let i = 0; i < byteString.length; i++) { - uint8Array[i] = byteString.charCodeAt(i); + __name(AsyncZlib2, "AsyncZlib"); + return AsyncZlib2; +}(); +function zlib(data, opts, cb) { + if (!cb) + cb = opts, opts = {}; + if (typeof cb != "function") + err(7); + return cbify(data, opts, [ + bDflt, + zle, + function() { + return [zlibSync]; } - return new Blob([arrayBuffer], { type: contentType }); + ], function(ev) { + return pbf(zlibSync(ev.data[0], ev.data[1])); + }, 4, cb); +} +__name(zlib, "zlib"); +function zlibSync(data, opts) { + if (!opts) + opts = {}; + var a = adler(); + a.p(data); + var d = dopt(data, opts, opts.dictionary ? 6 : 2, 4); + return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d; +} +__name(zlibSync, "zlibSync"); +var Unzlib = /* @__PURE__ */ function() { + function Unzlib2(opts, cb) { + Inflate.call(this, opts, cb); + this.v = opts && opts.dictionary ? 2 : 1; } - async uploadMask(filepath, formData, retries = 3) { - if (retries <= 0) { - throw new Error("Max retries reached"); - return; + __name(Unzlib2, "Unzlib"); + Unzlib2.prototype.push = function(chunk, final) { + Inflate.prototype.e.call(this, chunk); + if (this.v) { + if (this.p.length < 6 && !final) + return; + this.p = this.p.subarray(zls(this.p, this.v - 1)), this.v = 0; } - await api.fetchApi("/upload/mask", { - method: "POST", - body: formData - }).then((response) => { - if (!response.ok) { - console.log("Failed to upload mask:", response); - this.uploadMask(filepath, formData, 2); - } - }).catch((error) => { - console.error("Error:", error); - }); - try { - const selectedIndex = ComfyApp.clipspace?.selectedIndex; - if (ComfyApp.clipspace?.imgs && selectedIndex !== void 0) { - const newImage = new Image(); - newImage.src = api.apiURL( - "/view?" + new URLSearchParams(filepath).toString() + app.getPreviewFormatParam() + app.getRandParam() - ); - ComfyApp.clipspace.imgs[selectedIndex] = newImage; - if (ComfyApp.clipspace.images) { - ComfyApp.clipspace.images[selectedIndex] = filepath; - } - } - } catch (err2) { - console.warn("Failed to update clipspace image:", err2); + if (final) { + if (this.p.length < 4) + err(6, "invalid zlib data"); + this.p = this.p.subarray(0, -4); } - ClipspaceDialog.invalidatePreview(); + Inflate.prototype.c.call(this, final); + }; + return Unzlib2; +}(); +var AsyncUnzlib = /* @__PURE__ */ function() { + function AsyncUnzlib2(opts, cb) { + astrmify([ + bInflt, + zule, + function() { + return [astrm, Inflate, Unzlib]; + } + ], this, StrmOpt.call(this, opts, cb), function(ev) { + var strm = new Unzlib(ev.data); + onmessage = astrm(strm); + }, 11, 0); } + __name(AsyncUnzlib2, "AsyncUnzlib"); + return AsyncUnzlib2; +}(); +function unzlib(data, opts, cb) { + if (!cb) + cb = opts, opts = {}; + if (typeof cb != "function") + err(7); + return cbify(data, opts, [ + bInflt, + zule, + function() { + return [unzlibSync]; + } + ], function(ev) { + return pbf(unzlibSync(ev.data[0], gopt(ev.data[1]))); + }, 5, cb); } -class CanvasHistory { - static { - __name(this, "CanvasHistory"); - } - maskEditor; - messageBroker; - canvas; - ctx; - states = []; - currentStateIndex = -1; - maxStates = 20; - initialized = false; - constructor(maskEditor, maxStates = 20) { - this.maskEditor = maskEditor; - this.messageBroker = maskEditor.getMessageBroker(); - this.maxStates = maxStates; - this.createListeners(); +__name(unzlib, "unzlib"); +function unzlibSync(data, opts) { + return inflt(data.subarray(zls(data, opts && opts.dictionary), -4), { i: 2 }, opts && opts.out, opts && opts.dictionary); +} +__name(unzlibSync, "unzlibSync"); +var Decompress = /* @__PURE__ */ function() { + function Decompress2(opts, cb) { + this.o = StrmOpt.call(this, opts, cb) || {}; + this.G = Gunzip; + this.I = Inflate; + this.Z = Unzlib; } - async pullCanvas() { - this.canvas = await this.messageBroker.pull("maskCanvas"); - this.ctx = await this.messageBroker.pull("maskCtx"); + __name(Decompress2, "Decompress"); + Decompress2.prototype.i = function() { + var _this = this; + this.s.ondata = function(dat, final) { + _this.ondata(dat, final); + }; + }; + Decompress2.prototype.push = function(chunk, final) { + if (!this.ondata) + err(5); + if (!this.s) { + if (this.p && this.p.length) { + var n = new u8(this.p.length + chunk.length); + n.set(this.p), n.set(chunk, this.p.length); + } else + this.p = chunk; + if (this.p.length > 2) { + this.s = this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8 ? new this.G(this.o) : (this.p[0] & 15) != 8 || this.p[0] >> 4 > 7 || (this.p[0] << 8 | this.p[1]) % 31 ? new this.I(this.o) : new this.Z(this.o); + this.i(); + this.s.push(this.p, final); + this.p = null; + } + } else + this.s.push(chunk, final); + }; + return Decompress2; +}(); +var AsyncDecompress = /* @__PURE__ */ function() { + function AsyncDecompress2(opts, cb) { + Decompress.call(this, opts, cb); + this.queuedSize = 0; + this.G = AsyncGunzip; + this.I = AsyncInflate; + this.Z = AsyncUnzlib; } - createListeners() { - this.messageBroker.subscribe("saveState", () => this.saveState()); - this.messageBroker.subscribe("undo", () => this.undo()); - this.messageBroker.subscribe("redo", () => this.redo()); + __name(AsyncDecompress2, "AsyncDecompress"); + AsyncDecompress2.prototype.i = function() { + var _this = this; + this.s.ondata = function(err2, dat, final) { + _this.ondata(err2, dat, final); + }; + this.s.ondrain = function(size) { + _this.queuedSize -= size; + if (_this.ondrain) + _this.ondrain(size); + }; + }; + AsyncDecompress2.prototype.push = function(chunk, final) { + this.queuedSize += chunk.length; + Decompress.prototype.push.call(this, chunk, final); + }; + return AsyncDecompress2; +}(); +function decompress(data, opts, cb) { + if (!cb) + cb = opts, opts = {}; + if (typeof cb != "function") + err(7); + return data[0] == 31 && data[1] == 139 && data[2] == 8 ? gunzip(data, opts, cb) : (data[0] & 15) != 8 || data[0] >> 4 > 7 || (data[0] << 8 | data[1]) % 31 ? inflate(data, opts, cb) : unzlib(data, opts, cb); +} +__name(decompress, "decompress"); +function decompressSync(data, opts) { + return data[0] == 31 && data[1] == 139 && data[2] == 8 ? gunzipSync(data, opts) : (data[0] & 15) != 8 || data[0] >> 4 > 7 || (data[0] << 8 | data[1]) % 31 ? inflateSync(data, opts) : unzlibSync(data, opts); +} +__name(decompressSync, "decompressSync"); +var fltn = /* @__PURE__ */ __name(function(d, p, t2, o) { + for (var k in d) { + var val = d[k], n = p + k, op = o; + if (Array.isArray(val)) + op = mrg(o, val[1]), val = val[0]; + if (val instanceof u8) + t2[n] = [val, op]; + else { + t2[n += "/"] = [new u8(0), op]; + fltn(val, n, t2, o); + } } - clearStates() { - this.states = []; - this.currentStateIndex = -1; - this.initialized = false; +}, "fltn"); +var te = typeof TextEncoder != "undefined" && /* @__PURE__ */ new TextEncoder(); +var td = typeof TextDecoder != "undefined" && /* @__PURE__ */ new TextDecoder(); +var tds = 0; +try { + td.decode(et, { stream: true }); + tds = 1; +} catch (e) { +} +var dutf8 = /* @__PURE__ */ __name(function(d) { + for (var r = "", i = 0; ; ) { + var c = d[i++]; + var eb = (c > 127) + (c > 223) + (c > 239); + if (i + eb > d.length) + return { s: r, r: slc(d, i - 1) }; + if (!eb) + r += String.fromCharCode(c); + else if (eb == 3) { + c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | d[i++] & 63) - 65536, r += String.fromCharCode(55296 | c >> 10, 56320 | c & 1023); + } else if (eb & 1) + r += String.fromCharCode((c & 31) << 6 | d[i++] & 63); + else + r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | d[i++] & 63); } - async saveInitialState() { - await this.pullCanvas(); - if (!this.canvas.width || !this.canvas.height) { - requestAnimationFrame(() => this.saveInitialState()); - return; - } - this.clearStates(); - const state = this.ctx.getImageData( - 0, - 0, - this.canvas.width, - this.canvas.height - ); - this.states.push(state); - this.currentStateIndex = 0; - this.initialized = true; +}, "dutf8"); +var DecodeUTF8 = /* @__PURE__ */ function() { + function DecodeUTF82(cb) { + this.ondata = cb; + if (tds) + this.t = new TextDecoder(); + else + this.p = et; } - saveState() { - if (!this.initialized || this.currentStateIndex === -1) { - this.saveInitialState(); + __name(DecodeUTF82, "DecodeUTF8"); + DecodeUTF82.prototype.push = function(chunk, final) { + if (!this.ondata) + err(5); + final = !!final; + if (this.t) { + this.ondata(this.t.decode(chunk, { stream: true }), final); + if (final) { + if (this.t.decode().length) + err(8); + this.t = null; + } return; } - this.states = this.states.slice(0, this.currentStateIndex + 1); - const state = this.ctx.getImageData( - 0, - 0, - this.canvas.width, - this.canvas.height - ); - this.states.push(state); - this.currentStateIndex++; - if (this.states.length > this.maxStates) { - this.states.shift(); - this.currentStateIndex--; - } - } - undo() { - if (this.states.length > 1 && this.currentStateIndex > 0) { - this.currentStateIndex--; - this.restoreState(this.states[this.currentStateIndex]); - } else { - alert("No more undo states available"); - } + if (!this.p) + err(4); + var dat = new u8(this.p.length + chunk.length); + dat.set(this.p); + dat.set(chunk, this.p.length); + var _a2 = dutf8(dat), s = _a2.s, r = _a2.r; + if (final) { + if (r.length) + err(8); + this.p = null; + } else + this.p = r; + this.ondata(s, final); + }; + return DecodeUTF82; +}(); +var EncodeUTF8 = /* @__PURE__ */ function() { + function EncodeUTF82(cb) { + this.ondata = cb; } - redo() { - if (this.states.length > 1 && this.currentStateIndex < this.states.length - 1) { - this.currentStateIndex++; - this.restoreState(this.states[this.currentStateIndex]); - } else { - alert("No more redo states available"); - } + __name(EncodeUTF82, "EncodeUTF8"); + EncodeUTF82.prototype.push = function(chunk, final) { + if (!this.ondata) + err(5); + if (this.d) + err(4); + this.ondata(strToU8(chunk), this.d = final || false); + }; + return EncodeUTF82; +}(); +function strToU8(str, latin1) { + if (latin1) { + var ar_1 = new u8(str.length); + for (var i = 0; i < str.length; ++i) + ar_1[i] = str.charCodeAt(i); + return ar_1; } - restoreState(state) { - if (state && this.initialized) { - this.ctx.putImageData(state, 0, 0); + if (te) + return te.encode(str); + var l = str.length; + var ar = new u8(str.length + (str.length >> 1)); + var ai = 0; + var w = /* @__PURE__ */ __name(function(v) { + ar[ai++] = v; + }, "w"); + for (var i = 0; i < l; ++i) { + if (ai + 5 > ar.length) { + var n = new u8(ai + 8 + (l - i << 1)); + n.set(ar); + ar = n; } + var c = str.charCodeAt(i); + if (c < 128 || latin1) + w(c); + else if (c < 2048) + w(192 | c >> 6), w(128 | c & 63); + else if (c > 55295 && c < 57344) + c = 65536 + (c & 1023 << 10) | str.charCodeAt(++i) & 1023, w(240 | c >> 18), w(128 | c >> 12 & 63), w(128 | c >> 6 & 63), w(128 | c & 63); + else + w(224 | c >> 12), w(128 | c >> 6 & 63), w(128 | c & 63); } + return slc(ar, 0, ai); } -class PaintBucketTool { - static { - __name(this, "PaintBucketTool"); - } - maskEditor; - messageBroker; - canvas; - ctx; - width = null; - height = null; - imageData = null; - data = null; - tolerance = 5; - constructor(maskEditor) { - this.maskEditor = maskEditor; - this.messageBroker = maskEditor.getMessageBroker(); - this.createListeners(); - this.addPullTopics(); +__name(strToU8, "strToU8"); +function strFromU8(dat, latin1) { + if (latin1) { + var r = ""; + for (var i = 0; i < dat.length; i += 16384) + r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384)); + return r; + } else if (td) { + return td.decode(dat); + } else { + var _a2 = dutf8(dat), s = _a2.s, r = _a2.r; + if (r.length) + err(8); + return s; } - initPaintBucketTool() { - this.pullCanvas(); +} +__name(strFromU8, "strFromU8"); +; +var dbf = /* @__PURE__ */ __name(function(l) { + return l == 1 ? 3 : l < 6 ? 2 : l == 9 ? 1 : 0; +}, "dbf"); +var slzh = /* @__PURE__ */ __name(function(d, b) { + return b + 30 + b2(d, b + 26) + b2(d, b + 28); +}, "slzh"); +var zh = /* @__PURE__ */ __name(function(d, b, z) { + 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); + var _a2 = z && bs == 4294967295 ? z64e(d, es) : [bs, b4(d, b + 24), b4(d, b + 42)], sc = _a2[0], su = _a2[1], off = _a2[2]; + return [b2(d, b + 10), sc, su, fn, es + b2(d, b + 30) + b2(d, b + 32), off]; +}, "zh"); +var z64e = /* @__PURE__ */ __name(function(d, b) { + for (; b2(d, b) != 1; b += 4 + b2(d, b + 2)) + ; + return [b8(d, b + 12), b8(d, b + 4), b8(d, b + 20)]; +}, "z64e"); +var exfl = /* @__PURE__ */ __name(function(ex) { + var le = 0; + if (ex) { + for (var k in ex) { + var l = ex[k].length; + if (l > 65535) + err(9); + le += l + 4; + } } - async pullCanvas() { - this.canvas = await this.messageBroker.pull("maskCanvas"); - this.ctx = await this.messageBroker.pull("maskCtx"); + return le; +}, "exfl"); +var wzh = /* @__PURE__ */ __name(function(d, b, f, fn, u, c, ce, co) { + var fl2 = fn.length, ex = f.extra, col = co && co.length; + var exl = exfl(ex); + wbytes(d, b, ce != null ? 33639248 : 67324752), b += 4; + if (ce != null) + d[b++] = 20, d[b++] = f.os; + d[b] = 20, b += 2; + d[b++] = f.flag << 1 | (c < 0 && 8), d[b++] = u && 8; + d[b++] = f.compression & 255, d[b++] = f.compression >> 8; + var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980; + if (y < 0 || y > 119) + err(10); + wbytes(d, b, y << 25 | dt.getMonth() + 1 << 21 | dt.getDate() << 16 | dt.getHours() << 11 | dt.getMinutes() << 5 | dt.getSeconds() >> 1), b += 4; + if (c != -1) { + wbytes(d, b, f.crc); + wbytes(d, b + 4, c < 0 ? -c - 2 : c); + wbytes(d, b + 8, f.size); } - createListeners() { - this.messageBroker.subscribe( - "setPaintBucketTolerance", - (tolerance) => this.setTolerance(tolerance) - ); - this.messageBroker.subscribe( - "paintBucketFill", - (point) => this.floodFill(point) - ); - this.messageBroker.subscribe("invert", () => this.invertMask()); + wbytes(d, b + 12, fl2); + wbytes(d, b + 14, exl), b += 16; + if (ce != null) { + wbytes(d, b, col); + wbytes(d, b + 6, f.attrs); + wbytes(d, b + 10, ce), b += 14; } - addPullTopics() { - this.messageBroker.createPullTopic( - "getTolerance", - async () => this.tolerance - ); + d.set(fn, b); + b += fl2; + if (exl) { + for (var k in ex) { + var exf = ex[k], l = exf.length; + wbytes(d, b, +k); + wbytes(d, b + 2, l); + d.set(exf, b + 4), b += 4 + l; + } } - getPixel(x, y) { - return this.data[(y * this.width + x) * 4 + 3]; + if (col) + d.set(co, b), b += col; + return b; +}, "wzh"); +var wzf = /* @__PURE__ */ __name(function(o, b, c, d, e) { + wbytes(o, b, 101010256); + wbytes(o, b + 8, c); + wbytes(o, b + 10, c); + wbytes(o, b + 12, d); + wbytes(o, b + 16, e); +}, "wzf"); +var ZipPassThrough = /* @__PURE__ */ function() { + function ZipPassThrough2(filename) { + this.filename = filename; + this.c = crc(); + this.size = 0; + this.compression = 0; } - setPixel(x, y, alpha, color) { - const index = (y * this.width + x) * 4; - this.data[index] = color.r; - this.data[index + 1] = color.g; - this.data[index + 2] = color.b; - this.data[index + 3] = alpha; + __name(ZipPassThrough2, "ZipPassThrough"); + ZipPassThrough2.prototype.process = function(chunk, final) { + this.ondata(null, chunk, final); + }; + ZipPassThrough2.prototype.push = function(chunk, final) { + if (!this.ondata) + err(5); + this.c.p(chunk); + this.size += chunk.length; + if (final) + this.crc = this.c.d(); + this.process(chunk, final || false); + }; + return ZipPassThrough2; +}(); +var ZipDeflate = /* @__PURE__ */ function() { + function ZipDeflate2(filename, opts) { + var _this = this; + if (!opts) + opts = {}; + ZipPassThrough.call(this, filename); + this.d = new Deflate(opts, function(dat, final) { + _this.ondata(null, dat, final); + }); + this.compression = 8; + this.flag = dbf(opts.level); } - shouldProcessPixel(currentAlpha, targetAlpha, tolerance, isFillMode) { - if (currentAlpha === -1) return false; - if (isFillMode) { - return currentAlpha !== 255 && Math.abs(currentAlpha - targetAlpha) <= tolerance; - } else { - return currentAlpha === 255 || Math.abs(currentAlpha - targetAlpha) <= tolerance; + __name(ZipDeflate2, "ZipDeflate"); + ZipDeflate2.prototype.process = function(chunk, final) { + try { + this.d.push(chunk, final); + } catch (e) { + this.ondata(e, null, final); } + }; + ZipDeflate2.prototype.push = function(chunk, final) { + ZipPassThrough.prototype.push.call(this, chunk, final); + }; + return ZipDeflate2; +}(); +var AsyncZipDeflate = /* @__PURE__ */ function() { + function AsyncZipDeflate2(filename, opts) { + var _this = this; + if (!opts) + opts = {}; + ZipPassThrough.call(this, filename); + this.d = new AsyncDeflate(opts, function(err2, dat, final) { + _this.ondata(err2, dat, final); + }); + this.compression = 8; + this.flag = dbf(opts.level); + this.terminate = this.d.terminate; } - async floodFill(point) { - let startX = Math.floor(point.x); - let startY = Math.floor(point.y); - this.width = this.canvas.width; - this.height = this.canvas.height; - if (startX < 0 || startX >= this.width || startY < 0 || startY >= this.height) { + __name(AsyncZipDeflate2, "AsyncZipDeflate"); + AsyncZipDeflate2.prototype.process = function(chunk, final) { + this.d.push(chunk, final); + }; + AsyncZipDeflate2.prototype.push = function(chunk, final) { + ZipPassThrough.prototype.push.call(this, chunk, final); + }; + return AsyncZipDeflate2; +}(); +var Zip = /* @__PURE__ */ function() { + function Zip2(cb) { + this.ondata = cb; + this.u = []; + this.d = 1; + } + __name(Zip2, "Zip"); + Zip2.prototype.add = function(file2) { + var _this = this; + if (!this.ondata) + err(5); + if (this.d & 2) + this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, false); + else { + var f = strToU8(file2.filename), fl_1 = f.length; + var com = file2.comment, o = com && strToU8(com); + var u = fl_1 != file2.filename.length || o && com.length != o.length; + var hl_1 = fl_1 + exfl(file2.extra) + 30; + if (fl_1 > 65535) + this.ondata(err(11, 0, 1), null, false); + var header = new u8(hl_1); + wzh(header, 0, file2, f, u, -1); + var chks_1 = [header]; + var pAll_1 = /* @__PURE__ */ __name(function() { + for (var _i = 0, chks_2 = chks_1; _i < chks_2.length; _i++) { + var chk = chks_2[_i]; + _this.ondata(null, chk, false); + } + chks_1 = []; + }, "pAll_1"); + var tr_1 = this.d; + this.d = 0; + var ind_1 = this.u.length; + var uf_1 = mrg(file2, { + f, + u, + o, + t: /* @__PURE__ */ __name(function() { + if (file2.terminate) + file2.terminate(); + }, "t"), + r: /* @__PURE__ */ __name(function() { + pAll_1(); + if (tr_1) { + var nxt = _this.u[ind_1 + 1]; + if (nxt) + nxt.r(); + else + _this.d = 1; + } + tr_1 = 1; + }, "r") + }); + var cl_1 = 0; + file2.ondata = function(err2, dat, final) { + if (err2) { + _this.ondata(err2, dat, final); + _this.terminate(); + } else { + cl_1 += dat.length; + chks_1.push(dat); + if (final) { + var dd = new u8(16); + wbytes(dd, 0, 134695760); + wbytes(dd, 4, file2.crc); + wbytes(dd, 8, cl_1); + wbytes(dd, 12, file2.size); + chks_1.push(dd); + uf_1.c = cl_1, uf_1.b = hl_1 + cl_1 + 16, uf_1.crc = file2.crc, uf_1.size = file2.size; + if (tr_1) + uf_1.r(); + tr_1 = 1; + } else if (tr_1) + pAll_1(); + } + }; + this.u.push(uf_1); + } + }; + Zip2.prototype.end = function() { + var _this = this; + if (this.d & 2) { + this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, true); return; } - this.imageData = this.ctx.getImageData(0, 0, this.width, this.height); - this.data = this.imageData.data; - const targetAlpha = this.getPixel(startX, startY); - const isFillMode = targetAlpha !== 255; - if (targetAlpha === -1) return; - const maskColor = await this.messageBroker.pull("getMaskColor"); - const stack = []; - const visited = new Uint8Array(this.width * this.height); - if (this.shouldProcessPixel( - targetAlpha, - targetAlpha, - this.tolerance, - isFillMode - )) { - stack.push([startX, startY]); + if (this.d) + this.e(); + else + this.u.push({ + r: /* @__PURE__ */ __name(function() { + if (!(_this.d & 1)) + return; + _this.u.splice(-1, 1); + _this.e(); + }, "r"), + t: /* @__PURE__ */ __name(function() { + }, "t") + }); + this.d = 3; + }; + Zip2.prototype.e = function() { + var bt = 0, l = 0, tl = 0; + for (var _i = 0, _a2 = this.u; _i < _a2.length; _i++) { + var f = _a2[_i]; + tl += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0); } - while (stack.length > 0) { - const [x, y] = stack.pop(); - const visitedIndex = y * this.width + x; - if (visited[visitedIndex]) continue; - const currentAlpha = this.getPixel(x, y); - if (!this.shouldProcessPixel( - currentAlpha, - targetAlpha, - this.tolerance, - isFillMode - )) { - continue; - } - visited[visitedIndex] = 1; - this.setPixel(x, y, isFillMode ? 255 : 0, maskColor); - const checkNeighbor = /* @__PURE__ */ __name((nx, ny) => { - if (nx < 0 || nx >= this.width || ny < 0 || ny >= this.height) return; - if (!visited[ny * this.width + nx]) { - const alpha = this.getPixel(nx, ny); - if (this.shouldProcessPixel( - alpha, - targetAlpha, - this.tolerance, - isFillMode - )) { - stack.push([nx, ny]); - } - } - }, "checkNeighbor"); - checkNeighbor(x - 1, y); - checkNeighbor(x + 1, y); - checkNeighbor(x, y - 1); - checkNeighbor(x, y + 1); + var out = new u8(tl + 22); + for (var _b2 = 0, _c = this.u; _b2 < _c.length; _b2++) { + var f = _c[_b2]; + wzh(out, bt, f, f.f, f.u, -f.c - 2, l, f.o); + bt += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0), l += f.b; } - this.ctx.putImageData(this.imageData, 0, 0); - this.imageData = null; - this.data = null; - } - setTolerance(tolerance) { - this.tolerance = tolerance; - } - getTolerance() { - return this.tolerance; - } - //invert mask - invertMask() { - const imageData = this.ctx.getImageData( - 0, - 0, - this.canvas.width, - this.canvas.height - ); - const data = imageData.data; - let maskR = 0, maskG = 0, maskB = 0; - for (let i = 0; i < data.length; i += 4) { - if (data[i + 3] > 0) { - maskR = data[i]; - maskG = data[i + 1]; - maskB = data[i + 2]; - break; - } + wzf(out, bt, this.u.length, tl, l); + this.ondata(null, out, true); + this.d = 2; + }; + Zip2.prototype.terminate = function() { + for (var _i = 0, _a2 = this.u; _i < _a2.length; _i++) { + var f = _a2[_i]; + f.t(); } - for (let i = 0; i < data.length; i += 4) { - const alpha = data[i + 3]; - data[i + 3] = 255 - alpha; - if (alpha === 0) { - data[i] = maskR; - data[i + 1] = maskG; - data[i + 2] = maskB; + this.d = 2; + }; + return Zip2; +}(); +function zip(data, opts, cb) { + if (!cb) + cb = opts, opts = {}; + if (typeof cb != "function") + err(7); + var r = {}; + fltn(data, "", r, opts); + var k = Object.keys(r); + var lft = k.length, o = 0, tot = 0; + var slft = lft, files = new Array(lft); + var term = []; + var tAll = /* @__PURE__ */ __name(function() { + for (var i2 = 0; i2 < term.length; ++i2) + term[i2](); + }, "tAll"); + var cbd = /* @__PURE__ */ __name(function(a, b) { + mt(function() { + cb(a, b); + }); + }, "cbd"); + mt(function() { + cbd = cb; + }); + var cbf = /* @__PURE__ */ __name(function() { + var out = new u8(tot + 22), oe = o, cdl = tot - o; + tot = 0; + for (var i2 = 0; i2 < slft; ++i2) { + var f = files[i2]; + try { + var l = f.c.length; + wzh(out, tot, f, f.f, f.u, l); + var badd = 30 + f.f.length + exfl(f.extra); + var loc = tot + badd; + out.set(f.c, loc); + wzh(out, o, f, f.f, f.u, l, tot, f.m), o += 16 + badd + (f.m ? f.m.length : 0), tot = loc + l; + } catch (e) { + return cbd(e, null); } } - this.ctx.putImageData(imageData, 0, 0); - this.messageBroker.publish("saveState"); + wzf(out, o, files.length, cdl, oe); + cbd(null, out); + }, "cbf"); + if (!lft) + cbf(); + var _loop_1 = /* @__PURE__ */ __name(function(i2) { + var fn = k[i2]; + var _a2 = r[fn], file2 = _a2[0], p = _a2[1]; + var c = crc(), size = file2.length; + c.p(file2); + var f = strToU8(fn), s = f.length; + var com = p.comment, m = com && strToU8(com), ms = m && m.length; + var exl = exfl(p.extra); + var compression = p.level == 0 ? 0 : 8; + var cbl = /* @__PURE__ */ __name(function(e, d) { + if (e) { + tAll(); + cbd(e, null); + } else { + var l = d.length; + files[i2] = mrg(p, { + size, + crc: c.d(), + c: d, + f, + m, + u: s != fn.length || m && com.length != ms, + compression + }); + o += 30 + s + exl + l; + tot += 76 + 2 * (s + exl) + (ms || 0) + l; + if (!--lft) + cbf(); + } + }, "cbl"); + if (s > 65535) + cbl(err(11, 0, 1), null); + if (!compression) + cbl(null, file2); + else if (size < 16e4) { + try { + cbl(null, deflateSync(file2, p)); + } catch (e) { + cbl(e, null); + } + } else + term.push(deflate(file2, p, cbl)); + }, "_loop_1"); + for (var i = 0; i < slft; ++i) { + _loop_1(i); } + return tAll; } -class ColorSelectTool { - static { - __name(this, "ColorSelectTool"); - } - maskEditor; - messageBroker; - width = null; - height = null; - canvas; - maskCTX; - imageCTX; - maskData = null; - imageData = null; - tolerance = 20; - livePreview = false; - lastPoint = null; - colorComparisonMethod = "simple"; - applyWholeImage = false; - maskBoundry = false; - maskTolerance = 0; - constructor(maskEditor) { - this.maskEditor = maskEditor; - this.messageBroker = maskEditor.getMessageBroker(); - this.createListeners(); - this.addPullTopics(); - } - async initColorSelectTool() { - await this.pullCanvas(); - } - async pullCanvas() { - this.canvas = await this.messageBroker.pull("imgCanvas"); - this.maskCTX = await this.messageBroker.pull("maskCtx"); - this.imageCTX = await this.messageBroker.pull("imageCtx"); - } - createListeners() { - this.messageBroker.subscribe( - "colorSelectFill", - (point) => this.fillColorSelection(point) - ); - this.messageBroker.subscribe( - "setColorSelectTolerance", - (tolerance) => this.setTolerance(tolerance) - ); - this.messageBroker.subscribe( - "setLivePreview", - (livePreview) => this.setLivePreview(livePreview) - ); - this.messageBroker.subscribe( - "setColorComparisonMethod", - (method) => this.setComparisonMethod(method) - ); - this.messageBroker.subscribe("clearLastPoint", () => this.clearLastPoint()); - this.messageBroker.subscribe( - "setWholeImage", - (applyWholeImage) => this.setApplyWholeImage(applyWholeImage) - ); - this.messageBroker.subscribe( - "setMaskBoundary", - (maskBoundry) => this.setMaskBoundary(maskBoundry) - ); - this.messageBroker.subscribe( - "setMaskTolerance", - (maskTolerance) => this.setMaskTolerance(maskTolerance) - ); +__name(zip, "zip"); +function zipSync(data, opts) { + if (!opts) + opts = {}; + var r = {}; + var files = []; + fltn(data, "", r, opts); + var o = 0; + var tot = 0; + for (var fn in r) { + var _a2 = r[fn], file2 = _a2[0], p = _a2[1]; + var compression = p.level == 0 ? 0 : 8; + var f = strToU8(fn), s = f.length; + var com = p.comment, m = com && strToU8(com), ms = m && m.length; + var exl = exfl(p.extra); + if (s > 65535) + err(11); + var d = compression ? deflateSync(file2, p) : file2, l = d.length; + var c = crc(); + c.p(file2); + files.push(mrg(p, { + size: file2.length, + crc: c.d(), + c: d, + f, + m, + u: s != fn.length || m && com.length != ms, + o, + compression + })); + o += 30 + s + exl + l; + tot += 76 + 2 * (s + exl) + (ms || 0) + l; } - async addPullTopics() { - this.messageBroker.createPullTopic( - "getLivePreview", - async () => this.livePreview - ); + var out = new u8(tot + 22), oe = o, cdl = tot - o; + for (var i = 0; i < files.length; ++i) { + var f = files[i]; + wzh(out, f.o, f, f.f, f.u, f.c.length); + var badd = 30 + f.f.length + exfl(f.extra); + out.set(f.c, f.o + badd); + wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0); } - getPixel(x, y) { - const index = (y * this.width + x) * 4; - return { - r: this.imageData[index], - g: this.imageData[index + 1], - b: this.imageData[index + 2] - }; + wzf(out, o, files.length, cdl, oe); + return out; +} +__name(zipSync, "zipSync"); +var UnzipPassThrough = /* @__PURE__ */ function() { + function UnzipPassThrough2() { } - getMaskAlpha(x, y) { - return this.maskData[(y * this.width + x) * 4 + 3]; + __name(UnzipPassThrough2, "UnzipPassThrough"); + UnzipPassThrough2.prototype.push = function(data, final) { + this.ondata(null, data, final); + }; + UnzipPassThrough2.compression = 0; + return UnzipPassThrough2; +}(); +var UnzipInflate = /* @__PURE__ */ function() { + function UnzipInflate2() { + var _this = this; + this.i = new Inflate(function(dat, final) { + _this.ondata(null, dat, final); + }); } - isPixelInRange(pixel, target) { - switch (this.colorComparisonMethod) { - case "simple": - return this.isPixelInRangeSimple(pixel, target); - case "hsl": - return this.isPixelInRangeHSL(pixel, target); - case "lab": - return this.isPixelInRangeLab(pixel, target); - default: - return this.isPixelInRangeSimple(pixel, target); + __name(UnzipInflate2, "UnzipInflate"); + UnzipInflate2.prototype.push = function(data, final) { + try { + this.i.push(data, final); + } catch (e) { + this.ondata(e, null, final); } - } - isPixelInRangeSimple(pixel, target) { - const distance = Math.sqrt( - Math.pow(pixel.r - target.r, 2) + Math.pow(pixel.g - target.g, 2) + Math.pow(pixel.b - target.b, 2) - ); - return distance <= this.tolerance; - } - isPixelInRangeHSL(pixel, target) { - const pixelHSL = this.rgbToHSL(pixel.r, pixel.g, pixel.b); - const targetHSL = this.rgbToHSL(target.r, target.g, target.b); - const hueDiff = Math.abs(pixelHSL.h - targetHSL.h); - const satDiff = Math.abs(pixelHSL.s - targetHSL.s); - const lightDiff = Math.abs(pixelHSL.l - targetHSL.l); - const distance = Math.sqrt( - Math.pow(hueDiff / 360 * 255, 2) + Math.pow(satDiff / 100 * 255, 2) + Math.pow(lightDiff / 100 * 255, 2) - ); - return distance <= this.tolerance; - } - rgbToHSL(r, g, b) { - r /= 255; - g /= 255; - b /= 255; - const max2 = Math.max(r, g, b); - const min = Math.min(r, g, b); - let h = 0, s = 0, l = (max2 + min) / 2; - if (max2 !== min) { - const d = max2 - min; - s = l > 0.5 ? d / (2 - max2 - min) : d / (max2 + min); - switch (max2) { - case r: - h = (g - b) / d + (g < b ? 6 : 0); - break; - case g: - h = (b - r) / d + 2; - break; - case b: - h = (r - g) / d + 4; - break; - } - h /= 6; + }; + UnzipInflate2.compression = 8; + return UnzipInflate2; +}(); +var AsyncUnzipInflate = /* @__PURE__ */ function() { + function AsyncUnzipInflate2(_, sz) { + var _this = this; + if (sz < 32e4) { + this.i = new Inflate(function(dat, final) { + _this.ondata(null, dat, final); + }); + } else { + this.i = new AsyncInflate(function(err2, dat, final) { + _this.ondata(err2, dat, final); + }); + this.terminate = this.i.terminate; } - return { - h: h * 360, - s: s * 100, - l: l * 100 - }; - } - isPixelInRangeLab(pixel, target) { - const pixelLab = this.rgbToLab(pixel); - const targetLab = this.rgbToLab(target); - const deltaE = Math.sqrt( - Math.pow(pixelLab.l - targetLab.l, 2) + Math.pow(pixelLab.a - targetLab.a, 2) + Math.pow(pixelLab.b - targetLab.b, 2) - ); - const normalizedDeltaE = deltaE / 100 * 255; - return normalizedDeltaE <= this.tolerance; } - rgbToLab(rgb) { - let r = rgb.r / 255; - let g = rgb.g / 255; - let b = rgb.b / 255; - r = r > 0.04045 ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92; - g = g > 0.04045 ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92; - b = b > 0.04045 ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92; - r *= 100; - g *= 100; - b *= 100; - const x = r * 0.4124 + g * 0.3576 + b * 0.1805; - const y = r * 0.2126 + g * 0.7152 + b * 0.0722; - const z = r * 0.0193 + g * 0.1192 + b * 0.9505; - const xn = 95.047; - const yn = 100; - const zn = 108.883; - const xyz = [x / xn, y / yn, z / zn]; - for (let i = 0; i < xyz.length; i++) { - xyz[i] = xyz[i] > 8856e-6 ? Math.pow(xyz[i], 1 / 3) : 7.787 * xyz[i] + 16 / 116; - } - return { - l: 116 * xyz[1] - 16, - a: 500 * (xyz[0] - xyz[1]), - b: 200 * (xyz[1] - xyz[2]) + __name(AsyncUnzipInflate2, "AsyncUnzipInflate"); + AsyncUnzipInflate2.prototype.push = function(data, final) { + if (this.i.terminate) + data = slc(data, 0); + this.i.push(data, final); + }; + AsyncUnzipInflate2.compression = 8; + return AsyncUnzipInflate2; +}(); +var Unzip = /* @__PURE__ */ function() { + function Unzip2(cb) { + this.onfile = cb; + this.k = []; + this.o = { + 0: UnzipPassThrough }; + this.p = et; } - setPixel(x, y, alpha, color) { - const index = (y * this.width + x) * 4; - this.maskData[index] = color.r; - this.maskData[index + 1] = color.g; - this.maskData[index + 2] = color.b; - this.maskData[index + 3] = alpha; - } - async fillColorSelection(point) { - this.width = this.canvas.width; - this.height = this.canvas.height; - this.lastPoint = point; - const maskData = this.maskCTX.getImageData(0, 0, this.width, this.height); - this.maskData = maskData.data; - this.imageData = this.imageCTX.getImageData( - 0, - 0, - this.width, - this.height - ).data; - if (this.applyWholeImage) { - const targetPixel = this.getPixel( - Math.floor(point.x), - Math.floor(point.y) - ); - const maskColor = await this.messageBroker.pull("getMaskColor"); - const width = this.width; - const height = this.height; - const CHUNK_SIZE = 1e4; - for (let i = 0; i < width * height; i += CHUNK_SIZE) { - const endIndex = Math.min(i + CHUNK_SIZE, width * height); - for (let pixelIndex = i; pixelIndex < endIndex; pixelIndex++) { - const x = pixelIndex % width; - const y = Math.floor(pixelIndex / width); - if (this.isPixelInRange(this.getPixel(x, y), targetPixel)) { - this.setPixel(x, y, 255, maskColor); - } - } - await new Promise((resolve) => setTimeout(resolve, 0)); - } + __name(Unzip2, "Unzip"); + Unzip2.prototype.push = function(chunk, final) { + var _this = this; + if (!this.onfile) + err(5); + if (!this.p) + err(4); + if (this.c > 0) { + var len = Math.min(this.c, chunk.length); + var toAdd = chunk.subarray(0, len); + this.c -= len; + if (this.d) + this.d.push(toAdd, !this.c); + else + this.k[0].push(toAdd); + chunk = chunk.subarray(len); + if (chunk.length) + return this.push(chunk, final); } else { - let startX = Math.floor(point.x); - let startY = Math.floor(point.y); - if (startX < 0 || startX >= this.width || startY < 0 || startY >= this.height) { - return; + var f = 0, i = 0, is = void 0, buf = void 0; + if (!this.p.length) + buf = chunk; + else if (!chunk.length) + buf = this.p; + else { + buf = new u8(this.p.length + chunk.length); + buf.set(this.p), buf.set(chunk, this.p.length); } - const pixel = this.getPixel(startX, startY); - const stack = []; - const visited = new Uint8Array(this.width * this.height); - stack.push([startX, startY]); - const maskColor = await this.messageBroker.pull("getMaskColor"); - while (stack.length > 0) { - const [x, y] = stack.pop(); - const visitedIndex = y * this.width + x; - if (visited[visitedIndex] || !this.isPixelInRange(this.getPixel(x, y), pixel)) { - continue; - } - visited[visitedIndex] = 1; - this.setPixel(x, y, 255, maskColor); - if (x > 0 && !visited[y * this.width + (x - 1)] && this.isPixelInRange(this.getPixel(x - 1, y), pixel)) { - if (!this.maskBoundry || 255 - this.getMaskAlpha(x - 1, y) > this.maskTolerance) { - stack.push([x - 1, y]); - } - } - if (x < this.width - 1 && !visited[y * this.width + (x + 1)] && this.isPixelInRange(this.getPixel(x + 1, y), pixel)) { - if (!this.maskBoundry || 255 - this.getMaskAlpha(x + 1, y) > this.maskTolerance) { - stack.push([x + 1, y]); - } - } - if (y > 0 && !visited[(y - 1) * this.width + x] && this.isPixelInRange(this.getPixel(x, y - 1), pixel)) { - if (!this.maskBoundry || 255 - this.getMaskAlpha(x, y - 1) > this.maskTolerance) { - stack.push([x, y - 1]); + var l = buf.length, oc = this.c, add = oc && this.d; + var _loop_2 = /* @__PURE__ */ __name(function() { + var _a2; + var sig = b4(buf, i); + if (sig == 67324752) { + f = 1, is = i; + this_1.d = null; + this_1.c = 0; + 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); + if (l > i + 30 + fnl + es) { + var chks_3 = []; + this_1.k.unshift(chks_3); + f = 2; + var sc_1 = b4(buf, i + 18), su_1 = b4(buf, i + 22); + var fn_1 = strFromU8(buf.subarray(i + 30, i += 30 + fnl), !u); + if (sc_1 == 4294967295) { + _a2 = dd ? [-2] : z64e(buf, i), sc_1 = _a2[0], su_1 = _a2[1]; + } else if (dd) + sc_1 = -1; + i += es; + this_1.c = sc_1; + var d_1; + var file_1 = { + name: fn_1, + compression: cmp_1, + start: /* @__PURE__ */ __name(function() { + if (!file_1.ondata) + err(5); + if (!sc_1) + file_1.ondata(null, et, true); + else { + var ctr = _this.o[cmp_1]; + if (!ctr) + file_1.ondata(err(14, "unknown compression type " + cmp_1, 1), null, false); + d_1 = sc_1 < 0 ? new ctr(fn_1) : new ctr(fn_1, sc_1, su_1); + d_1.ondata = function(err2, dat3, final2) { + file_1.ondata(err2, dat3, final2); + }; + for (var _i = 0, chks_4 = chks_3; _i < chks_4.length; _i++) { + var dat2 = chks_4[_i]; + d_1.push(dat2, false); + } + if (_this.k[0] == chks_3 && _this.c) + _this.d = d_1; + else + d_1.push(et, true); + } + }, "start"), + terminate: /* @__PURE__ */ __name(function() { + if (d_1 && d_1.terminate) + d_1.terminate(); + }, "terminate") + }; + if (sc_1 >= 0) + file_1.size = sc_1, file_1.originalSize = su_1; + this_1.onfile(file_1); } - } - if (y < this.height - 1 && !visited[(y + 1) * this.width + x] && this.isPixelInRange(this.getPixel(x, y + 1), pixel)) { - if (!this.maskBoundry || 255 - this.getMaskAlpha(x, y + 1) > this.maskTolerance) { - stack.push([x, y + 1]); + return "break"; + } else if (oc) { + if (sig == 134695760) { + is = i += 12 + (oc == -2 && 8), f = 3, this_1.c = 0; + return "break"; + } else if (sig == 33639248) { + is = i -= 4, f = 3, this_1.c = 0; + return "break"; } } + }, "_loop_2"); + var this_1 = this; + for (; i < l - 4; ++i) { + var state_1 = _loop_2(); + if (state_1 === "break") + break; } + this.p = et; + if (oc < 0) { + var dat = f ? buf.subarray(0, is - 12 - (oc == -2 && 8) - (b4(buf, is - 16) == 134695760 && 4)) : buf.subarray(0, i); + if (add) + add.push(dat, !!f); + else + this.k[+(f == 2)].push(dat); + } + if (f & 2) + return this.push(buf.subarray(i), final); + this.p = buf.subarray(i); } - this.maskCTX.putImageData(maskData, 0, 0); - this.messageBroker.publish("saveState"); - this.maskData = null; - this.imageData = null; - } - setTolerance(tolerance) { - this.tolerance = tolerance; - if (this.lastPoint && this.livePreview) { - this.messageBroker.publish("undo"); - this.fillColorSelection(this.lastPoint); - } - } - setLivePreview(livePreview) { - this.livePreview = livePreview; - } - setComparisonMethod(method) { - this.colorComparisonMethod = method; - if (this.lastPoint && this.livePreview) { - this.messageBroker.publish("undo"); - this.fillColorSelection(this.lastPoint); - } - } - clearLastPoint() { - this.lastPoint = null; - } - setApplyWholeImage(applyWholeImage) { - this.applyWholeImage = applyWholeImage; - } - setMaskBoundary(maskBoundry) { - this.maskBoundry = maskBoundry; - } - setMaskTolerance(maskTolerance) { - this.maskTolerance = maskTolerance; - } -} -class BrushTool { - static { - __name(this, "BrushTool"); - } - brushSettings; - //this saves the current brush settings - maskBlendMode; - isDrawing = false; - isDrawingLine = false; - lineStartPoint = null; - smoothingPrecision = 10; - smoothingCordsArray = []; - smoothingLastDrawTime; - maskCtx = null; - initialDraw = true; - brushStrokeCanvas = null; - brushStrokeCtx = null; - //brush adjustment - isBrushAdjusting = false; - brushPreviewGradient = null; - initialPoint = null; - useDominantAxis = false; - brushAdjustmentSpeed = 1; - maskEditor; - messageBroker; - constructor(maskEditor) { - this.maskEditor = maskEditor; - this.messageBroker = maskEditor.getMessageBroker(); - this.createListeners(); - this.addPullTopics(); - this.useDominantAxis = app.extensionManager.setting.get( - "Comfy.MaskEditor.UseDominantAxis" - ); - this.brushAdjustmentSpeed = app.extensionManager.setting.get( - "Comfy.MaskEditor.BrushAdjustmentSpeed" - ); - this.brushSettings = { - size: 10, - opacity: 100, - hardness: 1, - type: "arc" - /* Arc */ - }; - this.maskBlendMode = "black"; - } - createListeners() { - this.messageBroker.subscribe( - "setBrushSize", - (size) => this.setBrushSize(size) - ); - this.messageBroker.subscribe( - "setBrushOpacity", - (opacity) => this.setBrushOpacity(opacity) - ); - this.messageBroker.subscribe( - "setBrushHardness", - (hardness) => this.setBrushHardness(hardness) - ); - this.messageBroker.subscribe( - "setBrushShape", - (type) => this.setBrushType(type) - ); - this.messageBroker.subscribe( - "setBrushSmoothingPrecision", - (precision) => this.setBrushSmoothingPrecision(precision) - ); - this.messageBroker.subscribe( - "brushAdjustmentStart", - (event) => this.startBrushAdjustment(event) - ); - this.messageBroker.subscribe( - "brushAdjustment", - (event) => this.handleBrushAdjustment(event) - ); - this.messageBroker.subscribe( - "drawStart", - (event) => this.startDrawing(event) - ); - this.messageBroker.subscribe( - "draw", - (event) => this.handleDrawing(event) - ); - this.messageBroker.subscribe( - "drawEnd", - (event) => this.drawEnd(event) - ); - } - addPullTopics() { - this.messageBroker.createPullTopic( - "brushSize", - async () => this.brushSettings.size - ); - this.messageBroker.createPullTopic( - "brushOpacity", - async () => this.brushSettings.opacity - ); - this.messageBroker.createPullTopic( - "brushHardness", - async () => this.brushSettings.hardness - ); - this.messageBroker.createPullTopic( - "brushType", - async () => this.brushSettings.type - ); - this.messageBroker.createPullTopic( - "maskBlendMode", - async () => this.maskBlendMode - ); - this.messageBroker.createPullTopic( - "brushSettings", - async () => this.brushSettings - ); - } - async createBrushStrokeCanvas() { - if (this.brushStrokeCanvas !== null) { - return; - } - const maskCanvas = await this.messageBroker.pull("maskCanvas"); - const canvas = document.createElement("canvas"); - canvas.width = maskCanvas.width; - canvas.height = maskCanvas.height; - this.brushStrokeCanvas = canvas; - this.brushStrokeCtx = canvas.getContext("2d"); - } - async startDrawing(event) { - this.isDrawing = true; - let compositionOp; - let currentTool = await this.messageBroker.pull("currentTool"); - let coords = { x: event.offsetX, y: event.offsetY }; - let coords_canvas = await this.messageBroker.pull("screenToCanvas", coords); - await this.createBrushStrokeCanvas(); - if (currentTool === "eraser" || event.buttons == 2) { - compositionOp = "destination-out"; - } else { - compositionOp = "source-over"; - } - if (event.shiftKey && this.lineStartPoint) { - this.isDrawingLine = true; - this.drawLine(this.lineStartPoint, coords_canvas, compositionOp); - } else { - this.isDrawingLine = false; - this.init_shape(compositionOp); - this.draw_shape(coords_canvas); + if (final) { + if (this.c) + err(13); + this.p = null; + } + }; + Unzip2.prototype.register = function(decoder) { + this.o[decoder.compression] = decoder; + }; + return Unzip2; +}(); +var mt = typeof queueMicrotask == "function" ? queueMicrotask : typeof setTimeout == "function" ? setTimeout : function(fn) { + fn(); +}; +function unzip(data, opts, cb) { + if (!cb) + cb = opts, opts = {}; + if (typeof cb != "function") + err(7); + var term = []; + var tAll = /* @__PURE__ */ __name(function() { + for (var i2 = 0; i2 < term.length; ++i2) + term[i2](); + }, "tAll"); + var files = {}; + var cbd = /* @__PURE__ */ __name(function(a, b) { + mt(function() { + cb(a, b); + }); + }, "cbd"); + mt(function() { + cbd = cb; + }); + var e = data.length - 22; + for (; b4(data, e) != 101010256; --e) { + if (!e || data.length - e > 65558) { + cbd(err(13, 0, 1), null); + return tAll; } - this.lineStartPoint = coords_canvas; - this.smoothingCordsArray = [coords_canvas]; - this.smoothingLastDrawTime = /* @__PURE__ */ new Date(); } - async handleDrawing(event) { - var diff = performance.now() - this.smoothingLastDrawTime.getTime(); - let coords = { x: event.offsetX, y: event.offsetY }; - let coords_canvas = await this.messageBroker.pull("screenToCanvas", coords); - let currentTool = await this.messageBroker.pull("currentTool"); - if (diff > 20 && !this.isDrawing) - requestAnimationFrame(() => { - this.init_shape( - "source-over" - /* SourceOver */ - ); - this.draw_shape(coords_canvas); - this.smoothingCordsArray.push(coords_canvas); - }); - else - requestAnimationFrame(() => { - if (currentTool === "eraser" || event.buttons == 2) { - this.init_shape( - "destination-out" - /* DestinationOut */ - ); + ; + var lft = b2(data, e + 8); + if (lft) { + var c = lft; + var o = b4(data, e + 16); + var z = o == 4294967295 || c == 65535; + if (z) { + var ze = b4(data, e - 12); + z = b4(data, ze) == 101075792; + if (z) { + c = lft = b4(data, ze + 32); + o = b4(data, ze + 48); + } + } + var fltr = opts && opts.filter; + var _loop_3 = /* @__PURE__ */ __name(function(i2) { + var _a2 = zh(data, o, z), c_1 = _a2[0], sc = _a2[1], su = _a2[2], fn = _a2[3], no = _a2[4], off = _a2[5], b = slzh(data, off); + o = no; + var cbl = /* @__PURE__ */ __name(function(e2, d) { + if (e2) { + tAll(); + cbd(e2, null); } else { - this.init_shape( - "source-over" - /* SourceOver */ - ); + if (d) + files[fn] = d; + if (!--lft) + cbd(null, files); } - this.drawWithBetterSmoothing(coords_canvas); - }); - this.smoothingLastDrawTime = /* @__PURE__ */ new Date(); - } - async drawEnd(event) { - const coords = { x: event.offsetX, y: event.offsetY }; - const coords_canvas = await this.messageBroker.pull( - "screenToCanvas", - coords - ); - if (this.isDrawing) { - this.isDrawing = false; - this.messageBroker.publish("saveState"); - this.lineStartPoint = coords_canvas; - this.initialDraw = true; + }, "cbl"); + if (!fltr || fltr({ + name: fn, + size: sc, + originalSize: su, + compression: c_1 + })) { + if (!c_1) + cbl(null, slc(data, b, b + sc)); + else if (c_1 == 8) { + var infl = data.subarray(b, b + sc); + if (su < 524288 || sc > 0.8 * su) { + try { + cbl(null, inflateSync(infl, { out: new u8(su) })); + } catch (e2) { + cbl(e2, null); + } + } else + term.push(inflate(infl, { size: su }, cbl)); + } else + cbl(err(14, "unknown compression type " + c_1, 1), null); + } else + cbl(null, null); + }, "_loop_3"); + for (var i = 0; i < c; ++i) { + _loop_3(i); } + } else + cbd(null, {}); + return tAll; +} +__name(unzip, "unzip"); +function unzipSync(data, opts) { + var files = {}; + var e = data.length - 22; + for (; b4(data, e) != 101010256; --e) { + if (!e || data.length - e > 65558) + err(13); } - drawWithBetterSmoothing(point) { - if (!this.smoothingCordsArray) { - this.smoothingCordsArray = []; - } - const opacityConstant = 1 / (1 + Math.exp(3)); - const interpolatedOpacity = 1 / (1 + Math.exp(-6 * (this.brushSettings.opacity - 0.5))) - opacityConstant; - this.smoothingCordsArray.push(point); - const POINTS_NR = 5; - if (this.smoothingCordsArray.length < POINTS_NR) { - return; - } - let totalLength = 0; - const points = this.smoothingCordsArray; - const len = points.length - 1; - let dx, dy; - for (let i = 0; i < len; i++) { - dx = points[i + 1].x - points[i].x; - dy = points[i + 1].y - points[i].y; - totalLength += Math.sqrt(dx * dx + dy * dy); - } - const distanceBetweenPoints = this.brushSettings.size / this.smoothingPrecision * 6; - const stepNr = Math.ceil(totalLength / distanceBetweenPoints); - let interpolatedPoints = points; - if (stepNr > 0) { - interpolatedPoints = this.generateEquidistantPoints( - this.smoothingCordsArray, - distanceBetweenPoints - // Distance between interpolated points - ); - } - if (!this.initialDraw) { - const spliceIndex = interpolatedPoints.findIndex( - (point2) => point2.x === this.smoothingCordsArray[2].x && point2.y === this.smoothingCordsArray[2].y - ); - if (spliceIndex !== -1) { - interpolatedPoints = interpolatedPoints.slice(spliceIndex + 1); - } + ; + var c = b2(data, e + 8); + if (!c) + return {}; + var o = b4(data, e + 16); + var z = o == 4294967295 || c == 65535; + if (z) { + var ze = b4(data, e - 12); + z = b4(data, ze) == 101075792; + if (z) { + c = b4(data, ze + 32); + o = b4(data, ze + 48); } - for (const point2 of interpolatedPoints) { - this.draw_shape(point2, interpolatedOpacity); + } + var fltr = opts && opts.filter; + for (var i = 0; i < c; ++i) { + var _a2 = zh(data, o, z), c_2 = _a2[0], sc = _a2[1], su = _a2[2], fn = _a2[3], no = _a2[4], off = _a2[5], b = slzh(data, off); + o = no; + if (!fltr || fltr({ + name: fn, + size: sc, + originalSize: su, + compression: c_2 + })) { + if (!c_2) + files[fn] = slc(data, b, b + sc); + else if (c_2 == 8) + files[fn] = inflateSync(data.subarray(b, b + sc), { out: new u8(su) }); + else + err(14, "unknown compression type " + c_2); } - if (!this.initialDraw) { - this.smoothingCordsArray = this.smoothingCordsArray.slice(2); + } + return files; +} +__name(unzipSync, "unzipSync"); +function findSpan(p, u, U) { + const n = U.length - p - 1; + if (u >= U[n]) { + return n - 1; + } + if (u <= U[p]) { + return p; + } + let low = p; + let high = n; + let mid = Math.floor((low + high) / 2); + while (u < U[mid] || u >= U[mid + 1]) { + if (u < U[mid]) { + high = mid; } else { - this.initialDraw = false; + low = mid; } + mid = Math.floor((low + high) / 2); } - async drawLine(p1, p2, compositionOp) { - const brush_size = await this.messageBroker.pull("brushSize"); - const distance = Math.sqrt((p2.x - p1.x) ** 2 + (p2.y - p1.y) ** 2); - const steps = Math.ceil( - distance / (brush_size / this.smoothingPrecision * 4) - ); - const interpolatedOpacity = 1 / (1 + Math.exp(-6 * (this.brushSettings.opacity - 0.5))) - 1 / (1 + Math.exp(3)); - this.init_shape(compositionOp); - for (let i = 0; i <= steps; i++) { - const t2 = i / steps; - const x = p1.x + (p2.x - p1.x) * t2; - const y = p1.y + (p2.y - p1.y) * t2; - const point = { x, y }; - this.draw_shape(point, interpolatedOpacity); + return mid; +} +__name(findSpan, "findSpan"); +function calcBasisFunctions(span, u, p, U) { + const N = []; + const left = []; + const right = []; + N[0] = 1; + for (let j = 1; j <= p; ++j) { + left[j] = u - U[span + 1 - j]; + right[j] = U[span + j] - u; + let saved = 0; + for (let r = 0; r < j; ++r) { + const rv = right[r + 1]; + const lv = left[j - r]; + const temp = N[r] / (rv + lv); + N[r] = saved + rv * temp; + saved = lv * temp; } + N[j] = saved; } - //brush adjustment - async startBrushAdjustment(event) { - event.preventDefault(); - const coords = { x: event.offsetX, y: event.offsetY }; - let coords_canvas = await this.messageBroker.pull("screenToCanvas", coords); - this.messageBroker.publish("setBrushPreviewGradientVisibility", true); - this.initialPoint = coords_canvas; - this.isBrushAdjusting = true; - return; + return N; +} +__name(calcBasisFunctions, "calcBasisFunctions"); +function calcBSplinePoint(p, U, P, u) { + const span = findSpan(p, u, U); + const N = calcBasisFunctions(span, u, p, U); + const C = new Vector4(0, 0, 0, 0); + for (let j = 0; j <= p; ++j) { + const point = P[span - p + j]; + const Nj = N[j]; + const wNj = point.w * Nj; + C.x += point.x * wNj; + C.y += point.y * wNj; + C.z += point.z * wNj; + C.w += point.w * Nj; } - async handleBrushAdjustment(event) { - const coords = { x: event.offsetX, y: event.offsetY }; - const brushDeadZone = 5; - let coords_canvas = await this.messageBroker.pull("screenToCanvas", coords); - const delta_x = coords_canvas.x - this.initialPoint.x; - const delta_y = coords_canvas.y - this.initialPoint.y; - const effectiveDeltaX = Math.abs(delta_x) < brushDeadZone ? 0 : delta_x; - const effectiveDeltaY = Math.abs(delta_y) < brushDeadZone ? 0 : delta_y; - let finalDeltaX = effectiveDeltaX; - let finalDeltaY = effectiveDeltaY; - console.log(this.useDominantAxis); - if (this.useDominantAxis) { - const ratio = Math.abs(effectiveDeltaX) / Math.abs(effectiveDeltaY); - const threshold = 2; - if (ratio > threshold) { - finalDeltaY = 0; - } else if (ratio < 1 / threshold) { - finalDeltaX = 0; - } + return C; +} +__name(calcBSplinePoint, "calcBSplinePoint"); +function calcBasisFunctionDerivatives(span, u, p, n, U) { + const zeroArr = []; + for (let i = 0; i <= p; ++i) + zeroArr[i] = 0; + const ders = []; + for (let i = 0; i <= n; ++i) + ders[i] = zeroArr.slice(0); + const ndu = []; + for (let i = 0; i <= p; ++i) + ndu[i] = zeroArr.slice(0); + ndu[0][0] = 1; + const left = zeroArr.slice(0); + const right = zeroArr.slice(0); + for (let j = 1; j <= p; ++j) { + left[j] = u - U[span + 1 - j]; + right[j] = U[span + j] - u; + let saved = 0; + for (let r2 = 0; r2 < j; ++r2) { + const rv = right[r2 + 1]; + const lv = left[j - r2]; + ndu[j][r2] = rv + lv; + const temp = ndu[r2][j - 1] / ndu[j][r2]; + ndu[r2][j] = saved + rv * temp; + saved = lv * temp; } - const cappedDeltaX = Math.max(-100, Math.min(100, finalDeltaX)); - const cappedDeltaY = Math.max(-100, Math.min(100, finalDeltaY)); - const sizeDelta = cappedDeltaX / 40; - const hardnessDelta = cappedDeltaY / 800; - const newSize = Math.max( - 1, - Math.min( - 100, - this.brushSettings.size + cappedDeltaX / 35 * this.brushAdjustmentSpeed - ) - ); - const newHardness = Math.max( - 0, - Math.min( - 1, - this.brushSettings.hardness - cappedDeltaY / 4e3 * this.brushAdjustmentSpeed - ) - ); - this.brushSettings.size = newSize; - this.brushSettings.hardness = newHardness; - this.messageBroker.publish("updateBrushPreview"); + ndu[j][j] = saved; } - //helper functions - async draw_shape(point, overrideOpacity) { - const brushSettings = this.brushSettings; - const maskCtx = this.maskCtx || await this.messageBroker.pull("maskCtx"); - const brushType = await this.messageBroker.pull("brushType"); - const maskColor = await this.messageBroker.pull("getMaskColor"); - const size = brushSettings.size; - const sliderOpacity = brushSettings.opacity; - const opacity = overrideOpacity == void 0 ? sliderOpacity : overrideOpacity; - const hardness = brushSettings.hardness; - const x = point.x; - const y = point.y; - const extendedSize = size * (2 - hardness); - let gradient = maskCtx.createRadialGradient(x, y, 0, x, y, extendedSize); - const isErasing = maskCtx.globalCompositeOperation === "destination-out"; - if (hardness === 1) { - console.log(sliderOpacity, opacity); - gradient.addColorStop( - 0, - isErasing ? `rgba(255, 255, 255, ${opacity})` : `rgba(${maskColor.r}, ${maskColor.g}, ${maskColor.b}, ${opacity})` - ); - gradient.addColorStop( - 1, - isErasing ? `rgba(255, 255, 255, ${opacity})` : `rgba(${maskColor.r}, ${maskColor.g}, ${maskColor.b}, ${opacity})` - ); - } else { - let softness = 1 - hardness; - let innerStop = Math.max(0, hardness - softness); - let outerStop = size / extendedSize; - if (isErasing) { - gradient.addColorStop(0, `rgba(255, 255, 255, ${opacity})`); - gradient.addColorStop(innerStop, `rgba(255, 255, 255, ${opacity})`); - gradient.addColorStop(outerStop, `rgba(255, 255, 255, ${opacity / 2})`); - gradient.addColorStop(1, `rgba(255, 255, 255, 0)`); - } else { - gradient.addColorStop( - 0, - `rgba(${maskColor.r}, ${maskColor.g}, ${maskColor.b}, ${opacity})` - ); - gradient.addColorStop( - innerStop, - `rgba(${maskColor.r}, ${maskColor.g}, ${maskColor.b}, ${opacity})` - ); - gradient.addColorStop( - outerStop, - `rgba(${maskColor.r}, ${maskColor.g}, ${maskColor.b}, ${opacity / 2})` - ); - gradient.addColorStop( - 1, - `rgba(${maskColor.r}, ${maskColor.g}, ${maskColor.b}, 0)` - ); + for (let j = 0; j <= p; ++j) { + ders[0][j] = ndu[j][p]; + } + for (let r2 = 0; r2 <= p; ++r2) { + let s1 = 0; + let s2 = 1; + const a = []; + for (let i = 0; i <= p; ++i) { + a[i] = zeroArr.slice(0); + } + a[0][0] = 1; + for (let k = 1; k <= n; ++k) { + let d = 0; + const rk = r2 - k; + const pk = p - k; + if (r2 >= k) { + a[s2][0] = a[s1][0] / ndu[pk + 1][rk]; + d = a[s2][0] * ndu[rk][pk]; + } + const j1 = rk >= -1 ? 1 : -rk; + const j2 = r2 - 1 <= pk ? k - 1 : p - r2; + for (let j3 = j1; j3 <= j2; ++j3) { + a[s2][j3] = (a[s1][j3] - a[s1][j3 - 1]) / ndu[pk + 1][rk + j3]; + d += a[s2][j3] * ndu[rk + j3][pk]; + } + if (r2 <= pk) { + a[s2][k] = -a[s1][k - 1] / ndu[pk + 1][r2]; + d += a[s2][k] * ndu[r2][pk]; } + ders[k][r2] = d; + const j = s1; + s1 = s2; + s2 = j; } - maskCtx.fillStyle = gradient; - maskCtx.beginPath(); - if (brushType === "rect") { - maskCtx.rect( - x - extendedSize, - y - extendedSize, - extendedSize * 2, - extendedSize * 2 - ); - } else { - maskCtx.arc(x, y, extendedSize, 0, Math.PI * 2, false); + } + let r = p; + for (let k = 1; k <= n; ++k) { + for (let j = 0; j <= p; ++j) { + ders[k][j] *= r; } - maskCtx.fill(); + r *= p - k; + } + return ders; +} +__name(calcBasisFunctionDerivatives, "calcBasisFunctionDerivatives"); +function calcBSplineDerivatives(p, U, P, u, nd) { + const du = nd < p ? nd : p; + const CK = []; + const span = findSpan(p, u, U); + const nders = calcBasisFunctionDerivatives(span, u, p, du, U); + const Pw = []; + for (let i = 0; i < P.length; ++i) { + const point = P[i].clone(); + const w = point.w; + point.x *= w; + point.y *= w; + point.z *= w; + Pw[i] = point; + } + for (let k = 0; k <= du; ++k) { + const point = Pw[span - p].clone().multiplyScalar(nders[k][0]); + for (let j = 1; j <= p; ++j) { + point.add(Pw[span - p + j].clone().multiplyScalar(nders[k][j])); + } + CK[k] = point; + } + for (let k = du + 1; k <= nd + 1; ++k) { + CK[k] = new Vector4(0, 0, 0); + } + return CK; +} +__name(calcBSplineDerivatives, "calcBSplineDerivatives"); +function calcKoverI(k, i) { + let nom = 1; + for (let j = 2; j <= k; ++j) { + nom *= j; + } + let denom = 1; + for (let j = 2; j <= i; ++j) { + denom *= j; } - async init_shape(compositionOperation) { - const maskBlendMode = await this.messageBroker.pull("maskBlendMode"); - const maskCtx = this.maskCtx || await this.messageBroker.pull("maskCtx"); - maskCtx.beginPath(); - if (compositionOperation == "source-over") { - maskCtx.fillStyle = maskBlendMode; - maskCtx.globalCompositeOperation = "source-over"; - } else if (compositionOperation == "destination-out") { - maskCtx.globalCompositeOperation = "destination-out"; - } + for (let j = 2; j <= k - i; ++j) { + denom *= j; } - calculateCubicSplinePoints(points, numSegments = 10) { - const result = []; - const xCoords = points.map((p) => p.x); - const yCoords = points.map((p) => p.y); - const xDerivatives = this.calculateSplineCoefficients(xCoords); - const yDerivatives = this.calculateSplineCoefficients(yCoords); - for (let i = 0; i < points.length - 1; i++) { - const p0 = points[i]; - const p1 = points[i + 1]; - const d0x = xDerivatives[i]; - const d1x = xDerivatives[i + 1]; - const d0y = yDerivatives[i]; - const d1y = yDerivatives[i + 1]; - for (let t2 = 0; t2 <= numSegments; t2++) { - const t_normalized = t2 / numSegments; - const h00 = 2 * t_normalized ** 3 - 3 * t_normalized ** 2 + 1; - const h10 = t_normalized ** 3 - 2 * t_normalized ** 2 + t_normalized; - const h01 = -2 * t_normalized ** 3 + 3 * t_normalized ** 2; - const h11 = t_normalized ** 3 - t_normalized ** 2; - const x = h00 * p0.x + h10 * d0x + h01 * p1.x + h11 * d1x; - const y = h00 * p0.y + h10 * d0y + h01 * p1.y + h11 * d1y; - result.push({ x, y }); - } - } - return result; + return nom / denom; +} +__name(calcKoverI, "calcKoverI"); +function calcRationalCurveDerivatives(Pders) { + const nd = Pders.length; + const Aders = []; + const wders = []; + for (let i = 0; i < nd; ++i) { + const point = Pders[i]; + Aders[i] = new Vector3(point.x, point.y, point.z); + wders[i] = point.w; } - generateEvenlyDistributedPoints(splinePoints, numPoints) { - const distances = [0]; - for (let i = 1; i < splinePoints.length; i++) { - const dx = splinePoints[i].x - splinePoints[i - 1].x; - const dy = splinePoints[i].y - splinePoints[i - 1].y; - const dist = Math.hypot(dx, dy); - distances.push(distances[i - 1] + dist); - } - const totalLength = distances[distances.length - 1]; - const interval = totalLength / (numPoints - 1); - const result = []; - let currentIndex = 0; - for (let i = 0; i < numPoints; i++) { - const targetDistance = i * interval; - while (currentIndex < distances.length - 1 && distances[currentIndex + 1] < targetDistance) { - currentIndex++; - } - const t2 = (targetDistance - distances[currentIndex]) / (distances[currentIndex + 1] - distances[currentIndex]); - const x = splinePoints[currentIndex].x + t2 * (splinePoints[currentIndex + 1].x - splinePoints[currentIndex].x); - const y = splinePoints[currentIndex].y + t2 * (splinePoints[currentIndex + 1].y - splinePoints[currentIndex].y); - result.push({ x, y }); + const CK = []; + for (let k = 0; k < nd; ++k) { + const v = Aders[k].clone(); + for (let i = 1; i <= k; ++i) { + v.sub(CK[k - i].clone().multiplyScalar(calcKoverI(k, i) * wders[i])); } - return result; + CK[k] = v.divideScalar(wders[0]); } - generateEquidistantPoints(points, distance) { - const result = []; - const cumulativeDistances = [0]; - for (let i = 1; i < points.length; i++) { - const dx = points[i].x - points[i - 1].x; - const dy = points[i].y - points[i - 1].y; - const dist = Math.hypot(dx, dy); - cumulativeDistances[i] = cumulativeDistances[i - 1] + dist; + return CK; +} +__name(calcRationalCurveDerivatives, "calcRationalCurveDerivatives"); +function calcNURBSDerivatives(p, U, P, u, nd) { + const Pders = calcBSplineDerivatives(p, U, P, u, nd); + return calcRationalCurveDerivatives(Pders); +} +__name(calcNURBSDerivatives, "calcNURBSDerivatives"); +function calcSurfacePoint(p, q, U, V, P, u, v, target) { + const uspan = findSpan(p, u, U); + const vspan = findSpan(q, v, V); + const Nu = calcBasisFunctions(uspan, u, p, U); + const Nv = calcBasisFunctions(vspan, v, q, V); + const temp = []; + for (let l = 0; l <= q; ++l) { + temp[l] = new Vector4(0, 0, 0, 0); + for (let k = 0; k <= p; ++k) { + const point = P[uspan - p + k][vspan - q + l].clone(); + const w = point.w; + point.x *= w; + point.y *= w; + point.z *= w; + temp[l].add(point.multiplyScalar(Nu[k])); } - const totalLength = cumulativeDistances[cumulativeDistances.length - 1]; - const numPoints = Math.floor(totalLength / distance); - for (let i = 0; i <= numPoints; i++) { - const targetDistance = i * distance; - let idx = 0; - while (idx < cumulativeDistances.length - 1 && cumulativeDistances[idx + 1] < targetDistance) { - idx++; - } - if (idx >= points.length - 1) { - result.push(points[points.length - 1]); - continue; + } + const Sw = new Vector4(0, 0, 0, 0); + for (let l = 0; l <= q; ++l) { + Sw.add(temp[l].multiplyScalar(Nv[l])); + } + Sw.divideScalar(Sw.w); + target.set(Sw.x, Sw.y, Sw.z); +} +__name(calcSurfacePoint, "calcSurfacePoint"); +function calcVolumePoint(p, q, r, U, V, W, P, u, v, w, target) { + const uspan = findSpan(p, u, U); + const vspan = findSpan(q, v, V); + const wspan = findSpan(r, w, W); + const Nu = calcBasisFunctions(uspan, u, p, U); + const Nv = calcBasisFunctions(vspan, v, q, V); + const Nw = calcBasisFunctions(wspan, w, r, W); + const temp = []; + for (let m = 0; m <= r; ++m) { + temp[m] = []; + for (let l = 0; l <= q; ++l) { + temp[m][l] = new Vector4(0, 0, 0, 0); + for (let k = 0; k <= p; ++k) { + const point = P[uspan - p + k][vspan - q + l][wspan - r + m].clone(); + const w2 = point.w; + point.x *= w2; + point.y *= w2; + point.z *= w2; + temp[m][l].add(point.multiplyScalar(Nu[k])); } - const d0 = cumulativeDistances[idx]; - const d1 = cumulativeDistances[idx + 1]; - const t2 = (targetDistance - d0) / (d1 - d0); - const x = points[idx].x + t2 * (points[idx + 1].x - points[idx].x); - const y = points[idx].y + t2 * (points[idx + 1].y - points[idx].y); - result.push({ x, y }); } - return result; } - calculateSplineCoefficients(values) { - const n = values.length - 1; - const matrix = new Array(n + 1).fill(0).map(() => new Array(n + 1).fill(0)); - const rhs = new Array(n + 1).fill(0); - for (let i = 1; i < n; i++) { - matrix[i][i - 1] = 1; - matrix[i][i] = 4; - matrix[i][i + 1] = 1; - rhs[i] = 3 * (values[i + 1] - values[i - 1]); + const Sw = new Vector4(0, 0, 0, 0); + for (let m = 0; m <= r; ++m) { + for (let l = 0; l <= q; ++l) { + Sw.add(temp[m][l].multiplyScalar(Nw[m]).multiplyScalar(Nv[l])); } - matrix[0][0] = 2; - matrix[0][1] = 1; - matrix[n][n - 1] = 1; - matrix[n][n] = 2; - rhs[0] = 3 * (values[1] - values[0]); - rhs[n] = 3 * (values[n] - values[n - 1]); - for (let i = 1; i <= n; i++) { - const m = matrix[i][i - 1] / matrix[i - 1][i - 1]; - matrix[i][i] -= m * matrix[i - 1][i]; - rhs[i] -= m * rhs[i - 1]; + } + Sw.divideScalar(Sw.w); + target.set(Sw.x, Sw.y, Sw.z); +} +__name(calcVolumePoint, "calcVolumePoint"); +class NURBSCurve extends Curve { + static { + __name(this, "NURBSCurve"); + } + constructor(degree, knots, controlPoints, startKnot, endKnot) { + super(); + const knotsLength = knots ? knots.length - 1 : 0; + const pointsLength = controlPoints ? controlPoints.length : 0; + this.degree = degree; + this.knots = knots; + this.controlPoints = []; + this.startKnot = startKnot || 0; + this.endKnot = endKnot || knotsLength; + for (let i = 0; i < pointsLength; ++i) { + const point = controlPoints[i]; + this.controlPoints[i] = new Vector4(point.x, point.y, point.z, point.w); } - const solution = new Array(n + 1); - solution[n] = rhs[n] / matrix[n][n]; - for (let i = n - 1; i >= 0; i--) { - solution[i] = (rhs[i] - matrix[i][i + 1] * solution[i + 1]) / matrix[i][i]; + } + getPoint(t2, optionalTarget = new Vector3()) { + const point = optionalTarget; + const u = this.knots[this.startKnot] + t2 * (this.knots[this.endKnot] - this.knots[this.startKnot]); + const hpoint = calcBSplinePoint(this.degree, this.knots, this.controlPoints, u); + if (hpoint.w !== 1) { + hpoint.divideScalar(hpoint.w); } - return solution; + return point.set(hpoint.x, hpoint.y, hpoint.z); } - setBrushSize(size) { - this.brushSettings.size = size; + getTangent(t2, optionalTarget = new Vector3()) { + const tangent = optionalTarget; + const u = this.knots[0] + t2 * (this.knots[this.knots.length - 1] - this.knots[0]); + const ders = calcNURBSDerivatives(this.degree, this.knots, this.controlPoints, u, 1); + tangent.copy(ders[1]).normalize(); + return tangent; } - setBrushOpacity(opacity) { - this.brushSettings.opacity = opacity; + toJSON() { + const data = super.toJSON(); + data.degree = this.degree; + data.knots = [...this.knots]; + data.controlPoints = this.controlPoints.map((p) => p.toArray()); + data.startKnot = this.startKnot; + data.endKnot = this.endKnot; + return data; } - setBrushHardness(hardness) { - this.brushSettings.hardness = hardness; + fromJSON(json) { + super.fromJSON(json); + this.degree = json.degree; + this.knots = [...json.knots]; + this.controlPoints = json.controlPoints.map((p) => new Vector4(p[0], p[1], p[2], p[3])); + this.startKnot = json.startKnot; + this.endKnot = json.endKnot; + return this; } - setBrushType(type) { - this.brushSettings.type = type; +} +let fbxTree; +let connections; +let sceneGraph; +class FBXLoader extends Loader { + static { + __name(this, "FBXLoader"); } - setBrushSmoothingPrecision(precision) { - this.smoothingPrecision = precision; + constructor(manager) { + super(manager); + } + load(url, onLoad, onProgress, onError) { + const scope = this; + const path = scope.path === "" ? LoaderUtils.extractUrlBase(url) : scope.path; + const loader = new FileLoader(this.manager); + loader.setPath(scope.path); + loader.setResponseType("arraybuffer"); + loader.setRequestHeader(scope.requestHeader); + loader.setWithCredentials(scope.withCredentials); + loader.load(url, function(buffer) { + try { + onLoad(scope.parse(buffer, path)); + } catch (e) { + if (onError) { + onError(e); + } else { + console.error(e); + } + scope.manager.itemError(url); + } + }, onProgress, onError); + } + parse(FBXBuffer, path) { + if (isFbxFormatBinary(FBXBuffer)) { + fbxTree = new BinaryParser().parse(FBXBuffer); + } else { + const FBXText = convertArrayBufferToString(FBXBuffer); + if (!isFbxFormatASCII(FBXText)) { + throw new Error("THREE.FBXLoader: Unknown format."); + } + if (getFbxVersion(FBXText) < 7e3) { + throw new Error("THREE.FBXLoader: FBX version not supported, FileVersion: " + getFbxVersion(FBXText)); + } + fbxTree = new TextParser().parse(FBXText); + } + const textureLoader = new TextureLoader(this.manager).setPath(this.resourcePath || path).setCrossOrigin(this.crossOrigin); + return new FBXTreeParser(textureLoader, this.manager).parse(fbxTree); } } -class UIManager { +class FBXTreeParser { static { - __name(this, "UIManager"); + __name(this, "FBXTreeParser"); } - rootElement; - brush; - brushPreviewGradient; - maskCtx; - imageCtx; - maskCanvas; - imgCanvas; - brushSettingsHTML; - paintBucketSettingsHTML; - colorSelectSettingsHTML; - maskOpacitySlider; - brushHardnessSlider; - brushSizeSlider; - brushOpacitySlider; - sidebarImage; - saveButton; - toolPanel; - sidePanel; - pointerZone; - canvasBackground; - canvasContainer; - image; - imageURL; - darkMode = true; - maskEditor; - messageBroker; - mask_opacity = 1; - maskBlendMode = "black"; - zoomTextHTML; - dimensionsTextHTML; - constructor(rootElement, maskEditor) { - this.rootElement = rootElement; - this.maskEditor = maskEditor; - this.messageBroker = maskEditor.getMessageBroker(); - this.addListeners(); - this.addPullTopics(); + constructor(textureLoader, manager) { + this.textureLoader = textureLoader; + this.manager = manager; } - addListeners() { - this.messageBroker.subscribe( - "updateBrushPreview", - async () => this.updateBrushPreview() - ); - this.messageBroker.subscribe( - "paintBucketCursor", - (isPaintBucket) => this.handlePaintBucketCursor(isPaintBucket) - ); - this.messageBroker.subscribe( - "panCursor", - (isPan) => this.handlePanCursor(isPan) - ); - this.messageBroker.subscribe( - "setBrushVisibility", - (isVisible) => this.setBrushVisibility(isVisible) - ); - this.messageBroker.subscribe( - "setBrushPreviewGradientVisibility", - (isVisible) => this.setBrushPreviewGradientVisibility(isVisible) - ); - this.messageBroker.subscribe("updateCursor", () => this.updateCursor()); - this.messageBroker.subscribe( - "setZoomText", - (text) => this.setZoomText(text) - ); + parse() { + connections = this.parseConnections(); + const images = this.parseImages(); + const textures = this.parseTextures(images); + const materials = this.parseMaterials(textures); + const deformers = this.parseDeformers(); + const geometryMap = new GeometryParser().parse(deformers); + this.parseScene(deformers, geometryMap, materials); + return sceneGraph; } - addPullTopics() { - this.messageBroker.createPullTopic( - "maskCanvas", - async () => this.maskCanvas - ); - this.messageBroker.createPullTopic("maskCtx", async () => this.maskCtx); - this.messageBroker.createPullTopic("imageCtx", async () => this.imageCtx); - this.messageBroker.createPullTopic("imgCanvas", async () => this.imgCanvas); - this.messageBroker.createPullTopic( - "screenToCanvas", - async (coords) => this.screenToCanvas(coords) - ); - this.messageBroker.createPullTopic( - "getCanvasContainer", - async () => this.canvasContainer - ); - this.messageBroker.createPullTopic( - "getMaskColor", - async () => this.getMaskColor() - ); + // Parses FBXTree.Connections which holds parent-child connections between objects (e.g. material -> texture, model->geometry ) + // and details the connection type + parseConnections() { + const connectionMap = /* @__PURE__ */ new Map(); + if ("Connections" in fbxTree) { + const rawConnections = fbxTree.Connections.connections; + rawConnections.forEach(function(rawConnection) { + const fromID = rawConnection[0]; + const toID = rawConnection[1]; + const relationship = rawConnection[2]; + if (!connectionMap.has(fromID)) { + connectionMap.set(fromID, { + parents: [], + children: [] + }); + } + const parentRelationship = { ID: toID, relationship }; + connectionMap.get(fromID).parents.push(parentRelationship); + if (!connectionMap.has(toID)) { + connectionMap.set(toID, { + parents: [], + children: [] + }); + } + const childRelationship = { ID: fromID, relationship }; + connectionMap.get(toID).children.push(childRelationship); + }); + } + return connectionMap; } - async setlayout() { - this.detectLightMode(); - var user_ui = await this.createUI(); - var canvasContainer = this.createBackgroundUI(); - var brush = await this.createBrush(); - await this.setBrushBorderRadius(); - this.setBrushOpacity(1); - this.rootElement.appendChild(canvasContainer); - this.rootElement.appendChild(user_ui); - document.body.appendChild(brush); + // Parse FBXTree.Objects.Video for embedded image data + // These images are connected to textures in FBXTree.Objects.Textures + // via FBXTree.Connections. + parseImages() { + const images = {}; + const blobs = {}; + if ("Video" in fbxTree.Objects) { + const videoNodes = fbxTree.Objects.Video; + for (const nodeID in videoNodes) { + const videoNode = videoNodes[nodeID]; + const id2 = parseInt(nodeID); + images[id2] = videoNode.RelativeFilename || videoNode.Filename; + if ("Content" in videoNode) { + const arrayBufferContent = videoNode.Content instanceof ArrayBuffer && videoNode.Content.byteLength > 0; + const base64Content = typeof videoNode.Content === "string" && videoNode.Content !== ""; + if (arrayBufferContent || base64Content) { + const image = this.parseImage(videoNodes[nodeID]); + blobs[videoNode.RelativeFilename || videoNode.Filename] = image; + } + } + } + } + for (const id2 in images) { + const filename = images[id2]; + if (blobs[filename] !== void 0) images[id2] = blobs[filename]; + else images[id2] = images[id2].split("\\").pop(); + } + return images; } - async createUI() { - var ui_container = document.createElement("div"); - ui_container.id = "maskEditor_uiContainer"; - var top_bar = await this.createTopBar(); - var ui_horizontal_container = document.createElement("div"); - ui_horizontal_container.id = "maskEditor_uiHorizontalContainer"; - var side_panel_container = await this.createSidePanel(); - var pointer_zone = this.createPointerZone(); - var tool_panel = this.createToolPanel(); - ui_horizontal_container.appendChild(tool_panel); - ui_horizontal_container.appendChild(pointer_zone); - ui_horizontal_container.appendChild(side_panel_container); - ui_container.appendChild(top_bar); - ui_container.appendChild(ui_horizontal_container); - return ui_container; + // Parse embedded image data in FBXTree.Video.Content + parseImage(videoNode) { + const content = videoNode.Content; + const fileName = videoNode.RelativeFilename || videoNode.Filename; + const extension = fileName.slice(fileName.lastIndexOf(".") + 1).toLowerCase(); + let type; + switch (extension) { + case "bmp": + type = "image/bmp"; + break; + case "jpg": + case "jpeg": + type = "image/jpeg"; + break; + case "png": + type = "image/png"; + break; + case "tif": + type = "image/tiff"; + break; + case "tga": + if (this.manager.getHandler(".tga") === null) { + console.warn("FBXLoader: TGA loader not found, skipping ", fileName); + } + type = "image/tga"; + break; + default: + console.warn('FBXLoader: Image type "' + extension + '" is not supported.'); + return; + } + if (typeof content === "string") { + return "data:" + type + ";base64," + content; + } else { + const array = new Uint8Array(content); + return window.URL.createObjectURL(new Blob([array], { type })); + } + } + // Parse nodes in FBXTree.Objects.Texture + // These contain details such as UV scaling, cropping, rotation etc and are connected + // to images in FBXTree.Objects.Video + parseTextures(images) { + const textureMap = /* @__PURE__ */ new Map(); + if ("Texture" in fbxTree.Objects) { + const textureNodes = fbxTree.Objects.Texture; + for (const nodeID in textureNodes) { + const texture = this.parseTexture(textureNodes[nodeID], images); + textureMap.set(parseInt(nodeID), texture); + } + } + return textureMap; } - createBackgroundUI() { - const canvasContainer = document.createElement("div"); - canvasContainer.id = "maskEditorCanvasContainer"; - const imgCanvas = document.createElement("canvas"); - imgCanvas.id = "imageCanvas"; - const maskCanvas = document.createElement("canvas"); - maskCanvas.id = "maskCanvas"; - const canvas_background = document.createElement("div"); - canvas_background.id = "canvasBackground"; - canvasContainer.appendChild(imgCanvas); - canvasContainer.appendChild(maskCanvas); - canvasContainer.appendChild(canvas_background); - this.imgCanvas = imgCanvas; - this.maskCanvas = maskCanvas; - this.canvasContainer = canvasContainer; - this.canvasBackground = canvas_background; - let maskCtx = maskCanvas.getContext("2d", { willReadFrequently: true }); - if (maskCtx) { - this.maskCtx = maskCtx; + // Parse individual node in FBXTree.Objects.Texture + parseTexture(textureNode, images) { + const texture = this.loadTexture(textureNode, images); + texture.ID = textureNode.id; + texture.name = textureNode.attrName; + const wrapModeU = textureNode.WrapModeU; + const wrapModeV = textureNode.WrapModeV; + const valueU = wrapModeU !== void 0 ? wrapModeU.value : 0; + const valueV = wrapModeV !== void 0 ? wrapModeV.value : 0; + texture.wrapS = valueU === 0 ? RepeatWrapping : ClampToEdgeWrapping; + texture.wrapT = valueV === 0 ? RepeatWrapping : ClampToEdgeWrapping; + if ("Scaling" in textureNode) { + const values = textureNode.Scaling.value; + texture.repeat.x = values[0]; + texture.repeat.y = values[1]; } - let imgCtx = imgCanvas.getContext("2d", { willReadFrequently: true }); - if (imgCtx) { - this.imageCtx = imgCtx; + if ("Translation" in textureNode) { + const values = textureNode.Translation.value; + texture.offset.x = values[0]; + texture.offset.y = values[1]; } - this.setEventHandler(); - this.imgCanvas.style.position = "absolute"; - this.maskCanvas.style.position = "absolute"; - this.imgCanvas.style.top = "200"; - this.imgCanvas.style.left = "0"; - this.maskCanvas.style.top = this.imgCanvas.style.top; - this.maskCanvas.style.left = this.imgCanvas.style.left; - const maskCanvasStyle = this.getMaskCanvasStyle(); - this.maskCanvas.style.mixBlendMode = maskCanvasStyle.mixBlendMode; - this.maskCanvas.style.opacity = maskCanvasStyle.opacity.toString(); - return canvasContainer; + return texture; } - async setBrushBorderRadius() { - const brushSettings = await this.messageBroker.pull("brushSettings"); - if (brushSettings.type === "rect") { - this.brush.style.borderRadius = "0%"; - this.brush.style.MozBorderRadius = "0%"; - this.brush.style.WebkitBorderRadius = "0%"; - } else { - this.brush.style.borderRadius = "50%"; - this.brush.style.MozBorderRadius = "50%"; - this.brush.style.WebkitBorderRadius = "50%"; + // load a texture specified as a blob or data URI, or via an external URL using TextureLoader + loadTexture(textureNode, images) { + const nonNativeExtensions = /* @__PURE__ */ new Set(["tga", "tif", "tiff", "exr", "dds", "hdr", "ktx2"]); + const extension = textureNode.FileName.split(".").pop().toLowerCase(); + const loader = nonNativeExtensions.has(extension) ? this.manager.getHandler(`.${extension}`) : this.textureLoader; + if (!loader) { + console.warn( + `FBXLoader: ${extension.toUpperCase()} loader not found, creating placeholder texture for`, + textureNode.RelativeFilename + ); + return new Texture(); + } + const loaderPath = loader.path; + if (!loaderPath) { + loader.setPath(this.textureLoader.path); + } + const children = connections.get(textureNode.id).children; + let fileName; + if (children !== void 0 && children.length > 0 && images[children[0].ID] !== void 0) { + fileName = images[children[0].ID]; + if (fileName.indexOf("blob:") === 0 || fileName.indexOf("data:") === 0) { + loader.setPath(void 0); + } } + const texture = loader.load(fileName); + loader.setPath(loaderPath); + return texture; } - async initUI() { - this.saveButton.innerText = "Save"; - this.saveButton.disabled = false; - await this.setImages(this.imgCanvas); + // Parse nodes in FBXTree.Objects.Material + parseMaterials(textureMap) { + const materialMap = /* @__PURE__ */ new Map(); + if ("Material" in fbxTree.Objects) { + const materialNodes = fbxTree.Objects.Material; + for (const nodeID in materialNodes) { + const material = this.parseMaterial(materialNodes[nodeID], textureMap); + if (material !== null) materialMap.set(parseInt(nodeID), material); + } + } + return materialMap; } - async createSidePanel() { - const side_panel = this.createContainer(true); - side_panel.id = "maskEditor_sidePanel"; - const brush_settings = await this.createBrushSettings(); - brush_settings.id = "maskEditor_brushSettings"; - this.brushSettingsHTML = brush_settings; - const paint_bucket_settings = await this.createPaintBucketSettings(); - paint_bucket_settings.id = "maskEditor_paintBucketSettings"; - this.paintBucketSettingsHTML = paint_bucket_settings; - const color_select_settings = await this.createColorSelectSettings(); - color_select_settings.id = "maskEditor_colorSelectSettings"; - this.colorSelectSettingsHTML = color_select_settings; - const image_layer_settings = await this.createImageLayerSettings(); - const separator = this.createSeparator(); - side_panel.appendChild(brush_settings); - side_panel.appendChild(paint_bucket_settings); - side_panel.appendChild(color_select_settings); - side_panel.appendChild(separator); - side_panel.appendChild(image_layer_settings); - return side_panel; + // Parse single node in FBXTree.Objects.Material + // Materials are connected to texture maps in FBXTree.Objects.Textures + // FBX format currently only supports Lambert and Phong shading models + parseMaterial(materialNode, textureMap) { + const ID = materialNode.id; + const name = materialNode.attrName; + let type = materialNode.ShadingModel; + if (typeof type === "object") { + type = type.value; + } + if (!connections.has(ID)) return null; + const parameters = this.parseParameters(materialNode, textureMap, ID); + let material; + switch (type.toLowerCase()) { + case "phong": + material = new MeshPhongMaterial(); + break; + case "lambert": + material = new MeshLambertMaterial(); + break; + default: + console.warn('THREE.FBXLoader: unknown material type "%s". Defaulting to MeshPhongMaterial.', type); + material = new MeshPhongMaterial(); + break; + } + material.setValues(parameters); + material.name = name; + return material; } - async createBrushSettings() { - const shapeColor = this.darkMode ? "maskEditor_brushShape_dark" : "maskEditor_brushShape_light"; - const brush_settings_container = this.createContainer(true); - const brush_settings_title = this.createHeadline("Brush Settings"); - const brush_shape_outer_container = this.createContainer(true); - const brush_shape_title = this.createContainerTitle("Brush Shape"); - const brush_shape_container = this.createContainer(false); - const accentColor = this.darkMode ? "maskEditor_accent_bg_dark" : "maskEditor_accent_bg_light"; - brush_shape_container.classList.add(accentColor); - brush_shape_container.classList.add("maskEditor_layerRow"); - const circle_shape = document.createElement("div"); - circle_shape.id = "maskEditor_sidePanelBrushShapeCircle"; - circle_shape.classList.add(shapeColor); - circle_shape.style.background = "var(--p-button-text-primary-color)"; - circle_shape.addEventListener("click", () => { - this.messageBroker.publish( - "setBrushShape", - "arc" - /* Arc */ - ); - this.setBrushBorderRadius(); - circle_shape.style.background = "var(--p-button-text-primary-color)"; - square_shape.style.background = ""; - }); - const square_shape = document.createElement("div"); - square_shape.id = "maskEditor_sidePanelBrushShapeSquare"; - square_shape.classList.add(shapeColor); - square_shape.style.background = ""; - square_shape.addEventListener("click", () => { - this.messageBroker.publish( - "setBrushShape", - "rect" - /* Rect */ - ); - this.setBrushBorderRadius(); - square_shape.style.background = "var(--p-button-text-primary-color)"; - circle_shape.style.background = ""; + // Parse FBX material and return parameters suitable for a three.js material + // Also parse the texture map and return any textures associated with the material + parseParameters(materialNode, textureMap, ID) { + const parameters = {}; + if (materialNode.BumpFactor) { + parameters.bumpScale = materialNode.BumpFactor.value; + } + if (materialNode.Diffuse) { + parameters.color = ColorManagement.toWorkingColorSpace(new Color().fromArray(materialNode.Diffuse.value), SRGBColorSpace); + } else if (materialNode.DiffuseColor && (materialNode.DiffuseColor.type === "Color" || materialNode.DiffuseColor.type === "ColorRGB")) { + parameters.color = ColorManagement.toWorkingColorSpace(new Color().fromArray(materialNode.DiffuseColor.value), SRGBColorSpace); + } + if (materialNode.DisplacementFactor) { + parameters.displacementScale = materialNode.DisplacementFactor.value; + } + if (materialNode.Emissive) { + parameters.emissive = ColorManagement.toWorkingColorSpace(new Color().fromArray(materialNode.Emissive.value), SRGBColorSpace); + } else if (materialNode.EmissiveColor && (materialNode.EmissiveColor.type === "Color" || materialNode.EmissiveColor.type === "ColorRGB")) { + parameters.emissive = ColorManagement.toWorkingColorSpace(new Color().fromArray(materialNode.EmissiveColor.value), SRGBColorSpace); + } + if (materialNode.EmissiveFactor) { + parameters.emissiveIntensity = parseFloat(materialNode.EmissiveFactor.value); + } + parameters.opacity = 1 - (materialNode.TransparencyFactor ? parseFloat(materialNode.TransparencyFactor.value) : 0); + if (parameters.opacity === 1 || parameters.opacity === 0) { + parameters.opacity = materialNode.Opacity ? parseFloat(materialNode.Opacity.value) : null; + if (parameters.opacity === null) { + parameters.opacity = 1 - (materialNode.TransparentColor ? parseFloat(materialNode.TransparentColor.value[0]) : 0); + } + } + if (parameters.opacity < 1) { + parameters.transparent = true; + } + if (materialNode.ReflectionFactor) { + parameters.reflectivity = materialNode.ReflectionFactor.value; + } + if (materialNode.Shininess) { + parameters.shininess = materialNode.Shininess.value; + } + if (materialNode.Specular) { + parameters.specular = ColorManagement.toWorkingColorSpace(new Color().fromArray(materialNode.Specular.value), SRGBColorSpace); + } else if (materialNode.SpecularColor && materialNode.SpecularColor.type === "Color") { + parameters.specular = ColorManagement.toWorkingColorSpace(new Color().fromArray(materialNode.SpecularColor.value), SRGBColorSpace); + } + const scope = this; + connections.get(ID).children.forEach(function(child) { + const type = child.relationship; + switch (type) { + case "Bump": + parameters.bumpMap = scope.getTexture(textureMap, child.ID); + break; + case "Maya|TEX_ao_map": + parameters.aoMap = scope.getTexture(textureMap, child.ID); + break; + case "DiffuseColor": + case "Maya|TEX_color_map": + parameters.map = scope.getTexture(textureMap, child.ID); + if (parameters.map !== void 0) { + parameters.map.colorSpace = SRGBColorSpace; + } + break; + case "DisplacementColor": + parameters.displacementMap = scope.getTexture(textureMap, child.ID); + break; + case "EmissiveColor": + parameters.emissiveMap = scope.getTexture(textureMap, child.ID); + if (parameters.emissiveMap !== void 0) { + parameters.emissiveMap.colorSpace = SRGBColorSpace; + } + break; + case "NormalMap": + case "Maya|TEX_normal_map": + parameters.normalMap = scope.getTexture(textureMap, child.ID); + break; + case "ReflectionColor": + parameters.envMap = scope.getTexture(textureMap, child.ID); + if (parameters.envMap !== void 0) { + parameters.envMap.mapping = EquirectangularReflectionMapping; + parameters.envMap.colorSpace = SRGBColorSpace; + } + break; + case "SpecularColor": + parameters.specularMap = scope.getTexture(textureMap, child.ID); + if (parameters.specularMap !== void 0) { + parameters.specularMap.colorSpace = SRGBColorSpace; + } + break; + case "TransparentColor": + case "TransparencyFactor": + parameters.alphaMap = scope.getTexture(textureMap, child.ID); + parameters.transparent = true; + break; + case "AmbientColor": + case "ShininessExponent": + case "SpecularFactor": + case "VectorDisplacementColor": + default: + console.warn("THREE.FBXLoader: %s map is not supported in three.js, skipping texture.", type); + break; + } }); - brush_shape_container.appendChild(circle_shape); - brush_shape_container.appendChild(square_shape); - brush_shape_outer_container.appendChild(brush_shape_title); - brush_shape_outer_container.appendChild(brush_shape_container); - const thicknesSliderObj = this.createSlider( - "Thickness", - 1, - 100, - 1, - 10, - (event, value) => { - this.messageBroker.publish("setBrushSize", parseInt(value)); - this.updateBrushPreview(); + return parameters; + } + // get a texture from the textureMap for use by a material. + getTexture(textureMap, id2) { + if ("LayeredTexture" in fbxTree.Objects && id2 in fbxTree.Objects.LayeredTexture) { + console.warn("THREE.FBXLoader: layered textures are not supported in three.js. Discarding all but first layer."); + id2 = connections.get(id2).children[0].ID; + } + return textureMap.get(id2); + } + // Parse nodes in FBXTree.Objects.Deformer + // Deformer node can contain skinning or Vertex Cache animation data, however only skinning is supported here + // Generates map of Skeleton-like objects for use later when generating and binding skeletons. + parseDeformers() { + const skeletons = {}; + const morphTargets = {}; + if ("Deformer" in fbxTree.Objects) { + const DeformerNodes = fbxTree.Objects.Deformer; + for (const nodeID in DeformerNodes) { + const deformerNode = DeformerNodes[nodeID]; + const relationships = connections.get(parseInt(nodeID)); + if (deformerNode.attrType === "Skin") { + const skeleton = this.parseSkeleton(relationships, DeformerNodes); + skeleton.ID = nodeID; + if (relationships.parents.length > 1) console.warn("THREE.FBXLoader: skeleton attached to more than one geometry is not supported."); + skeleton.geometryID = relationships.parents[0].ID; + skeletons[nodeID] = skeleton; + } else if (deformerNode.attrType === "BlendShape") { + const morphTarget = { + id: nodeID + }; + morphTarget.rawTargets = this.parseMorphTargets(relationships, DeformerNodes); + morphTarget.id = nodeID; + if (relationships.parents.length > 1) console.warn("THREE.FBXLoader: morph target attached to more than one geometry is not supported."); + morphTargets[nodeID] = morphTarget; + } } - ); - this.brushSizeSlider = thicknesSliderObj.slider; - const opacitySliderObj = this.createSlider( - "Opacity", - 0, - 1, - 0.01, - 0.7, - (event, value) => { - this.messageBroker.publish("setBrushOpacity", parseFloat(value)); - this.updateBrushPreview(); + } + return { + skeletons, + morphTargets + }; + } + // Parse single nodes in FBXTree.Objects.Deformer + // The top level skeleton node has type 'Skin' and sub nodes have type 'Cluster' + // Each skin node represents a skeleton and each cluster node represents a bone + parseSkeleton(relationships, deformerNodes) { + const rawBones = []; + relationships.children.forEach(function(child) { + const boneNode = deformerNodes[child.ID]; + if (boneNode.attrType !== "Cluster") return; + const rawBone = { + ID: child.ID, + indices: [], + weights: [], + transformLink: new Matrix4().fromArray(boneNode.TransformLink.a) + // transform: new Matrix4().fromArray( boneNode.Transform.a ), + // linkMode: boneNode.Mode, + }; + if ("Indexes" in boneNode) { + rawBone.indices = boneNode.Indexes.a; + rawBone.weights = boneNode.Weights.a; } - ); - this.brushOpacitySlider = opacitySliderObj.slider; - const hardnessSliderObj = this.createSlider( - "Hardness", - 0, - 1, - 0.01, - 1, - (event, value) => { - this.messageBroker.publish("setBrushHardness", parseFloat(value)); - this.updateBrushPreview(); + rawBones.push(rawBone); + }); + return { + rawBones, + bones: [] + }; + } + // The top level morph deformer node has type "BlendShape" and sub nodes have type "BlendShapeChannel" + parseMorphTargets(relationships, deformerNodes) { + const rawMorphTargets = []; + for (let i = 0; i < relationships.children.length; i++) { + const child = relationships.children[i]; + const morphTargetNode = deformerNodes[child.ID]; + const rawMorphTarget = { + name: morphTargetNode.attrName, + initialWeight: morphTargetNode.DeformPercent, + id: morphTargetNode.id, + fullWeights: morphTargetNode.FullWeights.a + }; + if (morphTargetNode.attrType !== "BlendShapeChannel") return; + rawMorphTarget.geoID = connections.get(parseInt(child.ID)).children.filter(function(child2) { + return child2.relationship === void 0; + })[0].ID; + rawMorphTargets.push(rawMorphTarget); + } + return rawMorphTargets; + } + // create the main Group() to be returned by the loader + parseScene(deformers, geometryMap, materialMap) { + sceneGraph = new Group(); + const modelMap = this.parseModels(deformers.skeletons, geometryMap, materialMap); + const modelNodes = fbxTree.Objects.Model; + const scope = this; + modelMap.forEach(function(model) { + const modelNode = modelNodes[model.ID]; + scope.setLookAtProperties(model, modelNode); + const parentConnections = connections.get(model.ID).parents; + parentConnections.forEach(function(connection) { + const parent = modelMap.get(connection.ID); + if (parent !== void 0) parent.add(model); + }); + if (model.parent === null) { + sceneGraph.add(model); } - ); - this.brushHardnessSlider = hardnessSliderObj.slider; - const brushSmoothingPrecisionSliderObj = this.createSlider( - "Smoothing Precision", - 1, - 100, - 1, - 10, - (event, value) => { - this.messageBroker.publish( - "setBrushSmoothingPrecision", - parseInt(value) - ); + }); + this.bindSkeleton(deformers.skeletons, geometryMap, modelMap); + this.addGlobalSceneSettings(); + sceneGraph.traverse(function(node) { + if (node.userData.transformData) { + if (node.parent) { + node.userData.transformData.parentMatrix = node.parent.matrix; + node.userData.transformData.parentMatrixWorld = node.parent.matrixWorld; + } + const transform = generateTransform(node.userData.transformData); + node.applyMatrix4(transform); + node.updateWorldMatrix(); } - ); - brush_settings_container.appendChild(brush_settings_title); - brush_settings_container.appendChild(brush_shape_outer_container); - brush_settings_container.appendChild(thicknesSliderObj.container); - brush_settings_container.appendChild(opacitySliderObj.container); - brush_settings_container.appendChild(hardnessSliderObj.container); - brush_settings_container.appendChild( - brushSmoothingPrecisionSliderObj.container - ); - return brush_settings_container; + }); + const animations = new AnimationParser().parse(); + if (sceneGraph.children.length === 1 && sceneGraph.children[0].isGroup) { + sceneGraph.children[0].animations = animations; + sceneGraph = sceneGraph.children[0]; + } + sceneGraph.animations = animations; + } + // parse nodes in FBXTree.Objects.Model + parseModels(skeletons, geometryMap, materialMap) { + const modelMap = /* @__PURE__ */ new Map(); + const modelNodes = fbxTree.Objects.Model; + for (const nodeID in modelNodes) { + const id2 = parseInt(nodeID); + const node = modelNodes[nodeID]; + const relationships = connections.get(id2); + let model = this.buildSkeleton(relationships, skeletons, id2, node.attrName); + if (!model) { + switch (node.attrType) { + case "Camera": + model = this.createCamera(relationships); + break; + case "Light": + model = this.createLight(relationships); + break; + case "Mesh": + model = this.createMesh(relationships, geometryMap, materialMap); + break; + case "NurbsCurve": + model = this.createCurve(relationships, geometryMap); + break; + case "LimbNode": + case "Root": + model = new Bone(); + break; + case "Null": + default: + model = new Group(); + break; + } + model.name = node.attrName ? PropertyBinding.sanitizeNodeName(node.attrName) : ""; + model.userData.originalName = node.attrName; + model.ID = id2; + } + this.getTransformData(model, node); + modelMap.set(id2, model); + } + return modelMap; } - async createPaintBucketSettings() { - const paint_bucket_settings_container = this.createContainer(true); - const paint_bucket_settings_title = this.createHeadline( - "Paint Bucket Settings" - ); - const tolerance = await this.messageBroker.pull("getTolerance"); - const paintBucketToleranceSliderObj = this.createSlider( - "Tolerance", - 0, - 255, - 1, - tolerance, - (event, value) => { - this.messageBroker.publish("setPaintBucketTolerance", parseInt(value)); + buildSkeleton(relationships, skeletons, id2, name) { + let bone = null; + relationships.parents.forEach(function(parent) { + for (const ID in skeletons) { + const skeleton = skeletons[ID]; + skeleton.rawBones.forEach(function(rawBone, i) { + if (rawBone.ID === parent.ID) { + const subBone = bone; + bone = new Bone(); + bone.matrixWorld.copy(rawBone.transformLink); + bone.name = name ? PropertyBinding.sanitizeNodeName(name) : ""; + bone.userData.originalName = name; + bone.ID = id2; + skeleton.bones[i] = bone; + if (subBone !== null) { + bone.add(subBone); + } + } + }); } - ); - paint_bucket_settings_container.appendChild(paint_bucket_settings_title); - paint_bucket_settings_container.appendChild( - paintBucketToleranceSliderObj.container - ); - return paint_bucket_settings_container; + }); + return bone; } - async createColorSelectSettings() { - const color_select_settings_container = this.createContainer(true); - const color_select_settings_title = this.createHeadline( - "Color Select Settings" - ); - var tolerance = await this.messageBroker.pull("getTolerance"); - const colorSelectToleranceSliderObj = this.createSlider( - "Tolerance", - 0, - 255, - 1, - tolerance, - (event, value) => { - this.messageBroker.publish("setColorSelectTolerance", parseInt(value)); + // create a PerspectiveCamera or OrthographicCamera + createCamera(relationships) { + let model; + let cameraAttribute; + relationships.children.forEach(function(child) { + const attr = fbxTree.Objects.NodeAttribute[child.ID]; + if (attr !== void 0) { + cameraAttribute = attr; } - ); - const livePreviewToggle = this.createToggle( - "Live Preview", - (event, value) => { - this.messageBroker.publish("setLivePreview", value); + }); + if (cameraAttribute === void 0) { + model = new Object3D(); + } else { + let type = 0; + if (cameraAttribute.CameraProjectionType !== void 0 && cameraAttribute.CameraProjectionType.value === 1) { + type = 1; } - ); - const wholeImageToggle = this.createToggle( - "Apply to Whole Image", - (event, value) => { - this.messageBroker.publish("setWholeImage", value); + let nearClippingPlane = 1; + if (cameraAttribute.NearPlane !== void 0) { + nearClippingPlane = cameraAttribute.NearPlane.value / 1e3; } - ); - const methodOptions = Object.values(ColorComparisonMethod); - const methodSelect = this.createDropdown( - "Method", - methodOptions, - (event, value) => { - this.messageBroker.publish("setColorComparisonMethod", value); + let farClippingPlane = 1e3; + if (cameraAttribute.FarPlane !== void 0) { + farClippingPlane = cameraAttribute.FarPlane.value / 1e3; } - ); - const maskBoundaryToggle = this.createToggle( - "Stop at mask", - (event, value) => { - this.messageBroker.publish("setMaskBoundary", value); + let width = window.innerWidth; + let height = window.innerHeight; + if (cameraAttribute.AspectWidth !== void 0 && cameraAttribute.AspectHeight !== void 0) { + width = cameraAttribute.AspectWidth.value; + height = cameraAttribute.AspectHeight.value; } - ); - const maskToleranceSliderObj = this.createSlider( - "Mask Tolerance", - 0, - 255, - 1, - 0, - (event, value) => { - this.messageBroker.publish("setMaskTolerance", parseInt(value)); + const aspect2 = width / height; + let fov2 = 45; + if (cameraAttribute.FieldOfView !== void 0) { + fov2 = cameraAttribute.FieldOfView.value; } - ); - color_select_settings_container.appendChild(color_select_settings_title); - color_select_settings_container.appendChild( - colorSelectToleranceSliderObj.container - ); - color_select_settings_container.appendChild(livePreviewToggle); - color_select_settings_container.appendChild(wholeImageToggle); - color_select_settings_container.appendChild(methodSelect); - color_select_settings_container.appendChild(maskBoundaryToggle); - color_select_settings_container.appendChild( - maskToleranceSliderObj.container - ); - return color_select_settings_container; + const focalLength = cameraAttribute.FocalLength ? cameraAttribute.FocalLength.value : null; + switch (type) { + case 0: + model = new PerspectiveCamera(fov2, aspect2, nearClippingPlane, farClippingPlane); + if (focalLength !== null) model.setFocalLength(focalLength); + break; + case 1: + console.warn("THREE.FBXLoader: Orthographic cameras not supported yet."); + model = new Object3D(); + break; + default: + console.warn("THREE.FBXLoader: Unknown camera type " + type + "."); + model = new Object3D(); + break; + } + } + return model; } - async createImageLayerSettings() { - const accentColor = this.darkMode ? "maskEditor_accent_bg_dark" : "maskEditor_accent_bg_light"; - const image_layer_settings_container = this.createContainer(true); - const image_layer_settings_title = this.createHeadline("Layers"); - const mask_layer_title = this.createContainerTitle("Mask Layer"); - const mask_layer_container = this.createContainer(false); - mask_layer_container.classList.add(accentColor); - mask_layer_container.classList.add("maskEditor_layerRow"); - const mask_layer_visibility_checkbox = document.createElement("input"); - mask_layer_visibility_checkbox.setAttribute("type", "checkbox"); - mask_layer_visibility_checkbox.checked = true; - mask_layer_visibility_checkbox.classList.add( - "maskEditor_sidePanelLayerCheckbox" - ); - mask_layer_visibility_checkbox.addEventListener("change", (event) => { - if (!event.target.checked) { - this.maskCanvas.style.opacity = "0"; - } else { - this.maskCanvas.style.opacity = String(this.mask_opacity); + // Create a DirectionalLight, PointLight or SpotLight + createLight(relationships) { + let model; + let lightAttribute; + relationships.children.forEach(function(child) { + const attr = fbxTree.Objects.NodeAttribute[child.ID]; + if (attr !== void 0) { + lightAttribute = attr; } }); - var mask_layer_image_container = document.createElement("div"); - mask_layer_image_container.classList.add( - "maskEditor_sidePanelLayerPreviewContainer" - ); - mask_layer_image_container.innerHTML = ' '; - var blending_options = ["black", "white", "negative"]; - const sidePanelDropdownAccent = this.darkMode ? "maskEditor_sidePanelDropdown_dark" : "maskEditor_sidePanelDropdown_light"; - var mask_layer_dropdown = document.createElement("select"); - mask_layer_dropdown.classList.add(sidePanelDropdownAccent); - mask_layer_dropdown.classList.add(sidePanelDropdownAccent); - blending_options.forEach((option) => { - var option_element = document.createElement("option"); - option_element.value = option; - option_element.innerText = option; - mask_layer_dropdown.appendChild(option_element); - if (option == this.maskBlendMode) { - option_element.selected = true; + if (lightAttribute === void 0) { + model = new Object3D(); + } else { + let type; + if (lightAttribute.LightType === void 0) { + type = 0; + } else { + type = lightAttribute.LightType.value; } - }); - mask_layer_dropdown.addEventListener("change", (event) => { - const selectedValue = event.target.value; - this.maskBlendMode = selectedValue; - this.updateMaskColor(); - }); - mask_layer_container.appendChild(mask_layer_visibility_checkbox); - mask_layer_container.appendChild(mask_layer_image_container); - mask_layer_container.appendChild(mask_layer_dropdown); - const mask_layer_opacity_sliderObj = this.createSlider( - "Mask Opacity", - 0, - 1, - 0.01, - this.mask_opacity, - (event, value) => { - this.mask_opacity = parseFloat(value); - this.maskCanvas.style.opacity = String(this.mask_opacity); - if (this.mask_opacity == 0) { - mask_layer_visibility_checkbox.checked = false; + let color = 16777215; + if (lightAttribute.Color !== void 0) { + color = ColorManagement.toWorkingColorSpace(new Color().fromArray(lightAttribute.Color.value), SRGBColorSpace); + } + let intensity = lightAttribute.Intensity === void 0 ? 1 : lightAttribute.Intensity.value / 100; + if (lightAttribute.CastLightOnObject !== void 0 && lightAttribute.CastLightOnObject.value === 0) { + intensity = 0; + } + let distance = 0; + if (lightAttribute.FarAttenuationEnd !== void 0) { + if (lightAttribute.EnableFarAttenuation !== void 0 && lightAttribute.EnableFarAttenuation.value === 0) { + distance = 0; } else { - mask_layer_visibility_checkbox.checked = true; + distance = lightAttribute.FarAttenuationEnd.value; } } - ); - this.maskOpacitySlider = mask_layer_opacity_sliderObj.slider; - const image_layer_title = this.createContainerTitle("Image Layer"); - const image_layer_container = this.createContainer(false); - image_layer_container.classList.add(accentColor); - image_layer_container.classList.add("maskEditor_layerRow"); - const image_layer_visibility_checkbox = document.createElement("input"); - image_layer_visibility_checkbox.setAttribute("type", "checkbox"); - image_layer_visibility_checkbox.classList.add( - "maskEditor_sidePanelLayerCheckbox" - ); - image_layer_visibility_checkbox.checked = true; - image_layer_visibility_checkbox.addEventListener("change", (event) => { - if (!event.target.checked) { - this.imgCanvas.style.opacity = "0"; - } else { - this.imgCanvas.style.opacity = "1"; + const decay = 1; + switch (type) { + case 0: + model = new PointLight(color, intensity, distance, decay); + break; + case 1: + model = new DirectionalLight(color, intensity); + break; + case 2: + let angle = Math.PI / 3; + if (lightAttribute.InnerAngle !== void 0) { + angle = MathUtils.degToRad(lightAttribute.InnerAngle.value); + } + let penumbra = 0; + if (lightAttribute.OuterAngle !== void 0) { + penumbra = MathUtils.degToRad(lightAttribute.OuterAngle.value); + penumbra = Math.max(penumbra, 1); + } + model = new SpotLight(color, intensity, distance, angle, penumbra, decay); + break; + default: + console.warn("THREE.FBXLoader: Unknown light type " + lightAttribute.LightType.value + ", defaulting to a PointLight."); + model = new PointLight(color, intensity); + break; } - }); - const image_layer_image_container = document.createElement("div"); - image_layer_image_container.classList.add( - "maskEditor_sidePanelLayerPreviewContainer" - ); - const image_layer_image = document.createElement("img"); - image_layer_image.id = "maskEditor_sidePanelImageLayerImage"; - image_layer_image.src = ComfyApp.clipspace?.imgs?.[ComfyApp.clipspace?.selectedIndex ?? 0]?.src ?? ""; - this.sidebarImage = image_layer_image; - image_layer_image_container.appendChild(image_layer_image); - image_layer_container.appendChild(image_layer_visibility_checkbox); - image_layer_container.appendChild(image_layer_image_container); - image_layer_settings_container.appendChild(image_layer_settings_title); - image_layer_settings_container.appendChild(mask_layer_title); - image_layer_settings_container.appendChild(mask_layer_container); - image_layer_settings_container.appendChild( - mask_layer_opacity_sliderObj.container - ); - image_layer_settings_container.appendChild(image_layer_title); - image_layer_settings_container.appendChild(image_layer_container); - return image_layer_settings_container; - } - createHeadline(title) { - var headline = document.createElement("h3"); - headline.classList.add("maskEditor_sidePanelTitle"); - headline.innerText = title; - return headline; + if (lightAttribute.CastShadows !== void 0 && lightAttribute.CastShadows.value === 1) { + model.castShadow = true; + } + } + return model; } - createContainer(flexDirection) { - var container = document.createElement("div"); - if (flexDirection) { - container.classList.add("maskEditor_sidePanelContainerColumn"); + createMesh(relationships, geometryMap, materialMap) { + let model; + let geometry = null; + let material = null; + const materials = []; + relationships.children.forEach(function(child) { + if (geometryMap.has(child.ID)) { + geometry = geometryMap.get(child.ID); + } + if (materialMap.has(child.ID)) { + materials.push(materialMap.get(child.ID)); + } + }); + if (materials.length > 1) { + material = materials; + } else if (materials.length > 0) { + material = materials[0]; } else { - container.classList.add("maskEditor_sidePanelContainerRow"); + material = new MeshPhongMaterial({ + name: Loader.DEFAULT_MATERIAL_NAME, + color: 13421772 + }); + materials.push(material); } - return container; - } - createContainerTitle(title) { - var container_title = document.createElement("span"); - container_title.classList.add("maskEditor_sidePanelSubTitle"); - container_title.innerText = title; - return container_title; + if ("color" in geometry.attributes) { + materials.forEach(function(material2) { + material2.vertexColors = true; + }); + } + if (geometry.FBX_Deformer) { + model = new SkinnedMesh(geometry, material); + model.normalizeSkinWeights(); + } else { + model = new Mesh(geometry, material); + } + return model; } - createSlider(title, min, max2, step, value, callback) { - var slider_container = this.createContainer(true); - var slider_title = this.createContainerTitle(title); - var slider = document.createElement("input"); - slider.classList.add("maskEditor_sidePanelBrushRange"); - slider.setAttribute("type", "range"); - slider.setAttribute("min", String(min)); - slider.setAttribute("max", String(max2)); - slider.setAttribute("step", String(step)); - slider.setAttribute("value", String(value)); - slider.addEventListener("input", (event) => { - callback(event, event.target.value); + createCurve(relationships, geometryMap) { + const geometry = relationships.children.reduce(function(geo, child) { + if (geometryMap.has(child.ID)) geo = geometryMap.get(child.ID); + return geo; + }, null); + const material = new LineBasicMaterial({ + name: Loader.DEFAULT_MATERIAL_NAME, + color: 3342591, + linewidth: 1 }); - slider_container.appendChild(slider_title); - slider_container.appendChild(slider); - return { container: slider_container, slider }; + return new Line(geometry, material); } - createToggle(title, callback) { - var outer_Container = this.createContainer(false); - var toggle_title = this.createContainerTitle(title); - var toggle_container = document.createElement("label"); - toggle_container.classList.add("maskEditor_sidePanelToggleContainer"); - var toggle_checkbox = document.createElement("input"); - toggle_checkbox.setAttribute("type", "checkbox"); - toggle_checkbox.classList.add("maskEditor_sidePanelToggleCheckbox"); - toggle_checkbox.addEventListener("change", (event) => { - callback(event, event.target.checked); - }); - var toggleAccentColor = this.darkMode ? "maskEditor_toggle_bg_dark" : "maskEditor_toggle_bg_light"; - var toggle_switch = document.createElement("div"); - toggle_switch.classList.add("maskEditor_sidePanelToggleSwitch"); - toggle_switch.classList.add(toggleAccentColor); - toggle_container.appendChild(toggle_checkbox); - toggle_container.appendChild(toggle_switch); - outer_Container.appendChild(toggle_title); - outer_Container.appendChild(toggle_container); - return outer_Container; + // parse the model node for transform data + getTransformData(model, modelNode) { + const transformData = {}; + if ("InheritType" in modelNode) transformData.inheritType = parseInt(modelNode.InheritType.value); + if ("RotationOrder" in modelNode) transformData.eulerOrder = getEulerOrder(modelNode.RotationOrder.value); + else transformData.eulerOrder = getEulerOrder(0); + if ("Lcl_Translation" in modelNode) transformData.translation = modelNode.Lcl_Translation.value; + if ("PreRotation" in modelNode) transformData.preRotation = modelNode.PreRotation.value; + if ("Lcl_Rotation" in modelNode) transformData.rotation = modelNode.Lcl_Rotation.value; + if ("PostRotation" in modelNode) transformData.postRotation = modelNode.PostRotation.value; + if ("Lcl_Scaling" in modelNode) transformData.scale = modelNode.Lcl_Scaling.value; + if ("ScalingOffset" in modelNode) transformData.scalingOffset = modelNode.ScalingOffset.value; + if ("ScalingPivot" in modelNode) transformData.scalingPivot = modelNode.ScalingPivot.value; + if ("RotationOffset" in modelNode) transformData.rotationOffset = modelNode.RotationOffset.value; + if ("RotationPivot" in modelNode) transformData.rotationPivot = modelNode.RotationPivot.value; + model.userData.transformData = transformData; } - createDropdown(title, options, callback) { - const sidePanelDropdownAccent = this.darkMode ? "maskEditor_sidePanelDropdown_dark" : "maskEditor_sidePanelDropdown_light"; - var dropdown_container = this.createContainer(false); - var dropdown_title = this.createContainerTitle(title); - var dropdown = document.createElement("select"); - dropdown.classList.add(sidePanelDropdownAccent); - dropdown.classList.add("maskEditor_containerDropdown"); - options.forEach((option) => { - var option_element = document.createElement("option"); - option_element.value = option; - option_element.innerText = option; - dropdown.appendChild(option_element); - }); - dropdown.addEventListener("change", (event) => { - callback(event, event.target.value); - }); - dropdown_container.appendChild(dropdown_title); - dropdown_container.appendChild(dropdown); - return dropdown_container; + setLookAtProperties(model, modelNode) { + if ("LookAtProperty" in modelNode) { + const children = connections.get(model.ID).children; + children.forEach(function(child) { + if (child.relationship === "LookAtProperty") { + const lookAtTarget = fbxTree.Objects.Model[child.ID]; + if ("Lcl_Translation" in lookAtTarget) { + const pos = lookAtTarget.Lcl_Translation.value; + if (model.target !== void 0) { + model.target.position.fromArray(pos); + sceneGraph.add(model.target); + } else { + model.lookAt(new Vector3().fromArray(pos)); + } + } + } + }); + } + } + bindSkeleton(skeletons, geometryMap, modelMap) { + const bindMatrices = this.parsePoseNodes(); + for (const ID in skeletons) { + const skeleton = skeletons[ID]; + const parents = connections.get(parseInt(skeleton.ID)).parents; + parents.forEach(function(parent) { + if (geometryMap.has(parent.ID)) { + const geoID = parent.ID; + const geoRelationships = connections.get(geoID); + geoRelationships.parents.forEach(function(geoConnParent) { + if (modelMap.has(geoConnParent.ID)) { + const model = modelMap.get(geoConnParent.ID); + model.bind(new Skeleton(skeleton.bones), bindMatrices[geoConnParent.ID]); + } + }); + } + }); + } + } + parsePoseNodes() { + const bindMatrices = {}; + if ("Pose" in fbxTree.Objects) { + const BindPoseNode = fbxTree.Objects.Pose; + for (const nodeID in BindPoseNode) { + if (BindPoseNode[nodeID].attrType === "BindPose" && BindPoseNode[nodeID].NbPoseNodes > 0) { + const poseNodes = BindPoseNode[nodeID].PoseNode; + if (Array.isArray(poseNodes)) { + poseNodes.forEach(function(poseNode) { + bindMatrices[poseNode.Node] = new Matrix4().fromArray(poseNode.Matrix.a); + }); + } else { + bindMatrices[poseNodes.Node] = new Matrix4().fromArray(poseNodes.Matrix.a); + } + } + } + } + return bindMatrices; + } + addGlobalSceneSettings() { + if ("GlobalSettings" in fbxTree) { + if ("AmbientColor" in fbxTree.GlobalSettings) { + const ambientColor = fbxTree.GlobalSettings.AmbientColor.value; + const r = ambientColor[0]; + const g = ambientColor[1]; + const b = ambientColor[2]; + if (r !== 0 || g !== 0 || b !== 0) { + const color = new Color().setRGB(r, g, b, SRGBColorSpace); + sceneGraph.add(new AmbientLight(color, 1)); + } + } + if ("UnitScaleFactor" in fbxTree.GlobalSettings) { + sceneGraph.userData.unitScaleFactor = fbxTree.GlobalSettings.UnitScaleFactor.value; + } + } } - createSeparator() { - var separator = document.createElement("div"); - separator.classList.add("maskEditor_sidePanelSeparator"); - return separator; +} +class GeometryParser { + static { + __name(this, "GeometryParser"); } - //---------------- - async createTopBar() { - const buttonAccentColor = this.darkMode ? "maskEditor_topPanelButton_dark" : "maskEditor_topPanelButton_light"; - const iconButtonAccentColor = this.darkMode ? "maskEditor_topPanelIconButton_dark" : "maskEditor_topPanelIconButton_light"; - var top_bar = document.createElement("div"); - top_bar.id = "maskEditor_topBar"; - var top_bar_title_container = document.createElement("div"); - top_bar_title_container.id = "maskEditor_topBarTitleContainer"; - var top_bar_title = document.createElement("h1"); - top_bar_title.id = "maskEditor_topBarTitle"; - top_bar_title.innerText = "ComfyUI"; - top_bar_title_container.appendChild(top_bar_title); - var top_bar_shortcuts_container = document.createElement("div"); - top_bar_shortcuts_container.id = "maskEditor_topBarShortcutsContainer"; - var top_bar_undo_button = document.createElement("div"); - top_bar_undo_button.id = "maskEditor_topBarUndoButton"; - top_bar_undo_button.classList.add(iconButtonAccentColor); - top_bar_undo_button.innerHTML = ' '; - top_bar_undo_button.addEventListener("click", () => { - this.messageBroker.publish("undo"); - }); - var top_bar_redo_button = document.createElement("div"); - top_bar_redo_button.id = "maskEditor_topBarRedoButton"; - top_bar_redo_button.classList.add(iconButtonAccentColor); - top_bar_redo_button.innerHTML = ' '; - top_bar_redo_button.addEventListener("click", () => { - this.messageBroker.publish("redo"); - }); - var top_bar_invert_button = document.createElement("button"); - top_bar_invert_button.id = "maskEditor_topBarInvertButton"; - top_bar_invert_button.classList.add(buttonAccentColor); - top_bar_invert_button.innerText = "Invert"; - top_bar_invert_button.addEventListener("click", () => { - this.messageBroker.publish("invert"); - }); - var top_bar_clear_button = document.createElement("button"); - top_bar_clear_button.id = "maskEditor_topBarClearButton"; - top_bar_clear_button.classList.add(buttonAccentColor); - top_bar_clear_button.innerText = "Clear"; - top_bar_clear_button.addEventListener("click", () => { - this.maskCtx.clearRect( - 0, - 0, - this.maskCanvas.width, - this.maskCanvas.height - ); - this.messageBroker.publish("saveState"); - }); - var top_bar_save_button = document.createElement("button"); - top_bar_save_button.id = "maskEditor_topBarSaveButton"; - top_bar_save_button.classList.add(buttonAccentColor); - top_bar_save_button.innerText = "Save"; - this.saveButton = top_bar_save_button; - top_bar_save_button.addEventListener("click", () => { - this.maskEditor.save(); - }); - var top_bar_cancel_button = document.createElement("button"); - top_bar_cancel_button.id = "maskEditor_topBarCancelButton"; - top_bar_cancel_button.classList.add(buttonAccentColor); - top_bar_cancel_button.innerText = "Cancel"; - top_bar_cancel_button.addEventListener("click", () => { - this.maskEditor.close(); - }); - top_bar_shortcuts_container.appendChild(top_bar_undo_button); - top_bar_shortcuts_container.appendChild(top_bar_redo_button); - top_bar_shortcuts_container.appendChild(top_bar_invert_button); - top_bar_shortcuts_container.appendChild(top_bar_clear_button); - top_bar_shortcuts_container.appendChild(top_bar_save_button); - top_bar_shortcuts_container.appendChild(top_bar_cancel_button); - top_bar.appendChild(top_bar_title_container); - top_bar.appendChild(top_bar_shortcuts_container); - return top_bar; + constructor() { + this.negativeMaterialIndices = false; } - createToolPanel() { - var tool_panel = document.createElement("div"); - tool_panel.id = "maskEditor_toolPanel"; - this.toolPanel = tool_panel; - var toolPanelHoverAccent = this.darkMode ? "maskEditor_toolPanelContainerDark" : "maskEditor_toolPanelContainerLight"; - var toolElements = []; - var toolPanel_brushToolContainer = document.createElement("div"); - toolPanel_brushToolContainer.classList.add("maskEditor_toolPanelContainer"); - toolPanel_brushToolContainer.classList.add( - "maskEditor_toolPanelContainerSelected" - ); - toolPanel_brushToolContainer.classList.add(toolPanelHoverAccent); - toolPanel_brushToolContainer.innerHTML = ` - - - - - `; - toolElements.push(toolPanel_brushToolContainer); - toolPanel_brushToolContainer.addEventListener("click", () => { - this.messageBroker.publish( - "setTool", - "pen" - /* Pen */ - ); - for (let toolElement of toolElements) { - if (toolElement != toolPanel_brushToolContainer) { - toolElement.classList.remove("maskEditor_toolPanelContainerSelected"); - } else { - toolElement.classList.add("maskEditor_toolPanelContainerSelected"); - this.brushSettingsHTML.style.display = "flex"; - this.colorSelectSettingsHTML.style.display = "none"; - this.paintBucketSettingsHTML.style.display = "none"; - } + // Parse nodes in FBXTree.Objects.Geometry + parse(deformers) { + const geometryMap = /* @__PURE__ */ new Map(); + if ("Geometry" in fbxTree.Objects) { + const geoNodes = fbxTree.Objects.Geometry; + for (const nodeID in geoNodes) { + const relationships = connections.get(parseInt(nodeID)); + const geo = this.parseGeometry(relationships, geoNodes[nodeID], deformers); + geometryMap.set(parseInt(nodeID), geo); } - this.messageBroker.publish( - "setTool", - "pen" - /* Pen */ - ); - this.pointerZone.style.cursor = "none"; + } + if (this.negativeMaterialIndices === true) { + console.warn("THREE.FBXLoader: The FBX file contains invalid (negative) material indices. The asset might not render as expected."); + } + return geometryMap; + } + // Parse single node in FBXTree.Objects.Geometry + parseGeometry(relationships, geoNode, deformers) { + switch (geoNode.attrType) { + case "Mesh": + return this.parseMeshGeometry(relationships, geoNode, deformers); + break; + case "NurbsCurve": + return this.parseNurbsGeometry(geoNode); + break; + } + } + // Parse single node mesh geometry in FBXTree.Objects.Geometry + parseMeshGeometry(relationships, geoNode, deformers) { + const skeletons = deformers.skeletons; + const morphTargets = []; + const modelNodes = relationships.parents.map(function(parent) { + return fbxTree.Objects.Model[parent.ID]; }); - var toolPanel_brushToolIndicator = document.createElement("div"); - toolPanel_brushToolIndicator.classList.add("maskEditor_toolPanelIndicator"); - toolPanel_brushToolContainer.appendChild(toolPanel_brushToolIndicator); - var toolPanel_eraserToolContainer = document.createElement("div"); - toolPanel_eraserToolContainer.classList.add("maskEditor_toolPanelContainer"); - toolPanel_eraserToolContainer.classList.add(toolPanelHoverAccent); - toolPanel_eraserToolContainer.innerHTML = ` - - - - - - - - `; - toolElements.push(toolPanel_eraserToolContainer); - toolPanel_eraserToolContainer.addEventListener("click", () => { - this.messageBroker.publish( - "setTool", - "eraser" - /* Eraser */ - ); - for (let toolElement of toolElements) { - if (toolElement != toolPanel_eraserToolContainer) { - toolElement.classList.remove("maskEditor_toolPanelContainerSelected"); - } else { - toolElement.classList.add("maskEditor_toolPanelContainerSelected"); - this.brushSettingsHTML.style.display = "flex"; - this.colorSelectSettingsHTML.style.display = "none"; - this.paintBucketSettingsHTML.style.display = "none"; - } + if (modelNodes.length === 0) return; + const skeleton = relationships.children.reduce(function(skeleton2, child) { + if (skeletons[child.ID] !== void 0) skeleton2 = skeletons[child.ID]; + return skeleton2; + }, null); + relationships.children.forEach(function(child) { + if (deformers.morphTargets[child.ID] !== void 0) { + morphTargets.push(deformers.morphTargets[child.ID]); } - this.messageBroker.publish( - "setTool", - "eraser" - /* Eraser */ - ); - this.pointerZone.style.cursor = "none"; }); - var toolPanel_eraserToolIndicator = document.createElement("div"); - toolPanel_eraserToolIndicator.classList.add("maskEditor_toolPanelIndicator"); - toolPanel_eraserToolContainer.appendChild(toolPanel_eraserToolIndicator); - var toolPanel_paintBucketToolContainer = document.createElement("div"); - toolPanel_paintBucketToolContainer.classList.add( - "maskEditor_toolPanelContainer" - ); - toolPanel_paintBucketToolContainer.classList.add(toolPanelHoverAccent); - toolPanel_paintBucketToolContainer.innerHTML = ` - - - - - - `; - toolElements.push(toolPanel_paintBucketToolContainer); - toolPanel_paintBucketToolContainer.addEventListener("click", () => { - this.messageBroker.publish( - "setTool", - "paintBucket" - /* PaintBucket */ - ); - for (let toolElement of toolElements) { - if (toolElement != toolPanel_paintBucketToolContainer) { - toolElement.classList.remove("maskEditor_toolPanelContainerSelected"); - } else { - toolElement.classList.add("maskEditor_toolPanelContainerSelected"); - this.brushSettingsHTML.style.display = "none"; - this.colorSelectSettingsHTML.style.display = "none"; - this.paintBucketSettingsHTML.style.display = "flex"; + const modelNode = modelNodes[0]; + const transformData = {}; + if ("RotationOrder" in modelNode) transformData.eulerOrder = getEulerOrder(modelNode.RotationOrder.value); + if ("InheritType" in modelNode) transformData.inheritType = parseInt(modelNode.InheritType.value); + if ("GeometricTranslation" in modelNode) transformData.translation = modelNode.GeometricTranslation.value; + if ("GeometricRotation" in modelNode) transformData.rotation = modelNode.GeometricRotation.value; + if ("GeometricScaling" in modelNode) transformData.scale = modelNode.GeometricScaling.value; + const transform = generateTransform(transformData); + return this.genGeometry(geoNode, skeleton, morphTargets, transform); + } + // Generate a BufferGeometry from a node in FBXTree.Objects.Geometry + genGeometry(geoNode, skeleton, morphTargets, preTransform) { + const geo = new BufferGeometry(); + if (geoNode.attrName) geo.name = geoNode.attrName; + const geoInfo = this.parseGeoNode(geoNode, skeleton); + const buffers = this.genBuffers(geoInfo); + const positionAttribute = new Float32BufferAttribute(buffers.vertex, 3); + positionAttribute.applyMatrix4(preTransform); + geo.setAttribute("position", positionAttribute); + if (buffers.colors.length > 0) { + geo.setAttribute("color", new Float32BufferAttribute(buffers.colors, 3)); + } + if (skeleton) { + geo.setAttribute("skinIndex", new Uint16BufferAttribute(buffers.weightsIndices, 4)); + geo.setAttribute("skinWeight", new Float32BufferAttribute(buffers.vertexWeights, 4)); + geo.FBX_Deformer = skeleton; + } + if (buffers.normal.length > 0) { + const normalMatrix = new Matrix3().getNormalMatrix(preTransform); + const normalAttribute = new Float32BufferAttribute(buffers.normal, 3); + normalAttribute.applyNormalMatrix(normalMatrix); + geo.setAttribute("normal", normalAttribute); + } + buffers.uvs.forEach(function(uvBuffer, i) { + const name = i === 0 ? "uv" : `uv${i}`; + geo.setAttribute(name, new Float32BufferAttribute(buffers.uvs[i], 2)); + }); + if (geoInfo.material && geoInfo.material.mappingType !== "AllSame") { + let prevMaterialIndex = buffers.materialIndex[0]; + let startIndex = 0; + buffers.materialIndex.forEach(function(currentIndex, i) { + if (currentIndex !== prevMaterialIndex) { + geo.addGroup(startIndex, i - startIndex, prevMaterialIndex); + prevMaterialIndex = currentIndex; + startIndex = i; + } + }); + if (geo.groups.length > 0) { + const lastGroup = geo.groups[geo.groups.length - 1]; + const lastIndex = lastGroup.start + lastGroup.count; + if (lastIndex !== buffers.materialIndex.length) { + geo.addGroup(lastIndex, buffers.materialIndex.length - lastIndex, prevMaterialIndex); } } - this.messageBroker.publish( - "setTool", - "paintBucket" - /* PaintBucket */ - ); - this.pointerZone.style.cursor = "url('/cursor/paintBucket.png') 30 25, auto"; - this.brush.style.opacity = "0"; - }); - var toolPanel_paintBucketToolIndicator = document.createElement("div"); - toolPanel_paintBucketToolIndicator.classList.add( - "maskEditor_toolPanelIndicator" - ); - toolPanel_paintBucketToolContainer.appendChild( - toolPanel_paintBucketToolIndicator - ); - var toolPanel_colorSelectToolContainer = document.createElement("div"); - toolPanel_colorSelectToolContainer.classList.add( - "maskEditor_toolPanelContainer" - ); - toolPanel_colorSelectToolContainer.classList.add(toolPanelHoverAccent); - toolPanel_colorSelectToolContainer.innerHTML = ` - - - - `; - toolElements.push(toolPanel_colorSelectToolContainer); - toolPanel_colorSelectToolContainer.addEventListener("click", () => { - this.messageBroker.publish("setTool", "colorSelect"); - for (let toolElement of toolElements) { - if (toolElement != toolPanel_colorSelectToolContainer) { - toolElement.classList.remove("maskEditor_toolPanelContainerSelected"); - } else { - toolElement.classList.add("maskEditor_toolPanelContainerSelected"); - this.brushSettingsHTML.style.display = "none"; - this.paintBucketSettingsHTML.style.display = "none"; - this.colorSelectSettingsHTML.style.display = "flex"; + if (geo.groups.length === 0) { + geo.addGroup(0, buffers.materialIndex.length, buffers.materialIndex[0]); + } + } + this.addMorphTargets(geo, geoNode, morphTargets, preTransform); + return geo; + } + parseGeoNode(geoNode, skeleton) { + const geoInfo = {}; + geoInfo.vertexPositions = geoNode.Vertices !== void 0 ? geoNode.Vertices.a : []; + geoInfo.vertexIndices = geoNode.PolygonVertexIndex !== void 0 ? geoNode.PolygonVertexIndex.a : []; + if (geoNode.LayerElementColor) { + geoInfo.color = this.parseVertexColors(geoNode.LayerElementColor[0]); + } + if (geoNode.LayerElementMaterial) { + geoInfo.material = this.parseMaterialIndices(geoNode.LayerElementMaterial[0]); + } + if (geoNode.LayerElementNormal) { + geoInfo.normal = this.parseNormals(geoNode.LayerElementNormal[0]); + } + if (geoNode.LayerElementUV) { + geoInfo.uv = []; + let i = 0; + while (geoNode.LayerElementUV[i]) { + if (geoNode.LayerElementUV[i].UV) { + geoInfo.uv.push(this.parseUVs(geoNode.LayerElementUV[i])); } + i++; } - this.messageBroker.publish( - "setTool", - "colorSelect" - /* ColorSelect */ - ); - this.pointerZone.style.cursor = "url('/cursor/colorSelect.png') 15 25, auto"; - this.brush.style.opacity = "0"; - }); - var toolPanel_colorSelectToolIndicator = document.createElement("div"); - toolPanel_colorSelectToolIndicator.classList.add( - "maskEditor_toolPanelIndicator" - ); - toolPanel_colorSelectToolContainer.appendChild( - toolPanel_colorSelectToolIndicator - ); - var toolPanel_zoomIndicator = document.createElement("div"); - toolPanel_zoomIndicator.classList.add("maskEditor_toolPanelZoomIndicator"); - toolPanel_zoomIndicator.classList.add(toolPanelHoverAccent); - var toolPanel_zoomText = document.createElement("span"); - toolPanel_zoomText.id = "maskEditor_toolPanelZoomText"; - toolPanel_zoomText.innerText = "100%"; - this.zoomTextHTML = toolPanel_zoomText; - var toolPanel_DimensionsText = document.createElement("span"); - toolPanel_DimensionsText.id = "maskEditor_toolPanelDimensionsText"; - toolPanel_DimensionsText.innerText = " "; - this.dimensionsTextHTML = toolPanel_DimensionsText; - toolPanel_zoomIndicator.appendChild(toolPanel_zoomText); - toolPanel_zoomIndicator.appendChild(toolPanel_DimensionsText); - toolPanel_zoomIndicator.addEventListener("click", () => { - this.messageBroker.publish("resetZoom"); - }); - tool_panel.appendChild(toolPanel_brushToolContainer); - tool_panel.appendChild(toolPanel_eraserToolContainer); - tool_panel.appendChild(toolPanel_paintBucketToolContainer); - tool_panel.appendChild(toolPanel_colorSelectToolContainer); - tool_panel.appendChild(toolPanel_zoomIndicator); - return tool_panel; + } + geoInfo.weightTable = {}; + if (skeleton !== null) { + geoInfo.skeleton = skeleton; + skeleton.rawBones.forEach(function(rawBone, i) { + rawBone.indices.forEach(function(index, j) { + if (geoInfo.weightTable[index] === void 0) geoInfo.weightTable[index] = []; + geoInfo.weightTable[index].push({ + id: i, + weight: rawBone.weights[j] + }); + }); + }); + } + return geoInfo; } - createPointerZone() { - const pointer_zone = document.createElement("div"); - pointer_zone.id = "maskEditor_pointerZone"; - this.pointerZone = pointer_zone; - pointer_zone.addEventListener("pointerdown", (event) => { - this.messageBroker.publish("pointerDown", event); - }); - pointer_zone.addEventListener("pointermove", (event) => { - this.messageBroker.publish("pointerMove", event); - }); - pointer_zone.addEventListener("pointerup", (event) => { - this.messageBroker.publish("pointerUp", event); - }); - pointer_zone.addEventListener("pointerleave", (event) => { - this.brush.style.opacity = "0"; - this.pointerZone.style.cursor = ""; - }); - pointer_zone.addEventListener("touchstart", (event) => { - this.messageBroker.publish("handleTouchStart", event); - }); - pointer_zone.addEventListener("touchmove", (event) => { - this.messageBroker.publish("handleTouchMove", event); - }); - pointer_zone.addEventListener("touchend", (event) => { - this.messageBroker.publish("handleTouchEnd", event); - }); - pointer_zone.addEventListener( - "wheel", - (event) => this.messageBroker.publish("wheel", event) - ); - pointer_zone.addEventListener( - "pointerenter", - async (event) => { - this.updateCursor(); + genBuffers(geoInfo) { + const buffers = { + vertex: [], + normal: [], + colors: [], + uvs: [], + materialIndex: [], + vertexWeights: [], + weightsIndices: [] + }; + let polygonIndex = 0; + let faceLength = 0; + let displayedWeightsWarning = false; + let facePositionIndexes = []; + let faceNormals = []; + let faceColors = []; + let faceUVs = []; + let faceWeights = []; + let faceWeightIndices = []; + const scope = this; + geoInfo.vertexIndices.forEach(function(vertexIndex, polygonVertexIndex) { + let materialIndex; + let endOfFace = false; + if (vertexIndex < 0) { + vertexIndex = vertexIndex ^ -1; + endOfFace = true; + } + let weightIndices = []; + let weights = []; + facePositionIndexes.push(vertexIndex * 3, vertexIndex * 3 + 1, vertexIndex * 3 + 2); + if (geoInfo.color) { + const data = getData(polygonVertexIndex, polygonIndex, vertexIndex, geoInfo.color); + faceColors.push(data[0], data[1], data[2]); + } + if (geoInfo.skeleton) { + if (geoInfo.weightTable[vertexIndex] !== void 0) { + geoInfo.weightTable[vertexIndex].forEach(function(wt) { + weights.push(wt.weight); + weightIndices.push(wt.id); + }); + } + if (weights.length > 4) { + if (!displayedWeightsWarning) { + console.warn("THREE.FBXLoader: Vertex has more than 4 skinning weights assigned to vertex. Deleting additional weights."); + displayedWeightsWarning = true; + } + const wIndex = [0, 0, 0, 0]; + const Weight = [0, 0, 0, 0]; + weights.forEach(function(weight, weightIndex) { + let currentWeight = weight; + let currentIndex = weightIndices[weightIndex]; + Weight.forEach(function(comparedWeight, comparedWeightIndex, comparedWeightArray) { + if (currentWeight > comparedWeight) { + comparedWeightArray[comparedWeightIndex] = currentWeight; + currentWeight = comparedWeight; + const tmp2 = wIndex[comparedWeightIndex]; + wIndex[comparedWeightIndex] = currentIndex; + currentIndex = tmp2; + } + }); + }); + weightIndices = wIndex; + weights = Weight; + } + while (weights.length < 4) { + weights.push(0); + weightIndices.push(0); + } + for (let i = 0; i < 4; ++i) { + faceWeights.push(weights[i]); + faceWeightIndices.push(weightIndices[i]); + } + } + if (geoInfo.normal) { + const data = getData(polygonVertexIndex, polygonIndex, vertexIndex, geoInfo.normal); + faceNormals.push(data[0], data[1], data[2]); + } + if (geoInfo.material && geoInfo.material.mappingType !== "AllSame") { + materialIndex = getData(polygonVertexIndex, polygonIndex, vertexIndex, geoInfo.material)[0]; + if (materialIndex < 0) { + scope.negativeMaterialIndices = true; + materialIndex = 0; + } } - ); - return pointer_zone; - } - async screenToCanvas(clientPoint) { - const zoomRatio = await this.messageBroker.pull("zoomRatio"); - const canvasRect = this.maskCanvas.getBoundingClientRect(); - const offsetX = clientPoint.x - canvasRect.left + this.toolPanel.clientWidth; - const offsetY = clientPoint.y - canvasRect.top + 44; - const x = offsetX / zoomRatio; - const y = offsetY / zoomRatio; - return { x, y }; - } - setEventHandler() { - this.maskCanvas.addEventListener("contextmenu", (event) => { - event.preventDefault(); - }); - this.rootElement.addEventListener("contextmenu", (event) => { - event.preventDefault(); - }); - this.rootElement.addEventListener("dragstart", (event) => { - if (event.ctrlKey) { - event.preventDefault(); + if (geoInfo.uv) { + geoInfo.uv.forEach(function(uv, i) { + const data = getData(polygonVertexIndex, polygonIndex, vertexIndex, uv); + if (faceUVs[i] === void 0) { + faceUVs[i] = []; + } + faceUVs[i].push(data[0]); + faceUVs[i].push(data[1]); + }); + } + faceLength++; + if (endOfFace) { + scope.genFace(buffers, geoInfo, facePositionIndexes, materialIndex, faceNormals, faceColors, faceUVs, faceWeights, faceWeightIndices, faceLength); + polygonIndex++; + faceLength = 0; + facePositionIndexes = []; + faceNormals = []; + faceColors = []; + faceUVs = []; + faceWeights = []; + faceWeightIndices = []; } }); + return buffers; } - async createBrush() { - var brush = document.createElement("div"); - const brushSettings = await this.messageBroker.pull("brushSettings"); - brush.id = "maskEditor_brush"; - var brush_preview_gradient = document.createElement("div"); - brush_preview_gradient.id = "maskEditor_brushPreviewGradient"; - brush.appendChild(brush_preview_gradient); - this.brush = brush; - this.brushPreviewGradient = brush_preview_gradient; - return brush; - } - async setImages(imgCanvas) { - const imgCtx = imgCanvas.getContext("2d", { willReadFrequently: true }); - const maskCtx = this.maskCtx; - const maskCanvas = this.maskCanvas; - imgCtx.clearRect(0, 0, this.imgCanvas.width, this.imgCanvas.height); - maskCtx.clearRect(0, 0, this.maskCanvas.width, this.maskCanvas.height); - const alpha_url = new URL( - ComfyApp.clipspace?.imgs?.[ComfyApp.clipspace?.selectedIndex ?? 0]?.src ?? "" - ); - alpha_url.searchParams.delete("channel"); - alpha_url.searchParams.delete("preview"); - alpha_url.searchParams.set("channel", "a"); - let mask_image = await this.loadImage(alpha_url); - if (!ComfyApp.clipspace?.imgs?.[ComfyApp.clipspace?.selectedIndex ?? 0]?.src) { - throw new Error( - "Unable to access image source - clipspace or image is null" - ); + // See https://www.khronos.org/opengl/wiki/Calculating_a_Surface_Normal + getNormalNewell(vertices) { + const normal = new Vector3(0, 0, 0); + for (let i = 0; i < vertices.length; i++) { + const current = vertices[i]; + const next = vertices[(i + 1) % vertices.length]; + normal.x += (current.y - next.y) * (current.z + next.z); + normal.y += (current.z - next.z) * (current.x + next.x); + normal.z += (current.x - next.x) * (current.y + next.y); } - const rgb_url = new URL( - ComfyApp.clipspace.imgs[ComfyApp.clipspace.selectedIndex].src - ); - this.imageURL = rgb_url; - console.log(rgb_url); - rgb_url.searchParams.delete("channel"); - rgb_url.searchParams.set("channel", "rgb"); - this.image = new Image(); - this.image = await new Promise((resolve, reject) => { - const img = new Image(); - img.onload = () => resolve(img); - img.onerror = reject; - img.src = rgb_url.toString(); - }); - maskCanvas.width = this.image.width; - maskCanvas.height = this.image.height; - this.dimensionsTextHTML.innerText = `${this.image.width}x${this.image.height}`; - await this.invalidateCanvas(this.image, mask_image); - this.messageBroker.publish("initZoomPan", [this.image, this.rootElement]); - } - async invalidateCanvas(orig_image, mask_image) { - this.imgCanvas.width = orig_image.width; - this.imgCanvas.height = orig_image.height; - this.maskCanvas.width = orig_image.width; - this.maskCanvas.height = orig_image.height; - let imgCtx = this.imgCanvas.getContext("2d", { willReadFrequently: true }); - let maskCtx = this.maskCanvas.getContext("2d", { - willReadFrequently: true - }); - imgCtx.drawImage(orig_image, 0, 0, orig_image.width, orig_image.height); - await this.prepare_mask( - mask_image, - this.maskCanvas, - maskCtx, - await this.getMaskColor() - ); + normal.normalize(); + return normal; } - async prepare_mask(image, maskCanvas, maskCtx, maskColor) { - maskCtx.drawImage(image, 0, 0, maskCanvas.width, maskCanvas.height); - const maskData = maskCtx.getImageData( - 0, - 0, - maskCanvas.width, - maskCanvas.height - ); - for (let i = 0; i < maskData.data.length; i += 4) { - const alpha = maskData.data[i + 3]; - maskData.data[i] = maskColor.r; - maskData.data[i + 1] = maskColor.g; - maskData.data[i + 2] = maskColor.b; - maskData.data[i + 3] = 255 - alpha; - } - maskCtx.globalCompositeOperation = "source-over"; - maskCtx.putImageData(maskData, 0, 0); + getNormalTangentAndBitangent(vertices) { + const normalVector = this.getNormalNewell(vertices); + const up = Math.abs(normalVector.z) > 0.5 ? new Vector3(0, 1, 0) : new Vector3(0, 0, 1); + const tangent = up.cross(normalVector).normalize(); + const bitangent = normalVector.clone().cross(tangent).normalize(); + return { + normal: normalVector, + tangent, + bitangent + }; } - async updateMaskColor() { - const maskCanvasStyle = this.getMaskCanvasStyle(); - this.maskCanvas.style.mixBlendMode = maskCanvasStyle.mixBlendMode; - this.maskCanvas.style.opacity = maskCanvasStyle.opacity.toString(); - const maskColor = await this.getMaskColor(); - this.maskCtx.fillStyle = `rgb(${maskColor.r}, ${maskColor.g}, ${maskColor.b})`; - this.setCanvasBackground(); - const maskData = this.maskCtx.getImageData( - 0, - 0, - this.maskCanvas.width, - this.maskCanvas.height + flattenVertex(vertex2, normalTangent, normalBitangent) { + return new Vector2( + vertex2.dot(normalTangent), + vertex2.dot(normalBitangent) ); - for (let i = 0; i < maskData.data.length; i += 4) { - maskData.data[i] = maskColor.r; - maskData.data[i + 1] = maskColor.g; - maskData.data[i + 2] = maskColor.b; - } - this.maskCtx.putImageData(maskData, 0, 0); } - getMaskCanvasStyle() { - if (this.maskBlendMode === "negative") { - return { - mixBlendMode: "difference", - opacity: "1" - }; + // Generate data for a single face in a geometry. If the face is a quad then split it into 2 tris + genFace(buffers, geoInfo, facePositionIndexes, materialIndex, faceNormals, faceColors, faceUVs, faceWeights, faceWeightIndices, faceLength) { + let triangles; + if (faceLength > 3) { + const vertices = []; + const positions = geoInfo.baseVertexPositions || geoInfo.vertexPositions; + for (let i = 0; i < facePositionIndexes.length; i += 3) { + vertices.push( + new Vector3( + positions[facePositionIndexes[i]], + positions[facePositionIndexes[i + 1]], + positions[facePositionIndexes[i + 2]] + ) + ); + } + const { tangent, bitangent } = this.getNormalTangentAndBitangent(vertices); + const triangulationInput = []; + for (const vertex2 of vertices) { + triangulationInput.push(this.flattenVertex(vertex2, tangent, bitangent)); + } + triangles = ShapeUtils.triangulateShape(triangulationInput, []); } else { - return { - mixBlendMode: "initial", - opacity: this.mask_opacity - }; + triangles = [[0, 1, 2]]; + } + for (const [i0, i1, i2] of triangles) { + buffers.vertex.push(geoInfo.vertexPositions[facePositionIndexes[i0 * 3]]); + buffers.vertex.push(geoInfo.vertexPositions[facePositionIndexes[i0 * 3 + 1]]); + buffers.vertex.push(geoInfo.vertexPositions[facePositionIndexes[i0 * 3 + 2]]); + buffers.vertex.push(geoInfo.vertexPositions[facePositionIndexes[i1 * 3]]); + buffers.vertex.push(geoInfo.vertexPositions[facePositionIndexes[i1 * 3 + 1]]); + buffers.vertex.push(geoInfo.vertexPositions[facePositionIndexes[i1 * 3 + 2]]); + buffers.vertex.push(geoInfo.vertexPositions[facePositionIndexes[i2 * 3]]); + buffers.vertex.push(geoInfo.vertexPositions[facePositionIndexes[i2 * 3 + 1]]); + buffers.vertex.push(geoInfo.vertexPositions[facePositionIndexes[i2 * 3 + 2]]); + if (geoInfo.skeleton) { + buffers.vertexWeights.push(faceWeights[i0 * 4]); + buffers.vertexWeights.push(faceWeights[i0 * 4 + 1]); + buffers.vertexWeights.push(faceWeights[i0 * 4 + 2]); + buffers.vertexWeights.push(faceWeights[i0 * 4 + 3]); + buffers.vertexWeights.push(faceWeights[i1 * 4]); + buffers.vertexWeights.push(faceWeights[i1 * 4 + 1]); + buffers.vertexWeights.push(faceWeights[i1 * 4 + 2]); + buffers.vertexWeights.push(faceWeights[i1 * 4 + 3]); + buffers.vertexWeights.push(faceWeights[i2 * 4]); + buffers.vertexWeights.push(faceWeights[i2 * 4 + 1]); + buffers.vertexWeights.push(faceWeights[i2 * 4 + 2]); + buffers.vertexWeights.push(faceWeights[i2 * 4 + 3]); + buffers.weightsIndices.push(faceWeightIndices[i0 * 4]); + buffers.weightsIndices.push(faceWeightIndices[i0 * 4 + 1]); + buffers.weightsIndices.push(faceWeightIndices[i0 * 4 + 2]); + buffers.weightsIndices.push(faceWeightIndices[i0 * 4 + 3]); + buffers.weightsIndices.push(faceWeightIndices[i1 * 4]); + buffers.weightsIndices.push(faceWeightIndices[i1 * 4 + 1]); + buffers.weightsIndices.push(faceWeightIndices[i1 * 4 + 2]); + buffers.weightsIndices.push(faceWeightIndices[i1 * 4 + 3]); + buffers.weightsIndices.push(faceWeightIndices[i2 * 4]); + buffers.weightsIndices.push(faceWeightIndices[i2 * 4 + 1]); + buffers.weightsIndices.push(faceWeightIndices[i2 * 4 + 2]); + buffers.weightsIndices.push(faceWeightIndices[i2 * 4 + 3]); + } + if (geoInfo.color) { + buffers.colors.push(faceColors[i0 * 3]); + buffers.colors.push(faceColors[i0 * 3 + 1]); + buffers.colors.push(faceColors[i0 * 3 + 2]); + buffers.colors.push(faceColors[i1 * 3]); + buffers.colors.push(faceColors[i1 * 3 + 1]); + buffers.colors.push(faceColors[i1 * 3 + 2]); + buffers.colors.push(faceColors[i2 * 3]); + buffers.colors.push(faceColors[i2 * 3 + 1]); + buffers.colors.push(faceColors[i2 * 3 + 2]); + } + if (geoInfo.material && geoInfo.material.mappingType !== "AllSame") { + buffers.materialIndex.push(materialIndex); + buffers.materialIndex.push(materialIndex); + buffers.materialIndex.push(materialIndex); + } + if (geoInfo.normal) { + buffers.normal.push(faceNormals[i0 * 3]); + buffers.normal.push(faceNormals[i0 * 3 + 1]); + buffers.normal.push(faceNormals[i0 * 3 + 2]); + buffers.normal.push(faceNormals[i1 * 3]); + buffers.normal.push(faceNormals[i1 * 3 + 1]); + buffers.normal.push(faceNormals[i1 * 3 + 2]); + buffers.normal.push(faceNormals[i2 * 3]); + buffers.normal.push(faceNormals[i2 * 3 + 1]); + buffers.normal.push(faceNormals[i2 * 3 + 2]); + } + if (geoInfo.uv) { + geoInfo.uv.forEach(function(uv, j) { + if (buffers.uvs[j] === void 0) buffers.uvs[j] = []; + buffers.uvs[j].push(faceUVs[j][i0 * 2]); + buffers.uvs[j].push(faceUVs[j][i0 * 2 + 1]); + buffers.uvs[j].push(faceUVs[j][i1 * 2]); + buffers.uvs[j].push(faceUVs[j][i1 * 2 + 1]); + buffers.uvs[j].push(faceUVs[j][i2 * 2]); + buffers.uvs[j].push(faceUVs[j][i2 * 2 + 1]); + }); + } } } - detectLightMode() { - this.darkMode = document.body.classList.contains("dark-theme"); - } - loadImage(imagePath) { - return new Promise((resolve, reject) => { - const image = new Image(); - image.onload = function() { - resolve(image); - }; - image.onerror = function(error) { - reject(error); - }; - image.src = imagePath.href; + addMorphTargets(parentGeo, parentGeoNode, morphTargets, preTransform) { + if (morphTargets.length === 0) return; + parentGeo.morphTargetsRelative = true; + parentGeo.morphAttributes.position = []; + const scope = this; + morphTargets.forEach(function(morphTarget) { + morphTarget.rawTargets.forEach(function(rawTarget) { + const morphGeoNode = fbxTree.Objects.Geometry[rawTarget.geoID]; + if (morphGeoNode !== void 0) { + scope.genMorphGeometry(parentGeo, parentGeoNode, morphGeoNode, preTransform, rawTarget.name); + } + }); }); } - async updateBrushPreview() { - const cursorPoint = await this.messageBroker.pull("cursorPoint"); - const pan_offset = await this.messageBroker.pull("panOffset"); - const brushSettings = await this.messageBroker.pull("brushSettings"); - const zoom_ratio = await this.messageBroker.pull("zoomRatio"); - const centerX = cursorPoint.x + pan_offset.x; - const centerY = cursorPoint.y + pan_offset.y; - const brush = this.brush; - const hardness = brushSettings.hardness; - const extendedSize = brushSettings.size * (2 - hardness) * 2 * zoom_ratio; - this.brushSizeSlider.value = String(brushSettings.size); - this.brushHardnessSlider.value = String(hardness); - brush.style.width = extendedSize + "px"; - brush.style.height = extendedSize + "px"; - brush.style.left = centerX - extendedSize / 2 + "px"; - brush.style.top = centerY - extendedSize / 2 + "px"; - if (hardness === 1) { - this.brushPreviewGradient.style.background = "rgba(255, 0, 0, 0.5)"; - return; + // a morph geometry node is similar to a standard node, and the node is also contained + // in FBXTree.Objects.Geometry, however it can only have attributes for position, normal + // and a special attribute Index defining which vertices of the original geometry are affected + // Normal and position attributes only have data for the vertices that are affected by the morph + genMorphGeometry(parentGeo, parentGeoNode, morphGeoNode, preTransform, name) { + const basePositions = parentGeoNode.Vertices !== void 0 ? parentGeoNode.Vertices.a : []; + const baseIndices = parentGeoNode.PolygonVertexIndex !== void 0 ? parentGeoNode.PolygonVertexIndex.a : []; + const morphPositionsSparse = morphGeoNode.Vertices !== void 0 ? morphGeoNode.Vertices.a : []; + const morphIndices = morphGeoNode.Indexes !== void 0 ? morphGeoNode.Indexes.a : []; + const length = parentGeo.attributes.position.count * 3; + const morphPositions = new Float32Array(length); + for (let i = 0; i < morphIndices.length; i++) { + const morphIndex = morphIndices[i] * 3; + morphPositions[morphIndex] = morphPositionsSparse[i * 3]; + morphPositions[morphIndex + 1] = morphPositionsSparse[i * 3 + 1]; + morphPositions[morphIndex + 2] = morphPositionsSparse[i * 3 + 2]; } - const opacityStop = hardness / 4 + 0.25; - this.brushPreviewGradient.style.background = ` - radial-gradient( - circle, - rgba(255, 0, 0, 0.5) 0%, - rgba(255, 0, 0, ${opacityStop}) ${hardness * 100}%, - rgba(255, 0, 0, 0) 100% - ) - `; - } - getMaskBlendMode() { - return this.maskBlendMode; + const morphGeoInfo = { + vertexIndices: baseIndices, + vertexPositions: morphPositions, + baseVertexPositions: basePositions + }; + const morphBuffers = this.genBuffers(morphGeoInfo); + const positionAttribute = new Float32BufferAttribute(morphBuffers.vertex, 3); + positionAttribute.name = name || morphGeoNode.attrName; + positionAttribute.applyMatrix4(preTransform); + parentGeo.morphAttributes.position.push(positionAttribute); } - setSidebarImage() { - this.sidebarImage.src = this.imageURL.href; + // Parse normal from FBXTree.Objects.Geometry.LayerElementNormal if it exists + parseNormals(NormalNode) { + const mappingType = NormalNode.MappingInformationType; + const referenceType = NormalNode.ReferenceInformationType; + const buffer = NormalNode.Normals.a; + let indexBuffer = []; + if (referenceType === "IndexToDirect") { + if ("NormalIndex" in NormalNode) { + indexBuffer = NormalNode.NormalIndex.a; + } else if ("NormalsIndex" in NormalNode) { + indexBuffer = NormalNode.NormalsIndex.a; + } + } + return { + dataSize: 3, + buffer, + indices: indexBuffer, + mappingType, + referenceType + }; } - async getMaskColor() { - if (this.maskBlendMode === "black") { - return { r: 0, g: 0, b: 0 }; + // Parse UVs from FBXTree.Objects.Geometry.LayerElementUV if it exists + parseUVs(UVNode) { + const mappingType = UVNode.MappingInformationType; + const referenceType = UVNode.ReferenceInformationType; + const buffer = UVNode.UV.a; + let indexBuffer = []; + if (referenceType === "IndexToDirect") { + indexBuffer = UVNode.UVIndex.a; } - if (this.maskBlendMode === "white") { - return { r: 255, g: 255, b: 255 }; + return { + dataSize: 2, + buffer, + indices: indexBuffer, + mappingType, + referenceType + }; + } + // Parse Vertex Colors from FBXTree.Objects.Geometry.LayerElementColor if it exists + parseVertexColors(ColorNode) { + const mappingType = ColorNode.MappingInformationType; + const referenceType = ColorNode.ReferenceInformationType; + const buffer = ColorNode.Colors.a; + let indexBuffer = []; + if (referenceType === "IndexToDirect") { + indexBuffer = ColorNode.ColorIndex.a; } - if (this.maskBlendMode === "negative") { - return { r: 255, g: 255, b: 255 }; + for (let i = 0, c = new Color(); i < buffer.length; i += 4) { + c.fromArray(buffer, i); + ColorManagement.toWorkingColorSpace(c, SRGBColorSpace); + c.toArray(buffer, i); } - return { r: 0, g: 0, b: 0 }; - } - async getMaskFillStyle() { - const maskColor = await this.getMaskColor(); - return "rgb(" + maskColor.r + "," + maskColor.g + "," + maskColor.b + ")"; + return { + dataSize: 4, + buffer, + indices: indexBuffer, + mappingType, + referenceType + }; } - async setCanvasBackground() { - if (this.maskBlendMode === "white") { - this.canvasBackground.style.background = "black"; - } else { - this.canvasBackground.style.background = "white"; + // Parse mapping and material data in FBXTree.Objects.Geometry.LayerElementMaterial if it exists + parseMaterialIndices(MaterialNode) { + const mappingType = MaterialNode.MappingInformationType; + const referenceType = MaterialNode.ReferenceInformationType; + if (mappingType === "NoMappingInformation") { + return { + dataSize: 1, + buffer: [0], + indices: [0], + mappingType: "AllSame", + referenceType + }; } - } - getMaskCanvas() { - return this.maskCanvas; - } - getImgCanvas() { - return this.imgCanvas; - } - getImage() { - return this.image; - } - setBrushOpacity(opacity) { - this.brush.style.opacity = String(opacity); - } - setSaveButtonEnabled(enabled) { - this.saveButton.disabled = !enabled; - } - setSaveButtonText(text) { - this.saveButton.innerText = text; - } - handlePaintBucketCursor(isPaintBucket) { - if (isPaintBucket) { - this.pointerZone.style.cursor = "url('/cursor/paintBucket.png') 30 25, auto"; - } else { - this.pointerZone.style.cursor = "none"; + const materialIndexBuffer = MaterialNode.Materials.a; + const materialIndices = []; + for (let i = 0; i < materialIndexBuffer.length; ++i) { + materialIndices.push(i); } + return { + dataSize: 1, + buffer: materialIndexBuffer, + indices: materialIndices, + mappingType, + referenceType + }; } - handlePanCursor(isPanning) { - if (isPanning) { - this.pointerZone.style.cursor = "grabbing"; - } else { - this.pointerZone.style.cursor = "none"; + // Generate a NurbGeometry from a node in FBXTree.Objects.Geometry + parseNurbsGeometry(geoNode) { + const order = parseInt(geoNode.Order); + if (isNaN(order)) { + console.error("THREE.FBXLoader: Invalid Order %s given for geometry ID: %s", geoNode.Order, geoNode.id); + return new BufferGeometry(); } - } - setBrushVisibility(visible) { - this.brush.style.opacity = visible ? "1" : "0"; - } - setBrushPreviewGradientVisibility(visible) { - this.brushPreviewGradient.style.display = visible ? "block" : "none"; - } - async updateCursor() { - const currentTool = await this.messageBroker.pull("currentTool"); - if (currentTool === "paintBucket") { - this.pointerZone.style.cursor = "url('/cursor/paintBucket.png') 30 25, auto"; - this.setBrushOpacity(0); - } else if (currentTool === "colorSelect") { - this.pointerZone.style.cursor = "url('/cursor/colorSelect.png') 15 25, auto"; - this.setBrushOpacity(0); - } else { - this.pointerZone.style.cursor = "none"; - this.setBrushOpacity(1); + const degree = order - 1; + const knots = geoNode.KnotVector.a; + const controlPoints = []; + const pointsValues = geoNode.Points.a; + for (let i = 0, l = pointsValues.length; i < l; i += 4) { + controlPoints.push(new Vector4().fromArray(pointsValues, i)); } - this.updateBrushPreview(); - this.setBrushPreviewGradientVisibility(false); - } - setZoomText(zoomText) { - this.zoomTextHTML.innerText = zoomText; - } - setDimensionsText(dimensionsText) { - this.dimensionsTextHTML.innerText = dimensionsText; + let startKnot, endKnot; + if (geoNode.Form === "Closed") { + controlPoints.push(controlPoints[0]); + } else if (geoNode.Form === "Periodic") { + startKnot = degree; + endKnot = knots.length - 1 - startKnot; + for (let i = 0; i < degree; ++i) { + controlPoints.push(controlPoints[i]); + } + } + const curve = new NURBSCurve(degree, knots, controlPoints, startKnot, endKnot); + const points = curve.getPoints(controlPoints.length * 12); + return new BufferGeometry().setFromPoints(points); } } -class ToolManager { +class AnimationParser { static { - __name(this, "ToolManager"); + __name(this, "AnimationParser"); } - maskEditor; - messageBroker; - mouseDownPoint = null; - currentTool = "pen"; - isAdjustingBrush = false; - // is user adjusting brush size or hardness with alt + right mouse button - constructor(maskEditor) { - this.maskEditor = maskEditor; - this.messageBroker = maskEditor.getMessageBroker(); - this.addListeners(); - this.addPullTopics(); + // take raw animation clips and turn them into three.js animation clips + parse() { + const animationClips = []; + const rawClips = this.parseClips(); + if (rawClips !== void 0) { + for (const key in rawClips) { + const rawClip = rawClips[key]; + const clip = this.addClip(rawClip); + animationClips.push(clip); + } + } + return animationClips; } - addListeners() { - this.messageBroker.subscribe("setTool", async (tool) => { - this.setTool(tool); - }); - this.messageBroker.subscribe("pointerDown", async (event) => { - this.handlePointerDown(event); - }); - this.messageBroker.subscribe("pointerMove", async (event) => { - this.handlePointerMove(event); - }); - this.messageBroker.subscribe("pointerUp", async (event) => { - this.handlePointerUp(event); - }); - this.messageBroker.subscribe("wheel", async (event) => { - this.handleWheelEvent(event); - }); + parseClips() { + if (fbxTree.Objects.AnimationCurve === void 0) return void 0; + const curveNodesMap = this.parseAnimationCurveNodes(); + this.parseAnimationCurves(curveNodesMap); + const layersMap = this.parseAnimationLayers(curveNodesMap); + const rawClips = this.parseAnimStacks(layersMap); + return rawClips; } - async addPullTopics() { - this.messageBroker.createPullTopic( - "currentTool", - async () => this.getCurrentTool() - ); + // parse nodes in FBXTree.Objects.AnimationCurveNode + // each AnimationCurveNode holds data for an animation transform for a model (e.g. left arm rotation ) + // and is referenced by an AnimationLayer + parseAnimationCurveNodes() { + const rawCurveNodes = fbxTree.Objects.AnimationCurveNode; + const curveNodesMap = /* @__PURE__ */ new Map(); + for (const nodeID in rawCurveNodes) { + const rawCurveNode = rawCurveNodes[nodeID]; + if (rawCurveNode.attrName.match(/S|R|T|DeformPercent/) !== null) { + const curveNode = { + id: rawCurveNode.id, + attr: rawCurveNode.attrName, + curves: {} + }; + curveNodesMap.set(curveNode.id, curveNode); + } + } + return curveNodesMap; } - //tools - setTool(tool) { - this.currentTool = tool; - if (tool != "colorSelect") { - this.messageBroker.publish("clearLastPoint"); + // parse nodes in FBXTree.Objects.AnimationCurve and connect them up to + // previously parsed AnimationCurveNodes. Each AnimationCurve holds data for a single animated + // axis ( e.g. times and values of x rotation) + parseAnimationCurves(curveNodesMap) { + const rawCurves = fbxTree.Objects.AnimationCurve; + for (const nodeID in rawCurves) { + const animationCurve = { + id: rawCurves[nodeID].id, + times: rawCurves[nodeID].KeyTime.a.map(convertFBXTimeToSeconds), + values: rawCurves[nodeID].KeyValueFloat.a + }; + const relationships = connections.get(animationCurve.id); + if (relationships !== void 0) { + const animationCurveID = relationships.parents[0].ID; + const animationCurveRelationship = relationships.parents[0].relationship; + if (animationCurveRelationship.match(/X/)) { + curveNodesMap.get(animationCurveID).curves["x"] = animationCurve; + } else if (animationCurveRelationship.match(/Y/)) { + curveNodesMap.get(animationCurveID).curves["y"] = animationCurve; + } else if (animationCurveRelationship.match(/Z/)) { + curveNodesMap.get(animationCurveID).curves["z"] = animationCurve; + } else if (animationCurveRelationship.match(/DeformPercent/) && curveNodesMap.has(animationCurveID)) { + curveNodesMap.get(animationCurveID).curves["morph"] = animationCurve; + } + } } } - getCurrentTool() { - return this.currentTool; + // parse nodes in FBXTree.Objects.AnimationLayer. Each layers holds references + // to various AnimationCurveNodes and is referenced by an AnimationStack node + // note: theoretically a stack can have multiple layers, however in practice there always seems to be one per stack + parseAnimationLayers(curveNodesMap) { + const rawLayers = fbxTree.Objects.AnimationLayer; + const layersMap = /* @__PURE__ */ new Map(); + for (const nodeID in rawLayers) { + const layerCurveNodes = []; + const connection = connections.get(parseInt(nodeID)); + if (connection !== void 0) { + const children = connection.children; + children.forEach(function(child, i) { + if (curveNodesMap.has(child.ID)) { + const curveNode = curveNodesMap.get(child.ID); + if (curveNode.curves.x !== void 0 || curveNode.curves.y !== void 0 || curveNode.curves.z !== void 0) { + if (layerCurveNodes[i] === void 0) { + const modelID = connections.get(child.ID).parents.filter(function(parent) { + return parent.relationship !== void 0; + })[0].ID; + if (modelID !== void 0) { + const rawModel = fbxTree.Objects.Model[modelID.toString()]; + if (rawModel === void 0) { + console.warn("THREE.FBXLoader: Encountered a unused curve.", child); + return; + } + const node = { + modelName: rawModel.attrName ? PropertyBinding.sanitizeNodeName(rawModel.attrName) : "", + ID: rawModel.id, + initialPosition: [0, 0, 0], + initialRotation: [0, 0, 0], + initialScale: [1, 1, 1] + }; + sceneGraph.traverse(function(child2) { + if (child2.ID === rawModel.id) { + node.transform = child2.matrix; + if (child2.userData.transformData) node.eulerOrder = child2.userData.transformData.eulerOrder; + } + }); + if (!node.transform) node.transform = new Matrix4(); + if ("PreRotation" in rawModel) node.preRotation = rawModel.PreRotation.value; + if ("PostRotation" in rawModel) node.postRotation = rawModel.PostRotation.value; + layerCurveNodes[i] = node; + } + } + if (layerCurveNodes[i]) layerCurveNodes[i][curveNode.attr] = curveNode; + } else if (curveNode.curves.morph !== void 0) { + if (layerCurveNodes[i] === void 0) { + const deformerID = connections.get(child.ID).parents.filter(function(parent) { + return parent.relationship !== void 0; + })[0].ID; + const morpherID = connections.get(deformerID).parents[0].ID; + const geoID = connections.get(morpherID).parents[0].ID; + const modelID = connections.get(geoID).parents[0].ID; + const rawModel = fbxTree.Objects.Model[modelID]; + const node = { + modelName: rawModel.attrName ? PropertyBinding.sanitizeNodeName(rawModel.attrName) : "", + morphName: fbxTree.Objects.Deformer[deformerID].attrName + }; + layerCurveNodes[i] = node; + } + layerCurveNodes[i][curveNode.attr] = curveNode; + } + } + }); + layersMap.set(parseInt(nodeID), layerCurveNodes); + } + } + return layersMap; } - async handlePointerDown(event) { - event.preventDefault(); - if (event.pointerType == "touch") return; - var isSpacePressed = await this.messageBroker.pull("isKeyPressed", " "); - if (event.buttons === 4 || event.buttons === 1 && isSpacePressed) { - this.messageBroker.publish("panStart", event); - this.messageBroker.publish("setBrushVisibility", false); - return; + // parse nodes in FBXTree.Objects.AnimationStack. These are the top level node in the animation + // hierarchy. Each Stack node will be used to create a AnimationClip + parseAnimStacks(layersMap) { + const rawStacks = fbxTree.Objects.AnimationStack; + const rawClips = {}; + for (const nodeID in rawStacks) { + const children = connections.get(parseInt(nodeID)).children; + if (children.length > 1) { + console.warn("THREE.FBXLoader: Encountered an animation stack with multiple layers, this is currently not supported. Ignoring subsequent layers."); + } + const layer = layersMap.get(children[0].ID); + rawClips[nodeID] = { + name: rawStacks[nodeID].attrName, + layer + }; } - if (this.currentTool === "paintBucket" && event.button === 0) { - const offset = { x: event.offsetX, y: event.offsetY }; - const coords_canvas = await this.messageBroker.pull( - "screenToCanvas", - offset - ); - this.messageBroker.publish("paintBucketFill", coords_canvas); - this.messageBroker.publish("saveState"); - return; + return rawClips; + } + addClip(rawClip) { + let tracks = []; + const scope = this; + rawClip.layer.forEach(function(rawTracks) { + tracks = tracks.concat(scope.generateTracks(rawTracks)); + }); + return new AnimationClip(rawClip.name, -1, tracks); + } + generateTracks(rawTracks) { + const tracks = []; + let initialPosition = new Vector3(); + let initialScale = new Vector3(); + if (rawTracks.transform) rawTracks.transform.decompose(initialPosition, new Quaternion(), initialScale); + initialPosition = initialPosition.toArray(); + initialScale = initialScale.toArray(); + if (rawTracks.T !== void 0 && Object.keys(rawTracks.T.curves).length > 0) { + const positionTrack = this.generateVectorTrack(rawTracks.modelName, rawTracks.T.curves, initialPosition, "position"); + if (positionTrack !== void 0) tracks.push(positionTrack); } - if (this.currentTool === "colorSelect" && event.button === 0) { - const offset = { x: event.offsetX, y: event.offsetY }; - const coords_canvas = await this.messageBroker.pull( - "screenToCanvas", - offset - ); - this.messageBroker.publish("colorSelectFill", coords_canvas); - return; + if (rawTracks.R !== void 0 && Object.keys(rawTracks.R.curves).length > 0) { + const rotationTrack = this.generateRotationTrack(rawTracks.modelName, rawTracks.R.curves, rawTracks.preRotation, rawTracks.postRotation, rawTracks.eulerOrder); + if (rotationTrack !== void 0) tracks.push(rotationTrack); } - if (event.altKey && event.button === 2) { - this.isAdjustingBrush = true; - this.messageBroker.publish("brushAdjustmentStart", event); - return; + if (rawTracks.S !== void 0 && Object.keys(rawTracks.S.curves).length > 0) { + const scaleTrack = this.generateVectorTrack(rawTracks.modelName, rawTracks.S.curves, initialScale, "scale"); + if (scaleTrack !== void 0) tracks.push(scaleTrack); } - var isDrawingTool = [ - "pen", - "eraser" - /* Eraser */ - ].includes(this.currentTool); - if ([0, 2].includes(event.button) && isDrawingTool) { - this.messageBroker.publish("drawStart", event); - return; + if (rawTracks.DeformPercent !== void 0) { + const morphTrack = this.generateMorphTrack(rawTracks); + if (morphTrack !== void 0) tracks.push(morphTrack); } + return tracks; } - async handlePointerMove(event) { - event.preventDefault(); - if (event.pointerType == "touch") return; - const newCursorPoint = { x: event.clientX, y: event.clientY }; - this.messageBroker.publish("cursorPoint", newCursorPoint); - var isSpacePressed = await this.messageBroker.pull("isKeyPressed", " "); - this.messageBroker.publish("updateBrushPreview"); - if (event.buttons === 4 || event.buttons === 1 && isSpacePressed) { - this.messageBroker.publish("panMove", event); - return; + generateVectorTrack(modelName, curves, initialValue, type) { + const times = this.getTimesForAllAxes(curves); + const values = this.getKeyframeTrackValues(times, curves, initialValue); + return new VectorKeyframeTrack(modelName + "." + type, times, values); + } + generateRotationTrack(modelName, curves, preRotation, postRotation, eulerOrder) { + let times; + let values; + if (curves.x !== void 0 && curves.y !== void 0 && curves.z !== void 0) { + const result = this.interpolateRotations(curves.x, curves.y, curves.z, eulerOrder); + times = result[0]; + values = result[1]; } - var isDrawingTool = [ - "pen", - "eraser" - /* Eraser */ - ].includes(this.currentTool); - if (!isDrawingTool) return; - if (this.isAdjustingBrush && (this.currentTool === "pen" || this.currentTool === "eraser") && event.altKey && event.buttons === 2) { - this.messageBroker.publish("brushAdjustment", event); - return; + const defaultEulerOrder = getEulerOrder(0); + if (preRotation !== void 0) { + preRotation = preRotation.map(MathUtils.degToRad); + preRotation.push(defaultEulerOrder); + preRotation = new Euler().fromArray(preRotation); + preRotation = new Quaternion().setFromEuler(preRotation); } - if (event.buttons == 1 || event.buttons == 2) { - this.messageBroker.publish("draw", event); - return; + if (postRotation !== void 0) { + postRotation = postRotation.map(MathUtils.degToRad); + postRotation.push(defaultEulerOrder); + postRotation = new Euler().fromArray(postRotation); + postRotation = new Quaternion().setFromEuler(postRotation).invert(); } + const quaternion = new Quaternion(); + const euler = new Euler(); + const quaternionValues = []; + if (!values || !times) return new QuaternionKeyframeTrack(modelName + ".quaternion", [0], [0]); + for (let i = 0; i < values.length; i += 3) { + euler.set(values[i], values[i + 1], values[i + 2], eulerOrder); + quaternion.setFromEuler(euler); + if (preRotation !== void 0) quaternion.premultiply(preRotation); + if (postRotation !== void 0) quaternion.multiply(postRotation); + if (i > 2) { + const prevQuat = new Quaternion().fromArray( + quaternionValues, + (i - 3) / 3 * 4 + ); + if (prevQuat.dot(quaternion) < 0) { + quaternion.set(-quaternion.x, -quaternion.y, -quaternion.z, -quaternion.w); + } + } + quaternion.toArray(quaternionValues, i / 3 * 4); + } + return new QuaternionKeyframeTrack(modelName + ".quaternion", times, quaternionValues); } - handlePointerUp(event) { - this.messageBroker.publish("panCursor", false); - if (event.pointerType === "touch") return; - this.messageBroker.publish("updateCursor"); - this.isAdjustingBrush = false; - this.messageBroker.publish("drawEnd", event); - this.mouseDownPoint = null; - } - handleWheelEvent(event) { - this.messageBroker.publish("zoom", event); - const newCursorPoint = { x: event.clientX, y: event.clientY }; - this.messageBroker.publish("cursorPoint", newCursorPoint); - } -} -class PanAndZoomManager { - static { - __name(this, "PanAndZoomManager"); + generateMorphTrack(rawTracks) { + const curves = rawTracks.DeformPercent.curves.morph; + const values = curves.values.map(function(val) { + return val / 100; + }); + const morphNum = sceneGraph.getObjectByName(rawTracks.modelName).morphTargetDictionary[rawTracks.morphName]; + return new NumberKeyframeTrack(rawTracks.modelName + ".morphTargetInfluences[" + morphNum + "]", curves.times, values); } - maskEditor; - messageBroker; - DOUBLE_TAP_DELAY = 300; - lastTwoFingerTap = 0; - isTouchZooming = false; - lastTouchZoomDistance = 0; - lastTouchMidPoint = { x: 0, y: 0 }; - lastTouchPoint = { x: 0, y: 0 }; - zoom_ratio = 1; - interpolatedZoomRatio = 1; - pan_offset = { x: 0, y: 0 }; - mouseDownPoint = null; - initialPan = { x: 0, y: 0 }; - canvasContainer = null; - maskCanvas = null; - rootElement = null; - image = null; - imageRootWidth = 0; - imageRootHeight = 0; - cursorPoint = { x: 0, y: 0 }; - constructor(maskEditor) { - this.maskEditor = maskEditor; - this.messageBroker = maskEditor.getMessageBroker(); - this.addListeners(); - this.addPullTopics(); + // For all animated objects, times are defined separately for each axis + // Here we'll combine the times into one sorted array without duplicates + getTimesForAllAxes(curves) { + let times = []; + if (curves.x !== void 0) times = times.concat(curves.x.times); + if (curves.y !== void 0) times = times.concat(curves.y.times); + if (curves.z !== void 0) times = times.concat(curves.z.times); + times = times.sort(function(a, b) { + return a - b; + }); + if (times.length > 1) { + let targetIndex = 1; + let lastValue = times[0]; + for (let i = 1; i < times.length; i++) { + const currentValue = times[i]; + if (currentValue !== lastValue) { + times[targetIndex] = currentValue; + lastValue = currentValue; + targetIndex++; + } + } + times = times.slice(0, targetIndex); + } + return times; } - addListeners() { - this.messageBroker.subscribe( - "initZoomPan", - async (args) => { - await this.initializeCanvasPanZoom(args[0], args[1]); + getKeyframeTrackValues(times, curves, initialValue) { + const prevValue = initialValue; + const values = []; + let xIndex = -1; + let yIndex = -1; + let zIndex = -1; + times.forEach(function(time) { + if (curves.x) xIndex = curves.x.times.indexOf(time); + if (curves.y) yIndex = curves.y.times.indexOf(time); + if (curves.z) zIndex = curves.z.times.indexOf(time); + if (xIndex !== -1) { + const xValue = curves.x.values[xIndex]; + values.push(xValue); + prevValue[0] = xValue; + } else { + values.push(prevValue[0]); + } + if (yIndex !== -1) { + const yValue = curves.y.values[yIndex]; + values.push(yValue); + prevValue[1] = yValue; + } else { + values.push(prevValue[1]); + } + if (zIndex !== -1) { + const zValue = curves.z.values[zIndex]; + values.push(zValue); + prevValue[2] = zValue; + } else { + values.push(prevValue[2]); } - ); - this.messageBroker.subscribe("panStart", async (event) => { - this.handlePanStart(event); - }); - this.messageBroker.subscribe("panMove", async (event) => { - this.handlePanMove(event); - }); - this.messageBroker.subscribe("zoom", async (event) => { - this.zoom(event); - }); - this.messageBroker.subscribe("cursorPoint", async (point) => { - this.updateCursorPosition(point); }); - this.messageBroker.subscribe( - "handleTouchStart", - async (event) => { - this.handleTouchStart(event); + return values; + } + // Rotations are defined as Euler angles which can have values of any size + // These will be converted to quaternions which don't support values greater than + // PI, so we'll interpolate large rotations + interpolateRotations(curvex, curvey, curvez, eulerOrder) { + const times = []; + const values = []; + times.push(curvex.times[0]); + values.push(MathUtils.degToRad(curvex.values[0])); + values.push(MathUtils.degToRad(curvey.values[0])); + values.push(MathUtils.degToRad(curvez.values[0])); + for (let i = 1; i < curvex.values.length; i++) { + const initialValue = [ + curvex.values[i - 1], + curvey.values[i - 1], + curvez.values[i - 1] + ]; + if (isNaN(initialValue[0]) || isNaN(initialValue[1]) || isNaN(initialValue[2])) { + continue; } - ); - this.messageBroker.subscribe( - "handleTouchMove", - async (event) => { - this.handleTouchMove(event); + const initialValueRad = initialValue.map(MathUtils.degToRad); + const currentValue = [ + curvex.values[i], + curvey.values[i], + curvez.values[i] + ]; + if (isNaN(currentValue[0]) || isNaN(currentValue[1]) || isNaN(currentValue[2])) { + continue; + } + const currentValueRad = currentValue.map(MathUtils.degToRad); + const valuesSpan = [ + currentValue[0] - initialValue[0], + currentValue[1] - initialValue[1], + currentValue[2] - initialValue[2] + ]; + const absoluteSpan = [ + Math.abs(valuesSpan[0]), + Math.abs(valuesSpan[1]), + Math.abs(valuesSpan[2]) + ]; + if (absoluteSpan[0] >= 180 || absoluteSpan[1] >= 180 || absoluteSpan[2] >= 180) { + const maxAbsSpan = Math.max(...absoluteSpan); + const numSubIntervals = maxAbsSpan / 180; + const E1 = new Euler(...initialValueRad, eulerOrder); + const E2 = new Euler(...currentValueRad, eulerOrder); + const Q1 = new Quaternion().setFromEuler(E1); + const Q2 = new Quaternion().setFromEuler(E2); + if (Q1.dot(Q2)) { + Q2.set(-Q2.x, -Q2.y, -Q2.z, -Q2.w); + } + const initialTime = curvex.times[i - 1]; + const timeSpan = curvex.times[i] - initialTime; + const Q = new Quaternion(); + const E = new Euler(); + for (let t2 = 0; t2 < 1; t2 += 1 / numSubIntervals) { + Q.copy(Q1.clone().slerp(Q2.clone(), t2)); + times.push(initialTime + t2 * timeSpan); + E.setFromQuaternion(Q, eulerOrder); + values.push(E.x); + values.push(E.y); + values.push(E.z); + } + } else { + times.push(curvex.times[i]); + values.push(MathUtils.degToRad(curvex.values[i])); + values.push(MathUtils.degToRad(curvey.values[i])); + values.push(MathUtils.degToRad(curvez.values[i])); } - ); - this.messageBroker.subscribe( - "handleTouchEnd", - async (event) => { - this.handleTouchEnd(event); + } + return [times, values]; + } +} +class TextParser { + static { + __name(this, "TextParser"); + } + getPrevNode() { + return this.nodeStack[this.currentIndent - 2]; + } + getCurrentNode() { + return this.nodeStack[this.currentIndent - 1]; + } + getCurrentProp() { + return this.currentProp; + } + pushStack(node) { + this.nodeStack.push(node); + this.currentIndent += 1; + } + popStack() { + this.nodeStack.pop(); + this.currentIndent -= 1; + } + setCurrentProp(val, name) { + this.currentProp = val; + this.currentPropName = name; + } + parse(text) { + this.currentIndent = 0; + this.allNodes = new FBXTree(); + this.nodeStack = []; + this.currentProp = []; + this.currentPropName = ""; + const scope = this; + const split = text.split(/[\r\n]+/); + split.forEach(function(line, i) { + const matchComment = line.match(/^[\s\t]*;/); + const matchEmpty = line.match(/^[\s\t]*$/); + if (matchComment || matchEmpty) return; + const matchBeginning = line.match("^\\t{" + scope.currentIndent + "}(\\w+):(.*){", ""); + const matchProperty = line.match("^\\t{" + scope.currentIndent + "}(\\w+):[\\s\\t\\r\\n](.*)"); + const matchEnd = line.match("^\\t{" + (scope.currentIndent - 1) + "}}"); + if (matchBeginning) { + scope.parseNodeBegin(line, matchBeginning); + } else if (matchProperty) { + scope.parseNodeProperty(line, matchProperty, split[++i]); + } else if (matchEnd) { + scope.popStack(); + } else if (line.match(/^[^\s\t}]/)) { + scope.parseNodePropertyContinued(line); } - ); - this.messageBroker.subscribe("resetZoom", async () => { - if (this.interpolatedZoomRatio === 1) return; - await this.smoothResetView(); }); + return this.allNodes; } - addPullTopics() { - this.messageBroker.createPullTopic( - "cursorPoint", - async () => this.cursorPoint - ); - this.messageBroker.createPullTopic("zoomRatio", async () => this.zoom_ratio); - this.messageBroker.createPullTopic("panOffset", async () => this.pan_offset); - } - handleTouchStart(event) { - event.preventDefault(); - if (event.touches[0].touchType === "stylus") return; - this.messageBroker.publish("setBrushVisibility", false); - if (event.touches.length === 2) { - const currentTime = (/* @__PURE__ */ new Date()).getTime(); - const tapTimeDiff = currentTime - this.lastTwoFingerTap; - if (tapTimeDiff < this.DOUBLE_TAP_DELAY) { - this.handleDoubleTap(); - this.lastTwoFingerTap = 0; - } else { - this.lastTwoFingerTap = currentTime; - this.isTouchZooming = true; - this.lastTouchZoomDistance = this.getTouchDistance(event.touches); - const midpoint = this.getTouchMidpoint(event.touches); - this.lastTouchMidPoint = midpoint; + parseNodeBegin(line, property) { + const nodeName = property[1].trim().replace(/^"/, "").replace(/"$/, ""); + const nodeAttrs = property[2].split(",").map(function(attr) { + return attr.trim().replace(/^"/, "").replace(/"$/, ""); + }); + const node = { name: nodeName }; + const attrs = this.parseNodeAttr(nodeAttrs); + const currentNode = this.getCurrentNode(); + if (this.currentIndent === 0) { + this.allNodes.add(nodeName, node); + } else { + if (nodeName in currentNode) { + if (nodeName === "PoseNode") { + currentNode.PoseNode.push(node); + } else if (currentNode[nodeName].id !== void 0) { + currentNode[nodeName] = {}; + currentNode[nodeName][currentNode[nodeName].id] = currentNode[nodeName]; + } + if (attrs.id !== "") currentNode[nodeName][attrs.id] = node; + } else if (typeof attrs.id === "number") { + currentNode[nodeName] = {}; + currentNode[nodeName][attrs.id] = node; + } else if (nodeName !== "Properties70") { + if (nodeName === "PoseNode") currentNode[nodeName] = [node]; + else currentNode[nodeName] = node; } - } else if (event.touches.length === 1) { - this.lastTouchPoint = { - x: event.touches[0].clientX, - y: event.touches[0].clientY - }; } + if (typeof attrs.id === "number") node.id = attrs.id; + if (attrs.name !== "") node.attrName = attrs.name; + if (attrs.type !== "") node.attrType = attrs.type; + this.pushStack(node); } - async handleTouchMove(event) { - event.preventDefault(); - if (event.touches[0].touchType === "stylus") return; - this.lastTwoFingerTap = 0; - if (this.isTouchZooming && event.touches.length === 2) { - const newDistance = this.getTouchDistance(event.touches); - const zoomFactor = newDistance / this.lastTouchZoomDistance; - const oldZoom = this.zoom_ratio; - this.zoom_ratio = Math.max( - 0.2, - Math.min(10, this.zoom_ratio * zoomFactor) - ); - const newZoom = this.zoom_ratio; - const midpoint = this.getTouchMidpoint(event.touches); - if (this.lastTouchMidPoint) { - const deltaX = midpoint.x - this.lastTouchMidPoint.x; - const deltaY = midpoint.y - this.lastTouchMidPoint.y; - this.pan_offset.x += deltaX; - this.pan_offset.y += deltaY; - } - if (this.maskCanvas === null) { - this.maskCanvas = await this.messageBroker.pull("maskCanvas"); + parseNodeAttr(attrs) { + let id2 = attrs[0]; + if (attrs[0] !== "") { + id2 = parseInt(attrs[0]); + if (isNaN(id2)) { + id2 = attrs[0]; } - const rect = this.maskCanvas.getBoundingClientRect(); - const touchX = midpoint.x - rect.left; - const touchY = midpoint.y - rect.top; - const scaleFactor = newZoom / oldZoom; - this.pan_offset.x += touchX - touchX * scaleFactor; - this.pan_offset.y += touchY - touchY * scaleFactor; - this.invalidatePanZoom(); - this.lastTouchZoomDistance = newDistance; - this.lastTouchMidPoint = midpoint; - } else if (event.touches.length === 1) { - this.handleSingleTouchPan(event.touches[0]); } + let name = "", type = ""; + if (attrs.length > 1) { + name = attrs[1].replace(/^(\w+)::/, ""); + type = attrs[2]; + } + return { id: id2, name, type }; } - handleTouchEnd(event) { - event.preventDefault(); - if (event.touches.length === 0 && event.touches[0].touchType === "stylus") { + parseNodeProperty(line, property, contentLine) { + let propName = property[1].replace(/^"/, "").replace(/"$/, "").trim(); + let propValue = property[2].replace(/^"/, "").replace(/"$/, "").trim(); + if (propName === "Content" && propValue === ",") { + propValue = contentLine.replace(/"/g, "").replace(/,$/, "").trim(); + } + const currentNode = this.getCurrentNode(); + const parentName = currentNode.name; + if (parentName === "Properties70") { + this.parseNodeSpecialProperty(line, propName, propValue); return; } - this.isTouchZooming = false; - this.lastTouchMidPoint = { x: 0, y: 0 }; - if (event.touches.length === 0) { - this.lastTouchPoint = { x: 0, y: 0 }; - } else if (event.touches.length === 1) { - this.lastTouchPoint = { - x: event.touches[0].clientX, - y: event.touches[0].clientY - }; + if (propName === "C") { + const connProps = propValue.split(",").slice(1); + const from = parseInt(connProps[0]); + const to = parseInt(connProps[1]); + let rest = propValue.split(",").slice(3); + rest = rest.map(function(elem) { + return elem.trim().replace(/^"/, ""); + }); + propName = "connections"; + propValue = [from, to]; + append(propValue, rest); + if (currentNode[propName] === void 0) { + currentNode[propName] = []; + } + } + if (propName === "Node") currentNode.id = propValue; + if (propName in currentNode && Array.isArray(currentNode[propName])) { + currentNode[propName].push(propValue); + } else { + if (propName !== "a") currentNode[propName] = propValue; + else currentNode.a = propValue; + } + this.setCurrentProp(currentNode, propName); + if (propName === "a" && propValue.slice(-1) !== ",") { + currentNode.a = parseNumberArray(propValue); } } - getTouchDistance(touches) { - const dx = touches[0].clientX - touches[1].clientX; - const dy = touches[0].clientY - touches[1].clientY; - return Math.sqrt(dx * dx + dy * dy); - } - getTouchMidpoint(touches) { - return { - x: (touches[0].clientX + touches[1].clientX) / 2, - y: (touches[0].clientY + touches[1].clientY) / 2 - }; - } - async handleSingleTouchPan(touch) { - if (this.lastTouchPoint === null) { - this.lastTouchPoint = { x: touch.clientX, y: touch.clientY }; - return; + parseNodePropertyContinued(line) { + const currentNode = this.getCurrentNode(); + currentNode.a += line; + if (line.slice(-1) !== ",") { + currentNode.a = parseNumberArray(currentNode.a); } - const deltaX = touch.clientX - this.lastTouchPoint.x; - const deltaY = touch.clientY - this.lastTouchPoint.y; - this.pan_offset.x += deltaX; - this.pan_offset.y += deltaY; - await this.invalidatePanZoom(); - this.lastTouchPoint = { x: touch.clientX, y: touch.clientY }; } - updateCursorPosition(clientPoint) { - var cursorX = clientPoint.x - this.pan_offset.x; - var cursorY = clientPoint.y - this.pan_offset.y; - this.cursorPoint = { x: cursorX, y: cursorY }; + // parse "Property70" + parseNodeSpecialProperty(line, propName, propValue) { + const props = propValue.split('",').map(function(prop) { + return prop.trim().replace(/^\"/, "").replace(/\s/, "_"); + }); + const innerPropName = props[0]; + const innerPropType1 = props[1]; + const innerPropType2 = props[2]; + const innerPropFlag = props[3]; + let innerPropValue = props[4]; + switch (innerPropType1) { + case "int": + case "enum": + case "bool": + case "ULongLong": + case "double": + case "Number": + case "FieldOfView": + innerPropValue = parseFloat(innerPropValue); + break; + case "Color": + case "ColorRGB": + case "Vector3D": + case "Lcl_Translation": + case "Lcl_Rotation": + case "Lcl_Scaling": + innerPropValue = parseNumberArray(innerPropValue); + break; + } + this.getPrevNode()[innerPropName] = { + "type": innerPropType1, + "type2": innerPropType2, + "flag": innerPropFlag, + "value": innerPropValue + }; + this.setCurrentProp(this.getPrevNode(), innerPropName); } - //prob redundant - handleDoubleTap() { - this.messageBroker.publish("undo"); +} +class BinaryParser { + static { + __name(this, "BinaryParser"); } - async zoom(event) { - const cursorPoint = { x: event.clientX, y: event.clientY }; - const oldZoom = this.zoom_ratio; - const zoomFactor = event.deltaY < 0 ? 1.1 : 0.9; - this.zoom_ratio = Math.max( - 0.2, - Math.min(10, this.zoom_ratio * zoomFactor) - ); - const newZoom = this.zoom_ratio; - const maskCanvas = await this.messageBroker.pull("maskCanvas"); - const rect = maskCanvas.getBoundingClientRect(); - const mouseX = cursorPoint.x - rect.left; - const mouseY = cursorPoint.y - rect.top; - console.log(oldZoom, newZoom); - const scaleFactor = newZoom / oldZoom; - this.pan_offset.x += mouseX - mouseX * scaleFactor; - this.pan_offset.y += mouseY - mouseY * scaleFactor; - await this.invalidatePanZoom(); - const newImageWidth = maskCanvas.clientWidth; - const zoomRatio = newImageWidth / this.imageRootWidth; - this.interpolatedZoomRatio = zoomRatio; - this.messageBroker.publish("setZoomText", `${Math.round(zoomRatio * 100)}%`); - this.updateCursorPosition(cursorPoint); - requestAnimationFrame(() => { - this.messageBroker.publish("updateBrushPreview"); - }); + parse(buffer) { + const reader = new BinaryReader(buffer); + reader.skip(23); + const version = reader.getUint32(); + if (version < 6400) { + throw new Error("THREE.FBXLoader: FBX version not supported, FileVersion: " + version); + } + const allNodes = new FBXTree(); + while (!this.endOfContent(reader)) { + const node = this.parseNode(reader, version); + if (node !== null) allNodes.add(node.name, node); + } + return allNodes; } - async smoothResetView(duration = 500) { - const startZoom = this.zoom_ratio; - const startPan = { ...this.pan_offset }; - const sidePanelWidth = 220; - const toolPanelWidth = 64; - const topBarHeight = 44; - const availableWidth = this.rootElement.clientWidth - sidePanelWidth - toolPanelWidth; - const availableHeight = this.rootElement.clientHeight - topBarHeight; - const zoomRatioWidth = availableWidth / this.image.width; - const zoomRatioHeight = availableHeight / this.image.height; - const targetZoom = Math.min(zoomRatioWidth, zoomRatioHeight); - const aspectRatio = this.image.width / this.image.height; - let finalWidth = 0; - let finalHeight = 0; - const targetPan = { x: toolPanelWidth, y: topBarHeight }; - if (zoomRatioHeight > zoomRatioWidth) { - finalWidth = availableWidth; - finalHeight = finalWidth / aspectRatio; - targetPan.y = (availableHeight - finalHeight) / 2 + topBarHeight; + // Check if reader has reached the end of content. + endOfContent(reader) { + if (reader.size() % 16 === 0) { + return (reader.getOffset() + 160 + 16 & ~15) >= reader.size(); } else { - finalHeight = availableHeight; - finalWidth = finalHeight * aspectRatio; - targetPan.x = (availableWidth - finalWidth) / 2 + toolPanelWidth; + return reader.getOffset() + 160 + 16 >= reader.size(); } - const startTime = performance.now(); - const animate = /* @__PURE__ */ __name((currentTime) => { - const elapsed = currentTime - startTime; - const progress = Math.min(elapsed / duration, 1); - const eased = 1 - Math.pow(1 - progress, 3); - const currentZoom = startZoom + (targetZoom - startZoom) * eased; - this.zoom_ratio = currentZoom; - this.pan_offset.x = startPan.x + (targetPan.x - startPan.x) * eased; - this.pan_offset.y = startPan.y + (targetPan.y - startPan.y) * eased; - this.invalidatePanZoom(); - const interpolatedZoomRatio = startZoom + (1 - startZoom) * eased; - this.messageBroker.publish( - "setZoomText", - `${Math.round(interpolatedZoomRatio * 100)}%` - ); - if (progress < 1) { - requestAnimationFrame(animate); - } - }, "animate"); - requestAnimationFrame(animate); - this.interpolatedZoomRatio = 1; } - async initializeCanvasPanZoom(image, rootElement) { - let sidePanelWidth = 220; - const toolPanelWidth = 64; - let topBarHeight = 44; - this.rootElement = rootElement; - let availableWidth = rootElement.clientWidth - sidePanelWidth - toolPanelWidth; - let availableHeight = rootElement.clientHeight - topBarHeight; - let zoomRatioWidth = availableWidth / image.width; - let zoomRatioHeight = availableHeight / image.height; - let aspectRatio = image.width / image.height; - let finalWidth = 0; - let finalHeight = 0; - let pan_offset = { x: toolPanelWidth, y: topBarHeight }; - if (zoomRatioHeight > zoomRatioWidth) { - finalWidth = availableWidth; - finalHeight = finalWidth / aspectRatio; - pan_offset.y = (availableHeight - finalHeight) / 2 + topBarHeight; - } else { - finalHeight = availableHeight; - finalWidth = finalHeight * aspectRatio; - pan_offset.x = (availableWidth - finalWidth) / 2 + toolPanelWidth; + // recursively parse nodes until the end of the file is reached + parseNode(reader, version) { + const node = {}; + const endOffset = version >= 7500 ? reader.getUint64() : reader.getUint32(); + const numProperties = version >= 7500 ? reader.getUint64() : reader.getUint32(); + version >= 7500 ? reader.getUint64() : reader.getUint32(); + const nameLen = reader.getUint8(); + const name = reader.getString(nameLen); + if (endOffset === 0) return null; + const propertyList = []; + for (let i = 0; i < numProperties; i++) { + propertyList.push(this.parseProperty(reader)); } - if (this.image === null) { - this.image = image; + const id2 = propertyList.length > 0 ? propertyList[0] : ""; + const attrName = propertyList.length > 1 ? propertyList[1] : ""; + const attrType = propertyList.length > 2 ? propertyList[2] : ""; + node.singleProperty = numProperties === 1 && reader.getOffset() === endOffset ? true : false; + while (endOffset > reader.getOffset()) { + const subNode = this.parseNode(reader, version); + if (subNode !== null) this.parseSubNode(name, node, subNode); } - this.imageRootWidth = finalWidth; - this.imageRootHeight = finalHeight; - this.zoom_ratio = Math.min(zoomRatioWidth, zoomRatioHeight); - this.pan_offset = pan_offset; - await this.invalidatePanZoom(); + node.propertyList = propertyList; + if (typeof id2 === "number") node.id = id2; + if (attrName !== "") node.attrName = attrName; + if (attrType !== "") node.attrType = attrType; + if (name !== "") node.name = name; + return node; } - async invalidatePanZoom() { - if (!this.image?.width || !this.image?.height || !this.pan_offset || !this.zoom_ratio) { - console.warn("Missing required properties for pan/zoom"); - return; + parseSubNode(name, node, subNode) { + if (subNode.singleProperty === true) { + const value = subNode.propertyList[0]; + if (Array.isArray(value)) { + node[subNode.name] = subNode; + subNode.a = value; + } else { + node[subNode.name] = value; + } + } else if (name === "Connections" && subNode.name === "C") { + const array = []; + subNode.propertyList.forEach(function(property, i) { + if (i !== 0) array.push(property); + }); + if (node.connections === void 0) { + node.connections = []; + } + node.connections.push(array); + } else if (subNode.name === "Properties70") { + const keys = Object.keys(subNode); + keys.forEach(function(key) { + node[key] = subNode[key]; + }); + } else if (name === "Properties70" && subNode.name === "P") { + let innerPropName = subNode.propertyList[0]; + let innerPropType1 = subNode.propertyList[1]; + const innerPropType2 = subNode.propertyList[2]; + const innerPropFlag = subNode.propertyList[3]; + let innerPropValue; + if (innerPropName.indexOf("Lcl ") === 0) innerPropName = innerPropName.replace("Lcl ", "Lcl_"); + if (innerPropType1.indexOf("Lcl ") === 0) innerPropType1 = innerPropType1.replace("Lcl ", "Lcl_"); + if (innerPropType1 === "Color" || innerPropType1 === "ColorRGB" || innerPropType1 === "Vector" || innerPropType1 === "Vector3D" || innerPropType1.indexOf("Lcl_") === 0) { + innerPropValue = [ + subNode.propertyList[4], + subNode.propertyList[5], + subNode.propertyList[6] + ]; + } else { + innerPropValue = subNode.propertyList[4]; + } + node[innerPropName] = { + "type": innerPropType1, + "type2": innerPropType2, + "flag": innerPropFlag, + "value": innerPropValue + }; + } else if (node[subNode.name] === void 0) { + if (typeof subNode.id === "number") { + node[subNode.name] = {}; + node[subNode.name][subNode.id] = subNode; + } else { + node[subNode.name] = subNode; + } + } else { + if (subNode.name === "PoseNode") { + if (!Array.isArray(node[subNode.name])) { + node[subNode.name] = [node[subNode.name]]; + } + node[subNode.name].push(subNode); + } else if (node[subNode.name][subNode.id] === void 0) { + node[subNode.name][subNode.id] = subNode; + } } - const raw_width = this.image.width * this.zoom_ratio; - const raw_height = this.image.height * this.zoom_ratio; - this.canvasContainer ??= await this.messageBroker?.pull("getCanvasContainer"); - if (!this.canvasContainer) return; - Object.assign(this.canvasContainer.style, { - width: `${raw_width}px`, - height: `${raw_height}px`, - left: `${this.pan_offset.x}px`, - top: `${this.pan_offset.y}px` - }); - } - handlePanStart(event) { - let coords_canvas = this.messageBroker.pull("screenToCanvas", { - x: event.offsetX, - y: event.offsetY - }); - this.mouseDownPoint = { x: event.clientX, y: event.clientY }; - this.messageBroker.publish("panCursor", true); - this.initialPan = this.pan_offset; - return; } - handlePanMove(event) { - if (this.mouseDownPoint === null) throw new Error("mouseDownPoint is null"); - let deltaX = this.mouseDownPoint.x - event.clientX; - let deltaY = this.mouseDownPoint.y - event.clientY; - let pan_x = this.initialPan.x - deltaX; - let pan_y = this.initialPan.y - deltaY; - this.pan_offset = { x: pan_x, y: pan_y }; - this.invalidatePanZoom(); + parseProperty(reader) { + const type = reader.getString(1); + let length; + switch (type) { + case "C": + return reader.getBoolean(); + case "D": + return reader.getFloat64(); + case "F": + return reader.getFloat32(); + case "I": + return reader.getInt32(); + case "L": + return reader.getInt64(); + case "R": + length = reader.getUint32(); + return reader.getArrayBuffer(length); + case "S": + length = reader.getUint32(); + return reader.getString(length); + case "Y": + return reader.getInt16(); + case "b": + case "c": + case "d": + case "f": + case "i": + case "l": + const arrayLength = reader.getUint32(); + const encoding = reader.getUint32(); + const compressedLength = reader.getUint32(); + if (encoding === 0) { + switch (type) { + case "b": + case "c": + return reader.getBooleanArray(arrayLength); + case "d": + return reader.getFloat64Array(arrayLength); + case "f": + return reader.getFloat32Array(arrayLength); + case "i": + return reader.getInt32Array(arrayLength); + case "l": + return reader.getInt64Array(arrayLength); + } + } + const data = unzlibSync(new Uint8Array(reader.getArrayBuffer(compressedLength))); + const reader2 = new BinaryReader(data.buffer); + switch (type) { + case "b": + case "c": + return reader2.getBooleanArray(arrayLength); + case "d": + return reader2.getFloat64Array(arrayLength); + case "f": + return reader2.getFloat32Array(arrayLength); + case "i": + return reader2.getInt32Array(arrayLength); + case "l": + return reader2.getInt64Array(arrayLength); + } + break; + default: + throw new Error("THREE.FBXLoader: Unknown property type " + type); + } } } -class MessageBroker { +class BinaryReader { static { - __name(this, "MessageBroker"); + __name(this, "BinaryReader"); } - pushTopics = {}; - pullTopics = {}; - constructor() { - this.registerListeners(); + constructor(buffer, littleEndian) { + this.dv = new DataView(buffer); + this.offset = 0; + this.littleEndian = littleEndian !== void 0 ? littleEndian : true; + this._textDecoder = new TextDecoder(); } - // Push - registerListeners() { - this.createPushTopic("panStart"); - this.createPushTopic("paintBucketFill"); - this.createPushTopic("saveState"); - this.createPushTopic("brushAdjustmentStart"); - this.createPushTopic("drawStart"); - this.createPushTopic("panMove"); - this.createPushTopic("updateBrushPreview"); - this.createPushTopic("brushAdjustment"); - this.createPushTopic("draw"); - this.createPushTopic("paintBucketCursor"); - this.createPushTopic("panCursor"); - this.createPushTopic("drawEnd"); - this.createPushTopic("zoom"); - this.createPushTopic("undo"); - this.createPushTopic("redo"); - this.createPushTopic("cursorPoint"); - this.createPushTopic("panOffset"); - this.createPushTopic("zoomRatio"); - this.createPushTopic("getMaskCanvas"); - this.createPushTopic("getCanvasContainer"); - this.createPushTopic("screenToCanvas"); - this.createPushTopic("isKeyPressed"); - this.createPushTopic("isCombinationPressed"); - this.createPushTopic("setPaintBucketTolerance"); - this.createPushTopic("setBrushSize"); - this.createPushTopic("setBrushHardness"); - this.createPushTopic("setBrushOpacity"); - this.createPushTopic("setBrushShape"); - this.createPushTopic("initZoomPan"); - this.createPushTopic("setTool"); - this.createPushTopic("pointerDown"); - this.createPushTopic("pointerMove"); - this.createPushTopic("pointerUp"); - this.createPushTopic("wheel"); - this.createPushTopic("initPaintBucketTool"); - this.createPushTopic("setBrushVisibility"); - this.createPushTopic("setBrushPreviewGradientVisibility"); - this.createPushTopic("handleTouchStart"); - this.createPushTopic("handleTouchMove"); - this.createPushTopic("handleTouchEnd"); - this.createPushTopic("colorSelectFill"); - this.createPushTopic("setColorSelectTolerance"); - this.createPushTopic("setLivePreview"); - this.createPushTopic("updateCursor"); - this.createPushTopic("setColorComparisonMethod"); - this.createPushTopic("clearLastPoint"); - this.createPushTopic("setWholeImage"); - this.createPushTopic("setMaskBoundary"); - this.createPushTopic("setMaskTolerance"); - this.createPushTopic("setBrushSmoothingPrecision"); - this.createPushTopic("setZoomText"); - this.createPushTopic("resetZoom"); - this.createPushTopic("invert"); + getOffset() { + return this.offset; } - /** - * Creates a new push topic (listener is notified) - * - * @param {string} topicName - The name of the topic to create. - * @throws {Error} If the topic already exists. - */ - createPushTopic(topicName) { - if (this.topicExists(this.pushTopics, topicName)) { - throw new Error("Topic already exists"); + size() { + return this.dv.buffer.byteLength; + } + skip(length) { + this.offset += length; + } + // seems like true/false representation depends on exporter. + // true: 1 or 'Y'(=0x59), false: 0 or 'T'(=0x54) + // then sees LSB. + getBoolean() { + return (this.getUint8() & 1) === 1; + } + getBooleanArray(size) { + const a = []; + for (let i = 0; i < size; i++) { + a.push(this.getBoolean()); } - this.pushTopics[topicName] = []; + return a; } - /** - * Subscribe a callback function to the given topic. - * - * @param {string} topicName - The name of the topic to subscribe to. - * @param {Callback} callback - The callback function to be subscribed. - * @throws {Error} If the topic does not exist. - */ - subscribe(topicName, callback) { - if (!this.topicExists(this.pushTopics, topicName)) { - throw new Error(`Topic "${topicName}" does not exist!`); + getUint8() { + const value = this.dv.getUint8(this.offset); + this.offset += 1; + return value; + } + getInt16() { + const value = this.dv.getInt16(this.offset, this.littleEndian); + this.offset += 2; + return value; + } + getInt32() { + const value = this.dv.getInt32(this.offset, this.littleEndian); + this.offset += 4; + return value; + } + getInt32Array(size) { + const a = []; + for (let i = 0; i < size; i++) { + a.push(this.getInt32()); } - this.pushTopics[topicName].push(callback); + return a; } - /** - * Removes a callback function from the list of subscribers for a given topic. - * - * @param {string} topicName - The name of the topic to unsubscribe from. - * @param {Callback} callback - The callback function to remove from the subscribers list. - * @throws {Error} If the topic does not exist in the list of topics. - */ - unsubscribe(topicName, callback) { - if (!this.topicExists(this.pushTopics, topicName)) { - throw new Error("Topic does not exist"); + getUint32() { + const value = this.dv.getUint32(this.offset, this.littleEndian); + this.offset += 4; + return value; + } + // JavaScript doesn't support 64-bit integer so calculate this here + // 1 << 32 will return 1 so using multiply operation instead here. + // There's a possibility that this method returns wrong value if the value + // is out of the range between Number.MAX_SAFE_INTEGER and Number.MIN_SAFE_INTEGER. + // TODO: safely handle 64-bit integer + getInt64() { + let low, high; + if (this.littleEndian) { + low = this.getUint32(); + high = this.getUint32(); + } else { + high = this.getUint32(); + low = this.getUint32(); } - const index = this.pushTopics[topicName].indexOf(callback); - if (index > -1) { - this.pushTopics[topicName].splice(index, 1); + if (high & 2147483648) { + high = ~high & 4294967295; + low = ~low & 4294967295; + if (low === 4294967295) high = high + 1 & 4294967295; + low = low + 1 & 4294967295; + return -(high * 4294967296 + low); } + return high * 4294967296 + low; } - /** - * Publishes data to a specified topic with variable number of arguments. - * @param {string} topicName - The name of the topic to publish to. - * @param {...any[]} args - Variable number of arguments to pass to subscribers - * @throws {Error} If the specified topic does not exist. - */ - publish(topicName, ...args) { - if (!this.topicExists(this.pushTopics, topicName)) { - throw new Error(`Topic "${topicName}" does not exist!`); + getInt64Array(size) { + const a = []; + for (let i = 0; i < size; i++) { + a.push(this.getInt64()); } - this.pushTopics[topicName].forEach((callback) => { - callback(...args); - }); + return a; } - // Pull - /** - * Creates a new pull topic (listener must request data) - * - * @param {string} topicName - The name of the topic to create. - * @param {() => Promise} callBack - The callback function to be called when data is requested. - * @throws {Error} If the topic already exists. - */ - createPullTopic(topicName, callBack) { - if (this.topicExists(this.pullTopics, topicName)) { - throw new Error("Topic already exists"); + // Note: see getInt64() comment + getUint64() { + let low, high; + if (this.littleEndian) { + low = this.getUint32(); + high = this.getUint32(); + } else { + high = this.getUint32(); + low = this.getUint32(); } - this.pullTopics[topicName] = callBack; + return high * 4294967296 + low; } - /** - * Requests data from a specified pull topic. - * @param {string} topicName - The name of the topic to request data from. - * @returns {Promise} - The data from the pull topic. - * @throws {Error} If the specified topic does not exist. - */ - async pull(topicName, data) { - if (!this.topicExists(this.pullTopics, topicName)) { - throw new Error("Topic does not exist"); + getFloat32() { + const value = this.dv.getFloat32(this.offset, this.littleEndian); + this.offset += 4; + return value; + } + getFloat32Array(size) { + const a = []; + for (let i = 0; i < size; i++) { + a.push(this.getFloat32()); } - const callBack = this.pullTopics[topicName]; - try { - const result = await callBack(data); - return result; - } catch (error) { - console.error(`Error pulling data from topic "${topicName}":`, error); - throw error; + return a; + } + getFloat64() { + const value = this.dv.getFloat64(this.offset, this.littleEndian); + this.offset += 8; + return value; + } + getFloat64Array(size) { + const a = []; + for (let i = 0; i < size; i++) { + a.push(this.getFloat64()); } + return a; } - // Helper Methods - /** - * Checks if a topic exists in the given topics object. - * @param {Record} topics - The topics object to check. - * @param {string} topicName - The name of the topic to check. - * @returns {boolean} - True if the topic exists, false otherwise. - */ - topicExists(topics, topicName) { - return topics.hasOwnProperty(topicName); + getArrayBuffer(size) { + const value = this.dv.buffer.slice(this.offset, this.offset + size); + this.offset += size; + return value; + } + getString(size) { + const start = this.offset; + let a = new Uint8Array(this.dv.buffer, start, size); + this.skip(size); + const nullByte = a.indexOf(0); + if (nullByte >= 0) a = new Uint8Array(this.dv.buffer, start, nullByte); + return this._textDecoder.decode(a); } } -class KeyboardManager { +class FBXTree { static { - __name(this, "KeyboardManager"); + __name(this, "FBXTree"); } - keysDown = []; - maskEditor; - messageBroker; - constructor(maskEditor) { - this.maskEditor = maskEditor; - this.messageBroker = maskEditor.getMessageBroker(); - this.addPullTopics(); + add(key, val) { + this[key] = val; } - addPullTopics() { - this.messageBroker.createPullTopic( - "isKeyPressed", - (key) => Promise.resolve(this.isKeyDown(key)) - ); +} +function isFbxFormatBinary(buffer) { + const CORRECT = "Kaydara FBX Binary \0"; + return buffer.byteLength >= CORRECT.length && CORRECT === convertArrayBufferToString(buffer, 0, CORRECT.length); +} +__name(isFbxFormatBinary, "isFbxFormatBinary"); +function isFbxFormatASCII(text) { + const CORRECT = ["K", "a", "y", "d", "a", "r", "a", "\\", "F", "B", "X", "\\", "B", "i", "n", "a", "r", "y", "\\", "\\"]; + let cursor = 0; + function read(offset) { + const result = text[offset - 1]; + text = text.slice(cursor + offset); + cursor++; + return result; } - addListeners() { - document.addEventListener("keydown", (event) => this.handleKeyDown(event)); - document.addEventListener("keyup", (event) => this.handleKeyUp(event)); - window.addEventListener("blur", () => this.clearKeys()); + __name(read, "read"); + for (let i = 0; i < CORRECT.length; ++i) { + const num = read(1); + if (num === CORRECT[i]) { + return false; + } } - removeListeners() { - document.removeEventListener( - "keydown", - (event) => this.handleKeyDown(event) - ); - document.removeEventListener("keyup", (event) => this.handleKeyUp(event)); + return true; +} +__name(isFbxFormatASCII, "isFbxFormatASCII"); +function getFbxVersion(text) { + const versionRegExp = /FBXVersion: (\d+)/; + const match = text.match(versionRegExp); + if (match) { + const version = parseInt(match[1]); + return version; } - clearKeys() { - this.keysDown = []; + throw new Error("THREE.FBXLoader: Cannot find the version number for the file given."); +} +__name(getFbxVersion, "getFbxVersion"); +function convertFBXTimeToSeconds(time) { + return time / 46186158e3; +} +__name(convertFBXTimeToSeconds, "convertFBXTimeToSeconds"); +const dataArray = []; +function getData(polygonVertexIndex, polygonIndex, vertexIndex, infoObject) { + let index; + switch (infoObject.mappingType) { + case "ByPolygonVertex": + index = polygonVertexIndex; + break; + case "ByPolygon": + index = polygonIndex; + break; + case "ByVertice": + index = vertexIndex; + break; + case "AllSame": + index = infoObject.indices[0]; + break; + default: + console.warn("THREE.FBXLoader: unknown attribute mapping type " + infoObject.mappingType); } - handleKeyDown(event) { - if (!this.keysDown.includes(event.key)) { - this.keysDown.push(event.key); - } + if (infoObject.referenceType === "IndexToDirect") index = infoObject.indices[index]; + const from = index * infoObject.dataSize; + const to = from + infoObject.dataSize; + return slice(dataArray, infoObject.buffer, from, to); +} +__name(getData, "getData"); +const tempEuler = new Euler(); +const tempVec = new Vector3(); +function generateTransform(transformData) { + const lTranslationM = new Matrix4(); + const lPreRotationM = new Matrix4(); + const lRotationM = new Matrix4(); + const lPostRotationM = new Matrix4(); + const lScalingM = new Matrix4(); + const lScalingPivotM = new Matrix4(); + const lScalingOffsetM = new Matrix4(); + const lRotationOffsetM = new Matrix4(); + const lRotationPivotM = new Matrix4(); + const lParentGX = new Matrix4(); + const lParentLX = new Matrix4(); + const lGlobalT = new Matrix4(); + const inheritType = transformData.inheritType ? transformData.inheritType : 0; + if (transformData.translation) lTranslationM.setPosition(tempVec.fromArray(transformData.translation)); + const defaultEulerOrder = getEulerOrder(0); + if (transformData.preRotation) { + const array = transformData.preRotation.map(MathUtils.degToRad); + array.push(defaultEulerOrder); + lPreRotationM.makeRotationFromEuler(tempEuler.fromArray(array)); } - handleKeyUp(event) { - this.keysDown = this.keysDown.filter((key) => key !== event.key); + if (transformData.rotation) { + const array = transformData.rotation.map(MathUtils.degToRad); + array.push(transformData.eulerOrder || defaultEulerOrder); + lRotationM.makeRotationFromEuler(tempEuler.fromArray(array)); } - isKeyDown(key) { - return this.keysDown.includes(key); + if (transformData.postRotation) { + const array = transformData.postRotation.map(MathUtils.degToRad); + array.push(defaultEulerOrder); + lPostRotationM.makeRotationFromEuler(tempEuler.fromArray(array)); + lPostRotationM.invert(); + } + if (transformData.scale) lScalingM.scale(tempVec.fromArray(transformData.scale)); + if (transformData.scalingOffset) lScalingOffsetM.setPosition(tempVec.fromArray(transformData.scalingOffset)); + if (transformData.scalingPivot) lScalingPivotM.setPosition(tempVec.fromArray(transformData.scalingPivot)); + if (transformData.rotationOffset) lRotationOffsetM.setPosition(tempVec.fromArray(transformData.rotationOffset)); + if (transformData.rotationPivot) lRotationPivotM.setPosition(tempVec.fromArray(transformData.rotationPivot)); + if (transformData.parentMatrixWorld) { + lParentLX.copy(transformData.parentMatrix); + lParentGX.copy(transformData.parentMatrixWorld); + } + const lLRM = lPreRotationM.clone().multiply(lRotationM).multiply(lPostRotationM); + const lParentGRM = new Matrix4(); + lParentGRM.extractRotation(lParentGX); + const lParentTM = new Matrix4(); + lParentTM.copyPosition(lParentGX); + const lParentGRSM = lParentTM.clone().invert().multiply(lParentGX); + const lParentGSM = lParentGRM.clone().invert().multiply(lParentGRSM); + const lLSM = lScalingM; + const lGlobalRS = new Matrix4(); + if (inheritType === 0) { + lGlobalRS.copy(lParentGRM).multiply(lLRM).multiply(lParentGSM).multiply(lLSM); + } else if (inheritType === 1) { + lGlobalRS.copy(lParentGRM).multiply(lParentGSM).multiply(lLRM).multiply(lLSM); + } else { + const lParentLSM = new Matrix4().scale(new Vector3().setFromMatrixScale(lParentLX)); + const lParentLSM_inv = lParentLSM.clone().invert(); + const lParentGSM_noLocal = lParentGSM.clone().multiply(lParentLSM_inv); + lGlobalRS.copy(lParentGRM).multiply(lLRM).multiply(lParentGSM_noLocal).multiply(lLSM); } - // combinations - undoCombinationPressed() { - const combination = ["ctrl", "z"]; - const keysDownLower = this.keysDown.map((key) => key.toLowerCase()); - const result = combination.every((key) => keysDownLower.includes(key)); - if (result) this.messageBroker.publish("undo"); - return result; + const lRotationPivotM_inv = lRotationPivotM.clone().invert(); + const lScalingPivotM_inv = lScalingPivotM.clone().invert(); + let 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); + const lLocalTWithAllPivotAndOffsetInfo = new Matrix4().copyPosition(lTransform); + const lGlobalTranslation = lParentGX.clone().multiply(lLocalTWithAllPivotAndOffsetInfo); + lGlobalT.copyPosition(lGlobalTranslation); + lTransform = lGlobalT.clone().multiply(lGlobalRS); + lTransform.premultiply(lParentGX.invert()); + return lTransform; +} +__name(generateTransform, "generateTransform"); +function getEulerOrder(order) { + order = order || 0; + const enums = [ + "ZYX", + // -> XYZ extrinsic + "YZX", + // -> XZY extrinsic + "XZY", + // -> YZX extrinsic + "ZXY", + // -> YXZ extrinsic + "YXZ", + // -> ZXY extrinsic + "XYZ" + // -> ZYX extrinsic + //'SphericXYZ', // not possible to support + ]; + if (order === 6) { + console.warn("THREE.FBXLoader: unsupported Euler Order: Spherical XYZ. Animations and rotations may be incorrect."); + return enums[0]; } - redoCombinationPressed() { - const combination = ["ctrl", "shift", "z"]; - const keysDownLower = this.keysDown.map((key) => key.toLowerCase()); - const result = combination.every((key) => keysDownLower.includes(key)); - if (result) this.messageBroker.publish("redo"); - return result; + return enums[order]; +} +__name(getEulerOrder, "getEulerOrder"); +function parseNumberArray(value) { + const array = value.split(",").map(function(val) { + return parseFloat(val); + }); + return array; +} +__name(parseNumberArray, "parseNumberArray"); +function convertArrayBufferToString(buffer, from, to) { + if (from === void 0) from = 0; + if (to === void 0) to = buffer.byteLength; + return new TextDecoder().decode(new Uint8Array(buffer, from, to)); +} +__name(convertArrayBufferToString, "convertArrayBufferToString"); +function append(a, b) { + for (let i = 0, j = a.length, l = b.length; i < l; i++, j++) { + a[j] = b[i]; } } -app.registerExtension({ - name: "Comfy.MaskEditor", - settings: [ - { - id: "Comfy.MaskEditor.UseNewEditor", - category: ["Mask Editor", "NewEditor"], - name: "Use new mask editor", - tooltip: "Switch to the new mask editor interface", - type: "boolean", - defaultValue: true, - experimental: true - }, - { - id: "Comfy.MaskEditor.BrushAdjustmentSpeed", - category: ["Mask Editor", "BrushAdjustment", "Sensitivity"], - name: "Brush adjustment speed multiplier", - tooltip: "Controls how quickly the brush size and hardness change when adjusting. Higher values mean faster changes.", - experimental: true, - type: "slider", - attrs: { - min: 0.1, - max: 2, - step: 0.1 - }, - defaultValue: 1, - versionAdded: "1.0.0" - }, - { - id: "Comfy.MaskEditor.UseDominantAxis", - category: ["Mask Editor", "BrushAdjustment", "UseDominantAxis"], - name: "Lock brush adjustment to dominant axis", - tooltip: "When enabled, brush adjustments will only affect size OR hardness based on which direction you move more", - type: "boolean", - defaultValue: true, - experimental: true - } - ], - init(app2) { - function openMaskEditor() { - const useNewEditor = app2.extensionManager.setting.get( - "Comfy.MaskEditor.UseNewEditor" - ); - if (useNewEditor) { - const dlg = MaskEditorDialog.getInstance(); - if (dlg?.isOpened && !dlg.isOpened()) { - dlg.show(); - } - } else { - const dlg = MaskEditorDialogOld.getInstance(); - if (dlg?.isOpened && !dlg.isOpened()) { - dlg.show(); - } - } - } - __name(openMaskEditor, "openMaskEditor"); - ; - ComfyApp.open_maskeditor = openMaskEditor; - const context_predicate = /* @__PURE__ */ __name(() => { - return !!(ComfyApp.clipspace && ComfyApp.clipspace.imgs && ComfyApp.clipspace.imgs.length > 0); - }, "context_predicate"); - ClipspaceDialog.registerButton( - "MaskEditor", - context_predicate, - openMaskEditor - ); +__name(append, "append"); +function slice(a, b, from, to) { + for (let i = from, j = 0; i < to; i++, j++) { + a[j] = b[i]; } -}); -const id = "Comfy.NodeTemplates"; -const file = "comfy.templates.json"; -class ManageTemplates extends ComfyDialog { + return a; +} +__name(slice, "slice"); +class STLLoader extends Loader { static { - __name(this, "ManageTemplates"); - } - templates; - draggedEl; - saveVisualCue; - emptyImg; - importInput; - constructor() { - super(); - this.load().then((v) => { - this.templates = v; - }); - this.element.classList.add("comfy-manage-templates"); - this.draggedEl = null; - this.saveVisualCue = null; - this.emptyImg = new Image(); - this.emptyImg.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs="; - this.importInput = $el("input", { - type: "file", - accept: ".json", - multiple: true, - style: { display: "none" }, - parent: document.body, - onchange: /* @__PURE__ */ __name(() => this.importAll(), "onchange") - }); + __name(this, "STLLoader"); } - createButtons() { - const btns = super.createButtons(); - btns[0].textContent = "Close"; - btns[0].onclick = (e) => { - clearTimeout(this.saveVisualCue); - this.close(); - }; - btns.unshift( - $el("button", { - type: "button", - textContent: "Export", - onclick: /* @__PURE__ */ __name(() => this.exportAll(), "onclick") - }) - ); - btns.unshift( - $el("button", { - type: "button", - textContent: "Import", - onclick: /* @__PURE__ */ __name(() => { - this.importInput.click(); - }, "onclick") - }) - ); - return btns; + constructor(manager) { + super(manager); } - async load() { - let templates = []; - const res = await api.getUserData(file); - if (res.status === 200) { + load(url, onLoad, onProgress, onError) { + const scope = this; + const loader = new FileLoader(this.manager); + loader.setPath(this.path); + loader.setResponseType("arraybuffer"); + loader.setRequestHeader(this.requestHeader); + loader.setWithCredentials(this.withCredentials); + loader.load(url, function(text) { try { - templates = await res.json(); - } catch (error) { + onLoad(scope.parse(text)); + } catch (e) { + if (onError) { + onError(e); + } else { + console.error(e); + } + scope.manager.itemError(url); } - } else if (res.status !== 404) { - console.error(res.status + " " + res.statusText); - } - return templates ?? []; - } - async store() { - const templates = JSON.stringify(this.templates, void 0, 4); - try { - await api.storeUserData(file, templates, { stringify: false }); - } catch (error) { - console.error(error); - useToastStore().addAlert(error.message); - } + }, onProgress, onError); } - async importAll() { - for (const file2 of this.importInput.files) { - if (file2.type === "application/json" || file2.name.endsWith(".json")) { - const reader = new FileReader(); - reader.onload = async () => { - const importFile = JSON.parse(reader.result); - if (importFile?.templates) { - for (const template of importFile.templates) { - if (template?.name && template?.data) { - this.templates.push(template); - } - } - await this.store(); - } - }; - await reader.readAsText(file2); + parse(data) { + function isBinary(data2) { + const reader = new DataView(data2); + const face_size = 32 / 8 * 3 + 32 / 8 * 3 * 3 + 16 / 8; + const n_faces = reader.getUint32(80, true); + const expect = 80 + 32 / 8 + n_faces * face_size; + if (expect === reader.byteLength) { + return true; + } + const solid = [115, 111, 108, 105, 100]; + for (let off = 0; off < 5; off++) { + if (matchDataViewAt(solid, reader, off)) return false; } + return true; } - this.importInput.value = null; - this.close(); - } - exportAll() { - if (this.templates.length == 0) { - useToastStore().addAlert("No templates to export."); - return; + __name(isBinary, "isBinary"); + function matchDataViewAt(query, reader, offset) { + for (let i = 0, il = query.length; i < il; i++) { + if (query[i] !== reader.getUint8(offset + i)) return false; + } + return true; } - const json = JSON.stringify({ templates: this.templates }, null, 2); - const blob = new Blob([json], { type: "application/json" }); - const url = URL.createObjectURL(blob); - const a = $el("a", { - href: url, - download: "node_templates.json", - style: { display: "none" }, - parent: document.body - }); - a.click(); - setTimeout(function() { - a.remove(); - window.URL.revokeObjectURL(url); - }, 0); - } - show() { - super.show( - $el( - "div", - {}, - this.templates.flatMap((t2, i) => { - let nameInput; - return [ - $el( - "div", - { - dataset: { id: i.toString() }, - className: "templateManagerRow", - style: { - display: "grid", - gridTemplateColumns: "1fr auto", - border: "1px dashed transparent", - gap: "5px", - backgroundColor: "var(--comfy-menu-bg)" - }, - ondragstart: /* @__PURE__ */ __name((e) => { - this.draggedEl = e.currentTarget; - e.currentTarget.style.opacity = "0.6"; - e.currentTarget.style.border = "1px dashed yellow"; - e.dataTransfer.effectAllowed = "move"; - e.dataTransfer.setDragImage(this.emptyImg, 0, 0); - }, "ondragstart"), - ondragend: /* @__PURE__ */ __name((e) => { - e.target.style.opacity = "1"; - e.currentTarget.style.border = "1px dashed transparent"; - e.currentTarget.removeAttribute("draggable"); - this.element.querySelectorAll(".templateManagerRow").forEach((el, i2) => { - var prev_i = Number.parseInt(el.dataset.id); - if (el == this.draggedEl && prev_i != i2) { - this.templates.splice( - i2, - 0, - this.templates.splice(prev_i, 1)[0] - ); - } - el.dataset.id = i2.toString(); - }); - this.store(); - }, "ondragend"), - ondragover: /* @__PURE__ */ __name((e) => { - e.preventDefault(); - if (e.currentTarget == this.draggedEl) return; - let rect = e.currentTarget.getBoundingClientRect(); - if (e.clientY > rect.top + rect.height / 2) { - e.currentTarget.parentNode.insertBefore( - this.draggedEl, - e.currentTarget.nextSibling - ); - } else { - e.currentTarget.parentNode.insertBefore( - this.draggedEl, - e.currentTarget - ); - } - }, "ondragover") - }, - [ - $el( - "label", - { - textContent: "Name: ", - style: { - cursor: "grab" - }, - onmousedown: /* @__PURE__ */ __name((e) => { - if (e.target.localName == "label") - e.currentTarget.parentNode.draggable = "true"; - }, "onmousedown") - }, - [ - $el("input", { - value: t2.name, - dataset: { name: t2.name }, - style: { - transitionProperty: "background-color", - transitionDuration: "0s" - }, - onchange: /* @__PURE__ */ __name((e) => { - clearTimeout(this.saveVisualCue); - var el = e.target; - var row = el.parentNode.parentNode; - this.templates[row.dataset.id].name = el.value.trim() || "untitled"; - this.store(); - el.style.backgroundColor = "rgb(40, 95, 40)"; - el.style.transitionDuration = "0s"; - this.saveVisualCue = setTimeout(function() { - el.style.transitionDuration = ".7s"; - el.style.backgroundColor = "var(--comfy-input-bg)"; - }, 15); - }, "onchange"), - onkeypress: /* @__PURE__ */ __name((e) => { - var el = e.target; - clearTimeout(this.saveVisualCue); - el.style.transitionDuration = "0s"; - el.style.backgroundColor = "var(--comfy-input-bg)"; - }, "onkeypress"), - $: /* @__PURE__ */ __name((el) => nameInput = el, "$") - }) - ] - ), - $el("div", {}, [ - $el("button", { - textContent: "Export", - style: { - fontSize: "12px", - fontWeight: "normal" - }, - onclick: /* @__PURE__ */ __name((e) => { - const json = JSON.stringify({ templates: [t2] }, null, 2); - const blob = new Blob([json], { - type: "application/json" - }); - const url = URL.createObjectURL(blob); - const a = $el("a", { - href: url, - download: (nameInput.value || t2.name) + ".json", - style: { display: "none" }, - parent: document.body - }); - a.click(); - setTimeout(function() { - a.remove(); - window.URL.revokeObjectURL(url); - }, 0); - }, "onclick") - }), - $el("button", { - textContent: "Delete", - style: { - fontSize: "12px", - color: "red", - fontWeight: "normal" - }, - onclick: /* @__PURE__ */ __name((e) => { - const item = e.target.parentNode.parentNode; - item.parentNode.removeChild(item); - this.templates.splice(item.dataset.id * 1, 1); - this.store(); - var that = this; - setTimeout(function() { - that.element.querySelectorAll(".templateManagerRow").forEach((el, i2) => { - el.dataset.id = i2.toString(); - }); - }, 0); - }, "onclick") - }) - ]) - ] - ) - ]; - }) - ) - ); + __name(matchDataViewAt, "matchDataViewAt"); + function parseBinary(data2) { + const reader = new DataView(data2); + const faces = reader.getUint32(80, true); + let r, g, b, hasColors = false, colors; + let defaultR, defaultG, defaultB, alpha; + for (let index = 0; index < 80 - 10; index++) { + if (reader.getUint32(index, false) == 1129270351 && reader.getUint8(index + 4) == 82 && reader.getUint8(index + 5) == 61) { + hasColors = true; + colors = new Float32Array(faces * 3 * 3); + defaultR = reader.getUint8(index + 6) / 255; + defaultG = reader.getUint8(index + 7) / 255; + defaultB = reader.getUint8(index + 8) / 255; + alpha = reader.getUint8(index + 9) / 255; + } + } + const dataOffset = 84; + const faceLength = 12 * 4 + 2; + const geometry = new BufferGeometry(); + const vertices = new Float32Array(faces * 3 * 3); + const normals = new Float32Array(faces * 3 * 3); + const color = new Color(); + for (let face = 0; face < faces; face++) { + const start = dataOffset + face * faceLength; + const normalX = reader.getFloat32(start, true); + const normalY = reader.getFloat32(start + 4, true); + const normalZ = reader.getFloat32(start + 8, true); + if (hasColors) { + const packedColor = reader.getUint16(start + 48, true); + if ((packedColor & 32768) === 0) { + r = (packedColor & 31) / 31; + g = (packedColor >> 5 & 31) / 31; + b = (packedColor >> 10 & 31) / 31; + } else { + r = defaultR; + g = defaultG; + b = defaultB; + } + } + for (let i = 1; i <= 3; i++) { + const vertexstart = start + i * 12; + const componentIdx = face * 3 * 3 + (i - 1) * 3; + vertices[componentIdx] = reader.getFloat32(vertexstart, true); + vertices[componentIdx + 1] = reader.getFloat32(vertexstart + 4, true); + vertices[componentIdx + 2] = reader.getFloat32(vertexstart + 8, true); + normals[componentIdx] = normalX; + normals[componentIdx + 1] = normalY; + normals[componentIdx + 2] = normalZ; + if (hasColors) { + color.setRGB(r, g, b, SRGBColorSpace); + colors[componentIdx] = color.r; + colors[componentIdx + 1] = color.g; + colors[componentIdx + 2] = color.b; + } + } + } + geometry.setAttribute("position", new BufferAttribute(vertices, 3)); + geometry.setAttribute("normal", new BufferAttribute(normals, 3)); + if (hasColors) { + geometry.setAttribute("color", new BufferAttribute(colors, 3)); + geometry.hasColors = true; + geometry.alpha = alpha; + } + return geometry; + } + __name(parseBinary, "parseBinary"); + function parseASCII(data2) { + const geometry = new BufferGeometry(); + const patternSolid = /solid([\s\S]*?)endsolid/g; + const patternFace = /facet([\s\S]*?)endfacet/g; + const patternName = /solid\s(.+)/; + let faceCounter = 0; + const patternFloat = /[\s]+([+-]?(?:\d*)(?:\.\d*)?(?:[eE][+-]?\d+)?)/.source; + const patternVertex = new RegExp("vertex" + patternFloat + patternFloat + patternFloat, "g"); + const patternNormal = new RegExp("normal" + patternFloat + patternFloat + patternFloat, "g"); + const vertices = []; + const normals = []; + const groupNames = []; + const normal = new Vector3(); + let result; + let groupCount = 0; + let startVertex = 0; + let endVertex = 0; + while ((result = patternSolid.exec(data2)) !== null) { + startVertex = endVertex; + const solid = result[0]; + const name = (result = patternName.exec(solid)) !== null ? result[1] : ""; + groupNames.push(name); + while ((result = patternFace.exec(solid)) !== null) { + let vertexCountPerFace = 0; + let normalCountPerFace = 0; + const text = result[0]; + while ((result = patternNormal.exec(text)) !== null) { + normal.x = parseFloat(result[1]); + normal.y = parseFloat(result[2]); + normal.z = parseFloat(result[3]); + normalCountPerFace++; + } + while ((result = patternVertex.exec(text)) !== null) { + vertices.push(parseFloat(result[1]), parseFloat(result[2]), parseFloat(result[3])); + normals.push(normal.x, normal.y, normal.z); + vertexCountPerFace++; + endVertex++; + } + if (normalCountPerFace !== 1) { + console.error("THREE.STLLoader: Something isn't right with the normal of face number " + faceCounter); + } + if (vertexCountPerFace !== 3) { + console.error("THREE.STLLoader: Something isn't right with the vertices of face number " + faceCounter); + } + faceCounter++; + } + const start = startVertex; + const count = endVertex - startVertex; + geometry.userData.groupNames = groupNames; + geometry.addGroup(start, count, groupCount); + groupCount++; + } + geometry.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + geometry.setAttribute("normal", new Float32BufferAttribute(normals, 3)); + return geometry; + } + __name(parseASCII, "parseASCII"); + function ensureString(buffer) { + if (typeof buffer !== "string") { + return new TextDecoder().decode(buffer); + } + return buffer; + } + __name(ensureString, "ensureString"); + function ensureBinary(buffer) { + if (typeof buffer === "string") { + const array_buffer = new Uint8Array(buffer.length); + for (let i = 0; i < buffer.length; i++) { + array_buffer[i] = buffer.charCodeAt(i) & 255; + } + return array_buffer.buffer || array_buffer; + } else { + return buffer; + } + } + __name(ensureBinary, "ensureBinary"); + const binData = ensureBinary(data); + return isBinary(binData) ? parseBinary(binData) : parseASCII(ensureString(data)); } } -app.registerExtension({ - name: id, - setup() { - const manage = new ManageTemplates(); - const clipboardAction = /* @__PURE__ */ __name(async (cb) => { - const old = localStorage.getItem("litegrapheditor_clipboard"); - await cb(); - localStorage.setItem("litegrapheditor_clipboard", old); - }, "clipboardAction"); - const orig = LGraphCanvas.prototype.getCanvasMenuOptions; - LGraphCanvas.prototype.getCanvasMenuOptions = function() { - const options = orig.apply(this, arguments); - options.push(null); - options.push({ - content: `Save Selected as Template`, - disabled: !Object.keys(app.canvas.selected_nodes || {}).length, - callback: /* @__PURE__ */ __name(async () => { - const name = await useDialogService().prompt({ - title: t("nodeTemplates.saveAsTemplate"), - message: t("nodeTemplates.enterName"), - defaultValue: "" - }); - if (!name?.trim()) return; - clipboardAction(() => { - app.canvas.copyToClipboard(); - let data = localStorage.getItem("litegrapheditor_clipboard"); - data = JSON.parse(data); - const nodeIds = Object.keys(app.canvas.selected_nodes); - for (let i = 0; i < nodeIds.length; i++) { - const node = app.graph.getNodeById(nodeIds[i]); - const nodeData = node?.constructor.nodeData; - let groupData = GroupNodeHandler.getGroupData(node); - if (groupData) { - groupData = groupData.nodeData; - if (!data.groupNodes) { - data.groupNodes = {}; - } - data.groupNodes[nodeData.name] = groupData; - data.nodes[i].type = nodeData.name; - } - } - manage.templates.push({ - name, - data: JSON.stringify(data) - }); - manage.store(); - }); - }, "callback") - }); - const subItems = manage.templates.map((t2) => { - return { - content: t2.name, - callback: /* @__PURE__ */ __name(() => { - clipboardAction(async () => { - const data = JSON.parse(t2.data); - await GroupNodeConfig.registerFromWorkflow(data.groupNodes, {}); - if (!data.reroutes) { - deserialiseAndCreate(t2.data, app.canvas); - } else { - localStorage.setItem("litegrapheditor_clipboard", t2.data); - app.canvas.pasteFromClipboard(); - } +async function uploadFile(load3d, file2, fileInput) { + let uploadPath; + try { + const body = new FormData(); + body.append("image", file2); + body.append("subfolder", "3d"); + const resp = await api.fetchApi("/upload/image", { + method: "POST", + body + }); + if (resp.status === 200) { + const data = await resp.json(); + let path = data.name; + if (data.subfolder) path = data.subfolder + "/" + path; + uploadPath = path; + const modelUrl = api.apiURL( + getResourceURL(...splitFilePath(path), "input") + ); + await load3d.loadModel(modelUrl, file2.name); + const fileExt = file2.name.split(".").pop()?.toLowerCase(); + if (fileExt === "obj" && fileInput?.files) { + try { + const mtlFile = Array.from(fileInput.files).find( + (f) => f.name.toLowerCase().endsWith(".mtl") + ); + if (mtlFile) { + const mtlFormData = new FormData(); + mtlFormData.append("image", mtlFile); + mtlFormData.append("subfolder", "3d"); + await api.fetchApi("/upload/image", { + method: "POST", + body: mtlFormData }); - }, "callback") - }; - }); - subItems.push(null, { - content: "Manage", - callback: /* @__PURE__ */ __name(() => manage.show(), "callback") - }); - options.push({ - content: "Node Templates", - submenu: { - options: subItems - } - }); - return options; - }; - } -}); -app.registerExtension({ - name: "Comfy.NoteNode", - registerCustomNodes() { - class NoteNode extends LGraphNode { - static { - __name(this, "NoteNode"); - } - static category; - color = LGraphCanvas.node_colors.yellow.color; - bgcolor = LGraphCanvas.node_colors.yellow.bgcolor; - groupcolor = LGraphCanvas.node_colors.yellow.groupcolor; - isVirtualNode; - collapsable; - title_mode; - constructor(title) { - super(title); - if (!this.properties) { - this.properties = { text: "" }; + } + } catch (mtlError) { + console.warn("Failed to upload MTL file:", mtlError); } - ComfyWidgets.MARKDOWN( - // Should we extends LGraphNode? Yesss - this, - "", - ["", { default: this.properties.text }], - app - ); - this.serialize_widgets = true; - this.isVirtualNode = true; } + } else { + useToastStore().addAlert(resp.status + " - " + resp.statusText); } - LiteGraph.registerNodeType( - "Note", - Object.assign(NoteNode, { - title_mode: LiteGraph.NORMAL_TITLE, - title: "Note", - collapsable: true - }) + } catch (error) { + console.error("Upload error:", error); + useToastStore().addAlert( + error instanceof Error ? error.message : "Upload failed" ); - NoteNode.category = "utils"; } -}); -app.registerExtension({ - name: "Comfy.RerouteNode", - registerCustomNodes(app2) { - class RerouteNode extends LGraphNode { - static { - __name(this, "RerouteNode"); + return uploadPath; +} +__name(uploadFile, "uploadFile"); +class Load3d { + static { + __name(this, "Load3d"); + } + scene; + perspectiveCamera; + orthographicCamera; + activeCamera; + renderer; + controls; + gltfLoader; + objLoader; + mtlLoader; + fbxLoader; + stlLoader; + currentModel = null; + originalModel = null; + node; + animationFrameId = null; + gridHelper; + lights = []; + clock; + normalMaterial; + standardMaterial; + wireframeMaterial; + depthMaterial; + originalMaterials = /* @__PURE__ */ new WeakMap(); + materialMode = "original"; + currentUpDirection = "original"; + originalRotation = null; + constructor(container) { + this.scene = new Scene(); + this.perspectiveCamera = new PerspectiveCamera(75, 1, 0.1, 1e3); + this.perspectiveCamera.position.set(5, 5, 5); + const frustumSize = 10; + this.orthographicCamera = new OrthographicCamera( + -frustumSize / 2, + frustumSize / 2, + frustumSize / 2, + -frustumSize / 2, + 0.1, + 1e3 + ); + this.orthographicCamera.position.set(5, 5, 5); + this.activeCamera = this.perspectiveCamera; + this.perspectiveCamera.lookAt(0, 0, 0); + this.orthographicCamera.lookAt(0, 0, 0); + this.renderer = new WebGLRenderer({ antialias: true }); + this.renderer.setSize(300, 300); + this.renderer.setClearColor(2631720); + const rendererDomElement = this.renderer.domElement; + container.appendChild(rendererDomElement); + this.controls = new OrbitControls( + this.activeCamera, + this.renderer.domElement + ); + this.controls.enableDamping = true; + this.gltfLoader = new GLTFLoader(); + this.objLoader = new OBJLoader(); + this.mtlLoader = new MTLLoader(); + this.fbxLoader = new FBXLoader(); + this.stlLoader = new STLLoader(); + this.clock = new Clock(); + this.setupLights(); + this.gridHelper = new GridHelper(10, 10); + this.gridHelper.position.set(0, 0, 0); + this.scene.add(this.gridHelper); + this.normalMaterial = new MeshNormalMaterial({ + flatShading: false, + side: DoubleSide, + normalScale: new Vector2(1, 1), + transparent: false, + opacity: 1 + }); + this.wireframeMaterial = new MeshBasicMaterial({ + color: 16777215, + wireframe: true, + transparent: false, + opacity: 1 + }); + this.depthMaterial = new MeshDepthMaterial({ + depthPacking: BasicDepthPacking, + side: DoubleSide + }); + this.standardMaterial = this.createSTLMaterial(); + this.animate(); + this.handleResize(); + this.startAnimation(); + } + getCameraState() { + const currentType = this.getCurrentCameraType(); + return { + position: this.activeCamera.position.clone(), + target: this.controls.target.clone(), + zoom: this.activeCamera instanceof OrthographicCamera ? this.activeCamera.zoom : this.activeCamera.zoom, + cameraType: currentType + }; + } + setCameraState(state) { + if (this.activeCamera !== (state.cameraType === "perspective" ? this.perspectiveCamera : this.orthographicCamera)) { + this.toggleCamera(state.cameraType); + } + this.activeCamera.position.copy(state.position); + this.controls.target.copy(state.target); + if (this.activeCamera instanceof OrthographicCamera) { + this.activeCamera.zoom = state.zoom; + this.activeCamera.updateProjectionMatrix(); + } else if (this.activeCamera instanceof PerspectiveCamera) { + this.activeCamera.zoom = state.zoom; + this.activeCamera.updateProjectionMatrix(); + } + this.controls.update(); + } + setUpDirection(direction) { + if (!this.currentModel) return; + if (!this.originalRotation && this.currentModel.rotation) { + this.originalRotation = this.currentModel.rotation.clone(); + } + this.currentUpDirection = direction; + if (this.originalRotation) { + this.currentModel.rotation.copy(this.originalRotation); + } + switch (direction) { + case "original": + break; + case "-x": + this.currentModel.rotation.z = Math.PI / 2; + break; + case "+x": + this.currentModel.rotation.z = -Math.PI / 2; + break; + case "-y": + this.currentModel.rotation.x = Math.PI; + break; + case "+y": + break; + case "-z": + this.currentModel.rotation.x = Math.PI / 2; + break; + case "+z": + this.currentModel.rotation.x = -Math.PI / 2; + break; + } + this.renderer.render(this.scene, this.activeCamera); + } + setMaterialMode(mode) { + this.materialMode = mode; + if (this.currentModel) { + if (mode === "depth") { + this.renderer.outputColorSpace = LinearSRGBColorSpace; + } else { + this.renderer.outputColorSpace = SRGBColorSpace; } - static category; - static defaultVisibility = false; - constructor(title) { - super(title); - if (!this.properties) { - this.properties = {}; - } - this.properties.showOutputText = RerouteNode.defaultVisibility; - this.properties.horizontal = false; - this.addInput("", "*"); - this.addOutput(this.properties.showOutputText ? "*" : "", "*"); - this.onAfterGraphConfigured = function() { - requestAnimationFrame(() => { - this.onConnectionsChange(LiteGraph.INPUT, null, true, null); - }); - }; - this.onConnectionsChange = (type, index, connected, link_info) => { - if (app2.configuringGraph) return; - this.applyOrientation(); - if (connected && type === LiteGraph.OUTPUT) { - const types = new Set( - this.outputs[0].links.map((l) => app2.graph.links[l].type).filter((t2) => t2 !== "*") - ); - if (types.size > 1) { - const linksToDisconnect = []; - for (let i = 0; i < this.outputs[0].links.length - 1; i++) { - const linkId = this.outputs[0].links[i]; - const link = app2.graph.links[linkId]; - linksToDisconnect.push(link); - } - for (const link of linksToDisconnect) { - const node = app2.graph.getNodeById(link.target_id); - node.disconnectInput(link.target_slot); - } - } - } - let currentNode = this; - let updateNodes = []; - let inputType = null; - let inputNode = null; - while (currentNode) { - updateNodes.unshift(currentNode); - const linkId = currentNode.inputs[0].link; - if (linkId !== null) { - const link = app2.graph.links[linkId]; - if (!link) return; - const node = app2.graph.getNodeById(link.origin_id); - const type2 = node.constructor.type; - if (type2 === "Reroute") { - if (node === this) { - currentNode.disconnectInput(link.target_slot); - currentNode = null; - } else { - currentNode = node; - } - } else { - inputNode = currentNode; - inputType = node.outputs[link.origin_slot]?.type ?? null; - break; + this.currentModel.traverse((child) => { + if (child instanceof Mesh) { + switch (mode) { + case "depth": + if (!this.originalMaterials.has(child)) { + this.originalMaterials.set(child, child.material); } - } else { - currentNode = null; - break; - } - } - const nodes = [this]; - let outputType = null; - while (nodes.length) { - currentNode = nodes.pop(); - const outputs = (currentNode.outputs ? currentNode.outputs[0].links : []) || []; - if (outputs.length) { - for (const linkId of outputs) { - const link = app2.graph.links[linkId]; - if (!link) continue; - const node = app2.graph.getNodeById(link.target_id); - const type2 = node.constructor.type; - if (type2 === "Reroute") { - nodes.push(node); - updateNodes.push(node); - } else { - const nodeOutType = node.inputs && node.inputs[link?.target_slot] && node.inputs[link.target_slot].type ? node.inputs[link.target_slot].type : null; - if (inputType && !LiteGraph.isValidConnection(inputType, nodeOutType)) { - node.disconnectInput(link.target_slot); - } else { - outputType = nodeOutType; - } - } + const depthMat = new MeshDepthMaterial({ + depthPacking: BasicDepthPacking, + side: DoubleSide + }); + depthMat.onBeforeCompile = (shader) => { + shader.uniforms.cameraType = { + value: this.activeCamera instanceof OrthographicCamera ? 1 : 0 + }; + shader.fragmentShader = ` + uniform float cameraType; + ${shader.fragmentShader} + `; + shader.fragmentShader = shader.fragmentShader.replace( + /gl_FragColor\s*=\s*vec4\(\s*vec3\(\s*1.0\s*-\s*fragCoordZ\s*\)\s*,\s*opacity\s*\)\s*;/, + ` + float depth = 1.0 - fragCoordZ; + if (cameraType > 0.5) { + depth = pow(depth, 400.0); + } else { + depth = pow(depth, 0.6); + } + gl_FragColor = vec4(vec3(depth), opacity); + ` + ); + }; + depthMat.customProgramCacheKey = () => { + return this.activeCamera instanceof OrthographicCamera ? "ortho" : "persp"; + }; + child.material = depthMat; + break; + case "normal": + if (!this.originalMaterials.has(child)) { + this.originalMaterials.set(child, child.material); } - } else { - } - } - const displayType = inputType || outputType || "*"; - const color = LGraphCanvas.link_type_colors[displayType]; - let widgetConfig; - let targetWidget; - let widgetType; - for (const node of updateNodes) { - node.outputs[0].type = inputType || "*"; - node.__outputType = displayType; - node.outputs[0].name = node.properties.showOutputText ? displayType : ""; - node.size = node.computeSize(); - node.applyOrientation(); - for (const l of node.outputs[0].links || []) { - const link = app2.graph.links[l]; - if (link) { - link.color = color; - if (app2.configuringGraph) continue; - const targetNode = app2.graph.getNodeById(link.target_id); - const targetInput = targetNode.inputs?.[link.target_slot]; - if (targetInput?.widget) { - const config = getWidgetConfig(targetInput); - if (!widgetConfig) { - widgetConfig = config[1] ?? {}; - widgetType = config[0]; - } - if (!targetWidget) { - targetWidget = targetNode.widgets?.find( - (w) => w.name === targetInput.widget.name - ); - } - const merged = mergeIfValid(targetInput, [ - config[0], - widgetConfig - ]); - if (merged.customConfig) { - widgetConfig = merged.customConfig; - } - } + child.material = new MeshNormalMaterial({ + flatShading: false, + side: DoubleSide, + normalScale: new Vector2(1, 1), + transparent: false, + opacity: 1 + }); + child.geometry.computeVertexNormals(); + break; + case "wireframe": + if (!this.originalMaterials.has(child)) { + this.originalMaterials.set(child, child.material); } - } - } - for (const node of updateNodes) { - if (widgetConfig && outputType) { - node.inputs[0].widget = { name: "value" }; - setWidgetConfig( - node.inputs[0], - [widgetType ?? displayType, widgetConfig], - targetWidget - ); - } else { - setWidgetConfig(node.inputs[0], null); - } - } - if (inputNode) { - const link = app2.graph.links[inputNode.inputs[0].link]; - if (link) { - link.color = color; - } - } - }; - this.clone = function() { - const cloned = RerouteNode.prototype.clone.apply(this); - cloned.removeOutput(0); - cloned.addOutput(this.properties.showOutputText ? "*" : "", "*"); - cloned.size = cloned.computeSize(); - return cloned; - }; - this.isVirtualNode = true; - } - getExtraMenuOptions(_, options) { - options.unshift( - { - content: (this.properties.showOutputText ? "Hide" : "Show") + " Type", - callback: /* @__PURE__ */ __name(() => { - this.properties.showOutputText = !this.properties.showOutputText; - if (this.properties.showOutputText) { - this.outputs[0].name = this.__outputType || this.outputs[0].type; + child.material = new MeshBasicMaterial({ + color: 16777215, + wireframe: true, + transparent: false, + opacity: 1 + }); + break; + case "original": + const originalMaterial = this.originalMaterials.get(child); + if (originalMaterial) { + child.material = originalMaterial; } else { - this.outputs[0].name = ""; + child.material = this.standardMaterial; } - this.size = this.computeSize(); - this.applyOrientation(); - app2.graph.setDirtyCanvas(true, true); - }, "callback") - }, - { - content: (RerouteNode.defaultVisibility ? "Hide" : "Show") + " Type By Default", - callback: /* @__PURE__ */ __name(() => { - RerouteNode.setDefaultTextVisibility( - !RerouteNode.defaultVisibility - ); - }, "callback") - }, - { - // naming is inverted with respect to LiteGraphNode.horizontal - // LiteGraphNode.horizontal == true means that - // each slot in the inputs and outputs are laid out horizontally, - // which is the opposite of the visual orientation of the inputs and outputs as a node - content: "Set " + (this.properties.horizontal ? "Horizontal" : "Vertical"), - callback: /* @__PURE__ */ __name(() => { - this.properties.horizontal = !this.properties.horizontal; - this.applyOrientation(); - }, "callback") + break; } - ); - return []; + } + }); + this.renderer.render(this.scene, this.activeCamera); + } + } + setupLights() { + const ambientLight = new AmbientLight(16777215, 0.5); + this.scene.add(ambientLight); + this.lights.push(ambientLight); + const mainLight = new DirectionalLight(16777215, 0.8); + mainLight.position.set(0, 10, 10); + this.scene.add(mainLight); + this.lights.push(mainLight); + const backLight = new DirectionalLight(16777215, 0.5); + backLight.position.set(0, 10, -10); + this.scene.add(backLight); + this.lights.push(backLight); + const leftFillLight = new DirectionalLight(16777215, 0.3); + leftFillLight.position.set(-10, 0, 0); + this.scene.add(leftFillLight); + this.lights.push(leftFillLight); + const rightFillLight = new DirectionalLight(16777215, 0.3); + rightFillLight.position.set(10, 0, 0); + this.scene.add(rightFillLight); + this.lights.push(rightFillLight); + const bottomLight = new DirectionalLight(16777215, 0.2); + bottomLight.position.set(0, -10, 0); + this.scene.add(bottomLight); + this.lights.push(bottomLight); + } + toggleCamera(cameraType) { + const oldCamera = this.activeCamera; + const position = oldCamera.position.clone(); + const rotation = oldCamera.rotation.clone(); + const target = this.controls.target.clone(); + if (!cameraType) { + this.activeCamera = oldCamera === this.perspectiveCamera ? this.orthographicCamera : this.perspectiveCamera; + } else { + this.activeCamera = cameraType === "perspective" ? this.perspectiveCamera : this.orthographicCamera; + if (oldCamera === this.activeCamera) { + return; } - applyOrientation() { - this.horizontal = this.properties.horizontal; - if (this.horizontal) { - this.inputs[0].pos = [this.size[0] / 2, 0]; + } + this.activeCamera.position.copy(position); + this.activeCamera.rotation.copy(rotation); + if (this.materialMode === "depth" && oldCamera !== this.activeCamera) { + this.setMaterialMode("depth"); + } + this.controls.object = this.activeCamera; + this.controls.target.copy(target); + this.controls.update(); + this.handleResize(); + } + getCurrentCameraType() { + return this.activeCamera === this.perspectiveCamera ? "perspective" : "orthographic"; + } + toggleGrid(showGrid) { + if (this.gridHelper) { + this.gridHelper.visible = showGrid; + } + } + setLightIntensity(intensity) { + this.lights.forEach((light) => { + if (light instanceof DirectionalLight) { + if (light === this.lights[1]) { + light.intensity = intensity * 0.8; + } else if (light === this.lights[2]) { + light.intensity = intensity * 0.5; + } else if (light === this.lights[5]) { + light.intensity = intensity * 0.2; } else { - delete this.inputs[0].pos; + light.intensity = intensity * 0.3; } - app2.graph.setDirtyCanvas(true, true); + } else if (light instanceof AmbientLight) { + light.intensity = intensity * 0.5; } - computeSize() { - return [ - this.properties.showOutputText && this.outputs && this.outputs.length ? Math.max( - 75, - LiteGraph.NODE_TEXT_SIZE * this.outputs[0].name.length * 0.6 + 40 - ) : 75, - 26 - ]; + }); + } + startAnimation() { + const animate = /* @__PURE__ */ __name(() => { + this.animationFrameId = requestAnimationFrame(animate); + this.controls.update(); + this.renderer.render(this.scene, this.activeCamera); + }, "animate"); + animate(); + } + clearModel() { + const objectsToRemove = []; + this.scene.traverse((object) => { + const isEnvironmentObject = object === this.gridHelper || this.lights.includes(object) || object === this.perspectiveCamera || object === this.orthographicCamera; + if (!isEnvironmentObject) { + objectsToRemove.push(object); } - static setDefaultTextVisibility(visible) { - RerouteNode.defaultVisibility = visible; - if (visible) { - localStorage["Comfy.RerouteNode.DefaultVisibility"] = "true"; + }); + objectsToRemove.forEach((obj) => { + if (obj.parent && obj.parent !== this.scene) { + obj.parent.remove(obj); + } else { + this.scene.remove(obj); + } + if (obj instanceof Mesh) { + obj.geometry?.dispose(); + if (Array.isArray(obj.material)) { + obj.material.forEach((material) => material.dispose()); } else { - delete localStorage["Comfy.RerouteNode.DefaultVisibility"]; + obj.material?.dispose(); } } - } - RerouteNode.setDefaultTextVisibility( - !!localStorage["Comfy.RerouteNode.DefaultVisibility"] + }); + this.resetScene(); + } + resetScene() { + this.currentModel = null; + this.originalRotation = null; + const defaultDistance = 10; + this.perspectiveCamera.position.set( + defaultDistance, + defaultDistance, + defaultDistance ); - LiteGraph.registerNodeType( - "Reroute", - Object.assign(RerouteNode, { - title_mode: LiteGraph.NO_TITLE, - title: "Reroute", - collapsable: false - }) + this.orthographicCamera.position.set( + defaultDistance, + defaultDistance, + defaultDistance ); - RerouteNode.category = "utils"; + this.perspectiveCamera.lookAt(0, 0, 0); + this.orthographicCamera.lookAt(0, 0, 0); + const frustumSize = 10; + const aspect2 = this.renderer.domElement.width / this.renderer.domElement.height; + this.orthographicCamera.left = -frustumSize * aspect2 / 2; + this.orthographicCamera.right = frustumSize * aspect2 / 2; + this.orthographicCamera.top = frustumSize / 2; + this.orthographicCamera.bottom = -frustumSize / 2; + this.perspectiveCamera.updateProjectionMatrix(); + this.orthographicCamera.updateProjectionMatrix(); + this.controls.target.set(0, 0, 0); + this.controls.update(); + this.renderer.render(this.scene, this.activeCamera); + this.materialMode = "original"; + this.originalMaterials = /* @__PURE__ */ new WeakMap(); + this.renderer.outputColorSpace = SRGBColorSpace; } -}); -app.registerExtension({ - name: "Comfy.SaveImageExtraOutput", - async beforeRegisterNodeDef(nodeType, nodeData, app2) { - if (nodeData.name === "SaveImage" || nodeData.name === "SaveAnimatedWEBP") { - const onNodeCreated = nodeType.prototype.onNodeCreated; - nodeType.prototype.onNodeCreated = function() { - const r = onNodeCreated ? onNodeCreated.apply(this, arguments) : void 0; - const widget = this.widgets.find((w) => w.name === "filename_prefix"); - widget.serializeValue = () => { - return applyTextReplacements(app2, widget.value); - }; - return r; - }; - } else { - const onNodeCreated = nodeType.prototype.onNodeCreated; - nodeType.prototype.onNodeCreated = function() { - const r = onNodeCreated ? onNodeCreated.apply(this, arguments) : void 0; - if (!this.properties || !("Node name for S&R" in this.properties)) { - this.addProperty("Node name for S&R", this.constructor.type, "string"); + remove() { + if (this.animationFrameId !== null) { + cancelAnimationFrame(this.animationFrameId); + } + this.controls.dispose(); + this.renderer.dispose(); + this.renderer.domElement.remove(); + this.scene.clear(); + } + async loadModelInternal(url, fileExtension) { + let model = null; + switch (fileExtension) { + case "stl": + const geometry = await this.stlLoader.loadAsync(url); + this.originalModel = geometry; + geometry.computeVertexNormals(); + const mesh = new Mesh(geometry, this.standardMaterial); + const group = new Group(); + group.add(mesh); + model = group; + break; + case "fbx": + const fbxModel = await this.fbxLoader.loadAsync(url); + this.originalModel = fbxModel; + model = fbxModel; + fbxModel.traverse((child) => { + if (child instanceof Mesh) { + this.originalMaterials.set(child, child.material); + } + }); + break; + case "obj": + if (this.materialMode === "original") { + const mtlUrl = url.replace(/\.obj([^.]*$)/, ".mtl$1"); + try { + const materials = await this.mtlLoader.loadAsync(mtlUrl); + materials.preload(); + this.objLoader.setMaterials(materials); + } catch (e) { + console.log( + "No MTL file found or error loading it, continuing without materials" + ); + } } - return r; - }; + model = await this.objLoader.loadAsync(url); + model.traverse((child) => { + if (child instanceof Mesh) { + this.originalMaterials.set(child, child.material); + } + }); + break; + case "gltf": + case "glb": + const gltf = await this.gltfLoader.loadAsync(url); + this.originalModel = gltf; + model = gltf.scene; + gltf.scene.traverse((child) => { + if (child instanceof Mesh) { + child.geometry.computeVertexNormals(); + this.originalMaterials.set(child, child.material); + } + }); + break; + } + return model; + } + async loadModel(url, originalFileName) { + try { + this.clearModel(); + let fileExtension; + if (originalFileName) { + fileExtension = originalFileName.split(".").pop()?.toLowerCase(); + } else { + const filename = new URLSearchParams(url.split("?")[1]).get("filename"); + fileExtension = filename?.split(".").pop()?.toLowerCase(); + } + if (!fileExtension) { + useToastStore().addAlert("Could not determine file type"); + return; + } + let model = await this.loadModelInternal(url, fileExtension); + if (model) { + this.currentModel = model; + await this.setupModel(model); + } + } catch (error) { + console.error("Error loading model:", error); } } -}); -let touchZooming; -let touchCount = 0; -app.registerExtension({ - name: "Comfy.SimpleTouchSupport", - setup() { - let touchDist; - let touchTime; - let lastTouch; - let lastScale; - function getMultiTouchPos(e) { - return Math.hypot( - e.touches[0].clientX - e.touches[1].clientX, - e.touches[0].clientY - e.touches[1].clientY - ); + async setupModel(model) { + const box = new Box3().setFromObject(model); + const size = box.getSize(new Vector3()); + const center = box.getCenter(new Vector3()); + const maxDim = Math.max(size.x, size.y, size.z); + const targetSize = 5; + const scale = targetSize / maxDim; + model.scale.multiplyScalar(scale); + box.setFromObject(model); + box.getCenter(center); + box.getSize(size); + model.position.set(-center.x, -box.min.y, -center.z); + this.scene.add(model); + if (this.materialMode !== "original") { + this.setMaterialMode(this.materialMode); } - __name(getMultiTouchPos, "getMultiTouchPos"); - function getMultiTouchCenter(e) { - return { - clientX: (e.touches[0].clientX + e.touches[1].clientX) / 2, - clientY: (e.touches[0].clientY + e.touches[1].clientY) / 2 - }; + if (this.currentUpDirection !== "original") { + this.setUpDirection(this.currentUpDirection); } - __name(getMultiTouchCenter, "getMultiTouchCenter"); - app.canvasEl.parentElement.addEventListener( - "touchstart", - (e) => { - touchCount++; - lastTouch = null; - lastScale = null; - if (e.touches?.length === 1) { - touchTime = /* @__PURE__ */ new Date(); - lastTouch = e.touches[0]; + await this.setupCamera(size); + } + async setupCamera(size) { + const distance = Math.max(size.x, size.z) * 2; + const height = size.y * 2; + this.perspectiveCamera.position.set(distance, height, distance); + this.orthographicCamera.position.set(distance, height, distance); + if (this.activeCamera === this.perspectiveCamera) { + this.perspectiveCamera.lookAt(0, size.y / 2, 0); + this.perspectiveCamera.updateProjectionMatrix(); + } else { + const frustumSize = Math.max(size.x, size.y, size.z) * 2; + const aspect2 = this.renderer.domElement.width / this.renderer.domElement.height; + this.orthographicCamera.left = -frustumSize * aspect2 / 2; + this.orthographicCamera.right = frustumSize * aspect2 / 2; + this.orthographicCamera.top = frustumSize / 2; + this.orthographicCamera.bottom = -frustumSize / 2; + this.orthographicCamera.lookAt(0, size.y / 2, 0); + this.orthographicCamera.updateProjectionMatrix(); + } + this.controls.target.set(0, size.y / 2, 0); + this.controls.update(); + this.renderer.outputColorSpace = SRGBColorSpace; + this.renderer.toneMapping = ACESFilmicToneMapping; + this.renderer.toneMappingExposure = 1; + this.handleResize(); + } + handleResize() { + const parentElement = this.renderer?.domElement?.parentElement; + if (!parentElement) { + console.warn("Parent element not found"); + return; + } + const width = parentElement?.clientWidth; + const height = parentElement?.clientHeight; + if (this.activeCamera === this.perspectiveCamera) { + this.perspectiveCamera.aspect = width / height; + this.perspectiveCamera.updateProjectionMatrix(); + } else { + const frustumSize = 10; + const aspect2 = width / height; + this.orthographicCamera.left = -frustumSize * aspect2 / 2; + this.orthographicCamera.right = frustumSize * aspect2 / 2; + this.orthographicCamera.top = frustumSize / 2; + this.orthographicCamera.bottom = -frustumSize / 2; + this.orthographicCamera.updateProjectionMatrix(); + } + this.renderer.setSize(width, height); + } + animate = /* @__PURE__ */ __name(() => { + requestAnimationFrame(this.animate); + this.controls.update(); + this.renderer.render(this.scene, this.activeCamera); + }, "animate"); + captureScene(width, height) { + return new Promise((resolve, reject) => { + try { + const originalWidth = this.renderer.domElement.width; + const originalHeight = this.renderer.domElement.height; + this.renderer.setSize(width, height); + if (this.activeCamera === this.perspectiveCamera) { + this.perspectiveCamera.aspect = width / height; + this.perspectiveCamera.updateProjectionMatrix(); } else { - touchTime = null; - if (e.touches?.length === 2) { - lastScale = app.canvas.ds.scale; - lastTouch = getMultiTouchCenter(e); - touchDist = getMultiTouchPos(e); - app.canvas.pointer.isDown = false; - } - } - }, - true - ); - app.canvasEl.parentElement.addEventListener("touchend", (e) => { - touchCount--; - if (e.touches?.length !== 1) touchZooming = false; - if (touchTime && !e.touches?.length) { - if ((/* @__PURE__ */ new Date()).getTime() - touchTime > 600) { - if (e.target === app.canvasEl) { - app.canvasEl.dispatchEvent( - new PointerEvent("pointerdown", { - button: 2, - clientX: e.changedTouches[0].clientX, - clientY: e.changedTouches[0].clientY - }) - ); - e.preventDefault(); - } + const frustumSize = 10; + const aspect2 = width / height; + this.orthographicCamera.left = -frustumSize * aspect2 / 2; + this.orthographicCamera.right = frustumSize * aspect2 / 2; + this.orthographicCamera.top = frustumSize / 2; + this.orthographicCamera.bottom = -frustumSize / 2; + this.orthographicCamera.updateProjectionMatrix(); } - touchTime = null; + this.renderer.render(this.scene, this.activeCamera); + const imageData = this.renderer.domElement.toDataURL("image/png"); + this.renderer.setSize(originalWidth, originalHeight); + this.handleResize(); + resolve(imageData); + } catch (error) { + reject(error); } }); - app.canvasEl.parentElement.addEventListener( - "touchmove", - (e) => { - touchTime = null; - if (e.touches?.length === 2 && lastTouch && !e.ctrlKey && !e.shiftKey) { - e.preventDefault(); - app.canvas.pointer.isDown = false; - touchZooming = true; - LiteGraph.closeAllContextMenus(window); - app.canvas.search_box?.close(); - const newTouchDist = getMultiTouchPos(e); - const center = getMultiTouchCenter(e); - let scale = lastScale * newTouchDist / touchDist; - const newX = (center.clientX - lastTouch.clientX) / scale; - const newY = (center.clientY - lastTouch.clientY) / scale; - if (scale < app.canvas.ds.min_scale) { - scale = app.canvas.ds.min_scale; - } else if (scale > app.canvas.ds.max_scale) { - scale = app.canvas.ds.max_scale; - } - const oldScale = app.canvas.ds.scale; - app.canvas.ds.scale = scale; - if (Math.abs(app.canvas.ds.scale - 1) < 0.01) { - app.canvas.ds.scale = 1; - } - const newScale = app.canvas.ds.scale; - const convertScaleToOffset = /* @__PURE__ */ __name((scale2) => [ - center.clientX / scale2 - app.canvas.ds.offset[0], - center.clientY / scale2 - app.canvas.ds.offset[1] - ], "convertScaleToOffset"); - var oldCenter = convertScaleToOffset(oldScale); - var newCenter = convertScaleToOffset(newScale); - app.canvas.ds.offset[0] += newX + newCenter[0] - oldCenter[0]; - app.canvas.ds.offset[1] += newY + newCenter[1] - oldCenter[1]; - lastTouch.clientX = center.clientX; - lastTouch.clientY = center.clientY; - app.canvas.setDirty(true, true); - } - }, - true - ); } -}); -const processMouseDown = LGraphCanvas.prototype.processMouseDown; -LGraphCanvas.prototype.processMouseDown = function(e) { - if (touchZooming || touchCount) { - return; + createSTLMaterial() { + return new MeshStandardMaterial({ + color: 8421504, + metalness: 0.1, + roughness: 0.8, + flatShading: false, + side: DoubleSide + }); } - app.canvas.pointer.isDown = false; - return processMouseDown.apply(this, arguments); -}; -const processMouseMove = LGraphCanvas.prototype.processMouseMove; -LGraphCanvas.prototype.processMouseMove = function(e) { - if (touchZooming || touchCount > 1) { - return; + setViewPosition(position) { + if (!this.currentModel) { + return; + } + const box = new Box3(); + let center = new Vector3(); + let size = new Vector3(); + if (this.currentModel) { + box.setFromObject(this.currentModel); + box.getCenter(center); + box.getSize(size); + } + const maxDim = Math.max(size.x, size.y, size.z); + const distance = maxDim * 2; + switch (position) { + case "front": + this.activeCamera.position.set(0, 0, distance); + break; + case "top": + this.activeCamera.position.set(0, distance, 0); + break; + case "right": + this.activeCamera.position.set(distance, 0, 0); + break; + case "isometric": + this.activeCamera.position.set(distance, distance, distance); + break; + } + this.activeCamera.lookAt(center); + this.controls.target.copy(center); + this.controls.update(); } - return processMouseMove.apply(this, arguments); -}; -app.registerExtension({ - name: "Comfy.SlotDefaults", - suggestionsNumber: null, - init() { - LiteGraph.search_filter_enabled = true; - LiteGraph.middle_click_slot_add_default_node = true; - this.suggestionsNumber = app.ui.settings.addSetting({ - id: "Comfy.NodeSuggestions.number", - category: ["Comfy", "Node Search Box", "NodeSuggestions"], - name: "Number of nodes suggestions", - tooltip: "Only for litegraph searchbox/context menu", - type: "slider", - attrs: { - min: 1, - max: 100, - step: 1 - }, - defaultValue: 5, - onChange: /* @__PURE__ */ __name((newVal, oldVal) => { - this.setDefaults(newVal); - }, "onChange") - }); - }, - slot_types_default_out: {}, - slot_types_default_in: {}, - async beforeRegisterNodeDef(nodeType, nodeData, app2) { - var nodeId = nodeData.name; - const inputs = nodeData["input"]?.["required"]; - for (const inputKey in inputs) { - var input = inputs[inputKey]; - if (typeof input[0] !== "string") continue; - var type = input[0]; - if (type in ComfyWidgets) { - var customProperties = input[1]; - if (!customProperties?.forceInput) continue; - } - if (!(type in this.slot_types_default_out)) { - this.slot_types_default_out[type] = ["Reroute"]; - } - if (this.slot_types_default_out[type].includes(nodeId)) continue; - this.slot_types_default_out[type].push(nodeId); - const lowerType = type.toLocaleLowerCase(); - if (!(lowerType in LiteGraph.registered_slot_in_types)) { - LiteGraph.registered_slot_in_types[lowerType] = { nodes: [] }; - } - LiteGraph.registered_slot_in_types[lowerType].nodes.push( - // @ts-expect-error ComfyNode - nodeType.comfyClass - ); + setBackgroundColor(color) { + this.renderer.setClearColor(new Color(color)); + this.renderer.render(this.scene, this.activeCamera); + } +} +class Load3dAnimation extends Load3d { + static { + __name(this, "Load3dAnimation"); + } + currentAnimation = null; + animationActions = []; + animationClips = []; + selectedAnimationIndex = 0; + isAnimationPlaying = false; + animationSpeed = 1; + constructor(container) { + super(container); + } + async setupModel(model) { + await super.setupModel(model); + if (this.currentAnimation) { + this.currentAnimation.stopAllAction(); + this.animationActions = []; } - var outputs = nodeData["output"] ?? []; - for (const el of outputs) { - const type2 = el; - if (!(type2 in this.slot_types_default_in)) { - this.slot_types_default_in[type2] = ["Reroute"]; - } - this.slot_types_default_in[type2].push(nodeId); - if (!(type2 in LiteGraph.registered_slot_out_types)) { - LiteGraph.registered_slot_out_types[type2] = { nodes: [] }; + let animations = []; + if (model.animations?.length > 0) { + animations = model.animations; + } else if (this.originalModel && "animations" in this.originalModel) { + animations = this.originalModel.animations; + } + if (animations.length > 0) { + this.animationClips = animations; + if (model.type === "Scene") { + this.currentAnimation = new AnimationMixer(model); + } else { + this.currentAnimation = new AnimationMixer(this.currentModel); } - LiteGraph.registered_slot_out_types[type2].nodes.push(nodeType.comfyClass); - if (!LiteGraph.slot_types_out.includes(type2)) { - LiteGraph.slot_types_out.push(type2); + if (this.animationClips.length > 0) { + this.updateSelectedAnimation(0); } } - var maxNum = this.suggestionsNumber.value; - this.setDefaults(maxNum); - }, - setDefaults(maxNum) { - LiteGraph.slot_types_default_out = {}; - LiteGraph.slot_types_default_in = {}; - for (const type in this.slot_types_default_out) { - LiteGraph.slot_types_default_out[type] = this.slot_types_default_out[type].slice(0, maxNum); + } + setAnimationSpeed(speed) { + this.animationSpeed = speed; + this.animationActions.forEach((action) => { + action.setEffectiveTimeScale(speed); + }); + } + updateSelectedAnimation(index) { + if (!this.currentAnimation || !this.animationClips || index >= this.animationClips.length) { + console.warn("Invalid animation update request"); + return; } - for (const type in this.slot_types_default_in) { - LiteGraph.slot_types_default_in[type] = this.slot_types_default_in[type].slice(0, maxNum); + this.animationActions.forEach((action2) => { + action2.stop(); + }); + this.currentAnimation.stopAllAction(); + this.animationActions = []; + this.selectedAnimationIndex = index; + const clip = this.animationClips[index]; + const action = this.currentAnimation.clipAction(clip); + action.setEffectiveTimeScale(this.animationSpeed); + action.reset(); + action.clampWhenFinished = false; + action.loop = LoopRepeat; + if (this.isAnimationPlaying) { + action.play(); + } else { + action.play(); + action.paused = true; } + this.animationActions = [action]; } -}); + clearModel() { + if (this.currentAnimation) { + this.animationActions.forEach((action) => { + action.stop(); + }); + this.currentAnimation = null; + } + this.animationActions = []; + this.animationClips = []; + this.selectedAnimationIndex = 0; + this.isAnimationPlaying = false; + this.animationSpeed = 1; + super.clearModel(); + } + getAnimationNames() { + return this.animationClips.map((clip, index) => { + return clip.name || `Animation ${index + 1}`; + }); + } + toggleAnimation(play) { + if (!this.currentAnimation || this.animationActions.length === 0) { + console.warn("No animation to toggle"); + return; + } + this.isAnimationPlaying = play ?? !this.isAnimationPlaying; + this.animationActions.forEach((action) => { + if (this.isAnimationPlaying) { + action.paused = false; + if (action.time === 0 || action.time === action.getClip().duration) { + action.reset(); + } + } else { + action.paused = true; + } + }); + } + animate = /* @__PURE__ */ __name(() => { + requestAnimationFrame(this.animate); + if (this.currentAnimation && this.isAnimationPlaying) { + const delta = this.clock.getDelta(); + this.currentAnimation.update(delta); + } + this.controls.update(); + this.renderer.render(this.scene, this.activeCamera); + }, "animate"); +} function splitFilePath(path) { const folder_separator = path.lastIndexOf("/"); if (folder_separator === -1) { @@ -52916,274 +52609,563 @@ function getResourceURL(subfolder, filename, type = "input") { return `/view?${params}`; } __name(getResourceURL, "getResourceURL"); -async function uploadFile(audioWidget, audioUIWidget, file2, updateNode, pasted = false) { - try { - const body = new FormData(); - body.append("image", file2); - if (pasted) body.append("subfolder", "pasted"); - const resp = await api.fetchApi("/upload/image", { - method: "POST", - body - }); - if (resp.status === 200) { - const data = await resp.json(); - let path = data.name; - if (data.subfolder) path = data.subfolder + "/" + path; - if (!audioWidget.options.values.includes(path)) { - audioWidget.options.values.push(path); +const load3dCSSCLASS = `display: flex; + flex-direction: column; + background: transparent; + flex: 1; + position: relative; + overflow: hidden;`; +const load3dCanvasCSSCLASS = `display: flex; + width: 100% !important; + height: 100% !important;`; +const containerToLoad3D = /* @__PURE__ */ new Map(); +function configureLoad3D(load3d, loadFolder, modelWidget, showGrid, cameraType, view, material, bgColor, lightIntensity, upDirection, cameraState, postModelUpdateFunc) { + const createModelUpdateHandler = /* @__PURE__ */ __name(() => { + let isFirstLoad = true; + return async (value) => { + if (!value) return; + const filename = value; + const modelUrl = api.apiURL( + getResourceURL(...splitFilePath(filename), loadFolder) + ); + await load3d.loadModel(modelUrl, filename); + load3d.setMaterialMode( + material.value + ); + load3d.setUpDirection( + upDirection.value + ); + if (postModelUpdateFunc) { + postModelUpdateFunc(load3d); } - if (updateNode) { - audioUIWidget.element.src = api.apiURL( - getResourceURL(...splitFilePath(path)) - ); - audioWidget.value = path; + if (isFirstLoad && cameraState && typeof cameraState === "object") { + try { + load3d.setCameraState(cameraState); + } catch (error) { + console.warn("Failed to restore camera state:", error); + } + isFirstLoad = false; } - } else { - useToastStore().addAlert(resp.status + " - " + resp.statusText); - } - } catch (error) { - useToastStore().addAlert(error); + }; + }, "createModelUpdateHandler"); + const onModelWidgetUpdate = createModelUpdateHandler(); + if (modelWidget.value) { + onModelWidgetUpdate(modelWidget.value); } + modelWidget.callback = onModelWidgetUpdate; + load3d.toggleGrid(showGrid.value); + showGrid.callback = (value) => { + load3d.toggleGrid(value); + }; + load3d.toggleCamera(cameraType.value); + cameraType.callback = (value) => { + load3d.toggleCamera(value); + }; + view.callback = (value) => { + load3d.setViewPosition(value); + }; + material.callback = (value) => { + load3d.setMaterialMode(value); + }; + load3d.setMaterialMode(material.value); + load3d.setBackgroundColor(bgColor.value); + bgColor.callback = (value) => { + load3d.setBackgroundColor(value); + }; + load3d.setLightIntensity(lightIntensity.value); + lightIntensity.callback = (value) => { + load3d.setLightIntensity(value); + }; + upDirection.callback = (value) => { + load3d.setUpDirection(value); + }; + load3d.setUpDirection( + upDirection.value + ); } -__name(uploadFile, "uploadFile"); +__name(configureLoad3D, "configureLoad3D"); app.registerExtension({ - name: "Comfy.AudioWidget", - async beforeRegisterNodeDef(nodeType, nodeData) { - if ( - // @ts-expect-error ComfyNode - ["LoadAudio", "SaveAudio", "PreviewAudio"].includes(nodeType.comfyClass) - ) { - nodeData.input.required.audioUI = ["AUDIO_UI"]; - } - }, - getCustomWidgets() { + name: "Comfy.Load3D", + getCustomWidgets(app2) { return { - AUDIO_UI(node, inputName) { - const audio = document.createElement("audio"); - audio.controls = true; - audio.classList.add("comfy-audio"); - audio.setAttribute("name", "media"); - const audioUIWidget = node.addDOMWidget( - inputName, - /* name=*/ - "audioUI", - audio, - { - serialize: false + LOAD_3D(node, inputName) { + let load3dNode = app2.graph._nodes.filter((wi) => wi.type == "Load3D"); + node.addProperty("Camera Info", ""); + const container = document.createElement("div"); + container.id = `comfy-load-3d-${load3dNode.length}`; + container.classList.add("comfy-load-3d"); + const load3d = new Load3d(container); + containerToLoad3D.set(container.id, load3d); + node.onResize = function() { + if (load3d) { + load3d.handleResize(); } - ); - const isOutputNode = node.constructor.nodeData.output_node; - if (isOutputNode) { - audioUIWidget.element.classList.add("empty-audio-widget"); - const onExecuted = node.onExecuted; - node.onExecuted = function(message) { - onExecuted?.apply(this, arguments); - const audios = message.audio; - if (!audios) return; - const audio2 = audios[0]; - audioUIWidget.element.src = api.apiURL( - getResourceURL(audio2.subfolder, audio2.filename, audio2.type) + }; + const origOnRemoved = node.onRemoved; + node.onRemoved = function() { + if (load3d) { + load3d.remove(); + } + containerToLoad3D.delete(container.id); + origOnRemoved?.apply(this, []); + }; + node.onDrawBackground = function() { + load3d.renderer.domElement.hidden = this.flags.collapsed ?? false; + }; + const fileInput = document.createElement("input"); + fileInput.type = "file"; + fileInput.accept = ".gltf,.glb,.obj,.mtl,.fbx,.stl"; + fileInput.style.display = "none"; + fileInput.onchange = async () => { + if (fileInput.files?.length) { + const modelWidget = node.widgets?.find( + (w) => w.name === "model_file" ); - audioUIWidget.element.classList.remove("empty-audio-widget"); - }; - } - return { widget: audioUIWidget }; + const uploadPath = await uploadFile( + load3d, + fileInput.files[0], + fileInput + ).catch((error) => { + console.error("File upload failed:", error); + useToastStore().addAlert("File upload failed"); + }); + if (uploadPath && modelWidget) { + if (!modelWidget.options?.values?.includes(uploadPath)) { + modelWidget.options?.values?.push(uploadPath); + } + modelWidget.value = uploadPath; + } + } + }; + node.addWidget("button", "upload 3d model", "upload3dmodel", () => { + fileInput.click(); + }); + node.addWidget("button", "clear", "clear", () => { + load3d.clearModel(); + const modelWidget = node.widgets?.find( + (w) => w.name === "model_file" + ); + if (modelWidget) { + modelWidget.value = ""; + } + }); + return { + widget: node.addDOMWidget(inputName, "LOAD_3D", container) + }; } }; }, - onNodeOutputsUpdated(nodeOutputs) { - for (const [nodeId, output] of Object.entries(nodeOutputs)) { - const node = app.graph.getNodeById(nodeId); - if ("audio" in output) { - const audioUIWidget = node.widgets.find( - (w) => w.name === "audioUI" - ); - const audio = output.audio[0]; - audioUIWidget.element.src = api.apiURL( - getResourceURL(audio.subfolder, audio.filename, audio.type) - ); - audioUIWidget.element.classList.remove("empty-audio-widget"); + init() { + const style = document.createElement("style"); + style.innerText = ` + .comfy-load-3d { + ${load3dCSSCLASS} + } + + .comfy-load-3d canvas { + ${load3dCanvasCSSCLASS} + } + `; + document.head.appendChild(style); + }, + async nodeCreated(node) { + if (node.constructor.comfyClass !== "Load3D") return; + const [oldWidth, oldHeight] = node.size; + node.setSize([Math.max(oldWidth, 300), Math.max(oldHeight, 600)]); + await nextTick(); + const sceneWidget = node.widgets.find((w2) => w2.name === "image"); + const container = sceneWidget.element; + const load3d = containerToLoad3D.get(container.id); + const modelWidget = node.widgets.find( + (w2) => w2.name === "model_file" + ); + const showGrid = node.widgets.find((w2) => w2.name === "show_grid"); + const cameraType = node.widgets.find( + (w2) => w2.name === "camera_type" + ); + const view = node.widgets.find((w2) => w2.name === "view"); + const material = node.widgets.find((w2) => w2.name === "material"); + const bgColor = node.widgets.find((w2) => w2.name === "bg_color"); + const lightIntensity = node.widgets.find( + (w2) => w2.name === "light_intensity" + ); + const upDirection = node.widgets.find( + (w2) => w2.name === "up_direction" + ); + let cameraState; + try { + const cameraInfo = node.properties["Camera Info"]; + if (cameraInfo && typeof cameraInfo === "string" && cameraInfo.trim() !== "") { + cameraState = JSON.parse(cameraInfo); } + } catch (error) { + console.warn("Failed to parse camera state:", error); + cameraState = void 0; } + configureLoad3D( + load3d, + "input", + modelWidget, + showGrid, + cameraType, + view, + material, + bgColor, + lightIntensity, + upDirection, + cameraState + ); + const w = node.widgets.find((w2) => w2.name === "width"); + const h = node.widgets.find((w2) => w2.name === "height"); + sceneWidget.serializeValue = async () => { + node.properties["Camera Info"] = JSON.stringify(load3d.getCameraState()); + const imageData = await load3d.captureScene(w.value, h.value); + const blob = await fetch(imageData).then((r) => r.blob()); + const name = `scene_${Date.now()}.png`; + const file2 = new File([blob], name); + const body = new FormData(); + body.append("image", file2); + body.append("subfolder", "threed"); + body.append("type", "temp"); + const resp = await api.fetchApi("/upload/image", { + method: "POST", + body + }); + if (resp.status !== 200) { + const err2 = `Error uploading scene capture: ${resp.status} - ${resp.statusText}`; + useToastStore().addAlert(err2); + throw new Error(err2); + } + const data = await resp.json(); + return `threed/${data.name} [temp]`; + }; } }); app.registerExtension({ - name: "Comfy.UploadAudio", - async beforeRegisterNodeDef(nodeType, nodeData) { - if (nodeData?.input?.required?.audio?.[1]?.audio_upload === true) { - nodeData.input.required.upload = ["AUDIOUPLOAD"]; - } - }, - getCustomWidgets() { + name: "Comfy.Load3DAnimation", + getCustomWidgets(app2) { return { - AUDIOUPLOAD(node, inputName) { - const audioWidget = node.widgets.find( - (w) => w.name === "audio" - ); - const audioUIWidget = node.widgets.find( - (w) => w.name === "audioUI" + LOAD_3D_ANIMATION(node, inputName) { + let load3dNode = app2.graph._nodes.filter( + (wi) => wi.type == "Load3DAnimation" ); - const onAudioWidgetUpdate = /* @__PURE__ */ __name(() => { - audioUIWidget.element.src = api.apiURL( - getResourceURL(...splitFilePath(audioWidget.value)) - ); - }, "onAudioWidgetUpdate"); - if (audioWidget.value) { - onAudioWidgetUpdate(); - } - audioWidget.callback = onAudioWidgetUpdate; - const onGraphConfigured = node.onGraphConfigured; - node.onGraphConfigured = function() { - onGraphConfigured?.apply(this, arguments); - if (audioWidget.value) { - onAudioWidgetUpdate(); + node.addProperty("Camera Info", ""); + const container = document.createElement("div"); + container.id = `comfy-load-3d-animation-${load3dNode.length}`; + container.classList.add("comfy-load-3d-animation"); + const load3d = new Load3dAnimation(container); + containerToLoad3D.set(container.id, load3d); + node.onResize = function() { + if (load3d) { + load3d.handleResize(); + } + }; + const origOnRemoved = node.onRemoved; + node.onRemoved = function() { + if (load3d) { + load3d.remove(); } + containerToLoad3D.delete(container.id); + origOnRemoved?.apply(this, []); + }; + node.onDrawBackground = function() { + load3d.renderer.domElement.hidden = this.flags.collapsed ?? false; }; const fileInput = document.createElement("input"); fileInput.type = "file"; - fileInput.accept = "audio/*"; + fileInput.accept = ".fbx,glb,gltf"; fileInput.style.display = "none"; - fileInput.onchange = () => { - if (fileInput.files.length) { - uploadFile(audioWidget, audioUIWidget, fileInput.files[0], true); + fileInput.onchange = async () => { + if (fileInput.files?.length) { + const modelWidget = node.widgets?.find( + (w) => w.name === "model_file" + ); + const uploadPath = await uploadFile( + load3d, + fileInput.files[0], + fileInput + ).catch((error) => { + console.error("File upload failed:", error); + useToastStore().addAlert("File upload failed"); + }); + if (uploadPath && modelWidget) { + if (!modelWidget.options?.values?.includes(uploadPath)) { + modelWidget.options?.values?.push(uploadPath); + } + modelWidget.value = uploadPath; + } } }; - const uploadWidget = node.addWidget( + node.addWidget("button", "upload 3d model", "upload3dmodel", () => { + fileInput.click(); + }); + node.addWidget("button", "clear", "clear", () => { + load3d.clearModel(); + const modelWidget = node.widgets?.find( + (w) => w.name === "model_file" + ); + if (modelWidget) { + modelWidget.value = ""; + } + const animationSelect2 = node.widgets?.find( + (w) => w.name === "animation" + ); + if (animationSelect2) { + animationSelect2.options.values = []; + animationSelect2.value = ""; + } + const speedSelect = node.widgets?.find( + (w) => w.name === "animation_speed" + ); + if (speedSelect) { + speedSelect.value = "1"; + } + }); + node.addWidget( "button", - inputName, - /* value=*/ - "", + "Play/Pause Animation", + "toggle_animation", () => { - fileInput.click(); - }, - { serialize: false } + load3d.toggleAnimation(); + } ); - uploadWidget.label = "choose file to upload"; - return { widget: uploadWidget }; - } - }; - } -}); -app.registerExtension({ - name: "Comfy.UploadImage", - beforeRegisterNodeDef(nodeType, nodeData) { - if (nodeData?.input?.required?.image?.[1]?.image_upload === true) { - nodeData.input.required.upload = ["IMAGEUPLOAD"]; - } - } -}); -const WEBCAM_READY = Symbol(); -app.registerExtension({ - name: "Comfy.WebcamCapture", - getCustomWidgets(app2) { - return { - WEBCAM(node, inputName) { - let res; - node[WEBCAM_READY] = new Promise((resolve) => res = resolve); - const container = document.createElement("div"); - container.style.background = "rgba(0,0,0,0.25)"; - container.style.textAlign = "center"; - const video = document.createElement("video"); - video.style.height = video.style.width = "100%"; - const loadVideo = /* @__PURE__ */ __name(async () => { - try { - const stream = await navigator.mediaDevices.getUserMedia({ - video: true, - audio: false - }); - container.replaceChildren(video); - setTimeout(() => res(video), 500); - video.addEventListener("loadedmetadata", () => res(video), false); - video.srcObject = stream; - video.play(); - } catch (error) { - const label = document.createElement("div"); - label.style.color = "red"; - label.style.overflow = "auto"; - label.style.maxHeight = "100%"; - label.style.whiteSpace = "pre-wrap"; - if (window.isSecureContext) { - label.textContent = "Unable to load webcam, please ensure access is granted:\n" + error.message; - } else { - label.textContent = "Unable to load webcam. A secure context is required, if you are not accessing ComfyUI on localhost (127.0.0.1) you will have to enable TLS (https)\n\n" + error.message; + const animationSelect = node.addWidget( + "combo", + "animation", + "", + () => "", + { + values: [] + } + ); + animationSelect.callback = (value) => { + const names = load3d.getAnimationNames(); + const index = names.indexOf(value); + if (index !== -1) { + const wasPlaying = load3d.isAnimationPlaying; + if (wasPlaying) { + load3d.toggleAnimation(false); + } + load3d.updateSelectedAnimation(index); + if (wasPlaying) { + load3d.toggleAnimation(true); } - container.replaceChildren(label); } - }, "loadVideo"); - loadVideo(); - return { widget: node.addDOMWidget(inputName, "WEBCAM", container) }; + }; + return { + widget: node.addDOMWidget(inputName, "LOAD_3D_ANIMATION", container) + }; } }; }, - nodeCreated(node) { - if (node.type, node.constructor.comfyClass !== "WebcamCapture") return; - let video; - const camera = node.widgets.find((w2) => w2.name === "image"); - const w = node.widgets.find((w2) => w2.name === "width"); - const h = node.widgets.find((w2) => w2.name === "height"); - const captureOnQueue = node.widgets.find( - (w2) => w2.name === "capture_on_queue" + init() { + const style = document.createElement("style"); + style.innerText = ` + .comfy-load-3d-animation { + ${load3dCSSCLASS} + } + + .comfy-load-3d-animation canvas { + ${load3dCanvasCSSCLASS} + } + `; + document.head.appendChild(style); + }, + async nodeCreated(node) { + if (node.constructor.comfyClass !== "Load3DAnimation") return; + const [oldWidth, oldHeight] = node.size; + node.setSize([Math.max(oldWidth, 300), Math.max(oldHeight, 700)]); + await nextTick(); + const sceneWidget = node.widgets.find((w2) => w2.name === "image"); + const container = sceneWidget.element; + const load3d = containerToLoad3D.get(container.id); + const modelWidget = node.widgets.find( + (w2) => w2.name === "model_file" ); - const canvas = document.createElement("canvas"); - const capture = /* @__PURE__ */ __name(() => { - canvas.width = w.value; - canvas.height = h.value; - const ctx = canvas.getContext("2d"); - ctx.drawImage(video, 0, 0, w.value, h.value); - const data = canvas.toDataURL("image/png"); - const img = new Image(); - img.onload = () => { - node.imgs = [img]; - app.graph.setDirtyCanvas(true); - requestAnimationFrame(() => { - node.setSizeForImage?.(); - }); - }; - img.src = data; - }, "capture"); - const btn = node.addWidget( - "button", - "waiting for camera...", - "capture", - capture + const showGrid = node.widgets.find((w2) => w2.name === "show_grid"); + const cameraType = node.widgets.find( + (w2) => w2.name === "camera_type" ); - btn.disabled = true; - btn.serializeValue = () => void 0; - camera.serializeValue = async () => { - if (captureOnQueue.value) { - capture(); - } else if (!node.imgs?.length) { - const err2 = `No webcam image captured`; - useToastStore().addAlert(err2); - throw new Error(err2); + const view = node.widgets.find((w2) => w2.name === "view"); + const material = node.widgets.find((w2) => w2.name === "material"); + const bgColor = node.widgets.find((w2) => w2.name === "bg_color"); + const lightIntensity = node.widgets.find( + (w2) => w2.name === "light_intensity" + ); + const upDirection = node.widgets.find( + (w2) => w2.name === "up_direction" + ); + const speedSelect = node.widgets.find( + (w2) => w2.name === "animation_speed" + ); + speedSelect.callback = (value) => { + const load3d2 = containerToLoad3D.get(container.id); + if (load3d2) { + load3d2.setAnimationSpeed(parseFloat(value)); } - const blob = await new Promise((r) => canvas.toBlob(r)); - const name = `${+/* @__PURE__ */ new Date()}.png`; + }; + let cameraState; + try { + const cameraInfo = node.properties["Camera Info"]; + if (cameraInfo && typeof cameraInfo === "string" && cameraInfo.trim() !== "") { + cameraState = JSON.parse(cameraInfo); + } + } catch (error) { + console.warn("Failed to parse camera state:", error); + cameraState = void 0; + } + configureLoad3D( + load3d, + "input", + modelWidget, + showGrid, + cameraType, + view, + material, + bgColor, + lightIntensity, + upDirection, + cameraState, + (load3d2) => { + const animationLoad3d = load3d2; + const names = animationLoad3d.getAnimationNames(); + const animationSelect = node.widgets.find( + (w2) => w2.name === "animation" + ); + animationSelect.options.values = names; + if (names.length) { + animationSelect.value = names[0]; + } + } + ); + const w = node.widgets.find((w2) => w2.name === "width"); + const h = node.widgets.find((w2) => w2.name === "height"); + sceneWidget.serializeValue = async () => { + node.properties["Camera Info"] = JSON.stringify(load3d.getCameraState()); + load3d.toggleAnimation(false); + const imageData = await load3d.captureScene(w.value, h.value); + const blob = await fetch(imageData).then((r) => r.blob()); + const name = `scene_${Date.now()}.png`; const file2 = new File([blob], name); const body = new FormData(); body.append("image", file2); - body.append("subfolder", "webcam"); + body.append("subfolder", "threed"); body.append("type", "temp"); const resp = await api.fetchApi("/upload/image", { method: "POST", body }); if (resp.status !== 200) { - const err2 = `Error uploading camera image: ${resp.status} - ${resp.statusText}`; + const err2 = `Error uploading scene capture: ${resp.status} - ${resp.statusText}`; useToastStore().addAlert(err2); throw new Error(err2); } - return `webcam/${name} [temp]`; + const data = await resp.json(); + return `threed/${data.name} [temp]`; }; - node[WEBCAM_READY].then((v) => { - video = v; - if (!w.value) { - w.value = video.videoWidth || 640; - h.value = video.videoHeight || 480; + } +}); +app.registerExtension({ + name: "Comfy.Preview3D", + async beforeRegisterNodeDef(nodeType, nodeData) { + if ( + // @ts-expect-error ComfyNode + ["Preview3D"].includes(nodeType.comfyClass) + ) { + nodeData.input.required.image = ["PREVIEW_3D"]; + } + }, + getCustomWidgets(app2) { + return { + PREVIEW_3D(node, inputName) { + let load3dNode = app2.graph._nodes.filter((wi) => wi.type == "Preview3D"); + const container = document.createElement("div"); + container.id = `comfy-preview-3d-${load3dNode.length}`; + container.classList.add("comfy-preview-3d"); + const load3d = new Load3d(container); + containerToLoad3D.set(container.id, load3d); + node.onResize = function() { + if (load3d) { + load3d.handleResize(); + } + }; + const origOnRemoved = node.onRemoved; + node.onRemoved = function() { + if (load3d) { + load3d.remove(); + } + containerToLoad3D.delete(container.id); + origOnRemoved?.apply(this, []); + }; + node.onDrawBackground = function() { + load3d.renderer.domElement.hidden = this.flags.collapsed ?? false; + }; + return { + widget: node.addDOMWidget(inputName, "PREVIEW_3D", container) + }; } - btn.disabled = false; - btn.label = "capture"; - }); + }; + }, + init() { + const style = document.createElement("style"); + style.innerText = ` + .comfy-preview-3d { + ${load3dCSSCLASS} + } + + .comfy-preview-3d canvas { + ${load3dCanvasCSSCLASS} + } + `; + document.head.appendChild(style); + }, + async nodeCreated(node) { + if (node.constructor.comfyClass !== "Preview3D") return; + const [oldWidth, oldHeight] = node.size; + node.setSize([Math.max(oldWidth, 300), Math.max(oldHeight, 550)]); + await nextTick(); + const sceneWidget = node.widgets.find((w) => w.name === "image"); + const container = sceneWidget.element; + const load3d = containerToLoad3D.get(container.id); + const modelWidget = node.widgets.find( + (w) => w.name === "model_file" + ); + const showGrid = node.widgets.find((w) => w.name === "show_grid"); + const cameraType = node.widgets.find( + (w) => w.name === "camera_type" + ); + const view = node.widgets.find((w) => w.name === "view"); + const material = node.widgets.find((w) => w.name === "material"); + const bgColor = node.widgets.find((w) => w.name === "bg_color"); + const lightIntensity = node.widgets.find( + (w) => w.name === "light_intensity" + ); + const upDirection = node.widgets.find( + (w) => w.name === "up_direction" + ); + const onExecuted = node.onExecuted; + node.onExecuted = function(message) { + onExecuted?.apply(this, arguments); + let filePath = message.model_file[0]; + if (!filePath) { + const msg = "unable to get model file path."; + console.error(msg); + useToastStore().addAlert(msg); + } + modelWidget.value = filePath.replaceAll("\\", "/"); + configureLoad3D( + load3d, + "output", + modelWidget, + showGrid, + cameraType, + view, + material, + bgColor, + lightIntensity, + upDirection + ); + }; } }); -//# sourceMappingURL=index-CCg06AEp.js.map +//# sourceMappingURL=index-CNFX5znr.js.map diff --git a/web/assets/index-BQjD3NM4.js b/web/assets/index-CPVMarQJ.js similarity index 54% rename from web/assets/index-BQjD3NM4.js rename to web/assets/index-CPVMarQJ.js index ea440fc6..0a7f2537 100644 --- a/web/assets/index-BQjD3NM4.js +++ b/web/assets/index-CPVMarQJ.js @@ -1,16 +1,36 @@ var __defProp = Object.defineProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); -import { ct as script$1, H as createBaseVNode, o as openBlock, f as createElementBlock, D as mergeProps } from "./index-BbhVsmQe.js"; -var script = { +import { cq as script$2, z as createBaseVNode, o as openBlock, f as createElementBlock, m as mergeProps } from "./index-DAOHvvrm.js"; +var script$1 = { name: "BarsIcon", - "extends": script$1 + "extends": script$2 }; -var _hoisted_1 = /* @__PURE__ */ createBaseVNode("path", { +var _hoisted_1$1 = /* @__PURE__ */ createBaseVNode("path", { "fill-rule": "evenodd", "clip-rule": "evenodd", d: "M13.3226 3.6129H0.677419C0.497757 3.6129 0.325452 3.54152 0.198411 3.41448C0.0713707 3.28744 0 3.11514 0 2.93548C0 2.75581 0.0713707 2.58351 0.198411 2.45647C0.325452 2.32943 0.497757 2.25806 0.677419 2.25806H13.3226C13.5022 2.25806 13.6745 2.32943 13.8016 2.45647C13.9286 2.58351 14 2.75581 14 2.93548C14 3.11514 13.9286 3.28744 13.8016 3.41448C13.6745 3.54152 13.5022 3.6129 13.3226 3.6129ZM13.3226 7.67741H0.677419C0.497757 7.67741 0.325452 7.60604 0.198411 7.479C0.0713707 7.35196 0 7.17965 0 6.99999C0 6.82033 0.0713707 6.64802 0.198411 6.52098C0.325452 6.39394 0.497757 6.32257 0.677419 6.32257H13.3226C13.5022 6.32257 13.6745 6.39394 13.8016 6.52098C13.9286 6.64802 14 6.82033 14 6.99999C14 7.17965 13.9286 7.35196 13.8016 7.479C13.6745 7.60604 13.5022 7.67741 13.3226 7.67741ZM0.677419 11.7419H13.3226C13.5022 11.7419 13.6745 11.6706 13.8016 11.5435C13.9286 11.4165 14 11.2442 14 11.0645C14 10.8848 13.9286 10.7125 13.8016 10.5855C13.6745 10.4585 13.5022 10.3871 13.3226 10.3871H0.677419C0.497757 10.3871 0.325452 10.4585 0.198411 10.5855C0.0713707 10.7125 0 10.8848 0 11.0645C0 11.2442 0.0713707 11.4165 0.198411 11.5435C0.325452 11.6706 0.497757 11.7419 0.677419 11.7419Z", fill: "currentColor" }, null, -1); +var _hoisted_2$1 = [_hoisted_1$1]; +function render$1(_ctx, _cache, $props, $setup, $data, $options) { + return openBlock(), createElementBlock("svg", mergeProps({ + width: "14", + height: "14", + viewBox: "0 0 14 14", + fill: "none", + xmlns: "http://www.w3.org/2000/svg" + }, _ctx.pti()), _hoisted_2$1, 16); +} +__name(render$1, "render$1"); +script$1.render = render$1; +var script = { + name: "PlusIcon", + "extends": script$2 +}; +var _hoisted_1 = /* @__PURE__ */ createBaseVNode("path", { + d: "M7.67742 6.32258V0.677419C7.67742 0.497757 7.60605 0.325452 7.47901 0.198411C7.35197 0.0713707 7.17966 0 7 0C6.82034 0 6.64803 0.0713707 6.52099 0.198411C6.39395 0.325452 6.32258 0.497757 6.32258 0.677419V6.32258H0.677419C0.497757 6.32258 0.325452 6.39395 0.198411 6.52099C0.0713707 6.64803 0 6.82034 0 7C0 7.17966 0.0713707 7.35197 0.198411 7.47901C0.325452 7.60605 0.497757 7.67742 0.677419 7.67742H6.32258V13.3226C6.32492 13.5015 6.39704 13.6725 6.52358 13.799C6.65012 13.9255 6.82106 13.9977 7 14C7.17966 14 7.35197 13.9286 7.47901 13.8016C7.60605 13.6745 7.67742 13.5022 7.67742 13.3226V7.67742H13.3226C13.5022 7.67742 13.6745 7.60605 13.8016 7.47901C13.9286 7.35197 14 7.17966 14 7C13.9977 6.82106 13.9255 6.65012 13.799 6.52358C13.6725 6.39704 13.5015 6.32492 13.3226 6.32258H7.67742Z", + fill: "currentColor" +}, null, -1); var _hoisted_2 = [_hoisted_1]; function render(_ctx, _cache, $props, $setup, $data, $options) { return openBlock(), createElementBlock("svg", mergeProps({ @@ -24,6 +44,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) { __name(render, "render"); script.render = render; export { - script as s + script as a, + script$1 as s }; -//# sourceMappingURL=index-BQjD3NM4.js.map +//# sourceMappingURL=index-CPVMarQJ.js.map diff --git a/web/assets/index-BbhVsmQe.js b/web/assets/index-DAOHvvrm.js similarity index 95% rename from web/assets/index-BbhVsmQe.js rename to web/assets/index-DAOHvvrm.js index a8bf2696..40244ceb 100644 --- a/web/assets/index-BbhVsmQe.js +++ b/web/assets/index-DAOHvvrm.js @@ -1,6 +1,6 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./GraphView-BhIVbg_-.js","./index-BuE2B-Gw.js","./index-VIBj2YvH.js","./index-BQjD3NM4.js","./keybindingService-DohhteGb.js","./serverConfigStore-CdBr6oWT.js","./GraphView-CIRWBKTm.css","./UserSelectView-Bpmnopou.js","./BaseViewTemplate-qOhVwbhN.js","./ServerStartView-BA9I3WCH.js","./ServerStartView-CnyN4Ib6.css","./InstallView-ZoxdV0Ib.js","./InstallView-CwQdoH-C.css","./WelcomeView-Cg-dprpV.js","./WelcomeView-Brz3-luE.css","./NotSupportedView-sBtNsodN.js","./NotSupportedView-bFzHmqNj.css","./DownloadGitView-XzlZoglc.js","./ManualConfigurationView-CYxSElYw.js","./ManualConfigurationView-B6ecEClB.css","./KeybindingPanel-COhe3VgH.js","./index-DIIs-Ju9.js","./KeybindingPanel-DvrUYZ4S.css","./ExtensionPanel-C1yxn9cA.js","./ServerConfigPanel-BHbwCDu2.js","./index-CCg06AEp.js","./index-BRhY6FpL.css"])))=>i.map(i=>d[i]); +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./KeybindingPanel-BkAdqLwN.js","./index-DqWMa5Pc.js","./index-CPVMarQJ.js","./KeybindingPanel-DG93MIeP.css","./ExtensionPanel-BJ7mACDI.js","./ServerConfigPanel-C47nStyv.js","./serverConfigStore-DCuqETVV.js","./index-CNFX5znr.js","./index-BRhY6FpL.css","./GraphView-DuMhaZbg.js","./GraphView-CtisndV2.css","./ServerStartView-C3YAc4Lp.js","./ServerStartView-BHqjjHcl.css","./InstallView-BOZ1nhez.js","./InstallView-Cfq1m4as.css","./WelcomeView-BC1IzhL3.js","./WelcomeView-BD34JMsC.css","./NotSupportedView-Cjt5Fiwh.js","./NotSupportedView-bFzHmqNj.css"])))=>i.map(i=>d[i]); var __defProp2 = Object.defineProperty; -var __name = (target, value4) => __defProp2(target, "name", { value: value4, configurable: true }); +var __name = (target, value3) => __defProp2(target, "name", { value: value3, configurable: true }); (/* @__PURE__ */ __name(function polyfill() { const relList = document.createElement("link").relList; if (relList && relList.supports && relList.supports("modulepreload")) { @@ -40,61882 +40,45899 @@ var __name = (target, value4) => __defProp2(target, "name", { value: value4, con } __name(processPreload, "processPreload"); }, "polyfill"))(); -var __defProp$2 = Object.defineProperty; -var __getOwnPropSymbols$1 = Object.getOwnPropertySymbols; -var __hasOwnProp$1 = Object.prototype.hasOwnProperty; -var __propIsEnum$1 = Object.prototype.propertyIsEnumerable; -var __defNormalProp$2 = /* @__PURE__ */ __name((obj, key, value4) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value: value4 }) : obj[key] = value4, "__defNormalProp$2"); -var __spreadValues$1 = /* @__PURE__ */ __name((a, b) => { - for (var prop2 in b || (b = {})) - if (__hasOwnProp$1.call(b, prop2)) - __defNormalProp$2(a, prop2, b[prop2]); - if (__getOwnPropSymbols$1) - for (var prop2 of __getOwnPropSymbols$1(b)) { - if (__propIsEnum$1.call(b, prop2)) - __defNormalProp$2(a, prop2, b[prop2]); - } - return a; -}, "__spreadValues$1"); -function isEmpty$1(value4) { - return value4 === null || value4 === void 0 || value4 === "" || Array.isArray(value4) && value4.length === 0 || !(value4 instanceof Date) && typeof value4 === "object" && Object.keys(value4).length === 0; +/** +* @vue/shared v3.4.31 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/ +/*! #__NO_SIDE_EFFECTS__ */ +// @__NO_SIDE_EFFECTS__ +function makeMap(str, expectsLowerCase) { + const set3 = new Set(str.split(",")); + return expectsLowerCase ? (val) => set3.has(val.toLowerCase()) : (val) => set3.has(val); } -__name(isEmpty$1, "isEmpty$1"); -function compare$1(value1, value22, comparator2, order = 1) { - let result = -1; - const emptyValue1 = isEmpty$1(value1); - const emptyValue2 = isEmpty$1(value22); - if (emptyValue1 && emptyValue2) result = 0; - else if (emptyValue1) result = order; - else if (emptyValue2) result = -order; - else if (typeof value1 === "string" && typeof value22 === "string") result = comparator2(value1, value22); - else result = value1 < value22 ? -1 : value1 > value22 ? 1 : 0; - return result; +__name(makeMap, "makeMap"); +const EMPTY_OBJ = false ? Object.freeze({}) : {}; +const EMPTY_ARR = false ? Object.freeze([]) : []; +const NOOP = /* @__PURE__ */ __name(() => { +}, "NOOP"); +const NO = /* @__PURE__ */ __name(() => false, "NO"); +const isOn = /* @__PURE__ */ __name((key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // uppercase letter +(key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97), "isOn"); +const isModelListener = /* @__PURE__ */ __name((key) => key.startsWith("onUpdate:"), "isModelListener"); +const extend$1 = Object.assign; +const remove$1 = /* @__PURE__ */ __name((arr, el) => { + const i2 = arr.indexOf(el); + if (i2 > -1) { + arr.splice(i2, 1); + } +}, "remove$1"); +const hasOwnProperty$3 = Object.prototype.hasOwnProperty; +const hasOwn$3 = /* @__PURE__ */ __name((val, key) => hasOwnProperty$3.call(val, key), "hasOwn$3"); +const isArray$5 = Array.isArray; +const isMap = /* @__PURE__ */ __name((val) => toTypeString$1(val) === "[object Map]", "isMap"); +const isSet = /* @__PURE__ */ __name((val) => toTypeString$1(val) === "[object Set]", "isSet"); +const isDate$3 = /* @__PURE__ */ __name((val) => toTypeString$1(val) === "[object Date]", "isDate$3"); +const isRegExp$4 = /* @__PURE__ */ __name((val) => toTypeString$1(val) === "[object RegExp]", "isRegExp$4"); +const isFunction$5 = /* @__PURE__ */ __name((val) => typeof val === "function", "isFunction$5"); +const isString$8 = /* @__PURE__ */ __name((val) => typeof val === "string", "isString$8"); +const isSymbol$1 = /* @__PURE__ */ __name((val) => typeof val === "symbol", "isSymbol$1"); +const isObject$7 = /* @__PURE__ */ __name((val) => val !== null && typeof val === "object", "isObject$7"); +const isPromise$1 = /* @__PURE__ */ __name((val) => { + return (isObject$7(val) || isFunction$5(val)) && isFunction$5(val.then) && isFunction$5(val.catch); +}, "isPromise$1"); +const objectToString$1 = Object.prototype.toString; +const toTypeString$1 = /* @__PURE__ */ __name((value3) => objectToString$1.call(value3), "toTypeString$1"); +const toRawType = /* @__PURE__ */ __name((value3) => { + return toTypeString$1(value3).slice(8, -1); +}, "toRawType"); +const isPlainObject$4 = /* @__PURE__ */ __name((val) => toTypeString$1(val) === "[object Object]", "isPlainObject$4"); +const isIntegerKey = /* @__PURE__ */ __name((key) => isString$8(key) && key !== "NaN" && key[0] !== "-" && "" + parseInt(key, 10) === key, "isIntegerKey"); +const isReservedProp = /* @__PURE__ */ makeMap( + // the leading comma is intentional so empty string "" is also included + ",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted" +); +const isBuiltInDirective = /* @__PURE__ */ makeMap( + "bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo" +); +const cacheStringFunction$1 = /* @__PURE__ */ __name((fn) => { + const cache2 = /* @__PURE__ */ Object.create(null); + return (str) => { + const hit = cache2[str]; + return hit || (cache2[str] = fn(str)); + }; +}, "cacheStringFunction$1"); +const camelizeRE$1 = /-(\w)/g; +const camelize$1 = cacheStringFunction$1((str) => { + return str.replace(camelizeRE$1, (_2, c) => c ? c.toUpperCase() : ""); +}); +const hyphenateRE$1 = /\B([A-Z])/g; +const hyphenate$1 = cacheStringFunction$1( + (str) => str.replace(hyphenateRE$1, "-$1").toLowerCase() +); +const capitalize$1 = cacheStringFunction$1((str) => { + return str.charAt(0).toUpperCase() + str.slice(1); +}); +const toHandlerKey = cacheStringFunction$1((str) => { + const s = str ? `on${capitalize$1(str)}` : ``; + return s; +}); +const hasChanged = /* @__PURE__ */ __name((value3, oldValue2) => !Object.is(value3, oldValue2), "hasChanged"); +const invokeArrayFns = /* @__PURE__ */ __name((fns, ...arg) => { + for (let i2 = 0; i2 < fns.length; i2++) { + fns[i2](...arg); + } +}, "invokeArrayFns"); +const def = /* @__PURE__ */ __name((obj, key, value3, writable = false) => { + Object.defineProperty(obj, key, { + configurable: true, + enumerable: false, + writable, + value: value3 + }); +}, "def"); +const looseToNumber = /* @__PURE__ */ __name((val) => { + const n = parseFloat(val); + return isNaN(n) ? val : n; +}, "looseToNumber"); +const toNumber = /* @__PURE__ */ __name((val) => { + const n = isString$8(val) ? Number(val) : NaN; + return isNaN(n) ? val : n; +}, "toNumber"); +let _globalThis$1; +const getGlobalThis$1 = /* @__PURE__ */ __name(() => { + return _globalThis$1 || (_globalThis$1 = typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : {}); +}, "getGlobalThis$1"); +const identRE = /^[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*$/; +function genPropsAccessExp(name2) { + return identRE.test(name2) ? `__props.${name2}` : `__props[${JSON.stringify(name2)}]`; } -__name(compare$1, "compare$1"); -function deepEquals(obj1, obj2) { - if (obj1 === obj2) return true; - if (obj1 && obj2 && typeof obj1 == "object" && typeof obj2 == "object") { - var arrObj1 = Array.isArray(obj1), arrObj2 = Array.isArray(obj2), i2, length, key; - if (arrObj1 && arrObj2) { - length = obj1.length; - if (length != obj2.length) return false; - for (i2 = length; i2-- !== 0; ) if (!deepEquals(obj1[i2], obj2[i2])) return false; - return true; - } - if (arrObj1 != arrObj2) return false; - var dateObj1 = obj1 instanceof Date, dateObj2 = obj2 instanceof Date; - if (dateObj1 != dateObj2) return false; - if (dateObj1 && dateObj2) return obj1.getTime() == obj2.getTime(); - var regexpObj1 = obj1 instanceof RegExp, regexpObj2 = obj2 instanceof RegExp; - if (regexpObj1 != regexpObj2) return false; - if (regexpObj1 && regexpObj2) return obj1.toString() == obj2.toString(); - var keys2 = Object.keys(obj1); - length = keys2.length; - if (length !== Object.keys(obj2).length) return false; - for (i2 = length; i2-- !== 0; ) if (!Object.prototype.hasOwnProperty.call(obj2, keys2[i2])) return false; - for (i2 = length; i2-- !== 0; ) { - key = keys2[i2]; - if (!deepEquals(obj1[key], obj2[key])) return false; +__name(genPropsAccessExp, "genPropsAccessExp"); +const PatchFlags = { + "TEXT": 1, + "1": "TEXT", + "CLASS": 2, + "2": "CLASS", + "STYLE": 4, + "4": "STYLE", + "PROPS": 8, + "8": "PROPS", + "FULL_PROPS": 16, + "16": "FULL_PROPS", + "NEED_HYDRATION": 32, + "32": "NEED_HYDRATION", + "STABLE_FRAGMENT": 64, + "64": "STABLE_FRAGMENT", + "KEYED_FRAGMENT": 128, + "128": "KEYED_FRAGMENT", + "UNKEYED_FRAGMENT": 256, + "256": "UNKEYED_FRAGMENT", + "NEED_PATCH": 512, + "512": "NEED_PATCH", + "DYNAMIC_SLOTS": 1024, + "1024": "DYNAMIC_SLOTS", + "DEV_ROOT_FRAGMENT": 2048, + "2048": "DEV_ROOT_FRAGMENT", + "HOISTED": -1, + "-1": "HOISTED", + "BAIL": -2, + "-2": "BAIL" +}; +const PatchFlagNames = { + [1]: `TEXT`, + [2]: `CLASS`, + [4]: `STYLE`, + [8]: `PROPS`, + [16]: `FULL_PROPS`, + [32]: `NEED_HYDRATION`, + [64]: `STABLE_FRAGMENT`, + [128]: `KEYED_FRAGMENT`, + [256]: `UNKEYED_FRAGMENT`, + [512]: `NEED_PATCH`, + [1024]: `DYNAMIC_SLOTS`, + [2048]: `DEV_ROOT_FRAGMENT`, + [-1]: `HOISTED`, + [-2]: `BAIL` +}; +const ShapeFlags = { + "ELEMENT": 1, + "1": "ELEMENT", + "FUNCTIONAL_COMPONENT": 2, + "2": "FUNCTIONAL_COMPONENT", + "STATEFUL_COMPONENT": 4, + "4": "STATEFUL_COMPONENT", + "TEXT_CHILDREN": 8, + "8": "TEXT_CHILDREN", + "ARRAY_CHILDREN": 16, + "16": "ARRAY_CHILDREN", + "SLOTS_CHILDREN": 32, + "32": "SLOTS_CHILDREN", + "TELEPORT": 64, + "64": "TELEPORT", + "SUSPENSE": 128, + "128": "SUSPENSE", + "COMPONENT_SHOULD_KEEP_ALIVE": 256, + "256": "COMPONENT_SHOULD_KEEP_ALIVE", + "COMPONENT_KEPT_ALIVE": 512, + "512": "COMPONENT_KEPT_ALIVE", + "COMPONENT": 6, + "6": "COMPONENT" +}; +const SlotFlags = { + "STABLE": 1, + "1": "STABLE", + "DYNAMIC": 2, + "2": "DYNAMIC", + "FORWARDED": 3, + "3": "FORWARDED" +}; +const slotFlagsText = { + [1]: "STABLE", + [2]: "DYNAMIC", + [3]: "FORWARDED" +}; +const GLOBALS_ALLOWED = "Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error"; +const isGloballyAllowed = /* @__PURE__ */ makeMap(GLOBALS_ALLOWED); +const isGloballyWhitelisted = isGloballyAllowed; +const range = 2; +function generateCodeFrame$1(source, start2 = 0, end = source.length) { + start2 = Math.max(0, Math.min(start2, source.length)); + end = Math.max(0, Math.min(end, source.length)); + if (start2 > end) return ""; + let lines = source.split(/(\r?\n)/); + const newlineSequences = lines.filter((_2, idx) => idx % 2 === 1); + lines = lines.filter((_2, idx) => idx % 2 === 0); + let count = 0; + const res = []; + for (let i2 = 0; i2 < lines.length; i2++) { + count += lines[i2].length + (newlineSequences[i2] && newlineSequences[i2].length || 0); + if (count >= start2) { + for (let j = i2 - range; j <= i2 + range || end > count; j++) { + if (j < 0 || j >= lines.length) continue; + const line = j + 1; + res.push( + `${line}${" ".repeat(Math.max(3 - String(line).length, 0))}| ${lines[j]}` + ); + const lineLength = lines[j].length; + const newLineSeqLength = newlineSequences[j] && newlineSequences[j].length || 0; + if (j === i2) { + const pad = start2 - (count - (lineLength + newLineSeqLength)); + const length = Math.max( + 1, + end > count ? lineLength - pad : end - start2 + ); + res.push(` | ` + " ".repeat(pad) + "^".repeat(length)); + } else if (j > i2) { + if (end > count) { + const length = Math.max(Math.min(end - count, lineLength), 1); + res.push(` | ` + "^".repeat(length)); + } + count += lineLength + newLineSeqLength; + } + } + break; } - return true; } - return obj1 !== obj1 && obj2 !== obj2; -} -__name(deepEquals, "deepEquals"); -function isFunction$5(value4) { - return !!(value4 && value4.constructor && value4.call && value4.apply); -} -__name(isFunction$5, "isFunction$5"); -function isNotEmpty(value4) { - return !isEmpty$1(value4); + return res.join("\n"); } -__name(isNotEmpty, "isNotEmpty"); -function resolveFieldData(data24, field) { - if (!data24 || !field) { - return null; - } - try { - const value4 = data24[field]; - if (isNotEmpty(value4)) return value4; - } catch (e2) { - } - if (Object.keys(data24).length) { - if (isFunction$5(field)) { - return field(data24); - } else if (field.indexOf(".") === -1) { - return data24[field]; - } else { - let fields = field.split("."); - let value4 = data24; - for (let i2 = 0, len = fields.length; i2 < len; ++i2) { - if (value4 == null) { - return null; +__name(generateCodeFrame$1, "generateCodeFrame$1"); +function normalizeStyle(value3) { + if (isArray$5(value3)) { + const res = {}; + for (let i2 = 0; i2 < value3.length; i2++) { + const item2 = value3[i2]; + const normalized = isString$8(item2) ? parseStringStyle(item2) : normalizeStyle(item2); + if (normalized) { + for (const key in normalized) { + res[key] = normalized[key]; } - value4 = value4[fields[i2]]; } - return value4; } + return res; + } else if (isString$8(value3) || isObject$7(value3)) { + return value3; } - return null; } -__name(resolveFieldData, "resolveFieldData"); -function equals(obj1, obj2, field) { - if (field) return resolveFieldData(obj1, field) === resolveFieldData(obj2, field); - else return deepEquals(obj1, obj2); +__name(normalizeStyle, "normalizeStyle"); +const listDelimiterRE = /;(?![^(]*\))/g; +const propertyDelimiterRE = /:([^]+)/; +const styleCommentRE = /\/\*[^]*?\*\//g; +function parseStringStyle(cssText) { + const ret = {}; + cssText.replace(styleCommentRE, "").split(listDelimiterRE).forEach((item2) => { + if (item2) { + const tmp = item2.split(propertyDelimiterRE); + tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim()); + } + }); + return ret; } -__name(equals, "equals"); -function contains(value4, list2) { - if (value4 != null && list2 && list2.length) { - for (let val of list2) { - if (equals(value4, val)) return true; +__name(parseStringStyle, "parseStringStyle"); +function stringifyStyle(styles) { + let ret = ""; + if (!styles || isString$8(styles)) { + return ret; + } + for (const key in styles) { + const value3 = styles[key]; + if (isString$8(value3) || typeof value3 === "number") { + const normalizedKey = key.startsWith(`--`) ? key : hyphenate$1(key); + ret += `${normalizedKey}:${value3};`; } } - return false; + return ret; } -__name(contains, "contains"); -function filter(value4, fields, filterValue) { - let filteredItems = []; - if (value4) { - for (let item3 of value4) { - for (let field of fields) { - if (String(resolveFieldData(item3, field)).toLowerCase().indexOf(filterValue.toLowerCase()) > -1) { - filteredItems.push(item3); - break; - } +__name(stringifyStyle, "stringifyStyle"); +function normalizeClass(value3) { + let res = ""; + if (isString$8(value3)) { + res = value3; + } else if (isArray$5(value3)) { + for (let i2 = 0; i2 < value3.length; i2++) { + const normalized = normalizeClass(value3[i2]); + if (normalized) { + res += normalized + " "; } } - } - return filteredItems; -} -__name(filter, "filter"); -function findIndexInList(value4, list2) { - let index2 = -1; - if (list2) { - for (let i2 = 0; i2 < list2.length; i2++) { - if (list2[i2] === value4) { - index2 = i2; - break; + } else if (isObject$7(value3)) { + for (const name2 in value3) { + if (value3[name2]) { + res += name2 + " "; } } } - return index2; + return res.trim(); } -__name(findIndexInList, "findIndexInList"); -function findLast$1(arr, callback) { - let item3; - if (isNotEmpty(arr)) { - try { - item3 = arr.findLast(callback); - } catch (e2) { - item3 = [...arr].reverse().find(callback); - } +__name(normalizeClass, "normalizeClass"); +function normalizeProps(props) { + if (!props) return null; + let { class: klass, style: style2 } = props; + if (klass && !isString$8(klass)) { + props.class = normalizeClass(klass); } - return item3; -} -__name(findLast$1, "findLast$1"); -function findLastIndex(arr, callback) { - let index2 = -1; - if (isNotEmpty(arr)) { - try { - index2 = arr.findLastIndex(callback); - } catch (e2) { - index2 = arr.lastIndexOf([...arr].reverse().find(callback)); - } + if (style2) { + props.style = normalizeStyle(style2); } - return index2; -} -__name(findLastIndex, "findLastIndex"); -function isObject$7(value4, empty3 = true) { - return value4 instanceof Object && value4.constructor === Object && (empty3 || Object.keys(value4).length !== 0); -} -__name(isObject$7, "isObject$7"); -function resolve$1(obj, ...params) { - return isFunction$5(obj) ? obj(...params) : obj; + return props; } -__name(resolve$1, "resolve$1"); -function isString$8(value4, empty3 = true) { - return typeof value4 === "string" && (empty3 || value4 !== ""); +__name(normalizeProps, "normalizeProps"); +const HTML_TAGS = "html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot"; +const SVG_TAGS = "svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view"; +const MATH_TAGS = "annotation,annotation-xml,maction,maligngroup,malignmark,math,menclose,merror,mfenced,mfrac,mfraction,mglyph,mi,mlabeledtr,mlongdiv,mmultiscripts,mn,mo,mover,mpadded,mphantom,mprescripts,mroot,mrow,ms,mscarries,mscarry,msgroup,msline,mspace,msqrt,msrow,mstack,mstyle,msub,msubsup,msup,mtable,mtd,mtext,mtr,munder,munderover,none,semantics"; +const VOID_TAGS = "area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr"; +const isHTMLTag = /* @__PURE__ */ makeMap(HTML_TAGS); +const isSVGTag = /* @__PURE__ */ makeMap(SVG_TAGS); +const isMathMLTag = /* @__PURE__ */ makeMap(MATH_TAGS); +const isVoidTag = /* @__PURE__ */ makeMap(VOID_TAGS); +const specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`; +const isSpecialBooleanAttr = /* @__PURE__ */ makeMap(specialBooleanAttrs); +const isBooleanAttr = /* @__PURE__ */ makeMap( + specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,inert,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected` +); +function includeBooleanAttr(value3) { + return !!value3 || value3 === ""; } -__name(isString$8, "isString$8"); -function toFlatCase(str) { - return isString$8(str) ? str.replace(/(-|_)/g, "").toLowerCase() : str; +__name(includeBooleanAttr, "includeBooleanAttr"); +const unsafeAttrCharRE = /[>/="'\u0009\u000a\u000c\u0020]/; +const attrValidationCache = {}; +function isSSRSafeAttrName(name2) { + if (attrValidationCache.hasOwnProperty(name2)) { + return attrValidationCache[name2]; + } + const isUnsafe = unsafeAttrCharRE.test(name2); + if (isUnsafe) { + console.error(`unsafe attribute name: ${name2}`); + } + return attrValidationCache[name2] = !isUnsafe; } -__name(toFlatCase, "toFlatCase"); -function getKeyValue(obj, key = "", params = {}) { - const fKeys = toFlatCase(key).split("."); - const fKey = fKeys.shift(); - return fKey ? isObject$7(obj) ? getKeyValue(resolve$1(obj[Object.keys(obj).find((k) => toFlatCase(k) === fKey) || ""], params), fKeys.join("."), params) : void 0 : resolve$1(obj, params); +__name(isSSRSafeAttrName, "isSSRSafeAttrName"); +const propsToAttrMap = { + acceptCharset: "accept-charset", + className: "class", + htmlFor: "for", + httpEquiv: "http-equiv" +}; +const isKnownHtmlAttr = /* @__PURE__ */ makeMap( + `accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,inert,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap` +); +const isKnownSvgAttr = /* @__PURE__ */ makeMap( + `xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xmlns:xlink,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan` +); +function isRenderableAttrValue(value3) { + if (value3 == null) { + return false; + } + const type = typeof value3; + return type === "string" || type === "number" || type === "boolean"; } -__name(getKeyValue, "getKeyValue"); -function insertIntoOrderedArray(item3, index2, arr, sourceArr) { - if (arr.length > 0) { - let injected = false; - for (let i2 = 0; i2 < arr.length; i2++) { - let currentItemIndex = findIndexInList(arr[i2], sourceArr); - if (currentItemIndex > index2) { - arr.splice(i2, 0, item3); - injected = true; +__name(isRenderableAttrValue, "isRenderableAttrValue"); +const escapeRE$2 = /["'&<>]/; +function escapeHtml$2(string) { + const str = "" + string; + const match2 = escapeRE$2.exec(str); + if (!match2) { + return str; + } + let html = ""; + let escaped; + let index2; + let lastIndex = 0; + for (index2 = match2.index; index2 < str.length; index2++) { + switch (str.charCodeAt(index2)) { + case 34: + escaped = """; break; - } + case 38: + escaped = "&"; + break; + case 39: + escaped = "'"; + break; + case 60: + escaped = "<"; + break; + case 62: + escaped = ">"; + break; + default: + continue; } - if (!injected) { - arr.push(item3); + if (lastIndex !== index2) { + html += str.slice(lastIndex, index2); } - } else { - arr.push(item3); + lastIndex = index2 + 1; + html += escaped; } + return lastIndex !== index2 ? html + str.slice(lastIndex, index2) : html; } -__name(insertIntoOrderedArray, "insertIntoOrderedArray"); -function isArray$5(value4, empty3 = true) { - return Array.isArray(value4) && (empty3 || value4.length !== 0); -} -__name(isArray$5, "isArray$5"); -function isDate$3(value4) { - return value4 instanceof Date && value4.constructor === Date; -} -__name(isDate$3, "isDate$3"); -function isNumber$5(value4) { - return isNotEmpty(value4) && !isNaN(value4); -} -__name(isNumber$5, "isNumber$5"); -function isPrintableCharacter(char = "") { - return isNotEmpty(char) && char.length === 1 && !!char.match(/\S| /); -} -__name(isPrintableCharacter, "isPrintableCharacter"); -function localeComparator() { - return new Intl.Collator(void 0, { numeric: true }).compare; +__name(escapeHtml$2, "escapeHtml$2"); +const commentStripRE = /^-?>||--!>| { - const mergedObj = __spreadValues$1({}, target); - Object.keys(source).forEach((key) => { - if (isObject$7(source[key]) && key in target && isObject$7(target[key])) { - mergedObj[key] = _mergeKeys(target[key], source[key]); - } else { - mergedObj[key] = source[key]; +__name(looseCompareArrays, "looseCompareArrays"); +function looseEqual(a, b) { + if (a === b) return true; + let aValidType = isDate$3(a); + let bValidType = isDate$3(b); + if (aValidType || bValidType) { + return aValidType && bValidType ? a.getTime() === b.getTime() : false; + } + aValidType = isSymbol$1(a); + bValidType = isSymbol$1(b); + if (aValidType || bValidType) { + return a === b; + } + aValidType = isArray$5(a); + bValidType = isArray$5(b); + if (aValidType || bValidType) { + return aValidType && bValidType ? looseCompareArrays(a, b) : false; + } + aValidType = isObject$7(a); + bValidType = isObject$7(b); + if (aValidType || bValidType) { + if (!aValidType || !bValidType) { + return false; + } + const aKeysCount = Object.keys(a).length; + const bKeysCount = Object.keys(b).length; + if (aKeysCount !== bKeysCount) { + return false; + } + for (const key in a) { + const aHasKey = a.hasOwnProperty(key); + const bHasKey = b.hasOwnProperty(key); + if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) { + return false; } - }); - return mergedObj; - }, "_mergeKeys"); - return args.reduce((acc, obj, i2) => i2 === 0 ? obj : _mergeKeys(acc, obj), {}); -} -__name(mergeKeys, "mergeKeys"); -function minifyCSS(css3) { - return css3 ? css3.replace(/\/\*(?:(?!\*\/)[\s\S])*\*\/|[\r\n\t]+/g, "").replace(/ {2,}/g, " ").replace(/ ([{:}]) /g, "$1").replace(/([;,]) /g, "$1").replace(/ !/g, "!").replace(/: /g, ":") : css3; + } + } + return String(a) === String(b); } -__name(minifyCSS, "minifyCSS"); -function nestedKeys(obj = {}, parentKey = "") { - return Object.entries(obj).reduce((o, [key, value4]) => { - const currentKey = parentKey ? `${parentKey}.${key}` : key; - isObject$7(value4) ? o = o.concat(nestedKeys(value4, currentKey)) : o.push(currentKey); - return o; - }, []); +__name(looseEqual, "looseEqual"); +function looseIndexOf(arr, val) { + return arr.findIndex((item2) => looseEqual(item2, val)); } -__name(nestedKeys, "nestedKeys"); -function removeAccents(str) { - if (str && str.search(/[\xC0-\xFF]/g) > -1) { - str = str.replace(/[\xC0-\xC5]/g, "A").replace(/[\xC6]/g, "AE").replace(/[\xC7]/g, "C").replace(/[\xC8-\xCB]/g, "E").replace(/[\xCC-\xCF]/g, "I").replace(/[\xD0]/g, "D").replace(/[\xD1]/g, "N").replace(/[\xD2-\xD6\xD8]/g, "O").replace(/[\xD9-\xDC]/g, "U").replace(/[\xDD]/g, "Y").replace(/[\xDE]/g, "P").replace(/[\xE0-\xE5]/g, "a").replace(/[\xE6]/g, "ae").replace(/[\xE7]/g, "c").replace(/[\xE8-\xEB]/g, "e").replace(/[\xEC-\xEF]/g, "i").replace(/[\xF1]/g, "n").replace(/[\xF2-\xF6\xF8]/g, "o").replace(/[\xF9-\xFC]/g, "u").replace(/[\xFE]/g, "p").replace(/[\xFD\xFF]/g, "y"); +__name(looseIndexOf, "looseIndexOf"); +const isRef$1 = /* @__PURE__ */ __name((val) => { + return !!(val && val.__v_isRef === true); +}, "isRef$1"); +const toDisplayString$1 = /* @__PURE__ */ __name((val) => { + return isString$8(val) ? val : val == null ? "" : isArray$5(val) || isObject$7(val) && (val.toString === objectToString$1 || !isFunction$5(val.toString)) ? isRef$1(val) ? toDisplayString$1(val.value) : JSON.stringify(val, replacer, 2) : String(val); +}, "toDisplayString$1"); +const replacer = /* @__PURE__ */ __name((_key, val) => { + if (isRef$1(val)) { + return replacer(_key, val.value); + } else if (isMap(val)) { + return { + [`Map(${val.size})`]: [...val.entries()].reduce( + (entries, [key, val2], i2) => { + entries[stringifySymbol(key, i2) + " =>"] = val2; + return entries; + }, + {} + ) + }; + } else if (isSet(val)) { + return { + [`Set(${val.size})`]: [...val.values()].map((v2) => stringifySymbol(v2)) + }; + } else if (isSymbol$1(val)) { + return stringifySymbol(val); + } else if (isObject$7(val) && !isArray$5(val) && !isPlainObject$4(val)) { + return String(val); } - return str; + return val; +}, "replacer"); +const stringifySymbol = /* @__PURE__ */ __name((v2, i2 = "") => { + var _a2; + return ( + // Symbol.description in es2019+ so we need to cast here to pass + // the lib: es2016 check + isSymbol$1(v2) ? `Symbol(${(_a2 = v2.description) != null ? _a2 : i2})` : v2 + ); +}, "stringifySymbol"); +/** +* @vue/reactivity v3.4.31 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/ +function warn$4(msg, ...args) { + console.warn(`[Vue warn] ${msg}`, ...args); } -__name(removeAccents, "removeAccents"); -function reorderArray(value4, from2, to) { - if (value4 && from2 !== to) { - if (to >= value4.length) { - to %= value4.length; - from2 %= value4.length; +__name(warn$4, "warn$4"); +let activeEffectScope; +class EffectScope { + static { + __name(this, "EffectScope"); + } + constructor(detached = false) { + this.detached = detached; + this._active = true; + this.effects = []; + this.cleanups = []; + this.parent = activeEffectScope; + if (!detached && activeEffectScope) { + this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push( + this + ) - 1; } - value4.splice(to, 0, value4.splice(from2, 1)[0]); } -} -__name(reorderArray, "reorderArray"); -function sort(value1, value22, order = 1, comparator2, nullSortOrder = 1) { - const result = compare$1(value1, value22, comparator2, order); - let finalSortOrder = order; - if (isEmpty$1(value1) || isEmpty$1(value22)) { - finalSortOrder = nullSortOrder === 1 ? order : nullSortOrder; + get active() { + return this._active; } - return finalSortOrder * result; -} -__name(sort, "sort"); -function stringify(value4, indent = 2, currentIndent = 0) { - const currentIndentStr = " ".repeat(currentIndent); - const nextIndentStr = " ".repeat(currentIndent + indent); - if (isArray$5(value4)) { - return "[" + value4.map((v2) => stringify(v2, indent, currentIndent + indent)).join(", ") + "]"; - } else if (isDate$3(value4)) { - return value4.toISOString(); - } else if (isFunction$5(value4)) { - return value4.toString(); - } else if (isObject$7(value4)) { - return "{\n" + Object.entries(value4).map(([k, v2]) => `${nextIndentStr}${k}: ${stringify(v2, indent, currentIndent + indent)}`).join(",\n") + ` -${currentIndentStr}}`; - } else { - return JSON.stringify(value4); + run(fn) { + if (this._active) { + const currentEffectScope = activeEffectScope; + try { + activeEffectScope = this; + return fn(); + } finally { + activeEffectScope = currentEffectScope; + } + } else if (false) { + warn$4(`cannot run an inactive effect scope.`); + } + } + /** + * This should only be called on non-detached scopes + * @internal + */ + on() { + activeEffectScope = this; + } + /** + * This should only be called on non-detached scopes + * @internal + */ + off() { + activeEffectScope = this.parent; + } + stop(fromParent) { + if (this._active) { + let i2, l; + for (i2 = 0, l = this.effects.length; i2 < l; i2++) { + this.effects[i2].stop(); + } + for (i2 = 0, l = this.cleanups.length; i2 < l; i2++) { + this.cleanups[i2](); + } + if (this.scopes) { + for (i2 = 0, l = this.scopes.length; i2 < l; i2++) { + this.scopes[i2].stop(true); + } + } + if (!this.detached && this.parent && !fromParent) { + const last = this.parent.scopes.pop(); + if (last && last !== this) { + this.parent.scopes[this.index] = last; + last.index = this.index; + } + } + this.parent = void 0; + this._active = false; + } } } -__name(stringify, "stringify"); -function toCapitalCase(str) { - return isString$8(str, false) ? str[0].toUpperCase() + str.slice(1) : str; +function effectScope(detached) { + return new EffectScope(detached); } -__name(toCapitalCase, "toCapitalCase"); -function toKebabCase(str) { - return isString$8(str) ? str.replace(/(_)/g, "-").replace(/[A-Z]/g, (c, i2) => i2 === 0 ? c : "-" + c.toLowerCase()).toLowerCase() : str; +__name(effectScope, "effectScope"); +function recordEffectScope(effect2, scope = activeEffectScope) { + if (scope && scope.active) { + scope.effects.push(effect2); + } } -__name(toKebabCase, "toKebabCase"); -function toTokenKey$1(str) { - return isString$8(str) ? str.replace(/[A-Z]/g, (c, i2) => i2 === 0 ? c : "." + c.toLowerCase()).toLowerCase() : str; +__name(recordEffectScope, "recordEffectScope"); +function getCurrentScope() { + return activeEffectScope; } -__name(toTokenKey$1, "toTokenKey$1"); -function EventBus() { - const allHandlers = /* @__PURE__ */ new Map(); - return { - on(type, handler6) { - let handlers2 = allHandlers.get(type); - if (!handlers2) handlers2 = [handler6]; - else handlers2.push(handler6); - allHandlers.set(type, handlers2); - return this; - }, - off(type, handler6) { - let handlers2 = allHandlers.get(type); - if (handlers2) { - handlers2.splice(handlers2.indexOf(handler6) >>> 0, 1); +__name(getCurrentScope, "getCurrentScope"); +function onScopeDispose(fn) { + if (activeEffectScope) { + activeEffectScope.cleanups.push(fn); + } else if (false) { + warn$4( + `onScopeDispose() is called when there is no active effect scope to be associated with.` + ); + } +} +__name(onScopeDispose, "onScopeDispose"); +let activeEffect; +class ReactiveEffect { + static { + __name(this, "ReactiveEffect"); + } + constructor(fn, trigger2, scheduler, scope) { + this.fn = fn; + this.trigger = trigger2; + this.scheduler = scheduler; + this.active = true; + this.deps = []; + this._dirtyLevel = 4; + this._trackId = 0; + this._runnings = 0; + this._shouldSchedule = false; + this._depsLength = 0; + recordEffectScope(this, scope); + } + get dirty() { + if (this._dirtyLevel === 2 || this._dirtyLevel === 3) { + this._dirtyLevel = 1; + pauseTracking(); + for (let i2 = 0; i2 < this._depsLength; i2++) { + const dep = this.deps[i2]; + if (dep.computed) { + triggerComputed(dep.computed); + if (this._dirtyLevel >= 4) { + break; + } + } } - return this; - }, - emit(type, evt) { - let handlers2 = allHandlers.get(type); - if (handlers2) { - handlers2.slice().map((handler6) => { - handler6(evt); - }); + if (this._dirtyLevel === 1) { + this._dirtyLevel = 0; } - }, - clear() { - allHandlers.clear(); + resetTracking(); } - }; -} -__name(EventBus, "EventBus"); -var __defProp$1 = Object.defineProperty; -var __defProps = Object.defineProperties; -var __getOwnPropDescs = Object.getOwnPropertyDescriptors; -var __getOwnPropSymbols = Object.getOwnPropertySymbols; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __propIsEnum = Object.prototype.propertyIsEnumerable; -var __defNormalProp$1 = /* @__PURE__ */ __name((obj, key, value4) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value: value4 }) : obj[key] = value4, "__defNormalProp$1"); -var __spreadValues = /* @__PURE__ */ __name((a, b) => { - for (var prop2 in b || (b = {})) - if (__hasOwnProp.call(b, prop2)) - __defNormalProp$1(a, prop2, b[prop2]); - if (__getOwnPropSymbols) - for (var prop2 of __getOwnPropSymbols(b)) { - if (__propIsEnum.call(b, prop2)) - __defNormalProp$1(a, prop2, b[prop2]); + return this._dirtyLevel >= 4; + } + set dirty(v2) { + this._dirtyLevel = v2 ? 4 : 0; + } + run() { + this._dirtyLevel = 0; + if (!this.active) { + return this.fn(); } - return a; -}, "__spreadValues"); -var __spreadProps = /* @__PURE__ */ __name((a, b) => __defProps(a, __getOwnPropDescs(b)), "__spreadProps"); -var __objRest = /* @__PURE__ */ __name((source, exclude) => { - var target = {}; - for (var prop2 in source) - if (__hasOwnProp.call(source, prop2) && exclude.indexOf(prop2) < 0) - target[prop2] = source[prop2]; - if (source != null && __getOwnPropSymbols) - for (var prop2 of __getOwnPropSymbols(source)) { - if (exclude.indexOf(prop2) < 0 && __propIsEnum.call(source, prop2)) - target[prop2] = source[prop2]; + let lastShouldTrack = shouldTrack; + let lastEffect = activeEffect; + try { + shouldTrack = true; + activeEffect = this; + this._runnings++; + preCleanupEffect(this); + return this.fn(); + } finally { + postCleanupEffect(this); + this._runnings--; + activeEffect = lastEffect; + shouldTrack = lastShouldTrack; } - return target; -}, "__objRest"); -function definePreset(...presets) { - return mergeKeys(...presets); -} -__name(definePreset, "definePreset"); -var ThemeService = EventBus(); -var service_default = ThemeService; -function toTokenKey(str) { - return isString$8(str) ? str.replace(/[A-Z]/g, (c, i2) => i2 === 0 ? c : "." + c.toLowerCase()).toLowerCase() : str; -} -__name(toTokenKey, "toTokenKey"); -function merge$1(value1, value22) { - if (isArray$5(value1)) { - value1.push(...value22 || []); - } else if (isObject$7(value1)) { - Object.assign(value1, value22); } -} -__name(merge$1, "merge$1"); -function toValue$2(value4) { - return isObject$7(value4) && value4.hasOwnProperty("value") && value4.hasOwnProperty("type") ? value4.value : value4; -} -__name(toValue$2, "toValue$2"); -function toUnit(value4, variable = "") { - const excludedProperties = ["opacity", "z-index", "line-height", "font-weight", "flex", "flex-grow", "flex-shrink", "order"]; - if (!excludedProperties.some((property) => variable.endsWith(property))) { - const val = `${value4}`.trim(); - const valArr = val.split(" "); - return valArr.map((v2) => isNumber$5(v2) ? `${v2}px` : v2).join(" "); + stop() { + if (this.active) { + preCleanupEffect(this); + postCleanupEffect(this); + this.onStop && this.onStop(); + this.active = false; + } } - return value4; -} -__name(toUnit, "toUnit"); -function toNormalizePrefix(prefix2) { - return prefix2.replaceAll(/ /g, "").replace(/[^\w]/g, "-"); } -__name(toNormalizePrefix, "toNormalizePrefix"); -function toNormalizeVariable(prefix2 = "", variable = "") { - return toNormalizePrefix(`${isString$8(prefix2, false) && isString$8(variable, false) ? `${prefix2}-` : prefix2}${variable}`); +function triggerComputed(computed2) { + return computed2.value; } -__name(toNormalizeVariable, "toNormalizeVariable"); -function getVariableName(prefix2 = "", variable = "") { - return `--${toNormalizeVariable(prefix2, variable)}`; +__name(triggerComputed, "triggerComputed"); +function preCleanupEffect(effect2) { + effect2._trackId++; + effect2._depsLength = 0; } -__name(getVariableName, "getVariableName"); -function getVariableValue(value4, variable = "", prefix2 = "", excludedKeyRegexes = [], fallback) { - if (isString$8(value4)) { - const regex2 = /{([^}]*)}/g; - const val = value4.trim(); - if (matchRegex(val, regex2)) { - const _val = val.replaceAll(regex2, (v2) => { - const path = v2.replace(/{|}/g, ""); - const keys2 = path.split(".").filter((_v) => !excludedKeyRegexes.some((_r) => matchRegex(_v, _r))); - return `var(${getVariableName(prefix2, toKebabCase(keys2.join("-")))}${isNotEmpty(fallback) ? `, ${fallback}` : ""})`; - }); - const calculationRegex = /(\d+\s+[\+\-\*\/]\s+\d+)/g; - const cleanedVarRegex = /var\([^)]+\)/g; - return matchRegex(_val.replace(cleanedVarRegex, "0"), calculationRegex) ? `calc(${_val})` : _val; +__name(preCleanupEffect, "preCleanupEffect"); +function postCleanupEffect(effect2) { + if (effect2.deps.length > effect2._depsLength) { + for (let i2 = effect2._depsLength; i2 < effect2.deps.length; i2++) { + cleanupDepEffect(effect2.deps[i2], effect2); } - return toUnit(val, variable); - } else if (isNumber$5(value4)) { - return toUnit(value4, variable); + effect2.deps.length = effect2._depsLength; } - return void 0; } -__name(getVariableValue, "getVariableValue"); -function getComputedValue(obj = {}, value4) { - if (isString$8(value4)) { - const regex2 = /{([^}]*)}/g; - const val = value4.trim(); - return matchRegex(val, regex2) ? val.replaceAll(regex2, (v2) => getKeyValue(obj, v2.replace(/{|}/g, ""))) : val; - } else if (isNumber$5(value4)) { - return value4; +__name(postCleanupEffect, "postCleanupEffect"); +function cleanupDepEffect(dep, effect2) { + const trackId = dep.get(effect2); + if (trackId !== void 0 && effect2._trackId !== trackId) { + dep.delete(effect2); + if (dep.size === 0) { + dep.cleanup(); + } } - return void 0; } -__name(getComputedValue, "getComputedValue"); -function setProperty(properties, key, value4) { - if (isString$8(key, false)) { - properties.push(`${key}:${value4};`); +__name(cleanupDepEffect, "cleanupDepEffect"); +function effect(fn, options4) { + if (fn.effect instanceof ReactiveEffect) { + fn = fn.effect.fn; } -} -__name(setProperty, "setProperty"); -function getRule(selector, properties) { - if (selector) { - return `${selector}{${properties}}`; + const _effect = new ReactiveEffect(fn, NOOP, () => { + if (_effect.dirty) { + _effect.run(); + } + }); + if (options4) { + extend$1(_effect, options4); + if (options4.scope) recordEffectScope(_effect, options4.scope); } - return ""; -} -__name(getRule, "getRule"); -function normalizeColor(color2) { - if (color2.length === 4) { - return `#${color2[1]}${color2[1]}${color2[2]}${color2[2]}${color2[3]}${color2[3]}`; + if (!options4 || !options4.lazy) { + _effect.run(); } - return color2; + const runner = _effect.run.bind(_effect); + runner.effect = _effect; + return runner; } -__name(normalizeColor, "normalizeColor"); -function hexToRgb$1(hex) { - var bigint = parseInt(hex.substring(1), 16); - var r = bigint >> 16 & 255; - var g2 = bigint >> 8 & 255; - var b = bigint & 255; - return { r, g: g2, b }; +__name(effect, "effect"); +function stop(runner) { + runner.effect.stop(); } -__name(hexToRgb$1, "hexToRgb$1"); -function rgbToHex(r, g2, b) { - return `#${r.toString(16).padStart(2, "0")}${g2.toString(16).padStart(2, "0")}${b.toString(16).padStart(2, "0")}`; +__name(stop, "stop"); +let shouldTrack = true; +let pauseScheduleStack = 0; +const trackStack = []; +function pauseTracking() { + trackStack.push(shouldTrack); + shouldTrack = false; } -__name(rgbToHex, "rgbToHex"); -var mix_default = /* @__PURE__ */ __name((color1, color2, weight) => { - color1 = normalizeColor(color1); - color2 = normalizeColor(color2); - var p2 = weight / 100; - var w = p2 * 2 - 1; - var w1 = (w + 1) / 2; - var w2 = 1 - w1; - var rgb1 = hexToRgb$1(color1); - var rgb2 = hexToRgb$1(color2); - var r = Math.round(rgb1.r * w1 + rgb2.r * w2); - var g2 = Math.round(rgb1.g * w1 + rgb2.g * w2); - var b = Math.round(rgb1.b * w1 + rgb2.b * w2); - return rgbToHex(r, g2, b); -}, "mix_default"); -var shade_default = /* @__PURE__ */ __name((color2, percent) => mix_default("#000000", color2, percent), "shade_default"); -var tint_default = /* @__PURE__ */ __name((color2, percent) => mix_default("#ffffff", color2, percent), "tint_default"); -var scales = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950]; -var palette_default = /* @__PURE__ */ __name((color2) => { - if (/{([^}]*)}/g.test(color2)) { - const token = color2.replace(/{|}/g, ""); - return scales.reduce((acc, scale) => (acc[scale] = `{${token}.${scale}}`, acc), {}); +__name(pauseTracking, "pauseTracking"); +function enableTracking() { + trackStack.push(shouldTrack); + shouldTrack = true; +} +__name(enableTracking, "enableTracking"); +function resetTracking() { + const last = trackStack.pop(); + shouldTrack = last === void 0 ? true : last; +} +__name(resetTracking, "resetTracking"); +function pauseScheduling() { + pauseScheduleStack++; +} +__name(pauseScheduling, "pauseScheduling"); +function resetScheduling() { + pauseScheduleStack--; + while (!pauseScheduleStack && queueEffectSchedulers.length) { + queueEffectSchedulers.shift()(); } - return typeof color2 === "string" ? scales.reduce((acc, scale, i2) => (acc[scale] = i2 <= 5 ? tint_default(color2, (5 - i2) * 19) : shade_default(color2, (i2 - 5) * 15), acc), {}) : color2; -}, "palette_default"); -var $dt = /* @__PURE__ */ __name((tokenPath) => { +} +__name(resetScheduling, "resetScheduling"); +function trackEffect(effect2, dep, debuggerEventExtraInfo) { var _a2; - const theme40 = config_default.getTheme(); - const variable = dtwt(theme40, tokenPath, void 0, "variable"); - const name2 = (_a2 = variable.match(/--[\w-]+/g)) == null ? void 0 : _a2[0]; - const value4 = dtwt(theme40, tokenPath, void 0, "value"); - return { - name: name2, - variable, - value: value4 - }; -}, "$dt"); -var dt = /* @__PURE__ */ __name((...args) => { - return dtwt(config_default.getTheme(), ...args); -}, "dt"); -var dtwt = /* @__PURE__ */ __name((theme40 = {}, tokenPath, fallback, type = "variable") => { - if (tokenPath) { - const { variable: VARIABLE, options: OPTIONS } = config_default.defaults || {}; - const { prefix: prefix2, transform: transform2 } = (theme40 == null ? void 0 : theme40.options) || OPTIONS || {}; - const regex2 = /{([^}]*)}/g; - const token = matchRegex(tokenPath, regex2) ? tokenPath : `{${tokenPath}}`; - const isStrictTransform = type === "value" || transform2 === "strict"; - return isStrictTransform ? config_default.getTokenValue(tokenPath) : getVariableValue(token, void 0, prefix2, [VARIABLE.excludedKeyRegex], fallback); + if (dep.get(effect2) !== effect2._trackId) { + dep.set(effect2, effect2._trackId); + const oldDep = effect2.deps[effect2._depsLength]; + if (oldDep !== dep) { + if (oldDep) { + cleanupDepEffect(oldDep, effect2); + } + effect2.deps[effect2._depsLength++] = dep; + } else { + effect2._depsLength++; + } + if (false) { + (_a2 = effect2.onTrack) == null ? void 0 : _a2.call(effect2, extend$1({ effect: effect2 }, debuggerEventExtraInfo)); + } } - return ""; -}, "dtwt"); -function css$2(style2) { - return resolve$1(style2, { dt }); } -__name(css$2, "css$2"); -var $t = /* @__PURE__ */ __name((theme40 = {}) => { - let { preset: _preset, options: _options } = theme40; - return { - preset(value4) { - _preset = _preset ? mergeKeys(_preset, value4) : value4; - return this; - }, - options(value4) { - _options = _options ? __spreadValues(__spreadValues({}, _options), value4) : value4; - return this; - }, - // features - primaryPalette(primary) { - const { semantic } = _preset || {}; - _preset = __spreadProps(__spreadValues({}, _preset), { semantic: __spreadProps(__spreadValues({}, semantic), { primary }) }); - return this; - }, - surfacePalette(surface) { - var _a2, _b; - const { semantic } = _preset || {}; - const lightSurface = (surface == null ? void 0 : surface.hasOwnProperty("light")) ? surface == null ? void 0 : surface.light : surface; - const darkSurface = (surface == null ? void 0 : surface.hasOwnProperty("dark")) ? surface == null ? void 0 : surface.dark : surface; - const newColorScheme = { - colorScheme: { - light: __spreadValues(__spreadValues({}, (_a2 = semantic == null ? void 0 : semantic.colorScheme) == null ? void 0 : _a2.light), !!lightSurface && { surface: lightSurface }), - dark: __spreadValues(__spreadValues({}, (_b = semantic == null ? void 0 : semantic.colorScheme) == null ? void 0 : _b.dark), !!darkSurface && { surface: darkSurface }) - } - }; - _preset = __spreadProps(__spreadValues({}, _preset), { semantic: __spreadValues(__spreadValues({}, semantic), newColorScheme) }); - return this; - }, - // actions - define({ useDefaultPreset = false, useDefaultOptions = false } = {}) { - return { - preset: useDefaultPreset ? config_default.getPreset() : _preset, - options: useDefaultOptions ? config_default.getOptions() : _options - }; - }, - update({ mergePresets = true, mergeOptions: mergeOptions2 = true } = {}) { - const newTheme = { - preset: mergePresets ? mergeKeys(config_default.getPreset(), _preset) : _preset, - options: mergeOptions2 ? __spreadValues(__spreadValues({}, config_default.getOptions()), _options) : _options - }; - config_default.setTheme(newTheme); - return newTheme; - }, - use(options4) { - const newTheme = this.define(options4); - config_default.setTheme(newTheme); - return newTheme; +__name(trackEffect, "trackEffect"); +const queueEffectSchedulers = []; +function triggerEffects(dep, dirtyLevel, debuggerEventExtraInfo) { + var _a2; + pauseScheduling(); + for (const effect2 of dep.keys()) { + let tracking; + if (effect2._dirtyLevel < dirtyLevel && (tracking != null ? tracking : tracking = dep.get(effect2) === effect2._trackId)) { + effect2._shouldSchedule || (effect2._shouldSchedule = effect2._dirtyLevel === 0); + effect2._dirtyLevel = dirtyLevel; } - }; -}, "$t"); -function toVariables_default(theme40, options4 = {}) { - const VARIABLE = config_default.defaults.variable; - const { prefix: prefix2 = VARIABLE.prefix, selector = VARIABLE.selector, excludedKeyRegex = VARIABLE.excludedKeyRegex } = options4; - const _toVariables = /* @__PURE__ */ __name((_theme, _prefix = "") => { - return Object.entries(_theme).reduce( - (acc, [key, value4]) => { - const px = matchRegex(key, excludedKeyRegex) ? toNormalizeVariable(_prefix) : toNormalizeVariable(_prefix, toKebabCase(key)); - const v2 = toValue$2(value4); - if (isObject$7(v2)) { - const { variables: variables2, tokens: tokens2 } = _toVariables(v2, px); - merge$1(acc["tokens"], tokens2); - merge$1(acc["variables"], variables2); - } else { - acc["tokens"].push((prefix2 ? px.replace(`${prefix2}-`, "") : px).replaceAll("-", ".")); - setProperty(acc["variables"], getVariableName(px), getVariableValue(v2, px, prefix2, [excludedKeyRegex])); + if (effect2._shouldSchedule && (tracking != null ? tracking : tracking = dep.get(effect2) === effect2._trackId)) { + if (false) { + (_a2 = effect2.onTrigger) == null ? void 0 : _a2.call(effect2, extend$1({ effect: effect2 }, debuggerEventExtraInfo)); + } + effect2.trigger(); + if ((!effect2._runnings || effect2.allowRecurse) && effect2._dirtyLevel !== 2) { + effect2._shouldSchedule = false; + if (effect2.scheduler) { + queueEffectSchedulers.push(effect2.scheduler); } - return acc; - }, - { variables: [], tokens: [] } + } + } + } + resetScheduling(); +} +__name(triggerEffects, "triggerEffects"); +const createDep = /* @__PURE__ */ __name((cleanup, computed2) => { + const dep = /* @__PURE__ */ new Map(); + dep.cleanup = cleanup; + dep.computed = computed2; + return dep; +}, "createDep"); +const targetMap = /* @__PURE__ */ new WeakMap(); +const ITERATE_KEY = Symbol(false ? "iterate" : ""); +const MAP_KEY_ITERATE_KEY = Symbol(false ? "Map key iterate" : ""); +function track(target, type, key) { + if (shouldTrack && activeEffect) { + let depsMap = targetMap.get(target); + if (!depsMap) { + targetMap.set(target, depsMap = /* @__PURE__ */ new Map()); + } + let dep = depsMap.get(key); + if (!dep) { + depsMap.set(key, dep = createDep(() => depsMap.delete(key))); + } + trackEffect( + activeEffect, + dep, + false ? { + target, + type, + key + } : void 0 ); - }, "_toVariables"); - const { variables, tokens } = _toVariables(theme40, prefix2); - return { - value: variables, - tokens, - declarations: variables.join(""), - css: getRule(selector, variables.join("")) - }; + } } -__name(toVariables_default, "toVariables_default"); -var themeUtils_default = { - regex: { - rules: { - class: { - pattern: /^\.([a-zA-Z][\w-]*)$/, - resolve(value4) { - return { type: "class", selector: value4, matched: this.pattern.test(value4.trim()) }; - } - }, - attr: { - pattern: /^\[(.*)\]$/, - resolve(value4) { - return { type: "attr", selector: `:root${value4}`, matched: this.pattern.test(value4.trim()) }; - } - }, - media: { - pattern: /^@media (.*)$/, - resolve(value4) { - return { type: "media", selector: `${value4}{:root{[CSS]}}`, matched: this.pattern.test(value4.trim()) }; +__name(track, "track"); +function trigger(target, type, key, newValue2, oldValue2, oldTarget) { + const depsMap = targetMap.get(target); + if (!depsMap) { + return; + } + let deps = []; + if (type === "clear") { + deps = [...depsMap.values()]; + } else if (key === "length" && isArray$5(target)) { + const newLength = Number(newValue2); + depsMap.forEach((dep, key2) => { + if (key2 === "length" || !isSymbol$1(key2) && key2 >= newLength) { + deps.push(dep); + } + }); + } else { + if (key !== void 0) { + deps.push(depsMap.get(key)); + } + switch (type) { + case "add": + if (!isArray$5(target)) { + deps.push(depsMap.get(ITERATE_KEY)); + if (isMap(target)) { + deps.push(depsMap.get(MAP_KEY_ITERATE_KEY)); + } + } else if (isIntegerKey(key)) { + deps.push(depsMap.get("length")); } - }, - system: { - pattern: /^system$/, - resolve(value4) { - return { type: "system", selector: "@media (prefers-color-scheme: dark){:root{[CSS]}}", matched: this.pattern.test(value4.trim()) }; + break; + case "delete": + if (!isArray$5(target)) { + deps.push(depsMap.get(ITERATE_KEY)); + if (isMap(target)) { + deps.push(depsMap.get(MAP_KEY_ITERATE_KEY)); + } } - }, - custom: { - resolve(value4) { - return { type: "custom", selector: value4, matched: true }; + break; + case "set": + if (isMap(target)) { + deps.push(depsMap.get(ITERATE_KEY)); } - } - }, - resolve(value4) { - const rules = Object.keys(this.rules).filter((k) => k !== "custom").map((r) => this.rules[r]); - return [value4].flat().map((v2) => { - var _a2; - return (_a2 = rules.map((r) => r.resolve(v2)).find((rr) => rr.matched)) != null ? _a2 : this.rules.custom.resolve(v2); - }); + break; } - }, - _toVariables(theme40, options4) { - return toVariables_default(theme40, { prefix: options4 == null ? void 0 : options4.prefix }); - }, - getCommon({ name: name2 = "", theme: theme40 = {}, params, set: set3, defaults: defaults2 }) { - var _c, _d, _e, _f; - const { preset, options: options4 } = theme40; - let primitive_css, primitive_tokens, semantic_css, semantic_tokens; - if (isNotEmpty(preset)) { - const { primitive, semantic } = preset; - const _a2 = semantic || {}, { colorScheme } = _a2, sRest = __objRest(_a2, ["colorScheme"]); - const _b = colorScheme || {}, { dark: dark2 } = _b, csRest = __objRest(_b, ["dark"]); - const prim_var = isNotEmpty(primitive) ? this._toVariables({ primitive }, options4) : {}; - const sRest_var = isNotEmpty(sRest) ? this._toVariables({ semantic: sRest }, options4) : {}; - const csRest_var = isNotEmpty(csRest) ? this._toVariables({ light: csRest }, options4) : {}; - const dark_var = isNotEmpty(dark2) ? this._toVariables({ dark: dark2 }, options4) : {}; - const [prim_css, prim_tokens] = [(_c = prim_var.declarations) != null ? _c : "", prim_var.tokens]; - const [sRest_css, sRest_tokens] = [(_d = sRest_var.declarations) != null ? _d : "", sRest_var.tokens || []]; - const [csRest_css, csRest_tokens] = [(_e = csRest_var.declarations) != null ? _e : "", csRest_var.tokens || []]; - const [dark_css, dark_tokens] = [(_f = dark_var.declarations) != null ? _f : "", dark_var.tokens || []]; - primitive_css = this.transformCSS(name2, prim_css, "light", "variable", options4, set3, defaults2); - primitive_tokens = prim_tokens; - const semantic_light_css = this.transformCSS(name2, `${sRest_css}${csRest_css}color-scheme:light`, "light", "variable", options4, set3, defaults2); - const semantic_dark_css = this.transformCSS(name2, `${dark_css}color-scheme:dark`, "dark", "variable", options4, set3, defaults2); - semantic_css = `${semantic_light_css}${semantic_dark_css}`; - semantic_tokens = [.../* @__PURE__ */ new Set([...sRest_tokens, ...csRest_tokens, ...dark_tokens])]; + } + pauseScheduling(); + for (const dep of deps) { + if (dep) { + triggerEffects( + dep, + 4, + false ? { + target, + type, + key, + newValue: newValue2, + oldValue: oldValue2, + oldTarget + } : void 0 + ); } - return { - primitive: { - css: primitive_css, - tokens: primitive_tokens - }, - semantic: { - css: semantic_css, - tokens: semantic_tokens + } + resetScheduling(); +} +__name(trigger, "trigger"); +function getDepFromReactive(object, key) { + const depsMap = targetMap.get(object); + return depsMap && depsMap.get(key); +} +__name(getDepFromReactive, "getDepFromReactive"); +const isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`); +const builtInSymbols = new Set( + /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((key) => key !== "arguments" && key !== "caller").map((key) => Symbol[key]).filter(isSymbol$1) +); +const arrayInstrumentations = /* @__PURE__ */ createArrayInstrumentations(); +function createArrayInstrumentations() { + const instrumentations = {}; + ["includes", "indexOf", "lastIndexOf"].forEach((key) => { + instrumentations[key] = function(...args) { + const arr = toRaw(this); + for (let i2 = 0, l = this.length; i2 < l; i2++) { + track(arr, "get", i2 + ""); + } + const res = arr[key](...args); + if (res === -1 || res === false) { + return arr[key](...args.map(toRaw)); + } else { + return res; } }; - }, - getPreset({ name: name2 = "", preset = {}, options: options4, params, set: set3, defaults: defaults2, selector }) { - var _c, _d, _e; - const _name = name2.replace("-directive", ""); - const _a2 = preset, { colorScheme } = _a2, vRest = __objRest(_a2, ["colorScheme"]); - const _b = colorScheme || {}, { dark: dark2 } = _b, csRest = __objRest(_b, ["dark"]); - const vRest_var = isNotEmpty(vRest) ? this._toVariables({ [_name]: vRest }, options4) : {}; - const csRest_var = isNotEmpty(csRest) ? this._toVariables({ [_name]: csRest }, options4) : {}; - const dark_var = isNotEmpty(dark2) ? this._toVariables({ [_name]: dark2 }, options4) : {}; - const [vRest_css, vRest_tokens] = [(_c = vRest_var.declarations) != null ? _c : "", vRest_var.tokens || []]; - const [csRest_css, csRest_tokens] = [(_d = csRest_var.declarations) != null ? _d : "", csRest_var.tokens || []]; - const [dark_css, dark_tokens] = [(_e = dark_var.declarations) != null ? _e : "", dark_var.tokens || []]; - const tokens = [.../* @__PURE__ */ new Set([...vRest_tokens, ...csRest_tokens, ...dark_tokens])]; - const light_variable_css = this.transformCSS(_name, `${vRest_css}${csRest_css}`, "light", "variable", options4, set3, defaults2, selector); - const dark_variable_css = this.transformCSS(_name, dark_css, "dark", "variable", options4, set3, defaults2, selector); - return { - css: `${light_variable_css}${dark_variable_css}`, - tokens + }); + ["push", "pop", "shift", "unshift", "splice"].forEach((key) => { + instrumentations[key] = function(...args) { + pauseTracking(); + pauseScheduling(); + const res = toRaw(this)[key].apply(this, args); + resetScheduling(); + resetTracking(); + return res; }; - }, - getPresetC({ name: name2 = "", theme: theme40 = {}, params, set: set3, defaults: defaults2 }) { - var _a2; - const { preset, options: options4 } = theme40; - const cPreset = (_a2 = preset == null ? void 0 : preset.components) == null ? void 0 : _a2[name2]; - return this.getPreset({ name: name2, preset: cPreset, options: options4, params, set: set3, defaults: defaults2 }); - }, - getPresetD({ name: name2 = "", theme: theme40 = {}, params, set: set3, defaults: defaults2 }) { - var _a2; - const dName = name2.replace("-directive", ""); - const { preset, options: options4 } = theme40; - const dPreset = (_a2 = preset == null ? void 0 : preset.directives) == null ? void 0 : _a2[dName]; - return this.getPreset({ name: dName, preset: dPreset, options: options4, params, set: set3, defaults: defaults2 }); - }, - getColorSchemeOption(options4, defaults2) { - var _a2; - return this.regex.resolve((_a2 = options4.darkModeSelector) != null ? _a2 : defaults2.options.darkModeSelector); - }, - getLayerOrder(name2, options4 = {}, params, defaults2) { - const { cssLayer } = options4; - if (cssLayer) { - const order = resolve$1(cssLayer.order || "primeui", params); - return `@layer ${order}`; + }); + return instrumentations; +} +__name(createArrayInstrumentations, "createArrayInstrumentations"); +function hasOwnProperty$2(key) { + if (!isSymbol$1(key)) key = String(key); + const obj = toRaw(this); + track(obj, "has", key); + return obj.hasOwnProperty(key); +} +__name(hasOwnProperty$2, "hasOwnProperty$2"); +class BaseReactiveHandler { + static { + __name(this, "BaseReactiveHandler"); + } + constructor(_isReadonly = false, _isShallow = false) { + this._isReadonly = _isReadonly; + this._isShallow = _isShallow; + } + get(target, key, receiver) { + const isReadonly2 = this._isReadonly, isShallow2 = this._isShallow; + if (key === "__v_isReactive") { + return !isReadonly2; + } else if (key === "__v_isReadonly") { + return isReadonly2; + } else if (key === "__v_isShallow") { + return isShallow2; + } else if (key === "__v_raw") { + if (receiver === (isReadonly2 ? isShallow2 ? shallowReadonlyMap : readonlyMap : isShallow2 ? shallowReactiveMap : reactiveMap).get(target) || // receiver is not the reactive proxy, but has the same prototype + // this means the reciever is a user proxy of the reactive proxy + Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)) { + return target; + } + return; } - return ""; - }, - getCommonStyleSheet({ name: name2 = "", theme: theme40 = {}, params, props = {}, set: set3, defaults: defaults2 }) { - const common = this.getCommon({ name: name2, theme: theme40, params, set: set3, defaults: defaults2 }); - const _props = Object.entries(props).reduce((acc, [k, v2]) => acc.push(`${k}="${v2}"`) && acc, []).join(" "); - return Object.entries(common || {}).reduce((acc, [key, value4]) => { - if (value4 == null ? void 0 : value4.css) { - const _css = minifyCSS(value4 == null ? void 0 : value4.css); - const id3 = `${key}-variables`; - acc.push(``); + const targetIsArray = isArray$5(target); + if (!isReadonly2) { + if (targetIsArray && hasOwn$3(arrayInstrumentations, key)) { + return Reflect.get(arrayInstrumentations, key, receiver); } - return acc; - }, []).join(""); - }, - getStyleSheet({ name: name2 = "", theme: theme40 = {}, params, props = {}, set: set3, defaults: defaults2 }) { - var _a2; - const options4 = { name: name2, theme: theme40, params, set: set3, defaults: defaults2 }; - const preset_css = (_a2 = name2.includes("-directive") ? this.getPresetD(options4) : this.getPresetC(options4)) == null ? void 0 : _a2.css; - const _props = Object.entries(props).reduce((acc, [k, v2]) => acc.push(`${k}="${v2}"`) && acc, []).join(" "); - return preset_css ? `` : ""; - }, - createTokens(obj = {}, defaults2, parentKey = "", parentPath = "", tokens = {}) { - Object.entries(obj).forEach(([key, value4]) => { - const currentKey = matchRegex(key, defaults2.variable.excludedKeyRegex) ? parentKey : parentKey ? `${parentKey}.${toTokenKey$1(key)}` : toTokenKey$1(key); - const currentPath = parentPath ? `${parentPath}.${key}` : key; - if (isObject$7(value4)) { - this.createTokens(value4, defaults2, currentKey, currentPath, tokens); - } else { - tokens[currentKey] || (tokens[currentKey] = { - paths: [], - computed(colorScheme, tokenPathMap = {}) { - if (colorScheme) { - const path = this.paths.find((p2) => p2.scheme === colorScheme) || this.paths.find((p2) => p2.scheme === "none"); - return path == null ? void 0 : path.computed(colorScheme, tokenPathMap["binding"]); - } - return this.paths.map((p2) => p2.computed(p2.scheme, tokenPathMap[p2.scheme])); - } - }); - tokens[currentKey].paths.push({ - path: currentPath, - value: value4, - scheme: currentPath.includes("colorScheme.light") ? "light" : currentPath.includes("colorScheme.dark") ? "dark" : "none", - computed(colorScheme, tokenPathMap = {}) { - const regex2 = /{([^}]*)}/g; - let computedValue = value4; - tokenPathMap["name"] = this.path; - tokenPathMap["binding"] || (tokenPathMap["binding"] = {}); - if (matchRegex(value4, regex2)) { - const val = value4.trim(); - const _val = val.replaceAll(regex2, (v2) => { - var _a2, _b; - const path = v2.replace(/{|}/g, ""); - return (_b = (_a2 = tokens[path]) == null ? void 0 : _a2.computed(colorScheme, tokenPathMap)) == null ? void 0 : _b.value; - }); - const calculationRegex = /(\d+\w*\s+[\+\-\*\/]\s+\d+\w*)/g; - const cleanedVarRegex = /var\([^)]+\)/g; - computedValue = matchRegex(_val.replace(cleanedVarRegex, "0"), calculationRegex) ? `calc(${_val})` : _val; - } - isEmpty$1(tokenPathMap["binding"]) && delete tokenPathMap["binding"]; - return { - colorScheme, - path: this.path, - paths: tokenPathMap, - value: computedValue.includes("undefined") ? void 0 : computedValue - }; - } - }); + if (key === "hasOwnProperty") { + return hasOwnProperty$2; } - }); - return tokens; - }, - getTokenValue(tokens, path, defaults2) { - var _a2; - const normalizePath = /* @__PURE__ */ __name((str) => { - const strArr = str.split("."); - return strArr.filter((s) => !matchRegex(s.toLowerCase(), defaults2.variable.excludedKeyRegex)).join("."); - }, "normalizePath"); - const token = normalizePath(path); - const colorScheme = path.includes("colorScheme.light") ? "light" : path.includes("colorScheme.dark") ? "dark" : void 0; - const computedValues = [(_a2 = tokens[token]) == null ? void 0 : _a2.computed(colorScheme)].flat().filter((computed2) => computed2); - return computedValues.length === 1 ? computedValues[0].value : computedValues.reduce((acc = {}, computed2) => { - const _a22 = computed2, { colorScheme: cs } = _a22, rest = __objRest(_a22, ["colorScheme"]); - acc[cs] = rest; - return acc; - }, void 0); - }, - transformCSS(name2, css22, mode2, type, options4 = {}, set3, defaults2, selector) { - if (isNotEmpty(css22)) { - const { cssLayer } = options4; - if (type !== "style") { - const colorSchemeOption = this.getColorSchemeOption(options4, defaults2); - const _css = selector ? getRule(selector, css22) : css22; - css22 = mode2 === "dark" ? colorSchemeOption.reduce((acc, { selector: _selector }) => { - if (isNotEmpty(_selector)) { - acc += _selector.includes("[CSS]") ? _selector.replace("[CSS]", _css) : getRule(_selector, _css); - } - return acc; - }, "") : getRule(selector != null ? selector : ":root", css22); + } + const res = Reflect.get(target, key, receiver); + if (isSymbol$1(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) { + return res; + } + if (!isReadonly2) { + track(target, "get", key); + } + if (isShallow2) { + return res; + } + if (isRef(res)) { + return targetIsArray && isIntegerKey(key) ? res : res.value; + } + if (isObject$7(res)) { + return isReadonly2 ? readonly(res) : reactive(res); + } + return res; + } +} +class MutableReactiveHandler extends BaseReactiveHandler { + static { + __name(this, "MutableReactiveHandler"); + } + constructor(isShallow2 = false) { + super(false, isShallow2); + } + set(target, key, value3, receiver) { + let oldValue2 = target[key]; + if (!this._isShallow) { + const isOldValueReadonly = isReadonly(oldValue2); + if (!isShallow(value3) && !isReadonly(value3)) { + oldValue2 = toRaw(oldValue2); + value3 = toRaw(value3); } - if (cssLayer) { - const layerOptions = { - name: "primeui", - order: "primeui" - }; - isObject$7(cssLayer) && (layerOptions.name = resolve$1(cssLayer.name, { name: name2, type })); - if (isNotEmpty(layerOptions.name)) { - css22 = getRule(`@layer ${layerOptions.name}`, css22); - set3 == null ? void 0 : set3.layerNames(layerOptions.name); + if (!isArray$5(target) && isRef(oldValue2) && !isRef(value3)) { + if (isOldValueReadonly) { + return false; + } else { + oldValue2.value = value3; + return true; } } - return css22; } - return ""; + const hadKey = isArray$5(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn$3(target, key); + const result = Reflect.set(target, key, value3, receiver); + if (target === toRaw(receiver)) { + if (!hadKey) { + trigger(target, "add", key, value3); + } else if (hasChanged(value3, oldValue2)) { + trigger(target, "set", key, value3, oldValue2); + } + } + return result; } -}; -var config_default = { - defaults: { - variable: { - prefix: "p", - selector: ":root", - excludedKeyRegex: /^(primitive|semantic|components|directives|variables|colorscheme|light|dark|common|root|states)$/gi - }, - options: { - prefix: "p", - darkModeSelector: "system", - cssLayer: false + deleteProperty(target, key) { + const hadKey = hasOwn$3(target, key); + const oldValue2 = target[key]; + const result = Reflect.deleteProperty(target, key); + if (result && hadKey) { + trigger(target, "delete", key, void 0, oldValue2); } - }, - _theme: void 0, - _layerNames: /* @__PURE__ */ new Set(), - _loadedStyleNames: /* @__PURE__ */ new Set(), - _loadingStyles: /* @__PURE__ */ new Set(), - _tokens: {}, - update(newValues = {}) { - const { theme: theme40 } = newValues; - if (theme40) { - this._theme = __spreadProps(__spreadValues({}, theme40), { - options: __spreadValues(__spreadValues({}, this.defaults.options), theme40.options) - }); - this._tokens = themeUtils_default.createTokens(this.preset, this.defaults); - this.clearLoadedStyleNames(); + return result; + } + has(target, key) { + const result = Reflect.has(target, key); + if (!isSymbol$1(key) || !builtInSymbols.has(key)) { + track(target, "has", key); } - }, - get theme() { - return this._theme; - }, - get preset() { - var _a2; - return ((_a2 = this.theme) == null ? void 0 : _a2.preset) || {}; - }, - get options() { - var _a2; - return ((_a2 = this.theme) == null ? void 0 : _a2.options) || {}; - }, - get tokens() { - return this._tokens; - }, - getTheme() { - return this.theme; - }, - setTheme(newValue2) { - this.update({ theme: newValue2 }); - service_default.emit("theme:change", newValue2); - }, - getPreset() { - return this.preset; - }, - setPreset(newValue2) { - this._theme = __spreadProps(__spreadValues({}, this.theme), { preset: newValue2 }); - this._tokens = themeUtils_default.createTokens(newValue2, this.defaults); - this.clearLoadedStyleNames(); - service_default.emit("preset:change", newValue2); - service_default.emit("theme:change", this.theme); - }, - getOptions() { - return this.options; - }, - setOptions(newValue2) { - this._theme = __spreadProps(__spreadValues({}, this.theme), { options: newValue2 }); - this.clearLoadedStyleNames(); - service_default.emit("options:change", newValue2); - service_default.emit("theme:change", this.theme); - }, - getLayerNames() { - return [...this._layerNames]; - }, - setLayerNames(layerName) { - this._layerNames.add(layerName); - }, - getLoadedStyleNames() { - return this._loadedStyleNames; - }, - isStyleNameLoaded(name2) { - return this._loadedStyleNames.has(name2); - }, - setLoadedStyleName(name2) { - this._loadedStyleNames.add(name2); - }, - deleteLoadedStyleName(name2) { - this._loadedStyleNames.delete(name2); - }, - clearLoadedStyleNames() { - this._loadedStyleNames.clear(); - }, - getTokenValue(tokenPath) { - return themeUtils_default.getTokenValue(this.tokens, tokenPath, this.defaults); - }, - getCommon(name2 = "", params) { - return themeUtils_default.getCommon({ name: name2, theme: this.theme, params, defaults: this.defaults, set: { layerNames: this.setLayerNames.bind(this) } }); - }, - getComponent(name2 = "", params) { - const options4 = { name: name2, theme: this.theme, params, defaults: this.defaults, set: { layerNames: this.setLayerNames.bind(this) } }; - return themeUtils_default.getPresetC(options4); - }, - getDirective(name2 = "", params) { - const options4 = { name: name2, theme: this.theme, params, defaults: this.defaults, set: { layerNames: this.setLayerNames.bind(this) } }; - return themeUtils_default.getPresetD(options4); - }, - getCustomPreset(name2 = "", preset, selector, params) { - const options4 = { name: name2, preset, options: this.options, selector, params, defaults: this.defaults, set: { layerNames: this.setLayerNames.bind(this) } }; - return themeUtils_default.getPreset(options4); - }, - getLayerOrderCSS(name2 = "") { - return themeUtils_default.getLayerOrder(name2, this.options, { names: this.getLayerNames() }, this.defaults); - }, - transformCSS(name2 = "", css22, type = "style", mode2) { - return themeUtils_default.transformCSS(name2, css22, mode2, type, this.options, { layerNames: this.setLayerNames.bind(this) }, this.defaults); - }, - getCommonStyleSheet(name2 = "", params, props = {}) { - return themeUtils_default.getCommonStyleSheet({ name: name2, theme: this.theme, params, props, defaults: this.defaults, set: { layerNames: this.setLayerNames.bind(this) } }); - }, - getStyleSheet(name2, params, props = {}) { - return themeUtils_default.getStyleSheet({ name: name2, theme: this.theme, params, props, defaults: this.defaults, set: { layerNames: this.setLayerNames.bind(this) } }); - }, - onStyleMounted(name2) { - this._loadingStyles.add(name2); - }, - onStyleUpdated(name2) { - this._loadingStyles.add(name2); - }, - onStyleLoaded(event, { name: name2 }) { - if (this._loadingStyles.size) { - this._loadingStyles.delete(name2); - service_default.emit(`theme:${name2}:load`, event); - !this._loadingStyles.size && service_default.emit("theme:load"); + return result; + } + ownKeys(target) { + track( + target, + "iterate", + isArray$5(target) ? "length" : ITERATE_KEY + ); + return Reflect.ownKeys(target); + } +} +class ReadonlyReactiveHandler extends BaseReactiveHandler { + static { + __name(this, "ReadonlyReactiveHandler"); + } + constructor(isShallow2 = false) { + super(true, isShallow2); + } + set(target, key) { + if (false) { + warn$4( + `Set operation on key "${String(key)}" failed: target is readonly.`, + target + ); } + return true; + } + deleteProperty(target, key) { + if (false) { + warn$4( + `Delete operation on key "${String(key)}" failed: target is readonly.`, + target + ); + } + return true; } -}; -function updatePreset(...presets) { - const newPreset = mergeKeys(config_default.getPreset(), ...presets); - config_default.setPreset(newPreset); - return newPreset; } -__name(updatePreset, "updatePreset"); -function updatePrimaryPalette(primary) { - return $t().primaryPalette(primary).update().preset; +const mutableHandlers = /* @__PURE__ */ new MutableReactiveHandler(); +const readonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(); +const shallowReactiveHandlers = /* @__PURE__ */ new MutableReactiveHandler( + true +); +const shallowReadonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(true); +const toShallow = /* @__PURE__ */ __name((value3) => value3, "toShallow"); +const getProto = /* @__PURE__ */ __name((v2) => Reflect.getPrototypeOf(v2), "getProto"); +function get$3(target, key, isReadonly2 = false, isShallow2 = false) { + target = target["__v_raw"]; + const rawTarget = toRaw(target); + const rawKey = toRaw(key); + if (!isReadonly2) { + if (hasChanged(key, rawKey)) { + track(rawTarget, "get", key); + } + track(rawTarget, "get", rawKey); + } + const { has: has2 } = getProto(rawTarget); + const wrap2 = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive$1; + if (has2.call(rawTarget, key)) { + return wrap2(target.get(key)); + } else if (has2.call(rawTarget, rawKey)) { + return wrap2(target.get(rawKey)); + } else if (target !== rawTarget) { + target.get(key); + } } -__name(updatePrimaryPalette, "updatePrimaryPalette"); -function updateSurfacePalette(palette) { - return $t().surfacePalette(palette).update().preset; +__name(get$3, "get$3"); +function has$1(key, isReadonly2 = false) { + const target = this["__v_raw"]; + const rawTarget = toRaw(target); + const rawKey = toRaw(key); + if (!isReadonly2) { + if (hasChanged(key, rawKey)) { + track(rawTarget, "has", key); + } + track(rawTarget, "has", rawKey); + } + return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey); } -__name(updateSurfacePalette, "updateSurfacePalette"); -function usePreset(...presets) { - const newPreset = mergeKeys(...presets); - config_default.setPreset(newPreset); - return newPreset; +__name(has$1, "has$1"); +function size(target, isReadonly2 = false) { + target = target["__v_raw"]; + !isReadonly2 && track(toRaw(target), "iterate", ITERATE_KEY); + return Reflect.get(target, "size", target); } -__name(usePreset, "usePreset"); -function useTheme(theme40) { - return $t(theme40).update({ mergePresets: false }); +__name(size, "size"); +function add$1(value3) { + value3 = toRaw(value3); + const target = toRaw(this); + const proto = getProto(target); + const hadKey = proto.has.call(target, value3); + if (!hadKey) { + target.add(value3); + trigger(target, "add", value3, value3); + } + return this; } -__name(useTheme, "useTheme"); -var index$1n = { - root: { - transitionDuration: "{transition.duration}" - }, - panel: { - borderWidth: "0 0 1px 0", - borderColor: "{content.border.color}" - }, - header: { - color: "{text.muted.color}", - hoverColor: "{text.color}", - activeColor: "{text.color}", - padding: "1.125rem", - fontWeight: "600", - borderRadius: "0", - borderWidth: "0", - borderColor: "{content.border.color}", - background: "{content.background}", - hoverBackground: "{content.background}", - activeBackground: "{content.background}", - activeHoverBackground: "{content.background}", - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - color: "{focus.ring.color}", - offset: "{focus.ring.offset}", - shadow: "{focus.ring.shadow}" +__name(add$1, "add$1"); +function set$4(key, value3) { + value3 = toRaw(value3); + const target = toRaw(this); + const { has: has2, get: get22 } = getProto(target); + let hadKey = has2.call(target, key); + if (!hadKey) { + key = toRaw(key); + hadKey = has2.call(target, key); + } else if (false) { + checkIdentityKeys(target, has2, key); + } + const oldValue2 = get22.call(target, key); + target.set(key, value3); + if (!hadKey) { + trigger(target, "add", key, value3); + } else if (hasChanged(value3, oldValue2)) { + trigger(target, "set", key, value3, oldValue2); + } + return this; +} +__name(set$4, "set$4"); +function deleteEntry(key) { + const target = toRaw(this); + const { has: has2, get: get22 } = getProto(target); + let hadKey = has2.call(target, key); + if (!hadKey) { + key = toRaw(key); + hadKey = has2.call(target, key); + } else if (false) { + checkIdentityKeys(target, has2, key); + } + const oldValue2 = get22 ? get22.call(target, key) : void 0; + const result = target.delete(key); + if (hadKey) { + trigger(target, "delete", key, void 0, oldValue2); + } + return result; +} +__name(deleteEntry, "deleteEntry"); +function clear() { + const target = toRaw(this); + const hadItems = target.size !== 0; + const oldTarget = false ? isMap(target) ? new Map(target) : new Set(target) : void 0; + const result = target.clear(); + if (hadItems) { + trigger(target, "clear", void 0, void 0, oldTarget); + } + return result; +} +__name(clear, "clear"); +function createForEach(isReadonly2, isShallow2) { + return /* @__PURE__ */ __name(function forEach3(callback, thisArg) { + const observed = this; + const target = observed["__v_raw"]; + const rawTarget = toRaw(target); + const wrap2 = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive$1; + !isReadonly2 && track(rawTarget, "iterate", ITERATE_KEY); + return target.forEach((value3, key) => { + return callback.call(thisArg, wrap2(value3), wrap2(key), observed); + }); + }, "forEach"); +} +__name(createForEach, "createForEach"); +function createIterableMethod(method, isReadonly2, isShallow2) { + return function(...args) { + const target = this["__v_raw"]; + const rawTarget = toRaw(target); + const targetIsMap = isMap(rawTarget); + const isPair = method === "entries" || method === Symbol.iterator && targetIsMap; + const isKeyOnly = method === "keys" && targetIsMap; + const innerIterator = target[method](...args); + const wrap2 = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive$1; + !isReadonly2 && track( + rawTarget, + "iterate", + isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY + ); + return { + // iterator protocol + next() { + const { value: value3, done } = innerIterator.next(); + return done ? { value: value3, done } : { + value: isPair ? [wrap2(value3[0]), wrap2(value3[1])] : wrap2(value3), + done + }; + }, + // iterable protocol + [Symbol.iterator]() { + return this; + } + }; + }; +} +__name(createIterableMethod, "createIterableMethod"); +function createReadonlyMethod(type) { + return function(...args) { + if (false) { + const key = args[0] ? `on key "${args[0]}" ` : ``; + warn$4( + `${capitalize$1(type)} operation ${key}failed: target is readonly.`, + toRaw(this) + ); + } + return type === "delete" ? false : type === "clear" ? void 0 : this; + }; +} +__name(createReadonlyMethod, "createReadonlyMethod"); +function createInstrumentations() { + const mutableInstrumentations2 = { + get(key) { + return get$3(this, key); }, - toggleIcon: { - color: "{text.muted.color}", - hoverColor: "{text.color}", - activeColor: "{text.color}", - activeHoverColor: "{text.color}" + get size() { + return size(this); }, - first: { - topBorderRadius: "{content.border.radius}", - borderWidth: "0" + has: has$1, + add: add$1, + set: set$4, + delete: deleteEntry, + clear, + forEach: createForEach(false, false) + }; + const shallowInstrumentations2 = { + get(key) { + return get$3(this, key, false, true); }, - last: { - bottomBorderRadius: "{content.border.radius}", - activeBottomBorderRadius: "0" - } - }, - content: { - borderWidth: "0", - borderColor: "{content.border.color}", - background: "{content.background}", - color: "{text.color}", - padding: "0 1.125rem 1.125rem 1.125rem" - } -}; -var index$1m = { - root: { - background: "{form.field.background}", - disabledBackground: "{form.field.disabled.background}", - filledBackground: "{form.field.filled.background}", - filledFocusBackground: "{form.field.filled.focus.background}", - borderColor: "{form.field.border.color}", - hoverBorderColor: "{form.field.hover.border.color}", - focusBorderColor: "{form.field.focus.border.color}", - invalidBorderColor: "{form.field.invalid.border.color}", - color: "{form.field.color}", - disabledColor: "{form.field.disabled.color}", - placeholderColor: "{form.field.placeholder.color}", - shadow: "{form.field.shadow}", - paddingX: "{form.field.padding.x}", - paddingY: "{form.field.padding.y}", - borderRadius: "{form.field.border.radius}", - focusRing: { - width: "{form.field.focus.ring.width}", - style: "{form.field.focus.ring.style}", - color: "{form.field.focus.ring.color}", - offset: "{form.field.focus.ring.offset}", - shadow: "{form.field.focus.ring.shadow}" + get size() { + return size(this); }, - transitionDuration: "{form.field.transition.duration}" - }, - overlay: { - background: "{overlay.select.background}", - borderColor: "{overlay.select.border.color}", - borderRadius: "{overlay.select.border.radius}", - color: "{overlay.select.color}", - shadow: "{overlay.select.shadow}" - }, - list: { - padding: "{list.padding}", - gap: "{list.gap}" - }, - option: { - focusBackground: "{list.option.focus.background}", - selectedBackground: "{list.option.selected.background}", - selectedFocusBackground: "{list.option.selected.focus.background}", - color: "{list.option.color}", - focusColor: "{list.option.focus.color}", - selectedColor: "{list.option.selected.color}", - selectedFocusColor: "{list.option.selected.focus.color}", - padding: "{list.option.padding}", - borderRadius: "{list.option.border.radius}" - }, - optionGroup: { - background: "{list.option.group.background}", - color: "{list.option.group.color}", - fontWeight: "{list.option.group.font.weight}", - padding: "{list.option.group.padding}" - }, - dropdown: { - width: "2.5rem", - borderColor: "{form.field.border.color}", - hoverBorderColor: "{form.field.border.color}", - activeBorderColor: "{form.field.border.color}", - borderRadius: "{form.field.border.radius}", - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - color: "{focus.ring.color}", - offset: "{focus.ring.offset}", - shadow: "{focus.ring.shadow}" - } - }, - chip: { - borderRadius: "{border.radius.sm}" - }, - emptyMessage: { - padding: "{list.option.padding}" - }, - colorScheme: { - light: { - dropdown: { - background: "{surface.100}", - hoverBackground: "{surface.200}", - activeBackground: "{surface.300}", - color: "{surface.600}", - hoverColor: "{surface.700}", - activeColor: "{surface.800}" - } + has: has$1, + add: add$1, + set: set$4, + delete: deleteEntry, + clear, + forEach: createForEach(false, true) + }; + const readonlyInstrumentations2 = { + get(key) { + return get$3(this, key, true); }, - dark: { - dropdown: { - background: "{surface.800}", - hoverBackground: "{surface.700}", - activeBackground: "{surface.600}", - color: "{surface.300}", - hoverColor: "{surface.200}", - activeColor: "{surface.100}" - } + get size() { + return size(this, true); + }, + has(key) { + return has$1.call(this, key, true); + }, + add: createReadonlyMethod("add"), + set: createReadonlyMethod("set"), + delete: createReadonlyMethod("delete"), + clear: createReadonlyMethod("clear"), + forEach: createForEach(true, false) + }; + const shallowReadonlyInstrumentations2 = { + get(key) { + return get$3(this, key, true, true); + }, + get size() { + return size(this, true); + }, + has(key) { + return has$1.call(this, key, true); + }, + add: createReadonlyMethod("add"), + set: createReadonlyMethod("set"), + delete: createReadonlyMethod("delete"), + clear: createReadonlyMethod("clear"), + forEach: createForEach(true, true) + }; + const iteratorMethods = [ + "keys", + "values", + "entries", + Symbol.iterator + ]; + iteratorMethods.forEach((method) => { + mutableInstrumentations2[method] = createIterableMethod(method, false, false); + readonlyInstrumentations2[method] = createIterableMethod(method, true, false); + shallowInstrumentations2[method] = createIterableMethod(method, false, true); + shallowReadonlyInstrumentations2[method] = createIterableMethod( + method, + true, + true + ); + }); + return [ + mutableInstrumentations2, + readonlyInstrumentations2, + shallowInstrumentations2, + shallowReadonlyInstrumentations2 + ]; +} +__name(createInstrumentations, "createInstrumentations"); +const [ + mutableInstrumentations, + readonlyInstrumentations, + shallowInstrumentations, + shallowReadonlyInstrumentations +] = /* @__PURE__ */ createInstrumentations(); +function createInstrumentationGetter(isReadonly2, shallow) { + const instrumentations = shallow ? isReadonly2 ? shallowReadonlyInstrumentations : shallowInstrumentations : isReadonly2 ? readonlyInstrumentations : mutableInstrumentations; + return (target, key, receiver) => { + if (key === "__v_isReactive") { + return !isReadonly2; + } else if (key === "__v_isReadonly") { + return isReadonly2; + } else if (key === "__v_raw") { + return target; } - } + return Reflect.get( + hasOwn$3(instrumentations, key) && key in target ? instrumentations : target, + key, + receiver + ); + }; +} +__name(createInstrumentationGetter, "createInstrumentationGetter"); +const mutableCollectionHandlers = { + get: /* @__PURE__ */ createInstrumentationGetter(false, false) }; -var index$1l = { - root: { - width: "2rem", - height: "2rem", - fontSize: "1rem", - background: "{content.border.color}", - borderRadius: "{content.border.radius}" - }, - group: { - borderColor: "{content.background}", - offset: "-1rem" - }, - lg: { - width: "3rem", - height: "3rem", - fontSize: "1.5rem" - }, - xl: { - width: "4rem", - height: "4rem", - fontSize: "2rem" - } +const shallowCollectionHandlers = { + get: /* @__PURE__ */ createInstrumentationGetter(false, true) }; -var index$1k = { - root: { - borderRadius: "{border.radius.md}", - padding: "0 0.5rem", - fontSize: "0.75rem", - fontWeight: "700", - minWidth: "1.5rem", - height: "1.5rem" - }, - dot: { - size: "0.5rem" - }, - sm: { - fontSize: "0.625rem", - minWidth: "1.25rem", - height: "1.25rem" - }, - lg: { - fontSize: "0.875rem", - minWidth: "1.75rem", - height: "1.75rem" - }, - xl: { - fontSize: "1rem", - minWidth: "2rem", - height: "2rem" - }, - colorScheme: { - light: { - primary: { - background: "{primary.color}", - color: "{primary.contrast.color}" - }, - secondary: { - background: "{surface.100}", - color: "{surface.600}" - }, - success: { - background: "{green.500}", - color: "{surface.0}" - }, - info: { - background: "{sky.500}", - color: "{surface.0}" - }, - warn: { - background: "{orange.500}", - color: "{surface.0}" - }, - danger: { - background: "{red.500}", - color: "{surface.0}" - }, - contrast: { - background: "{surface.950}", - color: "{surface.0}" - } - }, - dark: { - primary: { - background: "{primary.color}", - color: "{primary.contrast.color}" - }, - secondary: { - background: "{surface.800}", - color: "{surface.300}" - }, - success: { - background: "{green.400}", - color: "{green.950}" - }, - info: { - background: "{sky.400}", - color: "{sky.950}" - }, - warn: { - background: "{orange.400}", - color: "{orange.950}" - }, - danger: { - background: "{red.400}", - color: "{red.950}" - }, - contrast: { - background: "{surface.0}", - color: "{surface.950}" - } - } - } +const readonlyCollectionHandlers = { + get: /* @__PURE__ */ createInstrumentationGetter(true, false) }; -var index$1j = { - root: { - borderRadius: "{content.border.radius}" - } +const shallowReadonlyCollectionHandlers = { + get: /* @__PURE__ */ createInstrumentationGetter(true, true) }; -var index$1i = { - root: { - padding: "1rem", - background: "{content.background}", - gap: "0.5rem", - transitionDuration: "{transition.duration}" - }, - item: { - color: "{text.muted.color}", - hoverColor: "{text.color}", - borderRadius: "{content.border.radius}", - gap: "{navigation.item.gap}", - icon: { - color: "{navigation.item.icon.color}", - hoverColor: "{navigation.item.icon.focus.color}" - }, - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - color: "{focus.ring.color}", - offset: "{focus.ring.offset}", - shadow: "{focus.ring.shadow}" - } - }, - separator: { - color: "{navigation.item.icon.color}" +function checkIdentityKeys(target, has2, key) { + const rawKey = toRaw(key); + if (rawKey !== key && has2.call(target, rawKey)) { + const type = toRawType(target); + warn$4( + `Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.` + ); } -}; -var index$1h = { - root: { - borderRadius: "{form.field.border.radius}", - roundedBorderRadius: "2rem", - gap: "0.5rem", - paddingX: "{form.field.padding.x}", - paddingY: "{form.field.padding.y}", - iconOnlyWidth: "2.5rem", - sm: { - fontSize: "0.875rem", - paddingX: "0.625rem", - paddingY: "0.375rem" - }, - lg: { - fontSize: "1.125rem", - paddingX: "0.875rem", - paddingY: "0.625rem" - }, - label: { - fontWeight: "500" - }, - raisedShadow: "0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12)", - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - offset: "{focus.ring.offset}" - }, - badgeSize: "1rem", - transitionDuration: "{form.field.transition.duration}" - }, - colorScheme: { - light: { - root: { - primary: { - background: "{primary.color}", - hoverBackground: "{primary.hover.color}", - activeBackground: "{primary.active.color}", - borderColor: "{primary.color}", - hoverBorderColor: "{primary.hover.color}", - activeBorderColor: "{primary.active.color}", - color: "{primary.contrast.color}", - hoverColor: "{primary.contrast.color}", - activeColor: "{primary.contrast.color}", - focusRing: { - color: "{primary.color}", - shadow: "none" - } - }, - secondary: { - background: "{surface.100}", - hoverBackground: "{surface.200}", - activeBackground: "{surface.300}", - borderColor: "{surface.100}", - hoverBorderColor: "{surface.200}", - activeBorderColor: "{surface.300}", - color: "{surface.600}", - hoverColor: "{surface.700}", - activeColor: "{surface.800}", - focusRing: { - color: "{surface.600}", - shadow: "none" - } - }, - info: { - background: "{sky.500}", - hoverBackground: "{sky.600}", - activeBackground: "{sky.700}", - borderColor: "{sky.500}", - hoverBorderColor: "{sky.600}", - activeBorderColor: "{sky.700}", - color: "#ffffff", - hoverColor: "#ffffff", - activeColor: "#ffffff", - focusRing: { - color: "{sky.500}", - shadow: "none" - } - }, - success: { - background: "{green.500}", - hoverBackground: "{green.600}", - activeBackground: "{green.700}", - borderColor: "{green.500}", - hoverBorderColor: "{green.600}", - activeBorderColor: "{green.700}", - color: "#ffffff", - hoverColor: "#ffffff", - activeColor: "#ffffff", - focusRing: { - color: "{green.500}", - shadow: "none" - } - }, - warn: { - background: "{orange.500}", - hoverBackground: "{orange.600}", - activeBackground: "{orange.700}", - borderColor: "{orange.500}", - hoverBorderColor: "{orange.600}", - activeBorderColor: "{orange.700}", - color: "#ffffff", - hoverColor: "#ffffff", - activeColor: "#ffffff", - focusRing: { - color: "{orange.500}", - shadow: "none" - } - }, - help: { - background: "{purple.500}", - hoverBackground: "{purple.600}", - activeBackground: "{purple.700}", - borderColor: "{purple.500}", - hoverBorderColor: "{purple.600}", - activeBorderColor: "{purple.700}", - color: "#ffffff", - hoverColor: "#ffffff", - activeColor: "#ffffff", - focusRing: { - color: "{purple.500}", - shadow: "none" - } - }, - danger: { - background: "{red.500}", - hoverBackground: "{red.600}", - activeBackground: "{red.700}", - borderColor: "{red.500}", - hoverBorderColor: "{red.600}", - activeBorderColor: "{red.700}", - color: "#ffffff", - hoverColor: "#ffffff", - activeColor: "#ffffff", - focusRing: { - color: "{red.500}", - shadow: "none" - } - }, - contrast: { - background: "{surface.950}", - hoverBackground: "{surface.900}", - activeBackground: "{surface.800}", - borderColor: "{surface.950}", - hoverBorderColor: "{surface.900}", - activeBorderColor: "{surface.800}", - color: "{surface.0}", - hoverColor: "{surface.0}", - activeColor: "{surface.0}", - focusRing: { - color: "{surface.950}", - shadow: "none" - } - } - }, - outlined: { - primary: { - hoverBackground: "{primary.50}", - activeBackground: "{primary.100}", - borderColor: "{primary.200}", - color: "{primary.color}" - }, - secondary: { - hoverBackground: "{surface.50}", - activeBackground: "{surface.100}", - borderColor: "{surface.200}", - color: "{surface.500}" - }, - success: { - hoverBackground: "{green.50}", - activeBackground: "{green.100}", - borderColor: "{green.200}", - color: "{green.500}" - }, - info: { - hoverBackground: "{sky.50}", - activeBackground: "{sky.100}", - borderColor: "{sky.200}", - color: "{sky.500}" - }, - warn: { - hoverBackground: "{orange.50}", - activeBackground: "{orange.100}", - borderColor: "{orange.200}", - color: "{orange.500}" - }, - help: { - hoverBackground: "{purple.50}", - activeBackground: "{purple.100}", - borderColor: "{purple.200}", - color: "{purple.500}" - }, - danger: { - hoverBackground: "{red.50}", - activeBackground: "{red.100}", - borderColor: "{red.200}", - color: "{red.500}" - }, - contrast: { - hoverBackground: "{surface.50}", - activeBackground: "{surface.100}", - borderColor: "{surface.700}", - color: "{surface.950}" - }, - plain: { - hoverBackground: "{surface.50}", - activeBackground: "{surface.100}", - borderColor: "{surface.200}", - color: "{surface.700}" - } - }, - text: { - primary: { - hoverBackground: "{primary.50}", - activeBackground: "{primary.100}", - color: "{primary.color}" - }, - secondary: { - hoverBackground: "{surface.50}", - activeBackground: "{surface.100}", - color: "{surface.500}" - }, - success: { - hoverBackground: "{green.50}", - activeBackground: "{green.100}", - color: "{green.500}" - }, - info: { - hoverBackground: "{sky.50}", - activeBackground: "{sky.100}", - color: "{sky.500}" - }, - warn: { - hoverBackground: "{orange.50}", - activeBackground: "{orange.100}", - color: "{orange.500}" - }, - help: { - hoverBackground: "{purple.50}", - activeBackground: "{purple.100}", - color: "{purple.500}" - }, - danger: { - hoverBackground: "{red.50}", - activeBackground: "{red.100}", - color: "{red.500}" - }, - plain: { - hoverBackground: "{surface.50}", - activeBackground: "{surface.100}", - color: "{surface.700}" - } - }, - link: { - color: "{primary.color}", - hoverColor: "{primary.color}", - activeColor: "{primary.color}" - } - }, - dark: { - root: { - primary: { - background: "{primary.color}", - hoverBackground: "{primary.hover.color}", - activeBackground: "{primary.active.color}", - borderColor: "{primary.color}", - hoverBorderColor: "{primary.hover.color}", - activeBorderColor: "{primary.active.color}", - color: "{primary.contrast.color}", - hoverColor: "{primary.contrast.color}", - activeColor: "{primary.contrast.color}", - focusRing: { - color: "{primary.color}", - shadow: "none" - } - }, - secondary: { - background: "{surface.800}", - hoverBackground: "{surface.700}", - activeBackground: "{surface.600}", - borderColor: "{surface.800}", - hoverBorderColor: "{surface.700}", - activeBorderColor: "{surface.600}", - color: "{surface.300}", - hoverColor: "{surface.200}", - activeColor: "{surface.100}", - focusRing: { - color: "{surface.300}", - shadow: "none" - } - }, - info: { - background: "{sky.400}", - hoverBackground: "{sky.300}", - activeBackground: "{sky.200}", - borderColor: "{sky.400}", - hoverBorderColor: "{sky.300}", - activeBorderColor: "{sky.200}", - color: "{sky.950}", - hoverColor: "{sky.950}", - activeColor: "{sky.950}", - focusRing: { - color: "{sky.400}", - shadow: "none" - } - }, - success: { - background: "{green.400}", - hoverBackground: "{green.300}", - activeBackground: "{green.200}", - borderColor: "{green.400}", - hoverBorderColor: "{green.300}", - activeBorderColor: "{green.200}", - color: "{green.950}", - hoverColor: "{green.950}", - activeColor: "{green.950}", - focusRing: { - color: "{green.400}", - shadow: "none" - } - }, - warn: { - background: "{orange.400}", - hoverBackground: "{orange.300}", - activeBackground: "{orange.200}", - borderColor: "{orange.400}", - hoverBorderColor: "{orange.300}", - activeBorderColor: "{orange.200}", - color: "{orange.950}", - hoverColor: "{orange.950}", - activeColor: "{orange.950}", - focusRing: { - color: "{orange.400}", - shadow: "none" - } - }, - help: { - background: "{purple.400}", - hoverBackground: "{purple.300}", - activeBackground: "{purple.200}", - borderColor: "{purple.400}", - hoverBorderColor: "{purple.300}", - activeBorderColor: "{purple.200}", - color: "{purple.950}", - hoverColor: "{purple.950}", - activeColor: "{purple.950}", - focusRing: { - color: "{purple.400}", - shadow: "none" - } - }, - danger: { - background: "{red.400}", - hoverBackground: "{red.300}", - activeBackground: "{red.200}", - borderColor: "{red.400}", - hoverBorderColor: "{red.300}", - activeBorderColor: "{red.200}", - color: "{red.950}", - hoverColor: "{red.950}", - activeColor: "{red.950}", - focusRing: { - color: "{red.400}", - shadow: "none" - } - }, - contrast: { - background: "{surface.0}", - hoverBackground: "{surface.100}", - activeBackground: "{surface.200}", - borderColor: "{surface.0}", - hoverBorderColor: "{surface.100}", - activeBorderColor: "{surface.200}", - color: "{surface.950}", - hoverColor: "{surface.950}", - activeColor: "{surface.950}", - focusRing: { - color: "{surface.0}", - shadow: "none" - } - } - }, - outlined: { - primary: { - hoverBackground: "color-mix(in srgb, {primary.color}, transparent 96%)", - activeBackground: "color-mix(in srgb, {primary.color}, transparent 84%)", - borderColor: "{primary.700}", - color: "{primary.color}" - }, - secondary: { - hoverBackground: "rgba(255,255,255,0.04)", - activeBackground: "rgba(255,255,255,0.16)", - borderColor: "{surface.700}", - color: "{surface.400}" - }, - success: { - hoverBackground: "color-mix(in srgb, {green.400}, transparent 96%)", - activeBackground: "color-mix(in srgb, {green.400}, transparent 84%)", - borderColor: "{green.700}", - color: "{green.400}" - }, - info: { - hoverBackground: "color-mix(in srgb, {sky.400}, transparent 96%)", - activeBackground: "color-mix(in srgb, {sky.400}, transparent 84%)", - borderColor: "{sky.700}", - color: "{sky.400}" - }, - warn: { - hoverBackground: "color-mix(in srgb, {orange.400}, transparent 96%)", - activeBackground: "color-mix(in srgb, {orange.400}, transparent 84%)", - borderColor: "{orange.700}", - color: "{orange.400}" - }, - help: { - hoverBackground: "color-mix(in srgb, {purple.400}, transparent 96%)", - activeBackground: "color-mix(in srgb, {purple.400}, transparent 84%)", - borderColor: "{purple.700}", - color: "{purple.400}" - }, - danger: { - hoverBackground: "color-mix(in srgb, {red.400}, transparent 96%)", - activeBackground: "color-mix(in srgb, {red.400}, transparent 84%)", - borderColor: "{red.700}", - color: "{red.400}" - }, - contrast: { - hoverBackground: "{surface.800}", - activeBackground: "{surface.700}", - borderColor: "{surface.500}", - color: "{surface.0}" - }, - plain: { - hoverBackground: "{surface.800}", - activeBackground: "{surface.700}", - borderColor: "{surface.600}", - color: "{surface.0}" - } - }, - text: { - primary: { - hoverBackground: "color-mix(in srgb, {primary.color}, transparent 96%)", - activeBackground: "color-mix(in srgb, {primary.color}, transparent 84%)", - color: "{primary.color}" - }, - secondary: { - hoverBackground: "{surface.800}", - activeBackground: "{surface.700}", - color: "{surface.400}" - }, - success: { - hoverBackground: "color-mix(in srgb, {green.400}, transparent 96%)", - activeBackground: "color-mix(in srgb, {green.400}, transparent 84%)", - color: "{green.400}" - }, - info: { - hoverBackground: "color-mix(in srgb, {sky.400}, transparent 96%)", - activeBackground: "color-mix(in srgb, {sky.400}, transparent 84%)", - color: "{sky.400}" - }, - warn: { - hoverBackground: "color-mix(in srgb, {orange.400}, transparent 96%)", - activeBackground: "color-mix(in srgb, {orange.400}, transparent 84%)", - color: "{orange.400}" - }, - help: { - hoverBackground: "color-mix(in srgb, {purple.400}, transparent 96%)", - activeBackground: "color-mix(in srgb, {purple.400}, transparent 84%)", - color: "{purple.400}" - }, - danger: { - hoverBackground: "color-mix(in srgb, {red.400}, transparent 96%)", - activeBackground: "color-mix(in srgb, {red.400}, transparent 84%)", - color: "{red.400}" - }, - plain: { - hoverBackground: "{surface.800}", - activeBackground: "{surface.700}", - color: "{surface.0}" - } - }, - link: { - color: "{primary.color}", - hoverColor: "{primary.color}", - activeColor: "{primary.color}" - } - } +} +__name(checkIdentityKeys, "checkIdentityKeys"); +const reactiveMap = /* @__PURE__ */ new WeakMap(); +const shallowReactiveMap = /* @__PURE__ */ new WeakMap(); +const readonlyMap = /* @__PURE__ */ new WeakMap(); +const shallowReadonlyMap = /* @__PURE__ */ new WeakMap(); +function targetTypeMap(rawType) { + switch (rawType) { + case "Object": + case "Array": + return 1; + case "Map": + case "Set": + case "WeakMap": + case "WeakSet": + return 2; + default: + return 0; } -}; -var index$1g = { - root: { - background: "{content.background}", - borderRadius: "{border.radius.xl}", - color: "{content.color}", - shadow: "0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1)" - }, - body: { - padding: "1.25rem", - gap: "0.5rem" - }, - caption: { - gap: "0.5rem" - }, - title: { - fontSize: "1.25rem", - fontWeight: "500" - }, - subtitle: { - color: "{text.muted.color}" +} +__name(targetTypeMap, "targetTypeMap"); +function getTargetType(value3) { + return value3["__v_skip"] || !Object.isExtensible(value3) ? 0 : targetTypeMap(toRawType(value3)); +} +__name(getTargetType, "getTargetType"); +function reactive(target) { + if (isReadonly(target)) { + return target; } -}; -var index$1f = { - root: { - transitionDuration: "{transition.duration}" - }, - content: { - gap: "0.25rem" - }, - indicatorList: { - padding: "1rem", - gap: "0.5rem" - }, - indicator: { - width: "2rem", - height: "0.5rem", - borderRadius: "{content.border.radius}", - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - color: "{focus.ring.color}", - offset: "{focus.ring.offset}", - shadow: "{focus.ring.shadow}" - } - }, - colorScheme: { - light: { - indicator: { - background: "{surface.200}", - hoverBackground: "{surface.300}", - activeBackground: "{primary.color}" - } - }, - dark: { - indicator: { - background: "{surface.700}", - hoverBackground: "{surface.600}", - activeBackground: "{primary.color}" - } + return createReactiveObject( + target, + false, + mutableHandlers, + mutableCollectionHandlers, + reactiveMap + ); +} +__name(reactive, "reactive"); +function shallowReactive(target) { + return createReactiveObject( + target, + false, + shallowReactiveHandlers, + shallowCollectionHandlers, + shallowReactiveMap + ); +} +__name(shallowReactive, "shallowReactive"); +function readonly(target) { + return createReactiveObject( + target, + true, + readonlyHandlers, + readonlyCollectionHandlers, + readonlyMap + ); +} +__name(readonly, "readonly"); +function shallowReadonly(target) { + return createReactiveObject( + target, + true, + shallowReadonlyHandlers, + shallowReadonlyCollectionHandlers, + shallowReadonlyMap + ); +} +__name(shallowReadonly, "shallowReadonly"); +function createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) { + if (!isObject$7(target)) { + if (false) { + warn$4( + `value cannot be made ${isReadonly2 ? "readonly" : "reactive"}: ${String( + target + )}` + ); } + return target; } -}; -var index$1e = { - root: { - background: "{form.field.background}", - disabledBackground: "{form.field.disabled.background}", - filledBackground: "{form.field.filled.background}", - filledFocusBackground: "{form.field.filled.focus.background}", - borderColor: "{form.field.border.color}", - hoverBorderColor: "{form.field.hover.border.color}", - focusBorderColor: "{form.field.focus.border.color}", - invalidBorderColor: "{form.field.invalid.border.color}", - color: "{form.field.color}", - disabledColor: "{form.field.disabled.color}", - placeholderColor: "{form.field.placeholder.color}", - shadow: "{form.field.shadow}", - paddingX: "{form.field.padding.x}", - paddingY: "{form.field.padding.y}", - borderRadius: "{form.field.border.radius}", - focusRing: { - width: "{form.field.focus.ring.width}", - style: "{form.field.focus.ring.style}", - color: "{form.field.focus.ring.color}", - offset: "{form.field.focus.ring.offset}", - shadow: "{form.field.focus.ring.shadow}" - }, - transitionDuration: "{form.field.transition.duration}" - }, - dropdown: { - width: "2.5rem", - color: "{form.field.icon.color}" - }, - overlay: { - background: "{overlay.select.background}", - borderColor: "{overlay.select.border.color}", - borderRadius: "{overlay.select.border.radius}", - color: "{overlay.select.color}", - shadow: "{overlay.select.shadow}" - }, - list: { - padding: "{list.padding}", - gap: "{list.gap}" - }, - option: { - focusBackground: "{list.option.focus.background}", - selectedBackground: "{list.option.selected.background}", - selectedFocusBackground: "{list.option.selected.focus.background}", - color: "{list.option.color}", - focusColor: "{list.option.focus.color}", - selectedColor: "{list.option.selected.color}", - selectedFocusColor: "{list.option.selected.focus.color}", - padding: "{list.option.padding}", - borderRadius: "{list.option.border.radius}", - icon: { - color: "{list.option.icon.color}", - focusColor: "{list.option.icon.focus.color}", - size: "0.875rem" - } + if (target["__v_raw"] && !(isReadonly2 && target["__v_isReactive"])) { + return target; } -}; -var index$1d = { - root: { - borderRadius: "{border.radius.sm}", - width: "1.25rem", - height: "1.25rem", - background: "{form.field.background}", - checkedBackground: "{primary.color}", - checkedHoverBackground: "{primary.hover.color}", - disabledBackground: "{form.field.disabled.background}", - filledBackground: "{form.field.filled.background}", - borderColor: "{form.field.border.color}", - hoverBorderColor: "{form.field.hover.border.color}", - focusBorderColor: "{form.field.border.color}", - checkedBorderColor: "{primary.color}", - checkedHoverBorderColor: "{primary.hover.color}", - checkedFocusBorderColor: "{primary.color}", - checkedDisabledBorderColor: "{form.field.border.color}", - invalidBorderColor: "{form.field.invalid.border.color}", - shadow: "{form.field.shadow}", - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - color: "{focus.ring.color}", - offset: "{focus.ring.offset}", - shadow: "{focus.ring.shadow}" - }, - transitionDuration: "{form.field.transition.duration}" - }, - icon: { - size: "0.875rem", - color: "{form.field.color}", - checkedColor: "{primary.contrast.color}", - checkedHoverColor: "{primary.contrast.color}", - disabledColor: "{form.field.disabled.color}" + const existingProxy = proxyMap.get(target); + if (existingProxy) { + return existingProxy; } -}; -var index$1c = { - root: { - borderRadius: "16px", - paddingX: "0.75rem", - paddingY: "0.5rem", - gap: "0.5rem", - transitionDuration: "{transition.duration}" - }, - image: { - width: "2rem", - height: "2rem" - }, - icon: { - size: "1rem" - }, - removeIcon: { - size: "1rem", - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - color: "{focus.ring.color}", - offset: "{focus.ring.offset}", - shadow: "{form.field.focus.ring.shadow}" - } - }, - colorScheme: { - light: { - root: { - background: "{surface.100}", - color: "{surface.800}" - }, - icon: { - color: "{surface.800}" - }, - removeIcon: { - color: "{surface.800}" - } - }, - dark: { - root: { - background: "{surface.800}", - color: "{surface.0}" - }, - icon: { - color: "{surface.0}" - }, - removeIcon: { - color: "{surface.0}" - } - } + const targetType = getTargetType(target); + if (targetType === 0) { + return target; } -}; -var index$1b = { - root: { - transitionDuration: "{transition.duration}" - }, - preview: { - width: "1.5rem", - height: "1.5rem", - borderRadius: "{form.field.border.radius}", - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - color: "{focus.ring.color}", - offset: "{focus.ring.offset}", - shadow: "{focus.ring.shadow}" + const proxy = new Proxy( + target, + targetType === 2 ? collectionHandlers : baseHandlers + ); + proxyMap.set(target, proxy); + return proxy; +} +__name(createReactiveObject, "createReactiveObject"); +function isReactive(value3) { + if (isReadonly(value3)) { + return isReactive(value3["__v_raw"]); + } + return !!(value3 && value3["__v_isReactive"]); +} +__name(isReactive, "isReactive"); +function isReadonly(value3) { + return !!(value3 && value3["__v_isReadonly"]); +} +__name(isReadonly, "isReadonly"); +function isShallow(value3) { + return !!(value3 && value3["__v_isShallow"]); +} +__name(isShallow, "isShallow"); +function isProxy(value3) { + return value3 ? !!value3["__v_raw"] : false; +} +__name(isProxy, "isProxy"); +function toRaw(observed) { + const raw = observed && observed["__v_raw"]; + return raw ? toRaw(raw) : observed; +} +__name(toRaw, "toRaw"); +function markRaw(value3) { + if (Object.isExtensible(value3)) { + def(value3, "__v_skip", true); + } + return value3; +} +__name(markRaw, "markRaw"); +const toReactive$1 = /* @__PURE__ */ __name((value3) => isObject$7(value3) ? reactive(value3) : value3, "toReactive$1"); +const toReadonly = /* @__PURE__ */ __name((value3) => isObject$7(value3) ? readonly(value3) : value3, "toReadonly"); +const COMPUTED_SIDE_EFFECT_WARN = `Computed is still dirty after getter evaluation, likely because a computed is mutating its own dependency in its getter. State mutations in computed getters should be avoided. Check the docs for more details: https://vuejs.org/guide/essentials/computed.html#getters-should-be-side-effect-free`; +class ComputedRefImpl { + static { + __name(this, "ComputedRefImpl"); + } + constructor(getter, _setter, isReadonly2, isSSR) { + this.getter = getter; + this._setter = _setter; + this.dep = void 0; + this.__v_isRef = true; + this["__v_isReadonly"] = false; + this.effect = new ReactiveEffect( + () => getter(this._value), + () => triggerRefValue( + this, + this.effect._dirtyLevel === 2 ? 2 : 3 + ) + ); + this.effect.computed = this; + this.effect.active = this._cacheable = !isSSR; + this["__v_isReadonly"] = isReadonly2; + } + get value() { + const self2 = toRaw(this); + if ((!self2._cacheable || self2.effect.dirty) && hasChanged(self2._value, self2._value = self2.effect.run())) { + triggerRefValue(self2, 4); } - }, - panel: { - shadow: "{overlay.popover.shadow}", - borderRadius: "{overlay.popover.borderRadius}" - }, - colorScheme: { - light: { - panel: { - background: "{surface.800}", - borderColor: "{surface.900}" - }, - handle: { - color: "{surface.0}" - } - }, - dark: { - panel: { - background: "{surface.900}", - borderColor: "{surface.700}" - }, - handle: { - color: "{surface.0}" + trackRefValue(self2); + if (self2.effect._dirtyLevel >= 2) { + if (false) { + warn$4(COMPUTED_SIDE_EFFECT_WARN, ` + +getter: `, this.getter); } + triggerRefValue(self2, 2); } + return self2._value; } -}; -var index$1a = { - icon: { - size: "2rem", - color: "{overlay.modal.color}" - }, - content: { - gap: "1rem" + set value(newValue2) { + this._setter(newValue2); } -}; -var index$19 = { - root: { - background: "{overlay.popover.background}", - borderColor: "{overlay.popover.border.color}", - color: "{overlay.popover.color}", - borderRadius: "{overlay.popover.border.radius}", - shadow: "{overlay.popover.shadow}", - gutter: "10px", - arrowOffset: "1.25rem" - }, - content: { - padding: "{overlay.popover.padding}", - gap: "1rem" - }, - icon: { - size: "1.5rem", - color: "{overlay.popover.color}" - }, - footer: { - gap: "0.5rem", - padding: "0 {overlay.popover.padding} {overlay.popover.padding} {overlay.popover.padding}" + // #region polyfill _dirty for backward compatibility third party code for Vue <= 3.3.x + get _dirty() { + return this.effect.dirty; } -}; -var index$18 = { - root: { - background: "{content.background}", - borderColor: "{content.border.color}", - color: "{content.color}", - borderRadius: "{content.border.radius}", - shadow: "{overlay.navigation.shadow}", - transitionDuration: "{transition.duration}" - }, - list: { - padding: "{navigation.list.padding}", - gap: "{navigation.list.gap}" - }, - item: { - focusBackground: "{navigation.item.focus.background}", - activeBackground: "{navigation.item.active.background}", - color: "{navigation.item.color}", - focusColor: "{navigation.item.focus.color}", - activeColor: "{navigation.item.active.color}", - padding: "{navigation.item.padding}", - borderRadius: "{navigation.item.border.radius}", - gap: "{navigation.item.gap}", - icon: { - color: "{navigation.item.icon.color}", - focusColor: "{navigation.item.icon.focus.color}", - activeColor: "{navigation.item.icon.active.color}" + set _dirty(v2) { + this.effect.dirty = v2; + } + // #endregion +} +function computed$1(getterOrOptions, debugOptions, isSSR = false) { + let getter; + let setter; + const onlyGetter = isFunction$5(getterOrOptions); + if (onlyGetter) { + getter = getterOrOptions; + setter = false ? () => { + warn$4("Write operation failed: computed value is readonly"); + } : NOOP; + } else { + getter = getterOrOptions.get; + setter = getterOrOptions.set; + } + const cRef = new ComputedRefImpl(getter, setter, onlyGetter || !setter, isSSR); + if (false) { + cRef.effect.onTrack = debugOptions.onTrack; + cRef.effect.onTrigger = debugOptions.onTrigger; + } + return cRef; +} +__name(computed$1, "computed$1"); +function trackRefValue(ref2) { + var _a2; + if (shouldTrack && activeEffect) { + ref2 = toRaw(ref2); + trackEffect( + activeEffect, + (_a2 = ref2.dep) != null ? _a2 : ref2.dep = createDep( + () => ref2.dep = void 0, + ref2 instanceof ComputedRefImpl ? ref2 : void 0 + ), + false ? { + target: ref2, + type: "get", + key: "value" + } : void 0 + ); + } +} +__name(trackRefValue, "trackRefValue"); +function triggerRefValue(ref2, dirtyLevel = 4, newVal, oldVal) { + ref2 = toRaw(ref2); + const dep = ref2.dep; + if (dep) { + triggerEffects( + dep, + dirtyLevel, + false ? { + target: ref2, + type: "set", + key: "value", + newValue: newVal, + oldValue: oldVal + } : void 0 + ); + } +} +__name(triggerRefValue, "triggerRefValue"); +function isRef(r) { + return !!(r && r.__v_isRef === true); +} +__name(isRef, "isRef"); +function ref(value3) { + return createRef(value3, false); +} +__name(ref, "ref"); +function shallowRef(value3) { + return createRef(value3, true); +} +__name(shallowRef, "shallowRef"); +function createRef(rawValue, shallow) { + if (isRef(rawValue)) { + return rawValue; + } + return new RefImpl(rawValue, shallow); +} +__name(createRef, "createRef"); +class RefImpl { + static { + __name(this, "RefImpl"); + } + constructor(value3, __v_isShallow) { + this.__v_isShallow = __v_isShallow; + this.dep = void 0; + this.__v_isRef = true; + this._rawValue = __v_isShallow ? value3 : toRaw(value3); + this._value = __v_isShallow ? value3 : toReactive$1(value3); + } + get value() { + trackRefValue(this); + return this._value; + } + set value(newVal) { + const useDirectValue = this.__v_isShallow || isShallow(newVal) || isReadonly(newVal); + newVal = useDirectValue ? newVal : toRaw(newVal); + if (hasChanged(newVal, this._rawValue)) { + const oldVal = this._rawValue; + this._rawValue = newVal; + this._value = useDirectValue ? newVal : toReactive$1(newVal); + triggerRefValue(this, 4, newVal, oldVal); } - }, - submenuIcon: { - size: "{navigation.submenu.icon.size}", - color: "{navigation.submenu.icon.color}", - focusColor: "{navigation.submenu.icon.focus.color}", - activeColor: "{navigation.submenu.icon.active.color}" - }, - separator: { - borderColor: "{content.border.color}" } +} +function triggerRef(ref2) { + triggerRefValue(ref2, 4, false ? ref2.value : void 0); +} +__name(triggerRef, "triggerRef"); +function unref(ref2) { + return isRef(ref2) ? ref2.value : ref2; +} +__name(unref, "unref"); +function toValue$2(source) { + return isFunction$5(source) ? source() : unref(source); +} +__name(toValue$2, "toValue$2"); +const shallowUnwrapHandlers = { + get: /* @__PURE__ */ __name((target, key, receiver) => unref(Reflect.get(target, key, receiver)), "get"), + set: /* @__PURE__ */ __name((target, key, value3, receiver) => { + const oldValue2 = target[key]; + if (isRef(oldValue2) && !isRef(value3)) { + oldValue2.value = value3; + return true; + } else { + return Reflect.set(target, key, value3, receiver); + } + }, "set") }; -var index$17 = { - root: { - transitionDuration: "{transition.duration}" - }, - header: { - background: "{content.background}", - borderColor: "{datatable.border.color}", - color: "{content.color}", - borderWidth: "0 0 1px 0", - padding: "0.75rem 1rem" - }, - headerCell: { - background: "{content.background}", - hoverBackground: "{content.hover.background}", - selectedBackground: "{highlight.background}", - borderColor: "{datatable.border.color}", - color: "{content.color}", - hoverColor: "{content.hover.color}", - selectedColor: "{highlight.color}", - gap: "0.5rem", - padding: "0.75rem 1rem", - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - color: "{focus.ring.color}", - offset: "-1px", - shadow: "{focus.ring.shadow}" +function proxyRefs(objectWithRefs) { + return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers); +} +__name(proxyRefs, "proxyRefs"); +class CustomRefImpl { + static { + __name(this, "CustomRefImpl"); + } + constructor(factory) { + this.dep = void 0; + this.__v_isRef = true; + const { get: get22, set: set22 } = factory( + () => trackRefValue(this), + () => triggerRefValue(this) + ); + this._get = get22; + this._set = set22; + } + get value() { + return this._get(); + } + set value(newVal) { + this._set(newVal); + } +} +function customRef(factory) { + return new CustomRefImpl(factory); +} +__name(customRef, "customRef"); +function toRefs$1(object) { + if (false) { + warn$4(`toRefs() expects a reactive object but received a plain one.`); + } + const ret = isArray$5(object) ? new Array(object.length) : {}; + for (const key in object) { + ret[key] = propertyToRef(object, key); + } + return ret; +} +__name(toRefs$1, "toRefs$1"); +class ObjectRefImpl { + static { + __name(this, "ObjectRefImpl"); + } + constructor(_object, _key, _defaultValue) { + this._object = _object; + this._key = _key; + this._defaultValue = _defaultValue; + this.__v_isRef = true; + } + get value() { + const val = this._object[this._key]; + return val === void 0 ? this._defaultValue : val; + } + set value(newVal) { + this._object[this._key] = newVal; + } + get dep() { + return getDepFromReactive(toRaw(this._object), this._key); + } +} +class GetterRefImpl { + static { + __name(this, "GetterRefImpl"); + } + constructor(_getter) { + this._getter = _getter; + this.__v_isRef = true; + this.__v_isReadonly = true; + } + get value() { + return this._getter(); + } +} +function toRef$1(source, key, defaultValue) { + if (isRef(source)) { + return source; + } else if (isFunction$5(source)) { + return new GetterRefImpl(source); + } else if (isObject$7(source) && arguments.length > 1) { + return propertyToRef(source, key, defaultValue); + } else { + return ref(source); + } +} +__name(toRef$1, "toRef$1"); +function propertyToRef(source, key, defaultValue) { + const val = source[key]; + return isRef(val) ? val : new ObjectRefImpl(source, key, defaultValue); +} +__name(propertyToRef, "propertyToRef"); +const deferredComputed = computed$1; +const TrackOpTypes = { + "GET": "get", + "HAS": "has", + "ITERATE": "iterate" +}; +const TriggerOpTypes = { + "SET": "set", + "ADD": "add", + "DELETE": "delete", + "CLEAR": "clear" +}; +const ReactiveFlags = { + "SKIP": "__v_skip", + "IS_REACTIVE": "__v_isReactive", + "IS_READONLY": "__v_isReadonly", + "IS_SHALLOW": "__v_isShallow", + "RAW": "__v_raw" +}; +/** +* @vue/runtime-core v3.4.31 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/ +const stack = []; +function pushWarningContext(vnode) { + stack.push(vnode); +} +__name(pushWarningContext, "pushWarningContext"); +function popWarningContext() { + stack.pop(); +} +__name(popWarningContext, "popWarningContext"); +function warn$1$1(msg, ...args) { + pauseTracking(); + const instance = stack.length ? stack[stack.length - 1].component : null; + const appWarnHandler = instance && instance.appContext.config.warnHandler; + const trace = getComponentTrace(); + if (appWarnHandler) { + callWithErrorHandling( + appWarnHandler, + instance, + 11, + [ + // eslint-disable-next-line no-restricted-syntax + msg + args.map((a) => { + var _a2, _b; + return (_b = (_a2 = a.toString) == null ? void 0 : _a2.call(a)) != null ? _b : JSON.stringify(a); + }).join(""), + instance && instance.proxy, + trace.map( + ({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>` + ).join("\n"), + trace + ] + ); + } else { + const warnArgs = [`[Vue warn]: ${msg}`, ...args]; + if (trace.length && // avoid spamming console during tests + true) { + warnArgs.push(` +`, ...formatTrace(trace)); } - }, - columnTitle: { - fontWeight: "600" - }, - row: { - background: "{content.background}", - hoverBackground: "{content.hover.background}", - selectedBackground: "{highlight.background}", - color: "{content.color}", - hoverColor: "{content.hover.color}", - selectedColor: "{highlight.color}", - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - color: "{focus.ring.color}", - offset: "-1px", - shadow: "{focus.ring.shadow}" + console.warn(...warnArgs); + } + resetTracking(); +} +__name(warn$1$1, "warn$1$1"); +function getComponentTrace() { + let currentVNode = stack[stack.length - 1]; + if (!currentVNode) { + return []; + } + const normalizedStack = []; + while (currentVNode) { + const last = normalizedStack[0]; + if (last && last.vnode === currentVNode) { + last.recurseCount++; + } else { + normalizedStack.push({ + vnode: currentVNode, + recurseCount: 0 + }); } - }, - bodyCell: { - borderColor: "{datatable.border.color}", - padding: "0.75rem 1rem" - }, - footerCell: { - background: "{content.background}", - borderColor: "{datatable.border.color}", - color: "{content.color}", - padding: "0.75rem 1rem" - }, - columnFooter: { - fontWeight: "600" - }, - footer: { - background: "{content.background}", - borderColor: "{datatable.border.color}", - color: "{content.color}", - borderWidth: "0 0 1px 0", - padding: "0.75rem 1rem" - }, - dropPointColor: "{primary.color}", - columnResizerWidth: "0.5rem", - resizeIndicator: { - width: "1px", - color: "{primary.color}" - }, - sortIcon: { - color: "{text.muted.color}", - hoverColor: "{text.hover.muted.color}" - }, - loadingIcon: { - size: "2rem" - }, - rowToggleButton: { - hoverBackground: "{content.hover.background}", - selectedHoverBackground: "{content.background}", - color: "{text.muted.color}", - hoverColor: "{text.color}", - selectedHoverColor: "{primary.color}", - size: "1.75rem", - borderRadius: "50%", - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - color: "{focus.ring.color}", - offset: "{focus.ring.offset}", - shadow: "{focus.ring.shadow}" + const parentInstance = currentVNode.component && currentVNode.component.parent; + currentVNode = parentInstance && parentInstance.vnode; + } + return normalizedStack; +} +__name(getComponentTrace, "getComponentTrace"); +function formatTrace(trace) { + const logs = []; + trace.forEach((entry, i2) => { + logs.push(...i2 === 0 ? [] : [` +`], ...formatTraceEntry(entry)); + }); + return logs; +} +__name(formatTrace, "formatTrace"); +function formatTraceEntry({ vnode, recurseCount }) { + const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``; + const isRoot = vnode.component ? vnode.component.parent == null : false; + const open2 = ` at <${formatComponentName( + vnode.component, + vnode.type, + isRoot + )}`; + const close5 = `>` + postfix; + return vnode.props ? [open2, ...formatProps(vnode.props), close5] : [open2 + close5]; +} +__name(formatTraceEntry, "formatTraceEntry"); +function formatProps(props) { + const res = []; + const keys2 = Object.keys(props); + keys2.slice(0, 3).forEach((key) => { + res.push(...formatProp(key, props[key])); + }); + if (keys2.length > 3) { + res.push(` ...`); + } + return res; +} +__name(formatProps, "formatProps"); +function formatProp(key, value3, raw) { + if (isString$8(value3)) { + value3 = JSON.stringify(value3); + return raw ? value3 : [`${key}=${value3}`]; + } else if (typeof value3 === "number" || typeof value3 === "boolean" || value3 == null) { + return raw ? value3 : [`${key}=${value3}`]; + } else if (isRef(value3)) { + value3 = formatProp(key, toRaw(value3.value), true); + return raw ? value3 : [`${key}=Ref<`, value3, `>`]; + } else if (isFunction$5(value3)) { + return [`${key}=fn${value3.name ? `<${value3.name}>` : ``}`]; + } else { + value3 = toRaw(value3); + return raw ? value3 : [`${key}=`, value3]; + } +} +__name(formatProp, "formatProp"); +function assertNumber(val, type) { + if (true) return; + if (val === void 0) { + return; + } else if (typeof val !== "number") { + warn$1$1(`${type} is not a valid number - got ${JSON.stringify(val)}.`); + } else if (isNaN(val)) { + warn$1$1(`${type} is NaN - the duration expression might be incorrect.`); + } +} +__name(assertNumber, "assertNumber"); +const ErrorCodes = { + "SETUP_FUNCTION": 0, + "0": "SETUP_FUNCTION", + "RENDER_FUNCTION": 1, + "1": "RENDER_FUNCTION", + "WATCH_GETTER": 2, + "2": "WATCH_GETTER", + "WATCH_CALLBACK": 3, + "3": "WATCH_CALLBACK", + "WATCH_CLEANUP": 4, + "4": "WATCH_CLEANUP", + "NATIVE_EVENT_HANDLER": 5, + "5": "NATIVE_EVENT_HANDLER", + "COMPONENT_EVENT_HANDLER": 6, + "6": "COMPONENT_EVENT_HANDLER", + "VNODE_HOOK": 7, + "7": "VNODE_HOOK", + "DIRECTIVE_HOOK": 8, + "8": "DIRECTIVE_HOOK", + "TRANSITION_HOOK": 9, + "9": "TRANSITION_HOOK", + "APP_ERROR_HANDLER": 10, + "10": "APP_ERROR_HANDLER", + "APP_WARN_HANDLER": 11, + "11": "APP_WARN_HANDLER", + "FUNCTION_REF": 12, + "12": "FUNCTION_REF", + "ASYNC_COMPONENT_LOADER": 13, + "13": "ASYNC_COMPONENT_LOADER", + "SCHEDULER": 14, + "14": "SCHEDULER" +}; +const ErrorTypeStrings$1 = { + ["sp"]: "serverPrefetch hook", + ["bc"]: "beforeCreate hook", + ["c"]: "created hook", + ["bm"]: "beforeMount hook", + ["m"]: "mounted hook", + ["bu"]: "beforeUpdate hook", + ["u"]: "updated", + ["bum"]: "beforeUnmount hook", + ["um"]: "unmounted hook", + ["a"]: "activated hook", + ["da"]: "deactivated hook", + ["ec"]: "errorCaptured hook", + ["rtc"]: "renderTracked hook", + ["rtg"]: "renderTriggered hook", + [0]: "setup function", + [1]: "render function", + [2]: "watcher getter", + [3]: "watcher callback", + [4]: "watcher cleanup function", + [5]: "native event handler", + [6]: "component event handler", + [7]: "vnode hook", + [8]: "directive hook", + [9]: "transition hook", + [10]: "app errorHandler", + [11]: "app warnHandler", + [12]: "ref function", + [13]: "async component loader", + [14]: "scheduler flush. This is likely a Vue internals bug. Please open an issue at https://github.com/vuejs/core ." +}; +function callWithErrorHandling(fn, instance, type, args) { + try { + return args ? fn(...args) : fn(); + } catch (err) { + handleError(err, instance, type); + } +} +__name(callWithErrorHandling, "callWithErrorHandling"); +function callWithAsyncErrorHandling(fn, instance, type, args) { + if (isFunction$5(fn)) { + const res = callWithErrorHandling(fn, instance, type, args); + if (res && isPromise$1(res)) { + res.catch((err) => { + handleError(err, instance, type); + }); } - }, - filter: { - inlineGap: "0.5rem", - overlaySelect: { - background: "{overlay.select.background}", - borderColor: "{overlay.select.border.color}", - borderRadius: "{overlay.select.border.radius}", - color: "{overlay.select.color}", - shadow: "{overlay.select.shadow}" - }, - overlayPopover: { - background: "{overlay.popover.background}", - borderColor: "{overlay.popover.border.color}", - borderRadius: "{overlay.popover.border.radius}", - color: "{overlay.popover.color}", - shadow: "{overlay.popover.shadow}", - padding: "{overlay.popover.padding}", - gap: "0.5rem" - }, - rule: { - borderColor: "{content.border.color}" - }, - constraintList: { - padding: "{list.padding}", - gap: "{list.gap}" - }, - constraint: { - focusBackground: "{list.option.focus.background}", - selectedBackground: "{list.option.selected.background}", - selectedFocusBackground: "{list.option.selected.focus.background}", - color: "{list.option.color}", - focusColor: "{list.option.focus.color}", - selectedColor: "{list.option.selected.color}", - selectedFocusColor: "{list.option.selected.focus.color}", - separator: { - borderColor: "{content.border.color}" - }, - padding: "{list.option.padding}", - borderRadius: "{list.option.border.radius}" + return res; + } + if (isArray$5(fn)) { + const values = []; + for (let i2 = 0; i2 < fn.length; i2++) { + values.push(callWithAsyncErrorHandling(fn[i2], instance, type, args)); } - }, - paginatorTop: { - borderColor: "{datatable.border.color}", - borderWidth: "0 0 1px 0" - }, - paginatorBottom: { - borderColor: "{datatable.border.color}", - borderWidth: "0 0 1px 0" - }, - colorScheme: { - light: { - root: { - borderColor: "{content.border.color}" - }, - row: { - stripedBackground: "{surface.50}" - }, - bodyCell: { - selectedBorderColor: "{primary.100}" - } - }, - dark: { - root: { - borderColor: "{surface.800}" - }, - row: { - stripedBackground: "{surface.950}" - }, - bodyCell: { - selectedBorderColor: "{primary.900}" + return values; + } else if (false) { + warn$1$1( + `Invalid value type passed to callWithAsyncErrorHandling(): ${typeof fn}` + ); + } +} +__name(callWithAsyncErrorHandling, "callWithAsyncErrorHandling"); +function handleError(err, instance, type, throwInDev = true) { + const contextVNode = instance ? instance.vnode : null; + if (instance) { + let cur = instance.parent; + const exposedInstance = instance.proxy; + const errorInfo = false ? ErrorTypeStrings$1[type] : `https://vuejs.org/error-reference/#runtime-${type}`; + while (cur) { + const errorCapturedHooks = cur.ec; + if (errorCapturedHooks) { + for (let i2 = 0; i2 < errorCapturedHooks.length; i2++) { + if (errorCapturedHooks[i2](err, exposedInstance, errorInfo) === false) { + return; + } + } } + cur = cur.parent; + } + const appErrorHandler = instance.appContext.config.errorHandler; + if (appErrorHandler) { + pauseTracking(); + callWithErrorHandling( + appErrorHandler, + null, + 10, + [err, exposedInstance, errorInfo] + ); + resetTracking(); + return; } } -}; -var index$16 = { - root: { - borderColor: "transparent", - borderWidth: "0", - borderRadius: "0", - padding: "0" - }, - header: { - background: "{content.background}", - color: "{content.color}", - borderColor: "{content.border.color}", - borderWidth: "0 0 1px 0", - padding: "0.75rem 1rem", - borderRadius: "0" - }, - content: { - background: "{content.background}", - color: "{content.color}", - borderColor: "transparent", - borderWidth: "0", - padding: "0", - borderRadius: "0" - }, - footer: { - background: "{content.background}", - color: "{content.color}", - borderColor: "{content.border.color}", - borderWidth: "1px 0 0 0", - padding: "0.75rem 1rem", - borderRadius: "0" - }, - paginatorTop: { - borderColor: "{content.border.color}", - borderWidth: "0 0 1px 0" - }, - paginatorBottom: { - borderColor: "{content.border.color}", - borderWidth: "1px 0 0 0" - } -}; -var index$15 = { - root: { - transitionDuration: "{transition.duration}" - }, - panel: { - background: "{content.background}", - borderColor: "{content.border.color}", - color: "{content.color}", - borderRadius: "{content.border.radius}", - shadow: "{overlay.popover.shadow}", - padding: "{overlay.popover.padding}" - }, - header: { - background: "{content.background}", - borderColor: "{content.border.color}", - color: "{content.color}", - padding: "0 0 0.5rem 0", - fontWeight: "500", - gap: "0.5rem" - }, - title: { - gap: "0.5rem", - fontWeight: "500" - }, - dropdown: { - width: "2.5rem", - borderColor: "{form.field.border.color}", - hoverBorderColor: "{form.field.border.color}", - activeBorderColor: "{form.field.border.color}", - borderRadius: "{form.field.border.radius}", - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - color: "{focus.ring.color}", - offset: "{focus.ring.offset}", - shadow: "{focus.ring.shadow}" + logError(err, type, contextVNode, throwInDev); +} +__name(handleError, "handleError"); +function logError(err, type, contextVNode, throwInDev = true) { + if (false) { + const info = ErrorTypeStrings$1[type]; + if (contextVNode) { + pushWarningContext(contextVNode); } - }, - inputIcon: { - color: "{form.field.icon.color}" - }, - selectMonth: { - hoverBackground: "{content.hover.background}", - color: "{content.color}", - hoverColor: "{content.hover.color}", - padding: "0.25rem 0.5rem", - borderRadius: "{content.border.radius}" - }, - selectYear: { - hoverBackground: "{content.hover.background}", - color: "{content.color}", - hoverColor: "{content.hover.color}", - padding: "0.25rem 0.5rem", - borderRadius: "{content.border.radius}" - }, - group: { - borderColor: "{content.border.color}", - gap: "{overlay.popover.padding}" - }, - dayView: { - margin: "0.5rem 0 0 0" - }, - weekDay: { - padding: "0.25rem", - fontWeight: "500", - color: "{content.color}" - }, - date: { - hoverBackground: "{content.hover.background}", - selectedBackground: "{primary.color}", - rangeSelectedBackground: "{highlight.background}", - color: "{content.color}", - hoverColor: "{content.hover.color}", - selectedColor: "{primary.contrast.color}", - rangeSelectedColor: "{highlight.color}", - width: "2rem", - height: "2rem", - borderRadius: "50%", - padding: "0.25rem", - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - color: "{focus.ring.color}", - offset: "{focus.ring.offset}", - shadow: "{focus.ring.shadow}" + warn$1$1(`Unhandled error${info ? ` during execution of ${info}` : ``}`); + if (contextVNode) { + popWarningContext(); } - }, - monthView: { - margin: "0.5rem 0 0 0" - }, - month: { - borderRadius: "{content.border.radius}" - }, - yearView: { - margin: "0.5rem 0 0 0" - }, - year: { - borderRadius: "{content.border.radius}" - }, - buttonbar: { - padding: "0.5rem 0 0 0", - borderColor: "{content.border.color}" - }, - timePicker: { - padding: "0.5rem 0 0 0", - borderColor: "{content.border.color}", - gap: "0.5rem", - buttonGap: "0.25rem" - }, - colorScheme: { - light: { - dropdown: { - background: "{surface.100}", - hoverBackground: "{surface.200}", - activeBackground: "{surface.300}", - color: "{surface.600}", - hoverColor: "{surface.700}", - activeColor: "{surface.800}" - }, - today: { - background: "{surface.200}", - color: "{surface.900}" - } - }, - dark: { - dropdown: { - background: "{surface.800}", - hoverBackground: "{surface.700}", - activeBackground: "{surface.600}", - color: "{surface.300}", - hoverColor: "{surface.200}", - activeColor: "{surface.100}" - }, - today: { - background: "{surface.700}", - color: "{surface.0}" - } + if (throwInDev) { + throw err; + } else { + console.error(err); } + } else { + console.error(err); } -}; -var index$14 = { - root: { - background: "{overlay.modal.background}", - borderColor: "{overlay.modal.border.color}", - color: "{overlay.modal.color}", - borderRadius: "{overlay.modal.border.radius}", - shadow: "{overlay.modal.shadow}" - }, - header: { - padding: "{overlay.modal.padding}", - gap: "0.5rem" - }, - title: { - fontSize: "1.25rem", - fontWeight: "600" - }, - content: { - padding: "0 {overlay.modal.padding} {overlay.modal.padding} {overlay.modal.padding}" - }, - footer: { - padding: "0 {overlay.modal.padding} {overlay.modal.padding} {overlay.modal.padding}", - gap: "0.5rem" +} +__name(logError, "logError"); +let isFlushing = false; +let isFlushPending = false; +const queue = []; +let flushIndex = 0; +const pendingPostFlushCbs = []; +let activePostFlushCbs = null; +let postFlushIndex = 0; +const resolvedPromise = /* @__PURE__ */ Promise.resolve(); +let currentFlushPromise = null; +const RECURSION_LIMIT = 100; +function nextTick(fn) { + const p2 = currentFlushPromise || resolvedPromise; + return fn ? p2.then(this ? fn.bind(this) : fn) : p2; +} +__name(nextTick, "nextTick"); +function findInsertionIndex$1(id3) { + let start2 = flushIndex + 1; + let end = queue.length; + while (start2 < end) { + const middle = start2 + end >>> 1; + const middleJob = queue[middle]; + const middleJobId = getId(middleJob); + if (middleJobId < id3 || middleJobId === id3 && middleJob.pre) { + start2 = middle + 1; + } else { + end = middle; + } } -}; -var index$13 = { - root: { - borderColor: "{content.border.color}" - }, - content: { - background: "{content.background}", - color: "{text.color}" - }, - horizontal: { - margin: "1rem 0", - padding: "0 1rem", - content: { - padding: "0 0.5rem" + return start2; +} +__name(findInsertionIndex$1, "findInsertionIndex$1"); +function queueJob(job) { + if (!queue.length || !queue.includes( + job, + isFlushing && job.allowRecurse ? flushIndex + 1 : flushIndex + )) { + if (job.id == null) { + queue.push(job); + } else { + queue.splice(findInsertionIndex$1(job.id), 0, job); } - }, - vertical: { - margin: "0 1rem", - padding: "0.5rem 0", - content: { - padding: "0.5rem 0" + queueFlush(); + } +} +__name(queueJob, "queueJob"); +function queueFlush() { + if (!isFlushing && !isFlushPending) { + isFlushPending = true; + currentFlushPromise = resolvedPromise.then(flushJobs); + } +} +__name(queueFlush, "queueFlush"); +function invalidateJob(job) { + const i2 = queue.indexOf(job); + if (i2 > flushIndex) { + queue.splice(i2, 1); + } +} +__name(invalidateJob, "invalidateJob"); +function queuePostFlushCb(cb) { + if (!isArray$5(cb)) { + if (!activePostFlushCbs || !activePostFlushCbs.includes( + cb, + cb.allowRecurse ? postFlushIndex + 1 : postFlushIndex + )) { + pendingPostFlushCbs.push(cb); } + } else { + pendingPostFlushCbs.push(...cb); } -}; -var index$12 = { - root: { - background: "rgba(255, 255, 255, 0.1)", - borderColor: "rgba(255, 255, 255, 0.2)", - padding: "0.5rem", - borderRadius: "{border.radius.xl}" - }, - item: { - borderRadius: "{content.border.radius}", - padding: "0.5rem", - size: "3rem", - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - color: "{focus.ring.color}", - offset: "{focus.ring.offset}", - shadow: "{focus.ring.shadow}" + queueFlush(); +} +__name(queuePostFlushCb, "queuePostFlushCb"); +function flushPreFlushCbs(instance, seen2, i2 = isFlushing ? flushIndex + 1 : 0) { + if (false) { + seen2 = seen2 || /* @__PURE__ */ new Map(); + } + for (; i2 < queue.length; i2++) { + const cb = queue[i2]; + if (cb && cb.pre) { + if (instance && cb.id !== instance.uid) { + continue; + } + if (false) { + continue; + } + queue.splice(i2, 1); + i2--; + cb(); } } -}; -var index$11 = { - root: { - background: "{overlay.modal.background}", - borderColor: "{overlay.modal.border.color}", - color: "{overlay.modal.color}", - borderRadius: "{overlay.modal.border.radius}", - shadow: "{overlay.modal.shadow}" - }, - header: { - padding: "{overlay.modal.padding}" - }, - title: { - fontSize: "1.5rem", - fontWeight: "600" - }, - content: { - padding: "0 {overlay.modal.padding} {overlay.modal.padding} {overlay.modal.padding}" +} +__name(flushPreFlushCbs, "flushPreFlushCbs"); +function flushPostFlushCbs(seen2) { + if (pendingPostFlushCbs.length) { + const deduped = [...new Set(pendingPostFlushCbs)].sort( + (a, b) => getId(a) - getId(b) + ); + pendingPostFlushCbs.length = 0; + if (activePostFlushCbs) { + activePostFlushCbs.push(...deduped); + return; + } + activePostFlushCbs = deduped; + if (false) { + seen2 = seen2 || /* @__PURE__ */ new Map(); + } + for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) { + const cb = activePostFlushCbs[postFlushIndex]; + if (false) { + continue; + } + if (cb.active !== false) cb(); + } + activePostFlushCbs = null; + postFlushIndex = 0; } -}; -var index$10 = { - toolbar: { - background: "{content.background}", - borderColor: "{content.border.color}", - borderRadius: "{content.border.radius}" - }, - toolbarItem: { - color: "{text.muted.color}", - hoverColor: "{text.color}", - activeColor: "{primary.color}" - }, - overlay: { - background: "{overlay.select.background}", - borderColor: "{overlay.select.border.color}", - borderRadius: "{overlay.select.border.radius}", - color: "{overlay.select.color}", - shadow: "{overlay.select.shadow}", - padding: "{list.padding}" - }, - overlayOption: { - focusBackground: "{list.option.focus.background}", - color: "{list.option.color}", - focusColor: "{list.option.focus.color}", - padding: "{list.option.padding}", - borderRadius: "{list.option.border.radius}" - }, - content: { - background: "{content.background}", - borderColor: "{content.border.color}", - color: "{content.color}", - borderRadius: "{content.border.radius}" +} +__name(flushPostFlushCbs, "flushPostFlushCbs"); +const getId = /* @__PURE__ */ __name((job) => job.id == null ? Infinity : job.id, "getId"); +const comparator = /* @__PURE__ */ __name((a, b) => { + const diff2 = getId(a) - getId(b); + if (diff2 === 0) { + if (a.pre && !b.pre) return -1; + if (b.pre && !a.pre) return 1; } -}; -var index$$ = { - root: { - background: "{content.background}", - borderColor: "{content.border.color}", - borderRadius: "{content.border.radius}", - color: "{content.color}", - padding: "0 1.125rem 1.125rem 1.125rem", - transitionDuration: "{transition.duration}" - }, - legend: { - background: "{content.background}", - hoverBackground: "{content.hover.background}", - color: "{content.color}", - hoverColor: "{content.hover.color}", - borderRadius: "{content.border.radius}", - borderWidth: "1px", - borderColor: "transparent", - padding: "0.5rem 0.75rem", - gap: "0.5rem", - fontWeight: "600", - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - color: "{focus.ring.color}", - offset: "{focus.ring.offset}", - shadow: "{focus.ring.shadow}" + return diff2; +}, "comparator"); +function flushJobs(seen2) { + isFlushPending = false; + isFlushing = true; + if (false) { + seen2 = seen2 || /* @__PURE__ */ new Map(); + } + queue.sort(comparator); + const check = false ? (job) => checkRecursiveUpdates(seen2, job) : NOOP; + try { + for (flushIndex = 0; flushIndex < queue.length; flushIndex++) { + const job = queue[flushIndex]; + if (job && job.active !== false) { + if (false) { + continue; + } + callWithErrorHandling(job, null, 14); + } + } + } finally { + flushIndex = 0; + queue.length = 0; + flushPostFlushCbs(seen2); + isFlushing = false; + currentFlushPromise = null; + if (queue.length || pendingPostFlushCbs.length) { + flushJobs(seen2); } - }, - toggleIcon: { - color: "{text.muted.color}", - hoverColor: "{text.hover.muted.color}" - }, - content: { - padding: "0" } -}; -var index$_ = { - root: { - background: "{content.background}", - borderColor: "{content.border.color}", - color: "{content.color}", - borderRadius: "{content.border.radius}", - transitionDuration: "{transition.duration}" - }, - header: { - background: "transparent", - color: "{text.color}", - padding: "1.125rem", - borderWidth: "0", - borderRadius: "0", - gap: "0.5rem" - }, - content: { - highlightBorderColor: "{primary.color}", - padding: "0 1.125rem 1.125rem 1.125rem" - }, - file: { - padding: "1rem", - gap: "1rem", - borderColor: "{content.border.color}", - info: { - gap: "0.5rem" +} +__name(flushJobs, "flushJobs"); +function checkRecursiveUpdates(seen2, fn) { + if (!seen2.has(fn)) { + seen2.set(fn, 1); + } else { + const count = seen2.get(fn); + if (count > RECURSION_LIMIT) { + const instance = fn.ownerInstance; + const componentName = instance && getComponentName(instance.type); + handleError( + `Maximum recursive updates exceeded${componentName ? ` in component <${componentName}>` : ``}. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.`, + null, + 10 + ); + return true; + } else { + seen2.set(fn, count + 1); } - }, - progressbar: { - height: "0.25rem" - }, - basic: { - gap: "0.5rem" } -}; -var index$Z = { - root: { - color: "{form.field.float.label.color}", - focusColor: "{form.field.float.label.focus.color}", - invalidColor: "{form.field.float.label.invalid.color}", - transitionDuration: "0.2s" +} +__name(checkRecursiveUpdates, "checkRecursiveUpdates"); +let isHmrUpdating = false; +const hmrDirtyComponents = /* @__PURE__ */ new Set(); +if (false) { + getGlobalThis$1().__VUE_HMR_RUNTIME__ = { + createRecord: tryWrap(createRecord), + rerender: tryWrap(rerender), + reload: tryWrap(reload) + }; +} +const map$1 = /* @__PURE__ */ new Map(); +function registerHMR(instance) { + const id3 = instance.type.__hmrId; + let record = map$1.get(id3); + if (!record) { + createRecord(id3, instance.type); + record = map$1.get(id3); } -}; -var index$Y = { - root: { - borderWidth: "1px", - borderColor: "{content.border.color}", - borderRadius: "{content.border.radius}", - transitionDuration: "{transition.duration}" - }, - navButton: { - background: "rgba(255, 255, 255, 0.1)", - hoverBackground: "rgba(255, 255, 255, 0.2)", - color: "{surface.100}", - hoverColor: "{surface.0}", - size: "3rem", - gutter: "0.5rem", - prev: { - borderRadius: "50%" - }, - next: { - borderRadius: "50%" - }, - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - color: "{focus.ring.color}", - offset: "{focus.ring.offset}", - shadow: "{focus.ring.shadow}" + record.instances.add(instance); +} +__name(registerHMR, "registerHMR"); +function unregisterHMR(instance) { + map$1.get(instance.type.__hmrId).instances.delete(instance); +} +__name(unregisterHMR, "unregisterHMR"); +function createRecord(id3, initialDef) { + if (map$1.has(id3)) { + return false; + } + map$1.set(id3, { + initialDef: normalizeClassComponent(initialDef), + instances: /* @__PURE__ */ new Set() + }); + return true; +} +__name(createRecord, "createRecord"); +function normalizeClassComponent(component) { + return isClassComponent(component) ? component.__vccOpts : component; +} +__name(normalizeClassComponent, "normalizeClassComponent"); +function rerender(id3, newRender) { + const record = map$1.get(id3); + if (!record) { + return; + } + record.initialDef.render = newRender; + [...record.instances].forEach((instance) => { + if (newRender) { + instance.render = newRender; + normalizeClassComponent(instance.type).render = newRender; } - }, - navIcon: { - size: "1.5rem" - }, - thumbnailsContent: { - background: "{content.background}", - padding: "1rem 0.25rem" - }, - thumbnailNavButton: { - size: "2rem", - borderRadius: "{content.border.radius}", - gutter: "0.5rem", - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - color: "{focus.ring.color}", - offset: "{focus.ring.offset}", - shadow: "{focus.ring.shadow}" + instance.renderCache = []; + isHmrUpdating = true; + instance.effect.dirty = true; + instance.update(); + isHmrUpdating = false; + }); +} +__name(rerender, "rerender"); +function reload(id3, newComp) { + const record = map$1.get(id3); + if (!record) return; + newComp = normalizeClassComponent(newComp); + updateComponentDef(record.initialDef, newComp); + const instances = [...record.instances]; + for (const instance of instances) { + const oldComp = normalizeClassComponent(instance.type); + if (!hmrDirtyComponents.has(oldComp)) { + if (oldComp !== record.initialDef) { + updateComponentDef(oldComp, newComp); + } + hmrDirtyComponents.add(oldComp); } - }, - thumbnailNavButtonIcon: { - size: "1rem" - }, - caption: { - background: "rgba(0, 0, 0, 0.5)", - color: "{surface.100}", - padding: "1rem" - }, - indicatorList: { - gap: "0.5rem", - padding: "1rem" - }, - indicatorButton: { - width: "1rem", - height: "1rem", - activeBackground: "{primary.color}", - borderRadius: "50%", - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - color: "{focus.ring.color}", - offset: "{focus.ring.offset}", - shadow: "{focus.ring.shadow}" + instance.appContext.propsCache.delete(instance.type); + instance.appContext.emitsCache.delete(instance.type); + instance.appContext.optionsCache.delete(instance.type); + if (instance.ceReload) { + hmrDirtyComponents.add(oldComp); + instance.ceReload(newComp.styles); + hmrDirtyComponents.delete(oldComp); + } else if (instance.parent) { + instance.parent.effect.dirty = true; + queueJob(() => { + instance.parent.update(); + hmrDirtyComponents.delete(oldComp); + }); + } else if (instance.appContext.reload) { + instance.appContext.reload(); + } else if (typeof window !== "undefined") { + window.location.reload(); + } else { + console.warn( + "[HMR] Root or manually mounted instance modified. Full reload required." + ); } - }, - insetIndicatorList: { - background: "rgba(0, 0, 0, 0.5)" - }, - insetIndicatorButton: { - background: "rgba(255, 255, 255, 0.4)", - hoverBackground: "rgba(255, 255, 255, 0.6)", - activeBackground: "rgba(255, 255, 255, 0.9)" - }, - mask: { - background: "{mask.background}", - color: "{mask.color}" - }, - closeButton: { - size: "3rem", - gutter: "0.5rem", - background: "rgba(255, 255, 255, 0.1)", - hoverBackground: "rgba(255, 255, 255, 0.2)", - color: "{surface.50}", - hoverColor: "{surface.0}", - borderRadius: "50%", - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - color: "{focus.ring.color}", - offset: "{focus.ring.offset}", - shadow: "{focus.ring.shadow}" + } + queuePostFlushCb(() => { + for (const instance of instances) { + hmrDirtyComponents.delete( + normalizeClassComponent(instance.type) + ); } - }, - closeButtonIcon: { - size: "1.5rem" - }, - colorScheme: { - light: { - thumbnailNavButton: { - hoverBackground: "{surface.100}", - color: "{surface.600}", - hoverColor: "{surface.700}" - }, - indicatorButton: { - background: "{surface.200}", - hoverBackground: "{surface.300}" + }); +} +__name(reload, "reload"); +function updateComponentDef(oldComp, newComp) { + extend$1(oldComp, newComp); + for (const key in oldComp) { + if (key !== "__file" && !(key in newComp)) { + delete oldComp[key]; + } + } +} +__name(updateComponentDef, "updateComponentDef"); +function tryWrap(fn) { + return (id3, arg) => { + try { + return fn(id3, arg); + } catch (e2) { + console.error(e2); + console.warn( + `[HMR] Something went wrong during Vue component hot-reload. Full reload required.` + ); + } + }; +} +__name(tryWrap, "tryWrap"); +let devtools$1; +let buffer = []; +let devtoolsNotInstalled = false; +function emit$1(event, ...args) { + if (devtools$1) { + devtools$1.emit(event, ...args); + } else if (!devtoolsNotInstalled) { + buffer.push({ event, args }); + } +} +__name(emit$1, "emit$1"); +function setDevtoolsHook$1(hook, target) { + var _a2, _b; + devtools$1 = hook; + if (devtools$1) { + devtools$1.enabled = true; + buffer.forEach(({ event, args }) => devtools$1.emit(event, ...args)); + buffer = []; + } else if ( + // handle late devtools injection - only do this if we are in an actual + // browser environment to avoid the timer handle stalling test runner exit + // (#4815) + typeof window !== "undefined" && // some envs mock window but not fully + window.HTMLElement && // also exclude jsdom + // eslint-disable-next-line no-restricted-syntax + !((_b = (_a2 = window.navigator) == null ? void 0 : _a2.userAgent) == null ? void 0 : _b.includes("jsdom")) + ) { + const replay = target.__VUE_DEVTOOLS_HOOK_REPLAY__ = target.__VUE_DEVTOOLS_HOOK_REPLAY__ || []; + replay.push((newHook) => { + setDevtoolsHook$1(newHook, target); + }); + setTimeout(() => { + if (!devtools$1) { + target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null; + devtoolsNotInstalled = true; + buffer = []; } - }, - dark: { - thumbnailNavButton: { - hoverBackground: "{surface.700}", - color: "{surface.400}", - hoverColor: "{surface.0}" - }, - indicatorButton: { - background: "{surface.700}", - hoverBackground: "{surface.600}" + }, 3e3); + } else { + devtoolsNotInstalled = true; + buffer = []; + } +} +__name(setDevtoolsHook$1, "setDevtoolsHook$1"); +function devtoolsInitApp(app2, version2) { + emit$1("app:init", app2, version2, { + Fragment: Fragment$1, + Text: Text$4, + Comment, + Static + }); +} +__name(devtoolsInitApp, "devtoolsInitApp"); +function devtoolsUnmountApp(app2) { + emit$1("app:unmount", app2); +} +__name(devtoolsUnmountApp, "devtoolsUnmountApp"); +const devtoolsComponentAdded = /* @__PURE__ */ createDevtoolsComponentHook( + "component:added" + /* COMPONENT_ADDED */ +); +const devtoolsComponentUpdated = /* @__PURE__ */ createDevtoolsComponentHook( + "component:updated" + /* COMPONENT_UPDATED */ +); +const _devtoolsComponentRemoved = /* @__PURE__ */ createDevtoolsComponentHook( + "component:removed" + /* COMPONENT_REMOVED */ +); +const devtoolsComponentRemoved = /* @__PURE__ */ __name((component) => { + if (devtools$1 && typeof devtools$1.cleanupBuffer === "function" && // remove the component if it wasn't buffered + !devtools$1.cleanupBuffer(component)) { + _devtoolsComponentRemoved(component); + } +}, "devtoolsComponentRemoved"); +/*! #__NO_SIDE_EFFECTS__ */ +// @__NO_SIDE_EFFECTS__ +function createDevtoolsComponentHook(hook) { + return (component) => { + emit$1( + hook, + component.appContext.app, + component.uid, + component.parent ? component.parent.uid : void 0, + component + ); + }; +} +__name(createDevtoolsComponentHook, "createDevtoolsComponentHook"); +const devtoolsPerfStart = /* @__PURE__ */ createDevtoolsPerformanceHook( + "perf:start" + /* PERFORMANCE_START */ +); +const devtoolsPerfEnd = /* @__PURE__ */ createDevtoolsPerformanceHook( + "perf:end" + /* PERFORMANCE_END */ +); +function createDevtoolsPerformanceHook(hook) { + return (component, type, time) => { + emit$1(hook, component.appContext.app, component.uid, component, type, time); + }; +} +__name(createDevtoolsPerformanceHook, "createDevtoolsPerformanceHook"); +function devtoolsComponentEmit(component, event, params) { + emit$1( + "component:emit", + component.appContext.app, + component, + event, + params + ); +} +__name(devtoolsComponentEmit, "devtoolsComponentEmit"); +function emit(instance, event, ...rawArgs) { + if (instance.isUnmounted) return; + const props = instance.vnode.props || EMPTY_OBJ; + if (false) { + const { + emitsOptions, + propsOptions: [propsOptions] + } = instance; + if (emitsOptions) { + if (!(event in emitsOptions) && true) { + if (!propsOptions || !(toHandlerKey(event) in propsOptions)) { + warn$1$1( + `Component emitted event "${event}" but it is neither declared in the emits option nor as an "${toHandlerKey(event)}" prop.` + ); + } + } else { + const validator3 = emitsOptions[event]; + if (isFunction$5(validator3)) { + const isValid2 = validator3(...rawArgs); + if (!isValid2) { + warn$1$1( + `Invalid event arguments: event validation failed for event "${event}".` + ); + } + } } } } -}; -var index$X = { - icon: { - color: "{form.field.icon.color}" - } -}; -var index$W = { - root: { - transitionDuration: "{transition.duration}" - }, - preview: { - icon: { - size: "1.5rem" - }, - mask: { - background: "{mask.background}", - color: "{mask.color}" + let args = rawArgs; + const isModelListener2 = event.startsWith("update:"); + const modelArg = isModelListener2 && event.slice(7); + if (modelArg && modelArg in props) { + const modifiersKey = `${modelArg === "modelValue" ? "model" : modelArg}Modifiers`; + const { number: number2, trim: trim2 } = props[modifiersKey] || EMPTY_OBJ; + if (trim2) { + args = rawArgs.map((a) => isString$8(a) ? a.trim() : a); } - }, - toolbar: { - position: { - left: "auto", - right: "1rem", - top: "1rem", - bottom: "auto" - }, - blur: "8px", - background: "rgba(255,255,255,0.1)", - borderColor: "rgba(255,255,255,0.2)", - borderWidth: "1px", - borderRadius: "30px", - padding: ".5rem", - gap: "0.5rem" - }, - action: { - hoverBackground: "rgba(255,255,255,0.1)", - color: "{surface.50}", - hoverColor: "{surface.0}", - size: "3rem", - iconSize: "1.5rem", - borderRadius: "50%", - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - color: "{focus.ring.color}", - offset: "{focus.ring.offset}", - shadow: "{focus.ring.shadow}" + if (number2) { + args = rawArgs.map(looseToNumber); } } -}; -var index$V = { - root: { - padding: "{form.field.padding.y} {form.field.padding.x}", - borderRadius: "{content.border.radius}", - gap: "0.5rem" - }, - text: { - fontWeight: "500" - }, - icon: { - size: "1rem" - }, - colorScheme: { - light: { - info: { - background: "color-mix(in srgb, {blue.50}, transparent 5%)", - borderColor: "{blue.200}", - color: "{blue.600}", - shadow: "0px 4px 8px 0px color-mix(in srgb, {blue.500}, transparent 96%)" - }, - success: { - background: "color-mix(in srgb, {green.50}, transparent 5%)", - borderColor: "{green.200}", - color: "{green.600}", - shadow: "0px 4px 8px 0px color-mix(in srgb, {green.500}, transparent 96%)" - }, - warn: { - background: "color-mix(in srgb,{yellow.50}, transparent 5%)", - borderColor: "{yellow.200}", - color: "{yellow.600}", - shadow: "0px 4px 8px 0px color-mix(in srgb, {yellow.500}, transparent 96%)" - }, - error: { - background: "color-mix(in srgb, {red.50}, transparent 5%)", - borderColor: "{red.200}", - color: "{red.600}", - shadow: "0px 4px 8px 0px color-mix(in srgb, {red.500}, transparent 96%)" - }, - secondary: { - background: "{surface.100}", - borderColor: "{surface.200}", - color: "{surface.600}", - shadow: "0px 4px 8px 0px color-mix(in srgb, {surface.500}, transparent 96%)" - }, - contrast: { - background: "{surface.900}", - borderColor: "{surface.950}", - color: "{surface.50}", - shadow: "0px 4px 8px 0px color-mix(in srgb, {surface.950}, transparent 96%)" - } - }, - dark: { - info: { - background: "color-mix(in srgb, {blue.500}, transparent 84%)", - borderColor: "color-mix(in srgb, {blue.700}, transparent 64%)", - color: "{blue.500}", - shadow: "0px 4px 8px 0px color-mix(in srgb, {blue.500}, transparent 96%)" - }, - success: { - background: "color-mix(in srgb, {green.500}, transparent 84%)", - borderColor: "color-mix(in srgb, {green.700}, transparent 64%)", - color: "{green.500}", - shadow: "0px 4px 8px 0px color-mix(in srgb, {green.500}, transparent 96%)" - }, - warn: { - background: "color-mix(in srgb, {yellow.500}, transparent 84%)", - borderColor: "color-mix(in srgb, {yellow.700}, transparent 64%)", - color: "{yellow.500}", - shadow: "0px 4px 8px 0px color-mix(in srgb, {yellow.500}, transparent 96%)" - }, - error: { - background: "color-mix(in srgb, {red.500}, transparent 84%)", - borderColor: "color-mix(in srgb, {red.700}, transparent 64%)", - color: "{red.500}", - shadow: "0px 4px 8px 0px color-mix(in srgb, {red.500}, transparent 96%)" - }, - secondary: { - background: "{surface.800}", - borderColor: "{surface.700}", - color: "{surface.300}", - shadow: "0px 4px 8px 0px color-mix(in srgb, {surface.500}, transparent 96%)" - }, - contrast: { - background: "{surface.0}", - borderColor: "{surface.100}", - color: "{surface.950}", - shadow: "0px 4px 8px 0px color-mix(in srgb, {surface.950}, transparent 96%)" - } + if (false) { + devtoolsComponentEmit(instance, event, args); + } + if (false) { + const lowerCaseEvent = event.toLowerCase(); + if (lowerCaseEvent !== event && props[toHandlerKey(lowerCaseEvent)]) { + warn$1$1( + `Event "${lowerCaseEvent}" is emitted in component ${formatComponentName( + instance, + instance.type + )} but the handler is registered for "${event}". Note that HTML attributes are case-insensitive and you cannot use v-on to listen to camelCase events when using in-DOM templates. You should probably use "${hyphenate$1( + event + )}" instead of "${event}".` + ); } } -}; -var index$U = { - root: { - padding: "{form.field.padding.y} {form.field.padding.x}", - borderRadius: "{content.border.radius}", - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - color: "{focus.ring.color}", - offset: "{focus.ring.offset}", - shadow: "{focus.ring.shadow}" - }, - transitionDuration: "{transition.duration}" - }, - display: { - hoverBackground: "{content.hover.background}", - hoverColor: "{content.hover.color}" + let handlerName; + let handler6 = props[handlerName = toHandlerKey(event)] || // also try camelCase event handler (#2249) + props[handlerName = toHandlerKey(camelize$1(event))]; + if (!handler6 && isModelListener2) { + handler6 = props[handlerName = toHandlerKey(hyphenate$1(event))]; } -}; -var index$T = { - root: { - background: "{form.field.background}", - disabledBackground: "{form.field.disabled.background}", - filledBackground: "{form.field.filled.background}", - filledFocusBackground: "{form.field.filled.focus.background}", - borderColor: "{form.field.border.color}", - hoverBorderColor: "{form.field.hover.border.color}", - focusBorderColor: "{form.field.focus.border.color}", - invalidBorderColor: "{form.field.invalid.border.color}", - color: "{form.field.color}", - disabledColor: "{form.field.disabled.color}", - placeholderColor: "{form.field.placeholder.color}", - shadow: "{form.field.shadow}", - paddingX: "{form.field.padding.x}", - paddingY: "{form.field.padding.y}", - borderRadius: "{form.field.border.radius}", - focusRing: { - width: "{form.field.focus.ring.width}", - style: "{form.field.focus.ring.style}", - color: "{form.field.focus.ring.color}", - offset: "{form.field.focus.ring.offset}", - shadow: "{form.field.focus.ring.shadow}" - }, - transitionDuration: "{form.field.transition.duration}" - }, - chip: { - borderRadius: "{border.radius.sm}" - }, - colorScheme: { - light: { - chip: { - focusBackground: "{surface.200}", - color: "{surface.800}" - } - }, - dark: { - chip: { - focusBackground: "{surface.700}", - color: "{surface.0}" - } + if (handler6) { + callWithAsyncErrorHandling( + handler6, + instance, + 6, + args + ); + } + const onceHandler = props[handlerName + `Once`]; + if (onceHandler) { + if (!instance.emitted) { + instance.emitted = {}; + } else if (instance.emitted[handlerName]) { + return; } + instance.emitted[handlerName] = true; + callWithAsyncErrorHandling( + onceHandler, + instance, + 6, + args + ); } -}; -var index$S = { - addon: { - background: "{form.field.background}", - borderColor: "{form.field.border.color}", - color: "{form.field.icon.color}", - borderRadius: "{form.field.border.radius}" +} +__name(emit, "emit"); +function normalizeEmitsOptions(comp, appContext, asMixin = false) { + const cache2 = appContext.emitsCache; + const cached = cache2.get(comp); + if (cached !== void 0) { + return cached; } -}; -var index$R = { - root: { - transitionDuration: "{transition.duration}" - }, - button: { - width: "2.5rem", - borderRadius: "{form.field.border.radius}", - verticalPadding: "{form.field.padding.y}" - }, - colorScheme: { - light: { - button: { - background: "transparent", - hoverBackground: "{surface.100}", - activeBackground: "{surface.200}", - borderColor: "{form.field.border.color}", - hoverBorderColor: "{form.field.border.color}", - activeBorderColor: "{form.field.border.color}", - color: "{surface.400}", - hoverColor: "{surface.500}", - activeColor: "{surface.600}" - } - }, - dark: { - button: { - background: "transparent", - hoverBackground: "{surface.800}", - activeBackground: "{surface.700}", - borderColor: "{form.field.border.color}", - hoverBorderColor: "{form.field.border.color}", - activeBorderColor: "{form.field.border.color}", - color: "{surface.400}", - hoverColor: "{surface.300}", - activeColor: "{surface.200}" + const raw = comp.emits; + let normalized = {}; + let hasExtends = false; + if (!isFunction$5(comp)) { + const extendEmits = /* @__PURE__ */ __name((raw2) => { + const normalizedFromExtend = normalizeEmitsOptions(raw2, appContext, true); + if (normalizedFromExtend) { + hasExtends = true; + extend$1(normalized, normalizedFromExtend); } + }, "extendEmits"); + if (!asMixin && appContext.mixins.length) { + appContext.mixins.forEach(extendEmits); } - } -}; -var index$Q = { - root: { - background: "{form.field.background}", - disabledBackground: "{form.field.disabled.background}", - filledBackground: "{form.field.filled.background}", - filledFocusBackground: "{form.field.filled.focus.background}", - borderColor: "{form.field.border.color}", - hoverBorderColor: "{form.field.hover.border.color}", - focusBorderColor: "{form.field.focus.border.color}", - invalidBorderColor: "{form.field.invalid.border.color}", - color: "{form.field.color}", - disabledColor: "{form.field.disabled.color}", - placeholderColor: "{form.field.placeholder.color}", - shadow: "{form.field.shadow}", - paddingX: "{form.field.padding.x}", - paddingY: "{form.field.padding.y}", - borderRadius: "{form.field.border.radius}", - focusRing: { - width: "{form.field.focus.ring.width}", - style: "{form.field.focus.ring.style}", - color: "{form.field.focus.ring.color}", - offset: "{form.field.focus.ring.offset}", - shadow: "{form.field.focus.ring.shadow}" - }, - transitionDuration: "{form.field.transition.duration}", - sm: { - fontSize: "0.875rem", - paddingX: "0.625rem", - paddingY: "0.375rem" - }, - lg: { - fontSize: "1.125rem", - paddingX: "0.875rem", - paddingY: "0.625rem" + if (comp.extends) { + extendEmits(comp.extends); } - } -}; -var index$P = { - root: { - transitionDuration: "{transition.duration}", - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - color: "{focus.ring.color}", - offset: "{focus.ring.offset}", - shadow: "{focus.ring.shadow}" + if (comp.mixins) { + comp.mixins.forEach(extendEmits); } - }, - value: { - background: "{primary.color}" - }, - range: { - background: "{content.border.color}" - }, - text: { - color: "{text.muted.color}" } -}; -var index$O = { - root: { - background: "{form.field.background}", - disabledBackground: "{form.field.disabled.background}", - borderColor: "{form.field.border.color}", - hoverBorderColor: "{form.field.hover.border.color}", - focusBorderColor: "{form.field.focus.border.color}", - invalidBorderColor: "{form.field.invalid.border.color}", - color: "{form.field.color}", - disabledColor: "{form.field.disabled.color}", - shadow: "{form.field.shadow}", - borderRadius: "{form.field.border.radius}", - focusRing: { - width: "{form.field.focus.ring.width}", - style: "{form.field.focus.ring.style}", - color: "{form.field.focus.ring.color}", - offset: "{form.field.focus.ring.offset}", - shadow: "{form.field.focus.ring.shadow}" - }, - transitionDuration: "{form.field.transition.duration}" - }, - list: { - padding: "{list.padding}", - gap: "{list.gap}", - header: { - padding: "{list.header.padding}" - } - }, - option: { - focusBackground: "{list.option.focus.background}", - selectedBackground: "{list.option.selected.background}", - selectedFocusBackground: "{list.option.selected.focus.background}", - color: "{list.option.color}", - focusColor: "{list.option.focus.color}", - selectedColor: "{list.option.selected.color}", - selectedFocusColor: "{list.option.selected.focus.color}", - padding: "{list.option.padding}", - borderRadius: "{list.option.border.radius}" - }, - optionGroup: { - background: "{list.option.group.background}", - color: "{list.option.group.color}", - fontWeight: "{list.option.group.font.weight}", - padding: "{list.option.group.padding}" - }, - checkmark: { - color: "{list.option.color}", - gutterStart: "-0.375rem", - gutterEnd: "0.375rem" - }, - emptyMessage: { - padding: "{list.option.padding}" - }, - colorScheme: { - light: { - option: { - stripedBackground: "{surface.50}" - } - }, - dark: { - option: { - stripedBackground: "{surface.900}" - } + if (!raw && !hasExtends) { + if (isObject$7(comp)) { + cache2.set(comp, null); } + return null; } -}; -var index$N = { - root: { - background: "{content.background}", - borderColor: "{content.border.color}", - borderRadius: "{content.border.radius}", - color: "{content.color}", - gap: "0.5rem", - verticalOrientation: { - padding: "{navigation.list.padding}", - gap: "0" - }, - horizontalOrientation: { - padding: "0.5rem 0.75rem" - }, - transitionDuration: "{transition.duration}" - }, - baseItem: { - borderRadius: "{content.border.radius}", - padding: "{navigation.item.padding}" - }, - item: { - focusBackground: "{navigation.item.focus.background}", - activeBackground: "{navigation.item.active.background}", - color: "{navigation.item.color}", - focusColor: "{navigation.item.focus.color}", - activeColor: "{navigation.item.active.color}", - padding: "{navigation.item.padding}", - borderRadius: "{navigation.item.border.radius}", - gap: "{navigation.item.gap}", - icon: { - color: "{navigation.item.icon.color}", - focusColor: "{navigation.item.icon.focus.color}", - activeColor: "{navigation.item.icon.active.color}" - } - }, - overlay: { - padding: "0", - background: "{content.background}", - borderColor: "{content.border.color}", - borderRadius: "{content.border.radius}", - color: "{content.color}", - shadow: "{overlay.navigation.shadow}", - gap: "0.5rem" - }, - submenu: { - padding: "{navigation.list.padding}", - gap: "{navigation.list.gap}" - }, - submenuLabel: { - padding: "{navigation.submenu.label.padding}", - fontWeight: "{navigation.submenu.label.font.weight}", - background: "{navigation.submenu.label.background.}", - color: "{navigation.submenu.label.color}" - }, - submenuIcon: { - size: "{navigation.submenu.icon.size}", - color: "{navigation.submenu.icon.color}", - focusColor: "{navigation.submenu.icon.focus.color}", - activeColor: "{navigation.submenu.icon.active.color}" - }, - separator: { - borderColor: "{content.border.color}" - }, - mobileButton: { - borderRadius: "50%", - size: "1.75rem", - color: "{text.muted.color}", - hoverColor: "{text.muted.hover.color}", - hoverBackground: "{content.hover.background}", - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - color: "{focus.ring.color}", - offset: "{focus.ring.offset}", - shadow: "{focus.ring.shadow}" - } + if (isArray$5(raw)) { + raw.forEach((key) => normalized[key] = null); + } else { + extend$1(normalized, raw); } -}; -var index$M = { - root: { - background: "{content.background}", - borderColor: "{content.border.color}", - color: "{content.color}", - borderRadius: "{content.border.radius}", - shadow: "{overlay.navigation.shadow}", - transitionDuration: "{transition.duration}" - }, - list: { - padding: "{navigation.list.padding}", - gap: "{navigation.list.gap}" - }, - item: { - focusBackground: "{navigation.item.focus.background}", - color: "{navigation.item.color}", - focusColor: "{navigation.item.focus.color}", - padding: "{navigation.item.padding}", - borderRadius: "{navigation.item.border.radius}", - gap: "{navigation.item.gap}", - icon: { - color: "{navigation.item.icon.color}", - focusColor: "{navigation.item.icon.focus.color}" - } - }, - submenuLabel: { - padding: "{navigation.submenu.label.padding}", - fontWeight: "{navigation.submenu.label.font.weight}", - background: "{navigation.submenu.label.background}", - color: "{navigation.submenu.label.color}" - }, - separator: { - borderColor: "{content.border.color}" + if (isObject$7(comp)) { + cache2.set(comp, normalized); } -}; -var index$L = { - root: { - background: "{content.background}", - borderColor: "{content.border.color}", - borderRadius: "{content.border.radius}", - color: "{content.color}", - gap: "0.5rem", - padding: "0.5rem 0.75rem", - transitionDuration: "{transition.duration}" - }, - baseItem: { - borderRadius: "{content.border.radius}", - padding: "{navigation.item.padding}" - }, - item: { - focusBackground: "{navigation.item.focus.background}", - activeBackground: "{navigation.item.active.background}", - color: "{navigation.item.color}", - focusColor: "{navigation.item.focus.color}", - activeColor: "{navigation.item.active.color}", - padding: "{navigation.item.padding}", - borderRadius: "{navigation.item.border.radius}", - gap: "{navigation.item.gap}", - icon: { - color: "{navigation.item.icon.color}", - focusColor: "{navigation.item.icon.focus.color}", - activeColor: "{navigation.item.icon.active.color}" + return normalized; +} +__name(normalizeEmitsOptions, "normalizeEmitsOptions"); +function isEmitListener(options4, key) { + if (!options4 || !isOn(key)) { + return false; + } + key = key.slice(2).replace(/Once$/, ""); + return hasOwn$3(options4, key[0].toLowerCase() + key.slice(1)) || hasOwn$3(options4, hyphenate$1(key)) || hasOwn$3(options4, key); +} +__name(isEmitListener, "isEmitListener"); +let currentRenderingInstance = null; +let currentScopeId = null; +function setCurrentRenderingInstance(instance) { + const prev2 = currentRenderingInstance; + currentRenderingInstance = instance; + currentScopeId = instance && instance.type.__scopeId || null; + return prev2; +} +__name(setCurrentRenderingInstance, "setCurrentRenderingInstance"); +function pushScopeId(id3) { + currentScopeId = id3; +} +__name(pushScopeId, "pushScopeId"); +function popScopeId() { + currentScopeId = null; +} +__name(popScopeId, "popScopeId"); +const withScopeId = /* @__PURE__ */ __name((_id2) => withCtx, "withScopeId"); +function withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) { + if (!ctx) return fn; + if (fn._n) { + return fn; + } + const renderFnWithContext = /* @__PURE__ */ __name((...args) => { + if (renderFnWithContext._d) { + setBlockTracking(-1); } - }, - submenu: { - padding: "{navigation.list.padding}", - gap: "{navigation.list.gap}", - background: "{content.background}", - borderColor: "{content.border.color}", - borderRadius: "{content.border.radius}", - shadow: "{overlay.navigation.shadow}", - mobileIndent: "1rem" - }, - submenuIcon: { - size: "{navigation.submenu.icon.size}", - color: "{navigation.submenu.icon.color}", - focusColor: "{navigation.submenu.icon.focus.color}", - activeColor: "{navigation.submenu.icon.active.color}" - }, - separator: { - borderColor: "{content.border.color}" - }, - mobileButton: { - borderRadius: "50%", - size: "1.75rem", - color: "{text.muted.color}", - hoverColor: "{text.muted.hover.color}", - hoverBackground: "{content.hover.background}", - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - color: "{focus.ring.color}", - offset: "{focus.ring.offset}", - shadow: "{focus.ring.shadow}" + const prevInstance = setCurrentRenderingInstance(ctx); + let res; + try { + res = fn(...args); + } finally { + setCurrentRenderingInstance(prevInstance); + if (renderFnWithContext._d) { + setBlockTracking(1); + } } - } -}; -var index$K = { - root: { - borderRadius: "{content.border.radius}", - borderWidth: "1px", - transitionDuration: "{transition.duration}" - }, - content: { - padding: "0.5rem 0.75rem", - gap: "0.5rem" - }, - text: { - fontSize: "1rem", - fontWeight: "500" - }, - icon: { - size: "1.125rem" - }, - closeButton: { - width: "1.75rem", - height: "1.75rem", - borderRadius: "50%", - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - offset: "{focus.ring.offset}" + if (false) { + devtoolsComponentUpdated(ctx); } - }, - closeIcon: { - size: "1rem" - }, - colorScheme: { - light: { - info: { - background: "color-mix(in srgb, {blue.50}, transparent 5%)", - borderColor: "{blue.200}", - color: "{blue.600}", - shadow: "0px 4px 8px 0px color-mix(in srgb, {blue.500}, transparent 96%)", - closeButton: { - hoverBackground: "{blue.100}", - focusRing: { - color: "{blue.600}", - shadow: "none" - } - } - }, - success: { - background: "color-mix(in srgb, {green.50}, transparent 5%)", - borderColor: "{green.200}", - color: "{green.600}", - shadow: "0px 4px 8px 0px color-mix(in srgb, {green.500}, transparent 96%)", - closeButton: { - hoverBackground: "{green.100}", - focusRing: { - color: "{green.600}", - shadow: "none" - } - } - }, - warn: { - background: "color-mix(in srgb,{yellow.50}, transparent 5%)", - borderColor: "{yellow.200}", - color: "{yellow.600}", - shadow: "0px 4px 8px 0px color-mix(in srgb, {yellow.500}, transparent 96%)", - closeButton: { - hoverBackground: "{yellow.100}", - focusRing: { - color: "{yellow.600}", - shadow: "none" - } - } - }, - error: { - background: "color-mix(in srgb, {red.50}, transparent 5%)", - borderColor: "{red.200}", - color: "{red.600}", - shadow: "0px 4px 8px 0px color-mix(in srgb, {red.500}, transparent 96%)", - closeButton: { - hoverBackground: "{red.100}", - focusRing: { - color: "{red.600}", - shadow: "none" - } - } - }, - secondary: { - background: "{surface.100}", - borderColor: "{surface.200}", - color: "{surface.600}", - shadow: "0px 4px 8px 0px color-mix(in srgb, {surface.500}, transparent 96%)", - closeButton: { - hoverBackground: "{surface.200}", - focusRing: { - color: "{surface.600}", - shadow: "none" - } - } - }, - contrast: { - background: "{surface.900}", - borderColor: "{surface.950}", - color: "{surface.50}", - shadow: "0px 4px 8px 0px color-mix(in srgb, {surface.950}, transparent 96%)", - closeButton: { - hoverBackground: "{surface.800}", - focusRing: { - color: "{surface.50}", - shadow: "none" - } + return res; + }, "renderFnWithContext"); + renderFnWithContext._n = true; + renderFnWithContext._c = true; + renderFnWithContext._d = true; + return renderFnWithContext; +} +__name(withCtx, "withCtx"); +let accessedAttrs = false; +function markAttrsAccessed() { + accessedAttrs = true; +} +__name(markAttrsAccessed, "markAttrsAccessed"); +function renderComponentRoot(instance) { + const { + type: Component, + vnode, + proxy, + withProxy, + propsOptions: [propsOptions], + slots, + attrs: attrs4, + emit: emit2, + render: render2, + renderCache, + props, + data: data23, + setupState, + ctx, + inheritAttrs + } = instance; + const prev2 = setCurrentRenderingInstance(instance); + let result; + let fallthroughAttrs; + if (false) { + accessedAttrs = false; + } + try { + if (vnode.shapeFlag & 4) { + const proxyToUse = withProxy || proxy; + const thisProxy = false ? new Proxy(proxyToUse, { + get(target, key, receiver) { + warn$1$1( + `Property '${String( + key + )}' was accessed via 'this'. Avoid using 'this' in templates.` + ); + return Reflect.get(target, key, receiver); } + }) : proxyToUse; + result = normalizeVNode( + render2.call( + thisProxy, + proxyToUse, + renderCache, + false ? shallowReadonly(props) : props, + setupState, + data23, + ctx + ) + ); + fallthroughAttrs = attrs4; + } else { + const render22 = Component; + if (false) { + markAttrsAccessed(); } - }, - dark: { - info: { - background: "color-mix(in srgb, {blue.500}, transparent 84%)", - borderColor: "color-mix(in srgb, {blue.700}, transparent 64%)", - color: "{blue.500}", - shadow: "0px 4px 8px 0px color-mix(in srgb, {blue.500}, transparent 96%)", - closeButton: { - hoverBackground: "rgba(255, 255, 255, 0.05)", - focusRing: { - color: "{blue.500}", - shadow: "none" - } - } - }, - success: { - background: "color-mix(in srgb, {green.500}, transparent 84%)", - borderColor: "color-mix(in srgb, {green.700}, transparent 64%)", - color: "{green.500}", - shadow: "0px 4px 8px 0px color-mix(in srgb, {green.500}, transparent 96%)", - closeButton: { - hoverBackground: "rgba(255, 255, 255, 0.05)", - focusRing: { - color: "{green.500}", - shadow: "none" - } - } - }, - warn: { - background: "color-mix(in srgb, {yellow.500}, transparent 84%)", - borderColor: "color-mix(in srgb, {yellow.700}, transparent 64%)", - color: "{yellow.500}", - shadow: "0px 4px 8px 0px color-mix(in srgb, {yellow.500}, transparent 96%)", - closeButton: { - hoverBackground: "rgba(255, 255, 255, 0.05)", - focusRing: { - color: "{yellow.500}", - shadow: "none" - } + result = normalizeVNode( + render22.length > 1 ? render22( + false ? shallowReadonly(props) : props, + false ? { + get attrs() { + markAttrsAccessed(); + return shallowReadonly(attrs4); + }, + slots, + emit: emit2 + } : { attrs: attrs4, slots, emit: emit2 } + ) : render22( + false ? shallowReadonly(props) : props, + null + ) + ); + fallthroughAttrs = Component.props ? attrs4 : getFunctionalFallthrough(attrs4); + } + } catch (err) { + blockStack.length = 0; + handleError(err, instance, 1); + result = createVNode(Comment); + } + let root23 = result; + let setRoot = void 0; + if (false) { + [root23, setRoot] = getChildRoot(result); + } + if (fallthroughAttrs && inheritAttrs !== false) { + const keys2 = Object.keys(fallthroughAttrs); + const { shapeFlag } = root23; + if (keys2.length) { + if (shapeFlag & (1 | 6)) { + if (propsOptions && keys2.some(isModelListener)) { + fallthroughAttrs = filterModelListeners( + fallthroughAttrs, + propsOptions + ); } - }, - error: { - background: "color-mix(in srgb, {red.500}, transparent 84%)", - borderColor: "color-mix(in srgb, {red.700}, transparent 64%)", - color: "{red.500}", - shadow: "0px 4px 8px 0px color-mix(in srgb, {red.500}, transparent 96%)", - closeButton: { - hoverBackground: "rgba(255, 255, 255, 0.05)", - focusRing: { - color: "{red.500}", - shadow: "none" + root23 = cloneVNode(root23, fallthroughAttrs, false, true); + } else if (false) { + const allAttrs = Object.keys(attrs4); + const eventAttrs = []; + const extraAttrs = []; + for (let i2 = 0, l = allAttrs.length; i2 < l; i2++) { + const key = allAttrs[i2]; + if (isOn(key)) { + if (!isModelListener(key)) { + eventAttrs.push(key[2].toLowerCase() + key.slice(3)); + } + } else { + extraAttrs.push(key); } } - }, - secondary: { - background: "{surface.800}", - borderColor: "{surface.700}", - color: "{surface.300}", - shadow: "0px 4px 8px 0px color-mix(in srgb, {surface.500}, transparent 96%)", - closeButton: { - hoverBackground: "{surface.700}", - focusRing: { - color: "{surface.300}", - shadow: "none" - } + if (extraAttrs.length) { + warn$1$1( + `Extraneous non-props attributes (${extraAttrs.join(", ")}) were passed to component but could not be automatically inherited because component renders fragment or text root nodes.` + ); } - }, - contrast: { - background: "{surface.0}", - borderColor: "{surface.100}", - color: "{surface.950}", - shadow: "0px 4px 8px 0px color-mix(in srgb, {surface.950}, transparent 96%)", - closeButton: { - hoverBackground: "{surface.100}", - focusRing: { - color: "{surface.950}", - shadow: "none" - } + if (eventAttrs.length) { + warn$1$1( + `Extraneous non-emits event listeners (${eventAttrs.join(", ")}) were passed to component but could not be automatically inherited because component renders fragment or text root nodes. If the listener is intended to be a component custom event listener only, declare it using the "emits" option.` + ); } } } } -}; -var index$J = { - root: { - borderRadius: "{content.border.radius}", - gap: "1rem" - }, - meters: { - background: "{content.border.color}", - size: "0.5rem" - }, - label: { - gap: "0.5rem" - }, - labelMarker: { - size: "0.5rem" - }, - labelIcon: { - size: "1rem" - }, - labelList: { - verticalGap: "0.5rem", - horizontalGap: "1rem" + if (vnode.dirs) { + if (false) { + warn$1$1( + `Runtime directive used on component with non-element root node. The directives will not function as intended.` + ); + } + root23 = cloneVNode(root23, null, false, true); + root23.dirs = root23.dirs ? root23.dirs.concat(vnode.dirs) : vnode.dirs; } -}; -var index$I = { - root: { - background: "{form.field.background}", - disabledBackground: "{form.field.disabled.background}", - filledBackground: "{form.field.filled.background}", - filledFocusBackground: "{form.field.filled.focus.background}", - borderColor: "{form.field.border.color}", - hoverBorderColor: "{form.field.hover.border.color}", - focusBorderColor: "{form.field.focus.border.color}", - invalidBorderColor: "{form.field.invalid.border.color}", - color: "{form.field.color}", - disabledColor: "{form.field.disabled.color}", - placeholderColor: "{form.field.placeholder.color}", - shadow: "{form.field.shadow}", - paddingX: "{form.field.padding.x}", - paddingY: "{form.field.padding.y}", - borderRadius: "{form.field.border.radius}", - focusRing: { - width: "{form.field.focus.ring.width}", - style: "{form.field.focus.ring.style}", - color: "{form.field.focus.ring.color}", - offset: "{form.field.focus.ring.offset}", - shadow: "{form.field.focus.ring.shadow}" - }, - transitionDuration: "{form.field.transition.duration}" - }, - dropdown: { - width: "2.5rem", - color: "{form.field.icon.color}" - }, - overlay: { - background: "{overlay.select.background}", - borderColor: "{overlay.select.border.color}", - borderRadius: "{overlay.select.border.radius}", - color: "{overlay.select.color}", - shadow: "{overlay.select.shadow}" - }, - list: { - padding: "{list.padding}", - gap: "{list.gap}", - header: { - padding: "{list.header.padding}" + if (vnode.transition) { + if (false) { + warn$1$1( + `Component inside renders non-element root node that cannot be animated.` + ); } - }, - option: { - focusBackground: "{list.option.focus.background}", - selectedBackground: "{list.option.selected.background}", - selectedFocusBackground: "{list.option.selected.focus.background}", - color: "{list.option.color}", - focusColor: "{list.option.focus.color}", - selectedColor: "{list.option.selected.color}", - selectedFocusColor: "{list.option.selected.focus.color}", - padding: "{list.option.padding}", - borderRadius: "{list.option.border.radius}", - gap: "0.5rem" - }, - optionGroup: { - background: "{list.option.group.background}", - color: "{list.option.group.color}", - fontWeight: "{list.option.group.font.weight}", - padding: "{list.option.group.padding}" - }, - chip: { - borderRadius: "{border.radius.sm}" - }, - emptyMessage: { - padding: "{list.option.padding}" + root23.transition = vnode.transition; } -}; -var index$H = { - root: { - gap: "1.125rem" - }, - controls: { - gap: "0.5rem" + if (false) { + setRoot(root23); + } else { + result = root23; } -}; -var index$G = { - root: { - gutter: "0.75rem", - transitionDuration: "{transition.duration}" - }, - node: { - background: "{content.background}", - hoverBackground: "{content.hover.background}", - selectedBackground: "{highlight.background}", - borderColor: "{content.border.color}", - color: "{content.color}", - selectedColor: "{highlight.color}", - hoverColor: "{content.hover.color}", - padding: "0.75rem 1rem", - toggleablePadding: "0.75rem 1rem 1.25rem 1rem", - borderRadius: "{content.border.radius}" - }, - nodeToggleButton: { - background: "{content.background}", - hoverBackground: "{content.hover.background}", - borderColor: "{content.border.color}", - color: "{text.muted.color}", - hoverColor: "{text.color}", - size: "1.5rem", - borderRadius: "50%", - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - color: "{focus.ring.color}", - offset: "{focus.ring.offset}", - shadow: "{focus.ring.shadow}" + setCurrentRenderingInstance(prev2); + return result; +} +__name(renderComponentRoot, "renderComponentRoot"); +const getChildRoot = /* @__PURE__ */ __name((vnode) => { + const rawChildren = vnode.children; + const dynamicChildren = vnode.dynamicChildren; + const childRoot = filterSingleRoot(rawChildren, false); + if (!childRoot) { + return [vnode, void 0]; + } else if (false) { + return getChildRoot(childRoot); + } + const index2 = rawChildren.indexOf(childRoot); + const dynamicIndex = dynamicChildren ? dynamicChildren.indexOf(childRoot) : -1; + const setRoot = /* @__PURE__ */ __name((updatedRoot) => { + rawChildren[index2] = updatedRoot; + if (dynamicChildren) { + if (dynamicIndex > -1) { + dynamicChildren[dynamicIndex] = updatedRoot; + } else if (updatedRoot.patchFlag > 0) { + vnode.dynamicChildren = [...dynamicChildren, updatedRoot]; + } + } + }, "setRoot"); + return [normalizeVNode(childRoot), setRoot]; +}, "getChildRoot"); +function filterSingleRoot(children, recurse = true) { + let singleRoot; + for (let i2 = 0; i2 < children.length; i2++) { + const child = children[i2]; + if (isVNode$1(child)) { + if (child.type !== Comment || child.children === "v-if") { + if (singleRoot) { + return; + } else { + singleRoot = child; + if (false) { + return filterSingleRoot(singleRoot.children); + } + } + } + } else { + return; } - }, - connector: { - color: "{content.border.color}", - borderRadius: "{content.border.radius}", - height: "24px" } -}; -var index$F = { - root: { - outline: { - width: "2px", - color: "{content.background}" + return singleRoot; +} +__name(filterSingleRoot, "filterSingleRoot"); +const getFunctionalFallthrough = /* @__PURE__ */ __name((attrs4) => { + let res; + for (const key in attrs4) { + if (key === "class" || key === "style" || isOn(key)) { + (res || (res = {}))[key] = attrs4[key]; } } -}; -var index$E = { - root: { - padding: "0.5rem 1rem", - gap: "0.25rem", - borderRadius: "{content.border.radius}", - background: "{content.background}", - color: "{content.color}", - transitionDuration: "{transition.duration}" - }, - navButton: { - background: "transparent", - hoverBackground: "{content.hover.background}", - selectedBackground: "{highlight.background}", - color: "{text.muted.color}", - hoverColor: "{text.hover.muted.color}", - selectedColor: "{highlight.color}", - width: "2.5rem", - height: "2.5rem", - borderRadius: "50%", - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - color: "{focus.ring.color}", - offset: "{focus.ring.offset}", - shadow: "{focus.ring.shadow}" + return res; +}, "getFunctionalFallthrough"); +const filterModelListeners = /* @__PURE__ */ __name((attrs4, props) => { + const res = {}; + for (const key in attrs4) { + if (!isModelListener(key) || !(key.slice(9) in props)) { + res[key] = attrs4[key]; } - }, - currentPageReport: { - color: "{text.muted.color}" - }, - jumpToPageInput: { - maxWidth: "2.5rem" } -}; -var index$D = { - root: { - background: "{content.background}", - borderColor: "{content.border.color}", - color: "{content.color}", - borderRadius: "{content.border.radius}" - }, - header: { - background: "transparent", - color: "{text.color}", - padding: "1.125rem", - borderColor: "{content.border.color}", - borderWidth: "0", - borderRadius: "0" - }, - toggleableHeader: { - padding: "0.375rem 1.125rem" - }, - title: { - fontWeight: "600" - }, - content: { - padding: "0 1.125rem 1.125rem 1.125rem" - }, - footer: { - padding: "0 1.125rem 1.125rem 1.125rem" + return res; +}, "filterModelListeners"); +const isElementRoot = /* @__PURE__ */ __name((vnode) => { + return vnode.shapeFlag & (6 | 1) || vnode.type === Comment; +}, "isElementRoot"); +function shouldUpdateComponent(prevVNode, nextVNode, optimized) { + const { props: prevProps, children: prevChildren, component } = prevVNode; + const { props: nextProps, children: nextChildren, patchFlag } = nextVNode; + const emits = component.emitsOptions; + if (false) { + return true; } -}; -var index$C = { - root: { - gap: "0.5rem", - transitionDuration: "{transition.duration}" - }, - panel: { - background: "{content.background}", - borderColor: "{content.border.color}", - borderWidth: "1px", - color: "{content.color}", - padding: "0.25rem 0.25rem", - borderRadius: "{content.border.radius}", - first: { - borderWidth: "1px", - topBorderRadius: "{content.border.radius}" - }, - last: { - borderWidth: "1px", - bottomBorderRadius: "{content.border.radius}" - } - }, - item: { - focusBackground: "{navigation.item.focus.background}", - color: "{navigation.item.color}", - focusColor: "{navigation.item.focus.color}", - gap: "0.5rem", - padding: "{navigation.item.padding}", - borderRadius: "{content.border.radius}", - icon: { - color: "{navigation.item.icon.color}", - focusColor: "{navigation.item.icon.focus.color}" - } - }, - submenu: { - indent: "1rem" - }, - submenuIcon: { - color: "{navigation.submenu.icon.color}", - focusColor: "{navigation.submenu.icon.focus.color}" + if (nextVNode.dirs || nextVNode.transition) { + return true; } -}; -var index$B = { - meter: { - background: "{content.border.color}", - borderRadius: "{content.border.radius}", - height: ".75rem" - }, - icon: { - color: "{form.field.icon.color}" - }, - overlay: { - background: "{overlay.popover.background}", - borderColor: "{overlay.popover.border.color}", - borderRadius: "{overlay.popover.border.radius}", - color: "{overlay.popover.color}", - padding: "{overlay.popover.padding}", - shadow: "{overlay.popover.shadow}" - }, - content: { - gap: "0.5rem" - }, - colorScheme: { - light: { - strength: { - weakBackground: "{red.500}", - mediumBackground: "{amber.500}", - strongBackground: "{green.500}" + if (optimized && patchFlag >= 0) { + if (patchFlag & 1024) { + return true; + } + if (patchFlag & 16) { + if (!prevProps) { + return !!nextProps; } - }, - dark: { - strength: { - weakBackground: "{red.400}", - mediumBackground: "{amber.400}", - strongBackground: "{green.400}" + return hasPropsChanged(prevProps, nextProps, emits); + } else if (patchFlag & 8) { + const dynamicProps = nextVNode.dynamicProps; + for (let i2 = 0; i2 < dynamicProps.length; i2++) { + const key = dynamicProps[i2]; + if (nextProps[key] !== prevProps[key] && !isEmitListener(emits, key)) { + return true; + } + } + } + } else { + if (prevChildren || nextChildren) { + if (!nextChildren || !nextChildren.$stable) { + return true; } } + if (prevProps === nextProps) { + return false; + } + if (!prevProps) { + return !!nextProps; + } + if (!nextProps) { + return true; + } + return hasPropsChanged(prevProps, nextProps, emits); } -}; -var index$A = { - root: { - gap: "1.125rem" - }, - controls: { - gap: "0.5rem" + return false; +} +__name(shouldUpdateComponent, "shouldUpdateComponent"); +function hasPropsChanged(prevProps, nextProps, emitsOptions) { + const nextKeys = Object.keys(nextProps); + if (nextKeys.length !== Object.keys(prevProps).length) { + return true; } -}; -var index$z = { - root: { - background: "{overlay.popover.background}", - borderColor: "{overlay.popover.border.color}", - color: "{overlay.popover.color}", - borderRadius: "{overlay.popover.border.radius}", - shadow: "{overlay.popover.shadow}", - gutter: "10px", - arrowOffset: "1.25rem" - }, - content: { - padding: "{overlay.popover.padding}" + for (let i2 = 0; i2 < nextKeys.length; i2++) { + const key = nextKeys[i2]; + if (nextProps[key] !== prevProps[key] && !isEmitListener(emitsOptions, key)) { + return true; + } } -}; -var index$y = { - root: { - background: "{content.border.color}", - borderRadius: "{content.border.radius}", - height: "1.25rem" - }, - value: { - background: "{primary.color}" - }, - label: { - color: "{primary.contrast.color}", - fontSize: "0.75rem", - fontWeight: "600" + return false; +} +__name(hasPropsChanged, "hasPropsChanged"); +function updateHOCHostEl({ vnode, parent }, el) { + while (parent) { + const root23 = parent.subTree; + if (root23.suspense && root23.suspense.activeBranch === vnode) { + root23.el = vnode.el; + } + if (root23 === vnode) { + (vnode = parent.vnode).el = el; + parent = parent.parent; + } else { + break; + } } -}; -var index$x = { - colorScheme: { - light: { - root: { - "color.1": "{red.500}", - "color.2": "{blue.500}", - "color.3": "{green.500}", - "color.4": "{yellow.500}" - } - }, - dark: { - root: { - "color.1": "{red.400}", - "color.2": "{blue.400}", - "color.3": "{green.400}", - "color.4": "{yellow.400}" +} +__name(updateHOCHostEl, "updateHOCHostEl"); +const COMPONENTS = "components"; +const DIRECTIVES = "directives"; +function resolveComponent(name2, maybeSelfReference) { + return resolveAsset(COMPONENTS, name2, true, maybeSelfReference) || name2; +} +__name(resolveComponent, "resolveComponent"); +const NULL_DYNAMIC_COMPONENT = Symbol.for("v-ndc"); +function resolveDynamicComponent(component) { + if (isString$8(component)) { + return resolveAsset(COMPONENTS, component, false) || component; + } else { + return component || NULL_DYNAMIC_COMPONENT; + } +} +__name(resolveDynamicComponent, "resolveDynamicComponent"); +function resolveDirective(name2) { + return resolveAsset(DIRECTIVES, name2); +} +__name(resolveDirective, "resolveDirective"); +function resolveAsset(type, name2, warnMissing = true, maybeSelfReference = false) { + const instance = currentRenderingInstance || currentInstance; + if (instance) { + const Component = instance.type; + if (type === COMPONENTS) { + const selfName = getComponentName( + Component, + false + ); + if (selfName && (selfName === name2 || selfName === camelize$1(name2) || selfName === capitalize$1(camelize$1(name2)))) { + return Component; } } + const res = ( + // local registration + // check instance[type] first which is resolved for options API + resolve$1(instance[type] || Component[type], name2) || // global registration + resolve$1(instance.appContext[type], name2) + ); + if (!res && maybeSelfReference) { + return Component; + } + if (false) { + const extra = type === COMPONENTS ? ` +If this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.` : ``; + warn$1$1(`Failed to resolve ${type.slice(0, -1)}: ${name2}${extra}`); + } + return res; + } else if (false) { + warn$1$1( + `resolve${capitalize$1(type.slice(0, -1))} can only be used in render() or setup().` + ); } -}; -var index$w = { - root: { - width: "1.25rem", - height: "1.25rem", - background: "{form.field.background}", - checkedBackground: "{primary.color}", - checkedHoverBackground: "{primary.hover.color}", - disabledBackground: "{form.field.disabled.background}", - filledBackground: "{form.field.filled.background}", - borderColor: "{form.field.border.color}", - hoverBorderColor: "{form.field.hover.border.color}", - focusBorderColor: "{form.field.border.color}", - checkedBorderColor: "{primary.color}", - checkedHoverBorderColor: "{primary.hover.color}", - checkedFocusBorderColor: "{primary.color}", - checkedDisabledBorderColor: "{form.field.border.color}", - invalidBorderColor: "{form.field.invalid.border.color}", - shadow: "{form.field.shadow}", - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - color: "{focus.ring.color}", - offset: "{focus.ring.offset}", - shadow: "{focus.ring.shadow}" - }, - transitionDuration: "{form.field.transition.duration}" +} +__name(resolveAsset, "resolveAsset"); +function resolve$1(registry, name2) { + return registry && (registry[name2] || registry[camelize$1(name2)] || registry[capitalize$1(camelize$1(name2))]); +} +__name(resolve$1, "resolve$1"); +const isSuspense = /* @__PURE__ */ __name((type) => type.__isSuspense, "isSuspense"); +let suspenseId = 0; +const SuspenseImpl = { + name: "Suspense", + // In order to make Suspense tree-shakable, we need to avoid importing it + // directly in the renderer. The renderer checks for the __isSuspense flag + // on a vnode's type and calls the `process` method, passing in renderer + // internals. + __isSuspense: true, + process(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, rendererInternals) { + if (n1 == null) { + mountSuspense( + n2, + container, + anchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized, + rendererInternals + ); + } else { + if (parentSuspense && parentSuspense.deps > 0 && !n1.suspense.isInFallback) { + n2.suspense = n1.suspense; + n2.suspense.vnode = n2; + n2.el = n1.el; + return; + } + patchSuspense( + n1, + n2, + container, + anchor, + parentComponent, + namespace, + slotScopeIds, + optimized, + rendererInternals + ); + } }, - icon: { - size: "0.75rem", - checkedColor: "{primary.contrast.color}", - checkedHoverColor: "{primary.contrast.color}", - disabledColor: "{form.field.disabled.color}" - } + hydrate: hydrateSuspense, + normalize: normalizeSuspenseChildren }; -var index$v = { - root: { - gap: "0.25rem", - transitionDuration: "{transition.duration}" - }, - icon: { - size: "1rem", - color: "{text.muted.color}", - hoverColor: "{primary.color}", - activeColor: "{primary.color}" +const Suspense = SuspenseImpl; +function triggerEvent(vnode, name2) { + const eventListener = vnode.props && vnode.props[name2]; + if (isFunction$5(eventListener)) { + eventListener(); } -}; -var index$u = { - colorScheme: { - light: { - root: { - background: "rgba(0,0,0,0.1)" +} +__name(triggerEvent, "triggerEvent"); +function mountSuspense(vnode, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, rendererInternals) { + const { + p: patch2, + o: { createElement: createElement2 } + } = rendererInternals; + const hiddenContainer = createElement2("div"); + const suspense = vnode.suspense = createSuspenseBoundary( + vnode, + parentSuspense, + parentComponent, + container, + hiddenContainer, + anchor, + namespace, + slotScopeIds, + optimized, + rendererInternals + ); + patch2( + null, + suspense.pendingBranch = vnode.ssContent, + hiddenContainer, + null, + parentComponent, + suspense, + namespace, + slotScopeIds + ); + if (suspense.deps > 0) { + triggerEvent(vnode, "onPending"); + triggerEvent(vnode, "onFallback"); + patch2( + null, + vnode.ssFallback, + container, + anchor, + parentComponent, + null, + // fallback tree will not have suspense context + namespace, + slotScopeIds + ); + setActiveBranch(suspense, vnode.ssFallback); + } else { + suspense.resolve(false, true); + } +} +__name(mountSuspense, "mountSuspense"); +function patchSuspense(n1, n2, container, anchor, parentComponent, namespace, slotScopeIds, optimized, { p: patch2, um: unmount, o: { createElement: createElement2 } }) { + const suspense = n2.suspense = n1.suspense; + suspense.vnode = n2; + n2.el = n1.el; + const newBranch = n2.ssContent; + const newFallback = n2.ssFallback; + const { activeBranch, pendingBranch, isInFallback, isHydrating } = suspense; + if (pendingBranch) { + suspense.pendingBranch = newBranch; + if (isSameVNodeType(newBranch, pendingBranch)) { + patch2( + pendingBranch, + newBranch, + suspense.hiddenContainer, + null, + parentComponent, + suspense, + namespace, + slotScopeIds, + optimized + ); + if (suspense.deps <= 0) { + suspense.resolve(); + } else if (isInFallback) { + if (!isHydrating) { + patch2( + activeBranch, + newFallback, + container, + anchor, + parentComponent, + null, + // fallback tree will not have suspense context + namespace, + slotScopeIds, + optimized + ); + setActiveBranch(suspense, newFallback); + } } - }, - dark: { - root: { - background: "rgba(255,255,255,0.3)" + } else { + suspense.pendingId = suspenseId++; + if (isHydrating) { + suspense.isHydrating = false; + suspense.activeBranch = pendingBranch; + } else { + unmount(pendingBranch, parentComponent, suspense); + } + suspense.deps = 0; + suspense.effects.length = 0; + suspense.hiddenContainer = createElement2("div"); + if (isInFallback) { + patch2( + null, + newBranch, + suspense.hiddenContainer, + null, + parentComponent, + suspense, + namespace, + slotScopeIds, + optimized + ); + if (suspense.deps <= 0) { + suspense.resolve(); + } else { + patch2( + activeBranch, + newFallback, + container, + anchor, + parentComponent, + null, + // fallback tree will not have suspense context + namespace, + slotScopeIds, + optimized + ); + setActiveBranch(suspense, newFallback); + } + } else if (activeBranch && isSameVNodeType(newBranch, activeBranch)) { + patch2( + activeBranch, + newBranch, + container, + anchor, + parentComponent, + suspense, + namespace, + slotScopeIds, + optimized + ); + suspense.resolve(true); + } else { + patch2( + null, + newBranch, + suspense.hiddenContainer, + null, + parentComponent, + suspense, + namespace, + slotScopeIds, + optimized + ); + if (suspense.deps <= 0) { + suspense.resolve(); + } } } - } -}; -var index$t = { - root: { - transitionDuration: "{transition.duration}" - }, - bar: { - size: "9px", - borderRadius: "{border.radius.sm}", - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - color: "{focus.ring.color}", - offset: "{focus.ring.offset}", - shadow: "{focus.ring.shadow}" - } - }, - colorScheme: { - light: { - bar: { - background: "{surface.100}" + } else { + if (activeBranch && isSameVNodeType(newBranch, activeBranch)) { + patch2( + activeBranch, + newBranch, + container, + anchor, + parentComponent, + suspense, + namespace, + slotScopeIds, + optimized + ); + setActiveBranch(suspense, newBranch); + } else { + triggerEvent(n2, "onPending"); + suspense.pendingBranch = newBranch; + if (newBranch.shapeFlag & 512) { + suspense.pendingId = newBranch.component.suspenseId; + } else { + suspense.pendingId = suspenseId++; } - }, - dark: { - bar: { - background: "{surface.800}" + patch2( + null, + newBranch, + suspense.hiddenContainer, + null, + parentComponent, + suspense, + namespace, + slotScopeIds, + optimized + ); + if (suspense.deps <= 0) { + suspense.resolve(); + } else { + const { timeout, pendingId } = suspense; + if (timeout > 0) { + setTimeout(() => { + if (suspense.pendingId === pendingId) { + suspense.fallback(newFallback); + } + }, timeout); + } else if (timeout === 0) { + suspense.fallback(newFallback); + } } } } -}; -var index$s = { - root: { - background: "{form.field.background}", - disabledBackground: "{form.field.disabled.background}", - filledBackground: "{form.field.filled.background}", - filledFocusBackground: "{form.field.filled.focus.background}", - borderColor: "{form.field.border.color}", - hoverBorderColor: "{form.field.hover.border.color}", - focusBorderColor: "{form.field.focus.border.color}", - invalidBorderColor: "{form.field.invalid.border.color}", - color: "{form.field.color}", - disabledColor: "{form.field.disabled.color}", - placeholderColor: "{form.field.placeholder.color}", - shadow: "{form.field.shadow}", - paddingX: "{form.field.padding.x}", - paddingY: "{form.field.padding.y}", - borderRadius: "{form.field.border.radius}", - focusRing: { - width: "{form.field.focus.ring.width}", - style: "{form.field.focus.ring.style}", - color: "{form.field.focus.ring.color}", - offset: "{form.field.focus.ring.offset}", - shadow: "{form.field.focus.ring.shadow}" - }, - transitionDuration: "{form.field.transition.duration}" - }, - dropdown: { - width: "2.5rem", - color: "{form.field.icon.color}" - }, - overlay: { - background: "{overlay.select.background}", - borderColor: "{overlay.select.border.color}", - borderRadius: "{overlay.select.border.radius}", - color: "{overlay.select.color}", - shadow: "{overlay.select.shadow}" - }, - list: { - padding: "{list.padding}", - gap: "{list.gap}", - header: { - padding: "{list.header.padding}" +} +__name(patchSuspense, "patchSuspense"); +let hasWarned$1 = false; +function createSuspenseBoundary(vnode, parentSuspense, parentComponent, container, hiddenContainer, anchor, namespace, slotScopeIds, optimized, rendererInternals, isHydrating = false) { + if (false) { + hasWarned$1 = true; + console[console.info ? "info" : "log"]( + ` is an experimental feature and its API will likely change.` + ); + } + const { + p: patch2, + m: move, + um: unmount, + n: next2, + o: { parentNode: parentNode2, remove: remove22 } + } = rendererInternals; + let parentSuspenseId; + const isSuspensible = isVNodeSuspensible(vnode); + if (isSuspensible) { + if (parentSuspense && parentSuspense.pendingBranch) { + parentSuspenseId = parentSuspense.pendingId; + parentSuspense.deps++; } - }, - option: { - focusBackground: "{list.option.focus.background}", - selectedBackground: "{list.option.selected.background}", - selectedFocusBackground: "{list.option.selected.focus.background}", - color: "{list.option.color}", - focusColor: "{list.option.focus.color}", - selectedColor: "{list.option.selected.color}", - selectedFocusColor: "{list.option.selected.focus.color}", - padding: "{list.option.padding}", - borderRadius: "{list.option.border.radius}" - }, - optionGroup: { - background: "{list.option.group.background}", - color: "{list.option.group.color}", - fontWeight: "{list.option.group.font.weight}", - padding: "{list.option.group.padding}" - }, - clearIcon: { - color: "{form.field.icon.color}" - }, - checkmark: { - color: "{list.option.color}", - gutterStart: "-0.375rem", - gutterEnd: "0.375rem" - }, - emptyMessage: { - padding: "{list.option.padding}" } -}; -var index$r = { - root: { - borderRadius: "{form.field.border.radius}" - }, - colorScheme: { - light: { - root: { - invalidBorderColor: "{form.field.invalid.border.color}" + const timeout = vnode.props ? toNumber(vnode.props.timeout) : void 0; + if (false) { + assertNumber(timeout, `Suspense timeout`); + } + const initialAnchor = anchor; + const suspense = { + vnode, + parent: parentSuspense, + parentComponent, + namespace, + container, + hiddenContainer, + deps: 0, + pendingId: suspenseId++, + timeout: typeof timeout === "number" ? timeout : -1, + activeBranch: null, + pendingBranch: null, + isInFallback: !isHydrating, + isHydrating, + isUnmounted: false, + effects: [], + resolve(resume = false, sync = false) { + if (false) { + if (!resume && !suspense.pendingBranch) { + throw new Error( + `suspense.resolve() is called without a pending branch.` + ); + } + if (suspense.isUnmounted) { + throw new Error( + `suspense.resolve() is called on an already unmounted suspense boundary.` + ); + } } - }, - dark: { - root: { - invalidBorderColor: "{form.field.invalid.border.color}" + const { + vnode: vnode2, + activeBranch, + pendingBranch, + pendingId, + effects, + parentComponent: parentComponent2, + container: container2 + } = suspense; + let delayEnter = false; + if (suspense.isHydrating) { + suspense.isHydrating = false; + } else if (!resume) { + delayEnter = activeBranch && pendingBranch.transition && pendingBranch.transition.mode === "out-in"; + if (delayEnter) { + activeBranch.transition.afterLeave = () => { + if (pendingId === suspense.pendingId) { + move( + pendingBranch, + container2, + anchor === initialAnchor ? next2(activeBranch) : anchor, + 0 + ); + queuePostFlushCb(effects); + } + }; + } + if (activeBranch) { + if (parentNode2(activeBranch.el) !== suspense.hiddenContainer) { + anchor = next2(activeBranch); + } + unmount(activeBranch, parentComponent2, suspense, true); + } + if (!delayEnter) { + move(pendingBranch, container2, anchor, 0); + } } - } - } -}; -var index$q = { - root: { - borderRadius: "{content.border.radius}" - }, - colorScheme: { - light: { - root: { - background: "{surface.200}", - animationBackground: "rgba(255,255,255,0.4)" + setActiveBranch(suspense, pendingBranch); + suspense.pendingBranch = null; + suspense.isInFallback = false; + let parent = suspense.parent; + let hasUnresolvedAncestor = false; + while (parent) { + if (parent.pendingBranch) { + parent.effects.push(...effects); + hasUnresolvedAncestor = true; + break; + } + parent = parent.parent; + } + if (!hasUnresolvedAncestor && !delayEnter) { + queuePostFlushCb(effects); } + suspense.effects = []; + if (isSuspensible) { + if (parentSuspense && parentSuspense.pendingBranch && parentSuspenseId === parentSuspense.pendingId) { + parentSuspense.deps--; + if (parentSuspense.deps === 0 && !sync) { + parentSuspense.resolve(); + } + } + } + triggerEvent(vnode2, "onResolve"); }, - dark: { - root: { - background: "rgba(255, 255, 255, 0.06)", - animationBackground: "rgba(255, 255, 255, 0.04)" + fallback(fallbackVNode) { + if (!suspense.pendingBranch) { + return; + } + const { vnode: vnode2, activeBranch, parentComponent: parentComponent2, container: container2, namespace: namespace2 } = suspense; + triggerEvent(vnode2, "onFallback"); + const anchor2 = next2(activeBranch); + const mountFallback = /* @__PURE__ */ __name(() => { + if (!suspense.isInFallback) { + return; + } + patch2( + null, + fallbackVNode, + container2, + anchor2, + parentComponent2, + null, + // fallback tree will not have suspense context + namespace2, + slotScopeIds, + optimized + ); + setActiveBranch(suspense, fallbackVNode); + }, "mountFallback"); + const delayEnter = fallbackVNode.transition && fallbackVNode.transition.mode === "out-in"; + if (delayEnter) { + activeBranch.transition.afterLeave = mountFallback; + } + suspense.isInFallback = true; + unmount( + activeBranch, + parentComponent2, + null, + // no suspense so unmount hooks fire now + true + // shouldRemove + ); + if (!delayEnter) { + mountFallback(); } - } - } -}; -var index$p = { - root: { - transitionDuration: "{transition.duration}" - }, - track: { - background: "{content.border.color}", - borderRadius: "{content.border.radius}", - size: "3px" - }, - range: { - background: "{primary.color}" - }, - handle: { - width: "20px", - height: "20px", - borderRadius: "50%", - background: "{content.border.color}", - hoverBackground: "{content.border.color}", - content: { - borderRadius: "50%", - hoverBackground: "{content.background}", - width: "16px", - height: "16px", - shadow: "0px 0.5px 0px 0px rgba(0, 0, 0, 0.08), 0px 1px 1px 0px rgba(0, 0, 0, 0.14)" }, - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - color: "{focus.ring.color}", - offset: "{focus.ring.offset}", - shadow: "{focus.ring.shadow}" - } - }, - colorScheme: { - light: { - handle: { - contentBackground: "{surface.0}" + move(container2, anchor2, type) { + suspense.activeBranch && move(suspense.activeBranch, container2, anchor2, type); + suspense.container = container2; + }, + next() { + return suspense.activeBranch && next2(suspense.activeBranch); + }, + registerDep(instance, setupRenderEffect, optimized2) { + const isInPendingSuspense = !!suspense.pendingBranch; + if (isInPendingSuspense) { + suspense.deps++; } + const hydratedEl = instance.vnode.el; + instance.asyncDep.catch((err) => { + handleError(err, instance, 0); + }).then((asyncSetupResult) => { + if (instance.isUnmounted || suspense.isUnmounted || suspense.pendingId !== instance.suspenseId) { + return; + } + instance.asyncResolved = true; + const { vnode: vnode2 } = instance; + if (false) { + pushWarningContext(vnode2); + } + handleSetupResult(instance, asyncSetupResult, false); + if (hydratedEl) { + vnode2.el = hydratedEl; + } + const placeholder = !hydratedEl && instance.subTree.el; + setupRenderEffect( + instance, + vnode2, + // component may have been moved before resolve. + // if this is not a hydration, instance.subTree will be the comment + // placeholder. + parentNode2(hydratedEl || instance.subTree.el), + // anchor will not be used if this is hydration, so only need to + // consider the comment placeholder case. + hydratedEl ? null : next2(instance.subTree), + suspense, + namespace, + optimized2 + ); + if (placeholder) { + remove22(placeholder); + } + updateHOCHostEl(instance, vnode2.el); + if (false) { + popWarningContext(); + } + if (isInPendingSuspense && --suspense.deps === 0) { + suspense.resolve(); + } + }); }, - dark: { - handle: { - contentBackground: "{surface.950}" + unmount(parentSuspense2, doRemove) { + suspense.isUnmounted = true; + if (suspense.activeBranch) { + unmount( + suspense.activeBranch, + parentComponent, + parentSuspense2, + doRemove + ); + } + if (suspense.pendingBranch) { + unmount( + suspense.pendingBranch, + parentComponent, + parentSuspense2, + doRemove + ); } } + }; + return suspense; +} +__name(createSuspenseBoundary, "createSuspenseBoundary"); +function hydrateSuspense(node3, vnode, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, rendererInternals, hydrateNode) { + const suspense = vnode.suspense = createSuspenseBoundary( + vnode, + parentSuspense, + parentComponent, + node3.parentNode, + // eslint-disable-next-line no-restricted-globals + document.createElement("div"), + null, + namespace, + slotScopeIds, + optimized, + rendererInternals, + true + ); + const result = hydrateNode( + node3, + suspense.pendingBranch = vnode.ssContent, + parentComponent, + suspense, + slotScopeIds, + optimized + ); + if (suspense.deps === 0) { + suspense.resolve(false, true); } -}; -var index$o = { - root: { - gap: "0.5rem", - transitionDuration: "{transition.duration}" + return result; +} +__name(hydrateSuspense, "hydrateSuspense"); +function normalizeSuspenseChildren(vnode) { + const { shapeFlag, children } = vnode; + const isSlotChildren = shapeFlag & 32; + vnode.ssContent = normalizeSuspenseSlot( + isSlotChildren ? children.default : children + ); + vnode.ssFallback = isSlotChildren ? normalizeSuspenseSlot(children.fallback) : createVNode(Comment); +} +__name(normalizeSuspenseChildren, "normalizeSuspenseChildren"); +function normalizeSuspenseSlot(s) { + let block3; + if (isFunction$5(s)) { + const trackBlock = isBlockTreeEnabled && s._c; + if (trackBlock) { + s._d = false; + openBlock(); + } + s = s(); + if (trackBlock) { + s._d = true; + block3 = currentBlock; + closeBlock(); + } } -}; -var index$n = { - root: { - borderRadius: "{form.field.border.radius}", - roundedBorderRadius: "2rem", - raisedShadow: "0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12)" + if (isArray$5(s)) { + const singleChild = filterSingleRoot(s); + if (false) { + warn$1$1(` slots expect a single root node.`); + } + s = singleChild; } -}; -var index$m = { - root: { - background: "{content.background}", - borderColor: "{content.border.color}", - color: "{content.color}", - transitionDuration: "{transition.duration}" - }, - gutter: { - background: "{content.border.color}" - }, - handle: { - size: "24px", - background: "transparent", - borderRadius: "{content.border.radius}", - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - color: "{focus.ring.color}", - offset: "{focus.ring.offset}", - shadow: "{focus.ring.shadow}" + s = normalizeVNode(s); + if (block3 && !s.dynamicChildren) { + s.dynamicChildren = block3.filter((c) => c !== s); + } + return s; +} +__name(normalizeSuspenseSlot, "normalizeSuspenseSlot"); +function queueEffectWithSuspense(fn, suspense) { + if (suspense && suspense.pendingBranch) { + if (isArray$5(fn)) { + suspense.effects.push(...fn); + } else { + suspense.effects.push(fn); } + } else { + queuePostFlushCb(fn); } -}; -var index$l = { - root: { - transitionDuration: "{transition.duration}" - }, - separator: { - background: "{content.border.color}", - activeBackground: "{primary.color}", - margin: "0 0 0 1.625rem", - size: "2px" - }, - step: { - padding: "0.5rem", - gap: "1rem" - }, - stepHeader: { - padding: "0", - borderRadius: "{content.border.radius}", - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - color: "{focus.ring.color}", - offset: "{focus.ring.offset}", - shadow: "{focus.ring.shadow}" - }, - gap: "0.5rem" - }, - stepTitle: { - color: "{text.muted.color}", - activeColor: "{primary.color}", - fontWeight: "500" - }, - stepNumber: { - background: "{content.background}", - activeBackground: "{content.background}", - borderColor: "{content.border.color}", - activeBorderColor: "{content.border.color}", - color: "{text.muted.color}", - activeColor: "{primary.color}", - size: "2rem", - fontSize: "1.143rem", - fontWeight: "500", - borderRadius: "50%", - shadow: "0px 0.5px 0px 0px rgba(0, 0, 0, 0.06), 0px 1px 1px 0px rgba(0, 0, 0, 0.12)" - }, - steppanels: { - padding: "0.875rem 0.5rem 1.125rem 0.5rem" - }, - steppanel: { - background: "{content.background}", - color: "{content.color}", - padding: "0 0 0 1rem" +} +__name(queueEffectWithSuspense, "queueEffectWithSuspense"); +function setActiveBranch(suspense, branch) { + suspense.activeBranch = branch; + const { vnode, parentComponent } = suspense; + let el = branch.el; + while (!el && branch.component) { + branch = branch.component.subTree; + el = branch.el; } -}; -var index$k = { - root: { - transitionDuration: "{transition.duration}" - }, - separator: { - background: "{content.border.color}" - }, - itemLink: { - borderRadius: "{content.border.radius}", - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - color: "{focus.ring.color}", - offset: "{focus.ring.offset}", - shadow: "{focus.ring.shadow}" - }, - gap: "0.5rem" - }, - itemLabel: { - color: "{text.muted.color}", - activeColor: "{primary.color}", - fontWeight: "500" - }, - itemNumber: { - background: "{content.background}", - activeBackground: "{content.background}", - borderColor: "{content.border.color}", - activeBorderColor: "{content.border.color}", - color: "{text.muted.color}", - activeColor: "{primary.color}", - size: "2rem", - fontSize: "1.143rem", - fontWeight: "500", - borderRadius: "50%", - shadow: "0px 0.5px 0px 0px rgba(0, 0, 0, 0.06), 0px 1px 1px 0px rgba(0, 0, 0, 0.12)" + vnode.el = el; + if (parentComponent && parentComponent.subTree === vnode) { + parentComponent.vnode.el = el; + updateHOCHostEl(parentComponent, el); } -}; -var index$j = { - root: { - transitionDuration: "{transition.duration}" - }, - tablist: { - borderWidth: "0 0 1px 0", - background: "{content.background}", - borderColor: "{content.border.color}" - }, - item: { - background: "transparent", - hoverBackground: "transparent", - activeBackground: "transparent", - borderWidth: "0 0 1px 0", - borderColor: "{content.border.color}", - hoverBorderColor: "{content.border.color}", - activeBorderColor: "{primary.color}", - color: "{text.muted.color}", - hoverColor: "{text.color}", - activeColor: "{primary.color}", - padding: "1rem 1.125rem", - fontWeight: "600", - margin: "0 0 -1px 0", - gap: "0.5rem", - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - color: "{focus.ring.color}", - offset: "{focus.ring.offset}", - shadow: "{focus.ring.shadow}" +} +__name(setActiveBranch, "setActiveBranch"); +function isVNodeSuspensible(vnode) { + const suspensible = vnode.props && vnode.props.suspensible; + return suspensible != null && suspensible !== false; +} +__name(isVNodeSuspensible, "isVNodeSuspensible"); +function injectHook(type, hook, target = currentInstance, prepend2 = false) { + if (target) { + const hooks = target[type] || (target[type] = []); + const wrappedHook = hook.__weh || (hook.__weh = (...args) => { + pauseTracking(); + const reset2 = setCurrentInstance(target); + const res = callWithAsyncErrorHandling(hook, target, type, args); + reset2(); + resetTracking(); + return res; + }); + if (prepend2) { + hooks.unshift(wrappedHook); + } else { + hooks.push(wrappedHook); } - }, - itemIcon: { - color: "{text.muted.color}", - hoverColor: "{text.color}", - activeColor: "{primary.color}" - }, - activeBar: { - height: "1px", - bottom: "-1px", - background: "{primary.color}" + return wrappedHook; + } else if (false) { + const apiName = toHandlerKey(ErrorTypeStrings$1[type].replace(/ hook$/, "")); + warn$1$1( + `${apiName} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup(). If you are using async setup(), make sure to register lifecycle hooks before the first await statement.` + ); } -}; -var index$i = { - root: { - transitionDuration: "{transition.duration}" - }, - tablist: { - borderWidth: "0 0 1px 0", - background: "{content.background}", - borderColor: "{content.border.color}" - }, - tab: { - background: "transparent", - hoverBackground: "transparent", - activeBackground: "transparent", - borderWidth: "0 0 1px 0", - borderColor: "{content.border.color}", - hoverBorderColor: "{content.border.color}", - activeBorderColor: "{primary.color}", - color: "{text.muted.color}", - hoverColor: "{text.color}", - activeColor: "{primary.color}", - padding: "1rem 1.125rem", - fontWeight: "600", - margin: "0 0 -1px 0", - gap: "0.5rem", - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - color: "{focus.ring.color}", - offset: "-1px", - shadow: "{focus.ring.shadow}" - } - }, - tabpanel: { - background: "{content.background}", - color: "{content.color}", - padding: "0.875rem 1.125rem 1.125rem 1.125rem", - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - color: "{focus.ring.color}", - offset: "{focus.ring.offset}", - shadow: "inset {focus.ring.shadow}" - } - }, - navButton: { - background: "{content.background}", - color: "{text.muted.color}", - hoverColor: "{text.color}", - width: "2.5rem", - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - color: "{focus.ring.color}", - offset: "-1px", - shadow: "{focus.ring.shadow}" - } - }, - activeBar: { - height: "1px", - bottom: "-1px", - background: "{primary.color}" - }, - colorScheme: { - light: { - navButton: { - shadow: "0px 0px 10px 50px rgba(255, 255, 255, 0.6)" +} +__name(injectHook, "injectHook"); +const createHook = /* @__PURE__ */ __name((lifecycle2) => (hook, target = currentInstance) => { + if (!isInSSRComponentSetup || lifecycle2 === "sp") { + injectHook(lifecycle2, (...args) => hook(...args), target); + } +}, "createHook"); +const onBeforeMount = createHook("bm"); +const onMounted = createHook("m"); +const onBeforeUpdate = createHook("bu"); +const onUpdated = createHook("u"); +const onBeforeUnmount = createHook("bum"); +const onUnmounted = createHook("um"); +const onServerPrefetch = createHook("sp"); +const onRenderTriggered = createHook( + "rtg" +); +const onRenderTracked = createHook( + "rtc" +); +function onErrorCaptured(hook, target = currentInstance) { + injectHook("ec", hook, target); +} +__name(onErrorCaptured, "onErrorCaptured"); +function validateDirectiveName(name2) { + if (isBuiltInDirective(name2)) { + warn$1$1("Do not use built-in directive ids as custom directive id: " + name2); + } +} +__name(validateDirectiveName, "validateDirectiveName"); +function withDirectives(vnode, directives) { + if (currentRenderingInstance === null) { + return vnode; + } + const instance = getComponentPublicInstance(currentRenderingInstance); + const bindings = vnode.dirs || (vnode.dirs = []); + for (let i2 = 0; i2 < directives.length; i2++) { + let [dir, value3, arg, modifiers2 = EMPTY_OBJ] = directives[i2]; + if (dir) { + if (isFunction$5(dir)) { + dir = { + mounted: dir, + updated: dir + }; } - }, - dark: { - navButton: { - shadow: "0px 0px 10px 50px color-mix(in srgb, {content.background}, transparent 50%)" + if (dir.deep) { + traverse(value3); } + bindings.push({ + dir, + instance, + value: value3, + oldValue: void 0, + arg, + modifiers: modifiers2 + }); } } -}; -var index$h = { - root: { - transitionDuration: "{transition.duration}" - }, - tabList: { - background: "{content.background}", - borderColor: "{content.border.color}" - }, - tab: { - borderColor: "{content.border.color}", - activeBorderColor: "{primary.color}", - color: "{text.muted.color}", - hoverColor: "{text.color}", - activeColor: "{primary.color}" - }, - tabPanel: { - background: "{content.background}", - color: "{content.color}" - }, - navButton: { - background: "{content.background}", - color: "{text.muted.color}", - hoverColor: "{text.color}" - }, - colorScheme: { - light: { - navButton: { - shadow: "0px 0px 10px 50px rgba(255, 255, 255, 0.6)" + return vnode; +} +__name(withDirectives, "withDirectives"); +function invokeDirectiveHook(vnode, prevVNode, instance, name2) { + const bindings = vnode.dirs; + const oldBindings = prevVNode && prevVNode.dirs; + for (let i2 = 0; i2 < bindings.length; i2++) { + const binding = bindings[i2]; + if (oldBindings) { + binding.oldValue = oldBindings[i2].value; + } + let hook = binding.dir[name2]; + if (hook) { + pauseTracking(); + callWithAsyncErrorHandling(hook, instance, 8, [ + vnode.el, + binding, + vnode, + prevVNode + ]); + resetTracking(); + } + } +} +__name(invokeDirectiveHook, "invokeDirectiveHook"); +function renderList(source, renderItem, cache2, index2) { + let ret; + const cached = cache2 && cache2[index2]; + if (isArray$5(source) || isString$8(source)) { + ret = new Array(source.length); + for (let i2 = 0, l = source.length; i2 < l; i2++) { + ret[i2] = renderItem(source[i2], i2, void 0, cached && cached[i2]); + } + } else if (typeof source === "number") { + if (false) { + warn$1$1(`The v-for range expect an integer value but got ${source}.`); + } + ret = new Array(source); + for (let i2 = 0; i2 < source; i2++) { + ret[i2] = renderItem(i2 + 1, i2, void 0, cached && cached[i2]); + } + } else if (isObject$7(source)) { + if (source[Symbol.iterator]) { + ret = Array.from( + source, + (item2, i2) => renderItem(item2, i2, void 0, cached && cached[i2]) + ); + } else { + const keys2 = Object.keys(source); + ret = new Array(keys2.length); + for (let i2 = 0, l = keys2.length; i2 < l; i2++) { + const key = keys2[i2]; + ret[i2] = renderItem(source[key], key, i2, cached && cached[i2]); } - }, - dark: { - navButton: { - shadow: "0px 0px 10px 50px color-mix(in srgb, {content.background}, transparent 50%)" + } + } else { + ret = []; + } + if (cache2) { + cache2[index2] = ret; + } + return ret; +} +__name(renderList, "renderList"); +function createSlots(slots, dynamicSlots) { + for (let i2 = 0; i2 < dynamicSlots.length; i2++) { + const slot = dynamicSlots[i2]; + if (isArray$5(slot)) { + for (let j = 0; j < slot.length; j++) { + slots[slot[j].name] = slot[j].fn; } + } else if (slot) { + slots[slot.name] = slot.key ? (...args) => { + const res = slot.fn(...args); + if (res) res.key = slot.key; + return res; + } : slot.fn; } } -}; -var index$g = { - root: { - fontSize: "0.875rem", - fontWeight: "700", - padding: "0.25rem 0.5rem", - gap: "0.25rem", - borderRadius: "{content.border.radius}", - roundedBorderRadius: "{border.radius.xl}" - }, - icon: { - size: "0.75rem" - }, - colorScheme: { - light: { - primary: { - background: "{primary.100}", - color: "{primary.700}" - }, - secondary: { - background: "{surface.100}", - color: "{surface.600}" - }, - success: { - background: "{green.100}", - color: "{green.700}" - }, - info: { - background: "{sky.100}", - color: "{sky.700}" - }, - warn: { - background: "{orange.100}", - color: "{orange.700}" - }, - danger: { - background: "{red.100}", - color: "{red.700}" - }, - contrast: { - background: "{surface.950}", - color: "{surface.0}" + return slots; +} +__name(createSlots, "createSlots"); +/*! #__NO_SIDE_EFFECTS__ */ +// @__NO_SIDE_EFFECTS__ +function defineComponent(options4, extraOptions) { + return isFunction$5(options4) ? ( + // #8326: extend call and options.name access are considered side-effects + // by Rollup, so we have to wrap it in a pure-annotated IIFE. + /* @__PURE__ */ (() => extend$1({ name: options4.name }, extraOptions, { setup: options4 }))() + ) : options4; +} +__name(defineComponent, "defineComponent"); +const isAsyncWrapper = /* @__PURE__ */ __name((i2) => !!i2.type.__asyncLoader, "isAsyncWrapper"); +/*! #__NO_SIDE_EFFECTS__ */ +// @__NO_SIDE_EFFECTS__ +function defineAsyncComponent(source) { + if (isFunction$5(source)) { + source = { loader: source }; + } + const { + loader, + loadingComponent, + errorComponent, + delay = 200, + timeout, + // undefined = never times out + suspensible = true, + onError: userOnError + } = source; + let pendingRequest = null; + let resolvedComp; + let retries = 0; + const retry = /* @__PURE__ */ __name(() => { + retries++; + pendingRequest = null; + return load2(); + }, "retry"); + const load2 = /* @__PURE__ */ __name(() => { + let thisRequest; + return pendingRequest || (thisRequest = pendingRequest = loader().catch((err) => { + err = err instanceof Error ? err : new Error(String(err)); + if (userOnError) { + return new Promise((resolve2, reject3) => { + const userRetry = /* @__PURE__ */ __name(() => resolve2(retry()), "userRetry"); + const userFail = /* @__PURE__ */ __name(() => reject3(err), "userFail"); + userOnError(err, userRetry, userFail, retries + 1); + }); + } else { + throw err; + } + }).then((comp) => { + if (thisRequest !== pendingRequest && pendingRequest) { + return pendingRequest; + } + if (false) { + warn$1$1( + `Async component loader resolved to undefined. If you are using retry(), make sure to return its return value.` + ); + } + if (comp && (comp.__esModule || comp[Symbol.toStringTag] === "Module")) { + comp = comp.default; } + if (false) { + throw new Error(`Invalid async component load result: ${comp}`); + } + resolvedComp = comp; + return comp; + })); + }, "load"); + return /* @__PURE__ */ defineComponent({ + name: "AsyncComponentWrapper", + __asyncLoader: load2, + get __asyncResolved() { + return resolvedComp; }, - dark: { - primary: { - background: "color-mix(in srgb, {primary.500}, transparent 84%)", - color: "{primary.300}" - }, - secondary: { - background: "{surface.800}", - color: "{surface.300}" - }, - success: { - background: "color-mix(in srgb, {green.500}, transparent 84%)", - color: "{green.300}" - }, - info: { - background: "color-mix(in srgb, {sky.500}, transparent 84%)", - color: "{sky.300}" - }, - warn: { - background: "color-mix(in srgb, {orange.500}, transparent 84%)", - color: "{orange.300}" - }, - danger: { - background: "color-mix(in srgb, {red.500}, transparent 84%)", - color: "{red.300}" - }, - contrast: { - background: "{surface.0}", - color: "{surface.950}" + setup() { + const instance = currentInstance; + if (resolvedComp) { + return () => createInnerComp(resolvedComp, instance); + } + const onError = /* @__PURE__ */ __name((err) => { + pendingRequest = null; + handleError( + err, + instance, + 13, + !errorComponent + ); + }, "onError"); + if (suspensible && instance.suspense || isInSSRComponentSetup) { + return load2().then((comp) => { + return () => createInnerComp(comp, instance); + }).catch((err) => { + onError(err); + return () => errorComponent ? createVNode(errorComponent, { + error: err + }) : null; + }); + } + const loaded = ref(false); + const error2 = ref(); + const delayed = ref(!!delay); + if (delay) { + setTimeout(() => { + delayed.value = false; + }, delay); + } + if (timeout != null) { + setTimeout(() => { + if (!loaded.value && !error2.value) { + const err = new Error( + `Async component timed out after ${timeout}ms.` + ); + onError(err); + error2.value = err; + } + }, timeout); } + load2().then(() => { + loaded.value = true; + if (instance.parent && isKeepAlive(instance.parent.vnode)) { + instance.parent.effect.dirty = true; + queueJob(instance.parent.update); + } + }).catch((err) => { + onError(err); + error2.value = err; + }); + return () => { + if (loaded.value && resolvedComp) { + return createInnerComp(resolvedComp, instance); + } else if (error2.value && errorComponent) { + return createVNode(errorComponent, { + error: error2.value + }); + } else if (loadingComponent && !delayed.value) { + return createVNode(loadingComponent); + } + }; } + }); +} +__name(defineAsyncComponent, "defineAsyncComponent"); +function createInnerComp(comp, parent) { + const { ref: ref22, props, children, ce } = parent.vnode; + const vnode = createVNode(comp, props, children); + vnode.ref = ref22; + vnode.ce = ce; + delete parent.vnode.ce; + return vnode; +} +__name(createInnerComp, "createInnerComp"); +function renderSlot(slots, name2, props = {}, fallback, noSlotted) { + if (currentRenderingInstance.isCE || currentRenderingInstance.parent && isAsyncWrapper(currentRenderingInstance.parent) && currentRenderingInstance.parent.isCE) { + if (name2 !== "default") props.name = name2; + return createVNode("slot", props, fallback && fallback()); } -}; -var index$f = { - root: { - background: "{form.field.background}", - borderColor: "{form.field.border.color}", - color: "{form.field.color}", - height: "18rem", - padding: "{form.field.padding.y} {form.field.padding.x}", - borderRadius: "{form.field.border.radius}" - }, - prompt: { - gap: "0.25rem" - }, - commandResponse: { - margin: "2px 0" + let slot = slots[name2]; + if (false) { + warn$1$1( + `SSR-optimized slot function detected in a non-SSR-optimized render function. You need to mark this component with $dynamic-slots in the parent template.` + ); + slot = /* @__PURE__ */ __name(() => [], "slot"); } -}; -var index$e = { - root: { - background: "{form.field.background}", - disabledBackground: "{form.field.disabled.background}", - filledBackground: "{form.field.filled.background}", - filledFocusBackground: "{form.field.filled.focus.background}", - borderColor: "{form.field.border.color}", - hoverBorderColor: "{form.field.hover.border.color}", - focusBorderColor: "{form.field.focus.border.color}", - invalidBorderColor: "{form.field.invalid.border.color}", - color: "{form.field.color}", - disabledColor: "{form.field.disabled.color}", - placeholderColor: "{form.field.placeholder.color}", - shadow: "{form.field.shadow}", - paddingX: "{form.field.padding.x}", - paddingY: "{form.field.padding.y}", - borderRadius: "{form.field.border.radius}", - focusRing: { - width: "{form.field.focus.ring.width}", - style: "{form.field.focus.ring.style}", - color: "{form.field.focus.ring.color}", - offset: "{form.field.focus.ring.offset}", - shadow: "{form.field.focus.ring.shadow}" + if (slot && slot._c) { + slot._d = false; + } + openBlock(); + const validSlotContent = slot && ensureValidVNode(slot(props)); + const rendered = createBlock( + Fragment$1, + { + key: props.key || // slot content array of a dynamic conditional slot may have a branch + // key attached in the `createSlots` helper, respect that + validSlotContent && validSlotContent.key || `_${name2}` }, - transitionDuration: "{form.field.transition.duration}" + validSlotContent || (fallback ? fallback() : []), + validSlotContent && slots._ === 1 ? 64 : -2 + ); + if (!noSlotted && rendered.scopeId) { + rendered.slotScopeIds = [rendered.scopeId + "-s"]; } -}; -var index$d = { - root: { - background: "{content.background}", - borderColor: "{content.border.color}", - color: "{content.color}", - borderRadius: "{content.border.radius}", - shadow: "{overlay.navigation.shadow}", - transitionDuration: "{transition.duration}" - }, - list: { - padding: "{navigation.list.padding}", - gap: "{navigation.list.gap}" - }, - item: { - focusBackground: "{navigation.item.focus.background}", - activeBackground: "{navigation.item.active.background}", - color: "{navigation.item.color}", - focusColor: "{navigation.item.focus.color}", - activeColor: "{navigation.item.active.color}", - padding: "{navigation.item.padding}", - borderRadius: "{navigation.item.border.radius}", - gap: "{navigation.item.gap}", - icon: { - color: "{navigation.item.icon.color}", - focusColor: "{navigation.item.icon.focus.color}", - activeColor: "{navigation.item.icon.active.color}" - } - }, - submenuLabel: { - padding: "{navigation.submenu.label.padding}", - fontWeight: "{navigation.submenu.label.font.weight}", - background: "{navigation.submenu.label.background.}", - color: "{navigation.submenu.label.color}" - }, - submenuIcon: { - size: "{navigation.submenu.icon.size}", - color: "{navigation.submenu.icon.color}", - focusColor: "{navigation.submenu.icon.focus.color}", - activeColor: "{navigation.submenu.icon.active.color}" - }, - separator: { - borderColor: "{content.border.color}" + if (slot && slot._c) { + slot._d = true; } -}; -var index$c = { - event: { - minHeight: "5rem" - }, - horizontal: { - eventContent: { - padding: "1rem 0" + return rendered; +} +__name(renderSlot, "renderSlot"); +function ensureValidVNode(vnodes) { + return vnodes.some((child) => { + if (!isVNode$1(child)) return true; + if (child.type === Comment) return false; + if (child.type === Fragment$1 && !ensureValidVNode(child.children)) + return false; + return true; + }) ? vnodes : null; +} +__name(ensureValidVNode, "ensureValidVNode"); +function toHandlers(obj, preserveCaseIfNecessary) { + const ret = {}; + if (false) { + warn$1$1(`v-on with no argument expects an object value.`); + return ret; + } + for (const key in obj) { + ret[preserveCaseIfNecessary && /[A-Z]/.test(key) ? `on:${key}` : toHandlerKey(key)] = obj[key]; + } + return ret; +} +__name(toHandlers, "toHandlers"); +const getPublicInstance = /* @__PURE__ */ __name((i2) => { + if (!i2) return null; + if (isStatefulComponent(i2)) return getComponentPublicInstance(i2); + return getPublicInstance(i2.parent); +}, "getPublicInstance"); +const publicPropertiesMap = ( + // Move PURE marker to new line to workaround compiler discarding it + // due to type annotation + /* @__PURE__ */ extend$1(/* @__PURE__ */ Object.create(null), { + $: /* @__PURE__ */ __name((i2) => i2, "$"), + $el: /* @__PURE__ */ __name((i2) => i2.vnode.el, "$el"), + $data: /* @__PURE__ */ __name((i2) => i2.data, "$data"), + $props: /* @__PURE__ */ __name((i2) => false ? shallowReadonly(i2.props) : i2.props, "$props"), + $attrs: /* @__PURE__ */ __name((i2) => false ? shallowReadonly(i2.attrs) : i2.attrs, "$attrs"), + $slots: /* @__PURE__ */ __name((i2) => false ? shallowReadonly(i2.slots) : i2.slots, "$slots"), + $refs: /* @__PURE__ */ __name((i2) => false ? shallowReadonly(i2.refs) : i2.refs, "$refs"), + $parent: /* @__PURE__ */ __name((i2) => getPublicInstance(i2.parent), "$parent"), + $root: /* @__PURE__ */ __name((i2) => getPublicInstance(i2.root), "$root"), + $emit: /* @__PURE__ */ __name((i2) => i2.emit, "$emit"), + $options: /* @__PURE__ */ __name((i2) => true ? resolveMergedOptions(i2) : i2.type, "$options"), + $forceUpdate: /* @__PURE__ */ __name((i2) => i2.f || (i2.f = () => { + i2.effect.dirty = true; + queueJob(i2.update); + }), "$forceUpdate"), + $nextTick: /* @__PURE__ */ __name((i2) => i2.n || (i2.n = nextTick.bind(i2.proxy)), "$nextTick"), + $watch: /* @__PURE__ */ __name((i2) => true ? instanceWatch.bind(i2) : NOOP, "$watch") + }) +); +const isReservedPrefix = /* @__PURE__ */ __name((key) => key === "_" || key === "$", "isReservedPrefix"); +const hasSetupBinding = /* @__PURE__ */ __name((state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn$3(state, key), "hasSetupBinding"); +const PublicInstanceProxyHandlers = { + get({ _: instance }, key) { + if (key === "__v_skip") { + return true; } - }, - vertical: { - eventContent: { - padding: "0 1rem" + const { ctx, setupState, data: data23, props, accessCache, type, appContext } = instance; + if (false) { + return true; } - }, - eventMarker: { - size: "1.125rem", - borderRadius: "50%", - borderWidth: "2px", - background: "{content.background}", - borderColor: "{content.border.color}", - content: { - borderRadius: "50%", - size: "0.375rem", - background: "{primary.color}", - insetShadow: "0px 0.5px 0px 0px rgba(0, 0, 0, 0.06), 0px 1px 1px 0px rgba(0, 0, 0, 0.12)" + let normalizedProps; + if (key[0] !== "$") { + const n = accessCache[key]; + if (n !== void 0) { + switch (n) { + case 1: + return setupState[key]; + case 2: + return data23[key]; + case 4: + return ctx[key]; + case 3: + return props[key]; + } + } else if (hasSetupBinding(setupState, key)) { + accessCache[key] = 1; + return setupState[key]; + } else if (data23 !== EMPTY_OBJ && hasOwn$3(data23, key)) { + accessCache[key] = 2; + return data23[key]; + } else if ( + // only cache other properties when instance has declared (thus stable) + // props + (normalizedProps = instance.propsOptions[0]) && hasOwn$3(normalizedProps, key) + ) { + accessCache[key] = 3; + return props[key]; + } else if (ctx !== EMPTY_OBJ && hasOwn$3(ctx, key)) { + accessCache[key] = 4; + return ctx[key]; + } else if (shouldCacheAccess) { + accessCache[key] = 0; + } + } + const publicGetter = publicPropertiesMap[key]; + let cssModule, globalProperties; + if (publicGetter) { + if (key === "$attrs") { + track(instance.attrs, "get", ""); + } else if (false) { + track(instance, "get", key); + } + return publicGetter(instance); + } else if ( + // css module (injected by vue-loader) + (cssModule = type.__cssModules) && (cssModule = cssModule[key]) + ) { + return cssModule; + } else if (ctx !== EMPTY_OBJ && hasOwn$3(ctx, key)) { + accessCache[key] = 4; + return ctx[key]; + } else if ( + // global properties + globalProperties = appContext.config.globalProperties, hasOwn$3(globalProperties, key) + ) { + { + return globalProperties[key]; + } + } else if (false) { + if (data23 !== EMPTY_OBJ && isReservedPrefix(key[0]) && hasOwn$3(data23, key)) { + warn$1$1( + `Property ${JSON.stringify( + key + )} must be accessed via $data because it starts with a reserved character ("$" or "_") and is not proxied on the render context.` + ); + } else if (instance === currentRenderingInstance) { + warn$1$1( + `Property ${JSON.stringify(key)} was accessed during render but is not defined on instance.` + ); + } } }, - eventConnector: { - color: "{content.border.color}", - size: "2px" - } -}; -var index$b = { - root: { - width: "25rem", - borderRadius: "{content.border.radius}", - borderWidth: "1px", - transitionDuration: "{transition.duration}" - }, - icon: { - size: "1.125rem" - }, - content: { - padding: "{overlay.popover.padding}", - gap: "0.5rem" - }, - text: { - gap: "0.5rem" - }, - summary: { - fontWeight: "500", - fontSize: "1rem" - }, - detail: { - fontWeight: "500", - fontSize: "0.875rem" - }, - closeButton: { - width: "1.75rem", - height: "1.75rem", - borderRadius: "50%", - focusRing: { - width: "{focus.ring.width}", - style: "{focus.ring.style}", - offset: "{focus.ring.offset}" + set({ _: instance }, key, value3) { + const { data: data23, setupState, ctx } = instance; + if (hasSetupBinding(setupState, key)) { + setupState[key] = value3; + return true; + } else if (false) { + warn$1$1(`Cannot mutate - + +