@volter/game-editor 0.5.65 → 0.5.66

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (544) hide show
  1. package/BUNDLED_NOTICES +1962 -363
  2. package/catalog/entries/bake.json +0 -1
  3. package/catalog/entries/blender.json +2 -2
  4. package/catalog/entries/reflections.json +2 -4
  5. package/catalog/project-source/src/lib/bake/asset-seed.ts +1 -2
  6. package/catalog/project-source/src/lib/bake/clip-layering.ts +3 -4
  7. package/catalog/project-source/src/lib/bake/gltf-bake.ts +1 -1
  8. package/catalog/project-source/src/lib/bake/params.ts +3 -5
  9. package/catalog/project-source/src/lib/bake/rest-relative-animation.ts +2 -3
  10. package/dist/.vite/manifest.json +2406 -2182
  11. package/dist/assets/{AssetBudgetPanel-J9--TZPU.js → AssetBudgetPanel-csYWK2H4.js} +8 -8
  12. package/dist/assets/{AudioViewer-CR7333fe.js → AudioViewer-BH_LUYs5.js} +1 -1
  13. package/dist/assets/{BVHLoader-6bQIXhMX.js → BVHLoader-Jkzh8hMf.js} +1 -1
  14. package/dist/assets/BufferGeometryUtils-CAbuTPOA.js +1 -0
  15. package/dist/assets/{CCDIKSolver-CD7vLpsK.js → CCDIKSolver-D4NvkJ8d.js} +1 -1
  16. package/dist/assets/{CSS3DRenderer-CL7ABLVK.js → CSS3DRenderer-CAS2WZZy.js} +1 -1
  17. package/dist/assets/CanvasSceneViewport-BlsRTk-X.js +1 -0
  18. package/dist/assets/ColladaLoader-DxYB89DA.js +3 -0
  19. package/dist/assets/{ColorInput-DQBNrW-K.js → ColorInput-CPQNsDf1.js} +1 -1
  20. package/dist/assets/{ConvexGeometry-CAzXlPVG.js → ConvexGeometry-Dinf-sev.js} +1 -1
  21. package/dist/assets/{ConvexHull-BINCESFp.js → ConvexHull-CrJ8FY-w.js} +1 -1
  22. package/dist/assets/{DecalGeometry-160KRdfg.js → DecalGeometry-owkbefLa.js} +1 -1
  23. package/dist/assets/EffectComposer-BHDH-NLz.js +1 -0
  24. package/dist/assets/EntityModelDocument-DuQivdvc.js +1 -0
  25. package/dist/assets/EnvironmentAssetDocument-CnTEMn3A.js +1 -0
  26. package/dist/assets/FBXLoader-BMUbIhtE.js +1 -0
  27. package/dist/assets/Fbo-DrK7CWlB.js +1 -0
  28. package/dist/assets/{FontLoader-CvGoVI5a.js → FontLoader-BR_K6Baw.js} +2 -2
  29. package/dist/assets/GLTFExporter-BZqAQJbw.js +1 -0
  30. package/dist/assets/{GameplaySessionTimeline-B52W3FVZ.js → GameplaySessionTimeline-Crqwv2fP.js} +1 -1
  31. package/dist/assets/Gltf-7cVbZUzT.js +2 -0
  32. package/dist/assets/ImageViewer-BkFie7Hm.js +1 -0
  33. package/dist/assets/InspectorObjectPreview-Dl3tyJBn.js +1 -0
  34. package/dist/assets/JsonAssetDocument-BUFzubHM.js +2 -0
  35. package/dist/assets/{LineSegments2-CsOpKSiM.js → LineSegments2-Cicm_Hu1.js} +2 -2
  36. package/dist/assets/LiveModuleDocument-C3OQxiba.js +1 -0
  37. package/dist/assets/LutAssetDocument-DVzd1RZ9.js +1 -0
  38. package/dist/assets/{MTLLoader-_Xzd4_0p.js → MTLLoader-Bg_grNiT.js} +2 -2
  39. package/dist/assets/{MarchingCubes-Bsp4wrzd.js → MarchingCubes-a78AL3HB.js} +1 -1
  40. package/dist/assets/MeshBVH-BCSLNEeP.js +1 -0
  41. package/dist/assets/ModelAssetDocument-pN84goRT.js +1 -0
  42. package/dist/assets/{NonThreeAuthoringBootstrap-C3woOMxX.js → NonThreeAuthoringBootstrap-BKNejRiW.js} +1 -1
  43. package/dist/assets/{OBJLoader-BhIC6Hwo.js → OBJLoader-BiwzVj5b.js} +2 -2
  44. package/dist/assets/Object3DDocumentToolbar-D5Bg5FEf.js +1 -0
  45. package/dist/assets/Object3DDocumentViewport-DFHqru3a.js +2 -0
  46. package/dist/assets/Object3DPreview-BTtZ-41z.js +2 -0
  47. package/dist/assets/OnlineAssetDetail-BAqozdAp.js +1 -0
  48. package/dist/assets/{OrbitControls-DLpayAaK.js → OrbitControls-CzKVCORl.js} +1 -1
  49. package/dist/assets/{OrbitControls-CM3bPray.js → OrbitControls-CzTRRI7x.js} +1 -1
  50. package/dist/assets/{OrthographicCamera-bQozawrh.js → OrthographicCamera-CSDDsvu7.js} +1 -1
  51. package/dist/assets/{PLYLoader-DYQqs5Ik.js → PLYLoader-QxrxxMpE.js} +2 -2
  52. package/dist/assets/{PerspectiveCamera-CQ2lh01o.js → PerspectiveCamera-DzD_NfVh.js} +1 -1
  53. package/dist/assets/PlayBar-qVJpgwJt.js +2 -0
  54. package/dist/assets/QuarksAssetDocument-B4vBlUsS.js +2 -0
  55. package/dist/assets/RGBELoader-WQ7xZofE.js +1 -0
  56. package/dist/assets/RectAreaLightUniformsLib-CwcuoVqt.js +1 -0
  57. package/dist/assets/{RenderPass-DPrn-Uky.js → RenderPass-C_CeQNdh.js} +1 -1
  58. package/dist/assets/{ResolutionPicker-C67vs1F3.js → ResolutionPicker-DpHVJxn5.js} +1 -1
  59. package/dist/assets/RootSelectionOverlay-BxvsunO4.js +1 -0
  60. package/dist/assets/{RoundedBox-BDGBg6QZ.js → RoundedBox-B_cZ0NFy.js} +1 -1
  61. package/dist/assets/{RoundedBoxGeometry-CyUuYPfW.js → RoundedBoxGeometry-Y4rcSIvX.js} +1 -1
  62. package/dist/assets/STLLoader-Bej_Nkpr.js +1 -0
  63. package/dist/assets/{SelectionBox-D_75KrNW.js → SelectionBox-Cn9vm7f9.js} +1 -1
  64. package/dist/assets/ShaderAssetDocument-Dx2x8CLr.js +12 -0
  65. package/dist/assets/{ShaderPass-QYRpPuFJ.js → ShaderPass-qtkA7CQ8.js} +1 -1
  66. package/dist/assets/{ShadowEditor-DkImwu1Y.js → ShadowEditor-BEIUkrHL.js} +1 -1
  67. package/dist/assets/SimplifyModifier-D2EesGr2.js +1 -0
  68. package/dist/assets/{SkeletonUtils-Cps8GOC6.js → SkeletonUtils-C8ayciDc.js} +1 -1
  69. package/dist/assets/{Sky-CQKCgYDs.js → Sky-BBpnAJZV.js} +1 -1
  70. package/dist/assets/SourceAssetViewer-BpMbbuy6.js +1 -0
  71. package/dist/assets/StageHost-lB8f---y.js +2 -0
  72. package/dist/assets/{StoryPreviewMount-DjyxRCXu.js → StoryPreviewMount-BIfxmkYh.js} +1 -1
  73. package/dist/assets/{TDSLoader-D_T8XJ81.js → TDSLoader-rHl5Uwc0.js} +1 -1
  74. package/dist/assets/{TextGeometry-DOWAEUV0.js → TextGeometry-BRHSufuM.js} +1 -1
  75. package/dist/assets/ThreeBoardDocument-BHV92Ia3.js +2 -0
  76. package/dist/assets/{ThreeIsolationSceneContent-C8C8whSF.js → ThreeIsolationSceneContent-BqtgDHBK.js} +1 -1
  77. package/dist/assets/{ToolObject3DPreview-BRoDWe4Q.js → ToolObject3DPreview-CcaPJTyH.js} +1 -1
  78. package/dist/assets/Toolbar-keHcSvDD.js +1 -0
  79. package/dist/assets/{TrackballControls-DfznuQTh.js → TrackballControls-Cce-6Ff5.js} +1 -1
  80. package/dist/assets/{TransientHint-BB1fwrvK.js → TransientHint-Dlslh3oX.js} +1 -1
  81. package/dist/assets/{UnrealBloomPass-CR-cS_K5.js → UnrealBloomPass-DiseEiFK.js} +2 -2
  82. package/dist/assets/{VideoViewer-C6kocgIU.js → VideoViewer-naGSXHd6.js} +1 -1
  83. package/dist/assets/ViewportShadingMenu-C7Hdhtca.js +1 -0
  84. package/dist/assets/{active-ingest-CT6jSGhr.js → active-ingest-DEgq9JiA.js} +3 -3
  85. package/dist/assets/{animation-clock-CnjZqfJp.js → animation-clock-lTIb6nk3.js} +1 -1
  86. package/dist/assets/animation-mixers.service-2O2rVwQf.js +1 -0
  87. package/dist/assets/asset-budget-asset.menu-9NhdHAC9.js +1 -0
  88. package/dist/assets/asset-budget.action-yg6-luUJ.js +1 -0
  89. package/dist/assets/asset-budget.document-B46_VFqa.js +1 -0
  90. package/dist/assets/asset-budget.menu-DuH07N-e.js +1 -0
  91. package/dist/assets/{asset-editor-persistence-BBaONOJt.js → asset-editor-persistence-BVtzjadu.js} +1 -1
  92. package/dist/assets/{asset-loaders-BOy5Ss8k.js → asset-loaders-BxG1LykH.js} +2 -2
  93. package/dist/assets/{assets-BuSoGjBX.js → assets-Do88ZdV_.js} +1 -1
  94. package/dist/assets/{audio-unlock.service-CfUgUQVy.js → audio-unlock.service-BJH0mWvX.js} +1 -1
  95. package/dist/assets/{audio.utility-C6K6jem8.js → audio.utility-Cp4aVYFU.js} +1 -1
  96. package/dist/assets/autoplay.service-FxpRy7Ev.js +1 -0
  97. package/dist/assets/{babylon-authoring-adapter-CL02gWDn.js → babylon-authoring-adapter-B_8iE8fK.js} +1 -1
  98. package/dist/assets/{binding-resolver-Dsh-6Vor.js → binding-resolver-BWwG10zJ.js} +2 -2
  99. package/dist/assets/blender-emscripten-engine-CEsWgnR7.js +2 -0
  100. package/dist/assets/{blender-node-editor.document-iIDkB9sI.js → blender-node-editor.document-DTgwy8KC.js} +1 -1
  101. package/dist/assets/blender-properties-tab-DWSJpkxq.js +3 -0
  102. package/dist/assets/blender-runtime-host-OGjPjTrG.js +4 -0
  103. package/dist/assets/{blender-runtime-skin-DyQ9B6CR.js → blender-runtime-skin-DymtXlpt.js} +37 -39
  104. package/dist/assets/blender-runtime.document-CzH2ohHR.js +8 -0
  105. package/dist/assets/{blender-timeline.document-77fx96N7.js → blender-timeline.document-BRy_QPHt.js} +1 -1
  106. package/dist/assets/{blender-uv-editor.document-fsT7B4gV.js → blender-uv-editor.document-D-AbUCqz.js} +1 -1
  107. package/dist/assets/{blender-version.status-o6dBm3n6.js → blender-version.status-B7flzX_7.js} +1 -1
  108. package/dist/assets/{blender-wali-engine-wTOcrOMC.js → blender-wali-engine-D3iKpzn9.js} +1 -1
  109. package/dist/assets/blender.command-BVHtgTQy.js +1 -0
  110. package/dist/assets/blender.environment-CG-pC7sk.js +1 -0
  111. package/dist/assets/{blender.style-Dcem5f_T.js → blender.style-CxfbTFcE.js} +1 -1
  112. package/dist/assets/{board-guides-DziKSTss.js → board-guides-C3usUZZk.js} +1 -1
  113. package/dist/assets/body-marks-D8iaje6y.js +1 -0
  114. package/dist/assets/bridge.command-BF9u6r0A.js +3 -0
  115. package/dist/assets/browserAll-38aBu-cf.js +1 -0
  116. package/dist/assets/{build-profiles.document-kW8iw8Xj.js → build-profiles.document-DO7oNRuo.js} +2 -2
  117. package/dist/assets/{build-progress.status-BNRLytg2.js → build-progress.status-COeNVhYd.js} +1 -1
  118. package/dist/assets/{build-session-C_sg3CEn.js → build-session-IWIriS5P.js} +1 -1
  119. package/dist/assets/{build.action-lYjTLb7K.js → build.action-DlkFvZf6.js} +1 -1
  120. package/dist/assets/{build.command-DIGgUPU_.js → build.command-DPqQIYj_.js} +1 -1
  121. package/dist/assets/{build.header-CKajx5U3.js → build.header-CNLG-pV8.js} +1 -1
  122. package/dist/assets/{build.menu-BdU0QXny.js → build.menu-hUlH6loi.js} +1 -1
  123. package/dist/assets/{build.service-CbBAyeu3.js → build.service-C86Td3_9.js} +1 -1
  124. package/dist/assets/{camera-KEsKvOL7.js → camera-CKbyBXMe.js} +1 -1
  125. package/dist/assets/camera-authoring-Ci3KnE-W.js +1 -0
  126. package/dist/assets/{camera-runtime.inspector-B7unX4g1.js → camera-runtime.inspector-DdR3P2BF.js} +1 -1
  127. package/dist/assets/canvas-entry-runtime-E5YjSgre.js +2 -0
  128. package/dist/assets/canvas-preview-frames-CiAx7dpV.js +1 -0
  129. package/dist/assets/{capability-coverage-Czas4C18.js → capability-coverage-CfUeULDN.js} +5 -5
  130. package/dist/assets/city-EkhAOo5s.exr +0 -0
  131. package/dist/assets/{collaboration-presence-DLoZ7EA3.js → collaboration-presence-CSLFNT7m.js} +1 -1
  132. package/dist/assets/{collider-Bw0mXlsW.js → collider-DRSaLRM9.js} +1 -1
  133. package/dist/assets/{component-board.service-DCwcUssB.js → component-board.service-B7Sv8b7m.js} +2 -2
  134. package/dist/assets/component-board.service-B8UHw8dn.js +2 -0
  135. package/dist/assets/component-contracts.service-LFGekycZ.js +1 -0
  136. package/dist/assets/{component-verbs.command-7xzfjGMZ.js → component-verbs.command-D4SvFjfG.js} +1 -1
  137. package/dist/assets/component-verbs.service-TGvWxf2b.js +1 -0
  138. package/dist/assets/{config-CEZk921y.js → config-DB_RH-hO.js} +3 -3
  139. package/dist/assets/{configurations-DTBMdaTL.js → configurations-C2qgJNnW.js} +1 -1
  140. package/dist/assets/{connection.status-BifnQdOs.js → connection.status-CG7X2brL.js} +1 -1
  141. package/dist/assets/{console-bridge-CHcb-xk5.js → console-bridge-B5Ltae37.js} +1 -1
  142. package/dist/assets/{constraint-De8f1Uiq.js → constraint-C_Jj7dXy.js} +1 -1
  143. package/dist/assets/constraints.inspector-D6QZJS4b.js +1 -0
  144. package/dist/assets/courtyard-DqlebbpC.exr +0 -0
  145. package/dist/assets/coverage.service-Clo86874.js +3 -0
  146. package/dist/assets/{create-runtime-CVCc1BDx.js → create-runtime-lmA910XT.js} +1 -1
  147. package/dist/assets/{curve-7Q79VgU4.js → curve-6-TR6dNb.js} +1 -1
  148. package/dist/assets/{data-asset-4hjS642k.js → data-asset-BNbd309U.js} +1 -1
  149. package/dist/assets/{data-ref-CQI28C0D.js → data-ref-Dvmd7eb1.js} +1 -1
  150. package/dist/assets/{debug-bridge-CCohG-d-.js → debug-bridge-BUNhgyY6.js} +1 -1
  151. package/dist/assets/{debug-registry-Dgvitx8M.js → debug-registry-B3Cnne3x.js} +1 -1
  152. package/dist/assets/deferred-ingest-play-7V8OrW3e.js +2 -0
  153. package/dist/assets/design-time-layers-g9VS6amb.js +1 -0
  154. package/dist/assets/design-time-mount.service-HtMr_vBd.js +2 -0
  155. package/dist/assets/design-time-react-mount-Dx6fJ-Hg.js +1 -0
  156. package/dist/assets/{directional-shadow-fit-BVkOKAv2.js → directional-shadow-fit-Cjz_Eg2b.js} +1 -1
  157. package/dist/assets/{document-preview-three-Kbg2GCLm.js → document-preview-three-C3y0syYQ.js} +1 -1
  158. package/dist/assets/{dom-authoring-adapter-CY8C7f4T.js → dom-authoring-adapter-CEeFyatF.js} +1 -1
  159. package/dist/assets/{draco3d-BBUTcNkz.js → draco3d-FKy0apkb.js} +1 -1
  160. package/dist/assets/drei-asset-caches-jJoHXbTj.js +2 -0
  161. package/dist/assets/{edit-mode-audio.service-Bzetwd5B.js → edit-mode-audio.service-DZTnrW6t.js} +1 -1
  162. package/dist/assets/edit-mode-authoring-D_BiHCQj.js +1 -0
  163. package/dist/assets/{edit-mode-networking.service-YCX6RRb_.js → edit-mode-networking.service-BzMI2VxO.js} +1 -1
  164. package/dist/assets/editor-api-Bzmo0o8_.js +1 -0
  165. package/dist/assets/{entry-adjudication-Cq8Yeb74.js → entry-adjudication-BYy7TXOB.js} +1 -1
  166. package/dist/assets/{events-156d8d12.esm-ErOhDXXB.js → events-156d8d12.esm-C734MYnx.js} +7 -7
  167. package/dist/assets/{extend-B-eOccUm.js → extend-CLG0ymiX.js} +1 -1
  168. package/dist/assets/forest-P_CQY3b_.exr +0 -0
  169. package/dist/assets/fork-menu-De7HU6_H.js +1 -0
  170. package/dist/assets/{frame-debugger-store-D1Mf_5up.js → frame-debugger-store-BZgIOlU6.js} +1 -1
  171. package/dist/assets/{game-DHOZVb-7.js → game-D5EJoILQ.js} +1 -1
  172. package/dist/assets/{game-contract-seams-a5YXejOu.js → game-contract-seams-TCpIMmHP.js} +1 -1
  173. package/dist/assets/{game-css-scope-transform-Eng4wS8E.js → game-css-scope-transform-NbpajQr-.js} +1 -1
  174. package/dist/assets/game-document.service-6eRlrI-d.js +1 -0
  175. package/dist/assets/game-eval.command-hKnSMlX0.js +2 -0
  176. package/dist/assets/{game-input-seams-CIQdetRw.js → game-input-seams-BC6xhZy3.js} +1 -1
  177. package/dist/assets/{game-module-access-B2mFxv-i.js → game-module-access-ry3xb1Ix.js} +1 -1
  178. package/dist/assets/{gameplay-export-BoKXm51x.js → gameplay-export-DiLQuPpn.js} +1 -1
  179. package/dist/assets/gameplay-replay-Bsre-1K8.js +1 -0
  180. package/dist/assets/{gameplay-rng-trap-CTNhm-UW.js → gameplay-rng-trap-BhRx_CtU.js} +1 -1
  181. package/dist/assets/gameplay.command-BqiyGn-I.js +1 -0
  182. package/dist/assets/{generation-jobs-BQrXbGp_.js → generation-jobs-BYcpgeGk.js} +1 -1
  183. package/dist/assets/generation.service-O81IqA-6.js +1 -0
  184. package/dist/assets/{generations-DzUogZsM.js → generations-CsGQ3twi.js} +1 -1
  185. package/dist/assets/{generations.status-CgOUBCum.js → generations.status-C3YU0_ml.js} +1 -1
  186. package/dist/assets/godot.style-DxJaFWOP.js +1 -0
  187. package/dist/assets/godot.view-BFsHk8b2.js +1 -0
  188. package/dist/assets/{hosted-asset-materialization-CiIvWkGU.js → hosted-asset-materialization-Bk-plQF6.js} +2 -2
  189. package/dist/assets/{ibl-override-material-BlmCxFKq.js → ibl-override-material-BhbGwgS1.js} +1 -1
  190. package/dist/assets/{index-mjWQmGhM.js → index-0n9eSzwT.js} +1 -1
  191. package/dist/assets/index-B4bmKkgY.css +1 -0
  192. package/dist/assets/index-BLo2LE8C.js +3404 -0
  193. package/dist/assets/index-BWW4-DBH.js +1 -0
  194. package/dist/assets/index-CLcsjKUs.js +1 -0
  195. package/dist/assets/index-CU5YUq-x.js +134 -0
  196. package/dist/assets/{index-DUpHH6JR.js → index-Cb6o_Td_.js} +1 -1
  197. package/dist/assets/index-Ckxb31Yz.js +1500 -0
  198. package/dist/assets/index-CnpsJMao.js +1 -0
  199. package/dist/assets/index-Cr23XhNm.js +1 -0
  200. package/dist/assets/index-DO1rWQ_r.js +487 -0
  201. package/dist/assets/{index-BcCBqgM_.js → index-DUh02lTr.js} +1 -1
  202. package/dist/assets/index-DXEHfb0b.js +1 -0
  203. package/dist/assets/{index-V1R-e5Bd.js → index-wRCvCebM.js} +1 -1
  204. package/dist/assets/{inference-diagnostics-Dhmtfbq_.js → inference-diagnostics-YW0yJkKx.js} +1 -1
  205. package/dist/assets/{ingest-BbYMC2vQ.js → ingest-BlQnR7s3.js} +1 -1
  206. package/dist/assets/ingest-boot-viewport-uG9jQ1zm.js +1 -0
  207. package/dist/assets/ingest-siblings-DRQXSWax.js +1 -0
  208. package/dist/assets/{ingest-source-persistence-C_6Hiyra.js → ingest-source-persistence-DH6ioCOu.js} +1 -1
  209. package/dist/assets/{ingest.service-BTDnQfM1.js → ingest.service-GeaWMaZX.js} +1 -1
  210. package/dist/assets/{input-manager-DH_hGW6d.js → input-manager-Cxx3RJgG.js} +1 -1
  211. package/dist/assets/{input-router-BNQvtIqw.js → input-router-FzxO5ld6.js} +1 -1
  212. package/dist/assets/{inspect-BZfi3mmo.js → inspect-BRgDdtVk.js} +1 -1
  213. package/dist/assets/instances.command-CFOMPSj3.js +1 -0
  214. package/dist/assets/{instruments-CKR02Y8I.js → instruments-IKn-vvNb.js} +1 -1
  215. package/dist/assets/interior-Bo_lba15.exr +0 -0
  216. package/dist/assets/{json-history-resource-BbxllWfV.js → json-history-resource-r-9q_hxP.js} +1 -1
  217. package/dist/assets/{light-D-_wsKTq.js → light-CFAor97k.js} +1 -1
  218. package/dist/assets/light-camera-factory-D1sgz3YB.js +1 -0
  219. package/dist/assets/live-mixers-BRkRHd6g.js +1 -0
  220. package/dist/assets/{loader-CaF_I7Yt.js → loader-BbMsvIxP.js} +1 -1
  221. package/dist/assets/machine.document-CgmsOh-s.js +24 -0
  222. package/dist/assets/machines.finder-nxiCgQc2.js +1 -0
  223. package/dist/assets/matcap-texture-Dh65bX5V.js +1 -0
  224. package/dist/assets/{material-CpAdjDxn.js → material-D5kXEZWQ.js} +1 -1
  225. package/dist/assets/{material-factory-Bz6h__6g.js → material-factory-0Qb0VuZ5.js} +1 -1
  226. package/dist/assets/material-preview.view-DqNcpd_b.js +1 -0
  227. package/dist/assets/{mesh-B3WPtNKO.js → mesh-BKPgNTwh.js} +1 -1
  228. package/dist/assets/{mesh-shadow-CZnXrw_l.js → mesh-shadow-BDQP4mHs.js} +1 -1
  229. package/dist/assets/model-asset-sections.service-DWPLmkqa.js +1 -0
  230. package/dist/assets/model-inspection-Cxfg_Fei.js +1 -0
  231. package/dist/assets/model.layout-BpZE1W9V.js +1 -0
  232. package/dist/assets/{models.finder-G2jQgIRu.js → models.finder-DHW17ZEa.js} +1 -1
  233. package/dist/assets/module-mode-CRfHyIMS.js +2 -0
  234. package/dist/assets/mount-canvas-ingest-root-BZZ8M3Lu.js +2 -0
  235. package/dist/assets/mount-dom-ingest-root-D1GV6Jjt.js +2 -0
  236. package/dist/assets/{mount-game-6t9cKNo4.js → mount-game-F9e76auh.js} +1 -1
  237. package/dist/assets/mount-ingest-root-B5D-Lmmk.js +2 -0
  238. package/dist/assets/{mount-manifest-CGVxhmAw.js → mount-manifest-cYRhgHfo.js} +1 -1
  239. package/dist/assets/mount-three-ingest-root-BNnouaBn.js +1 -0
  240. package/dist/assets/{mounted-authoring-Dmg5xmhP.js → mounted-authoring-TIN5EnCb.js} +1 -1
  241. package/dist/assets/{mounted-story-viewport-source-DjP6RA9U.js → mounted-story-viewport-source-CAlEmE0_.js} +1 -1
  242. package/dist/assets/{native-debug-module-CWicoSGD.js → native-debug-module-j-MekcLS.js} +1 -1
  243. package/dist/assets/{navigation-CIiCx-SM.js → navigation-DmR1BDVo.js} +1 -1
  244. package/dist/assets/{navmesh.menu-CAKiH8PW.js → navmesh.menu-FhL1pGx1.js} +1 -1
  245. package/dist/assets/{navmesh.service-jgDWlgj1.js → navmesh.service-usyDeJlm.js} +1 -1
  246. package/dist/assets/{network.utility-CEu5nHf7.js → network.utility-BPh4hTmh.js} +1 -1
  247. package/dist/assets/night-CvV4Gybt.exr +0 -0
  248. package/dist/assets/{object3d-authoring-subject-CH5sI2oP.js → object3d-authoring-subject-CyE4rQ2A.js} +1 -1
  249. package/dist/assets/oid-transform-BOqL6YH6.js +2 -0
  250. package/dist/assets/{particles-Y626p22p.js → particles-C47L-dda.js} +1 -1
  251. package/dist/assets/particles-factory-CRqPLdS7.js +1 -0
  252. package/dist/assets/pixi-authoring-adapter-C5Ikqj5-.js +1 -0
  253. package/dist/assets/{pixi-live-write-target-DuWydlWb.js → pixi-live-write-target-OWBk79dp.js} +1 -1
  254. package/dist/assets/pixi-primitive-D5igywJ_.js +1 -0
  255. package/dist/assets/pixi-react-root-factory-9lZ0Yz-n.js +1 -0
  256. package/dist/assets/play-mode-DomOvQie.js +22 -0
  257. package/dist/assets/play.command-DoqjH-Pp.js +2 -0
  258. package/dist/assets/{playtest-BXIL1JEF.js → playtest-BnFenMBW.js} +1 -1
  259. package/dist/assets/{pose-guard-6Osb2cFu.js → pose-guard-Bb3gZOzk.js} +1 -1
  260. package/dist/assets/{product-DFhyARJj.js → product-CTDJoVo5.js} +1 -1
  261. package/dist/assets/{profiler.action-CaXJDp3t.js → profiler.action-C_OFGkDw.js} +1 -1
  262. package/dist/assets/{profiler.menu-BIMF6Bi4.js → profiler.menu-BJbnVoo4.js} +1 -1
  263. package/dist/assets/{profiler.utility-BExw9wBO.js → profiler.utility-qpfhuwRw.js} +1 -1
  264. package/dist/assets/project-authoring-session-BV-MM8Fl.js +2 -0
  265. package/dist/assets/{project-provenance-BoP3nrle.js → project-provenance-4ldz-EOG.js} +1 -1
  266. package/dist/assets/{properties-bone-constraints.inspector-ByT6p7S-.js → properties-bone-constraints.inspector-C-ByIdg1.js} +1 -1
  267. package/dist/assets/{properties-bone.inspector-z4qJwKO5.js → properties-bone.inspector-CXY0xCQB.js} +1 -1
  268. package/dist/assets/{properties-collection.inspector-D0_3ijWU.js → properties-collection.inspector-DIfkZAel.js} +1 -1
  269. package/dist/assets/{properties-constraints.inspector-CESzjuls.js → properties-constraints.inspector-BaunL5nT.js} +1 -1
  270. package/dist/assets/{properties-data.inspector-hG8Wgyzb.js → properties-data.inspector-DQD-jfO2.js} +1 -1
  271. package/dist/assets/{properties-material.inspector-CzY0JCQ6.js → properties-material.inspector-A0HZ4SX6.js} +1 -1
  272. package/dist/assets/{properties-modifiers.inspector-3dDhwf7g.js → properties-modifiers.inspector-GUnVhVwZ.js} +1 -1
  273. package/dist/assets/{properties-object.inspector-CiarfxkT.js → properties-object.inspector-Chsfa4Xa.js} +1 -1
  274. package/dist/assets/{properties-output.inspector-DKJxmKSD.js → properties-output.inspector-U7ZmD0Me.js} +1 -1
  275. package/dist/assets/{properties-particles.inspector-CCEdYWGm.js → properties-particles.inspector-umkW-OlI.js} +1 -1
  276. package/dist/assets/{properties-physics.inspector-B2c0KUyA.js → properties-physics.inspector-CLVBlWwL.js} +1 -1
  277. package/dist/assets/{properties-render.inspector-Bcm0HLRW.js → properties-render.inspector-D0u9taKy.js} +1 -1
  278. package/dist/assets/{properties-scene.inspector-PIM_eTb_.js → properties-scene.inspector-JwGCZQAx.js} +1 -1
  279. package/dist/assets/{properties-texture.inspector-CgFlnyr8.js → properties-texture.inspector-B1vC28pw.js} +1 -1
  280. package/dist/assets/{properties-view-layer.inspector-DGjF_Aqo.js → properties-view-layer.inspector-BuUKyBFp.js} +1 -1
  281. package/dist/assets/{properties-world.inspector-CrMvaRvB.js → properties-world.inspector-VXUj4dT4.js} +1 -1
  282. package/dist/assets/r3f-design-session-qJ2v5SrB.js +2 -0
  283. package/dist/assets/r3f-physics-binding-C8OqNRG2.js +1 -0
  284. package/dist/assets/{r3f-root-factory-z9llD1OU.js → r3f-root-factory-DjGnbU4n.js} +1 -1
  285. package/dist/assets/r3f-source-authoring-adapter-CG9heazM.js +12 -0
  286. package/dist/assets/{rapier-physics-bridge-CMoeVo3Y.js → rapier-physics-bridge-B-EK7KYV.js} +1 -1
  287. package/dist/assets/react-inspector.service-DWeXDHJq.js +1 -0
  288. package/dist/assets/{react-root-CEz5NTck.js → react-root-DGLRLr-F.js} +1 -1
  289. package/dist/assets/react-story-board-CSqHY0Cg.js +1 -0
  290. package/dist/assets/{react-three-fiber.esm-CycrbDlA.js → react-three-fiber.esm-BxIoqVh1.js} +1 -1
  291. package/dist/assets/{react-three-rapier.esm-CEfKpvxT.js → react-three-rapier.esm-BYzLhdSV.js} +1 -1
  292. package/dist/assets/react-world-authoring-adapter-BMT9kLWU.js +1 -0
  293. package/dist/assets/{realm-services-CobQsq_X.js → realm-services-D25JHoqD.js} +1 -1
  294. package/dist/assets/{reflection-probe-Don-M3Fj.js → reflection-probe-CqXWlicu.js} +1 -1
  295. package/dist/assets/{reflection-probe-capture.inspector-CmFUoJCx.js → reflection-probe-capture.inspector-B7Qa30vB.js} +1 -1
  296. package/dist/assets/regions-DWeEBnE2.js +1 -0
  297. package/dist/assets/{register-render-vitals-BiZk29b2.js → register-render-vitals-BO7x64kR.js} +1 -1
  298. package/dist/assets/{registry-02YZjMNp.js → registry-DlTluc4x.js} +1 -1
  299. package/dist/assets/{render-audio-control-vMRlePWb.js → render-audio-control-DCa_bOBI.js} +1 -1
  300. package/dist/assets/{render-batch-system-0vq7p0VC.js → render-batch-system-CzCp9YKM.js} +1 -1
  301. package/dist/assets/{render-control-Df3yTiyr.js → render-control-BNQr1eNO.js} +1 -1
  302. package/dist/assets/{render-env-D2IV2x5k.js → render-env-emvlfeTG.js} +1 -1
  303. package/dist/assets/{render-features-CPQ_e568.js → render-features-COF7MSQ9.js} +1 -1
  304. package/dist/assets/{render-settings-Bw4W9SYF.js → render-settings-C_kIMq8Y.js} +1 -1
  305. package/dist/assets/{resolve-three-SZE_WWUM.js → resolve-three-C-nx-QdA.js} +13 -13
  306. package/dist/assets/{root-seam-contract-Z0VWX3Bk.js → root-seam-contract-C7GOxf5x.js} +1 -1
  307. package/dist/assets/{run-ticks-settled-C4ksViyA.js → run-ticks-settled-B0cTtmhQ.js} +1 -1
  308. package/dist/assets/{scene-capture-CGYF-Viw.js → scene-capture-CLOc7GXc.js} +1 -1
  309. package/dist/assets/{scene-capture-BQKzU0NT.js → scene-capture-D10Nxkvp.js} +1 -1
  310. package/dist/assets/scene-document.service-B7kAVTko.js +2 -0
  311. package/dist/assets/{scene-framing-Cat0GtyJ.js → scene-framing-50N7SKuX.js} +1 -1
  312. package/dist/assets/{scene-index-B6BZOHMk.js → scene-index-Bce459yu.js} +1 -1
  313. package/dist/assets/{scene-query-C7_N-TpI.js → scene-query-IUZhw6pA.js} +1 -1
  314. package/dist/assets/{schema-kl9-2B_J.js → schema-Iy-mbzll.js} +1 -1
  315. package/dist/assets/sculpt.layout-D-K5cLw6.js +1 -0
  316. package/dist/assets/{seeded-random-i3mtgBKZ.js → seeded-random-CN0scLZj.js} +1 -1
  317. package/dist/assets/{session-CZ5JPg-z.js → session-CsR0lApe.js} +24 -15
  318. package/dist/assets/{setup-audio-S8GQF91f.js → setup-audio-BJ18gvXZ.js} +1 -1
  319. package/dist/assets/setup-particles-B6H-GbAA.js +1 -0
  320. package/dist/assets/{setup-physics-BeZ7-LKD.js → setup-physics-GugbTT0J.js} +1 -1
  321. package/dist/assets/{setup-renderer-DVXaSGin.js → setup-renderer-wt_a-p8r.js} +20 -20
  322. package/dist/assets/shading.layout-CZZHKBer.js +1 -0
  323. package/dist/assets/{sim-clock-CLflx7kg.js → sim-clock-DEfbb_-P.js} +1 -1
  324. package/dist/assets/{soft-particle-depth-DGvfQDi1.js → soft-particle-depth-CKUS1j0Y.js} +1 -1
  325. package/dist/assets/source-object3d-authoring-adapter-CfHQLFAL.js +1 -0
  326. package/dist/assets/{source-persistence-backend-C-aR-B_Y.js → source-persistence-backend-_-JMEXxE.js} +1 -1
  327. package/dist/assets/{spark-renderer-lifecycle-ynWESJcv.js → spark-renderer-lifecycle-9mnMW3Z4.js} +1 -1
  328. package/dist/assets/{spark.module-4pXQoz5d.js → spark.module-CXth-y_a.js} +1 -1
  329. package/dist/assets/stage-keyboard-C0FdDLOQ.js +1 -0
  330. package/dist/assets/stage-overlay-set-CwhCzbOy.js +1 -0
  331. package/dist/assets/stage-presence-markers-DVMDKiB-.js +1 -0
  332. package/dist/assets/stage-transform-tools-B09Z7v0o.js +1 -0
  333. package/dist/assets/standard-viewport-dressing-GUUr6GuK.js +20 -0
  334. package/dist/assets/{state-watch.action-BOvQR2qt.js → state-watch.action-CgF8qoFC.js} +1 -1
  335. package/dist/assets/{state-watch.menu-CNLvDeeY.js → state-watch.menu-CIMncESW.js} +1 -1
  336. package/dist/assets/{state-watch.utility-Bg1tTTQU.js → state-watch.utility-zTHkUALC.js} +1 -1
  337. package/dist/assets/static-batch-advisor-DqfXWRUq.js +1 -0
  338. package/dist/assets/story-capture-COQgezzl.js +1 -0
  339. package/dist/assets/story-documents-DQ0KORmd.js +3 -0
  340. package/dist/assets/story-documents.service-DOSaqPqv.js +1 -0
  341. package/dist/assets/story-documents.service-Gb7oUkbg.js +1 -0
  342. package/dist/assets/{story-media-presence-BHzk2IV5.js → story-media-presence-nW3zJqKv.js} +1 -1
  343. package/dist/assets/story-pixi-preview-COPTEsHo.js +1 -0
  344. package/dist/assets/story-presentation-CxADj5oz.js +1 -0
  345. package/dist/assets/{story-three-preview-BHEDZzcl.js → story-three-preview-C9W__8Or.js} +2 -2
  346. package/dist/assets/{structural-ids-Dc-7rEwi.js → structural-ids-CblajJQK.js} +1 -1
  347. package/dist/assets/studio-CysTBGIb.exr +0 -0
  348. package/dist/assets/sunrise-Dj0psFrf.exr +0 -0
  349. package/dist/assets/sunset-Bw3x2Bot.exr +0 -0
  350. package/dist/assets/{surface-state-DaxyruCj.js → surface-state-BAUJu6GY.js} +1 -1
  351. package/dist/assets/{system-runner-DkOjxEBt.js → system-runner-D_DtVrer.js} +1 -1
  352. package/dist/assets/team-playtest.service--79O6xkx.js +1 -0
  353. package/dist/assets/{three-CDSueJyJ.js → three-DSsr_Lvp.js} +1 -1
  354. package/dist/assets/{three-authoring-adapter-CmSQ3Vui.js → three-authoring-adapter-Yqsank46.js} +1 -1
  355. package/dist/assets/three-authoring.service-BDos-bRt.js +2 -0
  356. package/dist/assets/{three-ingest-runtime-QzDYk6tU.js → three-ingest-runtime-DWijtqQ8.js} +1 -1
  357. package/dist/assets/{three-projection-core-BmKMZ-nf.js → three-projection-core-kubBTx0s.js} +1 -1
  358. package/dist/assets/three-story-model-BraQFA9h.js +1 -0
  359. package/dist/assets/three-viewport-presentation-BL7Uc2i6.js +1 -0
  360. package/dist/assets/{three.module-D396a9Mn.js → three.module-IFn-4i31.js} +1 -1
  361. package/dist/assets/three.quarks.esm-CRKGjKAH.js +1039 -0
  362. package/dist/assets/transform-mode-request-Cu7ewbtr.js +1 -0
  363. package/dist/assets/{transform-writer-BhBBTx33.js → transform-writer-DXxrI4t7.js} +1 -1
  364. package/dist/assets/transport.header-CeND8Vzh.js +1 -0
  365. package/dist/assets/{trigger-volume-BNK2XzPL.js → trigger-volume-BCVRS3NM.js} +1 -1
  366. package/dist/assets/{tuples-CIQ4Bn1U.js → tuples-DKDGrN1t.js} +1 -1
  367. package/dist/assets/ui-board-document-DD2CAEAo.js +2 -0
  368. package/dist/assets/unity.style-vCmLw4gI.js +1 -0
  369. package/dist/assets/unity.view-DIn2S6Do.js +1 -0
  370. package/dist/assets/unreal.style-BQn-HhOX.js +1 -0
  371. package/dist/assets/unreal.view-adNBETZK.js +1 -0
  372. package/dist/assets/user-data-CZqsJDk-.js +1 -0
  373. package/dist/assets/{utility-view-state-BHypxA33.js → utility-view-state-DYJY8V8O.js} +1 -1
  374. package/dist/assets/uv-editing.layout-A8RA-cbM.js +1 -0
  375. package/dist/assets/{vgai-shared-three-Bc5PvpLM.js → vgai-shared-three-D_RAEumG.js} +1 -1
  376. package/dist/assets/{viewport-root-presentation-CWsE56K6.js → viewport-root-presentation-C9M98VNM.js} +1 -1
  377. package/dist/assets/{viewport-shading-BuA88e_A.js → viewport-shading-BzcvgJhK.js} +1 -1
  378. package/dist/assets/viewport-shading-boundary-CBvvzS-p.js +84 -0
  379. package/dist/assets/{viewport-surface-status-B3om4Kcf.js → viewport-surface-status-BFmnWp7z.js} +1 -1
  380. package/dist/assets/voxel-surface-ROWYug7H.js +1 -0
  381. package/dist/assets/webgl-frame-capture-CRKX73E9.js +1 -0
  382. package/dist/assets/webworkerAll-CehoCtFb.js +1 -0
  383. package/dist/assets/{worker-UrMcrc5_.js → worker-B7zhIsFh.js} +2 -2
  384. package/dist/assets/world-documents-DErHq15h.js +1 -0
  385. package/dist/assets/world-root-stage-binding-BIymcQ4K.js +1 -0
  386. package/dist/assets/{world-state-BWG-IcOd.js → world-state-ZGDGY_Xl.js} +1 -1
  387. package/dist/assets/{writer-B-KovzkA.js → writer-BPbm4_my.js} +5 -5
  388. package/dist/assets/xstate-animation-binding-Cvd4JbEY.js +1 -0
  389. package/dist/assets/{xstate-animation-meta-Q3u9zh_m.js → xstate-animation-meta-B3OZR8Q2.js} +1 -1
  390. package/dist/vgai-shared-three.json +1 -1
  391. package/dist-node/cli.js +317 -73
  392. package/dist-node/create.js +59 -19
  393. package/package.json +16 -13
  394. package/src/index.ts +6 -0
  395. package/template/.agents/skills/vgai-3d-models/SKILL.md +3 -3
  396. package/template/.agents/skills/vgai-threejs-authoring/SKILL.md +4 -9
  397. package/template/.claude/skills/vgai-3d-models/SKILL.md +3 -3
  398. package/template/.claude/skills/vgai-threejs-authoring/SKILL.md +4 -9
  399. package/template/.github/skills/vgai-3d-models/SKILL.md +3 -3
  400. package/template/.github/skills/vgai-threejs-authoring/SKILL.md +4 -9
  401. package/template/AGENTS.md +1 -1
  402. package/template/check-idioms.ts +4 -5
  403. package/template/package.json +9 -9
  404. package/template/tsconfig.json +1 -0
  405. package/template/vgai.adapter.ts +1 -0
  406. package/template-dotfiles/gitignore +2 -0
  407. package/workbench/src/media/game-cover.css +1 -1
  408. package/catalog/project-source/src/lib/bake/mesh-slice.ts +0 -157
  409. package/dist/assets/BufferGeometryUtils-Nz37EVXf.js +0 -1
  410. package/dist/assets/CanvasSceneViewport-Bpi6gVTC.js +0 -1
  411. package/dist/assets/ColladaLoader-aVOPIsCh.js +0 -3
  412. package/dist/assets/EXRLoader-Cdans_oJ.js +0 -1
  413. package/dist/assets/EffectComposer-DQxfsXBZ.js +0 -1
  414. package/dist/assets/EntityModelDocument-Ccvw66N9.js +0 -1
  415. package/dist/assets/EnvironmentAssetDocument-Dg-Qq6O6.js +0 -1
  416. package/dist/assets/FBXLoader-B4MoUtAn.js +0 -1
  417. package/dist/assets/Fbo-Dz-Soul3.js +0 -1
  418. package/dist/assets/GLTFExporter-HgrCle4L.js +0 -1
  419. package/dist/assets/Gltf-UHVWKz65.js +0 -2
  420. package/dist/assets/HDRLoader-THU88oVD.js +0 -5
  421. package/dist/assets/ImageViewer-Tn7s_MnW.js +0 -1
  422. package/dist/assets/InspectorObjectPreview-CVejvLRg.js +0 -1
  423. package/dist/assets/JsonAssetDocument-C7VGcLhu.js +0 -3
  424. package/dist/assets/MeshBVH-BiDHDcu-.js +0 -1
  425. package/dist/assets/ModelAssetDocument-F5GACirk.js +0 -1
  426. package/dist/assets/Object3DDocumentViewport-DB7T0NTl.js +0 -2
  427. package/dist/assets/Object3DPreview-DL8oi7Xs.js +0 -2
  428. package/dist/assets/OnlineAssetDetail-C6z9RvYK.js +0 -2
  429. package/dist/assets/PlayBar-BR-Vg3Jb.js +0 -2
  430. package/dist/assets/RGBELoader-BgBcQv8j.js +0 -1
  431. package/dist/assets/RectAreaLightUniformsLib-CMMoWfll.js +0 -1
  432. package/dist/assets/RootSelectionOverlay-BZPlxmXU.js +0 -1
  433. package/dist/assets/STLLoader-Dyv3lsxY.js +0 -1
  434. package/dist/assets/SimplifyModifier-C8ayvRzd.js +0 -1
  435. package/dist/assets/SourceAssetViewer-2SWQoUut.js +0 -12
  436. package/dist/assets/StageHost-BN-IoTef.js +0 -2
  437. package/dist/assets/ThreeBoardDocument-CVncZyIq.js +0 -2
  438. package/dist/assets/asset-budget-asset.menu-Di3KiQCd.js +0 -1
  439. package/dist/assets/asset-budget.action-DCzzcuTh.js +0 -1
  440. package/dist/assets/asset-budget.document-BWU8wnVW.js +0 -1
  441. package/dist/assets/asset-budget.menu-BGZpT_31.js +0 -1
  442. package/dist/assets/autoplay.service-BZBGNSvt.js +0 -1
  443. package/dist/assets/blender-emscripten-engine-9ZIRYNhe.js +0 -2
  444. package/dist/assets/blender-properties-tab-C5CyPydi.js +0 -3
  445. package/dist/assets/blender-runtime-host-BpBwGv7r.js +0 -4
  446. package/dist/assets/blender-runtime.document-lIYhhPtv.js +0 -8
  447. package/dist/assets/blender.command-BtJeWk-A.js +0 -1
  448. package/dist/assets/body-marks-h_xDxiDE.js +0 -1
  449. package/dist/assets/bridge.command-o5gDNEwa.js +0 -3
  450. package/dist/assets/browserAll-DeWblVez.js +0 -1
  451. package/dist/assets/canvas-entry-runtime-SfBxaR9M.js +0 -2
  452. package/dist/assets/component-board.service-DidCyM4O.js +0 -2
  453. package/dist/assets/component-verbs.service-Bv9jId3q.js +0 -1
  454. package/dist/assets/constraints.inspector-B9U9Yj-u.js +0 -1
  455. package/dist/assets/coverage.service-VTX5Mcsx.js +0 -3
  456. package/dist/assets/deferred-ingest-play-DCJi_Pgu.js +0 -2
  457. package/dist/assets/design-time-layers-wYgOTgni.js +0 -1
  458. package/dist/assets/design-time-mount.service-BzY21e1F.js +0 -2
  459. package/dist/assets/design-time-react-mount-DM9WLrF2.js +0 -1
  460. package/dist/assets/edit-mode-authoring-B47TfLqu.js +0 -1
  461. package/dist/assets/editor-api-BoJIcyZG.js +0 -1
  462. package/dist/assets/fflate.module-DPuTF8aG.js +0 -6
  463. package/dist/assets/fork-menu-BoVyw2Wu.js +0 -1
  464. package/dist/assets/game-document.service-DbRfx2V0.js +0 -1
  465. package/dist/assets/game-eval.command-D-7Dxbj_.js +0 -2
  466. package/dist/assets/gameplay-replay-e5umMlXv.js +0 -1
  467. package/dist/assets/gameplay.command-DxcVYX6F.js +0 -1
  468. package/dist/assets/generation.service-CDIgObuw.js +0 -1
  469. package/dist/assets/index-96FBF1Oj.js +0 -1
  470. package/dist/assets/index-BAWkB0dv.js +0 -1
  471. package/dist/assets/index-BDnS2b6S.js +0 -1
  472. package/dist/assets/index-BjTCPEQ7.js +0 -134
  473. package/dist/assets/index-CVCb_ImQ.js +0 -1
  474. package/dist/assets/index-CZd9o7Lu.js +0 -1
  475. package/dist/assets/index-D2fNXpHa.css +0 -1
  476. package/dist/assets/index-GIL7oGEO.js +0 -4894
  477. package/dist/assets/index-OrYXPk3Z.js +0 -487
  478. package/dist/assets/ingest-boot-viewport-D5rI_Kk_.js +0 -1
  479. package/dist/assets/ingest-siblings-Bop2kqVl.js +0 -1
  480. package/dist/assets/instances.command-D6UkZNO8.js +0 -1
  481. package/dist/assets/light-camera-factory-CWbbe9gI.js +0 -1
  482. package/dist/assets/live-behaviors-Bxq49Maz.js +0 -1
  483. package/dist/assets/matcap-texture-CVfalpWT.js +0 -1
  484. package/dist/assets/model-asset-sections.service-CHhFS3ZX.js +0 -1
  485. package/dist/assets/model.layout-BJUEQYUI.js +0 -1
  486. package/dist/assets/module-mode-DVBLT9d-.js +0 -2
  487. package/dist/assets/mount-canvas-ingest-root-DDuAWf_C.js +0 -2
  488. package/dist/assets/mount-dom-ingest-root-D_EiBgpn.js +0 -2
  489. package/dist/assets/mount-ingest-root-glv2SSWf.js +0 -2
  490. package/dist/assets/mount-three-ingest-root-hrUt9VVU.js +0 -1
  491. package/dist/assets/particles-factory-DnLOHXT8.js +0 -1
  492. package/dist/assets/pasteboard-materialize-BqSS4QzV.js +0 -20
  493. package/dist/assets/pasteboard.action-DU3UHtJG.js +0 -2
  494. package/dist/assets/pixi-authoring-adapter-CjibysC3.js +0 -1
  495. package/dist/assets/pixi-primitive-DlWbUPN9.js +0 -1
  496. package/dist/assets/pixi-react-root-factory-DYsznYRQ.js +0 -1
  497. package/dist/assets/play-mode-BFU2PCkG.js +0 -22
  498. package/dist/assets/play.command-BpqqLqkq.js +0 -2
  499. package/dist/assets/project-authoring-session-Bnt6icLr.js +0 -2
  500. package/dist/assets/r3f-design-session-D-4yyDO9.js +0 -2
  501. package/dist/assets/r3f-physics-binding-BBo8oma9.js +0 -1
  502. package/dist/assets/r3f-source-authoring-adapter-w6Bc60K-.js +0 -13
  503. package/dist/assets/react-inspector.service-B_neRnSK.js +0 -1
  504. package/dist/assets/react-story-board-BDDwiE2H.js +0 -1
  505. package/dist/assets/react-world-authoring-adapter-DmrwM3py.js +0 -1
  506. package/dist/assets/runtime-inspection-l2iFQSsg.js +0 -1
  507. package/dist/assets/scene-document.service-qkDjUrlP.js +0 -2
  508. package/dist/assets/sculpt.layout-zJF55yCR.js +0 -1
  509. package/dist/assets/setup-particles-GCXlnkj_.js +0 -1
  510. package/dist/assets/shading.layout-DULYZV6M.js +0 -1
  511. package/dist/assets/source-object3d-authoring-adapter-B-L6Ha6f.js +0 -1
  512. package/dist/assets/stage-invalidation-DBg3C3Ta.js +0 -1
  513. package/dist/assets/stage-keyboard-n-5kKH-m.js +0 -1
  514. package/dist/assets/stage-overlay-set-B9zp2sLB.js +0 -1
  515. package/dist/assets/stage-presence-markers-DiGI6A45.js +0 -1
  516. package/dist/assets/standard-viewport-dressing-CzjAe_0A.js +0 -7
  517. package/dist/assets/static-batch-advisor-B13QEH7d.js +0 -1
  518. package/dist/assets/story-capture-_gC8dXV-.js +0 -1
  519. package/dist/assets/story-documents--TDLaPeL.js +0 -3
  520. package/dist/assets/story-documents.service-BiS_YbNQ.js +0 -1
  521. package/dist/assets/story-documents.service-CxOPYJ2j.js +0 -1
  522. package/dist/assets/story-pixi-preview-BUrOJZXS.js +0 -1
  523. package/dist/assets/story-presentation-j2AVN-mK.js +0 -1
  524. package/dist/assets/team-playtest.service-DqOinFVA.js +0 -1
  525. package/dist/assets/three-authoring.service-iuHLwtf1.js +0 -2
  526. package/dist/assets/three-viewport-presentation-QBQpSdMh.js +0 -1
  527. package/dist/assets/three.quarks.esm-B1C61jGo.js +0 -1039
  528. package/dist/assets/transport.header-B-6HQlU2.js +0 -1
  529. package/dist/assets/ui-board-document-Bwtt--xp.js +0 -2
  530. package/dist/assets/use-live-actor-state-DErbWQWF.js +0 -1
  531. package/dist/assets/user-data-BB2Of6Ht.js +0 -1
  532. package/dist/assets/uv-editing.layout-BEKHxmHw.js +0 -1
  533. package/dist/assets/viewport-shading-boundary-B_-_gABg.js +0 -82
  534. package/dist/assets/voxel-surface-DtcsSWRL.js +0 -1
  535. package/dist/assets/webgl-frame-capture-FlF9zQmW.js +0 -1
  536. package/dist/assets/webworkerAll-CM2o_dnz.js +0 -1
  537. package/dist/assets/world-documents-147tiFZe.js +0 -1
  538. package/dist/assets/world-root-stage-binding-vwTrtBz6.js +0 -1
  539. package/dist/assets/xstate-animation-binding-Brd0NST6.js +0 -1
  540. package/dist/assets/xstate-behavior.action-B8UluFBK.js +0 -1
  541. package/dist/assets/xstate-behavior.document-CKAsE45I.js +0 -1
  542. package/dist/assets/xstate-behavior.inspector-vJJyuifc.js +0 -1
  543. package/dist/assets/xstate-behavior.menu-BXbPICIh.js +0 -1
  544. package/dist/assets/xstate-inspection-BsZv8LS9.js +0 -1
@@ -1,5 +1,5 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/RectAreaLightUniformsLib-CMMoWfll.js","assets/three.module-D396a9Mn.js"])))=>i.map(i=>d[i]);
2
- import{a as ne,b as oe,L as ee}from"./LineSegments2-CsOpKSiM.js";import{aX as _t,aF as Oo,V as y,a as mt,aB as To,aY as Ht,h as Vn,aq as ae,M as At,H as le,z as Po,C as gt,j as $t,g as _n,ce as re,aC as tt,r as it,Q as ie,aQ as se,O as Ao,D as So,X as at,bU as fe,bY as ce,a0 as Eo,i as mn,R as dn,K as jn,E as ue,k as St,bH as Sn,bG as En,bE as rn,_ as Wt,q as Mt,u as fn,aj as _e,Y as me,Z as No,B as de,ao as he,aD as pe,am as Mo,bK as Qt,aT as yt,a2 as ve,bB as ge,a4 as xe,y as be,w as ye,aK as we,s as Oe,bk as Te,cF as Pe,ci as Ae,a5 as Nn,av as Ro,ae as Bn,aP as Se,a7 as Ee,as as Ne,cd as Me,b6 as Re,bS as Ie,b5 as Fe,c as ze,b as De,A as Ce,d as ke,br as $e}from"./three.module-D396a9Mn.js";import{r as O,t as z,u as A,c5 as Y,c4 as X,L as R,J as j,_ as Le,mg as Io,dp as Nt,v as L,c6 as st,ds as Fo,mh as V,c7 as Ve,mi as je}from"./index-GIL7oGEO.js";import{t as Be}from"./blender-runtime-host-BpBwGv7r.js";const Mn=new Set;function Jt(){for(const n of[...Mn])n()}function Ue(n){return Mn.add(n),()=>{Mn.delete(n)}}function Rn(n){const t=atob(n),o=new Uint8Array(t.length);for(let e=0;e<t.length;e++)o[e]=t.charCodeAt(e);return o}const Vt=R().finite(),qe=O({name:A(),parent:A().nullable(),connected:Y(),hide:Y(),length:Vt,matrix:z(j([Vt,Vt,Vt,Vt])).length(4),select:Y(),active:Y(),lockedWeight:Y()}).strict(),He=O({object:A(),displayType:X(["OCTAHEDRAL","STICK","BBONE","ENVELOPE","WIRE"]),showInFront:Y(),mode:A(),bones:z(qe)}).strict(),ft={solid:11711154,pose:5294335,poseActive:9240575,poseActiveUnsel:794150,wire:0,vertex:0,lockedWeight:16711680,lockedWeightFactor:128/255};function We(n){return new gt(n.r*n.r*.1,n.g*n.g*.1,n.b*n.b*.1)}const hn=[[0,0,0],[.1,.1,.1],[.1,.1,-.1],[-.1,.1,-.1],[-.1,.1,.1],[0,1,0]],Zn=[[2,1,0],[3,2,0],[4,3,0],[1,4,0],[5,1,2],[5,2,3],[5,3,4],[5,4,1]],dt=Math.SQRT1_2,Ge=[[dt,-dt,0],[0,-dt,-dt],[-dt,-dt,0],[0,-dt,dt],[.99388373,.11043154,0],[0,.11043154,-.99388373],[-.99388373,.11043154,0],[0,.11043154,.99388373]],Xe=[[0,1],[1,5],[5,3],[3,0],[0,4],[4,5],[5,2],[2,0],[1,2],[2,3],[3,4],[4,1]],Ye=.05;function Qn(n){return n.select||n.active?2:1}const Ze=10,Qe=4,Ke=`
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/RectAreaLightUniformsLib-CwcuoVqt.js","assets/three.module-IFn-4i31.js"])))=>i.map(i=>d[i]);
2
+ import{a as ne,b as oe,L as ee}from"./LineSegments2-Cicm_Hu1.js";import{aU as _t,aC as Oo,V as y,a as mt,ax as To,aV as Ht,h as Vn,am as ae,M as At,z as le,x as Po,v as gt,r as $t,g as _n,cg as re,ay as tt,o as it,Q as ie,aN as se,O as Ao,bA as So,a5 as at,bK as fe,b$ as ce,G as Eo,ah as mn,ab as dn,ac as jn,E as ue,a0 as St,bE as Sn,bD as En,bB as rn,bP as Wt,n as Mt,j as fn,ad as _e,ai as me,a2 as No,B as de,ak as he,aA as pe,ag as Mo,bH as Qt,aQ as yt,I as ve,bx as ge,J as xe,w as be,t as ye,aH as we,p as Oe,bh as Te,cH as Pe,cj as Ae,K as Nn,ar as Ro,a6 as Bn,aM as Se,Y as Ee,ao as Ne,cf as Me,b3 as Re,bV as Ie,b2 as Fe,c as ze,b as De,A as Ce,d as ke,bn as $e}from"./three.module-IFn-4i31.js";import{r as O,t as z,u as A,cz as Y,cy as X,O as R,L as j,_ as Le,mz as Io,ef as Nt,v as L,cA as st,ei as Fo,mA as V,cB as Ve,mB as je}from"./index-Ckxb31Yz.js";import{t as Be}from"./blender-runtime-host-OGjPjTrG.js";const Mn=new Set;function Jt(){for(const n of[...Mn])n()}function Ue(n){return Mn.add(n),()=>{Mn.delete(n)}}function Rn(n){const t=atob(n),o=new Uint8Array(t.length);for(let e=0;e<t.length;e++)o[e]=t.charCodeAt(e);return o}const Vt=R().finite(),qe=O({name:A(),parent:A().nullable(),connected:Y(),hide:Y(),length:Vt,matrix:z(j([Vt,Vt,Vt,Vt])).length(4),select:Y(),active:Y(),lockedWeight:Y()}).strict(),He=O({object:A(),displayType:X(["OCTAHEDRAL","STICK","BBONE","ENVELOPE","WIRE"]),showInFront:Y(),mode:A(),bones:z(qe)}).strict(),ft={solid:11711154,pose:5294335,poseActive:9240575,poseActiveUnsel:794150,wire:0,vertex:0,lockedWeight:16711680,lockedWeightFactor:128/255};function We(n){return new gt(n.r*n.r*.1,n.g*n.g*.1,n.b*n.b*.1)}const hn=[[0,0,0],[.1,.1,.1],[.1,.1,-.1],[-.1,.1,-.1],[-.1,.1,.1],[0,1,0]],Zn=[[2,1,0],[3,2,0],[4,3,0],[1,4,0],[5,1,2],[5,2,3],[5,3,4],[5,4,1]],dt=Math.SQRT1_2,Ge=[[dt,-dt,0],[0,-dt,-dt],[-dt,-dt,0],[0,-dt,dt],[.99388373,.11043154,0],[0,.11043154,-.99388373],[-.99388373,.11043154,0],[0,.11043154,.99388373]],Xe=[[0,1],[1,5],[5,3],[3,0],[0,4],[4,5],[5,2],[2,0],[1,2],[2,3],[3,4],[4,1]],Ye=.05;function Qn(n){return n.select||n.active?2:1}const Ze=10,Qe=4,Ke=`
3
3
  attribute vec3 aSolid;
4
4
  attribute vec3 aHint;
5
5
  varying vec3 vColor;
@@ -16,7 +16,7 @@ import{a as ne,b as oe,L as ee}from"./LineSegments2-CsOpKSiM.js";import{aX as _t
16
16
  gl_FragColor = vec4(vColor, 1.0);
17
17
  #include <colorspace_fragment>
18
18
  }
19
- `;function pt(n){return new gt().setHex(n,$t)}function Kn(n,t){const o=n.mode==="POSE";let e;return o?t.active&&t.select?e=pt(ft.poseActive):t.active?e=pt(ft.poseActiveUnsel):t.select?e=pt(ft.pose):e=pt(ft.wire):e=pt(ft.vertex),o&&t.lockedWeight&&e.lerp(pt(ft.lockedWeight),ft.lockedWeightFactor),e}function Jn(n,t){const o=pt(ft.solid);return n.mode==="POSE"&&t.lockedWeight&&o.lerp(pt(ft.lockedWeight),ft.lockedWeightFactor),o}const ta=new mt,na=new y,to=new Oo;function no(n,t){return new mt().set(...t.matrix.flat()).premultiply(n).scale(new y().setScalar(t.length))}class oa{constructor(){this.group=new _t,this.disposables=[],this.signature="",this.group.name="BlenderArmatureOverlay"}apply(t,o){const e=[],a=JSON.stringify(t);if(a===this.signature)return e;this.signature=a,this.clear();for(const i of Object.values(t)){const s=o(i.object);if(s===null)continue;i.displayType!=="OCTAHEDRAL"&&i.displayType!=="STICK"&&e.push(`armature ${i.object}: Blender's ${i.displayType} bone display needs data this door does not carry (B-Bone segment matrices, envelope radii), so its bones are drawn octahedral`),i.mode==="EDIT"&&e.push(`armature ${i.object}: in Edit Mode Blender draws the EDIT bones, and this overlay draws the pose — the shapes are the rest pose, not the edited one`);const c=i.bones.filter(f=>!f.hide);if(c.length===0)continue;const u=i.displayType==="STICK"?this.buildStick(i,c,s):this.buildOctahedral(i,c,s);i.showInFront&&u.traverse(f=>{const r=f.material;r&&"depthTest"in r&&(r.depthTest=!1),f.renderOrder=10}),this.group.add(u)}return e}buildOctahedral(t,o,e){const a=new _t;a.name=`${t.object}:bones`;const i=[],s=[],c=[],u=[],f=[],r=[],l=[],m=[],h=[],d=[];for(const _ of o){const v=no(e,_),g=Jn(t,_),p=We(g),b=Kn(t,_);to.setFromMatrix4(v).invert().transpose();for(let w=0;w<Zn.length;w++){const E=na.set(...Ge[w]).applyMatrix3(to).normalize().clone();for(const I of Zn[w]){const F=new y(...hn[I]).applyMatrix4(v);i.push(F.x,F.y,F.z),s.push(E.x,E.y,E.z),c.push(g.r,g.g,g.b),u.push(p.r,p.g,p.b)}}const T=Qn(_)===2?l:f,D=Qn(_)===2?m:r;for(const[w,E]of Xe){const I=new y(...hn[w]).applyMatrix4(v),F=new y(...hn[E]).applyMatrix4(v);T.push(I.x,I.y,I.z,F.x,F.y,F.z),D.push(b.r,b.g,b.b,b.r,b.g,b.b)}_.parent!==null&&_.connected||(h.push(v.clone()),d.push(g)),h.push(v.clone().multiply(ta.makeTranslation(0,1,0))),d.push(g)}a.add(this.solidMesh(i,s,c,u)),f.length&&a.add(this.lines(f,r,1)),l.length&&a.add(this.lines(l,m,2));for(let _=0;_<h.length;_++)a.add(this.point(h[_],d[_]));return a}buildStick(t,o,e){const a=new _t;a.name=`${t.object}:bones`;const i=[],s=[],c=[],u=[];for(const f of o){const r=no(e,f),l=new y().setFromMatrixPosition(r),m=new y(0,1,0).applyMatrix4(r),h=Kn(t,f),d=Jn(t,f);i.push(l.x,l.y,l.z,m.x,m.y,m.z),s.push(h.r,h.g,h.b,h.r,h.g,h.b),c.push(l.x,l.y,l.z,m.x,m.y,m.z),u.push(d.r,d.g,d.b,d.r,d.g,d.b)}return a.add(this.lines(i,s,Ze)),a.add(this.lines(c,u,Qe)),a}solidMesh(t,o,e,a){const i=new To;i.setAttribute("position",new Ht(t,3)),i.setAttribute("normal",new Ht(o,3)),i.setAttribute("aSolid",new Ht(e,3)),i.setAttribute("aHint",new Ht(a,3));const s=new Vn({vertexShader:Ke,fragmentShader:Je,side:ae});this.disposables.push(i,s);const c=new At(i,s);return c.frustumCulled=!1,c}lines(t,o,e){const a=new ne;a.setPositions(t),a.setColors(o);const i=new oe({linewidth:e,vertexColors:!0});this.disposables.push(a,i);const s=new ee(a,i);return s.frustumCulled=!1,s}point(t,o){const e=new le(Ye,12,8),a=new Po({color:o});this.disposables.push(e,a);const i=new At(e,a);return i.applyMatrix4(t),i.frustumCulled=!1,i}clear(){for(const t of[...this.group.children])this.group.remove(t);for(const t of this.disposables)t.dispose();this.disposables.length=0}dispose(){this.clear(),this.signature=""}}const ea="RUNTIME_FRAME_UNKNOWN_GEOMETRY",jt="RUNTIME_FRAME_UNKNOWN_IMAGE";function aa(n){const t=Math.fround,o=t(t(t(n[0]*n[0])+t(n[1]*n[1]))+t(n[2]*n[2]));if(o>1e-35){const e=t(Math.sqrt(o)),a=t(1/e);return{unit:[t(n[0]*a),t(n[1]*a),t(n[2]*a)],length:e}}return{unit:[0,0,0],length:0}}const P=Math.fround,cn=P(2*Math.PI),pn=P(1-1e-4),wt=(n,t)=>P(P(P(n[0]*t[0])+P(n[1]*t[1]))+P(n[2]*t[2])),Zt=(n,t,o=1)=>n.map((e,a)=>P(e+P(t[a]*o))),la=(n,t)=>n.map((o,e)=>P(o-t[e]));function Bt(n){const t=P(Math.sqrt(wt(n,n)));return t>0?n.map(o=>P(o/t)):[0,0,0]}function Ut(n){const t=Math.abs(n)<1?P(1-P(1-Math.abs(n))):1;let o=P(P(.077980478)+P(t*P(-.02164095)));o=P(P(-.213300989)+P(t*o)),o=P(P(1.5707963267)+P(t*o));const e=P(P(Math.sqrt(P(1-t)))*o);return n<0?P(P(Math.PI)-e):e}function ra(n){let t=n.at(-1);const o=[0,0,0];for(const e of n){for(let a=0;a<3;a++){const i=(a+1)%3,s=(a+2)%3;o[a]=P(o[a]+P(P(t[i]-e[i])*P(t[s]+e[s])))}t=e}return o}function ia(n){const t=[],o=[],e=(d,_)=>d<_?`${d}:${_}`:`${_}:${d}`,a=new Map((n.edge_order??[]).map(([d,_],v)=>[e(d,_),v])),i=new Set((n.sharp??[]).map(([d,_])=>e(d,_))),s=new Map;for(const[d,_]of n.f.entries()){const v=t.length,g=aa(ra(_.map(p=>n.v[p]))).unit;o.push(g.some(Boolean)?g:[0,0,1]);for(let p=0;p<_.length;p++){const b=e(_[p],_[(p+1)%_.length]);a.has(b)||a.set(b,a.size);const T=n.face_edges?.[d]?.[p]??a.get(b),D=t.length;t.push({vertex:_[p],face:d,edge:T,prev:v+(p+_.length-1)%_.length,next:v+(p+1)%_.length});const w=s.get(T)??[];w.push(D),s.set(T,w)}}const c=new Map,u=new Map;for(const[d,_]of s){if(_.length!==2||n.edge_sharp?.[d])continue;const[v,g]=_,p=t[v],b=t[g];!n.s?.[p.face]||!n.s?.[b.face]||p.vertex!==t[b.next].vertex||b.vertex!==t[p.next].vertex||!n.edge_sharp&&i.has(e(p.vertex,b.vertex))||(u.set(v,b.next),c.set(b.next,v),u.set(g,p.next),c.set(p.next,g))}const f=[],r=[],l=[],m=[],h=(d,_)=>Bt(la(n.v[t[t[d][_]].vertex],n.v[t[d].vertex]));for(let d=0;d<t.length;d++){if(r[d]!==void 0)continue;let _=d;const v=new Set([_]);for(;u.has(_)&&!v.has(u.get(_));)_=u.get(_),v.add(_);u.has(_)&&(_=Math.min(...v));const g=[_];for(;c.has(g.at(-1))&&c.get(g.at(-1))!==_;)g.push(c.get(g.at(-1)));let p=[0,0,0];if(g.length===1)p=o[t[_].face];else{for(const F of g)p=Zt(p,o[t[F].face],Ut(wt(h(F,"prev"),h(F,"next"))));p=Bt(p)}const b=h(_,"next"),T=g.at(-1),D=h(T,"prev"),w=wt(b,p),E=wt(D,p),I={normal:p,reference:[0,0,0],ortho:[0,0,0],alpha:0,beta:0};if(Math.abs(w)<pn&&Math.abs(E)<pn){const F=g.length>1?g.map(xt=>h(xt,"next")):[];F.length&&t[t[T].prev].edge!==t[_].edge&&F.push(D),I.alpha=F.length?P(F.reduce((xt,x)=>P(xt+Ut(wt(x,p))),0)/F.length):P(P(Ut(w)+Ut(E))/2),I.reference=Bt(Zt(b,p,-w));const k=p,U=I.reference;I.ortho=Bt([P(P(k[1]*U[2])-P(k[2]*U[1])),P(P(k[2]*U[0])-P(k[0]*U[2])),P(P(k[0]*U[1])-P(k[1]*U[0]))]);const Q=Bt(Zt(D,p,-E)),lt=wt(I.reference,Q),rt=Ut(lt);I.beta=lt<pn?wt(I.ortho,Q)<0?P(cn-rt):rt:cn}I.alpha===0&&(I.normal=[0,0,0]);for(const F of g)r[F]=f.length;f.push(g),l.push(I),m.push(p)}return{corners:t,fans:f,fanOf:r,spaces:l,faceNormals:o,fanNormals:m}}function sa(n,t){if(!t[0]||n.alpha===0||n.beta===0)return n.normal;const o=P(t[0]/32767),e=P(t[1]/32767),a=P((o>0?n.alpha:P(cn-n.alpha))*o),i=P((e>0?n.beta:P(cn-n.beta))*e);let s=n.normal.map(c=>P(c*P(Math.cos(a))));return s=Zt(s,n.reference,P(P(Math.sin(a))*P(Math.cos(i)))),e!==0&&(s=Zt(s,n.ortho,P(P(Math.sin(a))*P(Math.sin(i))))),s}function zo(n,t){if(!t)return null;const{corners:o,fans:e,spaces:a}=ia(n);if(t.type==="INT16_2D"&&t.domain==="CORNER"){const i=new Array(o.length);for(const[s,c]of e.entries()){const u=c.reduce((r,l)=>{const m=t.data[l];return[r[0]+m[0],r[1]+m[1]]},[0,0]),f=sa(a[s],u.map(r=>Math.trunc(r/c.length)));for(const r of c)i[r]=f}return i}if(t.type==="FLOAT_VECTOR")return o.map((i,s)=>{const c=t.domain==="POINT"?i.vertex:t.domain==="FACE"?i.face:s;return t.data[c]});throw new Error(`Unsupported custom_normal attribute: ${t.type}/${t.domain}`)}const vn={FLOAT:{size:1},INT:{size:1},INT8:{size:1},BOOLEAN:{size:1},FLOAT2:{size:2},FLOAT_VECTOR:{size:3},FLOAT_COLOR:{size:4},BYTE_COLOR:{size:4},INT16_2D:{size:2},INT32_2D:{size:2},QUATERNION:{size:4},FLOAT4X4:{size:16},FLOAT4:{size:4},STRING:{size:1}},fa=1e-6;function ca(n){const t=new y;for(let o=0;o<n.length;o++){const e=n[o],a=n[(o+1)%n.length];t.x+=(e.y-a.y)*(e.z+a.z),t.y+=(e.z-a.z)*(e.x+a.x),t.z+=(e.x-a.x)*(e.y+a.y)}return t.multiplyScalar(.5)}const ua=(n,t,o)=>(t.x-n.x)*(o.y-n.y)-(t.y-n.y)*(o.x-n.x),oo=n=>Array.from({length:n-2},(t,o)=>[0,o+1,o+2]);function _a(n){let t=0;for(let o=0;o<n.length;o++){const e=n[o],a=n[(o+1)%n.length];t+=e.x*a.y-a.x*e.y}return t}function eo(n,t,o){if(n.length!==t.length-2||!(Math.abs(o)>0))return!1;const e=Math.sign(o);let a=0;for(const[i,s,c]of n){const u=ua(t[i],t[s],t[c]);if(u*e<0)return!1;a+=Math.abs(u)}return Math.abs(a-Math.abs(o))<=fa*Math.abs(o)}function ma(n){const t=n.length;if(t<3)return{triangles:[],sound:!1,method:"fan"};if(t===3)return{triangles:[[0,1,2]],sound:!0,method:"fan"};const o=ca(n),e=o.length();if(!(e>0)||!Number.isFinite(e))return{triangles:oo(t),sound:!1,method:"fan"};const a=o.clone().divideScalar(e),i=Math.abs(a.x)<.9?new y(1,0,0):new y(0,1,0),s=new y().crossVectors(i,a).normalize(),c=new y().crossVectors(a,s),u=n[0],f=n.map(h=>{const d=h.clone().sub(u);return new _n(d.dot(s),d.dot(c))}),r=_a(f),l=oo(t);if(eo(l,f,r))return{triangles:l,sound:!0,method:"fan"};let m=[];try{m=re.triangulateShape(f,[]).map(h=>[h[0],h[1],h[2]])}catch{return{triangles:l,sound:!1,method:"fan"}}return eo(m,f,r)?{triangles:m,sound:!0,method:"earcut"}:{triangles:m.length>0?m:l,sound:!1,method:m.length>0?"earcut":"fan"}}const da=new Set(["FLOAT","FLOAT2","FLOAT_VECTOR","FLOAT_COLOR","BYTE_COLOR"]);function gn(n){const t=n/255;return t<.04045?t<0?0:t*(1/12.92):((t+.055)*(1/1.055))**2.4}function xn(n,t,o){switch(n){case"FLOAT":{const e=Number(t[o]);return[e,e,e,1]}case"FLOAT2":return[Number(t[o*2]),Number(t[o*2+1]),0,1];case"FLOAT_VECTOR":return[Number(t[o*3]),Number(t[o*3+1]),Number(t[o*3+2]),1];case"BYTE_COLOR":return[gn(Number(t[o*4])),gn(Number(t[o*4+1])),gn(Number(t[o*4+2])),Number(t[o*4+3])/255];default:return[Number(t[o*4]),Number(t[o*4+1]),Number(t[o*4+2]),Number(t[o*4+3])]}}function Do(n,t){return n.filter(o=>da.has(o.type)&&o.domain!=="EDGE"&&!o.name.startsWith(".")&&o.name!=="position"&&o.name!=="custom_normal"&&!(o.type==="FLOAT2"&&o.domain==="CORNER")).map(o=>{const e=t(o.data,o.type),a=[0,0,0,0];return{name:o.name,domain:o.domain,read:(i,s,c)=>o.domain==="POINT"?xn(o.type,e,i):o.domain==="CORNER"?s===void 0?a:xn(o.type,e,s):c===void 0?a:xn(o.type,e,c)}})}function Co(n){const t=n.vertexCount,o=n.starts.length-1,e=n.starts,a=n.cornerVerts,i=e[o];let s=t;for(let x=0;x<o;x++)s+=(e[x+1]-e[x]-2)*3;const c=new Uint32Array(i),u=new Uint8Array(i),f=new Uint8Array(t),r=new Uint32Array(i);let l=!1;for(let x=0;x<o;x++)if(n.smooth(x)){l=!0;break}const m=(x,$)=>t<94906265?Math.min(x,$)*t+Math.max(x,$):`${Math.min(x,$)}:${Math.max(x,$)}`,h=new Map,d=new Set;for(const[x,$]of n.sharp)d.add(m(x,$));if(n.edges)for(const[x,$]of n.edges){if(x===$)throw new Error("Runtime mesh edge needs distinct vertices");h.set(m(x,$),-1)}const _=x=>{for(;r[x]!==x;)r[x]=r[r[x]],x=r[x];return x},v=(x,$)=>{const M=_(x),H=_($);r[Math.max(M,H)]=Math.min(M,H)};for(let x=0;x<o;x++){const $=e[x],M=e[x+1]-$,H=n.smooth(x)?1:0;for(let W=0;W<M;W++){const C=$+W;f[a[C]]=1,c[C]=$+(W+1)%M,u[C]=H,r[C]=C}}for(let x=0;x<i;x++){const $=c[x],M=a[x],H=a[$],W=m(M,H),C=h.get(W);if(C!==void 0&&C>=0&&u[x]&&u[C]&&!d.has(W)){const q=c[C];v(x,a[C]===M?C:q),v($,a[C]===M?q:C)}(C===void 0||C<0||!u[C]&&u[x])&&h.set(W,x)}const g=n.uv,p=new Float32Array(s*3),b=new Float32Array(s*2),T=new Uint32Array(s),D=(n.uvLayers??[]).map(x=>({...x,data:new Float32Array(s*2)})),w=(n.attributeLayers??[]).map(x=>({...x,data:new Float32Array(s*4)})),E=n.orco?new Float32Array(s*3):null,I=new Uint32Array(s),F=new Map,k=[],U=n.normals||n.cornerNormal?new Float32Array(s*3):null;let Q=0,lt=0;const rt=(x,$,M,H,W)=>{const C=Q++;for(const q of w)q.data.set(q.read(x,H,W),C*4);if(E)for(let q=0;q<3;q++)E[C*3+q]=n.orco[x*3+q]*.5+.5;if(T[C]=x,n.co(x).toArray(p,C*3),$&&b.set($,C*2),M&&U.set(M,C*3),H!==void 0)for(const q of D)q.data.set(q.read(H),C*2);return C},xt=(x,$)=>{const M=g?.(x),H=n.cornerNormal?[n.cornerNormal[x*3],n.cornerNormal[x*3+1],n.cornerNormal[x*3+2]]:n.normals?.[x];if(!l)return rt(a[x],M,H,x,$);const W=`${u[x]?_(x):x}${M?`:${M[0]}:${M[1]}`:""}${H?`:n${H.join(":")}`:""}${D.map(q=>":"+q.read(x).join(":")).join("")}${w.map(q=>q.domain==="POINT"?"":":"+Array.from(q.read(a[x],x,$)).join(":")).join("")}`;let C=F.get(W);return C===void 0&&(C=rt(a[x],M,H,x,$),F.set(W,C)),C};for(let x=0;x<o;x++){const $=lt,M=e[x],H=e[x+1]-M,W=[];for(let Lt=0;Lt<H;Lt++)W.push(n.co(a[M+Lt]));for(const Lt of ma(W).triangles)for(const te of Lt)I[lt++]=xt(M+te,x);const C=n.material(x),q=k.at(-1);q?.materialIndex===C?q.count+=lt-$:k.push({start:$,count:lt-$,materialIndex:C})}for(let x=0;x<t;x++)f[x]||rt(x);return{positions:p.slice(0,Q*3),normals:U?.slice(0,Q*3)??null,uv:g?b.slice(0,Q*2):null,uvLayers:D.map(x=>({name:x.name,data:x.data.slice(0,Q*2)})),attributeLayers:w.map(x=>({name:x.name,data:x.data.slice(0,Q*4)})),orco:E?E.slice(0,Q*3):null,indices:I.slice(0,lt),sourceVertex:T.slice(0,Q),groups:k}}function Et(n){return`blenderA_${Array.from(new TextEncoder().encode(n),t=>t.toString(16).padStart(2,"0")).join("")}`}function In(n){const t=new To;t.setAttribute("position",new tt(n.positions,3)),t.setAttribute("uv",new tt(n.uv??new Float32Array(n.positions.length/3*2),2)),t.setIndex(new tt(n.indices,1));const o=Object.create(null);for(const[e,a]of(n.uvLayers??[]).entries()){if(e>=8)throw new Error("A Blender mesh supports at most eight UV maps");o[a.name]=e+1,t.setAttribute(`uv${e+1}`,new tt(a.data,2))}t.userData.blenderUvChannels=o;for(const e of n.attributeLayers??[])t.setAttribute(Et(e.name),new tt(e.data,4));t.userData.blenderAttributes=(n.attributeLayers??[]).map(e=>e.name),n.orco&&(t.setAttribute("blenderOrco",new tt(n.orco,3)),t.userData.blenderOrcoFromDoor=!0);for(const e of n.groups)t.addGroup(e.start,e.count,e.materialIndex);return n.normals?t.setAttribute("normal",new tt(n.normals,3)):t.computeVertexNormals(),n.sourceVertex&&t.setAttribute("blenderVertex",new tt(n.sourceVertex,1)),t}function ha(n,t){const o=n.co.length/3,e=n.attributes.filter(_=>_.type==="FLOAT2"&&_.domain==="CORNER"),a=n.renderUv??n.activeUv??e[0]?.name,i=e.find(_=>_.name===a);if(a&&!i)throw new Error(`Runtime UV map ${a} is missing`);const s=i?i.data:null,c=n.edge.length/2,u=new Array(c);for(let _=0;_<c;_++)u[_]=[n.edge[_*2],n.edge[_*2+1]];const f=[];for(let _=0;_<c;_++)n.edgeSharp[_]===1&&f.push(u[_]);const r=n.cornerNormal?void 0:n.attributes.find(_=>_.name==="custom_normal"),l=r?{v:Array.from({length:o},(_,v)=>[n.co[v*3],n.co[v*3+1],n.co[v*3+2]]),f:Array.from({length:n.faceStart.length-1},(_,v)=>Array.from(n.corner.subarray(n.faceStart[v],n.faceStart[v+1]))),s:Array.from(n.smooth,Boolean),edge_order:u,sharp:f,face_edges:Array.from({length:n.faceStart.length-1},(_,v)=>Array.from(n.cornerEdge.subarray(n.faceStart[v],n.faceStart[v+1]))),edge_sharp:Array.from(n.edgeSharp,Boolean)}:null,m=r?{type:r.type,domain:r.domain,data:Array.from({length:r.data.length/vn[r.type].size},(_,v)=>Array.from({length:vn[r.type].size},(g,p)=>Number(r.data[v*vn[r.type].size+p])))}:void 0,h=new y,d={vertexCount:o,normals:l?zo(l,m):null,cornerNormal:n.cornerNormal,orco:n.orco,co:_=>h.set(n.co[_*3],n.co[_*3+1],n.co[_*3+2]).clone(),starts:n.faceStart,cornerVerts:n.corner,smooth:_=>n.smooth[_]===1,material:_=>n.material[_],edges:u,sharp:f,uv:s?_=>[s[_*2],s[_*2+1]]:null,uvLayers:e.map(_=>({name:_.name,read:v=>[Number(_.data[v*2]),Number(_.data[v*2+1])]})),attributeLayers:Do(n.attributes,_=>_)};return{...Co(d),hash:t}}function pa(n){const t=n.v.map(l=>new y(...l)),o=l=>{const m=t[l];if(!m)throw new Error(`Runtime mesh vertex ${l} is missing`);return m},e=new Uint32Array(n.f.length+1);n.f.forEach((l,m)=>{if(l.length<3||new Set(l).size!==l.length)throw new Error("Runtime mesh face needs at least three distinct vertices");e[m+1]=e[m]+l.length});const a=new Uint32Array(e[n.f.length]);n.f.forEach((l,m)=>l.forEach((h,d)=>{o(h),a[e[m]+d]=h}));for(const[l,m]of n.edge_order??n.e??[])o(l),o(m);const i={POINT:t.length,EDGE:(n.edge_order??n.e??[]).length,FACE:n.f.length,CORNER:a.length};for(const l of n.attributes??[])if(l.domain!=="EDGE"&&l.data.length!==i[l.domain])throw new Error(`Runtime attribute ${l.name} has ${l.data.length} values for ${i[l.domain]} ${l.domain} elements`);const s=(n.attributes??[]).filter(l=>l.type==="FLOAT2"&&l.domain==="CORNER"),c=n.render_uv??n.active_uv??s[0]?.name,u=s.find(l=>l.name===c);if(c&&!u)throw new Error(`Runtime UV map ${c} is missing`);const f=u?.data,r={vertexCount:t.length,normals:zo(n,n.attributes?.find(l=>l.name==="custom_normal")),co:o,starts:e,cornerVerts:a,smooth:l=>!!n.s?.[l],material:l=>n.m?.[l]??0,edges:n.edge_order??n.e??null,sharp:n.sharp??[],uv:f?l=>f[l]:null,uvLayers:s.map(l=>({name:l.name,read:m=>l.data[m]})),attributeLayers:Do(n.attributes??[],l=>Array.from(l).flat())};return In(Co(r))}const Kt=1.5707963267948966,Ot=6.283185307179586,ko=.3183098861837067,$o=.0795774715459476,va=.3,ga=$o,xa=3/16*ko,Fn=.8,ao=Fn*Fn,Tt=6371,Lo=100,zn=Tt+Lo,lo=64,ro=64,K=256,bt=64,ba=[1.679,1.828,1.986,1.307],ya=[.006605,.01067,.01842,.03156],wa=[3472e-28,3914e-28,1349e-28,1103e-29],Oa=334.5,Ta=[28722e-28,46168e-28,79706e-28,13578e-27],Pa=[15908e-26,17711e-26,20942e-26,24033e-26],io=13681e16,Aa=2e6,Sa=.73,bn=[[53.38691773856467,22.981337506691023,0],[43.90484446636936,71.3477957000534,.10250686796574131],[1.6137278251608962,18.422960591455485,31.742921188390806],[20.762668673810577,2.361421352331437,110.4800964325214]],ct=[[3.2409698963165283,-1.5373831987380981,-.49861079454421997],[-.969243586063385,1.8759675025939941,.041555099189281464],[.05563009902834892,-.20397700369358063,1.056971549987793]],un=n=>n*n,Gt=n=>n<0?0:n>1?1:n,ut=(n,t,o)=>n+o*(t-n),Ea=n=>Math.sqrt(Math.max(n,0)),Vo=n=>[-Math.sqrt(1-n*n),0,n];function Dn(n,t,o,e,a,i,s){const c=n*e+t*a+o*i,u=n*n+t*t+o*o-s*s;if(u>0&&c>0)return-1;const f=c*c-u;return f<0?-1:f>=c*c?-c+Math.sqrt(f):-c-Math.sqrt(f)}const Na=n=>xa*(1+un(n));function Ma(n){const t=1+ao+2*Fn*n;return $o*(1-ao)/(t*Math.sqrt(t))}const Ra=n=>io*(Math.exp(-n/Sa)+Aa/io);function Un(n,t){let o=n%Ot;Math.abs(o)>=Math.PI&&(o-=Math.sign(o)*2*Math.PI);let e=t;return(o>=Kt||o<=-Kt)&&(o=Math.sign(o)*Math.PI-o,e+=Math.PI),e=e%Ot,e<0&&(e+=Ot),e=Ot-e,[o,e]}class Ia{constructor(t,o,e){this.air=t,this.aerosol=o,this.ozone=e,this.lut=new Float32Array(bt*K*4)}coefficients(t,o){const e=Ra(t)*this.aerosol,a=Math.log(Math.max(t,1e-4)),i=378547397e12*Math.exp(-un(a-3.22261)*5.55555555-a),s=Math.exp(-.07771971*t**1.16364243);for(let c=0;c<4;c++)o[c]=Ta[c]*e,o[4+c]=Pa[c]*e,o[8+c]=wa[c]*Oa*i*this.ozone,o[12+c]=ya[c]*s*this.air}transmittance(t,o,e){const[a,i,s]=Vo(t),c=ut(Tt,zn,o),f=Dn(0,0,c,a,i,s,zn)/lo,r=[0,0,0,0],l=new Float64Array(16);for(let m=0;m<lo;m++){const h=(m+.5)*f,d=a*h,_=i*h,v=c+s*h,g=Math.max(Math.hypot(d,_,v)-Tt,0);this.coefficients(g,l);for(let p=0;p<4;p++)r[p]+=(l[p]+l[4+p]+l[8+p]+l[12+p])*f}for(let m=0;m<4;m++)e[m]=Math.exp(-r[m])}precompute(){const t=new Float64Array(4);for(let o=0;o<bt;o++)for(let e=0;e<K;e++){const a=e/(K-1),i=o/(bt-1);this.transmittance(a*2-1,i,t);const s=(o*K+e)*4;for(let c=0;c<4;c++)this.lut[s+c]=t[c]}}lookup(t,o,e){const a=(K-1)*Gt(t*.5+.5),i=(bt-1)*Gt(o),s=Math.trunc(a),c=Math.trunc(i),u=Math.min(s+1,K-1),f=Math.min(c+1,bt-1),r=a-s,l=i-c,m=(c*K+s)*4,h=(c*K+u)*4,d=(f*K+s)*4,_=(f*K+u)*4;for(let v=0;v<4;v++)e[v]=ut(ut(this.lut[m+v],this.lut[h+v],r),ut(this.lut[d+v],this.lut[_+v],r),l)}lookupAtGround(t,o){const e=(K-1)*Gt(t*.5+.5),a=Math.trunc(e),i=Math.min(a+1,K-1),s=e-a;for(let c=0;c<4;c++)o[c]=ut(this.lut[a*4+c],this.lut[i*4+c],s)}lookupToSun(t,o){const e=(bt-1)*Gt(t),a=Math.trunc(e),i=Math.min(a+1,bt-1),s=e-a,c=K-1;for(let u=0;u<4;u++)o[u]=ut(this.lut[(a*K+c)*4+u],this.lut[(i*K+c)*4+u],s)}inscattering(t,o,e,a,i,s,c,u,f){const r=-(i*t[0]+s*t[1]+c*t[2]),l=Na(r),m=Ma(r),h=u/ro,d=new Float64Array(16),_=new Float64Array(4),v=new Float64Array(4),g=new Float64Array(4),p=new Float64Array(4),b=new Float64Array(4),T=[0,0,0,0],D=[1,1,1,1];for(let w=0;w<ro;w++){const E=(w+.5)*h,I=o+i*E,F=e+s*E,k=a+c*E,U=Math.hypot(I,F,k),Q=Math.max(U-Tt,0),lt=Q/Lo,rt=(I*t[0]+F*t[1]+k*t[2])/U;this.coefficients(Q,d),this.lookup(rt,lt,_);const xt=Ot*(1-Ea(1-un(Tt/U)));this.lookupAtGround(rt,g),this.lookupToSun(0,p),this.lookupToSun(lt,b);const x=1/(1+5*Math.exp(-17.92*rt)),$=[.217,.347,.594,1];for(let M=0;M<4;M++){const H=p[M]/b[M],W=ga*xt*(va*ko)*g[M]*H*rt;v[M]=.02*$[M]*x+W}for(let M=0;M<4;M++){const H=d[M]+d[4+M]+d[8+M]+d[12+M],W=ba[M]*(d[12+M]*(l*_[M]+v[M])+d[4+M]*(m*_[M]+v[M])),C=Math.exp(-h*H),q=Math.max(H,1e-7);T[M]+=D[M]*((W-W*C)/q),D[M]*=C}}for(let w=0;w<4;w++)f[w]=T[w]}}const nt=512,Dt=256;function jo(n,t){const o=new Ia(n.airDensity,n.aerosolDensity,n.ozoneDensity);o.precompute();const e=Math.min(Math.max(n.altitude,1),99999)/1e3,a=Vo(Math.cos(Kt-t)),i=new Float32Array(nt*Dt*3),s=nt/2,c=new Float64Array(4);for(let u=0;u<Dt;u++)for(let f=0;f<s;f++){const r=(f+.5)/nt,l=(u+.5)/Dt,m=Ot*r,h=l*2-1,d=Math.sign(h)*un(h)*Kt,_=Math.cos(d)*Math.cos(m),v=Math.cos(d)*Math.sin(m),g=Math.sin(d),p=Tt+e,b=Dn(0,0,p,_,v,g,zn),T=Dn(0,0,p,_,v,g,Tt),D=T<0?b:T;o.inscattering(a,0,0,p,_,v,g,D,c);let w=0,E=0,I=0;for(let U=0;U<4;U++)w+=bn[U][0]*c[U],E+=bn[U][1]*c[U],I+=bn[U][2]*c[U];const F=(u*nt+f)*3;i[F]=w,i[F+1]=E,i[F+2]=I;const k=(u*nt+(nt-f-1))*3;i[k]=w,i[k+1]=E,i[k+2]=I}return i}function Fa(n){const[t]=Un(n.sunElevation,n.sunRotation);return jo(n,t)}function qn(n){const[t]=Un(n.sunElevation,n.sunRotation);return JSON.stringify([t,n.altitude,n.airDensity,n.aerosolDensity,n.ozoneDensity])}const za=6,Ft=new Map;function Da(n){return Ft.has(qn(n))}function Bo(n,t){Ft.set(qn(n),t),Ft.size>za&&Ft.delete(Ft.keys().next().value)}function Ca(n){const[t,o]=Un(n.sunElevation,n.sunRotation),e=qn(n);let a=Ft.get(e);a===void 0&&(a=jo(n,t),Bo(n,a));const i=new y;return s=>{const c=Math.hypot(s.x,s.y),u=Math.atan2(s.z,c);let r=(Math.atan2(s.x,s.y)+Math.PI+o)/Ot;r-=Math.floor(r);const l=Math.abs(u),m=Gt(Math.sqrt(l/Kt)*Math.sign(u)*.5+.5),h=r*nt-.5,d=m*Dt-.5,_=Math.floor(h),v=Math.floor(d),g=h-_,p=d-v,b=k=>(k%nt+nt)%nt,T=k=>k<0?0:k>Dt-1?Dt-1:k,D=b(_),w=b(_+1),E=T(v),I=T(v+1),F=[0,0,0];for(let k=0;k<3;k++){const U=ut(a[(E*nt+D)*3+k],a[(E*nt+w)*3+k],g),Q=ut(a[(I*nt+D)*3+k],a[(I*nt+w)*3+k],g);F[k]=ut(U,Q,p)}return i.set(ct[0][0]*F[0]+ct[0][1]*F[1]+ct[0][2]*F[2],ct[1][0]*F[0]+ct[1][1]*F[1]+ct[1][2]*F[2],ct[2][0]*F[0]+ct[2][1]*F[1]+ct[2][2]*F[2])}}let ht=null,tn=!1,ka=0;const Xt=new Map;function $a(){if(ht||tn)return ht;if(typeof Worker>"u")return tn=!0,null;try{ht=new Worker(new URL("/assets/sky-precompute-worker-ChN7J87v.js",import.meta.url),{type:"module"})}catch{return tn=!0,null}return ht.onmessage=n=>{const{id:t,pixels:o,error:e}=n.data,a=Xt.get(t);a&&(Xt.delete(t),o?a.resolve(o):a.reject(new Error(e??"sky worker returned nothing")))},ht.onerror=n=>{const t=new Error(`sky worker failed: ${n.message||"unknown error"}`);for(const o of Xt.values())o.reject(t);Xt.clear(),ht?.terminate(),ht=null,tn=!0},ht}function La(n){const t=$a();if(!t)return Promise.resolve(Fa(n));const o=ka++,e={id:o,parameters:n};return new Promise((a,i)=>{Xt.set(o,{resolve:a,reject:i}),t.postMessage(e)})}function Va(n,t,o,e={}){switch(e.type??"LINEAR"){case"QUADRATIC":{const a=Math.max(n,0);return a*a}case"EASING":{const a=Math.min(1,Math.max(0,n));return a*a*(3-2*a)}case"DIAGONAL":return(n+t)/2;case"SPHERICAL":return Math.max(.999999-Math.hypot(n,t,o),0);case"QUADRATIC_SPHERE":{const a=Math.max(.999999-Math.hypot(n,t,o),0);return a*a}case"RADIAL":return Math.atan2(t,n)/(2*Math.PI)+.5;default:return n}}const yn=(n,t)=>t!==0?n/t:0,so=n=>Math.min(1,Math.max(-1,n)),fo=(n,t,o)=>{const e=o!==0?Math.max(o-Math.abs(n-t),0)/o:0;return Math.min(n,t)-e*e*e*o/6},Uo={ADD:(n,t)=>n+t,SUBTRACT:(n,t)=>n-t,MULTIPLY:(n,t)=>n*t,DIVIDE:yn,POWER:(n,t)=>t===0?1:n===0||n<0&&!Number.isInteger(t)?0:n**t,LOGARITHM:(n,t)=>n<=0||t<=0?0:yn(Math.log(n),Math.log(t)),SQRT:n=>Math.sqrt(Math.max(n,0)),INVERSE_SQRT:n=>n>0?1/Math.sqrt(n):0,ABSOLUTE:Math.abs,RADIANS:n=>n*Math.PI/180,DEGREES:n=>n*180/Math.PI,MINIMUM:(n,t)=>Math.min(n,t),MAXIMUM:(n,t)=>Math.max(n,t),LESS_THAN:(n,t)=>+(n<t),GREATER_THAN:(n,t)=>+(n>t),ROUND:n=>Math.floor(n+.5),FLOOR:Math.floor,CEIL:Math.ceil,FRACT:n=>n-Math.floor(n),MODULO:(n,t)=>t!==0?n%t:0,FLOORED_MODULO:(n,t)=>t!==0?n-Math.floor(n/t)*t:0,TRUNC:Math.trunc,SNAP:(n,t)=>Math.floor(yn(n,t))*t,WRAP:(n,t,o)=>t!==o?n-(t-o)*Math.floor((n-o)/(t-o)):o,PINGPONG:(n,t)=>{if(t===0)return 0;const o=(n-t)/(t*2);return Math.abs((o-Math.floor(o))*t*2-t)},SINE:Math.sin,COSINE:Math.cos,TANGENT:Math.tan,SINH:Math.sinh,COSH:Math.cosh,TANH:Math.tanh,ARCSINE:n=>Math.asin(so(n)),ARCCOSINE:n=>Math.acos(so(n)),ARCTANGENT:Math.atan,ARCTAN2:(n,t)=>n===0&&t===0?0:Math.atan2(n,t),SIGN:Math.sign,EXPONENT:Math.exp,COMPARE:(n,t,o)=>+(n===t||Math.abs(n-t)<=Math.max(o,2**-23)),MULTIPLY_ADD:(n,t,o)=>n*t+o,SMOOTH_MIN:fo,SMOOTH_MAX:(n,t,o)=>-fo(-n,-t,o)};function Z(n,t){if(typeof n=="number")return()=>n;if(Array.isArray(n)){const a=new y(...n);return()=>a}if(n.kind==="direction")return a=>a;if(n.kind==="window"){if(!t)throw new Error("World Window coordinates need a render camera");return t}if(n.kind==="gradient"){const a=Z(n.vector,t),i={type:n.gradient_type},s=new y;return c=>{const u=a(c),f=typeof u=="number"?u:u.x,r=typeof u=="number"?u:u.y,l=typeof u=="number"?u:u.z,m=it.clamp(Va(f,r,l,i),0,1);return n.output==="Fac"?m:s.setScalar(m)}}if(n.kind==="to_float"){const a=Z(n.value,t);return i=>{const s=a(i);return typeof s=="number"?s:Math.fround(n.source_type==="RGBA"?s.x*.212639+s.y*.7151687+s.z*.0721923:(s.x+s.y+s.z)/3)}}if(n.kind==="math"){const a=n.inputs.map(c=>Z(c,t)),i=Uo[n.operation],s=(c,u)=>{const f=a[c]?.(u)??0;if(typeof f!="number")throw new Error("World Math needs scalar inputs");return Math.fround(f)};return c=>{const u=Math.fround(i(s(0,c),s(1,c),s(2,c)));return n.clamp?it.clamp(u,0,1):u}}if(n.kind==="mix_color"){const a=Z(n.factor,t),i=Z(n.a,t),s=Z(n.b,t),c=new y,u=new y;return f=>{const r=a(f);if(typeof r!="number")throw new Error("World color Mix needs a scalar factor");const l=i(f);typeof l=="number"?c.setScalar(l):c.copy(l);const m=s(f);return typeof m=="number"?u.setScalar(m):u.copy(m),c.lerp(u,n.clamp_factor?it.clamp(r,0,1):r),n.clamp_result&&c.clampScalar(0,1),c}}if(n.kind==="sky"){const a=Ca({sunElevation:n.sun_elevation,sunRotation:n.sun_rotation,altitude:n.altitude,airDensity:n.air_density,aerosolDensity:n.aerosol_density,ozoneDensity:n.ozone_density});return i=>a(i)}if(n.kind==="mapping"){const a=Z(n.vector,t),i=new y(...n.location),s=new y(...n.scale),c=new ie().setFromEuler(new se(n.rotation[0],n.rotation[1],n.rotation[2],"ZYX")),u=c.clone().invert(),f=new y(...n.scale.map(l=>l===0?0:1/l)),r=new y;return l=>{const m=a(l);switch(typeof m=="number"?r.setScalar(m):r.copy(m),n.vector_type??"POINT"){case"TEXTURE":return r.sub(i).applyQuaternion(u).multiply(f);case"VECTOR":return r.multiply(s).applyQuaternion(c);case"NORMAL":return r.multiply(f).applyQuaternion(c).normalize();case"POINT":return r.multiply(s).applyQuaternion(c).add(i)}}}if(n.kind==="map_range"){const a=Z(n.value,t),i=Z(n.from_min,t),s=Z(n.from_max,t),c=Z(n.to_min,t),u=Z(n.to_max,t),f=Z(n.steps,t),r=(h,d)=>{const _=h(d);if(typeof _!="number")throw new Error("World Map Range needs scalar inputs");return _},l=n.interpolation,m=n.clamp;return h=>{const d=r(a,h),_=r(i,h),v=r(s,h),g=r(c,h),p=r(u,h);if(_===v)return 0;let b;if(l==="STEPPED"){const D=r(f,h),w=(d-_)/(v-_);b=D>0?Math.floor(w*(D+1))/D:0}else if(l==="SMOOTHSTEP"||l==="SMOOTHERSTEP"){const D=it.clamp((d-Math.min(_,v))/(Math.max(_,v)-Math.min(_,v)),0,1),w=l==="SMOOTHSTEP"?D*D*(3-2*D):D*D*D*(D*(D*6-15)+10);b=_>v?1-w:w}else b=(d-_)/(v-_);const T=g+b*(p-g);return m?g>p?it.clamp(T,p,g):it.clamp(T,g,p):T}}if(n.kind==="separate"){const a=Z(n.vector,t);return i=>{const s=a(i);return typeof s=="number"?s:s.getComponent(n.axis)}}const o=Z(n.factor,t),e=new y;return a=>{const i=o(a);if(typeof i!="number")throw new Error("World ColorRamp needs a scalar factor");const s=it.clamp(i,0,1)*256,c=Math.floor(s),u=n.colors[c],f=n.colors[Math.min(c+1,256)],r=n.interpolate?s-c:0;return e.set(it.lerp(u[0],f[0],r),it.lerp(u[1],f[1],r),it.lerp(u[2],f[2],r))}}function ja(n,t,o,e){const a=new Float32Array(t*o*3),i=Z(n,e),s=new y;for(let c=0;c<o;c++){const u=((c+.5)/o-.5)*Math.PI;for(let f=0;f<t;f++){const r=((f+.5)/t-.5)*2*Math.PI;s.set(Math.cos(u)*Math.cos(r),-Math.cos(u)*Math.sin(r),Math.sin(u));const l=i(s),m=(c*t+f)*3;a[m]=typeof l=="number"?l:l.x,a[m+1]=typeof l=="number"?l:l.y,a[m+2]=typeof l=="number"?l:l.z}}return a}function co(n){const t=[],o=e=>{if(!(typeof e=="number"||Array.isArray(e)))switch(e.kind){case"sky":t.push({sunElevation:e.sun_elevation,sunRotation:e.sun_rotation,altitude:e.altitude,airDensity:e.air_density,aerosolDensity:e.aerosol_density,ozoneDensity:e.ozone_density});return;case"mapping":case"gradient":case"separate":o(e.vector);return;case"ramp":o(e.factor);return;case"mix_color":o(e.factor),o(e.a),o(e.b);return;case"math":e.inputs.forEach(o);return;case"to_float":o(e.value);return;case"map_range":o(e.value),o(e.from_min),o(e.from_max),o(e.to_min),o(e.to_max),o(e.steps);return;default:return}};return o(n),t}function vt(n){if(typeof n=="number"||Array.isArray(n))return!1;switch(n.kind){case"window":return!0;case"mapping":case"gradient":case"separate":return vt(n.vector);case"ramp":return vt(n.factor);case"mix_color":return[n.factor,n.a,n.b].some(vt);case"math":return n.inputs.some(vt);case"to_float":return vt(n.value);case"map_range":return[n.value,n.from_min,n.from_max,n.to_min,n.to_max,n.steps].some(vt);default:return!1}}function Ba(n,t,o,e){e.updateMatrixWorld();const a=new Float32Array(t*o*3),i=new y,s=Z(n,()=>i),c=new y,u=e.getWorldPosition(new y),f=e.getWorldDirection(new y);for(let r=0;r<o;r++)for(let l=0;l<t;l++){const m=(l+.5)/t,h=(r+.5)/o;i.set(m,h,0),e.isOrthographicCamera?c.copy(f):c.set(m*2-1,h*2-1,.5).unproject(e).sub(u).normalize(),c.set(c.x,-c.z,c.y);const d=s(c),_=(r*t+l)*3;a[_]=typeof d=="number"?d:d.x,a[_+1]=typeof d=="number"?d:d.y,a[_+2]=typeof d=="number"?d:d.z}return a}const G=R().finite(),Ua=O({type:X(["POINT","SUN","SPOT","AREA"]),color:j([G,G,G]),energy:G,use_shadow:Y().default(!0),radius:G.optional(),spot_size:G.optional(),spot_blend:G.optional(),shape:X(["SQUARE","RECTANGLE","DISK","ELLIPSE"]).optional(),size:G.optional(),size_y:G.optional()}).strict();let Cn;function qa(){return Cn??=Le(async()=>{const{RectAreaLightUniformsLib:n}=await import("./RectAreaLightUniformsLib-CMMoWfll.js");return{RectAreaLightUniformsLib:n}},__vite__mapDeps([0,1])).then(({RectAreaLightUniformsLib:n})=>{n.init(),Jt()}),Cn}function Ha(){return Cn??Promise.resolve()}const Wa=n=>{const t=n.size??0,o=n.size_y??t;if(n.shape==="RECTANGLE")return[t,o];if(n.shape==="DISK"){const e=Math.sqrt(Math.PI*t*t/4);return[e,e]}if(n.shape==="ELLIPSE"){const e=Math.sqrt(Math.PI/4);return[t*e,o*e]}return[t,t]};function Ga(n,t){const o=(s,c)=>t&&c(t)?t:new s;if(n.type==="SUN"){const s=o(So,c=>c.isDirectionalLight);return s.intensity=n.energy,s.color.setRGB(n.color[0],n.color[1],n.color[2],at),s.castShadow=n.use_shadow,s}if(n.type==="POINT"){const s=o(Sn,c=>c.isPointLight);return s.intensity=n.energy/(4*Math.PI),s.distance=0,s.decay=2,s.color.setRGB(n.color[0],n.color[1],n.color[2],at),s.castShadow=n.use_shadow,s}if(n.type==="SPOT"){const s=o(En,c=>c.isSpotLight);return s.intensity=n.energy/(4*Math.PI),s.distance=0,s.decay=2,s.angle=(n.spot_size??0)/2,s.penumbra=n.spot_blend??0,s.color.setRGB(n.color[0],n.color[1],n.color[2],at),s.castShadow=n.use_shadow,s}qa();const e=o(rn,s=>s.isRectAreaLight),[a,i]=Wa(n);return e.width=a,e.height=i,e.intensity=n.energy/(Math.max(a*i,Number.MIN_VALUE)*Math.PI),e.color.setRGB(n.color[0],n.color[1],n.color[2],at),e}function Xa(n,t,o){if(!n.castShadow||o<=0)return;const a=n.getWorldPosition(new y).distanceTo(t),i=n.shadow;if(!i)return;const s=i.camera;s.near=Math.max(o*.001,a-o),s.far=a+o,n.isDirectionalLight&&(s.left=-o,s.right=o,s.top=o,s.bottom=-o),s.updateProjectionMatrix()}function Ya(n,t){n.position.set(0,0,0);const o=n;n.isRectAreaLight||o.target&&o.target.parent!==t&&(o.target.position.set(0,0,-1),t.add(o.target))}const Za=[{direction:[-.352546,.170931,-.920051],diffuse:[.033103,.033103,.033103],smooth:.52662},{direction:[-.408163,.346939,.844415],diffuse:[.521083,.538226,.538226],smooth:0},{direction:[.521739,.826087,.212999],diffuse:[.038403,.034357,.04953],smooth:.478261},{direction:[.624519,-.562067,-.542269],diffuse:[.090838,.08208,.072255],smooth:.2}],uo=.69;class Qa{constructor(){this.group=new _t,this.lights=[],this.group.name="BlenderSolidStudio";const t=new Ao;t.name="BlenderSolidStudioTarget",this.group.add(t);const o=new gt(0,0,0);for(const[a,i]of Za.entries()){const s=(1+i.smooth)**2,c=new So(16777215,Math.PI*uo/s);c.name=`BlenderSolidLight${a}`,c.color.setRGB(i.diffuse[0],i.diffuse[1],i.diffuse[2],at),c.position.set(i.direction[0],i.direction[1],i.direction[2]),c.target=t,this.group.add(c),this.lights.push(c),o.r+=i.diffuse[0]*i.smooth/s,o.g+=i.diffuse[1]*i.smooth/s,o.b+=i.diffuse[2]*i.smooth/s}const e=new fe(16777215,Math.PI*uo);e.name="BlenderSolidWrapFill",e.color.copy(o),this.group.add(e),this.lights.push(e)}setRendered(t){this.group.visible=!t}dispose(){for(const t of this.lights)t.dispose();this.group.clear()}}const It=j([G,G,G]),B=Io(()=>Nt([G,It,O({kind:L("direction")}).strict(),O({kind:L("window")}).strict(),O({kind:L("gradient"),gradient_type:X(["LINEAR","QUADRATIC","EASING","DIAGONAL","SPHERICAL","QUADRATIC_SPHERE","RADIAL"]),output:X(["Fac","Color"]),vector:B}).strict(),O({kind:L("to_float"),source_type:X(["RGBA","VECTOR"]),value:B}).strict(),O({kind:L("math"),operation:X(Object.keys(Uo)),clamp:Y(),inputs:z(B).min(1).max(3)}).strict(),O({kind:L("mix_color"),factor:B,a:B,b:B,clamp_factor:Y(),clamp_result:Y()}).strict(),O({kind:L("mapping"),vector_type:X(["POINT","TEXTURE","VECTOR","NORMAL"]).optional(),vector:B,location:It,rotation:It,scale:It}).strict(),O({kind:L("separate"),vector:B,axis:R().int().min(0).max(2)}).strict(),O({kind:L("ramp"),factor:B,colors:z(It).length(257),interpolate:Y()}).strict(),O({kind:L("map_range"),interpolation:X(["LINEAR","STEPPED","SMOOTHSTEP","SMOOTHERSTEP"]),clamp:Y(),value:B,from_min:B,from_max:B,to_min:B,to_max:B,steps:B}).strict(),O({kind:L("sky"),sun_elevation:G,sun_rotation:G,altitude:G,air_density:G,aerosol_density:G,ozone_density:G}).strict()])),_o=O({color:It,strength:G,shader:B.optional()}),Ka=_o.extend({volume:z(O({kind:X(["absorption","scatter","principled","emission"]),phase:A(),alpha:B,weight:B,color:B,density:B,anisotropy:B,absorption_color:B,emission_color:B,emission_strength:B,blackbody_intensity:B,temperature:B,blackbody_tint:B}).strict()).optional(),lighting:_o.strict().optional()}).strict(),Ja=4,qt=new Map,wn=new Set;function mo(n,t,o){const i=vt(n);if(i&&!o)throw new Error("World Window coordinates need a render camera");o?.updateMatrixWorld();const s=JSON.stringify([n,i?[o.matrixWorld.elements,o.projectionMatrix.elements]:null]),c=qt.get(s);if(c!==void 0)return kn(c,t,256,128);const u=new y,f=new Eo,r=o?new mt().multiplyMatrices(o.projectionMatrix,o.matrixWorldInverse):null,l=o?.getWorldPosition(new y),h=ja(n,256,128,i?d=>(u.set(d.x,d.z,-d.y),o.isPerspectiveCamera&&u.add(l),f.set(u.x,u.y,u.z,1).applyMatrix4(r),f.w===0?u.set(0,0,0):u.set(f.x/f.w*.5+.5,f.y/f.w*.5+.5,0)):void 0);return qt.set(s,h),qt.size>Ja&&qt.delete(qt.keys().next().value),kn(h,t,256,128)}function tl(n,t,o,e){const a=Wt.toHalfFloat(1);for(let i=0;i<e;i++)n[i*4]=Wt.toHalfFloat(t[i*3]*o),n[i*4+1]=Wt.toHalfFloat(t[i*3+1]*o),n[i*4+2]=Wt.toHalfFloat(t[i*3+2]*o),n[i*4+3]=a}function kn(n,t,o,e){const a=new Uint16Array(o*e*4);tl(a,n,t,o*e);const i=new mn(a,o,e,dn,jn);return i.mapping=ue,i.colorSpace=at,i.minFilter=St,i.magFilter=St,i.needsUpdate=!0,i}class Hn{constructor(){this.pending=null,this.texture=null,this.environmentTexture=null,this.screenTexture=null,this.applied=null,this.generation=0}async ready(){await this.pending}static sceneOf(t){let o=t;for(;o;){if(o.isScene)return o;o=o.parent}return null}apply(t,o,e){if(this.clear(),this.pending=null,!o)return;const a=Hn.sceneOf(t);if(!a)return;this.applied={scene:a,background:a.background,environment:a.environment};const i=o.shader??o.color,s=this.generation,u=[...co(i),...o.lighting?co(o.lighting.shader??o.lighting.color):[]].filter(r=>!Da(r));if(u.length===0){this.compose(a,o,i,e);return}const f=(async()=>{const r=await Promise.all(u.map(La));u.forEach((l,m)=>{Bo(l,r[m])}),!(this.generation!==s||this.applied?.scene!==a)&&(this.compose(a,o,i,e),Jt())})();this.pending=f,wn.add(f),f.then(()=>wn.delete(f),()=>wn.delete(f))}compose(t,o,e,a){if(this.texture=mo(e,o.strength,a),vt(e)){if(!a)throw new Error("World Window coordinates need a render camera");this.screenTexture=kn(Ba(e,512,512,a),o.strength,512,512),this.screenTexture.mapping=ce,t.background=this.screenTexture}else if(a&&a.isOrthographicCamera){const s=a.getWorldDirection(new y);s.set(s.x,-s.z,s.y);const c=Z(o.shader??o.color)(s);t.background=typeof c=="number"?new gt().setRGB(c,c,c).multiplyScalar(o.strength):new gt().setRGB(c.x,c.y,c.z).multiplyScalar(o.strength)}else t.background=this.texture;const{lighting:i}=o;this.environmentTexture=i?mo(i.shader??i.color,i.strength,a):null,t.environment=this.environmentTexture??this.texture}clear(){this.generation++,this.applied&&(this.applied.scene.background=this.applied.background,this.applied.scene.environment=this.applied.environment,this.applied=null,this.texture?.dispose(),this.texture=null,this.environmentTexture?.dispose(),this.environmentTexture=null,this.screenTexture?.dispose(),this.screenTexture=null)}dispose(){this.clear()}}function qo(n){return[n.min.x,n.max.x].flatMap(t=>[n.min.y,n.max.y].flatMap(o=>[n.min.z,n.max.z].map(e=>new y(t,o,e))))}function nl(n,t){if(n.isEmpty()||!t.intersectsBox(n))return[];const o=qo(n);if(o.every(r=>t.containsPoint(r)))return o;const e=[...t.planes,new Mt(new y(1,0,0),-n.min.x),new Mt(new y(-1,0,0),n.max.x),new Mt(new y(0,1,0),-n.min.y),new Mt(new y(0,-1,0),n.max.y),new Mt(new y(0,0,1),-n.min.z),new Mt(new y(0,0,-1),n.max.z)],a=[],i=new y,s=new y,c=new y,u=new y,f=Math.max(1,n.min.length(),n.max.length())*1e-8;for(let r=0;r<e.length;r++)for(let l=r+1;l<e.length;l++)for(let m=l+1;m<e.length;m++){const h=e[r],d=e[l],_=e[m];i.crossVectors(d.normal,_.normal);const v=h.normal.dot(i);Math.abs(v)<1e-12||(s.crossVectors(_.normal,h.normal),c.crossVectors(h.normal,d.normal),u.copy(i).multiplyScalar(-h.constant).addScaledVector(s,-d.constant).addScaledVector(c,-_.constant).divideScalar(v),e.every(g=>g.distanceToPoint(u)>=-f)&&a.push(u.clone()))}return a}function ol(n,t,o){if(!n.castShadow||!t.length)return;n.shadow.updateMatrices(n);const e=n.shadow.camera,a=e.matrixWorldInverse,i=new fn().setFromPoints(t.map(m=>m.clone().applyMatrix4(a))),s=i.getSize(new y),c=Math.max(s.length()*1e-6,Number.EPSILON),u=2+2*Math.SQRT2,f=Math.max(s.x,s.y,c)/Math.max(1,Math.min(n.shadow.mapSize.x,n.shadow.mapSize.y)-2*u),r=2*Math.SQRT2*f,l=u*f;i.min.x-=l,i.min.y-=l,i.max.x+=l,i.max.y+=l;for(const m of o){if(m.isEmpty())continue;const h=new fn().setFromPoints(qo(m).map(d=>d.applyMatrix4(a)));h.max.x<i.min.x||h.min.x>i.max.x||h.max.y<i.min.y||h.min.y>i.max.y||(i.min.z=Math.min(i.min.z,h.min.z),i.max.z=Math.max(i.max.z,h.max.z))}e.left=i.min.x,e.right=i.max.x,e.bottom=i.min.y,e.top=i.max.y,e.near=-i.max.z-r-c,e.far=-i.min.z+r+c,e.updateProjectionMatrix(),n.shadow.normalBias=r}const Ct=R().finite(),ho=j([Ct,Ct,Ct]),Ho=O({min:j([R().int(),R().int(),R().int()]),max:j([R().int(),R().int(),R().int()]),density:z(Ct),voxelSize:Ct.positive(),color:ho,emission:ho,densityScale:Ct.nonnegative()}).strict();function el(n){const t=n.max.map((r,l)=>r-n.min[l]+1);if(t.some(r=>r<=0)||t.reduce((r,l)=>r*l,1)!==n.density.length)throw new Error("Volume density dimensions do not match the evaluated grid");const o=new _e(new Float32Array(n.density),t[0],t[1],t[2]);o.format=me,o.type=No,o.minFilter=o.magFilter=St,o.unpackAlignment=1,o.needsUpdate=!0;const e=new y(...n.min).addScalar(-.5).multiplyScalar(n.voxelSize),a=new y(t[0],t[1],t[2]).multiplyScalar(n.voxelSize),i=new de(a.x,a.y,a.z),s=i.getAttribute("position");for(let r=0;r<s.count;r++)s.setXYZ(r,e.x+(s.getX(r)>0?a.x:0),e.y+(s.getY(r)>0?a.y:0),e.z+(s.getZ(r)>0?a.z:0));s.needsUpdate=!0,i.computeBoundingBox(),i.computeBoundingSphere();const c=new Vn({glslVersion:pe,side:he,transparent:!0,depthWrite:!1,premultipliedAlpha:!0,uniforms:{densityGrid:{value:o},minimum:{value:e},extent:{value:a},voxelSize:{value:n.voxelSize},densityScale:{value:n.densityScale},volumeColor:{value:new y(...n.color)},emission:{value:new y(...n.emission)},cameraLocal:{value:new y},rayLocal:{value:new y},orthographic:{value:!1},worldScale:{value:new Oo}},vertexShader:`
19
+ `;function pt(n){return new gt().setHex(n,$t)}function Kn(n,t){const o=n.mode==="POSE";let e;return o?t.active&&t.select?e=pt(ft.poseActive):t.active?e=pt(ft.poseActiveUnsel):t.select?e=pt(ft.pose):e=pt(ft.wire):e=pt(ft.vertex),o&&t.lockedWeight&&e.lerp(pt(ft.lockedWeight),ft.lockedWeightFactor),e}function Jn(n,t){const o=pt(ft.solid);return n.mode==="POSE"&&t.lockedWeight&&o.lerp(pt(ft.lockedWeight),ft.lockedWeightFactor),o}const ta=new mt,na=new y,to=new Oo;function no(n,t){return new mt().set(...t.matrix.flat()).premultiply(n).scale(new y().setScalar(t.length))}class oa{constructor(){this.group=new _t,this.disposables=[],this.signature="",this.group.name="BlenderArmatureOverlay"}apply(t,o){const e=[],a=JSON.stringify(t);if(a===this.signature)return e;this.signature=a,this.clear();for(const i of Object.values(t)){const s=o(i.object);if(s===null)continue;i.displayType!=="OCTAHEDRAL"&&i.displayType!=="STICK"&&e.push(`armature ${i.object}: Blender's ${i.displayType} bone display needs data this door does not carry (B-Bone segment matrices, envelope radii), so its bones are drawn octahedral`),i.mode==="EDIT"&&e.push(`armature ${i.object}: in Edit Mode Blender draws the EDIT bones, and this overlay draws the pose — the shapes are the rest pose, not the edited one`);const u=i.bones.filter(f=>!f.hide);if(u.length===0)continue;const c=i.displayType==="STICK"?this.buildStick(i,u,s):this.buildOctahedral(i,u,s);i.showInFront&&c.traverse(f=>{const r=f.material;r&&"depthTest"in r&&(r.depthTest=!1),f.renderOrder=10}),this.group.add(c)}return e}buildOctahedral(t,o,e){const a=new _t;a.name=`${t.object}:bones`;const i=[],s=[],u=[],c=[],f=[],r=[],l=[],m=[],h=[],d=[];for(const _ of o){const p=no(e,_),v=Jn(t,_),g=We(v),b=Kn(t,_);to.setFromMatrix4(p).invert().transpose();for(let w=0;w<Zn.length;w++){const E=na.set(...Ge[w]).applyMatrix3(to).normalize().clone();for(const I of Zn[w]){const F=new y(...hn[I]).applyMatrix4(p);i.push(F.x,F.y,F.z),s.push(E.x,E.y,E.z),u.push(v.r,v.g,v.b),c.push(g.r,g.g,g.b)}}const P=Qn(_)===2?l:f,D=Qn(_)===2?m:r;for(const[w,E]of Xe){const I=new y(...hn[w]).applyMatrix4(p),F=new y(...hn[E]).applyMatrix4(p);P.push(I.x,I.y,I.z,F.x,F.y,F.z),D.push(b.r,b.g,b.b,b.r,b.g,b.b)}_.parent!==null&&_.connected||(h.push(p.clone()),d.push(v)),h.push(p.clone().multiply(ta.makeTranslation(0,1,0))),d.push(v)}a.add(this.solidMesh(i,s,u,c)),f.length&&a.add(this.lines(f,r,1)),l.length&&a.add(this.lines(l,m,2));for(let _=0;_<h.length;_++)a.add(this.point(h[_],d[_]));return a}buildStick(t,o,e){const a=new _t;a.name=`${t.object}:bones`;const i=[],s=[],u=[],c=[];for(const f of o){const r=no(e,f),l=new y().setFromMatrixPosition(r),m=new y(0,1,0).applyMatrix4(r),h=Kn(t,f),d=Jn(t,f);i.push(l.x,l.y,l.z,m.x,m.y,m.z),s.push(h.r,h.g,h.b,h.r,h.g,h.b),u.push(l.x,l.y,l.z,m.x,m.y,m.z),c.push(d.r,d.g,d.b,d.r,d.g,d.b)}return a.add(this.lines(i,s,Ze)),a.add(this.lines(u,c,Qe)),a}solidMesh(t,o,e,a){const i=new To;i.setAttribute("position",new Ht(t,3)),i.setAttribute("normal",new Ht(o,3)),i.setAttribute("aSolid",new Ht(e,3)),i.setAttribute("aHint",new Ht(a,3));const s=new Vn({vertexShader:Ke,fragmentShader:Je,side:ae});this.disposables.push(i,s);const u=new At(i,s);return u.frustumCulled=!1,u}lines(t,o,e){const a=new ne;a.setPositions(t),a.setColors(o);const i=new oe({linewidth:e,vertexColors:!0});this.disposables.push(a,i);const s=new ee(a,i);return s.frustumCulled=!1,s}point(t,o){const e=new le(Ye,12,8),a=new Po({color:o});this.disposables.push(e,a);const i=new At(e,a);return i.applyMatrix4(t),i.frustumCulled=!1,i}clear(){for(const t of[...this.group.children])this.group.remove(t);for(const t of this.disposables)t.dispose();this.disposables.length=0}dispose(){this.clear(),this.signature=""}}const ea="RUNTIME_FRAME_UNKNOWN_GEOMETRY",jt="RUNTIME_FRAME_UNKNOWN_IMAGE";function aa(n){const t=Math.fround,o=t(t(t(n[0]*n[0])+t(n[1]*n[1]))+t(n[2]*n[2]));if(o>1e-35){const e=t(Math.sqrt(o)),a=t(1/e);return{unit:[t(n[0]*a),t(n[1]*a),t(n[2]*a)],length:e}}return{unit:[0,0,0],length:0}}const T=Math.fround,cn=T(2*Math.PI),pn=T(1-1e-4),wt=(n,t)=>T(T(T(n[0]*t[0])+T(n[1]*t[1]))+T(n[2]*t[2])),Zt=(n,t,o=1)=>n.map((e,a)=>T(e+T(t[a]*o))),la=(n,t)=>n.map((o,e)=>T(o-t[e]));function Bt(n){const t=T(Math.sqrt(wt(n,n)));return t>0?n.map(o=>T(o/t)):[0,0,0]}function Ut(n){const t=Math.abs(n)<1?T(1-T(1-Math.abs(n))):1;let o=T(T(.077980478)+T(t*T(-.02164095)));o=T(T(-.213300989)+T(t*o)),o=T(T(1.5707963267)+T(t*o));const e=T(T(Math.sqrt(T(1-t)))*o);return n<0?T(T(Math.PI)-e):e}function ra(n){let t=n.at(-1);const o=[0,0,0];for(const e of n){for(let a=0;a<3;a++){const i=(a+1)%3,s=(a+2)%3;o[a]=T(o[a]+T(T(t[i]-e[i])*T(t[s]+e[s])))}t=e}return o}function ia(n){const t=[],o=[],e=(d,_)=>d<_?`${d}:${_}`:`${_}:${d}`,a=new Map((n.edge_order??[]).map(([d,_],p)=>[e(d,_),p])),i=new Set((n.sharp??[]).map(([d,_])=>e(d,_))),s=new Map;for(const[d,_]of n.f.entries()){const p=t.length,v=aa(ra(_.map(g=>n.v[g]))).unit;o.push(v.some(Boolean)?v:[0,0,1]);for(let g=0;g<_.length;g++){const b=e(_[g],_[(g+1)%_.length]);a.has(b)||a.set(b,a.size);const P=n.face_edges?.[d]?.[g]??a.get(b),D=t.length;t.push({vertex:_[g],face:d,edge:P,prev:p+(g+_.length-1)%_.length,next:p+(g+1)%_.length});const w=s.get(P)??[];w.push(D),s.set(P,w)}}const u=new Map,c=new Map;for(const[d,_]of s){if(_.length!==2||n.edge_sharp?.[d])continue;const[p,v]=_,g=t[p],b=t[v];!n.s?.[g.face]||!n.s?.[b.face]||g.vertex!==t[b.next].vertex||b.vertex!==t[g.next].vertex||!n.edge_sharp&&i.has(e(g.vertex,b.vertex))||(c.set(p,b.next),u.set(b.next,p),c.set(v,g.next),u.set(g.next,v))}const f=[],r=[],l=[],m=[],h=(d,_)=>Bt(la(n.v[t[t[d][_]].vertex],n.v[t[d].vertex]));for(let d=0;d<t.length;d++){if(r[d]!==void 0)continue;let _=d;const p=new Set([_]);for(;c.has(_)&&!p.has(c.get(_));)_=c.get(_),p.add(_);c.has(_)&&(_=Math.min(...p));const v=[_];for(;u.has(v.at(-1))&&u.get(v.at(-1))!==_;)v.push(u.get(v.at(-1)));let g=[0,0,0];if(v.length===1)g=o[t[_].face];else{for(const F of v)g=Zt(g,o[t[F].face],Ut(wt(h(F,"prev"),h(F,"next"))));g=Bt(g)}const b=h(_,"next"),P=v.at(-1),D=h(P,"prev"),w=wt(b,g),E=wt(D,g),I={normal:g,reference:[0,0,0],ortho:[0,0,0],alpha:0,beta:0};if(Math.abs(w)<pn&&Math.abs(E)<pn){const F=v.length>1?v.map(xt=>h(xt,"next")):[];F.length&&t[t[P].prev].edge!==t[_].edge&&F.push(D),I.alpha=F.length?T(F.reduce((xt,x)=>T(xt+Ut(wt(x,g))),0)/F.length):T(T(Ut(w)+Ut(E))/2),I.reference=Bt(Zt(b,g,-w));const k=g,U=I.reference;I.ortho=Bt([T(T(k[1]*U[2])-T(k[2]*U[1])),T(T(k[2]*U[0])-T(k[0]*U[2])),T(T(k[0]*U[1])-T(k[1]*U[0]))]);const Q=Bt(Zt(D,g,-E)),lt=wt(I.reference,Q),rt=Ut(lt);I.beta=lt<pn?wt(I.ortho,Q)<0?T(cn-rt):rt:cn}I.alpha===0&&(I.normal=[0,0,0]);for(const F of v)r[F]=f.length;f.push(v),l.push(I),m.push(g)}return{corners:t,fans:f,fanOf:r,spaces:l,faceNormals:o,fanNormals:m}}function sa(n,t){if(!t[0]||n.alpha===0||n.beta===0)return n.normal;const o=T(t[0]/32767),e=T(t[1]/32767),a=T((o>0?n.alpha:T(cn-n.alpha))*o),i=T((e>0?n.beta:T(cn-n.beta))*e);let s=n.normal.map(u=>T(u*T(Math.cos(a))));return s=Zt(s,n.reference,T(T(Math.sin(a))*T(Math.cos(i)))),e!==0&&(s=Zt(s,n.ortho,T(T(Math.sin(a))*T(Math.sin(i))))),s}function zo(n,t){if(!t)return null;const{corners:o,fans:e,spaces:a}=ia(n);if(t.type==="INT16_2D"&&t.domain==="CORNER"){const i=new Array(o.length);for(const[s,u]of e.entries()){const c=u.reduce((r,l)=>{const m=t.data[l];return[r[0]+m[0],r[1]+m[1]]},[0,0]),f=sa(a[s],c.map(r=>Math.trunc(r/u.length)));for(const r of u)i[r]=f}return i}if(t.type==="FLOAT_VECTOR")return o.map((i,s)=>{const u=t.domain==="POINT"?i.vertex:t.domain==="FACE"?i.face:s;return t.data[u]});throw new Error(`Unsupported custom_normal attribute: ${t.type}/${t.domain}`)}const vn={FLOAT:{size:1},INT:{size:1},INT8:{size:1},BOOLEAN:{size:1},FLOAT2:{size:2},FLOAT_VECTOR:{size:3},FLOAT_COLOR:{size:4},BYTE_COLOR:{size:4},INT16_2D:{size:2},INT32_2D:{size:2},QUATERNION:{size:4},FLOAT4X4:{size:16},FLOAT4:{size:4},STRING:{size:1}},fa=1e-6;function ca(n){const t=new y;for(let o=0;o<n.length;o++){const e=n[o],a=n[(o+1)%n.length];t.x+=(e.y-a.y)*(e.z+a.z),t.y+=(e.z-a.z)*(e.x+a.x),t.z+=(e.x-a.x)*(e.y+a.y)}return t.multiplyScalar(.5)}const ua=(n,t,o)=>(t.x-n.x)*(o.y-n.y)-(t.y-n.y)*(o.x-n.x),oo=n=>Array.from({length:n-2},(t,o)=>[0,o+1,o+2]);function _a(n){let t=0;for(let o=0;o<n.length;o++){const e=n[o],a=n[(o+1)%n.length];t+=e.x*a.y-a.x*e.y}return t}function eo(n,t,o){if(n.length!==t.length-2||!(Math.abs(o)>0))return!1;const e=Math.sign(o);let a=0;for(const[i,s,u]of n){const c=ua(t[i],t[s],t[u]);if(c*e<0)return!1;a+=Math.abs(c)}return Math.abs(a-Math.abs(o))<=fa*Math.abs(o)}function ma(n){const t=n.length;if(t<3)return{triangles:[],sound:!1,method:"fan"};if(t===3)return{triangles:[[0,1,2]],sound:!0,method:"fan"};const o=ca(n),e=o.length();if(!(e>0)||!Number.isFinite(e))return{triangles:oo(t),sound:!1,method:"fan"};const a=o.clone().divideScalar(e),i=Math.abs(a.x)<.9?new y(1,0,0):new y(0,1,0),s=new y().crossVectors(i,a).normalize(),u=new y().crossVectors(a,s),c=n[0],f=n.map(h=>{const d=h.clone().sub(c);return new _n(d.dot(s),d.dot(u))}),r=_a(f),l=oo(t);if(eo(l,f,r))return{triangles:l,sound:!0,method:"fan"};let m=[];try{m=re.triangulateShape(f,[]).map(h=>[h[0],h[1],h[2]])}catch{return{triangles:l,sound:!1,method:"fan"}}return eo(m,f,r)?{triangles:m,sound:!0,method:"earcut"}:{triangles:m.length>0?m:l,sound:!1,method:m.length>0?"earcut":"fan"}}const da=new Set(["FLOAT","FLOAT2","FLOAT_VECTOR","FLOAT_COLOR","BYTE_COLOR"]);function gn(n){const t=n/255;return t<.04045?t<0?0:t*(1/12.92):((t+.055)*(1/1.055))**2.4}function xn(n,t,o){switch(n){case"FLOAT":{const e=Number(t[o]);return[e,e,e,1]}case"FLOAT2":return[Number(t[o*2]),Number(t[o*2+1]),0,1];case"FLOAT_VECTOR":return[Number(t[o*3]),Number(t[o*3+1]),Number(t[o*3+2]),1];case"BYTE_COLOR":return[gn(Number(t[o*4])),gn(Number(t[o*4+1])),gn(Number(t[o*4+2])),Number(t[o*4+3])/255];default:return[Number(t[o*4]),Number(t[o*4+1]),Number(t[o*4+2]),Number(t[o*4+3])]}}function Do(n,t){return n.filter(o=>da.has(o.type)&&o.domain!=="EDGE"&&!o.name.startsWith(".")&&o.name!=="position"&&o.name!=="custom_normal"&&!(o.type==="FLOAT2"&&o.domain==="CORNER")).map(o=>{const e=t(o.data,o.type),a=[0,0,0,0];return{name:o.name,domain:o.domain,read:(i,s,u)=>o.domain==="POINT"?xn(o.type,e,i):o.domain==="CORNER"?s===void 0?a:xn(o.type,e,s):u===void 0?a:xn(o.type,e,u)}})}function Co(n){const t=n.vertexCount,o=n.starts.length-1,e=n.starts,a=n.cornerVerts,i=e[o];let s=t;for(let x=0;x<o;x++)s+=(e[x+1]-e[x]-2)*3;const u=new Uint32Array(i),c=new Uint8Array(i),f=new Uint8Array(t),r=new Uint32Array(i);let l=!1;for(let x=0;x<o;x++)if(n.smooth(x)){l=!0;break}const m=(x,$)=>t<94906265?Math.min(x,$)*t+Math.max(x,$):`${Math.min(x,$)}:${Math.max(x,$)}`,h=new Map,d=new Set;for(const[x,$]of n.sharp)d.add(m(x,$));if(n.edges)for(const[x,$]of n.edges){if(x===$)throw new Error("Runtime mesh edge needs distinct vertices");h.set(m(x,$),-1)}const _=x=>{for(;r[x]!==x;)r[x]=r[r[x]],x=r[x];return x},p=(x,$)=>{const M=_(x),H=_($);r[Math.max(M,H)]=Math.min(M,H)};for(let x=0;x<o;x++){const $=e[x],M=e[x+1]-$,H=n.smooth(x)?1:0;for(let W=0;W<M;W++){const C=$+W;f[a[C]]=1,u[C]=$+(W+1)%M,c[C]=H,r[C]=C}}for(let x=0;x<i;x++){const $=u[x],M=a[x],H=a[$],W=m(M,H),C=h.get(W);if(C!==void 0&&C>=0&&c[x]&&c[C]&&!d.has(W)){const q=u[C];p(x,a[C]===M?C:q),p($,a[C]===M?q:C)}(C===void 0||C<0||!c[C]&&c[x])&&h.set(W,x)}const v=n.uv,g=new Float32Array(s*3),b=new Float32Array(s*2),P=new Uint32Array(s),D=(n.uvLayers??[]).map(x=>({...x,data:new Float32Array(s*2)})),w=(n.attributeLayers??[]).map(x=>({...x,data:new Float32Array(s*4)})),E=n.orco?new Float32Array(s*3):null,I=new Uint32Array(s),F=new Map,k=[],U=n.normals||n.cornerNormal?new Float32Array(s*3):null;let Q=0,lt=0;const rt=(x,$,M,H,W)=>{const C=Q++;for(const q of w)q.data.set(q.read(x,H,W),C*4);if(E)for(let q=0;q<3;q++)E[C*3+q]=n.orco[x*3+q]*.5+.5;if(P[C]=x,n.co(x).toArray(g,C*3),$&&b.set($,C*2),M&&U.set(M,C*3),H!==void 0)for(const q of D)q.data.set(q.read(H),C*2);return C},xt=(x,$)=>{const M=v?.(x),H=n.cornerNormal?[n.cornerNormal[x*3],n.cornerNormal[x*3+1],n.cornerNormal[x*3+2]]:n.normals?.[x];if(!l)return rt(a[x],M,H,x,$);const W=`${c[x]?_(x):x}${M?`:${M[0]}:${M[1]}`:""}${H?`:n${H.join(":")}`:""}${D.map(q=>":"+q.read(x).join(":")).join("")}${w.map(q=>q.domain==="POINT"?"":":"+Array.from(q.read(a[x],x,$)).join(":")).join("")}`;let C=F.get(W);return C===void 0&&(C=rt(a[x],M,H,x,$),F.set(W,C)),C};for(let x=0;x<o;x++){const $=lt,M=e[x],H=e[x+1]-M,W=[];for(let Lt=0;Lt<H;Lt++)W.push(n.co(a[M+Lt]));for(const Lt of ma(W).triangles)for(const te of Lt)I[lt++]=xt(M+te,x);const C=n.material(x),q=k.at(-1);q?.materialIndex===C?q.count+=lt-$:k.push({start:$,count:lt-$,materialIndex:C})}for(let x=0;x<t;x++)f[x]||rt(x);return{positions:g.slice(0,Q*3),normals:U?.slice(0,Q*3)??null,uv:v?b.slice(0,Q*2):null,uvLayers:D.map(x=>({name:x.name,data:x.data.slice(0,Q*2)})),attributeLayers:w.map(x=>({name:x.name,data:x.data.slice(0,Q*4)})),orco:E?E.slice(0,Q*3):null,indices:I.slice(0,lt),sourceVertex:P.slice(0,Q),groups:k}}function Et(n){return`blenderA_${Array.from(new TextEncoder().encode(n),t=>t.toString(16).padStart(2,"0")).join("")}`}function In(n){const t=new To;t.setAttribute("position",new tt(n.positions,3)),t.setAttribute("uv",new tt(n.uv??new Float32Array(n.positions.length/3*2),2)),t.setIndex(new tt(n.indices,1));const o=Object.create(null);for(const[e,a]of(n.uvLayers??[]).entries()){if(e>=8)throw new Error("A Blender mesh supports at most eight UV maps");o[a.name]=e+1,t.setAttribute(`uv${e+1}`,new tt(a.data,2))}t.userData.blenderUvChannels=o;for(const e of n.attributeLayers??[])t.setAttribute(Et(e.name),new tt(e.data,4));t.userData.blenderAttributes=(n.attributeLayers??[]).map(e=>e.name),n.orco&&(t.setAttribute("blenderOrco",new tt(n.orco,3)),t.userData.blenderOrcoFromDoor=!0);for(const e of n.groups)t.addGroup(e.start,e.count,e.materialIndex);return n.normals?t.setAttribute("normal",new tt(n.normals,3)):t.computeVertexNormals(),n.sourceVertex&&t.setAttribute("blenderVertex",new tt(n.sourceVertex,1)),t}function ha(n,t){const o=n.co.length/3,e=n.attributes.filter(_=>_.type==="FLOAT2"&&_.domain==="CORNER"),a=n.renderUv??n.activeUv??e[0]?.name,i=e.find(_=>_.name===a);if(a&&!i)throw new Error(`Runtime UV map ${a} is missing`);const s=i?i.data:null,u=n.edge.length/2,c=new Array(u);for(let _=0;_<u;_++)c[_]=[n.edge[_*2],n.edge[_*2+1]];const f=[];for(let _=0;_<u;_++)n.edgeSharp[_]===1&&f.push(c[_]);const r=n.cornerNormal?void 0:n.attributes.find(_=>_.name==="custom_normal"),l=r?{v:Array.from({length:o},(_,p)=>[n.co[p*3],n.co[p*3+1],n.co[p*3+2]]),f:Array.from({length:n.faceStart.length-1},(_,p)=>Array.from(n.corner.subarray(n.faceStart[p],n.faceStart[p+1]))),s:Array.from(n.smooth,Boolean),edge_order:c,sharp:f,face_edges:Array.from({length:n.faceStart.length-1},(_,p)=>Array.from(n.cornerEdge.subarray(n.faceStart[p],n.faceStart[p+1]))),edge_sharp:Array.from(n.edgeSharp,Boolean)}:null,m=r?{type:r.type,domain:r.domain,data:Array.from({length:r.data.length/vn[r.type].size},(_,p)=>Array.from({length:vn[r.type].size},(v,g)=>Number(r.data[p*vn[r.type].size+g])))}:void 0,h=new y,d={vertexCount:o,normals:l?zo(l,m):null,cornerNormal:n.cornerNormal,orco:n.orco,co:_=>h.set(n.co[_*3],n.co[_*3+1],n.co[_*3+2]).clone(),starts:n.faceStart,cornerVerts:n.corner,smooth:_=>n.smooth[_]===1,material:_=>n.material[_],edges:c,sharp:f,uv:s?_=>[s[_*2],s[_*2+1]]:null,uvLayers:e.map(_=>({name:_.name,read:p=>[Number(_.data[p*2]),Number(_.data[p*2+1])]})),attributeLayers:Do(n.attributes,_=>_)};return{...Co(d),hash:t}}function pa(n){const t=n.v.map(l=>new y(...l)),o=l=>{const m=t[l];if(!m)throw new Error(`Runtime mesh vertex ${l} is missing`);return m},e=new Uint32Array(n.f.length+1);n.f.forEach((l,m)=>{if(l.length<3||new Set(l).size!==l.length)throw new Error("Runtime mesh face needs at least three distinct vertices");e[m+1]=e[m]+l.length});const a=new Uint32Array(e[n.f.length]);n.f.forEach((l,m)=>l.forEach((h,d)=>{o(h),a[e[m]+d]=h}));for(const[l,m]of n.edge_order??n.e??[])o(l),o(m);const i={POINT:t.length,EDGE:(n.edge_order??n.e??[]).length,FACE:n.f.length,CORNER:a.length};for(const l of n.attributes??[])if(l.domain!=="EDGE"&&l.data.length!==i[l.domain])throw new Error(`Runtime attribute ${l.name} has ${l.data.length} values for ${i[l.domain]} ${l.domain} elements`);const s=(n.attributes??[]).filter(l=>l.type==="FLOAT2"&&l.domain==="CORNER"),u=n.render_uv??n.active_uv??s[0]?.name,c=s.find(l=>l.name===u);if(u&&!c)throw new Error(`Runtime UV map ${u} is missing`);const f=c?.data,r={vertexCount:t.length,normals:zo(n,n.attributes?.find(l=>l.name==="custom_normal")),co:o,starts:e,cornerVerts:a,smooth:l=>!!n.s?.[l],material:l=>n.m?.[l]??0,edges:n.edge_order??n.e??null,sharp:n.sharp??[],uv:f?l=>f[l]:null,uvLayers:s.map(l=>({name:l.name,read:m=>l.data[m]})),attributeLayers:Do(n.attributes??[],l=>Array.from(l).flat())};return In(Co(r))}const Kt=1.5707963267948966,Ot=6.283185307179586,ko=.3183098861837067,$o=.0795774715459476,va=.3,ga=$o,xa=3/16*ko,Fn=.8,ao=Fn*Fn,Tt=6371,Lo=100,zn=Tt+Lo,lo=64,ro=64,K=256,bt=64,ba=[1.679,1.828,1.986,1.307],ya=[.006605,.01067,.01842,.03156],wa=[3472e-28,3914e-28,1349e-28,1103e-29],Oa=334.5,Ta=[28722e-28,46168e-28,79706e-28,13578e-27],Pa=[15908e-26,17711e-26,20942e-26,24033e-26],io=13681e16,Aa=2e6,Sa=.73,bn=[[53.38691773856467,22.981337506691023,0],[43.90484446636936,71.3477957000534,.10250686796574131],[1.6137278251608962,18.422960591455485,31.742921188390806],[20.762668673810577,2.361421352331437,110.4800964325214]],ct=[[3.2409698963165283,-1.5373831987380981,-.49861079454421997],[-.969243586063385,1.8759675025939941,.041555099189281464],[.05563009902834892,-.20397700369358063,1.056971549987793]],un=n=>n*n,Gt=n=>n<0?0:n>1?1:n,ut=(n,t,o)=>n+o*(t-n),Ea=n=>Math.sqrt(Math.max(n,0)),Vo=n=>[-Math.sqrt(1-n*n),0,n];function Dn(n,t,o,e,a,i,s){const u=n*e+t*a+o*i,c=n*n+t*t+o*o-s*s;if(c>0&&u>0)return-1;const f=u*u-c;return f<0?-1:f>=u*u?-u+Math.sqrt(f):-u-Math.sqrt(f)}const Na=n=>xa*(1+un(n));function Ma(n){const t=1+ao+2*Fn*n;return $o*(1-ao)/(t*Math.sqrt(t))}const Ra=n=>io*(Math.exp(-n/Sa)+Aa/io);function Un(n,t){let o=n%Ot;Math.abs(o)>=Math.PI&&(o-=Math.sign(o)*2*Math.PI);let e=t;return(o>=Kt||o<=-Kt)&&(o=Math.sign(o)*Math.PI-o,e+=Math.PI),e=e%Ot,e<0&&(e+=Ot),e=Ot-e,[o,e]}class Ia{constructor(t,o,e){this.air=t,this.aerosol=o,this.ozone=e,this.lut=new Float32Array(bt*K*4)}coefficients(t,o){const e=Ra(t)*this.aerosol,a=Math.log(Math.max(t,1e-4)),i=378547397e12*Math.exp(-un(a-3.22261)*5.55555555-a),s=Math.exp(-.07771971*t**1.16364243);for(let u=0;u<4;u++)o[u]=Ta[u]*e,o[4+u]=Pa[u]*e,o[8+u]=wa[u]*Oa*i*this.ozone,o[12+u]=ya[u]*s*this.air}transmittance(t,o,e){const[a,i,s]=Vo(t),u=ut(Tt,zn,o),f=Dn(0,0,u,a,i,s,zn)/lo,r=[0,0,0,0],l=new Float64Array(16);for(let m=0;m<lo;m++){const h=(m+.5)*f,d=a*h,_=i*h,p=u+s*h,v=Math.max(Math.hypot(d,_,p)-Tt,0);this.coefficients(v,l);for(let g=0;g<4;g++)r[g]+=(l[g]+l[4+g]+l[8+g]+l[12+g])*f}for(let m=0;m<4;m++)e[m]=Math.exp(-r[m])}precompute(){const t=new Float64Array(4);for(let o=0;o<bt;o++)for(let e=0;e<K;e++){const a=e/(K-1),i=o/(bt-1);this.transmittance(a*2-1,i,t);const s=(o*K+e)*4;for(let u=0;u<4;u++)this.lut[s+u]=t[u]}}lookup(t,o,e){const a=(K-1)*Gt(t*.5+.5),i=(bt-1)*Gt(o),s=Math.trunc(a),u=Math.trunc(i),c=Math.min(s+1,K-1),f=Math.min(u+1,bt-1),r=a-s,l=i-u,m=(u*K+s)*4,h=(u*K+c)*4,d=(f*K+s)*4,_=(f*K+c)*4;for(let p=0;p<4;p++)e[p]=ut(ut(this.lut[m+p],this.lut[h+p],r),ut(this.lut[d+p],this.lut[_+p],r),l)}lookupAtGround(t,o){const e=(K-1)*Gt(t*.5+.5),a=Math.trunc(e),i=Math.min(a+1,K-1),s=e-a;for(let u=0;u<4;u++)o[u]=ut(this.lut[a*4+u],this.lut[i*4+u],s)}lookupToSun(t,o){const e=(bt-1)*Gt(t),a=Math.trunc(e),i=Math.min(a+1,bt-1),s=e-a,u=K-1;for(let c=0;c<4;c++)o[c]=ut(this.lut[(a*K+u)*4+c],this.lut[(i*K+u)*4+c],s)}inscattering(t,o,e,a,i,s,u,c,f){const r=-(i*t[0]+s*t[1]+u*t[2]),l=Na(r),m=Ma(r),h=c/ro,d=new Float64Array(16),_=new Float64Array(4),p=new Float64Array(4),v=new Float64Array(4),g=new Float64Array(4),b=new Float64Array(4),P=[0,0,0,0],D=[1,1,1,1];for(let w=0;w<ro;w++){const E=(w+.5)*h,I=o+i*E,F=e+s*E,k=a+u*E,U=Math.hypot(I,F,k),Q=Math.max(U-Tt,0),lt=Q/Lo,rt=(I*t[0]+F*t[1]+k*t[2])/U;this.coefficients(Q,d),this.lookup(rt,lt,_);const xt=Ot*(1-Ea(1-un(Tt/U)));this.lookupAtGround(rt,v),this.lookupToSun(0,g),this.lookupToSun(lt,b);const x=1/(1+5*Math.exp(-17.92*rt)),$=[.217,.347,.594,1];for(let M=0;M<4;M++){const H=g[M]/b[M],W=ga*xt*(va*ko)*v[M]*H*rt;p[M]=.02*$[M]*x+W}for(let M=0;M<4;M++){const H=d[M]+d[4+M]+d[8+M]+d[12+M],W=ba[M]*(d[12+M]*(l*_[M]+p[M])+d[4+M]*(m*_[M]+p[M])),C=Math.exp(-h*H),q=Math.max(H,1e-7);P[M]+=D[M]*((W-W*C)/q),D[M]*=C}}for(let w=0;w<4;w++)f[w]=P[w]}}const nt=512,Dt=256;function jo(n,t){const o=new Ia(n.airDensity,n.aerosolDensity,n.ozoneDensity);o.precompute();const e=Math.min(Math.max(n.altitude,1),99999)/1e3,a=Vo(Math.cos(Kt-t)),i=new Float32Array(nt*Dt*3),s=nt/2,u=new Float64Array(4);for(let c=0;c<Dt;c++)for(let f=0;f<s;f++){const r=(f+.5)/nt,l=(c+.5)/Dt,m=Ot*r,h=l*2-1,d=Math.sign(h)*un(h)*Kt,_=Math.cos(d)*Math.cos(m),p=Math.cos(d)*Math.sin(m),v=Math.sin(d),g=Tt+e,b=Dn(0,0,g,_,p,v,zn),P=Dn(0,0,g,_,p,v,Tt),D=P<0?b:P;o.inscattering(a,0,0,g,_,p,v,D,u);let w=0,E=0,I=0;for(let U=0;U<4;U++)w+=bn[U][0]*u[U],E+=bn[U][1]*u[U],I+=bn[U][2]*u[U];const F=(c*nt+f)*3;i[F]=w,i[F+1]=E,i[F+2]=I;const k=(c*nt+(nt-f-1))*3;i[k]=w,i[k+1]=E,i[k+2]=I}return i}function Fa(n){const[t]=Un(n.sunElevation,n.sunRotation);return jo(n,t)}function qn(n){const[t]=Un(n.sunElevation,n.sunRotation);return JSON.stringify([t,n.altitude,n.airDensity,n.aerosolDensity,n.ozoneDensity])}const za=6,Ft=new Map;function Da(n){return Ft.has(qn(n))}function Bo(n,t){Ft.set(qn(n),t),Ft.size>za&&Ft.delete(Ft.keys().next().value)}function Ca(n){const[t,o]=Un(n.sunElevation,n.sunRotation),e=qn(n);let a=Ft.get(e);a===void 0&&(a=jo(n,t),Bo(n,a));const i=new y;return s=>{const u=Math.hypot(s.x,s.y),c=Math.atan2(s.z,u);let r=(Math.atan2(s.x,s.y)+Math.PI+o)/Ot;r-=Math.floor(r);const l=Math.abs(c),m=Gt(Math.sqrt(l/Kt)*Math.sign(c)*.5+.5),h=r*nt-.5,d=m*Dt-.5,_=Math.floor(h),p=Math.floor(d),v=h-_,g=d-p,b=k=>(k%nt+nt)%nt,P=k=>k<0?0:k>Dt-1?Dt-1:k,D=b(_),w=b(_+1),E=P(p),I=P(p+1),F=[0,0,0];for(let k=0;k<3;k++){const U=ut(a[(E*nt+D)*3+k],a[(E*nt+w)*3+k],v),Q=ut(a[(I*nt+D)*3+k],a[(I*nt+w)*3+k],v);F[k]=ut(U,Q,g)}return i.set(ct[0][0]*F[0]+ct[0][1]*F[1]+ct[0][2]*F[2],ct[1][0]*F[0]+ct[1][1]*F[1]+ct[1][2]*F[2],ct[2][0]*F[0]+ct[2][1]*F[1]+ct[2][2]*F[2])}}let ht=null,tn=!1,ka=0;const Xt=new Map;function $a(){if(ht||tn)return ht;if(typeof Worker>"u")return tn=!0,null;try{ht=new Worker(new URL("/assets/sky-precompute-worker-ChN7J87v.js",import.meta.url),{type:"module"})}catch{return tn=!0,null}return ht.onmessage=n=>{const{id:t,pixels:o,error:e}=n.data,a=Xt.get(t);a&&(Xt.delete(t),o?a.resolve(o):a.reject(new Error(e??"sky worker returned nothing")))},ht.onerror=n=>{const t=new Error(`sky worker failed: ${n.message||"unknown error"}`);for(const o of Xt.values())o.reject(t);Xt.clear(),ht?.terminate(),ht=null,tn=!0},ht}function La(n){const t=$a();if(!t)return Promise.resolve(Fa(n));const o=ka++,e={id:o,parameters:n};return new Promise((a,i)=>{Xt.set(o,{resolve:a,reject:i}),t.postMessage(e)})}function Va(n,t,o,e={}){switch(e.type??"LINEAR"){case"QUADRATIC":{const a=Math.max(n,0);return a*a}case"EASING":{const a=Math.min(1,Math.max(0,n));return a*a*(3-2*a)}case"DIAGONAL":return(n+t)/2;case"SPHERICAL":return Math.max(.999999-Math.hypot(n,t,o),0);case"QUADRATIC_SPHERE":{const a=Math.max(.999999-Math.hypot(n,t,o),0);return a*a}case"RADIAL":return Math.atan2(t,n)/(2*Math.PI)+.5;default:return n}}const yn=(n,t)=>t!==0?n/t:0,so=n=>Math.min(1,Math.max(-1,n)),fo=(n,t,o)=>{const e=o!==0?Math.max(o-Math.abs(n-t),0)/o:0;return Math.min(n,t)-e*e*e*o/6},Uo={ADD:(n,t)=>n+t,SUBTRACT:(n,t)=>n-t,MULTIPLY:(n,t)=>n*t,DIVIDE:yn,POWER:(n,t)=>t===0?1:n===0||n<0&&!Number.isInteger(t)?0:n**t,LOGARITHM:(n,t)=>n<=0||t<=0?0:yn(Math.log(n),Math.log(t)),SQRT:n=>Math.sqrt(Math.max(n,0)),INVERSE_SQRT:n=>n>0?1/Math.sqrt(n):0,ABSOLUTE:Math.abs,RADIANS:n=>n*Math.PI/180,DEGREES:n=>n*180/Math.PI,MINIMUM:(n,t)=>Math.min(n,t),MAXIMUM:(n,t)=>Math.max(n,t),LESS_THAN:(n,t)=>+(n<t),GREATER_THAN:(n,t)=>+(n>t),ROUND:n=>Math.floor(n+.5),FLOOR:Math.floor,CEIL:Math.ceil,FRACT:n=>n-Math.floor(n),MODULO:(n,t)=>t!==0?n%t:0,FLOORED_MODULO:(n,t)=>t!==0?n-Math.floor(n/t)*t:0,TRUNC:Math.trunc,SNAP:(n,t)=>Math.floor(yn(n,t))*t,WRAP:(n,t,o)=>t!==o?n-(t-o)*Math.floor((n-o)/(t-o)):o,PINGPONG:(n,t)=>{if(t===0)return 0;const o=(n-t)/(t*2);return Math.abs((o-Math.floor(o))*t*2-t)},SINE:Math.sin,COSINE:Math.cos,TANGENT:Math.tan,SINH:Math.sinh,COSH:Math.cosh,TANH:Math.tanh,ARCSINE:n=>Math.asin(so(n)),ARCCOSINE:n=>Math.acos(so(n)),ARCTANGENT:Math.atan,ARCTAN2:(n,t)=>n===0&&t===0?0:Math.atan2(n,t),SIGN:Math.sign,EXPONENT:Math.exp,COMPARE:(n,t,o)=>+(n===t||Math.abs(n-t)<=Math.max(o,2**-23)),MULTIPLY_ADD:(n,t,o)=>n*t+o,SMOOTH_MIN:fo,SMOOTH_MAX:(n,t,o)=>-fo(-n,-t,o)};function Z(n,t){if(typeof n=="number")return()=>n;if(Array.isArray(n)){const a=new y(...n);return()=>a}if(n.kind==="direction")return a=>a;if(n.kind==="window"){if(!t)throw new Error("World Window coordinates need a render camera");return t}if(n.kind==="gradient"){const a=Z(n.vector,t),i={type:n.gradient_type},s=new y;return u=>{const c=a(u),f=typeof c=="number"?c:c.x,r=typeof c=="number"?c:c.y,l=typeof c=="number"?c:c.z,m=it.clamp(Va(f,r,l,i),0,1);return n.output==="Fac"?m:s.setScalar(m)}}if(n.kind==="to_float"){const a=Z(n.value,t);return i=>{const s=a(i);return typeof s=="number"?s:Math.fround(n.source_type==="RGBA"?s.x*.212639+s.y*.7151687+s.z*.0721923:(s.x+s.y+s.z)/3)}}if(n.kind==="math"){const a=n.inputs.map(u=>Z(u,t)),i=Uo[n.operation],s=(u,c)=>{const f=a[u]?.(c)??0;if(typeof f!="number")throw new Error("World Math needs scalar inputs");return Math.fround(f)};return u=>{const c=Math.fround(i(s(0,u),s(1,u),s(2,u)));return n.clamp?it.clamp(c,0,1):c}}if(n.kind==="mix_color"){const a=Z(n.factor,t),i=Z(n.a,t),s=Z(n.b,t),u=new y,c=new y;return f=>{const r=a(f);if(typeof r!="number")throw new Error("World color Mix needs a scalar factor");const l=i(f);typeof l=="number"?u.setScalar(l):u.copy(l);const m=s(f);return typeof m=="number"?c.setScalar(m):c.copy(m),u.lerp(c,n.clamp_factor?it.clamp(r,0,1):r),n.clamp_result&&u.clampScalar(0,1),u}}if(n.kind==="sky"){const a=Ca({sunElevation:n.sun_elevation,sunRotation:n.sun_rotation,altitude:n.altitude,airDensity:n.air_density,aerosolDensity:n.aerosol_density,ozoneDensity:n.ozone_density});return i=>a(i)}if(n.kind==="mapping"){const a=Z(n.vector,t),i=new y(...n.location),s=new y(...n.scale),u=new ie().setFromEuler(new se(n.rotation[0],n.rotation[1],n.rotation[2],"ZYX")),c=u.clone().invert(),f=new y(...n.scale.map(l=>l===0?0:1/l)),r=new y;return l=>{const m=a(l);switch(typeof m=="number"?r.setScalar(m):r.copy(m),n.vector_type??"POINT"){case"TEXTURE":return r.sub(i).applyQuaternion(c).multiply(f);case"VECTOR":return r.multiply(s).applyQuaternion(u);case"NORMAL":return r.multiply(f).applyQuaternion(u).normalize();case"POINT":return r.multiply(s).applyQuaternion(u).add(i)}}}if(n.kind==="map_range"){const a=Z(n.value,t),i=Z(n.from_min,t),s=Z(n.from_max,t),u=Z(n.to_min,t),c=Z(n.to_max,t),f=Z(n.steps,t),r=(h,d)=>{const _=h(d);if(typeof _!="number")throw new Error("World Map Range needs scalar inputs");return _},l=n.interpolation,m=n.clamp;return h=>{const d=r(a,h),_=r(i,h),p=r(s,h),v=r(u,h),g=r(c,h);if(_===p)return 0;let b;if(l==="STEPPED"){const D=r(f,h),w=(d-_)/(p-_);b=D>0?Math.floor(w*(D+1))/D:0}else if(l==="SMOOTHSTEP"||l==="SMOOTHERSTEP"){const D=it.clamp((d-Math.min(_,p))/(Math.max(_,p)-Math.min(_,p)),0,1),w=l==="SMOOTHSTEP"?D*D*(3-2*D):D*D*D*(D*(D*6-15)+10);b=_>p?1-w:w}else b=(d-_)/(p-_);const P=v+b*(g-v);return m?v>g?it.clamp(P,g,v):it.clamp(P,v,g):P}}if(n.kind==="separate"){const a=Z(n.vector,t);return i=>{const s=a(i);return typeof s=="number"?s:s.getComponent(n.axis)}}const o=Z(n.factor,t),e=new y;return a=>{const i=o(a);if(typeof i!="number")throw new Error("World ColorRamp needs a scalar factor");const s=it.clamp(i,0,1)*256,u=Math.floor(s),c=n.colors[u],f=n.colors[Math.min(u+1,256)],r=n.interpolate?s-u:0;return e.set(it.lerp(c[0],f[0],r),it.lerp(c[1],f[1],r),it.lerp(c[2],f[2],r))}}function ja(n,t,o,e){const a=new Float32Array(t*o*3),i=Z(n,e),s=new y;for(let u=0;u<o;u++){const c=((u+.5)/o-.5)*Math.PI;for(let f=0;f<t;f++){const r=((f+.5)/t-.5)*2*Math.PI;s.set(Math.cos(c)*Math.cos(r),-Math.cos(c)*Math.sin(r),Math.sin(c));const l=i(s),m=(u*t+f)*3;a[m]=typeof l=="number"?l:l.x,a[m+1]=typeof l=="number"?l:l.y,a[m+2]=typeof l=="number"?l:l.z}}return a}function co(n){const t=[],o=e=>{if(!(typeof e=="number"||Array.isArray(e)))switch(e.kind){case"sky":t.push({sunElevation:e.sun_elevation,sunRotation:e.sun_rotation,altitude:e.altitude,airDensity:e.air_density,aerosolDensity:e.aerosol_density,ozoneDensity:e.ozone_density});return;case"mapping":case"gradient":case"separate":o(e.vector);return;case"ramp":o(e.factor);return;case"mix_color":o(e.factor),o(e.a),o(e.b);return;case"math":e.inputs.forEach(o);return;case"to_float":o(e.value);return;case"map_range":o(e.value),o(e.from_min),o(e.from_max),o(e.to_min),o(e.to_max),o(e.steps);return;default:return}};return o(n),t}function vt(n){if(typeof n=="number"||Array.isArray(n))return!1;switch(n.kind){case"window":return!0;case"mapping":case"gradient":case"separate":return vt(n.vector);case"ramp":return vt(n.factor);case"mix_color":return[n.factor,n.a,n.b].some(vt);case"math":return n.inputs.some(vt);case"to_float":return vt(n.value);case"map_range":return[n.value,n.from_min,n.from_max,n.to_min,n.to_max,n.steps].some(vt);default:return!1}}function Ba(n,t,o,e){e.updateMatrixWorld();const a=new Float32Array(t*o*3),i=new y,s=Z(n,()=>i),u=new y,c=e.getWorldPosition(new y),f=e.getWorldDirection(new y);for(let r=0;r<o;r++)for(let l=0;l<t;l++){const m=(l+.5)/t,h=(r+.5)/o;i.set(m,h,0),e.isOrthographicCamera?u.copy(f):u.set(m*2-1,h*2-1,.5).unproject(e).sub(c).normalize(),u.set(u.x,-u.z,u.y);const d=s(u),_=(r*t+l)*3;a[_]=typeof d=="number"?d:d.x,a[_+1]=typeof d=="number"?d:d.y,a[_+2]=typeof d=="number"?d:d.z}return a}const G=R().finite(),Ua=O({type:X(["POINT","SUN","SPOT","AREA"]),color:j([G,G,G]),energy:G,use_shadow:Y().default(!0),radius:G.optional(),spot_size:G.optional(),spot_blend:G.optional(),shape:X(["SQUARE","RECTANGLE","DISK","ELLIPSE"]).optional(),size:G.optional(),size_y:G.optional()}).strict();let Cn;function qa(){return Cn??=Le(async()=>{const{RectAreaLightUniformsLib:n}=await import("./RectAreaLightUniformsLib-CwcuoVqt.js");return{RectAreaLightUniformsLib:n}},__vite__mapDeps([0,1])).then(({RectAreaLightUniformsLib:n})=>{n.init(),Jt()}),Cn}function Ha(){return Cn??Promise.resolve()}const Wa=n=>{const t=n.size??0,o=n.size_y??t;if(n.shape==="RECTANGLE")return[t,o];if(n.shape==="DISK"){const e=Math.sqrt(Math.PI*t*t/4);return[e,e]}if(n.shape==="ELLIPSE"){const e=Math.sqrt(Math.PI/4);return[t*e,o*e]}return[t,t]};function Ga(n,t){const o=(s,u)=>t&&u(t)?t:new s;if(n.type==="SUN"){const s=o(So,u=>u.isDirectionalLight);return s.intensity=n.energy,s.color.setRGB(n.color[0],n.color[1],n.color[2],at),s.castShadow=n.use_shadow,s}if(n.type==="POINT"){const s=o(Sn,u=>u.isPointLight);return s.intensity=n.energy/(4*Math.PI),s.distance=0,s.decay=2,s.color.setRGB(n.color[0],n.color[1],n.color[2],at),s.castShadow=n.use_shadow,s}if(n.type==="SPOT"){const s=o(En,u=>u.isSpotLight);return s.intensity=n.energy/(4*Math.PI),s.distance=0,s.decay=2,s.angle=(n.spot_size??0)/2,s.penumbra=n.spot_blend??0,s.color.setRGB(n.color[0],n.color[1],n.color[2],at),s.castShadow=n.use_shadow,s}qa();const e=o(rn,s=>s.isRectAreaLight),[a,i]=Wa(n);return e.width=a,e.height=i,e.intensity=n.energy/(Math.max(a*i,Number.MIN_VALUE)*Math.PI),e.color.setRGB(n.color[0],n.color[1],n.color[2],at),e}function Xa(n,t,o){if(!n.castShadow||o<=0)return;const a=n.getWorldPosition(new y).distanceTo(t),i=n.shadow;if(!i)return;const s=i.camera;s.near=Math.max(o*.001,a-o),s.far=a+o,n.isDirectionalLight&&(s.left=-o,s.right=o,s.top=o,s.bottom=-o),s.updateProjectionMatrix()}function Ya(n,t){n.position.set(0,0,0);const o=n;n.isRectAreaLight||o.target&&o.target.parent!==t&&(o.target.position.set(0,0,-1),t.add(o.target))}const Za=[{direction:[-.352546,.170931,-.920051],diffuse:[.033103,.033103,.033103],smooth:.52662},{direction:[-.408163,.346939,.844415],diffuse:[.521083,.538226,.538226],smooth:0},{direction:[.521739,.826087,.212999],diffuse:[.038403,.034357,.04953],smooth:.478261},{direction:[.624519,-.562067,-.542269],diffuse:[.090838,.08208,.072255],smooth:.2}],uo=.69;class Qa{constructor(){this.group=new _t,this.lights=[],this.group.name="BlenderSolidStudio";const t=new Ao;t.name="BlenderSolidStudioTarget",this.group.add(t);const o=new gt(0,0,0);for(const[a,i]of Za.entries()){const s=(1+i.smooth)**2,u=new So(16777215,Math.PI*uo/s);u.name=`BlenderSolidLight${a}`,u.color.setRGB(i.diffuse[0],i.diffuse[1],i.diffuse[2],at),u.position.set(i.direction[0],i.direction[1],i.direction[2]),u.target=t,this.group.add(u),this.lights.push(u),o.r+=i.diffuse[0]*i.smooth/s,o.g+=i.diffuse[1]*i.smooth/s,o.b+=i.diffuse[2]*i.smooth/s}const e=new fe(16777215,Math.PI*uo);e.name="BlenderSolidWrapFill",e.color.copy(o),this.group.add(e),this.lights.push(e)}setRendered(t){this.group.visible=!t}dispose(){for(const t of this.lights)t.dispose();this.group.clear()}}const It=j([G,G,G]),B=Io(()=>Nt([G,It,O({kind:L("direction")}).strict(),O({kind:L("window")}).strict(),O({kind:L("gradient"),gradient_type:X(["LINEAR","QUADRATIC","EASING","DIAGONAL","SPHERICAL","QUADRATIC_SPHERE","RADIAL"]),output:X(["Fac","Color"]),vector:B}).strict(),O({kind:L("to_float"),source_type:X(["RGBA","VECTOR"]),value:B}).strict(),O({kind:L("math"),operation:X(Object.keys(Uo)),clamp:Y(),inputs:z(B).min(1).max(3)}).strict(),O({kind:L("mix_color"),factor:B,a:B,b:B,clamp_factor:Y(),clamp_result:Y()}).strict(),O({kind:L("mapping"),vector_type:X(["POINT","TEXTURE","VECTOR","NORMAL"]).optional(),vector:B,location:It,rotation:It,scale:It}).strict(),O({kind:L("separate"),vector:B,axis:R().int().min(0).max(2)}).strict(),O({kind:L("ramp"),factor:B,colors:z(It).length(257),interpolate:Y()}).strict(),O({kind:L("map_range"),interpolation:X(["LINEAR","STEPPED","SMOOTHSTEP","SMOOTHERSTEP"]),clamp:Y(),value:B,from_min:B,from_max:B,to_min:B,to_max:B,steps:B}).strict(),O({kind:L("sky"),sun_elevation:G,sun_rotation:G,altitude:G,air_density:G,aerosol_density:G,ozone_density:G}).strict()])),_o=O({color:It,strength:G,shader:B.optional()}),Ka=_o.extend({volume:z(O({kind:X(["absorption","scatter","principled","emission"]),phase:A(),alpha:B,weight:B,color:B,density:B,anisotropy:B,absorption_color:B,emission_color:B,emission_strength:B,blackbody_intensity:B,temperature:B,blackbody_tint:B}).strict()).optional(),lighting:_o.strict().optional()}).strict(),Ja=4,qt=new Map,wn=new Set;function mo(n,t,o){const i=vt(n);if(i&&!o)throw new Error("World Window coordinates need a render camera");o?.updateMatrixWorld();const s=JSON.stringify([n,i?[o.matrixWorld.elements,o.projectionMatrix.elements]:null]),u=qt.get(s);if(u!==void 0)return kn(u,t,256,128);const c=new y,f=new Eo,r=o?new mt().multiplyMatrices(o.projectionMatrix,o.matrixWorldInverse):null,l=o?.getWorldPosition(new y),h=ja(n,256,128,i?d=>(c.set(d.x,d.z,-d.y),o.isPerspectiveCamera&&c.add(l),f.set(c.x,c.y,c.z,1).applyMatrix4(r),f.w===0?c.set(0,0,0):c.set(f.x/f.w*.5+.5,f.y/f.w*.5+.5,0)):void 0);return qt.set(s,h),qt.size>Ja&&qt.delete(qt.keys().next().value),kn(h,t,256,128)}function tl(n,t,o,e){const a=Wt.toHalfFloat(1);for(let i=0;i<e;i++)n[i*4]=Wt.toHalfFloat(t[i*3]*o),n[i*4+1]=Wt.toHalfFloat(t[i*3+1]*o),n[i*4+2]=Wt.toHalfFloat(t[i*3+2]*o),n[i*4+3]=a}function kn(n,t,o,e){const a=new Uint16Array(o*e*4);tl(a,n,t,o*e);const i=new mn(a,o,e,dn,jn);return i.mapping=ue,i.colorSpace=at,i.minFilter=St,i.magFilter=St,i.needsUpdate=!0,i}class Hn{constructor(){this.pending=null,this.texture=null,this.environmentTexture=null,this.screenTexture=null,this.applied=null,this.generation=0}async ready(){await this.pending}static sceneOf(t){let o=t;for(;o;){if(o.isScene)return o;o=o.parent}return null}apply(t,o,e){if(this.clear(),this.pending=null,!o)return;const a=Hn.sceneOf(t);if(!a)return;this.applied={scene:a,background:a.background,environment:a.environment};const i=o.shader??o.color,s=this.generation,c=[...co(i),...o.lighting?co(o.lighting.shader??o.lighting.color):[]].filter(r=>!Da(r));if(c.length===0){this.compose(a,o,i,e);return}const f=(async()=>{const r=await Promise.all(c.map(La));c.forEach((l,m)=>{Bo(l,r[m])}),!(this.generation!==s||this.applied?.scene!==a)&&(this.compose(a,o,i,e),Jt())})();this.pending=f,wn.add(f),f.then(()=>wn.delete(f),()=>wn.delete(f))}compose(t,o,e,a){if(this.texture=mo(e,o.strength,a),vt(e)){if(!a)throw new Error("World Window coordinates need a render camera");this.screenTexture=kn(Ba(e,512,512,a),o.strength,512,512),this.screenTexture.mapping=ce,t.background=this.screenTexture}else if(a&&a.isOrthographicCamera){const s=a.getWorldDirection(new y);s.set(s.x,-s.z,s.y);const u=Z(o.shader??o.color)(s);t.background=typeof u=="number"?new gt().setRGB(u,u,u).multiplyScalar(o.strength):new gt().setRGB(u.x,u.y,u.z).multiplyScalar(o.strength)}else t.background=this.texture;const{lighting:i}=o;this.environmentTexture=i?mo(i.shader??i.color,i.strength,a):null,t.environment=this.environmentTexture??this.texture}clear(){this.generation++,this.applied&&(this.applied.scene.background=this.applied.background,this.applied.scene.environment=this.applied.environment,this.applied=null,this.texture?.dispose(),this.texture=null,this.environmentTexture?.dispose(),this.environmentTexture=null,this.screenTexture?.dispose(),this.screenTexture=null)}dispose(){this.clear()}}function qo(n){return[n.min.x,n.max.x].flatMap(t=>[n.min.y,n.max.y].flatMap(o=>[n.min.z,n.max.z].map(e=>new y(t,o,e))))}function nl(n,t){if(n.isEmpty()||!t.intersectsBox(n))return[];const o=qo(n);if(o.every(r=>t.containsPoint(r)))return o;const e=[...t.planes,new Mt(new y(1,0,0),-n.min.x),new Mt(new y(-1,0,0),n.max.x),new Mt(new y(0,1,0),-n.min.y),new Mt(new y(0,-1,0),n.max.y),new Mt(new y(0,0,1),-n.min.z),new Mt(new y(0,0,-1),n.max.z)],a=[],i=new y,s=new y,u=new y,c=new y,f=Math.max(1,n.min.length(),n.max.length())*1e-8;for(let r=0;r<e.length;r++)for(let l=r+1;l<e.length;l++)for(let m=l+1;m<e.length;m++){const h=e[r],d=e[l],_=e[m];i.crossVectors(d.normal,_.normal);const p=h.normal.dot(i);Math.abs(p)<1e-12||(s.crossVectors(_.normal,h.normal),u.crossVectors(h.normal,d.normal),c.copy(i).multiplyScalar(-h.constant).addScaledVector(s,-d.constant).addScaledVector(u,-_.constant).divideScalar(p),e.every(v=>v.distanceToPoint(c)>=-f)&&a.push(c.clone()))}return a}function ol(n,t,o){if(!n.castShadow||!t.length)return;n.shadow.updateMatrices(n);const e=n.shadow.camera,a=e.matrixWorldInverse,i=new fn().setFromPoints(t.map(m=>m.clone().applyMatrix4(a))),s=i.getSize(new y),u=Math.max(s.length()*1e-6,Number.EPSILON),c=2+2*Math.SQRT2,f=Math.max(s.x,s.y,u)/Math.max(1,Math.min(n.shadow.mapSize.x,n.shadow.mapSize.y)-2*c),r=2*Math.SQRT2*f,l=c*f;i.min.x-=l,i.min.y-=l,i.max.x+=l,i.max.y+=l;for(const m of o){if(m.isEmpty())continue;const h=new fn().setFromPoints(qo(m).map(d=>d.applyMatrix4(a)));h.max.x<i.min.x||h.min.x>i.max.x||h.max.y<i.min.y||h.min.y>i.max.y||(i.min.z=Math.min(i.min.z,h.min.z),i.max.z=Math.max(i.max.z,h.max.z))}e.left=i.min.x,e.right=i.max.x,e.bottom=i.min.y,e.top=i.max.y,e.near=-i.max.z-r-u,e.far=-i.min.z+r+u,e.updateProjectionMatrix(),n.shadow.normalBias=r}const Ct=R().finite(),ho=j([Ct,Ct,Ct]),Ho=O({min:j([R().int(),R().int(),R().int()]),max:j([R().int(),R().int(),R().int()]),density:z(Ct),voxelSize:Ct.positive(),color:ho,emission:ho,densityScale:Ct.nonnegative()}).strict();function el(n){const t=n.max.map((r,l)=>r-n.min[l]+1);if(t.some(r=>r<=0)||t.reduce((r,l)=>r*l,1)!==n.density.length)throw new Error("Volume density dimensions do not match the evaluated grid");const o=new _e(new Float32Array(n.density),t[0],t[1],t[2]);o.format=me,o.type=No,o.minFilter=o.magFilter=St,o.unpackAlignment=1,o.needsUpdate=!0;const e=new y(...n.min).addScalar(-.5).multiplyScalar(n.voxelSize),a=new y(t[0],t[1],t[2]).multiplyScalar(n.voxelSize),i=new de(a.x,a.y,a.z),s=i.getAttribute("position");for(let r=0;r<s.count;r++)s.setXYZ(r,e.x+(s.getX(r)>0?a.x:0),e.y+(s.getY(r)>0?a.y:0),e.z+(s.getZ(r)>0?a.z:0));s.needsUpdate=!0,i.computeBoundingBox(),i.computeBoundingSphere();const u=new Vn({glslVersion:pe,side:he,transparent:!0,depthWrite:!1,premultipliedAlpha:!0,uniforms:{densityGrid:{value:o},minimum:{value:e},extent:{value:a},voxelSize:{value:n.voxelSize},densityScale:{value:n.densityScale},volumeColor:{value:new y(...n.color)},emission:{value:new y(...n.emission)},cameraLocal:{value:new y},rayLocal:{value:new y},orthographic:{value:!1},worldScale:{value:new Oo}},vertexShader:`
20
20
  out vec3 localPosition;
21
21
  void main() {
22
22
  localPosition = position;
@@ -58,7 +58,7 @@ import{a as ne,b as oe,L as ee}from"./LineSegments2-CsOpKSiM.js";import{aX as _t
58
58
  outputColor = vec4(radiance, 1.0 - transmission);
59
59
  #include <tonemapping_fragment>
60
60
  #include <colorspace_fragment>
61
- }`}),u=new At(i,c),f=new mt;return u.onBeforeRender=(r,l,m)=>{f.copy(u.matrixWorld).invert(),c.uniforms.cameraLocal.value.setFromMatrixPosition(m.matrixWorld).applyMatrix4(f),m.getWorldDirection(c.uniforms.rayLocal.value).transformDirection(f),c.uniforms.orthographic.value=!!m.isOrthographicCamera,c.uniforms.worldScale.value.setFromMatrix4(u.matrixWorld)},c.addEventListener("dispose",()=>o.dispose()),u}const al=`#define constexpr const
61
+ }`}),c=new At(i,u),f=new mt;return c.onBeforeRender=(r,l,m)=>{f.copy(c.matrixWorld).invert(),u.uniforms.cameraLocal.value.setFromMatrixPosition(m.matrixWorld).applyMatrix4(f),m.getWorldDirection(u.uniforms.rayLocal.value).transformDirection(f),u.uniforms.orthographic.value=!!m.isOrthographicCamera,u.uniforms.worldScale.value.setFromMatrix4(c.matrixWorld)},u.addEventListener("dispose",()=>o.dispose()),c}const al=`#define constexpr const
62
62
  #define bool32_t bool
63
63
  #define bool2 bvec2
64
64
  #define bool3 bvec3
@@ -7017,11 +7017,11 @@ vec3 blender_reflection() {
7017
7017
  : normalize(cameraPosition - vBlenderWorldPosition);
7018
7018
  return blender_from_three * -reflect(incident, normalize(vBlenderWorldNormal));
7019
7019
  }
7020
- `;class Wn{constructor(t,o,e=!1,a="bgN"){this.graph=t,this.derivative=e,this.prefix=a,this.lines=[],this.emitted=new Map,this.s=o??{files:new Set,uniforms:new Map,uniformTypes:new Map,images:[],ramps:[],uvs:new Set,attributes:new Set,structure:[],functions:[]}}get uniforms(){return this.s.uniforms}get images(){return this.s.images}get ramps(){return this.s.ramps}d(t){return this.derivative?`(${t} + dF_impl(${t}))`:t}uniform(t,o){const e=`bgU${this.s.uniforms.size}`,a=cl(t,o);return this.s.uniforms.set(e,t==="float"?a[0]:a),this.s.uniformTypes.set(e,t),e}use(t){const o=vl.get(t);if(!o)throw new Error(`Blender's node library has no ${t}`);return this.s.files.add(o),t}source(t,o){if("value"in t)return this.s.structure.push("v"),this.uniform(o,t.value);const[e,a]=t.link,i=this.graph.nodes[e];if(!i)throw new Error(`The graph links to ${e}, which it does not carry`);const c=this.node(e,i)[a];if(!c)throw new Error(`${e} has no output ${a}`);return this.s.structure.push(["l",e,a]),ul(c.name,c.type,o)}input(t,o,e){const a=t.inputs.find(i=>i.id===o)??t.inputs.find(i=>i.id.replace(/_/g," ")===o);if(!a)throw new Error(`${t.type} arrived without its '${o}' input`);return this.source(a,e??a.gpu)}coordinate(t,o){const e=t.inputs[0];return"link"in e?this.source(e,"vec3"):(this.s.structure.push(["default",o]),o==="orco"?this.d("blender_orco()"):(this.s.uvs.add(""),this.d(`vec3(${zt("")}, 0.0)`)))}node(t,o){const e=this.emitted.get(t);if(e)return e;const a=`${this.prefix}${this.emitted.size}`,i=o.outputs.map((l,m)=>({name:`${a}_${m}`,type:l.gpu==="closure"||l.gpu===null?"float":l.gpu}));this.emitted.set(t,i);const s=l=>`${i[l].type} ${i[l].name} = ${i[l].type}(0.0);`,c=i.map((l,m)=>s(m)).join(" "),u=l=>l.map(m=>i[m].name).join(", "),f=(l=[])=>[...o.inputs.map(h=>this.source(h,h.gpu)),...l,...i.map(h=>h.name)].join(", ");this.s.structure.push(["n",o.type,o.props.operation,o.props.blend_type,o.props.data_type,o.props.factor_mode,o.props.clamp_factor,o.props.clamp_result,o.props.use_clamp,o.props.noise_dimensions,o.props.noise_type,o.props.voronoi_dimensions,o.props.feature,o.props.distance,o.props.vector_type,o.props.uv_map,o.props.extension,o.props.interpolation,o.props.image_alpha_mode,o.props.image_is_data,o.props.color_ramp?.elements?.length,o.props.color_ramp?.interpolation]);const r=[c];switch(o.type){case"ShaderNodeValue":case"ShaderNodeRGB":{const l=i[0].type;r.push(`${i[0].name} = ${this.uniform(l,N(o,"value"))};`);break}case"ShaderNodeTexCoord":{this.s.uvs.add(""),["blender_orco()","blender_object_normal()",`vec3(${zt("")}, 0.0)`,"vBlenderObjectPosition","blender_camera()","blender_window()","blender_reflection()"].forEach((m,h)=>{i[h]&&r.push(`${i[h].name} = ${this.d(m)};`)});break}case"ShaderNodeVertexColor":case"ShaderNodeAttribute":{const l=N(o,o.type==="ShaderNodeAttribute"?"attribute_name":"layer_name");this.s.attributes.add(l),this.s.structure.push(["a",l]);const m=o.type==="ShaderNodeAttribute"?"node_attribute":"node_vertex_color";r.push(`${this.use(m)}(${Ln(l)}, ${u(i.map((h,d)=>d))});`);for(const h of i)r.push(`${h.name} = ${this.d(h.name)};`);break}case"ShaderNodeUVMap":{const l=N(o,"uv_map");this.s.uvs.add(l),r.push(`${i[0].name} = ${this.d(`vec3(${zt(l)}, 0.0)`)};`);break}case"ShaderNodeMath":{const l=N(o,"operation"),m=this.use(_l[l]??`math_${l.toLowerCase()}`);r.push(`${m}(${f()});`),N(o,"use_clamp")&&r.push(`${this.use("clamp_value")}(${u([0])}, 0.0, 1.0, ${u([0])});`);break}case"ShaderNodeVectorMath":{const l=N(o,"operation");r.push(`${this.use(ml[l]??`vector_math_${l.toLowerCase()}`)}(${f()});`);break}case"ShaderNodeMapping":r.push(`${this.use(`mapping_${N(o,"vector_type").toLowerCase()}`)}(${f()});`);break;case"ShaderNodeInvert":r.push(`${this.use("invert")}(${f()});`);break;case"ShaderNodeSeparateXYZ":r.push(`${this.use("separate_xyz")}(${f()});`);break;case"ShaderNodeCombineXYZ":r.push(`${this.use("combine_xyz")}(${f()});`);break;case"ShaderNodeMix":{const l=N(o,"data_type"),m=N(o,"factor_mode")==="NON_UNIFORM",h={FLOAT:"Float",VECTOR:"Vector",RGBA:"Color",ROTATION:"Rotation"}[l];if(!h)throw new Error(`Mix has data type ${l}`);const d=l==="VECTOR"&&m;let _=this.input(o,d?"Factor_Vector":"Factor_Float");if(N(o,"clamp_factor")){const p=`${a}_fac`;r.push(d?`vec3 ${p}; ${this.use("node_mix_clamp_vector")}(${_}, vec3(0.0), vec3(1.0), ${p});`:`float ${p}; ${this.use("node_mix_clamp_value")}(${_}, 0.0, 1.0, ${p});`),_=p}const v=l==="FLOAT"?"node_mix_float":l==="VECTOR"?m?"node_mix_vector_non_uniform":"node_mix_vector":l==="RGBA"?`node_mix_${vo[N(o,"blend_type")]}`:"node_mix_rotation",g=o.outputs.findIndex(p=>p.id===`Result_${h}`);r.push(`${this.use(v)}(${_}, ${this.input(o,`A_${h}`)}, ${this.input(o,`B_${h}`)}, ${u([g])});`),l==="RGBA"&&N(o,"clamp_result")&&r.push(`${this.use("node_mix_clamp_color")}(${u([g])}, vec4(0.0), vec4(1.0), ${u([g])});`);break}case"ShaderNodeMixRGB":{const l=`${a}_fac`;r.push(`float ${l}; ${this.use("clamp_value")}(${this.input(o,"Fac")}, 0.0, 1.0, ${l});`);const m=o.inputs.slice(1).map(h=>this.source(h,h.gpu));r.push(`${this.use(`mix_${vo[N(o,"blend_type")]}`)}(${[l,...m,u([0])].join(", ")});`),N(o,"use_clamp")&&r.push(`${this.use("clamp_color")}(${u([0])}, vec4(0.0), vec4(1.0), ${u([0])});`);break}case"ShaderNodeValToRGB":{const l=N(o,"color_ramp"),m=this.input(o,"Fac"),[h,d]=l.elements,_=v=>this.uniform("vec4",v.slice(1,5));if(l.elements.length===1)r.push(`${u([0])} = ${_(h)}; ${u([1])} = ${u([0])}.a;`);else if(l.elements.length===2&&l.color_mode==="RGB"&&d&&l.interpolation!=="B_SPLINE"&&l.interpolation!=="CARDINAL")if(l.interpolation==="CONSTANT")r.push(`${this.use("valtorgb_opti_constant")}(${m}, ${this.uniform("float",Math.max(h[0],d[0]))}, ${_(h)}, ${_(d)}, ${u([0,1])});`);else{const v=1/(d[0]-h[0]),g=l.interpolation==="EASE"?"valtorgb_opti_ease":"valtorgb_opti_linear";r.push(`${this.use(g)}(${m}, ${this.uniform("vec2",[v,-v*h[0]])}, ${_(h)}, ${_(d)}, ${u([0,1])});`)}else{const v=`bgRamp${this.s.ramps.length}`;this.s.ramps.push({uniform:v,table:l.table}),this.s.structure.push(["ramp",l.interpolation==="CONSTANT"]),r.push(l.interpolation==="CONSTANT"?`${u([0])} = texelFetch(${v}, ivec2(int(clamp(${m}, 0.0, 1.0) * 256.0), 0), 0);`:`${u([0])} = texture(${v}, vec2(clamp(${m}, 0.0, 1.0) * (256.0 / 257.0) + 0.5 / 257.0, 0.5));`),r.push(`${u([1])} = ${u([0])}.a;`)}break}case"ShaderNodeRGBCurve":case"ShaderNodeVectorCurve":case"ShaderNodeFloatCurve":{const l=N(o,"curve_mapping"),m=`bgRamp${this.s.ramps.length}`;this.s.ramps.push({uniform:m,table:l.table}),this.s.structure.push(["curve"]);const h=this.input(o,o.inputs.some(d=>d.id==="Factor")?"Factor":"Fac","float");o.type==="ShaderNodeRGBCurve"?r.push(`${this.use("curves_combined_rgb")}(${h}, ${this.input(o,"Color","vec4")}, vec4(0.0, 0.0, 0.0, 1.0), vec4(1.0), ${m}, 0.5, ${this.uniform("vec4",l.minimums)}, ${this.uniform("vec4",l.dividers)}, ${this.uniform("vec4",l.starts)}, ${this.uniform("vec4",l.ends)}, ${u([0])});`):o.type==="ShaderNodeVectorCurve"?r.push(`${this.use("curves_vector_mixed")}(${h}, ${this.input(o,"Vector","vec3")}, ${m}, 0.5, ${this.uniform("vec3",l.minimums.slice(0,3))}, ${this.uniform("vec3",l.dividers.slice(0,3))}, ${this.uniform("vec3",l.starts.slice(0,3))}, ${this.uniform("vec3",l.ends.slice(0,3))}, ${u([0])});`):r.push(`${this.use("curves_float_mixed")}(${h}, ${this.input(o,"Value","float")}, ${m}, 0.5, ${this.uniform("float",l.minimums[0])}, ${this.uniform("float",l.dividers[0])}, ${this.uniform("float",l.starts[0])}, ${this.uniform("float",l.ends[0])}, ${u([0])});`);break}case"ShaderNodeTexNoise":{const l=Number(N(o,"noise_dimensions")[0]),m=this.use(`node_noise_tex_${dl[N(o,"noise_type")]}_${l}d`),h=this.coordinate(o,"orco"),d=o.inputs.slice(1).map(v=>this.source(v,v.gpu)),_=N(o,"normalize")?"1.0":"0.0";r.push(`${m}(${[h,...d,_,"1.0",u(i.map((v,g)=>g))].join(", ")});`);break}case"ShaderNodeTexVoronoi":{const l=Number(N(o,"voronoi_dimensions")[0]),m=this.use(`node_tex_voronoi_${hl[N(o,"feature")]}_${l}d`),h=this.coordinate(o,"orco"),d=o.inputs.slice(1).map(g=>this.source(g,g.gpu)),_=`${pl[N(o,"distance")].toFixed(1)}`,v=N(o,"normalize")?"1.0":"0.0";r.push(`${m}(${[h,...d,_,v,u(i.map((g,p)=>p))].join(", ")});`);break}case"ShaderNodeTexChecker":{const l=this.coordinate(o,"orco"),m=o.inputs.slice(1).map(h=>this.source(h,h.gpu));r.push(`${this.use("node_tex_checker")}(${[l,...m,u(i.map((h,d)=>d))].join(", ")});`);break}case"ShaderNodeTexWhiteNoise":{const l=Number(N(o,"noise_dimensions")[0]);r.push(`${this.use(`node_white_noise_${l}d`)}(${f()});`);break}case"ShaderNodeTexWave":case"ShaderNodeTexGradient":case"ShaderNodeTexMagic":case"ShaderNodeTexBrick":{const l=this.coordinate(o,"orco"),m=o.inputs.slice(1).map(v=>this.source(v,v.gpu)),h=v=>N(o,`${v}#value`).toFixed(1),d=o.type==="ShaderNodeTexWave"?[h("wave_type"),h("bands_direction"),h("rings_direction"),h("wave_profile")]:o.type==="ShaderNodeTexGradient"?[h("gradient_type")]:o.type==="ShaderNodeTexMagic"?[N(o,"turbulence_depth").toFixed(1)]:[this.uniform("float",N(o,"offset")),N(o,"offset_frequency").toFixed(1),this.uniform("float",N(o,"squash")),N(o,"squash_frequency").toFixed(1)],_={ShaderNodeTexWave:"node_tex_wave",ShaderNodeTexGradient:"node_tex_gradient",ShaderNodeTexMagic:"node_tex_magic",ShaderNodeTexBrick:"node_tex_brick"}[o.type];r.push(`${this.use(_)}(${[l,...m,...d,u(i.map((v,g)=>g))].join(", ")});`);break}case"ShaderNodeMapRange":{const l=N(o,"data_type")==="FLOAT_VECTOR",m=N(o,"interpolation_type").toLowerCase(),h=N(o,"clamp");r.push(`${this.use(`${l?"vector_":""}map_range_${m}`)}(${f([h?"1.0":"0.0"])});`),h&&!l&&(m==="linear"||m==="stepped")&&r.push(`${this.use("clamp_range")}(${u([0])}, ${this.input(o,"To Min","float")}, ${this.input(o,"To Max","float")}, ${u([0])});`);break}case"ShaderNodeClamp":r.push(`${this.use(N(o,"clamp_type")==="MINMAX"?"clamp_minmax":"clamp_range")}(${f()});`);break;case"ShaderNodeHueSaturation":r.push(`${this.use("hue_sat")}(${f()});`);break;case"ShaderNodeBrightContrast":r.push(`${this.use("brightness_contrast")}(${f()});`);break;case"ShaderNodeGamma":r.push(`${this.use("node_gamma")}(${f()});`);break;case"ShaderNodeRGBToBW":r.push(`${this.use("rgbtobw")}(${f([Xo])});`);break;case"ShaderNodeSeparateColor":r.push(`${this.use(`separate_color_${N(o,"mode").toLowerCase()}`)}(${f()});`);break;case"ShaderNodeCombineColor":r.push(`${this.use(`combine_color_${N(o,"mode").toLowerCase()}`)}(${f()});`);break;case"ShaderNodeVectorRotate":{const l={AXIS_ANGLE:"axis_angle",X_AXIS:"axis_x",Y_AXIS:"axis_y",Z_AXIS:"axis_z",EULER_XYZ:"euler_xyz"}[N(o,"rotation_type")];r.push(`${this.use(`node_vector_rotate_${l}`)}(${f([N(o,"invert")?"-1.0":"1.0"])});`);break}case"ShaderNodeFresnel":case"ShaderNodeLayerWeight":{const l=o.inputs[1],m="link"in l?this.source(l,"vec3"):"g_data.N";"link"in l||this.s.structure.push("world-normal");const h=this.source(o.inputs[0],"float"),d=o.type==="ShaderNodeFresnel"?"node_fresnel":"node_layer_weight";r.push(`${this.use(d)}(${[h,m,u(i.map((_,v)=>v))].join(", ")});`);break}case"ShaderNodeBump":{const l=o.inputs.find(b=>b.id==="Height"),m=o.inputs.find(b=>b.id==="Normal"),h=m&&"link"in m?this.source(m,"vec3"):"g_data.N";if(!l||!("link"in l)){r.push(`${u([0])} = ${h};`);break}const d=`bgHeight${this.s.functions.length}`;this.s.functions.push("");const _=new Wn(this.graph,this.s,!0,`${d}_`),v=_.source(l,"float");this.s.functions[Number(d.slice(8))]=`float ${d}() {
7020
+ `;class Wn{constructor(t,o,e=!1,a="bgN"){this.graph=t,this.derivative=e,this.prefix=a,this.lines=[],this.emitted=new Map,this.s=o??{files:new Set,uniforms:new Map,uniformTypes:new Map,images:[],ramps:[],uvs:new Set,attributes:new Set,structure:[],functions:[]}}get uniforms(){return this.s.uniforms}get images(){return this.s.images}get ramps(){return this.s.ramps}d(t){return this.derivative?`(${t} + dF_impl(${t}))`:t}uniform(t,o){const e=`bgU${this.s.uniforms.size}`,a=cl(t,o);return this.s.uniforms.set(e,t==="float"?a[0]:a),this.s.uniformTypes.set(e,t),e}use(t){const o=vl.get(t);if(!o)throw new Error(`Blender's node library has no ${t}`);return this.s.files.add(o),t}source(t,o){if("value"in t)return this.s.structure.push("v"),this.uniform(o,t.value);const[e,a]=t.link,i=this.graph.nodes[e];if(!i)throw new Error(`The graph links to ${e}, which it does not carry`);const u=this.node(e,i)[a];if(!u)throw new Error(`${e} has no output ${a}`);return this.s.structure.push(["l",e,a]),ul(u.name,u.type,o)}input(t,o,e){const a=t.inputs.find(i=>i.id===o)??t.inputs.find(i=>i.id.replace(/_/g," ")===o);if(!a)throw new Error(`${t.type} arrived without its '${o}' input`);return this.source(a,e??a.gpu)}coordinate(t,o){const e=t.inputs[0];return"link"in e?this.source(e,"vec3"):(this.s.structure.push(["default",o]),o==="orco"?this.d("blender_orco()"):(this.s.uvs.add(""),this.d(`vec3(${zt("")}, 0.0)`)))}node(t,o){const e=this.emitted.get(t);if(e)return e;const a=`${this.prefix}${this.emitted.size}`,i=o.outputs.map((l,m)=>({name:`${a}_${m}`,type:l.gpu==="closure"||l.gpu===null?"float":l.gpu}));this.emitted.set(t,i);const s=l=>`${i[l].type} ${i[l].name} = ${i[l].type}(0.0);`,u=i.map((l,m)=>s(m)).join(" "),c=l=>l.map(m=>i[m].name).join(", "),f=(l=[])=>[...o.inputs.map(h=>this.source(h,h.gpu)),...l,...i.map(h=>h.name)].join(", ");this.s.structure.push(["n",o.type,o.props.operation,o.props.blend_type,o.props.data_type,o.props.factor_mode,o.props.clamp_factor,o.props.clamp_result,o.props.use_clamp,o.props.noise_dimensions,o.props.noise_type,o.props.voronoi_dimensions,o.props.feature,o.props.distance,o.props.vector_type,o.props.uv_map,o.props.extension,o.props.interpolation,o.props.image_alpha_mode,o.props.image_is_data,o.props.color_ramp?.elements?.length,o.props.color_ramp?.interpolation]);const r=[u];switch(o.type){case"ShaderNodeValue":case"ShaderNodeRGB":{const l=i[0].type;r.push(`${i[0].name} = ${this.uniform(l,N(o,"value"))};`);break}case"ShaderNodeTexCoord":{this.s.uvs.add(""),["blender_orco()","blender_object_normal()",`vec3(${zt("")}, 0.0)`,"vBlenderObjectPosition","blender_camera()","blender_window()","blender_reflection()"].forEach((m,h)=>{i[h]&&r.push(`${i[h].name} = ${this.d(m)};`)});break}case"ShaderNodeVertexColor":case"ShaderNodeAttribute":{const l=N(o,o.type==="ShaderNodeAttribute"?"attribute_name":"layer_name");this.s.attributes.add(l),this.s.structure.push(["a",l]);const m=o.type==="ShaderNodeAttribute"?"node_attribute":"node_vertex_color";r.push(`${this.use(m)}(${Ln(l)}, ${c(i.map((h,d)=>d))});`);for(const h of i)r.push(`${h.name} = ${this.d(h.name)};`);break}case"ShaderNodeUVMap":{const l=N(o,"uv_map");this.s.uvs.add(l),r.push(`${i[0].name} = ${this.d(`vec3(${zt(l)}, 0.0)`)};`);break}case"ShaderNodeMath":{const l=N(o,"operation"),m=this.use(_l[l]??`math_${l.toLowerCase()}`);r.push(`${m}(${f()});`),N(o,"use_clamp")&&r.push(`${this.use("clamp_value")}(${c([0])}, 0.0, 1.0, ${c([0])});`);break}case"ShaderNodeVectorMath":{const l=N(o,"operation");r.push(`${this.use(ml[l]??`vector_math_${l.toLowerCase()}`)}(${f()});`);break}case"ShaderNodeMapping":r.push(`${this.use(`mapping_${N(o,"vector_type").toLowerCase()}`)}(${f()});`);break;case"ShaderNodeInvert":r.push(`${this.use("invert")}(${f()});`);break;case"ShaderNodeSeparateXYZ":r.push(`${this.use("separate_xyz")}(${f()});`);break;case"ShaderNodeCombineXYZ":r.push(`${this.use("combine_xyz")}(${f()});`);break;case"ShaderNodeMix":{const l=N(o,"data_type"),m=N(o,"factor_mode")==="NON_UNIFORM",h={FLOAT:"Float",VECTOR:"Vector",RGBA:"Color",ROTATION:"Rotation"}[l];if(!h)throw new Error(`Mix has data type ${l}`);const d=l==="VECTOR"&&m;let _=this.input(o,d?"Factor_Vector":"Factor_Float");if(N(o,"clamp_factor")){const g=`${a}_fac`;r.push(d?`vec3 ${g}; ${this.use("node_mix_clamp_vector")}(${_}, vec3(0.0), vec3(1.0), ${g});`:`float ${g}; ${this.use("node_mix_clamp_value")}(${_}, 0.0, 1.0, ${g});`),_=g}const p=l==="FLOAT"?"node_mix_float":l==="VECTOR"?m?"node_mix_vector_non_uniform":"node_mix_vector":l==="RGBA"?`node_mix_${vo[N(o,"blend_type")]}`:"node_mix_rotation",v=o.outputs.findIndex(g=>g.id===`Result_${h}`);r.push(`${this.use(p)}(${_}, ${this.input(o,`A_${h}`)}, ${this.input(o,`B_${h}`)}, ${c([v])});`),l==="RGBA"&&N(o,"clamp_result")&&r.push(`${this.use("node_mix_clamp_color")}(${c([v])}, vec4(0.0), vec4(1.0), ${c([v])});`);break}case"ShaderNodeMixRGB":{const l=`${a}_fac`;r.push(`float ${l}; ${this.use("clamp_value")}(${this.input(o,"Fac")}, 0.0, 1.0, ${l});`);const m=o.inputs.slice(1).map(h=>this.source(h,h.gpu));r.push(`${this.use(`mix_${vo[N(o,"blend_type")]}`)}(${[l,...m,c([0])].join(", ")});`),N(o,"use_clamp")&&r.push(`${this.use("clamp_color")}(${c([0])}, vec4(0.0), vec4(1.0), ${c([0])});`);break}case"ShaderNodeValToRGB":{const l=N(o,"color_ramp"),m=this.input(o,"Fac"),[h,d]=l.elements,_=p=>this.uniform("vec4",p.slice(1,5));if(l.elements.length===1)r.push(`${c([0])} = ${_(h)}; ${c([1])} = ${c([0])}.a;`);else if(l.elements.length===2&&l.color_mode==="RGB"&&d&&l.interpolation!=="B_SPLINE"&&l.interpolation!=="CARDINAL")if(l.interpolation==="CONSTANT")r.push(`${this.use("valtorgb_opti_constant")}(${m}, ${this.uniform("float",Math.max(h[0],d[0]))}, ${_(h)}, ${_(d)}, ${c([0,1])});`);else{const p=1/(d[0]-h[0]),v=l.interpolation==="EASE"?"valtorgb_opti_ease":"valtorgb_opti_linear";r.push(`${this.use(v)}(${m}, ${this.uniform("vec2",[p,-p*h[0]])}, ${_(h)}, ${_(d)}, ${c([0,1])});`)}else{const p=`bgRamp${this.s.ramps.length}`;this.s.ramps.push({uniform:p,table:l.table}),this.s.structure.push(["ramp",l.interpolation==="CONSTANT"]),r.push(l.interpolation==="CONSTANT"?`${c([0])} = texelFetch(${p}, ivec2(int(clamp(${m}, 0.0, 1.0) * 256.0), 0), 0);`:`${c([0])} = texture(${p}, vec2(clamp(${m}, 0.0, 1.0) * (256.0 / 257.0) + 0.5 / 257.0, 0.5));`),r.push(`${c([1])} = ${c([0])}.a;`)}break}case"ShaderNodeRGBCurve":case"ShaderNodeVectorCurve":case"ShaderNodeFloatCurve":{const l=N(o,"curve_mapping"),m=`bgRamp${this.s.ramps.length}`;this.s.ramps.push({uniform:m,table:l.table}),this.s.structure.push(["curve"]);const h=this.input(o,o.inputs.some(d=>d.id==="Factor")?"Factor":"Fac","float");o.type==="ShaderNodeRGBCurve"?r.push(`${this.use("curves_combined_rgb")}(${h}, ${this.input(o,"Color","vec4")}, vec4(0.0, 0.0, 0.0, 1.0), vec4(1.0), ${m}, 0.5, ${this.uniform("vec4",l.minimums)}, ${this.uniform("vec4",l.dividers)}, ${this.uniform("vec4",l.starts)}, ${this.uniform("vec4",l.ends)}, ${c([0])});`):o.type==="ShaderNodeVectorCurve"?r.push(`${this.use("curves_vector_mixed")}(${h}, ${this.input(o,"Vector","vec3")}, ${m}, 0.5, ${this.uniform("vec3",l.minimums.slice(0,3))}, ${this.uniform("vec3",l.dividers.slice(0,3))}, ${this.uniform("vec3",l.starts.slice(0,3))}, ${this.uniform("vec3",l.ends.slice(0,3))}, ${c([0])});`):r.push(`${this.use("curves_float_mixed")}(${h}, ${this.input(o,"Value","float")}, ${m}, 0.5, ${this.uniform("float",l.minimums[0])}, ${this.uniform("float",l.dividers[0])}, ${this.uniform("float",l.starts[0])}, ${this.uniform("float",l.ends[0])}, ${c([0])});`);break}case"ShaderNodeTexNoise":{const l=Number(N(o,"noise_dimensions")[0]),m=this.use(`node_noise_tex_${dl[N(o,"noise_type")]}_${l}d`),h=this.coordinate(o,"orco"),d=o.inputs.slice(1).map(p=>this.source(p,p.gpu)),_=N(o,"normalize")?"1.0":"0.0";r.push(`${m}(${[h,...d,_,"1.0",c(i.map((p,v)=>v))].join(", ")});`);break}case"ShaderNodeTexVoronoi":{const l=Number(N(o,"voronoi_dimensions")[0]),m=this.use(`node_tex_voronoi_${hl[N(o,"feature")]}_${l}d`),h=this.coordinate(o,"orco"),d=o.inputs.slice(1).map(v=>this.source(v,v.gpu)),_=`${pl[N(o,"distance")].toFixed(1)}`,p=N(o,"normalize")?"1.0":"0.0";r.push(`${m}(${[h,...d,_,p,c(i.map((v,g)=>g))].join(", ")});`);break}case"ShaderNodeTexChecker":{const l=this.coordinate(o,"orco"),m=o.inputs.slice(1).map(h=>this.source(h,h.gpu));r.push(`${this.use("node_tex_checker")}(${[l,...m,c(i.map((h,d)=>d))].join(", ")});`);break}case"ShaderNodeTexWhiteNoise":{const l=Number(N(o,"noise_dimensions")[0]);r.push(`${this.use(`node_white_noise_${l}d`)}(${f()});`);break}case"ShaderNodeTexWave":case"ShaderNodeTexGradient":case"ShaderNodeTexMagic":case"ShaderNodeTexBrick":{const l=this.coordinate(o,"orco"),m=o.inputs.slice(1).map(p=>this.source(p,p.gpu)),h=p=>N(o,`${p}#value`).toFixed(1),d=o.type==="ShaderNodeTexWave"?[h("wave_type"),h("bands_direction"),h("rings_direction"),h("wave_profile")]:o.type==="ShaderNodeTexGradient"?[h("gradient_type")]:o.type==="ShaderNodeTexMagic"?[N(o,"turbulence_depth").toFixed(1)]:[this.uniform("float",N(o,"offset")),N(o,"offset_frequency").toFixed(1),this.uniform("float",N(o,"squash")),N(o,"squash_frequency").toFixed(1)],_={ShaderNodeTexWave:"node_tex_wave",ShaderNodeTexGradient:"node_tex_gradient",ShaderNodeTexMagic:"node_tex_magic",ShaderNodeTexBrick:"node_tex_brick"}[o.type];r.push(`${this.use(_)}(${[l,...m,...d,c(i.map((p,v)=>v))].join(", ")});`);break}case"ShaderNodeMapRange":{const l=N(o,"data_type")==="FLOAT_VECTOR",m=N(o,"interpolation_type").toLowerCase(),h=N(o,"clamp");r.push(`${this.use(`${l?"vector_":""}map_range_${m}`)}(${f([h?"1.0":"0.0"])});`),h&&!l&&(m==="linear"||m==="stepped")&&r.push(`${this.use("clamp_range")}(${c([0])}, ${this.input(o,"To Min","float")}, ${this.input(o,"To Max","float")}, ${c([0])});`);break}case"ShaderNodeClamp":r.push(`${this.use(N(o,"clamp_type")==="MINMAX"?"clamp_minmax":"clamp_range")}(${f()});`);break;case"ShaderNodeHueSaturation":r.push(`${this.use("hue_sat")}(${f()});`);break;case"ShaderNodeBrightContrast":r.push(`${this.use("brightness_contrast")}(${f()});`);break;case"ShaderNodeGamma":r.push(`${this.use("node_gamma")}(${f()});`);break;case"ShaderNodeRGBToBW":r.push(`${this.use("rgbtobw")}(${f([Xo])});`);break;case"ShaderNodeSeparateColor":r.push(`${this.use(`separate_color_${N(o,"mode").toLowerCase()}`)}(${f()});`);break;case"ShaderNodeCombineColor":r.push(`${this.use(`combine_color_${N(o,"mode").toLowerCase()}`)}(${f()});`);break;case"ShaderNodeVectorRotate":{const l={AXIS_ANGLE:"axis_angle",X_AXIS:"axis_x",Y_AXIS:"axis_y",Z_AXIS:"axis_z",EULER_XYZ:"euler_xyz"}[N(o,"rotation_type")];r.push(`${this.use(`node_vector_rotate_${l}`)}(${f([N(o,"invert")?"-1.0":"1.0"])});`);break}case"ShaderNodeFresnel":case"ShaderNodeLayerWeight":{const l=o.inputs[1],m="link"in l?this.source(l,"vec3"):"g_data.N";"link"in l||this.s.structure.push("world-normal");const h=this.source(o.inputs[0],"float"),d=o.type==="ShaderNodeFresnel"?"node_fresnel":"node_layer_weight";r.push(`${this.use(d)}(${[h,m,c(i.map((_,p)=>p))].join(", ")});`);break}case"ShaderNodeBump":{const l=o.inputs.find(b=>b.id==="Height"),m=o.inputs.find(b=>b.id==="Normal"),h=m&&"link"in m?this.source(m,"vec3"):"g_data.N";if(!l||!("link"in l)){r.push(`${c([0])} = ${h};`);break}const d=`bgHeight${this.s.functions.length}`;this.s.functions.push("");const _=new Wn(this.graph,this.s,!0,`${d}_`),p=_.source(l,"float");this.s.functions[Number(d.slice(8))]=`float ${d}() {
7021
7021
  ${_.lines.join(`
7022
7022
  `)}
7023
- return ${v};
7024
- }`;const g=this.input(o,"Filter Width","float");r.push(`float ${a}_h = ${d}();`,`g_derivative_filter_width = ${g} * derivative_scale_get();`,`g_derivative_flag = 1; float ${a}_hx = ${d}();`,`g_derivative_flag = -1; float ${a}_hy = ${d}();`,"g_derivative_flag = 0;");const p=N(o,"invert")?"-1.0":"1.0";r.push(`${this.use("node_bump")}(${this.input(o,"Strength","float")}, ${this.input(o,"Distance","float")}, ${g}, ${a}_h, ${h}, vec2(${a}_hx, ${a}_hy), ${p}, ${u([0])});`);break}case"ShaderNodeNormalMap":{const l=N(o,"space"),m=this.input(o,"Strength","float"),h=this.input(o,"Color","vec3"),d=`${a}_n`;if(r.push(`vec3 ${d}; ${this.use(l.startsWith("BLENDER_")?"color_to_blender_normal_new_shading":"color_to_normal_new_shading")}(${h}, ${d});`),o.props.convention==="DIRECTX"&&r.push(`${this.use("color_invert_green_channel")}(${d}, ${d});`),l==="TANGENT"){const _=N(o,"uv_map");this.s.uvs.add(_),r.push(`${this.use("node_normal_map")}(blender_uv_tangent(${zt(_)}), ${m}, ${d}, g_data.Ni, ${u([0])});`)}else(l==="OBJECT"||l==="BLENDER_OBJECT")&&r.push(`${this.use("normal_transform_object_to_world")}(${d}, ${d});`),r.push(`${this.use("node_normal_map_mix")}(${m}, ${d}, ${u([0])});`);break}case"ShaderNodeNewGeometry":{r.push(`${this.use("node_geometry")}(${["blender_orco()",u(i.map((l,m)=>m))].join(", ")});`),i[0]&&r.push(`${i[0].name} = ${this.d(i[0].name)};`);for(const l of[1,2,4])i[l]&&r.push(`${i[l].name} = normalize(${i[l].name});`);break}case"ShaderNodeTexImage":{const l=N(o,"image");if(l===null){r.push(`${u([0])} = vec4(0.0); ${u([1])} = 0.0;`);break}const m=N(o,"projection"),h=N(o,"interpolation"),d=h==="Cubic"||h==="Smart",_=N(o,"extension"),v=`bgImage${this.s.images.length}`;this.s.images.push({uniform:v,node:t,name:l.name,revision:l.revision,extension:_,closest:h==="Closest",mipmap:m!=="SPHERE"&&m!=="TUBE",tiled:m==="FLAT"&&o.props.image_tiled===!0});const g=this.s.images.at(-1).tiled;this.s.structure.push(["img",m,d,g]);let p=this.coordinate(o,"uv");const b=u([0]),T=u([1]);if(m==="BOX"){const E=`${a}_n`;r.push(`vec3 ${E}; ${this.use("world_normals_get")}(${E}); ${this.use("normal_transform_world_to_object")}(${E}, ${E});`,`vec4 ${a}_c1, ${a}_c2, ${a}_c3;`,`${this.use(d?"tex_box_sample_cubic":"tex_box_sample_linear")}(${p}, ${E}, ${v}, ${a}_c1, ${a}_c2, ${a}_c3);`,`${this.use("tex_box_blend")}(${E}, ${a}_c1, ${a}_c2, ${a}_c3, ${this.uniform("float",N(o,"projection_blend"))}, ${b}, ${T});`)}else if(g)d&&this.use("cubic_bspline_coefficients"),r.push(`${d?"blender_tex_tile_cubic":"blender_tex_tile_linear"}(${p}, ${v}, ${v}Map, ${b}, ${T});`);else{if(m==="SPHERE"||m==="TUBE"){const E=`${a}_co`;r.push(`vec3 ${E}; ${this.use("point_texco_remap_square")}(${p}, ${E});`,`${this.use(m==="SPHERE"?"point_map_to_sphere":"point_map_to_tube")}(${E}, ${E});`),p=E}r.push(`${this.use(d?"node_tex_image_cubic":"node_tex_image_linear")}(${p}, ${v}, ${b}, ${T});`),_==="CLIP"&&r.push(`if (any(lessThan(${p}.xy, vec2(0.0))) || any(greaterThan(${p}.xy, vec2(1.0)))) { ${b} = vec4(0.0); ${T} = 0.0; }`)}const D=N(o,"image_alpha_mode"),w=this.uses(t,1);D==="NONE"||D==="CHANNEL_PACKED"||N(o,"image_is_data")||!w?r.push(`${u([0])}.a = 1.0;`):r.push(`${u([0])} = vec4(${u([0])}.rgb * ${u([0])}.a, 1.0);`);break}}return this.lines.push(...r),i}uses(t,o){const e=i=>"link"in i&&i.link[0]===t&&i.link[1]===o,a=i=>i!==void 0&&("emission"in i?i.emission.some(e):"mix"in i?e(i.mix[0])||a(i.mix[1])||a(i.mix[2]):"add"in i?a(i.add[0])||a(i.add[1]):!1);return Object.values(this.graph.inputs).some(e)||Object.values(this.graph.nodes).some(i=>i.inputs.some(e))||a(this.graph.closure)}compile(){const t=this.graph.surface==="ShaderNodeEmission"?{Color:"vec4",Strength:"float"}:{"Base Color":"vec4",Metallic:"float",Roughness:"float",Alpha:"float","Emission Color":"vec4","Emission Strength":"float",Normal:"vec3"},o={},e=[];let a=0;for(const[l,m]of Object.entries(t)){const h=this.graph.inputs[l];if(!h||l==="Normal"&&!("link"in h))continue;const d=`bgOut${a++}`;o[l]={global:d,type:m},this.s.structure.push(["out",l]),e.push(`${d} = ${this.source(h,m)};`)}const i=this.graph.closure;if(i){let l=0;const m=(h,d)=>{if("principled"in h)this.s.structure.push("cP"),e.push(`bgClosureP += ${d};`);else if("emission"in h)this.s.structure.push("cE"),e.push(`bgClosureE += ${d} * ${this.source(h.emission[0],"vec4")}.rgb * ${this.source(h.emission[1],"float")};`);else if("transparent"in h)this.s.structure.push("cT"),e.push(`bgClosureT += ${d} * ${this.source({value:h.transparent},"float")};`);else if("mix"in h){this.s.structure.push("cM");const _=`bgClosureF${l++}`;e.push(`float ${_} = clamp(${this.source(h.mix[0],"float")}, 0.0, 1.0);`),m(h.mix[1],`${d} * (1.0 - ${_})`),m(h.mix[2],`${d} * ${_}`)}else"add"in h?(this.s.structure.push("cA"),m(h.add[0],d),m(h.add[1],d)):this.s.structure.push("c0")};e.push("bgClosureP = 0.0;","bgClosureE = vec3(0.0);","bgClosureT = 0.0;"),m(i,"1.0")}const s=[],c=new Set,u=l=>{if(!c.has(l)){c.add(l);for(const m of $n[l].deps)u(m);s.push(l)}};for(const l of this.s.files)u(l);const f=`void blenderGraph() {
7023
+ return ${p};
7024
+ }`;const v=this.input(o,"Filter Width","float");r.push(`float ${a}_h = ${d}();`,`g_derivative_filter_width = ${v} * derivative_scale_get();`,`g_derivative_flag = 1; float ${a}_hx = ${d}();`,`g_derivative_flag = -1; float ${a}_hy = ${d}();`,"g_derivative_flag = 0;");const g=N(o,"invert")?"-1.0":"1.0";r.push(`${this.use("node_bump")}(${this.input(o,"Strength","float")}, ${this.input(o,"Distance","float")}, ${v}, ${a}_h, ${h}, vec2(${a}_hx, ${a}_hy), ${g}, ${c([0])});`);break}case"ShaderNodeNormalMap":{const l=N(o,"space"),m=this.input(o,"Strength","float"),h=this.input(o,"Color","vec3"),d=`${a}_n`;if(r.push(`vec3 ${d}; ${this.use(l.startsWith("BLENDER_")?"color_to_blender_normal_new_shading":"color_to_normal_new_shading")}(${h}, ${d});`),o.props.convention==="DIRECTX"&&r.push(`${this.use("color_invert_green_channel")}(${d}, ${d});`),l==="TANGENT"){const _=N(o,"uv_map");this.s.uvs.add(_),r.push(`${this.use("node_normal_map")}(blender_uv_tangent(${zt(_)}), ${m}, ${d}, g_data.Ni, ${c([0])});`)}else(l==="OBJECT"||l==="BLENDER_OBJECT")&&r.push(`${this.use("normal_transform_object_to_world")}(${d}, ${d});`),r.push(`${this.use("node_normal_map_mix")}(${m}, ${d}, ${c([0])});`);break}case"ShaderNodeNewGeometry":{r.push(`${this.use("node_geometry")}(${["blender_orco()",c(i.map((l,m)=>m))].join(", ")});`),i[0]&&r.push(`${i[0].name} = ${this.d(i[0].name)};`);for(const l of[1,2,4])i[l]&&r.push(`${i[l].name} = normalize(${i[l].name});`);break}case"ShaderNodeTexImage":{const l=N(o,"image");if(l===null){r.push(`${c([0])} = vec4(0.0); ${c([1])} = 0.0;`);break}const m=N(o,"projection"),h=N(o,"interpolation"),d=h==="Cubic"||h==="Smart",_=N(o,"extension"),p=`bgImage${this.s.images.length}`;this.s.images.push({uniform:p,node:t,name:l.name,revision:l.revision,extension:_,closest:h==="Closest",mipmap:m!=="SPHERE"&&m!=="TUBE",tiled:m==="FLAT"&&o.props.image_tiled===!0});const v=this.s.images.at(-1).tiled;this.s.structure.push(["img",m,d,v]);let g=this.coordinate(o,"uv");const b=c([0]),P=c([1]);if(m==="BOX"){const E=`${a}_n`;r.push(`vec3 ${E}; ${this.use("world_normals_get")}(${E}); ${this.use("normal_transform_world_to_object")}(${E}, ${E});`,`vec4 ${a}_c1, ${a}_c2, ${a}_c3;`,`${this.use(d?"tex_box_sample_cubic":"tex_box_sample_linear")}(${g}, ${E}, ${p}, ${a}_c1, ${a}_c2, ${a}_c3);`,`${this.use("tex_box_blend")}(${E}, ${a}_c1, ${a}_c2, ${a}_c3, ${this.uniform("float",N(o,"projection_blend"))}, ${b}, ${P});`)}else if(v)d&&this.use("cubic_bspline_coefficients"),r.push(`${d?"blender_tex_tile_cubic":"blender_tex_tile_linear"}(${g}, ${p}, ${p}Map, ${b}, ${P});`);else{if(m==="SPHERE"||m==="TUBE"){const E=`${a}_co`;r.push(`vec3 ${E}; ${this.use("point_texco_remap_square")}(${g}, ${E});`,`${this.use(m==="SPHERE"?"point_map_to_sphere":"point_map_to_tube")}(${E}, ${E});`),g=E}r.push(`${this.use(d?"node_tex_image_cubic":"node_tex_image_linear")}(${g}, ${p}, ${b}, ${P});`),_==="CLIP"&&r.push(`if (any(lessThan(${g}.xy, vec2(0.0))) || any(greaterThan(${g}.xy, vec2(1.0)))) { ${b} = vec4(0.0); ${P} = 0.0; }`)}const D=N(o,"image_alpha_mode"),w=this.uses(t,1);D==="NONE"||D==="CHANNEL_PACKED"||N(o,"image_is_data")||!w?r.push(`${c([0])}.a = 1.0;`):r.push(`${c([0])} = vec4(${c([0])}.rgb * ${c([0])}.a, 1.0);`);break}}return this.lines.push(...r),i}uses(t,o){const e=i=>"link"in i&&i.link[0]===t&&i.link[1]===o,a=i=>i!==void 0&&("emission"in i?i.emission.some(e):"mix"in i?e(i.mix[0])||a(i.mix[1])||a(i.mix[2]):"add"in i?a(i.add[0])||a(i.add[1]):!1);return Object.values(this.graph.inputs).some(e)||Object.values(this.graph.nodes).some(i=>i.inputs.some(e))||a(this.graph.closure)}compile(){const t=this.graph.surface==="ShaderNodeEmission"?{Color:"vec4",Strength:"float"}:{"Base Color":"vec4",Metallic:"float",Roughness:"float",Alpha:"float","Emission Color":"vec4","Emission Strength":"float",Normal:"vec3"},o={},e=[];let a=0;for(const[l,m]of Object.entries(t)){const h=this.graph.inputs[l];if(!h||l==="Normal"&&!("link"in h))continue;const d=`bgOut${a++}`;o[l]={global:d,type:m},this.s.structure.push(["out",l]),e.push(`${d} = ${this.source(h,m)};`)}const i=this.graph.closure;if(i){let l=0;const m=(h,d)=>{if("principled"in h)this.s.structure.push("cP"),e.push(`bgClosureP += ${d};`);else if("emission"in h)this.s.structure.push("cE"),e.push(`bgClosureE += ${d} * ${this.source(h.emission[0],"vec4")}.rgb * ${this.source(h.emission[1],"float")};`);else if("transparent"in h)this.s.structure.push("cT"),e.push(`bgClosureT += ${d} * ${this.source({value:h.transparent},"float")};`);else if("mix"in h){this.s.structure.push("cM");const _=`bgClosureF${l++}`;e.push(`float ${_} = clamp(${this.source(h.mix[0],"float")}, 0.0, 1.0);`),m(h.mix[1],`${d} * (1.0 - ${_})`),m(h.mix[2],`${d} * ${_}`)}else"add"in h?(this.s.structure.push("cA"),m(h.add[0],d),m(h.add[1],d)):this.s.structure.push("c0")};e.push("bgClosureP = 0.0;","bgClosureE = vec3(0.0);","bgClosureT = 0.0;"),m(i,"1.0")}const s=[],u=new Set,c=l=>{if(!u.has(l)){u.add(l);for(const m of $n[l].deps)c(m);s.push(l)}};for(const l of this.s.files)c(l);const f=`void blenderGraph() {
7025
7025
  blender_init_globals();
7026
7026
  ${[...this.lines,...e].join(`
7027
7027
  `)}
@@ -7030,35 +7030,31 @@ vec3 blender_reflection() {
7030
7030
  `+xl,[...this.s.functions,f].join(`
7031
7031
  `)),...[...this.s.uniformTypes].map(([l,m])=>`uniform ${m} ${l};`),...this.images.map(l=>l.tiled?`uniform highp sampler2DArray ${l.uniform};
7032
7032
  uniform highp sampler2D ${l.uniform}Map;`:`uniform sampler2D ${l.uniform};`),...this.ramps.map(l=>`uniform sampler2D ${l.uniform};`),...Object.values(o).map(l=>`${l.type} ${l.global};`),...i?["float bgClosureP;","vec3 bgClosureE;","float bgClosureT;"]:[],...this.s.functions,f].join(`
7033
- `);return{key:JSON.stringify([this.graph.surface,this.s.structure,[...this.s.uvs].sort()]),declarations:r,uniforms:this.uniforms,images:this.images,ramps:this.ramps,uvs:[...this.s.uvs],attributes:[...this.s.attributes],outputs:o,surface:this.graph.surface,closure:i!==void 0}}}function bl(n,t){const o=[],e=/^[A-Za-z_][\w ]*?\b([A-Za-z_]\w*)\s*\(/gm;let a=0;for(let u;u=e.exec(n);){if(u.index<a)continue;let f=u.index+u[0].length;for(let h=1;f<n.length&&h>0;f++)h+=n[f]==="("?1:n[f]===")"?-1:0;const r=n.slice(f).match(/^\s*(\{|;)/);if(!r||/^\s*#/.test(n.slice(n.lastIndexOf(`
7034
- `,u.index)+1,u.index+1))||n.slice(Math.max(0,u.index-2),u.index).endsWith(`\\
7035
- `))continue;let m=f+r[0].length;if(r[1]==="{")for(let h=1;m<n.length&&h>0;m++)h+=n[m]==="{"?1:n[m]==="}"?-1:0;o.push({text:n.slice(a,u.index),name:null}),o.push({text:n.slice(u.index,m),name:u[1]}),a=m,e.lastIndex=m}o.push({text:n.slice(a),name:null});const i=new Set(o.filter(u=>u.name===null)),s=new Set,c=u=>{for(const f of u.matchAll(/[A-Za-z_]\w*/g))s.add(f[0])};c(t);for(const u of i)c(u.text);for(let u=!0;u;){u=!1;for(const f of o)i.has(f)||f.name===null||!s.has(f.name)||(i.add(f),c(f.text),u=!0)}return o.filter(u=>i.has(u)).map(u=>u.text).join("")}function Ln(n){return`v${Et(n)}`}function zt(n){return n===""?"vBlenderUvRender":`vBlenderUv_${[...n].map(t=>t.charCodeAt(0).toString(16)).join("")}`}function yl(n){return new Wn(n).compile()}function wl(n){const t=new Uint16Array(n.length*4);n.forEach((e,a)=>t.set([e[0]??0,e[1]??0,e[2]??0,e[3]??1].map(i=>Wt.toHalfFloat(i)),a*4));const o=new mn(t,n.length,1,dn,jn);return o.minFilter=o.magFilter=St,o.wrapS=o.wrapT=Mo,o.needsUpdate=!0,o}const et=new WeakMap,Yo=new Set,Pt=new WeakMap,nn=new WeakMap;function on(n){const t=Pt.get(n);if(t){Pt.delete(n);for(const o of t.binding.ramps)o.dispose()}}function Ol(n,t,o,e=!1){const a=et.get(n);if(t&&Yo.has(t.key)&&(t=null),!t){if(on(n),a){for(const c of a.ramps)c.dispose();et.delete(n),n.needsUpdate=!0}return}if(a&&a.compiled.key===t.key){on(n),en(a,t,o);return}if(e){on(n);for(const u of a?.ramps??[])u.dispose();const c={compiled:t,uniforms:{},ramps:[],channels:a?.channels??{}};en(c,t,o),et.set(n,c),n.needsUpdate=!0;return}const i=Pt.get(n);if(i&&i.binding.compiled.key===t.key){en(i.binding,t,o);return}on(n);const s={compiled:t,uniforms:{},ramps:[],channels:a?.channels??{}};en(s,t,o),Pt.set(n,{binding:s,started:!1})}function en(n,t,o){n.compiled=t;for(const[e,a]of t.uniforms){const i=typeof a=="number"?a:a.length===2?new _n(...a):a.length===3?new y(...a):new Eo(...a),s=n.uniforms[e];s?s.value=i:n.uniforms[e]={value:i}}for(const e of n.ramps)e.dispose();n.ramps=t.ramps.map(e=>{const a=wl(e.table);return(n.uniforms[e.uniform]??={value:null}).value=a,a});for(const e of t.images){const a=o(e);if(e.tiled){const i=a!==null&&"tiles"in a?a:null;(n.uniforms[e.uniform]??={value:null}).value=i?.tiles??null,(n.uniforms[`${e.uniform}Map`]??={value:null}).value=i?.map??null}else(n.uniforms[e.uniform]??={value:null}).value=a!==null&&"tiles"in a?null:a}}function Tl(n){const t=et.get(n);return t?`${t.compiled.key}|${JSON.stringify(t.channels)}`:""}function go(n,t){const o=t.userData.blenderUvChannels,e=t.getAttribute("position")?.count??0,a={};for(const i of n.uvs){let s=i===""?0:o?.[i];s===void 0&&(s=9,t.getAttribute("uv9")?.count!==e&&t.setAttribute("uv9",new tt(new Float32Array(e*2),2))),a[i]=s}return a}function Pl(n,t,o,e,a,i,s){const c=nn.get(n);c&&++c.draws>1&&(c.shadow.dispose(),nn.delete(n));const u=Pt.get(n);if(u&&!u.started){u.started=!0,u.binding.channels=go(u.binding.compiled,t);const m=s(n);et.set(m,u.binding);const h=new At(t,m);h.castShadow=i.castShadow,h.receiveShadow=i.receiveShadow;const d=()=>{if(Pt.get(n)!==u){m.dispose();return}Pt.delete(n);for(const _ of et.get(n)?.ramps??[])_.dispose();et.set(n,u.binding),n.needsUpdate=!0,nn.get(n)?.shadow.dispose(),nn.set(n,{shadow:m,draws:0}),Jt()};o.compileAsync(h,a,e).then(d,d)}const f=et.get(n);if(!f)return;const r=o.properties.get(n).currentProgram;if(r?.diagnostics?.runnable===!1&&r.cacheKey?.includes(f.compiled.key)){Yo.add(f.compiled.key),et.delete(n),n.needsUpdate=!0;const m=r.diagnostics.fragmentShader.log.split(`
7036
- `).find(h=>h.startsWith("ERROR"))??"";console.warn(`Blender material "${n.name}": its node graph did not compile for WebGL, so it is drawn with its constant values. ${m}`);return}const l=go(f.compiled,t);JSON.stringify(l)!==JSON.stringify(f.channels)&&(f.channels=l,n.needsUpdate=!0)}function Al(n){const t=Array.isArray(n.material)?n.material:[n.material];if(!t.some(u=>u instanceof Qt&&et.has(u)))return;const o=n.geometry,e=n.userData.blenderTexspace??null,a=o.getAttribute("position"),i=JSON.stringify([e,a?.version??0,a?.count??0]);!o.userData.blenderOrcoFromDoor&&o.userData.blenderOrcoStamp!==i&&(o.setAttribute("blenderOrco",Sl(o,e)),o.userData.blenderOrcoStamp=i);const s=a?.count??0,c=n.userData.blenderDefaultColor;for(const u of t){const f=u instanceof Qt?et.get(u):void 0;for(const r of f?.compiled.attributes??[]){const l=Et(r),m=r===""?c===void 0?void 0:o.getAttribute(Et(c)):o.getAttribute(l);m&&m.count===s?o.getAttribute(l)!==m&&o.setAttribute(l,m):o.getAttribute(l)?.count!==s&&o.setAttribute(l,new tt(new Float32Array(s*4),4))}}}function Sl(n,t){const o=n.getAttribute("position");let e,a;if(t)e=[...t[0]],a=[...t[1]];else{n.computeBoundingBox();const s=n.boundingBox;e=[(s.min.x+s.max.x)/2,(s.min.y+s.max.y)/2,(s.min.z+s.max.z)/2],a=[(s.max.x-s.min.x)/2,(s.max.y-s.min.y)/2,(s.max.z-s.min.z)/2]}a=a.map(s=>s===0?1:s);const i=new Float32Array(o.count*3);for(let s=0;s<o.count;s++)i[s*3]=(o.getX(s)-e[0])/a[0]*.5+.5,i[s*3+1]=(o.getY(s)-e[1])/a[1]*.5+.5,i[s*3+2]=(o.getZ(s)-e[2])/a[2]*.5+.5;return new tt(i,3)}function El(n,t){const o=et.get(n);if(!o)return;const{compiled:e,channels:a}=o;Object.assign(t.uniforms,o.uniforms,{blenderViewport:{value:Zo}});const i=p=>p===0?"uv":`uv${p}`,s=[1,2,3].map(p=>`#ifndef USE_UV${p}
7037
- attribute vec2 uv${p};
7038
- #endif`).join(`
7039
- `),c=`varying vec3 vBlenderObjectPosition;
7033
+ `);return{key:JSON.stringify([this.graph.surface,this.s.structure,[...this.s.uvs].sort()]),declarations:r,uniforms:this.uniforms,images:this.images,ramps:this.ramps,uvs:[...this.s.uvs],attributes:[...this.s.attributes],outputs:o,surface:this.graph.surface,closure:i!==void 0}}}function bl(n,t){const o=[],e=/^[A-Za-z_][\w ]*?\b([A-Za-z_]\w*)\s*\(/gm;let a=0;for(let c;c=e.exec(n);){if(c.index<a)continue;let f=c.index+c[0].length;for(let h=1;f<n.length&&h>0;f++)h+=n[f]==="("?1:n[f]===")"?-1:0;const r=n.slice(f).match(/^\s*(\{|;)/);if(!r||/^\s*#/.test(n.slice(n.lastIndexOf(`
7034
+ `,c.index)+1,c.index+1))||n.slice(Math.max(0,c.index-2),c.index).endsWith(`\\
7035
+ `))continue;let m=f+r[0].length;if(r[1]==="{")for(let h=1;m<n.length&&h>0;m++)h+=n[m]==="{"?1:n[m]==="}"?-1:0;o.push({text:n.slice(a,c.index),name:null}),o.push({text:n.slice(c.index,m),name:c[1]}),a=m,e.lastIndex=m}o.push({text:n.slice(a),name:null});const i=new Set(o.filter(c=>c.name===null)),s=new Set,u=c=>{for(const f of c.matchAll(/[A-Za-z_]\w*/g))s.add(f[0])};u(t);for(const c of i)u(c.text);for(let c=!0;c;){c=!1;for(const f of o)i.has(f)||f.name===null||!s.has(f.name)||(i.add(f),u(f.text),c=!0)}return o.filter(c=>i.has(c)).map(c=>c.text).join("")}function Ln(n){return`v${Et(n)}`}function zt(n){return n===""?"vBlenderUvRender":`vBlenderUv_${[...n].map(t=>t.charCodeAt(0).toString(16)).join("")}`}function yl(n){return new Wn(n).compile()}function wl(n){const t=new Uint16Array(n.length*4);n.forEach((e,a)=>t.set([e[0]??0,e[1]??0,e[2]??0,e[3]??1].map(i=>Wt.toHalfFloat(i)),a*4));const o=new mn(t,n.length,1,dn,jn);return o.minFilter=o.magFilter=St,o.wrapS=o.wrapT=Mo,o.needsUpdate=!0,o}const et=new WeakMap,Yo=new Set,Pt=new WeakMap,nn=new WeakMap;function on(n){const t=Pt.get(n);if(t){Pt.delete(n);for(const o of t.binding.ramps)o.dispose()}}function Ol(n,t,o,e=!1){const a=et.get(n);if(t&&Yo.has(t.key)&&(t=null),!t){if(on(n),a){for(const u of a.ramps)u.dispose();et.delete(n),n.needsUpdate=!0}return}if(a&&a.compiled.key===t.key){on(n),en(a,t,o);return}if(e){on(n);for(const c of a?.ramps??[])c.dispose();const u={compiled:t,uniforms:{},ramps:[],channels:a?.channels??{}};en(u,t,o),et.set(n,u),n.needsUpdate=!0;return}const i=Pt.get(n);if(i&&i.binding.compiled.key===t.key){en(i.binding,t,o);return}on(n);const s={compiled:t,uniforms:{},ramps:[],channels:a?.channels??{}};en(s,t,o),Pt.set(n,{binding:s,started:!1})}function en(n,t,o){n.compiled=t;for(const[e,a]of t.uniforms){const i=typeof a=="number"?a:a.length===2?new _n(...a):a.length===3?new y(...a):new Eo(...a),s=n.uniforms[e];s?s.value=i:n.uniforms[e]={value:i}}for(const e of n.ramps)e.dispose();n.ramps=t.ramps.map(e=>{const a=wl(e.table);return(n.uniforms[e.uniform]??={value:null}).value=a,a});for(const e of t.images){const a=o(e);if(e.tiled){const i=a!==null&&"tiles"in a?a:null;(n.uniforms[e.uniform]??={value:null}).value=i?.tiles??null,(n.uniforms[`${e.uniform}Map`]??={value:null}).value=i?.map??null}else(n.uniforms[e.uniform]??={value:null}).value=a!==null&&"tiles"in a?null:a}}function Tl(n){const t=et.get(n);return t?`${t.compiled.key}|${JSON.stringify(t.channels)}`:""}function Pl(n){return Object.values(et.get(n)?.channels??{})}function go(n,t){const o=t.userData.blenderUvChannels,e=t.getAttribute("position")?.count??0,a={};for(const i of n.uvs){let s=i===""?0:o?.[i];s===void 0&&(s=9,t.getAttribute("uv9")?.count!==e&&t.setAttribute("uv9",new tt(new Float32Array(e*2),2))),a[i]=s}return a}function Al(n,t,o,e,a,i,s){const u=nn.get(n);u&&++u.draws>1&&(u.shadow.dispose(),nn.delete(n));const c=Pt.get(n);if(c&&!c.started){c.started=!0,c.binding.channels=go(c.binding.compiled,t);const m=s(n);et.set(m,c.binding);const h=new At(t,m);h.castShadow=i.castShadow,h.receiveShadow=i.receiveShadow;const d=()=>{if(Pt.get(n)!==c){m.dispose();return}Pt.delete(n);for(const _ of et.get(n)?.ramps??[])_.dispose();et.set(n,c.binding),n.needsUpdate=!0,nn.get(n)?.shadow.dispose(),nn.set(n,{shadow:m,draws:0}),Jt()};o.compileAsync(h,a,e).then(d,d)}const f=et.get(n);if(!f)return;const r=o.properties.get(n).currentProgram;if(r?.diagnostics?.runnable===!1&&r.cacheKey?.includes(f.compiled.key)){Yo.add(f.compiled.key),et.delete(n),n.needsUpdate=!0;const m=r.diagnostics.fragmentShader.log.split(`
7036
+ `).find(h=>h.startsWith("ERROR"))??"";console.warn(`Blender material "${n.name}": its node graph did not compile for WebGL, so it is drawn with its constant values. ${m}`);return}const l=go(f.compiled,t);JSON.stringify(l)!==JSON.stringify(f.channels)&&(f.channels=l,n.needsUpdate=!0)}function Sl(n){const t=Array.isArray(n.material)?n.material:[n.material];if(!t.some(c=>c instanceof Qt&&et.has(c)))return;const o=n.geometry,e=n.userData.blenderTexspace??null,a=o.getAttribute("position"),i=JSON.stringify([e,a?.version??0,a?.count??0]);!o.userData.blenderOrcoFromDoor&&o.userData.blenderOrcoStamp!==i&&(o.setAttribute("blenderOrco",El(o,e)),o.userData.blenderOrcoStamp=i);const s=a?.count??0,u=n.userData.blenderDefaultColor;for(const c of t){const f=c instanceof Qt?et.get(c):void 0;for(const r of f?.compiled.attributes??[]){const l=Et(r),m=r===""?u===void 0?void 0:o.getAttribute(Et(u)):o.getAttribute(l);m&&m.count===s?o.getAttribute(l)!==m&&o.setAttribute(l,m):o.getAttribute(l)?.count!==s&&o.setAttribute(l,new tt(new Float32Array(s*4),4))}}}function El(n,t){const o=n.getAttribute("position");let e,a;if(t)e=[...t[0]],a=[...t[1]];else{n.computeBoundingBox();const s=n.boundingBox;e=[(s.min.x+s.max.x)/2,(s.min.y+s.max.y)/2,(s.min.z+s.max.z)/2],a=[(s.max.x-s.min.x)/2,(s.max.y-s.min.y)/2,(s.max.z-s.min.z)/2]}a=a.map(s=>s===0?1:s);const i=new Float32Array(o.count*3);for(let s=0;s<o.count;s++)i[s*3]=(o.getX(s)-e[0])/a[0]*.5+.5,i[s*3+1]=(o.getY(s)-e[1])/a[1]*.5+.5,i[s*3+2]=(o.getZ(s)-e[2])/a[2]*.5+.5;return new tt(i,3)}function Nl(n,t){const o=et.get(n);if(!o)return;const{compiled:e,channels:a}=o;Object.assign(t.uniforms,o.uniforms,{blenderViewport:{value:Zo}});const i=v=>v===0?"uv":`uv${v}`,s=`varying vec3 vBlenderObjectPosition;
7040
7037
  varying vec3 vBlenderObjectNormal;
7041
7038
  varying vec3 vBlenderWorldPosition;
7042
7039
  varying vec3 vBlenderWorldNormal;
7043
7040
  varying vec3 vBlenderOrco;
7044
- ${e.attributes.map(p=>`varying vec4 ${Ln(p)};`).join(`
7041
+ ${e.attributes.map(v=>`varying vec4 ${Ln(v)};`).join(`
7045
7042
  `)}
7046
- ${e.uvs.map(p=>`varying vec2 ${zt(p)};`).join(`
7047
- `)}`,u=e.attributes.map(p=>`attribute vec4 ${Et(p)};`).join(`
7048
- `);t.vertexShader=`${s}
7049
- attribute vec3 blenderOrco;
7043
+ ${e.uvs.map(v=>`varying vec2 ${zt(v)};`).join(`
7044
+ `)}`,u=e.attributes.map(v=>`attribute vec4 ${Et(v)};`).join(`
7045
+ `);t.vertexShader=`attribute vec3 blenderOrco;
7050
7046
  ${u}
7051
- ${c}
7047
+ ${s}
7052
7048
  ${t.vertexShader}`.replace("#include <project_vertex>",`vBlenderObjectPosition = transformed;
7053
7049
  vBlenderObjectNormal = objectNormal;
7054
7050
  vBlenderWorldPosition = (modelMatrix * vec4(transformed, 1.0)).xyz;
7055
7051
  vBlenderWorldNormal = normalize(transpose(inverse(mat3(modelMatrix))) * objectNormal);
7056
7052
  vBlenderOrco = blenderOrco;
7057
- ${e.attributes.map(p=>`${Ln(p)} = ${Et(p)};`).join(`
7053
+ ${e.attributes.map(v=>`${Ln(v)} = ${Et(v)};`).join(`
7058
7054
  `)}
7059
- ${e.uvs.map(p=>`${zt(p)} = ${i(a[p]??0)};`).join(`
7055
+ ${e.uvs.map(v=>`${zt(v)} = ${i(a[v]??0)};`).join(`
7060
7056
  `)}
7061
- #include <project_vertex>`);const f=p=>e.outputs[p]?.global,r=[];e.surface==="ShaderNodeEmission"?(r.push(["#include <color_fragment>","diffuseColor = vec4(0.0, 0.0, 0.0, 1.0);",!1]),r.push(["#include <emissivemap_fragment>",`totalEmissiveRadiance = ${f("Color")}.rgb * ${f("Strength")};`,!1]),r.push(["#include <opaque_fragment>","outgoingLight = totalEmissiveRadiance;",!0])):e.surface==="closure"?(r.push(["#include <color_fragment>","diffuseColor = vec4(0.0, 0.0, 0.0, 1.0);",!1]),r.push(["#include <emissivemap_fragment>","totalEmissiveRadiance = vec3(0.0);",!1])):(r.push(["#include <color_fragment>",`diffuseColor.rgb = ${f("Base Color")}.rgb;`,!1]),r.push(["#include <alphamap_fragment>",`diffuseColor.a = ${f("Alpha")};`,!1]),r.push(["#include <metalnessmap_fragment>",`roughnessFactor = ${f("Roughness")};`,!0]),r.push(["#include <metalnessmap_fragment>",`metalnessFactor = ${f("Metallic")};`,!1]),r.push(["#include <emissivemap_fragment>",`totalEmissiveRadiance = ${f("Emission Color")}.rgb * ${f("Emission Strength")};`,!1]),f("Normal")&&r.push(["#include <clearcoat_normal_fragment_begin>",`normal = normalize((viewMatrix * vec4(transpose(blender_from_three) * ${f("Normal")}, 0.0)).xyz);`,!0])),e.closure&&r.push(["#include <opaque_fragment>",`{
7057
+ #include <project_vertex>`);const c=v=>e.outputs[v]?.global,f=[];e.surface==="ShaderNodeEmission"?(f.push(["#include <color_fragment>","diffuseColor = vec4(0.0, 0.0, 0.0, 1.0);",!1]),f.push(["#include <emissivemap_fragment>",`totalEmissiveRadiance = ${c("Color")}.rgb * ${c("Strength")};`,!1]),f.push(["#include <opaque_fragment>","outgoingLight = totalEmissiveRadiance;",!0])):e.surface==="closure"?(f.push(["#include <color_fragment>","diffuseColor = vec4(0.0, 0.0, 0.0, 1.0);",!1]),f.push(["#include <emissivemap_fragment>","totalEmissiveRadiance = vec3(0.0);",!1])):(f.push(["#include <color_fragment>",`diffuseColor.rgb = ${c("Base Color")}.rgb;`,!1]),f.push(["#include <alphamap_fragment>",`diffuseColor.a = ${c("Alpha")};`,!1]),f.push(["#include <metalnessmap_fragment>",`roughnessFactor = ${c("Roughness")};`,!0]),f.push(["#include <metalnessmap_fragment>",`metalnessFactor = ${c("Metallic")};`,!1]),f.push(["#include <emissivemap_fragment>",`totalEmissiveRadiance = ${c("Emission Color")}.rgb * ${c("Emission Strength")};`,!1]),c("Normal")&&f.push(["#include <clearcoat_normal_fragment_begin>",`normal = normalize((viewMatrix * vec4(transpose(blender_from_three) * ${c("Normal")}, 0.0)).xyz);`,!0])),e.closure&&f.push(["#include <opaque_fragment>",`{
7062
7058
  float blenderCoverage = diffuseColor.a;
7063
7059
  vec3 blenderRadiance = bgClosureP * blenderCoverage * outgoingLight + bgClosureE;
7064
7060
  float blenderAlpha = 1.0 - min(bgClosureT + bgClosureP * (1.0 - blenderCoverage), 1.0);
@@ -7068,13 +7064,15 @@ ${e.uvs.map(p=>`${zt(p)} = ${i(a[p]??0)};`).join(`
7068
7064
  outgoingLight = blenderRadiance / max(blenderAlpha, 1e-4);
7069
7065
  #endif
7070
7066
  diffuseColor.a = blenderAlpha;
7071
- }`,!0]);const l=p=>p.replace(/^[ \t]*#include <(\w+)>/gm,(b,T)=>l(yt[T]??"")),m=l(t.fragmentShader.slice(0,t.fragmentShader.indexOf("void main() {"))),h=new Map([...m.matchAll(/^[ \t]*#define[ \t]+(\w+).*$/gm)].map(p=>[p[1],p[0].trim()])),_=[...new Set([...e.declarations.matchAll(/^[ \t]*#define[ \t]+(\w+)/gm)].map(p=>p[1]))].filter(p=>h.has(p)),v=[..._.map(p=>`#undef ${p}`),e.declarations,..._.flatMap(p=>[`#undef ${p}`,h.get(p)])].join(`
7072
- `);let g=t.fragmentShader.replace("void main() {",`${c}
7073
- ${v}
7067
+ }`,!0]);const r=v=>v.replace(/^[ \t]*#include <(\w+)>/gm,(g,b)=>r(yt[b]??"")),l=r(t.fragmentShader.slice(0,t.fragmentShader.indexOf("void main() {"))),m=new Map([...l.matchAll(/^[ \t]*#define[ \t]+(\w+).*$/gm)].map(v=>[v[1],v[0].trim()])),d=[...new Set([...e.declarations.matchAll(/^[ \t]*#define[ \t]+(\w+)/gm)].map(v=>v[1]))].filter(v=>m.has(v)),_=[...d.map(v=>`#undef ${v}`),e.declarations,...d.flatMap(v=>[`#undef ${v}`,m.get(v)])].join(`
7068
+ `);let p=t.fragmentShader.replace("void main() {",`${s}
7069
+ ${_}
7074
7070
  void main() {`).replace("#include <clipping_planes_fragment>",`#include <clipping_planes_fragment>
7075
- blenderGraph();`);for(const[p,b,T]of r){if(!g.includes(p))throw new Error(`three's physical shader has no ${p}`);g=g.replace(p,T?`${b}
7076
- ${p}`:`${p}
7077
- ${b}`)}t.fragmentShader=g}const Zo=new _n(1,1);function Nl(n){n.getDrawingBufferSize(Zo)}function Ml(n,t){const o=t.userData.blenderUvChannels;for(const e of[n.map,n.roughnessMap,n.normalMap]){if(!e)continue;const a=e.userData.blenderUvName;let i=a?o?.[a]:0;if(i===void 0){i=9;const s=t.getAttribute("position")?.count;if(s===void 0)throw new Error("A textured Blender draw has no positions");t.getAttribute("uv9")?.count!==s&&t.setAttribute("uv9",new tt(new Float32Array(s*2),2))}e.channel!==i&&(e.channel=i,n.needsUpdate=!0)}}class Rl{constructor(){this.bindings=new Map}get(t,o,e,a,i=""){let s=this.bindings.get(t);if(!s||s.source!==o){this.delete(t),s={source:o,texture:o.clone(),version:-1,disposed:!1},this.bindings.set(t,s);const f=s;a&&a.then(()=>{f.disposed||(f.texture.needsUpdate=!0,f.version=o.version,Jt())},()=>{})}const c=e==="REPEAT"?ve:e==="MIRROR"?ge:Mo,u=s.texture.wrapS!==c||s.texture.wrapT!==c;return s.texture.wrapS=s.texture.wrapT=c,s.texture.userData.blenderUvName=i,o.image&&(u||s.version!==o.version)&&(s.texture.needsUpdate=!0,s.version=o.version),s.texture}delete(t){const o=this.bindings.get(t);o&&(o.disposed=!0,o.texture.dispose(),this.bindings.delete(t))}clear(){for(const t of this.bindings.keys())this.delete(t)}}const ot=R().finite(),Tn=j([ot,ot,ot]),Il=O({coat:ot,coat_roughness:ot,coat_ior:ot,coat_tint:Tn,sheen:ot,sheen_roughness:ot,sheen_tint:Tn,anisotropy:ot,anisotropy_rotation:ot,specular_level:ot,specular_tint:Tn,film_thickness:ot,film_ior:ot}).strict(),Fl={coat:0,coat_roughness:.03,coat_ior:1.5,coat_tint:[1,1,1],sheen:0,sheen_roughness:.5,sheen_tint:[1,1,1],anisotropy:0,anisotropy_rotation:0,specular_level:.5,specular_tint:[1,1,1],film_thickness:0,film_ior:1.33},kt=new WeakMap;function zl(n,t){kt.has(n)||Gn(n),kt.get(n).blenderWorldExtinction.value.copy(t)}function Dl(n){const t=new Qt,o=kt.get(n);Gn(t),t.copy(n);const e=kt.get(t);return o&&(e.blenderCoatIor.value=o.blenderCoatIor.value,e.blenderCoatTint.value.copy(o.blenderCoatTint.value),e.blenderMapClip.value=o.blenderMapClip.value,e.blenderRoughnessClip.value=o.blenderRoughnessClip.value,e.blenderNormalClip.value=o.blenderNormalClip.value,e.blenderWorldExtinction.value.copy(o.blenderWorldExtinction.value)),t}function Gn(n,t,o={}){const e=t??Fl;n.clearcoat=e.coat,n.clearcoatRoughness=e.coat_roughness,n.sheen=e.sheen,n.sheenRoughness=e.sheen_roughness,n.sheenColor.setRGB(...e.sheen_tint,at),n.anisotropy=e.anisotropy,n.anisotropyRotation=e.anisotropy_rotation*Math.PI*2,n.specularIntensity=e.specular_level*2,n.specularColor.setRGB(...e.specular_tint,at),n.iridescence=e.film_thickness>0?1:0,n.iridescenceIOR=e.film_ior,n.iridescenceThicknessRange=[e.film_thickness,e.film_thickness];let a=kt.get(n);if(!a){a={blenderCoatIor:{value:1.5},blenderCoatTint:{value:new gt(1,1,1)},blenderMapClip:{value:!1},blenderRoughnessClip:{value:!1},blenderNormalClip:{value:!1},blenderWorldExtinction:{value:new y}},kt.set(n,a);const i=a;n.customProgramCacheKey=()=>`blender-principled-physical-v5${Tl(n)}`,n.onBeforeRender=(s,c,u,f,r)=>{Ml(n,f),Pl(n,f,s,c,u,r,Dl),Nl(s)},n.onBeforeCompile=s=>{s.vertexShader=[4,5,6,7,8,9].map(h=>`attribute vec2 uv${h};`).join(`
7071
+ blenderGraph();`);for(const[v,g,b]of f){if(!p.includes(v))throw new Error(`three's physical shader has no ${v}`);p=p.replace(v,b?`${g}
7072
+ ${v}`:`${v}
7073
+ ${g}`)}t.fragmentShader=p}const Zo=new _n(1,1);function Ml(n){n.getDrawingBufferSize(Zo)}function Rl(n,t){const o=t.userData.blenderUvChannels;for(const e of[n.map,n.roughnessMap,n.normalMap]){if(!e)continue;const a=e.userData.blenderUvName;let i=a?o?.[a]:0;if(i===void 0){i=9;const s=t.getAttribute("position")?.count;if(s===void 0)throw new Error("A textured Blender draw has no positions");t.getAttribute("uv9")?.count!==s&&t.setAttribute("uv9",new tt(new Float32Array(s*2),2))}e.channel!==i&&(e.channel=i,n.needsUpdate=!0)}}class Il{constructor(){this.bindings=new Map}get(t,o,e,a,i=""){let s=this.bindings.get(t);if(!s||s.source!==o){this.delete(t),s={source:o,texture:o.clone(),version:-1,disposed:!1},this.bindings.set(t,s);const f=s;a&&a.then(()=>{f.disposed||(f.texture.needsUpdate=!0,f.version=o.version,Jt())},()=>{})}const u=e==="REPEAT"?ve:e==="MIRROR"?ge:Mo,c=s.texture.wrapS!==u||s.texture.wrapT!==u;return s.texture.wrapS=s.texture.wrapT=u,s.texture.userData.blenderUvName=i,o.image&&(c||s.version!==o.version)&&(s.texture.needsUpdate=!0,s.version=o.version),s.texture}delete(t){const o=this.bindings.get(t);o&&(o.disposed=!0,o.texture.dispose(),this.bindings.delete(t))}clear(){for(const t of this.bindings.keys())this.delete(t)}}const ot=R().finite(),Tn=j([ot,ot,ot]),Fl=O({coat:ot,coat_roughness:ot,coat_ior:ot,coat_tint:Tn,sheen:ot,sheen_roughness:ot,sheen_tint:Tn,anisotropy:ot,anisotropy_rotation:ot,specular_level:ot,specular_tint:Tn,film_thickness:ot,film_ior:ot}).strict(),zl={coat:0,coat_roughness:.03,coat_ior:1.5,coat_tint:[1,1,1],sheen:0,sheen_roughness:.5,sheen_tint:[1,1,1],anisotropy:0,anisotropy_rotation:0,specular_level:.5,specular_tint:[1,1,1],film_thickness:0,film_ior:1.33},kt=new WeakMap;function Dl(n,t){kt.has(n)||Gn(n),kt.get(n).blenderWorldExtinction.value.copy(t)}function Cl(n){const t=new Qt,o=kt.get(n);Gn(t),t.copy(n);const e=kt.get(t);return o&&(e.blenderCoatIor.value=o.blenderCoatIor.value,e.blenderCoatTint.value.copy(o.blenderCoatTint.value),e.blenderMapClip.value=o.blenderMapClip.value,e.blenderRoughnessClip.value=o.blenderRoughnessClip.value,e.blenderNormalClip.value=o.blenderNormalClip.value,e.blenderWorldExtinction.value.copy(o.blenderWorldExtinction.value)),t}function Gn(n,t,o={}){const e=t??zl;n.clearcoat=e.coat,n.clearcoatRoughness=e.coat_roughness,n.sheen=e.sheen,n.sheenRoughness=e.sheen_roughness,n.sheenColor.setRGB(...e.sheen_tint,at),n.anisotropy=e.anisotropy,n.anisotropyRotation=e.anisotropy_rotation*Math.PI*2,n.specularIntensity=e.specular_level*2,n.specularColor.setRGB(...e.specular_tint,at),n.iridescence=e.film_thickness>0?1:0,n.iridescenceIOR=e.film_ior,n.iridescenceThicknessRange=[e.film_thickness,e.film_thickness];let a=kt.get(n);if(!a){a={blenderCoatIor:{value:1.5},blenderCoatTint:{value:new gt(1,1,1)},blenderMapClip:{value:!1},blenderRoughnessClip:{value:!1},blenderNormalClip:{value:!1},blenderWorldExtinction:{value:new y}},kt.set(n,a);const i=a;n.customProgramCacheKey=()=>`blender-principled-physical-v5${Tl(n)}`,n.onBeforeRender=(s,u,c,f,r)=>{Rl(n,f),Al(n,f,s,u,c,r,Cl),Ml(s)},n.onBeforeCompile=s=>{const u=new Set([n.map,n.roughnessMap,n.normalMap].flatMap(d=>d?[d.channel]:[]).concat(Pl(n)));s.vertexShader=[...u].filter(d=>d>0).sort((d,_)=>d-_).map(d=>d<=3?`#ifndef USE_UV${d}
7074
+ attribute vec2 uv${d};
7075
+ #endif`:`attribute vec2 uv${d};`).join(`
7078
7076
  `)+`
7079
7077
  `+s.vertexShader,Object.assign(s.uniforms,i),s.fragmentShader=`uniform float blenderCoatIor;
7080
7078
  uniform vec3 blenderWorldExtinction;
@@ -7087,25 +7085,25 @@ ${b}`)}t.fragmentShader=g}const Zo=new _n(1,1);function Nl(n){n.getDrawingBuffer
7087
7085
  if (clipImage && (any(lessThan(uv, vec2(0.0))) || any(greaterThan(uv, vec2(1.0))))) pixel = vec4(0.0);
7088
7086
  return pixel;
7089
7087
  }
7090
- `+s.fragmentShader;const c=yt.lights_physical_fragment.replace("material.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );","material.specularF90 = 1.0;").replace("material.clearcoatF0 = vec3( 0.04 );","material.clearcoatF0 = vec3( pow2( ( blenderCoatIor - 1.0 ) / ( blenderCoatIor + 1.0 ) ) );"),u=yt.normal_fragment_maps.replace("normal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;","vec3 blenderBaseNormal = normal; normal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0; normal.y *= normalScale.y < 0.0 ? -1.0 : 1.0;").replace("normal = normalize( normalMatrix * normal );","normal = normalize(mix(blenderBaseNormal, normalize(normalMatrix * normal), max(0.0, normalScale.x)));").replace("mapN.xy *= normalScale;","mapN.xy *= normalScale; mapN.z = mix(1.0, mapN.z, clamp(normalScale.x, 0.0, 1.0));").replaceAll("texture2D( normalMap, vNormalMapUv )","blenderImageSample(normalMap, vNormalMapUv, blenderNormalClip)"),f=yt.map_fragment.replace("texture2D( map, vMapUv )","blenderImageSample(map, vMapUv, blenderMapClip)").replace("diffuseColor *= sampledDiffuseColor;","diffuseColor.rgb *= sampledDiffuseColor.rgb;"),r=yt.roughnessmap_fragment.replace("texture2D( roughnessMap, vRoughnessMapUv )","blenderImageSample(roughnessMap, vRoughnessMapUv, blenderRoughnessClip)"),l=yt.lights_fragment_begin.replace("getPointLightInfo( pointLight, geometryPosition, directLight );","getPointLightInfo( pointLight, geometryPosition, directLight ); directLight.color *= exp(-blenderWorldExtinction * length(pointLight.position-geometryPosition));").replace("getSpotLightInfo( spotLight, geometryPosition, directLight );","getSpotLightInfo( spotLight, geometryPosition, directLight ); directLight.color *= exp(-blenderWorldExtinction * length(spotLight.position-geometryPosition));").replace("getDirectionalLightInfo( directionalLight, directLight );","getDirectionalLightInfo( directionalLight, directLight ); directLight.color *= blenderInfiniteTransmission();").replace("rectAreaLight = rectAreaLights[ i ];","rectAreaLight = rectAreaLights[ i ]; rectAreaLight.color *= exp(-blenderWorldExtinction * length(rectAreaLight.position-geometryPosition));").replace("getAmbientLightIrradiance( ambientLightColor )","getAmbientLightIrradiance( ambientLightColor ) * blenderInfiniteTransmission()"),m=yt.lights_fragment_maps.replaceAll(/(getIBL(?:Irradiance|Radiance|AnisotropyRadiance)\([^;]+\))/g,"$1 * blenderInfiniteTransmission()");s.fragmentShader=s.fragmentShader.replace("#include <lights_physical_fragment>",c).replace("#include <lights_fragment_begin>",l).replace("#include <lights_fragment_maps>",m).replace("#include <normal_fragment_maps>",u).replace("#include <map_fragment>",f).replace("#include <roughnessmap_fragment>",r).replace("vec3 Fcc = F_Schlick",`
7088
+ `+s.fragmentShader;const c=yt.lights_physical_fragment.replace("material.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );","material.specularF90 = 1.0;").replace("material.clearcoatF0 = vec3( 0.04 );","material.clearcoatF0 = vec3( pow2( ( blenderCoatIor - 1.0 ) / ( blenderCoatIor + 1.0 ) ) );"),f=yt.normal_fragment_maps.replace("normal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;","vec3 blenderBaseNormal = normal; normal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0; normal.y *= normalScale.y < 0.0 ? -1.0 : 1.0;").replace("normal = normalize( normalMatrix * normal );","normal = normalize(mix(blenderBaseNormal, normalize(normalMatrix * normal), max(0.0, normalScale.x)));").replace("mapN.xy *= normalScale;","mapN.xy *= normalScale; mapN.z = mix(1.0, mapN.z, clamp(normalScale.x, 0.0, 1.0));").replaceAll("texture2D( normalMap, vNormalMapUv )","blenderImageSample(normalMap, vNormalMapUv, blenderNormalClip)"),r=yt.map_fragment.replace("texture2D( map, vMapUv )","blenderImageSample(map, vMapUv, blenderMapClip)").replace("diffuseColor *= sampledDiffuseColor;","diffuseColor.rgb *= sampledDiffuseColor.rgb;"),l=yt.roughnessmap_fragment.replace("texture2D( roughnessMap, vRoughnessMapUv )","blenderImageSample(roughnessMap, vRoughnessMapUv, blenderRoughnessClip)"),m=yt.lights_fragment_begin.replace("getPointLightInfo( pointLight, geometryPosition, directLight );","getPointLightInfo( pointLight, geometryPosition, directLight ); directLight.color *= exp(-blenderWorldExtinction * length(pointLight.position-geometryPosition));").replace("getSpotLightInfo( spotLight, geometryPosition, directLight );","getSpotLightInfo( spotLight, geometryPosition, directLight ); directLight.color *= exp(-blenderWorldExtinction * length(spotLight.position-geometryPosition));").replace("getDirectionalLightInfo( directionalLight, directLight );","getDirectionalLightInfo( directionalLight, directLight ); directLight.color *= blenderInfiniteTransmission();").replace("rectAreaLight = rectAreaLights[ i ];","rectAreaLight = rectAreaLights[ i ]; rectAreaLight.color *= exp(-blenderWorldExtinction * length(rectAreaLight.position-geometryPosition));").replace("getAmbientLightIrradiance( ambientLightColor )","getAmbientLightIrradiance( ambientLightColor ) * blenderInfiniteTransmission()"),h=yt.lights_fragment_maps.replaceAll(/(getIBL(?:Irradiance|Radiance|AnisotropyRadiance)\([^;]+\))/g,"$1 * blenderInfiniteTransmission()");s.fragmentShader=s.fragmentShader.replace("#include <lights_physical_fragment>",c).replace("#include <lights_fragment_begin>",m).replace("#include <lights_fragment_maps>",h).replace("#include <normal_fragment_maps>",f).replace("#include <map_fragment>",r).replace("#include <roughnessmap_fragment>",l).replace("vec3 Fcc = F_Schlick",`
7091
7089
  // Blender's slab_transmittance_at_angle (gpu_shader_material_principled.glsl):
7092
7090
  // Beer-Lambert attenuation through a refracting coat at this view angle.
7093
7091
  float coatPath = blenderCoatIor * inversesqrt(max(1e-8,
7094
7092
  blenderCoatIor * blenderCoatIor - (1.0 - dotNVcc * dotNVcc)));
7095
7093
  outgoingLight *= mix(vec3(1.0), pow(max(blenderCoatTint, vec3(0.0)), vec3(coatPath)), material.clearcoat);
7096
- vec3 Fcc = F_Schlick`),El(n,s)},n.needsUpdate=!0}a.blenderCoatIor.value=Math.max(1,e.coat_ior),a.blenderCoatTint.value.setRGB(...e.coat_tint,at),a.blenderMapClip.value=o.map===!0,a.blenderRoughnessClip.value=o.roughness===!0,a.blenderNormalClip.value=o.normal===!0}function Xn(n){const t=a=>{if(!(!a||typeof a!="object")){if("kind"in a&&["direction","window","sky"].includes(String(a.kind)))throw new Error(`World volume spatial input ${a.kind} is not implemented`);for(const i of Object.values(a))t(i)}};t(n);const o=Z(n)(new y);if(!(typeof o=="number"?[o]:o.toArray()).every(Number.isFinite))throw new Error("World volume input is not finite");return o}function Rt(n){const t=Xn(n);if(typeof t!="number")throw new Error("World volume scalar input resolved to a color");return Math.max(0,t)}function an(n){const t=Xn(n);return(typeof t=="number"?new y().setScalar(t):t.clone()).max(new y)}function Cl(n){if(n<800)return new y(5.413294490189271,0,0);if(n>=12e3)return new y(.8262954810464208,.9945080501520986,1.566307710274283);const t=[965,1167,1449,1902,3315,6365].filter(i=>n>=i).length,o=[[1619.19106,-.00205010916,5.02995757],[2488.45471,-.00111330907,3.22621544],[3341.43193,-.000486551192,1.76486769],[4094.61742,-.000127446582,.725731635],[4670.28036,291258199e-13,.126703442],[4595.09185,287495649e-13,.15034502],[3787.1745,935907826e-14,.399075871]][t],e=[[-488.999748,.000604330754,-.0755807526],[-755.994277,.000316730098,.478306139],[-1023.63977,.00012022347,.936662319],[-1265.71316,487340896e-14,1.27054498],[-1425.29332,-401150431e-13,1.43972784],[-1175.54822,-216378048e-13,1.30408023],[-500.799571,-459832026e-14,1.09098763]][t],a=[[596945309e-19,-485742887e-16,-970622247e-13,-.00407936148],[240430366e-19,555021075e-16,-.000198503712,.0289312858],[-140949732e-19,189878968e-15,-.000356632824,.0910767778],[-361460868e-19,284822009e-15,-.000493211319,.15672344],[-197075738e-19,175359352e-15,-.000250542825,-.0222783266],[-161997957e-21,-164216008e-16,.000386216271,-.738077418],[672650283e-21,-273078809e-16,.000424098264,-.752335691]][t];return new y(o[0]/n+o[1]*n+o[2],e[0]/n+e[1]*n+e[2],((a[0]*n+a[1])*n+a[2])*n+a[3]).max(new y)}function xo(n){if(!n?.volume?.length)return null;const t={extinction:new y,emission:new y,lobes:[]};for(const o of n.volume){const e=Rt(o.weight);if(e===0)continue;const a=an(o.color),i=Rt(o.density),s=new y,c=new y;if(o.kind==="absorption"&&s.set(1-a.x,1-a.y,1-a.z).max(new y).multiplyScalar(i),o.kind==="scatter"||o.kind==="principled"){c.copy(a).multiplyScalar(i);const u=o.kind==="principled"?"HENYEY_GREENSTEIN":o.phase;if(!["HENYEY_GREENSTEIN","DRAINE","RAYLEIGH"].includes(u))throw new Error(`World volume ${u} phase is not implemented`);const f=Xn(o.anisotropy);if(typeof f!="number")throw new Error("World volume anisotropy must be scalar");t.lobes.push({coefficient:c.clone().multiplyScalar(e),g:u==="RAYLEIGH"?0:it.clamp(f,-.999,.999),alpha:u==="RAYLEIGH"?1:u==="DRAINE"?Rt(o.alpha):0})}if(o.kind==="principled"){const u=an(o.absorption_color);s.set(Math.max(1-a.x,0)*Math.max(1-Math.sqrt(u.x),0),Math.max(1-a.y,0)*Math.max(1-Math.sqrt(u.y),0),Math.max(1-a.z,0)*Math.max(1-Math.sqrt(u.z),0)).multiplyScalar(i);const f=Rt(o.blackbody_intensity);if(f>.001){const r=Rt(o.temperature),l=5670373e-20/Math.PI*(1+f*(r**4-1));t.emission.add(Cl(r).multiply(an(o.blackbody_tint)).multiplyScalar(l*e))}}(o.kind==="principled"||o.kind==="emission")&&t.emission.add((o.kind==="emission"?a:an(o.emission_color)).multiplyScalar(Rt(o.emission_strength)*e)),t.extinction.add(s.add(c).multiplyScalar(e))}for(const o of["x","y","z"])if(t.extinction[o]===0&&t.emission[o]>0)throw new Error("Unbounded emissive World volume with zero extinction has divergent radiance");return t}class kl{constructor(t){this.medium=t,this.target=new xe(1,1,{type:jn,depthBuffer:!1}),this.geometry=new be(2,2),this.scene=new ye,this.camera=new we}render(t,o,e,a){if(!o.depthTexture)throw new Error("World volume render requires surface depth");const i={surface:{value:o.texture},depth:{value:o.depthTexture},inverseProjection:{value:a.projectionMatrixInverse},cameraWorld:{value:a.matrixWorld},orthographic:{value:a.isOrthographicCamera===!0},sigma:{value:this.medium.extinction},emission:{value:this.medium.emission}};let s="",c="",u=0,f=2;e.traverseVisible(h=>{if(!(h instanceof Sn||h instanceof En||h instanceof rn))return;const d=h,_=u++,v=d.getWorldPosition(new y);i[`lp${_}`]={value:v},i[`lc${_}`]={value:d.color.clone().multiplyScalar(d.intensity)},s+=`uniform vec3 lp${_}, lc${_};
7097
- `;let g="1.0",p="1.0";if(d instanceof En&&(i[`ld${_}`]={value:d.target.getWorldPosition(new y).sub(v).normalize()},i[`cone${_}`]={value:new _n(Math.cos(d.angle),Math.cos(d.angle*(1-d.penumbra)))},s+=`uniform vec3 ld${_}; uniform vec2 cone${_};
7098
- `,p=`smoothstep(cone${_}.x, max(cone${_}.x+1e-6,cone${_}.y),dot(-L,ld${_}))`),!(d instanceof rn)&&d.castShadow&&d.shadow.map){if(++f>t.capabilities.maxTextures)throw new Error("World volume shadow samplers exceed this GPU texture-unit limit");i[`sm${_}`]={value:d.shadow.map.texture},i[`sx${_}`]={value:d.shadow.matrix},i[`ss${_}`]={value:d.shadow.mapSize},i[`sb${_}`]={value:d.shadow.bias},i[`sn${_}`]={value:d.shadow.camera.near},i[`sf${_}`]={value:d.shadow.camera.far},s+=`uniform sampler2D sm${_}; uniform mat4 sx${_}; uniform vec2 ss${_}; uniform float sb${_},sn${_},sf${_};
7099
- `,g=d instanceof Sn?`getPointShadow(sm${_},ss${_},1.0,sb${_},1.0,sx${_}*vec4(p,1.0),sn${_},sf${_})`:`getShadow(sm${_},ss${_},1.0,sb${_},1.0,sx${_}*vec4(p,1.0))`}if(d instanceof rn){const b=new mt().extractRotation(d.matrixWorld);i[`lx${_}`]={value:new y(d.width,0,0).applyMatrix4(b)},i[`ly${_}`]={value:new y(0,d.height,0).applyMatrix4(b)},i[`ln${_}`]={value:new y(0,0,-1).transformDirection(b)},s+=`uniform vec3 lx${_},ly${_},ln${_};
7100
- `,c+=`for(int ax=0;ax<4;ax++) for(int ay=0;ay<4;ay++) {
7094
+ vec3 Fcc = F_Schlick`),Nl(n,s)},n.needsUpdate=!0}a.blenderCoatIor.value=Math.max(1,e.coat_ior),a.blenderCoatTint.value.setRGB(...e.coat_tint,at),a.blenderMapClip.value=o.map===!0,a.blenderRoughnessClip.value=o.roughness===!0,a.blenderNormalClip.value=o.normal===!0}function Xn(n){const t=a=>{if(!(!a||typeof a!="object")){if("kind"in a&&["direction","window","sky"].includes(String(a.kind)))throw new Error(`World volume spatial input ${a.kind} is not implemented`);for(const i of Object.values(a))t(i)}};t(n);const o=Z(n)(new y);if(!(typeof o=="number"?[o]:o.toArray()).every(Number.isFinite))throw new Error("World volume input is not finite");return o}function Rt(n){const t=Xn(n);if(typeof t!="number")throw new Error("World volume scalar input resolved to a color");return Math.max(0,t)}function an(n){const t=Xn(n);return(typeof t=="number"?new y().setScalar(t):t.clone()).max(new y)}function kl(n){if(n<800)return new y(5.413294490189271,0,0);if(n>=12e3)return new y(.8262954810464208,.9945080501520986,1.566307710274283);const t=[965,1167,1449,1902,3315,6365].filter(i=>n>=i).length,o=[[1619.19106,-.00205010916,5.02995757],[2488.45471,-.00111330907,3.22621544],[3341.43193,-.000486551192,1.76486769],[4094.61742,-.000127446582,.725731635],[4670.28036,291258199e-13,.126703442],[4595.09185,287495649e-13,.15034502],[3787.1745,935907826e-14,.399075871]][t],e=[[-488.999748,.000604330754,-.0755807526],[-755.994277,.000316730098,.478306139],[-1023.63977,.00012022347,.936662319],[-1265.71316,487340896e-14,1.27054498],[-1425.29332,-401150431e-13,1.43972784],[-1175.54822,-216378048e-13,1.30408023],[-500.799571,-459832026e-14,1.09098763]][t],a=[[596945309e-19,-485742887e-16,-970622247e-13,-.00407936148],[240430366e-19,555021075e-16,-.000198503712,.0289312858],[-140949732e-19,189878968e-15,-.000356632824,.0910767778],[-361460868e-19,284822009e-15,-.000493211319,.15672344],[-197075738e-19,175359352e-15,-.000250542825,-.0222783266],[-161997957e-21,-164216008e-16,.000386216271,-.738077418],[672650283e-21,-273078809e-16,.000424098264,-.752335691]][t];return new y(o[0]/n+o[1]*n+o[2],e[0]/n+e[1]*n+e[2],((a[0]*n+a[1])*n+a[2])*n+a[3]).max(new y)}function xo(n){if(!n?.volume?.length)return null;const t={extinction:new y,emission:new y,lobes:[]};for(const o of n.volume){const e=Rt(o.weight);if(e===0)continue;const a=an(o.color),i=Rt(o.density),s=new y,u=new y;if(o.kind==="absorption"&&s.set(1-a.x,1-a.y,1-a.z).max(new y).multiplyScalar(i),o.kind==="scatter"||o.kind==="principled"){u.copy(a).multiplyScalar(i);const c=o.kind==="principled"?"HENYEY_GREENSTEIN":o.phase;if(!["HENYEY_GREENSTEIN","DRAINE","RAYLEIGH"].includes(c))throw new Error(`World volume ${c} phase is not implemented`);const f=Xn(o.anisotropy);if(typeof f!="number")throw new Error("World volume anisotropy must be scalar");t.lobes.push({coefficient:u.clone().multiplyScalar(e),g:c==="RAYLEIGH"?0:it.clamp(f,-.999,.999),alpha:c==="RAYLEIGH"?1:c==="DRAINE"?Rt(o.alpha):0})}if(o.kind==="principled"){const c=an(o.absorption_color);s.set(Math.max(1-a.x,0)*Math.max(1-Math.sqrt(c.x),0),Math.max(1-a.y,0)*Math.max(1-Math.sqrt(c.y),0),Math.max(1-a.z,0)*Math.max(1-Math.sqrt(c.z),0)).multiplyScalar(i);const f=Rt(o.blackbody_intensity);if(f>.001){const r=Rt(o.temperature),l=5670373e-20/Math.PI*(1+f*(r**4-1));t.emission.add(kl(r).multiply(an(o.blackbody_tint)).multiplyScalar(l*e))}}(o.kind==="principled"||o.kind==="emission")&&t.emission.add((o.kind==="emission"?a:an(o.emission_color)).multiplyScalar(Rt(o.emission_strength)*e)),t.extinction.add(s.add(u).multiplyScalar(e))}for(const o of["x","y","z"])if(t.extinction[o]===0&&t.emission[o]>0)throw new Error("Unbounded emissive World volume with zero extinction has divergent radiance");return t}class $l{constructor(t){this.medium=t,this.target=new xe(1,1,{type:jn,depthBuffer:!1}),this.geometry=new be(2,2),this.scene=new ye,this.camera=new we}render(t,o,e,a){if(!o.depthTexture)throw new Error("World volume render requires surface depth");const i={surface:{value:o.texture},depth:{value:o.depthTexture},inverseProjection:{value:a.projectionMatrixInverse},cameraWorld:{value:a.matrixWorld},orthographic:{value:a.isOrthographicCamera===!0},sigma:{value:this.medium.extinction},emission:{value:this.medium.emission}};let s="",u="",c=0,f=2;e.traverseVisible(h=>{if(!(h instanceof Sn||h instanceof En||h instanceof rn))return;const d=h,_=c++,p=d.getWorldPosition(new y);i[`lp${_}`]={value:p},i[`lc${_}`]={value:d.color.clone().multiplyScalar(d.intensity)},s+=`uniform vec3 lp${_}, lc${_};
7095
+ `;let v="1.0",g="1.0";if(d instanceof En&&(i[`ld${_}`]={value:d.target.getWorldPosition(new y).sub(p).normalize()},i[`cone${_}`]={value:new _n(Math.cos(d.angle),Math.cos(d.angle*(1-d.penumbra)))},s+=`uniform vec3 ld${_}; uniform vec2 cone${_};
7096
+ `,g=`smoothstep(cone${_}.x, max(cone${_}.x+1e-6,cone${_}.y),dot(-L,ld${_}))`),!(d instanceof rn)&&d.castShadow&&d.shadow.map){if(++f>t.capabilities.maxTextures)throw new Error("World volume shadow samplers exceed this GPU texture-unit limit");i[`sm${_}`]={value:d.shadow.map.texture},i[`sx${_}`]={value:d.shadow.matrix},i[`ss${_}`]={value:d.shadow.mapSize},i[`sb${_}`]={value:d.shadow.bias},i[`sn${_}`]={value:d.shadow.camera.near},i[`sf${_}`]={value:d.shadow.camera.far},s+=`uniform sampler2D sm${_}; uniform mat4 sx${_}; uniform vec2 ss${_}; uniform float sb${_},sn${_},sf${_};
7097
+ `,v=d instanceof Sn?`getPointShadow(sm${_},ss${_},1.0,sb${_},1.0,sx${_}*vec4(p,1.0),sn${_},sf${_})`:`getShadow(sm${_},ss${_},1.0,sb${_},1.0,sx${_}*vec4(p,1.0))`}if(d instanceof rn){const b=new mt().extractRotation(d.matrixWorld);i[`lx${_}`]={value:new y(d.width,0,0).applyMatrix4(b)},i[`ly${_}`]={value:new y(0,d.height,0).applyMatrix4(b)},i[`ln${_}`]={value:new y(0,0,-1).transformDirection(b)},s+=`uniform vec3 lx${_},ly${_},ln${_};
7098
+ `,u+=`for(int ax=0;ax<4;ax++) for(int ay=0;ay<4;ay++) {
7101
7099
  vec3 delta=lp${_}+lx${_}*((float(ax)+.5)/4.-.5)+ly${_}*((float(ay)+.5)/4.-.5)-p;
7102
7100
  float d=length(delta); vec3 L=delta/max(d,1e-6);
7103
7101
  sum+=lc${_}*exp(-sigma*d)*phase(dot(L,ray))*max(dot(-L,ln${_}),0.)*
7104
7102
  length(lx${_})*length(ly${_})/(16.*max(d*d,1e-4)); }
7105
7103
  `}else i[`cut${_}`]={value:d.distance},i[`decay${_}`]={value:d.decay},s+=`uniform float cut${_},decay${_};
7106
- `,c+=`{ vec3 delta=lp${_}-p; float d=length(delta); vec3 L=delta/max(d,1e-6);
7104
+ `,u+=`{ vec3 delta=lp${_}-p; float d=length(delta); vec3 L=delta/max(d,1e-6);
7107
7105
  float cutoff=cut${_}>0.?pow(clamp(1.-pow(d/cut${_},4.),0.,1.),2.):1.;
7108
- sum+=lc${_}*exp(-sigma*d)*phase(dot(L,ray))*${p}*${g}*cutoff/max(pow(d,decay${_}),.01); }
7106
+ sum+=lc${_}*exp(-sigma*d)*phase(dot(L,ray))*${g}*${v}*cutoff/max(pow(d,decay${_}),.01); }
7109
7107
  `});let r="vec3 result=vec3(0.);";this.medium.lobes.forEach((h,d)=>{i[`scatter${d}`]={value:h.coefficient},i[`g${d}`]={value:h.g},i[`a${d}`]={value:h.alpha},s+=`uniform vec3 scatter${d}; uniform float g${d},a${d};
7110
7108
  `,r+=`result+=scatter${d}*(1.-g${d}*g${d})*(1.+a${d}*c*c)/(12.56637061436*(1.+a${d}*(1.+2.*g${d}*g${d})/3.)*pow(1.+g${d}*g${d}-2.*g${d}*c,1.5));`});const l=this.medium.extinction.toArray().filter(h=>h>0);i.range={value:l.length?20/Math.min(...l):1},this.material?.dispose(),this.material=new Vn({uniforms:i,depthTest:!1,depthWrite:!1,toneMapped:!1,defines:{USE_SHADOWMAP:"",NUM_DIR_LIGHT_SHADOWS:0,NUM_SPOT_LIGHT_SHADOWS:0,NUM_POINT_LIGHT_SHADOWS:0,NUM_SPOT_LIGHT_COORDS:0},vertexShader:"varying vec2 vUv; void main(){vUv=uv;gl_Position=vec4(position.xy,0.,1.);}",fragmentShader:`
7111
7109
  #include <common>
@@ -7116,7 +7114,7 @@ ${b}`)}t.fragmentShader=g}const Zo=new _n(1,1);function Nl(n){n.getDrawingBuffer
7116
7114
  uniform vec3 sigma,emission; uniform float range;
7117
7115
  ${s}
7118
7116
  vec3 phase(float c){${r} return result;}
7119
- vec3 incident(vec3 p,vec3 ray){vec3 sum=vec3(0.);${c}return sum;}
7117
+ vec3 incident(vec3 p,vec3 ray){vec3 sum=vec3(0.);${u}return sum;}
7120
7118
  float integral(float s,float d){float x=s*d;return x<.001 ? d*(1.-x*.5+x*x/6.) : (1.-exp(-x))/s;}
7121
7119
  void main(){
7122
7120
  float z=texture2D(depth,vUv).r; vec4 base=texture2D(surface,vUv);
@@ -7137,4 +7135,4 @@ ${b}`)}t.fragmentShader=g}const Zo=new _n(1,1);function Nl(n){n.getDrawingBuffer
7137
7135
  radiance+=incident(origin+ray*t,ray)*exp(-sigma*t)*(hi-lo);
7138
7136
  }
7139
7137
  gl_FragColor=vec4(radiance,base.a+(1.-base.a)*(1.-dot(tr,vec3(1./3.))));
7140
- }`}),this.scene.clear(),this.scene.add(new At(this.geometry,this.material)),this.target.setSize(o.width,o.height);const m=t.getRenderTarget();try{t.setRenderTarget(this.target),t.render(this.scene,this.camera)}finally{t.setRenderTarget(m)}return this.target}dispose(){this.material?.dispose(),this.geometry.dispose(),this.target.dispose(),this.scene.clear()}}const $l=O({object:A(),group:A(),groupIndex:R().int().nonnegative(),count:R().int().nonnegative(),digest:A(),alertMode:X(["NONE","ACTIVE","ALL"]),unchanged:L(!0).optional(),weightsBase64:A().optional(),alertBase64:A().optional()}).strict();function Ll(n){const o=n<0?0:n>1?1:n,e=(.5+.5*o)**1.5,[a,i,s]=Vl(2/3*(1-o)),c=new gt;return c.setRGB((a*e)**(1/1.5),(i*e)**(1/1.5),(s*e)**(1/1.5),$t),c}function Vl(n){const t=(n%1+1)%1,o=Math.floor(t*6),e=t*6-o;switch(o%6){case 0:return[1,e,0];case 1:return[1-e,1,0];case 2:return[0,1,e];case 3:return[0,1-e,1];case 4:return[e,0,1];default:return[1,0,1-e]}}const jl=0;function bo(n){const t=atob(n),o=new Uint8Array(t.length);for(let e=0;e<t.length;e++)o[e]=t.charCodeAt(e);return o}class Bl{constructor(){this.group=new _t,this.mesh=null,this.material=null,this.geometry=null,this.held=null,this.signature="",this.group.name="BlenderWeightOverlay"}apply(t,o,e){if(t===null||o===null||!o.isMesh||e===null)return this.clear(),this.signature="",null;const a=`${t.object}:${t.group}`;if(t.unchanged===!0){if(this.held?.key!==a)return this.clear(),`weights: the session sent a reference to ${a} that this overlay does not hold; the colours reappear on the next change to the mesh or the group`}else{if(t.weightsBase64===void 0||t.alertBase64===void 0)return this.clear(),`weights: ${a} carried neither an array nor a reference`;const d=bo(t.weightsBase64);this.held={key:a,weights:new Float32Array(d.buffer,d.byteOffset,t.count),alerts:bo(t.alertBase64)}}const i=this.held;if(i===null)return null;const s=`${a}:${t.digest}:${o.geometry.uuid}:${t.alertMode}:${e.elements.join(",")}`;if(s===this.signature&&this.mesh!==null)return null;this.signature=s,this.clear();const c=o.geometry.clone(),u=c.getAttribute("position"),f=c.getAttribute("blenderVertex");if(f===void 0)return c.dispose(),"weights: the presented geometry carries no per-vertex Blender index (`blenderVertex`), so the weights cannot be laid over it";const r=new Float32Array(u.count*3),l=new gt().setHex(jl,$t);for(let d=0;d<u.count;d++){const _=f.getX(d),g=t.alertMode!=="NONE"&&i.alerts[_]===1?l:Ll(i.weights[_]??0);r[d*3]=g.r,r[d*3+1]=g.g,r[d*3+2]=g.b}c.setAttribute("color",new tt(r,3)),c.deleteAttribute("blenderVertex");const m=new Po({vertexColors:!0,polygonOffset:!0,polygonOffsetFactor:-1,polygonOffsetUnits:-1}),h=new At(c,m);return h.name=`${t.object}:weights`,h.frustumCulled=!1,h.matrixAutoUpdate=!1,h.matrix.copy(e),h.matrix.decompose(h.position,h.quaternion,h.scale),this.geometry=c,this.material=m,this.mesh=h,this.group.add(h),null}clear(){this.mesh&&this.group.remove(this.mesh),this.geometry?.dispose(),this.material?.dispose(),this.mesh=null,this.geometry=null,this.material=null}dispose(){this.clear(),this.held=null,this.signature=""}}const S=R().finite(),Qo=j([S,S,S]),ln=j([R().int().nonnegative(),R().int().nonnegative()]),J={name:A(),domain:X(["POINT","EDGE","FACE","CORNER"])},Ul=Ve("type",[O({...J,type:L("FLOAT2"),data:z(j([S,S]))}).strict(),O({...J,type:L("FLOAT_VECTOR"),data:z(Qo)}).strict(),O({...J,type:L("FLOAT_COLOR"),data:z(j([S,S,S,S]))}).strict(),O({...J,type:L("BYTE_COLOR"),data:z(j([S,S,S,S]))}).strict(),O({...J,type:L("QUATERNION"),data:z(j([S,S,S,S]))}).strict(),O({...J,type:L("FLOAT4"),data:z(j([S,S,S,S]))}).strict(),O({...J,type:L("FLOAT4X4"),data:z(z(S).length(16))}).strict(),O({...J,type:L("INT16_2D"),data:z(j([R().int(),R().int()]))}).strict(),O({...J,type:L("INT32_2D"),data:z(j([R().int(),R().int()]))}).strict(),O({...J,type:L("FLOAT"),data:z(S)}).strict(),O({...J,type:L("INT"),data:z(R().int())}).strict(),O({...J,type:L("INT8"),data:z(R().int())}).strict(),O({...J,type:L("BOOLEAN"),data:z(Y())}).strict(),O({...J,type:L("STRING"),data:z(A())}).strict()]),ql=O({positions:V(Float32Array),normals:V(Float32Array).nullable(),uv:V(Float32Array).nullable(),uvLayers:z(O({name:A(),data:V(Float32Array)}).strict()).optional(),attributeLayers:z(O({name:A(),data:V(Float32Array)}).strict()).optional(),orco:V(Float32Array).nullable().optional(),indices:V(Uint32Array),groups:z(O({start:R().int().nonnegative(),count:R().int().nonnegative(),materialIndex:R().int().nonnegative()}).strict()),hash:A()}).strict(),Hl=O({v:z(Qo),f:z(z(R().int().nonnegative())),e:z(ln).optional(),edge_order:z(ln).optional(),m:z(R().int().nonnegative()).optional(),s:z(Y()).optional(),sharp:z(ln).optional(),seams:z(ln).optional(),creases:z(j([S,S,S])).optional(),attributes:z(Ul).optional(),active_uv:A().nullable().optional(),render_uv:A().nullable().optional()}).strict(),Wl=O({store:R().int().optional(),revision:R().int(),unchanged:L(!0)}).strict(),Gl=O({co:V(Float64Array),cornerNormal:V(Float32Array).optional(),orco:V(Float32Array).optional(),faceStart:V(Uint32Array),corner:V(Uint32Array),cornerEdge:V(Int32Array),edge:V(Uint32Array),edgeSharp:V(Uint8Array),edgeSeam:V(Uint8Array),edgeCrease:V(Float32Array),material:V(Uint32Array),smooth:V(Uint8Array),vertSelect:V(Uint8Array),vertHide:V(Uint8Array),edgeSelect:V(Uint8Array),edgeHide:V(Uint8Array),faceSelect:V(Uint8Array),faceHide:V(Uint8Array)}).strict(),Xl=O({name:A(),domain:X(["POINT","EDGE","FACE","CORNER"]),type:A(),data:je(n=>ArrayBuffer.isView(n))}).strict(),Yl=O({columns:Gl,attributes:z(Xl),activeUv:A().nullable(),renderUv:A().nullable(),counts:O({verts:R().int().nonnegative(),edges:R().int().nonnegative(),faces:R().int().nonnegative(),corners:R().int().nonnegative()}).strict(),revision:R().int().nonnegative()}).strict(),Zl=Nt([ql,Yl,Hl,Wl]),yo=new Set;function Ql(n){const t=new Blob([n],{type:"image/png"}),o=new Ne;let e=!1;o.addEventListener("dispose",()=>{e=!0,o.image?.close?.()});const a=createImageBitmap(t,{imageOrientation:"flipY"}).then(i=>{if(e){i.close();return}o.image=i,o.needsUpdate=!0,Jt()}).finally(()=>{yo.delete(a)});return yo.add(a),a.catch(()=>{}),{texture:o,ready:a}}function Kl(n,t,o,e){const a=new mn(n,t,o,dn,Ee);return a.flipY=!1,a.colorSpace=e==="data"?Bn:$t,a.needsUpdate=!0,a}function Jl(n,t,o){if(t.length===0)throw new Error(`Runtime image ${n} is tiled with no tiles`);const e=Math.max(...t.map(r=>r.width)),a=Math.max(...t.map(r=>r.height)),i=new Uint8Array(e*a*4*t.length),s=Math.max(...t.map(r=>r.number-1001))+1,c=new Float32Array(s*2*4);for(let r=0;r<s;r++)c[r*4]=-1;t.forEach((r,l)=>{const m=r.rgba??(r.rgbaBase64?Rn(r.rgbaBase64):void 0);if(!m)throw new Error(`Runtime image ${n} tile ${r.number} carries no raster`);for(let d=0;d<r.height;d++)i.set(m.subarray(d*r.width*4,(d+1)*r.width*4),(l*a+d)*e*4);const h=r.number-1001;c[h*4]=l,c.set([0,0,r.width/e,r.height/a],(s+h)*4)});const u=new Se(i,e,a,t.length);u.colorSpace=o==="data"?Bn:$t,u.magFilter=St,u.minFilter=Ro,u.generateMipmaps=!0,u.needsUpdate=!0;const f=new mn(c,s,2,dn,No);return f.magFilter=f.minFilter=Nn,f.needsUpdate=!0,{tiles:u,map:f,frame:t}}const tr=O({width:R().int().positive(),height:R().int().positive(),revision:R().int().nonnegative(),rgba:V(Uint8Array).optional(),rgbaBase64:A().optional(),colorspace:X(["sRGB","data"]).optional(),tiles:z(O({number:R().int().min(1001),width:R().int().positive(),height:R().int().positive(),rgba:V(Uint8Array).optional(),rgbaBase64:A().optional()}).strict()).optional()}).strict(),nr=O({revision:R().int().nonnegative(),png:V(Uint8Array).optional(),pngBase64:A().optional()}).strict(),or=Nt([tr,nr]),Pn=O({image:O({name:A(),revision:R().int().nonnegative()}).strict(),extension:X(["REPEAT","EXTEND","MIRROR","CLIP"]).default("REPEAT"),uv:A(),tint:j([S,S,S]).optional()}).strict(),er=O({name:A(),color:j([S,S,S,S]),roughness:S,metallic:S,transmission:S,ior:S,physical:Il.optional(),normal_texture:Pn.optional(),normal_strength:S.default(1),normal_space:X(["TANGENT","OBJECT"]).default("TANGENT"),normal_directx:Y().default(!1),texture:Pn.optional(),roughness_texture:Pn.optional(),emission:O({color:j([S,S,S]),strength:S}).strict().optional(),graph:il.optional()}).strict(),ar=O({session:A(),revision:R().int().nonnegative(),volumes:st(A(),Ho).default({}),lights:st(A(),Ua).default({}),world:Ka.nullable().default(null),meshes:st(A(),Zl),materials:st(A(),er),images:st(A(),or).default({}),objects:z(O({id:A(),name:A(),type:X(["MESH","CURVE","SURFACE","FONT","META","ARMATURE","LATTICE","VOLUME","EMPTY","CAMERA","LIGHT","SPEAKER","GREASEPENCIL","POINTCLOUD","LIGHT_PROBE"]),mesh:A().nullable(),volume:A().nullable().optional(),light:A().nullable().optional(),materials:z(A().nullable()),matrix:z(j([S,S,S,S])).length(4),visible:Y(),render_visible:Y().default(!0),selected:Y(),parent:A().nullable(),texspace:j([j([S,S,S]),j([S,S,S])]).optional(),default_color:A().optional()}).strict()),active:A().nullable(),mode:A(),cameras:st(A(),st(A(),Fo())).default({}),warnings:z(A()).default([]),updated:z(A()).default([]),frame:R().int().default(0),armatures:st(A(),He).default({}),weights:$l.nullable().default(null)}).strict();class Yn{constructor(){this.root=new _t,this.objects=new Map,this.meshes=new Map,this.volumes=new Map,this.materials=new Map,this.lights=new Map,this.lighting=new Qa,this.world=new Hn,this.armatureOverlay=new oa,this.weightOverlay=new Bl,this.armatureRoot=new _t,this.weightRoot=new _t,this.rendered=!1,this.fallback=new Qt({color:12172998,roughness:.72}),this.textures=new Map,this.textureNames=new Map,this.roughnessTextureNames=new Map,this.textureSamplers=new Rl,this.graphSamplers=new Map,this.photograph=!1,this.graphs=new Map,this.frame=null,this.retiredSessions=new Set,this.geometryBuilds=0,this.submittedMeshes=new Map,this.submitted=null,this.submittedSession=null,this.photographs=[],this.frameListeners=new Set,this.mode=null,this.root.name="Model",this.root.matrixAutoUpdate=!1,this.root.matrix.set(1,0,0,0,0,0,1,0,0,-1,0,0,0,0,0,1),this.root.updateMatrixWorld(!0);for(const[t,o]of[[this.armatureRoot,this.armatureOverlay.group],[this.weightRoot,this.weightOverlay.group]])t.matrixAutoUpdate=!1,t.matrix.copy(this.root.matrix),t.add(o),t.updateMatrixWorld(!0);this.armatureRoot.name="BlenderBones",this.weightRoot.name="BlenderWeights"}compiledGraph(t){const o=JSON.stringify(t);let e=this.graphs.get(o);return e||(e=yl(t),this.graphs.size>256&&this.graphs.clear(),this.graphs.set(o,e)),e}subscribeFrames(t){return this.frameListeners.add(t),()=>{this.frameListeners.delete(t)}}onChange(t){const o=this.subscribeFrames(t),e=Ue(t);return()=>{o(),e()}}blenderObjectName(t){for(const[o,e]of this.objects)if(e===t)return this.frame?.objects.find(a=>a.id===o)?.name??null;return null}blenderSelection(){const t=this.frame;return t===null?{selected:[],active:null}:{selected:t.objects.filter(o=>o.selected).map(o=>o.name),active:t.active}}setStageMode(t){this.mode=t}stageMode(){return this.mode}objectForBlenderName(t){const o=this.frame?.objects.find(e=>e.name===t);return o===void 0?null:this.objects.get(o.id)??null}replacePresentedObject(t,o){for(const[e,a]of this.objects)if(a===t){const i=t.parent,s=[...t.children];t.removeFromParent();for(const c of s)o.add(c);i?.add(o),this.objects.set(e,o);return}}studioLights(){return this.lighting.group}overlayGroups(){return[{kind:"skeletons",object:this.armatureRoot},{kind:"weights",object:this.weightRoot}]}async setRendered(t,o){const e=(t?xo(this.frame?.world)?.extinction:null)??new y;for(const a of[...this.materials.values(),this.fallback])zl(a,e);this.rendered=t,this.lighting.setRendered(t),t?this.world.apply(this.root,this.frame?.world??null,o):this.world.clear(),this.applyVisibility(),this.applyShadows(t,o),t&&(await Ha(),await Promise.all([...this.textures.values()].map(a=>a.ready)),await this.world.ready())}applyShadows(t,o){this.root.updateMatrixWorld(!0);const e=[];for(const u of this.objects.values()){const f=u;if(f.isMesh&&(f.castShadow=t,f.receiveShadow=t,t&&f.visible)){const r=new fn().setFromObject(f);r.isEmpty()||e.push(r)}}if(!t||!e.length)return;const i=e.reduce((u,f)=>u.union(f),new fn).getBoundingSphere(new Oe),s=o?new Te().setFromProjectionMatrix(new mt().multiplyMatrices(o.projectionMatrix,o.matrixWorldInverse)):null,c=s?e.flatMap(u=>nl(u,s)):[];for(const u of this.lights.values())u.isDirectionalLight&&o?ol(u,c,e):Xa(u,i.center,i.radius)}applyOverlays(t){const o=s=>{const c=t.objects.find(u=>u.name===s);return c===void 0?null:new mt().set(...c.matrix.flat())},e=[...this.armatureOverlay.apply(t.armatures,o)],a=t.weights?this.objects.get(t.objects.find(s=>s.name===t.weights?.object)?.id??""):void 0,i=this.weightOverlay.apply(t.weights,a??null,t.weights?o(t.weights.object):null);return i!==null&&e.push(i),e}applyVisibility(){for(const t of this.frame?.objects??[]){const o=this.objects.get(t.id);if(o&&(o.visible=this.rendered?t.render_visible:t.visible),!t.light)continue;const e=this.lights.get(t.light);e&&(e.visible=this.rendered&&t.render_visible)}this.armatureOverlay.group.visible=!this.rendered,this.weightOverlay.group.visible=!this.rendered}applyFrame(t){const o=this.frame===null?null:{session:this.frame.session,revision:this.frame.revision},e=ar.parse(t);if(this.retiredSessions.has(e.session))throw new Error("The runtime session was replaced; its delayed frame cannot overwrite the active model");if(this.frame?.session===e.session&&e.revision<this.frame.revision)throw new Error("The runtime frame is older than the displayed model");const a=new Set(e.objects.map(f=>f.id));if(a.size!==e.objects.length)throw new Error("Runtime object IDs must be unique");const i=new Map(e.objects.map(f=>[f.id,f]));for(const f of e.objects){if(f.mesh!==null&&!e.meshes[f.mesh])throw new Error(`Missing runtime mesh ${f.mesh}`);if(f.volume&&(!e.volumes[f.volume]||f.mesh!==null))throw new Error(`Invalid runtime volume ${f.volume}`);if(f.light&&(!e.lights[f.light]||f.mesh!==null))throw new Error(`Invalid runtime light ${f.light}`);for(const m of f.materials)if(m!==null&&!e.materials[m])throw new Error(`Missing runtime material ${m}`);const r=new Set([f.id]);let l=f.parent;for(;l!==null;){if(r.has(l))throw new Error("Runtime parent cycle");r.add(l);const m=i.get(l);if(!m)throw new Error(`Missing runtime parent ${l}`);l=m.parent}}const s=new Map,c=new Map;try{for(const[f,r]of Object.entries(e.volumes)){const l=JSON.stringify(r);this.frame?.session===e.session&&this.volumes.get(f)?.signature===l||c.set(f,{signature:l,mesh:el(r)})}for(const[f,r]of Object.entries(e.meshes)){if("unchanged"in r){if(this.frame?.session===e.session&&this.meshes.has(f))continue;throw new Error(`${ea}: the presenter does not hold runtime mesh ${f} (store ${r.store}, revision ${r.revision})`)}const l="hash"in r,m="columns"in r,h=m?`revision:${r.revision}`:l?r.hash:JSON.stringify(r);this.frame?.session===e.session&&this.meshes.get(f)?.signature===h||s.set(f,{signature:h,geometry:m?In(ha({...r.columns,attributes:r.attributes,activeUv:r.activeUv,renderUv:r.renderUv},h)):l?In(r):pa(r)})}}catch(f){for(const r of s.values())r.geometry.dispose();for(const{mesh:r}of c.values())r.geometry.dispose(),r.material.dispose();throw f}this.frame?.session!==e.session&&(this.frame&&this.retiredSessions.add(this.frame.session),this.clear());for(const[f,r]of c){const l=this.volumes.get(f)?.mesh;l&&(l.removeFromParent(),l.geometry.dispose(),l.material.dispose()),this.volumes.set(f,r)}for(const[f,r]of s)this.meshes.get(f)?.geometry.dispose(),this.meshes.set(f,r),this.geometryBuilds++;for(const[f,r]of Object.entries(e.images)){const l=this.textures.get(f);if("width"in r){const _=r.rgba??(r.rgbaBase64?Rn(r.rgbaBase64):void 0);if(!_)throw new Error(`Runtime image ${f} carries no raster`);const v=r.tiles?Jl(f,r.tiles,r.colorspace??"sRGB"):void 0;if(l?.udim&&(l.udim.tiles.dispose(),l.udim.map.dispose(),delete l.udim),l&&l.width===r.width&&l.height===r.height){const g=l.texture.image;if(g.data){g.data.set(_),l.texture.needsUpdate=!0,l.revision=r.revision,v&&(l.udim=v);continue}}l?.texture.dispose(),this.textures.set(f,{texture:Kl(_,r.width,r.height,r.colorspace??"sRGB"),width:r.width,height:r.height,revision:r.revision,...v?{udim:v}:{}});continue}const m=r.png??(r.pngBase64?Rn(r.pngBase64):void 0);if(!m)throw new Error(`Runtime image ${f} carries no bytes`);l?.texture.dispose(),l?.udim?.tiles.dispose(),l?.udim?.map.dispose();const{texture:h,ready:d}=Ql(m);h.colorSpace=$t,this.textures.set(f,{texture:h,ready:d,width:0,height:0,revision:r.revision,png:m.slice()})}for(const[f,r]of Object.entries(e.materials)){const l=this.materials.get(f)??new Qt;l.name=r.name;const m=r.texture?.tint;r.texture!==void 0?l.color.setRGB(m?.[0]??1,m?.[1]??1,m?.[2]??1,at):l.color.setRGB(r.color[0],r.color[1],r.color[2],at),l.opacity=r.color[3];const h=l.opacity<1||r.graph!==void 0&&sl(r.graph);l.transparent!==h&&(l.transparent=h,l.needsUpdate=!0),l.roughness=r.roughness,l.metalness=r.metallic,l.transmission=r.transmission,l.ior=r.ior,Gn(l,r.physical,{map:r.texture?.extension==="CLIP",roughness:r.roughness_texture?.extension==="CLIP",normal:r.normal_texture?.extension==="CLIP"});const d=r.normal_texture?.image.name;if(d===void 0)l.normalMap&&(this.textureSamplers.delete(`${f}:normal`),l.normalMap=null,l.needsUpdate=!0);else{const b=this.textures.get(d);if(!b)throw new Error(`${jt}: missing normal image ${d}`);const T=this.textureSamplers.get(`${f}:normal`,b.texture,r.normal_texture.extension,b.ready,r.normal_texture.uv);l.normalMap!==T&&(l.normalMap=T,l.needsUpdate=!0);const D=r.normal_space==="OBJECT"?Pe:Ae;l.normalMapType!==D&&(l.normalMapType=D,l.needsUpdate=!0),l.normalScale.set(r.normal_strength,r.normal_strength*(r.normal_directx?-1:1))}r.emission?(l.emissive.setRGB(r.emission.color[0],r.emission.color[1],r.emission.color[2],at),l.emissiveIntensity=r.emission.strength):(l.emissive.setRGB(0,0,0),l.emissiveIntensity=1);const _=r.roughness_texture?.image.name??null;if(_===null)this.roughnessTextureNames.has(f)&&(this.textureSamplers.delete(`${f}:roughness`),l.roughnessMap=null,this.roughnessTextureNames.delete(f),l.needsUpdate=!0);else{const b=this.textures.get(_);if(!b)throw new Error(`${jt}: the presenter does not hold runtime image ${_} (revision ${r.roughness_texture.image.revision})`);const T=this.textureSamplers.get(`${f}:roughness`,b.texture,r.roughness_texture.extension,b.ready,r.roughness_texture.uv);l.roughnessMap!==T&&(l.roughnessMap=T,this.roughnessTextureNames.set(f,_),l.needsUpdate=!0)}const v=r.texture?.image.name??null;if(v===null)this.textureNames.has(f)&&(this.textureSamplers.delete(`${f}:color`),l.map=null,this.textureNames.delete(f),l.needsUpdate=!0);else{const b=this.textures.get(v);if(!b)throw new Error(`${jt}: the presenter does not hold runtime image ${v} (revision ${r.texture.image.revision})`);const T=this.textureSamplers.get(`${f}:color`,b.texture,r.texture.extension,b.ready,r.texture.uv);l.map!==T&&(l.map=T,this.textureNames.set(f,v),l.needsUpdate=!0)}const g=r.graph?this.compiledGraph(r.graph):null,p=new Set;Ol(l,g,b=>{const T=this.textures.get(b.name);if(!T)throw new Error(`${jt}: the presenter does not hold runtime image ${b.name} (revision ${b.revision})`);if(b.tiled){if(!T.udim)throw new Error(`${jt}: runtime image ${b.name} arrived without its UDIM tiles`);return T.udim}const D=`${f}:graph:${b.node}`;p.add(D);const w=this.textureSamplers.get(D,T.texture,b.extension,T.ready),E=b.closest?Nn:St,I=b.closest?Nn:b.mipmap?Ro:St;return(w.magFilter!==E||w.minFilter!==I)&&(w.magFilter=E,w.minFilter=I,w.needsUpdate=!0),w},this.photograph);for(const b of this.graphSamplers.get(f)??[])p.has(b)||this.textureSamplers.delete(b);this.graphSamplers.set(f,p),this.materials.set(f,l)}for(const f of e.objects){let r=this.objects.get(f.id);const l=f.volume?this.volumes.get(f.volume).mesh:null;if((!r||(l?r!==l:!!r.isMesh!=(f.mesh!==null)))&&(r?.removeFromParent(),r=l??(f.mesh!==null?new At(this.meshes.get(f.mesh).geometry,this.fallback):new Ao),this.objects.set(f.id,r)),r.name=f.name,r.matrixAutoUpdate=!1,r.matrix.set(...f.matrix.flat()),f.parent){const m=new mt().set(...i.get(f.parent).matrix.flat());r.matrix.premultiply(m.invert())}if(r.matrix.decompose(r.position,r.quaternion,r.scale),f.texspace?r.userData.blenderTexspace=f.texspace:delete r.userData.blenderTexspace,f.default_color!==void 0?r.userData.blenderDefaultColor=f.default_color:delete r.userData.blenderDefaultColor,f.mesh!==null){const m=r;m.geometry=this.meshes.get(f.mesh).geometry,m.material=f.materials.length?f.materials.map(h=>h===null?this.fallback:this.materials.get(h)):this.fallback,Al(m)}if(f.light){const m=this.lights.get(f.light)??null,h=Ga(e.lights[f.light],m);m&&m!==h&&(m.removeFromParent(),m.dispose()),h.parent!==r&&r.add(h),Ya(h,r),this.lights.set(f.light,h)}}for(const f of e.objects){const r=this.objects.get(f.id),l=f.parent===null?this.root:this.objects.get(f.parent);r.parent!==l&&l.add(r)}for(const[f,r]of this.objects)a.has(f)||(r.removeFromParent(),this.objects.delete(f));for(const[f,r]of this.volumes)e.volumes[f]||(r.mesh.geometry.dispose(),r.mesh.material.dispose(),this.volumes.delete(f));for(const[f,r]of this.meshes)e.meshes[f]||(r.geometry.dispose(),this.meshes.delete(f));for(const[f,r]of this.materials)if(!e.materials[f]){for(const l of["normal","roughness","color"])this.textureSamplers.delete(`${f}:${l}`);for(const l of this.graphSamplers.get(f)??[])this.textureSamplers.delete(l);this.graphSamplers.delete(f),r.dispose(),this.materials.delete(f)}for(const[f,r]of this.lights)e.lights[f]||(r.removeFromParent(),r.dispose(),this.lights.delete(f));this.root.updateMatrixWorld(!0),this.frame={...e,meshes:{},volumes:{}};const u=this.applyOverlays(e);u.length&&(this.frame={...this.frame,warnings:[...this.frame.warnings,...u]}),this.applyVisibility();for(const f of[...this.frameListeners])f();return{...this.inspect(),held:o}}inspect(){return{session:this.frame?.session,revision:this.frame?.revision,active:this.frame?.active,mode:this.frame?.mode,geometryBuilds:this.geometryBuilds,objects:[...this.objects].map(([t,o])=>({id:t,name:o.name,uuid:o.uuid,geometry:o.geometry?.uuid,visible:o.visible}))}}snapshot(){return this.frame}captureSnapshot(){const t=this.frame;if(!t)throw new Error("Blender capture requires a presented frame");const o=structuredClone({...t,images:{},armatures:{},weights:null});for(const[u,{signature:f,geometry:r}]of this.meshes){const l=d=>{const _=r.getAttribute(d);if(!_)return null;if(!(_ instanceof tt))throw new Error(`Blender capture cannot copy interleaved ${d}`);return new Float32Array(_.array)},m=l("position");if(!m)throw new Error(`Blender capture mesh ${u} has no positions`);const h=r.getIndex();o.meshes[u]={hash:f,positions:m,normals:l("normal"),uv:l("uv"),uvLayers:Object.entries(r.userData.blenderUvChannels??{}).map(([d,_])=>{const v=l(`uv${_}`);if(!v)throw new Error(`Blender capture mesh ${u} is missing UV layer ${d}`);return{name:d,data:v}}),orco:r.userData.blenderOrcoFromDoor?l("blenderOrco"):null,attributeLayers:(r.userData.blenderAttributes??[]).map(d=>{const _=l(Et(d));if(!_)throw new Error(`Blender capture mesh ${u} is missing attribute ${d}`);return{name:d,data:_}}),indices:h?new Uint32Array(h.array):Uint32Array.from({length:m.length/3},(d,_)=>_),groups:r.groups.map(d=>({start:d.start,count:d.count,materialIndex:d.materialIndex??0}))}}for(const[u,{signature:f}]of this.volumes)o.volumes[u]=Ho.parse(JSON.parse(f));const e=new Set(Object.values(o.materials).flatMap(u=>[u.texture?.image.name,u.roughness_texture?.image.name,u.normal_texture?.image.name,...Object.values(u.graph?.nodes??{}).map(f=>f.props.image?.name)].filter(f=>f!==void 0)));for(const u of e){const f=this.textures.get(u);if(!f)throw new Error(`Blender capture image ${u} is not resident`);if(f.png)o.images[u]={revision:f.revision,png:f.png.slice()};else{const r=f.texture.image?.data;if(!(r instanceof Uint8Array))throw new Error(`Blender capture image ${u} has no resident raster`);o.images[u]={revision:f.revision,width:f.width,height:f.height,rgba:r.slice(),colorspace:f.texture.colorSpace===Bn?"data":"sRGB",...f.udim?{tiles:f.udim.frame}:{}}}}const a=this.createWorldVolumePass(),i=new Yn;i.photograph=!0;let s=!1;const c=()=>{s||(s=!0,a?.dispose(),i.dispose(),i.root.removeFromParent())};try{i.applyFrame(o),this.root.updateWorldMatrix(!0,!1),i.root.matrix.copy(this.root.matrixWorld),i.root.updateMatrixWorld(!0)}catch(u){throw c(),u}return{effect:a,root:i.root,session:t.session,revision:t.revision,prepare:u=>{if(s)throw new Error("Blender capture snapshot is disposed");return i.setRendered(!0,u)},dispose:c}}createWorldVolumePass(){const t=xo(this.frame?.world);return t?new kl(t):void 0}recordPresentation(t){if(typeof t!="object"||t===null)return;const o=t,e=o.meshes;if(typeof e!="object"||e===null)return;const a=typeof o.session=="string"?o.session:null;a!==this.submittedSession&&(this.submittedMeshes.clear(),this.photographs.length=0,this.submittedSession=a);const i=e;for(const[s,c]of Object.entries(i))typeof c=="object"&&c!==null&&!("unchanged"in c)&&this.submittedMeshes.set(s,c);for(const s of[...this.submittedMeshes.keys()])s in i||this.submittedMeshes.delete(s);this.submitted={...o,meshes:Object.fromEntries(this.submittedMeshes)}}recordPhotograph(t){this.photographs.push(t)}observations(){return{presentation:this.submitted,photographs:this.photographs}}clear(){for(const t of this.lights.values())t.removeFromParent(),t.dispose();this.lights.clear();for(const t of this.objects.values())t.removeFromParent();for(const t of this.meshes.values())t.geometry.dispose();for(const t of this.materials.values())t.dispose();for(const{mesh:t}of this.volumes.values())t.geometry.dispose(),t.material.dispose();for(const{texture:t,udim:o}of this.textures.values())t.dispose(),o?.tiles.dispose(),o?.map.dispose();this.textures.clear(),this.textureNames.clear(),this.roughnessTextureNames.clear(),this.textureSamplers.clear(),this.volumes.clear(),this.objects.clear(),this.meshes.clear(),this.materials.clear()}dispose(){this.clear(),this.fallback.dispose(),this.lighting.dispose(),this.world.dispose(),this.armatureOverlay.dispose(),this.weightOverlay.dispose(),this.frame=null,this.retiredSessions.clear(),this.submittedMeshes.clear(),this.submitted=null,this.submittedSession=null,this.photographs.length=0}}const _r=new Yn;function Ko(n){const t=atob(n),o=new Uint8Array(t.length);for(let e=0;e<t.length;e++)o[e]=t.charCodeAt(e);return o}function An(n){const t=Ko(n);return new Float32Array(t.buffer,t.byteOffset,t.byteLength>>2)}function lr(n){const t=Ko(n);return new Uint16Array(t.buffer,t.byteOffset,t.byteLength>>1)}function rr(n){return new mt().set(...n.flat())}function wo(n,t){return[n.object,n.mesh,n.armature,n.vertexCount,n.bones.length,t].join("|")}class ir{#n=new Map;#o=null;#a=null;#t=null;#i=null;#e=null;#r=null;#s=new Set;#u=0;#_=[];#l=0;get version(){return this.#u}get engineCalls(){return this.#l}subscribe(t){return this.#s.add(t),()=>this.#s.delete(t)}#f(){this.#u++;for(const t of[...this.#s])t()}state(){const t=this.#t,o=t?.frameStart??1,e=t?.frameEnd??250,a=t?.fps??24;return{frame:this.frame(),start:o,end:e,fps:a,action:t?.action??null,object:t?.object??null,armature:t?.armature??null,bones:[...this.#n.values()].reduce((i,s)=>i+s.bones.length,0),keyframes:t?.keyframes??[],summary:t?.summary??[],clipStart:t?.clipStart??null,clipEnd:t?.clipEnd??null,tracks:t?.tracks.length??0,bound:[...this.#n.keys()],warnings:this.#_,engineCalls:this.#l,blenderFrame:t?.frameCurrent??null}}frame(){const t=this.#t;return!t||!this.#a||t.clipStart===void 0?t?.frameCurrent??1:this.#i!==null?this.#i:t.clipStart+this.#a.time*t.fps}get playable(){return this.#a!==null}async bind(t,o){this.#l++;const e=await o.rig();if(!e)return;const a=[],i=new Set;let s=!1;for(const l of e.rigs){if(!l.object||!l.armature||!l.skinIndexBase64||!l.skinWeightBase64){l.reason&&a.push(l.reason);continue}i.add(l.object);const m=wo(l,e.frame);if(this.#n.get(l.object)?.signature===m)continue;const h=this.#d(t,l,e.frame,a);h&&(this.#n.get(l.object)?.skeleton.dispose(),this.#n.set(l.object,h),s=!0)}for(const[l,m]of[...this.#n])i.has(l)||(m.skeleton.dispose(),m.boneRoot.removeFromParent(),this.#n.delete(l),s=!0);this.#l++;const c=await o.clip(),u=this.#t,f=c?.action!==u?.action||c?.tracks.length!==u?.tracks.length||c?.clipStart!==u?.clipStart||c?.clipEnd!==u?.clipEnd;this.#t=c??null,c?.reason&&a.push(c.reason),c&&(f||s)&&this.#h(t,c,a);const r=this.#e?.snapshot().playbackState==="playing";c&&!r&&u?.frameCurrent!==c.frameCurrent&&(this.#c(c.frameCurrent),this.#e&&c.fps>0&&this.#e.seek(c.frameCurrent/c.fps)),this.#_=a,this.#f()}#d(t,o,e,a){const i=t.objectForBlenderName(o.object??""),s=t.objectForBlenderName(o.armature??"");if(!i||!s)return null;const c=i,u=c.geometry;if(!u)return null;const f=u.getAttribute("blenderVertex");if(!f)return a.push(`"${o.object}" cannot be skinned: its presented geometry carries no \`blenderVertex\` attribute, so a per-Blender-vertex weight cannot be expanded onto its drawn vertices.`),null;if(o.vertexCount===0)return null;let r=0;for(let w=0;w<f.count;w++)r=Math.max(r,f.getX(w));if(r>=o.vertexCount)return a.push(`"${o.object}" is not skinned here: its presented geometry references Blender vertex ${r} while the mesh declares ${o.vertexCount}, which is a generative modifier (Subdivision, Mirror, Array…) between the two. Blender's own viewport shows the evaluated result; this presenter shows the exported columns unskinned.`),null;const l=lr(o.skinIndexBase64??""),m=An(o.skinWeightBase64??""),h=f.count,d=new Uint16Array(h*4),_=new Float32Array(h*4);for(let w=0;w<h;w++){const E=f.getX(w);for(let I=0;I<4;I++)d[w*4+I]=l[E*4+I]??0,_[w*4+I]=m[E*4+I]??0}u.setAttribute("skinIndex",new Me(d,4)),u.setAttribute("skinWeight",new Ht(_,4));const v=new _t;v.name=`${o.armature}:bones`;const g=[],p=o.bones.map(w=>rr(w.pose)),b=new Map(o.bones.map((w,E)=>[w.name,E]));o.bones.forEach((w,E)=>{const I=new Re;I.name=w.name,g.push(I);const F=w.parent===null?void 0:b.get(w.parent);(F===void 0?p[E].clone():p[F].clone().invert().multiply(p[E])).decompose(I.position,I.quaternion,I.scale),(F===void 0?v:g[F]).add(I)}),s.add(v);const T=new Ie(u,c.material);T.name=c.name,T.matrixAutoUpdate=!1,T.matrix.copy(c.matrix),T.matrix.decompose(T.position,T.quaternion,T.scale),T.userData=c.userData,T.frustumCulled=!1,t.replacePresentedObject(c,T),t.root.updateMatrixWorld(!0);const D=new Fe(g);return T.bind(D,T.matrixWorld.clone()),o.constrainedBones?.length&&a.push(`Bone constraints on ${o.constrainedBones.join(", ")}: the clip is derived from the F-Curves alone, so those bones play their channels rather than Blender's solved pose.`),o.unmappedGroups?.length&&a.push(`${o.object} carries vertex groups no bone is named for (${o.unmappedGroups.join(", ")}); they weight nothing here, exactly as they deform nothing in Blender.`),{object:o.object??"",armature:o.armature??"",mesh:T,boneRoot:v,bones:g,skeleton:D,frame:e,signature:wo(o,e)}}#h(t,o,e){if(this.#o?.stopAllAction(),this.#o=null,this.#a=null,!o.tracks.length||o.clipStart===void 0||o.clipEnd===void 0)return;const a=o.armature?t.objectForBlenderName(o.armature):null;if(!a)return;const i=new Map;for(const l of this.#n.values())if(l.armature===o.armature)for(const m of l.bones)i.set(m.name,m);const s=[],c=new Set;for(const l of o.tracks){const m=i.get(l.bone);if(!m){c.add(l.bone);continue}const h=An(l.timeBase64),d=An(l.valueBase64),_=`${m.uuid}.${l.property}`;s.push(l.property==="quaternion"?new ze(_,Array.from(h),Array.from(d)):new De(_,Array.from(h),Array.from(d)))}if(c.size&&e.push(`${o.action} animates ${[...c].join(", ")}, which this binding has no bone for.`),!s.length)return;const u=o.duration??(o.clipEnd-o.clipStart)/o.fps,f=new Ce(a),r=f.clipAction(new ke(o.action??"action",u,s));r.setLoop($e,Number.POSITIVE_INFINITY),r.play(),this.#o=f,this.#a=r,this.#c(o.frameCurrent),this.#m()}#c(t){const o=this.#t;if(!o||!this.#o||o.clipStart===void 0||o.clipEnd===void 0)return;const e=Math.min(o.clipEnd,Math.max(o.clipStart,t));this.#i=e;const a=(o.clipEnd-o.clipStart)/o.fps;this.#o.setTime(Math.min(a-1e-4,(e-o.clipStart)/o.fps)),this.#m()}#m(){for(const t of this.#n.values())t.boneRoot.updateMatrixWorld(!0),t.skeleton.update()}get scene(){return this.#t?.scene??null}async writeBookmark(){const t=Math.round(this.frame()),o=this.#t;if(!o)return t;const e=o.scene;return!e||o.frameCurrent===t||(this.#l++,await Be(`bpy.data.scenes[${JSON.stringify(e)}]`,"frame_current",t,void 0,!1),this.#t={...o,frameCurrent:t},this.#f()),t}get transport(){return this.#e}attachTo(t){this.#r?.(),this.#e=t;const o=t.attach({id:this.#t?.action??"blender-action",label:this.#t?.action??"Action",range:()=>{const s=this.#t,c=s?.fps||24;return{start:(s?.frameStart??1)/c,end:(s?.frameEnd??250)/c,fps:c}},seek:s=>this.seekSeconds(s)}),e=t.onSettled(()=>{this.writeBookmark()}),a=()=>{e(),o(),this.#e===t&&(this.#e=null),this.#r=null};this.#r=a;const i=this.#t;return i&&i.fps>0&&t.seek(i.frameCurrent/i.fps),a}seekSeconds(t){const o=this.#t?.fps||24;this.#c(Math.round(t*o)),this.#f()}keyframes(){return(this.#t?.keyframes??[]).map(t=>t.frame)}dispose(){this.#r?.(),this.#o?.stopAllAction(),this.#o=null,this.#a=null;for(const t of this.#n.values())t.skeleton.dispose(),t.boneRoot.removeFromParent();this.#n.clear()}}const Jo=new ir;function mr(n){return Jo.subscribe(n)}function dr(){return Jo.version}export{Jo as a,dr as b,_r as c,mr as s};
7138
+ }`}),this.scene.clear(),this.scene.add(new At(this.geometry,this.material)),this.target.setSize(o.width,o.height);const m=t.getRenderTarget();try{t.setRenderTarget(this.target),t.render(this.scene,this.camera)}finally{t.setRenderTarget(m)}return this.target}dispose(){this.material?.dispose(),this.geometry.dispose(),this.target.dispose(),this.scene.clear()}}const Ll=O({object:A(),group:A(),groupIndex:R().int().nonnegative(),count:R().int().nonnegative(),digest:A(),alertMode:X(["NONE","ACTIVE","ALL"]),unchanged:L(!0).optional(),weightsBase64:A().optional(),alertBase64:A().optional()}).strict();function Vl(n){const o=n<0?0:n>1?1:n,e=(.5+.5*o)**1.5,[a,i,s]=jl(2/3*(1-o)),u=new gt;return u.setRGB((a*e)**(1/1.5),(i*e)**(1/1.5),(s*e)**(1/1.5),$t),u}function jl(n){const t=(n%1+1)%1,o=Math.floor(t*6),e=t*6-o;switch(o%6){case 0:return[1,e,0];case 1:return[1-e,1,0];case 2:return[0,1,e];case 3:return[0,1-e,1];case 4:return[e,0,1];default:return[1,0,1-e]}}const Bl=0;function bo(n){const t=atob(n),o=new Uint8Array(t.length);for(let e=0;e<t.length;e++)o[e]=t.charCodeAt(e);return o}class Ul{constructor(){this.group=new _t,this.mesh=null,this.material=null,this.geometry=null,this.held=null,this.signature="",this.group.name="BlenderWeightOverlay"}apply(t,o,e){if(t===null||o===null||!o.isMesh||e===null)return this.clear(),this.signature="",null;const a=`${t.object}:${t.group}`;if(t.unchanged===!0){if(this.held?.key!==a)return this.clear(),`weights: the session sent a reference to ${a} that this overlay does not hold; the colours reappear on the next change to the mesh or the group`}else{if(t.weightsBase64===void 0||t.alertBase64===void 0)return this.clear(),`weights: ${a} carried neither an array nor a reference`;const d=bo(t.weightsBase64);this.held={key:a,weights:new Float32Array(d.buffer,d.byteOffset,t.count),alerts:bo(t.alertBase64)}}const i=this.held;if(i===null)return null;const s=`${a}:${t.digest}:${o.geometry.uuid}:${t.alertMode}:${e.elements.join(",")}`;if(s===this.signature&&this.mesh!==null)return null;this.signature=s,this.clear();const u=o.geometry.clone(),c=u.getAttribute("position"),f=u.getAttribute("blenderVertex");if(f===void 0)return u.dispose(),"weights: the presented geometry carries no per-vertex Blender index (`blenderVertex`), so the weights cannot be laid over it";const r=new Float32Array(c.count*3),l=new gt().setHex(Bl,$t);for(let d=0;d<c.count;d++){const _=f.getX(d),v=t.alertMode!=="NONE"&&i.alerts[_]===1?l:Vl(i.weights[_]??0);r[d*3]=v.r,r[d*3+1]=v.g,r[d*3+2]=v.b}u.setAttribute("color",new tt(r,3)),u.deleteAttribute("blenderVertex");const m=new Po({vertexColors:!0,polygonOffset:!0,polygonOffsetFactor:-1,polygonOffsetUnits:-1}),h=new At(u,m);return h.name=`${t.object}:weights`,h.frustumCulled=!1,h.matrixAutoUpdate=!1,h.matrix.copy(e),h.matrix.decompose(h.position,h.quaternion,h.scale),this.geometry=u,this.material=m,this.mesh=h,this.group.add(h),null}clear(){this.mesh&&this.group.remove(this.mesh),this.geometry?.dispose(),this.material?.dispose(),this.mesh=null,this.geometry=null,this.material=null}dispose(){this.clear(),this.held=null,this.signature=""}}const S=R().finite(),Qo=j([S,S,S]),ln=j([R().int().nonnegative(),R().int().nonnegative()]),J={name:A(),domain:X(["POINT","EDGE","FACE","CORNER"])},ql=Ve("type",[O({...J,type:L("FLOAT2"),data:z(j([S,S]))}).strict(),O({...J,type:L("FLOAT_VECTOR"),data:z(Qo)}).strict(),O({...J,type:L("FLOAT_COLOR"),data:z(j([S,S,S,S]))}).strict(),O({...J,type:L("BYTE_COLOR"),data:z(j([S,S,S,S]))}).strict(),O({...J,type:L("QUATERNION"),data:z(j([S,S,S,S]))}).strict(),O({...J,type:L("FLOAT4"),data:z(j([S,S,S,S]))}).strict(),O({...J,type:L("FLOAT4X4"),data:z(z(S).length(16))}).strict(),O({...J,type:L("INT16_2D"),data:z(j([R().int(),R().int()]))}).strict(),O({...J,type:L("INT32_2D"),data:z(j([R().int(),R().int()]))}).strict(),O({...J,type:L("FLOAT"),data:z(S)}).strict(),O({...J,type:L("INT"),data:z(R().int())}).strict(),O({...J,type:L("INT8"),data:z(R().int())}).strict(),O({...J,type:L("BOOLEAN"),data:z(Y())}).strict(),O({...J,type:L("STRING"),data:z(A())}).strict()]),Hl=O({positions:V(Float32Array),normals:V(Float32Array).nullable(),uv:V(Float32Array).nullable(),uvLayers:z(O({name:A(),data:V(Float32Array)}).strict()).optional(),attributeLayers:z(O({name:A(),data:V(Float32Array)}).strict()).optional(),orco:V(Float32Array).nullable().optional(),indices:V(Uint32Array),groups:z(O({start:R().int().nonnegative(),count:R().int().nonnegative(),materialIndex:R().int().nonnegative()}).strict()),hash:A()}).strict(),Wl=O({v:z(Qo),f:z(z(R().int().nonnegative())),e:z(ln).optional(),edge_order:z(ln).optional(),m:z(R().int().nonnegative()).optional(),s:z(Y()).optional(),sharp:z(ln).optional(),seams:z(ln).optional(),creases:z(j([S,S,S])).optional(),attributes:z(ql).optional(),active_uv:A().nullable().optional(),render_uv:A().nullable().optional()}).strict(),Gl=O({store:R().int().optional(),revision:R().int(),unchanged:L(!0)}).strict(),Xl=O({co:V(Float64Array),cornerNormal:V(Float32Array).optional(),orco:V(Float32Array).optional(),faceStart:V(Uint32Array),corner:V(Uint32Array),cornerEdge:V(Int32Array),edge:V(Uint32Array),edgeSharp:V(Uint8Array),edgeSeam:V(Uint8Array),edgeCrease:V(Float32Array),material:V(Uint32Array),smooth:V(Uint8Array),vertSelect:V(Uint8Array),vertHide:V(Uint8Array),edgeSelect:V(Uint8Array),edgeHide:V(Uint8Array),faceSelect:V(Uint8Array),faceHide:V(Uint8Array)}).strict(),Yl=O({name:A(),domain:X(["POINT","EDGE","FACE","CORNER"]),type:A(),data:je(n=>ArrayBuffer.isView(n))}).strict(),Zl=O({columns:Xl,attributes:z(Yl),activeUv:A().nullable(),renderUv:A().nullable(),counts:O({verts:R().int().nonnegative(),edges:R().int().nonnegative(),faces:R().int().nonnegative(),corners:R().int().nonnegative()}).strict(),revision:R().int().nonnegative()}).strict(),Ql=Nt([Hl,Zl,Wl,Gl]),yo=new Set;function Kl(n){const t=new Blob([n],{type:"image/png"}),o=new Ne;let e=!1;o.addEventListener("dispose",()=>{e=!0,o.image?.close?.()});const a=createImageBitmap(t,{imageOrientation:"flipY"}).then(i=>{if(e){i.close();return}o.image=i,o.needsUpdate=!0,Jt()}).finally(()=>{yo.delete(a)});return yo.add(a),a.catch(()=>{}),{texture:o,ready:a}}function Jl(n,t,o,e){const a=new mn(n,t,o,dn,Ee);return a.flipY=!1,a.colorSpace=e==="data"?Bn:$t,a.needsUpdate=!0,a}function tr(n,t,o){if(t.length===0)throw new Error(`Runtime image ${n} is tiled with no tiles`);const e=Math.max(...t.map(r=>r.width)),a=Math.max(...t.map(r=>r.height)),i=new Uint8Array(e*a*4*t.length),s=Math.max(...t.map(r=>r.number-1001))+1,u=new Float32Array(s*2*4);for(let r=0;r<s;r++)u[r*4]=-1;t.forEach((r,l)=>{const m=r.rgba??(r.rgbaBase64?Rn(r.rgbaBase64):void 0);if(!m)throw new Error(`Runtime image ${n} tile ${r.number} carries no raster`);for(let d=0;d<r.height;d++)i.set(m.subarray(d*r.width*4,(d+1)*r.width*4),(l*a+d)*e*4);const h=r.number-1001;u[h*4]=l,u.set([0,0,r.width/e,r.height/a],(s+h)*4)});const c=new Se(i,e,a,t.length);c.colorSpace=o==="data"?Bn:$t,c.magFilter=St,c.minFilter=Ro,c.generateMipmaps=!0,c.needsUpdate=!0;const f=new mn(u,s,2,dn,No);return f.magFilter=f.minFilter=Nn,f.needsUpdate=!0,{tiles:c,map:f,frame:t}}const nr=O({width:R().int().positive(),height:R().int().positive(),revision:R().int().nonnegative(),rgba:V(Uint8Array).optional(),rgbaBase64:A().optional(),colorspace:X(["sRGB","data"]).optional(),tiles:z(O({number:R().int().min(1001),width:R().int().positive(),height:R().int().positive(),rgba:V(Uint8Array).optional(),rgbaBase64:A().optional()}).strict()).optional()}).strict(),or=O({revision:R().int().nonnegative(),png:V(Uint8Array).optional(),pngBase64:A().optional()}).strict(),er=Nt([nr,or]),Pn=O({image:O({name:A(),revision:R().int().nonnegative()}).strict(),extension:X(["REPEAT","EXTEND","MIRROR","CLIP"]).default("REPEAT"),uv:A(),tint:j([S,S,S]).optional()}).strict(),ar=O({name:A(),color:j([S,S,S,S]),roughness:S,metallic:S,transmission:S,ior:S,physical:Fl.optional(),normal_texture:Pn.optional(),normal_strength:S.default(1),normal_space:X(["TANGENT","OBJECT"]).default("TANGENT"),normal_directx:Y().default(!1),texture:Pn.optional(),roughness_texture:Pn.optional(),emission:O({color:j([S,S,S]),strength:S}).strict().optional(),graph:il.optional()}).strict(),lr=O({session:A(),revision:R().int().nonnegative(),volumes:st(A(),Ho).default({}),lights:st(A(),Ua).default({}),world:Ka.nullable().default(null),meshes:st(A(),Ql),materials:st(A(),ar),images:st(A(),er).default({}),objects:z(O({id:A(),name:A(),type:X(["MESH","CURVE","SURFACE","FONT","META","ARMATURE","LATTICE","VOLUME","EMPTY","CAMERA","LIGHT","SPEAKER","GREASEPENCIL","POINTCLOUD","LIGHT_PROBE"]),mesh:A().nullable(),volume:A().nullable().optional(),light:A().nullable().optional(),materials:z(A().nullable()),matrix:z(j([S,S,S,S])).length(4),visible:Y(),render_visible:Y().default(!0),selected:Y(),parent:A().nullable(),texspace:j([j([S,S,S]),j([S,S,S])]).optional(),default_color:A().optional()}).strict()),active:A().nullable(),mode:A(),cameras:st(A(),st(A(),Fo())).default({}),warnings:z(A()).default([]),updated:z(A()).default([]),frame:R().int().default(0),armatures:st(A(),He).default({}),weights:Ll.nullable().default(null)}).strict();class Yn{constructor(){this.root=new _t,this.objects=new Map,this.meshes=new Map,this.volumes=new Map,this.materials=new Map,this.lights=new Map,this.lighting=new Qa,this.world=new Hn,this.armatureOverlay=new oa,this.weightOverlay=new Ul,this.armatureRoot=new _t,this.weightRoot=new _t,this.rendered=!1,this.fallback=new Qt({color:12172998,roughness:.72}),this.textures=new Map,this.textureNames=new Map,this.roughnessTextureNames=new Map,this.textureSamplers=new Il,this.graphSamplers=new Map,this.photograph=!1,this.graphs=new Map,this.frame=null,this.retiredSessions=new Set,this.geometryBuilds=0,this.submittedMeshes=new Map,this.submitted=null,this.submittedSession=null,this.photographs=[],this.frameListeners=new Set,this.mode=null,this.root.name="Model",this.root.matrixAutoUpdate=!1,this.root.matrix.set(1,0,0,0,0,0,1,0,0,-1,0,0,0,0,0,1),this.root.updateMatrixWorld(!0);for(const[t,o]of[[this.armatureRoot,this.armatureOverlay.group],[this.weightRoot,this.weightOverlay.group]])t.matrixAutoUpdate=!1,t.matrix.copy(this.root.matrix),t.add(o),t.updateMatrixWorld(!0);this.armatureRoot.name="BlenderBones",this.weightRoot.name="BlenderWeights"}compiledGraph(t){const o=JSON.stringify(t);let e=this.graphs.get(o);return e||(e=yl(t),this.graphs.size>256&&this.graphs.clear(),this.graphs.set(o,e)),e}subscribeFrames(t){return this.frameListeners.add(t),()=>{this.frameListeners.delete(t)}}onChange(t){const o=this.subscribeFrames(t),e=Ue(t);return()=>{o(),e()}}blenderObjectName(t){for(const[o,e]of this.objects)if(e===t)return this.frame?.objects.find(a=>a.id===o)?.name??null;return null}blenderSelection(){const t=this.frame;return t===null?{selected:[],active:null}:{selected:t.objects.filter(o=>o.selected).map(o=>o.name),active:t.active}}setStageMode(t){this.mode=t}stageMode(){return this.mode}objectForBlenderName(t){const o=this.frame?.objects.find(e=>e.name===t);return o===void 0?null:this.objects.get(o.id)??null}replacePresentedObject(t,o){for(const[e,a]of this.objects)if(a===t){const i=t.parent,s=[...t.children];t.removeFromParent();for(const u of s)o.add(u);i?.add(o),this.objects.set(e,o);return}}studioLights(){return this.lighting.group}overlayGroups(){return[{kind:"skeletons",object:this.armatureRoot},{kind:"weights",object:this.weightRoot}]}async setRendered(t,o){const e=(t?xo(this.frame?.world)?.extinction:null)??new y;for(const a of[...this.materials.values(),this.fallback])Dl(a,e);this.rendered=t,this.lighting.setRendered(t),t?this.world.apply(this.root,this.frame?.world??null,o):this.world.clear(),this.applyVisibility(),this.applyShadows(t,o),t&&(await Ha(),await Promise.all([...this.textures.values()].map(a=>a.ready)),await this.world.ready())}applyShadows(t,o){this.root.updateMatrixWorld(!0);const e=[];for(const c of this.objects.values()){const f=c;if(f.isMesh&&(f.castShadow=t,f.receiveShadow=t,t&&f.visible)){const r=new fn().setFromObject(f);r.isEmpty()||e.push(r)}}if(!t||!e.length)return;const i=e.reduce((c,f)=>c.union(f),new fn).getBoundingSphere(new Oe),s=o?new Te().setFromProjectionMatrix(new mt().multiplyMatrices(o.projectionMatrix,o.matrixWorldInverse)):null,u=s?e.flatMap(c=>nl(c,s)):[];for(const c of this.lights.values())c.isDirectionalLight&&o?ol(c,u,e):Xa(c,i.center,i.radius)}applyOverlays(t){const o=s=>{const u=t.objects.find(c=>c.name===s);return u===void 0?null:new mt().set(...u.matrix.flat())},e=[...this.armatureOverlay.apply(t.armatures,o)],a=t.weights?this.objects.get(t.objects.find(s=>s.name===t.weights?.object)?.id??""):void 0,i=this.weightOverlay.apply(t.weights,a??null,t.weights?o(t.weights.object):null);return i!==null&&e.push(i),e}applyVisibility(){for(const t of this.frame?.objects??[]){const o=this.objects.get(t.id);if(o&&(o.visible=this.rendered?t.render_visible:t.visible),!t.light)continue;const e=this.lights.get(t.light);e&&(e.visible=this.rendered&&t.render_visible)}this.armatureOverlay.group.visible=!this.rendered,this.weightOverlay.group.visible=!this.rendered}applyFrame(t){const o=this.frame===null?null:{session:this.frame.session,revision:this.frame.revision},e=lr.parse(t);if(this.retiredSessions.has(e.session))throw new Error("The runtime session was replaced; its delayed frame cannot overwrite the active model");if(this.frame?.session===e.session&&e.revision<this.frame.revision)throw new Error("The runtime frame is older than the displayed model");const a=new Set(e.objects.map(f=>f.id));if(a.size!==e.objects.length)throw new Error("Runtime object IDs must be unique");const i=new Map(e.objects.map(f=>[f.id,f]));for(const f of e.objects){if(f.mesh!==null&&!e.meshes[f.mesh])throw new Error(`Missing runtime mesh ${f.mesh}`);if(f.volume&&(!e.volumes[f.volume]||f.mesh!==null))throw new Error(`Invalid runtime volume ${f.volume}`);if(f.light&&(!e.lights[f.light]||f.mesh!==null))throw new Error(`Invalid runtime light ${f.light}`);for(const m of f.materials)if(m!==null&&!e.materials[m])throw new Error(`Missing runtime material ${m}`);const r=new Set([f.id]);let l=f.parent;for(;l!==null;){if(r.has(l))throw new Error("Runtime parent cycle");r.add(l);const m=i.get(l);if(!m)throw new Error(`Missing runtime parent ${l}`);l=m.parent}}const s=new Map,u=new Map;try{for(const[f,r]of Object.entries(e.volumes)){const l=JSON.stringify(r);this.frame?.session===e.session&&this.volumes.get(f)?.signature===l||u.set(f,{signature:l,mesh:el(r)})}for(const[f,r]of Object.entries(e.meshes)){if("unchanged"in r){if(this.frame?.session===e.session&&this.meshes.has(f))continue;throw new Error(`${ea}: the presenter does not hold runtime mesh ${f} (store ${r.store}, revision ${r.revision})`)}const l="hash"in r,m="columns"in r,h=m?`revision:${r.revision}`:l?r.hash:JSON.stringify(r);this.frame?.session===e.session&&this.meshes.get(f)?.signature===h||s.set(f,{signature:h,geometry:m?In(ha({...r.columns,attributes:r.attributes,activeUv:r.activeUv,renderUv:r.renderUv},h)):l?In(r):pa(r)})}}catch(f){for(const r of s.values())r.geometry.dispose();for(const{mesh:r}of u.values())r.geometry.dispose(),r.material.dispose();throw f}this.frame?.session!==e.session&&(this.frame&&this.retiredSessions.add(this.frame.session),this.clear());for(const[f,r]of u){const l=this.volumes.get(f)?.mesh;l&&(l.removeFromParent(),l.geometry.dispose(),l.material.dispose()),this.volumes.set(f,r)}for(const[f,r]of s)this.meshes.get(f)?.geometry.dispose(),this.meshes.set(f,r),this.geometryBuilds++;for(const[f,r]of Object.entries(e.images)){const l=this.textures.get(f);if("width"in r){const _=r.rgba??(r.rgbaBase64?Rn(r.rgbaBase64):void 0);if(!_)throw new Error(`Runtime image ${f} carries no raster`);const p=r.tiles?tr(f,r.tiles,r.colorspace??"sRGB"):void 0;if(l?.udim&&(l.udim.tiles.dispose(),l.udim.map.dispose(),delete l.udim),l&&l.width===r.width&&l.height===r.height){const v=l.texture.image;if(v.data){v.data.set(_),l.texture.needsUpdate=!0,l.revision=r.revision,p&&(l.udim=p);continue}}l?.texture.dispose(),this.textures.set(f,{texture:Jl(_,r.width,r.height,r.colorspace??"sRGB"),width:r.width,height:r.height,revision:r.revision,...p?{udim:p}:{}});continue}const m=r.png??(r.pngBase64?Rn(r.pngBase64):void 0);if(!m)throw new Error(`Runtime image ${f} carries no bytes`);l?.texture.dispose(),l?.udim?.tiles.dispose(),l?.udim?.map.dispose();const{texture:h,ready:d}=Kl(m);h.colorSpace=$t,this.textures.set(f,{texture:h,ready:d,width:0,height:0,revision:r.revision,png:m.slice()})}for(const[f,r]of Object.entries(e.materials)){const l=this.materials.get(f)??new Qt;l.name=r.name;const m=r.texture?.tint;r.texture!==void 0?l.color.setRGB(m?.[0]??1,m?.[1]??1,m?.[2]??1,at):l.color.setRGB(r.color[0],r.color[1],r.color[2],at),l.opacity=r.color[3];const h=l.opacity<1||r.graph!==void 0&&sl(r.graph);l.transparent!==h&&(l.transparent=h,l.needsUpdate=!0),l.roughness=r.roughness,l.metalness=r.metallic,l.transmission=r.transmission,l.ior=r.ior,Gn(l,r.physical,{map:r.texture?.extension==="CLIP",roughness:r.roughness_texture?.extension==="CLIP",normal:r.normal_texture?.extension==="CLIP"});const d=r.normal_texture?.image.name;if(d===void 0)l.normalMap&&(this.textureSamplers.delete(`${f}:normal`),l.normalMap=null,l.needsUpdate=!0);else{const b=this.textures.get(d);if(!b)throw new Error(`${jt}: missing normal image ${d}`);const P=this.textureSamplers.get(`${f}:normal`,b.texture,r.normal_texture.extension,b.ready,r.normal_texture.uv);l.normalMap!==P&&(l.normalMap=P,l.needsUpdate=!0);const D=r.normal_space==="OBJECT"?Pe:Ae;l.normalMapType!==D&&(l.normalMapType=D,l.needsUpdate=!0),l.normalScale.set(r.normal_strength,r.normal_strength*(r.normal_directx?-1:1))}r.emission?(l.emissive.setRGB(r.emission.color[0],r.emission.color[1],r.emission.color[2],at),l.emissiveIntensity=r.emission.strength):(l.emissive.setRGB(0,0,0),l.emissiveIntensity=1);const _=r.roughness_texture?.image.name??null;if(_===null)this.roughnessTextureNames.has(f)&&(this.textureSamplers.delete(`${f}:roughness`),l.roughnessMap=null,this.roughnessTextureNames.delete(f),l.needsUpdate=!0);else{const b=this.textures.get(_);if(!b)throw new Error(`${jt}: the presenter does not hold runtime image ${_} (revision ${r.roughness_texture.image.revision})`);const P=this.textureSamplers.get(`${f}:roughness`,b.texture,r.roughness_texture.extension,b.ready,r.roughness_texture.uv);l.roughnessMap!==P&&(l.roughnessMap=P,this.roughnessTextureNames.set(f,_),l.needsUpdate=!0)}const p=r.texture?.image.name??null;if(p===null)this.textureNames.has(f)&&(this.textureSamplers.delete(`${f}:color`),l.map=null,this.textureNames.delete(f),l.needsUpdate=!0);else{const b=this.textures.get(p);if(!b)throw new Error(`${jt}: the presenter does not hold runtime image ${p} (revision ${r.texture.image.revision})`);const P=this.textureSamplers.get(`${f}:color`,b.texture,r.texture.extension,b.ready,r.texture.uv);l.map!==P&&(l.map=P,this.textureNames.set(f,p),l.needsUpdate=!0)}const v=r.graph?this.compiledGraph(r.graph):null,g=new Set;Ol(l,v,b=>{const P=this.textures.get(b.name);if(!P)throw new Error(`${jt}: the presenter does not hold runtime image ${b.name} (revision ${b.revision})`);if(b.tiled){if(!P.udim)throw new Error(`${jt}: runtime image ${b.name} arrived without its UDIM tiles`);return P.udim}const D=`${f}:graph:${b.node}`;g.add(D);const w=this.textureSamplers.get(D,P.texture,b.extension,P.ready),E=b.closest?Nn:St,I=b.closest?Nn:b.mipmap?Ro:St;return(w.magFilter!==E||w.minFilter!==I)&&(w.magFilter=E,w.minFilter=I,w.needsUpdate=!0),w},this.photograph);for(const b of this.graphSamplers.get(f)??[])g.has(b)||this.textureSamplers.delete(b);this.graphSamplers.set(f,g),this.materials.set(f,l)}for(const f of e.objects){let r=this.objects.get(f.id);const l=f.volume?this.volumes.get(f.volume).mesh:null;if((!r||(l?r!==l:!!r.isMesh!=(f.mesh!==null)))&&(r?.removeFromParent(),r=l??(f.mesh!==null?new At(this.meshes.get(f.mesh).geometry,this.fallback):new Ao),this.objects.set(f.id,r)),r.name=f.name,r.matrixAutoUpdate=!1,r.matrix.set(...f.matrix.flat()),f.parent){const m=new mt().set(...i.get(f.parent).matrix.flat());r.matrix.premultiply(m.invert())}if(r.matrix.decompose(r.position,r.quaternion,r.scale),f.texspace?r.userData.blenderTexspace=f.texspace:delete r.userData.blenderTexspace,f.default_color!==void 0?r.userData.blenderDefaultColor=f.default_color:delete r.userData.blenderDefaultColor,f.mesh!==null){const m=r;m.geometry=this.meshes.get(f.mesh).geometry,m.material=f.materials.length?f.materials.map(h=>h===null?this.fallback:this.materials.get(h)):this.fallback,Sl(m)}if(f.light){const m=this.lights.get(f.light)??null,h=Ga(e.lights[f.light],m);m&&m!==h&&(m.removeFromParent(),m.dispose()),h.parent!==r&&r.add(h),Ya(h,r),this.lights.set(f.light,h)}}for(const f of e.objects){const r=this.objects.get(f.id),l=f.parent===null?this.root:this.objects.get(f.parent);r.parent!==l&&l.add(r)}for(const[f,r]of this.objects)a.has(f)||(r.removeFromParent(),this.objects.delete(f));for(const[f,r]of this.volumes)e.volumes[f]||(r.mesh.geometry.dispose(),r.mesh.material.dispose(),this.volumes.delete(f));for(const[f,r]of this.meshes)e.meshes[f]||(r.geometry.dispose(),this.meshes.delete(f));for(const[f,r]of this.materials)if(!e.materials[f]){for(const l of["normal","roughness","color"])this.textureSamplers.delete(`${f}:${l}`);for(const l of this.graphSamplers.get(f)??[])this.textureSamplers.delete(l);this.graphSamplers.delete(f),r.dispose(),this.materials.delete(f)}for(const[f,r]of this.lights)e.lights[f]||(r.removeFromParent(),r.dispose(),this.lights.delete(f));this.root.updateMatrixWorld(!0),this.frame={...e,meshes:{},volumes:{}};const c=this.applyOverlays(e);c.length&&(this.frame={...this.frame,warnings:[...this.frame.warnings,...c]}),this.applyVisibility();for(const f of[...this.frameListeners])f();return{...this.inspect(),held:o}}inspect(){return{session:this.frame?.session,revision:this.frame?.revision,active:this.frame?.active,mode:this.frame?.mode,geometryBuilds:this.geometryBuilds,objects:[...this.objects].map(([t,o])=>({id:t,name:o.name,uuid:o.uuid,geometry:o.geometry?.uuid,visible:o.visible}))}}snapshot(){return this.frame}captureSnapshot(){const t=this.frame;if(!t)throw new Error("Blender capture requires a presented frame");const o=structuredClone({...t,images:{},armatures:{},weights:null});for(const[c,{signature:f,geometry:r}]of this.meshes){const l=d=>{const _=r.getAttribute(d);if(!_)return null;if(!(_ instanceof tt))throw new Error(`Blender capture cannot copy interleaved ${d}`);return new Float32Array(_.array)},m=l("position");if(!m)throw new Error(`Blender capture mesh ${c} has no positions`);const h=r.getIndex();o.meshes[c]={hash:f,positions:m,normals:l("normal"),uv:l("uv"),uvLayers:Object.entries(r.userData.blenderUvChannels??{}).map(([d,_])=>{const p=l(`uv${_}`);if(!p)throw new Error(`Blender capture mesh ${c} is missing UV layer ${d}`);return{name:d,data:p}}),orco:r.userData.blenderOrcoFromDoor?l("blenderOrco"):null,attributeLayers:(r.userData.blenderAttributes??[]).map(d=>{const _=l(Et(d));if(!_)throw new Error(`Blender capture mesh ${c} is missing attribute ${d}`);return{name:d,data:_}}),indices:h?new Uint32Array(h.array):Uint32Array.from({length:m.length/3},(d,_)=>_),groups:r.groups.map(d=>({start:d.start,count:d.count,materialIndex:d.materialIndex??0}))}}for(const[c,{signature:f}]of this.volumes)o.volumes[c]=Ho.parse(JSON.parse(f));const e=new Set(Object.values(o.materials).flatMap(c=>[c.texture?.image.name,c.roughness_texture?.image.name,c.normal_texture?.image.name,...Object.values(c.graph?.nodes??{}).map(f=>f.props.image?.name)].filter(f=>f!==void 0)));for(const c of e){const f=this.textures.get(c);if(!f)throw new Error(`Blender capture image ${c} is not resident`);if(f.png)o.images[c]={revision:f.revision,png:f.png.slice()};else{const r=f.texture.image?.data;if(!(r instanceof Uint8Array))throw new Error(`Blender capture image ${c} has no resident raster`);o.images[c]={revision:f.revision,width:f.width,height:f.height,rgba:r.slice(),colorspace:f.texture.colorSpace===Bn?"data":"sRGB",...f.udim?{tiles:f.udim.frame}:{}}}}const a=this.createWorldVolumePass(),i=new Yn;i.photograph=!0;let s=!1;const u=()=>{s||(s=!0,a?.dispose(),i.dispose(),i.root.removeFromParent())};try{i.applyFrame(o),this.root.updateWorldMatrix(!0,!1),i.root.matrix.copy(this.root.matrixWorld),i.root.updateMatrixWorld(!0)}catch(c){throw u(),c}return{effect:a,root:i.root,session:t.session,revision:t.revision,prepare:c=>{if(s)throw new Error("Blender capture snapshot is disposed");return i.setRendered(!0,c)},dispose:u}}createWorldVolumePass(){const t=xo(this.frame?.world);return t?new $l(t):void 0}recordPresentation(t){if(typeof t!="object"||t===null)return;const o=t,e=o.meshes;if(typeof e!="object"||e===null)return;const a=typeof o.session=="string"?o.session:null;a!==this.submittedSession&&(this.submittedMeshes.clear(),this.photographs.length=0,this.submittedSession=a);const i=e;for(const[s,u]of Object.entries(i))typeof u=="object"&&u!==null&&!("unchanged"in u)&&this.submittedMeshes.set(s,u);for(const s of[...this.submittedMeshes.keys()])s in i||this.submittedMeshes.delete(s);this.submitted={...o,meshes:Object.fromEntries(this.submittedMeshes)}}recordPhotograph(t){this.photographs.push(t)}observations(){return{presentation:this.submitted,photographs:this.photographs}}clear(){for(const t of this.lights.values())t.removeFromParent(),t.dispose();this.lights.clear();for(const t of this.objects.values())t.removeFromParent();for(const t of this.meshes.values())t.geometry.dispose();for(const t of this.materials.values())t.dispose();for(const{mesh:t}of this.volumes.values())t.geometry.dispose(),t.material.dispose();for(const{texture:t,udim:o}of this.textures.values())t.dispose(),o?.tiles.dispose(),o?.map.dispose();this.textures.clear(),this.textureNames.clear(),this.roughnessTextureNames.clear(),this.textureSamplers.clear(),this.volumes.clear(),this.objects.clear(),this.meshes.clear(),this.materials.clear()}dispose(){this.clear(),this.fallback.dispose(),this.lighting.dispose(),this.world.dispose(),this.armatureOverlay.dispose(),this.weightOverlay.dispose(),this.frame=null,this.retiredSessions.clear(),this.submittedMeshes.clear(),this.submitted=null,this.submittedSession=null,this.photographs.length=0}}const mr=new Yn;function Ko(n){const t=atob(n),o=new Uint8Array(t.length);for(let e=0;e<t.length;e++)o[e]=t.charCodeAt(e);return o}function An(n){const t=Ko(n);return new Float32Array(t.buffer,t.byteOffset,t.byteLength>>2)}function rr(n){const t=Ko(n);return new Uint16Array(t.buffer,t.byteOffset,t.byteLength>>1)}function ir(n){return new mt().set(...n.flat())}function wo(n,t){return[n.object,n.mesh,n.armature,n.vertexCount,n.bones.length,t].join("|")}class sr{#n=new Map;#o=null;#a=null;#t=null;#i=null;#e=null;#r=null;#s=new Set;#u=0;#_=[];#l=0;get version(){return this.#u}get engineCalls(){return this.#l}subscribe(t){return this.#s.add(t),()=>this.#s.delete(t)}#f(){this.#u++;for(const t of[...this.#s])t()}state(){const t=this.#t,o=t?.frameStart??1,e=t?.frameEnd??250,a=t?.fps??24;return{frame:this.frame(),start:o,end:e,fps:a,action:t?.action??null,object:t?.object??null,armature:t?.armature??null,bones:[...this.#n.values()].reduce((i,s)=>i+s.bones.length,0),keyframes:t?.keyframes??[],summary:t?.summary??[],clipStart:t?.clipStart??null,clipEnd:t?.clipEnd??null,tracks:t?.tracks.length??0,bound:[...this.#n.keys()],warnings:this.#_,engineCalls:this.#l,blenderFrame:t?.frameCurrent??null}}frame(){const t=this.#t;return!t||!this.#a||t.clipStart===void 0?t?.frameCurrent??1:this.#i!==null?this.#i:t.clipStart+this.#a.time*t.fps}get playable(){return this.#a!==null}async bind(t,o){this.#l++;const e=await o.rig();if(!e)return;const a=[],i=new Set;let s=!1;for(const l of e.rigs){if(!l.object||!l.armature||!l.skinIndexBase64||!l.skinWeightBase64){l.reason&&a.push(l.reason);continue}i.add(l.object);const m=wo(l,e.frame);if(this.#n.get(l.object)?.signature===m)continue;const h=this.#d(t,l,e.frame,a);h&&(this.#n.get(l.object)?.skeleton.dispose(),this.#n.set(l.object,h),s=!0)}for(const[l,m]of[...this.#n])i.has(l)||(m.skeleton.dispose(),m.boneRoot.removeFromParent(),this.#n.delete(l),s=!0);this.#l++;const u=await o.clip(),c=this.#t,f=u?.action!==c?.action||u?.tracks.length!==c?.tracks.length||u?.clipStart!==c?.clipStart||u?.clipEnd!==c?.clipEnd;this.#t=u??null,u?.reason&&a.push(u.reason),u&&(f||s)&&this.#h(t,u,a);const r=this.#e?.snapshot().playbackState==="playing";u&&!r&&c?.frameCurrent!==u.frameCurrent&&(this.#c(u.frameCurrent),this.#e&&u.fps>0&&this.#e.seek(u.frameCurrent/u.fps)),this.#_=a,this.#f()}#d(t,o,e,a){const i=t.objectForBlenderName(o.object??""),s=t.objectForBlenderName(o.armature??"");if(!i||!s)return null;const u=i,c=u.geometry;if(!c)return null;const f=c.getAttribute("blenderVertex");if(!f)return a.push(`"${o.object}" cannot be skinned: its presented geometry carries no \`blenderVertex\` attribute, so a per-Blender-vertex weight cannot be expanded onto its drawn vertices.`),null;if(o.vertexCount===0)return null;let r=0;for(let w=0;w<f.count;w++)r=Math.max(r,f.getX(w));if(r>=o.vertexCount)return a.push(`"${o.object}" is not skinned here: its presented geometry references Blender vertex ${r} while the mesh declares ${o.vertexCount}, which is a generative modifier (Subdivision, Mirror, Array…) between the two. Blender's own viewport shows the evaluated result; this presenter shows the exported columns unskinned.`),null;const l=rr(o.skinIndexBase64??""),m=An(o.skinWeightBase64??""),h=f.count,d=new Uint16Array(h*4),_=new Float32Array(h*4);for(let w=0;w<h;w++){const E=f.getX(w);for(let I=0;I<4;I++)d[w*4+I]=l[E*4+I]??0,_[w*4+I]=m[E*4+I]??0}c.setAttribute("skinIndex",new Me(d,4)),c.setAttribute("skinWeight",new Ht(_,4));const p=new _t;p.name=`${o.armature}:bones`;const v=[],g=o.bones.map(w=>ir(w.pose)),b=new Map(o.bones.map((w,E)=>[w.name,E]));o.bones.forEach((w,E)=>{const I=new Re;I.name=w.name,v.push(I);const F=w.parent===null?void 0:b.get(w.parent);(F===void 0?g[E].clone():g[F].clone().invert().multiply(g[E])).decompose(I.position,I.quaternion,I.scale),(F===void 0?p:v[F]).add(I)}),s.add(p);const P=new Ie(c,u.material);P.name=u.name,P.matrixAutoUpdate=!1,P.matrix.copy(u.matrix),P.matrix.decompose(P.position,P.quaternion,P.scale),P.userData=u.userData,P.frustumCulled=!1,t.replacePresentedObject(u,P),t.root.updateMatrixWorld(!0);const D=new Fe(v);return P.bind(D,P.matrixWorld.clone()),o.constrainedBones?.length&&a.push(`Bone constraints on ${o.constrainedBones.join(", ")}: the clip is derived from the F-Curves alone, so those bones play their channels rather than Blender's solved pose.`),o.unmappedGroups?.length&&a.push(`${o.object} carries vertex groups no bone is named for (${o.unmappedGroups.join(", ")}); they weight nothing here, exactly as they deform nothing in Blender.`),{object:o.object??"",armature:o.armature??"",mesh:P,boneRoot:p,bones:v,skeleton:D,frame:e,signature:wo(o,e)}}#h(t,o,e){if(this.#o?.stopAllAction(),this.#o=null,this.#a=null,!o.tracks.length||o.clipStart===void 0||o.clipEnd===void 0)return;const a=o.armature?t.objectForBlenderName(o.armature):null;if(!a)return;const i=new Map;for(const l of this.#n.values())if(l.armature===o.armature)for(const m of l.bones)i.set(m.name,m);const s=[],u=new Set;for(const l of o.tracks){const m=i.get(l.bone);if(!m){u.add(l.bone);continue}const h=An(l.timeBase64),d=An(l.valueBase64),_=`${m.uuid}.${l.property}`;s.push(l.property==="quaternion"?new ze(_,Array.from(h),Array.from(d)):new De(_,Array.from(h),Array.from(d)))}if(u.size&&e.push(`${o.action} animates ${[...u].join(", ")}, which this binding has no bone for.`),!s.length)return;const c=o.duration??(o.clipEnd-o.clipStart)/o.fps,f=new Ce(a),r=f.clipAction(new ke(o.action??"action",c,s));r.setLoop($e,Number.POSITIVE_INFINITY),r.play(),this.#o=f,this.#a=r,this.#c(o.frameCurrent),this.#m()}#c(t){const o=this.#t;if(!o||!this.#o||o.clipStart===void 0||o.clipEnd===void 0)return;const e=Math.min(o.clipEnd,Math.max(o.clipStart,t));this.#i=e;const a=(o.clipEnd-o.clipStart)/o.fps;this.#o.setTime(Math.min(a-1e-4,(e-o.clipStart)/o.fps)),this.#m()}#m(){for(const t of this.#n.values())t.boneRoot.updateMatrixWorld(!0),t.skeleton.update()}get scene(){return this.#t?.scene??null}async writeBookmark(){const t=Math.round(this.frame()),o=this.#t;if(!o)return t;const e=o.scene;return!e||o.frameCurrent===t||(this.#l++,await Be(`bpy.data.scenes[${JSON.stringify(e)}]`,"frame_current",t,void 0,!1),this.#t={...o,frameCurrent:t},this.#f()),t}get transport(){return this.#e}attachTo(t){this.#r?.(),this.#e=t;const o=t.attach({id:this.#t?.action??"blender-action",label:this.#t?.action??"Action",range:()=>{const s=this.#t,u=s?.fps||24;return{start:(s?.frameStart??1)/u,end:(s?.frameEnd??250)/u,fps:u}},seek:s=>this.seekSeconds(s)}),e=t.onSettled(()=>{this.writeBookmark()}),a=()=>{e(),o(),this.#e===t&&(this.#e=null),this.#r=null};this.#r=a;const i=this.#t;return i&&i.fps>0&&t.seek(i.frameCurrent/i.fps),a}seekSeconds(t){const o=this.#t?.fps||24;this.#c(Math.round(t*o)),this.#f()}keyframes(){return(this.#t?.keyframes??[]).map(t=>t.frame)}dispose(){this.#r?.(),this.#o?.stopAllAction(),this.#o=null,this.#a=null;for(const t of this.#n.values())t.skeleton.dispose(),t.boneRoot.removeFromParent();this.#n.clear()}}const Jo=new sr;function dr(n){return Jo.subscribe(n)}function hr(){return Jo.version}export{Jo as a,hr as b,mr as c,dr as s};