@babylonjs/lite 1.1.0 → 1.3.0

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 (210) hide show
  1. package/{_mat4-storage-f64-WeexU-hd.js → _mat4-storage-f64-BqqOLkos.js} +2 -2
  2. package/{_mat4-storage-f64-WeexU-hd.js.map → _mat4-storage-f64-BqqOLkos.js.map} +1 -1
  3. package/{alpha-test-fragment-x2mnjLgC.js → alpha-test-fragment-D8oeUpvv.js} +2 -2
  4. package/{alpha-test-fragment-x2mnjLgC.js.map → alpha-test-fragment-D8oeUpvv.js.map} +1 -1
  5. package/{background-dds-skybox-BpcDr-9c.js → background-dds-skybox-Cv92mmdC.js} +3 -4
  6. package/{background-dds-skybox-BpcDr-9c.js.map → background-dds-skybox-Cv92mmdC.js.map} +1 -1
  7. package/{background-ground-Bm6gjWqx.js → background-ground-ClcWiDuF.js} +2 -3
  8. package/{background-ground-Bm6gjWqx.js.map → background-ground-ClcWiDuF.js.map} +1 -1
  9. package/{background-hdr-skybox-CSFo8RX6.js → background-hdr-skybox-MfAwLhVx.js} +3 -3
  10. package/{background-hdr-skybox-CSFo8RX6.js.map → background-hdr-skybox-MfAwLhVx.js.map} +1 -1
  11. package/{background-solid-skybox-DOOBeDIz.js → background-solid-skybox-CkmGuOn5.js} +2 -3
  12. package/{background-solid-skybox-DOOBeDIz.js.map → background-solid-skybox-CkmGuOn5.js.map} +1 -1
  13. package/{billboard-renderable-IJfCpeDS.js → billboard-renderable-CmIfD7IP.js} +2 -2
  14. package/{billboard-renderable-IJfCpeDS.js.map → billboard-renderable-CmIfD7IP.js.map} +1 -1
  15. package/{clamp-block-BD_t8I89.js → clamp-block-Bupvx5sX.js} +2 -2
  16. package/{clamp-block-BD_t8I89.js.map → clamp-block-Bupvx5sX.js.map} +1 -1
  17. package/{clearcoat-fragment-Dj7vGX2u.js → clearcoat-fragment-wfkXOHHZ.js} +2 -2
  18. package/{clearcoat-fragment-Dj7vGX2u.js.map → clearcoat-fragment-wfkXOHHZ.js.map} +1 -1
  19. package/{create-skeleton-s0hjrC3A.js → create-skeleton-41NqPV9u.js} +2 -2
  20. package/{create-skeleton-s0hjrC3A.js.map → create-skeleton-41NqPV9u.js.map} +1 -1
  21. package/{cubemap-skybox-material-8lzbgi7K.js → cubemap-skybox-material-BWGdKMLi.js} +2 -2
  22. package/{cubemap-skybox-material-8lzbgi7K.js.map → cubemap-skybox-material-BWGdKMLi.js.map} +1 -1
  23. package/{curve-block-Ditr4R7V.js → curve-block-CeLMJE2N.js} +2 -2
  24. package/{curve-block-Ditr4R7V.js.map → curve-block-CeLMJE2N.js.map} +1 -1
  25. package/{emissive-fragment-BOAezkfk.js → emissive-fragment-CDJhX8ad.js} +2 -2
  26. package/{emissive-fragment-BOAezkfk.js.map → emissive-fragment-CDJhX8ad.js.map} +1 -1
  27. package/{esm-shadow-view-JCPaOOi7.js → esm-shadow-view-CcX1jdrL.js} +2 -2
  28. package/{esm-shadow-view-JCPaOOi7.js.map → esm-shadow-view-CcX1jdrL.js.map} +1 -1
  29. package/{esm-shadow-view-DRpyRAfa.js → esm-shadow-view-Cf2PwVNs.js} +2 -2
  30. package/{esm-shadow-view-DRpyRAfa.js.map → esm-shadow-view-Cf2PwVNs.js.map} +1 -1
  31. package/{esm-shadow-view-DmIORQGZ.js → esm-shadow-view-KyVyZnKZ.js} +2 -2
  32. package/{esm-shadow-view-DmIORQGZ.js.map → esm-shadow-view-KyVyZnKZ.js.map} +1 -1
  33. package/{gaussian-splatting-pipeline-sh-B30Mu56i.js → gaussian-splatting-pipeline-sh-lM48JDca.js} +2 -2
  34. package/{gaussian-splatting-pipeline-sh-B30Mu56i.js.map → gaussian-splatting-pipeline-sh-lM48JDca.js.map} +1 -1
  35. package/{geometry-texture-output-DURiaJ_n.js → geometry-texture-output-DSeH_3G_.js} +2 -2
  36. package/{geometry-texture-output-DURiaJ_n.js.map → geometry-texture-output-DSeH_3G_.js.map} +1 -1
  37. package/{geometry-view-DRrscyWU.js → geometry-view-L27hzPQF.js} +3 -4
  38. package/{geometry-view-DRrscyWU.js.map → geometry-view-L27hzPQF.js.map} +1 -1
  39. package/{gltf-animation-BjnXkop6.js → gltf-animation-Db8PwXmY.js} +6 -5
  40. package/gltf-animation-Db8PwXmY.js.map +1 -0
  41. package/{gltf-ext-basisu-DtzVV1Xx.js → gltf-ext-basisu-BARpgeiU.js} +2 -2
  42. package/{gltf-ext-basisu-DtzVV1Xx.js.map → gltf-ext-basisu-BARpgeiU.js.map} +1 -1
  43. package/{gltf-ext-node-visibility-BhX0DmiP.js → gltf-ext-node-visibility-Cv7HyWR_.js} +2 -2
  44. package/{gltf-ext-node-visibility-BhX0DmiP.js.map → gltf-ext-node-visibility-Cv7HyWR_.js.map} +1 -1
  45. package/{gltf-ext-quantization-DaymajCR.js → gltf-ext-quantization-DIYKR7_3.js} +2 -2
  46. package/{gltf-ext-quantization-DaymajCR.js.map → gltf-ext-quantization-DIYKR7_3.js.map} +1 -1
  47. package/{gltf-ext-uv-transform-DFmNJ8kA.js → gltf-ext-uv-transform-qU-LScDy.js} +2 -2
  48. package/{gltf-ext-uv-transform-DFmNJ8kA.js.map → gltf-ext-uv-transform-qU-LScDy.js.map} +1 -1
  49. package/gltf-feature-animation-pointer-nDf6dGpL.js +161 -0
  50. package/gltf-feature-animation-pointer-nDf6dGpL.js.map +1 -0
  51. package/{gltf-feature-animations-v0S_yb4T.js → gltf-feature-animations-Dr9AsgIN.js} +3 -3
  52. package/{gltf-feature-animations-v0S_yb4T.js.map → gltf-feature-animations-Dr9AsgIN.js.map} +1 -1
  53. package/gltf-feature-draco-CRgxNaK1.js +33 -0
  54. package/gltf-feature-draco-CRgxNaK1.js.map +1 -0
  55. package/{gltf-feature-gpu-instancing-BoeSm6Tn.js → gltf-feature-gpu-instancing-QfJNFW1R.js} +2 -2
  56. package/{gltf-feature-gpu-instancing-BoeSm6Tn.js.map → gltf-feature-gpu-instancing-QfJNFW1R.js.map} +1 -1
  57. package/{gltf-feature-lights-punctual-BCTwgyi_.js → gltf-feature-lights-punctual-B3xbCshn.js} +5 -5
  58. package/{gltf-feature-lights-punctual-BCTwgyi_.js.map → gltf-feature-lights-punctual-B3xbCshn.js.map} +1 -1
  59. package/{gltf-feature-meshopt-DItMkOMt.js → gltf-feature-meshopt-DBvtC2n2.js} +2 -34
  60. package/gltf-feature-meshopt-DBvtC2n2.js.map +1 -0
  61. package/{gltf-feature-morph-Cv0mEYIq.js → gltf-feature-morph-DE63vfIE.js} +3 -3
  62. package/{gltf-feature-morph-Cv0mEYIq.js.map → gltf-feature-morph-DE63vfIE.js.map} +1 -1
  63. package/{gltf-feature-registry-wNbt6UC-.js → gltf-feature-registry-DfOiNmhR.js} +15 -15
  64. package/{gltf-feature-registry-wNbt6UC-.js.map → gltf-feature-registry-DfOiNmhR.js.map} +1 -1
  65. package/{gltf-feature-skeleton-Deh2UBAn.js → gltf-feature-skeleton-IHj-DuKx.js} +12 -3
  66. package/gltf-feature-skeleton-IHj-DuKx.js.map +1 -0
  67. package/{gltf-feature-variants-DGSdFNJq.js → gltf-feature-variants-C-eyBru5.js} +2 -2
  68. package/{gltf-feature-variants-DGSdFNJq.js.map → gltf-feature-variants-C-eyBru5.js.map} +1 -1
  69. package/{gltf-glb-parser-DSQWsT4r.js → gltf-glb-parser-DXMAJA8e.js} +2 -2
  70. package/{gltf-glb-parser-DSQWsT4r.js.map → gltf-glb-parser-DXMAJA8e.js.map} +1 -1
  71. package/{gltf-interleave-OBqmlu-h.js → gltf-interleave-BdKrRH3j.js} +4 -4
  72. package/gltf-interleave-BdKrRH3j.js.map +1 -0
  73. package/{gltf-pbr-builder-ext-3imk8Tev.js → gltf-pbr-builder-ext-DJ8Jm7jo.js} +2 -2
  74. package/{gltf-pbr-builder-ext-3imk8Tev.js.map → gltf-pbr-builder-ext-DJ8Jm7jo.js.map} +1 -1
  75. package/{gltf-variants-Dyr54wwg.js → gltf-variants-C0HetOre.js} +4 -4
  76. package/{gltf-variants-Dyr54wwg.js.map → gltf-variants-C0HetOre.js.map} +1 -1
  77. package/{gpu-task-timer-DVBNZfq5.js → gpu-task-timer-C-3sLTxO.js} +2 -2
  78. package/{gpu-task-timer-DVBNZfq5.js.map → gpu-task-timer-C-3sLTxO.js.map} +1 -1
  79. package/{gs-picking-pipeline-CERN-Trj.js → gs-picking-pipeline-DlogO8fI.js} +2 -2
  80. package/{gs-picking-pipeline-CERN-Trj.js.map → gs-picking-pipeline-DlogO8fI.js.map} +1 -1
  81. package/{havok-floating-origin-VVdJRUYc.js → havok-floating-origin-CQ7yE-XD.js} +2 -2
  82. package/{havok-floating-origin-VVdJRUYc.js.map → havok-floating-origin-CQ7yE-XD.js.map} +1 -1
  83. package/{index-BgY3QEzL.js → index-C2sM8ERH.js} +2697 -932
  84. package/index-C2sM8ERH.js.map +1 -0
  85. package/index.d.ts +443 -12
  86. package/index.js +525 -507
  87. package/{input-block-DjdlndCL.js → input-block-DfFVJB-8.js} +2 -2
  88. package/{input-block-DjdlndCL.js.map → input-block-DfFVJB-8.js.map} +1 -1
  89. package/{iridescence-fragment-kfsCs8lN.js → iridescence-fragment-CQwzyZ3W.js} +2 -2
  90. package/{iridescence-fragment-kfsCs8lN.js.map → iridescence-fragment-CQwzyZ3W.js.map} +1 -1
  91. package/{light-block-qjCrz3de.js → light-block-othUHIHC.js} +2 -2
  92. package/{light-block-qjCrz3de.js.map → light-block-othUHIHC.js.map} +1 -1
  93. package/{loop-block-C8vkQ2bz.js → loop-block-DgHyTx97.js} +2 -2
  94. package/{loop-block-C8vkQ2bz.js.map → loop-block-DgHyTx97.js.map} +1 -1
  95. package/{morph-fragment-NpZYyIIU.js → morph-fragment-D_rgysrc.js} +2 -2
  96. package/{morph-fragment-NpZYyIIU.js.map → morph-fragment-D_rgysrc.js.map} +1 -1
  97. package/{multilight-wgsl-I5SncF0q.js → multilight-wgsl-DRmyM3cC.js} +2 -2
  98. package/{multilight-wgsl-I5SncF0q.js.map → multilight-wgsl-DRmyM3cC.js.map} +1 -1
  99. package/{node-env-D7Aee08u.js → node-env-B-Ca2DL0.js} +2 -2
  100. package/{node-env-D7Aee08u.js.map → node-env-B-Ca2DL0.js.map} +1 -1
  101. package/{node-geometry-view-DfKXWNfV.js → node-geometry-view-BJDB-lrf.js} +3 -3
  102. package/{node-geometry-view-DfKXWNfV.js.map → node-geometry-view-BJDB-lrf.js.map} +1 -1
  103. package/{node-registry-extra-compat-CDLeBR1P.js → node-registry-extra-compat-SwS962Ax.js} +2 -2
  104. package/{node-registry-extra-compat-CDLeBR1P.js.map → node-registry-extra-compat-SwS962Ax.js.map} +1 -1
  105. package/{node-registry-extra-math-BA8_l4lB.js → node-registry-extra-math-Bsj4UAE5.js} +2 -2
  106. package/{node-registry-extra-math-BA8_l4lB.js.map → node-registry-extra-math-Bsj4UAE5.js.map} +1 -1
  107. package/{node-renderable-EwLLnaL1.js → node-renderable-BOIc3hM1.js} +2 -2
  108. package/{node-renderable-EwLLnaL1.js.map → node-renderable-BOIc3hM1.js.map} +1 -1
  109. package/{node-shadow-CeTmT6g4.js → node-shadow-DE--Q2V1.js} +2 -2
  110. package/{node-shadow-CeTmT6g4.js.map → node-shadow-DE--Q2V1.js.map} +1 -1
  111. package/{normal-map-fragment-BHImLyM-.js → normal-map-fragment-Cjm-v9uq.js} +2 -3
  112. package/{normal-map-fragment-BHImLyM-.js.map → normal-map-fragment-Cjm-v9uq.js.map} +1 -1
  113. package/package.json +3 -3
  114. package/{parse-camera-5IGdctAS.js → parse-camera-uQ8oKgeH.js} +2 -2
  115. package/{parse-camera-5IGdctAS.js.map → parse-camera-uQ8oKgeH.js.map} +1 -1
  116. package/{pbr-fog-wgsl-BqdCid6r.js → pbr-fog-wgsl-B5LrMToX.js} +2 -2
  117. package/{pbr-fog-wgsl-BqdCid6r.js.map → pbr-fog-wgsl-B5LrMToX.js.map} +1 -1
  118. package/{pbr-geometry-view-Dthf9Aut.js → pbr-geometry-view-BI52zgUI.js} +9 -11
  119. package/pbr-geometry-view-BI52zgUI.js.map +1 -0
  120. package/{pbr-metallic-roughness-block-g7wjzwN_.js → pbr-metallic-roughness-block-C7s1jL4q.js} +2 -2
  121. package/{pbr-metallic-roughness-block-g7wjzwN_.js.map → pbr-metallic-roughness-block-C7s1jL4q.js.map} +1 -1
  122. package/{pbr-metallic-roughness-block-full-DD6zI_Lx.js → pbr-metallic-roughness-block-full-BuhhVBFO.js} +2 -2
  123. package/{pbr-metallic-roughness-block-full-DD6zI_Lx.js.map → pbr-metallic-roughness-block-full-BuhhVBFO.js.map} +1 -1
  124. package/{pbr-mr-helper-core-CWROQ7OA.js → pbr-mr-helper-core-XeyKg-g6.js} +2 -2
  125. package/{pbr-mr-helper-core-CWROQ7OA.js.map → pbr-mr-helper-core-XeyKg-g6.js.map} +1 -1
  126. package/{pbr-refraction-Dxsm_gii.js → pbr-refraction-Bxz4GDeh.js} +2 -2
  127. package/{pbr-refraction-Dxsm_gii.js.map → pbr-refraction-Bxz4GDeh.js.map} +1 -1
  128. package/{pbr-renderable-CuKWalEM.js → pbr-renderable-B0elfRlX.js} +41 -189
  129. package/pbr-renderable-B0elfRlX.js.map +1 -0
  130. package/{pbr-shadow-fragment-waeIBQUq.js → pbr-shadow-fragment-QHbgqVlc.js} +2 -2
  131. package/{pbr-shadow-fragment-waeIBQUq.js.map → pbr-shadow-fragment-QHbgqVlc.js.map} +1 -1
  132. package/{pbr-tracking-CdeqbBrh.js → pbr-tracking-BWWSjls_.js} +2 -2
  133. package/{pbr-tracking-CdeqbBrh.js.map → pbr-tracking-BWWSjls_.js.map} +1 -1
  134. package/{pbr-transmission-ext-BNiXngZc.js → pbr-transmission-ext-DiEBLim-.js} +2 -2
  135. package/{pbr-transmission-ext-BNiXngZc.js.map → pbr-transmission-ext-DiEBLim-.js.map} +1 -1
  136. package/{reflectance-fragment-BQFZ_pgy.js → reflectance-fragment-wBk8UtBP.js} +2 -2
  137. package/{reflectance-fragment-BQFZ_pgy.js.map → reflectance-fragment-wBk8UtBP.js.map} +1 -1
  138. package/{rgbd-decode-duTlXMWd.js → rgbd-decode-CAQ7XSwl.js} +2 -2
  139. package/{rgbd-decode-duTlXMWd.js.map → rgbd-decode-CAQ7XSwl.js.map} +1 -1
  140. package/{screenshot-readback-DnxR4rhp.js → screenshot-readback-NxsFpnE4.js} +2 -2
  141. package/{screenshot-readback-DnxR4rhp.js.map → screenshot-readback-NxsFpnE4.js.map} +1 -1
  142. package/{shader-renderable-DVMVD6zP.js → shader-renderable-CUlJSove.js} +4 -196
  143. package/shader-renderable-CUlJSove.js.map +1 -0
  144. package/{shader-thin-instance-CsDo3ULk.js → shader-thin-instance-BjIbuYdv.js} +2 -2
  145. package/{shader-thin-instance-CsDo3ULk.js.map → shader-thin-instance-BjIbuYdv.js.map} +1 -1
  146. package/{sheen-fragment-B_Jd7wrr.js → sheen-fragment-ef8myYaq.js} +2 -2
  147. package/{sheen-fragment-B_Jd7wrr.js.map → sheen-fragment-ef8myYaq.js.map} +1 -1
  148. package/{singlelight-directional-wgsl-Bw84txva.js → singlelight-directional-wgsl-BvFBA1MO.js} +2 -2
  149. package/{singlelight-directional-wgsl-Bw84txva.js.map → singlelight-directional-wgsl-BvFBA1MO.js.map} +1 -1
  150. package/{singlelight-hemispheric-wgsl-DjxhgI8r.js → singlelight-hemispheric-wgsl-BEsGCqSN.js} +2 -2
  151. package/{singlelight-hemispheric-wgsl-DjxhgI8r.js.map → singlelight-hemispheric-wgsl-BEsGCqSN.js.map} +1 -1
  152. package/{singlelight-point-wgsl-iA1aRkXA.js → singlelight-point-wgsl-CvMr18Zf.js} +2 -2
  153. package/{singlelight-point-wgsl-iA1aRkXA.js.map → singlelight-point-wgsl-CvMr18Zf.js.map} +1 -1
  154. package/{singlelight-spot-wgsl-MDdTdstF.js → singlelight-spot-wgsl-jYIr13wU.js} +2 -2
  155. package/{singlelight-spot-wgsl-MDdTdstF.js.map → singlelight-spot-wgsl-jYIr13wU.js.map} +1 -1
  156. package/{skeleton-fragment-COdHWFcK.js → skeleton-fragment-B9M_ddNC.js} +2 -2
  157. package/{skeleton-fragment-COdHWFcK.js.map → skeleton-fragment-B9M_ddNC.js.map} +1 -1
  158. package/{skybox-renderable-DJYkfw32.js → skybox-renderable-lbMC32aI.js} +2 -3
  159. package/{skybox-renderable-DJYkfw32.js.map → skybox-renderable-lbMC32aI.js.map} +1 -1
  160. package/{splat-ply-compressed-SxMlsKNK.js → splat-ply-compressed-B_w2N_V7.js} +2 -2
  161. package/{splat-ply-compressed-SxMlsKNK.js.map → splat-ply-compressed-B_w2N_V7.js.map} +1 -1
  162. package/{standard-renderable-BAc-i-ig.js → standard-renderable-AYZ-Pdcm.js} +3 -4
  163. package/standard-renderable-AYZ-Pdcm.js.map +1 -0
  164. package/{std-ambient-fragment-P8dHZ4An.js → std-ambient-fragment-BXl-88sn.js} +2 -2
  165. package/{std-ambient-fragment-P8dHZ4An.js.map → std-ambient-fragment-BXl-88sn.js.map} +1 -1
  166. package/{std-cube-reflection-fragment-CF03MuQt.js → std-cube-reflection-fragment-Dn34WuMa.js} +2 -2
  167. package/{std-cube-reflection-fragment-CF03MuQt.js.map → std-cube-reflection-fragment-Dn34WuMa.js.map} +1 -1
  168. package/{std-emissive-fragment-P8yJGclx.js → std-emissive-fragment-CK7TwRAt.js} +2 -2
  169. package/{std-emissive-fragment-P8yJGclx.js.map → std-emissive-fragment-CK7TwRAt.js.map} +1 -1
  170. package/{std-lightmap-fragment-CymEG79z.js → std-lightmap-fragment-BSeS8K-4.js} +2 -2
  171. package/{std-lightmap-fragment-CymEG79z.js.map → std-lightmap-fragment-BSeS8K-4.js.map} +1 -1
  172. package/{std-opacity-fragment-DLa1zV06.js → std-opacity-fragment-DnLaWH9w.js} +2 -2
  173. package/{std-opacity-fragment-DLa1zV06.js.map → std-opacity-fragment-DnLaWH9w.js.map} +1 -1
  174. package/{std-reflection-fragment-BLySsYos.js → std-reflection-fragment-BToYPemd.js} +2 -2
  175. package/{std-reflection-fragment-BLySsYos.js.map → std-reflection-fragment-BToYPemd.js.map} +1 -1
  176. package/{std-shadow-fragment-C_q27Mdi.js → std-shadow-fragment-9b0rFY7F.js} +2 -2
  177. package/{std-shadow-fragment-C_q27Mdi.js.map → std-shadow-fragment-9b0rFY7F.js.map} +1 -1
  178. package/{std-specular-fragment-CaBXyAWY.js → std-specular-fragment-OBO-zxGh.js} +2 -2
  179. package/{std-specular-fragment-CaBXyAWY.js.map → std-specular-fragment-OBO-zxGh.js.map} +1 -1
  180. package/{std-tracking-Bw61Dv98.js → std-tracking-4SHTntWt.js} +2 -2
  181. package/{std-tracking-Bw61Dv98.js.map → std-tracking-4SHTntWt.js.map} +1 -1
  182. package/{subsurface-fragment-BNQoG9gr.js → subsurface-fragment-D7QRWN_d.js} +2 -2
  183. package/{subsurface-fragment-BNQoG9gr.js.map → subsurface-fragment-D7QRWN_d.js.map} +1 -1
  184. package/{thin-instance-cull-binding-BNC5JiGw.js → thin-instance-cull-binding-D-p2Yxfg.js} +3 -3
  185. package/{thin-instance-cull-binding-BNC5JiGw.js.map → thin-instance-cull-binding-D-p2Yxfg.js.map} +1 -1
  186. package/{thin-instance-gpu-C1DGstap.js → thin-instance-gpu-QETC_NyQ.js} +2 -2
  187. package/{thin-instance-gpu-C1DGstap.js.map → thin-instance-gpu-QETC_NyQ.js.map} +1 -1
  188. package/{tracking-primitives-CMBWLxGr.js → tracking-primitives-CqIIi7Ej.js} +2 -2
  189. package/{tracking-primitives-CMBWLxGr.js.map → tracking-primitives-CqIIi7Ej.js.map} +1 -1
  190. package/{unlit-fragment-BsHrS9XX.js → unlit-fragment-DPWDQLxo.js} +2 -2
  191. package/{unlit-fragment-BsHrS9XX.js.map → unlit-fragment-DPWDQLxo.js.map} +1 -1
  192. package/gltf-animation-BjnXkop6.js.map +0 -1
  193. package/gltf-feature-animation-pointer-C40tqOhL.js +0 -88
  194. package/gltf-feature-animation-pointer-C40tqOhL.js.map +0 -1
  195. package/gltf-feature-draco-CljWrsna.js +0 -125
  196. package/gltf-feature-draco-CljWrsna.js.map +0 -1
  197. package/gltf-feature-meshopt-DItMkOMt.js.map +0 -1
  198. package/gltf-feature-skeleton-Deh2UBAn.js.map +0 -1
  199. package/gltf-interleave-OBqmlu-h.js.map +0 -1
  200. package/index-BgY3QEzL.js.map +0 -1
  201. package/pbr-geometry-view-Dthf9Aut.js.map +0 -1
  202. package/pbr-renderable-CuKWalEM.js.map +0 -1
  203. package/shader-composer-CBy2i8nU.js +0 -293
  204. package/shader-composer-CBy2i8nU.js.map +0 -1
  205. package/shader-renderable-DVMVD6zP.js.map +0 -1
  206. package/standard-pipeline-DXFOUqU_.js +0 -391
  207. package/standard-pipeline-DXFOUqU_.js.map +0 -1
  208. package/standard-renderable-BAc-i-ig.js.map +0 -1
  209. package/wgsl-helpers-D8sl1VVA.js +0 -48
  210. package/wgsl-helpers-D8sl1VVA.js.map +0 -1
