From 9529e3747ce4627abbb480fd205dc07e2aa806a5 Mon Sep 17 00:00:00 2001 From: Yun Chan Date: Tue, 25 Aug 2026 03:50:28 +0900 Subject: [PATCH] =?UTF-8?q?feat(showcase):=20=ED=8A=B8=EC=9B=AC=ED=8B=B0?= =?UTF-8?q?=EC=98=A8=EC=8A=A4=20=EC=82=AC=EC=9D=B4=ED=8A=B8=EB=A5=BC=20?= =?UTF-8?q?=EC=A0=84=EB=A9=B4=20=EA=B0=9C=ED=8E=B8=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/site/design.md | 26 + apps/site/gate-report.md | 129 +- apps/site/gate.config.json | 9 + apps/site/gate.twentyoz-products.config.json | 43 + apps/site/package.json | 6 + .../assets/Pretendard-LICENSE.txt | 94 + .../work/twentyoz-corp/assets/core-dark.webp | Bin 0 -> 67326 bytes .../work/twentyoz-corp/assets/core-light.webp | Bin 0 -> 46520 bytes .../work/twentyoz-corp/assets/core.iife.js | 4385 +++++++++++++++++ .../assets/pretendard-twentyoz.woff2 | Bin 0 -> 91352 bytes .../assets/twentyoz-field-core-LICENSE.txt | 14 + .../assets/twentyoz-field-core.glb | Bin 0 -> 697076 bytes .../site/public/work/twentyoz-corp/index.html | 830 ++-- .../public/work/twentyoz-corp/products.html | 161 + .../work/twentyoz-corp/scripts/core-boot.js | 100 + .../work/twentyoz-corp/styles/catalog.css | 352 ++ .../public/work/twentyoz-corp/styles/main.css | 1884 ++++--- .../work/twentyoz-corp/styles/tokens.css | 242 +- .../research/twentyoz-redesign-2026-08-24.md | 229 + apps/site/src/showcases/twentyoz-core.js | 660 +++ apps/site/tools/build-showcase-assets.mjs | 48 + apps/site/tools/design-gate.mjs | 517 ++ apps/site/tools/e2e-report.md | 2 +- apps/site/tools/showcase-audit.mjs | 15 +- apps/site/tools/twentyoz-e2e-report.md | 25 + apps/site/tools/twentyoz-e2e.mjs | 415 ++ apps/site/tools/verify-report.md | 28 +- apps/site/tools/verify.mjs | 15 +- pnpm-lock.yaml | 3 + 29 files changed, 8906 insertions(+), 1326 deletions(-) create mode 100644 apps/site/gate.twentyoz-products.config.json create mode 100644 apps/site/public/work/twentyoz-corp/assets/Pretendard-LICENSE.txt create mode 100644 apps/site/public/work/twentyoz-corp/assets/core-dark.webp create mode 100644 apps/site/public/work/twentyoz-corp/assets/core-light.webp create mode 100644 apps/site/public/work/twentyoz-corp/assets/core.iife.js create mode 100644 apps/site/public/work/twentyoz-corp/assets/pretendard-twentyoz.woff2 create mode 100644 apps/site/public/work/twentyoz-corp/assets/twentyoz-field-core-LICENSE.txt create mode 100644 apps/site/public/work/twentyoz-corp/assets/twentyoz-field-core.glb create mode 100644 apps/site/public/work/twentyoz-corp/products.html create mode 100644 apps/site/public/work/twentyoz-corp/scripts/core-boot.js create mode 100644 apps/site/public/work/twentyoz-corp/styles/catalog.css create mode 100644 apps/site/research/twentyoz-redesign-2026-08-24.md create mode 100644 apps/site/src/showcases/twentyoz-core.js create mode 100644 apps/site/tools/build-showcase-assets.mjs create mode 100644 apps/site/tools/design-gate.mjs create mode 100644 apps/site/tools/twentyoz-e2e-report.md create mode 100644 apps/site/tools/twentyoz-e2e.mjs diff --git a/apps/site/design.md b/apps/site/design.md index d43f4ae..9cf8ee6 100644 --- a/apps/site/design.md +++ b/apps/site/design.md @@ -1077,3 +1077,29 @@ Pretendard `dynamic-subset` 은 유니코드 범위별로 파일을 쪼개고 - **히어로 헤드라인 줄 수 초과** — `pulsegate` 320px 에서 4줄 / 1440px 에서 3줄, `synapse-bci` 3줄 (카운트 규칙 상한 2줄) 전부 `node tools/showcase-audit.mjs ` 로 재현된다. + +## TWENTYOZ 쇼케이스 — Precision Spatial (2026-08-24) + +### 제품·카피 기준 + +- 정보 구조와 사실 카피의 단일 기준은 `https://twentyoz.kr/`의 회사·제품·뉴스 공개 자료다. +- 메인 순서는 `현장 → 운영 원칙 → 제품 → 프로젝트 기록 → 회사 → 문의`다. +- 제품 상세는 `products.html` 한 페이지에서 VIVEN, EduBill, XD Hub, XD Works를 기능·기술·사양·운영 순서로 공개한다. +- 공개되지 않은 파트너 역할, 성과 수치, 채용 상태를 추정하지 않는다. 모든 한국어 인터페이스 카피는 존댓말 또는 공식 명사형을 사용한다. + +### 시각·3D 규칙 + +- 콘셉트는 **정밀한 공간 계기**다. 평면 DOM은 직각·선·여백·타이포가 소유하고, 원형과 곡면은 3D 코어만 소유한다. +- 외부 하드서피스 모델은 Javier Martín Hidalgo의 `Scifi Drone 1.1`을 CC BY 4.0 조건으로 사용하며, 화면 푸터와 로컬 라이선스 파일에 저작자·원본·라이선스를 표시한다. +- 중심 모델은 전면 `z=0.46`, 호박색 신호 링은 `z=-0.48`, 청록색 스펙트럼 링은 더 크고 얇게 `z=-0.64`에 둔다. 두 링은 코어 뒤에서 깊이 가림되어 형태가 겹쳐 보이지 않아야 한다. +- 셰이더는 필드 셸, 제한적 bloom, 미세 색수차·비네트·그레인에만 사용한다. 모델 재질을 덮는 임의 `onBeforeCompile`은 금지한다. +- WebGL 실패·감소 모션·문서 비가시 상태에서는 정적 테마별 WebP와 완성된 DOM이 그대로 남아야 한다. + +### 검증 기준 + +- `npm run test:e2e:twentyoz`: 메인 320/390/768/1440, 네 현장 상호작용, WebGL 모델·셰이더·이중 링, 라이트/다크 axe, 폴백, 제품 상세, 성능·런타임을 검사한다. +- `npm run test:design:gate`: 메인 쇼케이스의 죽은 CSS·토큰·메타·오버플로·타입·대비·터치·인셋을 검사한다. +- `npm run test:design:products`: 공통 CSS의 죽은 선택자는 메인 게이트에 위임하고 제품 상세의 실렌더 게이트를 검사한다. +- `npm run verify`: 위 트웬티온스 전용 게이트와 저장소 전체 L0~L6를 한 번에 실행한다. +- 3D 번들 예산은 gzip 200KB 이하이며 현재 기준은 166,225B다. GLB는 697,076B이며 로컬 폰트·폴백 이미지를 포함한 예산은 전용 E2E에서 하드 실패한다. +- 2026-08-25 국소 조정: 3D 화면 중심은 모바일 50%, 태블릿 74%, 소형 PC 64%, 와이드 PC 60%를 기준으로 하며, 중복 현장 상태는 보조기술에만 알리고 3D 모션 제어는 히어로 CTA 행에 둔다. diff --git a/apps/site/gate-report.md b/apps/site/gate-report.md index decc570..7aaeac5 100644 --- a/apps/site/gate-report.md +++ b/apps/site/gate-report.md @@ -1,124 +1,21 @@ -# 게이트 리포트 — 2026-08-23 06:40 +# 게이트 리포트 — 2026-08-24 17:12 **전 항목 통과 — 배포 가능** ``` PASS L0 정적 — SKIP — checks.static=false -PASS gaon-lms 죽은 선택자 — 2개 CSS 전 클래스 사용 중(무시 2접두사) -PASS dure-enrollment 죽은 선택자 — 2개 CSS 전 클래스 사용 중(무시 2접두사) -PASS gaon-lms 토큰 위생 — 색 0·radius 0 리터럴(토큰 1파일) -PASS dure-enrollment 토큰 위생 — 색 0·radius 0 리터럴(토큰 1파일) -PASS gaon-lms SEO/meta — title 18자·desc 74자·OG✓·alt 0결 -PASS gaon-lms/dashboard 오버플로 — 320/375/390/768/1440 -PASS gaon-lms/dashboard h1 1줄 -PASS gaon-lms/dashboard 수축 없음 -PASS gaon-lms/dashboard 리듬·트랙 -PASS gaon-lms/dashboard 대비 AA -PASS gaon-lms/students 오버플로 — 320/375/390/768/1440 -PASS gaon-lms/students h1 — SKIP — 요소 없음 -PASS gaon-lms/students 수축 없음 -PASS gaon-lms/students 리듬·트랙 -PASS gaon-lms/students 대비 AA -PASS gaon-lms/attendance 오버플로 — 320/375/390/768/1440 -PASS gaon-lms/attendance h1 — SKIP — 요소 없음 -PASS gaon-lms/attendance 수축 없음 -PASS gaon-lms/attendance 리듬·트랙 -PASS gaon-lms/attendance 대비 AA -PASS gaon-lms/grades 오버플로 — 320/375/390/768/1440 -PASS gaon-lms/grades h1 — SKIP — 요소 없음 -PASS gaon-lms/grades 수축 없음 -PASS gaon-lms/grades 리듬·트랙 -PASS gaon-lms/grades 대비 AA -PASS gaon-lms/files 오버플로 — 320/375/390/768/1440 -PASS gaon-lms/files h1 — SKIP — 요소 없음 -PASS gaon-lms/files 수축 없음 -PASS gaon-lms/files 리듬·트랙 -PASS gaon-lms/files 대비 AA -PASS gaon-lms/calendar 오버플로 — 320/375/390/768/1440 -PASS gaon-lms/calendar h1 — SKIP — 요소 없음 -PASS gaon-lms/calendar 수축 없음 -PASS gaon-lms/calendar 리듬·트랙 -PASS gaon-lms/calendar 대비 AA -PASS gaon-lms/counsel 오버플로 — 320/375/390/768/1440 -PASS gaon-lms/counsel h1 — SKIP — 요소 없음 -PASS gaon-lms/counsel 수축 없음 -PASS gaon-lms/counsel 리듬·트랙 -PASS gaon-lms/counsel 대비 AA -PASS gaon-lms/report 오버플로 — 320/375/390/768/1440 -PASS gaon-lms/report h1 — SKIP — 요소 없음 -PASS gaon-lms/report 수축 없음 -PASS gaon-lms/report 리듬·트랙 -PASS gaon-lms/report 대비 AA -PASS gaon-lms/notice 오버플로 — 320/375/390/768/1440 -PASS gaon-lms/notice h1 — SKIP — 요소 없음 -PASS gaon-lms/notice 수축 없음 -PASS gaon-lms/notice 리듬·트랙 -PASS gaon-lms/notice 대비 AA -PASS gaon-lms 스케일×폭 h1 — scales 1/1.3 -PASS gaon-lms 브랜드 1줄 -PASS gaon-lms/dashboard 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px -PASS gaon-lms/students 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px -PASS gaon-lms/attendance 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px -PASS gaon-lms/grades 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px -PASS gaon-lms/files 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px -PASS gaon-lms/calendar 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px -PASS gaon-lms/counsel 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px -PASS gaon-lms/report 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px -PASS gaon-lms/notice 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px -PASS gaon-lms/dashboard 왼쪽 인셋 — 최소 텍스트 시작 16px -PASS gaon-lms/students 왼쪽 인셋 — 최소 텍스트 시작 15px -PASS gaon-lms/attendance 왼쪽 인셋 — 최소 텍스트 시작 16px -PASS gaon-lms/grades 왼쪽 인셋 — 최소 텍스트 시작 16px -PASS gaon-lms/files 왼쪽 인셋 — 최소 텍스트 시작 16px -PASS gaon-lms/calendar 왼쪽 인셋 — 최소 텍스트 시작 16px -PASS gaon-lms/counsel 왼쪽 인셋 — 최소 텍스트 시작 16px -PASS gaon-lms/report 왼쪽 인셋 — 최소 텍스트 시작 16px -PASS gaon-lms/notice 왼쪽 인셋 — 최소 텍스트 시작 16px -PASS dure-enrollment SEO/meta — title 15자·desc 79자·OG✓·alt 0결 -PASS dure-enrollment/catalog 오버플로 — 320/375/390/768/1440 -PASS dure-enrollment/catalog h1 1줄 -PASS dure-enrollment/catalog 수축 없음 -PASS dure-enrollment/catalog 리듬·트랙 -PASS dure-enrollment/catalog 대비 AA -PASS dure-enrollment/starred 오버플로 — 320/375/390/768/1440 -PASS dure-enrollment/starred h1 — SKIP — 요소 없음 -PASS dure-enrollment/starred 수축 없음 -PASS dure-enrollment/starred 리듬·트랙 -PASS dure-enrollment/starred 대비 AA -PASS dure-enrollment/enrollments 오버플로 — 320/375/390/768/1440 -PASS dure-enrollment/enrollments h1 — SKIP — 요소 없음 -PASS dure-enrollment/enrollments 수축 없음 -PASS dure-enrollment/enrollments 리듬·트랙 -PASS dure-enrollment/enrollments 대비 AA -PASS dure-enrollment/credits 오버플로 — 320/375/390/768/1440 -PASS dure-enrollment/credits h1 — SKIP — 요소 없음 -PASS dure-enrollment/credits 수축 없음 -PASS dure-enrollment/credits 리듬·트랙 -PASS dure-enrollment/credits 대비 AA -PASS dure-enrollment/archive 오버플로 — 320/375/390/768/1440 -PASS dure-enrollment/archive h1 — SKIP — 요소 없음 -PASS dure-enrollment/archive 수축 없음 -PASS dure-enrollment/archive 리듬·트랙 -PASS dure-enrollment/archive 대비 AA -PASS dure-enrollment/notices 오버플로 — 320/375/390/768/1440 -PASS dure-enrollment/notices h1 — SKIP — 요소 없음 -PASS dure-enrollment/notices 수축 없음 -PASS dure-enrollment/notices 리듬·트랙 -PASS dure-enrollment/notices 대비 AA -PASS dure-enrollment 스케일×폭 h1 — scales 1/1.3 -PASS dure-enrollment 브랜드 1줄 -PASS dure-enrollment/catalog 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px -PASS dure-enrollment/starred 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px -PASS dure-enrollment/enrollments 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px -PASS dure-enrollment/credits 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px -PASS dure-enrollment/archive 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px -PASS dure-enrollment/notices 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px -PASS dure-enrollment/catalog 왼쪽 인셋 — 최소 텍스트 시작 24px -PASS dure-enrollment/starred 왼쪽 인셋 — 최소 텍스트 시작 24px -PASS dure-enrollment/enrollments 왼쪽 인셋 — 최소 텍스트 시작 24px -PASS dure-enrollment/credits 왼쪽 인셋 — 최소 텍스트 시작 24px -PASS dure-enrollment/archive 왼쪽 인셋 — 최소 텍스트 시작 24px -PASS dure-enrollment/notices 왼쪽 인셋 — 최소 텍스트 시작 24px +PASS 죽은 선택자 — SKIP — checks.deadCss=false +PASS twentyoz-products 토큰 위생 — 색 0·radius 1 리터럴(토큰 1파일) +PASS twentyoz-products SEO/meta — title 17자·desc 85자·OG✓·alt 0결 +PASS twentyoz-products/single 오버플로 — 320/375/390/768/1440 +PASS twentyoz-products/single h1 1줄 +PASS twentyoz-products/single 수축 없음 +PASS twentyoz-products/single 리듬·트랙 +PASS twentyoz-products/single 대비 AA +PASS twentyoz-products 스케일×폭 h1 — scales 1/1.3 +PASS twentyoz-products 브랜드 1줄 +PASS twentyoz-products/single 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px +PASS twentyoz-products/single 왼쪽 인셋 — 최소 텍스트 시작 20px PASS L3 시각 회귀 — SKIP — checks.visual=false PASS L4 WebKit — SKIP — checks.webkit=false ``` diff --git a/apps/site/gate.config.json b/apps/site/gate.config.json index 65f8b75..dbc1b4e 100644 --- a/apps/site/gate.config.json +++ b/apps/site/gate.config.json @@ -32,6 +32,15 @@ ], "h1": "h2.v-h", "brand": ".brand" + }, + { + "name": "twentyoz-corp", + "path": "public/work/twentyoz-corp/index.html", + "views": [ + "single" + ], + "h1": "h1", + "brand": ".wordmark" } ], "widths": [ diff --git a/apps/site/gate.twentyoz-products.config.json b/apps/site/gate.twentyoz-products.config.json new file mode 100644 index 0000000..95c0b84 --- /dev/null +++ b/apps/site/gate.twentyoz-products.config.json @@ -0,0 +1,43 @@ +{ + "pages": [ + { + "name": "twentyoz-products", + "path": "public/work/twentyoz-corp/products.html", + "views": [ + "single" + ], + "h1": "h1", + "brand": ".wordmark" + } + ], + "widths": [ + 320, + 375, + 390, + 768, + 1440 + ], + "fontScales": [ + 1, + 1.3 + ], + "thresholds": { + "contrastNormal": 4.5, + "contrastLarge": 3, + "visualDiffPct": 0.1, + "stackLines": 3 + }, + "checks": { + "meta": true, + "contrast": true, + "stack": true, + "wrap": true, + "scaleMatrix": true, + "static": false, + "visual": false, + "webkit": false, + "deadCss": false, + "cssHygiene": true + }, + "chromePath": null +} diff --git a/apps/site/package.json b/apps/site/package.json index a381da2..3551f7f 100644 --- a/apps/site/package.json +++ b/apps/site/package.json @@ -5,6 +5,11 @@ "type": "module", "scripts": { "dev": "astro dev", + "build:showcase-assets": "node tools/build-showcase-assets.mjs", + "test:design:gate": "node tools/design-gate.mjs --config=gate.config.json", + "test:design:products": "node tools/design-gate.mjs --config=gate.twentyoz-products.config.json", + "test:e2e:twentyoz": "node tools/twentyoz-e2e.mjs", + "prebuild": "npm run build:showcase-assets", "build": "astro build", "preview": "astro preview", "typecheck": "echo \"(사이트는 build 로 검증한다)\"", @@ -17,6 +22,7 @@ }, "devDependencies": { "axe-core": "^4.13.0", + "esbuild": "^0.25.12", "html-validate": "^10.11.3", "pixelmatch": "^7.2.0", "playwright": "^1.62.1", diff --git a/apps/site/public/work/twentyoz-corp/assets/Pretendard-LICENSE.txt b/apps/site/public/work/twentyoz-corp/assets/Pretendard-LICENSE.txt new file mode 100644 index 0000000..c0592ca --- /dev/null +++ b/apps/site/public/work/twentyoz-corp/assets/Pretendard-LICENSE.txt @@ -0,0 +1,94 @@ +Copyright (c) 2021, Kil Hyung-jin (https://github.com/orioncactus/pretendard), +with Reserved Font Name Pretendard. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. \ No newline at end of file diff --git a/apps/site/public/work/twentyoz-corp/assets/core-dark.webp b/apps/site/public/work/twentyoz-corp/assets/core-dark.webp new file mode 100644 index 0000000000000000000000000000000000000000..5e7ada013af1d204b43e96fb7903aa834f0445a6 GIT binary patch literal 67326 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%0DQ+h&YPY`LgUV;eN` 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%0A`r!a7A@88FS_>fRy~crv(q%&kkSd~l#N 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 Qg|QC?8e|lTqJRJZ08ub>VE_OC literal 0 HcmV?d00001 diff --git a/apps/site/public/work/twentyoz-corp/assets/core-light.webp b/apps/site/public/work/twentyoz-corp/assets/core-light.webp new file mode 100644 index 0000000000000000000000000000000000000000..1cd53ddedacf7d334b2127457be3295b9ca1913f GIT binary patch literal 46520 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 ol=Object.defineProperty;var Ad=Object.getOwnPropertyDescriptor;var wd=Object.getOwnPropertyNames;var Rd=Object.prototype.hasOwnProperty;var Cd=(s,e)=>{for(var t in e)ol(s,t,{get:e[t],enumerable:!0})},Id=(s,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of wd(e))!Rd.call(s,i)&&i!==t&&ol(s,i,{get:()=>e[i],enumerable:!(n=Ad(e,i))||n.enumerable});return s};var Pd=s=>Id(ol({},"__esModule",{value:!0}),s);var B_={};Cd(B_,{mount:()=>O_});var $h=0,Yl=1,jh=2;var Er=1,Qh=2,ws=3,xn=0,Ft=1,$t=2,hn=0,Ci=1,Gi=2,Zl=3,Kl=4,eu=5;var di=100,tu=101,nu=102,iu=103,su=104,ru=200,au=201,ou=202,lu=203,Ta=204,Ea=205,cu=206,hu=207,uu=208,du=209,fu=210,pu=211,mu=212,gu=213,_u=214,Aa=0,wa=1,Ra=2,Ii=3,Ca=4,Ia=5,Pa=6,La=7,Qa=0,xu=1,vu=2,yn=0,Ar=1,wr=2,Rr=3,Hi=4,Cr=5,Ir=6,Pr=7,Dl="attached",yu="detached",Jl=300,gi=301,Wi=302,eo=303,to=304,Lr=306,fi=1e3,cn=1001,ds=1002,bt=1003,no=1004;var Xi=1005;var Tt=1006,Rs=1007;var Mn=1008;var jt=1009,$l=1010,jl=1011,Cs=1012,io=1013,Sn=1014,sn=1015,Vt=1016,so=1017,ro=1018,Is=1020,Ql=35902,ec=35899,tc=1021,nc=1022,rn=1023,In=1026,_i=1027,ao=1028,oo=1029,xi=1030,lo=1031;var co=1033,Nr=33776,Dr=33777,Ur=33778,Fr=33779,ho=35840,uo=35841,fo=35842,po=35843,mo=36196,go=37492,_o=37496,xo=37488,vo=37489,Or=37490,yo=37491,Mo=37808,So=37809,bo=37810,To=37811,Eo=37812,Ao=37813,wo=37814,Ro=37815,Co=37816,Io=37817,Po=37818,Lo=37819,No=37820,Do=37821,Uo=36492,Fo=36494,Oo=36495,Bo=36283,zo=36284,Br=36285,ko=36286;var Pi=2300,Li=2301,ba=2302,Ul=2303,Fl=2400,Ol=2401,Bl=2402,Mu=2500;var ic=0,zr=1,Ps=2,Su=3200;var kr=0,bu=1,ei="",St="srgb",Wt="srgb-linear",$s="linear",$e="srgb";var wi=7680;var zl=519,Tu=512,Eu=513,Au=514,Vo=515,wu=516,Ru=517,Go=518,Cu=519,Na=35044;var sc="300 es",gn=2e3,fs=2001;function Ld(s){for(let e=s.length-1;e>=0;--e)if(s[e]>=65535)return!0;return!1}function Nd(s){return ArrayBuffer.isView(s)&&!(s instanceof DataView)}function ps(s){return document.createElementNS("http://www.w3.org/1999/xhtml",s)}function Iu(){let s=ps("canvas");return s.style.display="block",s}var mh={},ms=null;function js(...s){let e="THREE."+s.shift();ms?ms("log",e,...s):console.log(e,...s)}function Pu(s){let e=s[0];if(typeof e=="string"&&e.startsWith("TSL:")){let t=s[1];t&&t.isStackTrace?s[0]+=" "+t.getLocation():s[1]='Stack trace not available. Enable "THREE.Node.captureStackTrace" to capture stack traces.'}return s}function Ee(...s){s=Pu(s);let e="THREE."+s.shift();if(ms)ms("warn",e,...s);else{let t=s[0];t&&t.isStackTrace?console.warn(t.getError(e)):console.warn(e,...s)}}function De(...s){s=Pu(s);let e="THREE."+s.shift();if(ms)ms("error",e,...s);else{let t=s[0];t&&t.isStackTrace?console.error(t.getError(e)):console.error(e,...s)}}function Ri(...s){let e=s.join(" ");e in mh||(mh[e]=!0,Ee(...s))}function Lu(s,e,t){return new Promise(function(n,i){function r(){switch(s.clientWaitSync(e,s.SYNC_FLUSH_COMMANDS_BIT,0)){case s.WAIT_FAILED:i();break;case s.TIMEOUT_EXPIRED:setTimeout(r,t);break;default:n()}}setTimeout(r,t)})}var Nu={[Aa]:wa,[Ra]:Pa,[Ca]:La,[Ii]:Ia,[wa]:Aa,[Pa]:Ra,[La]:Ca,[Ia]:Ii},Pn=class{addEventListener(e,t){this._listeners===void 0&&(this._listeners={});let n=this._listeners;n[e]===void 0&&(n[e]=[]),n[e].indexOf(t)===-1&&n[e].push(t)}hasEventListener(e,t){let n=this._listeners;return n===void 0?!1:n[e]!==void 0&&n[e].indexOf(t)!==-1}removeEventListener(e,t){let n=this._listeners;if(n===void 0)return;let i=n[e];if(i!==void 0){let r=i.indexOf(t);r!==-1&&i.splice(r,1)}}dispatchEvent(e){let t=this._listeners;if(t===void 0)return;let n=t[e.type];if(n!==void 0){e.target=this;let i=n.slice(0);for(let r=0,a=i.length;r>8&255]+Bt[s>>16&255]+Bt[s>>24&255]+"-"+Bt[e&255]+Bt[e>>8&255]+"-"+Bt[e>>16&15|64]+Bt[e>>24&255]+"-"+Bt[t&63|128]+Bt[t>>8&255]+"-"+Bt[t>>16&255]+Bt[t>>24&255]+Bt[n&255]+Bt[n>>8&255]+Bt[n>>16&255]+Bt[n>>24&255]).toLowerCase()}function Xe(s,e,t){return Math.max(e,Math.min(t,s))}function rc(s,e){return(s%e+e)%e}function Dd(s,e,t,n,i){return n+(s-e)*(i-n)/(t-e)}function Ud(s,e,t){return s!==e?(t-s)/(e-s):0}function Js(s,e,t){return(1-t)*s+t*e}function Fd(s,e,t,n){return Js(s,e,1-Math.exp(-t*n))}function Od(s,e=1){return e-Math.abs(rc(s,e*2)-e)}function Bd(s,e,t){return s<=e?0:s>=t?1:(s=(s-e)/(t-e),s*s*(3-2*s))}function zd(s,e,t){return s<=e?0:s>=t?1:(s=(s-e)/(t-e),s*s*s*(s*(s*6-15)+10))}function kd(s,e){return s+Math.floor(Math.random()*(e-s+1))}function Vd(s,e){return s+Math.random()*(e-s)}function Gd(s){return s*(.5-Math.random())}function Hd(s){s!==void 0&&(gh=s);let e=gh+=1831565813;return e=Math.imul(e^e>>>15,e|1),e^=e+Math.imul(e^e>>>7,e|61),((e^e>>>14)>>>0)/4294967296}function Wd(s){return s*Ks}function Xd(s){return s*Ni}function qd(s){return(s&s-1)===0&&s!==0}function Yd(s){return Math.pow(2,Math.ceil(Math.log(s)/Math.LN2))}function Zd(s){return Math.pow(2,Math.floor(Math.log(s)/Math.LN2))}function Kd(s,e,t,n,i){let r=Math.cos,a=Math.sin,o=r(t/2),l=a(t/2),c=r((e+n)/2),h=a((e+n)/2),d=r((e-n)/2),u=a((e-n)/2),f=r((n-e)/2),g=a((n-e)/2);switch(i){case"XYX":s.set(o*h,l*d,l*u,o*c);break;case"YZY":s.set(l*u,o*h,l*d,o*c);break;case"ZXZ":s.set(l*d,l*u,o*h,o*c);break;case"XZX":s.set(o*h,l*g,l*f,o*c);break;case"YXY":s.set(l*f,o*h,l*g,o*c);break;case"ZYZ":s.set(l*g,l*f,o*h,o*c);break;default:Ee("MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+i)}}function mn(s,e){switch(e.constructor){case Float32Array:return s;case Uint32Array:return s/4294967295;case Uint16Array:return s/65535;case Uint8Array:return s/255;case Int32Array:return Math.max(s/2147483647,-1);case Int16Array:return Math.max(s/32767,-1);case Int8Array:return Math.max(s/127,-1);default:throw new Error("THREE.MathUtils: Invalid component type.")}}function Qe(s,e){switch(e.constructor){case Float32Array:return s;case Uint32Array:return Math.round(s*4294967295);case Uint16Array:return Math.round(s*65535);case Uint8Array:return Math.round(s*255);case Int32Array:return Math.round(s*2147483647);case Int16Array:return Math.round(s*32767);case Int8Array:return Math.round(s*127);default:throw new Error("THREE.MathUtils: Invalid component type.")}}var Vr={DEG2RAD:Ks,RAD2DEG:Ni,generateUUID:_n,clamp:Xe,euclideanModulo:rc,mapLinear:Dd,inverseLerp:Ud,lerp:Js,damp:Fd,pingpong:Od,smoothstep:Bd,smootherstep:zd,randInt:kd,randFloat:Vd,randFloatSpread:Gd,seededRandom:Hd,degToRad:Wd,radToDeg:Xd,isPowerOfTwo:qd,ceilPowerOfTwo:Yd,floorPowerOfTwo:Zd,setQuaternionFromProperEuler:Kd,normalize:Qe,denormalize:mn},hc=class hc{constructor(e=0,t=0){this.x=e,this.y=t}get width(){return this.x}set width(e){this.x=e}get height(){return this.y}set height(e){this.y=e}set(e,t){return this.x=e,this.y=t,this}setScalar(e){return this.x=e,this.y=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;default:throw new Error("THREE.Vector2: index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;default:throw new Error("THREE.Vector2: index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y)}copy(e){return this.x=e.x,this.y=e.y,this}add(e){return this.x+=e.x,this.y+=e.y,this}addScalar(e){return this.x+=e,this.y+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this}subScalar(e){return this.x-=e,this.y-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this}multiply(e){return this.x*=e.x,this.y*=e.y,this}multiplyScalar(e){return this.x*=e,this.y*=e,this}divide(e){return this.x/=e.x,this.y/=e.y,this}divideScalar(e){return this.multiplyScalar(1/e)}applyMatrix3(e){let t=this.x,n=this.y,i=e.elements;return this.x=i[0]*t+i[3]*n+i[6],this.y=i[1]*t+i[4]*n+i[7],this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this}clamp(e,t){return this.x=Xe(this.x,e.x,t.x),this.y=Xe(this.y,e.y,t.y),this}clampScalar(e,t){return this.x=Xe(this.x,e,t),this.y=Xe(this.y,e,t),this}clampLength(e,t){let n=this.length();return this.divideScalar(n||1).multiplyScalar(Xe(n,e,t))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.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(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(e){let t=Math.sqrt(this.lengthSq()*e.lengthSq());if(t===0)return Math.PI/2;let n=this.dot(e)/t;return Math.acos(Xe(n,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){let t=this.x-e.x,n=this.y-e.y;return t*t+n*n}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this}equals(e){return e.x===this.x&&e.y===this.y}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e}fromBufferAttribute(e,t){return this.x=e.getX(t),this.y=e.getY(t),this}rotateAround(e,t){let n=Math.cos(t),i=Math.sin(t),r=this.x-e.x,a=this.y-e.y;return this.x=r*n-a*i+e.x,this.y=r*i+a*n+e.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}};hc.prototype.isVector2=!0;var ye=hc,nn=class{constructor(e=0,t=0,n=0,i=1){this.isQuaternion=!0,this._x=e,this._y=t,this._z=n,this._w=i}static slerpFlat(e,t,n,i,r,a,o){let l=n[i+0],c=n[i+1],h=n[i+2],d=n[i+3],u=r[a+0],f=r[a+1],g=r[a+2],M=r[a+3];if(d!==M||l!==u||c!==f||h!==g){let m=l*u+c*f+h*g+d*M;m<0&&(u=-u,f=-f,g=-g,M=-M,m=-m);let p=1-o;if(m<.9995){let S=Math.acos(m),E=Math.sin(S);p=Math.sin(p*S)/E,o=Math.sin(o*S)/E,l=l*p+u*o,c=c*p+f*o,h=h*p+g*o,d=d*p+M*o}else{l=l*p+u*o,c=c*p+f*o,h=h*p+g*o,d=d*p+M*o;let S=1/Math.sqrt(l*l+c*c+h*h+d*d);l*=S,c*=S,h*=S,d*=S}}e[t]=l,e[t+1]=c,e[t+2]=h,e[t+3]=d}static multiplyQuaternionsFlat(e,t,n,i,r,a){let o=n[i],l=n[i+1],c=n[i+2],h=n[i+3],d=r[a],u=r[a+1],f=r[a+2],g=r[a+3];return e[t]=o*g+h*d+l*f-c*u,e[t+1]=l*g+h*u+c*d-o*f,e[t+2]=c*g+h*f+o*u-l*d,e[t+3]=h*g-o*d-l*u-c*f,e}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get w(){return this._w}set w(e){this._w=e,this._onChangeCallback()}set(e,t,n,i){return this._x=e,this._y=t,this._z=n,this._w=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(e){return this._x=e.x,this._y=e.y,this._z=e.z,this._w=e.w,this._onChangeCallback(),this}setFromEuler(e,t=!0){let n=e._x,i=e._y,r=e._z,a=e._order,o=Math.cos,l=Math.sin,c=o(n/2),h=o(i/2),d=o(r/2),u=l(n/2),f=l(i/2),g=l(r/2);switch(a){case"XYZ":this._x=u*h*d+c*f*g,this._y=c*f*d-u*h*g,this._z=c*h*g+u*f*d,this._w=c*h*d-u*f*g;break;case"YXZ":this._x=u*h*d+c*f*g,this._y=c*f*d-u*h*g,this._z=c*h*g-u*f*d,this._w=c*h*d+u*f*g;break;case"ZXY":this._x=u*h*d-c*f*g,this._y=c*f*d+u*h*g,this._z=c*h*g+u*f*d,this._w=c*h*d-u*f*g;break;case"ZYX":this._x=u*h*d-c*f*g,this._y=c*f*d+u*h*g,this._z=c*h*g-u*f*d,this._w=c*h*d+u*f*g;break;case"YZX":this._x=u*h*d+c*f*g,this._y=c*f*d+u*h*g,this._z=c*h*g-u*f*d,this._w=c*h*d-u*f*g;break;case"XZY":this._x=u*h*d-c*f*g,this._y=c*f*d-u*h*g,this._z=c*h*g+u*f*d,this._w=c*h*d+u*f*g;break;default:Ee("Quaternion: .setFromEuler() encountered an unknown order: "+a)}return t===!0&&this._onChangeCallback(),this}setFromAxisAngle(e,t){let n=t/2,i=Math.sin(n);return this._x=e.x*i,this._y=e.y*i,this._z=e.z*i,this._w=Math.cos(n),this._onChangeCallback(),this}setFromRotationMatrix(e){let t=e.elements,n=t[0],i=t[4],r=t[8],a=t[1],o=t[5],l=t[9],c=t[2],h=t[6],d=t[10],u=n+o+d;if(u>0){let f=.5/Math.sqrt(u+1);this._w=.25/f,this._x=(h-l)*f,this._y=(r-c)*f,this._z=(a-i)*f}else if(n>o&&n>d){let f=2*Math.sqrt(1+n-o-d);this._w=(h-l)/f,this._x=.25*f,this._y=(i+a)/f,this._z=(r+c)/f}else if(o>d){let f=2*Math.sqrt(1+o-n-d);this._w=(r-c)/f,this._x=(i+a)/f,this._y=.25*f,this._z=(l+h)/f}else{let f=2*Math.sqrt(1+d-n-o);this._w=(a-i)/f,this._x=(r+c)/f,this._y=(l+h)/f,this._z=.25*f}return this._onChangeCallback(),this}setFromUnitVectors(e,t){let n=e.dot(t)+1;return n<1e-8?(n=0,Math.abs(e.x)>Math.abs(e.z)?(this._x=-e.y,this._y=e.x,this._z=0,this._w=n):(this._x=0,this._y=-e.z,this._z=e.y,this._w=n)):(this._x=e.y*t.z-e.z*t.y,this._y=e.z*t.x-e.x*t.z,this._z=e.x*t.y-e.y*t.x,this._w=n),this.normalize()}angleTo(e){return 2*Math.acos(Math.abs(Xe(this.dot(e),-1,1)))}rotateTowards(e,t){let n=this.angleTo(e);if(n===0)return this;let i=Math.min(1,t/n);return this.slerp(e,i),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(e){return this._x*e._x+this._y*e._y+this._z*e._z+this._w*e._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 e=this.length();return e===0?(this._x=0,this._y=0,this._z=0,this._w=1):(e=1/e,this._x=this._x*e,this._y=this._y*e,this._z=this._z*e,this._w=this._w*e),this._onChangeCallback(),this}multiply(e){return this.multiplyQuaternions(this,e)}premultiply(e){return this.multiplyQuaternions(e,this)}multiplyQuaternions(e,t){let n=e._x,i=e._y,r=e._z,a=e._w,o=t._x,l=t._y,c=t._z,h=t._w;return this._x=n*h+a*o+i*c-r*l,this._y=i*h+a*l+r*o-n*c,this._z=r*h+a*c+n*l-i*o,this._w=a*h-n*o-i*l-r*c,this._onChangeCallback(),this}slerp(e,t){let n=e._x,i=e._y,r=e._z,a=e._w,o=this.dot(e);o<0&&(n=-n,i=-i,r=-r,a=-a,o=-o);let l=1-t;if(o<.9995){let c=Math.acos(o),h=Math.sin(c);l=Math.sin(l*c)/h,t=Math.sin(t*c)/h,this._x=this._x*l+n*t,this._y=this._y*l+i*t,this._z=this._z*l+r*t,this._w=this._w*l+a*t,this._onChangeCallback()}else this._x=this._x*l+n*t,this._y=this._y*l+i*t,this._z=this._z*l+r*t,this._w=this._w*l+a*t,this.normalize();return this}slerpQuaternions(e,t,n){return this.copy(e).slerp(t,n)}random(){let e=2*Math.PI*Math.random(),t=2*Math.PI*Math.random(),n=Math.random(),i=Math.sqrt(1-n),r=Math.sqrt(n);return this.set(i*Math.sin(e),i*Math.cos(e),r*Math.sin(t),r*Math.cos(t))}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._w===this._w}fromArray(e,t=0){return this._x=e[t],this._y=e[t+1],this._z=e[t+2],this._w=e[t+3],this._onChangeCallback(),this}toArray(e=[],t=0){return e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._w,e}fromBufferAttribute(e,t){return this._x=e.getX(t),this._y=e.getY(t),this._z=e.getZ(t),this._w=e.getW(t),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}},uc=class uc{constructor(e=0,t=0,n=0){this.x=e,this.y=t,this.z=n}set(e,t,n){return n===void 0&&(n=this.z),this.x=e,this.y=t,this.z=n,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;default:throw new Error("THREE.Vector3: index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("THREE.Vector3: index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this}multiplyVectors(e,t){return this.x=e.x*t.x,this.y=e.y*t.y,this.z=e.z*t.z,this}applyEuler(e){return this.applyQuaternion(_h.setFromEuler(e))}applyAxisAngle(e,t){return this.applyQuaternion(_h.setFromAxisAngle(e,t))}applyMatrix3(e){let t=this.x,n=this.y,i=this.z,r=e.elements;return this.x=r[0]*t+r[3]*n+r[6]*i,this.y=r[1]*t+r[4]*n+r[7]*i,this.z=r[2]*t+r[5]*n+r[8]*i,this}applyNormalMatrix(e){return this.applyMatrix3(e).normalize()}applyMatrix4(e){let t=this.x,n=this.y,i=this.z,r=e.elements,a=1/(r[3]*t+r[7]*n+r[11]*i+r[15]);return this.x=(r[0]*t+r[4]*n+r[8]*i+r[12])*a,this.y=(r[1]*t+r[5]*n+r[9]*i+r[13])*a,this.z=(r[2]*t+r[6]*n+r[10]*i+r[14])*a,this}applyQuaternion(e){let t=this.x,n=this.y,i=this.z,r=e.x,a=e.y,o=e.z,l=e.w,c=2*(a*i-o*n),h=2*(o*t-r*i),d=2*(r*n-a*t);return this.x=t+l*c+a*d-o*h,this.y=n+l*h+o*c-r*d,this.z=i+l*d+r*h-a*c,this}project(e){return this.applyMatrix4(e.matrixWorldInverse).applyMatrix4(e.projectionMatrix)}unproject(e){return this.applyMatrix4(e.projectionMatrixInverse).applyMatrix4(e.matrixWorld)}transformDirection(e){let t=this.x,n=this.y,i=this.z,r=e.elements;return this.x=r[0]*t+r[4]*n+r[8]*i,this.y=r[1]*t+r[5]*n+r[9]*i,this.z=r[2]*t+r[6]*n+r[10]*i,this.normalize()}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this}divideScalar(e){return this.multiplyScalar(1/e)}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this}clamp(e,t){return this.x=Xe(this.x,e.x,t.x),this.y=Xe(this.y,e.y,t.y),this.z=Xe(this.z,e.z,t.z),this}clampScalar(e,t){return this.x=Xe(this.x,e,t),this.y=Xe(this.y,e,t),this.z=Xe(this.z,e,t),this}clampLength(e,t){let n=this.length();return this.divideScalar(n||1).multiplyScalar(Xe(n,e,t))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}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(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this.z=e.z+(t.z-e.z)*n,this}cross(e){return this.crossVectors(this,e)}crossVectors(e,t){let n=e.x,i=e.y,r=e.z,a=t.x,o=t.y,l=t.z;return this.x=i*l-r*o,this.y=r*a-n*l,this.z=n*o-i*a,this}projectOnVector(e){let t=e.lengthSq();if(t===0)return this.set(0,0,0);let n=e.dot(this)/t;return this.copy(e).multiplyScalar(n)}projectOnPlane(e){return ll.copy(this).projectOnVector(e),this.sub(ll)}reflect(e){return this.sub(ll.copy(e).multiplyScalar(2*this.dot(e)))}angleTo(e){let t=Math.sqrt(this.lengthSq()*e.lengthSq());if(t===0)return Math.PI/2;let n=this.dot(e)/t;return Math.acos(Xe(n,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){let t=this.x-e.x,n=this.y-e.y,i=this.z-e.z;return t*t+n*n+i*i}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)+Math.abs(this.z-e.z)}setFromSpherical(e){return this.setFromSphericalCoords(e.radius,e.phi,e.theta)}setFromSphericalCoords(e,t,n){let i=Math.sin(t)*e;return this.x=i*Math.sin(n),this.y=Math.cos(t)*e,this.z=i*Math.cos(n),this}setFromCylindrical(e){return this.setFromCylindricalCoords(e.radius,e.theta,e.y)}setFromCylindricalCoords(e,t,n){return this.x=e*Math.sin(t),this.y=n,this.z=e*Math.cos(t),this}setFromMatrixPosition(e){let t=e.elements;return this.x=t[12],this.y=t[13],this.z=t[14],this}setFromMatrixScale(e){let t=this.setFromMatrixColumn(e,0).length(),n=this.setFromMatrixColumn(e,1).length(),i=this.setFromMatrixColumn(e,2).length();return this.x=t,this.y=n,this.z=i,this}setFromMatrixColumn(e,t){return this.fromArray(e.elements,t*4)}setFromMatrix3Column(e,t){return this.fromArray(e.elements,t*3)}setFromEuler(e){return this.x=e._x,this.y=e._y,this.z=e._z,this}setFromColor(e){return this.x=e.r,this.y=e.g,this.z=e.b,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this.z=e[t+2],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e}fromBufferAttribute(e,t){return this.x=e.getX(t),this.y=e.getY(t),this.z=e.getZ(t),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){let e=Math.random()*Math.PI*2,t=Math.random()*2-1,n=Math.sqrt(1-t*t);return this.x=n*Math.cos(e),this.y=t,this.z=n*Math.sin(e),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}};uc.prototype.isVector3=!0;var L=uc,ll=new L,_h=new nn,dc=class dc{constructor(e,t,n,i,r,a,o,l,c){this.elements=[1,0,0,0,1,0,0,0,1],e!==void 0&&this.set(e,t,n,i,r,a,o,l,c)}set(e,t,n,i,r,a,o,l,c){let h=this.elements;return h[0]=e,h[1]=i,h[2]=o,h[3]=t,h[4]=r,h[5]=l,h[6]=n,h[7]=a,h[8]=c,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){let t=this.elements,n=e.elements;return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],this}extractBasis(e,t,n){return e.setFromMatrix3Column(this,0),t.setFromMatrix3Column(this,1),n.setFromMatrix3Column(this,2),this}setFromMatrix4(e){let t=e.elements;return this.set(t[0],t[4],t[8],t[1],t[5],t[9],t[2],t[6],t[10]),this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){let n=e.elements,i=t.elements,r=this.elements,a=n[0],o=n[3],l=n[6],c=n[1],h=n[4],d=n[7],u=n[2],f=n[5],g=n[8],M=i[0],m=i[3],p=i[6],S=i[1],E=i[4],v=i[7],A=i[2],T=i[5],R=i[8];return r[0]=a*M+o*S+l*A,r[3]=a*m+o*E+l*T,r[6]=a*p+o*v+l*R,r[1]=c*M+h*S+d*A,r[4]=c*m+h*E+d*T,r[7]=c*p+h*v+d*R,r[2]=u*M+f*S+g*A,r[5]=u*m+f*E+g*T,r[8]=u*p+f*v+g*R,this}multiplyScalar(e){let t=this.elements;return t[0]*=e,t[3]*=e,t[6]*=e,t[1]*=e,t[4]*=e,t[7]*=e,t[2]*=e,t[5]*=e,t[8]*=e,this}determinant(){let e=this.elements,t=e[0],n=e[1],i=e[2],r=e[3],a=e[4],o=e[5],l=e[6],c=e[7],h=e[8];return t*a*h-t*o*c-n*r*h+n*o*l+i*r*c-i*a*l}invert(){let e=this.elements,t=e[0],n=e[1],i=e[2],r=e[3],a=e[4],o=e[5],l=e[6],c=e[7],h=e[8],d=h*a-o*c,u=o*l-h*r,f=c*r-a*l,g=t*d+n*u+i*f;if(g===0)return this.set(0,0,0,0,0,0,0,0,0);let M=1/g;return e[0]=d*M,e[1]=(i*c-h*n)*M,e[2]=(o*n-i*a)*M,e[3]=u*M,e[4]=(h*t-i*l)*M,e[5]=(i*r-o*t)*M,e[6]=f*M,e[7]=(n*l-c*t)*M,e[8]=(a*t-n*r)*M,this}transpose(){let e,t=this.elements;return e=t[1],t[1]=t[3],t[3]=e,e=t[2],t[2]=t[6],t[6]=e,e=t[5],t[5]=t[7],t[7]=e,this}getNormalMatrix(e){return this.setFromMatrix4(e).invert().transpose()}transposeIntoArray(e){let t=this.elements;return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],this}setUvTransform(e,t,n,i,r,a,o){let l=Math.cos(r),c=Math.sin(r);return this.set(n*l,n*c,-n*(l*a+c*o)+a+e,-i*c,i*l,-i*(-c*a+l*o)+o+t,0,0,1),this}scale(e,t){return Ri("Matrix3: .scale() is deprecated. Use .makeScale() instead."),this.premultiply(cl.makeScale(e,t)),this}rotate(e){return Ri("Matrix3: .rotate() is deprecated. Use .makeRotation() instead."),this.premultiply(cl.makeRotation(-e)),this}translate(e,t){return Ri("Matrix3: .translate() is deprecated. Use .makeTranslation() instead."),this.premultiply(cl.makeTranslation(e,t)),this}makeTranslation(e,t){return e.isVector2?this.set(1,0,e.x,0,1,e.y,0,0,1):this.set(1,0,e,0,1,t,0,0,1),this}makeRotation(e){let t=Math.cos(e),n=Math.sin(e);return this.set(t,-n,0,n,t,0,0,0,1),this}makeScale(e,t){return this.set(e,0,0,0,t,0,0,0,1),this}equals(e){let t=this.elements,n=e.elements;for(let i=0;i<9;i++)if(t[i]!==n[i])return!1;return!0}fromArray(e,t=0){for(let n=0;n<9;n++)this.elements[n]=e[n+t];return this}toArray(e=[],t=0){let n=this.elements;return e[t]=n[0],e[t+1]=n[1],e[t+2]=n[2],e[t+3]=n[3],e[t+4]=n[4],e[t+5]=n[5],e[t+6]=n[6],e[t+7]=n[7],e[t+8]=n[8],e}clone(){return new this.constructor().fromArray(this.elements)}};dc.prototype.isMatrix3=!0;var Ue=dc,cl=new Ue,xh=new Ue().set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),vh=new Ue().set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function Jd(){let s={enabled:!0,workingColorSpace:Wt,spaces:{},convert:function(i,r,a){return this.enabled===!1||r===a||!r||!a||(this.spaces[r].transfer===$e&&(i.r=qn(i.r),i.g=qn(i.g),i.b=qn(i.b)),this.spaces[r].primaries!==this.spaces[a].primaries&&(i.applyMatrix3(this.spaces[r].toXYZ),i.applyMatrix3(this.spaces[a].fromXYZ)),this.spaces[a].transfer===$e&&(i.r=us(i.r),i.g=us(i.g),i.b=us(i.b))),i},workingToColorSpace:function(i,r){return this.convert(i,this.workingColorSpace,r)},colorSpaceToWorking:function(i,r){return this.convert(i,r,this.workingColorSpace)},getPrimaries:function(i){return this.spaces[i].primaries},getTransfer:function(i){return i===ei?$s:this.spaces[i].transfer},getToneMappingMode:function(i){return this.spaces[i].outputColorSpaceConfig.toneMappingMode||"standard"},getLuminanceCoefficients:function(i,r=this.workingColorSpace){return i.fromArray(this.spaces[r].luminanceCoefficients)},define:function(i){Object.assign(this.spaces,i)},_getMatrix:function(i,r,a){return i.copy(this.spaces[r].toXYZ).multiply(this.spaces[a].fromXYZ)},_getDrawingBufferColorSpace:function(i){return this.spaces[i].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(i=this.workingColorSpace){return this.spaces[i].workingColorSpaceConfig.unpackColorSpace},fromWorkingColorSpace:function(i,r){return Ri("ColorManagement: .fromWorkingColorSpace() has been renamed to .workingToColorSpace()."),s.workingToColorSpace(i,r)},toWorkingColorSpace:function(i,r){return Ri("ColorManagement: .toWorkingColorSpace() has been renamed to .colorSpaceToWorking()."),s.colorSpaceToWorking(i,r)}},e=[.64,.33,.3,.6,.15,.06],t=[.2126,.7152,.0722],n=[.3127,.329];return s.define({[Wt]:{primaries:e,whitePoint:n,transfer:$s,toXYZ:xh,fromXYZ:vh,luminanceCoefficients:t,workingColorSpaceConfig:{unpackColorSpace:St},outputColorSpaceConfig:{drawingBufferColorSpace:St}},[St]:{primaries:e,whitePoint:n,transfer:$e,toXYZ:xh,fromXYZ:vh,luminanceCoefficients:t,outputColorSpaceConfig:{drawingBufferColorSpace:St}}}),s}var Be=Jd();function qn(s){return s<.04045?s*.0773993808:Math.pow(s*.9478672986+.0521327014,2.4)}function us(s){return s<.0031308?s*12.92:1.055*Math.pow(s,.41666)-.055}var $i,Da=class{static getDataURL(e,t="image/png"){if(/^data:/i.test(e.src)||typeof HTMLCanvasElement>"u")return e.src;let n;if(e instanceof HTMLCanvasElement)n=e;else{$i===void 0&&($i=ps("canvas")),$i.width=e.width,$i.height=e.height;let i=$i.getContext("2d");e instanceof ImageData?i.putImageData(e,0,0):i.drawImage(e,0,0,e.width,e.height),n=$i}return n.toDataURL(t)}static sRGBToLinear(e){if(typeof HTMLImageElement<"u"&&e instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&e instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&e instanceof ImageBitmap){let t=ps("canvas");t.width=e.width,t.height=e.height;let n=t.getContext("2d");n.drawImage(e,0,0,e.width,e.height);let i=n.getImageData(0,0,e.width,e.height),r=i.data;for(let a=0;a1),this.pmremVersion=0,this.normalized=!1}get width(){return this.source.getSize(ul).x}get height(){return this.source.getSize(ul).y}get depth(){return this.source.getSize(ul).z}get image(){return this.source.data}set image(e){this.source.data=e}updateMatrix(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}clone(){return new this.constructor().copy(this)}copy(e){return this.name=e.name,this.source=e.source,this.mipmaps=e.mipmaps.slice(0),this.mapping=e.mapping,this.channel=e.channel,this.wrapS=e.wrapS,this.wrapT=e.wrapT,this.magFilter=e.magFilter,this.minFilter=e.minFilter,this.anisotropy=e.anisotropy,this.format=e.format,this.internalFormat=e.internalFormat,this.type=e.type,this.normalized=e.normalized,this.offset.copy(e.offset),this.repeat.copy(e.repeat),this.center.copy(e.center),this.rotation=e.rotation,this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrix.copy(e.matrix),this.generateMipmaps=e.generateMipmaps,this.premultiplyAlpha=e.premultiplyAlpha,this.flipY=e.flipY,this.unpackAlignment=e.unpackAlignment,this.colorSpace=e.colorSpace,this.renderTarget=e.renderTarget,this.isRenderTargetTexture=e.isRenderTargetTexture,this.isArrayTexture=e.isArrayTexture,this.userData=JSON.parse(JSON.stringify(e.userData)),this.needsUpdate=!0,this}setValues(e){for(let t in e){let n=e[t];if(n===void 0){Ee(`Texture.setValues(): parameter '${t}' has value of undefined.`);continue}let i=this[t];if(i===void 0){Ee(`Texture.setValues(): property '${t}' does not exist.`);continue}i&&n&&i.isVector2&&n.isVector2||i&&n&&i.isVector3&&n.isVector3||i&&n&&i.isMatrix3&&n.isMatrix3?i.copy(n):this[t]=n}}toJSON(e){let t=e===void 0||typeof e=="string";if(!t&&e.textures[this.uuid]!==void 0)return e.textures[this.uuid];let n={metadata:{version:4.7,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,image:this.source.toJSON(e).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,normalized:this.normalized,colorSpace:this.colorSpace,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,generateMipmaps:this.generateMipmaps,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};return Object.keys(this.userData).length>0&&(n.userData=this.userData),t||(e.textures[this.uuid]=n),n}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(e){if(this.mapping!==Jl)return e;if(e.applyMatrix3(this.matrix),e.x<0||e.x>1)switch(this.wrapS){case fi:e.x=e.x-Math.floor(e.x);break;case cn:e.x=e.x<0?0:1;break;case ds:Math.abs(Math.floor(e.x)%2)===1?e.x=Math.ceil(e.x)-e.x:e.x=e.x-Math.floor(e.x);break}if(e.y<0||e.y>1)switch(this.wrapT){case fi:e.y=e.y-Math.floor(e.y);break;case cn:e.y=e.y<0?0:1;break;case ds:Math.abs(Math.floor(e.y)%2)===1?e.y=Math.ceil(e.y)-e.y:e.y=e.y-Math.floor(e.y);break}return this.flipY&&(e.y=1-e.y),e}set needsUpdate(e){e===!0&&(this.version++,this.source.needsUpdate=!0)}set needsPMREMUpdate(e){e===!0&&this.pmremVersion++}};Dt.DEFAULT_IMAGE=null;Dt.DEFAULT_MAPPING=Jl;Dt.DEFAULT_ANISOTROPY=1;var fc=class fc{constructor(e=0,t=0,n=0,i=1){this.x=e,this.y=t,this.z=n,this.w=i}get width(){return this.z}set width(e){this.z=e}get height(){return this.w}set height(e){this.w=e}set(e,t,n,i){return this.x=e,this.y=t,this.z=n,this.w=i,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this.w=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setW(e){return this.w=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;case 3:this.w=t;break;default:throw new Error("THREE.Vector4: index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("THREE.Vector4: index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this.w=e.w!==void 0?e.w:1,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this.w+=e.w,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this.w+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this.w=e.w+t.w,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this.w+=e.w*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this.w-=e.w,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this.w-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this.w=e.w-t.w,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this.w*=e.w,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this.w*=e,this}applyMatrix4(e){let t=this.x,n=this.y,i=this.z,r=this.w,a=e.elements;return this.x=a[0]*t+a[4]*n+a[8]*i+a[12]*r,this.y=a[1]*t+a[5]*n+a[9]*i+a[13]*r,this.z=a[2]*t+a[6]*n+a[10]*i+a[14]*r,this.w=a[3]*t+a[7]*n+a[11]*i+a[15]*r,this}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this.w/=e.w,this}divideScalar(e){return this.multiplyScalar(1/e)}setAxisAngleFromQuaternion(e){this.w=2*Math.acos(e.w);let t=Math.sqrt(1-e.w*e.w);return t<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=e.x/t,this.y=e.y/t,this.z=e.z/t),this}setAxisAngleFromRotationMatrix(e){let t,n,i,r,l=e.elements,c=l[0],h=l[4],d=l[8],u=l[1],f=l[5],g=l[9],M=l[2],m=l[6],p=l[10];if(Math.abs(h-u)<.01&&Math.abs(d-M)<.01&&Math.abs(g-m)<.01){if(Math.abs(h+u)<.1&&Math.abs(d+M)<.1&&Math.abs(g+m)<.1&&Math.abs(c+f+p-3)<.1)return this.set(1,0,0,0),this;t=Math.PI;let E=(c+1)/2,v=(f+1)/2,A=(p+1)/2,T=(h+u)/4,R=(d+M)/4,_=(g+m)/4;return E>v&&E>A?E<.01?(n=0,i=.707106781,r=.707106781):(n=Math.sqrt(E),i=T/n,r=R/n):v>A?v<.01?(n=.707106781,i=0,r=.707106781):(i=Math.sqrt(v),n=T/i,r=_/i):A<.01?(n=.707106781,i=.707106781,r=0):(r=Math.sqrt(A),n=R/r,i=_/r),this.set(n,i,r,t),this}let S=Math.sqrt((m-g)*(m-g)+(d-M)*(d-M)+(u-h)*(u-h));return Math.abs(S)<.001&&(S=1),this.x=(m-g)/S,this.y=(d-M)/S,this.z=(u-h)/S,this.w=Math.acos((c+f+p-1)/2),this}setFromMatrixPosition(e){let t=e.elements;return this.x=t[12],this.y=t[13],this.z=t[14],this.w=t[15],this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this.w=Math.min(this.w,e.w),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this.w=Math.max(this.w,e.w),this}clamp(e,t){return this.x=Xe(this.x,e.x,t.x),this.y=Xe(this.y,e.y,t.y),this.z=Xe(this.z,e.z,t.z),this.w=Xe(this.w,e.w,t.w),this}clampScalar(e,t){return this.x=Xe(this.x,e,t),this.y=Xe(this.y,e,t),this.z=Xe(this.z,e,t),this.w=Xe(this.w,e,t),this}clampLength(e,t){let n=this.length();return this.divideScalar(n||1).multiplyScalar(Xe(n,e,t))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this.w=Math.trunc(this.w),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z+this.w*e.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)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this.w+=(e.w-this.w)*t,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this.z=e.z+(t.z-e.z)*n,this.w=e.w+(t.w-e.w)*n,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z&&e.w===this.w}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this.z=e[t+2],this.w=e[t+3],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e[t+3]=this.w,e}fromBufferAttribute(e,t){return this.x=e.getX(t),this.y=e.getY(t),this.z=e.getZ(t),this.w=e.getW(t),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this.w=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}};fc.prototype.isVector4=!0;var et=fc,Ua=class extends Pn{constructor(e=1,t=1,n={}){super(),n=Object.assign({generateMipmaps:!1,internalFormat:null,minFilter:Tt,depthBuffer:!0,stencilBuffer:!1,resolveDepthBuffer:!0,resolveStencilBuffer:!0,depthTexture:null,samples:0,count:1,depth:1,multiview:!1,useArrayDepthTexture:!1},n),this.isRenderTarget=!0,this.width=e,this.height=t,this.depth=n.depth,this.scissor=new et(0,0,e,t),this.scissorTest=!1,this.viewport=new et(0,0,e,t),this.textures=[];let i={width:e,height:t,depth:n.depth},r=new Dt(i),a=n.count;for(let o=0;o1);this.dispose()}this.viewport.set(0,0,e,t),this.scissor.set(0,0,e,t)}clone(){return new this.constructor().copy(this)}copy(e){this.width=e.width,this.height=e.height,this.depth=e.depth,this.scissor.copy(e.scissor),this.scissorTest=e.scissorTest,this.viewport.copy(e.viewport),this.textures.length=0;for(let t=0,n=e.textures.length;t>>0}enable(e){this.mask|=1<1){for(let t=0;t1){for(let n=0;n0&&(i.userData=this.userData),i.layers=this.layers.mask,i.matrix=this.matrix.toArray(),i.up=this.up.toArray(),this.pivot!==null&&(i.pivot=this.pivot.toArray()),this.matrixAutoUpdate===!1&&(i.matrixAutoUpdate=!1),this.morphTargetDictionary!==void 0&&(i.morphTargetDictionary=Object.assign({},this.morphTargetDictionary)),this.morphTargetInfluences!==void 0&&(i.morphTargetInfluences=this.morphTargetInfluences.slice()),this.isInstancedMesh&&(i.type="InstancedMesh",i.count=this.count,i.instanceMatrix=this.instanceMatrix.toJSON(),this.instanceColor!==null&&(i.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(i.type="BatchedMesh",i.perObjectFrustumCulled=this.perObjectFrustumCulled,i.sortObjects=this.sortObjects,i.drawRanges=this._drawRanges,i.reservedRanges=this._reservedRanges,i.geometryInfo=this._geometryInfo.map(o=>({...o,boundingBox:o.boundingBox?o.boundingBox.toJSON():void 0,boundingSphere:o.boundingSphere?o.boundingSphere.toJSON():void 0})),i.instanceInfo=this._instanceInfo.map(o=>({...o})),i.availableInstanceIds=this._availableInstanceIds.slice(),i.availableGeometryIds=this._availableGeometryIds.slice(),i.nextIndexStart=this._nextIndexStart,i.nextVertexStart=this._nextVertexStart,i.geometryCount=this._geometryCount,i.maxInstanceCount=this._maxInstanceCount,i.maxVertexCount=this._maxVertexCount,i.maxIndexCount=this._maxIndexCount,i.geometryInitialized=this._geometryInitialized,i.matricesTexture=this._matricesTexture.toJSON(e),i.indirectTexture=this._indirectTexture.toJSON(e),this._colorsTexture!==null&&(i.colorsTexture=this._colorsTexture.toJSON(e)),this.boundingSphere!==null&&(i.boundingSphere=this.boundingSphere.toJSON()),this.boundingBox!==null&&(i.boundingBox=this.boundingBox.toJSON()));function r(o,l){return o[l.uuid]===void 0&&(o[l.uuid]=l.toJSON(e)),l.uuid}if(this.isScene)this.background&&(this.background.isColor?i.background=this.background.toJSON():this.background.isTexture&&(i.background=this.background.toJSON(e).uuid)),this.environment&&this.environment.isTexture&&this.environment.isRenderTargetTexture!==!0&&(i.environment=this.environment.toJSON(e).uuid);else if(this.isMesh||this.isLine||this.isPoints){i.geometry=r(e.geometries,this.geometry);let o=this.geometry.parameters;if(o!==void 0&&o.shapes!==void 0){let l=o.shapes;if(Array.isArray(l))for(let c=0,h=l.length;c0){i.children=[];for(let o=0;o0){i.animations=[];for(let o=0;o0&&(n.geometries=o),l.length>0&&(n.materials=l),c.length>0&&(n.textures=c),h.length>0&&(n.images=h),d.length>0&&(n.shapes=d),u.length>0&&(n.skeletons=u),f.length>0&&(n.animations=f),g.length>0&&(n.nodes=g)}return n.object=i,n;function a(o){let l=[];for(let c in o){let h=o[c];delete h.metadata,l.push(h)}return l}}clone(e){return new this.constructor().copy(this,e)}copy(e,t=!0){if(this.name=e.name,this.up.copy(e.up),this.position.copy(e.position),this.rotation.order=e.rotation.order,this.quaternion.copy(e.quaternion),this.scale.copy(e.scale),this.pivot=e.pivot!==null?e.pivot.clone():null,this.matrix.copy(e.matrix),this.matrixWorld.copy(e.matrixWorld),this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrixWorldAutoUpdate=e.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=e.matrixWorldNeedsUpdate,this.layers.mask=e.layers.mask,this.visible=e.visible,this.castShadow=e.castShadow,this.receiveShadow=e.receiveShadow,this.frustumCulled=e.frustumCulled,this.renderOrder=e.renderOrder,this.static=e.static,this.animations=e.animations.slice(),this.userData=JSON.parse(JSON.stringify(e.userData)),t===!0)for(let n=0;nf+g?(c.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:e.handedness,target:this})):!c.inputState.pinching&&u<=f-g&&(c.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:e.handedness,target:this}))}else l!==null&&e.gripSpace&&(r=t.getPose(e.gripSpace,n),r!==null&&(l.matrix.fromArray(r.transform.matrix),l.matrix.decompose(l.position,l.rotation,l.scale),l.matrixWorldNeedsUpdate=!0,r.linearVelocity?(l.hasLinearVelocity=!0,l.linearVelocity.copy(r.linearVelocity)):l.hasLinearVelocity=!1,r.angularVelocity?(l.hasAngularVelocity=!0,l.angularVelocity.copy(r.angularVelocity)):l.hasAngularVelocity=!1,l.eventsEnabled&&l.dispatchEvent({type:"gripUpdated",data:e,target:this})));o!==null&&(i=t.getPose(e.targetRaySpace,n),i===null&&r!==null&&(i=r),i!==null&&(o.matrix.fromArray(i.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),o.matrixWorldNeedsUpdate=!0,i.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(i.linearVelocity)):o.hasLinearVelocity=!1,i.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(i.angularVelocity)):o.hasAngularVelocity=!1,this.dispatchEvent(af)))}return o!==null&&(o.visible=i!==null),l!==null&&(l.visible=r!==null),c!==null&&(c.visible=a!==null),this}_getHandJoint(e,t){if(e.joints[t.jointName]===void 0){let n=new kt;n.matrixAutoUpdate=!1,n.visible=!1,e.joints[t.jointName]=n,e.add(n)}return e.joints[t.jointName]}},Du={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},ai={h:0,s:0,l:0},Qr={h:0,s:0,l:0};function fl(s,e,t){return t<0&&(t+=1),t>1&&(t-=1),t<1/6?s+(e-s)*6*t:t<1/2?e:t<2/3?s+(e-s)*6*(2/3-t):s}var Me=class{constructor(e,t,n){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(e,t,n)}set(e,t,n){if(t===void 0&&n===void 0){let i=e;i&&i.isColor?this.copy(i):typeof i=="number"?this.setHex(i):typeof i=="string"&&this.setStyle(i)}else this.setRGB(e,t,n);return this}setScalar(e){return this.r=e,this.g=e,this.b=e,this}setHex(e,t=St){return e=Math.floor(e),this.r=(e>>16&255)/255,this.g=(e>>8&255)/255,this.b=(e&255)/255,Be.colorSpaceToWorking(this,t),this}setRGB(e,t,n,i=Be.workingColorSpace){return this.r=e,this.g=t,this.b=n,Be.colorSpaceToWorking(this,i),this}setHSL(e,t,n,i=Be.workingColorSpace){if(e=rc(e,1),t=Xe(t,0,1),n=Xe(n,0,1),t===0)this.r=this.g=this.b=n;else{let r=n<=.5?n*(1+t):n+t-n*t,a=2*n-r;this.r=fl(a,r,e+1/3),this.g=fl(a,r,e),this.b=fl(a,r,e-1/3)}return Be.colorSpaceToWorking(this,i),this}setStyle(e,t=St){function n(r){r!==void 0&&parseFloat(r)<1&&Ee("Color: Alpha component of "+e+" will be ignored.")}let i;if(i=/^(\w+)\(([^\)]*)\)/.exec(e)){let r,a=i[1],o=i[2];switch(a){case"rgb":case"rgba":if(r=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(r[4]),this.setRGB(Math.min(255,parseInt(r[1],10))/255,Math.min(255,parseInt(r[2],10))/255,Math.min(255,parseInt(r[3],10))/255,t);if(r=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(r[4]),this.setRGB(Math.min(100,parseInt(r[1],10))/100,Math.min(100,parseInt(r[2],10))/100,Math.min(100,parseInt(r[3],10))/100,t);break;case"hsl":case"hsla":if(r=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(r[4]),this.setHSL(parseFloat(r[1])/360,parseFloat(r[2])/100,parseFloat(r[3])/100,t);break;default:Ee("Color: Unknown color model "+e)}}else if(i=/^\#([A-Fa-f\d]+)$/.exec(e)){let r=i[1],a=r.length;if(a===3)return this.setRGB(parseInt(r.charAt(0),16)/15,parseInt(r.charAt(1),16)/15,parseInt(r.charAt(2),16)/15,t);if(a===6)return this.setHex(parseInt(r,16),t);Ee("Color: Invalid hex color "+e)}else if(e&&e.length>0)return this.setColorName(e,t);return this}setColorName(e,t=St){let n=Du[e.toLowerCase()];return n!==void 0?this.setHex(n,t):Ee("Color: Unknown color "+e),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(e){return this.r=e.r,this.g=e.g,this.b=e.b,this}copySRGBToLinear(e){return this.r=qn(e.r),this.g=qn(e.g),this.b=qn(e.b),this}copyLinearToSRGB(e){return this.r=us(e.r),this.g=us(e.g),this.b=us(e.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(e=St){return Be.workingToColorSpace(zt.copy(this),e),Math.round(Xe(zt.r*255,0,255))*65536+Math.round(Xe(zt.g*255,0,255))*256+Math.round(Xe(zt.b*255,0,255))}getHexString(e=St){return("000000"+this.getHex(e).toString(16)).slice(-6)}getHSL(e,t=Be.workingColorSpace){Be.workingToColorSpace(zt.copy(this),t);let n=zt.r,i=zt.g,r=zt.b,a=Math.max(n,i,r),o=Math.min(n,i,r),l,c,h=(o+a)/2;if(o===a)l=0,c=0;else{let d=a-o;switch(c=h<=.5?d/(a+o):d/(2-a-o),a){case n:l=(i-r)/d+(i0&&(t.object.backgroundBlurriness=this.backgroundBlurriness),this.backgroundIntensity!==1&&(t.object.backgroundIntensity=this.backgroundIntensity),t.object.backgroundRotation=this.backgroundRotation.toArray(),this.environmentIntensity!==1&&(t.object.environmentIntensity=this.environmentIntensity),t.object.environmentRotation=this.environmentRotation.toArray(),t}},fn=new L,Vn=new L,pl=new L,Gn=new L,ts=new L,ns=new L,wh=new L,ml=new L,gl=new L,_l=new L,xl=new et,vl=new et,yl=new et,ui=class s{constructor(e=new L,t=new L,n=new L){this.a=e,this.b=t,this.c=n}static getNormal(e,t,n,i){i.subVectors(n,t),fn.subVectors(e,t),i.cross(fn);let r=i.lengthSq();return r>0?i.multiplyScalar(1/Math.sqrt(r)):i.set(0,0,0)}static getBarycoord(e,t,n,i,r){fn.subVectors(i,t),Vn.subVectors(n,t),pl.subVectors(e,t);let a=fn.dot(fn),o=fn.dot(Vn),l=fn.dot(pl),c=Vn.dot(Vn),h=Vn.dot(pl),d=a*c-o*o;if(d===0)return r.set(0,0,0),null;let u=1/d,f=(c*l-o*h)*u,g=(a*h-o*l)*u;return r.set(1-f-g,g,f)}static containsPoint(e,t,n,i){return this.getBarycoord(e,t,n,i,Gn)===null?!1:Gn.x>=0&&Gn.y>=0&&Gn.x+Gn.y<=1}static getInterpolation(e,t,n,i,r,a,o,l){return this.getBarycoord(e,t,n,i,Gn)===null?(l.x=0,l.y=0,"z"in l&&(l.z=0),"w"in l&&(l.w=0),null):(l.setScalar(0),l.addScaledVector(r,Gn.x),l.addScaledVector(a,Gn.y),l.addScaledVector(o,Gn.z),l)}static getInterpolatedAttribute(e,t,n,i,r,a){return xl.setScalar(0),vl.setScalar(0),yl.setScalar(0),xl.fromBufferAttribute(e,t),vl.fromBufferAttribute(e,n),yl.fromBufferAttribute(e,i),a.setScalar(0),a.addScaledVector(xl,r.x),a.addScaledVector(vl,r.y),a.addScaledVector(yl,r.z),a}static isFrontFacing(e,t,n,i){return fn.subVectors(n,t),Vn.subVectors(e,t),fn.cross(Vn).dot(i)<0}set(e,t,n){return this.a.copy(e),this.b.copy(t),this.c.copy(n),this}setFromPointsAndIndices(e,t,n,i){return this.a.copy(e[t]),this.b.copy(e[n]),this.c.copy(e[i]),this}setFromAttributeAndIndices(e,t,n,i){return this.a.fromBufferAttribute(e,t),this.b.fromBufferAttribute(e,n),this.c.fromBufferAttribute(e,i),this}clone(){return new this.constructor().copy(this)}copy(e){return this.a.copy(e.a),this.b.copy(e.b),this.c.copy(e.c),this}getArea(){return fn.subVectors(this.c,this.b),Vn.subVectors(this.a,this.b),fn.cross(Vn).length()*.5}getMidpoint(e){return e.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(e){return s.getNormal(this.a,this.b,this.c,e)}getPlane(e){return e.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(e,t){return s.getBarycoord(e,this.a,this.b,this.c,t)}getInterpolation(e,t,n,i,r){return s.getInterpolation(e,this.a,this.b,this.c,t,n,i,r)}containsPoint(e){return s.containsPoint(e,this.a,this.b,this.c)}isFrontFacing(e){return s.isFrontFacing(this.a,this.b,this.c,e)}intersectsBox(e){return e.intersectsTriangle(this)}closestPointToPoint(e,t){let n=this.a,i=this.b,r=this.c,a,o;ts.subVectors(i,n),ns.subVectors(r,n),ml.subVectors(e,n);let l=ts.dot(ml),c=ns.dot(ml);if(l<=0&&c<=0)return t.copy(n);gl.subVectors(e,i);let h=ts.dot(gl),d=ns.dot(gl);if(h>=0&&d<=h)return t.copy(i);let u=l*d-h*c;if(u<=0&&l>=0&&h<=0)return a=l/(l-h),t.copy(n).addScaledVector(ts,a);_l.subVectors(e,r);let f=ts.dot(_l),g=ns.dot(_l);if(g>=0&&f<=g)return t.copy(r);let M=f*c-l*g;if(M<=0&&c>=0&&g<=0)return o=c/(c-g),t.copy(n).addScaledVector(ns,o);let m=h*g-f*d;if(m<=0&&d-h>=0&&f-g>=0)return wh.subVectors(r,i),o=(d-h)/(d-h+(f-g)),t.copy(i).addScaledVector(wh,o);let p=1/(m+M+u);return a=M*p,o=u*p,t.copy(n).addScaledVector(ts,a).addScaledVector(ns,o)}equals(e){return e.a.equals(this.a)&&e.b.equals(this.b)&&e.c.equals(this.c)}},Xt=class{constructor(e=new L(1/0,1/0,1/0),t=new L(-1/0,-1/0,-1/0)){this.isBox3=!0,this.min=e,this.max=t}set(e,t){return this.min.copy(e),this.max.copy(t),this}setFromArray(e){this.makeEmpty();for(let t=0,n=e.length;t=this.min.x&&e.x<=this.max.x&&e.y>=this.min.y&&e.y<=this.max.y&&e.z>=this.min.z&&e.z<=this.max.z}containsBox(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y&&this.min.z<=e.min.z&&e.max.z<=this.max.z}getParameter(e,t){return t.set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y),(e.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(e){return e.max.x>=this.min.x&&e.min.x<=this.max.x&&e.max.y>=this.min.y&&e.min.y<=this.max.y&&e.max.z>=this.min.z&&e.min.z<=this.max.z}intersectsSphere(e){return this.clampPoint(e.center,pn),pn.distanceToSquared(e.center)<=e.radius*e.radius}intersectsPlane(e){let t,n;return e.normal.x>0?(t=e.normal.x*this.min.x,n=e.normal.x*this.max.x):(t=e.normal.x*this.max.x,n=e.normal.x*this.min.x),e.normal.y>0?(t+=e.normal.y*this.min.y,n+=e.normal.y*this.max.y):(t+=e.normal.y*this.max.y,n+=e.normal.y*this.min.y),e.normal.z>0?(t+=e.normal.z*this.min.z,n+=e.normal.z*this.max.z):(t+=e.normal.z*this.max.z,n+=e.normal.z*this.min.z),t<=-e.constant&&n>=-e.constant}intersectsTriangle(e){if(this.isEmpty())return!1;this.getCenter(Gs),ta.subVectors(this.max,Gs),is.subVectors(e.a,Gs),ss.subVectors(e.b,Gs),rs.subVectors(e.c,Gs),oi.subVectors(ss,is),li.subVectors(rs,ss),bi.subVectors(is,rs);let t=[0,-oi.z,oi.y,0,-li.z,li.y,0,-bi.z,bi.y,oi.z,0,-oi.x,li.z,0,-li.x,bi.z,0,-bi.x,-oi.y,oi.x,0,-li.y,li.x,0,-bi.y,bi.x,0];return!Ml(t,is,ss,rs,ta)||(t=[1,0,0,0,1,0,0,0,1],!Ml(t,is,ss,rs,ta))?!1:(na.crossVectors(oi,li),t=[na.x,na.y,na.z],Ml(t,is,ss,rs,ta))}clampPoint(e,t){return t.copy(e).clamp(this.min,this.max)}distanceToPoint(e){return this.clampPoint(e,pn).distanceTo(e)}getBoundingSphere(e){return this.isEmpty()?e.makeEmpty():(this.getCenter(e.center),e.radius=this.getSize(pn).length()*.5),e}intersect(e){return this.min.max(e.min),this.max.min(e.max),this.isEmpty()&&this.makeEmpty(),this}union(e){return this.min.min(e.min),this.max.max(e.max),this}applyMatrix4(e){return this.isEmpty()?this:(Hn[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(e),Hn[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(e),Hn[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(e),Hn[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(e),Hn[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(e),Hn[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(e),Hn[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(e),Hn[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(e),this.setFromPoints(Hn),this)}translate(e){return this.min.add(e),this.max.add(e),this}equals(e){return e.min.equals(this.min)&&e.max.equals(this.max)}toJSON(){return{min:this.min.toArray(),max:this.max.toArray()}}fromJSON(e){return this.min.fromArray(e.min),this.max.fromArray(e.max),this}},Hn=[new L,new L,new L,new L,new L,new L,new L,new L],pn=new L,ea=new Xt,is=new L,ss=new L,rs=new L,oi=new L,li=new L,bi=new L,Gs=new L,ta=new L,na=new L,Ti=new L;function Ml(s,e,t,n,i){for(let r=0,a=s.length-3;r<=a;r+=3){Ti.fromArray(s,r);let o=i.x*Math.abs(Ti.x)+i.y*Math.abs(Ti.y)+i.z*Math.abs(Ti.z),l=e.dot(Ti),c=t.dot(Ti),h=n.dot(Ti);if(Math.max(-Math.max(l,c,h),Math.min(l,c,h))>o)return!1}return!0}var At=new L,ia=new ye,of=0,Rt=class extends Pn{constructor(e,t,n=!1){if(super(),Array.isArray(e))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.isBufferAttribute=!0,Object.defineProperty(this,"id",{value:of++}),this.name="",this.array=e,this.itemSize=t,this.count=e!==void 0?e.length/t:0,this.normalized=n,this.usage=Na,this.updateRanges=[],this.gpuType=sn,this.version=0}onUploadCallback(){}set needsUpdate(e){e===!0&&this.version++}setUsage(e){return this.usage=e,this}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}copy(e){return this.name=e.name,this.array=new e.array.constructor(e.array),this.itemSize=e.itemSize,this.count=e.count,this.normalized=e.normalized,this.usage=e.usage,this.gpuType=e.gpuType,this}copyAt(e,t,n){e*=this.itemSize,n*=t.itemSize;for(let i=0,r=this.itemSize;ithis.radius*this.radius&&(t.sub(this.center).normalize(),t.multiplyScalar(this.radius).add(this.center)),t}getBoundingBox(e){return this.isEmpty()?(e.makeEmpty(),e):(e.set(this.center,this.center),e.expandByScalar(this.radius),e)}applyMatrix4(e){return this.center.applyMatrix4(e),this.radius=this.radius*e.getMaxScaleOnAxis(),this}translate(e){return this.center.add(e),this}expandByPoint(e){if(this.isEmpty())return this.center.copy(e),this.radius=0,this;Hs.subVectors(e,this.center);let t=Hs.lengthSq();if(t>this.radius*this.radius){let n=Math.sqrt(t),i=(n-this.radius)*.5;this.center.addScaledVector(Hs,i/n),this.radius+=i}return this}union(e){return e.isEmpty()?this:this.isEmpty()?(this.copy(e),this):(this.center.equals(e.center)===!0?this.radius=Math.max(this.radius,e.radius):(Sl.subVectors(e.center,this.center).setLength(e.radius),this.expandByPoint(Hs.copy(e.center).add(Sl)),this.expandByPoint(Hs.copy(e.center).sub(Sl))),this)}equals(e){return e.center.equals(this.center)&&e.radius===this.radius}clone(){return new this.constructor().copy(this)}toJSON(){return{radius:this.radius,center:this.center.toArray()}}fromJSON(e){return this.radius=e.radius,this.center.fromArray(e.center),this}},cf=0,ln=new Oe,bl=new ct,as=new L,tn=new Xt,Ws=new Xt,Nt=new L,xt=class s extends Pn{constructor(){super(),this.isBufferGeometry=!0,Object.defineProperty(this,"id",{value:cf++}),this.uuid=_n(),this.name="",this.type="BufferGeometry",this.index=null,this.indirect=null,this.indirectOffset=0,this.attributes={},this.morphAttributes={},this.morphTargetsRelative=!1,this.groups=[],this.boundingBox=null,this.boundingSphere=null,this.drawRange={start:0,count:1/0},this.userData={},this._transformed=!1}getIndex(){return this.index}setIndex(e){return Array.isArray(e)?this.index=new(Ld(e)?ir:nr)(e,1):this.index=e,this}setIndirect(e,t=0){return this.indirect=e,this.indirectOffset=t,this}getIndirect(){return this.indirect}getAttribute(e){return this.attributes[e]}setAttribute(e,t){return this.attributes[e]=t,this}deleteAttribute(e){return delete this.attributes[e],this}hasAttribute(e){return this.attributes[e]!==void 0}addGroup(e,t,n=0){this.groups.push({start:e,count:t,materialIndex:n})}clearGroups(){this.groups=[]}setDrawRange(e,t){this.drawRange.start=e,this.drawRange.count=t}applyMatrix4(e){let t=this.attributes.position;t!==void 0&&(t.applyMatrix4(e),t.needsUpdate=!0);let n=this.attributes.normal;if(n!==void 0){let r=new Ue().getNormalMatrix(e);n.applyNormalMatrix(r),n.needsUpdate=!0}let i=this.attributes.tangent;return i!==void 0&&(i.transformDirection(e),i.needsUpdate=!0),this.boundingBox!==null&&this.computeBoundingBox(),this.boundingSphere!==null&&this.computeBoundingSphere(),this._transformed=!0,this}applyQuaternion(e){return ln.makeRotationFromQuaternion(e),this.applyMatrix4(ln),this}rotateX(e){return ln.makeRotationX(e),this.applyMatrix4(ln),this}rotateY(e){return ln.makeRotationY(e),this.applyMatrix4(ln),this}rotateZ(e){return ln.makeRotationZ(e),this.applyMatrix4(ln),this}translate(e,t,n){return ln.makeTranslation(e,t,n),this.applyMatrix4(ln),this}scale(e,t,n){return ln.makeScale(e,t,n),this.applyMatrix4(ln),this}lookAt(e){return bl.lookAt(e),bl.updateMatrix(),this.applyMatrix4(bl.matrix),this}center(){return this.computeBoundingBox(),this.boundingBox.getCenter(as).negate(),this.translate(as.x,as.y,as.z),this}setFromPoints(e){let t=this.getAttribute("position");if(t===void 0){let n=[];for(let i=0,r=e.length;it.count&&Ee("BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry."),t.needsUpdate=!0}return this}computeBoundingBox(){this.boundingBox===null&&(this.boundingBox=new Xt);let e=this.attributes.position,t=this.morphAttributes.position;if(e&&e.isGLBufferAttribute){De("BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.",this),this.boundingBox.set(new L(-1/0,-1/0,-1/0),new L(1/0,1/0,1/0));return}if(e!==void 0){if(this.boundingBox.setFromBufferAttribute(e),t)for(let n=0,i=t.length;n0&&(e.userData=this.userData),this.parameters!==void 0&&this._transformed!==!0){let l=this.parameters;for(let c in l)l[c]!==void 0&&(e[c]=l[c]);return e}e.data={attributes:{}};let t=this.index;t!==null&&(e.data.index={type:t.array.constructor.name,array:Array.prototype.slice.call(t.array)});let n=this.attributes;for(let l in n){let c=n[l];e.data.attributes[l]=c.toJSON(e.data)}let i={},r=!1;for(let l in this.morphAttributes){let c=this.morphAttributes[l],h=[];for(let d=0,u=c.length;d0&&(i[l]=h,r=!0)}r&&(e.data.morphAttributes=i,e.data.morphTargetsRelative=this.morphTargetsRelative);let a=this.groups;a.length>0&&(e.data.groups=JSON.parse(JSON.stringify(a)));let o=this.boundingSphere;return o!==null&&(e.data.boundingSphere=o.toJSON()),e}clone(){return new this.constructor().copy(this)}copy(e){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;let t={};this.name=e.name;let n=e.index;n!==null&&this.setIndex(n.clone());let i=e.attributes;for(let c in i){let h=i[c];this.setAttribute(c,h.clone(t))}let r=e.morphAttributes;for(let c in r){let h=[],d=r[c];for(let u=0,f=d.length;u0!=e>0&&this.version++,this._alphaTest=e}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(e){if(e!==void 0)for(let t in e){let n=e[t];if(n===void 0){Ee(`Material: parameter '${t}' has value of undefined.`);continue}let i=this[t];if(i===void 0){Ee(`Material: '${t}' is not a property of THREE.${this.type}.`);continue}i&&i.isColor?i.set(n):i&&i.isVector2&&n&&n.isVector2||i&&i.isEuler&&n&&n.isEuler||i&&i.isVector3&&n&&n.isVector3?i.copy(n):this[t]=n}}toJSON(e){let t=e===void 0||typeof e=="string";t&&(e={textures:{},images:{}});let n={metadata:{version:4.7,type:"Material",generator:"Material.toJSON"}};n.uuid=this.uuid,n.type=this.type,this.name!==""&&(n.name=this.name),this.color&&this.color.isColor&&(n.color=this.color.getHex()),this.roughness!==void 0&&(n.roughness=this.roughness),this.metalness!==void 0&&(n.metalness=this.metalness),this.sheen!==void 0&&(n.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(n.sheenColor=this.sheenColor.getHex()),this.sheenRoughness!==void 0&&(n.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(n.emissive=this.emissive.getHex()),this.emissiveIntensity!==void 0&&this.emissiveIntensity!==1&&(n.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(n.specular=this.specular.getHex()),this.specularIntensity!==void 0&&(n.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(n.specularColor=this.specularColor.getHex()),this.shininess!==void 0&&(n.shininess=this.shininess),this.clearcoat!==void 0&&(n.clearcoat=this.clearcoat),this.clearcoatRoughness!==void 0&&(n.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(n.clearcoatMap=this.clearcoatMap.toJSON(e).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(n.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(e).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(n.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(e).uuid,n.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.sheenColorMap&&this.sheenColorMap.isTexture&&(n.sheenColorMap=this.sheenColorMap.toJSON(e).uuid),this.sheenRoughnessMap&&this.sheenRoughnessMap.isTexture&&(n.sheenRoughnessMap=this.sheenRoughnessMap.toJSON(e).uuid),this.dispersion!==void 0&&(n.dispersion=this.dispersion),this.iridescence!==void 0&&(n.iridescence=this.iridescence),this.iridescenceIOR!==void 0&&(n.iridescenceIOR=this.iridescenceIOR),this.iridescenceThicknessRange!==void 0&&(n.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(n.iridescenceMap=this.iridescenceMap.toJSON(e).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(n.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(e).uuid),this.anisotropy!==void 0&&(n.anisotropy=this.anisotropy),this.anisotropyRotation!==void 0&&(n.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(n.anisotropyMap=this.anisotropyMap.toJSON(e).uuid),this.map&&this.map.isTexture&&(n.map=this.map.toJSON(e).uuid),this.matcap&&this.matcap.isTexture&&(n.matcap=this.matcap.toJSON(e).uuid),this.alphaMap&&this.alphaMap.isTexture&&(n.alphaMap=this.alphaMap.toJSON(e).uuid),this.lightMap&&this.lightMap.isTexture&&(n.lightMap=this.lightMap.toJSON(e).uuid,n.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(n.aoMap=this.aoMap.toJSON(e).uuid,n.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(n.bumpMap=this.bumpMap.toJSON(e).uuid,n.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(n.normalMap=this.normalMap.toJSON(e).uuid,n.normalMapType=this.normalMapType,n.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(n.displacementMap=this.displacementMap.toJSON(e).uuid,n.displacementScale=this.displacementScale,n.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(n.roughnessMap=this.roughnessMap.toJSON(e).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(n.metalnessMap=this.metalnessMap.toJSON(e).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(n.emissiveMap=this.emissiveMap.toJSON(e).uuid),this.specularMap&&this.specularMap.isTexture&&(n.specularMap=this.specularMap.toJSON(e).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(n.specularIntensityMap=this.specularIntensityMap.toJSON(e).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(n.specularColorMap=this.specularColorMap.toJSON(e).uuid),this.envMap&&this.envMap.isTexture&&(n.envMap=this.envMap.toJSON(e).uuid,this.combine!==void 0&&(n.combine=this.combine)),this.envMapRotation!==void 0&&(n.envMapRotation=this.envMapRotation.toArray()),this.envMapIntensity!==void 0&&(n.envMapIntensity=this.envMapIntensity),this.reflectivity!==void 0&&(n.reflectivity=this.reflectivity),this.refractionRatio!==void 0&&(n.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(n.gradientMap=this.gradientMap.toJSON(e).uuid),this.transmission!==void 0&&(n.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(n.transmissionMap=this.transmissionMap.toJSON(e).uuid),this.thickness!==void 0&&(n.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(n.thicknessMap=this.thicknessMap.toJSON(e).uuid),this.attenuationDistance!==void 0&&this.attenuationDistance!==1/0&&(n.attenuationDistance=this.attenuationDistance),this.attenuationColor!==void 0&&(n.attenuationColor=this.attenuationColor.getHex()),this.size!==void 0&&(n.size=this.size),this.shadowSide!==null&&(n.shadowSide=this.shadowSide),this.sizeAttenuation!==void 0&&(n.sizeAttenuation=this.sizeAttenuation),this.blending!==Ci&&(n.blending=this.blending),this.side!==xn&&(n.side=this.side),this.vertexColors===!0&&(n.vertexColors=!0),this.opacity<1&&(n.opacity=this.opacity),this.transparent===!0&&(n.transparent=!0),this.blendSrc!==Ta&&(n.blendSrc=this.blendSrc),this.blendDst!==Ea&&(n.blendDst=this.blendDst),this.blendEquation!==di&&(n.blendEquation=this.blendEquation),this.blendSrcAlpha!==null&&(n.blendSrcAlpha=this.blendSrcAlpha),this.blendDstAlpha!==null&&(n.blendDstAlpha=this.blendDstAlpha),this.blendEquationAlpha!==null&&(n.blendEquationAlpha=this.blendEquationAlpha),this.blendColor&&this.blendColor.isColor&&(n.blendColor=this.blendColor.getHex()),this.blendAlpha!==0&&(n.blendAlpha=this.blendAlpha),this.depthFunc!==Ii&&(n.depthFunc=this.depthFunc),this.depthTest===!1&&(n.depthTest=this.depthTest),this.depthWrite===!1&&(n.depthWrite=this.depthWrite),this.colorWrite===!1&&(n.colorWrite=this.colorWrite),this.stencilWriteMask!==255&&(n.stencilWriteMask=this.stencilWriteMask),this.stencilFunc!==zl&&(n.stencilFunc=this.stencilFunc),this.stencilRef!==0&&(n.stencilRef=this.stencilRef),this.stencilFuncMask!==255&&(n.stencilFuncMask=this.stencilFuncMask),this.stencilFail!==wi&&(n.stencilFail=this.stencilFail),this.stencilZFail!==wi&&(n.stencilZFail=this.stencilZFail),this.stencilZPass!==wi&&(n.stencilZPass=this.stencilZPass),this.stencilWrite===!0&&(n.stencilWrite=this.stencilWrite),this.rotation!==void 0&&this.rotation!==0&&(n.rotation=this.rotation),this.polygonOffset===!0&&(n.polygonOffset=!0),this.polygonOffsetFactor!==0&&(n.polygonOffsetFactor=this.polygonOffsetFactor),this.polygonOffsetUnits!==0&&(n.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth!==void 0&&this.linewidth!==1&&(n.linewidth=this.linewidth),this.dashSize!==void 0&&(n.dashSize=this.dashSize),this.gapSize!==void 0&&(n.gapSize=this.gapSize),this.scale!==void 0&&(n.scale=this.scale),this.dithering===!0&&(n.dithering=!0),this.alphaTest>0&&(n.alphaTest=this.alphaTest),this.alphaHash===!0&&(n.alphaHash=!0),this.alphaToCoverage===!0&&(n.alphaToCoverage=!0),this.premultipliedAlpha===!0&&(n.premultipliedAlpha=!0),this.forceSinglePass===!0&&(n.forceSinglePass=!0),this.allowOverride===!1&&(n.allowOverride=!1),this.wireframe===!0&&(n.wireframe=!0),this.wireframeLinewidth>1&&(n.wireframeLinewidth=this.wireframeLinewidth),this.wireframeLinecap!=="round"&&(n.wireframeLinecap=this.wireframeLinecap),this.wireframeLinejoin!=="round"&&(n.wireframeLinejoin=this.wireframeLinejoin),this.flatShading===!0&&(n.flatShading=!0),this.visible===!1&&(n.visible=!1),this.toneMapped===!1&&(n.toneMapped=!1),this.fog===!1&&(n.fog=!1),Object.keys(this.userData).length>0&&(n.userData=this.userData);function i(r){let a=[];for(let o in r){let l=r[o];delete l.metadata,a.push(l)}return a}if(t){let r=i(e.textures),a=i(e.images);r.length>0&&(n.textures=r),a.length>0&&(n.images=a)}return n}fromJSON(e,t){if(e.uuid!==void 0&&(this.uuid=e.uuid),e.name!==void 0&&(this.name=e.name),e.color!==void 0&&this.color!==void 0&&this.color.setHex(e.color),e.roughness!==void 0&&(this.roughness=e.roughness),e.metalness!==void 0&&(this.metalness=e.metalness),e.sheen!==void 0&&(this.sheen=e.sheen),e.sheenColor!==void 0&&(this.sheenColor=new Me().setHex(e.sheenColor)),e.sheenRoughness!==void 0&&(this.sheenRoughness=e.sheenRoughness),e.emissive!==void 0&&this.emissive!==void 0&&this.emissive.setHex(e.emissive),e.specular!==void 0&&this.specular!==void 0&&this.specular.setHex(e.specular),e.specularIntensity!==void 0&&(this.specularIntensity=e.specularIntensity),e.specularColor!==void 0&&this.specularColor!==void 0&&this.specularColor.setHex(e.specularColor),e.shininess!==void 0&&(this.shininess=e.shininess),e.clearcoat!==void 0&&(this.clearcoat=e.clearcoat),e.clearcoatRoughness!==void 0&&(this.clearcoatRoughness=e.clearcoatRoughness),e.dispersion!==void 0&&(this.dispersion=e.dispersion),e.iridescence!==void 0&&(this.iridescence=e.iridescence),e.iridescenceIOR!==void 0&&(this.iridescenceIOR=e.iridescenceIOR),e.iridescenceThicknessRange!==void 0&&(this.iridescenceThicknessRange=e.iridescenceThicknessRange),e.transmission!==void 0&&(this.transmission=e.transmission),e.thickness!==void 0&&(this.thickness=e.thickness),e.attenuationDistance!==void 0&&(this.attenuationDistance=e.attenuationDistance),e.attenuationColor!==void 0&&this.attenuationColor!==void 0&&this.attenuationColor.setHex(e.attenuationColor),e.anisotropy!==void 0&&(this.anisotropy=e.anisotropy),e.anisotropyRotation!==void 0&&(this.anisotropyRotation=e.anisotropyRotation),e.fog!==void 0&&(this.fog=e.fog),e.flatShading!==void 0&&(this.flatShading=e.flatShading),e.blending!==void 0&&(this.blending=e.blending),e.combine!==void 0&&(this.combine=e.combine),e.side!==void 0&&(this.side=e.side),e.shadowSide!==void 0&&(this.shadowSide=e.shadowSide),e.opacity!==void 0&&(this.opacity=e.opacity),e.transparent!==void 0&&(this.transparent=e.transparent),e.alphaTest!==void 0&&(this.alphaTest=e.alphaTest),e.alphaHash!==void 0&&(this.alphaHash=e.alphaHash),e.depthFunc!==void 0&&(this.depthFunc=e.depthFunc),e.depthTest!==void 0&&(this.depthTest=e.depthTest),e.depthWrite!==void 0&&(this.depthWrite=e.depthWrite),e.colorWrite!==void 0&&(this.colorWrite=e.colorWrite),e.blendSrc!==void 0&&(this.blendSrc=e.blendSrc),e.blendDst!==void 0&&(this.blendDst=e.blendDst),e.blendEquation!==void 0&&(this.blendEquation=e.blendEquation),e.blendSrcAlpha!==void 0&&(this.blendSrcAlpha=e.blendSrcAlpha),e.blendDstAlpha!==void 0&&(this.blendDstAlpha=e.blendDstAlpha),e.blendEquationAlpha!==void 0&&(this.blendEquationAlpha=e.blendEquationAlpha),e.blendColor!==void 0&&this.blendColor!==void 0&&this.blendColor.setHex(e.blendColor),e.blendAlpha!==void 0&&(this.blendAlpha=e.blendAlpha),e.stencilWriteMask!==void 0&&(this.stencilWriteMask=e.stencilWriteMask),e.stencilFunc!==void 0&&(this.stencilFunc=e.stencilFunc),e.stencilRef!==void 0&&(this.stencilRef=e.stencilRef),e.stencilFuncMask!==void 0&&(this.stencilFuncMask=e.stencilFuncMask),e.stencilFail!==void 0&&(this.stencilFail=e.stencilFail),e.stencilZFail!==void 0&&(this.stencilZFail=e.stencilZFail),e.stencilZPass!==void 0&&(this.stencilZPass=e.stencilZPass),e.stencilWrite!==void 0&&(this.stencilWrite=e.stencilWrite),e.wireframe!==void 0&&(this.wireframe=e.wireframe),e.wireframeLinewidth!==void 0&&(this.wireframeLinewidth=e.wireframeLinewidth),e.wireframeLinecap!==void 0&&(this.wireframeLinecap=e.wireframeLinecap),e.wireframeLinejoin!==void 0&&(this.wireframeLinejoin=e.wireframeLinejoin),e.rotation!==void 0&&(this.rotation=e.rotation),e.linewidth!==void 0&&(this.linewidth=e.linewidth),e.dashSize!==void 0&&(this.dashSize=e.dashSize),e.gapSize!==void 0&&(this.gapSize=e.gapSize),e.scale!==void 0&&(this.scale=e.scale),e.polygonOffset!==void 0&&(this.polygonOffset=e.polygonOffset),e.polygonOffsetFactor!==void 0&&(this.polygonOffsetFactor=e.polygonOffsetFactor),e.polygonOffsetUnits!==void 0&&(this.polygonOffsetUnits=e.polygonOffsetUnits),e.dithering!==void 0&&(this.dithering=e.dithering),e.alphaToCoverage!==void 0&&(this.alphaToCoverage=e.alphaToCoverage),e.premultipliedAlpha!==void 0&&(this.premultipliedAlpha=e.premultipliedAlpha),e.forceSinglePass!==void 0&&(this.forceSinglePass=e.forceSinglePass),e.allowOverride!==void 0&&(this.allowOverride=e.allowOverride),e.visible!==void 0&&(this.visible=e.visible),e.toneMapped!==void 0&&(this.toneMapped=e.toneMapped),e.userData!==void 0&&(this.userData=e.userData),e.vertexColors!==void 0&&(typeof e.vertexColors=="number"?this.vertexColors=e.vertexColors>0:this.vertexColors=e.vertexColors),e.size!==void 0&&(this.size=e.size),e.sizeAttenuation!==void 0&&(this.sizeAttenuation=e.sizeAttenuation),e.map!==void 0&&(this.map=t[e.map]||null),e.matcap!==void 0&&(this.matcap=t[e.matcap]||null),e.alphaMap!==void 0&&(this.alphaMap=t[e.alphaMap]||null),e.bumpMap!==void 0&&(this.bumpMap=t[e.bumpMap]||null),e.bumpScale!==void 0&&(this.bumpScale=e.bumpScale),e.normalMap!==void 0&&(this.normalMap=t[e.normalMap]||null),e.normalMapType!==void 0&&(this.normalMapType=e.normalMapType),e.normalScale!==void 0){let n=e.normalScale;Array.isArray(n)===!1&&(n=[n,n]),this.normalScale=new ye().fromArray(n)}return e.displacementMap!==void 0&&(this.displacementMap=t[e.displacementMap]||null),e.displacementScale!==void 0&&(this.displacementScale=e.displacementScale),e.displacementBias!==void 0&&(this.displacementBias=e.displacementBias),e.roughnessMap!==void 0&&(this.roughnessMap=t[e.roughnessMap]||null),e.metalnessMap!==void 0&&(this.metalnessMap=t[e.metalnessMap]||null),e.emissiveMap!==void 0&&(this.emissiveMap=t[e.emissiveMap]||null),e.emissiveIntensity!==void 0&&(this.emissiveIntensity=e.emissiveIntensity),e.specularMap!==void 0&&(this.specularMap=t[e.specularMap]||null),e.specularIntensityMap!==void 0&&(this.specularIntensityMap=t[e.specularIntensityMap]||null),e.specularColorMap!==void 0&&(this.specularColorMap=t[e.specularColorMap]||null),e.envMap!==void 0&&(this.envMap=t[e.envMap]||null),e.envMapRotation!==void 0&&this.envMapRotation.fromArray(e.envMapRotation),e.envMapIntensity!==void 0&&(this.envMapIntensity=e.envMapIntensity),e.reflectivity!==void 0&&(this.reflectivity=e.reflectivity),e.refractionRatio!==void 0&&(this.refractionRatio=e.refractionRatio),e.lightMap!==void 0&&(this.lightMap=t[e.lightMap]||null),e.lightMapIntensity!==void 0&&(this.lightMapIntensity=e.lightMapIntensity),e.aoMap!==void 0&&(this.aoMap=t[e.aoMap]||null),e.aoMapIntensity!==void 0&&(this.aoMapIntensity=e.aoMapIntensity),e.gradientMap!==void 0&&(this.gradientMap=t[e.gradientMap]||null),e.clearcoatMap!==void 0&&(this.clearcoatMap=t[e.clearcoatMap]||null),e.clearcoatRoughnessMap!==void 0&&(this.clearcoatRoughnessMap=t[e.clearcoatRoughnessMap]||null),e.clearcoatNormalMap!==void 0&&(this.clearcoatNormalMap=t[e.clearcoatNormalMap]||null),e.clearcoatNormalScale!==void 0&&(this.clearcoatNormalScale=new ye().fromArray(e.clearcoatNormalScale)),e.iridescenceMap!==void 0&&(this.iridescenceMap=t[e.iridescenceMap]||null),e.iridescenceThicknessMap!==void 0&&(this.iridescenceThicknessMap=t[e.iridescenceThicknessMap]||null),e.transmissionMap!==void 0&&(this.transmissionMap=t[e.transmissionMap]||null),e.thicknessMap!==void 0&&(this.thicknessMap=t[e.thicknessMap]||null),e.anisotropyMap!==void 0&&(this.anisotropyMap=t[e.anisotropyMap]||null),e.sheenColorMap!==void 0&&(this.sheenColorMap=t[e.sheenColorMap]||null),e.sheenRoughnessMap!==void 0&&(this.sheenRoughnessMap=t[e.sheenRoughnessMap]||null),this}clone(){return new this.constructor().copy(this)}copy(e){this.name=e.name,this.blending=e.blending,this.side=e.side,this.vertexColors=e.vertexColors,this.opacity=e.opacity,this.transparent=e.transparent,this.blendSrc=e.blendSrc,this.blendDst=e.blendDst,this.blendEquation=e.blendEquation,this.blendSrcAlpha=e.blendSrcAlpha,this.blendDstAlpha=e.blendDstAlpha,this.blendEquationAlpha=e.blendEquationAlpha,this.blendColor.copy(e.blendColor),this.blendAlpha=e.blendAlpha,this.depthFunc=e.depthFunc,this.depthTest=e.depthTest,this.depthWrite=e.depthWrite,this.stencilWriteMask=e.stencilWriteMask,this.stencilFunc=e.stencilFunc,this.stencilRef=e.stencilRef,this.stencilFuncMask=e.stencilFuncMask,this.stencilFail=e.stencilFail,this.stencilZFail=e.stencilZFail,this.stencilZPass=e.stencilZPass,this.stencilWrite=e.stencilWrite;let t=e.clippingPlanes,n=null;if(t!==null){let i=t.length;n=new Array(i);for(let r=0;r!==i;++r)n[r]=t[r].clone()}return this.clippingPlanes=n,this.clipIntersection=e.clipIntersection,this.clipShadows=e.clipShadows,this.shadowSide=e.shadowSide,this.colorWrite=e.colorWrite,this.precision=e.precision,this.polygonOffset=e.polygonOffset,this.polygonOffsetFactor=e.polygonOffsetFactor,this.polygonOffsetUnits=e.polygonOffsetUnits,this.dithering=e.dithering,this.alphaTest=e.alphaTest,this.alphaHash=e.alphaHash,this.alphaToCoverage=e.alphaToCoverage,this.premultipliedAlpha=e.premultipliedAlpha,this.forceSinglePass=e.forceSinglePass,this.allowOverride=e.allowOverride,this.visible=e.visible,this.toneMapped=e.toneMapped,this.userData=JSON.parse(JSON.stringify(e.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(e){e===!0&&this.version++}};var Wn=new L,Tl=new L,sa=new L,ci=new L,El=new L,ra=new L,Al=new L,Ui=class{constructor(e=new L,t=new L(0,0,-1)){this.origin=e,this.direction=t}set(e,t){return this.origin.copy(e),this.direction.copy(t),this}copy(e){return this.origin.copy(e.origin),this.direction.copy(e.direction),this}at(e,t){return t.copy(this.origin).addScaledVector(this.direction,e)}lookAt(e){return this.direction.copy(e).sub(this.origin).normalize(),this}recast(e){return this.origin.copy(this.at(e,Wn)),this}closestPointToPoint(e,t){t.subVectors(e,this.origin);let n=t.dot(this.direction);return n<0?t.copy(this.origin):t.copy(this.origin).addScaledVector(this.direction,n)}distanceToPoint(e){return Math.sqrt(this.distanceSqToPoint(e))}distanceSqToPoint(e){let t=Wn.subVectors(e,this.origin).dot(this.direction);return t<0?this.origin.distanceToSquared(e):(Wn.copy(this.origin).addScaledVector(this.direction,t),Wn.distanceToSquared(e))}distanceSqToSegment(e,t,n,i){Tl.copy(e).add(t).multiplyScalar(.5),sa.copy(t).sub(e).normalize(),ci.copy(this.origin).sub(Tl);let r=e.distanceTo(t)*.5,a=-this.direction.dot(sa),o=ci.dot(this.direction),l=-ci.dot(sa),c=ci.lengthSq(),h=Math.abs(1-a*a),d,u,f,g;if(h>0)if(d=a*l-o,u=a*o-l,g=r*h,d>=0)if(u>=-g)if(u<=g){let M=1/h;d*=M,u*=M,f=d*(d+a*u+2*o)+u*(a*d+u+2*l)+c}else u=r,d=Math.max(0,-(a*u+o)),f=-d*d+u*(u+2*l)+c;else u=-r,d=Math.max(0,-(a*u+o)),f=-d*d+u*(u+2*l)+c;else u<=-g?(d=Math.max(0,-(-a*r+o)),u=d>0?-r:Math.min(Math.max(-r,-l),r),f=-d*d+u*(u+2*l)+c):u<=g?(d=0,u=Math.min(Math.max(-r,-l),r),f=u*(u+2*l)+c):(d=Math.max(0,-(a*r+o)),u=d>0?r:Math.min(Math.max(-r,-l),r),f=-d*d+u*(u+2*l)+c);else u=a>0?-r:r,d=Math.max(0,-(a*u+o)),f=-d*d+u*(u+2*l)+c;return n&&n.copy(this.origin).addScaledVector(this.direction,d),i&&i.copy(Tl).addScaledVector(sa,u),f}intersectSphere(e,t){Wn.subVectors(e.center,this.origin);let n=Wn.dot(this.direction),i=Wn.dot(Wn)-n*n,r=e.radius*e.radius;if(i>r)return null;let a=Math.sqrt(r-i),o=n-a,l=n+a;return l<0?null:o<0?this.at(l,t):this.at(o,t)}intersectsSphere(e){return e.radius<0?!1:this.distanceSqToPoint(e.center)<=e.radius*e.radius}distanceToPlane(e){let t=e.normal.dot(this.direction);if(t===0)return e.distanceToPoint(this.origin)===0?0:null;let n=-(this.origin.dot(e.normal)+e.constant)/t;return n>=0?n:null}intersectPlane(e,t){let n=this.distanceToPlane(e);return n===null?null:this.at(n,t)}intersectsPlane(e){let t=e.distanceToPoint(this.origin);return t===0||e.normal.dot(this.direction)*t<0}intersectBox(e,t){let n,i,r,a,o,l,c=1/this.direction.x,h=1/this.direction.y,d=1/this.direction.z,u=this.origin;return c>=0?(n=(e.min.x-u.x)*c,i=(e.max.x-u.x)*c):(n=(e.max.x-u.x)*c,i=(e.min.x-u.x)*c),h>=0?(r=(e.min.y-u.y)*h,a=(e.max.y-u.y)*h):(r=(e.max.y-u.y)*h,a=(e.min.y-u.y)*h),n>a||r>i||((r>n||isNaN(n))&&(n=r),(a=0?(o=(e.min.z-u.z)*d,l=(e.max.z-u.z)*d):(o=(e.max.z-u.z)*d,l=(e.min.z-u.z)*d),n>l||o>i)||((o>n||n!==n)&&(n=o),(l=0?n:i,t)}intersectsBox(e){return this.intersectBox(e,Wn)!==null}intersectTriangle(e,t,n,i,r){El.subVectors(t,e),ra.subVectors(n,e),Al.crossVectors(El,ra);let a=this.direction.dot(Al),o;if(a>0){if(i)return null;o=1}else if(a<0)o=-1,a=-a;else return null;ci.subVectors(this.origin,e);let l=o*this.direction.dot(ra.crossVectors(ci,ra));if(l<0)return null;let c=o*this.direction.dot(El.cross(ci));if(c<0||l+c>a)return null;let h=-o*ci.dot(Al);return h<0?null:this.at(h/a,r)}applyMatrix4(e){return this.origin.applyMatrix4(e),this.direction.transformDirection(e),this}equals(e){return e.origin.equals(this.origin)&&e.direction.equals(this.direction)}clone(){return new this.constructor().copy(this)}},Yt=class extends qt{constructor(e){super(),this.isMeshBasicMaterial=!0,this.type="MeshBasicMaterial",this.color=new Me(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 Ln,this.combine=Qa,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapRotation.copy(e.envMapRotation),this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.fog=e.fog,this}},Rh=new Oe,Ei=new Ui,aa=new Zt,Ch=new L,oa=new L,la=new L,ca=new L,wl=new L,ha=new L,Ih=new L,ua=new L,Ve=class extends ct{constructor(e=new xt,t=new Yt){super(),this.isMesh=!0,this.type="Mesh",this.geometry=e,this.material=t,this.morphTargetDictionary=void 0,this.morphTargetInfluences=void 0,this.count=1,this.updateMorphTargets()}copy(e,t){return super.copy(e,t),e.morphTargetInfluences!==void 0&&(this.morphTargetInfluences=e.morphTargetInfluences.slice()),e.morphTargetDictionary!==void 0&&(this.morphTargetDictionary=Object.assign({},e.morphTargetDictionary)),this.material=Array.isArray(e.material)?e.material.slice():e.material,this.geometry=e.geometry,this}updateMorphTargets(){let t=this.geometry.morphAttributes,n=Object.keys(t);if(n.length>0){let i=t[n[0]];if(i!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,a=i.length;r(e.far-e.near)**2))&&(Rh.copy(r).invert(),Ei.copy(e.ray).applyMatrix4(Rh),!(n.boundingBox!==null&&Ei.intersectsBox(n.boundingBox)===!1)&&this._computeIntersections(e,t,Ei)))}_computeIntersections(e,t,n){let i,r=this.geometry,a=this.material,o=r.index,l=r.attributes.position,c=r.attributes.uv,h=r.attributes.uv1,d=r.attributes.normal,u=r.groups,f=r.drawRange;if(o!==null)if(Array.isArray(a))for(let g=0,M=u.length;gt.far?null:{distance:c,point:ua.clone(),object:s}}function da(s,e,t,n,i,r,a,o,l,c){s.getVertexPosition(o,oa),s.getVertexPosition(l,la),s.getVertexPosition(c,ca);let h=uf(s,e,t,n,oa,la,ca,Ih);if(h){let d=new L;ui.getBarycoord(Ih,oa,la,ca,d),i&&(h.uv=ui.getInterpolatedAttribute(i,o,l,c,d,new ye)),r&&(h.uv1=ui.getInterpolatedAttribute(r,o,l,c,d,new ye)),a&&(h.normal=ui.getInterpolatedAttribute(a,o,l,c,d,new L),h.normal.dot(n.direction)>0&&h.normal.multiplyScalar(-1));let u={a:o,b:l,c,normal:new L,materialIndex:0};ui.getNormal(oa,la,ca,u.normal),h.face=u,h.barycoord=d}return h}var Xs=new et,Ph=new et,Lh=new et,df=new et,Nh=new Oe,fa=new L,Rl=new Zt,Dh=new Oe,Cl=new Ui,sr=class extends Ve{constructor(e,t){super(e,t),this.isSkinnedMesh=!0,this.type="SkinnedMesh",this.bindMode=Dl,this.bindMatrix=new Oe,this.bindMatrixInverse=new Oe,this.boundingBox=null,this.boundingSphere=null}computeBoundingBox(){let e=this.geometry;this.boundingBox===null&&(this.boundingBox=new Xt),this.boundingBox.makeEmpty();let t=e.getAttribute("position");for(let n=0;n1)?null:t.copy(e.start).addScaledVector(i,a)}intersectsLine(e){let t=this.distanceToPoint(e.start),n=this.distanceToPoint(e.end);return t<0&&n>0||n<0&&t>0}intersectsBox(e){return e.intersectsPlane(this)}intersectsSphere(e){return e.intersectsPlane(this)}coplanarPoint(e){return e.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(e,t){let n=t||gf.getNormalMatrix(e),i=this.coplanarPoint(Il).applyMatrix4(e),r=this.normal.applyMatrix3(n).normalize();return this.constant=-i.dot(r),this}translate(e){return this.constant-=e.dot(this.normal),this}equals(e){return e.normal.equals(this.normal)&&e.constant===this.constant}clone(){return new this.constructor().copy(this)}},Ai=new Zt,_f=new ye(.5,.5),ma=new L,Ss=class{constructor(e=new Rn,t=new Rn,n=new Rn,i=new Rn,r=new Rn,a=new Rn){this.planes=[e,t,n,i,r,a]}set(e,t,n,i,r,a){let o=this.planes;return o[0].copy(e),o[1].copy(t),o[2].copy(n),o[3].copy(i),o[4].copy(r),o[5].copy(a),this}copy(e){let t=this.planes;for(let n=0;n<6;n++)t[n].copy(e.planes[n]);return this}setFromProjectionMatrix(e,t=gn,n=!1){let i=this.planes,r=e.elements,a=r[0],o=r[1],l=r[2],c=r[3],h=r[4],d=r[5],u=r[6],f=r[7],g=r[8],M=r[9],m=r[10],p=r[11],S=r[12],E=r[13],v=r[14],A=r[15];if(i[0].setComponents(c-a,f-h,p-g,A-S).normalize(),i[1].setComponents(c+a,f+h,p+g,A+S).normalize(),i[2].setComponents(c+o,f+d,p+M,A+E).normalize(),i[3].setComponents(c-o,f-d,p-M,A-E).normalize(),n)i[4].setComponents(l,u,m,v).normalize(),i[5].setComponents(c-l,f-u,p-m,A-v).normalize();else if(i[4].setComponents(c-l,f-u,p-m,A-v).normalize(),t===gn)i[5].setComponents(c+l,f+u,p+m,A+v).normalize();else if(t===fs)i[5].setComponents(l,u,m,v).normalize();else throw new Error("THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: "+t);return this}intersectsObject(e){if(e.boundingSphere!==void 0)e.boundingSphere===null&&e.computeBoundingSphere(),Ai.copy(e.boundingSphere).applyMatrix4(e.matrixWorld);else{let t=e.geometry;t.boundingSphere===null&&t.computeBoundingSphere(),Ai.copy(t.boundingSphere).applyMatrix4(e.matrixWorld)}return this.intersectsSphere(Ai)}intersectsSprite(e){Ai.center.set(0,0,0);let t=_f.distanceTo(e.center);return Ai.radius=.7071067811865476+t,Ai.applyMatrix4(e.matrixWorld),this.intersectsSphere(Ai)}intersectsSphere(e){let t=this.planes,n=e.center,i=-e.radius;for(let r=0;r<6;r++)if(t[r].distanceToPoint(n)0?e.max.x:e.min.x,ma.y=i.normal.y>0?e.max.y:e.min.y,ma.z=i.normal.z>0?e.max.z:e.min.z,i.distanceToPoint(ma)<0)return!1}return!0}containsPoint(e){let t=this.planes;for(let n=0;n<6;n++)if(t[n].distanceToPoint(e)<0)return!1;return!0}clone(){return new this.constructor().copy(this)}};var bs=class extends qt{constructor(e){super(),this.isLineBasicMaterial=!0,this.type="LineBasicMaterial",this.color=new Me(16777215),this.map=null,this.linewidth=1,this.linecap="round",this.linejoin="round",this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.linewidth=e.linewidth,this.linecap=e.linecap,this.linejoin=e.linejoin,this.fog=e.fog,this}},Oa=new L,Ba=new L,Bh=new Oe,Zs=new Ui,ga=new Zt,Pl=new L,zh=new L,Oi=class extends ct{constructor(e=new xt,t=new bs){super(),this.isLine=!0,this.type="Line",this.geometry=e,this.material=t,this.morphTargetDictionary=void 0,this.morphTargetInfluences=void 0,this.updateMorphTargets()}copy(e,t){return super.copy(e,t),this.material=Array.isArray(e.material)?e.material.slice():e.material,this.geometry=e.geometry,this}computeLineDistances(){let e=this.geometry;if(e.index===null){let t=e.attributes.position,n=[0];for(let i=1,r=t.count;i0){let i=t[n[0]];if(i!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,a=i.length;rn)return;Pl.applyMatrix4(s.matrixWorld);let c=e.ray.origin.distanceTo(Pl);if(!(ce.far))return{distance:c,point:zh.clone().applyMatrix4(s.matrixWorld),index:a,face:null,faceIndex:null,barycoord:null,object:s}}var kh=new L,Vh=new L,ar=class extends Oi{constructor(e,t){super(e,t),this.isLineSegments=!0,this.type="LineSegments"}computeLineDistances(){let e=this.geometry;if(e.index===null){let t=e.attributes.position,n=[];for(let i=0,r=t.count;i0){let i=t[n[0]];if(i!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,a=i.length;ri.far)return;r.push({distance:c,distanceToRay:Math.sqrt(o),point:l,index:e,face:null,faceIndex:null,barycoord:null,object:a})}}var cr=class extends Dt{constructor(e=[],t=gi,n,i,r,a,o,l,c,h){super(e,t,n,i,r,a,o,l,c,h),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(e){this.image=e}};var Yn=class extends Dt{constructor(e,t,n=Sn,i,r,a,o=bt,l=bt,c,h=In,d=1){if(h!==In&&h!==_i)throw new Error("THREE.DepthTexture: format must be either THREE.DepthFormat or THREE.DepthStencilFormat");let u={width:e,height:t,depth:d};super(u,i,r,a,o,l,h,n,c),this.isDepthTexture=!0,this.flipY=!1,this.generateMipmaps=!1,this.compareFunction=null}copy(e){return super.copy(e),this.source=new gs(Object.assign({},e.image)),this.compareFunction=e.compareFunction,this}toJSON(e){let t=super.toJSON(e);return this.compareFunction!==null&&(t.compareFunction=this.compareFunction),t}},za=class extends Yn{constructor(e,t=Sn,n=gi,i,r,a=bt,o=bt,l,c=In){let h={width:e,height:e,depth:1},d=[h,h,h,h,h,h];super(e,e,t,n,i,r,a,o,l,c),this.image=d,this.isCubeDepthTexture=!0,this.isCubeTexture=!0}get images(){return this.image}set images(e){this.image=e}},hr=class extends Dt{constructor(e=null){super(),this.sourceTexture=e,this.isExternalTexture=!0}copy(e){return super.copy(e),this.sourceTexture=e.sourceTexture,this}},vn=class s extends xt{constructor(e=1,t=1,n=1,i=1,r=1,a=1){super(),this.type="BoxGeometry",this.parameters={width:e,height:t,depth:n,widthSegments:i,heightSegments:r,depthSegments:a};let o=this;i=Math.floor(i),r=Math.floor(r),a=Math.floor(a);let l=[],c=[],h=[],d=[],u=0,f=0;g("z","y","x",-1,-1,n,t,e,a,r,0),g("z","y","x",1,-1,n,t,-e,a,r,1),g("x","z","y",1,1,e,n,t,i,a,2),g("x","z","y",1,-1,e,n,-t,i,a,3),g("x","y","z",1,-1,e,t,n,i,r,4),g("x","y","z",-1,-1,e,t,-n,i,r,5),this.setIndex(l),this.setAttribute("position",new Ke(c,3)),this.setAttribute("normal",new Ke(h,3)),this.setAttribute("uv",new Ke(d,2));function g(M,m,p,S,E,v,A,T,R,_,b){let C=v/R,I=A/_,D=v/2,X=A/2,q=T/2,O=R+1,H=_+1,G=0,$=0,ie=new L;for(let le=0;le0?1:-1,h.push(ie.x,ie.y,ie.z),d.push(_e/R),d.push(1-le/_),G+=1}}for(let le=0;le<_;le++)for(let pe=0;pe0&&E(!0),t>0&&E(!1)),this.setIndex(h),this.setAttribute("position",new Ke(d,3)),this.setAttribute("normal",new Ke(u,3)),this.setAttribute("uv",new Ke(f,2));function S(){let v=new L,A=new L,T=0,R=(t-e)/n;for(let _=0;_<=r;_++){let b=[],C=_/r,I=C*(t-e)+e;for(let D=0;D<=i;D++){let X=D/i,q=X*l+o,O=Math.sin(q),H=Math.cos(q);A.x=I*O,A.y=-C*n+m,A.z=I*H,d.push(A.x,A.y,A.z),v.set(O,R,H).normalize(),u.push(v.x,v.y,v.z),f.push(X,1-C),b.push(g++)}M.push(b)}for(let _=0;_0||b!==0)&&(h.push(C,I,X),T+=3),(t>0||b!==r-1)&&(h.push(I,D,X),T+=3)}c.addGroup(p,T,0),p+=T}function E(v){let A=g,T=new ye,R=new L,_=0,b=v===!0?e:t,C=v===!0?1:-1;for(let D=1;D<=i;D++)d.push(0,m*C,0),u.push(0,C,0),f.push(.5,.5),g++;let I=g;for(let D=0;D<=i;D++){let q=D/i*l+o,O=Math.cos(q),H=Math.sin(q);R.x=b*H,R.y=m*C,R.z=b*O,d.push(R.x,R.y,R.z),u.push(0,C,0),T.x=O*.5+.5,T.y=H*.5*C+.5,f.push(T.x,T.y),g++}for(let D=0;D.9&&R<.1&&(E<.2&&(a[S+0]+=1),v<.2&&(a[S+2]+=1),A<.2&&(a[S+4]+=1))}}function u(S){r.push(S.x,S.y,S.z)}function f(S,E){let v=S*3;E.x=e[v+0],E.y=e[v+1],E.z=e[v+2]}function g(){let S=new L,E=new L,v=new L,A=new L,T=new ye,R=new ye,_=new ye;for(let b=0,C=0;b0)&&f.push(E,v,T),(p!==n-1||l0&&(t.defines=this.defines),t.vertexShader=this.vertexShader,t.fragmentShader=this.fragmentShader,t.lights=this.lights,t.clipping=this.clipping;let n={};for(let i in this.extensions)this.extensions[i]===!0&&(n[i]=!0);return Object.keys(n).length>0&&(t.extensions=n),t}fromJSON(e,t){if(super.fromJSON(e,t),e.uniforms!==void 0)for(let n in e.uniforms){let i=e.uniforms[n];switch(this.uniforms[n]={},i.type){case"t":this.uniforms[n].value=t[i.value]||null;break;case"c":this.uniforms[n].value=new Me().setHex(i.value);break;case"v2":this.uniforms[n].value=new ye().fromArray(i.value);break;case"v3":this.uniforms[n].value=new L().fromArray(i.value);break;case"v4":this.uniforms[n].value=new et().fromArray(i.value);break;case"m3":this.uniforms[n].value=new Ue().fromArray(i.value);break;case"m4":this.uniforms[n].value=new Oe().fromArray(i.value);break;default:this.uniforms[n].value=i.value}}if(e.defines!==void 0&&(this.defines=e.defines),e.vertexShader!==void 0&&(this.vertexShader=e.vertexShader),e.fragmentShader!==void 0&&(this.fragmentShader=e.fragmentShader),e.glslVersion!==void 0&&(this.glslVersion=e.glslVersion),e.extensions!==void 0)for(let n in e.extensions)this.extensions[n]=e.extensions[n];return e.lights!==void 0&&(this.lights=e.lights),e.clipping!==void 0&&(this.clipping=e.clipping),this}},Es=class extends ft{constructor(e){super(e),this.isRawShaderMaterial=!0,this.type="RawShaderMaterial"}},Ut=class extends qt{constructor(e){super(),this.isMeshStandardMaterial=!0,this.type="MeshStandardMaterial",this.defines={STANDARD:""},this.color=new Me(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 Me(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=kr,this.normalScale=new ye(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 Ln,this.envMapIntensity=1,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.defines={STANDARD:""},this.color.copy(e.color),this.roughness=e.roughness,this.metalness=e.metalness,this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.roughnessMap=e.roughnessMap,this.metalnessMap=e.metalnessMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapRotation.copy(e.envMapRotation),this.envMapIntensity=e.envMapIntensity,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.flatShading=e.flatShading,this.fog=e.fog,this}},Kt=class extends Ut{constructor(e){super(),this.isMeshPhysicalMaterial=!0,this.defines={STANDARD:"",PHYSICAL:""},this.type="MeshPhysicalMaterial",this.anisotropyRotation=0,this.anisotropyMap=null,this.clearcoatMap=null,this.clearcoatRoughness=0,this.clearcoatRoughnessMap=null,this.clearcoatNormalScale=new ye(1,1),this.clearcoatNormalMap=null,this.ior=1.5,Object.defineProperty(this,"reflectivity",{get:function(){return Xe(2.5*(this.ior-1)/(this.ior+1),0,1)},set:function(t){this.ior=(1+.4*t)/(1-.4*t)}}),this.iridescenceMap=null,this.iridescenceIOR=1.3,this.iridescenceThicknessRange=[100,400],this.iridescenceThicknessMap=null,this.sheenColor=new Me(0),this.sheenColorMap=null,this.sheenRoughness=1,this.sheenRoughnessMap=null,this.transmissionMap=null,this.thickness=0,this.thicknessMap=null,this.attenuationDistance=1/0,this.attenuationColor=new Me(1,1,1),this.specularIntensity=1,this.specularIntensityMap=null,this.specularColor=new Me(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(e)}get anisotropy(){return this._anisotropy}set anisotropy(e){this._anisotropy>0!=e>0&&this.version++,this._anisotropy=e}get clearcoat(){return this._clearcoat}set clearcoat(e){this._clearcoat>0!=e>0&&this.version++,this._clearcoat=e}get iridescence(){return this._iridescence}set iridescence(e){this._iridescence>0!=e>0&&this.version++,this._iridescence=e}get dispersion(){return this._dispersion}set dispersion(e){this._dispersion>0!=e>0&&this.version++,this._dispersion=e}get sheen(){return this._sheen}set sheen(e){this._sheen>0!=e>0&&this.version++,this._sheen=e}get transmission(){return this._transmission}set transmission(e){this._transmission>0!=e>0&&this.version++,this._transmission=e}copy(e){return super.copy(e),this.defines={STANDARD:"",PHYSICAL:""},this.anisotropy=e.anisotropy,this.anisotropyRotation=e.anisotropyRotation,this.anisotropyMap=e.anisotropyMap,this.clearcoat=e.clearcoat,this.clearcoatMap=e.clearcoatMap,this.clearcoatRoughness=e.clearcoatRoughness,this.clearcoatRoughnessMap=e.clearcoatRoughnessMap,this.clearcoatNormalMap=e.clearcoatNormalMap,this.clearcoatNormalScale.copy(e.clearcoatNormalScale),this.dispersion=e.dispersion,this.ior=e.ior,this.iridescence=e.iridescence,this.iridescenceMap=e.iridescenceMap,this.iridescenceIOR=e.iridescenceIOR,this.iridescenceThicknessRange=[...e.iridescenceThicknessRange],this.iridescenceThicknessMap=e.iridescenceThicknessMap,this.sheen=e.sheen,this.sheenColor.copy(e.sheenColor),this.sheenColorMap=e.sheenColorMap,this.sheenRoughness=e.sheenRoughness,this.sheenRoughnessMap=e.sheenRoughnessMap,this.transmission=e.transmission,this.transmissionMap=e.transmissionMap,this.thickness=e.thickness,this.thicknessMap=e.thicknessMap,this.attenuationDistance=e.attenuationDistance,this.attenuationColor.copy(e.attenuationColor),this.specularIntensity=e.specularIntensity,this.specularIntensityMap=e.specularIntensityMap,this.specularColor.copy(e.specularColor),this.specularColorMap=e.specularColorMap,this}};var mr=class extends qt{constructor(e){super(),this.isMeshLambertMaterial=!0,this.type="MeshLambertMaterial",this.color=new Me(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Me(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=kr,this.normalScale=new ye(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new Ln,this.combine=Qa,this.reflectivity=1,this.envMapIntensity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapRotation.copy(e.envMapRotation),this.combine=e.combine,this.reflectivity=e.reflectivity,this.envMapIntensity=e.envMapIntensity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.flatShading=e.flatShading,this.fog=e.fog,this}},Va=class extends qt{constructor(e){super(),this.isMeshDepthMaterial=!0,this.type="MeshDepthMaterial",this.depthPacking=Su,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.setValues(e)}copy(e){return super.copy(e),this.depthPacking=e.depthPacking,this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this}},Ga=class extends qt{constructor(e){super(),this.isMeshDistanceMaterial=!0,this.type="MeshDistanceMaterial",this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.setValues(e)}copy(e){return super.copy(e),this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this}};function ya(s,e){return!s||s.constructor===e?s:typeof e.BYTES_PER_ELEMENT=="number"?new e(s):Array.prototype.slice.call(s)}function Mf(s){function e(i,r){return s[i]-s[r]}let t=s.length,n=new Array(t);for(let i=0;i!==t;++i)n[i]=i;return n.sort(e),n}function Xh(s,e,t){let n=s.length,i=new s.constructor(n);for(let r=0,a=0;a!==n;++r){let o=t[r]*e;for(let l=0;l!==e;++l)i[a++]=s[o+l]}return i}function Sf(s,e,t,n){let i=1,r=s[0];for(;r!==void 0&&r[n]===void 0;)r=s[i++];if(r===void 0)return;let a=r[n];if(a!==void 0)if(Array.isArray(a))do a=r[n],a!==void 0&&(e.push(r.time),t.push(...a)),r=s[i++];while(r!==void 0);else if(a.toArray!==void 0)do a=r[n],a!==void 0&&(e.push(r.time),a.toArray(t,t.length)),r=s[i++];while(r!==void 0);else do a=r[n],a!==void 0&&(e.push(r.time),t.push(a)),r=s[i++];while(r!==void 0)}var Nn=class{constructor(e,t,n,i){this.parameterPositions=e,this._cachedIndex=0,this.resultBuffer=i!==void 0?i:new t.constructor(n),this.sampleValues=t,this.valueSize=n,this.settings=null,this.DefaultSettings_={}}evaluate(e){let t=this.parameterPositions,n=this._cachedIndex,i=t[n],r=t[n-1];n:{e:{let a;t:{i:if(!(e=r)){let o=t[1];e=r)break e}a=n,n=0;break t}break n}for(;n>>1;et;)--a;if(++a,r!==0||a!==i){r>=a&&(a=Math.max(a,1),r=a-1);let o=this.getValueSize();this.times=n.slice(r,a),this.values=this.values.slice(r*o,a*o)}return this}validate(){let e=!0,t=this.getValueSize();t-Math.floor(t)!==0&&(De("KeyframeTrack: Invalid value size in track.",this),e=!1);let n=this.times,i=this.values,r=n.length;r===0&&(De("KeyframeTrack: Track is empty.",this),e=!1);let a=null;for(let o=0;o!==r;o++){let l=n[o];if(typeof l=="number"&&isNaN(l)){De("KeyframeTrack: Time is not a valid number.",this,o,l),e=!1;break}if(a!==null&&a>l){De("KeyframeTrack: Out of order keys.",this,o,l,a),e=!1;break}a=l}if(i!==void 0&&Nd(i))for(let o=0,l=i.length;o!==l;++o){let c=i[o];if(isNaN(c)){De("KeyframeTrack: Value is not a valid number.",this,o,c),e=!1;break}}return e}optimize(){let e=this.times.slice(),t=this.values.slice(),n=this.getValueSize(),i=this.getInterpolation()===ba,r=e.length-1,a=1;for(let o=1;o0){e[a]=e[r];for(let o=r*n,l=a*n,c=0;c!==n;++c)t[l+c]=t[o+c];++a}return a!==e.length?(this.times=e.slice(0,a),this.values=t.slice(0,a*n)):(this.times=e,this.values=t),this}clone(){let e=this.times.slice(),t=this.values.slice(),n=this.constructor,i=new n(this.name,e,t);return i.createInterpolant=this.createInterpolant,i}};Jt.prototype.ValueTypeName="";Jt.prototype.TimeBufferType=Float32Array;Jt.prototype.ValueBufferType=Float32Array;Jt.prototype.DefaultInterpolation=Li;var Zn=class extends Jt{constructor(e,t,n){super(e,t,n)}};Zn.prototype.ValueTypeName="bool";Zn.prototype.ValueBufferType=Array;Zn.prototype.DefaultInterpolation=Pi;Zn.prototype.InterpolantFactoryMethodLinear=void 0;Zn.prototype.InterpolantFactoryMethodSmooth=void 0;var gr=class extends Jt{constructor(e,t,n,i){super(e,t,n,i)}};gr.prototype.ValueTypeName="color";var Kn=class extends Jt{constructor(e,t,n,i){super(e,t,n,i)}};Kn.prototype.ValueTypeName="number";var Ya=class extends Nn{constructor(e,t,n,i){super(e,t,n,i)}interpolate_(e,t,n,i){let r=this.resultBuffer,a=this.sampleValues,o=this.valueSize,l=(n-t)/(i-t),c=e*o;for(let h=c+o;c!==h;c+=4)nn.slerpFlat(r,0,a,c-o,a,c,l);return r}},Jn=class extends Jt{constructor(e,t,n,i){super(e,t,n,i)}InterpolantFactoryMethodLinear(e){return new Ya(this.times,this.values,this.getValueSize(),e)}};Jn.prototype.ValueTypeName="quaternion";Jn.prototype.InterpolantFactoryMethodSmooth=void 0;var $n=class extends Jt{constructor(e,t,n){super(e,t,n)}};$n.prototype.ValueTypeName="string";$n.prototype.ValueBufferType=Array;$n.prototype.DefaultInterpolation=Pi;$n.prototype.InterpolantFactoryMethodLinear=void 0;$n.prototype.InterpolantFactoryMethodSmooth=void 0;var mi=class extends Jt{constructor(e,t,n,i){super(e,t,n,i)}};mi.prototype.ValueTypeName="vector";var _r=class{constructor(e="",t=-1,n=[],i=Mu){this.name=e,this.tracks=n,this.duration=t,this.blendMode=i,this.uuid=_n(),this.userData={},this.duration<0&&this.resetDuration()}static parse(e){let t=[],n=e.tracks,i=1/(e.fps||1);for(let a=0,o=n.length;a!==o;++a)t.push(Tf(n[a]).scale(i));let r=new this(e.name,e.duration,t,e.blendMode);return r.uuid=e.uuid,r.userData=JSON.parse(e.userData||"{}"),r}static toJSON(e){let t=[],n=e.tracks,i={name:e.name,duration:e.duration,tracks:t,uuid:e.uuid,blendMode:e.blendMode,userData:JSON.stringify(e.userData)};for(let r=0,a=n.length;r!==a;++r)t.push(Jt.toJSON(n[r]));return i}static CreateFromMorphTargetSequence(e,t,n,i){let r=t.length,a=[];for(let o=0;o1){let d=h[1],u=i[d];u||(i[d]=u=[]),u.push(c)}}let a=[];for(let o in i)a.push(this.CreateFromMorphTargetSequence(o,i[o],t,n));return a}resetDuration(){let e=this.tracks,t=0;for(let n=0,i=e.length;n!==i;++n){let r=this.tracks[n];t=Math.max(t,r.times[r.times.length-1])}return this.duration=t,this}trim(){for(let e=0;e{t&&t(r),this.manager.itemEnd(e)},0);return}if(Xn[e]!==void 0){Xn[e].push({onLoad:t,onProgress:n,onError:i});return}Xn[e]=[],Xn[e].push({onLoad:t,onProgress:n,onError:i});let a=new Request(e,{headers:new Headers(this.requestHeader),credentials:this.withCredentials?"include":"same-origin",signal:typeof AbortSignal.any=="function"?AbortSignal.any([this._abortController.signal,this.manager.abortController.signal]):this._abortController.signal}),o=this.mimeType,l=this.responseType;fetch(a).then(c=>{if(c.status===200||c.status===0){if(c.status===0&&Ee("FileLoader: HTTP Status 0 received."),typeof ReadableStream>"u"||c.body===void 0||c.body.getReader===void 0)return c;let h=Xn[e],d=c.body.getReader(),u=c.headers.get("X-File-Size")||c.headers.get("Content-Length"),f=u?parseInt(u):0,g=f!==0,M=0,m=new ReadableStream({start(p){S();function S(){d.read().then(({done:E,value:v})=>{if(E)p.close();else{M+=v.byteLength;let A=new ProgressEvent("progress",{lengthComputable:g,loaded:M,total:f});for(let T=0,R=h.length;T{p.error(E)})}}});return new Response(m)}else throw new Vl(`fetch for "${c.url}" responded with ${c.status}: ${c.statusText}`,c)}).then(c=>{switch(l){case"arraybuffer":return c.arrayBuffer();case"blob":return c.blob();case"document":return c.text().then(h=>new DOMParser().parseFromString(h,o));case"json":return c.json();default:if(o==="")return c.text();{let d=/charset="?([^;"\s]*)"?/i.exec(o),u=d&&d[1]?d[1].toLowerCase():void 0,f=new TextDecoder(u);return c.arrayBuffer().then(g=>f.decode(g))}}}).then(c=>{Cn.add(`file:${e}`,c);let h=Xn[e];delete Xn[e];for(let d=0,u=h.length;d{let h=Xn[e];if(h===void 0)throw this.manager.itemError(e),c;delete Xn[e];for(let d=0,u=h.length;d{this.manager.itemEnd(e)}),this.manager.itemStart(e)}setResponseType(e){return this.responseType=e,this}setMimeType(e){return this.mimeType=e,this}abort(){return this._abortController.abort(),this._abortController=new AbortController,this}};var ls=new WeakMap,Ka=class extends Dn{constructor(e){super(e)}load(e,t,n,i){this.path!==void 0&&(e=this.path+e),e=this.manager.resolveURL(e);let r=this,a=Cn.get(`image:${e}`);if(a!==void 0){if(a.complete===!0)r.manager.itemStart(e),setTimeout(function(){t&&t(a),r.manager.itemEnd(e)},0);else{let d=ls.get(a);d===void 0&&(d=[],ls.set(a,d)),d.push({onLoad:t,onError:i})}return a}let o=ps("img");function l(){h(),t&&t(this);let d=ls.get(this)||[];for(let u=0;u"u"&&Ee("ImageBitmapLoader: createImageBitmap() not supported."),typeof fetch>"u"&&Ee("ImageBitmapLoader: fetch() not supported."),this.options={premultiplyAlpha:"none"},this._abortController=new AbortController}setOptions(e){return this.options=e,this}load(e,t,n,i){e===void 0&&(e=""),this.path!==void 0&&(e=this.path+e),e=this.manager.resolveURL(e);let r=this,a=Cn.get(`image-bitmap:${e}`);if(a!==void 0){if(r.manager.itemStart(e),a.then){a.then(c=>{Nl.has(a)===!0?(i&&i(Nl.get(a)),r.manager.itemError(e),r.manager.itemEnd(e)):(t&&t(c),r.manager.itemEnd(e))});return}setTimeout(function(){t&&t(a),r.manager.itemEnd(e)},0);return}let o={};o.credentials=this.crossOrigin==="anonymous"?"same-origin":"include",o.headers=this.requestHeader,o.signal=typeof AbortSignal.any=="function"?AbortSignal.any([this._abortController.signal,this.manager.abortController.signal]):this._abortController.signal;let l=fetch(e,o).then(function(c){return c.blob()}).then(function(c){return createImageBitmap(c,Object.assign(r.options,{colorSpaceConversion:"none"}))}).then(function(c){Cn.add(`image-bitmap:${e}`,c),t&&t(c),r.manager.itemEnd(e)}).catch(function(c){i&&i(c),Nl.set(l,c),Cn.remove(`image-bitmap:${e}`),r.manager.itemError(e),r.manager.itemEnd(e)});Cn.add(`image-bitmap:${e}`,l),r.manager.itemStart(e)}abort(){return this._abortController.abort(),this._abortController=new AbortController,this}};var cs=-90,hs=1,Ja=class extends ct{constructor(e,t,n){super(),this.type="CubeCamera",this.renderTarget=n,this.coordinateSystem=null,this.activeMipmapLevel=0;let i=new wt(cs,hs,e,t);i.layers=this.layers,this.add(i);let r=new wt(cs,hs,e,t);r.layers=this.layers,this.add(r);let a=new wt(cs,hs,e,t);a.layers=this.layers,this.add(a);let o=new wt(cs,hs,e,t);o.layers=this.layers,this.add(o);let l=new wt(cs,hs,e,t);l.layers=this.layers,this.add(l);let c=new wt(cs,hs,e,t);c.layers=this.layers,this.add(c)}updateCoordinateSystem(){let e=this.coordinateSystem,t=this.children.concat(),[n,i,r,a,o,l]=t;for(let c of t)this.remove(c);if(e===gn)n.up.set(0,1,0),n.lookAt(1,0,0),i.up.set(0,1,0),i.lookAt(-1,0,0),r.up.set(0,0,-1),r.lookAt(0,1,0),a.up.set(0,0,1),a.lookAt(0,-1,0),o.up.set(0,1,0),o.lookAt(0,0,1),l.up.set(0,1,0),l.lookAt(0,0,-1);else if(e===fs)n.up.set(0,-1,0),n.lookAt(-1,0,0),i.up.set(0,-1,0),i.lookAt(1,0,0),r.up.set(0,0,1),r.lookAt(0,1,0),a.up.set(0,0,-1),a.lookAt(0,-1,0),o.up.set(0,-1,0),o.lookAt(0,0,1),l.up.set(0,-1,0),l.lookAt(0,0,-1);else throw new Error("THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: "+e);for(let c of t)this.add(c),c.updateMatrixWorld()}update(e,t){this.parent===null&&this.updateMatrixWorld();let{renderTarget:n,activeMipmapLevel:i}=this;this.coordinateSystem!==e.coordinateSystem&&(this.coordinateSystem=e.coordinateSystem,this.updateCoordinateSystem());let[r,a,o,l,c,h]=this.children,d=e.getRenderTarget(),u=e.getActiveCubeFace(),f=e.getActiveMipmapLevel(),g=e.xr.enabled;e.xr.enabled=!1;let M=n.texture.generateMipmaps;n.texture.generateMipmaps=!1;let m=!1;e.isWebGLRenderer===!0?m=e.state.buffers.depth.getReversed():m=e.reversedDepthBuffer,e.setRenderTarget(n,0,i),m&&e.autoClear===!1&&e.clearDepth(),e.render(t,r),e.setRenderTarget(n,1,i),m&&e.autoClear===!1&&e.clearDepth(),e.render(t,a),e.setRenderTarget(n,2,i),m&&e.autoClear===!1&&e.clearDepth(),e.render(t,o),e.setRenderTarget(n,3,i),m&&e.autoClear===!1&&e.clearDepth(),e.render(t,l),e.setRenderTarget(n,4,i),m&&e.autoClear===!1&&e.clearDepth(),e.render(t,c),n.texture.generateMipmaps=M,e.setRenderTarget(n,5,i),m&&e.autoClear===!1&&e.clearDepth(),e.render(t,h),e.setRenderTarget(d,u,f),e.xr.enabled=g,n.texture.needsPMREMUpdate=!0}},$a=class extends wt{constructor(e=[]){super(),this.isArrayCamera=!0,this.isMultiViewCamera=!1,this.cameras=e}},Tr=class{constructor(){this._previousTime=0,this._currentTime=0,this._startTime=performance.now(),this._delta=0,this._elapsed=0,this._timescale=1,this._document=null,this._pageVisibilityHandler=null}connect(e){this._document=e,e.hidden!==void 0&&(this._pageVisibilityHandler=Ef.bind(this),e.addEventListener("visibilitychange",this._pageVisibilityHandler,!1))}disconnect(){this._pageVisibilityHandler!==null&&(this._document.removeEventListener("visibilitychange",this._pageVisibilityHandler),this._pageVisibilityHandler=null),this._document=null}getDelta(){return this._delta/1e3}getElapsed(){return this._elapsed/1e3}getTimescale(){return this._timescale}setTimescale(e){return this._timescale=e,this}reset(){return this._currentTime=performance.now()-this._startTime,this}dispose(){this.disconnect()}update(e){return this._pageVisibilityHandler!==null&&this._document.hidden===!0?this._delta=0:(this._previousTime=this._currentTime,this._currentTime=(e!==void 0?e:performance.now())-this._startTime,this._delta=(this._currentTime-this._previousTime)*this._timescale,this._elapsed+=this._delta),this}};function Ef(){this._document.hidden===!1&&this.reset()}var oc="\\[\\]\\.:\\/",Af=new RegExp("["+oc+"]","g"),lc="[^"+oc+"]",wf="[^"+oc.replace("\\.","")+"]",Rf=/((?:WC+[\/:])*)/.source.replace("WC",lc),Cf=/(WCOD+)?/.source.replace("WCOD",wf),If=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",lc),Pf=/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",lc),Lf=new RegExp("^"+Rf+Cf+If+Pf+"$"),Nf=["material","materials","bones","map"],Xl=class{constructor(e,t,n){let i=n||rt.parseTrackName(t);this._targetGroup=e,this._bindings=e.subscribe_(t,i)}getValue(e,t){this.bind();let n=this._targetGroup.nCachedObjects_,i=this._bindings[n];i!==void 0&&i.getValue(e,t)}setValue(e,t){let n=this._bindings;for(let i=this._targetGroup.nCachedObjects_,r=n.length;i!==r;++i)n[i].setValue(e,t)}bind(){let e=this._bindings;for(let t=this._targetGroup.nCachedObjects_,n=e.length;t!==n;++t)e[t].bind()}unbind(){let e=this._bindings;for(let t=this._targetGroup.nCachedObjects_,n=e.length;t!==n;++t)e[t].unbind()}},rt=class s{constructor(e,t,n){this.path=t,this.parsedPath=n||s.parseTrackName(t),this.node=s.findNode(e,this.parsedPath.nodeName),this.rootNode=e,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}static create(e,t,n){return e&&e.isAnimationObjectGroup?new s.Composite(e,t,n):new s(e,t,n)}static sanitizeNodeName(e){return e.replace(/\s/g,"_").replace(Af,"")}static parseTrackName(e){let t=Lf.exec(e);if(t===null)throw new Error("THREE.PropertyBinding: Cannot parse trackName: "+e);let n={nodeName:t[2],objectName:t[3],objectIndex:t[4],propertyName:t[5],propertyIndex:t[6]},i=n.nodeName&&n.nodeName.lastIndexOf(".");if(i!==void 0&&i!==-1){let r=n.nodeName.substring(i+1);Nf.indexOf(r)!==-1&&(n.nodeName=n.nodeName.substring(0,i),n.objectName=r)}if(n.propertyName===null||n.propertyName.length===0)throw new Error("THREE.PropertyBinding: can not parse propertyName from trackName: "+e);return n}static findNode(e,t){if(t===void 0||t===""||t==="."||t===-1||t===e.name||t===e.uuid)return e;if(e.skeleton){let n=e.skeleton.getBoneByName(t);if(n!==void 0)return n}if(e.children){let n=function(r){for(let a=0;af.start-g.start);let u=0;for(let f=1;f 0 + vec4 plane; + #ifdef ALPHA_TO_COVERAGE + float distanceToPlane, distanceGradient; + float clipOpacity = 1.0; + #pragma unroll_loop_start + for ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) { + plane = clippingPlanes[ i ]; + distanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w; + distanceGradient = fwidth( distanceToPlane ) / 2.0; + clipOpacity *= smoothstep( - distanceGradient, distanceGradient, distanceToPlane ); + if ( clipOpacity == 0.0 ) discard; + } + #pragma unroll_loop_end + #if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES + float unionClipOpacity = 1.0; + #pragma unroll_loop_start + for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) { + plane = clippingPlanes[ i ]; + distanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w; + distanceGradient = fwidth( distanceToPlane ) / 2.0; + unionClipOpacity *= 1.0 - smoothstep( - distanceGradient, distanceGradient, distanceToPlane ); + } + #pragma unroll_loop_end + clipOpacity *= 1.0 - unionClipOpacity; + #endif + diffuseColor.a *= clipOpacity; + if ( diffuseColor.a == 0.0 ) discard; + #else + #pragma unroll_loop_start + for ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) { + plane = clippingPlanes[ i ]; + if ( dot( vClipPosition, plane.xyz ) > plane.w ) discard; + } + #pragma unroll_loop_end + #if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES + bool clipped = true; + #pragma unroll_loop_start + for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) { + plane = clippingPlanes[ i ]; + clipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped; + } + #pragma unroll_loop_end + if ( clipped ) discard; + #endif + #endif +#endif`,Qf=`#if NUM_CLIPPING_PLANES > 0 + varying vec3 vClipPosition; + uniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ]; +#endif`,ep=`#if NUM_CLIPPING_PLANES > 0 + varying vec3 vClipPosition; +#endif`,tp=`#if NUM_CLIPPING_PLANES > 0 + vClipPosition = - mvPosition.xyz; +#endif`,np=`#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA ) + diffuseColor *= vColor; +#endif`,ip=`#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA ) + varying vec4 vColor; +#endif`,sp=`#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR ) + varying vec4 vColor; +#endif`,rp=`#if defined( USE_COLOR ) || defined( USE_COLOR_ALPHA ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR ) + vColor = vec4( 1.0 ); +#endif +#ifdef USE_COLOR_ALPHA + vColor *= color; +#elif defined( USE_COLOR ) + vColor.rgb *= color; +#endif +#ifdef USE_INSTANCING_COLOR + vColor.rgb *= instanceColor.rgb; +#endif +#ifdef USE_BATCHING_COLOR + vColor *= getBatchingColor( getIndirectIndex( gl_DrawID ) ); +#endif`,ap=`#define PI 3.141592653589793 +#define PI2 6.283185307179586 +#define PI_HALF 1.5707963267948966 +#define RECIPROCAL_PI 0.3183098861837907 +#define RECIPROCAL_PI2 0.15915494309189535 +#define EPSILON 1e-6 +#ifndef saturate +#define saturate( a ) clamp( a, 0.0, 1.0 ) +#endif +#define whiteComplement( a ) ( 1.0 - saturate( a ) ) +float pow2( const in float x ) { return x*x; } +vec3 pow2( const in vec3 x ) { return x*x; } +float pow3( const in float x ) { return x*x*x; } +float pow4( const in float x ) { float x2 = x*x; return x2*x2; } +float max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); } +float average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); } +highp float rand( const in vec2 uv ) { + const highp float a = 12.9898, b = 78.233, c = 43758.5453; + highp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI ); + return fract( sin( sn ) * c ); +} +#ifdef HIGH_PRECISION + float precisionSafeLength( vec3 v ) { return length( v ); } +#else + float precisionSafeLength( vec3 v ) { + float maxComponent = max3( abs( v ) ); + return length( v / maxComponent ) * maxComponent; + } +#endif +struct IncidentLight { + vec3 color; + vec3 direction; + bool visible; +}; +struct ReflectedLight { + vec3 directDiffuse; + vec3 directSpecular; + vec3 indirectDiffuse; + vec3 indirectSpecular; +}; +#ifdef USE_ALPHAHASH + varying vec3 vPosition; +#endif +vec3 transformDirection( in vec3 dir, in mat4 matrix ) { + return normalize( ( matrix * vec4( dir, 0.0 ) ).xyz ); +} +#define inverseTransformDirection transformDirectionByInverseViewMatrix +vec3 transformNormalByInverseViewMatrix( in vec3 normal, in mat4 viewMatrix ) { + return normalize( ( vec4( normal, 0.0 ) * viewMatrix ).xyz ); +} +vec3 transformDirectionByInverseViewMatrix( in vec3 dir, in mat4 viewMatrix ) { + return normalize( ( vec4( dir, 0.0 ) * viewMatrix ).xyz ); +} +bool isPerspectiveMatrix( mat4 m ) { + return m[ 2 ][ 3 ] == - 1.0; +} +vec2 equirectUv( in vec3 dir ) { + float u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5; + float v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5; + return vec2( u, v ); +} +vec3 BRDF_Lambert( const in vec3 diffuseColor ) { + return RECIPROCAL_PI * diffuseColor; +} +vec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) { + float fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH ); + return f0 * ( 1.0 - fresnel ) + ( f90 * fresnel ); +} +float F_Schlick( const in float f0, const in float f90, const in float dotVH ) { + float fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH ); + return f0 * ( 1.0 - fresnel ) + ( f90 * fresnel ); +} // validated`,op=`#ifdef ENVMAP_TYPE_CUBE_UV + #define cubeUV_minMipLevel 4.0 + #define cubeUV_minTileSize 16.0 + float getFace( vec3 direction ) { + vec3 absDirection = abs( direction ); + float face = - 1.0; + if ( absDirection.x > absDirection.z ) { + if ( absDirection.x > absDirection.y ) + face = direction.x > 0.0 ? 0.0 : 3.0; + else + face = direction.y > 0.0 ? 1.0 : 4.0; + } else { + if ( absDirection.z > absDirection.y ) + face = direction.z > 0.0 ? 2.0 : 5.0; + else + face = direction.y > 0.0 ? 1.0 : 4.0; + } + return face; + } + vec2 getUV( vec3 direction, float face ) { + vec2 uv; + if ( face == 0.0 ) { + uv = vec2( direction.z, direction.y ) / abs( direction.x ); + } else if ( face == 1.0 ) { + uv = vec2( - direction.x, - direction.z ) / abs( direction.y ); + } else if ( face == 2.0 ) { + uv = vec2( - direction.x, direction.y ) / abs( direction.z ); + } else if ( face == 3.0 ) { + uv = vec2( - direction.z, direction.y ) / abs( direction.x ); + } else if ( face == 4.0 ) { + uv = vec2( - direction.x, direction.z ) / abs( direction.y ); + } else { + uv = vec2( direction.x, direction.y ) / abs( direction.z ); + } + return 0.5 * ( uv + 1.0 ); + } + vec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) { + float face = getFace( direction ); + float filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 ); + mipInt = max( mipInt, cubeUV_minMipLevel ); + float faceSize = exp2( mipInt ); + highp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0; + if ( face > 2.0 ) { + uv.y += faceSize; + face -= 3.0; + } + uv.x += face * faceSize; + uv.x += filterInt * 3.0 * cubeUV_minTileSize; + uv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize ); + uv.x *= CUBEUV_TEXEL_WIDTH; + uv.y *= CUBEUV_TEXEL_HEIGHT; + #ifdef texture2DGradEXT + return texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb; + #else + return texture2D( envMap, uv ).rgb; + #endif + } + #define cubeUV_r0 1.0 + #define cubeUV_m0 - 2.0 + #define cubeUV_r1 0.8 + #define cubeUV_m1 - 1.0 + #define cubeUV_r4 0.4 + #define cubeUV_m4 2.0 + #define cubeUV_r5 0.305 + #define cubeUV_m5 3.0 + #define cubeUV_r6 0.21 + #define cubeUV_m6 4.0 + float roughnessToMip( float roughness ) { + float mip = 0.0; + if ( roughness >= cubeUV_r1 ) { + mip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0; + } else if ( roughness >= cubeUV_r4 ) { + mip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1; + } else if ( roughness >= cubeUV_r5 ) { + mip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4; + } else if ( roughness >= cubeUV_r6 ) { + mip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5; + } else { + mip = - 2.0 * log2( 1.16 * roughness ); } + return mip; + } + vec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) { + float mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP ); + float mipF = fract( mip ); + float mipInt = floor( mip ); + vec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt ); + if ( mipF == 0.0 ) { + return vec4( color0, 1.0 ); + } else { + vec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 ); + return vec4( mix( color0, color1, mipF ), 1.0 ); + } + } +#endif`,lp=`vec3 transformedNormal = objectNormal; +#ifdef USE_TANGENT + vec3 transformedTangent = objectTangent; +#endif +#ifdef USE_BATCHING + mat3 bm = mat3( batchingMatrix ); + transformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) ); + transformedNormal = bm * transformedNormal; + #ifdef USE_TANGENT + transformedTangent = bm * transformedTangent; + #endif +#endif +#ifdef USE_INSTANCING + mat3 im = mat3( instanceMatrix ); + transformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) ); + transformedNormal = im * transformedNormal; + #ifdef USE_TANGENT + transformedTangent = im * transformedTangent; + #endif +#endif +transformedNormal = normalMatrix * transformedNormal; +#ifdef FLIP_SIDED + transformedNormal = - transformedNormal; +#endif +#ifdef USE_TANGENT + transformedTangent = ( modelViewMatrix * vec4( transformedTangent, 0.0 ) ).xyz; +#endif`,cp=`#ifdef USE_DISPLACEMENTMAP + uniform sampler2D displacementMap; + uniform float displacementScale; + uniform float displacementBias; +#endif`,hp=`#ifdef USE_DISPLACEMENTMAP + transformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias ); +#endif`,up=`#ifdef USE_EMISSIVEMAP + vec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv ); + #ifdef DECODE_VIDEO_TEXTURE_EMISSIVE + emissiveColor = sRGBTransferEOTF( emissiveColor ); + #endif + totalEmissiveRadiance *= emissiveColor.rgb; +#endif`,dp=`#ifdef USE_EMISSIVEMAP + uniform sampler2D emissiveMap; +#endif`,fp="gl_FragColor = linearToOutputTexel( gl_FragColor );",pp=`vec4 LinearTransferOETF( in vec4 value ) { + return value; +} +vec4 sRGBTransferEOTF( in vec4 value ) { + 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 ); +} +vec4 sRGBTransferOETF( in vec4 value ) { + 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 ); +}`,mp=`#ifdef USE_ENVMAP + #ifdef ENV_WORLDPOS + vec3 cameraToFrag; + if ( isOrthographic ) { + cameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) ); + } else { + cameraToFrag = normalize( vWorldPosition - cameraPosition ); + } + vec3 worldNormal = transformNormalByInverseViewMatrix( normal, viewMatrix ); + #ifdef ENVMAP_MODE_REFLECTION + vec3 reflectVec = reflect( cameraToFrag, worldNormal ); + #else + vec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio ); + #endif + #else + vec3 reflectVec = vReflect; + #endif + #ifdef ENVMAP_TYPE_CUBE + vec4 envColor = textureCube( envMap, envMapRotation * reflectVec ); + #ifdef ENVMAP_BLENDING_MULTIPLY + outgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity ); + #elif defined( ENVMAP_BLENDING_MIX ) + outgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity ); + #elif defined( ENVMAP_BLENDING_ADD ) + outgoingLight += envColor.xyz * specularStrength * reflectivity; + #endif + #endif +#endif`,gp=`#ifdef USE_ENVMAP + uniform float envMapIntensity; + uniform mat3 envMapRotation; + #ifdef ENVMAP_TYPE_CUBE + uniform samplerCube envMap; + #else + uniform sampler2D envMap; + #endif +#endif`,_p=`#ifdef USE_ENVMAP + uniform float reflectivity; + #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT ) + #define ENV_WORLDPOS + #endif + #ifdef ENV_WORLDPOS + varying vec3 vWorldPosition; + uniform float refractionRatio; + #else + varying vec3 vReflect; + #endif +#endif`,xp=`#ifdef USE_ENVMAP + #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT ) + #define ENV_WORLDPOS + #endif + #ifdef ENV_WORLDPOS + + varying vec3 vWorldPosition; + #else + varying vec3 vReflect; + uniform float refractionRatio; + #endif +#endif`,vp=`#ifdef USE_ENVMAP + #ifdef ENV_WORLDPOS + vWorldPosition = worldPosition.xyz; + #else + vec3 cameraToVertex; + if ( isOrthographic ) { + cameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) ); + } else { + cameraToVertex = normalize( worldPosition.xyz - cameraPosition ); + } + vec3 worldNormal = transformNormalByInverseViewMatrix( transformedNormal, viewMatrix ); + #ifdef ENVMAP_MODE_REFLECTION + vReflect = reflect( cameraToVertex, worldNormal ); + #else + vReflect = refract( cameraToVertex, worldNormal, refractionRatio ); + #endif + #endif +#endif`,yp=`#ifdef USE_FOG + vFogDepth = - mvPosition.z; +#endif`,Mp=`#ifdef USE_FOG + varying float vFogDepth; +#endif`,Sp=`#ifdef USE_FOG + #ifdef FOG_EXP2 + float fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth ); + #else + float fogFactor = smoothstep( fogNear, fogFar, vFogDepth ); + #endif + gl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor ); +#endif`,bp=`#ifdef USE_FOG + uniform vec3 fogColor; + varying float vFogDepth; + #ifdef FOG_EXP2 + uniform float fogDensity; + #else + uniform float fogNear; + uniform float fogFar; + #endif +#endif`,Tp=`#ifdef USE_GRADIENTMAP + uniform sampler2D gradientMap; +#endif +vec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) { + float dotNL = dot( normal, lightDirection ); + vec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 ); + #ifdef USE_GRADIENTMAP + return vec3( texture2D( gradientMap, coord ).r ); + #else + vec2 fw = fwidth( coord ) * 0.5; + return mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) ); + #endif +}`,Ep=`#ifdef USE_LIGHTMAP + uniform sampler2D lightMap; + uniform float lightMapIntensity; +#endif`,Ap=`LambertMaterial material; +material.diffuseColor = diffuseColor.rgb; +material.specularStrength = specularStrength;`,wp=`varying vec3 vViewPosition; +struct LambertMaterial { + vec3 diffuseColor; + float specularStrength; +}; +void 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 ) { + float dotNL = saturate( dot( geometryNormal, directLight.direction ) ); + vec3 irradiance = dotNL * directLight.color; + reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); +} +void 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 ) { + reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); +} +#define RE_Direct RE_Direct_Lambert +#define RE_IndirectDiffuse RE_IndirectDiffuse_Lambert`,Rp=`uniform bool receiveShadow; +uniform vec3 ambientLightColor; +#if defined( USE_LIGHT_PROBES ) + uniform vec3 lightProbe[ 9 ]; +#endif +vec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) { + float x = normal.x, y = normal.y, z = normal.z; + vec3 result = shCoefficients[ 0 ] * 0.886227; + result += shCoefficients[ 1 ] * 2.0 * 0.511664 * y; + result += shCoefficients[ 2 ] * 2.0 * 0.511664 * z; + result += shCoefficients[ 3 ] * 2.0 * 0.511664 * x; + result += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y; + result += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z; + result += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 ); + result += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z; + result += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y ); + return result; +} +vec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) { + vec3 worldNormal = transformNormalByInverseViewMatrix( normal, viewMatrix ); + vec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe ); + return irradiance; +} +vec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) { + vec3 irradiance = ambientLightColor; + return irradiance; +} +float getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) { + float distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 ); + if ( cutoffDistance > 0.0 ) { + distanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) ); + } + return distanceFalloff; +} +float getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) { + return smoothstep( coneCosine, penumbraCosine, angleCosine ); +} +#if NUM_DIR_LIGHTS > 0 + struct DirectionalLight { + vec3 direction; + vec3 color; + }; + uniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ]; + void getDirectionalLightInfo( const in DirectionalLight directionalLight, out IncidentLight light ) { + light.color = directionalLight.color; + light.direction = directionalLight.direction; + light.visible = true; + } +#endif +#if NUM_POINT_LIGHTS > 0 + struct PointLight { + vec3 position; + vec3 color; + float distance; + float decay; + }; + uniform PointLight pointLights[ NUM_POINT_LIGHTS ]; + void getPointLightInfo( const in PointLight pointLight, const in vec3 geometryPosition, out IncidentLight light ) { + vec3 lVector = pointLight.position - geometryPosition; + light.direction = normalize( lVector ); + float lightDistance = length( lVector ); + light.color = pointLight.color; + light.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay ); + light.visible = ( light.color != vec3( 0.0 ) ); + } +#endif +#if NUM_SPOT_LIGHTS > 0 + struct SpotLight { + vec3 position; + vec3 direction; + vec3 color; + float distance; + float decay; + float coneCos; + float penumbraCos; + }; + uniform SpotLight spotLights[ NUM_SPOT_LIGHTS ]; + void getSpotLightInfo( const in SpotLight spotLight, const in vec3 geometryPosition, out IncidentLight light ) { + vec3 lVector = spotLight.position - geometryPosition; + light.direction = normalize( lVector ); + float angleCos = dot( light.direction, spotLight.direction ); + float spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos ); + if ( spotAttenuation > 0.0 ) { + float lightDistance = length( lVector ); + light.color = spotLight.color * spotAttenuation; + light.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay ); + light.visible = ( light.color != vec3( 0.0 ) ); + } else { + light.color = vec3( 0.0 ); + light.visible = false; + } + } +#endif +#if NUM_RECT_AREA_LIGHTS > 0 + struct RectAreaLight { + vec3 color; + vec3 position; + vec3 halfWidth; + vec3 halfHeight; + }; + uniform sampler2D ltc_1; uniform sampler2D ltc_2; + uniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ]; +#endif +#if NUM_HEMI_LIGHTS > 0 + struct HemisphereLight { + vec3 direction; + vec3 skyColor; + vec3 groundColor; + }; + uniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ]; + vec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) { + float dotNL = dot( normal, hemiLight.direction ); + float hemiDiffuseWeight = 0.5 * dotNL + 0.5; + vec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight ); + return irradiance; + } +#endif +#include `,Cp=`#ifdef USE_ENVMAP + vec3 getIBLIrradiance( const in vec3 normal ) { + #ifdef ENVMAP_TYPE_CUBE_UV + vec3 worldNormal = transformNormalByInverseViewMatrix( normal, viewMatrix ); + vec4 envMapColor = textureCubeUV( envMap, envMapRotation * worldNormal, 1.0 ); + return PI * envMapColor.rgb * envMapIntensity; + #else + return vec3( 0.0 ); + #endif + } + vec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) { + #ifdef ENVMAP_TYPE_CUBE_UV + vec3 reflectVec = reflect( - viewDir, normal ); + reflectVec = normalize( mix( reflectVec, normal, pow4( roughness ) ) ); + reflectVec = transformDirectionByInverseViewMatrix( reflectVec, viewMatrix ); + vec4 envMapColor = textureCubeUV( envMap, envMapRotation * reflectVec, roughness ); + return envMapColor.rgb * envMapIntensity; + #else + return vec3( 0.0 ); + #endif + } + #ifdef USE_ANISOTROPY + vec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) { + #ifdef ENVMAP_TYPE_CUBE_UV + vec3 bentNormal = cross( bitangent, viewDir ); + bentNormal = normalize( cross( bentNormal, bitangent ) ); + bentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) ); + return getIBLRadiance( viewDir, bentNormal, roughness ); + #else + return vec3( 0.0 ); + #endif + } + #endif +#endif`,Ip=`ToonMaterial material; +material.diffuseColor = diffuseColor.rgb;`,Pp=`varying vec3 vViewPosition; +struct ToonMaterial { + vec3 diffuseColor; +}; +void 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 ) { + vec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color; + reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); +} +void 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 ) { + reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); +} +#define RE_Direct RE_Direct_Toon +#define RE_IndirectDiffuse RE_IndirectDiffuse_Toon`,Lp=`BlinnPhongMaterial material; +material.diffuseColor = diffuseColor.rgb; +material.specularColor = specular; +material.specularShininess = shininess; +material.specularStrength = specularStrength;`,Np=`varying vec3 vViewPosition; +struct BlinnPhongMaterial { + vec3 diffuseColor; + vec3 specularColor; + float specularShininess; + float specularStrength; +}; +void 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 ) { + float dotNL = saturate( dot( geometryNormal, directLight.direction ) ); + vec3 irradiance = dotNL * directLight.color; + reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); + reflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength; +} +void 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 ) { + reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); +} +#define RE_Direct RE_Direct_BlinnPhong +#define RE_IndirectDiffuse RE_IndirectDiffuse_BlinnPhong`,Dp=`PhysicalMaterial material; +material.diffuseColor = diffuseColor.rgb; +material.diffuseContribution = diffuseColor.rgb * ( 1.0 - metalnessFactor ); +material.metalness = metalnessFactor; +vec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) ); +float geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z ); +material.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness; +material.roughness = min( material.roughness, 1.0 ); +#ifdef IOR + material.ior = ior; + #ifdef USE_SPECULAR + float specularIntensityFactor = specularIntensity; + vec3 specularColorFactor = specularColor; + #ifdef USE_SPECULAR_COLORMAP + specularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb; + #endif + #ifdef USE_SPECULAR_INTENSITYMAP + specularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a; + #endif + material.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor ); + #else + float specularIntensityFactor = 1.0; + vec3 specularColorFactor = vec3( 1.0 ); + material.specularF90 = 1.0; + #endif + material.specularColor = min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor; + material.specularColorBlended = mix( material.specularColor, diffuseColor.rgb, metalnessFactor ); +#else + material.specularColor = vec3( 0.04 ); + material.specularColorBlended = mix( material.specularColor, diffuseColor.rgb, metalnessFactor ); + material.specularF90 = 1.0; +#endif +#ifdef USE_CLEARCOAT + material.clearcoat = clearcoat; + material.clearcoatRoughness = clearcoatRoughness; + material.clearcoatF0 = vec3( 0.04 ); + material.clearcoatF90 = 1.0; + #ifdef USE_CLEARCOATMAP + material.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x; + #endif + #ifdef USE_CLEARCOAT_ROUGHNESSMAP + material.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y; + #endif + material.clearcoat = saturate( material.clearcoat ); material.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 ); + material.clearcoatRoughness += geometryRoughness; + material.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 ); +#endif +#ifdef USE_DISPERSION + material.dispersion = dispersion; +#endif +#ifdef USE_IRIDESCENCE + material.iridescence = iridescence; + material.iridescenceIOR = iridescenceIOR; + #ifdef USE_IRIDESCENCEMAP + material.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r; + #endif + #ifdef USE_IRIDESCENCE_THICKNESSMAP + material.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum; + #else + material.iridescenceThickness = iridescenceThicknessMaximum; + #endif +#endif +#ifdef USE_SHEEN + material.sheenColor = sheenColor; + #ifdef USE_SHEEN_COLORMAP + material.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb; + #endif + material.sheenRoughness = clamp( sheenRoughness, 0.0001, 1.0 ); + #ifdef USE_SHEEN_ROUGHNESSMAP + material.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a; + #endif +#endif +#ifdef USE_ANISOTROPY + #ifdef USE_ANISOTROPYMAP + mat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x ); + vec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb; + vec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b; + #else + vec2 anisotropyV = anisotropyVector; + #endif + material.anisotropy = length( anisotropyV ); + if( material.anisotropy == 0.0 ) { + anisotropyV = vec2( 1.0, 0.0 ); + } else { + anisotropyV /= material.anisotropy; + material.anisotropy = saturate( material.anisotropy ); + } + material.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) ); + material.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y; + material.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y; +#endif`,Up=`uniform sampler2D dfgLUT; +struct PhysicalMaterial { + vec3 diffuseColor; + vec3 diffuseContribution; + vec3 specularColor; + vec3 specularColorBlended; + float roughness; + float metalness; + float specularF90; + float dispersion; + #ifdef USE_CLEARCOAT + float clearcoat; + float clearcoatRoughness; + vec3 clearcoatF0; + float clearcoatF90; + #endif + #ifdef USE_IRIDESCENCE + float iridescence; + float iridescenceIOR; + float iridescenceThickness; + vec3 iridescenceFresnel; + vec3 iridescenceF0; + vec3 iridescenceFresnelDielectric; + vec3 iridescenceFresnelMetallic; + #endif + #ifdef USE_SHEEN + vec3 sheenColor; + float sheenRoughness; + #endif + #ifdef IOR + float ior; + #endif + #ifdef USE_TRANSMISSION + float transmission; + float transmissionAlpha; + float thickness; + float attenuationDistance; + vec3 attenuationColor; + #endif + #ifdef USE_ANISOTROPY + float anisotropy; + float alphaT; + vec3 anisotropyT; + vec3 anisotropyB; + #endif +}; +vec3 clearcoatSpecularDirect = vec3( 0.0 ); +vec3 clearcoatSpecularIndirect = vec3( 0.0 ); +vec3 sheenSpecularDirect = vec3( 0.0 ); +vec3 sheenSpecularIndirect = vec3(0.0 ); +vec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) { + float x = clamp( 1.0 - dotVH, 0.0, 1.0 ); + float x2 = x * x; + float x5 = clamp( x * x2 * x2, 0.0, 0.9999 ); + return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 ); +} +float V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) { + float a2 = pow2( alpha ); + float gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) ); + float gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) ); + return 0.5 / max( gv + gl, EPSILON ); +} +float D_GGX( const in float alpha, const in float dotNH ) { + float a2 = pow2( alpha ); + float denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0; + return RECIPROCAL_PI * a2 / pow2( denom ); +} +#ifdef USE_ANISOTROPY + 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 ) { + float gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) ); + float gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) ); + return 0.5 / max( gv + gl, EPSILON ); + } + float D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) { + float a2 = alphaT * alphaB; + highp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH ); + highp float v2 = dot( v, v ); + float w2 = a2 / v2; + return RECIPROCAL_PI * a2 * pow2 ( w2 ); + } +#endif +#ifdef USE_CLEARCOAT + vec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) { + vec3 f0 = material.clearcoatF0; + float f90 = material.clearcoatF90; + float roughness = material.clearcoatRoughness; + float alpha = pow2( roughness ); + vec3 halfDir = normalize( lightDir + viewDir ); + float dotNL = saturate( dot( normal, lightDir ) ); + float dotNV = saturate( dot( normal, viewDir ) ); + float dotNH = saturate( dot( normal, halfDir ) ); + float dotVH = saturate( dot( viewDir, halfDir ) ); + vec3 F = F_Schlick( f0, f90, dotVH ); + float V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV ); + float D = D_GGX( alpha, dotNH ); + return F * ( V * D ); + } +#endif +vec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) { + vec3 f0 = material.specularColorBlended; + float f90 = material.specularF90; + float roughness = material.roughness; + float alpha = pow2( roughness ); + vec3 halfDir = normalize( lightDir + viewDir ); + float dotNL = saturate( dot( normal, lightDir ) ); + float dotNV = saturate( dot( normal, viewDir ) ); + float dotNH = saturate( dot( normal, halfDir ) ); + float dotVH = saturate( dot( viewDir, halfDir ) ); + vec3 F = F_Schlick( f0, f90, dotVH ); + #ifdef USE_IRIDESCENCE + F = mix( F, material.iridescenceFresnel, material.iridescence ); + #endif + #ifdef USE_ANISOTROPY + float dotTL = dot( material.anisotropyT, lightDir ); + float dotTV = dot( material.anisotropyT, viewDir ); + float dotTH = dot( material.anisotropyT, halfDir ); + float dotBL = dot( material.anisotropyB, lightDir ); + float dotBV = dot( material.anisotropyB, viewDir ); + float dotBH = dot( material.anisotropyB, halfDir ); + float V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL ); + float D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH ); + #else + float V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV ); + float D = D_GGX( alpha, dotNH ); + #endif + return F * ( V * D ); +} +vec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) { + const float LUT_SIZE = 64.0; + const float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE; + const float LUT_BIAS = 0.5 / LUT_SIZE; + float dotNV = saturate( dot( N, V ) ); + vec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) ); + uv = uv * LUT_SCALE + LUT_BIAS; + return uv; +} +float LTC_ClippedSphereFormFactor( const in vec3 f ) { + float l = length( f ); + return max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 ); +} +vec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) { + float x = dot( v1, v2 ); + float y = abs( x ); + float a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y; + float b = 3.4175940 + ( 4.1616724 + y ) * y; + float v = a / b; + float theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v; + return cross( v1, v2 ) * theta_sintheta; +} +vec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) { + vec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ]; + vec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ]; + vec3 lightNormal = cross( v1, v2 ); + if( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 ); + vec3 T1, T2; + T1 = normalize( V - N * dot( V, N ) ); + T2 = - cross( N, T1 ); + mat3 mat = mInv * transpose( mat3( T1, T2, N ) ); + vec3 coords[ 4 ]; + coords[ 0 ] = mat * ( rectCoords[ 0 ] - P ); + coords[ 1 ] = mat * ( rectCoords[ 1 ] - P ); + coords[ 2 ] = mat * ( rectCoords[ 2 ] - P ); + coords[ 3 ] = mat * ( rectCoords[ 3 ] - P ); + coords[ 0 ] = normalize( coords[ 0 ] ); + coords[ 1 ] = normalize( coords[ 1 ] ); + coords[ 2 ] = normalize( coords[ 2 ] ); + coords[ 3 ] = normalize( coords[ 3 ] ); + vec3 vectorFormFactor = vec3( 0.0 ); + vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] ); + vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] ); + vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] ); + vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] ); + float result = LTC_ClippedSphereFormFactor( vectorFormFactor ); + return vec3( result ); +} +#if defined( USE_SHEEN ) +float D_Charlie( float roughness, float dotNH ) { + float alpha = pow2( roughness ); + float invAlpha = 1.0 / alpha; + float cos2h = dotNH * dotNH; + float sin2h = max( 1.0 - cos2h, 0.0078125 ); + return ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI ); +} +float V_Neubelt( float dotNV, float dotNL ) { + return saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) ); +} +vec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) { + vec3 halfDir = normalize( lightDir + viewDir ); + float dotNL = saturate( dot( normal, lightDir ) ); + float dotNV = saturate( dot( normal, viewDir ) ); + float dotNH = saturate( dot( normal, halfDir ) ); + float D = D_Charlie( sheenRoughness, dotNH ); + float V = V_Neubelt( dotNV, dotNL ); + return sheenColor * ( D * V ); +} +#endif +float IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) { + float dotNV = saturate( dot( normal, viewDir ) ); + float r2 = roughness * roughness; + float rInv = 1.0 / ( roughness + 0.1 ); + float a = -1.9362 + 1.0678 * roughness + 0.4573 * r2 - 0.8469 * rInv; + float b = -0.6014 + 0.5538 * roughness - 0.4670 * r2 - 0.1255 * rInv; + float DG = exp( a * dotNV + b ); + return saturate( DG ); +} +vec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) { + float dotNV = saturate( dot( normal, viewDir ) ); + vec2 fab = texture2D( dfgLUT, vec2( roughness, dotNV ) ).rg; + return specularColor * fab.x + specularF90 * fab.y; +} +#ifdef USE_IRIDESCENCE +void 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 ) { +#else +void 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 ) { +#endif + float dotNV = saturate( dot( normal, viewDir ) ); + vec2 fab = texture2D( dfgLUT, vec2( roughness, dotNV ) ).rg; + #ifdef USE_IRIDESCENCE + vec3 Fr = mix( specularColor, iridescenceF0, iridescence ); + #else + vec3 Fr = specularColor; + #endif + vec3 FssEss = Fr * fab.x + specularF90 * fab.y; + float Ess = fab.x + fab.y; + float Ems = 1.0 - Ess; + vec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619; vec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg ); + singleScatter += FssEss; + multiScatter += Fms * Ems; +} +vec3 BRDF_GGX_Multiscatter( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) { + vec3 singleScatter = BRDF_GGX( lightDir, viewDir, normal, material ); + float dotNL = saturate( dot( normal, lightDir ) ); + float dotNV = saturate( dot( normal, viewDir ) ); + vec2 dfgV = texture2D( dfgLUT, vec2( material.roughness, dotNV ) ).rg; + vec2 dfgL = texture2D( dfgLUT, vec2( material.roughness, dotNL ) ).rg; + vec3 FssEss_V = material.specularColorBlended * dfgV.x + material.specularF90 * dfgV.y; + vec3 FssEss_L = material.specularColorBlended * dfgL.x + material.specularF90 * dfgL.y; + float Ess_V = dfgV.x + dfgV.y; + float Ess_L = dfgL.x + dfgL.y; + float Ems_V = 1.0 - Ess_V; + float Ems_L = 1.0 - Ess_L; + vec3 Favg = material.specularColorBlended + ( 1.0 - material.specularColorBlended ) * 0.047619; + vec3 Fms = FssEss_V * FssEss_L * Favg / ( 1.0 - Ems_V * Ems_L * Favg + EPSILON ); + float compensationFactor = Ems_V * Ems_L; + vec3 multiScatter = Fms * compensationFactor; + return singleScatter + multiScatter; +} +#if NUM_RECT_AREA_LIGHTS > 0 + 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 ) { + vec3 normal = geometryNormal; + vec3 viewDir = geometryViewDir; + vec3 position = geometryPosition; + vec3 lightPos = rectAreaLight.position; + vec3 halfWidth = rectAreaLight.halfWidth; + vec3 halfHeight = rectAreaLight.halfHeight; + vec3 lightColor = rectAreaLight.color; + float roughness = material.roughness; + vec3 rectCoords[ 4 ]; + rectCoords[ 0 ] = lightPos + halfWidth - halfHeight; rectCoords[ 1 ] = lightPos - halfWidth - halfHeight; + rectCoords[ 2 ] = lightPos - halfWidth + halfHeight; + rectCoords[ 3 ] = lightPos + halfWidth + halfHeight; + vec2 uv = LTC_Uv( normal, viewDir, roughness ); + vec4 t1 = texture2D( ltc_1, uv ); + vec4 t2 = texture2D( ltc_2, uv ); + mat3 mInv = mat3( + vec3( t1.x, 0, t1.y ), + vec3( 0, 1, 0 ), + vec3( t1.z, 0, t1.w ) + ); + vec3 fresnel = ( material.specularColorBlended * t2.x + ( material.specularF90 - material.specularColorBlended ) * t2.y ); + reflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords ); + reflectedLight.directDiffuse += lightColor * material.diffuseContribution * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords ); + #ifdef USE_CLEARCOAT + vec3 Ncc = geometryClearcoatNormal; + vec2 uvClearcoat = LTC_Uv( Ncc, viewDir, material.clearcoatRoughness ); + vec4 t1Clearcoat = texture2D( ltc_1, uvClearcoat ); + vec4 t2Clearcoat = texture2D( ltc_2, uvClearcoat ); + mat3 mInvClearcoat = mat3( + vec3( t1Clearcoat.x, 0, t1Clearcoat.y ), + vec3( 0, 1, 0 ), + vec3( t1Clearcoat.z, 0, t1Clearcoat.w ) + ); + vec3 fresnelClearcoat = material.clearcoatF0 * t2Clearcoat.x + ( material.clearcoatF90 - material.clearcoatF0 ) * t2Clearcoat.y; + clearcoatSpecularDirect += lightColor * fresnelClearcoat * LTC_Evaluate( Ncc, viewDir, position, mInvClearcoat, rectCoords ); + #endif + } +#endif +void 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 ) { + float dotNL = saturate( dot( geometryNormal, directLight.direction ) ); + vec3 irradiance = dotNL * directLight.color; + #ifdef USE_CLEARCOAT + float dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) ); + vec3 ccIrradiance = dotNLcc * directLight.color; + clearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material ); + #endif + #ifdef USE_SHEEN + + sheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness ); + + float sheenAlbedoV = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness ); + float sheenAlbedoL = IBLSheenBRDF( geometryNormal, directLight.direction, material.sheenRoughness ); + + float sheenEnergyComp = 1.0 - max3( material.sheenColor ) * max( sheenAlbedoV, sheenAlbedoL ); + + irradiance *= sheenEnergyComp; + + #endif + reflectedLight.directSpecular += irradiance * BRDF_GGX_Multiscatter( directLight.direction, geometryViewDir, geometryNormal, material ); + reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseContribution ); +} +void 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 ) { + vec3 diffuse = irradiance * BRDF_Lambert( material.diffuseContribution ); + #ifdef USE_SHEEN + float sheenAlbedo = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness ); + float sheenEnergyComp = 1.0 - max3( material.sheenColor ) * sheenAlbedo; + diffuse *= sheenEnergyComp; + #endif + reflectedLight.indirectDiffuse += diffuse; +} +void 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) { + #ifdef USE_CLEARCOAT + clearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness ); + #endif + #ifdef USE_SHEEN + sheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness ) * RECIPROCAL_PI; + #endif + vec3 singleScatteringDielectric = vec3( 0.0 ); + vec3 multiScatteringDielectric = vec3( 0.0 ); + vec3 singleScatteringMetallic = vec3( 0.0 ); + vec3 multiScatteringMetallic = vec3( 0.0 ); + #ifdef USE_IRIDESCENCE + computeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnelDielectric, material.roughness, singleScatteringDielectric, multiScatteringDielectric ); + computeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.diffuseColor, material.specularF90, material.iridescence, material.iridescenceFresnelMetallic, material.roughness, singleScatteringMetallic, multiScatteringMetallic ); + #else + computeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScatteringDielectric, multiScatteringDielectric ); + computeMultiscattering( geometryNormal, geometryViewDir, material.diffuseColor, material.specularF90, material.roughness, singleScatteringMetallic, multiScatteringMetallic ); + #endif + vec3 singleScattering = mix( singleScatteringDielectric, singleScatteringMetallic, material.metalness ); + vec3 multiScattering = mix( multiScatteringDielectric, multiScatteringMetallic, material.metalness ); + vec3 totalScatteringDielectric = singleScatteringDielectric + multiScatteringDielectric; + vec3 diffuse = material.diffuseContribution * ( 1.0 - totalScatteringDielectric ); + vec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI; + vec3 indirectSpecular = radiance * singleScattering; + indirectSpecular += multiScattering * cosineWeightedIrradiance; + vec3 indirectDiffuse = diffuse * cosineWeightedIrradiance; + #ifdef USE_SHEEN + float sheenAlbedo = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness ); + float sheenEnergyComp = 1.0 - max3( material.sheenColor ) * sheenAlbedo; + indirectSpecular *= sheenEnergyComp; + indirectDiffuse *= sheenEnergyComp; + #endif + reflectedLight.indirectSpecular += indirectSpecular; + reflectedLight.indirectDiffuse += indirectDiffuse; +} +#define RE_Direct RE_Direct_Physical +#define RE_Direct_RectArea RE_Direct_RectArea_Physical +#define RE_IndirectDiffuse RE_IndirectDiffuse_Physical +#define RE_IndirectSpecular RE_IndirectSpecular_Physical +float computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) { + return saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion ); +}`,Fp=` +vec3 geometryPosition = - vViewPosition; +vec3 geometryNormal = normal; +vec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition ); +vec3 geometryClearcoatNormal = vec3( 0.0 ); +#ifdef USE_CLEARCOAT + geometryClearcoatNormal = clearcoatNormal; +#endif +#ifdef USE_IRIDESCENCE + float dotNVi = saturate( dot( normal, geometryViewDir ) ); + if ( material.iridescenceThickness == 0.0 ) { + material.iridescence = 0.0; + } else { + material.iridescence = saturate( material.iridescence ); + } + if ( material.iridescence > 0.0 ) { + material.iridescenceFresnelDielectric = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor ); + material.iridescenceFresnelMetallic = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.diffuseColor ); + material.iridescenceFresnel = mix( material.iridescenceFresnelDielectric, material.iridescenceFresnelMetallic, material.metalness ); + material.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi ); + } +#endif +IncidentLight directLight; +#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct ) + PointLight pointLight; + #if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0 + PointLightShadow pointLightShadow; + #endif + #pragma unroll_loop_start + for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) { + pointLight = pointLights[ i ]; + getPointLightInfo( pointLight, geometryPosition, directLight ); + #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS ) && ( defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_BASIC ) ) + pointLightShadow = pointLightShadows[ i ]; + directLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0; + #endif + RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight ); + } + #pragma unroll_loop_end +#endif +#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct ) + SpotLight spotLight; + vec4 spotColor; + vec3 spotLightCoord; + bool inSpotLightMap; + #if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0 + SpotLightShadow spotLightShadow; + #endif + #pragma unroll_loop_start + for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) { + spotLight = spotLights[ i ]; + getSpotLightInfo( spotLight, geometryPosition, directLight ); + #if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS ) + #define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX + #elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS ) + #define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS + #else + #define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS ) + #endif + #if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS ) + spotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w; + inSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) ); + spotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy ); + directLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color; + #endif + #undef SPOT_LIGHT_MAP_INDEX + #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS ) + spotLightShadow = spotLightShadows[ i ]; + directLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0; + #endif + RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight ); + } + #pragma unroll_loop_end +#endif +#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct ) + DirectionalLight directionalLight; + #if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0 + DirectionalLightShadow directionalLightShadow; + #endif + #pragma unroll_loop_start + for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) { + directionalLight = directionalLights[ i ]; + getDirectionalLightInfo( directionalLight, directLight ); + #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS ) + directionalLightShadow = directionalLightShadows[ i ]; + directLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0; + #endif + RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight ); + } + #pragma unroll_loop_end +#endif +#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea ) + RectAreaLight rectAreaLight; + #pragma unroll_loop_start + for ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) { + rectAreaLight = rectAreaLights[ i ]; + RE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight ); + } + #pragma unroll_loop_end +#endif +#if defined( RE_IndirectDiffuse ) + vec3 iblIrradiance = vec3( 0.0 ); + vec3 irradiance = getAmbientLightIrradiance( ambientLightColor ); + #if defined( USE_LIGHT_PROBES ) + irradiance += getLightProbeIrradiance( lightProbe, geometryNormal ); + #endif + #if ( NUM_HEMI_LIGHTS > 0 ) + #pragma unroll_loop_start + for ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) { + irradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal ); + } + #pragma unroll_loop_end + #endif + #ifdef USE_LIGHT_PROBES_GRID + vec3 probeWorldPos = ( ( vec4( geometryPosition, 1.0 ) - viewMatrix[ 3 ] ) * viewMatrix ).xyz; + vec3 probeWorldNormal = transformNormalByInverseViewMatrix( geometryNormal, viewMatrix ); + irradiance += getLightProbeGridIrradiance( probeWorldPos, probeWorldNormal ); + #endif +#endif +#if defined( RE_IndirectSpecular ) + vec3 radiance = vec3( 0.0 ); + vec3 clearcoatRadiance = vec3( 0.0 ); +#endif`,Op=`#if defined( RE_IndirectDiffuse ) + #ifdef USE_LIGHTMAP + vec4 lightMapTexel = texture2D( lightMap, vLightMapUv ); + vec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity; + irradiance += lightMapIrradiance; + #endif + #if defined( USE_ENVMAP ) && defined( ENVMAP_TYPE_CUBE_UV ) + #if defined( STANDARD ) || defined( LAMBERT ) || defined( PHONG ) + iblIrradiance += getIBLIrradiance( geometryNormal ); + #endif + #endif +#endif +#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular ) + #ifdef USE_ANISOTROPY + radiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy ); + #else + radiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness ); + #endif + #ifdef USE_CLEARCOAT + clearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness ); + #endif +#endif`,Bp=`#if defined( RE_IndirectDiffuse ) + #if defined( LAMBERT ) || defined( PHONG ) + irradiance += iblIrradiance; + #endif + RE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight ); +#endif +#if defined( RE_IndirectSpecular ) + RE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight ); +#endif`,zp=`#ifdef USE_LIGHT_PROBES_GRID +uniform highp sampler3D probesSH; +uniform vec3 probesMin; +uniform vec3 probesMax; +uniform vec3 probesResolution; +vec3 getLightProbeGridIrradiance( vec3 worldPos, vec3 worldNormal ) { + vec3 res = probesResolution; + vec3 gridRange = probesMax - probesMin; + vec3 resMinusOne = res - 1.0; + vec3 probeSpacing = gridRange / resMinusOne; + vec3 samplePos = worldPos + worldNormal * probeSpacing * 0.5; + vec3 uvw = clamp( ( samplePos - probesMin ) / gridRange, 0.0, 1.0 ); + uvw = uvw * resMinusOne / res + 0.5 / res; + float nz = res.z; + float paddedSlices = nz + 2.0; + float atlasDepth = 7.0 * paddedSlices; + float uvZBase = uvw.z * nz + 1.0; + vec4 s0 = texture( probesSH, vec3( uvw.xy, ( uvZBase ) / atlasDepth ) ); + vec4 s1 = texture( probesSH, vec3( uvw.xy, ( uvZBase + paddedSlices ) / atlasDepth ) ); + vec4 s2 = texture( probesSH, vec3( uvw.xy, ( uvZBase + 2.0 * paddedSlices ) / atlasDepth ) ); + vec4 s3 = texture( probesSH, vec3( uvw.xy, ( uvZBase + 3.0 * paddedSlices ) / atlasDepth ) ); + vec4 s4 = texture( probesSH, vec3( uvw.xy, ( uvZBase + 4.0 * paddedSlices ) / atlasDepth ) ); + vec4 s5 = texture( probesSH, vec3( uvw.xy, ( uvZBase + 5.0 * paddedSlices ) / atlasDepth ) ); + vec4 s6 = texture( probesSH, vec3( uvw.xy, ( uvZBase + 6.0 * paddedSlices ) / atlasDepth ) ); + vec3 c0 = s0.xyz; + vec3 c1 = vec3( s0.w, s1.xy ); + vec3 c2 = vec3( s1.zw, s2.x ); + vec3 c3 = s2.yzw; + vec3 c4 = s3.xyz; + vec3 c5 = vec3( s3.w, s4.xy ); + vec3 c6 = vec3( s4.zw, s5.x ); + vec3 c7 = s5.yzw; + vec3 c8 = s6.xyz; + float x = worldNormal.x, y = worldNormal.y, z = worldNormal.z; + vec3 result = c0 * 0.886227; + result += c1 * 2.0 * 0.511664 * y; + result += c2 * 2.0 * 0.511664 * z; + result += c3 * 2.0 * 0.511664 * x; + result += c4 * 2.0 * 0.429043 * x * y; + result += c5 * 2.0 * 0.429043 * y * z; + result += c6 * ( 0.743125 * z * z - 0.247708 ); + result += c7 * 2.0 * 0.429043 * x * z; + result += c8 * 0.429043 * ( x * x - y * y ); + return max( result, vec3( 0.0 ) ); +} +#endif`,kp=`#if defined( USE_LOGARITHMIC_DEPTH_BUFFER ) + gl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5; +#endif`,Vp=`#if defined( USE_LOGARITHMIC_DEPTH_BUFFER ) + uniform float logDepthBufFC; + varying float vFragDepth; + varying float vIsPerspective; +#endif`,Gp=`#ifdef USE_LOGARITHMIC_DEPTH_BUFFER + varying float vFragDepth; + varying float vIsPerspective; +#endif`,Hp=`#ifdef USE_LOGARITHMIC_DEPTH_BUFFER + vFragDepth = 1.0 + gl_Position.w; + vIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) ); +#endif`,Wp=`#ifdef USE_MAP + vec4 sampledDiffuseColor = texture2D( map, vMapUv ); + #ifdef DECODE_VIDEO_TEXTURE + sampledDiffuseColor = sRGBTransferEOTF( sampledDiffuseColor ); + #endif + diffuseColor *= sampledDiffuseColor; +#endif`,Xp=`#ifdef USE_MAP + uniform sampler2D map; +#endif`,qp=`#if defined( USE_MAP ) || defined( USE_ALPHAMAP ) + #if defined( USE_POINTS_UV ) + vec2 uv = vUv; + #else + vec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy; + #endif +#endif +#ifdef USE_MAP + diffuseColor *= texture2D( map, uv ); +#endif +#ifdef USE_ALPHAMAP + diffuseColor.a *= texture2D( alphaMap, uv ).g; +#endif`,Yp=`#if defined( USE_POINTS_UV ) + varying vec2 vUv; +#else + #if defined( USE_MAP ) || defined( USE_ALPHAMAP ) + uniform mat3 uvTransform; + #endif +#endif +#ifdef USE_MAP + uniform sampler2D map; +#endif +#ifdef USE_ALPHAMAP + uniform sampler2D alphaMap; +#endif`,Zp=`float metalnessFactor = metalness; +#ifdef USE_METALNESSMAP + vec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv ); + metalnessFactor *= texelMetalness.b; +#endif`,Kp=`#ifdef USE_METALNESSMAP + uniform sampler2D metalnessMap; +#endif`,Jp=`#ifdef USE_INSTANCING_MORPH + float morphTargetInfluences[ MORPHTARGETS_COUNT ]; + float morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r; + for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { + morphTargetInfluences[i] = texelFetch( morphTexture, ivec2( i + 1, gl_InstanceID ), 0 ).r; + } +#endif`,$p=`#if defined( USE_MORPHCOLORS ) + vColor *= morphTargetBaseInfluence; + for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { + #if defined( USE_COLOR_ALPHA ) + if ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ]; + #elif defined( USE_COLOR ) + if ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ]; + #endif + } +#endif`,jp=`#ifdef USE_MORPHNORMALS + objectNormal *= morphTargetBaseInfluence; + for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { + if ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ]; + } +#endif`,Qp=`#ifdef USE_MORPHTARGETS + #ifndef USE_INSTANCING_MORPH + uniform float morphTargetBaseInfluence; + uniform float morphTargetInfluences[ MORPHTARGETS_COUNT ]; + #endif + uniform sampler2DArray morphTargetsTexture; + uniform ivec2 morphTargetsTextureSize; + vec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) { + int texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset; + int y = texelIndex / morphTargetsTextureSize.x; + int x = texelIndex - y * morphTargetsTextureSize.x; + ivec3 morphUV = ivec3( x, y, morphTargetIndex ); + return texelFetch( morphTargetsTexture, morphUV, 0 ); + } +#endif`,em=`#ifdef USE_MORPHTARGETS + transformed *= morphTargetBaseInfluence; + for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { + if ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ]; + } +#endif`,tm=`float faceDirection = gl_FrontFacing ? 1.0 : - 1.0; +#ifdef FLAT_SHADED + vec3 fdx = dFdx( vViewPosition ); + vec3 fdy = dFdy( vViewPosition ); + vec3 normal = normalize( cross( fdx, fdy ) ); +#else + vec3 normal = normalize( vNormal ); + #ifdef DOUBLE_SIDED + normal *= faceDirection; + #endif +#endif +#if defined( USE_NORMALMAP_TANGENTSPACE ) || defined( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) + #ifdef USE_TANGENT + mat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal ); + #else + mat3 tbn = getTangentFrame( - vViewPosition, normal, + #if defined( USE_NORMALMAP ) + vNormalMapUv + #elif defined( USE_CLEARCOAT_NORMALMAP ) + vClearcoatNormalMapUv + #else + vUv + #endif + ); + #endif + #ifdef DOUBLE_SIDED + tbn[0] *= faceDirection; + tbn[1] *= faceDirection; + #endif +#endif +#ifdef USE_CLEARCOAT_NORMALMAP + #ifdef USE_TANGENT + mat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal ); + #else + mat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv ); + #endif + #ifdef DOUBLE_SIDED + tbn2[0] *= faceDirection; + tbn2[1] *= faceDirection; + #endif +#endif +vec3 nonPerturbedNormal = normal;`,nm=`#ifdef USE_NORMALMAP_OBJECTSPACE + normal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0; + #ifdef FLIP_SIDED + normal = - normal; + #endif + #ifdef DOUBLE_SIDED + normal = normal * faceDirection; + #endif + normal = normalize( normalMatrix * normal ); +#elif defined( USE_NORMALMAP_TANGENTSPACE ) + vec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0; + #if defined( USE_PACKED_NORMALMAP ) + mapN = vec3( mapN.xy, sqrt( saturate( 1.0 - dot( mapN.xy, mapN.xy ) ) ) ); + #endif + mapN.xy *= normalScale; + normal = normalize( tbn * mapN ); +#elif defined( USE_BUMPMAP ) + normal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection ); +#endif`,im=`#ifndef FLAT_SHADED + varying vec3 vNormal; + #ifdef USE_TANGENT + varying vec3 vTangent; + varying vec3 vBitangent; + #endif +#endif`,sm=`#ifndef FLAT_SHADED + varying vec3 vNormal; + #ifdef USE_TANGENT + varying vec3 vTangent; + varying vec3 vBitangent; + #endif +#endif`,rm=`#ifndef FLAT_SHADED + vNormal = normalize( transformedNormal ); + #ifdef USE_TANGENT + vTangent = normalize( transformedTangent ); + vBitangent = normalize( cross( vNormal, vTangent ) * tangent.w ); + #ifdef FLIP_SIDED + vBitangent = - vBitangent; + #endif + #endif +#endif`,am=`#ifdef USE_NORMALMAP + uniform sampler2D normalMap; + uniform vec2 normalScale; +#endif +#ifdef USE_NORMALMAP_OBJECTSPACE + uniform mat3 normalMatrix; +#endif +#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) ) + mat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) { + vec3 q0 = dFdx( eye_pos.xyz ); + vec3 q1 = dFdy( eye_pos.xyz ); + vec2 st0 = dFdx( uv.st ); + vec2 st1 = dFdy( uv.st ); + vec3 N = surf_norm; + vec3 q1perp = cross( q1, N ); + vec3 q0perp = cross( N, q0 ); + vec3 T = q1perp * st0.x + q0perp * st1.x; + vec3 B = q1perp * st0.y + q0perp * st1.y; + float det = max( dot( T, T ), dot( B, B ) ); + float scale = ( det == 0.0 ) ? 0.0 : inversesqrt( det ); + return mat3( T * scale, B * scale, N ); + } +#endif`,om=`#ifdef USE_CLEARCOAT + vec3 clearcoatNormal = nonPerturbedNormal; +#endif`,lm=`#ifdef USE_CLEARCOAT_NORMALMAP + vec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0; + clearcoatMapN.xy *= clearcoatNormalScale; + clearcoatNormal = normalize( tbn2 * clearcoatMapN ); +#endif`,cm=`#ifdef USE_CLEARCOATMAP + uniform sampler2D clearcoatMap; +#endif +#ifdef USE_CLEARCOAT_NORMALMAP + uniform sampler2D clearcoatNormalMap; + uniform vec2 clearcoatNormalScale; +#endif +#ifdef USE_CLEARCOAT_ROUGHNESSMAP + uniform sampler2D clearcoatRoughnessMap; +#endif`,hm=`#ifdef USE_IRIDESCENCEMAP + uniform sampler2D iridescenceMap; +#endif +#ifdef USE_IRIDESCENCE_THICKNESSMAP + uniform sampler2D iridescenceThicknessMap; +#endif`,um=`#ifdef OPAQUE +diffuseColor.a = 1.0; +#endif +#ifdef USE_TRANSMISSION +diffuseColor.a *= material.transmissionAlpha; +#endif +gl_FragColor = vec4( outgoingLight, diffuseColor.a );`,dm=`vec3 packNormalToRGB( const in vec3 normal ) { + return normalize( normal ) * 0.5 + 0.5; +} +vec3 unpackRGBToNormal( const in vec3 rgb ) { + return 2.0 * rgb.xyz - 1.0; +} +const float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;const float ShiftRight8 = 1. / 256.; +const float Inv255 = 1. / 255.; +const vec4 PackFactors = vec4( 1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0 ); +const vec2 UnpackFactors2 = vec2( UnpackDownscale, 1.0 / PackFactors.g ); +const vec3 UnpackFactors3 = vec3( UnpackDownscale / PackFactors.rg, 1.0 / PackFactors.b ); +const vec4 UnpackFactors4 = vec4( UnpackDownscale / PackFactors.rgb, 1.0 / PackFactors.a ); +vec4 packDepthToRGBA( const in float v ) { + if( v <= 0.0 ) + return vec4( 0., 0., 0., 0. ); + if( v >= 1.0 ) + return vec4( 1., 1., 1., 1. ); + float vuf; + float af = modf( v * PackFactors.a, vuf ); + float bf = modf( vuf * ShiftRight8, vuf ); + float gf = modf( vuf * ShiftRight8, vuf ); + return vec4( vuf * Inv255, gf * PackUpscale, bf * PackUpscale, af ); +} +vec3 packDepthToRGB( const in float v ) { + if( v <= 0.0 ) + return vec3( 0., 0., 0. ); + if( v >= 1.0 ) + return vec3( 1., 1., 1. ); + float vuf; + float bf = modf( v * PackFactors.b, vuf ); + float gf = modf( vuf * ShiftRight8, vuf ); + return vec3( vuf * Inv255, gf * PackUpscale, bf ); +} +vec2 packDepthToRG( const in float v ) { + if( v <= 0.0 ) + return vec2( 0., 0. ); + if( v >= 1.0 ) + return vec2( 1., 1. ); + float vuf; + float gf = modf( v * 256., vuf ); + return vec2( vuf * Inv255, gf ); +} +float unpackRGBAToDepth( const in vec4 v ) { + return dot( v, UnpackFactors4 ); +} +float unpackRGBToDepth( const in vec3 v ) { + return dot( v, UnpackFactors3 ); +} +float unpackRGToDepth( const in vec2 v ) { + return v.r * UnpackFactors2.r + v.g * UnpackFactors2.g; +} +vec4 pack2HalfToRGBA( const in vec2 v ) { + vec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) ); + return vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w ); +} +vec2 unpackRGBATo2Half( const in vec4 v ) { + return vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) ); +} +float viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) { + return ( viewZ + near ) / ( near - far ); +} +float orthographicDepthToViewZ( const in float depth, const in float near, const in float far ) { + #ifdef USE_REVERSED_DEPTH_BUFFER + + return depth * ( far - near ) - far; + #else + return depth * ( near - far ) - near; + #endif +} +float viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) { + return ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ ); +} +float perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) { + + #ifdef USE_REVERSED_DEPTH_BUFFER + return ( near * far ) / ( ( near - far ) * depth - near ); + #else + return ( near * far ) / ( ( far - near ) * depth - far ); + #endif +}`,fm=`#ifdef PREMULTIPLIED_ALPHA + gl_FragColor.rgb *= gl_FragColor.a; +#endif`,pm=`vec4 mvPosition = vec4( transformed, 1.0 ); +#ifdef USE_BATCHING + mvPosition = batchingMatrix * mvPosition; +#endif +#ifdef USE_INSTANCING + mvPosition = instanceMatrix * mvPosition; +#endif +mvPosition = modelViewMatrix * mvPosition; +gl_Position = projectionMatrix * mvPosition;`,mm=`#ifdef DITHERING + gl_FragColor.rgb = dithering( gl_FragColor.rgb ); +#endif`,gm=`#ifdef DITHERING + vec3 dithering( vec3 color ) { + float grid_position = rand( gl_FragCoord.xy ); + vec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 ); + dither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position ); + return color + dither_shift_RGB; + } +#endif`,_m=`float roughnessFactor = roughness; +#ifdef USE_ROUGHNESSMAP + vec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv ); + roughnessFactor *= texelRoughness.g; +#endif`,xm=`#ifdef USE_ROUGHNESSMAP + uniform sampler2D roughnessMap; +#endif`,vm=`#if NUM_SPOT_LIGHT_COORDS > 0 + varying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ]; +#endif +#if NUM_SPOT_LIGHT_MAPS > 0 + uniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ]; +#endif +#ifdef USE_SHADOWMAP + #if NUM_DIR_LIGHT_SHADOWS > 0 + #if defined( SHADOWMAP_TYPE_PCF ) + uniform sampler2DShadow directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ]; + #else + uniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ]; + #endif + varying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ]; + struct DirectionalLightShadow { + float shadowIntensity; + float shadowBias; + float shadowNormalBias; + float shadowRadius; + vec2 shadowMapSize; + }; + uniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ]; + #endif + #if NUM_SPOT_LIGHT_SHADOWS > 0 + #if defined( SHADOWMAP_TYPE_PCF ) + uniform sampler2DShadow spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ]; + #else + uniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ]; + #endif + struct SpotLightShadow { + float shadowIntensity; + float shadowBias; + float shadowNormalBias; + float shadowRadius; + vec2 shadowMapSize; + }; + uniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ]; + #endif + #if NUM_POINT_LIGHT_SHADOWS > 0 + #if defined( SHADOWMAP_TYPE_PCF ) + uniform samplerCubeShadow pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ]; + #elif defined( SHADOWMAP_TYPE_BASIC ) + uniform samplerCube pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ]; + #endif + varying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ]; + struct PointLightShadow { + float shadowIntensity; + float shadowBias; + float shadowNormalBias; + float shadowRadius; + vec2 shadowMapSize; + float shadowCameraNear; + float shadowCameraFar; + }; + uniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ]; + #endif + #if defined( SHADOWMAP_TYPE_PCF ) + float interleavedGradientNoise( vec2 position ) { + return fract( 52.9829189 * fract( dot( position, vec2( 0.06711056, 0.00583715 ) ) ) ); + } + vec2 vogelDiskSample( int sampleIndex, int samplesCount, float phi ) { + const float goldenAngle = 2.399963229728653; + float r = sqrt( ( float( sampleIndex ) + 0.5 ) / float( samplesCount ) ); + float theta = float( sampleIndex ) * goldenAngle + phi; + return vec2( cos( theta ), sin( theta ) ) * r; + } + #endif + #if defined( SHADOWMAP_TYPE_PCF ) + float getShadow( sampler2DShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) { + float shadow = 1.0; + shadowCoord.xyz /= shadowCoord.w; + shadowCoord.z += shadowBias; + bool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0; + bool frustumTest = inFrustum && shadowCoord.z <= 1.0; + if ( frustumTest ) { + vec2 texelSize = vec2( 1.0 ) / shadowMapSize; + float radius = shadowRadius * texelSize.x; + float phi = interleavedGradientNoise( gl_FragCoord.xy ) * PI2; + shadow = ( + texture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 0, 5, phi ) * radius, shadowCoord.z ) ) + + texture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 1, 5, phi ) * radius, shadowCoord.z ) ) + + texture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 2, 5, phi ) * radius, shadowCoord.z ) ) + + texture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 3, 5, phi ) * radius, shadowCoord.z ) ) + + texture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 4, 5, phi ) * radius, shadowCoord.z ) ) + ) * 0.2; + } + return mix( 1.0, shadow, shadowIntensity ); + } + #elif defined( SHADOWMAP_TYPE_VSM ) + float getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) { + float shadow = 1.0; + shadowCoord.xyz /= shadowCoord.w; + #ifdef USE_REVERSED_DEPTH_BUFFER + shadowCoord.z -= shadowBias; + #else + shadowCoord.z += shadowBias; + #endif + bool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0; + bool frustumTest = inFrustum && shadowCoord.z <= 1.0; + if ( frustumTest ) { + vec2 distribution = texture2D( shadowMap, shadowCoord.xy ).rg; + float mean = distribution.x; + float variance = distribution.y * distribution.y; + #ifdef USE_REVERSED_DEPTH_BUFFER + float hard_shadow = step( mean, shadowCoord.z ); + #else + float hard_shadow = step( shadowCoord.z, mean ); + #endif + + if ( hard_shadow == 1.0 ) { + shadow = 1.0; + } else { + variance = max( variance, 0.0000001 ); + float d = shadowCoord.z - mean; + float p_max = variance / ( variance + d * d ); + p_max = clamp( ( p_max - 0.3 ) / 0.65, 0.0, 1.0 ); + shadow = max( hard_shadow, p_max ); + } + } + return mix( 1.0, shadow, shadowIntensity ); + } + #else + float getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) { + float shadow = 1.0; + shadowCoord.xyz /= shadowCoord.w; + #ifdef USE_REVERSED_DEPTH_BUFFER + shadowCoord.z -= shadowBias; + #else + shadowCoord.z += shadowBias; + #endif + bool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0; + bool frustumTest = inFrustum && shadowCoord.z <= 1.0; + if ( frustumTest ) { + float depth = texture2D( shadowMap, shadowCoord.xy ).r; + #ifdef USE_REVERSED_DEPTH_BUFFER + shadow = step( depth, shadowCoord.z ); + #else + shadow = step( shadowCoord.z, depth ); + #endif + } + return mix( 1.0, shadow, shadowIntensity ); + } + #endif + #if NUM_POINT_LIGHT_SHADOWS > 0 + #if defined( SHADOWMAP_TYPE_PCF ) + float getPointShadow( samplerCubeShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) { + float shadow = 1.0; + vec3 lightToPosition = shadowCoord.xyz; + vec3 bd3D = normalize( lightToPosition ); + vec3 absVec = abs( lightToPosition ); + float viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z ); + if ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) { + #ifdef USE_REVERSED_DEPTH_BUFFER + float dp = ( shadowCameraNear * ( shadowCameraFar - viewSpaceZ ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) ); + dp -= shadowBias; + #else + float dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) ); + dp += shadowBias; + #endif + float texelSize = shadowRadius / shadowMapSize.x; + vec3 absDir = abs( bd3D ); + vec3 tangent = absDir.x > absDir.z ? vec3( 0.0, 1.0, 0.0 ) : vec3( 1.0, 0.0, 0.0 ); + tangent = normalize( cross( bd3D, tangent ) ); + vec3 bitangent = cross( bd3D, tangent ); + float phi = interleavedGradientNoise( gl_FragCoord.xy ) * PI2; + vec2 sample0 = vogelDiskSample( 0, 5, phi ); + vec2 sample1 = vogelDiskSample( 1, 5, phi ); + vec2 sample2 = vogelDiskSample( 2, 5, phi ); + vec2 sample3 = vogelDiskSample( 3, 5, phi ); + vec2 sample4 = vogelDiskSample( 4, 5, phi ); + shadow = ( + texture( shadowMap, vec4( bd3D + ( tangent * sample0.x + bitangent * sample0.y ) * texelSize, dp ) ) + + texture( shadowMap, vec4( bd3D + ( tangent * sample1.x + bitangent * sample1.y ) * texelSize, dp ) ) + + texture( shadowMap, vec4( bd3D + ( tangent * sample2.x + bitangent * sample2.y ) * texelSize, dp ) ) + + texture( shadowMap, vec4( bd3D + ( tangent * sample3.x + bitangent * sample3.y ) * texelSize, dp ) ) + + texture( shadowMap, vec4( bd3D + ( tangent * sample4.x + bitangent * sample4.y ) * texelSize, dp ) ) + ) * 0.2; + } + return mix( 1.0, shadow, shadowIntensity ); + } + #elif defined( SHADOWMAP_TYPE_BASIC ) + float getPointShadow( samplerCube shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) { + float shadow = 1.0; + vec3 lightToPosition = shadowCoord.xyz; + vec3 absVec = abs( lightToPosition ); + float viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z ); + if ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) { + float dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) ); + dp += shadowBias; + vec3 bd3D = normalize( lightToPosition ); + float depth = textureCube( shadowMap, bd3D ).r; + #ifdef USE_REVERSED_DEPTH_BUFFER + depth = 1.0 - depth; + #endif + shadow = step( dp, depth ); + } + return mix( 1.0, shadow, shadowIntensity ); + } + #endif + #endif +#endif`,ym=`#if NUM_SPOT_LIGHT_COORDS > 0 + uniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ]; + varying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ]; +#endif +#ifdef USE_SHADOWMAP + #if NUM_DIR_LIGHT_SHADOWS > 0 + uniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ]; + varying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ]; + struct DirectionalLightShadow { + float shadowIntensity; + float shadowBias; + float shadowNormalBias; + float shadowRadius; + vec2 shadowMapSize; + }; + uniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ]; + #endif + #if NUM_SPOT_LIGHT_SHADOWS > 0 + struct SpotLightShadow { + float shadowIntensity; + float shadowBias; + float shadowNormalBias; + float shadowRadius; + vec2 shadowMapSize; + }; + uniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ]; + #endif + #if NUM_POINT_LIGHT_SHADOWS > 0 + uniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ]; + varying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ]; + struct PointLightShadow { + float shadowIntensity; + float shadowBias; + float shadowNormalBias; + float shadowRadius; + vec2 shadowMapSize; + float shadowCameraNear; + float shadowCameraFar; + }; + uniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ]; + #endif +#endif`,Mm=`#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 ) + #ifdef HAS_NORMAL + vec3 shadowWorldNormal = transformNormalByInverseViewMatrix( transformedNormal, viewMatrix ); + #else + vec3 shadowWorldNormal = vec3( 0.0 ); + #endif + vec4 shadowWorldPosition; +#endif +#if defined( USE_SHADOWMAP ) + #if NUM_DIR_LIGHT_SHADOWS > 0 + #pragma unroll_loop_start + for ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) { + shadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 ); + vDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition; + } + #pragma unroll_loop_end + #endif + #if NUM_POINT_LIGHT_SHADOWS > 0 + #pragma unroll_loop_start + for ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) { + shadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 ); + vPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition; + } + #pragma unroll_loop_end + #endif +#endif +#if NUM_SPOT_LIGHT_COORDS > 0 + #pragma unroll_loop_start + for ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) { + shadowWorldPosition = worldPosition; + #if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS ) + shadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias; + #endif + vSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition; + } + #pragma unroll_loop_end +#endif`,Sm=`float getShadowMask() { + float shadow = 1.0; + #ifdef USE_SHADOWMAP + #if NUM_DIR_LIGHT_SHADOWS > 0 + DirectionalLightShadow directionalLight; + #pragma unroll_loop_start + for ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) { + directionalLight = directionalLightShadows[ i ]; + shadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowIntensity, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0; + } + #pragma unroll_loop_end + #endif + #if NUM_SPOT_LIGHT_SHADOWS > 0 + SpotLightShadow spotLight; + #pragma unroll_loop_start + for ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) { + spotLight = spotLightShadows[ i ]; + shadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowIntensity, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0; + } + #pragma unroll_loop_end + #endif + #if NUM_POINT_LIGHT_SHADOWS > 0 && ( defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_BASIC ) ) + PointLightShadow pointLight; + #pragma unroll_loop_start + for ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) { + pointLight = pointLightShadows[ i ]; + shadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowIntensity, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0; + } + #pragma unroll_loop_end + #endif + #endif + return shadow; +}`,bm=`#ifdef USE_SKINNING + mat4 boneMatX = getBoneMatrix( skinIndex.x ); + mat4 boneMatY = getBoneMatrix( skinIndex.y ); + mat4 boneMatZ = getBoneMatrix( skinIndex.z ); + mat4 boneMatW = getBoneMatrix( skinIndex.w ); +#endif`,Tm=`#ifdef USE_SKINNING + uniform mat4 bindMatrix; + uniform mat4 bindMatrixInverse; + uniform highp sampler2D boneTexture; + mat4 getBoneMatrix( const in float i ) { + int size = textureSize( boneTexture, 0 ).x; + int j = int( i ) * 4; + int x = j % size; + int y = j / size; + vec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 ); + vec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 ); + vec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 ); + vec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 ); + return mat4( v1, v2, v3, v4 ); + } +#endif`,Em=`#ifdef USE_SKINNING + vec4 skinVertex = bindMatrix * vec4( transformed, 1.0 ); + vec4 skinned = vec4( 0.0 ); + skinned += boneMatX * skinVertex * skinWeight.x; + skinned += boneMatY * skinVertex * skinWeight.y; + skinned += boneMatZ * skinVertex * skinWeight.z; + skinned += boneMatW * skinVertex * skinWeight.w; + transformed = ( bindMatrixInverse * skinned ).xyz; +#endif`,Am=`#ifdef USE_SKINNING + mat4 skinMatrix = mat4( 0.0 ); + skinMatrix += skinWeight.x * boneMatX; + skinMatrix += skinWeight.y * boneMatY; + skinMatrix += skinWeight.z * boneMatZ; + skinMatrix += skinWeight.w * boneMatW; + skinMatrix = bindMatrixInverse * skinMatrix * bindMatrix; + objectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz; + #ifdef USE_TANGENT + objectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz; + #endif +#endif`,wm=`float specularStrength; +#ifdef USE_SPECULARMAP + vec4 texelSpecular = texture2D( specularMap, vSpecularMapUv ); + specularStrength = texelSpecular.r; +#else + specularStrength = 1.0; +#endif`,Rm=`#ifdef USE_SPECULARMAP + uniform sampler2D specularMap; +#endif`,Cm=`#if defined( TONE_MAPPING ) + gl_FragColor.rgb = toneMapping( gl_FragColor.rgb ); +#endif`,Im=`#ifndef saturate +#define saturate( a ) clamp( a, 0.0, 1.0 ) +#endif +uniform float toneMappingExposure; +vec3 LinearToneMapping( vec3 color ) { + return saturate( toneMappingExposure * color ); +} +vec3 ReinhardToneMapping( vec3 color ) { + color *= toneMappingExposure; + return saturate( color / ( vec3( 1.0 ) + color ) ); +} +vec3 CineonToneMapping( vec3 color ) { + color *= toneMappingExposure; + color = max( vec3( 0.0 ), color - 0.004 ); + return pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) ); +} +vec3 RRTAndODTFit( vec3 v ) { + vec3 a = v * ( v + 0.0245786 ) - 0.000090537; + vec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081; + return a / b; +} +vec3 ACESFilmicToneMapping( vec3 color ) { + const mat3 ACESInputMat = mat3( + vec3( 0.59719, 0.07600, 0.02840 ), vec3( 0.35458, 0.90834, 0.13383 ), + vec3( 0.04823, 0.01566, 0.83777 ) + ); + const mat3 ACESOutputMat = mat3( + vec3( 1.60475, -0.10208, -0.00327 ), vec3( -0.53108, 1.10813, -0.07276 ), + vec3( -0.07367, -0.00605, 1.07602 ) + ); + color *= toneMappingExposure / 0.6; + color = ACESInputMat * color; + color = RRTAndODTFit( color ); + color = ACESOutputMat * color; + return saturate( color ); +} +const mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3( + vec3( 1.6605, - 0.1246, - 0.0182 ), + vec3( - 0.5876, 1.1329, - 0.1006 ), + vec3( - 0.0728, - 0.0083, 1.1187 ) +); +const mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3( + vec3( 0.6274, 0.0691, 0.0164 ), + vec3( 0.3293, 0.9195, 0.0880 ), + vec3( 0.0433, 0.0113, 0.8956 ) +); +vec3 agxDefaultContrastApprox( vec3 x ) { + vec3 x2 = x * x; + vec3 x4 = x2 * x2; + return + 15.5 * x4 * x2 + - 40.14 * x4 * x + + 31.96 * x4 + - 6.868 * x2 * x + + 0.4298 * x2 + + 0.1191 * x + - 0.00232; +} +vec3 AgXToneMapping( vec3 color ) { + const mat3 AgXInsetMatrix = mat3( + vec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ), + vec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ), + vec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 ) + ); + const mat3 AgXOutsetMatrix = mat3( + vec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ), + vec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ), + vec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 ) + ); + const float AgxMinEv = - 12.47393; const float AgxMaxEv = 4.026069; + color *= toneMappingExposure; + color = LINEAR_SRGB_TO_LINEAR_REC2020 * color; + color = AgXInsetMatrix * color; + color = max( color, 1e-10 ); color = log2( color ); + color = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv ); + color = clamp( color, 0.0, 1.0 ); + color = agxDefaultContrastApprox( color ); + color = AgXOutsetMatrix * color; + color = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) ); + color = LINEAR_REC2020_TO_LINEAR_SRGB * color; + color = clamp( color, 0.0, 1.0 ); + return color; +} +vec3 NeutralToneMapping( vec3 color ) { + const float StartCompression = 0.8 - 0.04; + const float Desaturation = 0.15; + color *= toneMappingExposure; + float x = min( color.r, min( color.g, color.b ) ); + float offset = x < 0.08 ? x - 6.25 * x * x : 0.04; + color -= offset; + float peak = max( color.r, max( color.g, color.b ) ); + if ( peak < StartCompression ) return color; + float d = 1. - StartCompression; + float newPeak = 1. - d * d / ( peak + d - StartCompression ); + color *= newPeak / peak; + float g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. ); + return mix( color, vec3( newPeak ), g ); +} +vec3 CustomToneMapping( vec3 color ) { return color; }`,Pm=`#ifdef USE_TRANSMISSION + material.transmission = transmission; + material.transmissionAlpha = 1.0; + material.thickness = thickness; + material.attenuationDistance = attenuationDistance; + material.attenuationColor = attenuationColor; + #ifdef USE_TRANSMISSIONMAP + material.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r; + #endif + #ifdef USE_THICKNESSMAP + material.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g; + #endif + vec3 pos = vWorldPosition; + vec3 v = normalize( cameraPosition - pos ); + vec3 n = transformNormalByInverseViewMatrix( normal, viewMatrix ); + vec4 transmitted = getIBLVolumeRefraction( + n, v, material.roughness, material.diffuseContribution, material.specularColorBlended, material.specularF90, + pos, modelMatrix, viewMatrix, projectionMatrix, material.dispersion, material.ior, material.thickness, + material.attenuationColor, material.attenuationDistance ); + material.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission ); + totalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission ); +#endif`,Lm=`#ifdef USE_TRANSMISSION + uniform float transmission; + uniform float thickness; + uniform float attenuationDistance; + uniform vec3 attenuationColor; + #ifdef USE_TRANSMISSIONMAP + uniform sampler2D transmissionMap; + #endif + #ifdef USE_THICKNESSMAP + uniform sampler2D thicknessMap; + #endif + uniform vec2 transmissionSamplerSize; + uniform sampler2D transmissionSamplerMap; + uniform mat4 modelMatrix; + uniform mat4 projectionMatrix; + varying vec3 vWorldPosition; + float w0( float a ) { + return ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 ); + } + float w1( float a ) { + return ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 ); + } + float w2( float a ){ + return ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 ); + } + float w3( float a ) { + return ( 1.0 / 6.0 ) * ( a * a * a ); + } + float g0( float a ) { + return w0( a ) + w1( a ); + } + float g1( float a ) { + return w2( a ) + w3( a ); + } + float h0( float a ) { + return - 1.0 + w1( a ) / ( w0( a ) + w1( a ) ); + } + float h1( float a ) { + return 1.0 + w3( a ) / ( w2( a ) + w3( a ) ); + } + vec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) { + uv = uv * texelSize.zw + 0.5; + vec2 iuv = floor( uv ); + vec2 fuv = fract( uv ); + float g0x = g0( fuv.x ); + float g1x = g1( fuv.x ); + float h0x = h0( fuv.x ); + float h1x = h1( fuv.x ); + float h0y = h0( fuv.y ); + float h1y = h1( fuv.y ); + vec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy; + vec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy; + vec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy; + vec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy; + return g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) + + g1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) ); + } + vec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) { + vec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) ); + vec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) ); + vec2 fLodSizeInv = 1.0 / fLodSize; + vec2 cLodSizeInv = 1.0 / cLodSize; + vec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) ); + vec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) ); + return mix( fSample, cSample, fract( lod ) ); + } + vec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) { + vec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior ); + vec3 modelScale; + modelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) ); + modelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) ); + modelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) ); + return normalize( refractionVector ) * thickness * modelScale; + } + float applyIorToRoughness( const in float roughness, const in float ior ) { + return roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 ); + } + vec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) { + float lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior ); + return textureBicubic( transmissionSamplerMap, fragCoord.xy, lod ); + } + vec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) { + if ( isinf( attenuationDistance ) ) { + return vec3( 1.0 ); + } else { + vec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance; + vec3 transmittance = exp( - attenuationCoefficient * transmissionDistance ); return transmittance; + } + } + vec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor, + const in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix, + const in mat4 viewMatrix, const in mat4 projMatrix, const in float dispersion, const in float ior, const in float thickness, + const in vec3 attenuationColor, const in float attenuationDistance ) { + vec4 transmittedLight; + vec3 transmittance; + #ifdef USE_DISPERSION + float halfSpread = ( ior - 1.0 ) * 0.025 * dispersion; + vec3 iors = vec3( ior - halfSpread, ior, ior + halfSpread ); + for ( int i = 0; i < 3; i ++ ) { + vec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, iors[ i ], modelMatrix ); + vec3 refractedRayExit = position + transmissionRay; + vec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 ); + vec2 refractionCoords = ndcPos.xy / ndcPos.w; + refractionCoords += 1.0; + refractionCoords /= 2.0; + vec4 transmissionSample = getTransmissionSample( refractionCoords, roughness, iors[ i ] ); + transmittedLight[ i ] = transmissionSample[ i ]; + transmittedLight.a += transmissionSample.a; + transmittance[ i ] = diffuseColor[ i ] * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance )[ i ]; + } + transmittedLight.a /= 3.0; + #else + vec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix ); + vec3 refractedRayExit = position + transmissionRay; + vec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 ); + vec2 refractionCoords = ndcPos.xy / ndcPos.w; + refractionCoords += 1.0; + refractionCoords /= 2.0; + transmittedLight = getTransmissionSample( refractionCoords, roughness, ior ); + transmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance ); + #endif + vec3 attenuatedColor = transmittance * transmittedLight.rgb; + vec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness ); + float transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0; + return vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor ); + } +#endif`,Nm=`#if defined( USE_UV ) || defined( USE_ANISOTROPY ) + varying vec2 vUv; +#endif +#ifdef USE_MAP + varying vec2 vMapUv; +#endif +#ifdef USE_ALPHAMAP + varying vec2 vAlphaMapUv; +#endif +#ifdef USE_LIGHTMAP + varying vec2 vLightMapUv; +#endif +#ifdef USE_AOMAP + varying vec2 vAoMapUv; +#endif +#ifdef USE_BUMPMAP + varying vec2 vBumpMapUv; +#endif +#ifdef USE_NORMALMAP + varying vec2 vNormalMapUv; +#endif +#ifdef USE_EMISSIVEMAP + varying vec2 vEmissiveMapUv; +#endif +#ifdef USE_METALNESSMAP + varying vec2 vMetalnessMapUv; +#endif +#ifdef USE_ROUGHNESSMAP + varying vec2 vRoughnessMapUv; +#endif +#ifdef USE_ANISOTROPYMAP + varying vec2 vAnisotropyMapUv; +#endif +#ifdef USE_CLEARCOATMAP + varying vec2 vClearcoatMapUv; +#endif +#ifdef USE_CLEARCOAT_NORMALMAP + varying vec2 vClearcoatNormalMapUv; +#endif +#ifdef USE_CLEARCOAT_ROUGHNESSMAP + varying vec2 vClearcoatRoughnessMapUv; +#endif +#ifdef USE_IRIDESCENCEMAP + varying vec2 vIridescenceMapUv; +#endif +#ifdef USE_IRIDESCENCE_THICKNESSMAP + varying vec2 vIridescenceThicknessMapUv; +#endif +#ifdef USE_SHEEN_COLORMAP + varying vec2 vSheenColorMapUv; +#endif +#ifdef USE_SHEEN_ROUGHNESSMAP + varying vec2 vSheenRoughnessMapUv; +#endif +#ifdef USE_SPECULARMAP + varying vec2 vSpecularMapUv; +#endif +#ifdef USE_SPECULAR_COLORMAP + varying vec2 vSpecularColorMapUv; +#endif +#ifdef USE_SPECULAR_INTENSITYMAP + varying vec2 vSpecularIntensityMapUv; +#endif +#ifdef USE_TRANSMISSIONMAP + uniform mat3 transmissionMapTransform; + varying vec2 vTransmissionMapUv; +#endif +#ifdef USE_THICKNESSMAP + uniform mat3 thicknessMapTransform; + varying vec2 vThicknessMapUv; +#endif`,Dm=`#if defined( USE_UV ) || defined( USE_ANISOTROPY ) + varying vec2 vUv; +#endif +#ifdef USE_MAP + uniform mat3 mapTransform; + varying vec2 vMapUv; +#endif +#ifdef USE_ALPHAMAP + uniform mat3 alphaMapTransform; + varying vec2 vAlphaMapUv; +#endif +#ifdef USE_LIGHTMAP + uniform mat3 lightMapTransform; + varying vec2 vLightMapUv; +#endif +#ifdef USE_AOMAP + uniform mat3 aoMapTransform; + varying vec2 vAoMapUv; +#endif +#ifdef USE_BUMPMAP + uniform mat3 bumpMapTransform; + varying vec2 vBumpMapUv; +#endif +#ifdef USE_NORMALMAP + uniform mat3 normalMapTransform; + varying vec2 vNormalMapUv; +#endif +#ifdef USE_DISPLACEMENTMAP + uniform mat3 displacementMapTransform; + varying vec2 vDisplacementMapUv; +#endif +#ifdef USE_EMISSIVEMAP + uniform mat3 emissiveMapTransform; + varying vec2 vEmissiveMapUv; +#endif +#ifdef USE_METALNESSMAP + uniform mat3 metalnessMapTransform; + varying vec2 vMetalnessMapUv; +#endif +#ifdef USE_ROUGHNESSMAP + uniform mat3 roughnessMapTransform; + varying vec2 vRoughnessMapUv; +#endif +#ifdef USE_ANISOTROPYMAP + uniform mat3 anisotropyMapTransform; + varying vec2 vAnisotropyMapUv; +#endif +#ifdef USE_CLEARCOATMAP + uniform mat3 clearcoatMapTransform; + varying vec2 vClearcoatMapUv; +#endif +#ifdef USE_CLEARCOAT_NORMALMAP + uniform mat3 clearcoatNormalMapTransform; + varying vec2 vClearcoatNormalMapUv; +#endif +#ifdef USE_CLEARCOAT_ROUGHNESSMAP + uniform mat3 clearcoatRoughnessMapTransform; + varying vec2 vClearcoatRoughnessMapUv; +#endif +#ifdef USE_SHEEN_COLORMAP + uniform mat3 sheenColorMapTransform; + varying vec2 vSheenColorMapUv; +#endif +#ifdef USE_SHEEN_ROUGHNESSMAP + uniform mat3 sheenRoughnessMapTransform; + varying vec2 vSheenRoughnessMapUv; +#endif +#ifdef USE_IRIDESCENCEMAP + uniform mat3 iridescenceMapTransform; + varying vec2 vIridescenceMapUv; +#endif +#ifdef USE_IRIDESCENCE_THICKNESSMAP + uniform mat3 iridescenceThicknessMapTransform; + varying vec2 vIridescenceThicknessMapUv; +#endif +#ifdef USE_SPECULARMAP + uniform mat3 specularMapTransform; + varying vec2 vSpecularMapUv; +#endif +#ifdef USE_SPECULAR_COLORMAP + uniform mat3 specularColorMapTransform; + varying vec2 vSpecularColorMapUv; +#endif +#ifdef USE_SPECULAR_INTENSITYMAP + uniform mat3 specularIntensityMapTransform; + varying vec2 vSpecularIntensityMapUv; +#endif +#ifdef USE_TRANSMISSIONMAP + uniform mat3 transmissionMapTransform; + varying vec2 vTransmissionMapUv; +#endif +#ifdef USE_THICKNESSMAP + uniform mat3 thicknessMapTransform; + varying vec2 vThicknessMapUv; +#endif`,Um=`#if defined( USE_UV ) || defined( USE_ANISOTROPY ) + vUv = vec3( uv, 1 ).xy; +#endif +#ifdef USE_MAP + vMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy; +#endif +#ifdef USE_ALPHAMAP + vAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_LIGHTMAP + vLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_AOMAP + vAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_BUMPMAP + vBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_NORMALMAP + vNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_DISPLACEMENTMAP + vDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_EMISSIVEMAP + vEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_METALNESSMAP + vMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_ROUGHNESSMAP + vRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_ANISOTROPYMAP + vAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_CLEARCOATMAP + vClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_CLEARCOAT_NORMALMAP + vClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_CLEARCOAT_ROUGHNESSMAP + vClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_IRIDESCENCEMAP + vIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_IRIDESCENCE_THICKNESSMAP + vIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_SHEEN_COLORMAP + vSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_SHEEN_ROUGHNESSMAP + vSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_SPECULARMAP + vSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_SPECULAR_COLORMAP + vSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_SPECULAR_INTENSITYMAP + vSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_TRANSMISSIONMAP + vTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_THICKNESSMAP + vThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy; +#endif`,Fm=`#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0 + vec4 worldPosition = vec4( transformed, 1.0 ); + #ifdef USE_BATCHING + worldPosition = batchingMatrix * worldPosition; + #endif + #ifdef USE_INSTANCING + worldPosition = instanceMatrix * worldPosition; + #endif + worldPosition = modelMatrix * worldPosition; +#endif`,Om=`varying vec2 vUv; +uniform mat3 uvTransform; +void main() { + vUv = ( uvTransform * vec3( uv, 1 ) ).xy; + gl_Position = vec4( position.xy, 1.0, 1.0 ); +}`,Bm=`uniform sampler2D t2D; +uniform float backgroundIntensity; +varying vec2 vUv; +void main() { + vec4 texColor = texture2D( t2D, vUv ); + #ifdef DECODE_VIDEO_TEXTURE + 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 ); + #endif + texColor.rgb *= backgroundIntensity; + gl_FragColor = texColor; + #include + #include +}`,zm=`varying vec3 vWorldDirection; +#include +void main() { + vWorldDirection = transformDirection( position, modelMatrix ); + #include + #include + gl_Position.z = gl_Position.w; +}`,km=`#ifdef ENVMAP_TYPE_CUBE + uniform samplerCube envMap; +#elif defined( ENVMAP_TYPE_CUBE_UV ) + uniform sampler2D envMap; +#endif +uniform float backgroundBlurriness; +uniform float backgroundIntensity; +uniform mat3 backgroundRotation; +varying vec3 vWorldDirection; +#include +void main() { + #ifdef ENVMAP_TYPE_CUBE + vec4 texColor = textureCube( envMap, backgroundRotation * vWorldDirection ); + #elif defined( ENVMAP_TYPE_CUBE_UV ) + vec4 texColor = textureCubeUV( envMap, backgroundRotation * vWorldDirection, backgroundBlurriness ); + #else + vec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 ); + #endif + texColor.rgb *= backgroundIntensity; + gl_FragColor = texColor; + #include + #include +}`,Vm=`varying vec3 vWorldDirection; +#include +void main() { + vWorldDirection = transformDirection( position, modelMatrix ); + #include + #include + gl_Position.z = gl_Position.w; +}`,Gm=`uniform samplerCube tCube; +uniform float tFlip; +uniform float opacity; +varying vec3 vWorldDirection; +void main() { + vec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) ); + gl_FragColor = texColor; + gl_FragColor.a *= opacity; + #include + #include +}`,Hm=`#include +#include +#include +#include +#include +#include +#include +#include +varying vec2 vHighPrecisionZW; +void main() { + #include + #include + #include + #include + #ifdef USE_DISPLACEMENTMAP + #include + #include + #include + #endif + #include + #include + #include + #include + #include + #include + #include + vHighPrecisionZW = gl_Position.zw; +}`,Wm=`#if DEPTH_PACKING == 3200 + uniform float opacity; +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +varying vec2 vHighPrecisionZW; +void main() { + vec4 diffuseColor = vec4( 1.0 ); + #include + #if DEPTH_PACKING == 3200 + diffuseColor.a = opacity; + #endif + #include + #include + #include + #include + #include + #ifdef USE_REVERSED_DEPTH_BUFFER + float fragCoordZ = vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ]; + #else + float fragCoordZ = 0.5 * vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ] + 0.5; + #endif + #if DEPTH_PACKING == 3200 + gl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity ); + #elif DEPTH_PACKING == 3201 + gl_FragColor = packDepthToRGBA( fragCoordZ ); + #elif DEPTH_PACKING == 3202 + gl_FragColor = vec4( packDepthToRGB( fragCoordZ ), 1.0 ); + #elif DEPTH_PACKING == 3203 + gl_FragColor = vec4( packDepthToRG( fragCoordZ ), 0.0, 1.0 ); + #endif +}`,Xm=`#define DISTANCE +varying vec3 vWorldPosition; +#include +#include +#include +#include +#include +#include +#include +void main() { + #include + #include + #include + #include + #ifdef USE_DISPLACEMENTMAP + #include + #include + #include + #endif + #include + #include + #include + #include + #include + #include + #include + vWorldPosition = worldPosition.xyz; +}`,qm=`#define DISTANCE +uniform vec3 referencePosition; +uniform float nearDistance; +uniform float farDistance; +varying vec3 vWorldPosition; +#include +#include +#include +#include +#include +#include +#include +void main() { + vec4 diffuseColor = vec4( 1.0 ); + #include + #include + #include + #include + #include + float dist = length( vWorldPosition - referencePosition ); + dist = ( dist - nearDistance ) / ( farDistance - nearDistance ); + dist = saturate( dist ); + gl_FragColor = vec4( dist, 0.0, 0.0, 1.0 ); +}`,Ym=`varying vec3 vWorldDirection; +#include +void main() { + vWorldDirection = transformDirection( position, modelMatrix ); + #include + #include +}`,Zm=`uniform sampler2D tEquirect; +varying vec3 vWorldDirection; +#include +void main() { + vec3 direction = normalize( vWorldDirection ); + vec2 sampleUV = equirectUv( direction ); + gl_FragColor = texture2D( tEquirect, sampleUV ); + #include + #include +}`,Km=`uniform float scale; +attribute float lineDistance; +varying float vLineDistance; +#include +#include +#include +#include +#include +#include +#include +void main() { + vLineDistance = scale * lineDistance; + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include +}`,Jm=`uniform vec3 diffuse; +uniform float opacity; +uniform float dashSize; +uniform float totalSize; +varying float vLineDistance; +#include +#include +#include +#include +#include +#include +#include +void main() { + vec4 diffuseColor = vec4( diffuse, opacity ); + #include + if ( mod( vLineDistance, totalSize ) > dashSize ) { + discard; + } + vec3 outgoingLight = vec3( 0.0 ); + #include + #include + #include + outgoingLight = diffuseColor.rgb; + #include + #include + #include + #include + #include +}`,$m=`#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +void main() { + #include + #include + #include + #include + #include + #if defined ( USE_ENVMAP ) || defined ( USE_SKINNING ) + #include + #include + #include + #include + #include + #endif + #include + #include + #include + #include + #include + #include + #include + #include + #include +}`,jm=`uniform vec3 diffuse; +uniform float opacity; +#ifndef FLAT_SHADED + varying vec3 vNormal; +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +void main() { + vec4 diffuseColor = vec4( diffuse, opacity ); + #include + #include + #include + #include + #include + #include + #include + #include + ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) ); + #ifdef USE_LIGHTMAP + vec4 lightMapTexel = texture2D( lightMap, vLightMapUv ); + reflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI; + #else + reflectedLight.indirectDiffuse += vec3( 1.0 ); + #endif + #include + reflectedLight.indirectDiffuse *= diffuseColor.rgb; + vec3 outgoingLight = reflectedLight.indirectDiffuse; + #include + #include + #include + #include + #include + #include + #include +}`,Qm=`#define LAMBERT +varying vec3 vViewPosition; +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +void main() { + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + vViewPosition = - mvPosition.xyz; + #include + #include + #include + #include +}`,eg=`#define LAMBERT +uniform vec3 diffuse; +uniform vec3 emissive; +uniform float opacity; +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +void main() { + vec4 diffuseColor = vec4( diffuse, opacity ); + #include + ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) ); + vec3 totalEmissiveRadiance = emissive; + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance; + #include + #include + #include + #include + #include + #include + #include +}`,tg=`#define MATCAP +varying vec3 vViewPosition; +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +void main() { + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + vViewPosition = - mvPosition.xyz; +}`,ng=`#define MATCAP +uniform vec3 diffuse; +uniform float opacity; +uniform sampler2D matcap; +varying vec3 vViewPosition; +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +void main() { + vec4 diffuseColor = vec4( diffuse, opacity ); + #include + #include + #include + #include + #include + #include + #include + #include + #include + vec3 viewDir = normalize( vViewPosition ); + vec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) ); + vec3 y = cross( viewDir, x ); + vec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5; + #ifdef USE_MATCAP + vec4 matcapColor = texture2D( matcap, uv ); + #else + vec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 ); + #endif + vec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb; + #include + #include + #include + #include + #include + #include +}`,ig=`#define NORMAL +#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE ) + varying vec3 vViewPosition; +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +void main() { + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include +#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE ) + vViewPosition = - mvPosition.xyz; +#endif +}`,sg=`#define NORMAL +uniform float opacity; +#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE ) + varying vec3 vViewPosition; +#endif +#include +#include +#include +#include +#include +#include +void main() { + vec4 diffuseColor = vec4( 0.0, 0.0, 0.0, opacity ); + #include + #include + #include + #include + gl_FragColor = vec4( normalize( normal ) * 0.5 + 0.5, diffuseColor.a ); + #ifdef OPAQUE + gl_FragColor.a = 1.0; + #endif +}`,rg=`#define PHONG +varying vec3 vViewPosition; +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +void main() { + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + vViewPosition = - mvPosition.xyz; + #include + #include + #include + #include +}`,ag=`#define PHONG +uniform vec3 diffuse; +uniform vec3 emissive; +uniform vec3 specular; +uniform float shininess; +uniform float opacity; +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +void main() { + vec4 diffuseColor = vec4( diffuse, opacity ); + #include + ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) ); + vec3 totalEmissiveRadiance = emissive; + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance; + #include + #include + #include + #include + #include + #include + #include +}`,og=`#define STANDARD +varying vec3 vViewPosition; +#ifdef USE_TRANSMISSION + varying vec3 vWorldPosition; +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +void main() { + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + vViewPosition = - mvPosition.xyz; + #include + #include + #include +#ifdef USE_TRANSMISSION + vWorldPosition = worldPosition.xyz; +#endif +}`,lg=`#define STANDARD +#ifdef PHYSICAL + #define IOR + #define USE_SPECULAR +#endif +uniform vec3 diffuse; +uniform vec3 emissive; +uniform float roughness; +uniform float metalness; +uniform float opacity; +#ifdef IOR + uniform float ior; +#endif +#ifdef USE_SPECULAR + uniform float specularIntensity; + uniform vec3 specularColor; + #ifdef USE_SPECULAR_COLORMAP + uniform sampler2D specularColorMap; + #endif + #ifdef USE_SPECULAR_INTENSITYMAP + uniform sampler2D specularIntensityMap; + #endif +#endif +#ifdef USE_CLEARCOAT + uniform float clearcoat; + uniform float clearcoatRoughness; +#endif +#ifdef USE_DISPERSION + uniform float dispersion; +#endif +#ifdef USE_IRIDESCENCE + uniform float iridescence; + uniform float iridescenceIOR; + uniform float iridescenceThicknessMinimum; + uniform float iridescenceThicknessMaximum; +#endif +#ifdef USE_SHEEN + uniform vec3 sheenColor; + uniform float sheenRoughness; + #ifdef USE_SHEEN_COLORMAP + uniform sampler2D sheenColorMap; + #endif + #ifdef USE_SHEEN_ROUGHNESSMAP + uniform sampler2D sheenRoughnessMap; + #endif +#endif +#ifdef USE_ANISOTROPY + uniform vec2 anisotropyVector; + #ifdef USE_ANISOTROPYMAP + uniform sampler2D anisotropyMap; + #endif +#endif +varying vec3 vViewPosition; +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +void main() { + vec4 diffuseColor = vec4( diffuse, opacity ); + #include + ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) ); + vec3 totalEmissiveRadiance = emissive; + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + vec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse; + vec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular; + #include + vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance; + #ifdef USE_SHEEN + + outgoingLight = outgoingLight + sheenSpecularDirect + sheenSpecularIndirect; + + #endif + #ifdef USE_CLEARCOAT + float dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) ); + vec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc ); + outgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat; + #endif + #include + #include + #include + #include + #include + #include +}`,cg=`#define TOON +varying vec3 vViewPosition; +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +void main() { + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + vViewPosition = - mvPosition.xyz; + #include + #include + #include +}`,hg=`#define TOON +uniform vec3 diffuse; +uniform vec3 emissive; +uniform float opacity; +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +void main() { + vec4 diffuseColor = vec4( diffuse, opacity ); + #include + ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) ); + vec3 totalEmissiveRadiance = emissive; + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance; + #include + #include + #include + #include + #include + #include +}`,ug=`uniform float size; +uniform float scale; +#include +#include +#include +#include +#include +#include +#ifdef USE_POINTS_UV + varying vec2 vUv; + uniform mat3 uvTransform; +#endif +void main() { + #ifdef USE_POINTS_UV + vUv = ( uvTransform * vec3( uv, 1 ) ).xy; + #endif + #include + #include + #include + #include + #include + #include + gl_PointSize = size; + #ifdef USE_SIZEATTENUATION + bool isPerspective = isPerspectiveMatrix( projectionMatrix ); + if ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z ); + #endif + #include + #include + #include + #include +}`,dg=`uniform vec3 diffuse; +uniform float opacity; +#include +#include +#include +#include +#include +#include +#include +#include +void main() { + vec4 diffuseColor = vec4( diffuse, opacity ); + #include + vec3 outgoingLight = vec3( 0.0 ); + #include + #include + #include + #include + #include + outgoingLight = diffuseColor.rgb; + #include + #include + #include + #include + #include +}`,fg=`#include +#include +#include +#include +#include +#include +#include +void main() { + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include +}`,pg=`uniform vec3 color; +uniform float opacity; +#include +#include +#include +#include +#include +#include +#include +void main() { + #include + gl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) ); + #include + #include + #include + #include +}`,mg=`uniform float rotation; +uniform vec2 center; +#include +#include +#include +#include +#include +void main() { + #include + vec4 mvPosition = modelViewMatrix[ 3 ]; + vec2 scale = vec2( length( modelMatrix[ 0 ].xyz ), length( modelMatrix[ 1 ].xyz ) ); + #ifndef USE_SIZEATTENUATION + bool isPerspective = isPerspectiveMatrix( projectionMatrix ); + if ( isPerspective ) scale *= - mvPosition.z; + #endif + vec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale; + vec2 rotatedPosition; + rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y; + rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y; + mvPosition.xy += rotatedPosition; + gl_Position = projectionMatrix * mvPosition; + #include + #include + #include +}`,gg=`uniform vec3 diffuse; +uniform float opacity; +#include +#include +#include +#include +#include +#include +#include +#include +#include +void main() { + vec4 diffuseColor = vec4( diffuse, opacity ); + #include + vec3 outgoingLight = vec3( 0.0 ); + #include + #include + #include + #include + #include + outgoingLight = diffuseColor.rgb; + #include + #include + #include + #include +}`,ze={alphahash_fragment:Of,alphahash_pars_fragment:Bf,alphamap_fragment:zf,alphamap_pars_fragment:kf,alphatest_fragment:Vf,alphatest_pars_fragment:Gf,aomap_fragment:Hf,aomap_pars_fragment:Wf,batching_pars_vertex:Xf,batching_vertex:qf,begin_vertex:Yf,beginnormal_vertex:Zf,bsdfs:Kf,iridescence_fragment:Jf,bumpmap_pars_fragment:$f,clipping_planes_fragment:jf,clipping_planes_pars_fragment:Qf,clipping_planes_pars_vertex:ep,clipping_planes_vertex:tp,color_fragment:np,color_pars_fragment:ip,color_pars_vertex:sp,color_vertex:rp,common:ap,cube_uv_reflection_fragment:op,defaultnormal_vertex:lp,displacementmap_pars_vertex:cp,displacementmap_vertex:hp,emissivemap_fragment:up,emissivemap_pars_fragment:dp,colorspace_fragment:fp,colorspace_pars_fragment:pp,envmap_fragment:mp,envmap_common_pars_fragment:gp,envmap_pars_fragment:_p,envmap_pars_vertex:xp,envmap_physical_pars_fragment:Cp,envmap_vertex:vp,fog_vertex:yp,fog_pars_vertex:Mp,fog_fragment:Sp,fog_pars_fragment:bp,gradientmap_pars_fragment:Tp,lightmap_pars_fragment:Ep,lights_lambert_fragment:Ap,lights_lambert_pars_fragment:wp,lights_pars_begin:Rp,lights_toon_fragment:Ip,lights_toon_pars_fragment:Pp,lights_phong_fragment:Lp,lights_phong_pars_fragment:Np,lights_physical_fragment:Dp,lights_physical_pars_fragment:Up,lights_fragment_begin:Fp,lights_fragment_maps:Op,lights_fragment_end:Bp,lightprobes_pars_fragment:zp,logdepthbuf_fragment:kp,logdepthbuf_pars_fragment:Vp,logdepthbuf_pars_vertex:Gp,logdepthbuf_vertex:Hp,map_fragment:Wp,map_pars_fragment:Xp,map_particle_fragment:qp,map_particle_pars_fragment:Yp,metalnessmap_fragment:Zp,metalnessmap_pars_fragment:Kp,morphinstance_vertex:Jp,morphcolor_vertex:$p,morphnormal_vertex:jp,morphtarget_pars_vertex:Qp,morphtarget_vertex:em,normal_fragment_begin:tm,normal_fragment_maps:nm,normal_pars_fragment:im,normal_pars_vertex:sm,normal_vertex:rm,normalmap_pars_fragment:am,clearcoat_normal_fragment_begin:om,clearcoat_normal_fragment_maps:lm,clearcoat_pars_fragment:cm,iridescence_pars_fragment:hm,opaque_fragment:um,packing:dm,premultiplied_alpha_fragment:fm,project_vertex:pm,dithering_fragment:mm,dithering_pars_fragment:gm,roughnessmap_fragment:_m,roughnessmap_pars_fragment:xm,shadowmap_pars_fragment:vm,shadowmap_pars_vertex:ym,shadowmap_vertex:Mm,shadowmask_pars_fragment:Sm,skinbase_vertex:bm,skinning_pars_vertex:Tm,skinning_vertex:Em,skinnormal_vertex:Am,specularmap_fragment:wm,specularmap_pars_fragment:Rm,tonemapping_fragment:Cm,tonemapping_pars_fragment:Im,transmission_fragment:Pm,transmission_pars_fragment:Lm,uv_pars_fragment:Nm,uv_pars_vertex:Dm,uv_vertex:Um,worldpos_vertex:Fm,background_vert:Om,background_frag:Bm,backgroundCube_vert:zm,backgroundCube_frag:km,cube_vert:Vm,cube_frag:Gm,depth_vert:Hm,depth_frag:Wm,distance_vert:Xm,distance_frag:qm,equirect_vert:Ym,equirect_frag:Zm,linedashed_vert:Km,linedashed_frag:Jm,meshbasic_vert:$m,meshbasic_frag:jm,meshlambert_vert:Qm,meshlambert_frag:eg,meshmatcap_vert:tg,meshmatcap_frag:ng,meshnormal_vert:ig,meshnormal_frag:sg,meshphong_vert:rg,meshphong_frag:ag,meshphysical_vert:og,meshphysical_frag:lg,meshtoon_vert:cg,meshtoon_frag:hg,points_vert:ug,points_frag:dg,shadow_vert:fg,shadow_frag:pg,sprite_vert:mg,sprite_frag:gg},de={common:{diffuse:{value:new Me(16777215)},opacity:{value:1},map:{value:null},mapTransform:{value:new Ue},alphaMap:{value:null},alphaMapTransform:{value:new Ue},alphaTest:{value:0}},specularmap:{specularMap:{value:null},specularMapTransform:{value:new Ue}},envmap:{envMap:{value:null},envMapRotation:{value:new Ue},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98},dfgLUT:{value:null}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1},aoMapTransform:{value:new Ue}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1},lightMapTransform:{value:new Ue}},bumpmap:{bumpMap:{value:null},bumpMapTransform:{value:new Ue},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalMapTransform:{value:new Ue},normalScale:{value:new ye(1,1)}},displacementmap:{displacementMap:{value:null},displacementMapTransform:{value:new Ue},displacementScale:{value:1},displacementBias:{value:0}},emissivemap:{emissiveMap:{value:null},emissiveMapTransform:{value:new Ue}},metalnessmap:{metalnessMap:{value:null},metalnessMapTransform:{value:new Ue}},roughnessmap:{roughnessMap:{value:null},roughnessMapTransform:{value:new Ue}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new Me(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null},probesSH:{value:null},probesMin:{value:new L},probesMax:{value:new L},probesResolution:{value:new L}},points:{diffuse:{value:new Me(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaMapTransform:{value:new Ue},alphaTest:{value:0},uvTransform:{value:new Ue}},sprite:{diffuse:{value:new Me(16777215)},opacity:{value:1},center:{value:new ye(.5,.5)},rotation:{value:0},map:{value:null},mapTransform:{value:new Ue},alphaMap:{value:null},alphaMapTransform:{value:new Ue},alphaTest:{value:0}}},On={basic:{uniforms:Gt([de.common,de.specularmap,de.envmap,de.aomap,de.lightmap,de.fog]),vertexShader:ze.meshbasic_vert,fragmentShader:ze.meshbasic_frag},lambert:{uniforms:Gt([de.common,de.specularmap,de.envmap,de.aomap,de.lightmap,de.emissivemap,de.bumpmap,de.normalmap,de.displacementmap,de.fog,de.lights,{emissive:{value:new Me(0)},envMapIntensity:{value:1}}]),vertexShader:ze.meshlambert_vert,fragmentShader:ze.meshlambert_frag},phong:{uniforms:Gt([de.common,de.specularmap,de.envmap,de.aomap,de.lightmap,de.emissivemap,de.bumpmap,de.normalmap,de.displacementmap,de.fog,de.lights,{emissive:{value:new Me(0)},specular:{value:new Me(1118481)},shininess:{value:30},envMapIntensity:{value:1}}]),vertexShader:ze.meshphong_vert,fragmentShader:ze.meshphong_frag},standard:{uniforms:Gt([de.common,de.envmap,de.aomap,de.lightmap,de.emissivemap,de.bumpmap,de.normalmap,de.displacementmap,de.roughnessmap,de.metalnessmap,de.fog,de.lights,{emissive:{value:new Me(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:ze.meshphysical_vert,fragmentShader:ze.meshphysical_frag},toon:{uniforms:Gt([de.common,de.aomap,de.lightmap,de.emissivemap,de.bumpmap,de.normalmap,de.displacementmap,de.gradientmap,de.fog,de.lights,{emissive:{value:new Me(0)}}]),vertexShader:ze.meshtoon_vert,fragmentShader:ze.meshtoon_frag},matcap:{uniforms:Gt([de.common,de.bumpmap,de.normalmap,de.displacementmap,de.fog,{matcap:{value:null}}]),vertexShader:ze.meshmatcap_vert,fragmentShader:ze.meshmatcap_frag},points:{uniforms:Gt([de.points,de.fog]),vertexShader:ze.points_vert,fragmentShader:ze.points_frag},dashed:{uniforms:Gt([de.common,de.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:ze.linedashed_vert,fragmentShader:ze.linedashed_frag},depth:{uniforms:Gt([de.common,de.displacementmap]),vertexShader:ze.depth_vert,fragmentShader:ze.depth_frag},normal:{uniforms:Gt([de.common,de.bumpmap,de.normalmap,de.displacementmap,{opacity:{value:1}}]),vertexShader:ze.meshnormal_vert,fragmentShader:ze.meshnormal_frag},sprite:{uniforms:Gt([de.sprite,de.fog]),vertexShader:ze.sprite_vert,fragmentShader:ze.sprite_frag},background:{uniforms:{uvTransform:{value:new Ue},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:ze.background_vert,fragmentShader:ze.background_frag},backgroundCube:{uniforms:{envMap:{value:null},backgroundBlurriness:{value:0},backgroundIntensity:{value:1},backgroundRotation:{value:new Ue}},vertexShader:ze.backgroundCube_vert,fragmentShader:ze.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:ze.cube_vert,fragmentShader:ze.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:ze.equirect_vert,fragmentShader:ze.equirect_frag},distance:{uniforms:Gt([de.common,de.displacementmap,{referencePosition:{value:new L},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:ze.distance_vert,fragmentShader:ze.distance_frag},shadow:{uniforms:Gt([de.lights,de.fog,{color:{value:new Me(0)},opacity:{value:1}}]),vertexShader:ze.shadow_vert,fragmentShader:ze.shadow_frag}};On.physical={uniforms:Gt([On.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatMapTransform:{value:new Ue},clearcoatNormalMap:{value:null},clearcoatNormalMapTransform:{value:new Ue},clearcoatNormalScale:{value:new ye(1,1)},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatRoughnessMapTransform:{value:new Ue},dispersion:{value:0},iridescence:{value:0},iridescenceMap:{value:null},iridescenceMapTransform:{value:new Ue},iridescenceIOR:{value:1.3},iridescenceThicknessMinimum:{value:100},iridescenceThicknessMaximum:{value:400},iridescenceThicknessMap:{value:null},iridescenceThicknessMapTransform:{value:new Ue},sheen:{value:0},sheenColor:{value:new Me(0)},sheenColorMap:{value:null},sheenColorMapTransform:{value:new Ue},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},sheenRoughnessMapTransform:{value:new Ue},transmission:{value:0},transmissionMap:{value:null},transmissionMapTransform:{value:new Ue},transmissionSamplerSize:{value:new ye},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},thicknessMapTransform:{value:new Ue},attenuationDistance:{value:0},attenuationColor:{value:new Me(0)},specularColor:{value:new Me(1,1,1)},specularColorMap:{value:null},specularColorMapTransform:{value:new Ue},specularIntensity:{value:1},specularIntensityMap:{value:null},specularIntensityMapTransform:{value:new Ue},anisotropyVector:{value:new ye},anisotropyMap:{value:null},anisotropyMapTransform:{value:new Ue}}]),vertexShader:ze.meshphysical_vert,fragmentShader:ze.meshphysical_frag};var Ho={r:0,b:0,g:0},_g=new Oe,rd=new Ue;rd.set(-1,0,0,0,1,0,0,0,1);function xg(s,e,t,n,i,r){let a=new Me(0),o=i===!0?0:1,l,c,h=null,d=0,u=null;function f(S){let E=S.isScene===!0?S.background:null;if(E&&E.isTexture){let v=S.backgroundBlurriness>0;E=e.get(E,v)}return E}function g(S){let E=!1,v=f(S);v===null?m(a,o):v&&v.isColor&&(m(v,1),E=!0);let A=s.xr.getEnvironmentBlendMode();A==="additive"?t.buffers.color.setClear(0,0,0,1,r):A==="alpha-blend"&&t.buffers.color.setClear(0,0,0,0,r),(s.autoClear||E)&&(t.buffers.depth.setTest(!0),t.buffers.depth.setMask(!0),t.buffers.color.setMask(!0),s.clear(s.autoClearColor,s.autoClearDepth,s.autoClearStencil))}function M(S,E){let v=f(E);v&&(v.isCubeTexture||v.mapping===Lr)?(c===void 0&&(c=new Ve(new vn(1,1,1),new ft({name:"BackgroundCubeMaterial",uniforms:qi(On.backgroundCube.uniforms),vertexShader:On.backgroundCube.vertexShader,fragmentShader:On.backgroundCube.fragmentShader,side:Ft,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),c.geometry.deleteAttribute("normal"),c.geometry.deleteAttribute("uv"),c.onBeforeRender=function(A,T,R){this.matrixWorld.copyPosition(R.matrixWorld)},Object.defineProperty(c.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),n.update(c)),c.material.uniforms.envMap.value=v,c.material.uniforms.backgroundBlurriness.value=E.backgroundBlurriness,c.material.uniforms.backgroundIntensity.value=E.backgroundIntensity,c.material.uniforms.backgroundRotation.value.setFromMatrix4(_g.makeRotationFromEuler(E.backgroundRotation)).transpose(),v.isCubeTexture&&v.isRenderTargetTexture===!1&&c.material.uniforms.backgroundRotation.value.premultiply(rd),c.material.toneMapped=Be.getTransfer(v.colorSpace)!==$e,(h!==v||d!==v.version||u!==s.toneMapping)&&(c.material.needsUpdate=!0,h=v,d=v.version,u=s.toneMapping),c.layers.enableAll(),S.unshift(c,c.geometry,c.material,0,0,null)):v&&v.isTexture&&(l===void 0&&(l=new Ve(new zi(2,2),new ft({name:"BackgroundMaterial",uniforms:qi(On.background.uniforms),vertexShader:On.background.vertexShader,fragmentShader:On.background.fragmentShader,side:xn,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),l.geometry.deleteAttribute("normal"),Object.defineProperty(l.material,"map",{get:function(){return this.uniforms.t2D.value}}),n.update(l)),l.material.uniforms.t2D.value=v,l.material.uniforms.backgroundIntensity.value=E.backgroundIntensity,l.material.toneMapped=Be.getTransfer(v.colorSpace)!==$e,v.matrixAutoUpdate===!0&&v.updateMatrix(),l.material.uniforms.uvTransform.value.copy(v.matrix),(h!==v||d!==v.version||u!==s.toneMapping)&&(l.material.needsUpdate=!0,h=v,d=v.version,u=s.toneMapping),l.layers.enableAll(),S.unshift(l,l.geometry,l.material,0,0,null))}function m(S,E){S.getRGB(Ho,ac(s)),t.buffers.color.setClear(Ho.r,Ho.g,Ho.b,E,r)}function p(){c!==void 0&&(c.geometry.dispose(),c.material.dispose(),c=void 0),l!==void 0&&(l.geometry.dispose(),l.material.dispose(),l=void 0)}return{getClearColor:function(){return a},setClearColor:function(S,E=1){a.set(S),o=E,m(a,o)},getClearAlpha:function(){return o},setClearAlpha:function(S){o=S,m(a,o)},render:g,addToRenderList:M,dispose:p}}function vg(s,e){let t=s.getParameter(s.MAX_VERTEX_ATTRIBS),n={},i=u(null),r=i,a=!1;function o(I,D,X,q,O){let H=!1,G=d(I,q,X,D);r!==G&&(r=G,c(r.object)),H=f(I,q,X,O),H&&g(I,q,X,O),O!==null&&e.update(O,s.ELEMENT_ARRAY_BUFFER),(H||a)&&(a=!1,v(I,D,X,q),O!==null&&s.bindBuffer(s.ELEMENT_ARRAY_BUFFER,e.get(O).buffer))}function l(){return s.createVertexArray()}function c(I){return s.bindVertexArray(I)}function h(I){return s.deleteVertexArray(I)}function d(I,D,X,q){let O=q.wireframe===!0,H=n[D.id];H===void 0&&(H={},n[D.id]=H);let G=I.isInstancedMesh===!0?I.id:0,$=H[G];$===void 0&&($={},H[G]=$);let ie=$[X.id];ie===void 0&&(ie={},$[X.id]=ie);let le=ie[O];return le===void 0&&(le=u(l()),ie[O]=le),le}function u(I){let D=[],X=[],q=[];for(let O=0;O=0){let pe=O[ie],_e=H[ie];if(_e===void 0&&(ie==="instanceMatrix"&&I.instanceMatrix&&(_e=I.instanceMatrix),ie==="instanceColor"&&I.instanceColor&&(_e=I.instanceColor)),pe===void 0||pe.attribute!==_e||_e&&pe.data!==_e.data)return!0;G++}return r.attributesNum!==G||r.index!==q}function g(I,D,X,q){let O={},H=D.attributes,G=0,$=X.getAttributes();for(let ie in $)if($[ie].location>=0){let pe=H[ie];pe===void 0&&(ie==="instanceMatrix"&&I.instanceMatrix&&(pe=I.instanceMatrix),ie==="instanceColor"&&I.instanceColor&&(pe=I.instanceColor));let _e={};_e.attribute=pe,pe&&pe.data&&(_e.data=pe.data),O[ie]=_e,G++}r.attributes=O,r.attributesNum=G,r.index=q}function M(){let I=r.newAttributes;for(let D=0,X=I.length;D=0){let le=O[$];if(le===void 0&&($==="instanceMatrix"&&I.instanceMatrix&&(le=I.instanceMatrix),$==="instanceColor"&&I.instanceColor&&(le=I.instanceColor)),le!==void 0){let pe=le.normalized,_e=le.itemSize,He=e.get(le);if(He===void 0)continue;let ht=He.buffer,Ye=He.type,J=He.bytesPerElement,re=Ye===s.INT||Ye===s.UNSIGNED_INT||le.gpuType===io;if(le.isInterleavedBufferAttribute){let te=le.data,Le=te.stride,Ne=le.offset;if(te.isInstancedInterleavedBuffer){for(let Ae=0;Ae0&&s.getShaderPrecisionFormat(s.FRAGMENT_SHADER,s.HIGH_FLOAT).precision>0)return"highp";R="mediump"}return R==="mediump"&&s.getShaderPrecisionFormat(s.VERTEX_SHADER,s.MEDIUM_FLOAT).precision>0&&s.getShaderPrecisionFormat(s.FRAGMENT_SHADER,s.MEDIUM_FLOAT).precision>0?"mediump":"lowp"}let c=t.precision!==void 0?t.precision:"highp",h=l(c);h!==c&&(Ee("WebGLRenderer:",c,"not supported, using",h,"instead."),c=h);let d=t.logarithmicDepthBuffer===!0,u=t.reversedDepthBuffer===!0&&e.has("EXT_clip_control");t.reversedDepthBuffer===!0&&u===!1&&Ee("WebGLRenderer: Unable to use reversed depth buffer due to missing EXT_clip_control extension. Fallback to default depth buffer.");let f=s.getParameter(s.MAX_TEXTURE_IMAGE_UNITS),g=s.getParameter(s.MAX_VERTEX_TEXTURE_IMAGE_UNITS),M=s.getParameter(s.MAX_TEXTURE_SIZE),m=s.getParameter(s.MAX_CUBE_MAP_TEXTURE_SIZE),p=s.getParameter(s.MAX_VERTEX_ATTRIBS),S=s.getParameter(s.MAX_VERTEX_UNIFORM_VECTORS),E=s.getParameter(s.MAX_VARYING_VECTORS),v=s.getParameter(s.MAX_FRAGMENT_UNIFORM_VECTORS),A=s.getParameter(s.MAX_SAMPLES),T=s.getParameter(s.SAMPLES);return{isWebGL2:!0,getMaxAnisotropy:r,getMaxPrecision:l,textureFormatReadable:a,textureTypeReadable:o,precision:c,logarithmicDepthBuffer:d,reversedDepthBuffer:u,maxTextures:f,maxVertexTextures:g,maxTextureSize:M,maxCubemapSize:m,maxAttributes:p,maxVertexUniforms:S,maxVaryings:E,maxFragmentUniforms:v,maxSamples:A,samples:T}}function Sg(s){let e=this,t=null,n=0,i=!1,r=!1,a=new Rn,o=new Ue,l={value:null,needsUpdate:!1};this.uniform=l,this.numPlanes=0,this.numIntersection=0,this.init=function(d,u){let f=d.length!==0||u||n!==0||i;return i=u,n=d.length,f},this.beginShadows=function(){r=!0,h(null)},this.endShadows=function(){r=!1},this.setGlobalState=function(d,u){t=h(d,u,0)},this.setState=function(d,u,f){let g=d.clippingPlanes,M=d.clipIntersection,m=d.clipShadows,p=s.get(d);if(!i||g===null||g.length===0||r&&!m)r?h(null):c();else{let S=r?0:n,E=S*4,v=p.clippingState||null;l.value=v,v=h(g,u,E,f);for(let A=0;A!==E;++A)v[A]=t[A];p.clippingState=v,this.numIntersection=M?this.numPlanes:0,this.numPlanes+=S}};function c(){l.value!==t&&(l.value=t,l.needsUpdate=n>0),e.numPlanes=n,e.numIntersection=0}function h(d,u,f,g){let M=d!==null?d.length:0,m=null;if(M!==0){if(m=l.value,g!==!0||m===null){let p=f+M*4,S=u.matrixWorldInverse;o.getNormalMatrix(S),(m===null||m.length0&&this._blur(l,0,0,t),this._applyPMREM(l),this._cleanup(l),l}fromEquirectangular(e,t=null){return this._fromTexture(e,t)}fromCubemap(e,t=null){return this._fromTexture(e,t)}compileCubemapShader(){this._cubemapMaterial===null&&(this._cubemapMaterial=ku(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){this._equirectMaterial===null&&(this._equirectMaterial=zu(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),this._cubemapMaterial!==null&&this._cubemapMaterial.dispose(),this._equirectMaterial!==null&&this._equirectMaterial.dispose(),this._backgroundBox!==null&&(this._backgroundBox.geometry.dispose(),this._backgroundBox.material.dispose())}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){this._blurMaterial!==null&&this._blurMaterial.dispose(),this._ggxMaterial!==null&&this._ggxMaterial.dispose(),this._pingPongRenderTarget!==null&&this._pingPongRenderTarget.dispose();for(let e=0;e2?A:0,A,A),d.setRenderTarget(i),p&&d.render(M,l),d.render(e,l)}d.toneMapping=f,d.autoClear=u,e.background=S}_textureToCubeUV(e,t){let n=this._renderer,i=e.mapping===gi||e.mapping===Wi;i?(this._cubemapMaterial===null&&(this._cubemapMaterial=ku()),this._cubemapMaterial.uniforms.flipEnvMap.value=e.isRenderTargetTexture===!1?-1:1):this._equirectMaterial===null&&(this._equirectMaterial=zu());let r=i?this._cubemapMaterial:this._equirectMaterial,a=this._lodMeshes[0];a.material=r;let o=r.uniforms;o.envMap.value=e;let l=this._cubeSize;Ls(t,0,0,3*l,2*l),n.setRenderTarget(t),n.render(a,Gr)}_applyPMREM(e){let t=this._renderer,n=t.autoClear;t.autoClear=!1;let i=this._lodMeshes.length;for(let r=1;rg-vi?n-g+vi:0),p=4*(this._cubeSize-M);l.envMap.value=e.texture,l.roughness.value=f,l.mipInt.value=g-t,Ls(r,m,p,3*M,2*M),i.setRenderTarget(r),i.render(o,Gr),l.envMap.value=r.texture,l.roughness.value=0,l.mipInt.value=g-n,Ls(e,m,p,3*M,2*M),i.setRenderTarget(e),i.render(o,Gr)}_blur(e,t,n,i,r){let a=this._pingPongRenderTarget;this._halfBlur(e,a,t,n,i,"latitudinal",r),this._halfBlur(a,e,n,n,i,"longitudinal",r)}_halfBlur(e,t,n,i,r,a,o){let l=this._renderer,c=this._blurMaterial;a!=="latitudinal"&&a!=="longitudinal"&&De("blur direction must be either latitudinal or longitudinal!");let h=3,d=this._lodMeshes[i];d.material=c;let u=c.uniforms,f=this._sizeLods[n]-1,g=isFinite(r)?Math.PI/(2*f):2*Math.PI/(2*Yi-1),M=r/g,m=isFinite(r)?1+Math.floor(h*M):Yi;m>Yi&&Ee(`sigmaRadians, ${r}, is too large and will clip, as it requested ${m} samples when the maximum is set to ${Yi}`);let p=[],S=0;for(let R=0;RE-vi?i-E+vi:0),T=4*(this._cubeSize-v);Ls(t,A,T,3*v,2*v),l.setRenderTarget(t),l.render(d,Gr)}};function Eg(s){let e=[],t=[],n=[],i=s,r=s-vi+1+Fu.length;for(let a=0;as-vi?l=Fu[a-s+vi-1]:a===0&&(l=0),t.push(l);let c=1/(o-2),h=-c,d=1+c,u=[h,h,d,h,d,d,h,h,d,d,h,d],f=6,g=6,M=3,m=2,p=1,S=new Float32Array(M*g*f),E=new Float32Array(m*g*f),v=new Float32Array(p*g*f);for(let T=0;T2?0:-1,b=[R,_,0,R+2/3,_,0,R+2/3,_+1,0,R,_,0,R+2/3,_+1,0,R,_+1,0];S.set(b,M*g*T),E.set(u,m*g*T);let C=[T,T,T,T,T,T];v.set(C,p*g*T)}let A=new xt;A.setAttribute("position",new Rt(S,M)),A.setAttribute("uv",new Rt(E,m)),A.setAttribute("faceIndex",new Rt(v,p)),n.push(new Ve(A,null)),i>vi&&i--}return{lodMeshes:n,sizeLods:e,sigmas:t}}function Bu(s,e,t){let n=new Ct(s,e,t);return n.texture.mapping=Lr,n.texture.name="PMREM.cubeUv",n.scissorTest=!0,n}function Ls(s,e,t,n,i){s.viewport.set(e,t,n,i),s.scissor.set(e,t,n,i)}function Ag(s,e,t){return new ft({name:"PMREMGGXConvolution",defines:{GGX_SAMPLES:bg,CUBEUV_TEXEL_WIDTH:1/e,CUBEUV_TEXEL_HEIGHT:1/t,CUBEUV_MAX_MIP:`${s}.0`},uniforms:{envMap:{value:null},roughness:{value:0},mipInt:{value:0}},vertexShader:Yo(),fragmentShader:` + + precision highp float; + precision highp int; + + varying vec3 vOutputDirection; + + uniform sampler2D envMap; + uniform float roughness; + uniform float mipInt; + + #define ENVMAP_TYPE_CUBE_UV + #include + + #define PI 3.14159265359 + + // Van der Corput radical inverse + float radicalInverse_VdC(uint bits) { + bits = (bits << 16u) | (bits >> 16u); + bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u); + bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u); + bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u); + bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u); + return float(bits) * 2.3283064365386963e-10; // / 0x100000000 + } + + // Hammersley sequence + vec2 hammersley(uint i, uint N) { + return vec2(float(i) / float(N), radicalInverse_VdC(i)); + } + + // GGX VNDF importance sampling (Eric Heitz 2018) + // "Sampling the GGX Distribution of Visible Normals" + // https://jcgt.org/published/0007/04/01/ + vec3 importanceSampleGGX_VNDF(vec2 Xi, vec3 V, float roughness) { + float alpha = roughness * roughness; + + // Section 4.1: Orthonormal basis + vec3 T1 = vec3(1.0, 0.0, 0.0); + vec3 T2 = cross(V, T1); + + // Section 4.2: Parameterization of projected area + float r = sqrt(Xi.x); + float phi = 2.0 * PI * Xi.y; + float t1 = r * cos(phi); + float t2 = r * sin(phi); + float s = 0.5 * (1.0 + V.z); + t2 = (1.0 - s) * sqrt(1.0 - t1 * t1) + s * t2; + + // Section 4.3: Reprojection onto hemisphere + vec3 Nh = t1 * T1 + t2 * T2 + sqrt(max(0.0, 1.0 - t1 * t1 - t2 * t2)) * V; + + // Section 3.4: Transform back to ellipsoid configuration + return normalize(vec3(alpha * Nh.x, alpha * Nh.y, max(0.0, Nh.z))); + } + + void main() { + vec3 N = normalize(vOutputDirection); + vec3 V = N; // Assume view direction equals normal for pre-filtering + + vec3 prefilteredColor = vec3(0.0); + float totalWeight = 0.0; + + // For very low roughness, just sample the environment directly + if (roughness < 0.001) { + gl_FragColor = vec4(bilinearCubeUV(envMap, N, mipInt), 1.0); + return; + } + + // Tangent space basis for VNDF sampling + vec3 up = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0); + vec3 tangent = normalize(cross(up, N)); + vec3 bitangent = cross(N, tangent); + + for(uint i = 0u; i < uint(GGX_SAMPLES); i++) { + vec2 Xi = hammersley(i, uint(GGX_SAMPLES)); + + // For PMREM, V = N, so in tangent space V is always (0, 0, 1) + vec3 H_tangent = importanceSampleGGX_VNDF(Xi, vec3(0.0, 0.0, 1.0), roughness); + + // Transform H back to world space + vec3 H = normalize(tangent * H_tangent.x + bitangent * H_tangent.y + N * H_tangent.z); + vec3 L = normalize(2.0 * dot(V, H) * H - V); + + float NdotL = max(dot(N, L), 0.0); + + if(NdotL > 0.0) { + // Sample environment at fixed mip level + // VNDF importance sampling handles the distribution filtering + vec3 sampleColor = bilinearCubeUV(envMap, L, mipInt); + + // Weight by NdotL for the split-sum approximation + // VNDF PDF naturally accounts for the visible microfacet distribution + prefilteredColor += sampleColor * NdotL; + totalWeight += NdotL; + } + } + + if (totalWeight > 0.0) { + prefilteredColor = prefilteredColor / totalWeight; + } + + gl_FragColor = vec4(prefilteredColor, 1.0); + } + `,blending:hn,depthTest:!1,depthWrite:!1})}function wg(s,e,t){let n=new Float32Array(Yi),i=new L(0,1,0);return new ft({name:"SphericalGaussianBlur",defines:{n:Yi,CUBEUV_TEXEL_WIDTH:1/e,CUBEUV_TEXEL_HEIGHT:1/t,CUBEUV_MAX_MIP:`${s}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:n},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:i}},vertexShader:Yo(),fragmentShader:` + + 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:hn,depthTest:!1,depthWrite:!1})}function zu(){return new ft({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:Yo(),fragmentShader:` + + 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:hn,depthTest:!1,depthWrite:!1})}function ku(){return new ft({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:Yo(),fragmentShader:` + + 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:hn,depthTest:!1,depthWrite:!1})}function Yo(){return` + + 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 ); + + } + `}var Xo=class extends Ct{constructor(e=1,t={}){super(e,e,t),this.isWebGLCubeRenderTarget=!0;let n={width:e,height:e,depth:1},i=[n,n,n,n,n,n];this.texture=new cr(i),this._setTextureOptions(t),this.texture.isRenderTargetTexture=!0}fromEquirectangularTexture(e,t){this.texture.type=t.type,this.texture.colorSpace=t.colorSpace,this.texture.generateMipmaps=t.generateMipmaps,this.texture.minFilter=t.minFilter,this.texture.magFilter=t.magFilter;let n={uniforms:{tEquirect:{value:null}},vertexShader:` + + 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:` + + uniform sampler2D tEquirect; + + varying vec3 vWorldDirection; + + #include + + void main() { + + vec3 direction = normalize( vWorldDirection ); + + vec2 sampleUV = equirectUv( direction ); + + gl_FragColor = texture2D( tEquirect, sampleUV ); + + } + `},i=new vn(5,5,5),r=new ft({name:"CubemapFromEquirect",uniforms:qi(n.uniforms),vertexShader:n.vertexShader,fragmentShader:n.fragmentShader,side:Ft,blending:hn});r.uniforms.tEquirect.value=t;let a=new Ve(i,r),o=t.minFilter;return t.minFilter===Mn&&(t.minFilter=Tt),new Ja(1,10,this).update(e,a),t.minFilter=o,a.geometry.dispose(),a.material.dispose(),this}clear(e,t=!0,n=!0,i=!0){let r=e.getRenderTarget();for(let a=0;a<6;a++)e.setRenderTarget(this,a),e.clear(t,n,i);e.setRenderTarget(r)}};function Rg(s){let e=new WeakMap,t=new WeakMap,n=null;function i(u,f=!1){return u==null?null:f?a(u):r(u)}function r(u){if(u&&u.isTexture){let f=u.mapping;if(f===eo||f===to)if(e.has(u)){let g=e.get(u).texture;return o(g,u.mapping)}else{let g=u.image;if(g&&g.height>0){let M=new Xo(g.height);return M.fromEquirectangularTexture(s,u),e.set(u,M),u.addEventListener("dispose",c),o(M.texture,u.mapping)}else return null}}return u}function a(u){if(u&&u.isTexture){let f=u.mapping,g=f===eo||f===to,M=f===gi||f===Wi;if(g||M){let m=t.get(u),p=m!==void 0?m.texture.pmremVersion:0;if(u.isRenderTargetTexture&&u.pmremVersion!==p)return n===null&&(n=new Ds(s)),m=g?n.fromEquirectangular(u,m):n.fromCubemap(u,m),m.texture.pmremVersion=u.pmremVersion,t.set(u,m),m.texture;if(m!==void 0)return m.texture;{let S=u.image;return g&&S&&S.height>0||M&&S&&l(S)?(n===null&&(n=new Ds(s)),m=g?n.fromEquirectangular(u):n.fromCubemap(u),m.texture.pmremVersion=u.pmremVersion,t.set(u,m),u.addEventListener("dispose",h),m.texture):null}}}return u}function o(u,f){return f===eo?u.mapping=gi:f===to&&(u.mapping=Wi),u}function l(u){let f=0,g=6;for(let M=0;M=65535?ir:nr)(u,1);m.version=M;let p=r.get(d);p&&e.remove(p),r.set(d,m)}function h(d){let u=r.get(d);if(u){let f=d.index;f!==null&&u.versione.maxTextureSize&&(A=Math.ceil(v/e.maxTextureSize),v=e.maxTextureSize);let T=new Float32Array(v*A*4*d),R=new Qs(T,v,A,d);R.type=sn,R.needsUpdate=!0;let _=E*4;for(let C=0;C + #include + + void main() { + gl_FragColor = texture2D( tDiffuse, vUv ); + + #ifdef LINEAR_TONE_MAPPING + gl_FragColor.rgb = LinearToneMapping( gl_FragColor.rgb ); + #elif defined( REINHARD_TONE_MAPPING ) + gl_FragColor.rgb = ReinhardToneMapping( gl_FragColor.rgb ); + #elif defined( CINEON_TONE_MAPPING ) + gl_FragColor.rgb = CineonToneMapping( gl_FragColor.rgb ); + #elif defined( ACES_FILMIC_TONE_MAPPING ) + gl_FragColor.rgb = ACESFilmicToneMapping( gl_FragColor.rgb ); + #elif defined( AGX_TONE_MAPPING ) + gl_FragColor.rgb = AgXToneMapping( gl_FragColor.rgb ); + #elif defined( NEUTRAL_TONE_MAPPING ) + gl_FragColor.rgb = NeutralToneMapping( gl_FragColor.rgb ); + #elif defined( CUSTOM_TONE_MAPPING ) + gl_FragColor.rgb = CustomToneMapping( gl_FragColor.rgb ); + #endif + + #ifdef SRGB_TRANSFER + gl_FragColor = sRGBTransferOETF( gl_FragColor ); + #endif + }`,depthTest:!1,depthWrite:!1}),h=new Ve(l,c),d=new Un(-1,1,1,-1,0,1),u=null,f=null,g=!1,M,m=null,p=[],S=!1;this.setSize=function(E,v){a.setSize(E,v),o.setSize(E,v);for(let A=0;A0&&p[0].isRenderPass===!0;let v=a.width,A=a.height;for(let T=0;T0)return s;let i=e*t,r=Vu[i];if(r===void 0&&(r=new Float32Array(i),Vu[i]=r),e!==0){n.toArray(r,0);for(let a=1,o=0;a!==e;++a)o+=t,s[a].toArray(r,o)}return r}function It(s,e){if(s.length!==e.length)return!1;for(let t=0,n=s.length;t0&&(this.seq=i.concat(r))}setValue(e,t,n,i){let r=this.map[t];r!==void 0&&r.setValue(e,n,i)}setOptional(e,t,n){let i=t[n];i!==void 0&&this.setValue(e,n,i)}static upload(e,t,n,i){for(let r=0,a=t.length;r!==a;++r){let o=t[r],l=n[o.id];l.needsUpdate!==!1&&o.setValue(e,l.value,i)}}static seqWithValue(e,t){let n=[];for(let i=0,r=e.length;i!==r;++i){let a=e[i];a.id in t&&n.push(a)}return n}};function Yu(s,e,t){let n=s.createShader(e);return s.shaderSource(n,t),s.compileShader(n),n}var T0=37297,E0=0;function A0(s,e){let t=s.split(` +`),n=[],i=Math.max(e-6,0),r=Math.min(e+6,t.length);for(let a=i;a":" "} ${o}: ${t[a]}`)}return n.join(` +`)}var Zu=new Ue;function w0(s){Be._getMatrix(Zu,Be.workingColorSpace,s);let e=`mat3( ${Zu.elements.map(t=>t.toFixed(4))} )`;switch(Be.getTransfer(s)){case $s:return[e,"LinearTransferOETF"];case $e:return[e,"sRGBTransferOETF"];default:return Ee("WebGLProgram: Unsupported color space: ",s),[e,"LinearTransferOETF"]}}function Ku(s,e,t){let n=s.getShaderParameter(e,s.COMPILE_STATUS),r=(s.getShaderInfoLog(e)||"").trim();if(n&&r==="")return"";let a=/ERROR: 0:(\d+)/.exec(r);if(a){let o=parseInt(a[1]);return t.toUpperCase()+` + +`+r+` + +`+A0(s.getShaderSource(e),o)}else return r}function R0(s,e){let t=w0(e);return[`vec4 ${s}( vec4 value ) {`,` return ${t[1]}( vec4( value.rgb * ${t[0]}, value.a ) );`,"}"].join(` +`)}var C0={[Ar]:"Linear",[wr]:"Reinhard",[Rr]:"Cineon",[Hi]:"ACESFilmic",[Ir]:"AgX",[Pr]:"Neutral",[Cr]:"Custom"};function I0(s,e){let t=C0[e];return t===void 0?(Ee("WebGLProgram: Unsupported toneMapping:",e),"vec3 "+s+"( vec3 color ) { return LinearToneMapping( color ); }"):"vec3 "+s+"( vec3 color ) { return "+t+"ToneMapping( color ); }"}var Wo=new L;function P0(){Be.getLuminanceCoefficients(Wo);let s=Wo.x.toFixed(4),e=Wo.y.toFixed(4),t=Wo.z.toFixed(4);return["float luminance( const in vec3 rgb ) {",` const vec3 weights = vec3( ${s}, ${e}, ${t} );`," return dot( weights, rgb );","}"].join(` +`)}function L0(s){return[s.extensionClipCullDistance?"#extension GL_ANGLE_clip_cull_distance : require":"",s.extensionMultiDraw?"#extension GL_ANGLE_multi_draw : require":""].filter(Wr).join(` +`)}function N0(s){let e=[];for(let t in s){let n=s[t];n!==!1&&e.push("#define "+t+" "+n)}return e.join(` +`)}function D0(s,e){let t={},n=s.getProgramParameter(e,s.ACTIVE_ATTRIBUTES);for(let i=0;i/gm;function Ec(s){return s.replace(U0,O0)}var F0=new Map;function O0(s,e){let t=ze[e];if(t===void 0){let n=F0.get(e);if(n!==void 0)t=ze[n],Ee('WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.',e,n);else throw new Error("THREE.WebGLProgram: Can not resolve #include <"+e+">")}return Ec(t)}var B0=/#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 ju(s){return s.replace(B0,z0)}function z0(s,e,t,n){let i="";for(let r=parseInt(e);r0&&(m+=` +`),p=["#define SHADER_TYPE "+t.shaderType,"#define SHADER_NAME "+t.shaderName,g].filter(Wr).join(` +`),p.length>0&&(p+=` +`)):(m=[Qu(t),"#define SHADER_TYPE "+t.shaderType,"#define SHADER_NAME "+t.shaderName,g,t.extensionClipCullDistance?"#define USE_CLIP_DISTANCE":"",t.batching?"#define USE_BATCHING":"",t.batchingColor?"#define USE_BATCHING_COLOR":"",t.instancing?"#define USE_INSTANCING":"",t.instancingColor?"#define USE_INSTANCING_COLOR":"",t.instancingMorph?"#define USE_INSTANCING_MORPH":"",t.useFog&&t.fog?"#define USE_FOG":"",t.useFog&&t.fogExp2?"#define FOG_EXP2":"",t.map?"#define USE_MAP":"",t.envMap?"#define USE_ENVMAP":"",t.envMap?"#define "+h:"",t.lightMap?"#define USE_LIGHTMAP":"",t.aoMap?"#define USE_AOMAP":"",t.bumpMap?"#define USE_BUMPMAP":"",t.normalMap?"#define USE_NORMALMAP":"",t.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",t.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",t.displacementMap?"#define USE_DISPLACEMENTMAP":"",t.emissiveMap?"#define USE_EMISSIVEMAP":"",t.anisotropy?"#define USE_ANISOTROPY":"",t.anisotropyMap?"#define USE_ANISOTROPYMAP":"",t.clearcoatMap?"#define USE_CLEARCOATMAP":"",t.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",t.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",t.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",t.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",t.specularMap?"#define USE_SPECULARMAP":"",t.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",t.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",t.roughnessMap?"#define USE_ROUGHNESSMAP":"",t.metalnessMap?"#define USE_METALNESSMAP":"",t.alphaMap?"#define USE_ALPHAMAP":"",t.alphaHash?"#define USE_ALPHAHASH":"",t.transmission?"#define USE_TRANSMISSION":"",t.transmissionMap?"#define USE_TRANSMISSIONMAP":"",t.thicknessMap?"#define USE_THICKNESSMAP":"",t.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",t.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",t.mapUv?"#define MAP_UV "+t.mapUv:"",t.alphaMapUv?"#define ALPHAMAP_UV "+t.alphaMapUv:"",t.lightMapUv?"#define LIGHTMAP_UV "+t.lightMapUv:"",t.aoMapUv?"#define AOMAP_UV "+t.aoMapUv:"",t.emissiveMapUv?"#define EMISSIVEMAP_UV "+t.emissiveMapUv:"",t.bumpMapUv?"#define BUMPMAP_UV "+t.bumpMapUv:"",t.normalMapUv?"#define NORMALMAP_UV "+t.normalMapUv:"",t.displacementMapUv?"#define DISPLACEMENTMAP_UV "+t.displacementMapUv:"",t.metalnessMapUv?"#define METALNESSMAP_UV "+t.metalnessMapUv:"",t.roughnessMapUv?"#define ROUGHNESSMAP_UV "+t.roughnessMapUv:"",t.anisotropyMapUv?"#define ANISOTROPYMAP_UV "+t.anisotropyMapUv:"",t.clearcoatMapUv?"#define CLEARCOATMAP_UV "+t.clearcoatMapUv:"",t.clearcoatNormalMapUv?"#define CLEARCOAT_NORMALMAP_UV "+t.clearcoatNormalMapUv:"",t.clearcoatRoughnessMapUv?"#define CLEARCOAT_ROUGHNESSMAP_UV "+t.clearcoatRoughnessMapUv:"",t.iridescenceMapUv?"#define IRIDESCENCEMAP_UV "+t.iridescenceMapUv:"",t.iridescenceThicknessMapUv?"#define IRIDESCENCE_THICKNESSMAP_UV "+t.iridescenceThicknessMapUv:"",t.sheenColorMapUv?"#define SHEEN_COLORMAP_UV "+t.sheenColorMapUv:"",t.sheenRoughnessMapUv?"#define SHEEN_ROUGHNESSMAP_UV "+t.sheenRoughnessMapUv:"",t.specularMapUv?"#define SPECULARMAP_UV "+t.specularMapUv:"",t.specularColorMapUv?"#define SPECULAR_COLORMAP_UV "+t.specularColorMapUv:"",t.specularIntensityMapUv?"#define SPECULAR_INTENSITYMAP_UV "+t.specularIntensityMapUv:"",t.transmissionMapUv?"#define TRANSMISSIONMAP_UV "+t.transmissionMapUv:"",t.thicknessMapUv?"#define THICKNESSMAP_UV "+t.thicknessMapUv:"",t.vertexTangents&&t.flatShading===!1?"#define USE_TANGENT":"",t.vertexNormals?"#define HAS_NORMAL":"",t.vertexColors?"#define USE_COLOR":"",t.vertexAlphas?"#define USE_COLOR_ALPHA":"",t.vertexUv1s?"#define USE_UV1":"",t.vertexUv2s?"#define USE_UV2":"",t.vertexUv3s?"#define USE_UV3":"",t.pointsUvs?"#define USE_POINTS_UV":"",t.flatShading?"#define FLAT_SHADED":"",t.skinning?"#define USE_SKINNING":"",t.morphTargets?"#define USE_MORPHTARGETS":"",t.morphNormals&&t.flatShading===!1?"#define USE_MORPHNORMALS":"",t.morphColors?"#define USE_MORPHCOLORS":"",t.morphTargetsCount>0?"#define MORPHTARGETS_TEXTURE_STRIDE "+t.morphTextureStride:"",t.morphTargetsCount>0?"#define MORPHTARGETS_COUNT "+t.morphTargetsCount:"",t.doubleSided?"#define DOUBLE_SIDED":"",t.flipSided?"#define FLIP_SIDED":"",t.shadowMapEnabled?"#define USE_SHADOWMAP":"",t.shadowMapEnabled?"#define "+l:"",t.sizeAttenuation?"#define USE_SIZEATTENUATION":"",t.numLightProbes>0?"#define USE_LIGHT_PROBES":"",t.logarithmicDepthBuffer?"#define USE_LOGARITHMIC_DEPTH_BUFFER":"",t.reversedDepthBuffer?"#define USE_REVERSED_DEPTH_BUFFER":"","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",` +`].filter(Wr).join(` +`),p=[Qu(t),"#define SHADER_TYPE "+t.shaderType,"#define SHADER_NAME "+t.shaderName,g,t.useFog&&t.fog?"#define USE_FOG":"",t.useFog&&t.fogExp2?"#define FOG_EXP2":"",t.alphaToCoverage?"#define ALPHA_TO_COVERAGE":"",t.map?"#define USE_MAP":"",t.matcap?"#define USE_MATCAP":"",t.envMap?"#define USE_ENVMAP":"",t.envMap?"#define "+c:"",t.envMap?"#define "+h:"",t.envMap?"#define "+d:"",u?"#define CUBEUV_TEXEL_WIDTH "+u.texelWidth:"",u?"#define CUBEUV_TEXEL_HEIGHT "+u.texelHeight:"",u?"#define CUBEUV_MAX_MIP "+u.maxMip+".0":"",t.lightMap?"#define USE_LIGHTMAP":"",t.aoMap?"#define USE_AOMAP":"",t.bumpMap?"#define USE_BUMPMAP":"",t.normalMap?"#define USE_NORMALMAP":"",t.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",t.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",t.packedNormalMap?"#define USE_PACKED_NORMALMAP":"",t.emissiveMap?"#define USE_EMISSIVEMAP":"",t.anisotropy?"#define USE_ANISOTROPY":"",t.anisotropyMap?"#define USE_ANISOTROPYMAP":"",t.clearcoat?"#define USE_CLEARCOAT":"",t.clearcoatMap?"#define USE_CLEARCOATMAP":"",t.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",t.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",t.dispersion?"#define USE_DISPERSION":"",t.iridescence?"#define USE_IRIDESCENCE":"",t.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",t.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",t.specularMap?"#define USE_SPECULARMAP":"",t.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",t.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",t.roughnessMap?"#define USE_ROUGHNESSMAP":"",t.metalnessMap?"#define USE_METALNESSMAP":"",t.alphaMap?"#define USE_ALPHAMAP":"",t.alphaTest?"#define USE_ALPHATEST":"",t.alphaHash?"#define USE_ALPHAHASH":"",t.sheen?"#define USE_SHEEN":"",t.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",t.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",t.transmission?"#define USE_TRANSMISSION":"",t.transmissionMap?"#define USE_TRANSMISSIONMAP":"",t.thicknessMap?"#define USE_THICKNESSMAP":"",t.vertexTangents&&t.flatShading===!1?"#define USE_TANGENT":"",t.vertexColors||t.instancingColor?"#define USE_COLOR":"",t.vertexAlphas||t.batchingColor?"#define USE_COLOR_ALPHA":"",t.vertexUv1s?"#define USE_UV1":"",t.vertexUv2s?"#define USE_UV2":"",t.vertexUv3s?"#define USE_UV3":"",t.pointsUvs?"#define USE_POINTS_UV":"",t.gradientMap?"#define USE_GRADIENTMAP":"",t.flatShading?"#define FLAT_SHADED":"",t.doubleSided?"#define DOUBLE_SIDED":"",t.flipSided?"#define FLIP_SIDED":"",t.shadowMapEnabled?"#define USE_SHADOWMAP":"",t.shadowMapEnabled?"#define "+l:"",t.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",t.numLightProbes>0?"#define USE_LIGHT_PROBES":"",t.numLightProbeGrids>0?"#define USE_LIGHT_PROBES_GRID":"",t.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",t.decodeVideoTextureEmissive?"#define DECODE_VIDEO_TEXTURE_EMISSIVE":"",t.logarithmicDepthBuffer?"#define USE_LOGARITHMIC_DEPTH_BUFFER":"",t.reversedDepthBuffer?"#define USE_REVERSED_DEPTH_BUFFER":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",t.toneMapping!==yn?"#define TONE_MAPPING":"",t.toneMapping!==yn?ze.tonemapping_pars_fragment:"",t.toneMapping!==yn?I0("toneMapping",t.toneMapping):"",t.dithering?"#define DITHERING":"",t.opaque?"#define OPAQUE":"",ze.colorspace_pars_fragment,R0("linearToOutputTexel",t.outputColorSpace),P0(),t.useDepthPacking?"#define DEPTH_PACKING "+t.depthPacking:"",` +`].filter(Wr).join(` +`)),a=Ec(a),a=Ju(a,t),a=$u(a,t),o=Ec(o),o=Ju(o,t),o=$u(o,t),a=ju(a),o=ju(o),t.isRawShaderMaterial!==!0&&(S=`#version 300 es +`,m=[f,"#define attribute in","#define varying out","#define texture2D texture"].join(` +`)+` +`+m,p=["#define varying in",t.glslVersion===sc?"":"layout(location = 0) out highp vec4 pc_fragColor;",t.glslVersion===sc?"":"#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(` +`)+` +`+p);let E=S+m+a,v=S+p+o,A=Yu(i,i.VERTEX_SHADER,E),T=Yu(i,i.FRAGMENT_SHADER,v);i.attachShader(M,A),i.attachShader(M,T),t.index0AttributeName!==void 0?i.bindAttribLocation(M,0,t.index0AttributeName):t.hasPositionAttribute===!0&&i.bindAttribLocation(M,0,"position"),i.linkProgram(M);function R(I){if(s.debug.checkShaderErrors){let D=i.getProgramInfoLog(M)||"",X=i.getShaderInfoLog(A)||"",q=i.getShaderInfoLog(T)||"",O=D.trim(),H=X.trim(),G=q.trim(),$=!0,ie=!0;if(i.getProgramParameter(M,i.LINK_STATUS)===!1)if($=!1,typeof s.debug.onShaderError=="function")s.debug.onShaderError(i,M,A,T);else{let le=Ku(i,A,"vertex"),pe=Ku(i,T,"fragment");De("WebGLProgram: Shader Error "+i.getError()+" - VALIDATE_STATUS "+i.getProgramParameter(M,i.VALIDATE_STATUS)+` + +Material Name: `+I.name+` +Material Type: `+I.type+` + +Program Info Log: `+O+` +`+le+` +`+pe)}else O!==""?Ee("WebGLProgram: Program Info Log:",O):(H===""||G==="")&&(ie=!1);ie&&(I.diagnostics={runnable:$,programLog:O,vertexShader:{log:H,prefix:m},fragmentShader:{log:G,prefix:p}})}i.deleteShader(A),i.deleteShader(T),_=new Ns(i,M),b=D0(i,M)}let _;this.getUniforms=function(){return _===void 0&&R(this),_};let b;this.getAttributes=function(){return b===void 0&&R(this),b};let C=t.rendererExtensionParallelShaderCompile===!1;return this.isReady=function(){return C===!1&&(C=i.getProgramParameter(M,T0)),C},this.destroy=function(){n.releaseStatesOfProgram(this),i.deleteProgram(M),this.program=void 0},this.type=t.shaderType,this.name=t.shaderName,this.id=E0++,this.cacheKey=e,this.usedTimes=1,this.program=M,this.vertexShader=A,this.fragmentShader=T,this}var J0=0,Ac=class{constructor(){this.shaderCache=new Map,this.materialCache=new Map}update(e,t,n){let i=this._getShaderCacheForMaterial(e);return i.has(t)===!1&&(i.add(t),t.usedTimes++),i.has(n)===!1&&(i.add(n),n.usedTimes++),this}remove(e){let t=this.materialCache.get(e);for(let n of t)n.usedTimes--,n.usedTimes===0&&this.shaderCache.delete(n.code);return this.materialCache.delete(e),this}getVertexShaderStage(e){return this._getShaderStage(e.vertexShader)}getFragmentShaderStage(e){return this._getShaderStage(e.fragmentShader)}dispose(){this.shaderCache.clear(),this.materialCache.clear()}_getShaderCacheForMaterial(e){let t=this.materialCache,n=t.get(e);return n===void 0&&(n=new Set,t.set(e,n)),n}_getShaderStage(e){let t=this.shaderCache,n=t.get(e);return n===void 0&&(n=new wc(e),t.set(e,n)),n}},wc=class{constructor(e){this.id=J0++,this.code=e,this.usedTimes=0}};function $0(s){return s===xi||s===Or||s===Br}function j0(s,e,t,n,i,r){let a=new er,o=new Ac,l=new Set,c=[],h=new Map,d=n.logarithmicDepthBuffer,u=n.precision,f={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distance",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 g(_){return l.add(_),_===0?"uv":`uv${_}`}function M(_,b,C,I,D,X){let q=I.fog,O=D.geometry,H=_.isMeshStandardMaterial||_.isMeshLambertMaterial||_.isMeshPhongMaterial?I.environment:null,G=_.isMeshStandardMaterial||_.isMeshLambertMaterial&&!_.envMap||_.isMeshPhongMaterial&&!_.envMap,$=e.get(_.envMap||H,G),ie=$&&$.mapping===Lr?$.image.height:null,le=f[_.type];_.precision!==null&&(u=n.getMaxPrecision(_.precision),u!==_.precision&&Ee("WebGLProgram.getParameters:",_.precision,"not supported, using",u,"instead."));let pe=O.morphAttributes.position||O.morphAttributes.normal||O.morphAttributes.color,_e=pe!==void 0?pe.length:0,He=0;O.morphAttributes.position!==void 0&&(He=1),O.morphAttributes.normal!==void 0&&(He=2),O.morphAttributes.color!==void 0&&(He=3);let ht,Ye,J,re;if(le){let Se=On[le];ht=Se.vertexShader,Ye=Se.fragmentShader}else{ht=_.vertexShader,Ye=_.fragmentShader;let Se=o.getVertexShaderStage(_),gt=o.getFragmentShaderStage(_);o.update(_,Se,gt),J=Se.id,re=gt.id}let te=s.getRenderTarget(),Le=s.state.buffers.depth.getReversed(),Ne=D.isInstancedMesh===!0,Ae=D.isBatchedMesh===!0,tt=!!_.map,Pe=!!_.matcap,je=!!$,qe=!!_.aoMap,We=!!_.lightMap,ut=!!_.bumpMap&&_.wireframe===!1,pt=!!_.normalMap,mt=!!_.displacementMap,vt=!!_.emissiveMap,at=!!_.metalnessMap,dt=!!_.roughnessMap,N=_.anisotropy>0,Lt=_.clearcoat>0,Je=_.dispersion>0,w=_.iridescence>0,x=_.sheen>0,F=_.transmission>0,k=N&&!!_.anisotropyMap,W=Lt&&!!_.clearcoatMap,ne=Lt&&!!_.clearcoatNormalMap,ce=Lt&&!!_.clearcoatRoughnessMap,Z=w&&!!_.iridescenceMap,K=w&&!!_.iridescenceThicknessMap,he=x&&!!_.sheenColorMap,be=x&&!!_.sheenRoughnessMap,ue=!!_.specularMap,Q=!!_.specularColorMap,se=!!_.specularIntensityMap,ge=F&&!!_.transmissionMap,we=F&&!!_.thicknessMap,P=!!_.gradientMap,ee=!!_.alphaMap,Y=_.alphaTest>0,oe=!!_.alphaHash,ae=!!_.extensions,j=yn;_.toneMapped&&(te===null||te.isXRRenderTarget===!0)&&(j=s.toneMapping);let Re={shaderID:le,shaderType:_.type,shaderName:_.name,vertexShader:ht,fragmentShader:Ye,defines:_.defines,customVertexShaderID:J,customFragmentShaderID:re,isRawShaderMaterial:_.isRawShaderMaterial===!0,glslVersion:_.glslVersion,precision:u,batching:Ae,batchingColor:Ae&&D._colorsTexture!==null,instancing:Ne,instancingColor:Ne&&D.instanceColor!==null,instancingMorph:Ne&&D.morphTexture!==null,outputColorSpace:te===null?s.outputColorSpace:te.isXRRenderTarget===!0?te.texture.colorSpace:Be.workingColorSpace,alphaToCoverage:!!_.alphaToCoverage,map:tt,matcap:Pe,envMap:je,envMapMode:je&&$.mapping,envMapCubeUVHeight:ie,aoMap:qe,lightMap:We,bumpMap:ut,normalMap:pt,displacementMap:mt,emissiveMap:vt,normalMapObjectSpace:pt&&_.normalMapType===bu,normalMapTangentSpace:pt&&_.normalMapType===kr,packedNormalMap:pt&&_.normalMapType===kr&&$0(_.normalMap.format),metalnessMap:at,roughnessMap:dt,anisotropy:N,anisotropyMap:k,clearcoat:Lt,clearcoatMap:W,clearcoatNormalMap:ne,clearcoatRoughnessMap:ce,dispersion:Je,iridescence:w,iridescenceMap:Z,iridescenceThicknessMap:K,sheen:x,sheenColorMap:he,sheenRoughnessMap:be,specularMap:ue,specularColorMap:Q,specularIntensityMap:se,transmission:F,transmissionMap:ge,thicknessMap:we,gradientMap:P,opaque:_.transparent===!1&&_.blending===Ci&&_.alphaToCoverage===!1,alphaMap:ee,alphaTest:Y,alphaHash:oe,combine:_.combine,mapUv:tt&&g(_.map.channel),aoMapUv:qe&&g(_.aoMap.channel),lightMapUv:We&&g(_.lightMap.channel),bumpMapUv:ut&&g(_.bumpMap.channel),normalMapUv:pt&&g(_.normalMap.channel),displacementMapUv:mt&&g(_.displacementMap.channel),emissiveMapUv:vt&&g(_.emissiveMap.channel),metalnessMapUv:at&&g(_.metalnessMap.channel),roughnessMapUv:dt&&g(_.roughnessMap.channel),anisotropyMapUv:k&&g(_.anisotropyMap.channel),clearcoatMapUv:W&&g(_.clearcoatMap.channel),clearcoatNormalMapUv:ne&&g(_.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:ce&&g(_.clearcoatRoughnessMap.channel),iridescenceMapUv:Z&&g(_.iridescenceMap.channel),iridescenceThicknessMapUv:K&&g(_.iridescenceThicknessMap.channel),sheenColorMapUv:he&&g(_.sheenColorMap.channel),sheenRoughnessMapUv:be&&g(_.sheenRoughnessMap.channel),specularMapUv:ue&&g(_.specularMap.channel),specularColorMapUv:Q&&g(_.specularColorMap.channel),specularIntensityMapUv:se&&g(_.specularIntensityMap.channel),transmissionMapUv:ge&&g(_.transmissionMap.channel),thicknessMapUv:we&&g(_.thicknessMap.channel),alphaMapUv:ee&&g(_.alphaMap.channel),vertexTangents:!!O.attributes.tangent&&(pt||N),vertexNormals:!!O.attributes.normal,vertexColors:_.vertexColors,vertexAlphas:_.vertexColors===!0&&!!O.attributes.color&&O.attributes.color.itemSize===4,pointsUvs:D.isPoints===!0&&!!O.attributes.uv&&(tt||ee),fog:!!q,useFog:_.fog===!0,fogExp2:!!q&&q.isFogExp2,flatShading:_.wireframe===!1&&(_.flatShading===!0||O.attributes.normal===void 0&&pt===!1&&(_.isMeshLambertMaterial||_.isMeshPhongMaterial||_.isMeshStandardMaterial||_.isMeshPhysicalMaterial)),sizeAttenuation:_.sizeAttenuation===!0,logarithmicDepthBuffer:d,reversedDepthBuffer:Le,skinning:D.isSkinnedMesh===!0,hasPositionAttribute:O.attributes.position!==void 0,morphTargets:O.morphAttributes.position!==void 0,morphNormals:O.morphAttributes.normal!==void 0,morphColors:O.morphAttributes.color!==void 0,morphTargetsCount:_e,morphTextureStride:He,numDirLights:b.directional.length,numPointLights:b.point.length,numSpotLights:b.spot.length,numSpotLightMaps:b.spotLightMap.length,numRectAreaLights:b.rectArea.length,numHemiLights:b.hemi.length,numDirLightShadows:b.directionalShadowMap.length,numPointLightShadows:b.pointShadowMap.length,numSpotLightShadows:b.spotShadowMap.length,numSpotLightShadowsWithMaps:b.numSpotLightShadowsWithMaps,numLightProbes:b.numLightProbes,numLightProbeGrids:X.length,numClippingPlanes:r.numPlanes,numClipIntersection:r.numIntersection,dithering:_.dithering,shadowMapEnabled:s.shadowMap.enabled&&C.length>0,shadowMapType:s.shadowMap.type,toneMapping:j,decodeVideoTexture:tt&&_.map.isVideoTexture===!0&&Be.getTransfer(_.map.colorSpace)===$e,decodeVideoTextureEmissive:vt&&_.emissiveMap.isVideoTexture===!0&&Be.getTransfer(_.emissiveMap.colorSpace)===$e,premultipliedAlpha:_.premultipliedAlpha,doubleSided:_.side===$t,flipSided:_.side===Ft,useDepthPacking:_.depthPacking>=0,depthPacking:_.depthPacking||0,index0AttributeName:_.index0AttributeName,extensionClipCullDistance:ae&&_.extensions.clipCullDistance===!0&&t.has("WEBGL_clip_cull_distance"),extensionMultiDraw:(ae&&_.extensions.multiDraw===!0||Ae)&&t.has("WEBGL_multi_draw"),rendererExtensionParallelShaderCompile:t.has("KHR_parallel_shader_compile"),customProgramCacheKey:_.customProgramCacheKey()};return Re.vertexUv1s=l.has(1),Re.vertexUv2s=l.has(2),Re.vertexUv3s=l.has(3),l.clear(),Re}function m(_){let b=[];if(_.shaderID?b.push(_.shaderID):(b.push(_.customVertexShaderID),b.push(_.customFragmentShaderID)),_.defines!==void 0)for(let C in _.defines)b.push(C),b.push(_.defines[C]);return _.isRawShaderMaterial===!1&&(p(b,_),S(b,_),b.push(s.outputColorSpace)),b.push(_.customProgramCacheKey),b.join()}function p(_,b){_.push(b.precision),_.push(b.outputColorSpace),_.push(b.envMapMode),_.push(b.envMapCubeUVHeight),_.push(b.mapUv),_.push(b.alphaMapUv),_.push(b.lightMapUv),_.push(b.aoMapUv),_.push(b.bumpMapUv),_.push(b.normalMapUv),_.push(b.displacementMapUv),_.push(b.emissiveMapUv),_.push(b.metalnessMapUv),_.push(b.roughnessMapUv),_.push(b.anisotropyMapUv),_.push(b.clearcoatMapUv),_.push(b.clearcoatNormalMapUv),_.push(b.clearcoatRoughnessMapUv),_.push(b.iridescenceMapUv),_.push(b.iridescenceThicknessMapUv),_.push(b.sheenColorMapUv),_.push(b.sheenRoughnessMapUv),_.push(b.specularMapUv),_.push(b.specularColorMapUv),_.push(b.specularIntensityMapUv),_.push(b.transmissionMapUv),_.push(b.thicknessMapUv),_.push(b.combine),_.push(b.fogExp2),_.push(b.sizeAttenuation),_.push(b.morphTargetsCount),_.push(b.morphAttributeCount),_.push(b.numDirLights),_.push(b.numPointLights),_.push(b.numSpotLights),_.push(b.numSpotLightMaps),_.push(b.numHemiLights),_.push(b.numRectAreaLights),_.push(b.numDirLightShadows),_.push(b.numPointLightShadows),_.push(b.numSpotLightShadows),_.push(b.numSpotLightShadowsWithMaps),_.push(b.numLightProbes),_.push(b.shadowMapType),_.push(b.toneMapping),_.push(b.numClippingPlanes),_.push(b.numClipIntersection),_.push(b.depthPacking)}function S(_,b){a.disableAll(),b.instancing&&a.enable(0),b.instancingColor&&a.enable(1),b.instancingMorph&&a.enable(2),b.matcap&&a.enable(3),b.envMap&&a.enable(4),b.normalMapObjectSpace&&a.enable(5),b.normalMapTangentSpace&&a.enable(6),b.clearcoat&&a.enable(7),b.iridescence&&a.enable(8),b.alphaTest&&a.enable(9),b.vertexColors&&a.enable(10),b.vertexAlphas&&a.enable(11),b.vertexUv1s&&a.enable(12),b.vertexUv2s&&a.enable(13),b.vertexUv3s&&a.enable(14),b.vertexTangents&&a.enable(15),b.anisotropy&&a.enable(16),b.alphaHash&&a.enable(17),b.batching&&a.enable(18),b.dispersion&&a.enable(19),b.batchingColor&&a.enable(20),b.gradientMap&&a.enable(21),b.packedNormalMap&&a.enable(22),b.vertexNormals&&a.enable(23),_.push(a.mask),a.disableAll(),b.fog&&a.enable(0),b.useFog&&a.enable(1),b.flatShading&&a.enable(2),b.logarithmicDepthBuffer&&a.enable(3),b.reversedDepthBuffer&&a.enable(4),b.skinning&&a.enable(5),b.morphTargets&&a.enable(6),b.morphNormals&&a.enable(7),b.morphColors&&a.enable(8),b.premultipliedAlpha&&a.enable(9),b.shadowMapEnabled&&a.enable(10),b.doubleSided&&a.enable(11),b.flipSided&&a.enable(12),b.useDepthPacking&&a.enable(13),b.dithering&&a.enable(14),b.transmission&&a.enable(15),b.sheen&&a.enable(16),b.opaque&&a.enable(17),b.pointsUvs&&a.enable(18),b.decodeVideoTexture&&a.enable(19),b.decodeVideoTextureEmissive&&a.enable(20),b.alphaToCoverage&&a.enable(21),b.numLightProbeGrids>0&&a.enable(22),b.hasPositionAttribute&&a.enable(23),_.push(a.mask)}function E(_){let b=f[_.type],C;if(b){let I=On[b];C=ti.clone(I.uniforms)}else C=_.uniforms;return C}function v(_,b){let C=h.get(b);return C!==void 0?++C.usedTimes:(C=new K0(s,b,_,i),c.push(C),h.set(b,C)),C}function A(_){if(--_.usedTimes===0){let b=c.indexOf(_);c[b]=c[c.length-1],c.pop(),h.delete(_.cacheKey),_.destroy()}}function T(_){o.remove(_)}function R(){o.dispose()}return{getParameters:M,getProgramCacheKey:m,getUniforms:E,acquireProgram:v,releaseProgram:A,releaseShaderCache:T,programs:c,dispose:R}}function Q0(){let s=new WeakMap;function e(a){return s.has(a)}function t(a){let o=s.get(a);return o===void 0&&(o={},s.set(a,o)),o}function n(a){s.delete(a)}function i(a,o,l){s.get(a)[o]=l}function r(){s=new WeakMap}return{has:e,get:t,remove:n,update:i,dispose:r}}function e_(s,e){return s.groupOrder!==e.groupOrder?s.groupOrder-e.groupOrder:s.renderOrder!==e.renderOrder?s.renderOrder-e.renderOrder:s.material.id!==e.material.id?s.material.id-e.material.id:s.materialVariant!==e.materialVariant?s.materialVariant-e.materialVariant:s.z!==e.z?s.z-e.z:s.id-e.id}function ed(s,e){return s.groupOrder!==e.groupOrder?s.groupOrder-e.groupOrder:s.renderOrder!==e.renderOrder?s.renderOrder-e.renderOrder:s.z!==e.z?e.z-s.z:s.id-e.id}function td(){let s=[],e=0,t=[],n=[],i=[];function r(){e=0,t.length=0,n.length=0,i.length=0}function a(u){let f=0;return u.isInstancedMesh&&(f+=2),u.isSkinnedMesh&&(f+=1),f}function o(u,f,g,M,m,p){let S=s[e];return S===void 0?(S={id:u.id,object:u,geometry:f,material:g,materialVariant:a(u),groupOrder:M,renderOrder:u.renderOrder,z:m,group:p},s[e]=S):(S.id=u.id,S.object=u,S.geometry=f,S.material=g,S.materialVariant=a(u),S.groupOrder=M,S.renderOrder=u.renderOrder,S.z=m,S.group=p),e++,S}function l(u,f,g,M,m,p){let S=o(u,f,g,M,m,p);g.transmission>0?n.push(S):g.transparent===!0?i.push(S):t.push(S)}function c(u,f,g,M,m,p){let S=o(u,f,g,M,m,p);g.transmission>0?n.unshift(S):g.transparent===!0?i.unshift(S):t.unshift(S)}function h(u,f,g){t.length>1&&t.sort(u||e_),n.length>1&&n.sort(f||ed),i.length>1&&i.sort(f||ed),g&&(t.reverse(),n.reverse(),i.reverse())}function d(){for(let u=e,f=s.length;u=r.length?(a=new td,r.push(a)):a=r[i],a}function t(){s=new WeakMap}return{get:e,dispose:t}}function n_(){let s={};return{get:function(e){if(s[e.id]!==void 0)return s[e.id];let t;switch(e.type){case"DirectionalLight":t={direction:new L,color:new Me};break;case"SpotLight":t={position:new L,direction:new L,color:new Me,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":t={position:new L,color:new Me,distance:0,decay:0};break;case"HemisphereLight":t={direction:new L,skyColor:new Me,groundColor:new Me};break;case"RectAreaLight":t={color:new Me,position:new L,halfWidth:new L,halfHeight:new L};break}return s[e.id]=t,t}}}function i_(){let s={};return{get:function(e){if(s[e.id]!==void 0)return s[e.id];let t;switch(e.type){case"DirectionalLight":t={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new ye};break;case"SpotLight":t={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new ye};break;case"PointLight":t={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new ye,shadowCameraNear:1,shadowCameraFar:1e3};break}return s[e.id]=t,t}}}var s_=0;function r_(s,e){return(e.castShadow?2:0)-(s.castShadow?2:0)+(e.map?1:0)-(s.map?1:0)}function a_(s){let e=new n_,t=i_(),n={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 c=0;c<9;c++)n.probe.push(new L);let i=new L,r=new Oe,a=new Oe;function o(c){let h=0,d=0,u=0;for(let b=0;b<9;b++)n.probe[b].set(0,0,0);let f=0,g=0,M=0,m=0,p=0,S=0,E=0,v=0,A=0,T=0,R=0;c.sort(r_);for(let b=0,C=c.length;b0&&(s.has("OES_texture_float_linear")===!0?(n.rectAreaLTC1=de.LTC_FLOAT_1,n.rectAreaLTC2=de.LTC_FLOAT_2):(n.rectAreaLTC1=de.LTC_HALF_1,n.rectAreaLTC2=de.LTC_HALF_2)),n.ambient[0]=h,n.ambient[1]=d,n.ambient[2]=u;let _=n.hash;(_.directionalLength!==f||_.pointLength!==g||_.spotLength!==M||_.rectAreaLength!==m||_.hemiLength!==p||_.numDirectionalShadows!==S||_.numPointShadows!==E||_.numSpotShadows!==v||_.numSpotMaps!==A||_.numLightProbes!==R)&&(n.directional.length=f,n.spot.length=M,n.rectArea.length=m,n.point.length=g,n.hemi.length=p,n.directionalShadow.length=S,n.directionalShadowMap.length=S,n.pointShadow.length=E,n.pointShadowMap.length=E,n.spotShadow.length=v,n.spotShadowMap.length=v,n.directionalShadowMatrix.length=S,n.pointShadowMatrix.length=E,n.spotLightMatrix.length=v+A-T,n.spotLightMap.length=A,n.numSpotLightShadowsWithMaps=T,n.numLightProbes=R,_.directionalLength=f,_.pointLength=g,_.spotLength=M,_.rectAreaLength=m,_.hemiLength=p,_.numDirectionalShadows=S,_.numPointShadows=E,_.numSpotShadows=v,_.numSpotMaps=A,_.numLightProbes=R,n.version=s_++)}function l(c,h){let d=0,u=0,f=0,g=0,M=0,m=h.matrixWorldInverse;for(let p=0,S=c.length;p=a.length?(o=new nd(s),a.push(o)):o=a[r],o}function n(){e=new WeakMap}return{get:t,dispose:n}}var l_=`void main() { + gl_Position = vec4( position, 1.0 ); +}`,c_=`uniform sampler2D shadow_pass; +uniform vec2 resolution; +uniform float radius; +void main() { + const float samples = float( VSM_SAMPLES ); + float mean = 0.0; + float squared_mean = 0.0; + float uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 ); + float uvStart = samples <= 1.0 ? 0.0 : - 1.0; + for ( float i = 0.0; i < samples; i ++ ) { + float uvOffset = uvStart + i * uvStride; + #ifdef HORIZONTAL_PASS + vec2 distribution = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ).rg; + mean += distribution.x; + squared_mean += distribution.y * distribution.y + distribution.x * distribution.x; + #else + float depth = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ).r; + mean += depth; + squared_mean += depth * depth; + #endif + } + mean = mean / samples; + squared_mean = squared_mean / samples; + float std_dev = sqrt( max( 0.0, squared_mean - mean * mean ) ); + gl_FragColor = vec4( mean, std_dev, 0.0, 1.0 ); +}`,h_=[new L(1,0,0),new L(-1,0,0),new L(0,1,0),new L(0,-1,0),new L(0,0,1),new L(0,0,-1)],u_=[new L(0,-1,0),new L(0,-1,0),new L(0,0,1),new L(0,0,-1),new L(0,-1,0),new L(0,-1,0)],id=new Oe,Hr=new L,yc=new L;function d_(s,e,t){let n=new Ss,i=new ye,r=new ye,a=new et,o=new Va,l=new Ga,c={},h=t.maxTextureSize,d={[xn]:Ft,[Ft]:xn,[$t]:$t},u=new ft({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new ye},radius:{value:4}},vertexShader:l_,fragmentShader:c_}),f=u.clone();f.defines.HORIZONTAL_PASS=1;let g=new xt;g.setAttribute("position",new Rt(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));let M=new Ve(g,u),m=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=Er;let p=this.type;this.render=function(T,R,_){if(m.enabled===!1||m.autoUpdate===!1&&m.needsUpdate===!1||T.length===0)return;this.type===Qh&&(Ee("WebGLShadowMap: PCFSoftShadowMap has been deprecated. Using PCFShadowMap instead."),this.type=Er);let b=s.getRenderTarget(),C=s.getActiveCubeFace(),I=s.getActiveMipmapLevel(),D=s.state;D.setBlending(hn),D.buffers.depth.getReversed()===!0?D.buffers.color.setClear(0,0,0,0):D.buffers.color.setClear(1,1,1,1),D.buffers.depth.setTest(!0),D.setScissorTest(!1);let X=p!==this.type;X&&R.traverse(function(q){q.material&&(Array.isArray(q.material)?q.material.forEach(O=>O.needsUpdate=!0):q.material.needsUpdate=!0)});for(let q=0,O=T.length;qh||i.y>h)&&(i.x>h&&(r.x=Math.floor(h/$.x),i.x=r.x*$.x,G.mapSize.x=r.x),i.y>h&&(r.y=Math.floor(h/$.y),i.y=r.y*$.y,G.mapSize.y=r.y));let ie=s.state.buffers.depth.getReversed();if(G.camera._reversedDepth=ie,G.map===null||X===!0){if(G.map!==null&&(G.map.depthTexture!==null&&(G.map.depthTexture.dispose(),G.map.depthTexture=null),G.map.dispose()),this.type===ws){if(H.isPointLight){Ee("WebGLShadowMap: VSM shadow maps are not supported for PointLights. Use PCF or BasicShadowMap instead.");continue}G.map=new Ct(i.x,i.y,{format:xi,type:Vt,minFilter:Tt,magFilter:Tt,generateMipmaps:!1}),G.map.texture.name=H.name+".shadowMap",G.map.depthTexture=new Yn(i.x,i.y,sn),G.map.depthTexture.name=H.name+".shadowMapDepth",G.map.depthTexture.format=In,G.map.depthTexture.compareFunction=null,G.map.depthTexture.minFilter=bt,G.map.depthTexture.magFilter=bt}else H.isPointLight?(G.map=new Xo(i.x),G.map.depthTexture=new za(i.x,Sn)):(G.map=new Ct(i.x,i.y),G.map.depthTexture=new Yn(i.x,i.y,Sn)),G.map.depthTexture.name=H.name+".shadowMap",G.map.depthTexture.format=In,this.type===Er?(G.map.depthTexture.compareFunction=ie?Go:Vo,G.map.depthTexture.minFilter=Tt,G.map.depthTexture.magFilter=Tt):(G.map.depthTexture.compareFunction=null,G.map.depthTexture.minFilter=bt,G.map.depthTexture.magFilter=bt);G.camera.updateProjectionMatrix()}let le=G.map.isWebGLCubeRenderTarget?6:1;for(let pe=0;pe0||R.map&&R.alphaTest>0||R.alphaToCoverage===!0){let D=C.uuid,X=R.uuid,q=c[D];q===void 0&&(q={},c[D]=q);let O=q[X];O===void 0&&(O=C.clone(),q[X]=O,R.addEventListener("dispose",A)),C=O}if(C.visible=R.visible,C.wireframe=R.wireframe,b===ws?C.side=R.shadowSide!==null?R.shadowSide:R.side:C.side=R.shadowSide!==null?R.shadowSide:d[R.side],C.alphaMap=R.alphaMap,C.alphaTest=R.alphaToCoverage===!0?.5:R.alphaTest,C.map=R.map,C.clipShadows=R.clipShadows,C.clippingPlanes=R.clippingPlanes,C.clipIntersection=R.clipIntersection,C.displacementMap=R.displacementMap,C.displacementScale=R.displacementScale,C.displacementBias=R.displacementBias,C.wireframeLinewidth=R.wireframeLinewidth,C.linewidth=R.linewidth,_.isPointLight===!0&&C.isMeshDistanceMaterial===!0){let D=s.properties.get(C);D.light=_}return C}function v(T,R,_,b,C){if(T.visible===!1)return;if(T.layers.test(R.layers)&&(T.isMesh||T.isLine||T.isPoints)&&(T.castShadow||T.receiveShadow&&C===ws)&&(!T.frustumCulled||n.intersectsObject(T))){T.modelViewMatrix.multiplyMatrices(_.matrixWorldInverse,T.matrixWorld);let X=e.update(T),q=T.material;if(Array.isArray(q)){let O=X.groups;for(let H=0,G=O.length;H=1):ie.indexOf("OpenGL ES")!==-1&&($=parseFloat(/^OpenGL ES (\d)/.exec(ie)[1]),G=$>=2);let le=null,pe={},_e=s.getParameter(s.SCISSOR_BOX),He=s.getParameter(s.VIEWPORT),ht=new et().fromArray(_e),Ye=new et().fromArray(He);function J(P,ee,Y,oe){let ae=new Uint8Array(4),j=s.createTexture();s.bindTexture(P,j),s.texParameteri(P,s.TEXTURE_MIN_FILTER,s.NEAREST),s.texParameteri(P,s.TEXTURE_MAG_FILTER,s.NEAREST);for(let Re=0;Re"u"?!1:/OculusBrowser/g.test(navigator.userAgent),c=new ye,h=new WeakMap,d=new Set,u,f=new WeakMap,g=!1;try{g=typeof OffscreenCanvas<"u"&&new OffscreenCanvas(1,1).getContext("2d")!==null}catch{}function M(w,x){return g?new OffscreenCanvas(w,x):ps("canvas")}function m(w,x,F){let k=1,W=Je(w);if((W.width>F||W.height>F)&&(k=F/Math.max(W.width,W.height)),k<1)if(typeof HTMLImageElement<"u"&&w instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&w instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&w instanceof ImageBitmap||typeof VideoFrame<"u"&&w instanceof VideoFrame){let ne=Math.floor(k*W.width),ce=Math.floor(k*W.height);u===void 0&&(u=M(ne,ce));let Z=x?M(ne,ce):u;return Z.width=ne,Z.height=ce,Z.getContext("2d").drawImage(w,0,0,ne,ce),Ee("WebGLRenderer: Texture has been resized from ("+W.width+"x"+W.height+") to ("+ne+"x"+ce+")."),Z}else return"data"in w&&Ee("WebGLRenderer: Image in DataTexture is too big ("+W.width+"x"+W.height+")."),w;return w}function p(w){return w.generateMipmaps}function S(w){s.generateMipmap(w)}function E(w){return w.isWebGLCubeRenderTarget?s.TEXTURE_CUBE_MAP:w.isWebGL3DRenderTarget?s.TEXTURE_3D:w.isWebGLArrayRenderTarget||w.isCompressedArrayTexture?s.TEXTURE_2D_ARRAY:s.TEXTURE_2D}function v(w,x,F,k,W,ne=!1){if(w!==null){if(s[w]!==void 0)return s[w];Ee("WebGLRenderer: Attempt to use non-existing WebGL internal format '"+w+"'")}let ce;k&&(ce=e.get("EXT_texture_norm16"),ce||Ee("WebGLRenderer: Unable to use normalized textures without EXT_texture_norm16 extension"));let Z=x;if(x===s.RED&&(F===s.FLOAT&&(Z=s.R32F),F===s.HALF_FLOAT&&(Z=s.R16F),F===s.UNSIGNED_BYTE&&(Z=s.R8),F===s.UNSIGNED_SHORT&&ce&&(Z=ce.R16_EXT),F===s.SHORT&&ce&&(Z=ce.R16_SNORM_EXT)),x===s.RED_INTEGER&&(F===s.UNSIGNED_BYTE&&(Z=s.R8UI),F===s.UNSIGNED_SHORT&&(Z=s.R16UI),F===s.UNSIGNED_INT&&(Z=s.R32UI),F===s.BYTE&&(Z=s.R8I),F===s.SHORT&&(Z=s.R16I),F===s.INT&&(Z=s.R32I)),x===s.RG&&(F===s.FLOAT&&(Z=s.RG32F),F===s.HALF_FLOAT&&(Z=s.RG16F),F===s.UNSIGNED_BYTE&&(Z=s.RG8),F===s.UNSIGNED_SHORT&&ce&&(Z=ce.RG16_EXT),F===s.SHORT&&ce&&(Z=ce.RG16_SNORM_EXT)),x===s.RG_INTEGER&&(F===s.UNSIGNED_BYTE&&(Z=s.RG8UI),F===s.UNSIGNED_SHORT&&(Z=s.RG16UI),F===s.UNSIGNED_INT&&(Z=s.RG32UI),F===s.BYTE&&(Z=s.RG8I),F===s.SHORT&&(Z=s.RG16I),F===s.INT&&(Z=s.RG32I)),x===s.RGB_INTEGER&&(F===s.UNSIGNED_BYTE&&(Z=s.RGB8UI),F===s.UNSIGNED_SHORT&&(Z=s.RGB16UI),F===s.UNSIGNED_INT&&(Z=s.RGB32UI),F===s.BYTE&&(Z=s.RGB8I),F===s.SHORT&&(Z=s.RGB16I),F===s.INT&&(Z=s.RGB32I)),x===s.RGBA_INTEGER&&(F===s.UNSIGNED_BYTE&&(Z=s.RGBA8UI),F===s.UNSIGNED_SHORT&&(Z=s.RGBA16UI),F===s.UNSIGNED_INT&&(Z=s.RGBA32UI),F===s.BYTE&&(Z=s.RGBA8I),F===s.SHORT&&(Z=s.RGBA16I),F===s.INT&&(Z=s.RGBA32I)),x===s.RGB&&(F===s.UNSIGNED_SHORT&&ce&&(Z=ce.RGB16_EXT),F===s.SHORT&&ce&&(Z=ce.RGB16_SNORM_EXT),F===s.UNSIGNED_INT_5_9_9_9_REV&&(Z=s.RGB9_E5),F===s.UNSIGNED_INT_10F_11F_11F_REV&&(Z=s.R11F_G11F_B10F)),x===s.RGBA){let K=ne?$s:Be.getTransfer(W);F===s.FLOAT&&(Z=s.RGBA32F),F===s.HALF_FLOAT&&(Z=s.RGBA16F),F===s.UNSIGNED_BYTE&&(Z=K===$e?s.SRGB8_ALPHA8:s.RGBA8),F===s.UNSIGNED_SHORT&&ce&&(Z=ce.RGBA16_EXT),F===s.SHORT&&ce&&(Z=ce.RGBA16_SNORM_EXT),F===s.UNSIGNED_SHORT_4_4_4_4&&(Z=s.RGBA4),F===s.UNSIGNED_SHORT_5_5_5_1&&(Z=s.RGB5_A1)}return(Z===s.R16F||Z===s.R32F||Z===s.RG16F||Z===s.RG32F||Z===s.RGBA16F||Z===s.RGBA32F)&&e.get("EXT_color_buffer_float"),Z}function A(w,x){let F;return w?x===null||x===Sn||x===Is?F=s.DEPTH24_STENCIL8:x===sn?F=s.DEPTH32F_STENCIL8:x===Cs&&(F=s.DEPTH24_STENCIL8,Ee("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.")):x===null||x===Sn||x===Is?F=s.DEPTH_COMPONENT24:x===sn?F=s.DEPTH_COMPONENT32F:x===Cs&&(F=s.DEPTH_COMPONENT16),F}function T(w,x){return p(w)===!0||w.isFramebufferTexture&&w.minFilter!==bt&&w.minFilter!==Tt?Math.log2(Math.max(x.width,x.height))+1:w.mipmaps!==void 0&&w.mipmaps.length>0?w.mipmaps.length:w.isCompressedTexture&&Array.isArray(w.image)?x.mipmaps.length:1}function R(w){let x=w.target;x.removeEventListener("dispose",R),b(x),x.isVideoTexture&&h.delete(x),x.isHTMLTexture&&d.delete(x)}function _(w){let x=w.target;x.removeEventListener("dispose",_),I(x)}function b(w){let x=n.get(w);if(x.__webglInit===void 0)return;let F=w.source,k=f.get(F);if(k){let W=k[x.__cacheKey];W.usedTimes--,W.usedTimes===0&&C(w),Object.keys(k).length===0&&f.delete(F)}n.remove(w)}function C(w){let x=n.get(w);s.deleteTexture(x.__webglTexture);let F=w.source,k=f.get(F);delete k[x.__cacheKey],a.memory.textures--}function I(w){let x=n.get(w);if(w.depthTexture&&(w.depthTexture.dispose(),n.remove(w.depthTexture)),w.isWebGLCubeRenderTarget)for(let k=0;k<6;k++){if(Array.isArray(x.__webglFramebuffer[k]))for(let W=0;W=i.maxTextures&&Ee("WebGLTextures: Trying to use "+w+" texture units while this GPU supports only "+i.maxTextures),D+=1,w}function G(w){let x=[];return x.push(w.wrapS),x.push(w.wrapT),x.push(w.wrapR||0),x.push(w.magFilter),x.push(w.minFilter),x.push(w.anisotropy),x.push(w.internalFormat),x.push(w.format),x.push(w.type),x.push(w.generateMipmaps),x.push(w.premultiplyAlpha),x.push(w.flipY),x.push(w.unpackAlignment),x.push(w.colorSpace),x.join()}function $(w,x){let F=n.get(w);if(w.isVideoTexture&&N(w),w.isRenderTargetTexture===!1&&w.isExternalTexture!==!0&&w.version>0&&F.__version!==w.version){let k=w.image;if(k===null)Ee("WebGLRenderer: Texture marked for update but no image data found.");else if(k.complete===!1)Ee("WebGLRenderer: Texture marked for update but image is incomplete");else{Le(F,w,x);return}}else w.isExternalTexture&&(F.__webglTexture=w.sourceTexture?w.sourceTexture:null);t.bindTexture(s.TEXTURE_2D,F.__webglTexture,s.TEXTURE0+x)}function ie(w,x){let F=n.get(w);if(w.isRenderTargetTexture===!1&&w.version>0&&F.__version!==w.version){Le(F,w,x);return}else w.isExternalTexture&&(F.__webglTexture=w.sourceTexture?w.sourceTexture:null);t.bindTexture(s.TEXTURE_2D_ARRAY,F.__webglTexture,s.TEXTURE0+x)}function le(w,x){let F=n.get(w);if(w.isRenderTargetTexture===!1&&w.version>0&&F.__version!==w.version){Le(F,w,x);return}t.bindTexture(s.TEXTURE_3D,F.__webglTexture,s.TEXTURE0+x)}function pe(w,x){let F=n.get(w);if(w.isCubeDepthTexture!==!0&&w.version>0&&F.__version!==w.version){Ne(F,w,x);return}t.bindTexture(s.TEXTURE_CUBE_MAP,F.__webglTexture,s.TEXTURE0+x)}let _e={[fi]:s.REPEAT,[cn]:s.CLAMP_TO_EDGE,[ds]:s.MIRRORED_REPEAT},He={[bt]:s.NEAREST,[no]:s.NEAREST_MIPMAP_NEAREST,[Xi]:s.NEAREST_MIPMAP_LINEAR,[Tt]:s.LINEAR,[Rs]:s.LINEAR_MIPMAP_NEAREST,[Mn]:s.LINEAR_MIPMAP_LINEAR},ht={[Tu]:s.NEVER,[Cu]:s.ALWAYS,[Eu]:s.LESS,[Vo]:s.LEQUAL,[Au]:s.EQUAL,[Go]:s.GEQUAL,[wu]:s.GREATER,[Ru]:s.NOTEQUAL};function Ye(w,x){if(x.type===sn&&e.has("OES_texture_float_linear")===!1&&(x.magFilter===Tt||x.magFilter===Rs||x.magFilter===Xi||x.magFilter===Mn||x.minFilter===Tt||x.minFilter===Rs||x.minFilter===Xi||x.minFilter===Mn)&&Ee("WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device."),s.texParameteri(w,s.TEXTURE_WRAP_S,_e[x.wrapS]),s.texParameteri(w,s.TEXTURE_WRAP_T,_e[x.wrapT]),(w===s.TEXTURE_3D||w===s.TEXTURE_2D_ARRAY)&&s.texParameteri(w,s.TEXTURE_WRAP_R,_e[x.wrapR]),s.texParameteri(w,s.TEXTURE_MAG_FILTER,He[x.magFilter]),s.texParameteri(w,s.TEXTURE_MIN_FILTER,He[x.minFilter]),x.compareFunction&&(s.texParameteri(w,s.TEXTURE_COMPARE_MODE,s.COMPARE_REF_TO_TEXTURE),s.texParameteri(w,s.TEXTURE_COMPARE_FUNC,ht[x.compareFunction])),e.has("EXT_texture_filter_anisotropic")===!0){if(x.magFilter===bt||x.minFilter!==Xi&&x.minFilter!==Mn||x.type===sn&&e.has("OES_texture_float_linear")===!1)return;if(x.anisotropy>1||n.get(x).__currentAnisotropy){let F=e.get("EXT_texture_filter_anisotropic");s.texParameterf(w,F.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(x.anisotropy,i.getMaxAnisotropy())),n.get(x).__currentAnisotropy=x.anisotropy}}}function J(w,x){let F=!1;w.__webglInit===void 0&&(w.__webglInit=!0,x.addEventListener("dispose",R));let k=x.source,W=f.get(k);W===void 0&&(W={},f.set(k,W));let ne=G(x);if(ne!==w.__cacheKey){W[ne]===void 0&&(W[ne]={texture:s.createTexture(),usedTimes:0},a.memory.textures++,F=!0),W[ne].usedTimes++;let ce=W[w.__cacheKey];ce!==void 0&&(W[w.__cacheKey].usedTimes--,ce.usedTimes===0&&C(x)),w.__cacheKey=ne,w.__webglTexture=W[ne].texture}return F}function re(w,x,F){return Math.floor(Math.floor(w/F)/x)}function te(w,x,F,k){let ne=w.updateRanges;if(ne.length===0)t.texSubImage2D(s.TEXTURE_2D,0,0,0,x.width,x.height,F,k,x.data);else{ne.sort((be,ue)=>be.start-ue.start);let ce=0;for(let be=1;be0){ge&&we&&t.texStorage2D(s.TEXTURE_2D,ee,ue,se[0].width,se[0].height);for(let Y=0,oe=se.length;Y0){let ae=cc(Q.width,Q.height,x.format,x.type);for(let j of x.layerUpdates){let Re=Q.data.subarray(j*ae/Q.data.BYTES_PER_ELEMENT,(j+1)*ae/Q.data.BYTES_PER_ELEMENT);t.compressedTexSubImage3D(s.TEXTURE_2D_ARRAY,Y,0,0,j,Q.width,Q.height,1,he,Re)}x.clearLayerUpdates()}else t.compressedTexSubImage3D(s.TEXTURE_2D_ARRAY,Y,0,0,0,Q.width,Q.height,K.depth,he,Q.data)}else t.compressedTexImage3D(s.TEXTURE_2D_ARRAY,Y,ue,Q.width,Q.height,K.depth,0,Q.data,0,0);else Ee("WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()");else ge?P&&t.texSubImage3D(s.TEXTURE_2D_ARRAY,Y,0,0,0,Q.width,Q.height,K.depth,he,be,Q.data):t.texImage3D(s.TEXTURE_2D_ARRAY,Y,ue,Q.width,Q.height,K.depth,0,he,be,Q.data)}else{ge&&we&&t.texStorage2D(s.TEXTURE_2D,ee,ue,se[0].width,se[0].height);for(let Y=0,oe=se.length;Y0){let Y=cc(K.width,K.height,x.format,x.type);for(let oe of x.layerUpdates){let ae=K.data.subarray(oe*Y/K.data.BYTES_PER_ELEMENT,(oe+1)*Y/K.data.BYTES_PER_ELEMENT);t.texSubImage3D(s.TEXTURE_2D_ARRAY,0,0,0,oe,K.width,K.height,1,he,be,ae)}x.clearLayerUpdates()}else t.texSubImage3D(s.TEXTURE_2D_ARRAY,0,0,0,0,K.width,K.height,K.depth,he,be,K.data)}else t.texImage3D(s.TEXTURE_2D_ARRAY,0,ue,K.width,K.height,K.depth,0,he,be,K.data);else if(x.isData3DTexture)ge?(we&&t.texStorage3D(s.TEXTURE_3D,ee,ue,K.width,K.height,K.depth),P&&t.texSubImage3D(s.TEXTURE_3D,0,0,0,0,K.width,K.height,K.depth,he,be,K.data)):t.texImage3D(s.TEXTURE_3D,0,ue,K.width,K.height,K.depth,0,he,be,K.data);else if(x.isFramebufferTexture){if(we)if(ge)t.texStorage2D(s.TEXTURE_2D,ee,ue,K.width,K.height);else{let Y=K.width,oe=K.height;for(let ae=0;ae>=1,oe>>=1}}else if(x.isHTMLTexture){if("texElementImage2D"in s){let Y=s.canvas;if(Y.hasAttribute("layoutsubtree")||Y.setAttribute("layoutsubtree","true"),K.parentNode!==Y){Y.appendChild(K),d.add(x),Y.onpaint=oe=>{let ae=oe.changedElements;for(let j of d)ae.includes(j.image)&&(j.needsUpdate=!0)},Y.requestPaint();return}if(s.texElementImage2D.length===3)s.texElementImage2D(s.TEXTURE_2D,s.RGBA8,K);else{let ae=s.RGBA,j=s.RGBA,Re=s.UNSIGNED_BYTE;s.texElementImage2D(s.TEXTURE_2D,0,ae,j,Re,K)}s.texParameteri(s.TEXTURE_2D,s.TEXTURE_MIN_FILTER,s.LINEAR),s.texParameteri(s.TEXTURE_2D,s.TEXTURE_WRAP_S,s.CLAMP_TO_EDGE),s.texParameteri(s.TEXTURE_2D,s.TEXTURE_WRAP_T,s.CLAMP_TO_EDGE)}}else if(se.length>0){if(ge&&we){let Y=Je(se[0]);t.texStorage2D(s.TEXTURE_2D,ee,ue,Y.width,Y.height)}for(let Y=0,oe=se.length;Y0&&oe++;let j=Je(ue[0]);t.texStorage2D(s.TEXTURE_CUBE_MAP,oe,we,j.width,j.height)}for(let j=0;j<6;j++)if(be){P?Y&&t.texSubImage2D(s.TEXTURE_CUBE_MAP_POSITIVE_X+j,0,0,0,ue[j].width,ue[j].height,se,ge,ue[j].data):t.texImage2D(s.TEXTURE_CUBE_MAP_POSITIVE_X+j,0,we,ue[j].width,ue[j].height,0,se,ge,ue[j].data);for(let Re=0;Re>ne),Q=Math.max(1,x.height>>ne);W===s.TEXTURE_3D||W===s.TEXTURE_2D_ARRAY?t.texImage3D(W,ne,K,ue,Q,x.depth,0,ce,Z,null):t.texImage2D(W,ne,K,ue,Q,0,ce,Z,null)}t.bindFramebuffer(s.FRAMEBUFFER,w),dt(x)?o.framebufferTexture2DMultisampleEXT(s.FRAMEBUFFER,k,W,be.__webglTexture,0,at(x)):(W===s.TEXTURE_2D||W>=s.TEXTURE_CUBE_MAP_POSITIVE_X&&W<=s.TEXTURE_CUBE_MAP_NEGATIVE_Z)&&s.framebufferTexture2D(s.FRAMEBUFFER,k,W,be.__webglTexture,ne),t.bindFramebuffer(s.FRAMEBUFFER,null)}function tt(w,x,F){if(s.bindRenderbuffer(s.RENDERBUFFER,w),x.depthBuffer){let k=x.depthTexture,W=k&&k.isDepthTexture?k.type:null,ne=A(x.stencilBuffer,W),ce=x.stencilBuffer?s.DEPTH_STENCIL_ATTACHMENT:s.DEPTH_ATTACHMENT;dt(x)?o.renderbufferStorageMultisampleEXT(s.RENDERBUFFER,at(x),ne,x.width,x.height):F?s.renderbufferStorageMultisample(s.RENDERBUFFER,at(x),ne,x.width,x.height):s.renderbufferStorage(s.RENDERBUFFER,ne,x.width,x.height),s.framebufferRenderbuffer(s.FRAMEBUFFER,ce,s.RENDERBUFFER,w)}else{let k=x.textures;for(let W=0;W{delete x.__boundDepthTexture,delete x.__depthDisposeCallback,k.removeEventListener("dispose",W)};k.addEventListener("dispose",W),x.__depthDisposeCallback=W}x.__boundDepthTexture=k}if(w.depthTexture&&!x.__autoAllocateDepthBuffer)if(F)for(let k=0;k<6;k++)Pe(x.__webglFramebuffer[k],w,k);else{let k=w.texture.mipmaps;k&&k.length>0?Pe(x.__webglFramebuffer[0],w,0):Pe(x.__webglFramebuffer,w,0)}else if(F){x.__webglDepthbuffer=[];for(let k=0;k<6;k++)if(t.bindFramebuffer(s.FRAMEBUFFER,x.__webglFramebuffer[k]),x.__webglDepthbuffer[k]===void 0)x.__webglDepthbuffer[k]=s.createRenderbuffer(),tt(x.__webglDepthbuffer[k],w,!1);else{let W=w.stencilBuffer?s.DEPTH_STENCIL_ATTACHMENT:s.DEPTH_ATTACHMENT,ne=x.__webglDepthbuffer[k];s.bindRenderbuffer(s.RENDERBUFFER,ne),s.framebufferRenderbuffer(s.FRAMEBUFFER,W,s.RENDERBUFFER,ne)}}else{let k=w.texture.mipmaps;if(k&&k.length>0?t.bindFramebuffer(s.FRAMEBUFFER,x.__webglFramebuffer[0]):t.bindFramebuffer(s.FRAMEBUFFER,x.__webglFramebuffer),x.__webglDepthbuffer===void 0)x.__webglDepthbuffer=s.createRenderbuffer(),tt(x.__webglDepthbuffer,w,!1);else{let W=w.stencilBuffer?s.DEPTH_STENCIL_ATTACHMENT:s.DEPTH_ATTACHMENT,ne=x.__webglDepthbuffer;s.bindRenderbuffer(s.RENDERBUFFER,ne),s.framebufferRenderbuffer(s.FRAMEBUFFER,W,s.RENDERBUFFER,ne)}}t.bindFramebuffer(s.FRAMEBUFFER,null)}function qe(w,x,F){let k=n.get(w);x!==void 0&&Ae(k.__webglFramebuffer,w,w.texture,s.COLOR_ATTACHMENT0,s.TEXTURE_2D,0),F!==void 0&&je(w)}function We(w){let x=w.texture,F=n.get(w),k=n.get(x);w.addEventListener("dispose",_);let W=w.textures,ne=w.isWebGLCubeRenderTarget===!0,ce=W.length>1;if(ce||(k.__webglTexture===void 0&&(k.__webglTexture=s.createTexture()),k.__version=x.version,a.memory.textures++),ne){F.__webglFramebuffer=[];for(let Z=0;Z<6;Z++)if(x.mipmaps&&x.mipmaps.length>0){F.__webglFramebuffer[Z]=[];for(let K=0;K0){F.__webglFramebuffer=[];for(let Z=0;Z0&&dt(w)===!1){F.__webglMultisampledFramebuffer=s.createFramebuffer(),F.__webglColorRenderbuffer=[],t.bindFramebuffer(s.FRAMEBUFFER,F.__webglMultisampledFramebuffer);for(let Z=0;Z0)for(let K=0;K0)for(let K=0;K0){if(dt(w)===!1){let x=w.textures,F=w.width,k=w.height,W=s.COLOR_BUFFER_BIT,ne=w.stencilBuffer?s.DEPTH_STENCIL_ATTACHMENT:s.DEPTH_ATTACHMENT,ce=n.get(w),Z=x.length>1;if(Z)for(let he=0;he0?t.bindFramebuffer(s.DRAW_FRAMEBUFFER,ce.__webglFramebuffer[0]):t.bindFramebuffer(s.DRAW_FRAMEBUFFER,ce.__webglFramebuffer);for(let he=0;he0&&e.has("WEBGL_multisampled_render_to_texture")===!0&&x.__useRenderToTexture!==!1}function N(w){let x=a.render.frame;h.get(w)!==x&&(h.set(w,x),w.update())}function Lt(w,x){let F=w.colorSpace,k=w.format,W=w.type;return w.isCompressedTexture===!0||w.isVideoTexture===!0||F!==Wt&&F!==ei&&(Be.getTransfer(F)===$e?(k!==rn||W!==jt)&&Ee("WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):De("WebGLTextures: Unsupported texture color space:",F)),x}function Je(w){return typeof HTMLImageElement<"u"&&w instanceof HTMLImageElement?(c.width=w.naturalWidth||w.width,c.height=w.naturalHeight||w.height):typeof VideoFrame<"u"&&w instanceof VideoFrame?(c.width=w.displayWidth,c.height=w.displayHeight):(c.width=w.width,c.height=w.height),c}this.allocateTextureUnit=H,this.resetTextureUnits=X,this.getTextureUnits=q,this.setTextureUnits=O,this.setTexture2D=$,this.setTexture2DArray=ie,this.setTexture3D=le,this.setTextureCube=pe,this.rebindTextures=qe,this.setupRenderTarget=We,this.updateRenderTargetMipmap=ut,this.updateMultisampleRenderTarget=vt,this.setupDepthRenderbuffer=je,this.setupFrameBufferTexture=Ae,this.useMultisampledRTT=dt,this.isReversedDepthBuffer=function(){return t.buffers.depth.getReversed()}}function m_(s,e){function t(n,i=ei){let r,a=Be.getTransfer(i);if(n===jt)return s.UNSIGNED_BYTE;if(n===so)return s.UNSIGNED_SHORT_4_4_4_4;if(n===ro)return s.UNSIGNED_SHORT_5_5_5_1;if(n===Ql)return s.UNSIGNED_INT_5_9_9_9_REV;if(n===ec)return s.UNSIGNED_INT_10F_11F_11F_REV;if(n===$l)return s.BYTE;if(n===jl)return s.SHORT;if(n===Cs)return s.UNSIGNED_SHORT;if(n===io)return s.INT;if(n===Sn)return s.UNSIGNED_INT;if(n===sn)return s.FLOAT;if(n===Vt)return s.HALF_FLOAT;if(n===tc)return s.ALPHA;if(n===nc)return s.RGB;if(n===rn)return s.RGBA;if(n===In)return s.DEPTH_COMPONENT;if(n===_i)return s.DEPTH_STENCIL;if(n===ao)return s.RED;if(n===oo)return s.RED_INTEGER;if(n===xi)return s.RG;if(n===lo)return s.RG_INTEGER;if(n===co)return s.RGBA_INTEGER;if(n===Nr||n===Dr||n===Ur||n===Fr)if(a===$e)if(r=e.get("WEBGL_compressed_texture_s3tc_srgb"),r!==null){if(n===Nr)return r.COMPRESSED_SRGB_S3TC_DXT1_EXT;if(n===Dr)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;if(n===Ur)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;if(n===Fr)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}else return null;else if(r=e.get("WEBGL_compressed_texture_s3tc"),r!==null){if(n===Nr)return r.COMPRESSED_RGB_S3TC_DXT1_EXT;if(n===Dr)return r.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(n===Ur)return r.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(n===Fr)return r.COMPRESSED_RGBA_S3TC_DXT5_EXT}else return null;if(n===ho||n===uo||n===fo||n===po)if(r=e.get("WEBGL_compressed_texture_pvrtc"),r!==null){if(n===ho)return r.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(n===uo)return r.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(n===fo)return r.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(n===po)return r.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}else return null;if(n===mo||n===go||n===_o||n===xo||n===vo||n===Or||n===yo)if(r=e.get("WEBGL_compressed_texture_etc"),r!==null){if(n===mo||n===go)return a===$e?r.COMPRESSED_SRGB8_ETC2:r.COMPRESSED_RGB8_ETC2;if(n===_o)return a===$e?r.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:r.COMPRESSED_RGBA8_ETC2_EAC;if(n===xo)return r.COMPRESSED_R11_EAC;if(n===vo)return r.COMPRESSED_SIGNED_R11_EAC;if(n===Or)return r.COMPRESSED_RG11_EAC;if(n===yo)return r.COMPRESSED_SIGNED_RG11_EAC}else return null;if(n===Mo||n===So||n===bo||n===To||n===Eo||n===Ao||n===wo||n===Ro||n===Co||n===Io||n===Po||n===Lo||n===No||n===Do)if(r=e.get("WEBGL_compressed_texture_astc"),r!==null){if(n===Mo)return a===$e?r.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:r.COMPRESSED_RGBA_ASTC_4x4_KHR;if(n===So)return a===$e?r.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:r.COMPRESSED_RGBA_ASTC_5x4_KHR;if(n===bo)return a===$e?r.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:r.COMPRESSED_RGBA_ASTC_5x5_KHR;if(n===To)return a===$e?r.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:r.COMPRESSED_RGBA_ASTC_6x5_KHR;if(n===Eo)return a===$e?r.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:r.COMPRESSED_RGBA_ASTC_6x6_KHR;if(n===Ao)return a===$e?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:r.COMPRESSED_RGBA_ASTC_8x5_KHR;if(n===wo)return a===$e?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:r.COMPRESSED_RGBA_ASTC_8x6_KHR;if(n===Ro)return a===$e?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:r.COMPRESSED_RGBA_ASTC_8x8_KHR;if(n===Co)return a===$e?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:r.COMPRESSED_RGBA_ASTC_10x5_KHR;if(n===Io)return a===$e?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:r.COMPRESSED_RGBA_ASTC_10x6_KHR;if(n===Po)return a===$e?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:r.COMPRESSED_RGBA_ASTC_10x8_KHR;if(n===Lo)return a===$e?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:r.COMPRESSED_RGBA_ASTC_10x10_KHR;if(n===No)return a===$e?r.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:r.COMPRESSED_RGBA_ASTC_12x10_KHR;if(n===Do)return a===$e?r.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:r.COMPRESSED_RGBA_ASTC_12x12_KHR}else return null;if(n===Uo||n===Fo||n===Oo)if(r=e.get("EXT_texture_compression_bptc"),r!==null){if(n===Uo)return a===$e?r.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT:r.COMPRESSED_RGBA_BPTC_UNORM_EXT;if(n===Fo)return r.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;if(n===Oo)return r.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT}else return null;if(n===Bo||n===zo||n===Br||n===ko)if(r=e.get("EXT_texture_compression_rgtc"),r!==null){if(n===Bo)return r.COMPRESSED_RED_RGTC1_EXT;if(n===zo)return r.COMPRESSED_SIGNED_RED_RGTC1_EXT;if(n===Br)return r.COMPRESSED_RED_GREEN_RGTC2_EXT;if(n===ko)return r.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT}else return null;return n===Is?s.UNSIGNED_INT_24_8:s[n]!==void 0?s[n]:null}return{convert:t}}var g_=` +void main() { + + gl_Position = vec4( position, 1.0 ); + +}`,__=` +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; + + } + +}`,Rc=class{constructor(){this.texture=null,this.mesh=null,this.depthNear=0,this.depthFar=0}init(e,t){if(this.texture===null){let n=new hr(e.texture);(e.depthNear!==t.depthNear||e.depthFar!==t.depthFar)&&(this.depthNear=e.depthNear,this.depthFar=e.depthFar),this.texture=n}}getMesh(e){if(this.texture!==null&&this.mesh===null){let t=e.cameras[0].viewport,n=new ft({vertexShader:g_,fragmentShader:__,uniforms:{depthColor:{value:this.texture},depthWidth:{value:t.z},depthHeight:{value:t.w}}});this.mesh=new Ve(new zi(20,20),n)}return this.mesh}reset(){this.texture=null,this.mesh=null}getDepthTexture(){return this.texture}},Cc=class extends Pn{constructor(e,t){super();let n=this,i=null,r=1,a=null,o="local-floor",l=1,c=null,h=null,d=null,u=null,f=null,g=null,M=typeof XRWebGLBinding<"u",m=new Rc,p={},S=t.getContextAttributes(),E=null,v=null,A=[],T=[],R=new ye,_=null,b=new wt;b.viewport=new et;let C=new wt;C.viewport=new et;let I=[b,C],D=new $a,X=null,q=null;this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(J){let re=A[J];return re===void 0&&(re=new _s,A[J]=re),re.getTargetRaySpace()},this.getControllerGrip=function(J){let re=A[J];return re===void 0&&(re=new _s,A[J]=re),re.getGripSpace()},this.getHand=function(J){let re=A[J];return re===void 0&&(re=new _s,A[J]=re),re.getHandSpace()};function O(J){let re=T.indexOf(J.inputSource);if(re===-1)return;let te=A[re];te!==void 0&&(te.update(J.inputSource,J.frame,c||a),te.dispatchEvent({type:J.type,data:J.inputSource}))}function H(){i.removeEventListener("select",O),i.removeEventListener("selectstart",O),i.removeEventListener("selectend",O),i.removeEventListener("squeeze",O),i.removeEventListener("squeezestart",O),i.removeEventListener("squeezeend",O),i.removeEventListener("end",H),i.removeEventListener("inputsourceschange",G);for(let J=0;J=0&&(T[Le]=null,A[Le].disconnect(te))}for(let re=0;re=T.length){T.push(te),Le=Ae;break}else if(T[Ae]===null){T[Ae]=te,Le=Ae;break}if(Le===-1)break}let Ne=A[Le];Ne&&Ne.connect(te)}}let $=new L,ie=new L;function le(J,re,te){$.setFromMatrixPosition(re.matrixWorld),ie.setFromMatrixPosition(te.matrixWorld);let Le=$.distanceTo(ie),Ne=re.projectionMatrix.elements,Ae=te.projectionMatrix.elements,tt=Ne[14]/(Ne[10]-1),Pe=Ne[14]/(Ne[10]+1),je=(Ne[9]+1)/Ne[5],qe=(Ne[9]-1)/Ne[5],We=(Ne[8]-1)/Ne[0],ut=(Ae[8]+1)/Ae[0],pt=tt*We,mt=tt*ut,vt=Le/(-We+ut),at=vt*-We;if(re.matrixWorld.decompose(J.position,J.quaternion,J.scale),J.translateX(at),J.translateZ(vt),J.matrixWorld.compose(J.position,J.quaternion,J.scale),J.matrixWorldInverse.copy(J.matrixWorld).invert(),Ne[10]===-1)J.projectionMatrix.copy(re.projectionMatrix),J.projectionMatrixInverse.copy(re.projectionMatrixInverse);else{let dt=tt+vt,N=Pe+vt,Lt=pt-at,Je=mt+(Le-at),w=je*Pe/N*dt,x=qe*Pe/N*dt;J.projectionMatrix.makePerspective(Lt,Je,w,x,dt,N),J.projectionMatrixInverse.copy(J.projectionMatrix).invert()}}function pe(J,re){re===null?J.matrixWorld.copy(J.matrix):J.matrixWorld.multiplyMatrices(re.matrixWorld,J.matrix),J.matrixWorldInverse.copy(J.matrixWorld).invert()}this.updateCamera=function(J){if(i===null)return;let re=J.near,te=J.far;m.texture!==null&&(m.depthNear>0&&(re=m.depthNear),m.depthFar>0&&(te=m.depthFar)),D.near=C.near=b.near=re,D.far=C.far=b.far=te,(X!==D.near||q!==D.far)&&(i.updateRenderState({depthNear:D.near,depthFar:D.far}),X=D.near,q=D.far),D.layers.mask=J.layers.mask|6,b.layers.mask=D.layers.mask&-5,C.layers.mask=D.layers.mask&-3;let Le=J.parent,Ne=D.cameras;pe(D,Le);for(let Ae=0;Ae0&&(m.alphaTest.value=p.alphaTest);let S=e.get(p),E=S.envMap,v=S.envMapRotation;E&&(m.envMap.value=E,m.envMapRotation.value.setFromMatrix4(x_.makeRotationFromEuler(v)).transpose(),E.isCubeTexture&&E.isRenderTargetTexture===!1&&m.envMapRotation.value.premultiply(hd),m.reflectivity.value=p.reflectivity,m.ior.value=p.ior,m.refractionRatio.value=p.refractionRatio),p.lightMap&&(m.lightMap.value=p.lightMap,m.lightMapIntensity.value=p.lightMapIntensity,t(p.lightMap,m.lightMapTransform)),p.aoMap&&(m.aoMap.value=p.aoMap,m.aoMapIntensity.value=p.aoMapIntensity,t(p.aoMap,m.aoMapTransform))}function a(m,p){m.diffuse.value.copy(p.color),m.opacity.value=p.opacity,p.map&&(m.map.value=p.map,t(p.map,m.mapTransform))}function o(m,p){m.dashSize.value=p.dashSize,m.totalSize.value=p.dashSize+p.gapSize,m.scale.value=p.scale}function l(m,p,S,E){m.diffuse.value.copy(p.color),m.opacity.value=p.opacity,m.size.value=p.size*S,m.scale.value=E*.5,p.map&&(m.map.value=p.map,t(p.map,m.uvTransform)),p.alphaMap&&(m.alphaMap.value=p.alphaMap,t(p.alphaMap,m.alphaMapTransform)),p.alphaTest>0&&(m.alphaTest.value=p.alphaTest)}function c(m,p){m.diffuse.value.copy(p.color),m.opacity.value=p.opacity,m.rotation.value=p.rotation,p.map&&(m.map.value=p.map,t(p.map,m.mapTransform)),p.alphaMap&&(m.alphaMap.value=p.alphaMap,t(p.alphaMap,m.alphaMapTransform)),p.alphaTest>0&&(m.alphaTest.value=p.alphaTest)}function h(m,p){m.specular.value.copy(p.specular),m.shininess.value=Math.max(p.shininess,1e-4)}function d(m,p){p.gradientMap&&(m.gradientMap.value=p.gradientMap)}function u(m,p){m.metalness.value=p.metalness,p.metalnessMap&&(m.metalnessMap.value=p.metalnessMap,t(p.metalnessMap,m.metalnessMapTransform)),m.roughness.value=p.roughness,p.roughnessMap&&(m.roughnessMap.value=p.roughnessMap,t(p.roughnessMap,m.roughnessMapTransform)),p.envMap&&(m.envMapIntensity.value=p.envMapIntensity)}function f(m,p,S){m.ior.value=p.ior,p.sheen>0&&(m.sheenColor.value.copy(p.sheenColor).multiplyScalar(p.sheen),m.sheenRoughness.value=p.sheenRoughness,p.sheenColorMap&&(m.sheenColorMap.value=p.sheenColorMap,t(p.sheenColorMap,m.sheenColorMapTransform)),p.sheenRoughnessMap&&(m.sheenRoughnessMap.value=p.sheenRoughnessMap,t(p.sheenRoughnessMap,m.sheenRoughnessMapTransform))),p.clearcoat>0&&(m.clearcoat.value=p.clearcoat,m.clearcoatRoughness.value=p.clearcoatRoughness,p.clearcoatMap&&(m.clearcoatMap.value=p.clearcoatMap,t(p.clearcoatMap,m.clearcoatMapTransform)),p.clearcoatRoughnessMap&&(m.clearcoatRoughnessMap.value=p.clearcoatRoughnessMap,t(p.clearcoatRoughnessMap,m.clearcoatRoughnessMapTransform)),p.clearcoatNormalMap&&(m.clearcoatNormalMap.value=p.clearcoatNormalMap,t(p.clearcoatNormalMap,m.clearcoatNormalMapTransform),m.clearcoatNormalScale.value.copy(p.clearcoatNormalScale),p.side===Ft&&m.clearcoatNormalScale.value.negate())),p.dispersion>0&&(m.dispersion.value=p.dispersion),p.iridescence>0&&(m.iridescence.value=p.iridescence,m.iridescenceIOR.value=p.iridescenceIOR,m.iridescenceThicknessMinimum.value=p.iridescenceThicknessRange[0],m.iridescenceThicknessMaximum.value=p.iridescenceThicknessRange[1],p.iridescenceMap&&(m.iridescenceMap.value=p.iridescenceMap,t(p.iridescenceMap,m.iridescenceMapTransform)),p.iridescenceThicknessMap&&(m.iridescenceThicknessMap.value=p.iridescenceThicknessMap,t(p.iridescenceThicknessMap,m.iridescenceThicknessMapTransform))),p.transmission>0&&(m.transmission.value=p.transmission,m.transmissionSamplerMap.value=S.texture,m.transmissionSamplerSize.value.set(S.width,S.height),p.transmissionMap&&(m.transmissionMap.value=p.transmissionMap,t(p.transmissionMap,m.transmissionMapTransform)),m.thickness.value=p.thickness,p.thicknessMap&&(m.thicknessMap.value=p.thicknessMap,t(p.thicknessMap,m.thicknessMapTransform)),m.attenuationDistance.value=p.attenuationDistance,m.attenuationColor.value.copy(p.attenuationColor)),p.anisotropy>0&&(m.anisotropyVector.value.set(p.anisotropy*Math.cos(p.anisotropyRotation),p.anisotropy*Math.sin(p.anisotropyRotation)),p.anisotropyMap&&(m.anisotropyMap.value=p.anisotropyMap,t(p.anisotropyMap,m.anisotropyMapTransform))),m.specularIntensity.value=p.specularIntensity,m.specularColor.value.copy(p.specularColor),p.specularColorMap&&(m.specularColorMap.value=p.specularColorMap,t(p.specularColorMap,m.specularColorMapTransform)),p.specularIntensityMap&&(m.specularIntensityMap.value=p.specularIntensityMap,t(p.specularIntensityMap,m.specularIntensityMapTransform))}function g(m,p){p.matcap&&(m.matcap.value=p.matcap)}function M(m,p){let S=e.get(p).light;m.referencePosition.value.setFromMatrixPosition(S.matrixWorld),m.nearDistance.value=S.shadow.camera.near,m.farDistance.value=S.shadow.camera.far}return{refreshFogUniforms:n,refreshMaterialUniforms:i}}function y_(s,e,t,n){let i={},r={},a=[],o=s.getParameter(s.MAX_UNIFORM_BUFFER_BINDINGS);function l(v,A){let T=A.program;n.uniformBlockBinding(v,T)}function c(v,A){let T=i[v.id];T===void 0&&(m(v),T=h(v),i[v.id]=T,v.addEventListener("dispose",S));let R=A.program;n.updateUBOMapping(v,R);let _=e.render.frame;r[v.id]!==_&&(u(v),r[v.id]=_)}function h(v){let A=d();v.__bindingPointIndex=A;let T=s.createBuffer(),R=v.__size,_=v.usage;return s.bindBuffer(s.UNIFORM_BUFFER,T),s.bufferData(s.UNIFORM_BUFFER,R,_),s.bindBuffer(s.UNIFORM_BUFFER,null),s.bindBufferBase(s.UNIFORM_BUFFER,A,T),T}function d(){for(let v=0;v0&&(T+=R-_),v.__size=T,v.__cache={},this}function p(v){let A={boundary:0,storage:0};return typeof v=="number"||typeof v=="boolean"?(A.boundary=4,A.storage=4):v.isVector2?(A.boundary=8,A.storage=8):v.isVector3||v.isColor?(A.boundary=16,A.storage=12):v.isVector4?(A.boundary=16,A.storage=16):v.isMatrix3?(A.boundary=48,A.storage=48):v.isMatrix4?(A.boundary=64,A.storage=64):v.isTexture?Ee("WebGLRenderer: Texture samplers can not be part of an uniforms group."):ArrayBuffer.isView(v)?(A.boundary=16,A.storage=v.byteLength):Ee("WebGLRenderer: Unsupported uniform value type.",v),A}function S(v){let A=v.target;A.removeEventListener("dispose",S);let T=a.indexOf(A.__bindingPointIndex);a.splice(T,1),s.deleteBuffer(i[A.id]),delete i[A.id],delete r[A.id]}function E(){for(let v in i)s.deleteBuffer(i[v]);a=[],i={},r={}}return{bind:l,update:c,dispose:E}}var M_=new Uint16Array([12469,15057,12620,14925,13266,14620,13807,14376,14323,13990,14545,13625,14713,13328,14840,12882,14931,12528,14996,12233,15039,11829,15066,11525,15080,11295,15085,10976,15082,10705,15073,10495,13880,14564,13898,14542,13977,14430,14158,14124,14393,13732,14556,13410,14702,12996,14814,12596,14891,12291,14937,11834,14957,11489,14958,11194,14943,10803,14921,10506,14893,10278,14858,9960,14484,14039,14487,14025,14499,13941,14524,13740,14574,13468,14654,13106,14743,12678,14818,12344,14867,11893,14889,11509,14893,11180,14881,10751,14852,10428,14812,10128,14765,9754,14712,9466,14764,13480,14764,13475,14766,13440,14766,13347,14769,13070,14786,12713,14816,12387,14844,11957,14860,11549,14868,11215,14855,10751,14825,10403,14782,10044,14729,9651,14666,9352,14599,9029,14967,12835,14966,12831,14963,12804,14954,12723,14936,12564,14917,12347,14900,11958,14886,11569,14878,11247,14859,10765,14828,10401,14784,10011,14727,9600,14660,9289,14586,8893,14508,8533,15111,12234,15110,12234,15104,12216,15092,12156,15067,12010,15028,11776,14981,11500,14942,11205,14902,10752,14861,10393,14812,9991,14752,9570,14682,9252,14603,8808,14519,8445,14431,8145,15209,11449,15208,11451,15202,11451,15190,11438,15163,11384,15117,11274,15055,10979,14994,10648,14932,10343,14871,9936,14803,9532,14729,9218,14645,8742,14556,8381,14461,8020,14365,7603,15273,10603,15272,10607,15267,10619,15256,10631,15231,10614,15182,10535,15118,10389,15042,10167,14963,9787,14883,9447,14800,9115,14710,8665,14615,8318,14514,7911,14411,7507,14279,7198,15314,9675,15313,9683,15309,9712,15298,9759,15277,9797,15229,9773,15166,9668,15084,9487,14995,9274,14898,8910,14800,8539,14697,8234,14590,7790,14479,7409,14367,7067,14178,6621,15337,8619,15337,8631,15333,8677,15325,8769,15305,8871,15264,8940,15202,8909,15119,8775,15022,8565,14916,8328,14804,8009,14688,7614,14569,7287,14448,6888,14321,6483,14088,6171,15350,7402,15350,7419,15347,7480,15340,7613,15322,7804,15287,7973,15229,8057,15148,8012,15046,7846,14933,7611,14810,7357,14682,7069,14552,6656,14421,6316,14251,5948,14007,5528,15356,5942,15356,5977,15353,6119,15348,6294,15332,6551,15302,6824,15249,7044,15171,7122,15070,7050,14949,6861,14818,6611,14679,6349,14538,6067,14398,5651,14189,5311,13935,4958,15359,4123,15359,4153,15356,4296,15353,4646,15338,5160,15311,5508,15263,5829,15188,6042,15088,6094,14966,6001,14826,5796,14678,5543,14527,5287,14377,4985,14133,4586,13869,4257,15360,1563,15360,1642,15358,2076,15354,2636,15341,3350,15317,4019,15273,4429,15203,4732,15105,4911,14981,4932,14836,4818,14679,4621,14517,4386,14359,4156,14083,3795,13808,3437,15360,122,15360,137,15358,285,15355,636,15344,1274,15322,2177,15281,2765,15215,3223,15120,3451,14995,3569,14846,3567,14681,3466,14511,3305,14344,3121,14037,2800,13753,2467,15360,0,15360,1,15359,21,15355,89,15346,253,15325,479,15287,796,15225,1148,15133,1492,15008,1749,14856,1882,14685,1886,14506,1783,14324,1608,13996,1398,13702,1183]),Fn=null;function S_(){return Fn===null&&(Fn=new Ms(M_,16,16,xi,Vt),Fn.name="DFG_LUT",Fn.minFilter=Tt,Fn.magFilter=Tt,Fn.wrapS=cn,Fn.wrapT=cn,Fn.generateMipmaps=!1,Fn.needsUpdate=!0),Fn}var qo=class{constructor(e={}){let{canvas:t=Iu(),context:n=null,depth:i=!0,stencil:r=!1,alpha:a=!1,antialias:o=!1,premultipliedAlpha:l=!0,preserveDrawingBuffer:c=!1,powerPreference:h="default",failIfMajorPerformanceCaveat:d=!1,reversedDepthBuffer:u=!1,outputBufferType:f=jt}=e;this.isWebGLRenderer=!0;let g;if(n!==null){if(typeof WebGLRenderingContext<"u"&&n instanceof WebGLRenderingContext)throw new Error("THREE.WebGLRenderer: WebGL 1 is not supported since r163.");g=n.getContextAttributes().alpha}else g=a;let M=f,m=new Set([co,lo,oo]),p=new Set([jt,Sn,Cs,Is,so,ro]),S=new Uint32Array(4),E=new Int32Array(4),v=new L,A=null,T=null,R=[],_=[],b=null;this.domElement=t,this.debug={checkShaderErrors:!0,onShaderError:null},this.autoClear=!0,this.autoClearColor=!0,this.autoClearDepth=!0,this.autoClearStencil=!0,this.sortObjects=!0,this.clippingPlanes=[],this.localClippingEnabled=!1,this.toneMapping=yn,this.toneMappingExposure=1,this.transmissionResolutionScale=1;let C=this,I=!1,D=null,X=null,q=null,O=null;this._outputColorSpace=St;let H=0,G=0,$=null,ie=-1,le=null,pe=new et,_e=new et,He=null,ht=new Me(0),Ye=0,J=t.width,re=t.height,te=1,Le=null,Ne=null,Ae=new et(0,0,J,re),tt=new et(0,0,J,re),Pe=!1,je=new Ss,qe=!1,We=!1,ut=new Oe,pt=new L,mt=new et,vt={background:null,fog:null,environment:null,overrideMaterial:null,isScene:!0},at=!1;function dt(){return $===null?te:1}let N=n;function Lt(y,U){return t.getContext(y,U)}try{let y={alpha:!0,depth:i,stencil:r,antialias:o,premultipliedAlpha:l,preserveDrawingBuffer:c,powerPreference:h,failIfMajorPerformanceCaveat:d};if("setAttribute"in t&&t.setAttribute("data-engine",`three.js r${"185"}`),t.addEventListener("webglcontextlost",gt,!1),t.addEventListener("webglcontextrestored",ot,!1),t.addEventListener("webglcontextcreationerror",Tn,!1),N===null){let U="webgl2";if(N=Lt(U,y),N===null)throw Lt(U)?new Error("THREE.WebGLRenderer: Error creating WebGL context with your selected attributes."):new Error("THREE.WebGLRenderer: Error creating WebGL context.")}}catch(y){throw De("WebGLRenderer: "+y.message),y}let Je,w,x,F,k,W,ne,ce,Z,K,he,be,ue,Q,se,ge,we,P,ee,Y,oe,ae,j;function Re(){Je=new Cg(N),Je.init(),oe=new m_(N,Je),w=new Mg(N,Je,e,oe),x=new f_(N,Je),w.reversedDepthBuffer&&u&&x.buffers.depth.setReversed(!0),X=N.createFramebuffer(),q=N.createFramebuffer(),O=N.createFramebuffer(),F=new Lg(N),k=new Q0,W=new p_(N,Je,x,k,w,oe,F),ne=new Rg(C),ce=new Ff(N),ae=new vg(N,ce),Z=new Ig(N,ce,F,ae),K=new Dg(N,Z,ce,ae,F),P=new Ng(N,w,W),se=new Sg(k),he=new j0(C,ne,Je,w,ae,se),be=new v_(C,k),ue=new t_,Q=new o_(Je),we=new xg(C,ne,x,K,g,l),ge=new d_(C,K,w),j=new y_(N,F,w,x),ee=new yg(N,Je,F),Y=new Pg(N,Je,F),F.programs=he.programs,C.capabilities=w,C.extensions=Je,C.properties=k,C.renderLists=ue,C.shadowMap=ge,C.state=x,C.info=F}Re(),M!==jt&&(b=new Fg(M,t.width,t.height,o,i,r));let Se=new Cc(C,N);this.xr=Se,this.getContext=function(){return N},this.getContextAttributes=function(){return N.getContextAttributes()},this.forceContextLoss=function(){let y=Je.get("WEBGL_lose_context");y&&y.loseContext()},this.forceContextRestore=function(){let y=Je.get("WEBGL_lose_context");y&&y.restoreContext()},this.getPixelRatio=function(){return te},this.setPixelRatio=function(y){y!==void 0&&(te=y,this.setSize(J,re,!1))},this.getSize=function(y){return y.set(J,re)},this.setSize=function(y,U,V=!0){if(Se.isPresenting){Ee("WebGLRenderer: Can't change size while VR device is presenting.");return}J=y,re=U,t.width=Math.floor(y*te),t.height=Math.floor(U*te),V===!0&&(t.style.width=y+"px",t.style.height=U+"px"),b!==null&&b.setSize(t.width,t.height),this.setViewport(0,0,y,U)},this.getDrawingBufferSize=function(y){return y.set(J*te,re*te).floor()},this.setDrawingBufferSize=function(y,U,V){J=y,re=U,te=V,t.width=Math.floor(y*V),t.height=Math.floor(U*V),this.setViewport(0,0,y,U)},this.setEffects=function(y){if(M===jt){De("WebGLRenderer: setEffects() requires outputBufferType set to HalfFloatType or FloatType.");return}if(y){for(let U=0;U{function me(){if(B.forEach(function(ve){k.get(ve).currentProgram.isReady()&&B.delete(ve)}),B.size===0){z(y);return}setTimeout(me,10)}Je.get("KHR_parallel_shader_compile")!==null?me():setTimeout(me,10)})};let rl=null;function Md(y){rl&&rl(y)}function oh(){Si.stop()}function lh(){Si.start()}let Si=new sd;Si.setAnimationLoop(Md),typeof self<"u"&&Si.setContext(self),this.setAnimationLoop=function(y){rl=y,Se.setAnimationLoop(y),y===null?Si.stop():Si.start()},Se.addEventListener("sessionstart",oh),Se.addEventListener("sessionend",lh),this.render=function(y,U){if(U!==void 0&&U.isCamera!==!0){De("WebGLRenderer.render: camera is not an instance of THREE.Camera.");return}if(I===!0)return;D!==null&&D.renderStart(y,U);let V=Se.enabled===!0&&Se.isPresenting===!0,B=b!==null&&($===null||V)&&b.begin(C,$);if(y.matrixWorldAutoUpdate===!0&&y.updateMatrixWorld(),U.parent===null&&U.matrixWorldAutoUpdate===!0&&U.updateMatrixWorld(),Se.enabled===!0&&Se.isPresenting===!0&&(b===null||b.isCompositing()===!1)&&(Se.cameraAutoUpdate===!0&&Se.updateCamera(U),U=Se.getCamera()),y.isScene===!0&&y.onBeforeRender(C,y,U,$),T=Q.get(y,_.length),T.init(U),T.state.textureUnits=W.getTextureUnits(),_.push(T),ut.multiplyMatrices(U.projectionMatrix,U.matrixWorldInverse),je.setFromProjectionMatrix(ut,gn,U.reversedDepth),We=this.localClippingEnabled,qe=se.init(this.clippingPlanes,We),A=ue.get(y,R.length),A.init(),R.push(A),Se.enabled===!0&&Se.isPresenting===!0){let ve=C.xr.getDepthSensingMesh();ve!==null&&al(ve,U,-1/0,C.sortObjects)}al(y,U,0,C.sortObjects),A.finish(),C.sortObjects===!0&&A.sort(Le,Ne,U.reversedDepth),at=Se.enabled===!1||Se.isPresenting===!1||Se.hasDepthSensing()===!1,at&&we.addToRenderList(A,y),this.info.render.frame++,this.info.autoReset===!0&&this.info.reset(),qe===!0&&se.beginShadows();let z=T.state.shadowsArray;if(ge.render(z,y,U),qe===!0&&se.endShadows(),(B&&b.hasRenderPass())===!1){let ve=A.opaque,fe=A.transmissive;if(T.setupLights(),U.isArrayCamera){let Te=U.cameras;if(fe.length>0)for(let Ce=0,Fe=Te.length;Ce0&&hh(ve,fe,y,U),at&&we.render(y),ch(A,y,U)}$!==null&&G===0&&(W.updateMultisampleRenderTarget($),W.updateRenderTargetMipmap($)),B&&b.end(C),y.isScene===!0&&y.onAfterRender(C,y,U),ae.resetDefaultState(),ie=-1,le=null,_.pop(),_.length>0?(T=_[_.length-1],W.setTextureUnits(T.state.textureUnits),qe===!0&&se.setGlobalState(C.clippingPlanes,T.state.camera)):T=null,R.pop(),R.length>0?A=R[R.length-1]:A=null,D!==null&&D.renderEnd()};function al(y,U,V,B){if(y.visible===!1)return;if(y.layers.test(U.layers)){if(y.isGroup)V=y.renderOrder;else if(y.isLOD)y.autoUpdate===!0&&y.update(U);else if(y.isLightProbeGrid)T.pushLightProbeGrid(y);else if(y.isLight)T.pushLight(y),y.castShadow&&T.pushShadow(y);else if(y.isSprite){if(!y.frustumCulled||je.intersectsSprite(y)){B&&mt.setFromMatrixPosition(y.matrixWorld).applyMatrix4(ut);let ve=K.update(y),fe=y.material;fe.visible&&A.push(y,ve,fe,V,mt.z,null)}}else if((y.isMesh||y.isLine||y.isPoints)&&(!y.frustumCulled||je.intersectsObject(y))){let ve=K.update(y),fe=y.material;if(B&&(y.boundingSphere!==void 0?(y.boundingSphere===null&&y.computeBoundingSphere(),mt.copy(y.boundingSphere.center)):(ve.boundingSphere===null&&ve.computeBoundingSphere(),mt.copy(ve.boundingSphere.center)),mt.applyMatrix4(y.matrixWorld).applyMatrix4(ut)),Array.isArray(fe)){let Te=ve.groups;for(let Ce=0,Fe=Te.length;Ce0&&Kr(z,U,V),me.length>0&&Kr(me,U,V),ve.length>0&&Kr(ve,U,V),x.buffers.depth.setTest(!0),x.buffers.depth.setMask(!0),x.buffers.color.setMask(!0),x.setPolygonOffset(!1)}function hh(y,U,V,B){if((V.isScene===!0?V.overrideMaterial:null)!==null)return;if(T.state.transmissionRenderTarget[B.id]===void 0){let Ie=Je.has("EXT_color_buffer_half_float")||Je.has("EXT_color_buffer_float");T.state.transmissionRenderTarget[B.id]=new Ct(1,1,{generateMipmaps:!0,type:Ie?Vt:jt,minFilter:Mn,samples:Math.max(4,w.samples),stencilBuffer:r,resolveDepthBuffer:!1,resolveStencilBuffer:!1,colorSpace:Be.workingColorSpace})}let me=T.state.transmissionRenderTarget[B.id],ve=B.viewport||pe;me.setSize(ve.z*C.transmissionResolutionScale,ve.w*C.transmissionResolutionScale);let fe=C.getRenderTarget(),Te=C.getActiveCubeFace(),Ce=C.getActiveMipmapLevel();C.setRenderTarget(me),C.getClearColor(ht),Ye=C.getClearAlpha(),Ye<1&&C.setClearColor(16777215,.5),C.clear(),at&&we.render(V);let Fe=C.toneMapping;C.toneMapping=yn;let ke=B.viewport;if(B.viewport!==void 0&&(B.viewport=void 0),T.setupLightsView(B),qe===!0&&se.setGlobalState(C.clippingPlanes,B),Kr(y,V,B),W.updateMultisampleRenderTarget(me),W.updateRenderTargetMipmap(me),Je.has("WEBGL_multisampled_render_to_texture")===!1){let Ie=!1;for(let nt=0,yt=U.length;nt0,B.currentProgram=ke,B.uniformsList=null,ke}function dh(y){if(y.uniformsList===null){let U=y.currentProgram.getUniforms();y.uniformsList=Ns.seqWithValue(U.seq,y.uniforms)}return y.uniformsList}function fh(y,U){let V=k.get(y);V.outputColorSpace=U.outputColorSpace,V.batching=U.batching,V.batchingColor=U.batchingColor,V.instancing=U.instancing,V.instancingColor=U.instancingColor,V.instancingMorph=U.instancingMorph,V.skinning=U.skinning,V.morphTargets=U.morphTargets,V.morphNormals=U.morphNormals,V.morphColors=U.morphColors,V.morphTargetsCount=U.morphTargetsCount,V.numClippingPlanes=U.numClippingPlanes,V.numIntersection=U.numClipIntersection,V.vertexAlphas=U.vertexAlphas,V.vertexTangents=U.vertexTangents,V.toneMapping=U.toneMapping}function Sd(y,U){if(y.length===0)return null;if(y.length===1)return y[0].texture!==null?y[0]:null;v.setFromMatrixPosition(U.matrixWorld);for(let V=0,B=y.length;V0),Ie=!!V.morphAttributes.position,nt=!!V.morphAttributes.normal,yt=!!V.morphAttributes.color,_t=yn;B.toneMapped&&($===null||$.isXRRenderTarget===!0)&&(_t=C.toneMapping);let it=V.morphAttributes.position||V.morphAttributes.normal||V.morphAttributes.color,Ot=it!==void 0?it.length:0,xe=k.get(B),Qt=T.state.lights;if(qe===!0&&(We===!0||y!==le)){let lt=y===le&&B.id===ie;se.setState(B,y,lt)}let Ze=!1;B.version===xe.__version?(xe.needsLights&&xe.lightsStateVersion!==Qt.state.version||xe.outputColorSpace!==fe||z.isBatchedMesh&&xe.batching===!1||!z.isBatchedMesh&&xe.batching===!0||z.isBatchedMesh&&xe.batchingColor===!0&&z.colorTexture===null||z.isBatchedMesh&&xe.batchingColor===!1&&z.colorTexture!==null||z.isInstancedMesh&&xe.instancing===!1||!z.isInstancedMesh&&xe.instancing===!0||z.isSkinnedMesh&&xe.skinning===!1||!z.isSkinnedMesh&&xe.skinning===!0||z.isInstancedMesh&&xe.instancingColor===!0&&z.instanceColor===null||z.isInstancedMesh&&xe.instancingColor===!1&&z.instanceColor!==null||z.isInstancedMesh&&xe.instancingMorph===!0&&z.morphTexture===null||z.isInstancedMesh&&xe.instancingMorph===!1&&z.morphTexture!==null||xe.envMap!==Ce||B.fog===!0&&xe.fog!==me||xe.numClippingPlanes!==void 0&&(xe.numClippingPlanes!==se.numPlanes||xe.numIntersection!==se.numIntersection)||xe.vertexAlphas!==Fe||xe.vertexTangents!==ke||xe.morphTargets!==Ie||xe.morphNormals!==nt||xe.morphColors!==yt||xe.toneMapping!==_t||xe.morphTargetsCount!==Ot||!!xe.lightProbeGrid!=T.state.lightProbeGridArray.length>0)&&(Ze=!0):(Ze=!0,xe.__version=B.version);let on=xe.currentProgram;Ze===!0&&(on=Jr(B,U,z),D&&B.isNodeMaterial&&D.onUpdateProgram(B,on,xe));let An=!1,ni=!1,Ki=!1,st=on.getUniforms(),Mt=xe.uniforms;if(x.useProgram(on.program)&&(An=!0,ni=!0,Ki=!0),B.id!==ie&&(ie=B.id,ni=!0),xe.needsLights){let lt=Sd(T.state.lightProbeGridArray,z);xe.lightProbeGrid!==lt&&(xe.lightProbeGrid=lt,ni=!0)}if(An||le!==y){x.buffers.depth.getReversed()&&y.reversedDepth!==!0&&(y._reversedDepth=!0,y.updateProjectionMatrix()),st.setValue(N,"projectionMatrix",y.projectionMatrix),st.setValue(N,"viewMatrix",y.matrixWorldInverse);let si=st.map.cameraPosition;si!==void 0&&si.setValue(N,pt.setFromMatrixPosition(y.matrixWorld)),w.logarithmicDepthBuffer&&st.setValue(N,"logDepthBufFC",2/(Math.log(y.far+1)/Math.LN2)),(B.isMeshPhongMaterial||B.isMeshToonMaterial||B.isMeshLambertMaterial||B.isMeshBasicMaterial||B.isMeshStandardMaterial||B.isShaderMaterial)&&st.setValue(N,"isOrthographic",y.isOrthographicCamera===!0),le!==y&&(le=y,ni=!0,Ki=!0)}if(xe.needsLights&&(Qt.state.directionalShadowMap.length>0&&st.setValue(N,"directionalShadowMap",Qt.state.directionalShadowMap,W),Qt.state.spotShadowMap.length>0&&st.setValue(N,"spotShadowMap",Qt.state.spotShadowMap,W),Qt.state.pointShadowMap.length>0&&st.setValue(N,"pointShadowMap",Qt.state.pointShadowMap,W)),z.isSkinnedMesh){st.setOptional(N,z,"bindMatrix"),st.setOptional(N,z,"bindMatrixInverse");let lt=z.skeleton;lt&&(lt.boneTexture===null&<.computeBoneTexture(),st.setValue(N,"boneTexture",lt.boneTexture,W))}z.isBatchedMesh&&(st.setOptional(N,z,"batchingTexture"),st.setValue(N,"batchingTexture",z._matricesTexture,W),st.setOptional(N,z,"batchingIdTexture"),st.setValue(N,"batchingIdTexture",z._indirectTexture,W),st.setOptional(N,z,"batchingColorTexture"),z._colorsTexture!==null&&st.setValue(N,"batchingColorTexture",z._colorsTexture,W));let ii=V.morphAttributes;if((ii.position!==void 0||ii.normal!==void 0||ii.color!==void 0)&&P.update(z,V,on),(ni||xe.receiveShadow!==z.receiveShadow)&&(xe.receiveShadow=z.receiveShadow,st.setValue(N,"receiveShadow",z.receiveShadow)),(B.isMeshStandardMaterial||B.isMeshLambertMaterial||B.isMeshPhongMaterial)&&B.envMap===null&&U.environment!==null&&(Mt.envMapIntensity.value=U.environmentIntensity),Mt.dfgLUT!==void 0&&(Mt.dfgLUT.value=S_()),ni){if(st.setValue(N,"toneMappingExposure",C.toneMappingExposure),xe.needsLights&&Td(Mt,Ki),me&&B.fog===!0&&be.refreshFogUniforms(Mt,me),be.refreshMaterialUniforms(Mt,B,te,re,T.state.transmissionRenderTarget[y.id]),xe.needsLights&&xe.lightProbeGrid){let lt=xe.lightProbeGrid;Mt.probesSH.value=lt.texture,Mt.probesMin.value.copy(lt.boundingBox.min),Mt.probesMax.value.copy(lt.boundingBox.max),Mt.probesResolution.value.copy(lt.resolution)}Ns.upload(N,dh(xe),Mt,W)}if(B.isShaderMaterial&&B.uniformsNeedUpdate===!0&&(Ns.upload(N,dh(xe),Mt,W),B.uniformsNeedUpdate=!1),B.isSpriteMaterial&&st.setValue(N,"center",z.center),st.setValue(N,"modelViewMatrix",z.modelViewMatrix),st.setValue(N,"normalMatrix",z.normalMatrix),st.setValue(N,"modelMatrix",z.matrixWorld),B.uniformsGroups!==void 0){let lt=B.uniformsGroups;for(let si=0,Ji=lt.length;si0&&W.useMultisampledRTT(y)===!1?B=k.get(y).__webglMultisampledFramebuffer:Array.isArray(Ce)?B=Ce[V]:B=Ce,pe.copy(y.viewport),_e.copy(y.scissor),He=y.scissorTest}else pe.copy(Ae).multiplyScalar(te).floor(),_e.copy(tt).multiplyScalar(te).floor(),He=Pe;if(V!==0&&(B=X),x.bindFramebuffer(N.FRAMEBUFFER,B)&&x.drawBuffers(y,B),x.viewport(pe),x.scissor(_e),x.setScissorTest(He),z){let fe=k.get(y.texture);N.framebufferTexture2D(N.FRAMEBUFFER,N.COLOR_ATTACHMENT0,N.TEXTURE_CUBE_MAP_POSITIVE_X+U,fe.__webglTexture,V)}else if(me){let fe=U;for(let Te=0;Te1&&N.readBuffer(N.COLOR_ATTACHMENT0+fe),!w.textureFormatReadable(Fe)){De("WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");return}if(!w.textureTypeReadable(ke)){De("WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");return}U>=0&&U<=y.width-B&&V>=0&&V<=y.height-z&&N.readPixels(U,V,B,z,oe.convert(Fe),oe.convert(ke),me)}finally{let Ce=$!==null?k.get($).__webglFramebuffer:null;x.bindFramebuffer(N.FRAMEBUFFER,Ce)}}},this.readRenderTargetPixelsAsync=async function(y,U,V,B,z,me,ve,fe=0){if(!(y&&y.isWebGLRenderTarget))throw new Error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let Te=k.get(y).__webglFramebuffer;if(y.isWebGLCubeRenderTarget&&ve!==void 0&&(Te=Te[ve]),Te)if(U>=0&&U<=y.width-B&&V>=0&&V<=y.height-z){x.bindFramebuffer(N.FRAMEBUFFER,Te);let Ce=y.textures[fe],Fe=Ce.format,ke=Ce.type;if(y.textures.length>1&&N.readBuffer(N.COLOR_ATTACHMENT0+fe),!w.textureFormatReadable(Fe))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.");if(!w.textureTypeReadable(ke))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.");let Ie=N.createBuffer();N.bindBuffer(N.PIXEL_PACK_BUFFER,Ie),N.bufferData(N.PIXEL_PACK_BUFFER,me.byteLength,N.STREAM_READ),N.readPixels(U,V,B,z,oe.convert(Fe),oe.convert(ke),0);let nt=$!==null?k.get($).__webglFramebuffer:null;x.bindFramebuffer(N.FRAMEBUFFER,nt);let yt=N.fenceSync(N.SYNC_GPU_COMMANDS_COMPLETE,0);return N.flush(),await Lu(N,yt,4),N.bindBuffer(N.PIXEL_PACK_BUFFER,Ie),N.getBufferSubData(N.PIXEL_PACK_BUFFER,0,me),N.deleteBuffer(Ie),N.deleteSync(yt),me}else throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.")},this.copyFramebufferToTexture=function(y,U=null,V=0){let B=Math.pow(2,-V),z=Math.floor(y.image.width*B),me=Math.floor(y.image.height*B),ve=U!==null?U.x:0,fe=U!==null?U.y:0;W.setTexture2D(y,0),N.copyTexSubImage2D(N.TEXTURE_2D,V,0,0,ve,fe,z,me),x.unbindTexture()},this.copyTextureToTexture=function(y,U,V=null,B=null,z=0,me=0){let ve,fe,Te,Ce,Fe,ke,Ie,nt,yt,_t=y.isCompressedTexture?y.mipmaps[me]:y.image;if(V!==null)ve=V.max.x-V.min.x,fe=V.max.y-V.min.y,Te=V.isBox3?V.max.z-V.min.z:1,Ce=V.min.x,Fe=V.min.y,ke=V.isBox3?V.min.z:0;else{let Mt=Math.pow(2,-z);ve=Math.floor(_t.width*Mt),fe=Math.floor(_t.height*Mt),y.isDataArrayTexture?Te=_t.depth:y.isData3DTexture?Te=Math.floor(_t.depth*Mt):Te=1,Ce=0,Fe=0,ke=0}B!==null?(Ie=B.x,nt=B.y,yt=B.z):(Ie=0,nt=0,yt=0);let it=oe.convert(U.format),Ot=oe.convert(U.type),xe;U.isData3DTexture?(W.setTexture3D(U,0),xe=N.TEXTURE_3D):U.isDataArrayTexture||U.isCompressedArrayTexture?(W.setTexture2DArray(U,0),xe=N.TEXTURE_2D_ARRAY):(W.setTexture2D(U,0),xe=N.TEXTURE_2D),x.activeTexture(N.TEXTURE0),x.pixelStorei(N.UNPACK_FLIP_Y_WEBGL,U.flipY),x.pixelStorei(N.UNPACK_PREMULTIPLY_ALPHA_WEBGL,U.premultiplyAlpha),x.pixelStorei(N.UNPACK_ALIGNMENT,U.unpackAlignment);let Qt=x.getParameter(N.UNPACK_ROW_LENGTH),Ze=x.getParameter(N.UNPACK_IMAGE_HEIGHT),on=x.getParameter(N.UNPACK_SKIP_PIXELS),An=x.getParameter(N.UNPACK_SKIP_ROWS),ni=x.getParameter(N.UNPACK_SKIP_IMAGES);x.pixelStorei(N.UNPACK_ROW_LENGTH,_t.width),x.pixelStorei(N.UNPACK_IMAGE_HEIGHT,_t.height),x.pixelStorei(N.UNPACK_SKIP_PIXELS,Ce),x.pixelStorei(N.UNPACK_SKIP_ROWS,Fe),x.pixelStorei(N.UNPACK_SKIP_IMAGES,ke);let Ki=y.isDataArrayTexture||y.isData3DTexture,st=U.isDataArrayTexture||U.isData3DTexture;if(y.isDepthTexture){let Mt=k.get(y),ii=k.get(U),lt=k.get(Mt.__renderTarget),si=k.get(ii.__renderTarget);x.bindFramebuffer(N.READ_FRAMEBUFFER,lt.__webglFramebuffer),x.bindFramebuffer(N.DRAW_FRAMEBUFFER,si.__webglFramebuffer);for(let Ji=0;Ji=2.0 are supported."));return}let c=new sh(r,{path:t||this.resourcePath||"",crossOrigin:this.crossOrigin,requestHeader:this.requestHeader,manager:this.manager,ktx2Loader:this.ktx2Loader,meshoptDecoder:this.meshoptDecoder});c.fileLoader.setRequestHeader(this.requestHeader);for(let h=0;h=0&&o[d]===void 0&&console.warn('THREE.GLTFLoader: Unknown extension "'+d+'".')}}c.setExtensions(a),c.setPlugins(o),c.parse(n,i)}parseAsync(e,t){let n=this;return new Promise(function(i,r){n.parse(e,t,i,r)})}};function T_(){let s={};return{get:function(e){return s[e]},add:function(e,t){s[e]=t},remove:function(e){delete s[e]},removeAll:function(){s={}}}}function Et(s,e,t){let n=s.json.materials[e];return n.extensions&&n.extensions[t]?n.extensions[t]:null}var Ge={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",KHR_MESHOPT_COMPRESSION:"KHR_meshopt_compression",EXT_MESH_GPU_INSTANCING:"EXT_mesh_gpu_instancing"},Dc=class{constructor(e){this.parser=e,this.name=Ge.KHR_LIGHTS_PUNCTUAL,this.cache={refs:{},uses:{}}}_markDefs(){let e=this.parser,t=this.parser.json.nodes||[];for(let n=0,i=t.length;n=0)throw new Error("THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures");return null}return t.loadTextureImage(e,r.source,a)}},Zc=class{constructor(e){this.parser=e,this.name=Ge.EXT_TEXTURE_WEBP}loadTexture(e){let t=this.name,n=this.parser,i=n.json,r=i.textures[e];if(!r.extensions||!r.extensions[t])return null;let a=r.extensions[t],o=i.images[a.source],l=n.textureLoader;if(o.uri){let c=n.options.manager.getHandler(o.uri);c!==null&&(l=c)}return n.loadTextureImage(e,a.source,l)}},Kc=class{constructor(e){this.parser=e,this.name=Ge.EXT_TEXTURE_AVIF}loadTexture(e){let t=this.name,n=this.parser,i=n.json,r=i.textures[e];if(!r.extensions||!r.extensions[t])return null;let a=r.extensions[t],o=i.images[a.source],l=n.textureLoader;if(o.uri){let c=n.options.manager.getHandler(o.uri);c!==null&&(l=c)}return n.loadTextureImage(e,a.source,l)}},Jo=class{constructor(e,t){this.name=t,this.parser=e}loadBufferView(e){let t=this.parser.json,n=t.bufferViews[e];if(n.extensions&&n.extensions[this.name]){let i=n.extensions[this.name],r=this.parser.getDependency("buffer",i.buffer),a=this.parser.options.meshoptDecoder;if(!a||!a.supported){if(t.extensionsRequired&&t.extensionsRequired.indexOf(this.name)>=0)throw new Error("THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files");return null}return r.then(function(o){let l=i.byteOffset||0,c=i.byteLength||0,h=i.count,d=i.byteStride,u=new Uint8Array(o,l,c);return a.decodeGltfBufferAsync?a.decodeGltfBufferAsync(h,d,u,i.mode,i.filter).then(function(f){return f.buffer}):a.ready.then(function(){let f=new ArrayBuffer(h*d);return a.decodeGltfBuffer(new Uint8Array(f),h,d,u,i.mode,i.filter),f})})}else return null}},Jc=class{constructor(e){this.name=Ge.EXT_MESH_GPU_INSTANCING,this.parser=e}createNodeMesh(e){let t=this.parser.json,n=t.nodes[e];if(!n.extensions||!n.extensions[this.name]||n.mesh===void 0)return null;let i=t.meshes[n.mesh];for(let c of i.primitives)if(c.mode!==un.TRIANGLES&&c.mode!==un.TRIANGLE_STRIP&&c.mode!==un.TRIANGLE_FAN&&c.mode!==void 0)return null;let a=n.extensions[this.name].attributes,o=[],l={};for(let c in a)o.push(this.parser.getDependency("accessor",a[c]).then(h=>(l[c]=h,l[c])));return o.length<1?null:(o.push(this.parser.createNodeMesh(e)),Promise.all(o).then(c=>{let h=c.pop(),d=h.isGroup?h.children:[h],u=c[0].count,f=[];for(let g of d){let M=new Oe,m=new L,p=new nn,S=new L(1,1,1),E=new Fi(g.geometry,g.material,u);for(let v=0;v0||s.search(/^data\:image\/jpeg/)===0?"image/jpeg":s.search(/\.webp($|\?)/i)>0||s.search(/^data\:image\/webp/)===0?"image/webp":s.search(/\.ktx2($|\?)/i)>0||s.search(/^data\:image\/ktx2/)===0?"image/ktx2":"image/png"}var L_=new Oe,sh=class{constructor(e={},t={}){this.json=e,this.extensions={},this.plugins={},this.options=t,this.cache=new T_,this.associations=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 n=!1,i=-1,r=!1,a=-1;if(typeof navigator<"u"&&typeof navigator.userAgent<"u"){let o=navigator.userAgent;n=/^((?!chrome|android).)*safari/i.test(o)===!0;let l=o.match(/Version\/(\d+)/);i=n&&l?parseInt(l[1],10):-1,r=o.indexOf("Firefox")>-1,a=r?o.match(/Firefox\/([0-9]+)\./)[1]:-1}typeof createImageBitmap>"u"||n&&i<17||r&&a<98?this.textureLoader=new xr(this.options.manager):this.textureLoader=new br(this.options.manager),this.textureLoader.setCrossOrigin(this.options.crossOrigin),this.textureLoader.setRequestHeader(this.options.requestHeader),this.fileLoader=new As(this.options.manager),this.fileLoader.setResponseType("arraybuffer"),this.options.crossOrigin==="use-credentials"&&this.fileLoader.setWithCredentials(!0)}setExtensions(e){this.extensions=e}setPlugins(e){this.plugins=e}parse(e,t){let n=this,i=this.json,r=this.extensions;this.cache.removeAll(),this.nodeCache={},this._invokeAll(function(a){return a._markDefs&&a._markDefs()}),Promise.all(this._invokeAll(function(a){return a.beforeRoot&&a.beforeRoot()})).then(function(){return Promise.all([n.getDependencies("scene"),n.getDependencies("animation"),n.getDependencies("camera")])}).then(function(a){let o={scene:a[0][i.scene||0],scenes:a[0],animations:a[1],cameras:a[2],asset:i.asset,parser:n,userData:{}};return Zi(r,o,i),Bn(o,i),Promise.all(n._invokeAll(function(l){return l.afterRoot&&l.afterRoot(o)})).then(function(){for(let l of o.scenes)l.updateMatrixWorld();e(o)})}).catch(t)}_markDefs(){let e=this.json.nodes||[],t=this.json.skins||[],n=this.json.meshes||[];for(let i=0,r=t.length;i{let l=this.associations.get(a);l!=null&&this.associations.set(o,l);for(let[c,h]of a.children.entries())r(h,o.children[c])};return r(n,i),i.name+="_instance_"+e.uses[t]++,i}_invokeOne(e){let t=Object.values(this.plugins);t.push(this);for(let n=0;n=2&&m.setY(b,T[R*l+1]),l>=3&&m.setZ(b,T[R*l+2]),l>=4&&m.setW(b,T[R*l+3]),l>=5)throw new Error("THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.")}m.normalized=g}return m})}loadTexture(e){let t=this.json,n=this.options,r=t.textures[e].source,a=t.images[r],o=this.textureLoader;if(a.uri){let l=n.manager.getHandler(a.uri);l!==null&&(o=l)}return this.loadTextureImage(e,r,o)}loadTextureImage(e,t,n){let i=this,r=this.json,a=r.textures[e],o=r.images[t],l=(o.uri||o.bufferView)+":"+a.sampler;if(this.textureCache[l])return this.textureCache[l];let c=this.loadImageSource(t,n).then(function(h){h.flipY=!1,h.name=a.name||o.name||"",h.name===""&&typeof o.uri=="string"&&o.uri.startsWith("data:image/")===!1&&(h.name=o.uri);let u=(r.samplers||{})[a.sampler]||{};return h.magFilter=pd[u.magFilter]||Tt,h.minFilter=pd[u.minFilter]||Mn,h.wrapS=md[u.wrapS]||fi,h.wrapT=md[u.wrapT]||fi,h.generateMipmaps=!h.isCompressedTexture&&h.minFilter!==bt&&h.minFilter!==Tt,i.associations.set(h,{textures:e}),h}).catch(function(){return null});return this.textureCache[l]=c,c}loadImageSource(e,t){let n=this,i=this.json,r=this.options;if(this.sourceCache[e]!==void 0)return this.sourceCache[e].then(d=>d.clone());let a=i.images[e],o=self.URL||self.webkitURL,l=a.uri||"",c=!1;if(a.bufferView!==void 0)l=n.getDependency("bufferView",a.bufferView).then(function(d){c=!0;let u=new Blob([d],{type:a.mimeType});return l=o.createObjectURL(u),l});else if(a.uri===void 0)throw new Error("THREE.GLTFLoader: Image "+e+" is missing URI and bufferView");let h=Promise.resolve(l).then(function(d){return new Promise(function(u,f){let g=u;t.isImageBitmapLoader===!0&&(g=function(M){let m=new Dt(M);m.needsUpdate=!0,u(m)}),t.load(Qn.resolveURL(d,r.path),g,void 0,f)})}).then(function(d){return c===!0&&o.revokeObjectURL(l),Bn(d,a),d.userData.mimeType=a.mimeType||P_(a.uri),d}).catch(function(d){throw console.error("THREE.GLTFLoader: Couldn't load texture",l),d});return this.sourceCache[e]=h,h}assignTexture(e,t,n,i){let r=this;return this.getDependency("texture",n.index).then(function(a){if(!a)return null;if(n.texCoord!==void 0&&n.texCoord>0&&(a=a.clone(),a.channel=n.texCoord),r.extensions[Ge.KHR_TEXTURE_TRANSFORM]){let o=n.extensions!==void 0?n.extensions[Ge.KHR_TEXTURE_TRANSFORM]:void 0;if(o){let l=r.associations.get(a);a=r.extensions[Ge.KHR_TEXTURE_TRANSFORM].extendTexture(a,o),r.associations.set(a,l)}}return i!==void 0&&(a.colorSpace=i),e[t]=a,a})}assignFinalMaterial(e){let t=e.geometry,n=e.material,i=t.attributes.tangent===void 0,r=t.attributes.color!==void 0,a=t.attributes.normal===void 0;if(e.isPoints){let o="PointsMaterial:"+n.uuid,l=this.cache.get(o);l||(l=new Ts,qt.prototype.copy.call(l,n),l.color.copy(n.color),l.map=n.map,l.sizeAttenuation=!1,this.cache.add(o,l)),n=l}else if(e.isLine){let o="LineBasicMaterial:"+n.uuid,l=this.cache.get(o);l||(l=new bs,qt.prototype.copy.call(l,n),l.color.copy(n.color),l.map=n.map,this.cache.add(o,l)),n=l}if(i||r||a){let o="ClonedMaterial:"+n.uuid+":";i&&(o+="derivative-tangents:"),r&&(o+="vertex-colors:"),a&&(o+="flat-shading:");let l=this.cache.get(o);l||(l=n.clone(),r&&(l.vertexColors=!0),a&&(l.flatShading=!0),i&&(l.normalScale&&(l.normalScale.y*=-1),l.clearcoatNormalScale&&(l.clearcoatNormalScale.y*=-1)),this.cache.add(o,l),this.associations.set(l,this.associations.get(n))),n=l}e.material=n}getMaterialType(){return Ut}loadMaterial(e){let t=this,n=this.json,i=this.extensions,r=n.materials[e],a,o={},l=r.extensions||{},c=[];if(l[Ge.KHR_MATERIALS_UNLIT]){let d=i[Ge.KHR_MATERIALS_UNLIT];a=d.getMaterialType(),c.push(d.extendParams(o,r,t))}else{let d=r.pbrMetallicRoughness||{};if(o.color=new Me(1,1,1),o.opacity=1,Array.isArray(d.baseColorFactor)){let u=d.baseColorFactor;o.color.setRGB(u[0],u[1],u[2],Wt),o.opacity=u[3]}d.baseColorTexture!==void 0&&c.push(t.assignTexture(o,"map",d.baseColorTexture,St)),o.metalness=d.metallicFactor!==void 0?d.metallicFactor:1,o.roughness=d.roughnessFactor!==void 0?d.roughnessFactor:1,d.metallicRoughnessTexture!==void 0&&(c.push(t.assignTexture(o,"metalnessMap",d.metallicRoughnessTexture)),c.push(t.assignTexture(o,"roughnessMap",d.metallicRoughnessTexture))),a=this._invokeOne(function(u){return u.getMaterialType&&u.getMaterialType(e)}),c.push(Promise.all(this._invokeAll(function(u){return u.extendMaterialParams&&u.extendMaterialParams(e,o)})))}r.doubleSided===!0&&(o.side=$t);let h=r.alphaMode||Lc.OPAQUE;if(h===Lc.BLEND?(o.transparent=!0,o.depthWrite=!1):(o.transparent=!1,h===Lc.MASK&&(o.alphaTest=r.alphaCutoff!==void 0?r.alphaCutoff:.5)),r.normalTexture!==void 0&&a!==Yt&&(c.push(t.assignTexture(o,"normalMap",r.normalTexture)),o.normalScale=new ye(1,1),r.normalTexture.scale!==void 0)){let d=r.normalTexture.scale;o.normalScale.set(d,d)}if(r.occlusionTexture!==void 0&&a!==Yt&&(c.push(t.assignTexture(o,"aoMap",r.occlusionTexture)),r.occlusionTexture.strength!==void 0&&(o.aoMapIntensity=r.occlusionTexture.strength)),r.emissiveFactor!==void 0&&a!==Yt){let d=r.emissiveFactor;o.emissive=new Me().setRGB(d[0],d[1],d[2],Wt)}return r.emissiveTexture!==void 0&&a!==Yt&&c.push(t.assignTexture(o,"emissiveMap",r.emissiveTexture,St)),Promise.all(c).then(function(){let d=new a(o);return r.name&&(d.name=r.name),Bn(d,r),t.associations.set(d,{materials:e}),r.extensions&&Zi(i,d,r),d})}createUniqueName(e){let t=rt.sanitizeNodeName(e||"");return t in this.nodeNamesUsed?t+"_"+ ++this.nodeNamesUsed[t]:(this.nodeNamesUsed[t]=0,t)}loadGeometries(e){let t=this,n=this.extensions,i=this.primitiveCache;function r(o){return n[Ge.KHR_DRACO_MESH_COMPRESSION].decodePrimitive(o,t).then(function(l){return gd(l,o,t)})}let a=[];for(let o=0,l=e.length;o0&&C_(p,r),p.name=t.createUniqueName(r.name||"mesh_"+e),Bn(p,r),m.extensions&&Zi(i,p,m),t.assignFinalMaterial(p),d.push(p)}for(let f=0,g=d.length;f0){let f=h.userData.pivot,g=d[0];h.pivot=new L().fromArray(f),h.position.x-=f[0],h.position.y-=f[1],h.position.z-=f[2],g.position.set(0,0,0),delete h.userData.pivot}return h})}_loadNodeShallow(e){let t=this.json,n=this.extensions,i=this;if(this.nodeCache[e]!==void 0)return this.nodeCache[e];let r=t.nodes[e],a=r.name?i.createUniqueName(r.name):"",o=[],l=i._invokeOne(function(c){return c.createNodeMesh&&c.createNodeMesh(e)});return l&&o.push(l),r.camera!==void 0&&o.push(i.getDependency("camera",r.camera).then(function(c){return i._getNodeRef(i.cameraCache,r.camera,c)})),i._invokeAll(function(c){return c.createNodeAttachment&&c.createNodeAttachment(e)}).forEach(function(c){o.push(c)}),this.nodeCache[e]=Promise.all(o).then(function(c){let h;if(r.isBone===!0?h=new ys:c.length>1?h=new kt:c.length===1?h=c[0]:h=new ct,h!==c[0])for(let d=0,u=c.length;d1){let d=i.associations.get(h);i.associations.set(h,{...d})}return i.associations.get(h).nodes=e,h}),this.nodeCache[e]}loadScene(e){let t=this.extensions,n=this.json.scenes[e],i=this,r=new kt;n.name&&(r.name=i.createUniqueName(n.name)),Bn(r,n),n.extensions&&Zi(t,r,n);let a=n.nodes||[],o=[];for(let l=0,c=a.length;l{let d=new Map;for(let[u,f]of i.associations)(u instanceof qt||u instanceof Dt)&&d.set(u,f);return h.traverse(u=>{let f=i.associations.get(u);f!=null&&d.set(u,f)}),d};return i.associations=c(r),r})}_createAnimationTracks(e,t,n,i,r){let a=[],o=e.name?e.name:e.uuid,l=[];function c(f){f.morphTargetInfluences&&l.push(f.name?f.name:f.uuid)}yi[r.path]===yi.weights?(c(e),e.isGroup&&e.children.forEach(c)):l.push(o);let h;switch(yi[r.path]){case yi.weights:h=Kn;break;case yi.rotation:h=Jn;break;case yi.translation:case yi.scale:h=mi;break;default:switch(n.itemSize){case 1:h=Kn;break;case 2:case 3:default:h=mi;break}break}let d=i.interpolation!==void 0?A_[i.interpolation]:Li,u=this._getArrayFromAccessor(n);for(let f=0,g=l.length;f + + varying vec2 vUv; + + uniform sampler2D colorTexture; + uniform vec2 invSize; + uniform vec2 direction; + uniform float gaussianCoefficients[KERNEL_RADIUS]; + + void main() { + + float weightSum = gaussianCoefficients[0]; + vec3 diffuseSum = texture2D( colorTexture, vUv ).rgb * weightSum; + + for ( int i = 1; i < KERNEL_RADIUS; i ++ ) { + + float x = float( i ); + float w = gaussianCoefficients[i]; + vec2 uvOffset = direction * invSize * x; + vec3 sample1 = texture2D( colorTexture, vUv + uvOffset ).rgb; + vec3 sample2 = texture2D( colorTexture, vUv - uvOffset ).rgb; + diffuseSum += ( sample1 + sample2 ) * w; + + } + + gl_FragColor = vec4( diffuseSum, 1.0 ); + + }`})}_getCompositeMaterial(e){return new ft({defines:{NUM_MIPS:e},uniforms:{blurTexture1:{value:null},blurTexture2:{value:null},blurTexture3:{value:null},blurTexture4:{value:null},blurTexture5:{value:null},bloomStrength:{value:1},bloomFactors:{value:null},bloomTintColors:{value:null},bloomRadius:{value:0}},vertexShader:` + + varying vec2 vUv; + + void main() { + + vUv = uv; + gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 ); + + }`,fragmentShader:` + + varying vec2 vUv; + + uniform sampler2D blurTexture1; + uniform sampler2D blurTexture2; + uniform sampler2D blurTexture3; + uniform sampler2D blurTexture4; + uniform sampler2D blurTexture5; + uniform float bloomStrength; + uniform float bloomRadius; + uniform float bloomFactors[NUM_MIPS]; + uniform vec3 bloomTintColors[NUM_MIPS]; + + float lerpBloomFactor( const in float factor ) { + + float mirrorFactor = 1.2 - factor; + return mix( factor, mirrorFactor, bloomRadius ); + + } + + void main() { + + // 3.0 for backwards compatibility with previous alpha-based intensity + vec3 bloom = 3.0 * bloomStrength * ( + lerpBloomFactor( bloomFactors[ 0 ] ) * bloomTintColors[ 0 ] * texture2D( blurTexture1, vUv ).rgb + + lerpBloomFactor( bloomFactors[ 1 ] ) * bloomTintColors[ 1 ] * texture2D( blurTexture2, vUv ).rgb + + lerpBloomFactor( bloomFactors[ 2 ] ) * bloomTintColors[ 2 ] * texture2D( blurTexture3, vUv ).rgb + + lerpBloomFactor( bloomFactors[ 3 ] ) * bloomTintColors[ 3 ] * texture2D( blurTexture4, vUv ).rgb + + lerpBloomFactor( bloomFactors[ 4 ] ) * bloomTintColors[ 4 ] * texture2D( blurTexture5, vUv ).rgb + ); + + float bloomAlpha = max( bloom.r, max( bloom.g, bloom.b ) ); + gl_FragColor = vec4( bloom, bloomAlpha ); + + }`})}};zs.BlurDirectionX=new ye(1,0);zs.BlurDirectionY=new ye(0,1);var Yr={name:"OutputShader",uniforms:{tDiffuse:{value:null},toneMappingExposure:{value:1}},vertexShader:` + precision highp float; + + uniform mat4 modelViewMatrix; + uniform mat4 projectionMatrix; + + attribute vec3 position; + attribute vec2 uv; + + varying vec2 vUv; + + void main() { + + vUv = uv; + gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 ); + + }`,fragmentShader:` + + precision highp float; + + uniform sampler2D tDiffuse; + + #include + #include + + varying vec2 vUv; + + void main() { + + gl_FragColor = texture2D( tDiffuse, vUv ); + + // tone mapping + + #ifdef LINEAR_TONE_MAPPING + + gl_FragColor.rgb = LinearToneMapping( gl_FragColor.rgb ); + + #elif defined( REINHARD_TONE_MAPPING ) + + gl_FragColor.rgb = ReinhardToneMapping( gl_FragColor.rgb ); + + #elif defined( CINEON_TONE_MAPPING ) + + gl_FragColor.rgb = CineonToneMapping( gl_FragColor.rgb ); + + #elif defined( ACES_FILMIC_TONE_MAPPING ) + + gl_FragColor.rgb = ACESFilmicToneMapping( gl_FragColor.rgb ); + + #elif defined( AGX_TONE_MAPPING ) + + gl_FragColor.rgb = AgXToneMapping( gl_FragColor.rgb ); + + #elif defined( NEUTRAL_TONE_MAPPING ) + + gl_FragColor.rgb = NeutralToneMapping( gl_FragColor.rgb ); + + #elif defined( CUSTOM_TONE_MAPPING ) + + gl_FragColor.rgb = CustomToneMapping( gl_FragColor.rgb ); + + #endif + + // color space + + #ifdef SRGB_TRANSFER + + gl_FragColor = sRGBTransferOETF( gl_FragColor ); + + #endif + + }`};var tl=class extends an{constructor(){super(),this.isOutputPass=!0,this.uniforms=ti.clone(Yr.uniforms),this.material=new Es({name:Yr.name,uniforms:this.uniforms,vertexShader:Yr.vertexShader,fragmentShader:Yr.fragmentShader}),this._fsQuad=new Mi(this.material),this._outputColorSpace=null,this._toneMapping=null}render(e,t,n){this.uniforms.tDiffuse.value=n.texture,this.uniforms.toneMappingExposure.value=e.toneMappingExposure,(this._outputColorSpace!==e.outputColorSpace||this._toneMapping!==e.toneMapping)&&(this._outputColorSpace=e.outputColorSpace,this._toneMapping=e.toneMapping,this.material.defines={},Be.getTransfer(this._outputColorSpace)===$e&&(this.material.defines.SRGB_TRANSFER=""),this._toneMapping===Ar?this.material.defines.LINEAR_TONE_MAPPING="":this._toneMapping===wr?this.material.defines.REINHARD_TONE_MAPPING="":this._toneMapping===Rr?this.material.defines.CINEON_TONE_MAPPING="":this._toneMapping===Hi?this.material.defines.ACES_FILMIC_TONE_MAPPING="":this._toneMapping===Ir?this.material.defines.AGX_TONE_MAPPING="":this._toneMapping===Pr?this.material.defines.NEUTRAL_TONE_MAPPING="":this._toneMapping===Cr&&(this.material.defines.CUSTOM_TONE_MAPPING=""),this.material.needsUpdate=!0),this.renderToScreen===!0?(e.setRenderTarget(null),this._fsQuad.render(e)):(e.setRenderTarget(t),this.clear&&e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil),this._fsQuad.render(e))}dispose(){this.material.dispose(),this._fsQuad.dispose()}};var nl=class extends Di{constructor(){super(),this.name="RoomEnvironment",this.position.y=-3.5;let e=new vn;e.deleteAttribute("uv");let t=new Ut({side:Ft}),n=new Ut,i=new Vi(16777215,900,28,2);i.position.set(.418,16.199,.3),this.add(i);let r=new Ve(e,t);r.position.set(-.757,13.219,.717),r.scale.set(31.713,28.305,28.591),this.add(r);let a=new Fi(e,n,6),o=new ct;o.position.set(-10.906,2.009,1.846),o.rotation.set(0,-.195,0),o.scale.set(2.328,7.905,4.651),o.updateMatrix(),a.setMatrixAt(0,o.matrix),o.position.set(-5.607,-.754,-.758),o.rotation.set(0,.994,0),o.scale.set(1.97,1.534,3.955),o.updateMatrix(),a.setMatrixAt(1,o.matrix),o.position.set(6.167,.857,7.803),o.rotation.set(0,.561,0),o.scale.set(3.927,6.285,3.687),o.updateMatrix(),a.setMatrixAt(2,o.matrix),o.position.set(-2.017,.018,6.124),o.rotation.set(0,.333,0),o.scale.set(2.002,4.566,2.064),o.updateMatrix(),a.setMatrixAt(3,o.matrix),o.position.set(2.291,-.756,-2.621),o.rotation.set(0,-.286,0),o.scale.set(1.546,1.552,1.496),o.updateMatrix(),a.setMatrixAt(4,o.matrix),o.position.set(-2.193,-.369,-5.547),o.rotation.set(0,.516,0),o.scale.set(3.875,3.487,2.986),o.updateMatrix(),a.setMatrixAt(5,o.matrix),this.add(a);let l=new Ve(e,ks(50));l.position.set(-16.116,14.37,8.208),l.scale.set(.1,2.428,2.739),this.add(l);let c=new Ve(e,ks(50));c.position.set(-16.109,18.021,-8.207),c.scale.set(.1,2.425,2.751),this.add(c);let h=new Ve(e,ks(17));h.position.set(14.904,12.198,-1.832),h.scale.set(.15,4.265,6.331),this.add(h);let d=new Ve(e,ks(43));d.position.set(-.462,8.89,14.52),d.scale.set(4.38,5.441,.088),this.add(d);let u=new Ve(e,ks(20));u.position.set(3.235,11.486,-12.541),u.scale.set(2.5,2,.1),this.add(u);let f=new Ve(e,ks(100));f.position.set(0,20,0),f.scale.set(1,.1,1),this.add(f)}dispose(){let e=new Set;this.traverse(t=>{t.isMesh&&(e.add(t.geometry),e.add(t.material))});for(let t of e)t.dispose()}};function ks(s){return new mr({color:0,emissive:16777215,emissiveIntensity:s})}var il=[{name:"edu",speed:.16,spread:1,group:[.08,-.12,-.06],rings:[[.42,-.18,.08],[1.18,.26,-.2],[.18,.78,.4],[1.36,-.46,-.08],[.78,.54,-.72]]},{name:"dc",speed:.1,spread:1.08,group:[-.04,.12,.02],rings:[[Math.PI/2,0,0],[0,Math.PI/2,0],[Math.PI/2,Math.PI/2,0],[.38,-.62,Math.PI/2],[1.12,.44,-.36]]},{name:"gov",speed:.065,spread:.92,group:[.02,-.04,0],rings:[[.24,.08,0],[.42,.12,.08],[.58,.18,.16],[.74,.24,.24],[.34,-.52,.68]]},{name:"plant",speed:.2,spread:1.14,group:[.14,.16,-.04],rings:[[.72,.52,-.18],[1.42,-.34,.34],[.2,1.12,-.46],[1.08,.18,Math.PI/2],[1.38,-.62,-.84]]}],sl=(s,e,t)=>Math.min(t,Math.max(e,s)),bn=(s,e,t,n)=>Vr.lerp(s,e,1-Math.exp(-t*n));function F_(s,e,t){let n=s.getPropertyValue(e).trim();return n?n.endsWith("ms")?Number.parseFloat(n)/1e3:n.endsWith("s")?Number.parseFloat(n):t:t}function zn(s,e){let t=s.getPropertyValue(e).trim();if(!t)throw new Error(`Missing design token: ${e}`);return new Me(t)}function Zr(s,e,t,n){let i=new pr(s,e,16,96,t),r=new kt;if(r.add(new Ve(i,n)),t{let d=new L(-Math.sin(c),Math.cos(c),0).multiplyScalar(h),u=new Ve(o,n);u.position.set(Math.cos(c)*s,Math.sin(c)*s,0),u.position.addScaledVector(d,a*.32),u.quaternion.setFromUnitVectors(l,d),r.add(u)})}return r.userData.baseScale=1,r}function O_({canvas:s,hero:e,toggle:t,initialState:n=0}){let i=getComputedStyle(document.documentElement),r={page:zn(i,"--page"),surface:zn(i,"--surface"),metal:zn(i,"--core-metal"),metalDark:zn(i,"--core-metal-dark"),glass:zn(i,"--core-glass"),spectrum:zn(i,"--core-spectrum"),shadow:zn(i,"--core-shadow"),light:zn(i,"--core-light"),signal:zn(i,"--signal"),line:zn(i,"--line")},a=F_(i,"--dur-normal",.42),o=new qo({canvas:s,alpha:!1,antialias:!1,depth:!0,stencil:!1,powerPreference:"high-performance"});o.outputColorSpace=St,o.toneMapping=Hi,o.toneMappingExposure=.98,o.setClearColor(r.page,1);let l=new Di;l.background=r.page,l.fog=new tr(r.page,7.2,12.5);let c=new nl,h=new Ds(o),d=h.fromScene(c,.04);l.environment=d.texture,c.dispose(),h.dispose();let u=new wt(31,1,.1,40);u.position.set(0,.1,7.2);let f={uniforms:{tDiffuse:{value:null},uTime:{value:0},uResolution:{value:new ye(1,1)},uAmount:{value:1}},vertexShader:` + varying vec2 vUv; + void main() { + vUv = uv; + gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); + } + `,fragmentShader:` + uniform sampler2D tDiffuse; + uniform float uTime; + uniform vec2 uResolution; + uniform float uAmount; + varying vec2 vUv; + + float hash21(vec2 point) { + point = fract(point * vec2(123.34, 456.21)); + point += dot(point, point + 45.32); + return fract(point.x * point.y); + } + + void main() { + vec2 centered = vUv - 0.5; + float edge = smoothstep(0.12, 0.72, length(centered * vec2(0.82, 1.0))); + vec2 direction = normalize(centered + vec2(0.0001)); + vec2 aberration = direction * 0.0007 * uAmount; + vec4 base = texture2D(tDiffuse, vUv); + float red = texture2D(tDiffuse, vUv + aberration).r; + float blue = texture2D(tDiffuse, vUv - aberration).b; + float grain = hash21(gl_FragCoord.xy + floor(uTime * 18.0)) - 0.5; + vec3 color = vec3(red, base.g, blue); + color *= 1.0 - edge * 0.08 * uAmount; + color += grain * 0.007 * uAmount; + gl_FragColor = vec4(color, base.a); + } + `},g=new Qo(o),M=new el(l,u),m=new zs(new ye(1,1),.13,.24,.96),p=new Bs(f),S=new tl;g.addPass(M),g.addPass(m),g.addPass(p),g.addPass(S),o.info.autoReset=!1,s.dataset.effects="field-shader bloom chromatic-aberration vignette grain";let E=new Ut({color:r.metal,metalness:.88,roughness:.4,envMapIntensity:.3}),v=new Ut({color:r.metalDark,metalness:.82,roughness:.34,envMapIntensity:.34}),A=new Ut({color:r.glass,metalness:.36,roughness:.18,transparent:!0,opacity:.48,envMapIntensity:.28}),T=new Ut({color:r.signal,emissive:r.signal,emissiveIntensity:2.1,metalness:.28,roughness:.2,envMapIntensity:.7}),R=new Ut({color:r.spectrum,emissive:r.spectrum,emissiveIntensity:.96,metalness:.22,roughness:.24,envMapIntensity:.6}),_=new kt;l.add(_);let b=new kt;_.add(b);let C=[Zr(1.66,.078,Math.PI*1.78,E),Zr(1.46,.075,Math.PI*2,v),Zr(1.14,.06,Math.PI*1.72,A),Zr(1.08,.032,Math.PI*2,T),Zr(1.44,.016,Math.PI*2,R)];C[3].position.set(.12,-.06,-.48),C[4].position.set(-.06,.1,-.64),s.dataset.glowRings="2",C.forEach(Q=>_.add(Q));let I=new Ve(new Bi(.58,3),A),D=new Ve(new Bi(.23,3),T);_.add(I,D);let X=new Ut({color:r.metalDark,metalness:.9,roughness:.4}),q=new Ve(new vn(2.25,.032,.055),X),O=new Ve(new vn(.032,2.25,.055),X);q.position.z=-.08,O.position.z=-.08,_.add(q,O);let H=new Ve(new fr(.085,16,12),T);_.add(H);let G={uTime:{value:0},uSignal:{value:r.signal.clone()},uOpacity:{value:.14}},$=new Ve(new Bi(1.16,4),new ft({uniforms:G,transparent:!0,depthWrite:!1,side:$t,blending:Gi,wireframe:!0,vertexShader:` + varying vec3 vWorldNormal; + varying vec3 vWorldPosition; + varying vec3 vObjectPosition; + void main() { + vWorldNormal = normalize(mat3(modelMatrix) * normal); + vec4 worldPosition = modelMatrix * vec4(position, 1.0); + vWorldPosition = worldPosition.xyz; + vObjectPosition = position; + gl_Position = projectionMatrix * viewMatrix * worldPosition; + } + `,fragmentShader:` + uniform float uTime; + uniform vec3 uSignal; + uniform float uOpacity; + varying vec3 vWorldNormal; + varying vec3 vWorldPosition; + varying vec3 vObjectPosition; + void main() { + vec3 viewDirection = normalize(cameraPosition - vWorldPosition); + float fresnel = pow(1.0 - abs(dot(normalize(vWorldNormal), viewDirection)), 3.2); + float scan = 0.5 + 0.5 * sin(vObjectPosition.y * 54.0 - uTime * 1.6); + float latitude = smoothstep(0.96, 0.42, abs(vObjectPosition.y)); + float alpha = fresnel * (0.62 + scan * 0.38) * latitude * uOpacity; + gl_FragColor = vec4(uSignal * (1.05 + fresnel * 0.65), alpha); + } + `}));$.scale.set(1.18,.78,.86),$.rotation.set(.12,-.18,.08),b.add($);let ie=null,le=null;s.dataset.model="loading";let pe=new URL("./assets/twentyoz-field-core.glb",document.baseURI).href;new Ko().load(pe,Q=>{if(qe)return;let se=Q.scene,ge=new Xt().setFromObject(se),we=ge.getCenter(new L),P=ge.getSize(new L),ee=2.34/Math.max(P.x,P.y,P.z,1);se.position.sub(we),le=new kt,le.add(se),le.scale.setScalar(ee),le.rotation.set(-.04,Math.PI,-.02),se.traverse(Y=>{if(!Y.isMesh)return;Y.castShadow=!1,Y.receiveShadow=!1,(Array.isArray(Y.material)?Y.material:[Y.material]).filter(Boolean).forEach(ae=>{ae.emissive?.copy(r.signal).multiplyScalar(.54),ae.emissiveIntensity=1.08,ae.envMapIntensity=1.15,ae.roughness=Math.max(ae.roughness??.3,.24),ae.metalness=Math.max(ae.metalness??.7,.62),ae.needsUpdate=!0})}),b.add(le),b.position.set(-.14,0,.46),I.visible=!1,D.visible=!1,q.visible=!1,O.visible=!1,C[1].visible=!1,C[2].visible=!1,s.dataset.model="ready",e.dataset.model="ready",o.compile(l,u),tt=performance.now()+a*1e3,ne()},void 0,()=>{s.dataset.model="fallback",e.dataset.model="fallback"});let _e=new Ve(new zi(18,12),new Ut({color:r.surface,metalness:0,roughness:.96}));_e.rotation.x=-Math.PI/2,_e.position.y=-2.05,_e.position.z=-.8,l.add(_e);let He=new Ve(new ur(2.2,48),new Yt({color:r.shadow,transparent:!0,opacity:.14,depthWrite:!1}));He.rotation.x=-Math.PI/2,He.scale.set(1.35,.42,1),He.position.set(0,-2.025,0),l.add(He),l.add(new vr(r.light,r.shadow,2.15));let ht=new jn(r.light,5.2);ht.position.set(-4.5,5.2,5.8),l.add(ht);let Ye=new jn(r.signal,2.4);Ye.position.set(5.5,1.8,2.2),l.add(Ye);let J=new jn(r.metal,1.65);J.position.set(1.5,-2,4),l.add(J);let re=new ye,te=new ye,Le=sl(n,0,il.length-1),Ne=0,Ae=performance.now(),tt=Ae,Pe=navigator.webdriver===!0,je=!0,qe=!1,We=1.75,ut=Number.POSITIVE_INFINITY,pt=1e3/45,mt=0,vt=0,at=0,dt=new L,N=[{name:"mobile",maxWidth:688,x:0,y:-.08,z:7.8,scale:.86},{name:"tablet",maxWidth:992,x:.9,y:-.08,z:8.05,scale:.88},{name:"compact",maxWidth:1279,x:.75,y:-.1,z:8.3,scale:.92},{name:"wide",maxWidth:Number.POSITIVE_INFINITY,x:.72,y:-.12,z:8.4,scale:.94}];function Lt(){let Q=s.getBoundingClientRect(),se=Math.max(1,Math.round(Q.width)),ge=Math.max(1,Math.round(Q.height)),we=se/ge<.95||se<760,P=N.find(Y=>se<=Y.maxWidth)||N.at(-1);We=Math.min(we?1.35:1.75,ut),pt=1e3/(we?30:45);let ee=Math.min(window.devicePixelRatio||1,We);o.setPixelRatio(ee),o.setSize(se,ge,!1),g.setPixelRatio(Math.min(ee,we?1:1.35)),g.setSize(se,ge),p.uniforms.uResolution.value.set(se*ee,ge*ee),p.uniforms.uAmount.value=we?.68:1,m.strength=we?.08:.13,m.radius=we?.18:.24,u.aspect=se/ge,u.position.z=P.z,u.updateProjectionMatrix(),_.position.set(P.x,P.y,0),_.scale.setScalar(P.scale),_e.position.x=_.position.x,He.position.x=_.position.x,l.updateMatrixWorld(!0),u.updateMatrixWorld(!0),_.getWorldPosition(dt).project(u),s.dataset.dpr=ee.toFixed(2),s.dataset.layoutTier=P.name,s.dataset.coreOffsetX=P.x.toFixed(2),s.dataset.coreScreenRatio=(dt.x*.5+.5).toFixed(3),W(0)}function Je(Q){Le=sl(Q,0,il.length-1),tt=performance.now()+a*1e3,s.dataset.coreState=il[Le].name,ne()}function w(Q){let se=e.getBoundingClientRect();te.set(sl(((Q.clientX-se.left)/Math.max(se.width,1)-.5)*2,-1,1),sl(((Q.clientY-se.top)/Math.max(se.height,1)-.5)*2,-1,1)),Pe&&(tt=performance.now()+a*1e3,ne())}function x(){te.set(0,0),Pe&&(tt=performance.now()+a*1e3,ne())}function F(Q){if(Q-Ae{let oe=ge.rings[Y],ae=Pe?0:Ne*ge.speed*(Y%2?-1:1);ee.rotation.x=bn(ee.rotation.x,oe[0],5.2,se),ee.rotation.y=bn(ee.rotation.y,oe[1],5.2,se),ee.rotation.z=bn(ee.rotation.z,oe[2]+ae,5.2,se);let j=ge.spread*(1-Y*.018);ee.scale.setScalar(bn(ee.scale.x,j,5.2,se))});let we=Ne*(ge.speed*1.8)+Le*.72;H.position.set(Math.cos(we)*1.78,Math.sin(we)*1.78,.12);let P=Pe?1:1+Math.sin(Ne*2.2)*.055;if(D.scale.setScalar(P),T.emissiveIntensity=.92+(Pe?0:Math.sin(Ne*1.7)*.1),R.emissiveIntensity=.9+(Pe?0:Math.sin(Ne*1.14+1.2)*.08),G.uTime.value=Ne,G.uOpacity.value=.1+Le*.012,p.uniforms.uTime.value=Ne,ie&&!Pe&&ie.update(se),le){b.rotation.y=bn(b.rotation.y,re.x*.12,4.2,se),b.rotation.x=bn(b.rotation.x,re.y*-.08,4.2,se);let ee=Pe?1:1+Math.sin(Ne*.72)*.012;b.scale.setScalar(ee)}W(se),s.dataset.drawCalls=String(o.info.render.calls),mt+=se,vt+=1,se>1/30&&(at+=1),mt>=4&&(at/Math.max(vt,1)>.3&&We>1&&(ut=1,Lt()),mt=0,vt=0,at=0),Pe&&Q>=tt&&ne()}function k(){return!qe&&je&&!document.hidden&&(!Pe||performance.now(){je=Q.isIntersecting,Ae=performance.now(),ne()},{rootMargin:"10%"});be.observe(e),e.addEventListener("pointermove",w,{passive:!0}),e.addEventListener("pointerleave",x),t.addEventListener("click",ce),document.addEventListener("visibilitychange",Z),s.addEventListener("webglcontextlost",K,!1),Lt(),Pe&&(t.setAttribute("aria-pressed","true"),t.textContent="3D \uBAA8\uC158 \uCF1C\uAE30"),Je(Le),o.compile(l,u),W(0),e.dataset.webgl="ready",t.hidden=!1,ne();function ue(){qe||(qe=!0,o.setAnimationLoop(null),he.disconnect(),be.disconnect(),e.removeEventListener("pointermove",w),e.removeEventListener("pointerleave",x),t.removeEventListener("click",ce),document.removeEventListener("visibilitychange",Z),s.removeEventListener("webglcontextlost",K),l.traverse(Q=>{Q.geometry?.dispose(),(Array.isArray(Q.material)?Q.material:[Q.material]).filter(Boolean).forEach(ge=>{Object.values(ge).filter(we=>we?.isTexture).forEach(we=>we.dispose()),ge.dispose()})}),l.clear(),d.dispose(),g.dispose(),m.dispose(),p.dispose(),S.dispose(),o.dispose(),o.forceContextLoss())}return{setState:Je,dispose:ue}}return Pd(B_);})(); +/*! Bundled license information: + +three/build/three.core.js: +three/build/three.module.js: + (** + * @license + * Copyright 2010-2026 Three.js Authors + * SPDX-License-Identifier: MIT + *) +*/ diff --git a/apps/site/public/work/twentyoz-corp/assets/pretendard-twentyoz.woff2 b/apps/site/public/work/twentyoz-corp/assets/pretendard-twentyoz.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..719eb8daacc75900272bf72b07271a35761ea983 GIT binary patch literal 91352 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

GmP)4))5m%)-^Gmynx<(u$ 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

+at~;5pJDIJLD2s|H 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

1NQgcN*I+7`NlNAlW$D(m$k$HYIlI& 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\A~=oH_-c~l=a8H&4YlR7!8m1vnBj( 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

=DbHV`(}>7DWiB(RHDRe2KF0LUGdm6 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 X=>~~KqVgao$0RO$#mZ#U7s~(uQ - 트웬티온스 — 네 개의 현장에서 돌아가는 소프트웨어 + 트웬티온스 — 네 현장을 하나로 - + - + + + + - - - - - + + + @@ -39,604 +34,387 @@

- -
-
-

- 네 개의 현장에서
- 돌아가고 있다 -

-

- 트웬티온스는 2020년 1월에 세운 가상현실·산업용 IoT·이커머스 솔루션 회사입니다. - 어느 현장의 이야기부터 보시겠습니까. -

+
+ -
+
+
+

Independent software studio · since 2020

+

네 현장을 하나로

+

+ 가상현실부터 산업용 IoT까지. 서로 다른 현장의 데이터를 읽고, + 사람이 바로 움직일 수 있는 하나의 시스템으로 바꿉니다. +

+
+ + 프로젝트 문의 + + 현장 선택 + +
+ 선택한 현장: 강의실과 훈련장 +
+ +
- 현장 고르기 + 트웬티온스가 일하는 현장 선택 - - - - + + + +
-
-
+
-

- 헤드셋을 쓴 학생이 실습을 하고, 강사는 그 장면을 밖에서 본다. - 캐릭터의 몸짓은 웹캠 한 대로 잡는다. -

+
+

Field 01 · Immersive learning

+

+ 헤드셋을 쓴 학생의 실습을 강사가 밖에서 보고, 웹캠 한 대로 캐릭터의 몸짓까지 잡습니다. +

+
-
-
제품
-
VIVEN — 몰입형 VR 교육·훈련 플랫폼
-
-
-
기술
-
Unity3D × WebXR × MediaPipe
-
-
-
특징
-
PC VMC · Mobile VMC 모듈로 캐릭터 실시간 모션캡처
-
-
-
납품 사례
-
미래기술학교 운영 (2024) · 메타버스 기반 교육 플랫폼
-
-
-
성숙도
-
TRL 9 · 2021 – 현재
-
+
제품
VIVEN · 몰입형 VR 교육·훈련 플랫폼
+
기술
Unity3D × WebXR × MediaPipe
+
특징
PC VMC · Mobile VMC 실시간 모션캡처
+
납품
미래기술학교 운영 · 메타버스 기반 교육 플랫폼
+
성숙도
TRL 9 · 2021 – 현재
-

- 설비 여섯 종류가 각자의 프로토콜로 떠드는 것을 한 엔진이 받아 - 같은 시간축에 올린다. 그 위에서 운전이 자동으로 돈다. -

+
+

Field 02 · Connected operations

+

+ 서로 다른 여섯 산업 프로토콜을 한 엔진이 받아 같은 시간축에 올리고, 그 위에서 운전을 자동화합니다. +

+
-
-
제품
-
- XD Hub — 산업용 IoT 데이터 통합 엔진
- XD Works — DCIM · FEMS 통합 운영 애플리케이션 -
-
-
-
기술
-
- Java Spring Boot × Netty × TimescaleDB
- Spring Boot × NestJS × TypeScript -
-
-
-
특징
-
6종 산업 프로토콜을 단일 엔진으로 수집·전처리·전송
-
-
-
납품 사례
-
- 과천 데이터 센터 · LS 일렉 청주 FEMS · 제주 폐기물 EMS · - 비금도 EMS · 한유 AFIMS (모두 2024) -
-
-
-
성숙도
-
TRL 8 · 2022 – 현재
-
+
제품
XD Hub · XD Works · 데이터 통합과 운영 자동화
+
기술
Spring Boot × Netty × TimescaleDB × NestJS
+
특징
6종 산업 프로토콜 수집·전처리·전송
+
납품
과천 DC · LS 일렉 청주 FEMS · 제주·비금도 EMS · 한유 AFIMS
+
성숙도
TRL 8 · 2022 – 현재
-

- 해외 AI 서비스를 쓰고 싶은데 법인카드도 세금계산서도 안 되는 기관이 있다. - 그 사이에 들어가 원화 결제와 증빙을 대신한다. -

+
+

Field 03 · Public AI access

+

+ 해외 AI 서비스를 쓰기 어려운 기관을 위해 원화 결제와 세금계산서 발행을 하나의 흐름으로 연결합니다. +

+
-
-
제품
-
EduBill — AI SaaS 구독 대행 플랫폼
-
-
-
기술
-
Next.js × TypeScript × Supabase PostgreSQL
-
-
-
쓰는 곳
-
공공기관 · 대학 · 초중고 · 기업 HRD
-
-
-
납품 사례
-
KDIS EAI (2024) · EduBill (2024)
-
-
-
성숙도
-
TRL 8 · 2024 – 현재
-
+
제품
EduBill · AI SaaS 구독 대행 플랫폼
+
기술
Next.js × TypeScript × Supabase PostgreSQL
+
현장
공공기관 · 대학 · 초중고 · 기업 HRD
+
납품
KDIS EAI · EduBill
+
성숙도
TRL 8 · 2024 – 현재
-

- 현장에서는 사무실 화면이 안 열린다. 장갑 낀 손과 밝은 햇빛, - 끊기는 통신을 전제로 다시 만든다. -

+
+

Field 04 · Industrial interface

+

+ 장갑 낀 손, 밝은 햇빛, 끊기는 통신을 전제로 사무실 화면을 현장용 인터페이스로 다시 만듭니다. +

+
-
-
성격
-
고객사 설비·공정에 맞춰 짓는 현장 애플리케이션
-
-
-
납품 사례
-
- 브래키츠 BSLIM · 영진EL 2.0 스마트 APP · LS 전선 부스덕트 (모두 2024) -
-
-
-
기술
-
Spring Boot / PostgreSQL / WebSocket · Vue3
-
-
-
가장 무거운 것
-
- ACS (Auto Control System) — Unity Engine · RFS 실시간 유체 시뮬레이션 · - Transformer 기반 AI (2024) -
-
+
성격
고객사 설비·공정에 맞춘 현장 애플리케이션
+
기술
Spring Boot × PostgreSQL × WebSocket × Vue3
+
납품
브래키츠 BSLIM · 영진EL 2.0 · LS 전선 부스덕트
+
시뮬레이션
Unity Engine · RFS 실시간 유체 · Transformer AI
+
대표 시스템
ACS · Auto Control System
+
- -
-
-
-

여섯 해 동안 쌓인 것

-
-
-

- 서로 다른 산업의 프로젝트 경험과 새 기술을 붙여, 고객이 다음 성장 동력을 찾도록 - 돕는 것이 하는 일입니다. 에너지, 건물 자동화, 헬스케어처럼 틀리면 곤란한 영역이 - 주 무대입니다. -

-
-
-
수행 프로젝트
-
159건
-
-
-
고객사
-
42곳
-
-
-
구성원
-
40명
-
-
-
특허
-
4건
-
-
-

- 위 넷은 회사가 공개한 값입니다. 아래 한 일 목록에는 - 그중 공개 가능한 49건의 일부를 이름·연도·기술 스택과 함께 적었습니다. +

+
+
+

Operational proof

+

운영 결과를 수치로 증명합니다

+

+ 서로 다른 산업의 경험과 새 기술을 붙여 고객의 다음 운영 방식을 만드는 것이 하는 일입니다.

+
+
수행 프로젝트
159건
+
고객사
42곳
+
구성원
40명
+
특허
4건
+
+

+ 2026년 8월 24일 기준 + 트웬티온스 공식 공개 자료의 값입니다. + 아래에는 공개 가능한 49건 중 12건을 이름·연도·기술과 함께 적었습니다. +

- -
+
-

자체 제품

-

팔러 다니는 것이 아니라 계속 고치는 것

-

- 네 개 모두 특정 고객의 요구에서 시작해 제품이 됐습니다. 지금도 각자의 개발 주기가 - 돌아가고 있습니다. -

+
+

Operating principles · 04

+

서로 다른 기술을 하나의 운영 기준으로 연결합니다

+

프로젝트의 분야가 달라도 설계와 검증에 적용하는 네 가지 원칙은 같습니다.

+
+
    +
  1. 01 / Hybrid

    교배

    산업 경험과 신기술을 결합해 현장에 필요한 새로운 운영 방식을 만듭니다.
  2. +
  3. 02 / Continuum

    연속성

    단발성 납품에 머물지 않고 제품과 프로젝트를 지속적으로 고도화합니다.
  4. +
  5. 03 / Precision

    정확성

    에너지·건물 자동화·헬스케어처럼 오차 비용이 큰 영역에서 정확성을 우선합니다.
  6. +
  7. 04 / Empowerment

    확장성

    자동화된 운영과 데이터 기반 의사결정이 고객 조직 안에서 이어지도록 설계합니다.
  8. +
+
+
+ +
+
+
+

Product system · 04

+

한 번 납품하고 끝내지 않는 네 개의 시스템

+

특정 고객의 요구에서 시작했지만, 지금도 각자의 개발 주기로 계속 고치고 있습니다.

+
  1. -

    V–01

    -
    -

    VIVEN 메타버스 플랫폼

    -

    - 기업과 교육기관을 위한 몰입형 VR 교육·훈련 플랫폼. PC VMC 와 Mobile VMC - 모듈로 캐릭터 실시간 모션캡처를 지원합니다. -

    -

    Unity3D × WebXR × MediaPipe

    +

    01 / 04

    +
    +

    VIVEN

    +

    기업과 교육기관을 위한 몰입형 VR 교육·훈련 플랫폼. PC와 모바일 VMC로 캐릭터의 몸짓을 실시간으로 연결합니다.

    +

    Unity3D × WebXR × MediaPipe

    + VIVEN 상세 보기
    -
    -
    규모
    Enterprise
    -
    주기
    2021 –
    -
    성숙도
    TRL 9
    +
    +
    Domain
    Immersive learning
    +
    Cycle
    2021 –
    +
    Maturity
    TRL 9
  2. -

    V–02

    -
    -

    EduBill 교육 SaaS

    -

    - 공공기관·대학·초중고·기업 HRD 를 위한 AI SaaS 구독 대행 플랫폼. - 해외 AI 서비스를 원화 결제와 세금계산서 발행으로 들여옵니다. -

    -

    Next.js × TypeScript × Supabase PostgreSQL

    +

    02 / 04

    +
    +

    EduBill

    +

    공공기관·대학·초중고·기업 HRD가 해외 AI 서비스를 원화 결제와 세금계산서로 구독하도록 연결합니다.

    +

    Next.js × TypeScript × Supabase PostgreSQL

    + EduBill 상세 보기
    -
    -
    규모
    B2G · 교육
    -
    주기
    2024 –
    -
    성숙도
    TRL 8
    +
    +
    Domain
    Public AI access
    +
    Cycle
    2024 –
    +
    Maturity
    TRL 8
  3. -

    V–03

    -
    -

    XD Hub 산업용 IoT

    -

    - 데이터센터·제조·에너지·빌딩 도메인을 위한 산업용 IoT 데이터 통합 엔진. - 6종 산업 프로토콜을 단일 엔진으로 수집·전처리·전송합니다. -

    -

    Java Spring Boot × Netty × TimescaleDB

    +

    03 / 04

    +
    +

    XD Hub

    +

    데이터센터·제조·에너지·빌딩의 여섯 산업 프로토콜을 단일 엔진으로 수집하고 전처리해 전송합니다.

    +

    Java Spring Boot × Netty × TimescaleDB

    + XD Hub 상세 보기
    -
    -
    규모
    설비
    -
    주기
    2022 –
    -
    성숙도
    TRL 8
    +
    +
    Domain
    Industrial IoT
    +
    Cycle
    2022 –
    +
    Maturity
    TRL 8
  4. -

    V–04

    -
    -

    XD Works DCIM · FEMS

    -

    - XD Hub 가 모은 데이터를 받아 데이터센터 코로케이션, 빌딩, 공장, 발전소의 - 운영을 자동화하는 통합 운영 애플리케이션입니다. -

    -

    Spring Boot × NestJS × TypeScript

    +

    04 / 04

    +
    +

    XD Works

    +

    XD Hub가 모은 데이터를 받아 데이터센터, 빌딩, 공장, 발전소의 운영을 자동화하는 통합 애플리케이션입니다.

    +

    Spring Boot × NestJS × TypeScript

    + XD Works 상세 보기
    -
    -
    규모
    설비 · B2B
    -
    주기
    2023 –
    -
    성숙도
    TRL 8
    +
    +
    Domain
    DCIM · FEMS
    +
    Cycle
    2023 –
    +
    Maturity
    TRL 8
- -
-
-

한 일

-

- 공개 가능한 49건 가운데 12건입니다. 회사 소개서에 쓰는 문장 대신 이름과 연도, - 그리고 무엇으로 만들었는지를 적습니다. -

+
+
+
+

Selected work · 12 / 49

+

프로젝트는 이름과 기술로 증명합니다

+

+ 소개서 문장 대신 실제 프로젝트, 완료 연도, 사용 기술을 남깁니다. + 마지막 항목은 GPU 위에서 공기 흐름을 실시간으로 풀어 제어를 검증합니다. +

+
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
트웬티온스 수행 프로젝트 12건 — 이름, 연도, 사용 기술
번호프로젝트연도기술
001EduBill2024Next.js · TypeScript · Supabase PostgreSQL
002과천 데이터 센터2024Vue3 · Spring · PostgreSQL
003제주 폐기물 EMS2024Vue3 · Spring · PostgreSQL
004KDIS EAI2024Vue3 · Spring · PostgreSQL
005LS 일렉 청주 FEMS2024Vue3 · Spring · PostgreSQL
006LS 전선 부스덕트2024Vue3 · Spring · PostgreSQL
007브래키츠 BSLIM2024Spring Boot · PostgreSQL · WebSocket
008영진EL 2.0 스마트 APP2024Vue3
009미래기술학교 운영2024Unity Engine · Blender · Unreal Engine
010한유 AFIMS2024Vue3 · Spring · PostgreSQL
011비금도 EMS2024Vue3 · Spring · Java
012ACS (Auto Control System)2024Unity Engine · RFS 실시간 유체 시뮬레이션 · Transformer 기반 AI
-

- 마지막 줄이 지금 가장 멀리 가 있는 일입니다. 데이터센터의 공기 흐름을 GPU 위에서 - 실시간으로 풀어 제어를 검증합니다. -

+
+ + + + + + + + + + + + + + + + + + + +
트웬티온스 수행 프로젝트 12건
No.프로젝트연도기술
001EduBill2024Next.js · TypeScript · Supabase PostgreSQL
002과천 데이터 센터2024Vue3 · Spring · PostgreSQL
003제주 폐기물 EMS2024Vue3 · Spring · PostgreSQL
004KDIS EAI2024Vue3 · Spring · PostgreSQL
005LS 일렉 청주 FEMS2024Vue3 · Spring · PostgreSQL
006LS 전선 부스덕트2024Vue3 · Spring · PostgreSQL
007브래키츠 BSLIM2024Spring Boot · PostgreSQL · WebSocket
008영진EL 2.0 스마트 APP2024Vue3
009미래기술학교 운영2024Unity Engine · Blender · Unreal Engine
010한유 AFIMS2024Vue3 · Spring · PostgreSQL
011비금도 EMS2024Vue3 · Spring · Java
012ACS · Auto Control System2024Unity Engine · RFS 실시간 유체 시뮬레이션 · Transformer AI
+
- -
-
-

함께 일한 곳

-

- 대학과 대기업 설비 부문이 섞여 있습니다. 어느 쪽이든 검수 기준이 까다로운 곳입니다. -

-
    -
  • LS SAUTER
  • -
  • 경희대학교
  • -
  • SAEKI P&C
  • -
  • KDI School
  • -
  • COSS 사업단
  • -
  • 클라우드브릭
  • -
  • 한유
  • -
  • 게임랩
  • -
  • METANET PLATFORM
  • -
  • 안랩
  • -
  • 강원대학교
  • -
  • 중앙대학교
  • -
  • 건국대학교
  • -
  • 한화솔루션
  • -
  • 가비아
  • -
  • GS칼텍스
  • -
  • SK하이닉스
  • -
  • LG디스플레이
  • -
  • 대구한의대학교
  • +
    +
    +
    +

    Company record

    +

    엄격한 검수 기준의 현장과 함께해 왔습니다

    +

    대학, 공공기관, 대기업 설비 부문처럼 운영 중단의 비용이 큰 현장이 주 무대입니다.

    +
    + +
      +
    • LS SAUTER
    • 경희대학교
    • SAEKI P&C
    • KDI School
    • +
    • COSS 사업단
    • 클라우드브릭
    • 한유
    • 게임랩
    • +
    • METANET PLATFORM
    • 안랩
    • 강원대학교
    • 중앙대학교
    • +
    • 건국대학교
    • 한화솔루션
    • 가비아
    • GS칼텍스
    • +
    • SK하이닉스
    • LG디스플레이
    • 대구한의대학교
    + +
    + + 최근 외부 기록 + 07 entries + +
      +
    1. K기술대상 산업대상 수상

      실감미디어·산업용 IoT 분야의 기술 혁신 성과를 인정받았습니다.

      수상·인증
    2. +
    3. 경기우수벤처기업 표창

      경기지방중소벤처기업청장상 · 기술·경영·혁신과 사회공헌 인정

      수상·인증
    4. +
    5. 2025 경기도 일자리 우수기업 인증

      고용증가율, 근무환경, 복리후생 제도 개선으로 인정

      수상·인증
    6. +
    7. 건국대, 시리아·요르단 교육기관 대표단 방문

      함께 개발한 메타버스 기반 교육 플랫폼 시연

      교육·협력
    8. +
    9. 중동 대표단, X-Space에서 K-에듀테크 체험

      메타버스 기반 교육 플랫폼 체험과 협력 논의

      교육·협력
    10. +
    11. 과기정통부 가상융합대학원 성과공유회

      서강대 개최 · AI 시대 인재양성 비전 논의 참여

      행사
    12. +
    13. 벤처기업 혁신성장유형 재인증

      기술 중심 비전과 디지털 혁신 노력 인정

      수상·인증
    14. +
    +
    + +
    + + 현재 채용 상태 + 정규 공고 마감 + +
    +

    닫힌 공고를 열려 있는 것처럼 보이지 않게 상태를 그대로 적습니다.

    +
      +
    • 시니어 소프트웨어 엔지니어산업용 소프트웨어 · C++ / C# / Python · PLC · HMI · SCADA마감
    • +
    • DevOps 엔지니어컨테이너 · 오케스트레이션 · CI/CD · IaC마감
    • +
    • 프로덕트 매니저IT 서비스 기획·운영 · 데이터 기반 의사결정마감
    • +
    • 서비스 기획자UI/UX 기획 · 와이어프레임 · 애자일 / 스크럼마감
    • +
    • UI/UX 디자이너Figma · 웹 / 모바일 · 사용자 중심 설계마감
    • +
    + 채용 문의 보내기 +
    +
    - -
    -
    -

    최근 기록

    -

    밖에서 확인된 것

    - -
      -
    1. -

      2026.02.24

      -
      -

      경기우수벤처기업 표창 — 경기지방중소벤처기업청장상

      -

      기술·경영·혁신 능력이 뛰어나고 사회공헌도가 높은 벤처기업으로 인정

      -
      -

      수상 · 인증

      -
    2. -
    3. -

      2026.01.20

      -
      -

      2025 경기도 일자리 우수기업 인증

      -

      고용증가율 10% 이상, 근무환경과 복리후생 제도 개선으로 인정

      -
      -

      수상 · 인증

      -
    4. -
    5. -

      2025.11.03

      -
      -

      건국대, 시리아·요르단 교육기관 대표단 방문

      -

      트웬티온스와 함께 개발한 메타버스 기반 교육 플랫폼 시연

      -
      -

      교육 · 협력

      -
    6. -
    7. -

      2025.10.31

      -
      -

      중동 대표단, X-Space 에서 K-에듀테크 체험

      -

      메타버스 기반 교육 플랫폼 체험과 협력 논의

      -
      -

      교육 · 협력

      -
    8. -
    9. -

      2025.08.19

      -
      -

      과기정통부 2025 가상융합대학원 성과공유회

      -

      서강대 개최. AI 시대 인재양성 비전 논의에 참여

      -
      -

      행사

      -
    10. -
    11. -

      2025.07.04

      -
      -

      벤처기업 혁신성장유형 재인증

      -

      기술 중심의 비전과 디지털 혁신 노력을 인정받음

      -
      -

      수상 · 인증

      -
    12. -
    -
    -
    - - -
    -
    -
    -

    지금은 정규 공고가 닫혀 있습니다

    +
    +
    +
    +

    Start a project

    +

    다음 현장을
    함께 설계하겠습니다

    -
    -

    - 다섯 개 직무가 모두 마감 상태입니다. 닫힌 것을 열려 있는 것처럼 적어 두면 - 지원하는 쪽의 시간을 뺏게 되므로, 상태를 그대로 적습니다. -

    -
      -
    • - 시니어 소프트웨어 엔지니어 - 산업용 소프트웨어 · C++ / C# / Python · PLC · HMI · SCADA - 마감 -
    • -
    • - DevOps 엔지니어 - 컨테이너 · 오케스트레이션 · CI/CD · IaC - 마감 -
    • -
    • - 프로덕트 매니저 - IT 서비스 기획·운영 3년 이상 · 데이터 기반 의사결정 - 마감 -
    • -
    • - 서비스 기획자 - UI/UX 기획 · 와이어프레임 · 애자일 / 스크럼 - 마감 -
    • -
    • - UI/UX 디자이너 - Figma · 웹 / 모바일 포트폴리오 · 사용자 중심 설계 - 마감 -
    • -
    -

    - 공고와 무관하게 이야기를 시작할 수는 있습니다. - 채용 문의 보내기 -

    -
    -
    -
    - - -
    -
    -
    -

    연락

    -
    -
    -
    -
    -
    주소
    -
    경기도 화성시 동탄첨단산업1로 27, A909호
    (영천동, 금강펜테리움 IX 타워)
    -
    -
    -
    전화
    -
    070-4353-1190
    -
    -
    -
    메일
    -
    hello@twentyoz.kr
    -
    -
    -
    설립
    -
    2020년 1월
    -
    +
    +

    가상현실, 산업 데이터, 운영 자동화가 실제 현장에서 돌아가야 한다면 지금 이야기할 수 있습니다.

    + hello@twentyoz.kr +
    +
    Address
    경기도 화성시 동탄첨단산업1로 27, A909호
    +
    Telephone
    070-4353-1190
    +
    Founded
    2020년 1월
    - - 프로젝트 문의 -
-
-
-

트웬티온스 · TWENTYOZ

-

- 가상현실 · 산업용 IoT · 이커머스 솔루션 · 경기도 화성시 동탄 +

diff --git a/apps/site/public/work/twentyoz-corp/products.html b/apps/site/public/work/twentyoz-corp/products.html new file mode 100644 index 0000000..b72b750 --- /dev/null +++ b/apps/site/public/work/twentyoz-corp/products.html @@ -0,0 +1,161 @@ + + + + + + 제품 시스템 — TWENTYOZ + + + + + + + + + + + + + + + + +
+
+ + TWENTYOZ + + +

PRODUCT SYSTEMS · 04

+
+
+ +
+
+
+
+

Self IP · Product catalog

+

네 개의 시스템

+
+

+ 교육과 훈련, 공공 AI 도입, 산업 데이터 수집, 시설 운영 자동화까지 각 제품의 기능과 기술 사양을 공개합니다. +

+ +
+
+ +
+
+
+

V–01 / IMMERSIVE

+

VIVEN

+

최대 100명이 VR·PC·모바일에서 함께 참여하는 교육 특화 메타버스 플랫폼입니다.

+
+
+
Type
Self IP / Platform
Category
VR 교육·훈련
+
Build cycle
2021 – 현재
Maturity
TRL 9
+
+
+
+

Capability matrix

VIVEN 주요 기능

+
    +
  1. C–01실시간 협업

    단일 가상 공간에서 최대 100명의 교육과 훈련을 지원합니다.

  2. +
  3. C–02멀티 디바이스

    VR 헤드셋, PC, iOS와 Android 환경을 하나의 세션으로 연결합니다.

  4. +
  5. C–03AI 모션캡처

    PC VMC와 Mobile VMC로 웹캠 기반 아바타 동작을 실시간 반영합니다.

  6. +
  7. C–04성과 분석

    커스텀 시나리오, 교육 성과 리포트, 클라우드 콘텐츠 관리를 제공합니다.

  8. +
+
+ +
+
+

Operating sequence

+
  1. 시나리오 구성교육 목적에 맞는 가상 공간과 과정을 설계합니다.
  2. 멀티 디바이스 접속VR·PC·모바일 사용자를 같은 세션으로 연결합니다.
  3. 실시간 참여협업, 공간음향, 모션캡처를 동기화합니다.
  4. 성과 확인활동 결과를 분석하고 리포트로 제공합니다.
+
+

VIVEN 도입 문의

+
+
+ +
+
+
+

V–02 / PUBLIC AI

EduBill

+

공공기관과 교육기관이 해외 AI 서비스를 원화 결제와 세금계산서로 도입하도록 지원합니다.

+
+
Type
Self IP / SaaS
Category
EdTech 구독 관리
Build cycle
2024 – 현재
Maturity
TRL 8
+
+

Capability matrix

EduBill 주요 기능

+
    +
  1. C–01원화 결제

    해외 AI 서비스 비용을 원화로 결제하고 세금계산서를 발행합니다.

  2. +
  3. C–02통합 라이선스

    ChatGPT, Claude, Gemini 등 여러 서비스의 라이선스를 함께 관리합니다.

  4. +
  5. C–03계약 자동화

    계약 만료와 자동 갱신 일정을 사전에 알립니다.

  6. +
  7. C–04일괄 배정

    기관, 부서, 사용자 단위로 라이선스를 배정하고 회수합니다.

  8. +
+
+ +
+

Operating sequence

  1. 수요 취합기관별 서비스와 사용자 수를 확인합니다.
  2. 라이선스 배정부서와 사용자 단위로 접근 권한을 구성합니다.
  3. 결제·증빙원화 결제와 세금계산서 발행을 처리합니다.
  4. 갱신 관리만료 일정과 사용 현황을 함께 관리합니다.
+

EduBill 도입 문의

+
+
+ +
+
+

V–03 / INDUSTRIAL DATA

XD Hub

최대 100만 포인트를 실시간 처리하고 여섯 산업 프로토콜을 통합하는 IoT 데이터 엔진입니다.

+
Type
Self IP / Engine
Category
산업용 IoT
Build cycle
2022 – 현재
Maturity
TRL 8
+
+

Capability matrix

XD Hub 주요 기능

    +
  1. C–01멀티 프로토콜

    Modbus, OPC UA, SNMP, BACnet, MQTT, REST를 한 엔진으로 수집합니다.

  2. +
  3. C–02히스토리안

    실시간 데이터를 시계열 저장소에 자동 보관하고 조회합니다.

  4. +
  5. C–03Web HMI

    SCADA 화면을 웹에서 구성하고 현장 상태를 시각화합니다.

  6. +
  7. C–04하이브리드 배포

    엣지와 클라우드 환경을 현장 조건에 맞게 함께 구성합니다.

  8. +
+ +
+

Operating sequence

  1. 프로토콜 연결서로 다른 설비 통신 규격을 게이트웨이에 연결합니다.
  2. 수집·전처리실시간 값을 정규화하고 품질을 확인합니다.
  3. 시계열 저장히스토리안과 캐시에 운영 데이터를 보관합니다.
  4. 전송·시각화운영 애플리케이션과 Web HMI에 데이터를 제공합니다.
+

XD Hub 도입 문의

+
+
+ +
+
+

V–04 / OPERATIONS

XD Works

XD Hub의 IoT 데이터를 기반으로 데이터센터와 시설의 운영, 점검, 과금을 자동화합니다.

+
Type
Self IP / Application
Category
DCIM · BEMS · FM
Build cycle
2023 – 현재
Maturity
TRL 8
+
+

Capability matrix

XD Works 주요 기능

    +
  1. C–01상면·계약·청구

    데이터센터 상면과 고객 계약, 사용량 기반 청구를 통합 관리합니다.

  2. +
  3. C–02에너지 분석

    BEMS 데이터를 분석하고 PUE를 자동 산정합니다.

  4. +
  5. C–03시설물 점검

    정기 점검과 유지보수 작업의 책임과 이력을 관리합니다.

  6. +
  7. C–04다채널 알림

    SMS, 알림톡, 이메일로 운영 이상과 업무 일정을 전달합니다.

  8. +
+ +
+

Operating sequence

  1. 자산·계약 구성공간, 설비, 고객, 계약 정보를 연결합니다.
  2. 실시간 운영XD Hub의 계측 데이터를 운영 화면에 반영합니다.
  3. 점검·분석유지보수와 에너지 성과를 같은 흐름에서 관리합니다.
  4. 과금·알림사용량을 계산하고 청구서와 운영 알림을 발행합니다.
+

XD Works 도입 문의

+
+
+ +

제품 정보는 2026년 8월 24일 기준 트웬티온스 공식 공개 자료를 바탕으로 구성했습니다.

+
+ +

TWENTYOZ · 트웬티온스

Product systems · Technical specifications

© 2020–2026 TWENTYOZ. All rights reserved.

+ + diff --git a/apps/site/public/work/twentyoz-corp/scripts/core-boot.js b/apps/site/public/work/twentyoz-corp/scripts/core-boot.js new file mode 100644 index 0000000..9862391 --- /dev/null +++ b/apps/site/public/work/twentyoz-corp/scripts/core-boot.js @@ -0,0 +1,100 @@ +(() => { + const hero = document.querySelector(".hero"); + const canvas = document.getElementById("coreCanvas"); + const toggle = document.getElementById("motionToggle"); + const status = document.getElementById("coreStatus"); + const inputs = [...document.querySelectorAll('input[name="field"]')]; + const ownScript = document.currentScript; + + if (!hero || !canvas || !toggle || !status || !ownScript || inputs.length !== 4) return; + + const stateLabels = [ + "선택한 현장: 강의실과 훈련장", + "선택한 현장: 데이터센터와 발전소", + "선택한 현장: 공공기관과 대학 행정", + "선택한 현장: 공장과 설비 현장", + ]; + let controller = null; + + function selectedIndex() { + const checked = inputs.findIndex((input) => input.checked); + return checked < 0 ? 0 : checked; + } + + function syncState() { + const index = selectedIndex(); + hero.dataset.coreState = inputs[index].value; + status.textContent = stateLabels[index]; + controller?.setState(index); + } + + inputs.forEach((input) => input.addEventListener("change", syncState)); + syncState(); + + function gate() { + const explicitWebgl = new URLSearchParams(location.search).has("webgl"); + if ((navigator.webdriver || location.protocol === "file:") && !explicitWebgl) return "automation"; + if (matchMedia("(prefers-reduced-motion: reduce)").matches) return "reduced-motion"; + if (navigator.connection?.saveData) return "save-data"; + if ((navigator.deviceMemory ?? 8) < 4) return "low-memory"; + if ((navigator.hardwareConcurrency ?? 8) < 4) return "low-cpu"; + try { + const probe = document.createElement("canvas"); + const gl = probe.getContext("webgl2", { failIfMajorPerformanceCaveat: true }); + if (!gl) return "no-webgl2"; + gl.getExtension("WEBGL_lose_context")?.loseContext(); + return "ready"; + } catch { + return "no-webgl2"; + } + } + + const result = gate(); + if (result !== "ready") { + hero.dataset.webgl = "fallback"; + hero.dataset.webglReason = result; + return; + } + + function loadCore() { + if (hero.dataset.webgl === "loading" || hero.dataset.webgl === "ready") return; + hero.dataset.webgl = "loading"; + const script = document.createElement("script"); + script.src = new URL("../assets/core.iife.js", ownScript.src).href; + script.async = true; + script.onload = () => { + try { + controller = globalThis.TwentyozCore.mount({ + canvas, + hero, + toggle, + initialState: selectedIndex(), + }); + addEventListener("pagehide", () => controller?.dispose(), { once: true }); + } catch { + hero.dataset.webgl = "fallback"; + hero.dataset.webglReason = "mount-failed"; + toggle.hidden = true; + } + }; + script.onerror = () => { + hero.dataset.webgl = "fallback"; + hero.dataset.webglReason = "asset-failed"; + toggle.hidden = true; + }; + document.head.append(script); + } + + const observer = new IntersectionObserver( + ([entry]) => { + if (!entry.isIntersecting) return; + observer.disconnect(); + const schedule = window.requestIdleCallback || ((callback) => setTimeout(callback, 1)); + schedule(loadCore, { timeout: 1200 }); + }, + { rootMargin: "200px" }, + ); + observer.observe(hero); + + matchMedia("(prefers-reduced-motion: reduce)").addEventListener("change", () => location.reload()); +})(); diff --git a/apps/site/public/work/twentyoz-corp/styles/catalog.css b/apps/site/public/work/twentyoz-corp/styles/catalog.css new file mode 100644 index 0000000..3ae74b2 --- /dev/null +++ b/apps/site/public/work/twentyoz-corp/styles/catalog.css @@ -0,0 +1,352 @@ +.catalog-page .site-head { + position: fixed; + background: color-mix(in srgb, var(--page) 88%, transparent); + backdrop-filter: blur(18px); +} + +.catalog-main { + overflow: clip; +} + +.catalog-hero { + min-height: 76svh; + display: grid; + align-items: end; + padding-block: calc(var(--header-h) + var(--space-8)) var(--space-7); + border-block-end: var(--hairline) solid var(--line-strong); +} + +.catalog-hero-grid { + display: grid; + grid-template-columns: minmax(0, 1.25fr) minmax(16rem, 0.75fr); + gap: var(--space-7); + align-items: end; +} + +.catalog-hero h1 { + max-width: 11ch; + margin-block-start: var(--space-5); + font-size: clamp(3.5rem, 2rem + 7vw, 7.5rem); + font-weight: 500; + line-height: 0.94; + letter-spacing: -0.045em; + white-space: nowrap; +} + +.catalog-lede { + max-width: var(--measure); + color: var(--ink-muted); + font-size: var(--text-lead); +} + +.catalog-index { + grid-column: 1 / -1; + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + margin-block-start: var(--space-7); + border-block: var(--hairline) solid var(--line-strong); +} + +.catalog-index a { + min-height: 5.5rem; + display: grid; + align-content: center; + gap: var(--space-1); + padding: var(--space-3) var(--space-4); + border-inline-start: var(--hairline) solid var(--line); + text-decoration: none; +} + +.catalog-index a:first-child { + border-inline-start: 0; +} + +.catalog-index span { + color: var(--signal-strong); + font-size: var(--text-xs); + letter-spacing: var(--tracking-label); +} + +.catalog-index strong { + font-size: var(--text-body); + font-weight: 620; +} + +.specimen { + scroll-margin-top: calc(var(--header-h) + var(--space-3)); + padding-block: var(--space-9); + border-block-end: var(--hairline) solid var(--line-strong); +} + +.specimen:nth-of-type(even) { + background: var(--surface-quiet); +} + +.specimen-heading { + display: grid; + grid-template-columns: minmax(5rem, 0.3fr) minmax(0, 1.35fr) minmax(17rem, 0.65fr); + gap: var(--space-6); + align-items: end; +} + +.specimen-code { + align-self: start; + color: var(--signal-strong); + font-size: var(--text-xs); + font-weight: 650; + letter-spacing: var(--tracking-label); +} + +.specimen h2 { + font-size: clamp(3.5rem, 2.5rem + 4vw, 7rem); + font-weight: 500; + line-height: 0.94; + letter-spacing: -0.04em; +} + +.specimen-summary { + color: var(--ink-muted); + font-size: var(--text-lead); +} + +.vital-grid { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + margin-block-start: var(--space-7); + border-block: var(--hairline) solid var(--line-strong); +} + +.vital-grid div { + min-width: 0; + padding: var(--space-4); + border-inline-start: var(--hairline) solid var(--line); +} + +.vital-grid div:first-child { + border-inline-start: 0; +} + +.vital-grid dt, +.spec-list dt { + color: var(--ink-muted); + font-size: var(--text-xs); + letter-spacing: var(--tracking-label); +} + +.vital-grid dd { + margin-block-start: var(--space-3); + font-size: var(--text-sm); + font-weight: 620; +} + +.detail-grid { + display: grid; + grid-template-columns: minmax(0, 1.25fr) minmax(18rem, 0.75fr); + gap: var(--space-7); + margin-block-start: var(--space-8); + align-items: start; +} + +.detail-label { + margin-block-end: var(--space-4); + color: var(--ink-muted); + font-size: var(--text-xs); + letter-spacing: var(--tracking-label); +} + +.capability-list { + border-block-start: var(--hairline) solid var(--line-strong); +} + +.capability-list li { + display: grid; + grid-template-columns: 4.5rem minmax(0, 0.8fr) minmax(0, 1.2fr); + gap: var(--space-4); + padding-block: var(--space-4); + border-block-end: var(--hairline) solid var(--line); +} + +.capability-list span { + color: var(--signal-strong); + font-size: var(--text-xs); +} + +.capability-list strong { + font-size: var(--text-body); + font-weight: 620; +} + +.capability-list p { + color: var(--ink-muted); + font-size: var(--text-sm); +} + +.technical-panel { + position: sticky; + inset-block-start: calc(var(--header-h) + var(--space-5)); +} + +.stack-list { + display: flex; + flex-wrap: wrap; + gap: var(--space-2); + margin-block-end: var(--space-6); +} + +.stack-list li { + padding: var(--space-1) var(--space-2); + border: var(--hairline) solid var(--line-strong); + font-size: var(--text-xs); +} + +.spec-list { + border-block-start: var(--hairline) solid var(--line-strong); +} + +.spec-list div { + display: grid; + grid-template-columns: 7rem minmax(0, 1fr); + gap: var(--space-3); + padding-block: var(--space-3); + border-block-end: var(--hairline) solid var(--line); +} + +.spec-list dd { + font-size: var(--text-sm); +} + +.operation-flow { + margin-block-start: var(--space-8); + padding-block-start: var(--space-5); + border-block-start: var(--hairline) solid var(--line-strong); +} + +.operation-flow ol { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + margin-block-start: var(--space-4); +} + +.operation-flow li { + position: relative; + min-height: 10rem; + padding: var(--space-4); + border-inline-start: var(--hairline) solid var(--line); +} + +.operation-flow li:first-child { + border-inline-start: 0; +} + +.operation-flow li::before { + content: attr(data-step); + display: block; + margin-block-end: var(--space-4); + color: var(--signal-strong); + font-size: var(--text-xs); +} + +.operation-flow strong { + display: block; + margin-block-end: var(--space-2); + font-size: var(--text-sm); +} + +.operation-flow span { + color: var(--ink-muted); + font-size: var(--text-xs); + line-height: 1.65; +} + +.specimen-action { + display: flex; + justify-content: flex-end; + margin-block-start: var(--space-6); +} + +.catalog-source { + padding-block: var(--space-6); + color: var(--ink-soft); + font-size: var(--text-xs); +} + +.catalog-source a { + display: inline-block; + min-height: 1.5rem; + line-height: 1.5rem; + text-underline-offset: 0.2em; +} + +@media (max-width: 62rem) { + .catalog-hero-grid, + .specimen-heading, + .detail-grid { + grid-template-columns: 1fr; + } + + .catalog-lede { + max-width: 34rem; + } + + .technical-panel { + position: static; + } + + .principle-list, + .operation-flow ol { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} + +@media (max-width: 43rem) { + .catalog-page .site-head { + position: relative; + } + + .catalog-hero { + min-height: 0; + padding-block: var(--space-7); + } + + .catalog-hero h1 { + font-size: clamp(1.8rem, 9.5vw, 3rem); + } + + .catalog-index, + .vital-grid, + .operation-flow ol { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .catalog-index a:nth-child(3), + .vital-grid div:nth-child(3), + .operation-flow li:nth-child(3) { + border-inline-start: 0; + } + + .catalog-index a:nth-child(n + 3), + .vital-grid div:nth-child(n + 3), + .operation-flow li:nth-child(n + 3) { + border-block-start: var(--hairline) solid var(--line); + } + + .specimen { + padding-block: var(--space-8); + } + + .specimen h2 { + font-size: clamp(3rem, 17vw, 5rem); + } + + .capability-list li { + grid-template-columns: 3.5rem minmax(0, 1fr); + } + + .capability-list p { + grid-column: 2; + } + + .operation-flow li { + min-height: 9rem; + } +} diff --git a/apps/site/public/work/twentyoz-corp/styles/main.css b/apps/site/public/work/twentyoz-corp/styles/main.css index a7673cc..28c11bf 100644 --- a/apps/site/public/work/twentyoz-corp/styles/main.css +++ b/apps/site/public/work/twentyoz-corp/styles/main.css @@ -1,76 +1,94 @@ -@import "./tokens.css"; - -/* ========================================================================== - 트웬티온스 — 메인 스타일시트 - - 현행 사이트는 순흑 한 겹이라 무엇이 중요한지 알 수 없었다. 종이를 기본으로 - 뒤집고, 반전(잉크) 밴드는 '기계'를 다루는 두 섹션(제품·기록)에만 쓴다. - 반전은 아래 두 클래스가 토큰을 재정의하는 규칙이다 — 섹션마다 기분대로가 아니다. - ========================================================================== */ - +/* Base */ *, *::before, *::after { box-sizing: border-box; - margin: 0; - padding: 0; } html { - font-size: 16px; + min-width: 20rem; scroll-behavior: smooth; - overflow-x: hidden; - background: var(--surface); + background: var(--page); + color: var(--ink); + font-family: var(--font-sans); + font-synthesis: none; + text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; } body { min-height: 100dvh; - font-family: var(--font-body); - font-size: var(--step-0); - line-height: var(--leading-normal); - background: var(--surface); - color: var(--ink); - word-break: keep-all; + margin: 0; overflow-wrap: break-word; - overflow-x: hidden; + background: var(--page); + color: var(--ink); + font-size: var(--text-body); + line-height: var(--leading-body); + word-break: keep-all; +} + +::selection { + background: var(--selection); + color: var(--ink); } img, -svg { +canvas { display: block; max-width: 100%; } +img { + height: auto; +} + a { color: inherit; } button, input, -select, -textarea { +summary { font: inherit; - color: inherit; } -fieldset { - border: 0; +button, +summary, +label { + -webkit-tap-highlight-color: transparent; } h1, h2, -h3 { - font-weight: 600; - line-height: var(--leading-tight); - letter-spacing: -0.015em; /* 현행 사이트의 −0.06em 은 한글 상한의 세 배였다 */ - text-wrap: balance; +h3, +p, +dl, +dd, +ol, +ul, +fieldset { + margin: 0; } -.mono { - font-family: var(--font-mono); - font-variant-numeric: tabular-nums; +ol, +ul { + padding: 0; + list-style: none; +} + +fieldset { + min-width: 0; + padding: 0; + border: 0; +} + +button[hidden] { + display: none; +} + +:focus-visible { + outline: var(--focus-width) solid var(--focus); + outline-offset: var(--space-1); } .sr-only { @@ -85,201 +103,408 @@ h3 { border: 0; } +.skip-link { + position: fixed; + inset-block-start: var(--space-3); + inset-inline-start: var(--space-3); + z-index: 100; + min-height: var(--control-min); + padding: var(--space-2) var(--space-4); + background: var(--ink); + color: var(--page); + translate: 0 calc((100% + var(--space-6)) * -1); + transition: translate var(--dur-instant) var(--ease-out); +} + +.skip-link:focus { + translate: 0 0; +} + .wrap { - width: min(100% - 2 * var(--pad-inline), var(--container)); + width: min(calc(100% - (var(--page-pad) * 2)), var(--wide)); margin-inline: auto; } -/* ── 두 체제 ────────────────────────────────────────────────────── */ -.band-light { - --band-surface: var(--surface); - --band-surface-2: var(--surface-2); - --band-surface-3: var(--surface-3); - --band-line: var(--line); - --band-line-strong: var(--line-strong); - --band-ink: var(--ink); - --band-ink-muted: var(--ink-muted); - --band-ink-faint: var(--ink-faint); - --band-accent: var(--accent); - --band-accent-hover: var(--accent-hover); - --band-accent-ink: var(--accent-ink); - --band-accent-wash: var(--accent-wash); +.eyebrow, +.head-meta, +.tab-num, +.panel-index, +.product-id, +.tech-line, +.product-meta, +.ledger, +.record-list time, +.record-list > li > span, +.site-foot { + font-variant-numeric: tabular-nums; } -.band-dark { - --band-surface: var(--dark-surface); - --band-surface-2: var(--dark-surface-2); - --band-surface-3: var(--dark-surface-3); - --band-line: var(--dark-line); - --band-line-strong: var(--dark-line-strong); - --band-ink: var(--dark-ink); - --band-ink-muted: var(--dark-ink-muted); - --band-ink-faint: var(--dark-ink-faint); - --band-accent: var(--dark-accent); - --band-accent-hover: var(--dark-accent-hover); - --band-accent-ink: var(--dark-accent-ink); - --band-accent-wash: var(--dark-accent-wash); +.eyebrow { + color: var(--ink-muted); + font-size: var(--text-xs); + font-weight: 650; + letter-spacing: var(--tracking-label); } -.band { +.text-link { position: relative; - background: var(--band-surface); - color: var(--band-ink); + display: inline-flex; + align-items: center; + min-height: var(--control-min); + text-decoration-thickness: var(--hairline); + text-underline-offset: var(--space-2); } -.band > .wrap { - padding-block: var(--space-8); +.text-link::after { + content: "↗"; + margin-inline-start: var(--space-2); + transition: translate var(--dur-instant) var(--ease-out); } -/* ── 접근성 ─────────────────────────────────────────────────────── */ -.skip-link { - position: fixed; - top: var(--space-3); - left: var(--space-3); - z-index: 200; - padding: var(--space-2) var(--space-3); - background: var(--ink); - color: var(--surface); - text-decoration: none; - transform: translateY(-250%); - transition: transform var(--dur-quick) var(--ease); +.text-link:hover::after, +.text-link:focus-visible::after { + translate: var(--space-1) calc(var(--space-1) * -1); } -.skip-link:focus-visible { - transform: translateY(0); -} - -:where(a, button, input, label, [tabindex]):focus-visible { - outline: 2px solid var(--band-accent, var(--accent)); - outline-offset: 3px; -} - -/* ── 헤더 ───────────────────────────────────────────────────────── */ +/* Header */ .site-head { - position: sticky; - top: 0; - z-index: 100; - background: var(--surface); - border-bottom: 1px solid var(--line-strong); + position: absolute; + inset-block-start: 0; + inset-inline: 0; + z-index: 20; + color: var(--ink); } .head-inner { - display: flex; + min-height: var(--header-h); + display: grid; + grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); align-items: center; - justify-content: space-between; - gap: var(--space-3); - min-height: 56px; - min-width: 0; + gap: var(--space-5); + border-block-end: var(--hairline) solid var(--line); } .wordmark { + justify-self: start; display: inline-flex; align-items: center; - gap: var(--space-2); - font-weight: 600; + min-height: var(--control-min); + gap: var(--space-3); + color: inherit; + font-size: var(--text-sm); + font-weight: 720; + letter-spacing: var(--tracking-label); text-decoration: none; white-space: nowrap; - flex-shrink: 0; } -.wordmark-badge { +.wordmark-mark { + position: relative; + width: 1.5rem; + height: 1.5rem; display: inline-grid; place-items: center; - width: 26px; - height: 26px; - background: var(--ink); - color: var(--surface); - font-size: 0.75rem; - font-weight: 700; + border: var(--hairline) solid currentColor; +} + +.wordmark-mark i { + position: absolute; + background: currentColor; +} + +.wordmark-mark i:first-child { + width: var(--hairline); + height: 100%; +} + +.wordmark-mark i:last-child { + width: 100%; + height: var(--hairline); } .nav { display: flex; - gap: clamp(var(--space-3), 2.4vw, var(--space-5)); - min-width: 0; + align-items: center; + justify-content: center; + gap: clamp(var(--space-4), 3vw, var(--space-6)); } .nav a { - color: var(--ink-muted); - font-size: var(--step--1); + position: relative; + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 1.5rem; + min-height: var(--control-min); + color: inherit; + font-size: var(--text-sm); + font-weight: 560; text-decoration: none; white-space: nowrap; - padding-block: var(--space-2); - transition: color var(--dur-quick) var(--ease); } -.nav a:hover { - color: var(--accent); +.nav a::after { + content: ""; + position: absolute; + inset-inline: 0; + inset-block-end: 0; + height: var(--hairline); + background: currentColor; + scale: 0 1; + transform-origin: left; + transition: scale var(--dur-quick) var(--ease-out); +} + +.nav a:hover::after, +.nav a:focus-visible::after { + scale: 1 1; } .head-meta { - font-size: var(--step--1); - color: var(--ink-faint); + justify-self: end; + color: var(--ink-muted); + font-size: var(--text-xs); + letter-spacing: var(--tracking-label); white-space: nowrap; - flex-shrink: 0; } -/* ── 히어로 ─────────────────────────────────────────────────────── */ -.hero h1 { - font-size: var(--display); - max-width: 16ch; +/* Hero */ +.hero { + position: relative; + min-height: max(48rem, 100svh); + isolation: isolate; + background: var(--page); + overflow: clip; +} + +.hero-stage { + position: absolute; + inset: 0; + z-index: -2; + background: var(--surface); +} + +.hero-stage::before, +.hero-stage::after { + content: ""; + position: absolute; + inset: 0; + z-index: 3; + pointer-events: none; +} + +.hero-stage::before { + background: var(--core-scrim); +} + +.hero-stage::after { + background: var(--core-vignette); +} + +.core-poster, +.core-poster img, +#coreCanvas { + position: absolute; + inset: 0; + width: 100%; + height: 100%; +} + +.core-poster { + z-index: 1; + opacity: 1; + transition: opacity var(--dur-normal) var(--ease-soft); +} + +.core-poster img { + object-fit: cover; + object-position: center; +} + +#coreCanvas { + z-index: 2; + max-width: none; + opacity: 0; + pointer-events: none; + transition: opacity var(--dur-normal) var(--ease-soft); +} + +.hero[data-webgl="ready"] .core-poster { + opacity: 0; +} + +.hero[data-webgl="ready"] #coreCanvas { + opacity: 1; +} + +.hero[data-webgl="fallback"] .core-poster { + opacity: 1; + transition: none; +} + +.hero[data-webgl="fallback"] #coreCanvas { + opacity: 0; + transition: none; +} + +.hero-grid { + min-height: max(48rem, 100svh); + display: grid; + grid-template-rows: minmax(0, 1fr) auto; + gap: var(--space-5); + padding-block: calc(var(--header-h) + var(--space-6)) var(--space-4); +} + +.hero-copy { + align-self: center; + max-width: var(--measure); + padding-block: var(--space-6); +} + +.hero-copy .eyebrow { + margin-block-end: var(--space-4); +} + +.hero-copy h1 { + max-width: 13ch; + color: var(--ink); + font-size: var(--text-display); + font-weight: 560; + line-height: var(--leading-tight); + letter-spacing: var(--tracking-display); } .hero-lead { - margin-top: var(--space-4); - max-width: var(--measure); - font-size: var(--step-1); - color: var(--band-ink-muted); - line-height: var(--leading-loose); + max-width: var(--measure-narrow); + margin-block-start: var(--space-5); + color: var(--ink-muted); + font-size: var(--text-lead); + line-height: var(--leading-body); } -/* ── 현장 선택기 — JS 0바이트. 라디오 그룹이라 좌우 화살표가 그대로 먹는다 ── */ +.hero-actions { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: var(--space-4); + margin-block-start: var(--space-5); +} + +.button { + position: relative; + isolation: isolate; + min-height: var(--control-min); + display: inline-flex; + align-items: center; + justify-content: center; + padding: var(--space-2) var(--space-4); + border: var(--hairline) solid var(--signal); + border-radius: var(--radius); + background: var(--signal); + color: var(--signal-ink); + font-size: var(--text-sm); + font-weight: 650; + text-decoration: none; + transition: translate var(--dur-instant) var(--ease-out), scale var(--dur-instant) var(--ease-out); +} + +.button::before { + content: ""; + position: absolute; + inset: 0; + z-index: -1; + background: var(--ink); + opacity: 0; + transition: opacity var(--dur-instant) var(--ease-out); +} + +.button:hover, +.button:focus-visible { + translate: 0 calc(var(--space-1) * -1); +} + +.button:hover::before, +.button:focus-visible::before { + opacity: 0.12; +} + +.button:active { + translate: 0 0; + scale: 0.98; +} + +/* Field selector */ .fields { - margin-top: var(--space-6); + width: 100%; + align-self: end; +} + +.fields fieldset { + position: relative; } .field-radio { position: absolute; - width: 1px; - height: 1px; + z-index: 1; + inset-block-start: 0; + width: 25%; + height: calc(var(--control-min) + var(--space-4)); + margin: 0; opacity: 0; pointer-events: none; } -.field-tabs { - display: grid; - border-top: 1px solid var(--line-strong); - border-bottom: 1px solid var(--line); +.field-radio:nth-of-type(1) { + inset-inline-start: 0; } -@media (min-width: 720px) { - .field-tabs { - grid-template-columns: repeat(4, 1fr); - } +.field-radio:nth-of-type(2) { + inset-inline-start: 25%; +} + +.field-radio:nth-of-type(3) { + inset-inline-start: 50%; +} + +.field-radio:nth-of-type(4) { + inset-inline-start: 75%; +} + +.field-tabs { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + background: var(--surface); + border-block: var(--hairline) solid var(--line-strong); } .field-tabs label { - display: block; - padding: var(--space-3) var(--space-3) var(--space-3) 0; - border-bottom: 1px solid var(--line); - cursor: pointer; + position: relative; + min-width: 0; + min-height: calc(var(--control-min) + var(--space-4)); + display: grid; + grid-template-columns: auto minmax(0, 1fr); + align-items: center; + gap: var(--space-3); + padding: var(--space-3) var(--space-4); + border-inline-start: var(--hairline) solid var(--line); color: var(--ink-muted); - transition: color var(--dur-quick) var(--ease); + cursor: pointer; } -@media (min-width: 720px) { - .field-tabs label { - border-bottom: 0; - border-right: 1px solid var(--line); - padding-right: var(--space-4); - padding-left: var(--space-3); - } - .field-tabs label:first-of-type { - padding-left: 0; - } - .field-tabs label:last-of-type { - border-right: 0; - } +.field-tabs label:first-child { + border-inline-start: 0; +} + +.field-tabs label::before { + content: ""; + position: absolute; + inset-inline: 0; + inset-block-start: calc(var(--hairline) * -1); + height: calc(var(--hairline) * 3); + background: var(--signal); + scale: 0 1; + transform-origin: left; + transition: scale var(--dur-quick) var(--ease-out); } .field-tabs label:hover { @@ -287,556 +512,1093 @@ h3 { } .tab-num { - display: block; - font-size: var(--step--1); - color: var(--ink-faint); + color: var(--ink-soft); + font-size: var(--text-xs); } -.tab-name { - display: block; - margin-top: var(--space-1); - font-weight: 600; - font-size: var(--step-0); +.tab-long, +.tab-short { + overflow: hidden; + font-size: var(--text-sm); + font-weight: 580; + text-overflow: ellipsis; + white-space: nowrap; +} + +.tab-short { + display: none; } -/* 선택 상태 — 라디오가 진실의 원본이다 */ #field-edu:checked ~ .field-tabs label[for="field-edu"], #field-dc:checked ~ .field-tabs label[for="field-dc"], #field-gov:checked ~ .field-tabs label[for="field-gov"], #field-plant:checked ~ .field-tabs label[for="field-plant"] { color: var(--ink); - box-shadow: inset 0 3px 0 0 var(--accent); } -#field-edu:checked ~ .field-tabs label[for="field-edu"] .tab-num, -#field-dc:checked ~ .field-tabs label[for="field-dc"] .tab-num, -#field-gov:checked ~ .field-tabs label[for="field-gov"] .tab-num, -#field-plant:checked ~ .field-tabs label[for="field-plant"] .tab-num { - color: var(--accent); +#field-edu:checked ~ .field-tabs label[for="field-edu"]::before, +#field-dc:checked ~ .field-tabs label[for="field-dc"]::before, +#field-gov:checked ~ .field-tabs label[for="field-gov"]::before, +#field-plant:checked ~ .field-tabs label[for="field-plant"]::before { + scale: 1 1; } -.field-radio:focus-visible ~ .field-tabs label[for="field-edu"] { - outline: 2px solid var(--accent); - outline-offset: -2px; +#field-edu:focus-visible ~ .field-tabs label[for="field-edu"], +#field-dc:focus-visible ~ .field-tabs label[for="field-dc"], +#field-gov:focus-visible ~ .field-tabs label[for="field-gov"], +#field-plant:focus-visible ~ .field-tabs label[for="field-plant"] { + outline: var(--focus-width) solid var(--focus); + outline-offset: calc(var(--focus-width) * -1); +} + +.field-panels { + width: 100%; + min-height: 12.5rem; + margin-block-end: var(--space-4); + background: var(--surface); } .field-panel { display: none; - padding-top: var(--space-5); + grid-template-columns: minmax(0, 25rem) minmax(0, 28rem) minmax(4rem, 1fr); + gap: var(--space-5); + padding: var(--space-4); + background: var(--surface); + border-inline-start: calc(var(--hairline) * 3) solid var(--signal); +} + +.field-panel::after { + content: attr(data-panel) " / active field"; + align-self: end; + justify-self: end; + color: var(--ink-soft); + font-size: var(--text-xs); + letter-spacing: var(--tracking-label); } #field-edu:checked ~ .field-panels [data-panel="edu"], #field-dc:checked ~ .field-panels [data-panel="dc"], #field-gov:checked ~ .field-panels [data-panel="gov"], #field-plant:checked ~ .field-panels [data-panel="plant"] { - display: block; + display: grid; +} + +.panel-index { + margin-block-end: var(--space-3); + color: var(--signal-strong); + font-size: var(--text-xs); + font-weight: 650; + letter-spacing: var(--tracking-label); } .panel-what { - font-size: var(--step-1); - max-width: var(--measure); - line-height: var(--leading-loose); + max-width: var(--measure-narrow); + font-size: var(--text-sm); + font-weight: 580; + line-height: 1.6; } .panel-facts { - margin-top: var(--space-5); - border-top: 1px solid var(--line); -} - -.panel-facts > div { display: grid; - gap: var(--space-1) var(--space-4); - padding-block: var(--space-3); - border-bottom: 1px solid var(--line); -} - -@media (min-width: 640px) { - .panel-facts > div { - grid-template-columns: 8rem 1fr; - } -} - -.panel-facts dt { - font-size: var(--step--1); - color: var(--ink-faint); -} - -.panel-facts dd { - color: var(--ink-muted); - line-height: var(--leading-loose); -} - -.panel-facts strong { - color: var(--ink); - font-weight: 600; -} - -/* ── 섹션 공통 ──────────────────────────────────────────────────── */ -.eyebrow { - font-family: var(--font-mono); - font-size: var(--step--1); - color: var(--band-accent); - margin-bottom: var(--space-3); -} - -.band h2 { - font-size: var(--step-3); - max-width: 20ch; -} - -.section-lead, -.lead { - margin-top: var(--space-4); - max-width: var(--measure); - color: var(--band-ink-muted); - font-size: var(--step-1); - line-height: var(--leading-loose); -} - -/* ── 비대칭 2열 ─────────────────────────────────────────────────── */ -.split { - display: grid; - gap: var(--space-5); -} - -@media (min-width: 900px) { - .split { - grid-template-columns: 4fr 8fr; - gap: var(--space-7); - align-items: start; - } -} - -/* ── 수치 ───────────────────────────────────────────────────────── */ -.counts { - margin-top: var(--space-6); - display: grid; - grid-template-columns: repeat(auto-fit, minmax(min(100%, 150px), 1fr)); - border-top: 1px solid var(--band-line-strong); - border-left: 1px solid var(--band-line); -} - -.counts > div { - padding: var(--space-4); - border-right: 1px solid var(--band-line); - border-bottom: 1px solid var(--band-line); -} - -.counts dt { - font-size: var(--step--1); - color: var(--band-ink-faint); -} - -.counts dd { - margin-top: var(--space-2); - font-size: var(--step-3); - line-height: 1.05; - letter-spacing: -0.02em; -} - -.counts dd span { - font-size: var(--step-0); - color: var(--band-ink-muted); - margin-left: 2px; -} - -.counts-note { - margin-top: var(--space-4); - font-size: var(--step--1); - color: var(--band-ink-faint); - line-height: var(--leading-loose); - max-width: var(--measure); -} - -.counts-note a { - color: var(--band-accent); -} - -/* ── 제품 목록 ──────────────────────────────────────────────────── */ -.product-list { - margin-top: var(--space-6); - list-style: none; - border-top: 1px solid var(--band-line-strong); -} - -.product-list li { - display: grid; - gap: var(--space-3); - padding-block: var(--space-5); - border-bottom: 1px solid var(--band-line); -} - -@media (min-width: 900px) { - .product-list li { - grid-template-columns: 4rem 1fr 11rem; - gap: var(--space-5); - align-items: start; - } -} - -.prod-id { - font-size: var(--step--1); - color: var(--band-accent); -} - -.prod-body h3 { - font-size: var(--step-2); - display: flex; - align-items: baseline; - gap: var(--space-3); - flex-wrap: wrap; -} - -.prod-kind { - font-size: var(--step--1); - font-weight: 400; - color: var(--band-ink-faint); -} - -.prod-body p { - margin-top: var(--space-3); - color: var(--band-ink-muted); - max-width: 46ch; - line-height: var(--leading-loose); -} - -.prod-stack { - font-size: var(--step--1); - color: var(--band-ink-faint); -} - -.prod-meta { - font-size: var(--step--1); - display: grid; - gap: var(--space-2); align-content: start; } -.prod-meta > div { +.panel-facts div { display: grid; - grid-template-columns: 4rem 1fr; + grid-template-columns: 4.5rem minmax(0, 1fr); gap: var(--space-2); + padding-block: var(--space-1); + border-block-start: var(--hairline) solid var(--line); + font-size: var(--text-xs); + line-height: 1.5; } -.prod-meta dt { - color: var(--band-ink-faint); +.panel-facts dt { + color: var(--ink-soft); } -.prod-meta dd { - color: var(--band-ink-muted); +.panel-facts dd { + min-width: 0; +} + +.motion-toggle { + min-height: var(--control-min); + display: inline-flex; + align-items: center; + gap: var(--space-2); + padding: 0; + border: 0; + border-block-end: var(--hairline) solid var(--line-strong); + border-radius: 0; + background: transparent; + color: var(--ink-muted); + font-size: var(--text-xs); + cursor: pointer; + transition: color var(--dur-instant) var(--ease-out), translate var(--dur-instant) var(--ease-out); +} + +.motion-toggle::before { + content: "Ⅱ"; + width: 1em; + color: var(--signal-strong); + font-size: 0.75em; + font-weight: 760; + text-align: center; +} + +.motion-toggle[aria-pressed="true"]::before { + content: "▶"; +} + +.motion-toggle:hover, +.motion-toggle:focus-visible { + color: var(--ink); + translate: 0 calc(var(--space-1) * -1); +} + +.motion-toggle:active { + translate: 0 0; +} + +/* Shared sections */ +.section { + padding-block: var(--space-9); + background: var(--page); +} + +.section-intro { + max-width: var(--measure); +} + +.section-intro .eyebrow { + margin-block-end: var(--space-4); +} + +.section-intro h2, +.contact h2 { + max-width: 15ch; + font-size: var(--text-h2); + font-weight: 560; + line-height: var(--leading-heading); + letter-spacing: var(--tracking-heading); +} + +.section-intro > p:last-child { + max-width: var(--measure-narrow); + margin-block-start: var(--space-5); + color: var(--ink-muted); +} + +.section-intro-wide h2 { + max-width: 22ch; +} + +/* Proof */ +.proof { + border-block-start: var(--hairline) solid var(--line); +} + +.proof-grid { + display: grid; + grid-template-columns: minmax(0, 0.8fr) minmax(0, 1.2fr); + gap: var(--space-7); + align-items: start; +} + +.counts { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + border-block-start: var(--hairline) solid var(--line-strong); +} + +.counts div { + min-width: 0; + padding: var(--space-4) var(--space-3) var(--space-5); + border-inline-start: var(--hairline) solid var(--line); +} + +.counts div:first-child { + border-inline-start: 0; +} + +.counts dt { + min-height: 3em; + color: var(--ink-muted); + font-size: var(--text-xs); +} + +.counts dd { + margin-block-start: var(--space-4); + font-size: clamp(2.25rem, 1.6rem + 2vw, 3.5rem); + font-weight: 540; + line-height: 1; + letter-spacing: var(--tracking-heading); + font-variant-numeric: tabular-nums; +} + +.counts dd span { + margin-inline-start: var(--space-1); + color: var(--ink-muted); + font-size: var(--text-sm); + letter-spacing: 0; +} + +.source-note { + grid-column: 2; + max-width: var(--measure); + color: var(--ink-soft); + font-size: var(--text-xs); +} + +.source-note a, +.record-list h3 a { + color: inherit; + text-decoration-color: var(--line-strong); + text-decoration-thickness: var(--hairline); + text-underline-offset: 0.22em; +} + +.source-note a { + display: inline-block; + min-height: 1.5rem; + line-height: 1.5rem; +} + +.record-list h3 a, +.contact-list a, +.model-credit a { + display: inline-block; + min-height: 1.5rem; + line-height: 1.5rem; +} + +.source-note a:hover, +.record-list h3 a:hover { + text-decoration-color: var(--signal); +} + +/* Operating principles */ +.principles { + padding-block-start: 0; +} + +.principle-list { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + margin-block-start: var(--space-7); + border-block: var(--hairline) solid var(--line-strong); +} + +.principle-list li { + min-width: 0; + padding: var(--space-5) var(--space-4) var(--space-6); + border-inline-start: var(--hairline) solid var(--line); +} + +.principle-list li:first-child { + border-inline-start: 0; +} + +.principle-list p { + color: var(--signal-strong); + font-size: var(--text-xs); + letter-spacing: var(--tracking-label); +} + +.principle-list h3 { + margin-block: var(--space-5) var(--space-3); + font-size: var(--text-h3); + font-weight: 540; +} + +.principle-list span { + color: var(--ink-muted); + font-size: var(--text-sm); + line-height: 1.7; +} + +/* Products */ +.products { + background: var(--inverse); + color: var(--inverse-ink); +} + +.products .section-intro .eyebrow, +.products .section-intro > p:last-child { + color: var(--inverse-muted); +} + +.product-list { + margin-block-start: var(--space-8); + border-block-start: var(--hairline) solid var(--inverse-line); +} + +.product-list > li { + display: grid; + grid-template-columns: minmax(5rem, 0.45fr) minmax(0, 1.55fr) minmax(12rem, 0.7fr); + gap: var(--space-5); + padding-block: var(--space-6); + border-block-end: var(--hairline) solid var(--inverse-line); +} + +.product-id { + color: var(--inverse-muted); + font-size: var(--text-xs); + letter-spacing: var(--tracking-label); +} + +.product-main h3 { + margin-block-end: var(--space-4); + font-size: clamp(2.25rem, 1.8rem + 1.5vw, 3.5rem); + font-weight: 520; + line-height: var(--leading-tight); + letter-spacing: var(--tracking-heading); +} + +.product-main > p:not(.tech-line) { + max-width: var(--measure); + color: var(--inverse-muted); +} + +.tech-line { + margin-block-start: var(--space-4); + color: var(--inverse-signal); + font-size: var(--text-sm); + line-height: 1.55; +} + +.product-link { + min-height: var(--control-min); + display: inline-flex; + align-items: center; + margin-block-start: var(--space-4); + color: var(--inverse-ink); + font-size: var(--text-sm); + text-underline-offset: 0.28em; +} + +.product-link::after { + content: "↗"; + margin-inline-start: var(--space-2); + color: var(--inverse-signal); +} + +.product-meta { + align-self: end; +} + +.product-meta div { + display: grid; + grid-template-columns: 5rem minmax(0, 1fr); + gap: var(--space-3); + padding-block: var(--space-2); + border-block-start: var(--hairline) solid var(--inverse-line); + font-size: var(--text-xs); +} + +.product-meta dt { + color: var(--inverse-muted); +} + +/* Ledger */ +.ledger-section { + border-block-end: var(--hairline) solid var(--line); +} + +.ledger-grid { + display: grid; + grid-template-columns: minmax(17rem, 0.75fr) minmax(0, 1.65fr); + gap: var(--space-7); + align-items: start; +} + +.sticky-intro { + position: sticky; + inset-block-start: var(--space-5); +} + +.table-wrap { + min-width: 0; } -/* ── 원장 표 ────────────────────────────────────────────────────── */ .ledger { - margin-top: var(--space-6); width: 100%; border-collapse: collapse; - font-size: var(--step--1); - text-align: left; + table-layout: fixed; + font-size: var(--text-sm); + line-height: 1.55; +} + +.ledger thead { + color: var(--ink-muted); + font-size: var(--text-xs); } .ledger th, .ledger td { - padding: var(--space-3) var(--space-3) var(--space-3) 0; - border-bottom: 1px solid var(--band-line); + padding: var(--space-3) var(--space-2); + border-block-end: var(--hairline) solid var(--line); + text-align: start; vertical-align: top; } -.ledger thead th { - border-bottom: 1px solid var(--band-line-strong); - color: var(--band-ink-faint); - font-weight: 400; +.ledger th:first-child, +.ledger td:first-child { + width: 4.25rem; +} + +.ledger th:nth-child(2) { + width: 28%; +} + +.ledger th:nth-child(3), +.ledger td:nth-child(3) { + width: 4.75rem; } .ledger tbody th { - font-weight: 600; - font-size: var(--step-0); + color: var(--ink); + font-weight: 620; } -.ledger td { - color: var(--band-ink-muted); +.ledger tbody td { + color: var(--ink-muted); } -.col-id { - width: 3.5rem; +.ledger-focus { + background: var(--surface); + box-shadow: inset calc(var(--hairline) * 3) 0 0 var(--signal); } -.col-year { - width: 4rem; -} - -.row-mark th, -.row-mark td { - border-bottom: 0; -} - -.row-mark th { - color: var(--band-accent); -} - -.ledger-note { - margin-top: var(--space-4); - padding-top: var(--space-3); - border-top: 2px solid var(--band-accent); - font-size: var(--step--1); - color: var(--band-ink-muted); - max-width: var(--measure); - line-height: var(--leading-loose); -} - -/* ── 파트너 ─────────────────────────────────────────────────────── */ -.section-partners { - background: var(--surface-2); +/* Company */ +.company-grid { + display: grid; + grid-template-columns: minmax(0, 0.7fr) minmax(0, 1.3fr); + gap: var(--space-8) var(--space-7); } .partners { - margin-top: var(--space-6); - list-style: none; display: grid; - grid-template-columns: repeat(auto-fill, minmax(min(100%, 190px), 1fr)); - border-top: 1px solid var(--band-line-strong); + grid-template-columns: repeat(3, minmax(0, 1fr)); + align-self: start; + border-block-start: var(--hairline) solid var(--line-strong); } .partners li { - padding: var(--space-3) var(--space-3) var(--space-3) 0; - border-bottom: 1px solid var(--band-line); - color: var(--band-ink-muted); - font-size: var(--step--1); + min-width: 0; + padding: var(--space-3) var(--space-2); + border-block-end: var(--hairline) solid var(--line); + color: var(--ink-muted); + font-size: var(--text-sm); } -/* ── 기록 ───────────────────────────────────────────────────────── */ -.record-list { - margin-top: var(--space-6); - list-style: none; - border-top: 1px solid var(--band-line-strong); +.archive { + grid-column: 1 / -1; + border-block-start: var(--hairline) solid var(--line-strong); } -.record-list li { +.archive summary { + min-height: calc(var(--control-min) + var(--space-3)); display: grid; - gap: var(--space-2); + grid-template-columns: minmax(0, 1fr) auto; + align-items: center; + gap: var(--space-4); + padding-block: var(--space-3); + cursor: pointer; + list-style: none; +} + +.archive summary::-webkit-details-marker { + display: none; +} + +.archive summary span:first-child { + font-size: var(--text-h3); + font-weight: 560; + letter-spacing: var(--tracking-heading); +} + +.archive summary span:last-child { + color: var(--ink-muted); + font-size: var(--text-xs); + white-space: nowrap; +} + +.archive summary::after { + content: "+"; + grid-column: 2; + grid-row: 1; + justify-self: end; + margin-inline-start: var(--space-5); + color: var(--signal); + font-size: var(--text-h3); + line-height: 1; +} + +.archive[open] summary::after { + content: "−"; +} + +.record-list { + border-block-start: var(--hairline) solid var(--line); +} + +.record-list > li { + display: grid; + grid-template-columns: minmax(7rem, 0.35fr) minmax(0, 1.4fr) minmax(5rem, 0.3fr); + gap: var(--space-5); padding-block: var(--space-4); - border-bottom: 1px solid var(--band-line); + border-block-end: var(--hairline) solid var(--line); } -@media (min-width: 860px) { - .record-list li { - grid-template-columns: 7rem 1fr 7rem; - gap: var(--space-4); - align-items: baseline; - } +.record-list time, +.record-list > li > span { + color: var(--ink-soft); + font-size: var(--text-xs); } -.rec-date { - font-size: var(--step--1); - color: var(--band-ink-faint); +.record-list > li > span { + justify-self: end; } .record-list h3 { - font-size: var(--step-1); + font-size: var(--text-body); + font-weight: 620; + line-height: 1.45; } -.record-list div p { - margin-top: var(--space-2); - color: var(--band-ink-muted); - font-size: var(--step--1); - line-height: var(--leading-loose); +.record-list p { + margin-block-start: var(--space-1); + color: var(--ink-muted); + font-size: var(--text-sm); } -.rec-kind { - font-size: var(--step--1); - color: var(--band-ink-faint); +.career-body { + padding-block: var(--space-4) var(--space-6); + border-block-start: var(--hairline) solid var(--line); } -@media (min-width: 860px) { - .rec-kind { - text-align: right; - } +.career-body > p { + max-width: var(--measure); + color: var(--ink-muted); } -/* ── 채용 ───────────────────────────────────────────────────────── */ .jobs { - margin-top: var(--space-5); - list-style: none; - border-top: 1px solid var(--band-line-strong); + margin-block: var(--space-5); } .jobs li { display: grid; - gap: var(--space-1) var(--space-4); + grid-template-columns: minmax(12rem, 0.6fr) minmax(0, 1.4fr) auto; + gap: var(--space-4); padding-block: var(--space-3); - border-bottom: 1px solid var(--band-line); + border-block-start: var(--hairline) solid var(--line); } -@media (min-width: 720px) { - .jobs li { - grid-template-columns: 14rem 1fr 4rem; - align-items: baseline; - } +.jobs strong { + font-size: var(--text-sm); } -.job-name { - font-weight: 600; +.jobs span, +.jobs em { + color: var(--ink-muted); + font-size: var(--text-xs); + font-style: normal; } -.job-hint { - font-size: var(--step--1); - color: var(--band-ink-muted); - line-height: var(--leading-loose); +/* Contact */ +.contact { + padding-block: var(--space-9) var(--space-8); + background: var(--signal); + color: var(--signal-ink); } -.job-state { - font-size: var(--step--1); - color: var(--band-ink-faint); -} - -@media (min-width: 720px) { - .job-state { - text-align: right; - } -} - -.jobs-open { - margin-top: var(--space-4); - font-size: var(--step--1); - color: var(--band-ink-muted); - line-height: var(--leading-loose); -} - -.jobs-open a { - color: var(--band-accent); -} - -/* ── 연락 ───────────────────────────────────────────────────────── */ -.contact-rows { - border-top: 1px solid var(--band-line-strong); -} - -.contact-rows > div { +.contact-grid { display: grid; - gap: var(--space-1) var(--space-4); - padding-block: var(--space-3); - border-bottom: 1px solid var(--band-line); + grid-template-columns: minmax(0, 0.75fr) minmax(0, 1.25fr); + gap: var(--space-7); } -@media (min-width: 640px) { - .contact-rows > div { - grid-template-columns: 6rem 1fr; - } +.contact .eyebrow { + margin-block-end: var(--space-4); + color: var(--signal-ink); } -.contact-rows dt { - font-size: var(--step--1); - color: var(--band-ink-faint); +.contact h2 { + max-width: 10ch; + font-size: var(--text-display); } -.contact-rows dd { - color: var(--band-ink-muted); - line-height: var(--leading-loose); +.contact-main > p { + max-width: var(--measure-narrow); + font-size: var(--text-lead); } -.contact-rows a { - color: var(--band-accent); -} - -.btn { +.contact-mail { display: inline-block; - margin-top: var(--space-5); - padding: var(--space-3) var(--space-5); - background: var(--band-accent); - color: var(--band-accent-ink); - font-weight: 600; - text-decoration: none; - white-space: nowrap; - transition: background-color var(--dur-quick) var(--ease); + max-width: 100%; + margin-block: var(--space-7); + color: inherit; + font-size: clamp(1.7rem, 1.15rem + 2.25vw, 3.5rem); + font-weight: 520; + line-height: 1.1; + letter-spacing: var(--tracking-heading); + text-decoration-thickness: var(--hairline); + text-underline-offset: var(--space-3); + overflow-wrap: anywhere; } -.btn:hover { - background: var(--band-accent-hover); +.contact-list { + border-block-start: var(--hairline) solid currentColor; } -/* ── 푸터 ───────────────────────────────────────────────────────── */ -.foot-inner { +.contact-list div { display: grid; - gap: var(--space-2); + grid-template-columns: 7rem minmax(0, 1fr); + gap: var(--space-4); + padding-block: var(--space-3); + border-block-end: var(--hairline) solid currentColor; + font-size: var(--text-sm); } -.foot-name { - font-weight: 600; +.contact-list dt { + color: inherit; } -.foot-line { - color: var(--band-ink-muted); - font-size: var(--step--1); +.contact-list a { + text-underline-offset: var(--space-1); } -.foot-fine { - margin-top: var(--space-4); - padding-top: var(--space-3); - border-top: 1px solid var(--band-line); - font-size: var(--step--1); - color: var(--band-ink-faint); +/* Footer */ +.site-foot { + padding-block: var(--space-5); + background: var(--inverse); + color: var(--inverse-ink); + font-size: var(--text-xs); } -/* ── 좁은 화면 ──────────────────────────────────────────────────── */ -@media (max-width: 640px) { +.foot-grid { + display: grid; + grid-template-columns: minmax(0, 1fr) auto auto; + gap: var(--space-5); + align-items: center; +} + +.foot-grid p:nth-child(2) { + color: var(--inverse-muted); +} + +.model-credit { + grid-column: 1 / -1; + padding-block-start: var(--space-4); + border-block-start: var(--hairline) solid var(--inverse-line); + color: var(--inverse-muted); + font-size: var(--text-xs); + line-height: 1.7; +} + +.model-credit a { + color: var(--inverse-ink); + text-underline-offset: 0.18em; +} + +/* Tablet */ +@media (max-width: 62rem) { .head-inner { - flex-wrap: wrap; - padding-block: var(--space-2); - row-gap: var(--space-2); - } - - .nav { - order: 3; - width: 100%; - justify-content: space-between; - gap: var(--space-2); - border-top: 1px solid var(--line); - padding-top: var(--space-2); + grid-template-columns: minmax(0, 1fr) auto; } .head-meta { display: none; } - .counts { - grid-template-columns: repeat(2, 1fr); + .hero-stage::before { + opacity: 0.94; + } + + .proof-grid, + .ledger-grid, + .company-grid, + .contact-grid { + grid-template-columns: 1fr; + } + + .proof-grid, + .ledger-grid, + .contact-grid { + gap: var(--space-6); + } + + .source-note { + grid-column: 1; + } + + .sticky-intro { + position: static; + } + + .product-list > li { + grid-template-columns: minmax(4rem, 0.25fr) minmax(0, 1fr); + } + + .product-meta { + grid-column: 2; + } + + .company-grid { + gap: var(--space-7); + } + + .principle-list { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .principle-list li:nth-child(3) { + border-inline-start: 0; + } + + .principle-list li:nth-child(n + 3) { + border-block-start: var(--hairline) solid var(--line); + } +} + +/* Mobile */ +@media (max-width: 43rem) { + .site-head { + position: relative; + } + + .head-inner { + min-height: auto; + grid-template-columns: 1fr; + gap: var(--space-2); + padding-block: var(--space-3); + } + + .wordmark { + min-height: var(--control-min); + } + + .nav { + width: 100%; + justify-content: space-between; + gap: var(--space-2); + } + + .nav a { + min-height: var(--control-min); + } + + .hero { + min-height: 0; + overflow: visible; + } + + .hero-stage { + position: relative; + z-index: 0; + height: min(52svh, 29rem); + box-shadow: var(--shadow-core); + overflow: clip; + } + + .hero-stage::before { + display: none; + } + + .core-poster img { + object-position: 69% center; + } + + .hero-grid { + min-height: 0; + display: block; + padding-block: var(--space-6) var(--space-7); + } + + .hero-copy { + max-width: none; + padding-block: 0; + } + + .hero-copy h1 { + max-width: none; + font-size: clamp(1.75rem, 8.8vw, 2.35rem); + white-space: nowrap; + } + + .hero-lead { + max-width: 31rem; + } + + .fields { + margin-block-start: var(--space-6); + } + + .field-tabs { + order: 0; + } + + .field-tabs label { + min-height: calc(var(--control-min) + var(--space-3)); + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: center; + gap: 0; + padding: var(--space-2); + } + + .field-radio { + height: calc(var(--control-min) + var(--space-3)); + } + + .tab-long { + display: none; + } + + .tab-short { + display: block; + max-width: 100%; + font-size: var(--text-xs); + } + + .tab-num { + font-size: 0.6875rem; + } + + .field-panels { + width: 100%; + min-height: 0; + margin-block: var(--space-4) 0; + } + + .field-panel { + grid-template-columns: 1fr; + gap: var(--space-4); + padding: var(--space-4); + background: var(--surface); + } + + .field-panel::after { + display: none; + } + + .panel-facts div { + grid-template-columns: 4rem minmax(0, 1fr); + } + + .section { + padding-block: var(--space-8); + } + + .counts { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .counts div:nth-child(3) { + border-inline-start: 0; + } + + .counts div:nth-child(n + 3) { + border-block-start: var(--hairline) solid var(--line); + } + + .counts dt { + min-height: 0; + } + + .principle-list { + grid-template-columns: 1fr; + } + + .principle-list li, + .principle-list li:nth-child(3) { + border-inline-start: 0; + } + + .principle-list li:nth-child(n + 2) { + border-block-start: var(--hairline) solid var(--line); + } + + .product-list { + margin-block-start: var(--space-7); + } + + .product-list > li { + grid-template-columns: 1fr; + gap: var(--space-3); + padding-block: var(--space-5); + } + + .product-meta { + grid-column: 1; + margin-block-start: var(--space-3); + } + + .product-main h3 { + font-size: 2.25rem; + } + + .table-wrap { + overflow: visible; + } + + .ledger, + .ledger tbody, + .ledger tr, + .ledger th, + .ledger td { + display: block; + width: 100%; + } + + .ledger thead { + display: none; + } + + .ledger tr { + position: relative; + padding-block: var(--space-4); + border-block-end: var(--hairline) solid var(--line); + } + + .ledger th, + .ledger td { + padding: 0; + border: 0; + } + + .ledger tbody th { + margin-block: var(--space-2) var(--space-3); + padding-inline-end: 4.5rem; + font-size: var(--text-body); + } + + .ledger td:first-child { + color: var(--signal-strong); + font-size: var(--text-xs); + } + + .ledger td:nth-child(3) { + position: absolute; + inset-block-start: var(--space-4); + inset-inline-end: 0; + width: auto; + font-size: var(--text-xs); + } + + .ledger td:last-child { + font-size: var(--text-xs); + } + + .ledger td::before { + content: attr(data-label) " · "; + color: var(--ink-soft); + } + + .ledger td:first-child::before, + .ledger td:nth-child(3)::before { + content: ""; + } + + .ledger-focus { + padding-inline-start: var(--space-3); + } + + .partners { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .archive summary span:first-child { + font-size: var(--text-body); + } + + .archive summary::after { + margin-inline-start: var(--space-2); + font-size: var(--text-body); + } + + .record-list > li, + .jobs li { + grid-template-columns: 1fr; + gap: var(--space-2); + } + + .record-list > li > span { + justify-self: start; + } + + .contact h2 { + font-size: clamp(2.5rem, 12vw, 4rem); + } + + .contact-mail { + margin-block: var(--space-6); + } + + .contact-list div { + grid-template-columns: 5.5rem minmax(0, 1fr); + } + + .foot-grid { + grid-template-columns: 1fr; + gap: var(--space-2); + } +} + +@media (max-width: 23rem) { + .field-tabs label { + padding-inline: var(--space-1); + } + + .tab-short { + font-size: 0.6875rem; } } -/* ── 모션을 줄이는 설정 ─────────────────────────────────────────── */ @media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } - *, - *::before, - *::after { - animation-duration: 0.01ms !important; - animation-iteration-count: 1 !important; - transition-duration: 0.01ms !important; + #coreCanvas { + display: none; + } + + .hero[data-webgl="ready"] .core-poster { + opacity: 1; + } + + .text-link::after, + .button, + .button::before, + .nav a::after, + .field-tabs label::before, + .motion-toggle, + .core-poster, + #coreCanvas { + transition: none; } } -/* ── 인쇄 — 현장 선택기는 종이에서 의미가 없으므로 네 패널을 모두 편다 ── */ @media print { .site-head, - .skip-link, - .btn { + .motion-toggle, + #coreCanvas { display: none; } - .band { - background: #fff; - color: #000; + .hero { + min-height: auto; } - .field-panel { - display: block !important; - break-inside: avoid; + .hero-stage { + position: relative; + height: 28rem; } - .field-tabs { - display: none; + .archive:not([open]) > *:not(summary) { + display: block; } } diff --git a/apps/site/public/work/twentyoz-corp/styles/tokens.css b/apps/site/public/work/twentyoz-corp/styles/tokens.css index 0a64c9a..60651dc 100644 --- a/apps/site/public/work/twentyoz-corp/styles/tokens.css +++ b/apps/site/public/work/twentyoz-corp/styles/tokens.css @@ -1,117 +1,151 @@ -/* ========================================================================== - 트웬티온스 (TWENTYOZ) — 회사 홈페이지 리디자인 · 디자인 토큰 SSOT +/* + TWENTYOZ · precision-spatial token source of truth + One grotesk, one semantic signal, square DOM geometry. Curves belong to the core. +*/ - 컨셉 : 네 개의 현장 — 회사 소개가 아니라, 같은 기술이 서로 다른 현장에서 - 무엇을 하고 있는지의 목록이 이 사이트의 본체다 - 프리셋: field-record (신규 정의. swiss-minimal 을 뼈대로 삼되 본문을 키웠다) - 강조색: 신호 적색 1색. 라이트/다크는 규칙으로 정의된 한 쌍이므로 1종으로 센다 - - ── 0단계 감사 · 현행 twentyoz.kr 실측 (2026-08-24, 1249px computed style) - 유지할 자산 - · radius 0px 742회 — 형태 어휘가 이미 통일돼 있다. 그대로 가져간다 - · 무채색 기조와 모노스페이스(JetBrains Mono 356회) — 정밀함의 어휘는 맞다 - · 실제 프로젝트 49건 · 파트너 19곳 · 제품 4종의 기술 스택 표기 - 고쳐야 할 것 - · 대비 실패 **172개 요소** — rgb(102,102,102) 가 배경 rgb(2,2,2) 위에서 3.61:1, - 그것도 9~11px 로 284곳에 쓰였다. WCAG AA 미달이고 읽기 자체가 어렵다 - · font-family 가 Inter 뿐이라 **한글 폰트가 지정돼 있지 않다**. - 한국 회사의 한국어 사이트에서 한글이 시스템 기본값으로 떨어진다 - · h1 174.86px 에 letter-spacing −10.49px = **−0.06em**. 한글 상한(−0.02em)의 세 배다 - · 배경 #020202 — 순흑에 가깝다 - · 'Digital Genetics' 은유가 전면에 있다(CULTIVATING · DROPS · Sativa/Indica · - Germination · Wholesale Desk · ACQUIRE GENETICS · Open Specimens). - SK하이닉스·LG디스플레이·한화솔루션·GS칼텍스에 산업용 IoT 를 파는 회사의 - 어휘로는 사업을 가린다. 은유를 걷어내고 한 일을 앞에 둔다 - - ── 레퍼런스 실측 (2026-08-24, 1440px) - R1 구조 · samsara.com (커넥티드 오퍼레이션 / 산업 IoT — 같은 업종) - 배경 #FFFFFF · FK Grotesk + FK Grotesk Mono 2패밀리 - h1 72px/700 · 본문 16px(404회) · 최대 80px ÷ 본문 = 5.0배 - radius 0px 2399회 지배 · 강조색 #FEAE0F 이 버튼 1곳 - 컨테이너 1425 전폭 ↔ 1345 ↔ 427 칼럼 · 섹션 13 - → 가져온 원리: 섹션 제목이 '무엇을 증명하는가'를 직접 말한다 - (Proven where it counts / A track record / Proudly rated #1). - B2B 는 주장이 아니라 기록으로 설득한다 - → 안 가져온 것: 전체 대문자 h1 과 대문자 eyebrow 5종(슬롭 지문 2위), - 순백·순흑, 섹션 13개, 앰버 pill 버튼 - - R2 톤 · lars-mueller-publishers.com (출판사 — 다른 업종) - 텍스트 #414141 (순흑 아님) · NB Akademie Std 한 패밀리의 두 웨이트 - h1 34px/500 · **본문 20px(190회)** · line-height 30px = 1.5 - 최대 ÷ 본문 = 1.7배 · radius 0px 1709회 지배 · 컨테이너 1240px - → 가져온 원리: **본문을 크게 쓰고 제목을 작게 둔다.** 위계를 크기 하나로 - 만들지 않고 여백과 순서로도 만든다. 한 패밀리의 두 웨이트로 절제한다 - → 안 가져온 것: 강조색 #542BFF(보라 계열 — 슬롭 지문), - 최대÷본문 1.7배(평평한 스케일은 안티패턴) - - 두 레퍼런스의 합성: 본문은 R2 쪽으로 키우고(17px), 최대÷본문은 R1 쪽으로 - 벌린다(4.0배). 한쪽만 따르면 평평하거나 본문이 작아진다. - ========================================================================== */ +@font-face { + font-family: "Pretendard Variable"; + font-style: normal; + font-weight: 45 920; + font-display: swap; + src: url("../assets/pretendard-twentyoz.woff2") format("woff2-variations"); +} :root { - /* ── 타이포그래피 — 5단계 + 스케일 밖 디스플레이 1개 ── */ - --step--1: 0.8125rem; /* 13px — 표 머리·메타 */ - --step-0: 1.0625rem; /* 17px — 본문. R2 의 큰 본문을 한글에 맞춰 옮겼다 */ - --step-1: 1.25rem; /* 20px — 리드 */ - --step-2: clamp(1.375rem, 1.15rem + 1.1vw, 1.9375rem); /* 22 → 31px */ - --step-3: clamp(1.75rem, 1.25rem + 2.5vw, 2.875rem); /* 28 → 46px */ - --display: clamp(2.25rem, 1.3rem + 4.6vw, 4.25rem); /* 36 → 68px */ - /* 최대 ÷ 본문 = 68 ÷ 17 = 4.0배 */ + color-scheme: light dark; - --leading-tight: 1.2; - --leading-normal: 1.7; - --leading-loose: 1.85; - --measure: 33em; + /* Type */ + --font-sans: "Pretendard Variable", Pretendard, -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif; + --text-xs: 0.75rem; + --text-sm: 0.8125rem; + --text-body: clamp(1.0625rem, 1.02rem + 0.16vw, 1.125rem); + --text-lead: clamp(1.125rem, 1.02rem + 0.38vw, 1.3125rem); + --text-h3: clamp(1.5rem, 1.25rem + 0.75vw, 1.875rem); + --text-h2: clamp(2rem, 1.75rem + 0.8vw, 2.5rem); + --text-display: clamp(2rem, 1.36rem + 2.7vw, 4.5rem); + --leading-tight: 1.04; + --leading-heading: 1.15; + --leading-body: 1.7; + --tracking-display: -0.018em; + --tracking-heading: -0.012em; + --tracking-label: 0.08em; + --measure: 36rem; + --measure-narrow: 28rem; - --font-body: Pretendard, "Pretendard Variable", -apple-system, system-ui, sans-serif; - --font-mono: "JetBrains Mono", ui-monospace, SFMono-Regular, monospace; + /* Light theme */ + --page: #e9e7e2; + --surface: #f6f4ef; + --surface-muted: #d5d1ca; + --surface-quiet: #dfdcd6; + --ink: #151616; + --ink-muted: #5a5954; + --ink-soft: #6a6862; + --line: #b8b5ae; + --line-strong: #74736e; + --signal: #b9362b; + --signal-strong: #8f251d; + --signal-ink: #fff8f0; + --selection: #d9aaa1; + --focus: #8f251d; - /* ── 색 · 종이(라이트) ── */ - --surface: #fafaf8; - --surface-2: #f0f0ec; - --surface-3: #e5e5e0; - --line: #dcdcd6; - --line-strong: #b9b9b2; - --ink: #111214; /* 17.9:1 */ - --ink-muted: #54585c; /* 6.97:1 */ - --ink-faint: #686d72; /* 5.03:1 */ - --accent: #c4341f; /* 5.21:1 · 흰 글자 얹으면 5.44:1 */ - --accent-hover: #9e2817; - --accent-ink: #ffffff; - --accent-wash: #f6e7e3; + /* Inverse surface */ + --inverse: #111313; + --inverse-raised: #1a1d1c; + --inverse-ink: #f2f1ec; + --inverse-muted: #b4b5b0; + --inverse-line: #414442; + --inverse-signal: #ed6a58; + --inverse-signal-ink: #180b08; - /* ── 색 · 잉크(다크 반전 밴드) — 위 값들의 규칙적 반전 ── */ - --dark-surface: #111214; - --dark-surface-2: #191b1e; - --dark-surface-3: #212428; - --dark-line: #2c3034; - --dark-line-strong: #40454a; - --dark-ink: #f2f2f0; /* 16.7:1 */ - --dark-ink-muted: #a2a6a9; /* 7.67:1 */ - --dark-ink-faint: #84898d; /* 5.31:1 */ - --dark-accent: #e8563c; /* 5.17:1 */ - --dark-accent-hover: #f2705a; - --dark-accent-ink: #160906; - --dark-accent-wash: #33170f; + /* 3D material roles */ + --core-metal: #c9c6be; + --core-metal-dark: #343534; + --core-glass: #8c9898; + --core-spectrum: #4f7d88; + --core-shadow: #232423; + --core-light: #fffdf6; + --core-scrim: linear-gradient(90deg, #e9e7e2 0%, #e9e7e2e8 26%, #e9e7e200 58%); + --core-vignette: radial-gradient(circle at 74% 44%, #ffffff00 30%, #15161614 100%); + --shadow-core: 0 2rem 5rem #15161624; - /* ── 형태 — 현행 사이트가 radius 0 으로 통일돼 있다. 유지할 자산이다 ── */ - --radius: 0; - - /* ── 간격 — 저장소 SSOT 표준 ── */ + /* Space · grid */ --space-1: 0.25rem; --space-2: 0.5rem; - --space-3: 1rem; - --space-4: 1.5rem; - --space-5: 2.5rem; - --space-6: 4rem; + --space-3: 0.75rem; + --space-4: 1.25rem; + --space-5: 2rem; + --space-6: 3.5rem; --space-7: 6rem; - --space-8: clamp(4.5rem, 3rem + 6vw, 9rem); + --space-8: clamp(6rem, 4rem + 7vw, 10rem); + --space-9: clamp(8rem, 5rem + 10vw, 13rem); + --page-pad: clamp(1.25rem, 0.7rem + 2.4vw, 4rem); + --wide: 90rem; + --content: 75rem; + --header-h: 4.5rem; + --control-min: 2.75rem; + --hairline: 1px; + --focus-width: 2px; + --radius: 0px; - --container: 1120px; - --pad-inline: clamp(1.25rem, 1rem + 2.5vw, 4rem); - - /* ── 모션 ── */ - --dur-quick: 150ms; - --dur-normal: 380ms; - --ease: cubic-bezier(0.2, 0, 0, 1); + /* Motion */ + --dur-instant: 120ms; + --dur-quick: 220ms; + --dur-normal: 420ms; + --dur-slow: 760ms; + --ease-out: cubic-bezier(0.22, 0.75, 0.16, 1); + --ease-in: cubic-bezier(0.55, 0.08, 0.68, 0.53); + --ease-soft: cubic-bezier(0.33, 1, 0.68, 1); + --shift-sm: 0.5rem; + --shift-lg: 1.5rem; + --stagger: 60ms; +} + +@media (prefers-color-scheme: dark) { + :root { + --page: #0d0f0f; + --surface: #171a1a; + --surface-muted: #2c302f; + --surface-quiet: #202423; + --ink: #f1f0eb; + --ink-muted: #b8bab6; + --ink-soft: #a8aaa7; + --line: #3b3e3d; + --line-strong: #6e7270; + --signal: #d99a38; + --signal-strong: #f0b454; + --signal-ink: #15120c; + --selection: #654a27; + --focus: #f0b454; + + --inverse: #edeae4; + --inverse-raised: #f6f4ef; + --inverse-ink: #171817; + --inverse-muted: #5b5b57; + --inverse-line: #b9b5ae; + --inverse-signal: #a92f25; + --inverse-signal-ink: #fff8f0; + + --core-metal: #555b5b; + --core-metal-dark: #090b0b; + --core-glass: #838d8b; + --core-spectrum: #7fb8c3; + --core-shadow: #030404; + --core-light: #f5ead3; + --core-scrim: linear-gradient(90deg, #0d0f0f 0%, #0d0f0fe8 26%, #0d0f0f00 58%); + --core-vignette: radial-gradient(circle at 74% 44%, #00000000 30%, #0000005c 100%); + --shadow-core: 0 2rem 5rem #00000066; + } +} + +@media (prefers-reduced-motion: reduce) { + :root { + --shift-sm: 0px; + --shift-lg: 0px; + --stagger: 0ms; + --dur-normal: var(--dur-instant); + --dur-slow: var(--dur-instant); + --ease-out: ease-out; + --ease-in: ease-out; + --ease-soft: ease-out; + } } diff --git a/apps/site/research/twentyoz-redesign-2026-08-24.md b/apps/site/research/twentyoz-redesign-2026-08-24.md new file mode 100644 index 0000000..a6e1b7c --- /dev/null +++ b/apps/site/research/twentyoz-redesign-2026-08-24.md @@ -0,0 +1,229 @@ +# 트웬티온스 전면 리디자인 — 1단계 레퍼런스 실측 + +> 상태: 인터뷰 선택 전에도 바뀌지 않는 구조·성능 근거를 먼저 확정한 기록. +> 색·명도·3D 주인공은 사용자 인터뷰 결과가 오면 2단계에서 최종 확정한다. + +## 브리프 + +산업·교육 분야의 B2B 방문자가 트웬티온스의 네 현장과 실제 제품 관계를 공간적으로 이해하고 프로젝트 문의를 시작하게 한다. 느낌은 **정밀하고 몰입감 있게**. + +### 0단계 기준선 감사 + +- 대상: `public/work/twentyoz-corp/index.html`과 쇼케이스 카드·캡처 +- 현재 강점: 실제 고유명사와 기술 스택, 네 현장 라디오 전환, 의미 있는 HTML, 320/390/768/1440 오버플로·대비 통과 +- 현재 약점: 첫 화면이 텍스트와 구분선만으로 구성돼 VR·산업 IoT·실시간 시뮬레이션을 시각적으로 증명하지 못함 +- 모바일 약점: 390px에서 네 현장 선택기가 88px 높이로 네 줄 쌓이며, 선택 결과가 첫 화면 아래로 완전히 밀림 +- 검증 공백: 기존 `tools/e2e.mjs`의 1,805개 단언은 `gaon-lms`와 `dure-enrollment`만 검사한다. 트웬티온스 전용 사용자 시나리오는 0개이므로 새 L6 스위트가 필요하다 + +## R1 · 구조 — Cognite + +원본: https://www.cognite.com/en + +- 업종: 산업 데이터·AI 플랫폼. 트웬티온스와 같은 산업 B2B 층위 +- 가져올 축: **정보 위계, 그리드, 증거 배치** +- 섹션 흐름: 결과 중심 히어로 → 운영 성과 수치 → 고객 사례 → 역할별 효용 → 제품 체계 → 파트너 → 자료 → 데모 CTA +- 그리드: 1280px 뷰포트에서 지배 컨테이너 1233px, 주요 2열 589px / 565px. 본문 대표 폭 565px +- 타입: Space Grotesk + Manrope 2패밀리. 주요 h2 52/65px, 본문 18/32px. 최대/본문 2.9배 +- 타입 단계 실측 상위: 12, 14, 16, 18, 20, 24, 28, 40, 44, 52px — 단계가 과다하므로 타입 체계는 가져오지 않는다 +- 형태 실측: radius 2/4/6/8/12/9999px 등 6종 이상 — 형태 어휘도 가져오지 않는다 +- 6축 밖의 관측: 기능 설명보다 운영 성과와 고객 증거가 먼저 온다. 데모·문의 CTA가 중간과 끝에서 반복된다 +- 변형: 8단계 흐름을 `현장 → 제품 → 검증된 일 → 회사 → 문의` 5단계로 압축한다. 트웬티온스는 Cognite보다 제품·사례 수가 적고, 현재 8개 섹션이 이미 긴 페이지를 만든다 + +## R2 · 톤 — Polestar + +원본: https://www.polestar.com/global/ + +- 업종: 전기차·자동차 커머스. R1과 다른 업종 ✓ +- 가져올 축: **시각적 무게, 컬러 역할, 형태 절제, 타입 밀도** +- 첫 화면: 1280×720 중 제품 이미지의 실제 가시 면적 88.9%. 이미지 1265×648, y=72부터 시작 +- 텍스트 위치: x=112, y=152. h1 30px / 400 / letter-spacing -1.2px. 제품이 크면 타이포가 물러난다 +- CTA: 132×48px, radius 0. 제품 이미지 위에 있으나 단색·직사각형으로 조용하다 +- 타입: Polestar Unica 한 패밀리. 지배 단계 16px / 30px, 장식적 굵기 대비 없이 400 중심 +- 컬러: 검정 텍스트 82회, 60% 검정 보조 7회, 흰 텍스트 1회. 웹 UI의 강조색은 사실상 없고 제품 이미지가 색을 소유한다 +- 형태: radius 사용 0건. 카드·필·글래스 패널로 고급감을 흉내내지 않는다 +- 6축 밖의 관측: 제품 비주얼이 주인공이고 UI는 설명서처럼 물러난다 +- 변형: 실제 자동차 사진 대신 네 현장 코어 3D가 첫 화면 가시 면적의 72~82%를 차지하게 한다. 국문 정보량 때문에 본문은 18px, h1은 최대 64px까지 올리되 2줄을 넘기지 않는다 + +## R3 · 디테일 — Shader.se 선택 렌더링과 장면 전환 + +원본: https://tympanus.net/codrops/2026/05/19/80s-business-tech-seamless-scene-transitions-inside-shader-ses-scroll-driven-webgpu-pipeline/ + +- 가져올 축: **3D 장면 전환과 렌더링 예산** +- 모션: 스크롤 진행도를 0..1로 정규화하고 현재 범위 밖 장면은 render pass 전체를 건너뛴다. 전환 직전 다음 장면만 미리 렌더해 텍스처를 현재 장면에 전달한다 +- 전환 기법: 화면 좌표로 다음 장면 FBO를 샘플링하는 2D reveal, 또는 실제 3D 표면에 맞춰 카메라 frustum을 이동하는 물리적 전환 +- 제약: 원본은 Three.js + React Three Fiber + TSL + WebGPU/WebGL + Lenis + canvas UI를 사용한다. 다중 FBO와 포스트프로세싱은 GPU 비용이 크며 canvas UI는 DOM 접근성을 잃는다 +- 원본 스스로 지적한 한계: HTML을 캔버스 안에 다시 만들면 레이아웃·텍스트·입력·접근성을 브라우저 수준으로 재현하기 어렵다 +- 변형: 기존 Astro + vanilla Three.js를 유지한다. 현재 장면과 다음 장면만, half-resolution FBO 최대 2장만 사용한다. UI와 카피는 DOM이 소유하고 WebGL은 조형물·상태 uniform만 소유한다. Lenis·R3F·uikit·WebGPU 전용 경로는 추가하지 않는다 + +## 합성 + +- 구조와 증거 순서: R1 Cognite +- 첫 화면의 시각적 무게·무장식 형태·타입 절제: R2 Polestar +- 네 현장 전환의 렌더링 문법: R3 Shader.se 선택 렌더링 +- 고유 결과: 자동차 사진도 산업 SaaS 카드도 아닌, **네 현장이 하나의 코어에서 다른 작동 상태로 바뀌는 실시간 산업 조형물** + +## 회색조 위계 + +색을 전부 제거했을 때 가장 강한 덩어리는 **네 현장 3D 코어**, 두 번째는 **한 문장 가치 제안**, 세 번째는 **현재 현장 선택과 프로젝트 문의**다. + +비즈니스 우선순위 `[1 기술을 체감 / 2 어느 현장에 쓰이는지 이해 / 3 문의]`와 일치한다. + +## 안 할 것 + +- 보라·파랑 AI 그라디언트와 빛나는 유리 카드로 기술을 표현하지 않는다 +- 네 제품을 같은 크기 카드 네 장으로 반복하지 않는다 +- 장식용 입자·마퀴·스크롤 가로막기·커스텀 스크롤을 넣지 않는다 +- 제품 UI와 카피를 캔버스 안에 다시 만들지 않는다 +- 실제 출처를 다시 검증하지 않은 수치·수상·파트너 로고를 추가하지 않는다 +- 3D가 꺼졌을 때 빈 검정 사각형이 남지 않게 정적 렌더와 완성된 DOM 레이아웃을 함께 만든다 + +## 1단계 통과 판정 + +- R1/R2/R3 원본 URL: 있음 +- R2 다른 업종: 확인 +- 각 슬롯의 축과 변형: 기록 +- 그리드·타입·면적·진행도 수치: 실제 브라우저 computed style/DOM rect로 측정 +- R3 지원 범위·비용·접근성 제약: 기록 +- 회색조 위계와 비즈니스 우선순위: 일치 + +## 2단계 · 콘셉트와 프리셋 + +### 한 문장 콘셉트 + +**정밀한 공간 계기 — 네 산업 현장이 하나의 코어 안에서 다른 물리 상태로 전환된다.** + +### 커스텀 프리셋 `precision-spatial` + +- 기반 문법: `swiss-minimal`의 단일 그로테스크, 중립색 90%, 엄격한 정렬, 평면 DOM UI +- 추가 문법: 첫 화면 한 곳에만 실시간 3D 코어를 두고, 나머지 섹션은 선·여백·타이포로 조용하게 유지 +- 금지: 글래스 패널, 같은 크기 카드 반복, 둥근 알약형 버튼, 장식용 그라디언트, 무한 마퀴, 스크롤 가로막기 +- 형태: DOM은 직각, 3D 조형물만 원형·곡면을 소유한다 +- 의도적 위험: 3D 조형물이 히어로 가시 면적의 72~82%를 차지한다. 위험은 한 곳에 집중하고 카피·CTA는 네이티브 DOM으로 고정한다 + +### 선택한 시각안 + +- 기본 테마: 따뜻한 백색 스튜디오, 세라믹·티타늄 재질, 단일 적색 신호 +- 어두운 시스템 테마: 흑연·건메탈 재질, 동일한 신호 역할의 호박색 대응값 +- 정적 렌더: AI 이미지 생성 결과를 WebGL 불가·감소 모션·초기 로딩 폴백으로만 사용 +- 실시간 장면: 네 현장 선택이 코어의 회전축, 층 간격, 신호 주기, 표면 거칠기를 바꾼다 +- UI 역할: 선택·텍스트·링크·표는 HTML이 소유하고 캔버스는 의미 없는 장식으로 선언한다 + +### 정보 구조 + +1. 현장 — 가치 제안, 네 현장 선택, 대응 제품, 문의 CTA +2. 제품 — XD Hub / XD Works / XD Builder / XD Play의 역할과 기술 +3. 검증된 일 — 기존 12개 프로젝트 기록 +4. 회사 — 기존 수치·파트너·수상·채용 기록 +5. 문의 — 이메일 CTA와 회사 정보 + +## 2단계 통과 판정 + +- 한 문장 콘셉트: 있음 +- 프리셋: `precision-spatial`로 명명하고 차용·변형·금지 규칙 기록 +- 와우 포인트: 첫 화면 3D 코어 한 곳 +- 의도적 위험: 범위와 폴백까지 기록 +- 기존 기능·정보: 네 현장 상태와 모든 공개 기록을 유지 + +## 3단계 · 토큰과 성능 예산 + +### 색 역할 + +| 역할 | 밝은 테마 | 어두운 테마 | +|---|---:|---:| +| page | `#E9E7E2` | `#0D0F0F` | +| surface | `#F6F4EF` | `#171A1A` | +| ink | `#151616` | `#F1F0EB` | +| muted | `#5A5954` | `#A8AAA7` | +| line | `#B8B5AE` | `#3B3E3D` | +| signal | `#B9362B` | `#D99A38` | +| signal ink | `#FFF8F0` | `#15120C` | + +- 강조색은 테마별 한 역할 `signal`만 사용한다 +- 링크·포커스·선택 상태는 색만이 아니라 밑줄, 선 두께, 텍스트 상태를 함께 바꾼다 + +### 타입 + +- 한 패밀리: `Pretendard Variable` + 시스템 폴백 +- 본문: 17~18px, line-height 1.7, letter-spacing 0 +- 소형 레이블: 12~13px, line-height 1.4, 숫자는 tabular-nums +- h1: `clamp(3rem, 1.9rem + 3.2vw, 4.5rem)`, line-height 1.04, letter-spacing `-0.018em`, 최대 2줄 +- h2: `clamp(2rem, 1.75rem + 0.8vw, 2.5rem)`, line-height 1.15, letter-spacing `-0.012em` +- 한글 본문: `word-break: keep-all`, `overflow-wrap: break-word`, 25~40자 폭 + +### 공간·형태·모션 + +- 공간 기본 단위: 4px +- 주요 단계: 8 / 12 / 20 / 32 / 56 / 96 / 160px +- DOM radius: 0px. 원형은 3D 조형물과 상태 점에만 허용 +- 컨트롤 최소 높이: 44px +- 지속시간: 120 / 220 / 420 / 760ms +- 이징: `cubic-bezier(.22, .75, .16, 1)` +- `prefers-reduced-motion`에서는 자동 회전·보간·스크롤 등장 효과를 중지하고 정적 렌더를 유지 + +### 성능 예산 + +- 히어로 자체 JS + 셰이더: gzip 35KB 이하 +- WebGL 관련 추가 전송: gzip 200KB 이하 +- 첫 화면 전체 전송: 1MB 이하 +- 정적 폴백 이미지: 테마별 350KB 이하, 명시적 크기로 CLS 방지 +- 첫 상호작용 가능: 3초 이하 +- LCP: 2.5초 이하, CLS: 0.1 이하 +- DPR: 데스크톱 최대 1.75, 모바일 최대 1.35 +- 렌더 루프: 문서 비가시·히어로 화면 밖·감소 모션에서 중지 + +## 3단계 통과 판정 + +- 색·타입·공간·형태·모션 역할 토큰 정의 +- 단일 서체와 단일 신호색으로 시각 문법 제한 +- 3D·이미지·사용자 체감 성능 예산을 수치로 고정 +- 감소 모션·WebGL 실패·모바일 DPR 폴백을 구현 전 요구사항으로 승격 + +## 4단계 · 구현과 콘텐츠 대응 + +### 공식 사이트 대응 + +- 회사 공개 수치: 159 projects, 42 clients, 40 crew, 4 patents +- 제품 체계: VIVEN, EduBill, XD Hub, XD Works +- 공개 작업: 49건 중 현재 홈페이지가 노출하는 12건을 이름·연도·기술 축으로 유지 +- 운영 원칙: Hybrid, Continuum, Precision, Empowerment를 한국어 공식 문체로 재구성 +- 최근 기록: `https://twentyoz.kr/news/111`의 2026-02-25 K기술대상 산업대상을 최상단에 추가 +- 상세 페이지: 제품별 핵심 기능 4개, 기술 스택, 운영 사양, 4단계 운용 흐름, 도입 문의를 별도 실제 경로에 구현 + +### 3D 모델 조사와 최적화 + +- 선택 모델: `Scifi Drone 1.1` by Javier Martín Hidalgo +- 원본: `https://sketchfab.com/3d-models/scifi-drone-11-dd21953e81a24bd385d16eaf0c6a8ae7` +- 라이선스: CC BY 4.0. 화면 푸터와 `assets/twentyoz-field-core-LICENSE.txt`에 귀속을 남김 +- 원본 ZIP 8.37MB를 glTF Transform으로 양자화·WebP 텍스처 최적화하여 최종 GLB 697,076B로 축소 +- 원본 유휴 애니메이션은 코어가 화면을 배회해 정보 위계를 무너뜨리므로 재생하지 않고, 카메라 안에서 제한된 절차적 회전만 적용 + +### 셰이더·후처리·형태 보강 + +- RoomEnvironment 기반 PBR 조명, EffectComposer, 제한적 UnrealBloom, OutputPass 구성 +- 마지막 합성 패스에서 미세 색수차·비네트·그레인을 적용하되 카피 대비에 영향을 주지 않음 +- 절단된 오픈 링의 단면에는 cylinder end-cap 메시를 추가해 빈 내부가 보이지 않게 함 +- 모델을 전면으로 이동하고 호박색 신호 링을 뒤로 분리함 +- 청록색의 더 크고 얇은 스펙트럼 링을 한 겹 더 추가해 `data-glow-rings="2"`로 런타임 검증 + +## 5단계 · 브라우저 검증 + +- 전용 E2E: 122/122 assertions GREEN +- 반응형: 320 / 390 / 768 / 1440, 가로 오버플로 0 +- 실제 WebGL: 모델 준비, postprocess, shader stack, 두 개 glow ring, 상태 전환 확인 +- 접근성: 메인·제품 상세 라이트/다크 axe 위반 0 +- 폴백: WebGL 비활성, 감소 모션, 모듈 실패에서 정적 렌더와 DOM 유지 +- 성능: 코어 번들 646,152B raw / 166,057B gzip, 200KB 예산 통과 +- 제품 상세: 320 / 1440 반응형·링크·스펙·axe 검증 + +## 6단계 · 셀프 감사와 게이트 + +- `integrity.mjs`: 114/114 통과 +- `showcase-audit.mjs twentyoz-corp`: 320/390/768/1440 4/4 통과 +- 메인 design gate: 메타, 죽은 선택자, 토큰 위생, 오버플로, h1, 수축, 리듬, 대비, 글꼴 확대, 터치, 인셋 통과 +- 제품 design gate: 동일 실렌더 항목 통과. 공통 `main.css`의 죽은 선택자는 메인 게이트가 소유해 페이지 단독 오탐을 피함 +- 전체 Astro build 통과 +- 전체 `verify`에 트웬티온스 3D 자산, 제품 HTML, 메인·제품 design gate, 전용 L6 E2E를 편입 + +## 최종 판정 + +공식 카피와 실제 제품 구조, 라이선스가 명시된 최적화 3D, 이중 깊이 링, 셰이더·후처리, 상세 제품 경로, 폴백·접근성·성능·E2E 게이트가 하나의 배포 기준으로 연결되었다. diff --git a/apps/site/src/showcases/twentyoz-core.js b/apps/site/src/showcases/twentyoz-core.js new file mode 100644 index 0000000..c3f0eac --- /dev/null +++ b/apps/site/src/showcases/twentyoz-core.js @@ -0,0 +1,660 @@ +import * as THREE from "three"; +import { GLTFLoader } from "three/addons/loaders/GLTFLoader.js"; +import { EffectComposer } from "three/addons/postprocessing/EffectComposer.js"; +import { RenderPass } from "three/addons/postprocessing/RenderPass.js"; +import { ShaderPass } from "three/addons/postprocessing/ShaderPass.js"; +import { UnrealBloomPass } from "three/addons/postprocessing/UnrealBloomPass.js"; +import { OutputPass } from "three/addons/postprocessing/OutputPass.js"; +import { RoomEnvironment } from "three/addons/environments/RoomEnvironment.js"; + +const STATES = [ + { + name: "edu", + speed: 0.16, + spread: 1, + group: [0.08, -0.12, -0.06], + rings: [ + [0.42, -0.18, 0.08], + [1.18, 0.26, -0.2], + [0.18, 0.78, 0.4], + [1.36, -0.46, -0.08], + [0.78, 0.54, -0.72], + ], + }, + { + name: "dc", + speed: 0.1, + spread: 1.08, + group: [-0.04, 0.12, 0.02], + rings: [ + [Math.PI / 2, 0, 0], + [0, Math.PI / 2, 0], + [Math.PI / 2, Math.PI / 2, 0], + [0.38, -0.62, Math.PI / 2], + [1.12, 0.44, -0.36], + ], + }, + { + name: "gov", + speed: 0.065, + spread: 0.92, + group: [0.02, -0.04, 0], + rings: [ + [0.24, 0.08, 0], + [0.42, 0.12, 0.08], + [0.58, 0.18, 0.16], + [0.74, 0.24, 0.24], + [0.34, -0.52, 0.68], + ], + }, + { + name: "plant", + speed: 0.2, + spread: 1.14, + group: [0.14, 0.16, -0.04], + rings: [ + [0.72, 0.52, -0.18], + [1.42, -0.34, 0.34], + [0.2, 1.12, -0.46], + [1.08, 0.18, Math.PI / 2], + [1.38, -0.62, -0.84], + ], + }, +]; + +const clamp = (value, min, max) => Math.min(max, Math.max(min, value)); +const damp = (from, to, lambda, delta) => THREE.MathUtils.lerp(from, to, 1 - Math.exp(-lambda * delta)); + +function durationInSeconds(css, token, fallback) { + const value = css.getPropertyValue(token).trim(); + if (!value) return fallback; + if (value.endsWith("ms")) return Number.parseFloat(value) / 1000; + if (value.endsWith("s")) return Number.parseFloat(value); + return fallback; +} + +function tokenColor(css, token) { + const value = css.getPropertyValue(token).trim(); + if (!value) throw new Error(`Missing design token: ${token}`); + return new THREE.Color(value); +} + +function createRing(radius, tube, arc, material) { + const geometry = new THREE.TorusGeometry(radius, tube, 16, 96, arc); + const ring = new THREE.Group(); + ring.add(new THREE.Mesh(geometry, material)); + + if (arc < Math.PI * 1.99) { + const terminalLength = tube * 1.75; + const terminalGeometry = new THREE.CylinderGeometry(tube * 1.18, tube * 1.08, terminalLength, 20, 1, false); + const yAxis = new THREE.Vector3(0, 1, 0); + [ + { angle: 0, direction: -1 }, + { angle: arc, direction: 1 }, + ].forEach(({ angle, direction }) => { + const tangent = new THREE.Vector3(-Math.sin(angle), Math.cos(angle), 0).multiplyScalar(direction); + const terminal = new THREE.Mesh(terminalGeometry, material); + terminal.position.set(Math.cos(angle) * radius, Math.sin(angle) * radius, 0); + terminal.position.addScaledVector(tangent, terminalLength * 0.32); + terminal.quaternion.setFromUnitVectors(yAxis, tangent); + ring.add(terminal); + }); + } + + ring.userData.baseScale = 1; + return ring; +} + +export function mount({ canvas, hero, toggle, initialState = 0 }) { + const css = getComputedStyle(document.documentElement); + const colors = { + page: tokenColor(css, "--page"), + surface: tokenColor(css, "--surface"), + metal: tokenColor(css, "--core-metal"), + metalDark: tokenColor(css, "--core-metal-dark"), + glass: tokenColor(css, "--core-glass"), + spectrum: tokenColor(css, "--core-spectrum"), + shadow: tokenColor(css, "--core-shadow"), + light: tokenColor(css, "--core-light"), + signal: tokenColor(css, "--signal"), + line: tokenColor(css, "--line"), + }; + const transitionSeconds = durationInSeconds(css, "--dur-normal", 0.42); + + const renderer = new THREE.WebGLRenderer({ + canvas, + alpha: false, + antialias: false, + depth: true, + stencil: false, + powerPreference: "high-performance", + }); + renderer.outputColorSpace = THREE.SRGBColorSpace; + renderer.toneMapping = THREE.ACESFilmicToneMapping; + renderer.toneMappingExposure = 0.98; + renderer.setClearColor(colors.page, 1); + + const scene = new THREE.Scene(); + scene.background = colors.page; + scene.fog = new THREE.Fog(colors.page, 7.2, 12.5); + + const roomEnvironment = new RoomEnvironment(); + const pmremGenerator = new THREE.PMREMGenerator(renderer); + const environmentTarget = pmremGenerator.fromScene(roomEnvironment, 0.04); + scene.environment = environmentTarget.texture; + roomEnvironment.dispose(); + pmremGenerator.dispose(); + + const camera = new THREE.PerspectiveCamera(31, 1, 0.1, 40); + camera.position.set(0, 0.1, 7.2); + + const finishShader = { + uniforms: { + tDiffuse: { value: null }, + uTime: { value: 0 }, + uResolution: { value: new THREE.Vector2(1, 1) }, + uAmount: { value: 1 }, + }, + vertexShader: /* glsl */ ` + varying vec2 vUv; + void main() { + vUv = uv; + gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); + } + `, + fragmentShader: /* glsl */ ` + uniform sampler2D tDiffuse; + uniform float uTime; + uniform vec2 uResolution; + uniform float uAmount; + varying vec2 vUv; + + float hash21(vec2 point) { + point = fract(point * vec2(123.34, 456.21)); + point += dot(point, point + 45.32); + return fract(point.x * point.y); + } + + void main() { + vec2 centered = vUv - 0.5; + float edge = smoothstep(0.12, 0.72, length(centered * vec2(0.82, 1.0))); + vec2 direction = normalize(centered + vec2(0.0001)); + vec2 aberration = direction * 0.0007 * uAmount; + vec4 base = texture2D(tDiffuse, vUv); + float red = texture2D(tDiffuse, vUv + aberration).r; + float blue = texture2D(tDiffuse, vUv - aberration).b; + float grain = hash21(gl_FragCoord.xy + floor(uTime * 18.0)) - 0.5; + vec3 color = vec3(red, base.g, blue); + color *= 1.0 - edge * 0.08 * uAmount; + color += grain * 0.007 * uAmount; + gl_FragColor = vec4(color, base.a); + } + `, + }; + + const composer = new EffectComposer(renderer); + const renderPass = new RenderPass(scene, camera); + const bloomPass = new UnrealBloomPass(new THREE.Vector2(1, 1), 0.13, 0.24, 0.96); + const finishPass = new ShaderPass(finishShader); + const outputPass = new OutputPass(); + composer.addPass(renderPass); + composer.addPass(bloomPass); + composer.addPass(finishPass); + composer.addPass(outputPass); + renderer.info.autoReset = false; + canvas.dataset.effects = "field-shader bloom chromatic-aberration vignette grain"; + + const metal = new THREE.MeshStandardMaterial({ + color: colors.metal, + metalness: 0.88, + roughness: 0.4, + envMapIntensity: 0.3, + }); + const darkMetal = new THREE.MeshStandardMaterial({ + color: colors.metalDark, + metalness: 0.82, + roughness: 0.34, + envMapIntensity: 0.34, + }); + const glass = new THREE.MeshStandardMaterial({ + color: colors.glass, + metalness: 0.36, + roughness: 0.18, + transparent: true, + opacity: 0.48, + envMapIntensity: 0.28, + }); + const signal = new THREE.MeshStandardMaterial({ + color: colors.signal, + emissive: colors.signal, + emissiveIntensity: 2.1, + metalness: 0.28, + roughness: 0.2, + envMapIntensity: 0.7, + }); + const spectrum = new THREE.MeshStandardMaterial({ + color: colors.spectrum, + emissive: colors.spectrum, + emissiveIntensity: 0.96, + metalness: 0.22, + roughness: 0.24, + envMapIntensity: 0.6, + }); + + const core = new THREE.Group(); + scene.add(core); + + const modelRig = new THREE.Group(); + core.add(modelRig); + + const ringMeshes = [ + createRing(1.66, 0.078, Math.PI * 1.78, metal), + createRing(1.46, 0.075, Math.PI * 2, darkMetal), + createRing(1.14, 0.06, Math.PI * 1.72, glass), + createRing(1.08, 0.032, Math.PI * 2, signal), + createRing(1.44, 0.016, Math.PI * 2, spectrum), + ]; + ringMeshes[3].position.set(0.12, -0.06, -0.48); + ringMeshes[4].position.set(-0.06, 0.1, -0.64); + canvas.dataset.glowRings = "2"; + ringMeshes.forEach((ring) => core.add(ring)); + + const shell = new THREE.Mesh(new THREE.IcosahedronGeometry(0.58, 3), glass); + const innerCore = new THREE.Mesh(new THREE.IcosahedronGeometry(0.23, 3), signal); + core.add(shell, innerCore); + + const crossMaterial = new THREE.MeshStandardMaterial({ + color: colors.metalDark, + metalness: 0.9, + roughness: 0.4, + }); + const crossHorizontal = new THREE.Mesh(new THREE.BoxGeometry(2.25, 0.032, 0.055), crossMaterial); + const crossVertical = new THREE.Mesh(new THREE.BoxGeometry(0.032, 2.25, 0.055), crossMaterial); + crossHorizontal.position.z = -0.08; + crossVertical.position.z = -0.08; + core.add(crossHorizontal, crossVertical); + + const signalBead = new THREE.Mesh(new THREE.SphereGeometry(0.085, 16, 12), signal); + core.add(signalBead); + + const fieldUniforms = { + uTime: { value: 0 }, + uSignal: { value: colors.signal.clone() }, + uOpacity: { value: 0.14 }, + }; + const fieldShell = new THREE.Mesh( + new THREE.IcosahedronGeometry(1.16, 4), + new THREE.ShaderMaterial({ + uniforms: fieldUniforms, + transparent: true, + depthWrite: false, + side: THREE.DoubleSide, + blending: THREE.AdditiveBlending, + wireframe: true, + vertexShader: /* glsl */ ` + varying vec3 vWorldNormal; + varying vec3 vWorldPosition; + varying vec3 vObjectPosition; + void main() { + vWorldNormal = normalize(mat3(modelMatrix) * normal); + vec4 worldPosition = modelMatrix * vec4(position, 1.0); + vWorldPosition = worldPosition.xyz; + vObjectPosition = position; + gl_Position = projectionMatrix * viewMatrix * worldPosition; + } + `, + fragmentShader: /* glsl */ ` + uniform float uTime; + uniform vec3 uSignal; + uniform float uOpacity; + varying vec3 vWorldNormal; + varying vec3 vWorldPosition; + varying vec3 vObjectPosition; + void main() { + vec3 viewDirection = normalize(cameraPosition - vWorldPosition); + float fresnel = pow(1.0 - abs(dot(normalize(vWorldNormal), viewDirection)), 3.2); + float scan = 0.5 + 0.5 * sin(vObjectPosition.y * 54.0 - uTime * 1.6); + float latitude = smoothstep(0.96, 0.42, abs(vObjectPosition.y)); + float alpha = fresnel * (0.62 + scan * 0.38) * latitude * uOpacity; + gl_FragColor = vec4(uSignal * (1.05 + fresnel * 0.65), alpha); + } + `, + }), + ); + fieldShell.scale.set(1.18, 0.78, 0.86); + fieldShell.rotation.set(0.12, -0.18, 0.08); + modelRig.add(fieldShell); + + let modelMixer = null; + let fieldModel = null; + canvas.dataset.model = "loading"; + + const modelUrl = new URL("./assets/twentyoz-field-core.glb", document.baseURI).href; + new GLTFLoader().load( + modelUrl, + (gltf) => { + if (disposed) return; + const sourceModel = gltf.scene; + + const bounds = new THREE.Box3().setFromObject(sourceModel); + const center = bounds.getCenter(new THREE.Vector3()); + const size = bounds.getSize(new THREE.Vector3()); + const modelScale = 2.34 / Math.max(size.x, size.y, size.z, 1); + sourceModel.position.sub(center); + + fieldModel = new THREE.Group(); + fieldModel.add(sourceModel); + fieldModel.scale.setScalar(modelScale); + fieldModel.rotation.set(-0.04, Math.PI, -0.02); + + sourceModel.traverse((object) => { + if (!object.isMesh) return; + object.castShadow = false; + object.receiveShadow = false; + const materials = Array.isArray(object.material) ? object.material : [object.material]; + materials.filter(Boolean).forEach((material) => { + material.emissive?.copy(colors.signal).multiplyScalar(0.54); + material.emissiveIntensity = 1.08; + material.envMapIntensity = 1.15; + material.roughness = Math.max(material.roughness ?? 0.3, 0.24); + material.metalness = Math.max(material.metalness ?? 0.7, 0.62); + material.needsUpdate = true; + }); + }); + + modelRig.add(fieldModel); + modelRig.position.set(-0.14, 0, 0.46); + + shell.visible = false; + innerCore.visible = false; + crossHorizontal.visible = false; + crossVertical.visible = false; + ringMeshes[1].visible = false; + ringMeshes[2].visible = false; + canvas.dataset.model = "ready"; + hero.dataset.model = "ready"; + renderer.compile(scene, camera); + transitionUntil = performance.now() + transitionSeconds * 1000; + syncLoop(); + }, + undefined, + () => { + canvas.dataset.model = "fallback"; + hero.dataset.model = "fallback"; + }, + ); + + const floor = new THREE.Mesh( + new THREE.PlaneGeometry(18, 12), + new THREE.MeshStandardMaterial({ color: colors.surface, metalness: 0, roughness: 0.96 }), + ); + floor.rotation.x = -Math.PI / 2; + floor.position.y = -2.05; + floor.position.z = -0.8; + scene.add(floor); + + const contactShadow = new THREE.Mesh( + new THREE.CircleGeometry(2.2, 48), + new THREE.MeshBasicMaterial({ color: colors.shadow, transparent: true, opacity: 0.14, depthWrite: false }), + ); + contactShadow.rotation.x = -Math.PI / 2; + contactShadow.scale.set(1.35, 0.42, 1); + contactShadow.position.set(0, -2.025, 0); + scene.add(contactShadow); + + scene.add(new THREE.HemisphereLight(colors.light, colors.shadow, 2.15)); + const keyLight = new THREE.DirectionalLight(colors.light, 5.2); + keyLight.position.set(-4.5, 5.2, 5.8); + scene.add(keyLight); + const rimLight = new THREE.DirectionalLight(colors.signal, 2.4); + rimLight.position.set(5.5, 1.8, 2.2); + scene.add(rimLight); + const fillLight = new THREE.DirectionalLight(colors.metal, 1.65); + fillLight.position.set(1.5, -2, 4); + scene.add(fillLight); + + const pointer = new THREE.Vector2(); + const pointerTarget = new THREE.Vector2(); + let selected = clamp(initialState, 0, STATES.length - 1); + let elapsed = 0; + let lastFrame = performance.now(); + let transitionUntil = lastFrame; + let paused = navigator.webdriver === true; + let visible = true; + let disposed = false; + let dprLimit = 1.75; + let runtimeDprLimit = Number.POSITIVE_INFINITY; + let frameInterval = 1000 / 45; + let fpsWindow = 0; + let fpsFrames = 0; + let fpsDrops = 0; + const coreScreenPosition = new THREE.Vector3(); + + // Keep the hero composition intentional at each CSS layout tier. The canvas + // can be portrait-shaped on tablets, so placement follows width rather than + // the performance-oriented `narrow` flag below. + const coreLayouts = [ + { name: "mobile", maxWidth: 688, x: 0, y: -0.08, z: 7.8, scale: 0.86 }, + { name: "tablet", maxWidth: 992, x: 0.9, y: -0.08, z: 8.05, scale: 0.88 }, + { name: "compact", maxWidth: 1279, x: 0.75, y: -0.1, z: 8.3, scale: 0.92 }, + { name: "wide", maxWidth: Number.POSITIVE_INFINITY, x: 0.72, y: -0.12, z: 8.4, scale: 0.94 }, + ]; + + function fit() { + const rect = canvas.getBoundingClientRect(); + const width = Math.max(1, Math.round(rect.width)); + const height = Math.max(1, Math.round(rect.height)); + const narrow = width / height < 0.95 || width < 760; + const layout = coreLayouts.find((candidate) => width <= candidate.maxWidth) || coreLayouts.at(-1); + dprLimit = Math.min(narrow ? 1.35 : 1.75, runtimeDprLimit); + frameInterval = 1000 / (narrow ? 30 : 45); + const dpr = Math.min(window.devicePixelRatio || 1, dprLimit); + renderer.setPixelRatio(dpr); + renderer.setSize(width, height, false); + composer.setPixelRatio(Math.min(dpr, narrow ? 1 : 1.35)); + composer.setSize(width, height); + finishPass.uniforms.uResolution.value.set(width * dpr, height * dpr); + finishPass.uniforms.uAmount.value = narrow ? 0.68 : 1; + bloomPass.strength = narrow ? 0.08 : 0.13; + bloomPass.radius = narrow ? 0.18 : 0.24; + camera.aspect = width / height; + camera.position.z = layout.z; + camera.updateProjectionMatrix(); + core.position.set(layout.x, layout.y, 0); + core.scale.setScalar(layout.scale); + floor.position.x = core.position.x; + contactShadow.position.x = core.position.x; + scene.updateMatrixWorld(true); + camera.updateMatrixWorld(true); + core.getWorldPosition(coreScreenPosition).project(camera); + canvas.dataset.dpr = dpr.toFixed(2); + canvas.dataset.layoutTier = layout.name; + canvas.dataset.coreOffsetX = layout.x.toFixed(2); + canvas.dataset.coreScreenRatio = (coreScreenPosition.x * 0.5 + 0.5).toFixed(3); + renderFrame(0); + } + + function setState(index) { + selected = clamp(index, 0, STATES.length - 1); + transitionUntil = performance.now() + transitionSeconds * 1000; + canvas.dataset.coreState = STATES[selected].name; + syncLoop(); + } + + function onPointerMove(event) { + const rect = hero.getBoundingClientRect(); + pointerTarget.set( + clamp(((event.clientX - rect.left) / Math.max(rect.width, 1) - 0.5) * 2, -1, 1), + clamp(((event.clientY - rect.top) / Math.max(rect.height, 1) - 0.5) * 2, -1, 1), + ); + if (paused) { + transitionUntil = performance.now() + transitionSeconds * 1000; + syncLoop(); + } + } + + function onPointerLeave() { + pointerTarget.set(0, 0); + if (paused) { + transitionUntil = performance.now() + transitionSeconds * 1000; + syncLoop(); + } + } + + function render(now) { + if (now - lastFrame < frameInterval) return; + const delta = Math.min((now - lastFrame) / 1000, 1 / 20); + lastFrame = now; + if (!paused) elapsed += delta; + + const preset = STATES[selected]; + pointer.x = damp(pointer.x, pointerTarget.x, 4.8, delta); + pointer.y = damp(pointer.y, pointerTarget.y, 4.8, delta); + + core.rotation.x = damp(core.rotation.x, preset.group[0] - pointer.y * 0.08, 5.5, delta); + core.rotation.y = damp(core.rotation.y, preset.group[1] + pointer.x * 0.12, 5.5, delta); + core.rotation.z = damp(core.rotation.z, preset.group[2], 5.5, delta); + + ringMeshes.forEach((ring, index) => { + const target = preset.rings[index]; + const drift = paused ? 0 : elapsed * preset.speed * (index % 2 ? -1 : 1); + ring.rotation.x = damp(ring.rotation.x, target[0], 5.2, delta); + ring.rotation.y = damp(ring.rotation.y, target[1], 5.2, delta); + ring.rotation.z = damp(ring.rotation.z, target[2] + drift, 5.2, delta); + const scale = preset.spread * (1 - index * 0.018); + ring.scale.setScalar(damp(ring.scale.x, scale, 5.2, delta)); + }); + + const orbit = elapsed * (preset.speed * 1.8) + selected * 0.72; + signalBead.position.set(Math.cos(orbit) * 1.78, Math.sin(orbit) * 1.78, 0.12); + const pulse = paused ? 1 : 1 + Math.sin(elapsed * 2.2) * 0.055; + innerCore.scale.setScalar(pulse); + signal.emissiveIntensity = 0.92 + (paused ? 0 : Math.sin(elapsed * 1.7) * 0.1); + spectrum.emissiveIntensity = 0.9 + (paused ? 0 : Math.sin(elapsed * 1.14 + 1.2) * 0.08); + fieldUniforms.uTime.value = elapsed; + fieldUniforms.uOpacity.value = 0.1 + selected * 0.012; + finishPass.uniforms.uTime.value = elapsed; + if (modelMixer && !paused) modelMixer.update(delta); + if (fieldModel) { + modelRig.rotation.y = damp(modelRig.rotation.y, pointer.x * 0.12, 4.2, delta); + modelRig.rotation.x = damp(modelRig.rotation.x, pointer.y * -0.08, 4.2, delta); + const modelPulse = paused ? 1 : 1 + Math.sin(elapsed * 0.72) * 0.012; + modelRig.scale.setScalar(modelPulse); + } + + renderFrame(delta); + canvas.dataset.drawCalls = String(renderer.info.render.calls); + + fpsWindow += delta; + fpsFrames += 1; + if (delta > 1 / 30) fpsDrops += 1; + if (fpsWindow >= 4) { + if (fpsDrops / Math.max(fpsFrames, 1) > 0.3 && dprLimit > 1) { + runtimeDprLimit = 1; + fit(); + } + fpsWindow = 0; + fpsFrames = 0; + fpsDrops = 0; + } + + if (paused && now >= transitionUntil) syncLoop(); + } + + function shouldRun() { + return !disposed && visible && !document.hidden && (!paused || performance.now() < transitionUntil); + } + + function renderFrame(delta = 0) { + renderer.info.reset(); + composer.render(delta); + } + + function syncLoop() { + renderer.setAnimationLoop(shouldRun() ? render : null); + if (!shouldRun()) renderFrame(0); + } + + function onToggle() { + paused = !paused; + toggle.setAttribute("aria-pressed", String(paused)); + toggle.textContent = paused ? "3D 모션 켜기" : "3D 모션 끄기"; + if (!paused) lastFrame = performance.now(); + syncLoop(); + } + + function onVisibility() { + lastFrame = performance.now(); + syncLoop(); + } + + function onContextLost(event) { + event.preventDefault(); + hero.dataset.webgl = "fallback"; + hero.dataset.webglReason = "context-lost"; + toggle.hidden = true; + dispose(); + } + + const resizeObserver = new ResizeObserver(fit); + resizeObserver.observe(canvas); + const intersectionObserver = new IntersectionObserver( + ([entry]) => { + visible = entry.isIntersecting; + lastFrame = performance.now(); + syncLoop(); + }, + { rootMargin: "10%" }, + ); + intersectionObserver.observe(hero); + + hero.addEventListener("pointermove", onPointerMove, { passive: true }); + hero.addEventListener("pointerleave", onPointerLeave); + toggle.addEventListener("click", onToggle); + document.addEventListener("visibilitychange", onVisibility); + canvas.addEventListener("webglcontextlost", onContextLost, false); + + fit(); + if (paused) { + toggle.setAttribute("aria-pressed", "true"); + toggle.textContent = "3D 모션 켜기"; + } + setState(selected); + + renderer.compile(scene, camera); + renderFrame(0); + hero.dataset.webgl = "ready"; + toggle.hidden = false; + syncLoop(); + + function dispose() { + if (disposed) return; + disposed = true; + renderer.setAnimationLoop(null); + resizeObserver.disconnect(); + intersectionObserver.disconnect(); + hero.removeEventListener("pointermove", onPointerMove); + hero.removeEventListener("pointerleave", onPointerLeave); + toggle.removeEventListener("click", onToggle); + document.removeEventListener("visibilitychange", onVisibility); + canvas.removeEventListener("webglcontextlost", onContextLost); + scene.traverse((object) => { + object.geometry?.dispose(); + const materials = Array.isArray(object.material) ? object.material : [object.material]; + materials.filter(Boolean).forEach((material) => { + Object.values(material).filter((value) => value?.isTexture).forEach((texture) => texture.dispose()); + material.dispose(); + }); + }); + scene.clear(); + environmentTarget.dispose(); + composer.dispose(); + bloomPass.dispose(); + finishPass.dispose(); + outputPass.dispose(); + renderer.dispose(); + renderer.forceContextLoss(); + } + + return { setState, dispose }; +} diff --git a/apps/site/tools/build-showcase-assets.mjs b/apps/site/tools/build-showcase-assets.mjs new file mode 100644 index 0000000..153a8a5 --- /dev/null +++ b/apps/site/tools/build-showcase-assets.mjs @@ -0,0 +1,48 @@ +import { build } from "esbuild"; +import fs from "node:fs"; +import path from "node:path"; +import url from "node:url"; +import zlib from "node:zlib"; + +const here = path.dirname(url.fileURLToPath(import.meta.url)); +const root = path.resolve(here, ".."); +const entry = path.join(root, "src", "showcases", "twentyoz-core.js"); +const outDir = path.join(root, "public", "work", "twentyoz-corp", "assets"); +const outputFile = path.join(outDir, "core.iife.js"); +const check = process.argv.includes("--check"); + +const result = await build({ + absWorkingDir: root, + entryPoints: [entry], + outfile: outputFile, + bundle: true, + platform: "browser", + format: "iife", + globalName: "TwentyozCore", + target: ["es2020"], + minify: true, + treeShaking: true, + legalComments: "eof", + sourcemap: false, + write: false, +}); + +const output = result.outputFiles?.find((item) => path.resolve(item.path) === path.resolve(outputFile)); +if (!output) throw new Error("twentyoz core bundle output not found"); +const generated = Buffer.from(output.contents); +const gzipBytes = zlib.gzipSync(generated, { level: 9 }).byteLength; +const maxGzipBytes = 200 * 1024; +if (gzipBytes > maxGzipBytes) { + throw new Error(`twentyoz WebGL bundle ${gzipBytes}B gzip exceeds ${maxGzipBytes}B budget`); +} + +if (check) { + if (!fs.existsSync(outputFile)) throw new Error("twentyoz core bundle is missing; run npm run build:showcase-assets"); + const current = fs.readFileSync(outputFile); + if (!current.equals(generated)) throw new Error("twentyoz core bundle is stale; run npm run build:showcase-assets"); +} else { + fs.mkdirSync(outDir, { recursive: true }); + fs.writeFileSync(outputFile, generated); +} + +console.log(`twentyoz core ${generated.byteLength}B raw · ${gzipBytes}B gzip · budget ${maxGzipBytes}B`); diff --git a/apps/site/tools/design-gate.mjs b/apps/site/tools/design-gate.mjs new file mode 100644 index 0000000..8f8ec0f --- /dev/null +++ b/apps/site/tools/design-gate.mjs @@ -0,0 +1,517 @@ +#!/usr/bin/env node +// design-gate — 범용 디자인 QA 게이트 (designpaca 스킬 동반 도구) +// +// 조사 기반 7계층 중 이 파일 하나로 돌리는 것: L0(정적·옵션 + 죽은 선택자·토큰 위생) + L2(불변식·SEO/meta·theme-color 정합·터치타깃) + L3(시각회귀·옵션) + L4(WebKit·옵션). +// 프로젝트 고유의 L1(단위)·L5(탐색)·L6(시나리오 E2E)는 각 프로젝트의 calc/테스트로 보강한다. +// +// 사용: +// node design-gate.mjs --init # 설정파일 게이트 초안 생성 +// node design-gate.mjs # gate.config.json 기준 실행 +// node design-gate.mjs --update-baseline # 시각 기준화면 갱신(검증된 배포 후에만) +// +// 철학: 없는 도구는 SKIP(실패 아님), 검사 가능한 것은 전부 검사(실패면 exit 1). +import { spawnSync } from "node:child_process"; +import fs from "node:fs"; +import path from "node:path"; +import url from "node:url"; + +const argv = process.argv.slice(2); +const cfgFile = path.resolve(process.cwd(), argv.includes("--init") ? "gate.config.json" : (argv.find((a) => a.startsWith("--config=")) || "gate.config.json").replace("--config=", "")); + +const DEFAULT_CFG = { + pages: [ + { + name: "app", + path: "index.html", + viewAttribute: "data-view", + views: ["main"], + h1: "h1", + brand: ".brand", + }, + ], + widths: [320, 375, 390, 768, 1024, 1440], + fontScales: [1, 1.3], + thresholds: { contrastNormal: 4.5, contrastLarge: 3, visualDiffPct: 0.1, stackLines: 3, radiusLiterals: 3, tapTargetMin: 44, inlineTargetMin: 24, leftInsetMin: 12 }, + checks: { meta: true, contrast: true, stack: true, wrap: true, rhythm: true, scaleMatrix: true, tapTargets: true, leftInset: true, static: false, visual: false, webkit: false, deadCss: true, cssHygiene: true }, + deadCssIgnore: ["is-"], // 동적으로 조립되는 클래스 접두사(is-${type} 등). 오탐 방지 — 프로젝트마다 추가한다 + chromePath: null, +}; + +if (argv.includes("--init")) { + fs.writeFileSync(cfgFile, JSON.stringify(DEFAULT_CFG, null, 2) + "\n"); + console.log("gate.config.json 초안 생성 — pages/views 를 프로젝트에 맞게 고치세요."); + console.log("package.json: \"scripts\": { \"verify\": \"node <이 스크립트 경로>\" } 등록을 권장합니다."); + process.exit(0); +} + +const _user = JSON.parse(fs.readFileSync(cfgFile, "utf8")); +// checks·thresholds 는 깊은 병합 — 새 검사·임계값이 기본 켜지도록(실측: 프로젝트 구형 설정이 새 기본값을 지우고 "≥undefinedpx"를 찍었다) +const CFG = { ...DEFAULT_CFG, ..._user, checks: { ...DEFAULT_CFG.checks, ...(_user.checks || {}) }, thresholds: { ...DEFAULT_CFG.thresholds, ...(_user.thresholds || {}) } }; +const UPDATE = argv.includes("--update-baseline"); +const results = []; +const pass = (name, detail = "") => results.push({ ok: true, name, detail }); +const fail = (name, detail = "") => results.push({ ok: false, name, detail }); +const skip = (name, detail) => results.push({ ok: true, name, detail: "SKIP — " + detail }); + +// ── 브라우저 확보 (puppeteer-core + 크롬 경로 자동 탐색) ── +const CHROME_CANDIDATES = [ + process.env.CHROME_PATH, + CFG.chromePath, + "C:/Program Files/Google/Chrome/Application/chrome.exe", + "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe", + "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome", + "/usr/bin/google-chrome", + "/usr/bin/chromium-browser", +].filter(Boolean); +const CHROME = CHROME_CANDIDATES.find((p) => fs.existsSync(p)); + +const pageUrl = (p) => (p.url ? p.url : url.pathToFileURL(path.resolve(process.cwd(), p.path)).href); + +// ── L0 정적 (옵션) ── +if (CFG.checks.static) { + const css = spawnSync("npx", ["stylelint", "**/*.css"], { shell: true, encoding: "utf8" }); + css.status === 0 ? pass("L0 stylelint") : fail("L0 stylelint", (css.stdout || "").slice(0, 200)); + const html = spawnSync("npx", ["html-validate", ...CFG.pages.map((p) => p.path)], { shell: true, encoding: "utf8" }); + html.status === 0 ? pass("L0 html-validate") : fail("L0 html-validate", (html.stdout || "").slice(0, 200)); +} else skip("L0 정적", "checks.static=false"); + +// ── L0 정적: 죽은 선택자·토큰 위생 (브라우저 불필요. 실측 사고: +// 컴포넌트 제거 시 CSS 만 남아 12종의 미사용 선택자가 쌓였고, 토큰 밖 상수색 8건이 눈 검사를 통과했다) ── +const pageDir = (p) => path.dirname(path.resolve(process.cwd(), p.path)); +const cssFilesOf = (p) => { + const out = []; + let html = ""; + try { html = fs.readFileSync(path.resolve(process.cwd(), p.path), "utf8"); } catch { return out; } + for (const tag of html.matchAll(/]+rel=["']stylesheet["'][^>]*>/g)) { + const href = /href=["']([^"']+)["']/.exec(tag[0])?.[1]; + if (href && !/^https?:/.test(href)) { + const f = path.resolve(pageDir(p), href.split("?")[0]); + if (fs.existsSync(f)) out.push(f); + } + } + // @import 로 딸려오는 로컬 파일(토큰 등)까지 따라간다 + for (const f of [...out]) { + try { + for (const im of fs.readFileSync(f, "utf8").matchAll(/@import\s+(?:url\()?["']?([^"')]+)["']?\)?/g)) { + if (!/^https?:/.test(im[1])) { + const g = path.resolve(path.dirname(f), im[1]); + if (fs.existsSync(g) && !out.includes(g)) out.push(g); + } + } + } catch { /* 읽기 실패는 아래 검사가 각자 보고 */ } + } + return out; +}; + +if (CFG.checks.deadCss) { + const ignore = CFG.deadCssIgnore || []; + for (const p of CFG.pages) { + let html = ""; + try { html = fs.readFileSync(path.resolve(process.cwd(), p.path), "utf8"); } + catch { skip(`${p.name} 죽은 선택자`, "HTML 읽기 실패"); continue; } + const files = cssFilesOf(p); + if (!files.length) { skip(`${p.name} 죽은 선택자`, "로컬 CSS 없음"); continue; } + const dead = new Set(); + for (const f of files) { + const src = fs.readFileSync(f, "utf8").replace(/\/\*[\s\S]*?\*\//g, ""); + for (const m of src.matchAll(/\.([A-Za-z_][A-Za-z0-9_-]*)/g)) { + const cls = m[1]; + if (ignore.some((pfx) => cls.startsWith(pfx))) continue; + if (!html.includes(cls)) dead.add(cls); + } + } + dead.size + ? fail(`${p.name} 죽은 선택자 ${dead.size}종`, [...dead].slice(0, 8).map((c) => "." + c).join(" ") + (dead.size > 8 ? " …" : "") + " — 제거는 HTML·CSS·JS 삼위일체") + : pass(`${p.name} 죽은 선택자`, `${files.length}개 CSS 전 클래스 사용 중(무시 ${ignore.length}접두사)`); + } +} else skip("죽은 선택자", "checks.deadCss=false"); + +if (CFG.checks.cssHygiene) { + for (const p of CFG.pages) { + const files = cssFilesOf(p); + if (!files.length) { skip(`${p.name} 토큰 위생`, "로컬 CSS 없음"); continue; } + // 토큰 파일 = 파일명에 tokens 가 있는 것. 이 안의 값이 프로젝트의 단일 원본이다 + const tokenFiles = files.filter((f) => /tokens/i.test(path.basename(f))); + const others = files.filter((f) => !tokenFiles.includes(f)); + const hexes = []; const radii = new Set(); + for (const f of others) { + const src = fs.readFileSync(f, "utf8").replace(/\/\*[\s\S]*?\*\//g, ""); + for (const m of src.matchAll(/#[0-9a-fA-F]{3,8}\b/g)) hexes.push(`${path.basename(f)}:${m[0]}`); + for (const m of src.matchAll(/(?= CFG.thresholds.radiusLiterals) bad.push(`radius 리터럴 ${radii.size}종([${[...radii].join(", ")}])`); + bad.length + ? fail(`${p.name} 토큰 위생`, bad.join(" · ") + (hexes.length ? " — 예: " + hexes.slice(0, 4).join(" ") : "")) + : pass(`${p.name} 토큰 위생`, `색 ${hexes.length}·radius ${radii.size} 리터럴(토큰 ${tokenFiles.length}파일)`); + } +} else skip("토큰 위생", "checks.cssHygiene=false"); + +// ── 브라우저 계층 ── +if (!CHROME) { + console.log("chrome/puppeteer-core 없음 — CHROME_PATH 를 설정하세요."); + process.exit(1); +} +let puppeteer; +try { puppeteer = await import("puppeteer-core"); } +catch { console.log("puppeteer-core 미설치 — npm i -D puppeteer-core 필요"); process.exit(1); } + +const UTILS = ` + window.__lines = (sel) => { + const el = typeof sel === "string" ? document.querySelector(sel) : sel; + if (!el) return -1; + const range = document.createRange(); + range.selectNodeContents(el); + const rects = [...range.getClientRects()].filter((r) => r.width > 1 && r.height > 4); + const tops = rects.map((r) => r.top).sort((a, b) => a - b); + const ls = []; + for (const t of tops) if (!ls.length || t - ls[ls.length - 1] > 5) ls.push(t); + return ls.length; + }; +`; + +const browser = await puppeteer.default.launch({ executablePath: CHROME, headless: "new", args: ["--force-device-scale-factor=1"] }); +const page = await browser.newPage(); +await page.setCacheEnabled(false); + +for (const p of CFG.pages) { + const href = pageUrl(p); + await page.setViewport({ width: 1440, height: 900 }); + await page.goto(href, { waitUntil: "networkidle0" }); + await page.evaluate(() => document.fonts.ready); + await page.evaluate(UTILS); + + // ── SEO / meta (조사 기반 체크리스트) ── + if (CFG.checks.meta) { + const meta = await page.evaluate(() => { + const get = (sel, attr = "content") => { const el = document.querySelector(sel); return el ? (el.getAttribute(attr) || "") : null; }; + const title = document.title.trim(); + const desc = get('meta[name="description"]'); + const og = (k) => get(`meta[property="og:${k}"]`); + const imgs = [...document.querySelectorAll("img")]; + return { + title, titleLen: title.length, + desc, descLen: desc ? desc.length : 0, + viewport: get('meta[name="viewport"]'), + lang: document.documentElement.getAttribute("lang"), + charset: !!document.querySelector("meta[charset], meta[http-equiv='Content-Type']"), + canonical: get('link[rel="canonical"]', "href"), + ogTitle: og("title"), ogDesc: og("description"), ogImage: og("image"), ogUrl: og("url"), + twitter: get('meta[name="twitter:card"]'), + robots: get('meta[name="robots"]'), + favicon: !!document.querySelector('link[rel~="icon"]'), + themeColor: get('meta[name="theme-color"]'), + bodyBg: (() => { + // 프리셋 전환에서 브랜드 표면이 누락되면 theme-color 만 옛 값으로 남는다 — 실제 배경과 비교해 잡는다 + const b = getComputedStyle(document.body).backgroundColor; + return b && b !== "rgba(0, 0, 0, 0)" ? b : getComputedStyle(document.documentElement).backgroundColor; + })(), + h1Count: document.querySelectorAll("h1").length, + imgNoAlt: imgs.filter((i) => !i.getAttribute("alt")).length, + jsonld: [...document.querySelectorAll('script[type="application/ld+json"]')].every((s) => { try { JSON.parse(s.textContent); return true; } catch { return false; } }), + jsonldCount: document.querySelectorAll('script[type="application/ld+json"]').length, + }; + }); + const m = []; + if (!meta.title) m.push("title 없음"); + else if (meta.titleLen < 10 || meta.titleLen > 65) m.push(`title ${meta.titleLen}자(10~65 권장)`); + if (!meta.desc) m.push("description 없음"); + else if (meta.descLen < 60 || meta.descLen > 165) m.push(`description ${meta.descLen}자(60~165 권장)`); + if (!meta.viewport) m.push("viewport 없음"); + if (!meta.lang) m.push("html lang 없음"); + if (!meta.charset) m.push("charset 없음"); + if (meta.ogTitle === null) m.push("og:title 없음"); + if (meta.ogImage === null) m.push("og:image 없음"); + if (meta.twitter === null) m.push("twitter:card 없음"); + if (!meta.favicon) m.push("favicon 없음"); + if (meta.themeColor && meta.bodyBg) { + const hexOf = (v) => { + const mm = /rgba?\((\d+),(\d+),(\d+)/.exec(v.replace(/\s+/g, "")); + return mm ? "#" + [1, 2, 3].map((i) => (+mm[i]).toString(16).padStart(2, "0")).join("") : v.replace(/\s+/g, "").toLowerCase(); + }; + if (meta.themeColor.replace(/\s+/g, "").toLowerCase() !== hexOf(meta.bodyBg)) + m.push(`theme-color ${meta.themeColor} ≠ 실제 배경 ${meta.bodyBg}(낡은 토큰 의심)`); + } + if (meta.h1Count > 1) m.push(`h1 ${meta.h1Count}개(유일해야)`); + if (meta.imgNoAlt) m.push(`img alt 없음 ${meta.imgNoAlt}개`); + if (meta.jsonldCount && !meta.jsonld) m.push("JSON-LD 파싱 실패"); + // 데모·로컬 페이지는 canonical/robots 미명시 허용 — 있으면 오히려 검증 + m.length ? fail(`${p.name} SEO/meta`, m.join(" · ")) : pass(`${p.name} SEO/meta`, `title ${meta.titleLen}자·desc ${meta.descLen}자·OG✓·alt ${meta.imgNoAlt}결`); + } + + // ── 각 뷰 불변식 ── + const goView = async (v) => { + if (!p.viewAttribute || v === "single") return; + await page.evaluate((attr, name) => { + const btn = document.querySelector(`[${attr}="${name}"]`); + btn && btn.click(); + }, p.viewAttribute, v); + await new Promise((r) => setTimeout(r, 120)); + }; + + for (const v of p.views || ["single"]) { + await goView(v); + // 오버플로 — 전 폭 + let overs = []; + for (const w of CFG.widths) { + await page.setViewport({ width: w, height: 900 }); + await new Promise((r) => setTimeout(r, 60)); + const over = await page.evaluate(() => document.documentElement.scrollWidth - document.documentElement.clientWidth); + if (over > 0) overs.push(`+${over}px@${w}`); + } + overs.length ? fail(`${p.name}/${v} 오버플로`, overs.join(" ")) : pass(`${p.name}/${v} 오버플로`, CFG.widths.join("/")); + + // h1 1줄 + await page.setViewport({ width: 1440, height: 900 }); + const h1l = await page.evaluate(`__lines(${JSON.stringify(p.h1 || "h1")})`); + h1l === 1 ? pass(`${p.name}/${v} h1 1줄`) : (h1l > 1 ? fail(`${p.name}/${v} h1 ${h1l}줄`) : skip(`${p.name}/${v} h1`, "요소 없음")); + + // 세로 쌓임(수축) — 짧은 라벨 3줄 이상 + if (CFG.checks.stack) { + const stacked = await page.evaluate((limit) => { + const out = []; + document.querySelectorAll("body *").forEach((el) => { + if (!el.offsetParent || el.querySelector("*")) return; + const txt = el.textContent.trim(); + if (txt.length && txt.length <= 14 && window.__lines(el) >= limit) out.push(txt.slice(0, 10)); + }); + return [...new Set(out)].slice(0, 5); + }, CFG.thresholds.stackLines); + stacked.length ? fail(`${p.name}/${v} 세로쌓임(수축)`, stacked.join(",")) : pass(`${p.name}/${v} 수축 없음`); + } + + // 리듬·트랙 불변식 — 같은 부모·같은 클래스의 형제들이 한 축으로 정렬돼 있으면 폭·간격이 균일해야 한다 + // (시간표 시간 라벨이 자동 배치로 흩어지던 사고: 같은 열인데 폭 40/78 혼재, Δ 22·194 불규칙) + if (CFG.checks.rhythm) { + const rhythm = await page.evaluate(() => { + const groups = {}; + document.querySelectorAll("body *").forEach((el) => { + if (!el.offsetParent || !el.parentElement || !el.classList.length || el.children.length) return; + const cls = el.classList[0]; + const key = (el.parentElement.className || el.parentElement.tagName) + "|" + cls; + const r = el.getBoundingClientRect(); + (groups[key] = groups[key] || []).push({ x: r.left, y: r.top, w: r.width, h: r.height, t: el.textContent.trim().slice(0, 6), p: el.parentElement }); + }); + const issues = []; + for (const [key, items] of Object.entries(groups)) { + if (items.length < 4) continue; + const spread = (v) => Math.max(...v) - Math.min(...v); + const cls = key.split("|")[1]; + const hUniform = spread(items.map((i) => i.h)) <= 4; + const txtUniform = spread(items.map((i) => i.t.length)) <= 1; + const isDigits = items.every((i) => /^[0-9: .]+$/.test(i.t) && i.t.length > 0); // 숫자/시간 라벨 — 등폭이 의도 + const isEmpty = items.every((i) => !i.t); // 빈 격자 셀 — 트랙 균일이 의도 + // 1) 트랙 폭: 숫자 라벨·빈 셀·한 축 정렬 라벨은 폭이 균일해야 한다 — 자동 배치 흩어짐(열 섞임)을 잡는다. + // 한국어 라벨은 글자수가 같아도 폭이 달라지므로, 한 축 정렬 또는 숫자 전용일 때만 검사한다(오탐 방지). + const wSpread = spread(items.map((i) => i.w)); + const alignedCol = spread(items.map((i) => i.x)) < 3; + if (hUniform && wSpread > 6 && (isDigits || isEmpty)) { // 숫자 라벨·빈 셀만 — 한국어 라벨은 내용 폭차가 자연스럽다 + issues.push(`${cls}: 폭 ${Math.round(Math.min(...items.map((i) => i.w)))}~${Math.round(Math.max(...items.map((i) => i.w)))}px 불균일 — 트랙/배치 의심`); + } + // 2) 리듬: 한 축으로 정렬된 균일 크기 형제는 등간격이어야 한다 + if (spread(items.map((i) => i.x)) < 3 && hUniform) { + const ys = items.map((i) => i.y).sort((a, b) => a - b); + const deltas = ys.slice(1).map((y, i) => y - ys[i]); + if (deltas.length >= 3 && Math.max(...deltas) > Math.min(...deltas) * 1.6 + 4) issues.push(`${cls}: 세로 간격 Δ${Math.round(Math.min(...deltas))}~${Math.round(Math.max(...deltas))}px 불균일`); + } else if (spread(items.map((i) => i.y)) < 3 && hUniform && spread(items.map((i) => i.w)) <= 4) { + const xs2 = items.map((i) => i.x).sort((a, b) => a - b); + const d2 = xs2.slice(1).map((x, i) => x - xs2[i]); + if (d2.length >= 3 && Math.max(...d2) > Math.min(...d2) * 1.6 + 4) issues.push(`${cls}: 가로 간격 불균일 Δ${Math.round(Math.min(...d2))}~${Math.round(Math.max(...d2))}px`); + } + } + return issues.slice(0, 4); + }); + rhythm.length ? fail(p.name + "/" + v + " 리듬·트랙", rhythm.join(" · ")) : pass(p.name + "/" + v + " 리듬·트랙"); + } + + // 대비 + if (CFG.checks.contrast) { + const bad = await page.evaluate((cn, cl) => { + const lum = ({ r, g, b }) => { const f = (v) => { v /= 255; return v <= 0.03928 ? v / 12.92 : ((v + 0.055) / 1.055) ** 2.4; }; return 0.2126 * f(r) + 0.7152 * f(g) + 0.0722 * f(b); }; + const rgb = (c) => { const m = c.match(/rgba?\(([\d.]+),\s*([\d.]+),\s*([\d.]+)(?:,\s*([\d.]+))?\)/); return m ? { r: +m[1], g: +m[2], b: +m[3], a: m[4] === undefined ? 1 : +m[4] } : null; }; + const blend = (t, b) => ({ r: t.r * t.a + b.r * (1 - t.a), g: t.g * t.a + b.g * (1 - t.a), b: t.b * t.a + b.b * (1 - t.a), a: 1 }); + const seen = new Set(); const out = []; + document.querySelectorAll("body *").forEach((el) => { + if (!el.offsetParent) return; + if (![...el.childNodes].some((n) => n.nodeType === 3 && n.textContent.trim())) return; + const cs = getComputedStyle(el); + const fg = rgb(cs.color); if (!fg) return; + let node = el; const stack = []; + while (node && node !== document.documentElement) { + const c = rgb(getComputedStyle(node).backgroundColor); + if (c && c.a >= 0.95) { stack.unshift(c); break; } + if (c && c.a > 0) stack.unshift(c); + node = node.parentElement; + } + let bg = { r: 255, g: 255, b: 255, a: 1 }; + for (const s of stack) bg = blend(s, bg); + const fgb = blend(fg, bg); + const l1 = lum(fgb), l2 = lum(bg); + const ratio = +(((Math.max(l1, l2) + 0.05) / (Math.min(l1, l2) + 0.05))).toFixed(2); + const size = parseFloat(cs.fontSize); const w = +cs.fontWeight || 400; + const need = size >= 24 || (size >= 18.66 && w >= 600) ? cl : cn; + if (ratio < need) { + const k = cs.color + Math.round(size); + if (!seen.has(k)) { seen.add(k); out.push(`"${el.textContent.trim().slice(0, 8)}" ${ratio}:1`); } + } + }); + return out.slice(0, 4); + }, CFG.thresholds.contrastNormal, CFG.thresholds.contrastLarge); + bad.length ? fail(`${p.name}/${v} 대비`, bad.join(",")) : pass(`${p.name}/${v} 대비 AA`); + } + } + + // ── 스케일×폭 h1 행렬 (안드로이드 글꼴 확대 재현) ── + if (CFG.checks.scaleMatrix) { + const bad = []; + for (const w of [375, 390]) { + for (const s of CFG.fontScales) { + await page.setViewport({ width: w, height: 800, isMobile: true, hasTouch: true }); + await page.goto(href, { waitUntil: "networkidle0" }); + await page.evaluate(UTILS); + await page.addStyleTag({ content: `html { font-size: ${16 * s}px !important; }` }); + const l = await page.evaluate(`__lines(${JSON.stringify(p.h1 || "h1")})`); + if (l > 1) bad.push(`${w}@${s}x:${l}줄`); + } + } + bad.length ? fail(`${p.name} 스케일×폭 h1`, bad.join(",")) : pass(`${p.name} 스케일×폭 h1`, `scales ${CFG.fontScales.join("/")}`); + // 브랜드 1줄 + await page.setViewport({ width: 390, height: 844, isMobile: true, hasTouch: true }); + await page.goto(href, { waitUntil: "networkidle0" }); + await page.evaluate(UTILS); + if (p.brand) { + // 동일 셀렉터가 여러 개(사이드바+탑바 등)면 보이는 것을 잰다 — display:none 의 rect 는 0 + const bl = await page.evaluate((sel) => { + const els = [...document.querySelectorAll(sel)]; + const el = els.find((e) => e.offsetParent !== null || getComputedStyle(e).position === "fixed") || els[0]; + return window.__lines(el); + }, p.brand); + bl === 1 ? pass(`${p.name} 브랜드 1줄`) : fail(`${p.name} 브랜드 ${bl}줄(수축 의심)`); + } + } + + // ── 터치 타깃 (모바일 — HIG 44pt·M3 48dp, WCAG 2.5.8 인라인 최소 24px. + // 실측: coarse 포인터에서 28px 버튼이 정확히 못 눌렸다는 보고로 시작된 검사. + // 기준: 컨트롤(button·input·role) 44px — 본문 흐름 속 텍스트 링크(a)·예외 선택자는 24px) ── + if (CFG.checks.tapTargets) { + await page.setViewport({ width: 390, height: 844, isMobile: true, hasTouch: true }); + await page.goto(href, { waitUntil: "networkidle0" }); + await page.evaluate(UTILS); + for (const v of p.views || ["single"]) { + await goView(v); + const bad = await page.evaluate((min, inlineMin, inlineSel) => { + const out = []; + document.querySelectorAll("button, a, input, select, textarea, [role='button'], [role='tab'], [role='link'], [role='switch'], [role='checkbox']").forEach((el) => { + const cs = getComputedStyle(el); + if (cs.display === "none" || cs.visibility === "hidden") return; + const r = el.getBoundingClientRect(); + if (r.width <= 0 || r.height <= 0) return; + const inline = cs.display === "inline" || (el.tagName === "A" && el.hasAttribute("href")) || (inlineSel || []).some((s) => el.matches(s)); + const need = inline ? inlineMin : min; + if (Math.min(r.width, r.height) < need) { + const label = el.textContent.trim().slice(0, 8) || el.getAttribute("aria-label") || el.tagName.toLowerCase(); + out.push(`"${label}" ${Math.round(r.width)}×${Math.round(r.height)}${inline ? "(인라인)" : ""}`); + } + }); + return [...new Set(out)].slice(0, 5); + }, CFG.thresholds.tapTargetMin, CFG.thresholds.inlineTargetMin, CFG.tapTargetsInline || []); + bad.length ? fail(`${p.name}/${v} 터치타깃`, bad.join(" · ")) : pass(`${p.name}/${v} 터치타깃`, `컨트롤 ≥${CFG.thresholds.tapTargetMin}px·인라인 ≥${CFG.thresholds.inlineTargetMin}px`); + } + } else skip("터치타깃", "checks.tapTargets=false"); + + // ── 왼쪽 인셋(모바일) — 오버플로 검사는 오른쪽만 본다. + // 실측 사고: 제목 16px vs 앱바·카드 24px 혼재가 모든 게이트를 통과했고 + // 사용자에게 '가장자리에 붙어 깨졌다'고 보고됐다. 텍스트 노드 Range 로 글자 시작점을 잰다 + // (전폭 컨테이너의 보더박스가 아니라. display:none 의 rect=0 은 보임 검사로 제외). ── + if (CFG.checks.leftInset) { + await page.setViewport({ width: 390, height: 844, isMobile: true, hasTouch: true }); + await page.goto(href, { waitUntil: "networkidle0" }); + for (const v of p.views || ["single"]) { + await goView(v); + const inset = await page.evaluate(() => { + let min = null; + const walk = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT); + let n; + while ((n = walk.nextNode())) { + if (!n.textContent.trim() || !n.parentElement) continue; + const cs = getComputedStyle(n.parentElement); + if (cs.display === "none" || cs.visibility === "hidden" || cs.position === "fixed") continue; + const range = document.createRange(); + range.selectNodeContents(n); + const r = range.getBoundingClientRect(); + if (r.width < 2 || r.height < 4 || r.left < 0) continue; + const l = Math.round(r.left); + if (min === null || l < min) min = l; + } + return min; + }); + inset === null + ? skip(`${p.name}/${v} 왼쪽 인셋`, "텍스트 없음") + : inset >= CFG.thresholds.leftInsetMin + ? pass(`${p.name}/${v} 왼쪽 인셋`, `최소 텍스트 시작 ${inset}px`) + : fail(`${p.name}/${v} 왼쪽 인셋`, `텍스트가 ${inset}px에서 시작 — 기준 ≥${CFG.thresholds.leftInsetMin}px(가장자리에 붙어 보인다)`); + } + } else skip("왼쪽 인셋", "checks.leftInset=false"); +} + +// ── L3 시각 회귀 (옵션: pixelmatch·pngjs 설치 시) ── +if (CFG.checks.visual) { + try { + const { default: pixelmatch } = await import("pixelmatch"); + const { PNG } = await import("pngjs"); + const BASE = path.resolve(process.cwd(), "__gate__/baseline"); + fs.mkdirSync(BASE, { recursive: true }); + let diffs = 0, n = 0; + for (const p of CFG.pages) { + for (const w of [390, 1440]) { + await page.setViewport({ width: w, height: w === 390 ? 844 : 900 }); + await page.goto(pageUrl(p), { waitUntil: "networkidle0" }); + await new Promise((r) => setTimeout(r, 250)); + const name = `${p.name}-${w}.png`; + const buf = await page.screenshot(); + const cur = PNG.sync.read(buf); + const bf = path.join(BASE, name); + if (UPDATE || !fs.existsSync(bf)) { fs.writeFileSync(bf, buf); continue; } + const base = PNG.sync.read(fs.readFileSync(bf)); + if (base.width !== cur.width || base.height !== cur.height) { diffs++; fail(`L3 시각 ${name}`, "크기 불일치"); continue; } + const cnt = pixelmatch(base.data, cur.data, null, base.width, base.height, { threshold: 0.1 }); + const pct = (cnt / (base.width * base.height)) * 100; + n++; + if (pct >= CFG.thresholds.visualDiffPct) { diffs++; fail(`L3 시각 ${name}`, pct.toFixed(3) + "% diff"); } + } + } + !diffs && pass("L3 시각 회귀", `${n}화면 ${UPDATE ? "기준갱신" : "일치"}`); + } catch (e) { skip("L3 시각 회귀", "pixelmatch/pngjs 미설치"); } +} else skip("L3 시각 회귀", "checks.visual=false"); + +await browser.close(); + +// ── L4 WebKit (옵션: playwright 설치 시) ── +if (CFG.checks.webkit) { + try { + const { webkit } = await import("playwright"); + const b2 = await webkit.launch(); + const pg = await b2.newPage(); + await pg.setViewportSize({ width: 390, height: 844 }); + let bad = 0; + for (const p of CFG.pages) { + await pg.goto(pageUrl(p), { waitUntil: "networkidle" }); + const over = await pg.evaluate(() => document.documentElement.scrollWidth - document.documentElement.clientWidth); + if (over > 0) { fail(`L4 WebKit ${p.name} 오버플로`, `+${over}px`); bad++; } + } + await b2.close(); + !bad && pass("L4 WebKit", `${CFG.pages.length}페이지 오버플로 0`); + } catch { skip("L4 WebKit", "playwright/webkit 미설치"); } +} else skip("L4 WebKit", "checks.webkit=false"); + +// ── 리포트 ── +const fails = results.filter((r) => !r.ok).length; +const lines = results.map((r) => `${r.ok ? "PASS" : "FAIL"} ${r.name}${r.detail ? " — " + r.detail : ""}`); +console.log(lines.join("\n")); +const stamp = new Date().toISOString().replace("T", " ").slice(0, 16); +fs.writeFileSync(path.resolve(process.cwd(), "gate-report.md"), + `# 게이트 리포트 — ${stamp}\n\n${fails ? `**${fails}건 실패 — 배포 금지**` : "**전 항목 통과 — 배포 가능**"}\n\n\`\`\`\n${lines.join("\n")}\n\`\`\`\n`); +console.log(`\n${fails ? `게이트 실패(${fails})` : "게이트 통과"} — gate-report.md 생성`); +process.exit(fails ? 1 : 0); diff --git a/apps/site/tools/e2e-report.md b/apps/site/tools/e2e-report.md index 2afdb52..7345786 100644 --- a/apps/site/tools/e2e-report.md +++ b/apps/site/tools/e2e-report.md @@ -1,4 +1,4 @@ -# E2E 시나리오 게이트 — 2026-08-24 05:13 +# E2E 시나리오 게이트 — 2026-08-24 17:13 단언 1805 · 통과 1805 · 실패 0 — **GREEN — 전 단언 통과** diff --git a/apps/site/tools/showcase-audit.mjs b/apps/site/tools/showcase-audit.mjs index 284c3be..10d5113 100644 --- a/apps/site/tools/showcase-audit.mjs +++ b/apps/site/tools/showcase-audit.mjs @@ -145,8 +145,10 @@ const PROBE = `() => { if (!visible(el) || !el.textContent.trim()) return; const cs = getComputedStyle(el); const lh = parseFloat(cs.lineHeight) || parseFloat(cs.fontSize) * 1.25; - const pad = parseFloat(cs.paddingTop) + parseFloat(cs.paddingBottom) + parseFloat(cs.borderTopWidth) + parseFloat(cs.borderBottomWidth); - if (el.getBoundingClientRect().height > lh * 1.6 + pad) wrapped.push(el.textContent.trim().slice(0, 26)); + const textRange = document.createRange(); + textRange.selectNodeContents(el); + const textHeight = textRange.getBoundingClientRect().height; + if (textHeight > lh * 1.6) wrapped.push(el.textContent.trim().slice(0, 26)); }); const insets = [...document.querySelectorAll('h1,h2,h3,p,li')] @@ -181,7 +183,13 @@ const browser = await puppeteer.launch({ headless: "new", // WebGL 을 쓰는 페이지가 있으므로 --disable-gpu 를 쓰지 않는다. // swiftshader 로 소프트웨어 렌더를 강제해 헤드리스에서도 캔버스가 뜬다 - args: ["--no-sandbox", "--use-angle=swiftshader", "--enable-unsafe-swiftshader", "--force-device-scale-factor=1"], + args: [ + "--no-sandbox", + "--allow-file-access-from-files", + "--use-angle=swiftshader", + "--enable-unsafe-swiftshader", + "--force-device-scale-factor=1", + ], }); let totalFail = 0; @@ -191,6 +199,7 @@ for (const slug of slugs) { for (const file of pagesOf(slug)) { const rel = path.relative(workRoot, file).replace(/\\/g, "/"); for (const width of WIDTHS) { + console.log(`RUN ${rel} @${width}`); const page = await browser.newPage(); const consoleErrors = []; page.on("pageerror", (e) => consoleErrors.push(String(e).slice(0, 120))); diff --git a/apps/site/tools/twentyoz-e2e-report.md b/apps/site/tools/twentyoz-e2e-report.md new file mode 100644 index 0000000..1ebdfe1 --- /dev/null +++ b/apps/site/tools/twentyoz-e2e-report.md @@ -0,0 +1,25 @@ +# TWENTYOZ E2E — 2026-08-24 17:13 + +**148 assertions passed · GREEN** + +- PASS responsive 320 — 13 passed +- PASS responsive 390 — 13 passed +- PASS responsive 768 — 13 passed +- PASS responsive 1440 — 13 passed +- PASS field interactions — 17 passed +- PASS content controls — 5 passed +- PASS official content — 2 passed +- PASS axe light — 3 passed +- PASS axe dark — 3 passed +- PASS fallbacks — 5 passed +- PASS WebGL — 13 passed +- PASS WebGL layout 390 — 6 passed +- PASS WebGL layout 768 — 6 passed +- PASS WebGL layout 1024 — 6 passed +- PASS WebGL layout 1440 — 6 passed +- PASS catalog 320 — 7 passed +- PASS catalog 1440 — 7 passed +- PASS catalog axe light — 1 passed +- PASS catalog axe dark — 1 passed +- PASS performance — 7 passed +- PASS runtime — 1 passed diff --git a/apps/site/tools/twentyoz-e2e.mjs b/apps/site/tools/twentyoz-e2e.mjs new file mode 100644 index 0000000..01b1290 --- /dev/null +++ b/apps/site/tools/twentyoz-e2e.mjs @@ -0,0 +1,415 @@ +// TWENTYOZ L6 — actual Chromium scenarios for the standalone showcase. +import puppeteer from "puppeteer-core"; +import { createRequire } from "node:module"; +import fs from "node:fs"; +import http from "node:http"; +import path from "node:path"; +import url from "node:url"; +import zlib from "node:zlib"; + +const require = createRequire(import.meta.url); +const here = path.dirname(url.fileURLToPath(import.meta.url)); +const root = path.resolve(here, ".."); +const publicRoot = path.join(root, "public"); +const targetRoot = path.join(publicRoot, "work", "twentyoz-corp"); +const chrome = [ + process.env.CHROME_PATH, + "C:/Program Files/Google/Chrome/Application/chrome.exe", + "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe", +].find((candidate) => candidate && fs.existsSync(candidate)); +if (!chrome) throw new Error("Chrome executable not found"); + +const MIME = new Map([ + [".html", "text/html; charset=utf-8"], + [".css", "text/css; charset=utf-8"], + [".js", "text/javascript; charset=utf-8"], + [".webp", "image/webp"], + [".png", "image/png"], + [".woff2", "font/woff2"], + [".glb", "model/gltf-binary"], + [".txt", "text/plain; charset=utf-8"], +]); + +const server = http.createServer((request, response) => { + const pathname = decodeURIComponent(new URL(request.url, "http://localhost").pathname); + const candidate = path.resolve(publicRoot, `.${pathname}`); + if (!candidate.startsWith(publicRoot + path.sep)) { + response.writeHead(403).end("forbidden"); + return; + } + const file = fs.existsSync(candidate) && fs.statSync(candidate).isDirectory() ? path.join(candidate, "index.html") : candidate; + if (!fs.existsSync(file) || !fs.statSync(file).isFile()) { + response.writeHead(404).end("not found"); + return; + } + response.setHeader("Content-Type", MIME.get(path.extname(file).toLowerCase()) || "application/octet-stream"); + response.setHeader("Cache-Control", "no-store"); + fs.createReadStream(file).pipe(response); +}); +await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve)); +const address = server.address(); +const baseUrl = `http://127.0.0.1:${address.port}/work/twentyoz-corp/index.html`; +const catalogUrl = `http://127.0.0.1:${address.port}/work/twentyoz-corp/products.html`; + +let pass = 0; +let fail = 0; +const failures = []; +const suites = new Map(); +const assert = (condition, suite, name, detail = "") => { + const current = suites.get(suite) || { pass: 0, fail: 0 }; + if (condition) { + pass += 1; + current.pass += 1; + } else { + fail += 1; + current.fail += 1; + failures.push(`${suite} · ${name}${detail ? ` — ${detail}` : ""}`); + } + suites.set(suite, current); +}; +const assertEvery = (items, predicate, suite, name, describe = (item) => JSON.stringify(item)) => { + for (const item of items) assert(predicate(item), suite, name, describe(item)); +}; +const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); + +const browser = await puppeteer.launch({ + executablePath: chrome, + headless: "new", + args: ["--no-sandbox", "--use-angle=swiftshader", "--enable-unsafe-swiftshader", "--force-device-scale-factor=1"], +}); + +const errors = []; +async function newPage() { + const page = await browser.newPage(); + page.on("pageerror", (error) => errors.push(`pageerror: ${error.message}`)); + page.on("console", (message) => { + if (message.type() === "error") { + const location = message.location(); + errors.push(`console: ${message.text()}${location.url ? ` @ ${location.url}` : ""}`); + } + }); + page.on("response", (response) => { + if (response.status() >= 400) errors.push(`response: ${response.status()} ${response.url()}`); + }); + await page.evaluateOnNewDocument(() => { + window.__twentyozPerf = { cls: 0, lcp: 0 }; + new PerformanceObserver((list) => { + for (const entry of list.getEntries()) if (!entry.hadRecentInput) window.__twentyozPerf.cls += entry.value; + }).observe({ type: "layout-shift", buffered: true }); + new PerformanceObserver((list) => { + const entries = list.getEntries(); + if (entries.length) window.__twentyozPerf.lcp = entries.at(-1).startTime; + }).observe({ type: "largest-contentful-paint", buffered: true }); + }); + return page; +} + +async function goto(page, suffix = "") { + await page.goto(baseUrl + suffix, { waitUntil: "networkidle0", timeout: 30000 }); + await page.evaluate(() => document.fonts.ready); +} + +try { + // 1. Semantic structure, progressive fallback and responsive geometry. + const page = await newPage(); + for (const width of [320, 390, 768, 1440]) { + await page.setViewport({ width, height: width < 500 ? 844 : 900, isMobile: width < 500, hasTouch: width < 500 }); + await goto(page); + const layout = await page.evaluate(() => { + const visible = (element) => { + const style = getComputedStyle(element); + const rect = element.getBoundingClientRect(); + return style.display !== "none" && style.visibility !== "hidden" && rect.width > 0 && rect.height > 0; + }; + const h1 = document.querySelector("h1"); + const lineHeight = Number.parseFloat(getComputedStyle(h1).lineHeight); + const navTops = [...document.querySelectorAll(".nav a")].map((link) => Math.round(link.getBoundingClientRect().top)); + return { + width: innerWidth, + scrollWidth: document.documentElement.scrollWidth, + h1Count: document.querySelectorAll("h1").length, + h1Lines: Math.round(h1.getBoundingClientRect().height / lineHeight), + navTopCount: new Set(navTops).size, + checked: document.querySelector('input[name="field"]:checked')?.value, + visiblePanels: [...document.querySelectorAll(".field-panel")].filter(visible).map((panel) => panel.dataset.panel), + fieldTargets: [...document.querySelectorAll(".field-tabs label")].map((label) => { + const rect = label.getBoundingClientRect(); + return { width: Math.round(rect.width), height: Math.round(rect.height) }; + }), + brokenImages: [...document.images].filter((image) => image.complete && image.naturalWidth === 0).length, + webgl: document.querySelector(".hero").dataset.webgl, + fallbackOpacity: Number.parseFloat(getComputedStyle(document.querySelector(".core-poster")).opacity), + panelWidth: Math.round(document.querySelector(".field-panels").getBoundingClientRect().width), + tabsWidth: Math.round(document.querySelector(".field-tabs").getBoundingClientRect().width), + }; + }); + const suite = `responsive ${width}`; + assert(layout.scrollWidth <= layout.width, suite, "no horizontal document overflow", `${layout.scrollWidth}/${layout.width}`); + assert(layout.h1Count === 1, suite, "one h1", String(layout.h1Count)); + assert(layout.h1Lines <= 2, suite, "hero title at most two lines", String(layout.h1Lines)); + assert(layout.navTopCount === 1, suite, "navigation remains one row", String(layout.navTopCount)); + assert(layout.checked === "edu", suite, "default field is education", String(layout.checked)); + assert(layout.visiblePanels.length === 1 && layout.visiblePanels[0] === "edu", suite, "one matching panel visible", layout.visiblePanels.join(",")); + assertEvery(layout.fieldTargets, (target) => target.height >= 44, suite, "field target height >=44", (target) => `${target.width}x${target.height}`); + assert(layout.brokenImages === 0, suite, "all images decode", String(layout.brokenImages)); + assert(layout.webgl === "fallback" && layout.fallbackOpacity === 1, suite, "automation fallback is complete", `${layout.webgl}/${layout.fallbackOpacity}`); + assert(Math.abs(layout.panelWidth - layout.tabsWidth) <= 1, suite, "field panel fills the full tab width", `${layout.panelWidth}/${layout.tabsWidth}`); + } + + // 2. All field controls: mouse and native keyboard radio behavior. + await page.setViewport({ width: 1440, height: 900 }); + await goto(page); + const fieldCases = [ + ["field-edu", "edu", "VIVEN"], + ["field-dc", "dc", "XD Hub"], + ["field-gov", "gov", "EduBill"], + ["field-plant", "plant", "ACS"], + ]; + for (const [id, value, proof] of fieldCases) { + await page.click(`label[for="${id}"]`); + const state = await page.evaluate((value) => { + const panel = document.querySelector(`[data-panel="${value}"]`); + return { + checked: document.querySelector('input[name="field"]:checked')?.value, + display: getComputedStyle(panel).display, + text: panel.textContent, + coreState: document.querySelector(".hero").dataset.coreState, + }; + }, value); + assert(state.checked === value, "field interactions", `${value} radio checked`, state.checked); + assert(state.display !== "none", "field interactions", `${value} panel visible`, state.display); + assert(state.text.includes(proof), "field interactions", `${value} proof content`, state.text.slice(0, 80)); + assert(state.coreState === value, "field interactions", `${value} core state synced`, state.coreState); + } + await page.focus("#field-edu"); + await page.keyboard.press("ArrowRight"); + assert(await page.$eval("#field-dc", (input) => input.checked), "field interactions", "arrow key changes native radio"); + + // 3. Archive disclosure and anchor navigation. + assert(!(await page.$eval("#career", (details) => details.open)), "content controls", "career starts closed"); + await page.click("#career summary"); + assert(await page.$eval("#career", (details) => details.open), "content controls", "career opens by summary"); + assert((await page.$$eval(".jobs li", (items) => items.length)) === 5, "content controls", "five closed job records remain available"); + assert((await page.$$eval(".record-list > li", (items) => items.length)) === 7, "official content", "seven current official records remain available"); + assert((await page.$$eval('.record-list a[href="https://twentyoz.kr/news/111"]', (items) => items.length)) === 1, "official content", "latest official award record links to its source"); + await page.click('.nav a[href="#ledger"]'); + await wait(120); + assert((await page.evaluate(() => location.hash)) === "#ledger", "content controls", "work anchor updates URL"); + assert((await page.evaluate(() => scrollY)) > 0, "content controls", "work anchor scrolls page"); + + // 4. Axe accessibility in light and dark fallback modes. + const axePath = require.resolve("axe-core/axe.min.js"); + for (const theme of ["light", "dark"]) { + await page.emulateMediaFeatures([{ name: "prefers-color-scheme", value: theme }]); + await goto(page); + await page.addScriptTag({ path: axePath }); + const axe = await page.evaluate(async () => axe.run(document, { resultTypes: ["violations"] })); + const axeDetail = axe.violations + .map((item) => `${item.id}: ${item.nodes.map((node) => node.target.join(" ")).join(" | ")}`) + .join("; "); + assert(axe.violations.length === 0, `axe ${theme}`, "zero WCAG violations", axeDetail); + const themeProof = await page.evaluate(() => ({ + background: getComputedStyle(document.body).backgroundColor, + poster: document.querySelector(".core-poster img").currentSrc, + })); + assert(theme === "light" ? themeProof.background === "rgb(233, 231, 226)" : themeProof.background === "rgb(13, 15, 15)", `axe ${theme}`, "theme background role applied", themeProof.background); + assert(theme === "light" ? themeProof.poster.includes("core-light.webp") : themeProof.poster.includes("core-dark.webp"), `axe ${theme}`, "matching poster selected", themeProof.poster); + } + await page.emulateMediaFeatures([]); + + // 5. Reduced motion and explicit WebGL failure stay complete. + const reducedPage = await newPage(); + await reducedPage.emulateMediaFeatures([{ name: "prefers-reduced-motion", value: "reduce" }]); + await reducedPage.setViewport({ width: 390, height: 844, isMobile: true, hasTouch: true }); + await goto(reducedPage, "?webgl=1"); + const reduced = await reducedPage.evaluate(() => ({ + webgl: document.querySelector(".hero").dataset.webgl, + reason: document.querySelector(".hero").dataset.webglReason, + canvasDisplay: getComputedStyle(document.querySelector("#coreCanvas")).display, + posterOpacity: getComputedStyle(document.querySelector(".core-poster")).opacity, + toggleHidden: document.querySelector("#motionToggle").hidden, + })); + assert(reduced.webgl === "fallback" && reduced.reason === "reduced-motion", "fallbacks", "reduced motion blocks WebGL", `${reduced.webgl}/${reduced.reason}`); + assert(reduced.canvasDisplay === "none" && reduced.posterOpacity === "1", "fallbacks", "reduced motion shows static poster", `${reduced.canvasDisplay}/${reduced.posterOpacity}`); + assert(reduced.toggleHidden, "fallbacks", "motion control hidden when no motion"); + await reducedPage.close(); + + const failedGlPage = await newPage(); + await failedGlPage.evaluateOnNewDocument(() => { + const original = HTMLCanvasElement.prototype.getContext; + HTMLCanvasElement.prototype.getContext = function getContext(type, ...args) { + if (type === "webgl2") return null; + return original.call(this, type, ...args); + }; + }); + await goto(failedGlPage, "?webgl=1"); + const noGl = await failedGlPage.evaluate(() => ({ + webgl: document.querySelector(".hero").dataset.webgl, + reason: document.querySelector(".hero").dataset.webglReason, + title: document.querySelector("h1").textContent.trim(), + poster: getComputedStyle(document.querySelector(".core-poster")).opacity, + })); + assert(noGl.webgl === "fallback" && noGl.reason === "no-webgl2", "fallbacks", "WebGL2 creation failure falls back", `${noGl.webgl}/${noGl.reason}`); + assert(noGl.title === "네 현장을 하나로" && noGl.poster === "1", "fallbacks", "DOM and poster survive WebGL failure", `${noGl.title}/${noGl.poster}`); + await failedGlPage.close(); + + // 6. Explicit real WebGL path, state sync, pause/replay, budgets and context loss. + const glPage = await newPage(); + await glPage.setViewport({ width: 390, height: 844, isMobile: true, hasTouch: true }); + await goto(glPage, "?webgl=1"); + await glPage.waitForSelector('.hero[data-webgl="ready"]', { timeout: 45000 }); + await glPage.waitForSelector('.hero[data-model="ready"]', { timeout: 45000 }); + const glReady = await glPage.evaluate(() => ({ + canvasOpacity: getComputedStyle(document.querySelector("#coreCanvas")).opacity, + posterOpacity: getComputedStyle(document.querySelector(".core-poster")).opacity, + drawCalls: Number(document.querySelector("#coreCanvas").dataset.drawCalls), + dpr: Number(document.querySelector("#coreCanvas").dataset.dpr), + toggleHidden: document.querySelector("#motionToggle").hidden, + paused: document.querySelector("#motionToggle").getAttribute("aria-pressed"), + model: document.querySelector("#coreCanvas").dataset.model, + effects: document.querySelector("#coreCanvas").dataset.effects, + glowRings: document.querySelector("#coreCanvas").dataset.glowRings, + })); + assert(glReady.canvasOpacity === "1" && glReady.posterOpacity === "0", "WebGL", "canvas replaces poster after first frame", `${glReady.canvasOpacity}/${glReady.posterOpacity}`); + assert(Number.isFinite(glReady.drawCalls) && glReady.drawCalls <= 60, "WebGL", "mobile draw calls <=60", String(glReady.drawCalls)); + assert(Number.isFinite(glReady.dpr) && glReady.dpr <= 1.35, "WebGL", "mobile DPR <=1.35", String(glReady.dpr)); + assert(!glReady.toggleHidden && glReady.paused === "true", "WebGL", "automation begins paused with control", `${glReady.toggleHidden}/${glReady.paused}`); + assert(glReady.model === "ready", "WebGL", "licensed hard-surface GLB is rendered", glReady.model); + assert(glReady.effects.includes("field-shader") && glReady.effects.includes("bloom") && glReady.effects.includes("grain"), "WebGL", "shader and post-processing stack is active", glReady.effects); + assert(glReady.glowRings === "2", "WebGL", "two depth-separated glow rings are active", glReady.glowRings); + + const coreLayoutCases = [ + { width: 390, height: 844, mobile: true, tier: "mobile", offset: 0, minRatio: 0.495, maxRatio: 0.505 }, + { width: 768, height: 900, mobile: false, tier: "tablet", offset: 0.9, minRatio: 0.72, maxRatio: 0.75 }, + { width: 1024, height: 768, mobile: false, tier: "compact", offset: 0.75, minRatio: 0.61, maxRatio: 0.64 }, + { width: 1440, height: 900, mobile: false, tier: "wide", offset: 0.72, minRatio: 0.58, maxRatio: 0.62 }, + ]; + for (const expected of coreLayoutCases) { + await glPage.setViewport({ width: expected.width, height: expected.height, isMobile: expected.mobile, hasTouch: expected.mobile }); + await glPage.waitForFunction( + (tier) => document.querySelector("#coreCanvas")?.dataset.layoutTier === tier, + { timeout: 10000 }, + expected.tier, + ); + const placement = await glPage.$eval("#coreCanvas", (canvas) => ({ + tier: canvas.dataset.layoutTier, + offset: Number(canvas.dataset.coreOffsetX), + ratio: Number(canvas.dataset.coreScreenRatio), + overflow: document.documentElement.scrollWidth - innerWidth, + actionRows: new Set( + [...document.querySelectorAll(".hero-actions > *")] + .filter((element) => getComputedStyle(element).display !== "none") + .map((element) => Math.round(element.getBoundingClientRect().top)), + ).size, + motionHeight: document.querySelector("#motionToggle").getBoundingClientRect().height, + })); + const suite = `WebGL layout ${expected.width}`; + assert(placement.tier === expected.tier, suite, "responsive layout tier is selected", placement.tier); + assert(Math.abs(placement.offset - expected.offset) <= 0.01, suite, "core offset matches composition", String(placement.offset)); + assert(placement.ratio >= expected.minRatio && placement.ratio <= expected.maxRatio, suite, "core screen position fills the hero center", String(placement.ratio)); + assert(placement.overflow <= 0, suite, "visible 3D controls create no horizontal overflow", String(placement.overflow)); + assert(placement.actionRows === 1, suite, "hero actions stay on one row", String(placement.actionRows)); + assert(placement.motionHeight >= 44, suite, "motion control keeps a 44px target", String(placement.motionHeight)); + } + + await glPage.click('label[for="field-plant"]'); + await glPage.waitForFunction(() => document.querySelector("#coreCanvas").dataset.coreState === "plant"); + assert(await glPage.$eval("#coreCanvas", (canvas) => canvas.dataset.coreState === "plant"), "WebGL", "field selection reaches 3D state"); + assert(await glPage.$eval("#coreStatus", (status) => status.textContent === "선택한 현장: 공장과 설비 현장" && status.classList.contains("sr-only")), "WebGL", "field state remains explicit for assistive technology"); + await glPage.click("#motionToggle"); + assert((await glPage.$eval("#motionToggle", (button) => button.getAttribute("aria-pressed"))) === "false", "WebGL", "motion replay control works"); + assert((await glPage.$eval("#motionToggle", (button) => button.textContent.trim())) === "3D 모션 끄기", "WebGL", "motion control names the available action"); + await wait(180); + await glPage.click("#motionToggle"); + assert((await glPage.$eval("#motionToggle", (button) => button.getAttribute("aria-pressed"))) === "true", "WebGL", "motion pause control works"); + + await glPage.evaluate(() => { + const gl = document.querySelector("#coreCanvas").getContext("webgl2"); + gl.getExtension("WEBGL_lose_context").loseContext(); + }); + await glPage.waitForFunction(() => document.querySelector(".hero").dataset.webgl === "fallback", { timeout: 5000 }); + const lost = await glPage.evaluate(() => ({ + reason: document.querySelector(".hero").dataset.webglReason, + poster: getComputedStyle(document.querySelector(".core-poster")).opacity, + hidden: document.querySelector("#motionToggle").hidden, + })); + assert(lost.reason === "context-lost" && lost.poster === "1" && lost.hidden, "WebGL", "context loss restores complete fallback", JSON.stringify(lost)); + await glPage.close(); + + // 7. Product catalog: all four detailed systems, responsive layout and accessibility. + const catalogPage = await newPage(); + for (const width of [320, 1440]) { + await catalogPage.setViewport({ width, height: width < 500 ? 844 : 900, isMobile: width < 500, hasTouch: width < 500 }); + await catalogPage.goto(catalogUrl, { waitUntil: "networkidle0", timeout: 30000 }); + await catalogPage.evaluate(() => document.fonts.ready); + const catalog = await catalogPage.evaluate(() => ({ + width: innerWidth, + scrollWidth: document.documentElement.scrollWidth, + h1: document.querySelectorAll("h1").length, + specimens: [...document.querySelectorAll(".specimen")].map((item) => item.id), + capabilities: document.querySelectorAll(".capability-list li").length, + steps: document.querySelectorAll(".operation-flow li").length, + mailto: [...document.querySelectorAll('.specimen-action a[href^="mailto:"]')].length, + text: document.body.textContent, + })); + const suite = `catalog ${width}`; + assert(catalog.scrollWidth <= catalog.width, suite, "no horizontal overflow", `${catalog.scrollWidth}/${catalog.width}`); + assert(catalog.h1 === 1, suite, "one h1", String(catalog.h1)); + assert(catalog.specimens.join(",") === "viven,edubill,xd-hub,xd-works", suite, "four product details are present", catalog.specimens.join(",")); + assert(catalog.capabilities === 16, suite, "sixteen verified capabilities", String(catalog.capabilities)); + assert(catalog.steps === 16, suite, "sixteen operating steps", String(catalog.steps)); + assert(catalog.mailto === 4, suite, "four product inquiry actions", String(catalog.mailto)); + assert(catalog.text.includes("1,000,000개") && catalog.text.includes("단일 공간 최대 100명") && catalog.text.includes("다통화 · 다과금 정책"), suite, "published product specifications remain available"); + } + for (const theme of ["light", "dark"]) { + await catalogPage.emulateMediaFeatures([{ name: "prefers-color-scheme", value: theme }]); + await catalogPage.goto(catalogUrl, { waitUntil: "networkidle0", timeout: 30000 }); + await catalogPage.addScriptTag({ path: axePath }); + const axe = await catalogPage.evaluate(async () => axe.run(document, { resultTypes: ["violations"] })); + const axeDetail = axe.violations.map((item) => `${item.id}: ${item.nodes.map((node) => node.target.join(" ")).join(" | ")}`).join("; "); + assert(axe.violations.length === 0, `catalog axe ${theme}`, "zero WCAG violations", axeDetail); + } + await catalogPage.close(); + + // 8. Runtime and transfer budgets. + await page.emulateMediaFeatures([{ name: "prefers-color-scheme", value: "light" }]); + await page.setViewport({ width: 1440, height: 900 }); + await goto(page); + await wait(900); + const perf = await page.evaluate(() => window.__twentyozPerf); + assert(perf.cls <= 0.1, "performance", "CLS <=0.1", String(perf.cls)); + assert(perf.lcp > 0 && perf.lcp <= 2500, "performance", "LCP <=2.5s", String(perf.lcp)); + + const gzip = (relative) => zlib.gzipSync(fs.readFileSync(path.join(targetRoot, relative)), { level: 9 }).byteLength; + const initialAssets = ["index.html", "styles/main.css", "styles/tokens.css", "scripts/core-boot.js", "assets/core-light.webp", "assets/pretendard-twentyoz.woff2"]; + const firstViewportBytes = initialAssets.reduce((sum, relative) => sum + fs.statSync(path.join(targetRoot, relative)).size, 0); + const coreGzip = gzip("assets/core.iife.js"); + const modelBytes = fs.statSync(path.join(targetRoot, "assets/twentyoz-field-core.glb")).size; + const bootGzip = gzip("scripts/core-boot.js"); + assert(firstViewportBytes <= 1024 * 1024, "performance", "first viewport assets <=1MB", `${firstViewportBytes}B`); + assert(coreGzip <= 200 * 1024, "performance", "WebGL bundle <=200KB gzip", `${coreGzip}B`); + assert(modelBytes <= 750 * 1024, "performance", "optimized GLB <=750KB", `${modelBytes}B`); + assert(coreGzip + modelBytes <= 1024 * 1024, "performance", "lazy 3D payload <=1MB", `${coreGzip + modelBytes}B`); + assert(bootGzip <= 35 * 1024, "performance", "hero bootstrap <=35KB gzip", `${bootGzip}B`); + + assert(errors.length === 0, "runtime", "zero console and page errors", errors.join(" | ")); + await page.close(); +} finally { + await browser.close(); + await new Promise((resolve) => server.close(resolve)); +} + +const lines = [...suites.entries()].map(([name, result]) => `${result.fail ? "FAIL" : "PASS"} ${name} — ${result.pass} passed${result.fail ? ` · ${result.fail} failed` : ""}`); +const stamp = new Date().toISOString().replace("T", " ").slice(0, 16); +fs.writeFileSync( + path.join(here, "twentyoz-e2e-report.md"), + [`# TWENTYOZ E2E — ${stamp}`, "", fail ? `**${fail} failed · deploy blocked**` : `**${pass} assertions passed · GREEN**`, "", ...lines.map((line) => `- ${line}`), ...(failures.length ? ["", "## Failures", "", ...failures.map((item) => `- ${item}`)] : [])].join("\n") + "\n", +); + +console.log(lines.join("\n")); +if (failures.length) { + console.log("\nFailures:"); + failures.forEach((failure) => console.log(`FAIL ${failure}`)); +} +console.log(`\nTWENTYOZ E2E — PASS ${pass} / FAIL ${fail}`); +process.exit(fail ? 1 : 0); diff --git a/apps/site/tools/verify-report.md b/apps/site/tools/verify-report.md index 2e12f91..436e4fe 100644 --- a/apps/site/tools/verify-report.md +++ b/apps/site/tools/verify-report.md @@ -1,16 +1,20 @@ -# 검증 리포트 — 2026-08-24 05:13 +# 검증 리포트 — 2026-08-24 17:13 -게이트: **전 계층 통과 — 배포 가능** · 총 103.0초 +게이트: **전 계층 통과 — 배포 가능** · 총 165.5초 | 계층 | 결과 | 항목 | 소요 | |---|---|---|---| -| L0-정적/stylelint | PASS | PASS — | 2.7s | -| L0-정식/html-validate | PASS | PASS — | 2.8s | -| L0-무결성/변수·경로·조판 | PASS | PASS 1 | 0.1s | -| L1-단위/계산로직 | PASS | PASS 41 | 0.0s | -| L2-기능/감사 | PASS | PASS 72 | 9.8s | -| L2-불변식/렌더 | PASS | PASS 10 | 16.7s | -| L3-시각회귀/diff | PASS | PASS 30 | 18.7s | -| L4-WebKit | PASS | PASS 8 | 3.8s | -| L5-탐색/키보드 | PASS | PASS 14 | 6.0s | -| L6-시나리오/E2E | PASS | PASS — | 42.3s | +| L0-자산/트웬티온스 3D | PASS | PASS — | 0.2s | +| L0-정적/stylelint | PASS | PASS — | 5.2s | +| L0-정식/html-validate | PASS | PASS — | 2.9s | +| L0-무결성/변수·경로·조판 | PASS | PASS — | 0.3s | +| L1-단위/계산로직 | PASS | PASS 40 | 0.1s | +| L2-기능/감사 | PASS | PASS 72 | 10.9s | +| L2-불변식/렌더 | PASS | PASS 10 | 16.9s | +| L2-디자인 게이트/메인 | PASS | PASS 130 | 33.0s | +| L2-디자인 게이트/제품 | PASS | PASS 15 | 7.0s | +| L3-시각회귀/diff | PASS | PASS 30 | 12.0s | +| L4-WebKit | PASS | PASS 8 | 4.5s | +| L5-탐색/키보드 | PASS | PASS 14 | 6.4s | +| L6-시나리오/E2E | PASS | PASS — | 43.2s | +| L6-시나리오/트웬티온스 | PASS | PASS 148 | 23.0s | diff --git a/apps/site/tools/verify.mjs b/apps/site/tools/verify.mjs index 53269de..8453f8d 100644 --- a/apps/site/tools/verify.mjs +++ b/apps/site/tools/verify.mjs @@ -11,13 +11,17 @@ const root = path.resolve(here, ".."); const npx = process.platform === "win32" ? "npx.cmd" : "npx"; const steps = [ + { + layer: "L0-자산/트웬티온스 3D", + cmd: () => spawnSync(process.execPath, ["tools/build-showcase-assets.mjs", "--check"], { cwd: root, encoding: "utf8" }), + }, { layer: "L0-정적/stylelint", cmd: () => spawnSync(npx, ["stylelint", "public/work/*/styles/*.css"], { cwd: root, encoding: "utf8", shell: true }), }, { layer: "L0-정식/html-validate", - cmd: () => spawnSync(npx, ["html-validate", "public/work/*/index.html", "public/work/*/*/index.html"], { cwd: root, encoding: "utf8", shell: true }), + cmd: () => spawnSync(npx, ["html-validate", "public/work/*/index.html", "public/work/*/*/index.html", "public/work/twentyoz-corp/products.html"], { cwd: root, encoding: "utf8", shell: true }), }, { // 미정의 CSS 변수·끊긴 상대경로·한글 조판 누락·슬롭 지문은 stylelint 도 html-validate 도 @@ -28,10 +32,13 @@ const steps = [ { layer: "L1-단위/계산로직", cmd: () => spawnSync(process.execPath, ["tools/unit/calc.test.mjs"], { cwd: root, encoding: "utf8" }) }, { layer: "L2-기능/감사", cmd: () => spawnSync(process.execPath, ["tools/audit.mjs"], { cwd: root, encoding: "utf8" }) }, { layer: "L2-불변식/렌더", cmd: () => spawnSync(process.execPath, ["tools/invariants.mjs"], { cwd: root, encoding: "utf8" }) }, + { layer: "L2-디자인 게이트/메인", cmd: () => spawnSync(process.execPath, ["tools/design-gate.mjs", "--config=gate.config.json"], { cwd: root, encoding: "utf8" }) }, + { layer: "L2-디자인 게이트/제품", cmd: () => spawnSync(process.execPath, ["tools/design-gate.mjs", "--config=gate.twentyoz-products.config.json"], { cwd: root, encoding: "utf8" }) }, { layer: "L3-시각회귀/diff", cmd: () => spawnSync(process.execPath, ["tools/visual.mjs"], { cwd: root, encoding: "utf8" }) }, { layer: "L4-WebKit", cmd: () => spawnSync(process.execPath, ["tools/webkit.mjs"], { cwd: root, encoding: "utf8" }) }, { layer: "L5-탐색/키보드", cmd: () => spawnSync(process.execPath, ["tools/exploratory.mjs"], { cwd: root, encoding: "utf8" }) }, { layer: "L6-시나리오/E2E", cmd: () => spawnSync(process.execPath, ["tools/e2e.mjs"], { cwd: root, encoding: "utf8" }) }, + { layer: "L6-시나리오/트웬티온스", cmd: () => spawnSync(process.execPath, ["tools/twentyoz-e2e.mjs"], { cwd: root, encoding: "utf8" }) }, ]; const report = []; @@ -43,8 +50,10 @@ for (const step of steps) { const ok = r.status === 0; if (!ok) failed++; const out = (r.stdout || "") + (r.stderr || ""); - const passLine = (out.match(/PASS\s+[^\n]/g) || []).length; - const failLines = (out.match(/FAIL\s+[^\n]/g) || []).length; + const summaries = [...out.matchAll(/PASS\s+(\d+)\s*\/\s*FAIL\s+(\d+)/g)]; + const summary = summaries.at(-1); + const passLine = summary ? Number(summary[1]) : (out.match(/^PASS\b/gm) || []).length; + const failLines = summary ? Number(summary[2]) : (out.match(/^FAIL\b/gm) || []).length; const tail = out.trim().split("\n").slice(-3).join(" | ").slice(0, 180); report.push({ layer: step.layer, ok, ms: Date.now() - s, passLine, failLines, tail }); console.log(`${ok ? "✓" : "✗"} ${step.layer} (${((Date.now() - s) / 1000).toFixed(1)}s)${passLine ? ` — PASS ${passLine}` : ""}${failLines ? ` FAIL ${failLines}` : ""}`); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 57fe69a..2f68b09 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,6 +30,9 @@ importers: axe-core: specifier: ^4.13.0 version: 4.13.0 + esbuild: + specifier: ^0.25.12 + version: 0.25.12 html-validate: specifier: ^10.11.3 version: 10.17.0