@@ -0,0 +1,161 @@
1
+ import { bu as setSubtreeVisible, a as F32, e as U8, j as U16, bZ as I8, b_ as I16, bB as PATH_WEIGHTS, bC as PATH_SCALE, bD as PATH_ROTATION, bE as PATH_TRANSLATION, b$ as PATH_POINTER } from "./index-C2sM8ERH.js";
2
+ import { _installPointerHandlers } from "./gltf-animation-Db8PwXmY.js";
3
+ const TX_SLOT = {
4
+ "pbrMetallicRoughness/baseColorTexture": "baseColorTexture",
5
+ emissiveTexture: "emissiveTexture",
6
+ normalTexture: "normalTexture",
7
+ occlusionTexture: "ormTexture",
8
+ "pbrMetallicRoughness/metallicRoughnessTexture": "ormTexture"
9
+ };
10
+ const _registry = [
11
+ // /nodes/{n}/extensions/KHR_node_visibility/visible — scalar (0 = hidden).
12
+ // The setter cascade handles descendants per the KHR_node_visibility spec
13
+ // and bumps the module-scoped visibility epoch so the engine invalidates
14
+ // its cached render bundle.
15
+ [
16
+ /^\/nodes\/(\d+)\/extensions\/KHR_node_visibility\/visible$/,
17
+ (m, ctx) => {
18
+ const n = ctx.nodes[+m[1]];
19
+ if (!n) {
20
+ return null;
21
+ }
22
+ return {
23
+ arity: 1,
24
+ writer: (out, off) => {
25
+ setSubtreeVisible(n, out[off] !== 0);
26
+ }
27
+ };
28
+ }
29
+ ],
30
+ // /materials/{m}/.../KHR_texture_transform/{offset|scale} — animated UV scroll
31
+ // (vec2). Mutates the slot texture's uOffset/vOffset (or uScale/vScale) and
32
+ // bumps the material's UBO version so the renderable re-uploads the UV matrix.
33
+ [
34
+ /^\/materials\/(\d+)\/(pbrMetallicRoughness\/baseColorTexture|pbrMetallicRoughness\/metallicRoughnessTexture|emissiveTexture|normalTexture|occlusionTexture)\/extensions\/KHR_texture_transform\/(offset|scale)$/,
35
+ (m, ctx) => {
36
+ var _a;
37
+ const mat = (_a = ctx.materials) == null ? void 0 : _a[+m[1]];
38
+ const tex = mat == null ? void 0 : mat[TX_SLOT[m[2]]];
39
+ if (!mat || !tex) {
40
+ return null;
41
+ }
42
+ const isScale = m[3] === "scale";
43
+ return {
44
+ arity: 2,
45
+ writer: (out, off) => {
46
+ if (isScale) {
47
+ tex.uScale = out[off];
48
+ tex.vScale = out[off + 1];
49
+ } else {
50
+ tex.uOffset = out[off];
51
+ tex.vOffset = out[off + 1];
52
+ }
53
+ mat._uboVersion++;
54
+ }
55
+ };
56
+ }
57
+ ]
58
+ ];
59
+ const _warned = /* @__PURE__ */ new Set();
60
+ function resolveAnimationPointer(pointer, ctx) {
61
+ for (const [rx, make] of _registry) {
62
+ const m = rx.exec(pointer);
63
+ if (m) {
64
+ return make(m, ctx);
65
+ }
66
+ }
67
+ if (!_warned.has(pointer)) {
68
+ _warned.add(pointer);
69
+ console.warn(`[babylon-lite] KHR_animation_pointer: no handler for "${pointer}"`);
70
+ }
71
+ return null;
72
+ }
73
+ const NODE_TRS_PATH = {
74
+ translation: PATH_TRANSLATION,
75
+ rotation: PATH_ROTATION,
76
+ scale: PATH_SCALE,
77
+ weights: PATH_WEIGHTS
78
+ };
79
+ let _matMapKey = null;
80
+ let _matMap = [];
81
+ function materialMap(json, meshes) {
82
+ var _a, _b, _c, _d;
83
+ if (meshes === _matMapKey) {
84
+ return _matMap;
85
+ }
86
+ _matMapKey = meshes;
87
+ const map = [];
88
+ const nodes = json.nodes ?? [];
89
+ let gpuIdx = 0;
90
+ for (let ni = 0; ni < nodes.length; ni++) {
91
+ const meshRef = (_a = nodes[ni]) == null ? void 0 : _a.mesh;
92
+ if (meshRef === void 0) {
93
+ continue;
94
+ }
95
+ const prims = ((_c = (_b = json.meshes) == null ? void 0 : _b[meshRef]) == null ? void 0 : _c.primitives) ?? [];
96
+ for (let p = 0; p < prims.length; p++) {
97
+ const matIdx = (_d = prims[p]) == null ? void 0 : _d.material;
98
+ const mesh = meshes[gpuIdx++];
99
+ if (matIdx !== void 0 && mesh) {
100
+ map[matIdx] = mesh.material;
101
+ }
102
+ }
103
+ }
104
+ _matMap = map;
105
+ return map;
106
+ }
107
+ _installPointerHandlers(
108
+ (ptr, c, nodeMap, json, meshes) => {
109
+ if (!nodeMap) {
110
+ return null;
111
+ }
112
+ const trs = /^\/nodes\/(\d+)\/(translation|rotation|scale|weights)$/.exec(ptr);
113
+ if (trs) {
114
+ return { samplerIdx: c.sampler, nodeIdx: +trs[1], path: NODE_TRS_PATH[trs[2]] };
115
+ }
116
+ const resolved = resolveAnimationPointer(ptr, { nodes: nodeMap, materials: materialMap(json, meshes) });
117
+ if (!resolved) {
118
+ return null;
119
+ }
120
+ const ch = {
121
+ samplerIdx: c.sampler,
122
+ nodeIdx: -1,
123
+ path: PATH_POINTER,
124
+ pointerWriter: resolved.writer,
125
+ pointerArity: resolved.arity
126
+ };
127
+ return ch;
128
+ },
129
+ (src, length, normalized) => {
130
+ const out = new F32(length);
131
+ if (src instanceof F32) {
132
+ for (let i = 0; i < length; i++) {
133
+ out[i] = src[i];
134
+ }
135
+ } else if (src instanceof U8) {
136
+ const k = normalized ? 1 / 255 : 1;
137
+ for (let i = 0; i < length; i++) {
138
+ out[i] = src[i] * k;
139
+ }
140
+ } else if (src instanceof U16) {
141
+ const k = normalized ? 1 / 65535 : 1;
142
+ for (let i = 0; i < length; i++) {
143
+ out[i] = src[i] * k;
144
+ }
145
+ } else if (src instanceof I8) {
146
+ for (let i = 0; i < length; i++) {
147
+ out[i] = normalized ? Math.max(src[i] / 127, -1) : src[i];
148
+ }
149
+ } else if (src instanceof I16) {
150
+ for (let i = 0; i < length; i++) {
151
+ out[i] = normalized ? Math.max(src[i] / 32767, -1) : src[i];
152
+ }
153
+ }
154
+ return out;
155
+ }
156
+ );
157
+ const feature = { id: "KHR_animation_pointer" };
158
+ export {
159
+ feature as default
160
+ };
161
+ //# sourceMappingURL=gltf-feature-animation-pointer-nDf6dGpL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gltf-feature-animation-pointer-nDf6dGpL.js","sources":["../src/loader-gltf/animation-pointer.ts","../src/loader-gltf/gltf-feature-animation-pointer.ts"],"sourcesContent":["/** KHR_animation_pointer — JSON-pointer resolver registry.\n * Handlers are registered incrementally (one per parity scene). Unknown\n * pointers return null and warn once. */\nimport type { SceneNode } from \"../scene/scene-node.js\";\nimport { setSubtreeVisible } from \"../scene/visibility.js\";\n\nexport interface ResolvedPointer {\n writer: (output: Float32Array, offset: number) => void;\n arity: number;\n}\n\n/** Minimal mutable view of a UV-transform texture slot the pointer writers drive.\n * Mirrors the fields `material/pbr/fragments/uv-transform-fragment.ts` reads. */\nexport interface PointerUvTexture {\n uScale?: number;\n vScale?: number;\n uOffset?: number;\n vOffset?: number;\n}\n\n/** Minimal mutable view of a runtime material a pointer can animate. Bumping\n * `_uboVersion` makes the renderable re-upload the material UBO next frame. */\nexport interface PointerMaterial {\n /** @internal */\n _uboVersion: number;\n baseColorTexture?: PointerUvTexture;\n emissiveTexture?: PointerUvTexture;\n normalTexture?: PointerUvTexture;\n ormTexture?: PointerUvTexture;\n specGlossTexture?: PointerUvTexture;\n}\n\nexport interface PointerContext {\n nodes: readonly (SceneNode | undefined)[];\n /** Runtime materials indexed by glTF material index (built by the pointer feature). */\n materials?: readonly (PointerMaterial | undefined)[];\n}\n\ntype PointerFactory = (match: RegExpExecArray, ctx: PointerContext) => ResolvedPointer | null;\n\n// Maps a KHR_texture_transform pointer's texture-slot segment to the material field.\nconst TX_SLOT: Record<string, keyof PointerMaterial> = {\n \"pbrMetallicRoughness/baseColorTexture\": \"baseColorTexture\",\n emissiveTexture: \"emissiveTexture\",\n normalTexture: \"normalTexture\",\n occlusionTexture: \"ormTexture\",\n \"pbrMetallicRoughness/metallicRoughnessTexture\": \"ormTexture\",\n};\n\nconst _registry: [RegExp, PointerFactory][] = [\n // /nodes/{n}/extensions/KHR_node_visibility/visible — scalar (0 = hidden).\n // The setter cascade handles descendants per the KHR_node_visibility spec\n // and bumps the module-scoped visibility epoch so the engine invalidates\n // its cached render bundle.\n [\n /^\\/nodes\\/(\\d+)\\/extensions\\/KHR_node_visibility\\/visible$/,\n (m, ctx) => {\n const n = ctx.nodes[+m[1]!];\n if (!n) {\n return null;\n }\n return {\n arity: 1,\n writer: (out, off) => {\n setSubtreeVisible(n, out[off]! !== 0);\n },\n };\n },\n ],\n // /materials/{m}/.../KHR_texture_transform/{offset|scale} — animated UV scroll\n // (vec2). Mutates the slot texture's uOffset/vOffset (or uScale/vScale) and\n // bumps the material's UBO version so the renderable re-uploads the UV matrix.\n [\n /^\\/materials\\/(\\d+)\\/(pbrMetallicRoughness\\/baseColorTexture|pbrMetallicRoughness\\/metallicRoughnessTexture|emissiveTexture|normalTexture|occlusionTexture)\\/extensions\\/KHR_texture_transform\\/(offset|scale)$/,\n (m, ctx) => {\n const mat = ctx.materials?.[+m[1]!];\n const tex = mat?.[TX_SLOT[m[2]!]!] as PointerUvTexture | undefined;\n if (!mat || !tex) {\n return null;\n }\n const isScale = m[3] === \"scale\";\n return {\n arity: 2,\n writer: (out, off) => {\n if (isScale) {\n tex.uScale = out[off]!;\n tex.vScale = out[off + 1]!;\n } else {\n tex.uOffset = out[off]!;\n tex.vOffset = out[off + 1]!;\n }\n mat._uboVersion++;\n },\n };\n },\n ],\n];\n\nconst _warned = new Set<string>();\n\nexport function resolveAnimationPointer(pointer: string, ctx: PointerContext): ResolvedPointer | null {\n for (const [rx, make] of _registry) {\n const m = rx.exec(pointer);\n if (m) {\n return make(m, ctx);\n }\n }\n if (!_warned.has(pointer)) {\n _warned.add(pointer);\n\n console.warn(`[babylon-lite] KHR_animation_pointer: no handler for \"${pointer}\"`);\n }\n return null;\n}\n","/** KHR_animation_pointer glTF feature.\n *\n * Registered in the feature registry gated on `KHR_animation_pointer`, so any\n * scene that doesn't declare the extension pays zero bytes for pointer\n * resolution, the non-Float32 sampler converter, or the visibility cascade.\n *\n * On side-effect import this module installs two callbacks into gltf-animation:\n * 1. A pointer-channel parser (resolves the JSON pointer to a writer fn).\n * 2. A sampler converter that handles the non-Float32/misaligned accessor\n * cases the fast path in gltf-animation can't express (e.g. the 11-byte\n * UNSIGNED_BYTE visibility accessor in CubeVisibility.glb).\n *\n * Node-visibility and node-TRS pointers resolve here directly. Material\n * texture-transform pointers are handled by animation-pointer-material.ts,\n * which the feature registry loads only when KHR_texture_transform is also\n * present — so node-only pointer scenes never bundle the material lookup. */\n\nimport { F32, U16, I16, U8, I8 } from \"../engine/typed-arrays.js\";\nimport type { GltfFeature } from \"./gltf-feature.js\";\nimport type { Mesh } from \"../mesh/mesh.js\";\nimport type { AnimationChannel, TargetPath } from \"../animation/types.js\";\nimport { PATH_POINTER, PATH_TRANSLATION, PATH_ROTATION, PATH_SCALE, PATH_WEIGHTS } from \"../animation/types.js\";\nimport type { PointerMaterial } from \"./animation-pointer.js\";\nimport { resolveAnimationPointer } from \"./animation-pointer.js\";\nimport { _installPointerHandlers } from \"./gltf-animation.js\";\n\n// Node TRS/weights pointer targets map 1:1 onto the standard glTF channel paths.\nconst NODE_TRS_PATH: Record<string, TargetPath> = {\n translation: PATH_TRANSLATION,\n rotation: PATH_ROTATION,\n scale: PATH_SCALE,\n weights: PATH_WEIGHTS,\n};\n\n// Material pointers (texture-transform) resolve against the runtime material indexed\n// by glTF material index. Built from the same node→primitive→gpuMesh order the loader\n// uploads in, and memoized per asset (one map per `meshes` array). `mesh.material` is\n// the PbrMaterialProps carrying `_uboVersion` + the UV-transform texture slots.\nlet _matMapKey: readonly Mesh[] | null = null;\nlet _matMap: (PointerMaterial | undefined)[] = [];\nfunction materialMap(json: any, meshes: readonly Mesh[]): (PointerMaterial | undefined)[] {\n if (meshes === _matMapKey) {\n return _matMap;\n }\n _matMapKey = meshes;\n const map: (PointerMaterial | undefined)[] = [];\n const nodes = json.nodes ?? [];\n let gpuIdx = 0;\n for (let ni = 0; ni < nodes.length; ni++) {\n const meshRef = nodes[ni]?.mesh;\n if (meshRef === undefined) {\n continue;\n }\n const prims = json.meshes?.[meshRef]?.primitives ?? [];\n for (let p = 0; p < prims.length; p++) {\n const matIdx = prims[p]?.material;\n const mesh = meshes[gpuIdx++];\n if (matIdx !== undefined && mesh) {\n map[matIdx] = mesh.material as unknown as PointerMaterial;\n }\n }\n }\n _matMap = map;\n return map;\n}\n\n_installPointerHandlers(\n (ptr, c, nodeMap, json, meshes) => {\n if (!nodeMap) {\n return null;\n }\n // A /nodes/{n}/{translation|rotation|scale|weights} pointer is semantically\n // identical to a standard glTF channel on node n. Emit a standard channel so it\n // flows through the proven topological node-TRS / morph writeback (which moves the\n // node AND its descendants) instead of an opaque per-node writer.\n const trs = /^\\/nodes\\/(\\d+)\\/(translation|rotation|scale|weights)$/.exec(ptr);\n if (trs) {\n return { samplerIdx: c.sampler, nodeIdx: +trs[1]!, path: NODE_TRS_PATH[trs[2]!]! };\n }\n // Only build the material map when a non-node pointer is actually present.\n const resolved = resolveAnimationPointer(ptr, { nodes: nodeMap, materials: materialMap(json, meshes) });\n if (!resolved) {\n return null;\n }\n const ch: AnimationChannel = {\n samplerIdx: c.sampler,\n nodeIdx: -1,\n path: PATH_POINTER,\n pointerWriter: resolved.writer,\n pointerArity: resolved.arity,\n };\n return ch;\n },\n (src, length, normalized) => {\n // Convert any animation-sampler payload to a standalone Float32Array.\n // Handles the cases the aligned-Float32 fast path can't express.\n const out = new F32(length);\n if (src instanceof F32) {\n for (let i = 0; i < length; i++) {\n out[i] = src[i]!;\n }\n } else if (src instanceof U8) {\n const k = normalized ? 1 / 255 : 1;\n for (let i = 0; i < length; i++) {\n out[i] = src[i]! * k;\n }\n } else if (src instanceof U16) {\n const k = normalized ? 1 / 65535 : 1;\n for (let i = 0; i < length; i++) {\n out[i] = src[i]! * k;\n }\n } else if (src instanceof I8) {\n for (let i = 0; i < length; i++) {\n out[i] = normalized ? Math.max(src[i]! / 127, -1) : src[i]!;\n }\n } else if (src instanceof I16) {\n for (let i = 0; i < length; i++) {\n out[i] = normalized ? Math.max(src[i]! / 32767, -1) : src[i]!;\n }\n }\n return out;\n }\n);\n\nconst feature: GltfFeature = { id: \"KHR_animation_pointer\" };\nexport default feature;\n"],"names":[],"mappings":";;AAyCA,MAAM,UAAiD;AAAA,EACnD,yCAAyC;AAAA,EACzC,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,iDAAiD;AACrD;AAEA,MAAM,YAAwC;AAAA;AAAA;AAAA;AAAA;AAAA,EAK1C;AAAA,IACI;AAAA,IACA,CAAC,GAAG,QAAQ;AACR,YAAM,IAAI,IAAI,MAAM,CAAC,EAAE,CAAC,CAAE;AAC1B,UAAI,CAAC,GAAG;AACJ,eAAO;AAAA,MACX;AACA,aAAO;AAAA,QACH,OAAO;AAAA,QACP,QAAQ,CAAC,KAAK,QAAQ;AAClB,4BAAkB,GAAG,IAAI,GAAG,MAAO,CAAC;AAAA,QACxC;AAAA,MAAA;AAAA,IAER;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAKJ;AAAA,IACI;AAAA,IACA,CAAC,GAAG,QAAQ;;AACR,YAAM,OAAM,SAAI,cAAJ,mBAAgB,CAAC,EAAE,CAAC;AAChC,YAAM,MAAM,2BAAM,QAAQ,EAAE,CAAC,CAAE;AAC/B,UAAI,CAAC,OAAO,CAAC,KAAK;AACd,eAAO;AAAA,MACX;AACA,YAAM,UAAU,EAAE,CAAC,MAAM;AACzB,aAAO;AAAA,QACH,OAAO;AAAA,QACP,QAAQ,CAAC,KAAK,QAAQ;AAClB,cAAI,SAAS;AACT,gBAAI,SAAS,IAAI,GAAG;AACpB,gBAAI,SAAS,IAAI,MAAM,CAAC;AAAA,UAC5B,OAAO;AACH,gBAAI,UAAU,IAAI,GAAG;AACrB,gBAAI,UAAU,IAAI,MAAM,CAAC;AAAA,UAC7B;AACA,cAAI;AAAA,QACR;AAAA,MAAA;AAAA,IAER;AAAA,EAAA;AAER;AAEA,MAAM,8BAAc,IAAA;AAEb,SAAS,wBAAwB,SAAiB,KAA6C;AAClG,aAAW,CAAC,IAAI,IAAI,KAAK,WAAW;AAChC,UAAM,IAAI,GAAG,KAAK,OAAO;AACzB,QAAI,GAAG;AACH,aAAO,KAAK,GAAG,GAAG;AAAA,IACtB;AAAA,EACJ;AACA,MAAI,CAAC,QAAQ,IAAI,OAAO,GAAG;AACvB,YAAQ,IAAI,OAAO;AAEnB,YAAQ,KAAK,yDAAyD,OAAO,GAAG;AAAA,EACpF;AACA,SAAO;AACX;ACtFA,MAAM,gBAA4C;AAAA,EAC9C,aAAa;AAAA,EACb,UAAU;AAAA,EACV,OAAO;AAAA,EACP,SAAS;AACb;AAMA,IAAI,aAAqC;AACzC,IAAI,UAA2C,CAAA;AAC/C,SAAS,YAAY,MAAW,QAA0D;;AACtF,MAAI,WAAW,YAAY;AACvB,WAAO;AAAA,EACX;AACA,eAAa;AACb,QAAM,MAAuC,CAAA;AAC7C,QAAM,QAAQ,KAAK,SAAS,CAAA;AAC5B,MAAI,SAAS;AACb,WAAS,KAAK,GAAG,KAAK,MAAM,QAAQ,MAAM;AACtC,UAAM,WAAU,WAAM,EAAE,MAAR,mBAAW;AAC3B,QAAI,YAAY,QAAW;AACvB;AAAA,IACJ;AACA,UAAM,UAAQ,gBAAK,WAAL,mBAAc,aAAd,mBAAwB,eAAc,CAAA;AACpD,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACnC,YAAM,UAAS,WAAM,CAAC,MAAP,mBAAU;AACzB,YAAM,OAAO,OAAO,QAAQ;AAC5B,UAAI,WAAW,UAAa,MAAM;AAC9B,YAAI,MAAM,IAAI,KAAK;AAAA,MACvB;AAAA,IACJ;AAAA,EACJ;AACA,YAAU;AACV,SAAO;AACX;AAEA;AAAA,EACI,CAAC,KAAK,GAAG,SAAS,MAAM,WAAW;AAC/B,QAAI,CAAC,SAAS;AACV,aAAO;AAAA,IACX;AAKA,UAAM,MAAM,yDAAyD,KAAK,GAAG;AAC7E,QAAI,KAAK;AACL,aAAO,EAAE,YAAY,EAAE,SAAS,SAAS,CAAC,IAAI,CAAC,GAAI,MAAM,cAAc,IAAI,CAAC,CAAE,EAAA;AAAA,IAClF;AAEA,UAAM,WAAW,wBAAwB,KAAK,EAAE,OAAO,SAAS,WAAW,YAAY,MAAM,MAAM,EAAA,CAAG;AACtG,QAAI,CAAC,UAAU;AACX,aAAO;AAAA,IACX;AACA,UAAM,KAAuB;AAAA,MACzB,YAAY,EAAE;AAAA,MACd,SAAS;AAAA,MACT,MAAM;AAAA,MACN,eAAe,SAAS;AAAA,MACxB,cAAc,SAAS;AAAA,IAAA;AAE3B,WAAO;AAAA,EACX;AAAA,EACA,CAAC,KAAK,QAAQ,eAAe;AAGzB,UAAM,MAAM,IAAI,IAAI,MAAM;AAC1B,QAAI,eAAe,KAAK;AACpB,eAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC7B,YAAI,CAAC,IAAI,IAAI,CAAC;AAAA,MAClB;AAAA,IACJ,WAAW,eAAe,IAAI;AAC1B,YAAM,IAAI,aAAa,IAAI,MAAM;AACjC,eAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC7B,YAAI,CAAC,IAAI,IAAI,CAAC,IAAK;AAAA,MACvB;AAAA,IACJ,WAAW,eAAe,KAAK;AAC3B,YAAM,IAAI,aAAa,IAAI,QAAQ;AACnC,eAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC7B,YAAI,CAAC,IAAI,IAAI,CAAC,IAAK;AAAA,MACvB;AAAA,IACJ,WAAW,eAAe,IAAI;AAC1B,eAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC7B,YAAI,CAAC,IAAI,aAAa,KAAK,IAAI,IAAI,CAAC,IAAK,KAAK,EAAE,IAAI,IAAI,CAAC;AAAA,MAC7D;AAAA,IACJ,WAAW,eAAe,KAAK;AAC3B,eAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC7B,YAAI,CAAC,IAAI,aAAa,KAAK,IAAI,IAAI,CAAC,IAAK,OAAO,EAAE,IAAI,IAAI,CAAC;AAAA,MAC/D;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AACJ;AAEA,MAAM,UAAuB,EAAE,IAAI,wBAAA;"}
@@ -1,8 +1,8 @@
1
1
  const feature = {
2
2
  id: "_animations",
3
3
  async applyAsset(meshes, _root, ctx) {
4
- const [{ parseAnimationData }, { createAnimationGroups }] = await Promise.all([import("./gltf-animation-BjnXkop6.js"), import("./index-BgY3QEzL.js").then((n) => n.k7)]);
5
- const animData = parseAnimationData(ctx._json, ctx._binChunk, meshes, ctx._parentMap, ctx._worldMatrixCache, ctx._nodeMap);
4
+ const [{ parseAnimationData }, { createAnimationGroups }] = await Promise.all([import("./gltf-animation-Db8PwXmY.js"), import("./index-C2sM8ERH.js").then((n) => n.kE)]);
5
+ const animData = parseAnimationData(ctx._json, ctx._binChunk, meshes, ctx._parentMap, ctx._worldMatrixCache, ctx._nodeMap, ctx._boneOverrides);
6
6
  if (!animData) {
7
7
  return {};
8
8
  }
@@ -12,4 +12,4 @@ const feature = {
12
12
  export {
13
13
  feature as default
14
14
  };
15
- //# sourceMappingURL=gltf-feature-animations-v0S_yb4T.js.map
15
+ //# sourceMappingURL=gltf-feature-animations-Dr9AsgIN.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gltf-feature-animations-v0S_yb4T.js","sources":["../src/loader-gltf/gltf-feature-animations.ts"],"sourcesContent":["/** glTF animation feature.\n * Triggered when the asset has any animations. Per-asset hook parses clips,\n * binds them to the uploaded meshes, and returns AnimationGroups. */\n\nimport type { GltfFeature } from \"./gltf-feature.js\";\n\nconst feature: GltfFeature = {\n id: \"_animations\",\n async applyAsset(meshes, _root, ctx) {\n const [{ parseAnimationData }, { createAnimationGroups }] = await Promise.all([import(\"./gltf-animation.js\"), import(\"../animation/animation-group.js\")]);\n const animData = parseAnimationData(ctx._json, ctx._binChunk, meshes, ctx._parentMap, ctx._worldMatrixCache, ctx._nodeMap);\n if (!animData) {\n return {};\n }\n return { animationGroups: createAnimationGroups(animData) };\n },\n};\nexport default feature;\n"],"names":[],"mappings":"AAMA,MAAM,UAAuB;AAAA,EACzB,IAAI;AAAA,EACJ,MAAM,WAAW,QAAQ,OAAO,KAAK;AACjC,UAAM,CAAC,EAAE,mBAAA,GAAsB,EAAE,sBAAA,CAAuB,IAAI,MAAM,QAAQ,IAAI,CAAC,OAAO,8BAAqB,GAAG,OAAO,qBAAiC,EAAA,KAAA,OAAA,EAAA,EAAA,CAAC,CAAC;AACxJ,UAAM,WAAW,mBAAmB,IAAI,OAAO,IAAI,WAAW,QAAQ,IAAI,YAAY,IAAI,mBAAmB,IAAI,QAAQ;AACzH,QAAI,CAAC,UAAU;AACX,aAAO,CAAA;AAAA,IACX;AACA,WAAO,EAAE,iBAAiB,sBAAsB,QAAQ,EAAA;AAAA,EAC5D;AACJ;"}
1
+ {"version":3,"file":"gltf-feature-animations-Dr9AsgIN.js","sources":["../src/loader-gltf/gltf-feature-animations.ts"],"sourcesContent":["/** glTF animation feature.\n * Triggered when the asset has any animations. Per-asset hook parses clips,\n * binds them to the uploaded meshes, and returns AnimationGroups. */\n\nimport type { GltfFeature } from \"./gltf-feature.js\";\n\nconst feature: GltfFeature = {\n id: \"_animations\",\n async applyAsset(meshes, _root, ctx) {\n const [{ parseAnimationData }, { createAnimationGroups }] = await Promise.all([import(\"./gltf-animation.js\"), import(\"../animation/animation-group.js\")]);\n const animData = parseAnimationData(ctx._json, ctx._binChunk, meshes, ctx._parentMap, ctx._worldMatrixCache, ctx._nodeMap, ctx._boneOverrides);\n if (!animData) {\n return {};\n }\n return { animationGroups: createAnimationGroups(animData) };\n },\n};\nexport default feature;\n"],"names":[],"mappings":"AAMA,MAAM,UAAuB;AAAA,EACzB,IAAI;AAAA,EACJ,MAAM,WAAW,QAAQ,OAAO,KAAK;AACjC,UAAM,CAAC,EAAE,mBAAA,GAAsB,EAAE,sBAAA,CAAuB,IAAI,MAAM,QAAQ,IAAI,CAAC,OAAO,8BAAqB,GAAG,OAAO,qBAAiC,EAAA,KAAA,OAAA,EAAA,EAAA,CAAC,CAAC;AACxJ,UAAM,WAAW,mBAAmB,IAAI,OAAO,IAAI,WAAW,QAAQ,IAAI,YAAY,IAAI,mBAAmB,IAAI,UAAU,IAAI,cAAc;AAC7I,QAAI,CAAC,UAAU;AACX,aAAO,CAAA;AAAA,IACX;AACA,WAAO,EAAE,iBAAiB,sBAAsB,QAAQ,EAAA;AAAA,EAC5D;AACJ;"}
@@ -0,0 +1,33 @@
1
+ import { bn as getDracoBufferViewBytes, bo as decodeDracoPrimitive } from "./index-C2sM8ERH.js";
2
+ const TYPE_COMPONENT_COUNTS = { SCALAR: 1, VEC2: 2, VEC3: 3, VEC4: 4, MAT2: 4, MAT3: 9, MAT4: 16 };
3
+ const feature = {
4
+ id: "KHR_draco_mesh_compression",
5
+ async preMesh(jsonIn, binChunk) {
6
+ var _a, _b, _c;
7
+ const json = jsonIn;
8
+ const out = /* @__PURE__ */ new Map();
9
+ for (const mesh of json.meshes ?? []) {
10
+ for (const primitive of mesh.primitives ?? []) {
11
+ const ext = (_a = primitive.extensions) == null ? void 0 : _a.KHR_draco_mesh_compression;
12
+ if (!ext) {
13
+ continue;
14
+ }
15
+ const bytes = getDracoBufferViewBytes(json, binChunk, ext.bufferView);
16
+ const accessorTypes = {};
17
+ for (const name of Object.keys(ext.attributes)) {
18
+ const accIdx = (_b = primitive.attributes) == null ? void 0 : _b[name];
19
+ if (accIdx !== void 0 && ((_c = json.accessors) == null ? void 0 : _c[accIdx])) {
20
+ accessorTypes[name] = TYPE_COMPONENT_COUNTS[json.accessors[accIdx].type] ?? 3;
21
+ }
22
+ }
23
+ const decoded = await decodeDracoPrimitive(bytes, ext.attributes, accessorTypes);
24
+ out.set(primitive, decoded);
25
+ }
26
+ }
27
+ return out;
28
+ }
29
+ };
30
+ export {
31
+ feature as default
32
+ };
33
+ //# sourceMappingURL=gltf-feature-draco-CRgxNaK1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gltf-feature-draco-CRgxNaK1.js","sources":["../src/loader-gltf/gltf-feature-draco.ts"],"sourcesContent":["/**\n * KHR_draco_mesh_compression feature.\n *\n * Runs as a `preMesh` hook — before mesh extraction — so the core loader\n * stays unaware of Draco. This module is only dynamic-imported when the\n * asset's `extensionsUsed` lists KHR_draco_mesh_compression, which in turn\n * dynamic-imports the actual Emscripten-based decoder (`draco-decode.ts`).\n */\n\nimport type { DecodedPrimitive, GltfFeature } from \"./gltf-feature.js\";\nimport { decodeDracoPrimitive, getDracoBufferViewBytes } from \"./draco-decode.js\";\n\nconst TYPE_COMPONENT_COUNTS: Record<string, number> = { SCALAR: 1, VEC2: 2, VEC3: 3, VEC4: 4, MAT2: 4, MAT3: 9, MAT4: 16 };\n\nconst feature: GltfFeature = {\n id: \"KHR_draco_mesh_compression\",\n async preMesh(jsonIn, binChunk) {\n const json = jsonIn as {\n meshes?: Array<{\n primitives?: Array<{ attributes?: Record<string, number>; extensions?: Record<string, { bufferView: number; attributes: Record<string, number> }> }>;\n }>;\n accessors?: Array<{ type: string }>;\n };\n const out = new Map<unknown, DecodedPrimitive>();\n for (const mesh of json.meshes ?? []) {\n for (const primitive of mesh.primitives ?? []) {\n const ext = primitive.extensions?.KHR_draco_mesh_compression;\n if (!ext) {\n continue;\n }\n const bytes = getDracoBufferViewBytes(json as { bufferViews: Array<{ byteOffset?: number; byteLength: number }> }, binChunk, ext.bufferView);\n const accessorTypes: Record<string, number> = {};\n for (const name of Object.keys(ext.attributes)) {\n const accIdx = primitive.attributes?.[name];\n if (accIdx !== undefined && json.accessors?.[accIdx]) {\n accessorTypes[name] = TYPE_COMPONENT_COUNTS[json.accessors[accIdx].type] ?? 3;\n }\n }\n const decoded = await decodeDracoPrimitive(bytes, ext.attributes, accessorTypes);\n out.set(primitive, decoded);\n }\n }\n return out;\n },\n};\n\nexport default feature;\n"],"names":[],"mappings":";AAYA,MAAM,wBAAgD,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAA;AAEtH,MAAM,UAAuB;AAAA,EACzB,IAAI;AAAA,EACJ,MAAM,QAAQ,QAAQ,UAAU;;AAC5B,UAAM,OAAO;AAMb,UAAM,0BAAU,IAAA;AAChB,eAAW,QAAQ,KAAK,UAAU,CAAA,GAAI;AAClC,iBAAW,aAAa,KAAK,cAAc,CAAA,GAAI;AAC3C,cAAM,OAAM,eAAU,eAAV,mBAAsB;AAClC,YAAI,CAAC,KAAK;AACN;AAAA,QACJ;AACA,cAAM,QAAQ,wBAAwB,MAA6E,UAAU,IAAI,UAAU;AAC3I,cAAM,gBAAwC,CAAA;AAC9C,mBAAW,QAAQ,OAAO,KAAK,IAAI,UAAU,GAAG;AAC5C,gBAAM,UAAS,eAAU,eAAV,mBAAuB;AACtC,cAAI,WAAW,YAAa,UAAK,cAAL,mBAAiB,UAAS;AAClD,0BAAc,IAAI,IAAI,sBAAsB,KAAK,UAAU,MAAM,EAAE,IAAI,KAAK;AAAA,UAChF;AAAA,QACJ;AACA,cAAM,UAAU,MAAM,qBAAqB,OAAO,IAAI,YAAY,aAAa;AAC/E,YAAI,IAAI,WAAW,OAAO;AAAA,MAC9B;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AACJ;"}
@@ -1,4 +1,4 @@
1
- import { r as resolveAccessor, br as setThinInstances, bs as mat4ComposeInto, a as F32, h as computeAabb, bt as getLoaderTmpInstance, bu as mat4Multiply } from "./index-BgY3QEzL.js";
1
+ import { r as resolveAccessor, bG as setThinInstances, bH as mat4ComposeInto, a as F32, h as computeAabb, bI as getLoaderTmpInstance, bJ as mat4Multiply } from "./index-C2sM8ERH.js";
2
2
  function collectMeshesUnderNode(tn) {
3
3
  const out = [];
4
4
  for (const c of (tn == null ? void 0 : tn.children) ?? []) {
@@ -149,4 +149,4 @@ function expandMeshAabbForInstances(mesh, matrices, count, nodeWorld) {
149
149
  export {
150
150
  ext as default
151
151
  };
152
- //# sourceMappingURL=gltf-feature-gpu-instancing-BoeSm6Tn.js.map
152
+ //# sourceMappingURL=gltf-feature-gpu-instancing-QfJNFW1R.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gltf-feature-gpu-instancing-BoeSm6Tn.js","sources":["../src/loader-gltf/gltf-feature-gpu-instancing.ts"],"sourcesContent":["/** glTF EXT_mesh_gpu_instancing extension.\n *\n * Attaches hardware-instanced thin instances to every mesh that belongs to a\n * node carrying `extensions.EXT_mesh_gpu_instancing`. The extension provides\n * per-instance TRANSLATION / ROTATION / SCALE accessors (all optional); each\n * instance matrix is composed as T·R·S in the node's local frame. The node's\n * own TRS is applied through the regular parent-chain world matrix at render\n * time (`finalWorld = mesh.world * instanceWorld` in thin-instance-fragment),\n * so instance matrices must NOT pre-multiply the node transform.\n *\n * Dynamically imported by load-gltf only when the asset declares the\n * extension in `extensionsUsed`, so bundles pay zero bytes otherwise.\n *\n * Spec: https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Vendor/EXT_mesh_gpu_instancing/README.md\n */\n\nimport { F32 } from \"../engine/typed-arrays.js\";\nimport type { GltfFeature } from \"./gltf-feature.js\";\nimport type { Mesh } from \"../mesh/mesh.js\";\nimport { resolveAccessor } from \"./gltf-parser.js\";\nimport { computeAabb } from \"../math/compute-aabb.js\";\nimport { mat4ComposeInto } from \"../math/mat4-compose-into.js\";\nimport { mat4Multiply } from \"../math/mat4-multiply.js\";\nimport type { Mat4 } from \"../math/types.js\";\nimport type { Mat4Storage } from \"../math/types.js\";\nimport { setThinInstances } from \"../mesh/thin-instance.js\";\nimport { getLoaderTmpInstance } from \"./_loader-scratch.js\";\n\n/** Collect every Mesh child (direct children only — matches buildNodeHierarchy). */\nfunction collectMeshesUnderNode(tn: { children?: unknown[] } | undefined): Mesh[] {\n const out: Mesh[] = [];\n for (const c of tn?.children ?? []) {\n if (c && typeof c === \"object\" && \"material\" in (c as object)) {\n out.push(c as Mesh);\n }\n }\n return out;\n}\n\nfunction buildInstanceMatrices(translation: Float32Array | null, rotation: Float32Array | null, scale: Float32Array | null, count: number): Float32Array {\n const matrices = new F32(count * 16);\n for (let i = 0; i < count; i++) {\n const tx = translation ? translation[i * 3]! : 0;\n const ty = translation ? translation[i * 3 + 1]! : 0;\n const tz = translation ? translation[i * 3 + 2]! : 0;\n const qx = rotation ? rotation[i * 4]! : 0;\n const qy = rotation ? rotation[i * 4 + 1]! : 0;\n const qz = rotation ? rotation[i * 4 + 2]! : 0;\n const qw = rotation ? rotation[i * 4 + 3]! : 1;\n const sx = scale ? scale[i * 3]! : 1;\n const sy = scale ? scale[i * 3 + 1]! : 1;\n const sz = scale ? scale[i * 3 + 2]! : 1;\n mat4ComposeInto(matrices, i * 16, tx, ty, tz, qx, qy, qz, qw, sx, sy, sz);\n }\n return matrices;\n}\n\nconst ext: GltfFeature = {\n id: \"EXT_mesh_gpu_instancing\",\n async applyAsset(_meshes, _root, ctx) {\n const { _json: json, _binChunk: binChunk, _nodeMap: nodeMap } = ctx;\n if (!nodeMap) {\n return {};\n }\n const nodes = json.nodes ?? [];\n for (let nodeIdx = 0; nodeIdx < nodes.length; nodeIdx++) {\n const attrs = nodes[nodeIdx]?.extensions?.EXT_mesh_gpu_instancing?.attributes;\n if (!attrs) {\n continue;\n }\n const tn = nodeMap[nodeIdx];\n if (!tn) {\n continue;\n }\n const meshesForNode = collectMeshesUnderNode(tn as unknown as { children?: unknown[] });\n if (meshesForNode.length === 0) {\n continue;\n }\n\n const tAcc = attrs.TRANSLATION !== undefined ? resolveAccessor(json, binChunk, attrs.TRANSLATION) : null;\n const rAcc = attrs.ROTATION !== undefined ? resolveAccessor(json, binChunk, attrs.ROTATION) : null;\n const sAcc = attrs.SCALE !== undefined ? resolveAccessor(json, binChunk, attrs.SCALE) : null;\n\n let count = 0;\n for (const acc of [tAcc, rAcc, sAcc]) {\n if (!acc) {\n continue;\n }\n if (count === 0) {\n count = acc._count;\n } else if (acc._count !== count) {\n throw new Error(`EXT_mesh_gpu_instancing: accessor count mismatch on node ${nodeIdx}`);\n }\n }\n if (count === 0) {\n continue;\n }\n\n const matrices = buildInstanceMatrices(\n tAcc ? (tAcc._data as Float32Array) : null,\n rAcc ? (rAcc._data as Float32Array) : null,\n sAcc ? (sAcc._data as Float32Array) : null,\n count\n );\n const nodeWorld = ctx._worldMatrixCache.get(nodeIdx);\n for (const mesh of meshesForNode) {\n setThinInstances(mesh, matrices, count);\n expandMeshAabbForInstances(mesh, matrices, count, nodeWorld);\n }\n }\n return {};\n },\n};\nexport default ext;\n\n/** Expand a mesh's world-space AABB to enclose all thin instances so that\n * auto-framing cameras see the full instanced grid, not just the base mesh.\n * Uses the module-level `getLoaderTmpInstance()` scratch for the per-iteration\n * instance world matrix — no per-call allocation. */\nfunction expandMeshAabbForInstances(mesh: Mesh, matrices: Float32Array, count: number, nodeWorld: Mat4 | undefined): void {\n const positions = mesh._cpuPositions;\n if (!positions || !nodeWorld || count === 0) {\n return;\n }\n // Local AABB of the base mesh (before any per-instance / node transform).\n const [lmin, lmax] = computeAabb(positions);\n if (!isFinite(lmin[0]!)) {\n return;\n }\n // 8 corners of the local AABB, packed as 24 floats for computeAabb.\n const corners = new F32([\n lmin[0]!,\n lmin[1]!,\n lmin[2]!,\n lmax[0]!,\n lmin[1]!,\n lmin[2]!,\n lmin[0]!,\n lmax[1]!,\n lmin[2]!,\n lmax[0]!,\n lmax[1]!,\n lmin[2]!,\n lmin[0]!,\n lmin[1]!,\n lmax[2]!,\n lmax[0]!,\n lmin[1]!,\n lmax[2]!,\n lmin[0]!,\n lmax[1]!,\n lmax[2]!,\n lmax[0]!,\n lmax[1]!,\n lmax[2]!,\n ]);\n let wMinX = Infinity,\n wMinY = Infinity,\n wMinZ = Infinity;\n let wMaxX = -Infinity,\n wMaxY = -Infinity,\n wMaxZ = -Infinity;\n const instWorld = getLoaderTmpInstance();\n const instBuf = instWorld as unknown as Mat4Storage;\n for (let i = 0; i < count; i++) {\n for (let k = 0; k < 16; k++) {\n instBuf[k] = matrices[i * 16 + k]!;\n }\n const combined = mat4Multiply(nodeWorld, instWorld);\n const [imin, imax] = computeAabb(corners, combined);\n if (imin[0]! < wMinX) {\n wMinX = imin[0]!;\n }\n if (imin[1]! < wMinY) {\n wMinY = imin[1]!;\n }\n if (imin[2]! < wMinZ) {\n wMinZ = imin[2]!;\n }\n if (imax[0]! > wMaxX) {\n wMaxX = imax[0]!;\n }\n if (imax[1]! > wMaxY) {\n wMaxY = imax[1]!;\n }\n if (imax[2]! > wMaxZ) {\n wMaxZ = imax[2]!;\n }\n }\n mesh.boundMin = [wMinX, wMinY, wMinZ];\n mesh.boundMax = [wMaxX, wMaxY, wMaxZ];\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gltf-feature-gpu-instancing-QfJNFW1R.js","sources":["../src/loader-gltf/gltf-feature-gpu-instancing.ts"],"sourcesContent":["/** glTF EXT_mesh_gpu_instancing extension.\n *\n * Attaches hardware-instanced thin instances to every mesh that belongs to a\n * node carrying `extensions.EXT_mesh_gpu_instancing`. The extension provides\n * per-instance TRANSLATION / ROTATION / SCALE accessors (all optional); each\n * instance matrix is composed as T·R·S in the node's local frame. The node's\n * own TRS is applied through the regular parent-chain world matrix at render\n * time (`finalWorld = mesh.world * instanceWorld` in thin-instance-fragment),\n * so instance matrices must NOT pre-multiply the node transform.\n *\n * Dynamically imported by load-gltf only when the asset declares the\n * extension in `extensionsUsed`, so bundles pay zero bytes otherwise.\n *\n * Spec: https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Vendor/EXT_mesh_gpu_instancing/README.md\n */\n\nimport { F32 } from \"../engine/typed-arrays.js\";\nimport type { GltfFeature } from \"./gltf-feature.js\";\nimport type { Mesh } from \"../mesh/mesh.js\";\nimport { resolveAccessor } from \"./gltf-parser.js\";\nimport { computeAabb } from \"../math/compute-aabb.js\";\nimport { mat4ComposeInto } from \"../math/mat4-compose-into.js\";\nimport { mat4Multiply } from \"../math/mat4-multiply.js\";\nimport type { Mat4 } from \"../math/types.js\";\nimport type { Mat4Storage } from \"../math/types.js\";\nimport { setThinInstances } from \"../mesh/thin-instance.js\";\nimport { getLoaderTmpInstance } from \"./_loader-scratch.js\";\n\n/** Collect every Mesh child (direct children only — matches buildNodeHierarchy). */\nfunction collectMeshesUnderNode(tn: { children?: unknown[] } | undefined): Mesh[] {\n const out: Mesh[] = [];\n for (const c of tn?.children ?? []) {\n if (c && typeof c === \"object\" && \"material\" in (c as object)) {\n out.push(c as Mesh);\n }\n }\n return out;\n}\n\nfunction buildInstanceMatrices(translation: Float32Array | null, rotation: Float32Array | null, scale: Float32Array | null, count: number): Float32Array {\n const matrices = new F32(count * 16);\n for (let i = 0; i < count; i++) {\n const tx = translation ? translation[i * 3]! : 0;\n const ty = translation ? translation[i * 3 + 1]! : 0;\n const tz = translation ? translation[i * 3 + 2]! : 0;\n const qx = rotation ? rotation[i * 4]! : 0;\n const qy = rotation ? rotation[i * 4 + 1]! : 0;\n const qz = rotation ? rotation[i * 4 + 2]! : 0;\n const qw = rotation ? rotation[i * 4 + 3]! : 1;\n const sx = scale ? scale[i * 3]! : 1;\n const sy = scale ? scale[i * 3 + 1]! : 1;\n const sz = scale ? scale[i * 3 + 2]! : 1;\n mat4ComposeInto(matrices, i * 16, tx, ty, tz, qx, qy, qz, qw, sx, sy, sz);\n }\n return matrices;\n}\n\nconst ext: GltfFeature = {\n id: \"EXT_mesh_gpu_instancing\",\n async applyAsset(_meshes, _root, ctx) {\n const { _json: json, _binChunk: binChunk, _nodeMap: nodeMap } = ctx;\n if (!nodeMap) {\n return {};\n }\n const nodes = json.nodes ?? [];\n for (let nodeIdx = 0; nodeIdx < nodes.length; nodeIdx++) {\n const attrs = nodes[nodeIdx]?.extensions?.EXT_mesh_gpu_instancing?.attributes;\n if (!attrs) {\n continue;\n }\n const tn = nodeMap[nodeIdx];\n if (!tn) {\n continue;\n }\n const meshesForNode = collectMeshesUnderNode(tn as unknown as { children?: unknown[] });\n if (meshesForNode.length === 0) {\n continue;\n }\n\n const tAcc = attrs.TRANSLATION !== undefined ? resolveAccessor(json, binChunk, attrs.TRANSLATION) : null;\n const rAcc = attrs.ROTATION !== undefined ? resolveAccessor(json, binChunk, attrs.ROTATION) : null;\n const sAcc = attrs.SCALE !== undefined ? resolveAccessor(json, binChunk, attrs.SCALE) : null;\n\n let count = 0;\n for (const acc of [tAcc, rAcc, sAcc]) {\n if (!acc) {\n continue;\n }\n if (count === 0) {\n count = acc._count;\n } else if (acc._count !== count) {\n throw new Error(`EXT_mesh_gpu_instancing: accessor count mismatch on node ${nodeIdx}`);\n }\n }\n if (count === 0) {\n continue;\n }\n\n const matrices = buildInstanceMatrices(\n tAcc ? (tAcc._data as Float32Array) : null,\n rAcc ? (rAcc._data as Float32Array) : null,\n sAcc ? (sAcc._data as Float32Array) : null,\n count\n );\n const nodeWorld = ctx._worldMatrixCache.get(nodeIdx);\n for (const mesh of meshesForNode) {\n setThinInstances(mesh, matrices, count);\n expandMeshAabbForInstances(mesh, matrices, count, nodeWorld);\n }\n }\n return {};\n },\n};\nexport default ext;\n\n/** Expand a mesh's world-space AABB to enclose all thin instances so that\n * auto-framing cameras see the full instanced grid, not just the base mesh.\n * Uses the module-level `getLoaderTmpInstance()` scratch for the per-iteration\n * instance world matrix — no per-call allocation. */\nfunction expandMeshAabbForInstances(mesh: Mesh, matrices: Float32Array, count: number, nodeWorld: Mat4 | undefined): void {\n const positions = mesh._cpuPositions;\n if (!positions || !nodeWorld || count === 0) {\n return;\n }\n // Local AABB of the base mesh (before any per-instance / node transform).\n const [lmin, lmax] = computeAabb(positions);\n if (!isFinite(lmin[0]!)) {\n return;\n }\n // 8 corners of the local AABB, packed as 24 floats for computeAabb.\n const corners = new F32([\n lmin[0]!,\n lmin[1]!,\n lmin[2]!,\n lmax[0]!,\n lmin[1]!,\n lmin[2]!,\n lmin[0]!,\n lmax[1]!,\n lmin[2]!,\n lmax[0]!,\n lmax[1]!,\n lmin[2]!,\n lmin[0]!,\n lmin[1]!,\n lmax[2]!,\n lmax[0]!,\n lmin[1]!,\n lmax[2]!,\n lmin[0]!,\n lmax[1]!,\n lmax[2]!,\n lmax[0]!,\n lmax[1]!,\n lmax[2]!,\n ]);\n let wMinX = Infinity,\n wMinY = Infinity,\n wMinZ = Infinity;\n let wMaxX = -Infinity,\n wMaxY = -Infinity,\n wMaxZ = -Infinity;\n const instWorld = getLoaderTmpInstance();\n const instBuf = instWorld as unknown as Mat4Storage;\n for (let i = 0; i < count; i++) {\n for (let k = 0; k < 16; k++) {\n instBuf[k] = matrices[i * 16 + k]!;\n }\n const combined = mat4Multiply(nodeWorld, instWorld);\n const [imin, imax] = computeAabb(corners, combined);\n if (imin[0]! < wMinX) {\n wMinX = imin[0]!;\n }\n if (imin[1]! < wMinY) {\n wMinY = imin[1]!;\n }\n if (imin[2]! < wMinZ) {\n wMinZ = imin[2]!;\n }\n if (imax[0]! > wMaxX) {\n wMaxX = imax[0]!;\n }\n if (imax[1]! > wMaxY) {\n wMaxY = imax[1]!;\n }\n if (imax[2]! > wMaxZ) {\n wMaxZ = imax[2]!;\n }\n }\n mesh.boundMin = [wMinX, wMinY, wMinZ];\n mesh.boundMax = [wMaxX, wMaxY, wMaxZ];\n}\n"],"names":[],"mappings":";AA6BA,SAAS,uBAAuB,IAAkD;AAC9E,QAAM,MAAc,CAAA;AACpB,aAAW,MAAK,yBAAI,aAAY,CAAA,GAAI;AAChC,QAAI,KAAK,OAAO,MAAM,YAAY,cAAe,GAAc;AAC3D,UAAI,KAAK,CAAS;AAAA,IACtB;AAAA,EACJ;AACA,SAAO;AACX;AAEA,SAAS,sBAAsB,aAAkC,UAA+B,OAA4B,OAA6B;AACrJ,QAAM,WAAW,IAAI,IAAI,QAAQ,EAAE;AACnC,WAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC5B,UAAM,KAAK,cAAc,YAAY,IAAI,CAAC,IAAK;AAC/C,UAAM,KAAK,cAAc,YAAY,IAAI,IAAI,CAAC,IAAK;AACnD,UAAM,KAAK,cAAc,YAAY,IAAI,IAAI,CAAC,IAAK;AACnD,UAAM,KAAK,WAAW,SAAS,IAAI,CAAC,IAAK;AACzC,UAAM,KAAK,WAAW,SAAS,IAAI,IAAI,CAAC,IAAK;AAC7C,UAAM,KAAK,WAAW,SAAS,IAAI,IAAI,CAAC,IAAK;AAC7C,UAAM,KAAK,WAAW,SAAS,IAAI,IAAI,CAAC,IAAK;AAC7C,UAAM,KAAK,QAAQ,MAAM,IAAI,CAAC,IAAK;AACnC,UAAM,KAAK,QAAQ,MAAM,IAAI,IAAI,CAAC,IAAK;AACvC,UAAM,KAAK,QAAQ,MAAM,IAAI,IAAI,CAAC,IAAK;AACvC,oBAAgB,UAAU,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA,EAC5E;AACA,SAAO;AACX;AAEA,MAAM,MAAmB;AAAA,EACrB,IAAI;AAAA,EACJ,MAAM,WAAW,SAAS,OAAO,KAAK;;AAClC,UAAM,EAAE,OAAO,MAAM,WAAW,UAAU,UAAU,YAAY;AAChE,QAAI,CAAC,SAAS;AACV,aAAO,CAAA;AAAA,IACX;AACA,UAAM,QAAQ,KAAK,SAAS,CAAA;AAC5B,aAAS,UAAU,GAAG,UAAU,MAAM,QAAQ,WAAW;AACrD,YAAM,SAAQ,uBAAM,OAAO,MAAb,mBAAgB,eAAhB,mBAA4B,4BAA5B,mBAAqD;AACnE,UAAI,CAAC,OAAO;AACR;AAAA,MACJ;AACA,YAAM,KAAK,QAAQ,OAAO;AAC1B,UAAI,CAAC,IAAI;AACL;AAAA,MACJ;AACA,YAAM,gBAAgB,uBAAuB,EAAyC;AACtF,UAAI,cAAc,WAAW,GAAG;AAC5B;AAAA,MACJ;AAEA,YAAM,OAAO,MAAM,gBAAgB,SAAY,gBAAgB,MAAM,UAAU,MAAM,WAAW,IAAI;AACpG,YAAM,OAAO,MAAM,aAAa,SAAY,gBAAgB,MAAM,UAAU,MAAM,QAAQ,IAAI;AAC9F,YAAM,OAAO,MAAM,UAAU,SAAY,gBAAgB,MAAM,UAAU,MAAM,KAAK,IAAI;AAExF,UAAI,QAAQ;AACZ,iBAAW,OAAO,CAAC,MAAM,MAAM,IAAI,GAAG;AAClC,YAAI,CAAC,KAAK;AACN;AAAA,QACJ;AACA,YAAI,UAAU,GAAG;AACb,kBAAQ,IAAI;AAAA,QAChB,WAAW,IAAI,WAAW,OAAO;AAC7B,gBAAM,IAAI,MAAM,4DAA4D,OAAO,EAAE;AAAA,QACzF;AAAA,MACJ;AACA,UAAI,UAAU,GAAG;AACb;AAAA,MACJ;AAEA,YAAM,WAAW;AAAA,QACb,OAAQ,KAAK,QAAyB;AAAA,QACtC,OAAQ,KAAK,QAAyB;AAAA,QACtC,OAAQ,KAAK,QAAyB;AAAA,QACtC;AAAA,MAAA;AAEJ,YAAM,YAAY,IAAI,kBAAkB,IAAI,OAAO;AACnD,iBAAW,QAAQ,eAAe;AAC9B,yBAAiB,MAAM,UAAU,KAAK;AACtC,mCAA2B,MAAM,UAAU,OAAO,SAAS;AAAA,MAC/D;AAAA,IACJ;AACA,WAAO,CAAA;AAAA,EACX;AACJ;AAOA,SAAS,2BAA2B,MAAY,UAAwB,OAAe,WAAmC;AACtH,QAAM,YAAY,KAAK;AACvB,MAAI,CAAC,aAAa,CAAC,aAAa,UAAU,GAAG;AACzC;AAAA,EACJ;AAEA,QAAM,CAAC,MAAM,IAAI,IAAI,YAAY,SAAS;AAC1C,MAAI,CAAC,SAAS,KAAK,CAAC,CAAE,GAAG;AACrB;AAAA,EACJ;AAEA,QAAM,UAAU,IAAI,IAAI;AAAA,IACpB,KAAK,CAAC;AAAA,IACN,KAAK,CAAC;AAAA,IACN,KAAK,CAAC;AAAA,IACN,KAAK,CAAC;AAAA,IACN,KAAK,CAAC;AAAA,IACN,KAAK,CAAC;AAAA,IACN,KAAK,CAAC;AAAA,IACN,KAAK,CAAC;AAAA,IACN,KAAK,CAAC;AAAA,IACN,KAAK,CAAC;AAAA,IACN,KAAK,CAAC;AAAA,IACN,KAAK,CAAC;AAAA,IACN,KAAK,CAAC;AAAA,IACN,KAAK,CAAC;AAAA,IACN,KAAK,CAAC;AAAA,IACN,KAAK,CAAC;AAAA,IACN,KAAK,CAAC;AAAA,IACN,KAAK,CAAC;AAAA,IACN,KAAK,CAAC;AAAA,IACN,KAAK,CAAC;AAAA,IACN,KAAK,CAAC;AAAA,IACN,KAAK,CAAC;AAAA,IACN,KAAK,CAAC;AAAA,IACN,KAAK,CAAC;AAAA,EAAA,CACT;AACD,MAAI,QAAQ,UACR,QAAQ,UACR,QAAQ;AACZ,MAAI,QAAQ,WACR,QAAQ,WACR,QAAQ;AACZ,QAAM,YAAY,qBAAA;AAClB,QAAM,UAAU;AAChB,WAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC5B,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AACzB,cAAQ,CAAC,IAAI,SAAS,IAAI,KAAK,CAAC;AAAA,IACpC;AACA,UAAM,WAAW,aAAa,WAAW,SAAS;AAClD,UAAM,CAAC,MAAM,IAAI,IAAI,YAAY,SAAS,QAAQ;AAClD,QAAI,KAAK,CAAC,IAAK,OAAO;AAClB,cAAQ,KAAK,CAAC;AAAA,IAClB;AACA,QAAI,KAAK,CAAC,IAAK,OAAO;AAClB,cAAQ,KAAK,CAAC;AAAA,IAClB;AACA,QAAI,KAAK,CAAC,IAAK,OAAO;AAClB,cAAQ,KAAK,CAAC;AAAA,IAClB;AACA,QAAI,KAAK,CAAC,IAAK,OAAO;AAClB,cAAQ,KAAK,CAAC;AAAA,IAClB;AACA,QAAI,KAAK,CAAC,IAAK,OAAO;AAClB,cAAQ,KAAK,CAAC;AAAA,IAClB;AACA,QAAI,KAAK,CAAC,IAAK,OAAO;AAClB,cAAQ,KAAK,CAAC;AAAA,IAClB;AAAA,EACJ;AACA,OAAK,WAAW,CAAC,OAAO,OAAO,KAAK;AACpC,OAAK,WAAW,CAAC,OAAO,OAAO,KAAK;AACxC;"}
@@ -1,4 +1,4 @@
1
- import { M as MAX_LIGHTS, bc as setMaxLights, bd as computeNodeWorldMatrix } from "./index-BgY3QEzL.js";
1
+ import { M as MAX_LIGHTS, bs as setMaxLights, bt as computeNodeWorldMatrix } from "./index-C2sM8ERH.js";
2
2
  const feature = {
3
3
  id: "KHR_lights_punctual",
4
4
  async applyAsset(_meshes, _root, ctx) {
@@ -40,20 +40,20 @@ const feature = {
40
40
  const intensity = def.intensity ?? 1;
41
41
  const range = def.range !== void 0 ? def.range : Number.MAX_VALUE;
42
42
  if (def.type === "point") {
43
- const { createPointLight } = await import("./index-BgY3QEzL.js").then((n) => n.k4);
43
+ const { createPointLight } = await import("./index-C2sM8ERH.js").then((n) => n.kB);
44
44
  const pl = createPointLight([px, py, pz], intensity);
45
45
  pl.diffuse = color;
46
46
  pl.specular = color;
47
47
  pl.range = range;
48
48
  lights.push(pl);
49
49
  } else if (def.type === "directional") {
50
- const { createDirectionalLight } = await import("./index-BgY3QEzL.js").then((n) => n.k5);
50
+ const { createDirectionalLight } = await import("./index-C2sM8ERH.js").then((n) => n.kC);
51
51
  const dl = createDirectionalLight(dir, intensity);
52
52
  dl.diffuse = color;
53
53
  dl.specular = color;
54
54
  lights.push(dl);
55
55
  } else if (def.type === "spot") {
56
- const { createSpotLight } = await import("./index-BgY3QEzL.js").then((n) => n.k6);
56
+ const { createSpotLight } = await import("./index-C2sM8ERH.js").then((n) => n.kD);
57
57
  const outer = ((_i = def.spot) == null ? void 0 : _i.outerConeAngle) ?? Math.PI / 4;
58
58
  const sl = createSpotLight([px, py, pz], dir, outer * 2, 1, intensity);
59
59
  sl.diffuse = color;
@@ -68,4 +68,4 @@ const feature = {
68
68
  export {
69
69
  feature as default
70
70
  };
71
- //# sourceMappingURL=gltf-feature-lights-punctual-BCTwgyi_.js.map
71
+ //# sourceMappingURL=gltf-feature-lights-punctual-B3xbCshn.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gltf-feature-lights-punctual-BCTwgyi_.js","sources":["../src/loader-gltf/gltf-feature-lights-punctual.ts"],"sourcesContent":["/** KHR_lights_punctual glTF extension.\n * Parses point / directional / spot lights from the asset's top-level\n * KHR_lights_punctual.lights array and instantiates one Lite light per\n * referencing node, baking the node's world transform into the light's\n * position / direction. Lights are contributed via the AssetContainer's\n * `entities` array; addToScene() picks them up through the `lightType`\n * branch of its traversal. */\n\nimport type { GltfFeature } from \"./gltf-feature.js\";\nimport type { LightBase } from \"../light/types.js\";\nimport { MAX_LIGHTS, setMaxLights } from \"../light/types.js\";\nimport { computeNodeWorldMatrix } from \"./gltf-parser.js\";\n\ninterface GltfLightDef {\n type: \"point\" | \"directional\" | \"spot\";\n color?: [number, number, number];\n intensity?: number;\n range?: number;\n spot?: { innerConeAngle?: number; outerConeAngle?: number };\n}\n\nconst feature: GltfFeature = {\n id: \"KHR_lights_punctual\",\n async applyAsset(_meshes, _root, ctx) {\n const defs: GltfLightDef[] | undefined = ctx._json.extensions?.KHR_lights_punctual?.lights;\n if (!defs?.length) {\n return {};\n }\n const lights: LightBase[] = [];\n const nodes = ctx._json.nodes ?? [];\n // Count lights first so we can raise MAX_LIGHTS before any pipeline is\n // compiled (loadGltf runs before addToScene which triggers pipeline\n // creation). Lite's MAX_LIGHTS is scene-wide, so cover every punctual\n // light declared by the asset rather than Babylon's per-material cap.\n let lightNodeCount = 0;\n for (let i = 0; i < nodes.length; i++) {\n if (nodes[i]?.extensions?.KHR_lights_punctual?.light !== undefined) {\n lightNodeCount++;\n }\n }\n if (lightNodeCount > MAX_LIGHTS) {\n setMaxLights(lightNodeCount);\n }\n for (let nodeIdx = 0; nodeIdx < nodes.length; nodeIdx++) {\n const lightIdx: number | undefined = nodes[nodeIdx]?.extensions?.KHR_lights_punctual?.light;\n if (lightIdx === undefined) {\n continue;\n }\n const def = defs[lightIdx];\n if (!def) {\n continue;\n }\n const world = computeNodeWorldMatrix(ctx._json, nodeIdx, ctx._parentMap, ctx._worldMatrixCache);\n const px = world[12]!;\n const py = world[13]!;\n const pz = world[14]!;\n // glTF convention: light forward is -Z in local space. Extract world-space forward\n // by transforming (0,0,-1) through the node's upper-3x3. Normalize defensively.\n const fx = -world[8]!;\n const fy = -world[9]!;\n const fz = -world[10]!;\n const flen = Math.hypot(fx, fy, fz) || 1;\n const dir: [number, number, number] = [fx / flen, fy / flen, fz / flen];\n const color: [number, number, number] = def.color ? [def.color[0]!, def.color[1]!, def.color[2]!] : [1, 1, 1];\n const intensity = def.intensity ?? 1;\n const range = def.range !== undefined ? def.range : Number.MAX_VALUE;\n\n if (def.type === \"point\") {\n const { createPointLight } = await import(\"../light/point-light.js\");\n const pl = createPointLight([px, py, pz], intensity);\n pl.diffuse = color;\n pl.specular = color;\n pl.range = range;\n lights.push(pl);\n } else if (def.type === \"directional\") {\n const { createDirectionalLight } = await import(\"../light/directional-light.js\");\n const dl = createDirectionalLight(dir, intensity);\n dl.diffuse = color;\n dl.specular = color;\n lights.push(dl);\n } else if (def.type === \"spot\") {\n const { createSpotLight } = await import(\"../light/spot-light.js\");\n const outer = def.spot?.outerConeAngle ?? Math.PI / 4;\n const sl = createSpotLight([px, py, pz], dir, outer * 2, 1, intensity);\n sl.diffuse = color;\n sl.specular = color;\n sl.range = range;\n lights.push(sl);\n }\n }\n return { entities: lights };\n },\n};\nexport default feature;\n"],"names":[],"mappings":";AAqBA,MAAM,UAAuB;AAAA,EACzB,IAAI;AAAA,EACJ,MAAM,WAAW,SAAS,OAAO,KAAK;;AAClC,UAAM,QAAmC,eAAI,MAAM,eAAV,mBAAsB,wBAAtB,mBAA2C;AACpF,QAAI,EAAC,6BAAM,SAAQ;AACf,aAAO,CAAA;AAAA,IACX;AACA,UAAM,SAAsB,CAAA;AAC5B,UAAM,QAAQ,IAAI,MAAM,SAAS,CAAA;AAKjC,QAAI,iBAAiB;AACrB,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACnC,YAAI,uBAAM,CAAC,MAAP,mBAAU,eAAV,mBAAsB,wBAAtB,mBAA2C,WAAU,QAAW;AAChE;AAAA,MACJ;AAAA,IACJ;AACA,QAAI,iBAAiB,YAAY;AAC7B,mBAAa,cAAc;AAAA,IAC/B;AACA,aAAS,UAAU,GAAG,UAAU,MAAM,QAAQ,WAAW;AACrD,YAAM,YAA+B,uBAAM,OAAO,MAAb,mBAAgB,eAAhB,mBAA4B,wBAA5B,mBAAiD;AACtF,UAAI,aAAa,QAAW;AACxB;AAAA,MACJ;AACA,YAAM,MAAM,KAAK,QAAQ;AACzB,UAAI,CAAC,KAAK;AACN;AAAA,MACJ;AACA,YAAM,QAAQ,uBAAuB,IAAI,OAAO,SAAS,IAAI,YAAY,IAAI,iBAAiB;AAC9F,YAAM,KAAK,MAAM,EAAE;AACnB,YAAM,KAAK,MAAM,EAAE;AACnB,YAAM,KAAK,MAAM,EAAE;AAGnB,YAAM,KAAK,CAAC,MAAM,CAAC;AACnB,YAAM,KAAK,CAAC,MAAM,CAAC;AACnB,YAAM,KAAK,CAAC,MAAM,EAAE;AACpB,YAAM,OAAO,KAAK,MAAM,IAAI,IAAI,EAAE,KAAK;AACvC,YAAM,MAAgC,CAAC,KAAK,MAAM,KAAK,MAAM,KAAK,IAAI;AACtE,YAAM,QAAkC,IAAI,QAAQ,CAAC,IAAI,MAAM,CAAC,GAAI,IAAI,MAAM,CAAC,GAAI,IAAI,MAAM,CAAC,CAAE,IAAI,CAAC,GAAG,GAAG,CAAC;AAC5G,YAAM,YAAY,IAAI,aAAa;AACnC,YAAM,QAAQ,IAAI,UAAU,SAAY,IAAI,QAAQ,OAAO;AAE3D,UAAI,IAAI,SAAS,SAAS;AACtB,cAAM,EAAE,iBAAA,IAAqB,MAAM,OAAO,qBAAyB,EAAA,KAAA,OAAA,EAAA,EAAA;AACnE,cAAM,KAAK,iBAAiB,CAAC,IAAI,IAAI,EAAE,GAAG,SAAS;AACnD,WAAG,UAAU;AACb,WAAG,WAAW;AACd,WAAG,QAAQ;AACX,eAAO,KAAK,EAAE;AAAA,MAClB,WAAW,IAAI,SAAS,eAAe;AACnC,cAAM,EAAE,uBAAA,IAA2B,MAAM,OAAO,qBAA+B,EAAA,KAAA,OAAA,EAAA,EAAA;AAC/E,cAAM,KAAK,uBAAuB,KAAK,SAAS;AAChD,WAAG,UAAU;AACb,WAAG,WAAW;AACd,eAAO,KAAK,EAAE;AAAA,MAClB,WAAW,IAAI,SAAS,QAAQ;AAC5B,cAAM,EAAE,gBAAA,IAAoB,MAAM,OAAO,qBAAwB,EAAA,KAAA,OAAA,EAAA,EAAA;AACjE,cAAM,UAAQ,SAAI,SAAJ,mBAAU,mBAAkB,KAAK,KAAK;AACpD,cAAM,KAAK,gBAAgB,CAAC,IAAI,IAAI,EAAE,GAAG,KAAK,QAAQ,GAAG,GAAG,SAAS;AACrE,WAAG,UAAU;AACb,WAAG,WAAW;AACd,WAAG,QAAQ;AACX,eAAO,KAAK,EAAE;AAAA,MAClB;AAAA,IACJ;AACA,WAAO,EAAE,UAAU,OAAA;AAAA,EACvB;AACJ;"}
1
+ {"version":3,"file":"gltf-feature-lights-punctual-B3xbCshn.js","sources":["../src/loader-gltf/gltf-feature-lights-punctual.ts"],"sourcesContent":["/** KHR_lights_punctual glTF extension.\n * Parses point / directional / spot lights from the asset's top-level\n * KHR_lights_punctual.lights array and instantiates one Lite light per\n * referencing node, baking the node's world transform into the light's\n * position / direction. Lights are contributed via the AssetContainer's\n * `entities` array; addToScene() picks them up through the `lightType`\n * branch of its traversal. */\n\nimport type { GltfFeature } from \"./gltf-feature.js\";\nimport type { LightBase } from \"../light/types.js\";\nimport { MAX_LIGHTS, setMaxLights } from \"../light/types.js\";\nimport { computeNodeWorldMatrix } from \"./gltf-parser.js\";\n\ninterface GltfLightDef {\n type: \"point\" | \"directional\" | \"spot\";\n color?: [number, number, number];\n intensity?: number;\n range?: number;\n spot?: { innerConeAngle?: number; outerConeAngle?: number };\n}\n\nconst feature: GltfFeature = {\n id: \"KHR_lights_punctual\",\n async applyAsset(_meshes, _root, ctx) {\n const defs: GltfLightDef[] | undefined = ctx._json.extensions?.KHR_lights_punctual?.lights;\n if (!defs?.length) {\n return {};\n }\n const lights: LightBase[] = [];\n const nodes = ctx._json.nodes ?? [];\n // Count lights first so we can raise MAX_LIGHTS before any pipeline is\n // compiled (loadGltf runs before addToScene which triggers pipeline\n // creation). Lite's MAX_LIGHTS is scene-wide, so cover every punctual\n // light declared by the asset rather than Babylon's per-material cap.\n let lightNodeCount = 0;\n for (let i = 0; i < nodes.length; i++) {\n if (nodes[i]?.extensions?.KHR_lights_punctual?.light !== undefined) {\n lightNodeCount++;\n }\n }\n if (lightNodeCount > MAX_LIGHTS) {\n setMaxLights(lightNodeCount);\n }\n for (let nodeIdx = 0; nodeIdx < nodes.length; nodeIdx++) {\n const lightIdx: number | undefined = nodes[nodeIdx]?.extensions?.KHR_lights_punctual?.light;\n if (lightIdx === undefined) {\n continue;\n }\n const def = defs[lightIdx];\n if (!def) {\n continue;\n }\n const world = computeNodeWorldMatrix(ctx._json, nodeIdx, ctx._parentMap, ctx._worldMatrixCache);\n const px = world[12]!;\n const py = world[13]!;\n const pz = world[14]!;\n // glTF convention: light forward is -Z in local space. Extract world-space forward\n // by transforming (0,0,-1) through the node's upper-3x3. Normalize defensively.\n const fx = -world[8]!;\n const fy = -world[9]!;\n const fz = -world[10]!;\n const flen = Math.hypot(fx, fy, fz) || 1;\n const dir: [number, number, number] = [fx / flen, fy / flen, fz / flen];\n const color: [number, number, number] = def.color ? [def.color[0]!, def.color[1]!, def.color[2]!] : [1, 1, 1];\n const intensity = def.intensity ?? 1;\n const range = def.range !== undefined ? def.range : Number.MAX_VALUE;\n\n if (def.type === \"point\") {\n const { createPointLight } = await import(\"../light/point-light.js\");\n const pl = createPointLight([px, py, pz], intensity);\n pl.diffuse = color;\n pl.specular = color;\n pl.range = range;\n lights.push(pl);\n } else if (def.type === \"directional\") {\n const { createDirectionalLight } = await import(\"../light/directional-light.js\");\n const dl = createDirectionalLight(dir, intensity);\n dl.diffuse = color;\n dl.specular = color;\n lights.push(dl);\n } else if (def.type === \"spot\") {\n const { createSpotLight } = await import(\"../light/spot-light.js\");\n const outer = def.spot?.outerConeAngle ?? Math.PI / 4;\n const sl = createSpotLight([px, py, pz], dir, outer * 2, 1, intensity);\n sl.diffuse = color;\n sl.specular = color;\n sl.range = range;\n lights.push(sl);\n }\n }\n return { entities: lights };\n },\n};\nexport default feature;\n"],"names":[],"mappings":";AAqBA,MAAM,UAAuB;AAAA,EACzB,IAAI;AAAA,EACJ,MAAM,WAAW,SAAS,OAAO,KAAK;;AAClC,UAAM,QAAmC,eAAI,MAAM,eAAV,mBAAsB,wBAAtB,mBAA2C;AACpF,QAAI,EAAC,6BAAM,SAAQ;AACf,aAAO,CAAA;AAAA,IACX;AACA,UAAM,SAAsB,CAAA;AAC5B,UAAM,QAAQ,IAAI,MAAM,SAAS,CAAA;AAKjC,QAAI,iBAAiB;AACrB,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACnC,YAAI,uBAAM,CAAC,MAAP,mBAAU,eAAV,mBAAsB,wBAAtB,mBAA2C,WAAU,QAAW;AAChE;AAAA,MACJ;AAAA,IACJ;AACA,QAAI,iBAAiB,YAAY;AAC7B,mBAAa,cAAc;AAAA,IAC/B;AACA,aAAS,UAAU,GAAG,UAAU,MAAM,QAAQ,WAAW;AACrD,YAAM,YAA+B,uBAAM,OAAO,MAAb,mBAAgB,eAAhB,mBAA4B,wBAA5B,mBAAiD;AACtF,UAAI,aAAa,QAAW;AACxB;AAAA,MACJ;AACA,YAAM,MAAM,KAAK,QAAQ;AACzB,UAAI,CAAC,KAAK;AACN;AAAA,MACJ;AACA,YAAM,QAAQ,uBAAuB,IAAI,OAAO,SAAS,IAAI,YAAY,IAAI,iBAAiB;AAC9F,YAAM,KAAK,MAAM,EAAE;AACnB,YAAM,KAAK,MAAM,EAAE;AACnB,YAAM,KAAK,MAAM,EAAE;AAGnB,YAAM,KAAK,CAAC,MAAM,CAAC;AACnB,YAAM,KAAK,CAAC,MAAM,CAAC;AACnB,YAAM,KAAK,CAAC,MAAM,EAAE;AACpB,YAAM,OAAO,KAAK,MAAM,IAAI,IAAI,EAAE,KAAK;AACvC,YAAM,MAAgC,CAAC,KAAK,MAAM,KAAK,MAAM,KAAK,IAAI;AACtE,YAAM,QAAkC,IAAI,QAAQ,CAAC,IAAI,MAAM,CAAC,GAAI,IAAI,MAAM,CAAC,GAAI,IAAI,MAAM,CAAC,CAAE,IAAI,CAAC,GAAG,GAAG,CAAC;AAC5G,YAAM,YAAY,IAAI,aAAa;AACnC,YAAM,QAAQ,IAAI,UAAU,SAAY,IAAI,QAAQ,OAAO;AAE3D,UAAI,IAAI,SAAS,SAAS;AACtB,cAAM,EAAE,iBAAA,IAAqB,MAAM,OAAO,qBAAyB,EAAA,KAAA,OAAA,EAAA,EAAA;AACnE,cAAM,KAAK,iBAAiB,CAAC,IAAI,IAAI,EAAE,GAAG,SAAS;AACnD,WAAG,UAAU;AACb,WAAG,WAAW;AACd,WAAG,QAAQ;AACX,eAAO,KAAK,EAAE;AAAA,MAClB,WAAW,IAAI,SAAS,eAAe;AACnC,cAAM,EAAE,uBAAA,IAA2B,MAAM,OAAO,qBAA+B,EAAA,KAAA,OAAA,EAAA,EAAA;AAC/E,cAAM,KAAK,uBAAuB,KAAK,SAAS;AAChD,WAAG,UAAU;AACb,WAAG,WAAW;AACd,eAAO,KAAK,EAAE;AAAA,MAClB,WAAW,IAAI,SAAS,QAAQ;AAC5B,cAAM,EAAE,gBAAA,IAAoB,MAAM,OAAO,qBAAwB,EAAA,KAAA,OAAA,EAAA,EAAA;AACjE,cAAM,UAAQ,SAAI,SAAJ,mBAAU,mBAAkB,KAAK,KAAK;AACpD,cAAM,KAAK,gBAAgB,CAAC,IAAI,IAAI,EAAE,GAAG,KAAK,QAAQ,GAAG,GAAG,SAAS;AACrE,WAAG,UAAU;AACb,WAAG,WAAW;AACd,WAAG,QAAQ;AACX,eAAO,KAAK,EAAE;AAAA,MAClB;AAAA,IACJ;AACA,WAAO,EAAE,UAAU,OAAA;AAAA,EACvB;AACJ;"}
@@ -1,36 +1,4 @@
1
- import { e as U8, D as DV } from "./index-BgY3QEzL.js";
2
- let meshoptBaseUrl = "/";
3
- let scriptLoadPromise = null;
4
- function loadMeshoptScript() {
5
- if (scriptLoadPromise) {
6
- return scriptLoadPromise;
7
- }
8
- scriptLoadPromise = new Promise((resolve, reject) => {
9
- const existing = globalThis.MeshoptDecoder;
10
- if (existing) {
11
- resolve(existing);
12
- return;
13
- }
14
- const script = document.createElement("script");
15
- script.src = meshoptBaseUrl + "meshopt_decoder.js";
16
- script.onload = () => {
17
- const mod = globalThis.MeshoptDecoder;
18
- if (!mod) {
19
- reject(new Error("meshopt_decoder.js loaded but MeshoptDecoder is undefined"));
20
- } else {
21
- resolve(mod);
22
- }
23
- };
24
- script.onerror = () => reject(new Error("Failed to load meshopt_decoder.js from " + script.src));
25
- document.head.appendChild(script);
26
- });
27
- return scriptLoadPromise;
28
- }
29
- async function getMeshoptDecoder() {
30
- const mod = await loadMeshoptScript();
31
- await mod.ready;
32
- return mod;
33
- }
1
+ import { bm as getMeshoptDecoder, e as U8, D as DV } from "./index-C2sM8ERH.js";
34
2
  function align4(n) {
35
3
  return n + 3 & -4;
36
4
  }
@@ -82,4 +50,4 @@ const feature = {
82
50
  export {
83
51
  feature as default
84
52
  };
85
- //# sourceMappingURL=gltf-feature-meshopt-DItMkOMt.js.map
53
+ //# sourceMappingURL=gltf-feature-meshopt-DBvtC2n2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gltf-feature-meshopt-DBvtC2n2.js","sources":["../src/loader-gltf/gltf-feature-meshopt.ts"],"sourcesContent":["/**\n * EXT_meshopt_compression feature.\n *\n * Runs as a `preParse` hook — before any accessor is read — so the core loader\n * and accessor reader stay unaware of meshopt. This module is only\n * dynamic-imported when the asset's `extensionsUsed` lists\n * EXT_meshopt_compression, which in turn loads the meshoptimizer decoder\n * (`meshopt-decode.ts`) lazily.\n *\n * EXT_meshopt_compression is a bufferView-level codec: each compressed\n * bufferView carries an extension object describing the compressed source\n * (`buffer`/`byteOffset`/`byteLength`), the decoded layout (`count`/`byteStride`)\n * and the codec (`mode`/`filter`). We decode every compressed bufferView, copy\n * through every uncompressed one, and pack the results into a single contiguous\n * binary chunk, rewriting `bufferViews` to point into it. Accessor byteOffsets\n * are bufferView-relative and the per-bufferView layout (count * byteStride) is\n * preserved, so the existing accessor reader resolves the decoded data\n * transparently.\n */\n\nimport { U8, DV } from \"../engine/typed-arrays.js\";\nimport type { GltfFeature } from \"./gltf-feature.js\";\nimport { getMeshoptDecoder } from \"./meshopt-decode.js\";\n\ninterface MeshoptExt {\n buffer: number;\n byteOffset?: number;\n byteLength: number;\n byteStride: number;\n count: number;\n mode: string;\n filter?: string;\n}\n\ninterface BufferView {\n buffer?: number;\n byteOffset?: number;\n byteLength: number;\n byteStride?: number;\n extensions?: { EXT_meshopt_compression?: MeshoptExt; [k: string]: unknown };\n}\n\n/** Round up to the next 4-byte boundary so relocated bufferViews stay aligned\n * for Float32Array / Uint16Array / Uint32Array views over the packed buffer. */\nfunction align4(n: number): number {\n return (n + 3) & ~3;\n}\n\nconst feature: GltfFeature = {\n id: \"EXT_meshopt_compression\",\n async preParse(json, binChunk) {\n const bufferViews: BufferView[] = json.bufferViews ?? [];\n const decoder = await getMeshoptDecoder();\n\n // Pass 1: materialize each bufferView (decode meshopt ones, copy the rest)\n // and compute the packed-buffer offset for each.\n const materialized: Uint8Array[] = new Array(bufferViews.length);\n const newOffsets: number[] = new Array(bufferViews.length);\n let total = 0;\n for (let i = 0; i < bufferViews.length; i++) {\n const bv = bufferViews[i]!;\n const ext = bv.extensions?.EXT_meshopt_compression;\n let bytes: Uint8Array;\n if (ext) {\n if ((ext.buffer ?? 0) !== 0) {\n throw new Error(`EXT_meshopt_compression: compressed source buffer ${ext.buffer} is not buffer 0 (unsupported)`);\n }\n const source = new U8(binChunk.buffer, binChunk.byteOffset + (ext.byteOffset ?? 0), ext.byteLength);\n const target = new U8(ext.count * ext.byteStride);\n decoder.decodeGltfBuffer(target, ext.count, ext.byteStride, source, ext.mode, ext.filter ?? \"NONE\");\n bytes = target;\n } else {\n if ((bv.buffer ?? 0) !== 0) {\n throw new Error(`EXT_meshopt_compression: uncompressed bufferView in buffer ${bv.buffer} is not buffer 0 (unsupported)`);\n }\n bytes = new U8(binChunk.buffer.slice(binChunk.byteOffset + (bv.byteOffset ?? 0), binChunk.byteOffset + (bv.byteOffset ?? 0) + bv.byteLength));\n }\n materialized[i] = bytes;\n newOffsets[i] = total;\n total = align4(total + bytes.length);\n }\n\n // Pass 2: pack into a single contiguous buffer and rewrite bufferViews.\n const packed = new U8(total);\n for (let i = 0; i < bufferViews.length; i++) {\n const bv = bufferViews[i]!;\n packed.set(materialized[i]!, newOffsets[i]!);\n bv.buffer = 0;\n bv.byteOffset = newOffsets[i]!;\n bv.byteLength = materialized[i]!.length;\n if (bv.extensions) {\n delete bv.extensions.EXT_meshopt_compression;\n }\n }\n\n return new DV(packed.buffer);\n },\n};\n\nexport default feature;\n"],"names":[],"mappings":";AA4CA,SAAS,OAAO,GAAmB;AAC/B,SAAQ,IAAI,IAAK;AACrB;AAEA,MAAM,UAAuB;AAAA,EACzB,IAAI;AAAA,EACJ,MAAM,SAAS,MAAM,UAAU;;AAC3B,UAAM,cAA4B,KAAK,eAAe,CAAA;AACtD,UAAM,UAAU,MAAM,kBAAA;AAItB,UAAM,eAA6B,IAAI,MAAM,YAAY,MAAM;AAC/D,UAAM,aAAuB,IAAI,MAAM,YAAY,MAAM;AACzD,QAAI,QAAQ;AACZ,aAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AACzC,YAAM,KAAK,YAAY,CAAC;AACxB,YAAM,OAAM,QAAG,eAAH,mBAAe;AAC3B,UAAI;AACJ,UAAI,KAAK;AACL,aAAK,IAAI,UAAU,OAAO,GAAG;AACzB,gBAAM,IAAI,MAAM,qDAAqD,IAAI,MAAM,gCAAgC;AAAA,QACnH;AACA,cAAM,SAAS,IAAI,GAAG,SAAS,QAAQ,SAAS,cAAc,IAAI,cAAc,IAAI,IAAI,UAAU;AAClG,cAAM,SAAS,IAAI,GAAG,IAAI,QAAQ,IAAI,UAAU;AAChD,gBAAQ,iBAAiB,QAAQ,IAAI,OAAO,IAAI,YAAY,QAAQ,IAAI,MAAM,IAAI,UAAU,MAAM;AAClG,gBAAQ;AAAA,MACZ,OAAO;AACH,aAAK,GAAG,UAAU,OAAO,GAAG;AACxB,gBAAM,IAAI,MAAM,8DAA8D,GAAG,MAAM,gCAAgC;AAAA,QAC3H;AACA,gBAAQ,IAAI,GAAG,SAAS,OAAO,MAAM,SAAS,cAAc,GAAG,cAAc,IAAI,SAAS,cAAc,GAAG,cAAc,KAAK,GAAG,UAAU,CAAC;AAAA,MAChJ;AACA,mBAAa,CAAC,IAAI;AAClB,iBAAW,CAAC,IAAI;AAChB,cAAQ,OAAO,QAAQ,MAAM,MAAM;AAAA,IACvC;AAGA,UAAM,SAAS,IAAI,GAAG,KAAK;AAC3B,aAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AACzC,YAAM,KAAK,YAAY,CAAC;AACxB,aAAO,IAAI,aAAa,CAAC,GAAI,WAAW,CAAC,CAAE;AAC3C,SAAG,SAAS;AACZ,SAAG,aAAa,WAAW,CAAC;AAC5B,SAAG,aAAa,aAAa,CAAC,EAAG;AACjC,UAAI,GAAG,YAAY;AACf,eAAO,GAAG,WAAW;AAAA,MACzB;AAAA,IACJ;AAEA,WAAO,IAAI,GAAG,OAAO,MAAM;AAAA,EAC/B;AACJ;"}
@@ -1,4 +1,4 @@
1
- import { r as resolveAccessor, a as F32 } from "./index-BgY3QEzL.js";
1
+ import { r as resolveAccessor, a as F32 } from "./index-C2sM8ERH.js";
2
2
  const feature = {
3
3
  id: "_morph",
4
4
  async applyMesh(meshData, mesh, ctx) {
@@ -19,11 +19,11 @@ const feature = {
19
19
  }
20
20
  const parentMesh = json.meshes[json.nodes[meshData._nodeIndex].mesh];
21
21
  const morphWeights = parentMesh.weights ?? new Array(targets.length).fill(0);
22
- const { createMorphTargets } = await import("./index-BgY3QEzL.js").then((n) => n.k8);
22
+ const { createMorphTargets } = await import("./index-C2sM8ERH.js").then((n) => n.kF);
23
23
  mesh.morphTargets = createMorphTargets(ctx._engine, morphTargets, meshData._vertexCount, morphWeights);
24
24
  }
25
25
  };
26
26
  export {
27
27
  feature as default
28
28
  };
29
- //# sourceMappingURL=gltf-feature-morph-Cv0mEYIq.js.map
29
+ //# sourceMappingURL=gltf-feature-morph-DE63vfIE.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gltf-feature-morph-Cv0mEYIq.js","sources":["../src/loader-gltf/gltf-feature-morph.ts"],"sourcesContent":["/** Morph target feature. Extracts per-primitive morph targets lazily so the\n * core loader doesn't carry any morph-related code for non-morphed assets. */\n\nimport { F32 } from \"../engine/typed-arrays.js\";\nimport type { GltfFeature } from \"./gltf-feature.js\";\nimport { resolveAccessor } from \"./gltf-parser.js\";\n\nconst feature: GltfFeature = {\n id: \"_morph\",\n async applyMesh(meshData, mesh, ctx) {\n const primitive = meshData._primitive;\n const targets = primitive.targets;\n if (!targets || targets.length === 0) {\n return;\n }\n const { _json: json, _binChunk: binChunk } = ctx;\n const morphTargets: { positions: Float32Array; normals: Float32Array | null }[] = [];\n for (const target of targets) {\n const posAcc = target.POSITION !== undefined ? resolveAccessor(json, binChunk, target.POSITION) : null;\n const normAcc = target.NORMAL !== undefined ? resolveAccessor(json, binChunk, target.NORMAL) : null;\n morphTargets.push({\n positions: posAcc ? (posAcc._data as Float32Array) : new F32(meshData._vertexCount * 3),\n normals: normAcc ? (normAcc._data as Float32Array) : null,\n });\n }\n const parentMesh = json.meshes[json.nodes[meshData._nodeIndex].mesh];\n const morphWeights = parentMesh.weights ?? new Array(targets.length).fill(0);\n const { createMorphTargets } = await import(\"../morph/create-morph-targets.js\");\n mesh.morphTargets = createMorphTargets(ctx._engine, morphTargets, meshData._vertexCount, morphWeights);\n },\n};\nexport default feature;\n"],"names":[],"mappings":";AAOA,MAAM,UAAuB;AAAA,EACzB,IAAI;AAAA,EACJ,MAAM,UAAU,UAAU,MAAM,KAAK;AACjC,UAAM,YAAY,SAAS;AAC3B,UAAM,UAAU,UAAU;AAC1B,QAAI,CAAC,WAAW,QAAQ,WAAW,GAAG;AAClC;AAAA,IACJ;AACA,UAAM,EAAE,OAAO,MAAM,WAAW,aAAa;AAC7C,UAAM,eAA4E,CAAA;AAClF,eAAW,UAAU,SAAS;AAC1B,YAAM,SAAS,OAAO,aAAa,SAAY,gBAAgB,MAAM,UAAU,OAAO,QAAQ,IAAI;AAClG,YAAM,UAAU,OAAO,WAAW,SAAY,gBAAgB,MAAM,UAAU,OAAO,MAAM,IAAI;AAC/F,mBAAa,KAAK;AAAA,QACd,WAAW,SAAU,OAAO,QAAyB,IAAI,IAAI,SAAS,eAAe,CAAC;AAAA,QACtF,SAAS,UAAW,QAAQ,QAAyB;AAAA,MAAA,CACxD;AAAA,IACL;AACA,UAAM,aAAa,KAAK,OAAO,KAAK,MAAM,SAAS,UAAU,EAAE,IAAI;AACnE,UAAM,eAAe,WAAW,WAAW,IAAI,MAAM,QAAQ,MAAM,EAAE,KAAK,CAAC;AAC3E,UAAM,EAAE,mBAAA,IAAuB,MAAM,OAAO,qBAAkC,EAAA,KAAA,OAAA,EAAA,EAAA;AAC9E,SAAK,eAAe,mBAAmB,IAAI,SAAS,cAAc,SAAS,cAAc,YAAY;AAAA,EACzG;AACJ;"}
1
+ {"version":3,"file":"gltf-feature-morph-DE63vfIE.js","sources":["../src/loader-gltf/gltf-feature-morph.ts"],"sourcesContent":["/** Morph target feature. Extracts per-primitive morph targets lazily so the\n * core loader doesn't carry any morph-related code for non-morphed assets. */\n\nimport { F32 } from \"../engine/typed-arrays.js\";\nimport type { GltfFeature } from \"./gltf-feature.js\";\nimport { resolveAccessor } from \"./gltf-parser.js\";\n\nconst feature: GltfFeature = {\n id: \"_morph\",\n async applyMesh(meshData, mesh, ctx) {\n const primitive = meshData._primitive;\n const targets = primitive.targets;\n if (!targets || targets.length === 0) {\n return;\n }\n const { _json: json, _binChunk: binChunk } = ctx;\n const morphTargets: { positions: Float32Array; normals: Float32Array | null }[] = [];\n for (const target of targets) {\n const posAcc = target.POSITION !== undefined ? resolveAccessor(json, binChunk, target.POSITION) : null;\n const normAcc = target.NORMAL !== undefined ? resolveAccessor(json, binChunk, target.NORMAL) : null;\n morphTargets.push({\n positions: posAcc ? (posAcc._data as Float32Array) : new F32(meshData._vertexCount * 3),\n normals: normAcc ? (normAcc._data as Float32Array) : null,\n });\n }\n const parentMesh = json.meshes[json.nodes[meshData._nodeIndex].mesh];\n const morphWeights = parentMesh.weights ?? new Array(targets.length).fill(0);\n const { createMorphTargets } = await import(\"../morph/create-morph-targets.js\");\n mesh.morphTargets = createMorphTargets(ctx._engine, morphTargets, meshData._vertexCount, morphWeights);\n },\n};\nexport default feature;\n"],"names":[],"mappings":";AAOA,MAAM,UAAuB;AAAA,EACzB,IAAI;AAAA,EACJ,MAAM,UAAU,UAAU,MAAM,KAAK;AACjC,UAAM,YAAY,SAAS;AAC3B,UAAM,UAAU,UAAU;AAC1B,QAAI,CAAC,WAAW,QAAQ,WAAW,GAAG;AAClC;AAAA,IACJ;AACA,UAAM,EAAE,OAAO,MAAM,WAAW,aAAa;AAC7C,UAAM,eAA4E,CAAA;AAClF,eAAW,UAAU,SAAS;AAC1B,YAAM,SAAS,OAAO,aAAa,SAAY,gBAAgB,MAAM,UAAU,OAAO,QAAQ,IAAI;AAClG,YAAM,UAAU,OAAO,WAAW,SAAY,gBAAgB,MAAM,UAAU,OAAO,MAAM,IAAI;AAC/F,mBAAa,KAAK;AAAA,QACd,WAAW,SAAU,OAAO,QAAyB,IAAI,IAAI,SAAS,eAAe,CAAC;AAAA,QACtF,SAAS,UAAW,QAAQ,QAAyB;AAAA,MAAA,CACxD;AAAA,IACL;AACA,UAAM,aAAa,KAAK,OAAO,KAAK,MAAM,SAAS,UAAU,EAAE,IAAI;AACnE,UAAM,eAAe,WAAW,WAAW,IAAI,MAAM,QAAQ,MAAM,EAAE,KAAK,CAAC;AAC3E,UAAM,EAAE,mBAAA,IAAuB,MAAM,OAAO,qBAAkC,EAAA,KAAA,OAAA,EAAA,EAAA;AAC9E,SAAK,eAAe,mBAAmB,IAAI,SAAS,cAAc,SAAS,cAAc,YAAY;AAAA,EACzG;AACJ;"}
@@ -1,12 +1,12 @@
1
- import { n as needsOrmComposite, l as anyPrimitive } from "./index-BgY3QEzL.js";
1
+ import { n as needsOrmComposite, l as anyPrimitive } from "./index-C2sM8ERH.js";
2
2
  const M = "KHR_materials_";
3
3
  const _features = [
4
4
  // Pre-parse features (buffer-level): order matters — meshopt decompresses
5
5
  // bufferViews first, then quantization dequantizes the resulting accessors.
6
- ["EXT_meshopt_compression", () => import("./gltf-feature-meshopt-DItMkOMt.js")],
7
- ["KHR_mesh_quantization", () => import("./gltf-ext-quantization-DaymajCR.js")],
6
+ ["EXT_meshopt_compression", () => import("./gltf-feature-meshopt-DBvtC2n2.js")],
7
+ ["KHR_mesh_quantization", () => import("./gltf-ext-quantization-DIYKR7_3.js")],
8
8
  // Pre-mesh features (geometry decompression)
9
- ["KHR_draco_mesh_compression", () => import("./gltf-feature-draco-CljWrsna.js")],
9
+ ["KHR_draco_mesh_compression", () => import("./gltf-feature-draco-CRgxNaK1.js")],
10
10
  // Material extensions
11
11
  [M + "clearcoat", () => import("./gltf-ext-clearcoat-CLH2SVph.js")],
12
12
  [M + "iridescence", () => import("./gltf-ext-iridescence-C6bq7jiM.js")],
@@ -21,8 +21,8 @@ const _features = [
21
21
  var _a;
22
22
  return (_a = j.extensionsUsed) == null ? void 0 : _a.includes(M + e);
23
23
  }), () => import("./gltf-ext-dielectric-qHzlnvdl.js")],
24
- ["KHR_texture_transform", () => import("./gltf-ext-uv-transform-DFmNJ8kA.js")],
25
- ["KHR_texture_basisu", () => import("./gltf-ext-basisu-DtzVV1Xx.js")],
24
+ ["KHR_texture_transform", () => import("./gltf-ext-uv-transform-qU-LScDy.js")],
25
+ ["KHR_texture_basisu", () => import("./gltf-ext-basisu-BARpgeiU.js")],
26
26
  [needsOrmComposite, () => import("./gltf-ext-orm-CT18G_vQ.js")],
27
27
  // Per-mesh features (predicates inlined to avoid eager imports)
28
28
  [(j) => {
@@ -31,21 +31,21 @@ const _features = [
31
31
  var _a2;
32
32
  return ((_a2 = p.attributes) == null ? void 0 : _a2.JOINTS_0) !== void 0;
33
33
  });
34
- }, () => import("./gltf-feature-skeleton-Deh2UBAn.js")],
34
+ }, () => import("./gltf-feature-skeleton-IHj-DuKx.js")],
35
35
  [(j) => anyPrimitive(j, (p) => {
36
36
  var _a;
37
37
  return !!((_a = p.targets) == null ? void 0 : _a.length);
38
- }), () => import("./gltf-feature-morph-Cv0mEYIq.js")],
38
+ }), () => import("./gltf-feature-morph-DE63vfIE.js")],
39
39
  // Per-asset features
40
- ["KHR_lights_punctual", () => import("./gltf-feature-lights-punctual-BCTwgyi_.js")],
40
+ ["KHR_lights_punctual", () => import("./gltf-feature-lights-punctual-B3xbCshn.js")],
41
41
  [(j) => {
42
42
  var _a;
43
43
  return !!((_a = j.animations) == null ? void 0 : _a.length);
44
- }, () => import("./gltf-feature-animations-v0S_yb4T.js")],
45
- [M + "variants", () => import("./gltf-feature-variants-DGSdFNJq.js")],
46
- ["KHR_node_visibility", () => import("./gltf-ext-node-visibility-BhX0DmiP.js")],
47
- ["KHR_animation_pointer", () => import("./gltf-feature-animation-pointer-C40tqOhL.js")],
48
- ["EXT_mesh_gpu_instancing", () => import("./gltf-feature-gpu-instancing-BoeSm6Tn.js")],
44
+ }, () => import("./gltf-feature-animations-Dr9AsgIN.js")],
45
+ [M + "variants", () => import("./gltf-feature-variants-C-eyBru5.js")],
46
+ ["KHR_node_visibility", () => import("./gltf-ext-node-visibility-Cv7HyWR_.js")],
47
+ ["KHR_animation_pointer", () => import("./gltf-feature-animation-pointer-nDf6dGpL.js")],
48
+ ["EXT_mesh_gpu_instancing", () => import("./gltf-feature-gpu-instancing-QfJNFW1R.js")],
49
49
  ["KHR_xmp_json_ld", () => import("./gltf-feature-xmp-BUfq_IVG.js")]
50
50
  ];
51
51
  async function loadGltfFeatures(json) {
@@ -56,4 +56,4 @@ async function loadGltfFeatures(json) {
56
56
  export {
57
57
  loadGltfFeatures
58
58
  };
59
- //# sourceMappingURL=gltf-feature-registry-wNbt6UC-.js.map
59
+ //# sourceMappingURL=gltf-feature-registry-DfOiNmhR.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gltf-feature-registry-wNbt6UC-.js","sources":["../src/loader-gltf/gltf-feature-registry.ts"],"sourcesContent":["/**\n * glTF optional-feature registry.\n *\n * The `_features` table maps every optional glTF capability to a `[trigger, load]`\n * pair: a cheap trigger plus a dynamic `import()` of the feature's `GltfFeature`\n * module. A trigger is either an exact `extensionsUsed` name (the common case) or\n * a predicate over the parsed JSON for features that aren't a simple extension\n * membership (ORM compositing, skeletons, morph targets, animations, dielectric\n * material cluster).\n *\n * This whole module is itself dynamically imported by the core loader\n * (`load-gltf.ts`) ONLY when the asset can possibly trigger at least one feature\n * — so assets that use no optional features (plain metallic-roughness GLBs) never\n * pay for the table or its import thunks.\n *\n * The core loader knows zero feature names; new extensions are added here alone.\n */\nimport type { GltfFeature } from \"./gltf-feature.js\";\nimport { anyPrimitive, needsOrmComposite } from \"./gltf-parser.js\";\n\n/** Dynamic `import()` of a feature's `GltfFeature` module. */\ntype Loader = () => Promise<{ default: GltfFeature }>;\n/** Either an exact `extensionsUsed` name, or a predicate over the parsed JSON. */\ntype Trigger = string | ((json: any) => boolean);\n\nconst M = \"KHR_materials_\";\n\nconst _features: [Trigger, Loader][] = [\n // Pre-parse features (buffer-level): order matters — meshopt decompresses\n // bufferViews first, then quantization dequantizes the resulting accessors.\n [\"EXT_meshopt_compression\", () => import(\"./gltf-feature-meshopt.js\")],\n [\"KHR_mesh_quantization\", () => import(\"./gltf-ext-quantization.js\")],\n // Pre-mesh features (geometry decompression)\n [\"KHR_draco_mesh_compression\", () => import(\"./gltf-feature-draco.js\")],\n // Material extensions\n [M + \"clearcoat\", () => import(\"./gltf-ext-clearcoat.js\")],\n [M + \"iridescence\", () => import(\"./gltf-ext-iridescence.js\")],\n [M + \"emissive_strength\", () => import(\"./gltf-ext-emissive-strength.js\")],\n [M + \"sheen\", () => import(\"./gltf-ext-sheen.js\")],\n [M + \"anisotropy\", () => import(\"./gltf-ext-anisotropy.js\")],\n [M + \"unlit\", () => import(\"./gltf-ext-unlit.js\")],\n [M + \"pbrSpecularGlossiness\", () => import(\"./gltf-ext-spec-gloss.js\")],\n // Dielectric cluster (ior/specular/transmission/volume/dispersion) — any of the five triggers the\n // loader; transmission refraction is wired dynamically by the PBR material path when needed.\n [(j) => [\"transmission\", \"volume\", \"ior\", \"specular\", \"dispersion\"].some((e) => j.extensionsUsed?.includes(M + e)), () => import(\"./gltf-ext-dielectric.js\")],\n [\"KHR_texture_transform\", () => import(\"./gltf-ext-uv-transform.js\")],\n [\"KHR_texture_basisu\", () => import(\"./gltf-ext-basisu.js\")],\n [needsOrmComposite, () => import(\"./gltf-ext-orm.js\")],\n // Per-mesh features (predicates inlined to avoid eager imports)\n [(j) => !!j.skins?.length && anyPrimitive(j, (p) => p.attributes?.JOINTS_0 !== undefined), () => import(\"./gltf-feature-skeleton.js\")],\n [(j) => anyPrimitive(j, (p) => !!p.targets?.length), () => import(\"./gltf-feature-morph.js\")],\n // Per-asset features\n [\"KHR_lights_punctual\", () => import(\"./gltf-feature-lights-punctual.js\")],\n [(j) => !!j.animations?.length, () => import(\"./gltf-feature-animations.js\")],\n [M + \"variants\", () => import(\"./gltf-feature-variants.js\")],\n [\"KHR_node_visibility\", () => import(\"./gltf-ext-node-visibility.js\")],\n [\"KHR_animation_pointer\", () => import(\"./gltf-feature-animation-pointer.js\")],\n [\"EXT_mesh_gpu_instancing\", () => import(\"./gltf-feature-gpu-instancing.js\")],\n [\"KHR_xmp_json_ld\", () => import(\"./gltf-feature-xmp.js\")],\n];\n\n/** Dynamic-import every feature the asset triggers. */\nexport async function loadGltfFeatures(json: any): Promise<GltfFeature[]> {\n const used: string[] = json.extensionsUsed ?? [];\n const mods = await Promise.all(_features.flatMap(([t, load]) => ((typeof t === \"string\" ? used.includes(t) : t(json)) ? [load()] : [])));\n return mods.map((m) => m.default);\n}\n"],"names":["_a"],"mappings":";AAyBA,MAAM,IAAI;AAEV,MAAM,YAAiC;AAAA;AAAA;AAAA,EAGnC,CAAC,2BAA2B,MAAM,OAAO,oCAA2B,CAAC;AAAA,EACrE,CAAC,yBAAyB,MAAM,OAAO,qCAA4B,CAAC;AAAA;AAAA,EAEpE,CAAC,8BAA8B,MAAM,OAAO,kCAAyB,CAAC;AAAA;AAAA,EAEtE,CAAC,IAAI,aAAa,MAAM,OAAO,kCAAyB,CAAC;AAAA,EACzD,CAAC,IAAI,eAAe,MAAM,OAAO,oCAA2B,CAAC;AAAA,EAC7D,CAAC,IAAI,qBAAqB,MAAM,OAAO,0CAAiC,CAAC;AAAA,EACzE,CAAC,IAAI,SAAS,MAAM,OAAO,8BAAqB,CAAC;AAAA,EACjD,CAAC,IAAI,cAAc,MAAM,OAAO,mCAA0B,CAAC;AAAA,EAC3D,CAAC,IAAI,SAAS,MAAM,OAAO,8BAAqB,CAAC;AAAA,EACjD,CAAC,IAAI,yBAAyB,MAAM,OAAO,mCAA0B,CAAC;AAAA;AAAA;AAAA,EAGtE,CAAC,CAAC,MAAM,CAAC,gBAAgB,UAAU,OAAO,YAAY,YAAY,EAAE,KAAK,CAAC;;AAAM,mBAAE,mBAAF,mBAAkB,SAAS,IAAI;AAAA,GAAE,GAAG,MAAM,OAAO,mCAA0B,CAAC;AAAA,EAC5J,CAAC,yBAAyB,MAAM,OAAO,qCAA4B,CAAC;AAAA,EACpE,CAAC,sBAAsB,MAAM,OAAO,+BAAsB,CAAC;AAAA,EAC3D,CAAC,mBAAmB,MAAM,OAAO,4BAAmB,CAAC;AAAA;AAAA,EAErD,CAAC,CAAC,MAAA;;AAAM,YAAC,GAAC,OAAE,UAAF,mBAAS,WAAU,aAAa,GAAG,CAAC,MAAA;;AAAM,eAAAA,MAAA,EAAE,eAAF,gBAAAA,IAAc,cAAa;AAAA,KAAS;AAAA,KAAG,MAAM,OAAO,qCAA4B,CAAC;AAAA,EACrI,CAAC,CAAC,MAAM,aAAa,GAAG,CAAC,MAAA;;AAAM,YAAC,GAAC,OAAE,YAAF,mBAAW;AAAA,GAAM,GAAG,MAAM,OAAO,kCAAyB,CAAC;AAAA;AAAA,EAE5F,CAAC,uBAAuB,MAAM,OAAO,4CAAmC,CAAC;AAAA,EACzE,CAAC,CAAC,MAAA;;AAAM,YAAC,GAAC,OAAE,eAAF,mBAAc;AAAA,KAAQ,MAAM,OAAO,uCAA8B,CAAC;AAAA,EAC5E,CAAC,IAAI,YAAY,MAAM,OAAO,qCAA4B,CAAC;AAAA,EAC3D,CAAC,uBAAuB,MAAM,OAAO,wCAA+B,CAAC;AAAA,EACrE,CAAC,yBAAyB,MAAM,OAAO,8CAAqC,CAAC;AAAA,EAC7E,CAAC,2BAA2B,MAAM,OAAO,2CAAkC,CAAC;AAAA,EAC5E,CAAC,mBAAmB,MAAM,OAAO,gCAAuB,CAAC;AAC7D;AAGA,eAAsB,iBAAiB,MAAmC;AACtE,QAAM,OAAiB,KAAK,kBAAkB,CAAA;AAC9C,QAAM,OAAO,MAAM,QAAQ,IAAI,UAAU,QAAQ,CAAC,CAAC,GAAG,IAAI,OAAQ,OAAO,MAAM,WAAW,KAAK,SAAS,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,KAAA,CAAM,IAAI,CAAA,CAAG,CAAC;AACvI,SAAO,KAAK,IAAI,CAAC,MAAM,EAAE,OAAO;AACpC;"}
1
+ {"version":3,"file":"gltf-feature-registry-DfOiNmhR.js","sources":["../src/loader-gltf/gltf-feature-registry.ts"],"sourcesContent":["/**\n * glTF optional-feature registry.\n *\n * The `_features` table maps every optional glTF capability to a `[trigger, load]`\n * pair: a cheap trigger plus a dynamic `import()` of the feature's `GltfFeature`\n * module. A trigger is either an exact `extensionsUsed` name (the common case) or\n * a predicate over the parsed JSON for features that aren't a simple extension\n * membership (ORM compositing, skeletons, morph targets, animations, dielectric\n * material cluster).\n *\n * This whole module is itself dynamically imported by the core loader\n * (`load-gltf.ts`) ONLY when the asset can possibly trigger at least one feature\n * — so assets that use no optional features (plain metallic-roughness GLBs) never\n * pay for the table or its import thunks.\n *\n * The core loader knows zero feature names; new extensions are added here alone.\n */\nimport type { GltfFeature } from \"./gltf-feature.js\";\nimport { anyPrimitive, needsOrmComposite } from \"./gltf-parser.js\";\n\n/** Dynamic `import()` of a feature's `GltfFeature` module. */\ntype Loader = () => Promise<{ default: GltfFeature }>;\n/** Either an exact `extensionsUsed` name, or a predicate over the parsed JSON. */\ntype Trigger = string | ((json: any) => boolean);\n\nconst M = \"KHR_materials_\";\n\nconst _features: [Trigger, Loader][] = [\n // Pre-parse features (buffer-level): order matters — meshopt decompresses\n // bufferViews first, then quantization dequantizes the resulting accessors.\n [\"EXT_meshopt_compression\", () => import(\"./gltf-feature-meshopt.js\")],\n [\"KHR_mesh_quantization\", () => import(\"./gltf-ext-quantization.js\")],\n // Pre-mesh features (geometry decompression)\n [\"KHR_draco_mesh_compression\", () => import(\"./gltf-feature-draco.js\")],\n // Material extensions\n [M + \"clearcoat\", () => import(\"./gltf-ext-clearcoat.js\")],\n [M + \"iridescence\", () => import(\"./gltf-ext-iridescence.js\")],\n [M + \"emissive_strength\", () => import(\"./gltf-ext-emissive-strength.js\")],\n [M + \"sheen\", () => import(\"./gltf-ext-sheen.js\")],\n [M + \"anisotropy\", () => import(\"./gltf-ext-anisotropy.js\")],\n [M + \"unlit\", () => import(\"./gltf-ext-unlit.js\")],\n [M + \"pbrSpecularGlossiness\", () => import(\"./gltf-ext-spec-gloss.js\")],\n // Dielectric cluster (ior/specular/transmission/volume/dispersion) — any of the five triggers the\n // loader; transmission refraction is wired dynamically by the PBR material path when needed.\n [(j) => [\"transmission\", \"volume\", \"ior\", \"specular\", \"dispersion\"].some((e) => j.extensionsUsed?.includes(M + e)), () => import(\"./gltf-ext-dielectric.js\")],\n [\"KHR_texture_transform\", () => import(\"./gltf-ext-uv-transform.js\")],\n [\"KHR_texture_basisu\", () => import(\"./gltf-ext-basisu.js\")],\n [needsOrmComposite, () => import(\"./gltf-ext-orm.js\")],\n // Per-mesh features (predicates inlined to avoid eager imports)\n [(j) => !!j.skins?.length && anyPrimitive(j, (p) => p.attributes?.JOINTS_0 !== undefined), () => import(\"./gltf-feature-skeleton.js\")],\n [(j) => anyPrimitive(j, (p) => !!p.targets?.length), () => import(\"./gltf-feature-morph.js\")],\n // Per-asset features\n [\"KHR_lights_punctual\", () => import(\"./gltf-feature-lights-punctual.js\")],\n [(j) => !!j.animations?.length, () => import(\"./gltf-feature-animations.js\")],\n [M + \"variants\", () => import(\"./gltf-feature-variants.js\")],\n [\"KHR_node_visibility\", () => import(\"./gltf-ext-node-visibility.js\")],\n [\"KHR_animation_pointer\", () => import(\"./gltf-feature-animation-pointer.js\")],\n [\"EXT_mesh_gpu_instancing\", () => import(\"./gltf-feature-gpu-instancing.js\")],\n [\"KHR_xmp_json_ld\", () => import(\"./gltf-feature-xmp.js\")],\n];\n\n/** Dynamic-import every feature the asset triggers. */\nexport async function loadGltfFeatures(json: any): Promise<GltfFeature[]> {\n const used: string[] = json.extensionsUsed ?? [];\n const mods = await Promise.all(_features.flatMap(([t, load]) => ((typeof t === \"string\" ? used.includes(t) : t(json)) ? [load()] : [])));\n return mods.map((m) => m.default);\n}\n"],"names":["_a"],"mappings":";AAyBA,MAAM,IAAI;AAEV,MAAM,YAAiC;AAAA;AAAA;AAAA,EAGnC,CAAC,2BAA2B,MAAM,OAAO,oCAA2B,CAAC;AAAA,EACrE,CAAC,yBAAyB,MAAM,OAAO,qCAA4B,CAAC;AAAA;AAAA,EAEpE,CAAC,8BAA8B,MAAM,OAAO,kCAAyB,CAAC;AAAA;AAAA,EAEtE,CAAC,IAAI,aAAa,MAAM,OAAO,kCAAyB,CAAC;AAAA,EACzD,CAAC,IAAI,eAAe,MAAM,OAAO,oCAA2B,CAAC;AAAA,EAC7D,CAAC,IAAI,qBAAqB,MAAM,OAAO,0CAAiC,CAAC;AAAA,EACzE,CAAC,IAAI,SAAS,MAAM,OAAO,8BAAqB,CAAC;AAAA,EACjD,CAAC,IAAI,cAAc,MAAM,OAAO,mCAA0B,CAAC;AAAA,EAC3D,CAAC,IAAI,SAAS,MAAM,OAAO,8BAAqB,CAAC;AAAA,EACjD,CAAC,IAAI,yBAAyB,MAAM,OAAO,mCAA0B,CAAC;AAAA;AAAA;AAAA,EAGtE,CAAC,CAAC,MAAM,CAAC,gBAAgB,UAAU,OAAO,YAAY,YAAY,EAAE,KAAK,CAAC;;AAAM,mBAAE,mBAAF,mBAAkB,SAAS,IAAI;AAAA,GAAE,GAAG,MAAM,OAAO,mCAA0B,CAAC;AAAA,EAC5J,CAAC,yBAAyB,MAAM,OAAO,qCAA4B,CAAC;AAAA,EACpE,CAAC,sBAAsB,MAAM,OAAO,+BAAsB,CAAC;AAAA,EAC3D,CAAC,mBAAmB,MAAM,OAAO,4BAAmB,CAAC;AAAA;AAAA,EAErD,CAAC,CAAC,MAAA;;AAAM,YAAC,GAAC,OAAE,UAAF,mBAAS,WAAU,aAAa,GAAG,CAAC,MAAA;;AAAM,eAAAA,MAAA,EAAE,eAAF,gBAAAA,IAAc,cAAa;AAAA,KAAS;AAAA,KAAG,MAAM,OAAO,qCAA4B,CAAC;AAAA,EACrI,CAAC,CAAC,MAAM,aAAa,GAAG,CAAC,MAAA;;AAAM,YAAC,GAAC,OAAE,YAAF,mBAAW;AAAA,GAAM,GAAG,MAAM,OAAO,kCAAyB,CAAC;AAAA;AAAA,EAE5F,CAAC,uBAAuB,MAAM,OAAO,4CAAmC,CAAC;AAAA,EACzE,CAAC,CAAC,MAAA;;AAAM,YAAC,GAAC,OAAE,eAAF,mBAAc;AAAA,KAAQ,MAAM,OAAO,uCAA8B,CAAC;AAAA,EAC5E,CAAC,IAAI,YAAY,MAAM,OAAO,qCAA4B,CAAC;AAAA,EAC3D,CAAC,uBAAuB,MAAM,OAAO,wCAA+B,CAAC;AAAA,EACrE,CAAC,yBAAyB,MAAM,OAAO,8CAAqC,CAAC;AAAA,EAC7E,CAAC,2BAA2B,MAAM,OAAO,2CAAkC,CAAC;AAAA,EAC5E,CAAC,mBAAmB,MAAM,OAAO,gCAAuB,CAAC;AAC7D;AAGA,eAAsB,iBAAiB,MAAmC;AACtE,QAAM,OAAiB,KAAK,kBAAkB,CAAA;AAC9C,QAAM,OAAO,MAAM,QAAQ,IAAI,UAAU,QAAQ,CAAC,CAAC,GAAG,IAAI,OAAQ,OAAO,MAAM,WAAW,KAAK,SAAS,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,KAAA,CAAM,IAAI,CAAA,CAAG,CAAC;AACvI,SAAO,KAAK,IAAI,CAAC,MAAM,EAAE,OAAO;AACpC;"}