@woosh/meep-engine 3.14.2 → 3.14.3

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 (1178) hide show
  1. package/editor/prototypeEditorShell.js +6 -0
  2. package/package.json +1 -1
  3. package/src/CODEC_LAYOUT_VERIFICATION.md +420 -0
  4. package/src/core/binary/zstd/ZstdReverseBitReader.d.ts +76 -0
  5. package/src/core/binary/zstd/ZstdReverseBitReader.d.ts.map +1 -0
  6. package/src/core/binary/zstd/ZstdReverseBitReader.js +223 -0
  7. package/src/core/binary/zstd/zstd_decompress.d.ts +31 -0
  8. package/src/core/binary/zstd/zstd_decompress.d.ts.map +1 -0
  9. package/src/core/binary/zstd/zstd_decompress.js +628 -0
  10. package/src/core/binary/zstd/zstd_fse.d.ts +83 -0
  11. package/src/core/binary/zstd/zstd_fse.d.ts.map +1 -0
  12. package/src/core/binary/zstd/zstd_fse.js +265 -0
  13. package/src/core/binary/zstd/zstd_huffman.d.ts +56 -0
  14. package/src/core/binary/zstd/zstd_huffman.d.ts.map +1 -0
  15. package/src/core/binary/zstd/zstd_huffman.js +244 -0
  16. package/src/core/binary/zstd/zstd_sequence_tables.d.ts +62 -0
  17. package/src/core/binary/zstd/zstd_sequence_tables.d.ts.map +1 -0
  18. package/src/core/binary/zstd/zstd_sequence_tables.js +98 -0
  19. package/src/core/color/COLOR_REVIEW_2026_08_28.md +1 -1
  20. package/src/core/color/PQ/PQ_constants.d.ts +1 -1
  21. package/src/core/color/PQ/PQ_constants.js +1 -1
  22. package/src/engine/asset/GameAssetType.d.ts +1 -0
  23. package/src/engine/asset/GameAssetType.js +8 -0
  24. package/src/engine/asset/codec/DecodedImage.d.ts +39 -0
  25. package/src/engine/asset/codec/DecodedImage.d.ts.map +1 -0
  26. package/src/engine/asset/codec/DecodedImage.js +26 -0
  27. package/src/engine/asset/guessAssetType.d.ts.map +1 -1
  28. package/src/engine/asset/guessAssetType.js +10 -0
  29. package/src/engine/asset/load_model_scene_bundle.d.ts +1 -1
  30. package/src/engine/asset/load_model_scene_bundle.d.ts.map +1 -1
  31. package/src/engine/asset/load_model_scene_bundle.js +6 -2
  32. package/src/engine/asset/loaders/USDSceneBundleAssetLoader.d.ts +37 -0
  33. package/src/engine/asset/loaders/USDSceneBundleAssetLoader.d.ts.map +1 -0
  34. package/src/engine/asset/loaders/USDSceneBundleAssetLoader.js +104 -0
  35. package/src/engine/asset/loaders/image/IMAGE_CODEC_REVIEW_2026_08_28.md +83 -71
  36. package/src/engine/asset/loaders/image/ImageDecoderWorker.js +2 -2
  37. package/src/engine/asset/loaders/image/ImageRGBADataLoader.d.ts +8 -9
  38. package/src/engine/asset/loaders/image/ImageRGBADataLoader.d.ts.map +1 -1
  39. package/src/engine/asset/loaders/image/ImageRGBADataLoader.js +12 -3
  40. package/src/engine/asset/loaders/image/avif/encode_image_source.d.ts +70 -0
  41. package/src/engine/asset/loaders/image/avif/encode_image_source.d.ts.map +1 -0
  42. package/src/engine/asset/loaders/image/avif/encode_image_source.js +117 -0
  43. package/src/engine/asset/loaders/image/avif/encoder_worker.d.ts.map +1 -0
  44. package/src/engine/asset/loaders/image/avif/threaded_image_encoder.d.ts.map +1 -0
  45. package/src/engine/asset/loaders/image/codec/AvifCodec.d.ts +34 -0
  46. package/src/engine/asset/loaders/image/codec/AvifCodec.d.ts.map +1 -0
  47. package/src/engine/asset/loaders/image/codec/AvifCodec.js +85 -0
  48. package/src/engine/asset/loaders/image/codec/JpegCodec.d.ts +26 -0
  49. package/src/engine/asset/loaders/image/codec/JpegCodec.d.ts.map +1 -0
  50. package/src/engine/asset/loaders/image/codec/JpegCodec.js +66 -0
  51. package/src/engine/asset/loaders/image/codec/NativeImageDecoder.d.ts +4 -16
  52. package/src/engine/asset/loaders/image/codec/NativeImageDecoder.d.ts.map +1 -1
  53. package/src/engine/asset/loaders/image/codec/NativeImageDecoder.js +2 -2
  54. package/src/engine/asset/loaders/image/codec/ThreadedImageDecoder.d.ts +21 -1
  55. package/src/engine/asset/loaders/image/codec/ThreadedImageDecoder.d.ts.map +1 -1
  56. package/src/engine/asset/loaders/image/codec/ThreadedImageDecoder.js +21 -1
  57. package/src/engine/asset/loaders/image/prototypePNG.d.ts.map +1 -0
  58. package/src/engine/asset/loaders/image/prototypePNG.js +37 -0
  59. package/src/engine/asset/preloader/extractAssetListFromManager.d.ts.map +1 -1
  60. package/src/engine/asset/preloader/extractAssetListFromManager.js +2 -1
  61. package/src/engine/graphics/ecs/mesh/assetTypeByPath.d.ts.map +1 -1
  62. package/src/engine/graphics/ecs/mesh/assetTypeByPath.js +6 -0
  63. package/src/engine/graphics/texture/sampler/avif_to_sampler2d.d.ts +25 -0
  64. package/src/engine/graphics/texture/sampler/avif_to_sampler2d.d.ts.map +1 -0
  65. package/src/engine/graphics/texture/sampler/avif_to_sampler2d.js +42 -0
  66. package/src/engine/graphics/texture/sampler/compare/sampler2d_compare.d.ts.map +1 -0
  67. package/src/engine/graphics/texture/sampler/compare/sampler2d_compare.js +94 -0
  68. package/src/engine/graphics/texture/sampler/compare/sampler2d_max_absolute_difference.d.ts +19 -0
  69. package/src/engine/graphics/texture/sampler/compare/sampler2d_max_absolute_difference.d.ts.map +1 -0
  70. package/src/engine/graphics/texture/sampler/compare/sampler2d_max_absolute_difference.js +62 -0
  71. package/src/engine/graphics/texture/sampler/compare/sampler2d_psnr.d.ts +30 -0
  72. package/src/engine/graphics/texture/sampler/compare/sampler2d_psnr.d.ts.map +1 -0
  73. package/src/engine/graphics/texture/sampler/compare/sampler2d_psnr.js +115 -0
  74. package/src/engine/graphics/texture/sampler/sampler2d_to_avif.d.ts.map +1 -0
  75. package/src/engine/graphics/texture/sampler/sampler2d_to_avif.js +108 -0
  76. package/src/engine/graphics/texture/sampler/sampler2d_to_f16.d.ts +7 -1
  77. package/src/engine/graphics/texture/sampler/sampler2d_to_f16.d.ts.map +1 -1
  78. package/src/engine/graphics/texture/sampler/sampler2d_to_f16.js +28 -21
  79. package/src/engine/graphics/texture/sampler/sampler2d_to_uint8_RGBA.d.ts.map +1 -1
  80. package/src/engine/graphics/texture/sampler/sampler2d_to_uint8_RGBA.js +3 -0
  81. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  82. package/src/format/image/avif/DECISIONS.md +545 -0
  83. package/src/format/image/avif/api/AvifDecoder.d.ts.map +1 -0
  84. package/src/format/image/avif/api/apply_transformations.d.ts.map +1 -0
  85. package/src/format/image/avif/api/convert_to_rgba.d.ts.map +1 -0
  86. package/src/format/image/avif/api/convert_to_rgba.js +204 -0
  87. package/src/format/image/avif/api/decode_avif.d.ts.map +1 -0
  88. package/src/format/image/avif/api/decode_image_item.d.ts.map +1 -0
  89. package/src/format/image/avif/api/encode_avif.d.ts.map +1 -0
  90. package/src/format/image/avif/av1/decode/Av1FrameContext.d.ts.map +1 -0
  91. package/src/format/image/avif/av1/decode/block_decoded.d.ts.map +1 -0
  92. package/src/format/image/avif/av1/decode/decode_av1_still.d.ts.map +1 -0
  93. package/src/format/image/avif/av1/decode/decode_coefficients.d.ts.map +1 -0
  94. package/src/format/image/avif/av1/decode/decode_palette.d.ts.map +1 -0
  95. package/src/format/image/avif/av1/decode/decode_palette.js +442 -0
  96. package/src/format/image/avif/av1/decode/decode_tile.d.ts.map +1 -0
  97. package/src/format/image/avif/av1/decode/decode_tile.js +1213 -0
  98. package/src/format/image/avif/av1/decode/get_scan.d.ts.map +1 -0
  99. package/src/format/image/avif/av1/decode/read_lr.d.ts.map +1 -0
  100. package/src/format/image/avif/av1/decode/read_lr.js +277 -0
  101. package/src/format/image/avif/av1/decode/read_transform_type.d.ts.map +1 -0
  102. package/src/format/image/avif/av1/decode/read_transform_type.js +92 -0
  103. package/src/format/image/avif/av1/decode/reconstruct.d.ts.map +1 -0
  104. package/src/format/image/avif/av1/decode/reconstruct.js +241 -0
  105. package/src/format/image/avif/av1/decode/transform_type.d.ts.map +1 -0
  106. package/src/format/image/avif/av1/encode/Av1BlockSnapshot.d.ts.map +1 -0
  107. package/src/format/image/avif/av1/encode/Av1EncodeContext.d.ts.map +1 -0
  108. package/src/format/image/avif/av1/encode/build_headers.d.ts.map +1 -0
  109. package/src/format/image/avif/av1/encode/choose_chroma_alpha.d.ts.map +1 -0
  110. package/src/format/image/avif/av1/encode/choose_filters.d.ts.map +1 -0
  111. package/src/format/image/avif/av1/encode/choose_restoration.d.ts.map +1 -0
  112. package/src/format/image/avif/av1/encode/choose_restoration.js +616 -0
  113. package/src/format/image/avif/av1/encode/decode_effort.d.ts.map +1 -0
  114. package/src/format/image/avif/av1/encode/encode_av1_still.d.ts.map +1 -0
  115. package/src/format/image/avif/av1/encode/encode_effort.d.ts.map +1 -0
  116. package/src/format/image/avif/av1/encode/encode_tile.d.ts.map +1 -0
  117. package/src/format/image/avif/av1/encode/encode_tile.js +2331 -0
  118. package/src/format/image/avif/av1/encode/quantise.d.ts.map +1 -0
  119. package/src/format/image/avif/av1/encode/write_coefficients.d.ts.map +1 -0
  120. package/src/format/image/avif/av1/encode/write_lr.d.ts.map +1 -0
  121. package/src/format/image/avif/av1/encode/write_transform_type.d.ts.map +1 -0
  122. package/src/format/image/avif/av1/entropy/CdfContext.d.ts.map +1 -0
  123. package/src/format/image/avif/av1/entropy/SymbolReader.d.ts.map +1 -0
  124. package/src/format/image/avif/av1/entropy/SymbolWriter.d.ts.map +1 -0
  125. package/src/format/image/avif/av1/entropy/coefficient_context.d.ts.map +1 -0
  126. package/src/format/image/avif/av1/entropy/partition_cdf.d.ts.map +1 -0
  127. package/src/format/image/avif/av1/entropy/symbol_cost.d.ts.map +1 -0
  128. package/src/format/image/avif/av1/filter/cdef.d.ts.map +1 -0
  129. package/src/format/image/avif/av1/filter/cdef.js +313 -0
  130. package/src/format/image/avif/av1/filter/loop_filter.d.ts.map +1 -0
  131. package/src/format/image/avif/av1/filter/loop_filter.js +377 -0
  132. package/src/format/image/avif/av1/filter/loop_restoration.d.ts.map +1 -0
  133. package/src/format/image/avif/av1/filter/loop_restoration.js +451 -0
  134. package/src/format/image/avif/av1/filter/superres.d.ts.map +1 -0
  135. package/src/format/image/avif/av1/filter/superres.js +86 -0
  136. package/src/format/image/avif/av1/grain/FilmGrainState.d.ts.map +1 -0
  137. package/src/format/image/avif/av1/grain/film_grain.d.ts.map +1 -0
  138. package/src/format/image/avif/av1/grain/film_grain.js +623 -0
  139. package/src/format/image/avif/av1/obu/FrameHeader.d.ts.map +1 -0
  140. package/src/format/image/avif/av1/obu/ObuHeader.d.ts.map +1 -0
  141. package/src/format/image/avif/av1/obu/SequenceHeader.d.ts.map +1 -0
  142. package/src/format/image/avif/av1/obu/for_each_obu.d.ts.map +1 -0
  143. package/src/format/image/avif/av1/obu/parse_frame_header.d.ts.map +1 -0
  144. package/src/format/image/avif/av1/obu/parse_frame_header.js +841 -0
  145. package/src/format/image/avif/av1/obu/parse_obu_header.d.ts.map +1 -0
  146. package/src/format/image/avif/av1/obu/parse_sequence_header.d.ts.map +1 -0
  147. package/src/format/image/avif/av1/obu/write_frame_header.d.ts.map +1 -0
  148. package/src/format/image/avif/av1/obu/write_sequence_header.d.ts.map +1 -0
  149. package/src/format/image/avif/av1/predict/IntraPredictionState.d.ts.map +1 -0
  150. package/src/format/image/avif/av1/predict/intra_filter_type.d.ts.map +1 -0
  151. package/src/format/image/avif/av1/predict/predict_chroma_from_luma.d.ts.map +1 -0
  152. package/src/format/image/avif/av1/predict/predict_chroma_from_luma.js +153 -0
  153. package/src/format/image/avif/av1/predict/predict_intra.d.ts.map +1 -0
  154. package/src/format/image/avif/av1/predict/predict_intra.js +803 -0
  155. package/src/format/image/avif/av1/predict/predict_palette.d.ts.map +1 -0
  156. package/src/format/image/avif/av1/tables/av1_symbols.d.ts.map +1 -0
  157. package/src/format/image/avif/av1/tables/av1_symbols.js +419 -0
  158. package/src/format/image/avif/av1/tables/block_tables.d.ts.map +1 -0
  159. package/src/format/image/avif/av1/tables/block_tables.js +270 -0
  160. package/src/format/image/avif/av1/tables/cdf_tables.d.ts.map +1 -0
  161. package/src/format/image/avif/av1/tables/cdf_tables.js +1893 -0
  162. package/src/format/image/avif/av1/tables/coefficient_tables.d.ts.map +1 -0
  163. package/src/format/image/avif/av1/tables/coefficient_tables.js +82 -0
  164. package/src/format/image/avif/av1/tables/derived_block_tables.d.ts.map +1 -0
  165. package/src/format/image/avif/av1/tables/filter_tables.d.ts.map +1 -0
  166. package/src/format/image/avif/av1/tables/filter_tables.js +313 -0
  167. package/src/format/image/avif/av1/tables/grain_tables.d.ts.map +1 -0
  168. package/src/format/image/avif/av1/tables/grain_tables.js +190 -0
  169. package/src/format/image/avif/av1/tables/prediction_tables.d.ts.map +1 -0
  170. package/src/format/image/avif/av1/tables/prediction_tables.js +223 -0
  171. package/src/format/image/avif/av1/tables/quantizer_matrix_tables.d.ts.map +1 -0
  172. package/src/format/image/avif/av1/tables/quantizer_matrix_tables.js +38 -0
  173. package/src/format/image/avif/av1/tables/quantizer_tables.d.ts.map +1 -0
  174. package/src/format/image/avif/av1/tables/quantizer_tables.js +160 -0
  175. package/src/format/image/avif/av1/tables/scan_tables.d.ts.map +1 -0
  176. package/src/format/image/avif/av1/tables/scan_tables.js +727 -0
  177. package/src/format/image/avif/av1/tables/segmentation_tables.d.ts.map +1 -0
  178. package/src/format/image/avif/av1/tables/segmentation_tables.js +48 -0
  179. package/src/format/image/avif/av1/tables/transform_tables.d.ts.map +1 -0
  180. package/src/format/image/avif/av1/tables/transform_tables.js +140 -0
  181. package/src/format/image/avif/av1/tables/unpack_table.d.ts.map +1 -0
  182. package/src/format/image/avif/av1/tables/unpack_table.js +73 -0
  183. package/src/format/image/avif/av1/transform/forward_transform_2d.d.ts.map +1 -0
  184. package/src/format/image/avif/av1/transform/inverse_transform_1d.d.ts.map +1 -0
  185. package/src/format/image/avif/av1/transform/inverse_transform_1d.js +590 -0
  186. package/src/format/image/avif/av1/transform/inverse_transform_2d.d.ts.map +1 -0
  187. package/src/format/image/avif/av1/transform/inverse_transform_2d.js +180 -0
  188. package/src/format/image/avif/av1/util/ceil_log2.d.ts.map +1 -0
  189. package/src/format/image/avif/av1/util/floor_log2.d.ts +20 -0
  190. package/src/format/image/avif/av1/util/floor_log2.d.ts.map +1 -0
  191. package/src/format/image/avif/av1/util/floor_log2.js +20 -0
  192. package/src/format/image/avif/av1/util/round2.d.ts.map +1 -0
  193. package/src/format/image/avif/av1/util/round2_signed.d.ts.map +1 -0
  194. package/src/format/image/avif/av1/util/tile_log2.d.ts.map +1 -0
  195. package/src/format/image/avif/bitstream/BitReader.d.ts.map +1 -0
  196. package/src/format/image/avif/bitstream/BitWriter.d.ts.map +1 -0
  197. package/src/format/image/avif/color/ColourTransform.d.ts.map +1 -0
  198. package/src/format/image/avif/color/YuvImage.d.ts.map +1 -0
  199. package/src/format/image/avif/color/clamp_sample.d.ts.map +1 -0
  200. package/src/format/image/avif/color/linear_to_transfer.d.ts.map +1 -0
  201. package/src/format/image/avif/color/linear_to_transfer.js +126 -0
  202. package/src/format/image/avif/color/primaries.d.ts.map +1 -0
  203. package/src/format/image/avif/color/rgb_row_to_ycbcr.d.ts.map +1 -0
  204. package/src/format/image/avif/color/transfer_to_linear.d.ts.map +1 -0
  205. package/src/format/image/avif/color/transfer_to_linear.js +171 -0
  206. package/src/format/image/avif/color/upsample_chroma_row.d.ts.map +1 -0
  207. package/src/format/image/avif/color/upsample_chroma_row.js +89 -0
  208. package/src/format/image/avif/color/ycbcr_row_to_rgb.d.ts.map +1 -0
  209. package/src/format/image/avif/color/ycbcr_row_to_rgb.js +78 -0
  210. package/src/format/image/avif/heif/AvifFile.d.ts.map +1 -0
  211. package/src/format/image/avif/heif/ItemProperty.d.ts.map +1 -0
  212. package/src/format/image/avif/heif/find_item_property.d.ts.map +1 -0
  213. package/src/format/image/avif/heif/find_item_references.d.ts.map +1 -0
  214. package/src/format/image/avif/heif/find_items_referencing.d.ts.map +1 -0
  215. package/src/format/image/avif/heif/parse_avif_file.d.ts.map +1 -0
  216. package/src/format/image/avif/heif/parse_avif_file.js +384 -0
  217. package/src/format/image/avif/heif/parse_image_grid.d.ts.map +1 -0
  218. package/src/format/image/avif/heif/parse_image_grid.js +49 -0
  219. package/src/format/image/avif/heif/parse_item_property.d.ts.map +1 -0
  220. package/src/format/image/avif/heif/read_item_data.d.ts.map +1 -0
  221. package/src/format/image/avif/heif/write_avif_file.d.ts.map +1 -0
  222. package/src/format/image/avif/heif/write_item_property.d.ts.map +1 -0
  223. package/src/format/image/avif/index.d.ts +12 -0
  224. package/src/format/image/avif/index.d.ts.map +1 -0
  225. package/src/format/image/avif/index.js +58 -0
  226. package/src/format/image/avif/isobmff/BoxHeader.d.ts.map +1 -0
  227. package/src/format/image/avif/isobmff/BoxWriter.d.ts +118 -0
  228. package/src/format/image/avif/isobmff/BoxWriter.d.ts.map +1 -0
  229. package/src/format/image/avif/isobmff/BoxWriter.js +264 -0
  230. package/src/format/image/avif/isobmff/for_each_box.d.ts.map +1 -0
  231. package/src/format/image/avif/isobmff/read_box_header.d.ts.map +1 -0
  232. package/src/format/image/avif/isobmff/read_full_box_header.d.ts.map +1 -0
  233. package/src/format/image/jpeg/JpegFrame.d.ts.map +1 -0
  234. package/src/format/image/jpeg/JpegFrameComponent.d.ts.map +1 -0
  235. package/src/format/image/jpeg/JpegImage.d.ts.map +1 -0
  236. package/src/format/image/jpeg/JpegImage.js +664 -0
  237. package/src/format/image/jpeg/buildComponentData.d.ts.map +1 -0
  238. package/src/format/image/jpeg/buildHuffmanTable.d.ts.map +1 -0
  239. package/src/format/image/jpeg/decodeScan.d.ts.map +1 -0
  240. package/src/format/image/jpeg/idct8x8_float.d.ts.map +1 -0
  241. package/src/format/image/jpeg/idct8x8_float.js +31 -0
  242. package/src/format/image/jpeg/jpeg_component_row.d.ts.map +1 -0
  243. package/src/format/image/jpeg/jpeg_decode.d.ts.map +1 -0
  244. package/src/format/image/png/PNG.d.ts.map +1 -0
  245. package/src/format/image/png/PNGReader.d.ts +158 -0
  246. package/src/format/image/png/PNGReader.d.ts.map +1 -0
  247. package/src/format/image/png/PNGReader.js +656 -0
  248. package/src/format/image/png/PNG_HEADER_BYTES.d.ts.map +1 -0
  249. package/src/format/image/png/chunk/png_chunk_decode_iTXt.d.ts.map +1 -0
  250. package/src/format/image/png/chunk/png_chunk_decode_iTXt.js +53 -0
  251. package/src/format/image/png/chunk/png_chunk_decode_zTXt.d.ts.map +1 -0
  252. package/src/format/image/png/chunk/png_chunk_decode_zTXt.js +42 -0
  253. package/src/format/image/png/crc32.d.ts +2 -0
  254. package/src/format/image/png/crc32.d.ts.map +1 -0
  255. package/src/format/image/png/crc32.js +8 -0
  256. package/src/format/image/png/filter/png_filter_unFilterAverage.d.ts.map +1 -0
  257. package/src/format/image/png/filter/png_filter_unFilterNone.d.ts.map +1 -0
  258. package/src/format/image/png/filter/png_filter_unFilterPaeth.d.ts.map +1 -0
  259. package/src/format/image/png/filter/png_filter_unFilterSub.d.ts.map +1 -0
  260. package/src/format/image/png/filter/png_filter_unFilterUp.d.ts.map +1 -0
  261. package/src/format/image/png/filter/png_unfilter.d.ts.map +1 -0
  262. package/src/format/image/png/filter/png_unfilter.js +68 -0
  263. package/src/format/image/png/png_inflate.d.ts.map +1 -0
  264. package/src/format/image/png/png_unpack_samples.d.ts.map +1 -0
  265. package/src/format/scene/gltf/GLTF_PRIMITIVE_MODE.d.ts.map +1 -0
  266. package/src/format/scene/gltf/MESHOPT_COMPRESSION_PLAN.md +793 -0
  267. package/src/format/scene/gltf/coalesce_array_duplicates.d.ts.map +1 -0
  268. package/src/format/scene/gltf/ext/GltfBufferViewExtension.d.ts.map +1 -0
  269. package/src/format/scene/gltf/ext/GltfBufferViewExtensionSet.d.ts.map +1 -0
  270. package/src/format/scene/gltf/ext/GltfBufferViewExtensionSet.js +109 -0
  271. package/src/format/scene/gltf/ext/gltf_apply_buffer_view_extensions.d.ts.map +1 -0
  272. package/src/format/scene/gltf/ext/gltf_buffer_view_extensions.d.ts.map +1 -0
  273. package/src/format/scene/gltf/ext/gltf_geometry_extensions.d.ts.map +1 -0
  274. package/src/format/scene/gltf/ext/meshopt/MeshoptBufferViewExtension.d.ts.map +1 -0
  275. package/src/format/scene/gltf/ext/meshopt/MeshoptBufferViewExtension.js +301 -0
  276. package/src/format/scene/gltf/gltf_component_type.d.ts.map +1 -0
  277. package/src/format/scene/gltf/gltf_node_world_matrices.d.ts.map +1 -0
  278. package/src/format/scene/gltf/gltf_node_world_matrices.js +137 -0
  279. package/src/format/scene/gltf/gltf_parse_container.d.ts.map +1 -0
  280. package/src/format/scene/gltf/gltf_read_accessor.d.ts.map +1 -0
  281. package/src/format/scene/gltf/gltf_read_accessor.js +294 -0
  282. package/src/format/scene/gltf/gltf_used_image_indices.d.ts +51 -0
  283. package/src/format/scene/gltf/gltf_used_image_indices.d.ts.map +1 -0
  284. package/src/format/scene/gltf/gltf_used_image_indices.js +122 -0
  285. package/src/format/scene/usd/UsdError.d.ts.map +1 -0
  286. package/src/format/scene/usd/parse_usda.d.ts.map +1 -0
  287. package/src/format/scene/usd/unpack_usdz.d.ts.map +1 -0
  288. package/src/format/scene/usd/unpack_usdz.js +106 -0
  289. package/src/format/scene/usd/usd_compose_transform.d.ts.map +1 -0
  290. package/src/format/scene/usd/usd_compose_transform.js +258 -0
  291. package/src/format/scene/usd/usd_lz4.d.ts.map +1 -0
  292. package/src/format/scene/usd/usd_lz4.js +182 -0
  293. package/src/format/scene/usd/usd_triangulate.d.ts.map +1 -0
  294. package/src/format/texture/TexelPayload.d.ts +55 -0
  295. package/src/format/texture/TexelPayload.d.ts.map +1 -0
  296. package/src/format/texture/TexelPayload.js +39 -0
  297. package/src/format/texture/basis/BasisBitReader.d.ts +77 -0
  298. package/src/format/texture/basis/BasisBitReader.d.ts.map +1 -0
  299. package/src/format/texture/basis/BasisBitReader.js +231 -0
  300. package/src/format/texture/basis/BasisHuffmanTable.d.ts.map +1 -0
  301. package/src/format/texture/basis/astc_block.d.ts +92 -0
  302. package/src/format/texture/basis/astc_block.d.ts.map +1 -0
  303. package/src/format/texture/basis/astc_block.js +164 -0
  304. package/src/format/texture/basis/astc_integer_sequence.d.ts +59 -0
  305. package/src/format/texture/basis/astc_integer_sequence.d.ts.map +1 -0
  306. package/src/format/texture/basis/astc_integer_sequence.js +251 -0
  307. package/src/format/texture/basis/astc_partition.d.ts +56 -0
  308. package/src/format/texture/basis/astc_partition.d.ts.map +1 -0
  309. package/src/format/texture/basis/astc_partition.js +199 -0
  310. package/src/format/texture/basis/basis_read_huffman_table.d.ts.map +1 -0
  311. package/src/format/texture/basis/etc1s/Etc1sSelectorHistory.d.ts.map +1 -0
  312. package/src/format/texture/basis/etc1s/etc1s_block_colors.d.ts.map +1 -0
  313. package/src/format/texture/basis/etc1s/etc1s_decode_slice.d.ts.map +1 -0
  314. package/src/format/texture/basis/etc1s/etc1s_decode_slice.js +290 -0
  315. package/src/format/texture/basis/etc1s/etc1s_read_endpoint_codebook.d.ts.map +1 -0
  316. package/src/format/texture/basis/etc1s/etc1s_read_selector_codebook.d.ts.map +1 -0
  317. package/src/format/texture/basis/etc1s/etc1s_read_slice_tables.d.ts.map +1 -0
  318. package/src/format/texture/basis/transcode/build_range_plan.d.ts +46 -0
  319. package/src/format/texture/basis/transcode/build_range_plan.d.ts.map +1 -0
  320. package/src/format/texture/basis/transcode/etc1s_to_astc.d.ts +30 -0
  321. package/src/format/texture/basis/transcode/etc1s_to_astc.d.ts.map +1 -0
  322. package/src/format/texture/basis/transcode/etc1s_to_astc.js +328 -0
  323. package/src/format/texture/basis/transcode/etc1s_to_bc1.d.ts +34 -0
  324. package/src/format/texture/basis/transcode/etc1s_to_bc1.d.ts.map +1 -0
  325. package/src/format/texture/basis/transcode/etc1s_to_bc1.js +486 -0
  326. package/src/format/texture/basis/transcode/etc1s_to_bc7.d.ts +27 -0
  327. package/src/format/texture/basis/transcode/etc1s_to_bc7.d.ts.map +1 -0
  328. package/src/format/texture/basis/transcode/etc1s_to_etc2.d.ts +31 -0
  329. package/src/format/texture/basis/transcode/etc1s_to_etc2.d.ts.map +1 -0
  330. package/src/format/texture/basis/transcode/etc1s_to_etc2.js +332 -0
  331. package/src/format/texture/basis/transcode/etc1s_to_rgba8.d.ts +39 -0
  332. package/src/format/texture/basis/transcode/etc1s_to_rgba8.d.ts.map +1 -0
  333. package/src/format/texture/basis/transcode/etc1s_to_rgba8.js +115 -0
  334. package/src/format/texture/basis/transcode/fit_endpoints.d.ts +79 -0
  335. package/src/format/texture/basis/transcode/fit_endpoints.d.ts.map +1 -0
  336. package/src/format/texture/basis/transcode/fit_endpoints.js +297 -0
  337. package/src/format/texture/basis/transcode_basis.d.ts +109 -0
  338. package/src/format/texture/basis/transcode_basis.d.ts.map +1 -0
  339. package/src/format/texture/basis/transcode_basis.js +250 -0
  340. package/src/format/texture/basis/transcode_uastc.d.ts +55 -0
  341. package/src/format/texture/basis/transcode_uastc.d.ts.map +1 -0
  342. package/src/format/texture/basis/transcode_uastc.js +117 -0
  343. package/src/format/texture/basis/uastc/bc7_tables.d.ts +111 -0
  344. package/src/format/texture/basis/uastc/bc7_tables.d.ts.map +1 -0
  345. package/src/format/texture/basis/uastc/bc7_tables.js +276 -0
  346. package/src/format/texture/basis/uastc/bc7_write_block.d.ts +124 -0
  347. package/src/format/texture/basis/uastc/bc7_write_block.d.ts.map +1 -0
  348. package/src/format/texture/basis/uastc/bc7_write_block.js +227 -0
  349. package/src/format/texture/basis/uastc/uastc_decode_block.d.ts +105 -0
  350. package/src/format/texture/basis/uastc/uastc_decode_block.d.ts.map +1 -0
  351. package/src/format/texture/basis/uastc/uastc_decode_block.js +480 -0
  352. package/src/format/texture/basis/uastc/uastc_tables.d.ts +240 -0
  353. package/src/format/texture/basis/uastc/uastc_tables.d.ts.map +1 -0
  354. package/src/format/texture/basis/uastc/uastc_tables.js +383 -0
  355. package/src/format/texture/basis/uastc/uastc_to_astc.d.ts +30 -0
  356. package/src/format/texture/basis/uastc/uastc_to_astc.d.ts.map +1 -0
  357. package/src/format/texture/basis/uastc/uastc_to_astc.js +421 -0
  358. package/src/format/texture/basis/uastc/uastc_to_bc5.d.ts +26 -0
  359. package/src/format/texture/basis/uastc/uastc_to_bc5.d.ts.map +1 -0
  360. package/src/format/texture/basis/uastc/uastc_to_bc5.js +115 -0
  361. package/src/format/texture/basis/uastc/uastc_to_bc7.d.ts +36 -0
  362. package/src/format/texture/basis/uastc/uastc_to_bc7.d.ts.map +1 -0
  363. package/src/format/texture/basis/uastc/uastc_to_bc7.js +602 -0
  364. package/src/format/texture/basis/uastc/uastc_to_rgba8.d.ts +37 -0
  365. package/src/format/texture/basis/uastc/uastc_to_rgba8.d.ts.map +1 -0
  366. package/src/format/texture/basis/uastc/uastc_to_rgba8.js +87 -0
  367. package/src/format/texture/bc/bc1_write_block.d.ts +28 -0
  368. package/src/format/texture/bc/bc1_write_block.d.ts.map +1 -0
  369. package/src/format/texture/bc/bc1_write_block.js +41 -0
  370. package/src/format/texture/bc/bc4_write_block.d.ts +32 -0
  371. package/src/format/texture/bc/bc4_write_block.d.ts.map +1 -0
  372. package/src/format/texture/bc/bc4_write_block.js +50 -0
  373. package/src/format/texture/bc/bc6h_write_block_mode11.d.ts +30 -0
  374. package/src/format/texture/bc/bc6h_write_block_mode11.d.ts.map +1 -0
  375. package/src/format/texture/bc/bc6h_write_block_mode11.js +62 -0
  376. package/src/format/texture/ktx2/KTX2_IDENTIFIER.d.ts.map +1 -0
  377. package/src/format/texture/ktx2/KhrDfModel.d.ts.map +1 -0
  378. package/src/format/texture/ktx2/SupercompressionScheme.d.ts.map +1 -0
  379. package/src/format/texture/ktx2/ktx2_read.d.ts +105 -0
  380. package/src/format/texture/ktx2/ktx2_read.d.ts.map +1 -0
  381. package/src/format/texture/ktx2/ktx2_read.js +909 -0
  382. package/src/format/texture/ktx2/ktx2_read_basis_lz_global_data.d.ts +27 -0
  383. package/src/format/texture/ktx2/ktx2_read_basis_lz_global_data.d.ts.map +1 -0
  384. package/src/format/texture/ktx2/ktx2_read_basis_lz_global_data.js +189 -0
  385. package/src/format/texture/ktx2/vk_format_to_texture_format.d.ts +55 -0
  386. package/src/format/texture/ktx2/vk_format_to_texture_format.d.ts.map +1 -0
  387. package/src/format/texture/ktx2/vk_format_to_texture_format.js +290 -0
  388. package/src/shade/descriptor/texture/format/gpu_texture_format_feature.d.ts +16 -0
  389. package/src/shade/descriptor/texture/format/gpu_texture_format_feature.d.ts.map +1 -0
  390. package/src/shade/descriptor/texture/format/gpu_texture_format_feature.js +44 -0
  391. package/src/shade/descriptor/texture/format/gpu_texture_format_info.d.ts +16 -0
  392. package/src/shade/descriptor/texture/format/gpu_texture_format_info.d.ts.map +1 -1
  393. package/src/shade/descriptor/texture/format/gpu_texture_format_info.js +24 -0
  394. package/src/shade/descriptor/texture/format/gpu_texture_format_srgb.d.ts +19 -0
  395. package/src/shade/descriptor/texture/format/gpu_texture_format_srgb.d.ts.map +1 -0
  396. package/src/shade/descriptor/texture/format/gpu_texture_format_srgb.js +50 -0
  397. package/src/shade/device/COPY_BYTES_PER_ROW_ALIGNMENT.d.ts +14 -0
  398. package/src/shade/device/COPY_BYTES_PER_ROW_ALIGNMENT.d.ts.map +1 -0
  399. package/src/shade/device/COPY_BYTES_PER_ROW_ALIGNMENT.js +13 -0
  400. package/src/shade/device/mock/SoftwareGPUDevice.d.ts.map +1 -1
  401. package/src/shade/device/mock/SoftwareGPUDevice.js +37 -3
  402. package/src/shade/device/mock/SoftwareGPUTexture.d.ts +4 -2
  403. package/src/shade/device/mock/SoftwareGPUTexture.d.ts.map +1 -1
  404. package/src/shade/device/mock/SoftwareGPUTexture.js +39 -3
  405. package/src/shade/device/mock/SoftwareGPUTextureView.d.ts +7 -0
  406. package/src/shade/device/mock/SoftwareGPUTextureView.d.ts.map +1 -1
  407. package/src/shade/device/mock/SoftwareGPUTextureView.js +8 -0
  408. package/src/shade/device/mock/texture_copy.d.ts.map +1 -1
  409. package/src/shade/device/mock/texture_copy.js +74 -12
  410. package/src/shade/playground/basis_textures/README.md +105 -0
  411. package/src/shade/playground/basis_textures/index.html +141 -0
  412. package/src/shade/playground/basis_textures/main.d.ts +8 -0
  413. package/src/shade/playground/basis_textures/main.d.ts.map +1 -0
  414. package/src/shade/playground/basis_textures/main.js +351 -0
  415. package/src/shade/playground/basis_textures/make_basis_gltf.d.mts +2 -0
  416. package/src/shade/playground/basis_textures/make_basis_gltf.d.mts.map +1 -0
  417. package/src/shade/playground/basis_textures/make_basis_gltf.mjs +197 -0
  418. package/src/shade/playground/basis_textures/node_modules/basis_universal/bin/basisu.exe +0 -0
  419. package/src/shade/playground/basis_textures/texture_inventory.d.ts +28 -0
  420. package/src/shade/playground/basis_textures/texture_inventory.d.ts.map +1 -0
  421. package/src/shade/playground/basis_textures/texture_inventory.js +98 -0
  422. package/src/shade/playground/image_decode_bench/README.md +42 -0
  423. package/src/shade/playground/image_decode_bench/decode_worker.d.ts +2 -0
  424. package/src/shade/playground/image_decode_bench/decode_worker.d.ts.map +1 -0
  425. package/src/shade/playground/image_decode_bench/decode_worker.js +19 -0
  426. package/src/shade/playground/image_decode_bench/index.html +34 -0
  427. package/src/shade/playground/image_decode_bench/main.d.ts +2 -0
  428. package/src/shade/playground/image_decode_bench/main.d.ts.map +1 -0
  429. package/src/shade/playground/image_decode_bench/main.js +211 -0
  430. package/src/shade/playground/skinned_blas_refit/README.md +1 -1
  431. package/src/shade/playground/skinned_blas_refit/index.html +15 -1
  432. package/src/shade/playground/skinned_blas_refit/main.d.ts.map +1 -1
  433. package/src/shade/playground/skinned_blas_refit/main.js +339 -3
  434. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts +8 -1
  435. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts.map +1 -1
  436. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.js +27 -5
  437. package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.d.ts +27 -0
  438. package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.d.ts.map +1 -0
  439. package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.js +127 -0
  440. package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.d.ts.map +1 -1
  441. package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.js +3 -3
  442. package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.d.ts.map +1 -1
  443. package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.js +10 -8
  444. package/src/shade/playground/texture_encode/README.md +109 -0
  445. package/src/shade/playground/texture_encode/index.html +133 -0
  446. package/src/shade/playground/texture_encode/main.d.ts +24 -0
  447. package/src/shade/playground/texture_encode/main.d.ts.map +1 -0
  448. package/src/shade/playground/texture_encode/main.js +1430 -0
  449. package/src/shade/playground/texture_encode/panel_view.d.ts +118 -0
  450. package/src/shade/playground/texture_encode/panel_view.d.ts.map +1 -0
  451. package/src/shade/playground/texture_encode/panel_view.js +363 -0
  452. package/src/shade/renderer/Renderer.js +2 -2
  453. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  454. package/src/shade/renderer/animation/GPUAnimationManager.js +49 -5
  455. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  456. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +32 -14
  457. package/src/shade/renderer/geometry/GPUGeometryManager.d.ts.map +1 -1
  458. package/src/shade/renderer/geometry/GPUGeometryManager.js +591 -497
  459. package/src/shade/renderer/geometry/GPUGeometryMetadata.d.ts +9 -0
  460. package/src/shade/renderer/geometry/GPUGeometryMetadata.d.ts.map +1 -1
  461. package/src/shade/renderer/geometry/GPUGeometryMetadata.js +10 -0
  462. package/src/shade/renderer/geometry/bvh/BLAS_REFIT_BATCH_PLAN.md +606 -0
  463. package/src/shade/renderer/geometry/bvh/BLAS_REFIT_TARGET_STRUCT.d.ts +17 -0
  464. package/src/shade/renderer/geometry/bvh/BLAS_REFIT_TARGET_STRUCT.d.ts.map +1 -0
  465. package/src/shade/renderer/geometry/bvh/BLAS_REFIT_TARGET_STRUCT.js +44 -0
  466. package/src/shade/renderer/geometry/bvh/GPUBLASRefitBatch.d.ts +58 -0
  467. package/src/shade/renderer/geometry/bvh/GPUBLASRefitBatch.d.ts.map +1 -0
  468. package/src/shade/renderer/geometry/bvh/GPUBLASRefitBatch.js +362 -0
  469. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts +38 -0
  470. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
  471. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +730 -617
  472. package/src/shade/renderer/geometry/bvh/GPUGeometryMeshletsBVH.d.ts +15 -2
  473. package/src/shade/renderer/geometry/bvh/GPUGeometryMeshletsBVH.d.ts.map +1 -1
  474. package/src/shade/renderer/geometry/bvh/GPUGeometryMeshletsBVH.js +15 -1
  475. package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch.d.ts +39 -0
  476. package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch.d.ts.map +1 -0
  477. package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch.js +134 -0
  478. package/src/shade/renderer/geometry/virtual/build/gltf/gltf_collect_geometries.js +3 -3
  479. package/src/shade/renderer/geometry/virtual/build/gltf/gltf_open_document.js +3 -3
  480. package/src/shade/renderer/geometry/virtual/build/gltf/gltf_read_geometry.js +1 -1
  481. package/src/shade/renderer/gpu_primitive/bvh/BVH_NODE_LAYOUT_DEFINITION.d.ts +17 -0
  482. package/src/shade/renderer/gpu_primitive/bvh/BVH_NODE_LAYOUT_DEFINITION.d.ts.map +1 -0
  483. package/src/shade/renderer/gpu_primitive/bvh/BVH_NODE_LAYOUT_DEFINITION.js +30 -0
  484. package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +8 -1
  485. package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_refit_climb.d.ts +34 -0
  486. package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_refit_climb.d.ts.map +1 -0
  487. package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_refit_climb.js +102 -0
  488. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.d.ts +11 -9
  489. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.d.ts.map +1 -1
  490. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.js +24 -86
  491. package/src/shade/renderer/loader/gltf/gltf_create_texture.d.ts +18 -0
  492. package/src/shade/renderer/loader/gltf/gltf_create_texture.d.ts.map +1 -0
  493. package/src/shade/renderer/loader/gltf/gltf_create_texture.js +103 -0
  494. package/src/shade/renderer/loader/gltf/gltf_image_roles.d.ts +26 -0
  495. package/src/shade/renderer/loader/gltf/gltf_image_roles.d.ts.map +1 -0
  496. package/src/shade/renderer/loader/gltf/gltf_image_roles.js +108 -0
  497. package/src/shade/renderer/loader/gltf/load_gltf.d.ts +10 -3
  498. package/src/shade/renderer/loader/gltf/load_gltf.d.ts.map +1 -1
  499. package/src/shade/renderer/loader/gltf/load_gltf.js +1179 -1253
  500. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +18 -1
  501. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts.map +1 -1
  502. package/src/shade/renderer/loader/gltf/tiny-gltf.js +837 -646
  503. package/src/shade/renderer/loader/usd/load_usd.js +3 -3
  504. package/src/shade/renderer/loader/usd/usd_build_scene.js +2 -2
  505. package/src/shade/renderer/loader/usd/usd_decode_image.d.ts +6 -5
  506. package/src/shade/renderer/loader/usd/usd_decode_image.d.ts.map +1 -1
  507. package/src/shade/renderer/loader/usd/usd_decode_image.js +197 -384
  508. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  509. package/src/shade/renderer/postprocess/taa/TAA.d.ts +3 -3
  510. package/src/shade/renderer/postprocess/taa/TAA.d.ts.map +1 -1
  511. package/src/shade/renderer/postprocess/taa/TAA.js +2 -6
  512. package/src/shade/renderer/postprocess/taa/chunk_depth_clip_offset_codec.d.ts +18 -0
  513. package/src/shade/renderer/postprocess/taa/chunk_depth_clip_offset_codec.d.ts.map +1 -0
  514. package/src/shade/renderer/postprocess/taa/chunk_depth_clip_offset_codec.js +36 -0
  515. package/src/shade/renderer/postprocess/taa/chunk_taa_history_color_bounding_box_YCoCg.d.ts.map +1 -1
  516. package/src/shade/renderer/postprocess/taa/chunk_taa_history_color_bounding_box_YCoCg.js +4 -1
  517. package/src/shade/renderer/postprocess/taa/shader_depth_occlusion_clip.d.ts.map +1 -1
  518. package/src/shade/renderer/postprocess/taa/shader_depth_occlusion_clip.js +13 -8
  519. package/src/shade/renderer/postprocess/taa/shader_taa.d.ts +1 -1
  520. package/src/shade/renderer/postprocess/taa/shader_taa.d.ts.map +1 -1
  521. package/src/shade/renderer/postprocess/taa/shader_taa.js +52 -38
  522. package/src/shade/renderer/restir/di/chunk_restir_temporal_reuse.d.ts +4 -2
  523. package/src/shade/renderer/restir/di/chunk_restir_temporal_reuse.d.ts.map +1 -1
  524. package/src/shade/renderer/restir/di/chunk_restir_temporal_reuse.js +9 -6
  525. package/src/shade/renderer/scene/optimization/deduplicate_images.js +93 -93
  526. package/src/shade/renderer/scene/optimization/downscale_images.js +216 -216
  527. package/src/shade/renderer/scene/serialization/decode_image_source_hdr.js +1 -1
  528. package/src/shade/renderer/scene/serialization/deserialize_scene.js +1 -1
  529. package/src/shade/renderer/scene/serialization/write_image_source.js +1 -1
  530. package/src/shade/renderer/shader/chunk/color/iCtCp/chunk_eotf_st2084.d.ts +1 -1
  531. package/src/shade/renderer/shader/chunk/color/iCtCp/chunk_eotf_st2084.js +1 -1
  532. package/src/shade/renderer/shader/chunk/texture/sample/chunk_texture_sample_catmullrom_hardware_5tap_uv.d.ts +2 -1
  533. package/src/shade/renderer/shader/chunk/texture/sample/chunk_texture_sample_catmullrom_hardware_5tap_uv.d.ts.map +1 -1
  534. package/src/shade/renderer/shader/chunk/texture/sample/chunk_texture_sample_catmullrom_hardware_5tap_uv.js +2 -1
  535. package/src/shade/renderer/texture/COMPRESSED_TEXTURE_PLAN_2026_09_01.md +893 -10
  536. package/src/shade/renderer/texture/encode/ENCODE_NOTES_2026_09_02.md +462 -0
  537. package/src/shade/renderer/texture/encode/chunk_astc_encode_block_4x4_rgb.d.ts +33 -0
  538. package/src/shade/renderer/texture/encode/chunk_astc_encode_block_4x4_rgb.d.ts.map +1 -0
  539. package/src/shade/renderer/texture/encode/chunk_astc_encode_block_4x4_rgb.js +310 -0
  540. package/src/shade/renderer/texture/encode/chunk_astc_pack_4x4_rgb.d.ts +17 -0
  541. package/src/shade/renderer/texture/encode/chunk_astc_pack_4x4_rgb.d.ts.map +1 -0
  542. package/src/shade/renderer/texture/encode/chunk_astc_pack_4x4_rgb.js +51 -0
  543. package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.d.ts +42 -0
  544. package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.d.ts.map +1 -0
  545. package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.js +375 -0
  546. package/src/shade/renderer/texture/encode/chunk_bc1_pack_block.d.ts +12 -0
  547. package/src/shade/renderer/texture/encode/chunk_bc1_pack_block.d.ts.map +1 -0
  548. package/src/shade/renderer/texture/encode/chunk_bc1_pack_block.js +24 -0
  549. package/src/shade/renderer/texture/encode/chunk_bc4_encode_block.d.ts +45 -0
  550. package/src/shade/renderer/texture/encode/chunk_bc4_encode_block.d.ts.map +1 -0
  551. package/src/shade/renderer/texture/encode/chunk_bc4_encode_block.js +348 -0
  552. package/src/shade/renderer/texture/encode/chunk_bc4_pack_block.d.ts +16 -0
  553. package/src/shade/renderer/texture/encode/chunk_bc4_pack_block.d.ts.map +1 -0
  554. package/src/shade/renderer/texture/encode/chunk_bc4_pack_block.js +33 -0
  555. package/src/shade/renderer/texture/encode/chunk_bc6h_encode_block_mode11.d.ts +32 -0
  556. package/src/shade/renderer/texture/encode/chunk_bc6h_encode_block_mode11.d.ts.map +1 -0
  557. package/src/shade/renderer/texture/encode/chunk_bc6h_encode_block_mode11.js +346 -0
  558. package/src/shade/renderer/texture/encode/chunk_bc6h_pack_mode11.d.ts +10 -0
  559. package/src/shade/renderer/texture/encode/chunk_bc6h_pack_mode11.d.ts.map +1 -0
  560. package/src/shade/renderer/texture/encode/chunk_bc6h_pack_mode11.js +54 -0
  561. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.d.ts +36 -0
  562. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.d.ts.map +1 -0
  563. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.js +327 -0
  564. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.d.ts +22 -0
  565. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.d.ts.map +1 -0
  566. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.js +71 -0
  567. package/src/shade/renderer/texture/encode/chunk_texture_encode_level.d.ts +20 -0
  568. package/src/shade/renderer/texture/encode/chunk_texture_encode_level.d.ts.map +1 -0
  569. package/src/shade/renderer/texture/encode/chunk_texture_encode_level.js +73 -0
  570. package/src/shade/renderer/texture/encode/chunk_texture_encode_load_block.d.ts +16 -0
  571. package/src/shade/renderer/texture/encode/chunk_texture_encode_load_block.d.ts.map +1 -0
  572. package/src/shade/renderer/texture/encode/chunk_texture_encode_load_block.js +36 -0
  573. package/src/shade/renderer/texture/encode/shader_texture_encode_astc_4x4.d.ts +13 -0
  574. package/src/shade/renderer/texture/encode/shader_texture_encode_astc_4x4.d.ts.map +1 -0
  575. package/src/shade/renderer/texture/encode/shader_texture_encode_astc_4x4.js +63 -0
  576. package/src/shade/renderer/texture/encode/shader_texture_encode_bc1.d.ts +12 -0
  577. package/src/shade/renderer/texture/encode/shader_texture_encode_bc1.d.ts.map +1 -0
  578. package/src/shade/renderer/texture/encode/shader_texture_encode_bc1.js +60 -0
  579. package/src/shade/renderer/texture/encode/shader_texture_encode_bc4.d.ts +28 -0
  580. package/src/shade/renderer/texture/encode/shader_texture_encode_bc4.d.ts.map +1 -0
  581. package/src/shade/renderer/texture/encode/shader_texture_encode_bc4.js +76 -0
  582. package/src/shade/renderer/texture/encode/shader_texture_encode_bc4_snorm.d.ts +16 -0
  583. package/src/shade/renderer/texture/encode/shader_texture_encode_bc4_snorm.d.ts.map +1 -0
  584. package/src/shade/renderer/texture/encode/shader_texture_encode_bc4_snorm.js +64 -0
  585. package/src/shade/renderer/texture/encode/shader_texture_encode_bc5.d.ts +14 -0
  586. package/src/shade/renderer/texture/encode/shader_texture_encode_bc5.d.ts.map +1 -0
  587. package/src/shade/renderer/texture/encode/shader_texture_encode_bc5.js +67 -0
  588. package/src/shade/renderer/texture/encode/shader_texture_encode_bc5_snorm.d.ts +10 -0
  589. package/src/shade/renderer/texture/encode/shader_texture_encode_bc5_snorm.d.ts.map +1 -0
  590. package/src/shade/renderer/texture/encode/shader_texture_encode_bc5_snorm.js +63 -0
  591. package/src/shade/renderer/texture/encode/shader_texture_encode_bc6h.d.ts +12 -0
  592. package/src/shade/renderer/texture/encode/shader_texture_encode_bc6h.d.ts.map +1 -0
  593. package/src/shade/renderer/texture/encode/shader_texture_encode_bc6h.js +62 -0
  594. package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.d.ts +14 -0
  595. package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.d.ts.map +1 -0
  596. package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.js +58 -0
  597. package/src/shade/renderer/texture/encode/texture_encode.d.ts +84 -0
  598. package/src/shade/renderer/texture/encode/texture_encode.d.ts.map +1 -0
  599. package/src/shade/renderer/texture/encode/texture_encode.js +168 -0
  600. package/src/shade/renderer/texture/encode/texture_encode_layout.d.ts +196 -0
  601. package/src/shade/renderer/texture/encode/texture_encode_layout.d.ts.map +1 -0
  602. package/src/shade/renderer/texture/encode/texture_encode_layout.js +248 -0
  603. package/src/shade/renderer/texture/encode/texture_encode_resources.d.ts +15 -0
  604. package/src/shade/renderer/texture/encode/texture_encode_resources.d.ts.map +1 -0
  605. package/src/shade/renderer/texture/encode/texture_encode_resources.js +25 -0
  606. package/src/shade/renderer/texture/encode/texture_encode_shader.d.ts +30 -0
  607. package/src/shade/renderer/texture/encode/texture_encode_shader.d.ts.map +1 -0
  608. package/src/shade/renderer/texture/encode/texture_encode_shader.js +108 -0
  609. package/src/shade/renderer/texture/format/gpu_texture_compression_support.d.ts +3 -1
  610. package/src/shade/renderer/texture/format/gpu_texture_compression_support.d.ts.map +1 -1
  611. package/src/shade/renderer/texture/format/gpu_texture_compression_support.js +8 -25
  612. package/src/shade/renderer/texture/format/texture_format_from_shade_image.d.ts.map +1 -1
  613. package/src/shade/renderer/texture/format/texture_format_from_shade_image.js +26 -2
  614. package/src/shade/renderer/texture/source/texel_data_from_ktx2.d.ts +32 -0
  615. package/src/shade/renderer/texture/source/texel_data_from_ktx2.d.ts.map +1 -0
  616. package/src/shade/renderer/texture/source/texel_data_from_ktx2.js +48 -0
  617. package/src/shade/renderer/texture/texture_write_level.d.ts.map +1 -1
  618. package/src/shade/renderer/texture/texture_write_level.js +11 -1
  619. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
  620. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +20 -0
  621. package/src/shade/renderer/volumetrics/NOTES.md +28 -0
  622. package/src/shade/renderer/volumetrics/taa/chunk_volumetric_history_bounding_box.d.ts.map +1 -1
  623. package/src/shade/renderer/volumetrics/taa/chunk_volumetric_history_bounding_box.js +7 -2
  624. package/src/shade/renderer/volumetrics/taa/chunk_volumetrics_taa_reproject.d.ts +17 -0
  625. package/src/shade/renderer/volumetrics/taa/chunk_volumetrics_taa_reproject.d.ts.map +1 -0
  626. package/src/shade/renderer/volumetrics/taa/chunk_volumetrics_taa_reproject.js +168 -0
  627. package/src/shade/renderer/volumetrics/taa/chunk_volumetrics_taa_resolve.d.ts +13 -0
  628. package/src/shade/renderer/volumetrics/taa/chunk_volumetrics_taa_resolve.d.ts.map +1 -0
  629. package/src/shade/renderer/volumetrics/taa/chunk_volumetrics_taa_resolve.js +56 -0
  630. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts.map +1 -1
  631. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js +134 -334
  632. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
  633. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +49 -21
  634. package/src/avif/encode_image_source.d.ts +0 -70
  635. package/src/avif/encode_image_source.d.ts.map +0 -1
  636. package/src/avif/encode_image_source.js +0 -117
  637. package/src/avif/encoder_worker.d.ts.map +0 -1
  638. package/src/avif/index.d.ts +0 -5
  639. package/src/avif/index.d.ts.map +0 -1
  640. package/src/avif/index.js +0 -21
  641. package/src/avif/native/DECISIONS.md +0 -545
  642. package/src/avif/native/api/AvifDecoder.d.ts.map +0 -1
  643. package/src/avif/native/api/apply_transformations.d.ts.map +0 -1
  644. package/src/avif/native/api/avif_to_sampler2d.d.ts +0 -25
  645. package/src/avif/native/api/avif_to_sampler2d.d.ts.map +0 -1
  646. package/src/avif/native/api/avif_to_sampler2d.js +0 -42
  647. package/src/avif/native/api/convert_to_rgba.d.ts.map +0 -1
  648. package/src/avif/native/api/convert_to_rgba.js +0 -204
  649. package/src/avif/native/api/decode_avif.d.ts.map +0 -1
  650. package/src/avif/native/api/decode_image_item.d.ts.map +0 -1
  651. package/src/avif/native/api/encode_avif.d.ts.map +0 -1
  652. package/src/avif/native/api/sampler2d_to_avif.d.ts.map +0 -1
  653. package/src/avif/native/api/sampler2d_to_avif.js +0 -108
  654. package/src/avif/native/av1/decode/Av1FrameContext.d.ts.map +0 -1
  655. package/src/avif/native/av1/decode/block_decoded.d.ts.map +0 -1
  656. package/src/avif/native/av1/decode/decode_av1_still.d.ts.map +0 -1
  657. package/src/avif/native/av1/decode/decode_coefficients.d.ts.map +0 -1
  658. package/src/avif/native/av1/decode/decode_palette.d.ts.map +0 -1
  659. package/src/avif/native/av1/decode/decode_palette.js +0 -442
  660. package/src/avif/native/av1/decode/decode_tile.d.ts.map +0 -1
  661. package/src/avif/native/av1/decode/decode_tile.js +0 -1213
  662. package/src/avif/native/av1/decode/get_scan.d.ts.map +0 -1
  663. package/src/avif/native/av1/decode/read_lr.d.ts.map +0 -1
  664. package/src/avif/native/av1/decode/read_lr.js +0 -277
  665. package/src/avif/native/av1/decode/read_transform_type.d.ts.map +0 -1
  666. package/src/avif/native/av1/decode/read_transform_type.js +0 -92
  667. package/src/avif/native/av1/decode/reconstruct.d.ts.map +0 -1
  668. package/src/avif/native/av1/decode/reconstruct.js +0 -241
  669. package/src/avif/native/av1/decode/transform_type.d.ts.map +0 -1
  670. package/src/avif/native/av1/encode/Av1BlockSnapshot.d.ts.map +0 -1
  671. package/src/avif/native/av1/encode/Av1EncodeContext.d.ts.map +0 -1
  672. package/src/avif/native/av1/encode/build_headers.d.ts.map +0 -1
  673. package/src/avif/native/av1/encode/choose_chroma_alpha.d.ts.map +0 -1
  674. package/src/avif/native/av1/encode/choose_filters.d.ts.map +0 -1
  675. package/src/avif/native/av1/encode/choose_restoration.d.ts.map +0 -1
  676. package/src/avif/native/av1/encode/choose_restoration.js +0 -616
  677. package/src/avif/native/av1/encode/decode_effort.d.ts.map +0 -1
  678. package/src/avif/native/av1/encode/encode_av1_still.d.ts.map +0 -1
  679. package/src/avif/native/av1/encode/encode_effort.d.ts.map +0 -1
  680. package/src/avif/native/av1/encode/encode_tile.d.ts.map +0 -1
  681. package/src/avif/native/av1/encode/encode_tile.js +0 -2331
  682. package/src/avif/native/av1/encode/quantise.d.ts.map +0 -1
  683. package/src/avif/native/av1/encode/write_coefficients.d.ts.map +0 -1
  684. package/src/avif/native/av1/encode/write_lr.d.ts.map +0 -1
  685. package/src/avif/native/av1/encode/write_transform_type.d.ts.map +0 -1
  686. package/src/avif/native/av1/entropy/CdfContext.d.ts.map +0 -1
  687. package/src/avif/native/av1/entropy/SymbolReader.d.ts.map +0 -1
  688. package/src/avif/native/av1/entropy/SymbolWriter.d.ts.map +0 -1
  689. package/src/avif/native/av1/entropy/coefficient_context.d.ts.map +0 -1
  690. package/src/avif/native/av1/entropy/partition_cdf.d.ts.map +0 -1
  691. package/src/avif/native/av1/entropy/symbol_cost.d.ts.map +0 -1
  692. package/src/avif/native/av1/filter/cdef.d.ts.map +0 -1
  693. package/src/avif/native/av1/filter/cdef.js +0 -313
  694. package/src/avif/native/av1/filter/loop_filter.d.ts.map +0 -1
  695. package/src/avif/native/av1/filter/loop_filter.js +0 -377
  696. package/src/avif/native/av1/filter/loop_restoration.d.ts.map +0 -1
  697. package/src/avif/native/av1/filter/loop_restoration.js +0 -451
  698. package/src/avif/native/av1/filter/superres.d.ts.map +0 -1
  699. package/src/avif/native/av1/filter/superres.js +0 -86
  700. package/src/avif/native/av1/grain/FilmGrainState.d.ts.map +0 -1
  701. package/src/avif/native/av1/grain/film_grain.d.ts.map +0 -1
  702. package/src/avif/native/av1/grain/film_grain.js +0 -623
  703. package/src/avif/native/av1/obu/FrameHeader.d.ts.map +0 -1
  704. package/src/avif/native/av1/obu/ObuHeader.d.ts.map +0 -1
  705. package/src/avif/native/av1/obu/SequenceHeader.d.ts.map +0 -1
  706. package/src/avif/native/av1/obu/for_each_obu.d.ts.map +0 -1
  707. package/src/avif/native/av1/obu/parse_frame_header.d.ts.map +0 -1
  708. package/src/avif/native/av1/obu/parse_frame_header.js +0 -841
  709. package/src/avif/native/av1/obu/parse_obu_header.d.ts.map +0 -1
  710. package/src/avif/native/av1/obu/parse_sequence_header.d.ts.map +0 -1
  711. package/src/avif/native/av1/obu/write_frame_header.d.ts.map +0 -1
  712. package/src/avif/native/av1/obu/write_sequence_header.d.ts.map +0 -1
  713. package/src/avif/native/av1/predict/IntraPredictionState.d.ts.map +0 -1
  714. package/src/avif/native/av1/predict/intra_filter_type.d.ts.map +0 -1
  715. package/src/avif/native/av1/predict/predict_chroma_from_luma.d.ts.map +0 -1
  716. package/src/avif/native/av1/predict/predict_chroma_from_luma.js +0 -153
  717. package/src/avif/native/av1/predict/predict_intra.d.ts.map +0 -1
  718. package/src/avif/native/av1/predict/predict_intra.js +0 -803
  719. package/src/avif/native/av1/predict/predict_palette.d.ts.map +0 -1
  720. package/src/avif/native/av1/tables/av1_symbols.d.ts.map +0 -1
  721. package/src/avif/native/av1/tables/av1_symbols.js +0 -419
  722. package/src/avif/native/av1/tables/block_tables.d.ts.map +0 -1
  723. package/src/avif/native/av1/tables/block_tables.js +0 -270
  724. package/src/avif/native/av1/tables/cdf_tables.d.ts.map +0 -1
  725. package/src/avif/native/av1/tables/cdf_tables.js +0 -1893
  726. package/src/avif/native/av1/tables/coefficient_tables.d.ts.map +0 -1
  727. package/src/avif/native/av1/tables/coefficient_tables.js +0 -82
  728. package/src/avif/native/av1/tables/derived_block_tables.d.ts.map +0 -1
  729. package/src/avif/native/av1/tables/filter_tables.d.ts.map +0 -1
  730. package/src/avif/native/av1/tables/filter_tables.js +0 -313
  731. package/src/avif/native/av1/tables/grain_tables.d.ts.map +0 -1
  732. package/src/avif/native/av1/tables/grain_tables.js +0 -190
  733. package/src/avif/native/av1/tables/prediction_tables.d.ts.map +0 -1
  734. package/src/avif/native/av1/tables/prediction_tables.js +0 -223
  735. package/src/avif/native/av1/tables/quantizer_matrix_tables.d.ts.map +0 -1
  736. package/src/avif/native/av1/tables/quantizer_matrix_tables.js +0 -38
  737. package/src/avif/native/av1/tables/quantizer_tables.d.ts.map +0 -1
  738. package/src/avif/native/av1/tables/quantizer_tables.js +0 -160
  739. package/src/avif/native/av1/tables/scan_tables.d.ts.map +0 -1
  740. package/src/avif/native/av1/tables/scan_tables.js +0 -727
  741. package/src/avif/native/av1/tables/segmentation_tables.d.ts.map +0 -1
  742. package/src/avif/native/av1/tables/segmentation_tables.js +0 -48
  743. package/src/avif/native/av1/tables/transform_tables.d.ts.map +0 -1
  744. package/src/avif/native/av1/tables/transform_tables.js +0 -140
  745. package/src/avif/native/av1/tables/unpack_table.d.ts.map +0 -1
  746. package/src/avif/native/av1/tables/unpack_table.js +0 -73
  747. package/src/avif/native/av1/transform/forward_transform_2d.d.ts.map +0 -1
  748. package/src/avif/native/av1/transform/inverse_transform_1d.d.ts.map +0 -1
  749. package/src/avif/native/av1/transform/inverse_transform_1d.js +0 -590
  750. package/src/avif/native/av1/transform/inverse_transform_2d.d.ts.map +0 -1
  751. package/src/avif/native/av1/transform/inverse_transform_2d.js +0 -180
  752. package/src/avif/native/av1/util/ceil_log2.d.ts.map +0 -1
  753. package/src/avif/native/av1/util/floor_log2.d.ts +0 -20
  754. package/src/avif/native/av1/util/floor_log2.d.ts.map +0 -1
  755. package/src/avif/native/av1/util/floor_log2.js +0 -20
  756. package/src/avif/native/av1/util/round2.d.ts.map +0 -1
  757. package/src/avif/native/av1/util/round2_signed.d.ts.map +0 -1
  758. package/src/avif/native/av1/util/tile_log2.d.ts.map +0 -1
  759. package/src/avif/native/bitstream/BitReader.d.ts.map +0 -1
  760. package/src/avif/native/bitstream/BitWriter.d.ts.map +0 -1
  761. package/src/avif/native/color/ColourTransform.d.ts.map +0 -1
  762. package/src/avif/native/color/YuvImage.d.ts.map +0 -1
  763. package/src/avif/native/color/clamp_sample.d.ts.map +0 -1
  764. package/src/avif/native/color/linear_to_transfer.d.ts.map +0 -1
  765. package/src/avif/native/color/linear_to_transfer.js +0 -126
  766. package/src/avif/native/color/primaries.d.ts.map +0 -1
  767. package/src/avif/native/color/rgb_row_to_ycbcr.d.ts.map +0 -1
  768. package/src/avif/native/color/transfer_to_linear.d.ts.map +0 -1
  769. package/src/avif/native/color/transfer_to_linear.js +0 -171
  770. package/src/avif/native/color/upsample_chroma_row.d.ts.map +0 -1
  771. package/src/avif/native/color/upsample_chroma_row.js +0 -89
  772. package/src/avif/native/color/ycbcr_row_to_rgb.d.ts.map +0 -1
  773. package/src/avif/native/color/ycbcr_row_to_rgb.js +0 -78
  774. package/src/avif/native/heif/AvifFile.d.ts.map +0 -1
  775. package/src/avif/native/heif/ItemProperty.d.ts.map +0 -1
  776. package/src/avif/native/heif/find_item_property.d.ts.map +0 -1
  777. package/src/avif/native/heif/find_item_references.d.ts.map +0 -1
  778. package/src/avif/native/heif/find_items_referencing.d.ts.map +0 -1
  779. package/src/avif/native/heif/parse_avif_file.d.ts.map +0 -1
  780. package/src/avif/native/heif/parse_avif_file.js +0 -384
  781. package/src/avif/native/heif/parse_image_grid.d.ts.map +0 -1
  782. package/src/avif/native/heif/parse_image_grid.js +0 -49
  783. package/src/avif/native/heif/parse_item_property.d.ts.map +0 -1
  784. package/src/avif/native/heif/read_item_data.d.ts.map +0 -1
  785. package/src/avif/native/heif/write_avif_file.d.ts.map +0 -1
  786. package/src/avif/native/heif/write_item_property.d.ts.map +0 -1
  787. package/src/avif/native/index.d.ts +0 -14
  788. package/src/avif/native/index.d.ts.map +0 -1
  789. package/src/avif/native/index.js +0 -56
  790. package/src/avif/native/isobmff/BoxHeader.d.ts.map +0 -1
  791. package/src/avif/native/isobmff/BoxWriter.d.ts +0 -118
  792. package/src/avif/native/isobmff/BoxWriter.d.ts.map +0 -1
  793. package/src/avif/native/isobmff/BoxWriter.js +0 -264
  794. package/src/avif/native/isobmff/for_each_box.d.ts.map +0 -1
  795. package/src/avif/native/isobmff/read_box_header.d.ts.map +0 -1
  796. package/src/avif/native/isobmff/read_full_box_header.d.ts.map +0 -1
  797. package/src/avif/threaded_image_encoder.d.ts.map +0 -1
  798. package/src/basis/BasisBitReader.d.ts +0 -77
  799. package/src/basis/BasisBitReader.d.ts.map +0 -1
  800. package/src/basis/BasisBitReader.js +0 -231
  801. package/src/basis/BasisHuffmanTable.d.ts.map +0 -1
  802. package/src/basis/basis_read_huffman_table.d.ts.map +0 -1
  803. package/src/basis/etc1s/Etc1sSelectorHistory.d.ts.map +0 -1
  804. package/src/basis/etc1s/etc1s_block_colors.d.ts.map +0 -1
  805. package/src/basis/etc1s/etc1s_decode_slice.d.ts.map +0 -1
  806. package/src/basis/etc1s/etc1s_decode_slice.js +0 -258
  807. package/src/basis/etc1s/etc1s_read_endpoint_codebook.d.ts.map +0 -1
  808. package/src/basis/etc1s/etc1s_read_selector_codebook.d.ts.map +0 -1
  809. package/src/basis/etc1s/etc1s_read_slice_tables.d.ts.map +0 -1
  810. package/src/basis/transcode/etc1s_to_bc1.d.ts +0 -24
  811. package/src/basis/transcode/etc1s_to_bc1.d.ts.map +0 -1
  812. package/src/basis/transcode/etc1s_to_bc1.js +0 -205
  813. package/src/basis/transcode/etc1s_to_bc7.d.ts +0 -30
  814. package/src/basis/transcode/etc1s_to_bc7.d.ts.map +0 -1
  815. package/src/basis/transcode/fit_endpoints.d.ts +0 -59
  816. package/src/basis/transcode/fit_endpoints.d.ts.map +0 -1
  817. package/src/basis/transcode/fit_endpoints.js +0 -226
  818. package/src/engine/asset/loaders/gltf/computeObjectBoundingSphere.d.ts +0 -8
  819. package/src/engine/asset/loaders/gltf/computeObjectBoundingSphere.d.ts.map +0 -1
  820. package/src/engine/asset/loaders/gltf/computeObjectBoundingSphere.js +0 -70
  821. package/src/engine/asset/loaders/gltf/isMesh.d.ts +0 -7
  822. package/src/engine/asset/loaders/gltf/isMesh.d.ts.map +0 -1
  823. package/src/engine/asset/loaders/gltf/isMesh.js +0 -8
  824. package/src/engine/asset/loaders/image/jpeg/JpegFrame.d.ts.map +0 -1
  825. package/src/engine/asset/loaders/image/jpeg/JpegFrameComponent.d.ts.map +0 -1
  826. package/src/engine/asset/loaders/image/jpeg/JpegImage.d.ts.map +0 -1
  827. package/src/engine/asset/loaders/image/jpeg/JpegImage.js +0 -664
  828. package/src/engine/asset/loaders/image/jpeg/buildComponentData.d.ts.map +0 -1
  829. package/src/engine/asset/loaders/image/jpeg/buildHuffmanTable.d.ts.map +0 -1
  830. package/src/engine/asset/loaders/image/jpeg/decodeScan.d.ts.map +0 -1
  831. package/src/engine/asset/loaders/image/jpeg/idct8x8_float.d.ts.map +0 -1
  832. package/src/engine/asset/loaders/image/jpeg/idct8x8_float.js +0 -31
  833. package/src/engine/asset/loaders/image/jpeg/jpeg_component_row.d.ts.map +0 -1
  834. package/src/engine/asset/loaders/image/jpeg/jpeg_decode.d.ts.map +0 -1
  835. package/src/engine/asset/loaders/image/png/PNG.d.ts.map +0 -1
  836. package/src/engine/asset/loaders/image/png/PNGReader.d.ts +0 -158
  837. package/src/engine/asset/loaders/image/png/PNGReader.d.ts.map +0 -1
  838. package/src/engine/asset/loaders/image/png/PNGReader.js +0 -656
  839. package/src/engine/asset/loaders/image/png/PNG_HEADER_BYTES.d.ts.map +0 -1
  840. package/src/engine/asset/loaders/image/png/chunk/png_chunk_decode_iTXt.d.ts.map +0 -1
  841. package/src/engine/asset/loaders/image/png/chunk/png_chunk_decode_iTXt.js +0 -53
  842. package/src/engine/asset/loaders/image/png/chunk/png_chunk_decode_zTXt.d.ts.map +0 -1
  843. package/src/engine/asset/loaders/image/png/chunk/png_chunk_decode_zTXt.js +0 -42
  844. package/src/engine/asset/loaders/image/png/crc32.d.ts +0 -2
  845. package/src/engine/asset/loaders/image/png/crc32.d.ts.map +0 -1
  846. package/src/engine/asset/loaders/image/png/crc32.js +0 -8
  847. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterAverage.d.ts.map +0 -1
  848. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterNone.d.ts.map +0 -1
  849. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterPaeth.d.ts.map +0 -1
  850. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterSub.d.ts.map +0 -1
  851. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterUp.d.ts.map +0 -1
  852. package/src/engine/asset/loaders/image/png/filter/png_unfilter.d.ts.map +0 -1
  853. package/src/engine/asset/loaders/image/png/filter/png_unfilter.js +0 -68
  854. package/src/engine/asset/loaders/image/png/png_inflate.d.ts.map +0 -1
  855. package/src/engine/asset/loaders/image/png/png_unpack_samples.d.ts.map +0 -1
  856. package/src/engine/asset/loaders/image/png/prototypePNG.d.ts.map +0 -1
  857. package/src/engine/asset/loaders/image/png/prototypePNG.js +0 -37
  858. package/src/ktx2/KTX2_IDENTIFIER.d.ts.map +0 -1
  859. package/src/ktx2/KhrDfModel.d.ts.map +0 -1
  860. package/src/ktx2/SupercompressionScheme.d.ts.map +0 -1
  861. package/src/ktx2/ktx2_read.d.ts +0 -71
  862. package/src/ktx2/ktx2_read.d.ts.map +0 -1
  863. package/src/ktx2/ktx2_read.js +0 -581
  864. package/src/ktx2/ktx2_read_basis_lz_global_data.d.ts +0 -27
  865. package/src/ktx2/ktx2_read_basis_lz_global_data.d.ts.map +0 -1
  866. package/src/ktx2/ktx2_read_basis_lz_global_data.js +0 -189
  867. package/src/ktx2/vk_format_to_texture_format.d.ts +0 -55
  868. package/src/ktx2/vk_format_to_texture_format.d.ts.map +0 -1
  869. package/src/ktx2/vk_format_to_texture_format.js +0 -290
  870. package/src/shade/renderer/geometry/bvh/record_blas_refit.d.ts +0 -25
  871. package/src/shade/renderer/geometry/bvh/record_blas_refit.d.ts.map +0 -1
  872. package/src/shade/renderer/geometry/bvh/record_blas_refit.js +0 -102
  873. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.d.ts +0 -30
  874. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.d.ts.map +0 -1
  875. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.js +0 -125
  876. package/src/shade/renderer/loader/gltf/GLTF_PRIMITIVE_MODE.d.ts.map +0 -1
  877. package/src/shade/renderer/loader/gltf/MESHOPT_COMPRESSION_PLAN.md +0 -793
  878. package/src/shade/renderer/loader/gltf/coalesce_array_duplicates.d.ts.map +0 -1
  879. package/src/shade/renderer/loader/gltf/ext/GltfBufferViewExtension.d.ts.map +0 -1
  880. package/src/shade/renderer/loader/gltf/ext/GltfBufferViewExtensionSet.d.ts.map +0 -1
  881. package/src/shade/renderer/loader/gltf/ext/GltfBufferViewExtensionSet.js +0 -109
  882. package/src/shade/renderer/loader/gltf/ext/gltf_apply_buffer_view_extensions.d.ts.map +0 -1
  883. package/src/shade/renderer/loader/gltf/ext/gltf_buffer_view_extensions.d.ts.map +0 -1
  884. package/src/shade/renderer/loader/gltf/ext/gltf_geometry_extensions.d.ts.map +0 -1
  885. package/src/shade/renderer/loader/gltf/ext/meshopt/MeshoptBufferViewExtension.d.ts.map +0 -1
  886. package/src/shade/renderer/loader/gltf/ext/meshopt/MeshoptBufferViewExtension.js +0 -301
  887. package/src/shade/renderer/loader/gltf/gltf_component_type.d.ts.map +0 -1
  888. package/src/shade/renderer/loader/gltf/gltf_node_world_matrices.d.ts.map +0 -1
  889. package/src/shade/renderer/loader/gltf/gltf_node_world_matrices.js +0 -137
  890. package/src/shade/renderer/loader/gltf/gltf_parse_container.d.ts.map +0 -1
  891. package/src/shade/renderer/loader/gltf/gltf_read_accessor.d.ts.map +0 -1
  892. package/src/shade/renderer/loader/gltf/gltf_read_accessor.js +0 -294
  893. package/src/shade/renderer/loader/gltf/gltf_used_image_indices.d.ts +0 -25
  894. package/src/shade/renderer/loader/gltf/gltf_used_image_indices.d.ts.map +0 -1
  895. package/src/shade/renderer/loader/gltf/gltf_used_image_indices.js +0 -49
  896. package/src/shade/renderer/loader/usd/UsdError.d.ts.map +0 -1
  897. package/src/shade/renderer/loader/usd/parse_usda.d.ts.map +0 -1
  898. package/src/shade/renderer/loader/usd/unpack_usdz.d.ts.map +0 -1
  899. package/src/shade/renderer/loader/usd/unpack_usdz.js +0 -106
  900. package/src/shade/renderer/loader/usd/usd_compose_transform.d.ts.map +0 -1
  901. package/src/shade/renderer/loader/usd/usd_compose_transform.js +0 -258
  902. package/src/shade/renderer/loader/usd/usd_lz4.d.ts.map +0 -1
  903. package/src/shade/renderer/loader/usd/usd_lz4.js +0 -182
  904. package/src/shade/renderer/loader/usd/usd_triangulate.d.ts.map +0 -1
  905. package/src/shade/renderer/postprocess/taa/chunk_taa_sample_history_color.d.ts +0 -2
  906. package/src/shade/renderer/postprocess/taa/chunk_taa_sample_history_color.d.ts.map +0 -1
  907. package/src/shade/renderer/postprocess/taa/chunk_taa_sample_history_color.js +0 -43
  908. package/src/shade/renderer/scene/optimization/sampler2d_compare.d.ts.map +0 -1
  909. package/src/shade/renderer/scene/optimization/sampler2d_compare.js +0 -94
  910. /package/src/{avif → engine/asset/loaders/image/avif}/encoder_worker.d.ts +0 -0
  911. /package/src/{avif → engine/asset/loaders/image/avif}/encoder_worker.js +0 -0
  912. /package/src/{avif → engine/asset/loaders/image/avif}/threaded_image_encoder.d.ts +0 -0
  913. /package/src/{avif → engine/asset/loaders/image/avif}/threaded_image_encoder.js +0 -0
  914. /package/src/engine/asset/loaders/image/{png/prototypePNG.d.ts → prototypePNG.d.ts} +0 -0
  915. /package/src/{shade/renderer/scene/optimization → engine/graphics/texture/sampler/compare}/sampler2d_compare.d.ts +0 -0
  916. /package/src/{avif/native/api → engine/graphics/texture/sampler}/sampler2d_to_avif.d.ts +0 -0
  917. /package/src/{avif/native → format/image/avif}/NOTICE.md +0 -0
  918. /package/src/{avif/native → format/image/avif}/api/AvifDecoder.d.ts +0 -0
  919. /package/src/{avif/native → format/image/avif}/api/AvifDecoder.js +0 -0
  920. /package/src/{avif/native → format/image/avif}/api/apply_transformations.d.ts +0 -0
  921. /package/src/{avif/native → format/image/avif}/api/apply_transformations.js +0 -0
  922. /package/src/{avif/native → format/image/avif}/api/convert_to_rgba.d.ts +0 -0
  923. /package/src/{avif/native → format/image/avif}/api/decode_avif.d.ts +0 -0
  924. /package/src/{avif/native → format/image/avif}/api/decode_avif.js +0 -0
  925. /package/src/{avif/native → format/image/avif}/api/decode_image_item.d.ts +0 -0
  926. /package/src/{avif/native → format/image/avif}/api/decode_image_item.js +0 -0
  927. /package/src/{avif/native → format/image/avif}/api/encode_avif.d.ts +0 -0
  928. /package/src/{avif/native → format/image/avif}/api/encode_avif.js +0 -0
  929. /package/src/{avif/native → format/image/avif}/av1/decode/Av1FrameContext.d.ts +0 -0
  930. /package/src/{avif/native → format/image/avif}/av1/decode/Av1FrameContext.js +0 -0
  931. /package/src/{avif/native → format/image/avif}/av1/decode/block_decoded.d.ts +0 -0
  932. /package/src/{avif/native → format/image/avif}/av1/decode/block_decoded.js +0 -0
  933. /package/src/{avif/native → format/image/avif}/av1/decode/decode_av1_still.d.ts +0 -0
  934. /package/src/{avif/native → format/image/avif}/av1/decode/decode_av1_still.js +0 -0
  935. /package/src/{avif/native → format/image/avif}/av1/decode/decode_coefficients.d.ts +0 -0
  936. /package/src/{avif/native → format/image/avif}/av1/decode/decode_coefficients.js +0 -0
  937. /package/src/{avif/native → format/image/avif}/av1/decode/decode_palette.d.ts +0 -0
  938. /package/src/{avif/native → format/image/avif}/av1/decode/decode_tile.d.ts +0 -0
  939. /package/src/{avif/native → format/image/avif}/av1/decode/get_scan.d.ts +0 -0
  940. /package/src/{avif/native → format/image/avif}/av1/decode/get_scan.js +0 -0
  941. /package/src/{avif/native → format/image/avif}/av1/decode/read_lr.d.ts +0 -0
  942. /package/src/{avif/native → format/image/avif}/av1/decode/read_transform_type.d.ts +0 -0
  943. /package/src/{avif/native → format/image/avif}/av1/decode/reconstruct.d.ts +0 -0
  944. /package/src/{avif/native → format/image/avif}/av1/decode/transform_type.d.ts +0 -0
  945. /package/src/{avif/native → format/image/avif}/av1/decode/transform_type.js +0 -0
  946. /package/src/{avif/native → format/image/avif}/av1/encode/Av1BlockSnapshot.d.ts +0 -0
  947. /package/src/{avif/native → format/image/avif}/av1/encode/Av1BlockSnapshot.js +0 -0
  948. /package/src/{avif/native → format/image/avif}/av1/encode/Av1EncodeContext.d.ts +0 -0
  949. /package/src/{avif/native → format/image/avif}/av1/encode/Av1EncodeContext.js +0 -0
  950. /package/src/{avif/native → format/image/avif}/av1/encode/build_headers.d.ts +0 -0
  951. /package/src/{avif/native → format/image/avif}/av1/encode/build_headers.js +0 -0
  952. /package/src/{avif/native → format/image/avif}/av1/encode/choose_chroma_alpha.d.ts +0 -0
  953. /package/src/{avif/native → format/image/avif}/av1/encode/choose_chroma_alpha.js +0 -0
  954. /package/src/{avif/native → format/image/avif}/av1/encode/choose_filters.d.ts +0 -0
  955. /package/src/{avif/native → format/image/avif}/av1/encode/choose_filters.js +0 -0
  956. /package/src/{avif/native → format/image/avif}/av1/encode/choose_restoration.d.ts +0 -0
  957. /package/src/{avif/native → format/image/avif}/av1/encode/decode_effort.d.ts +0 -0
  958. /package/src/{avif/native → format/image/avif}/av1/encode/decode_effort.js +0 -0
  959. /package/src/{avif/native → format/image/avif}/av1/encode/encode_av1_still.d.ts +0 -0
  960. /package/src/{avif/native → format/image/avif}/av1/encode/encode_av1_still.js +0 -0
  961. /package/src/{avif/native → format/image/avif}/av1/encode/encode_effort.d.ts +0 -0
  962. /package/src/{avif/native → format/image/avif}/av1/encode/encode_effort.js +0 -0
  963. /package/src/{avif/native → format/image/avif}/av1/encode/encode_tile.d.ts +0 -0
  964. /package/src/{avif/native → format/image/avif}/av1/encode/quantise.d.ts +0 -0
  965. /package/src/{avif/native → format/image/avif}/av1/encode/quantise.js +0 -0
  966. /package/src/{avif/native → format/image/avif}/av1/encode/write_coefficients.d.ts +0 -0
  967. /package/src/{avif/native → format/image/avif}/av1/encode/write_coefficients.js +0 -0
  968. /package/src/{avif/native → format/image/avif}/av1/encode/write_lr.d.ts +0 -0
  969. /package/src/{avif/native → format/image/avif}/av1/encode/write_lr.js +0 -0
  970. /package/src/{avif/native → format/image/avif}/av1/encode/write_transform_type.d.ts +0 -0
  971. /package/src/{avif/native → format/image/avif}/av1/encode/write_transform_type.js +0 -0
  972. /package/src/{avif/native → format/image/avif}/av1/entropy/CdfContext.d.ts +0 -0
  973. /package/src/{avif/native → format/image/avif}/av1/entropy/CdfContext.js +0 -0
  974. /package/src/{avif/native → format/image/avif}/av1/entropy/SymbolReader.d.ts +0 -0
  975. /package/src/{avif/native → format/image/avif}/av1/entropy/SymbolReader.js +0 -0
  976. /package/src/{avif/native → format/image/avif}/av1/entropy/SymbolWriter.d.ts +0 -0
  977. /package/src/{avif/native → format/image/avif}/av1/entropy/SymbolWriter.js +0 -0
  978. /package/src/{avif/native → format/image/avif}/av1/entropy/coefficient_context.d.ts +0 -0
  979. /package/src/{avif/native → format/image/avif}/av1/entropy/coefficient_context.js +0 -0
  980. /package/src/{avif/native → format/image/avif}/av1/entropy/partition_cdf.d.ts +0 -0
  981. /package/src/{avif/native → format/image/avif}/av1/entropy/partition_cdf.js +0 -0
  982. /package/src/{avif/native → format/image/avif}/av1/entropy/symbol_cost.d.ts +0 -0
  983. /package/src/{avif/native → format/image/avif}/av1/entropy/symbol_cost.js +0 -0
  984. /package/src/{avif/native → format/image/avif}/av1/filter/cdef.d.ts +0 -0
  985. /package/src/{avif/native → format/image/avif}/av1/filter/loop_filter.d.ts +0 -0
  986. /package/src/{avif/native → format/image/avif}/av1/filter/loop_restoration.d.ts +0 -0
  987. /package/src/{avif/native → format/image/avif}/av1/filter/superres.d.ts +0 -0
  988. /package/src/{avif/native → format/image/avif}/av1/grain/FilmGrainState.d.ts +0 -0
  989. /package/src/{avif/native → format/image/avif}/av1/grain/FilmGrainState.js +0 -0
  990. /package/src/{avif/native → format/image/avif}/av1/grain/film_grain.d.ts +0 -0
  991. /package/src/{avif/native → format/image/avif}/av1/obu/FrameHeader.d.ts +0 -0
  992. /package/src/{avif/native → format/image/avif}/av1/obu/FrameHeader.js +0 -0
  993. /package/src/{avif/native → format/image/avif}/av1/obu/ObuHeader.d.ts +0 -0
  994. /package/src/{avif/native → format/image/avif}/av1/obu/ObuHeader.js +0 -0
  995. /package/src/{avif/native → format/image/avif}/av1/obu/SequenceHeader.d.ts +0 -0
  996. /package/src/{avif/native → format/image/avif}/av1/obu/SequenceHeader.js +0 -0
  997. /package/src/{avif/native → format/image/avif}/av1/obu/for_each_obu.d.ts +0 -0
  998. /package/src/{avif/native → format/image/avif}/av1/obu/for_each_obu.js +0 -0
  999. /package/src/{avif/native → format/image/avif}/av1/obu/parse_frame_header.d.ts +0 -0
  1000. /package/src/{avif/native → format/image/avif}/av1/obu/parse_obu_header.d.ts +0 -0
  1001. /package/src/{avif/native → format/image/avif}/av1/obu/parse_obu_header.js +0 -0
  1002. /package/src/{avif/native → format/image/avif}/av1/obu/parse_sequence_header.d.ts +0 -0
  1003. /package/src/{avif/native → format/image/avif}/av1/obu/parse_sequence_header.js +0 -0
  1004. /package/src/{avif/native → format/image/avif}/av1/obu/write_frame_header.d.ts +0 -0
  1005. /package/src/{avif/native → format/image/avif}/av1/obu/write_frame_header.js +0 -0
  1006. /package/src/{avif/native → format/image/avif}/av1/obu/write_sequence_header.d.ts +0 -0
  1007. /package/src/{avif/native → format/image/avif}/av1/obu/write_sequence_header.js +0 -0
  1008. /package/src/{avif/native → format/image/avif}/av1/predict/IntraPredictionState.d.ts +0 -0
  1009. /package/src/{avif/native → format/image/avif}/av1/predict/IntraPredictionState.js +0 -0
  1010. /package/src/{avif/native → format/image/avif}/av1/predict/intra_filter_type.d.ts +0 -0
  1011. /package/src/{avif/native → format/image/avif}/av1/predict/intra_filter_type.js +0 -0
  1012. /package/src/{avif/native → format/image/avif}/av1/predict/predict_chroma_from_luma.d.ts +0 -0
  1013. /package/src/{avif/native → format/image/avif}/av1/predict/predict_intra.d.ts +0 -0
  1014. /package/src/{avif/native → format/image/avif}/av1/predict/predict_palette.d.ts +0 -0
  1015. /package/src/{avif/native → format/image/avif}/av1/predict/predict_palette.js +0 -0
  1016. /package/src/{avif/native → format/image/avif}/av1/tables/av1_symbols.d.ts +0 -0
  1017. /package/src/{avif/native → format/image/avif}/av1/tables/block_tables.d.ts +0 -0
  1018. /package/src/{avif/native → format/image/avif}/av1/tables/cdf_tables.d.ts +0 -0
  1019. /package/src/{avif/native → format/image/avif}/av1/tables/coefficient_tables.d.ts +0 -0
  1020. /package/src/{avif/native → format/image/avif}/av1/tables/derived_block_tables.d.ts +0 -0
  1021. /package/src/{avif/native → format/image/avif}/av1/tables/derived_block_tables.js +0 -0
  1022. /package/src/{avif/native → format/image/avif}/av1/tables/filter_tables.d.ts +0 -0
  1023. /package/src/{avif/native → format/image/avif}/av1/tables/grain_tables.d.ts +0 -0
  1024. /package/src/{avif/native → format/image/avif}/av1/tables/prediction_tables.d.ts +0 -0
  1025. /package/src/{avif/native → format/image/avif}/av1/tables/quantizer_matrix_tables.d.ts +0 -0
  1026. /package/src/{avif/native → format/image/avif}/av1/tables/quantizer_tables.d.ts +0 -0
  1027. /package/src/{avif/native → format/image/avif}/av1/tables/scan_tables.d.ts +0 -0
  1028. /package/src/{avif/native → format/image/avif}/av1/tables/segmentation_tables.d.ts +0 -0
  1029. /package/src/{avif/native → format/image/avif}/av1/tables/transform_tables.d.ts +0 -0
  1030. /package/src/{avif/native → format/image/avif}/av1/tables/unpack_table.d.ts +0 -0
  1031. /package/src/{avif/native → format/image/avif}/av1/transform/forward_transform_2d.d.ts +0 -0
  1032. /package/src/{avif/native → format/image/avif}/av1/transform/forward_transform_2d.js +0 -0
  1033. /package/src/{avif/native → format/image/avif}/av1/transform/inverse_transform_1d.d.ts +0 -0
  1034. /package/src/{avif/native → format/image/avif}/av1/transform/inverse_transform_2d.d.ts +0 -0
  1035. /package/src/{avif/native → format/image/avif}/av1/util/ceil_log2.d.ts +0 -0
  1036. /package/src/{avif/native → format/image/avif}/av1/util/ceil_log2.js +0 -0
  1037. /package/src/{avif/native → format/image/avif}/av1/util/round2.d.ts +0 -0
  1038. /package/src/{avif/native → format/image/avif}/av1/util/round2.js +0 -0
  1039. /package/src/{avif/native → format/image/avif}/av1/util/round2_signed.d.ts +0 -0
  1040. /package/src/{avif/native → format/image/avif}/av1/util/round2_signed.js +0 -0
  1041. /package/src/{avif/native → format/image/avif}/av1/util/tile_log2.d.ts +0 -0
  1042. /package/src/{avif/native → format/image/avif}/av1/util/tile_log2.js +0 -0
  1043. /package/src/{avif/native → format/image/avif}/bitstream/BitReader.d.ts +0 -0
  1044. /package/src/{avif/native → format/image/avif}/bitstream/BitReader.js +0 -0
  1045. /package/src/{avif/native → format/image/avif}/bitstream/BitWriter.d.ts +0 -0
  1046. /package/src/{avif/native → format/image/avif}/bitstream/BitWriter.js +0 -0
  1047. /package/src/{avif/native → format/image/avif}/color/ColourTransform.d.ts +0 -0
  1048. /package/src/{avif/native → format/image/avif}/color/ColourTransform.js +0 -0
  1049. /package/src/{avif/native → format/image/avif}/color/YuvImage.d.ts +0 -0
  1050. /package/src/{avif/native → format/image/avif}/color/YuvImage.js +0 -0
  1051. /package/src/{avif/native → format/image/avif}/color/clamp_sample.d.ts +0 -0
  1052. /package/src/{avif/native → format/image/avif}/color/clamp_sample.js +0 -0
  1053. /package/src/{avif/native → format/image/avif}/color/linear_to_transfer.d.ts +0 -0
  1054. /package/src/{avif/native → format/image/avif}/color/primaries.d.ts +0 -0
  1055. /package/src/{avif/native → format/image/avif}/color/primaries.js +0 -0
  1056. /package/src/{avif/native → format/image/avif}/color/rgb_row_to_ycbcr.d.ts +0 -0
  1057. /package/src/{avif/native → format/image/avif}/color/rgb_row_to_ycbcr.js +0 -0
  1058. /package/src/{avif/native → format/image/avif}/color/transfer_to_linear.d.ts +0 -0
  1059. /package/src/{avif/native → format/image/avif}/color/upsample_chroma_row.d.ts +0 -0
  1060. /package/src/{avif/native → format/image/avif}/color/ycbcr_row_to_rgb.d.ts +0 -0
  1061. /package/src/{avif/native → format/image/avif}/heif/AvifFile.d.ts +0 -0
  1062. /package/src/{avif/native → format/image/avif}/heif/AvifFile.js +0 -0
  1063. /package/src/{avif/native → format/image/avif}/heif/ItemProperty.d.ts +0 -0
  1064. /package/src/{avif/native → format/image/avif}/heif/ItemProperty.js +0 -0
  1065. /package/src/{avif/native → format/image/avif}/heif/find_item_property.d.ts +0 -0
  1066. /package/src/{avif/native → format/image/avif}/heif/find_item_property.js +0 -0
  1067. /package/src/{avif/native → format/image/avif}/heif/find_item_references.d.ts +0 -0
  1068. /package/src/{avif/native → format/image/avif}/heif/find_item_references.js +0 -0
  1069. /package/src/{avif/native → format/image/avif}/heif/find_items_referencing.d.ts +0 -0
  1070. /package/src/{avif/native → format/image/avif}/heif/find_items_referencing.js +0 -0
  1071. /package/src/{avif/native → format/image/avif}/heif/parse_avif_file.d.ts +0 -0
  1072. /package/src/{avif/native → format/image/avif}/heif/parse_image_grid.d.ts +0 -0
  1073. /package/src/{avif/native → format/image/avif}/heif/parse_item_property.d.ts +0 -0
  1074. /package/src/{avif/native → format/image/avif}/heif/parse_item_property.js +0 -0
  1075. /package/src/{avif/native → format/image/avif}/heif/read_item_data.d.ts +0 -0
  1076. /package/src/{avif/native → format/image/avif}/heif/read_item_data.js +0 -0
  1077. /package/src/{avif/native → format/image/avif}/heif/write_avif_file.d.ts +0 -0
  1078. /package/src/{avif/native → format/image/avif}/heif/write_avif_file.js +0 -0
  1079. /package/src/{avif/native → format/image/avif}/heif/write_item_property.d.ts +0 -0
  1080. /package/src/{avif/native → format/image/avif}/heif/write_item_property.js +0 -0
  1081. /package/src/{avif/native → format/image/avif}/isobmff/BoxHeader.d.ts +0 -0
  1082. /package/src/{avif/native → format/image/avif}/isobmff/BoxHeader.js +0 -0
  1083. /package/src/{avif/native → format/image/avif}/isobmff/for_each_box.d.ts +0 -0
  1084. /package/src/{avif/native → format/image/avif}/isobmff/for_each_box.js +0 -0
  1085. /package/src/{avif/native → format/image/avif}/isobmff/read_box_header.d.ts +0 -0
  1086. /package/src/{avif/native → format/image/avif}/isobmff/read_box_header.js +0 -0
  1087. /package/src/{avif/native → format/image/avif}/isobmff/read_full_box_header.d.ts +0 -0
  1088. /package/src/{avif/native → format/image/avif}/isobmff/read_full_box_header.js +0 -0
  1089. /package/src/{engine/asset/loaders → format}/image/jpeg/JpegFrame.d.ts +0 -0
  1090. /package/src/{engine/asset/loaders → format}/image/jpeg/JpegFrame.js +0 -0
  1091. /package/src/{engine/asset/loaders → format}/image/jpeg/JpegFrameComponent.d.ts +0 -0
  1092. /package/src/{engine/asset/loaders → format}/image/jpeg/JpegFrameComponent.js +0 -0
  1093. /package/src/{engine/asset/loaders → format}/image/jpeg/JpegImage.d.ts +0 -0
  1094. /package/src/{engine/asset/loaders → format}/image/jpeg/NOTES.md +0 -0
  1095. /package/src/{engine/asset/loaders → format}/image/jpeg/buildComponentData.d.ts +0 -0
  1096. /package/src/{engine/asset/loaders → format}/image/jpeg/buildComponentData.js +0 -0
  1097. /package/src/{engine/asset/loaders → format}/image/jpeg/buildHuffmanTable.d.ts +0 -0
  1098. /package/src/{engine/asset/loaders → format}/image/jpeg/buildHuffmanTable.js +0 -0
  1099. /package/src/{engine/asset/loaders → format}/image/jpeg/decodeScan.d.ts +0 -0
  1100. /package/src/{engine/asset/loaders → format}/image/jpeg/decodeScan.js +0 -0
  1101. /package/src/{engine/asset/loaders → format}/image/jpeg/idct8x8_float.d.ts +0 -0
  1102. /package/src/{engine/asset/loaders → format}/image/jpeg/jpeg_component_row.d.ts +0 -0
  1103. /package/src/{engine/asset/loaders → format}/image/jpeg/jpeg_component_row.js +0 -0
  1104. /package/src/{engine/asset/loaders → format}/image/jpeg/jpeg_decode.d.ts +0 -0
  1105. /package/src/{engine/asset/loaders → format}/image/jpeg/jpeg_decode.js +0 -0
  1106. /package/src/{engine/asset/loaders → format}/image/png/PNG.d.ts +0 -0
  1107. /package/src/{engine/asset/loaders → format}/image/png/PNG.js +0 -0
  1108. /package/src/{engine/asset/loaders → format}/image/png/PNG_HEADER_BYTES.d.ts +0 -0
  1109. /package/src/{engine/asset/loaders → format}/image/png/PNG_HEADER_BYTES.js +0 -0
  1110. /package/src/{engine/asset/loaders → format}/image/png/chunk/png_chunk_decode_iTXt.d.ts +0 -0
  1111. /package/src/{engine/asset/loaders → format}/image/png/chunk/png_chunk_decode_zTXt.d.ts +0 -0
  1112. /package/src/{engine/asset/loaders → format}/image/png/filter/png_filter_unFilterAverage.d.ts +0 -0
  1113. /package/src/{engine/asset/loaders → format}/image/png/filter/png_filter_unFilterAverage.js +0 -0
  1114. /package/src/{engine/asset/loaders → format}/image/png/filter/png_filter_unFilterNone.d.ts +0 -0
  1115. /package/src/{engine/asset/loaders → format}/image/png/filter/png_filter_unFilterNone.js +0 -0
  1116. /package/src/{engine/asset/loaders → format}/image/png/filter/png_filter_unFilterPaeth.d.ts +0 -0
  1117. /package/src/{engine/asset/loaders → format}/image/png/filter/png_filter_unFilterPaeth.js +0 -0
  1118. /package/src/{engine/asset/loaders → format}/image/png/filter/png_filter_unFilterSub.d.ts +0 -0
  1119. /package/src/{engine/asset/loaders → format}/image/png/filter/png_filter_unFilterSub.js +0 -0
  1120. /package/src/{engine/asset/loaders → format}/image/png/filter/png_filter_unFilterUp.d.ts +0 -0
  1121. /package/src/{engine/asset/loaders → format}/image/png/filter/png_filter_unFilterUp.js +0 -0
  1122. /package/src/{engine/asset/loaders → format}/image/png/filter/png_unfilter.d.ts +0 -0
  1123. /package/src/{engine/asset/loaders → format}/image/png/png_inflate.d.ts +0 -0
  1124. /package/src/{engine/asset/loaders → format}/image/png/png_inflate.js +0 -0
  1125. /package/src/{engine/asset/loaders → format}/image/png/png_unpack_samples.d.ts +0 -0
  1126. /package/src/{engine/asset/loaders → format}/image/png/png_unpack_samples.js +0 -0
  1127. /package/src/{shade/renderer/loader → format/scene}/gltf/GLTF_PRIMITIVE_MODE.d.ts +0 -0
  1128. /package/src/{shade/renderer/loader → format/scene}/gltf/GLTF_PRIMITIVE_MODE.js +0 -0
  1129. /package/src/{shade/renderer/loader → format/scene}/gltf/coalesce_array_duplicates.d.ts +0 -0
  1130. /package/src/{shade/renderer/loader → format/scene}/gltf/coalesce_array_duplicates.js +0 -0
  1131. /package/src/{shade/renderer/loader → format/scene}/gltf/ext/GltfBufferViewExtension.d.ts +0 -0
  1132. /package/src/{shade/renderer/loader → format/scene}/gltf/ext/GltfBufferViewExtension.js +0 -0
  1133. /package/src/{shade/renderer/loader → format/scene}/gltf/ext/GltfBufferViewExtensionSet.d.ts +0 -0
  1134. /package/src/{shade/renderer/loader → format/scene}/gltf/ext/gltf_apply_buffer_view_extensions.d.ts +0 -0
  1135. /package/src/{shade/renderer/loader → format/scene}/gltf/ext/gltf_apply_buffer_view_extensions.js +0 -0
  1136. /package/src/{shade/renderer/loader → format/scene}/gltf/ext/gltf_buffer_view_extensions.d.ts +0 -0
  1137. /package/src/{shade/renderer/loader → format/scene}/gltf/ext/gltf_buffer_view_extensions.js +0 -0
  1138. /package/src/{shade/renderer/loader → format/scene}/gltf/ext/gltf_geometry_extensions.d.ts +0 -0
  1139. /package/src/{shade/renderer/loader → format/scene}/gltf/ext/gltf_geometry_extensions.js +0 -0
  1140. /package/src/{shade/renderer/loader → format/scene}/gltf/ext/meshopt/MeshoptBufferViewExtension.d.ts +0 -0
  1141. /package/src/{shade/renderer/loader → format/scene}/gltf/gltf_component_type.d.ts +0 -0
  1142. /package/src/{shade/renderer/loader → format/scene}/gltf/gltf_component_type.js +0 -0
  1143. /package/src/{shade/renderer/loader → format/scene}/gltf/gltf_node_world_matrices.d.ts +0 -0
  1144. /package/src/{shade/renderer/loader → format/scene}/gltf/gltf_parse_container.d.ts +0 -0
  1145. /package/src/{shade/renderer/loader → format/scene}/gltf/gltf_parse_container.js +0 -0
  1146. /package/src/{shade/renderer/loader → format/scene}/gltf/gltf_read_accessor.d.ts +0 -0
  1147. /package/src/{shade/renderer/loader → format/scene}/usd/UsdError.d.ts +0 -0
  1148. /package/src/{shade/renderer/loader → format/scene}/usd/UsdError.js +0 -0
  1149. /package/src/{shade/renderer/loader → format/scene}/usd/parse_usda.d.ts +0 -0
  1150. /package/src/{shade/renderer/loader → format/scene}/usd/parse_usda.js +0 -0
  1151. /package/src/{shade/renderer/loader → format/scene}/usd/unpack_usdz.d.ts +0 -0
  1152. /package/src/{shade/renderer/loader → format/scene}/usd/usd_compose_transform.d.ts +0 -0
  1153. /package/src/{shade/renderer/loader → format/scene}/usd/usd_lz4.d.ts +0 -0
  1154. /package/src/{shade/renderer/loader → format/scene}/usd/usd_triangulate.d.ts +0 -0
  1155. /package/src/{shade/renderer/loader → format/scene}/usd/usd_triangulate.js +0 -0
  1156. /package/src/{basis → format/texture/basis}/BasisHuffmanTable.d.ts +0 -0
  1157. /package/src/{basis → format/texture/basis}/BasisHuffmanTable.js +0 -0
  1158. /package/src/{basis → format/texture/basis}/basis_read_huffman_table.d.ts +0 -0
  1159. /package/src/{basis → format/texture/basis}/basis_read_huffman_table.js +0 -0
  1160. /package/src/{basis → format/texture/basis}/etc1s/Etc1sSelectorHistory.d.ts +0 -0
  1161. /package/src/{basis → format/texture/basis}/etc1s/Etc1sSelectorHistory.js +0 -0
  1162. /package/src/{basis → format/texture/basis}/etc1s/etc1s_block_colors.d.ts +0 -0
  1163. /package/src/{basis → format/texture/basis}/etc1s/etc1s_block_colors.js +0 -0
  1164. /package/src/{basis → format/texture/basis}/etc1s/etc1s_decode_slice.d.ts +0 -0
  1165. /package/src/{basis → format/texture/basis}/etc1s/etc1s_read_endpoint_codebook.d.ts +0 -0
  1166. /package/src/{basis → format/texture/basis}/etc1s/etc1s_read_endpoint_codebook.js +0 -0
  1167. /package/src/{basis → format/texture/basis}/etc1s/etc1s_read_selector_codebook.d.ts +0 -0
  1168. /package/src/{basis → format/texture/basis}/etc1s/etc1s_read_selector_codebook.js +0 -0
  1169. /package/src/{basis → format/texture/basis}/etc1s/etc1s_read_slice_tables.d.ts +0 -0
  1170. /package/src/{basis → format/texture/basis}/etc1s/etc1s_read_slice_tables.js +0 -0
  1171. /package/src/{basis → format/texture/basis}/transcode/build_range_plan.js +0 -0
  1172. /package/src/{basis → format/texture/basis}/transcode/etc1s_to_bc7.js +0 -0
  1173. /package/src/{ktx2 → format/texture/ktx2}/KTX2_IDENTIFIER.d.ts +0 -0
  1174. /package/src/{ktx2 → format/texture/ktx2}/KTX2_IDENTIFIER.js +0 -0
  1175. /package/src/{ktx2 → format/texture/ktx2}/KhrDfModel.d.ts +0 -0
  1176. /package/src/{ktx2 → format/texture/ktx2}/KhrDfModel.js +0 -0
  1177. /package/src/{ktx2 → format/texture/ktx2}/SupercompressionScheme.d.ts +0 -0
  1178. /package/src/{ktx2 → format/texture/ktx2}/SupercompressionScheme.js +0 -0
@@ -1,1253 +1,1179 @@
1
- import { assert } from "../../../../core/assert.js";
2
- import { HashMap } from "../../../../core/collection/map/HashMap.js";
3
- import { HashSet } from "../../../../core/collection/set/HashSet.js";
4
- import { Color } from "../../../../core/color/Color.js";
5
- import { Quaternion } from "../../../../core/geom/Quaternion.js";
6
- import Vector3 from "../../../../core/geom/Vector3.js";
7
- import { clamp } from "../../../../core/math/clamp.js";
8
- import { clamp01 } from "../../../../core/math/clamp01.js";
9
- import { computeObjectHash } from "../../../../core/math/hash/computeObjectHash.js";
10
- import { inverseLerp } from "../../../../core/math/inverseLerp.js";
11
- import { objectDeepEquals } from "../../../../core/model/object/objectDeepEquals.js";
12
- import { number_format_by_thousands } from "../../../../core/primitives/numbers/number_format_by_thousands.js";
13
- import { AnimationInterpolationKind } from "../../../../engine/animation/clip/AnimationInterpolationKind.js";
14
- import { curve_from_track_data } from "../../../../engine/animation/clip/curve_from_track_data.js";
15
- import { AnimationCurve } from "../../../../engine/animation/curve/AnimationCurve.js";
16
- import { t64_look_rotation } from "../../../../engine/ecs/transform/t64_look_rotation.js";
17
- import { t64_transform_direction } from "../../../../engine/ecs/transform/t64_transform_direction.js";
18
- import { meshopt_optimizeVertexCache } from "../../../../engine/graphics/geometry/optimization/VertexCacheOptimizer.js";
19
- import { ShadeAnimationChannel } from "../../animation/ShadeAnimationChannel.js";
20
- import { ShadeAnimationClip } from "../../animation/ShadeAnimationClip.js";
21
- import { Skin } from "../../animation/Skin.js";
22
- import { Attribute } from "../../geometry/Attribute.js";
23
- import { Geometry, GeometryFlags } from "../../geometry/Geometry.js";
24
- import { meshlet_geometry_build_from_geometry } from "../../geometry/meshlet_geometry_build_from_geometry.js";
25
- import { StandardAttributes } from "../../geometry/StandardAttributes.js";
26
- import { normalize_attribute } from "../../geometry/util/normalize_attribute.js";
27
- import { DirectionalLight } from "../../light/model/DirectionalLight.js";
28
- import { PointLight } from "../../light/model/PointLight.js";
29
- import { SpotLight } from "../../light/model/SpotLight.js";
30
-
31
- import { StandardShadeMaterial } from "../../material/StandardShadeMaterial.js";
32
- import { Node3DProperty } from "../../object_property/Node3DProperty.js";
33
- import { Mesh } from "../../scene/Mesh.js";
34
- import { Node3D } from "../../scene/Node3D.js";
35
- import { SkinnedMesh } from "../../scene/SkinnedMesh.js";
36
- import { ShadeTexture } from "../../texture/ShadeTexture.js";
37
- import { ShadeImage } from "../../texture/source/ShadeImage.js";
38
- import { TextureFilterType } from "../../texture/TextureFilterType.js";
39
- import { TextureWrapType } from "../../texture/TextureWrapType.js";
40
- import { SceneBundle } from "../SceneBundle.js";
41
- import { coalesce_array_duplicates } from "./coalesce_array_duplicates.js";
42
- import { fix_up_material_sides } from "./fix_up_material_sides.js";
43
- import { GLTF_COMPONENT_TYPE } from "./gltf_component_type.js";
44
- import { gltf_create_material } from "./gltf_create_material.js";
45
- import { GLTF_PRIMITIVE_MODE, GLTF_PRIMITIVE_MODE_DEFAULT } from "./GLTF_PRIMITIVE_MODE.js";
46
- import { gltf_read_accessor } from "./gltf_read_accessor.js";
47
- import { gltf_used_image_indices } from "./gltf_used_image_indices.js";
48
- import { TinyGltf } from "./tiny-gltf.js";
49
-
50
-
51
- /**
52
- * Somewhere to hand `canonicalize_quaternion_signs` a rest rotation it can read by component name
53
- * a `Transform64` addresses its rotation by index, and the function's contract is named components.
54
- *
55
- * @type {Quaternion}
56
- */
57
- const SCRATCH_REST_ROTATION = new Quaternion();
58
-
59
- /**
60
- * Somewhere to read a light's facing before flipping it.
61
- *
62
- * @type {Vector3}
63
- */
64
- const SCRATCH_DIRECTION = new Vector3();
65
- const OPTIMIZE_GEOMETRIES = false;
66
-
67
- const WEBGL_FILTER_NEAREST = 9728;
68
- const WEBGL_FILTER_LINEAR = 9729;
69
- const WEBGL_FILTER_NEAREST_MIPMAP_NEAREST = 9984;
70
- const WEBGL_FILTER_LINEAR_MIPMAP_NEAREST = 9985;
71
- const WEBGL_FILTER_NEAREST_MIPMAP_LINEAR = 9986;
72
- const WEBGL_FILTER_LINEAR_MIPMAP_LINEAR = 9987;
73
-
74
- const WEBGL_FILTERS = {
75
- [WEBGL_FILTER_NEAREST]: TextureFilterType.Nearest,
76
- [WEBGL_FILTER_LINEAR]: TextureFilterType.Linear,
77
- [WEBGL_FILTER_NEAREST_MIPMAP_NEAREST]: TextureFilterType.Nearest,
78
- [WEBGL_FILTER_LINEAR_MIPMAP_NEAREST]: TextureFilterType.Nearest,
79
- [WEBGL_FILTER_NEAREST_MIPMAP_LINEAR]: TextureFilterType.Linear,
80
- [WEBGL_FILTER_LINEAR_MIPMAP_LINEAR]: TextureFilterType.Linear
81
- };
82
-
83
-
84
- /**
85
- *
86
- * @param {number} filter
87
- * @returns {boolean}
88
- */
89
- function webgl_filter_mipmap_linear(filter) {
90
- switch (filter) {
91
- case WEBGL_FILTER_LINEAR_MIPMAP_NEAREST:
92
- case WEBGL_FILTER_LINEAR_MIPMAP_LINEAR:
93
- return true;
94
- }
95
-
96
- return false;
97
- }
98
-
99
- /**
100
- *
101
- * @param {number} minFilter
102
- * @returns {TextureFilterType}
103
- */
104
- function webgl_filter_mipmap(minFilter) {
105
- if (minFilter === undefined || webgl_filter_mipmap_linear(minFilter)) {
106
- return TextureFilterType.Linear;
107
- }
108
-
109
- return TextureFilterType.Nearest;
110
- }
111
-
112
- const WEBGL_WRAPPINGS = {
113
- 33071: TextureWrapType.ClampToEdge,
114
- 33648: TextureWrapType.MirroredRepeat,
115
- 10497: TextureWrapType.Repeat
116
- };
117
-
118
- /**
119
- * @see https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html
120
- * @param {string} id
121
- */
122
- function gltf_attribute_id_to_standard(id) {
123
- switch (id) {
124
- case "POSITION":
125
- return StandardAttributes.Position;
126
- case "NORMAL":
127
- return StandardAttributes.Normal;
128
- case "TEXCOORD_0":
129
- return StandardAttributes.TextureCoordinates0;
130
- case "TEXCOORD_1":
131
- return StandardAttributes.TextureCoordinates1;
132
- case "TANGENT":
133
- return StandardAttributes.Tangent;
134
- case "COLOR_0":
135
- return StandardAttributes.Color;
136
- case "JOINTS_0":
137
- return StandardAttributes.SkinningJoints;
138
- case "WEIGHTS_0":
139
- return StandardAttributes.SkinningWeights;
140
- default:
141
- return id;
142
- }
143
- }
144
-
145
- /**
146
- * Map glTF `animation.channels[].target.path` to {@link Node3DProperty}.
147
- * Returns `-1` for paths we don't yet drive (morph-target `weights`),
148
- * so the caller can skip those channels without throwing.
149
- *
150
- * @param {string} path
151
- * @returns {number}
152
- */
153
- function gltf_animation_path_to_property(path) {
154
- switch (path) {
155
- case "translation":
156
- return Node3DProperty.Translation;
157
- case "rotation":
158
- return Node3DProperty.Rotation;
159
- case "scale":
160
- return Node3DProperty.Scale;
161
- default:
162
- // "weights" (morph targets) lands here; we don't yet have
163
- // morph-target support in the renderer.
164
- return -1;
165
- }
166
- }
167
-
168
- /**
169
- * Number of scalar components per keyframe value for a given Node3D
170
- * property — translation/scale = 3 (vec3), rotation = 4 (quaternion
171
- * x/y/z/w).
172
- *
173
- * @param {number} property one of {@link Node3DProperty}
174
- * @returns {number}
175
- */
176
- function node3d_property_component_count(property) {
177
- switch (property) {
178
- case Node3DProperty.Translation:
179
- case Node3DProperty.Scale:
180
- return 3;
181
- case Node3DProperty.Rotation:
182
- return 4;
183
- default:
184
- throw new Error(`Unsupported animated property ${property}`);
185
- }
186
- }
187
-
188
- /**
189
- * Walk a flat keyframe-values buffer for a rotation channel and flip
190
- * the sign of any keyframe whose val-quaternion has negative dot
191
- * product with the previous keyframe's val-quaternion. The same flip
192
- * is applied to that keyframe's in/out tangents in CUBICSPLINE mode
193
- * so the cubic remains internally consistent.
194
- *
195
- * The flip preserves the rotation (q and -q encode the same
196
- * orientation) while ensuring per-component interpolation between
197
- * consecutive keyframes follows the short arc instead of passing
198
- * through a near-zero quaternion mid-segment.
199
- *
200
- * The curve's leading sign is anchored against `rest_rotation` —
201
- * the target node's authored local rest rotation: when the first
202
- * keyframe's val-quat has negative dot product with the rest
203
- * quaternion, the whole first keyframe block is negated (and the
204
- * consecutive-keyframe pass propagates that sign down the curve).
205
- * Every rotation curve targeting one node aligns against the same
206
- * reference, so weighted multi-clip blends accumulate
207
- * hemisphere-consistent contributions instead of cancelling toward
208
- * a near-zero quaternion. Residual limitation: the anchor is the
209
- * FIRST keyframe only a curve that swings more than 90° away
210
- * from the rest rotation mid-clip can still contribute opposite
211
- * signs to another clip at those times; fixing that would need
212
- * apply-time alignment, which the atomic pose accumulator cannot
213
- * do order-independently.
214
- *
215
- * Mutates `values` in place. Safe to call on an output array that's
216
- * a fresh copy of the source accessor (which is what
217
- * {@link read_accessor_as_float32_array} produces).
218
- *
219
- * Exported for spec coverage; not part of the loader's public API.
220
- *
221
- * @param {Float32Array} values flat values: STEP/LINEAR uses 4
222
- * floats/keyframe (x, y, z, w); CUBICSPLINE uses 12 (inX, inY,
223
- * inZ, inW, valX, valY, valZ, valW, outX, outY, outZ, outW).
224
- * @param {number} key_count
225
- * @param {number} interpolation one of {@link AnimationInterpolationKind}
226
- * @param {{x:number, y:number, z:number, w:number}} [rest_rotation]
227
- * target node's authored local rest rotation; omitted → the
228
- * leading sign is kept as authored.
229
- */
230
- export function canonicalize_quaternion_signs(values, key_count, interpolation, rest_rotation) {
231
- const is_cubic = interpolation === AnimationInterpolationKind.CubicTangents;
232
- const stride = is_cubic ? 12 : 4;
233
- // Offset into a keyframe block at which the val-quat sits.
234
- // CUBICSPLINE has [in, val, out]; the val starts at offset 4 (i.e.
235
- // after the 4-float in-tangent). STEP/LINEAR has just val at 0.
236
- const val_offset = is_cubic ? 4 : 0;
237
-
238
- if (key_count >= 1 && rest_rotation !== undefined) {
239
- const rest_dot =
240
- values[val_offset + 0] * rest_rotation.x +
241
- values[val_offset + 1] * rest_rotation.y +
242
- values[val_offset + 2] * rest_rotation.z +
243
- values[val_offset + 3] * rest_rotation.w;
244
-
245
- if (rest_dot < 0) {
246
- // Negate the whole first keyframe block (value +
247
- // tangents); the loop below carries the flip through
248
- // the remaining keyframes.
249
- for (let i = 0; i < stride; i++) {
250
- values[i] = -values[i];
251
- }
252
- }
253
- }
254
-
255
- for (let k = 1; k < key_count; k++) {
256
- const prev_base = (k - 1) * stride + val_offset;
257
- const cur_base = k * stride + val_offset;
258
-
259
- const dot =
260
- values[prev_base + 0] * values[cur_base + 0] +
261
- values[prev_base + 1] * values[cur_base + 1] +
262
- values[prev_base + 2] * values[cur_base + 2] +
263
- values[prev_base + 3] * values[cur_base + 3];
264
-
265
- if (dot < 0) {
266
- // Flip the whole keyframe block (value + tangents).
267
- const start = k * stride;
268
- const end = start + stride;
269
- for (let i = start; i < end; i++) {
270
- values[i] = -values[i];
271
- }
272
- }
273
- }
274
- }
275
-
276
- /**
277
- * Map glTF interpolation strings to the engine's enum. Defaults to
278
- * LINEAR when missing — the glTF spec's default.
279
- *
280
- * @param {string|undefined} interpolation
281
- * @returns {number} one of {@link AnimationInterpolationKind}
282
- */
283
- function gltf_interpolation_to_kind(interpolation) {
284
- switch (interpolation) {
285
- case "STEP":
286
- return AnimationInterpolationKind.Discrete;
287
- case "CUBICSPLINE":
288
- return AnimationInterpolationKind.CubicTangents;
289
- case "LINEAR":
290
- case undefined:
291
- return AnimationInterpolationKind.Linear;
292
- default:
293
- throw new Error(`Unsupported interpolation '${interpolation}'`);
294
- }
295
- }
296
-
297
- /**
298
- * Input can be a .glb or .gltf file.
299
- *
300
- * Does not support most compression GLTF extensions such as draco, basis etc.
301
- *
302
- * Returns a {@link SceneBundle} that groups the parsed scene roots
303
- * with any skins and animation clips extracted from the same asset.
304
- * Callers add `bundle.scenes` to their scene, then pass the bundle's
305
- * `skins` / `clips` to the scene's animation manager (e.g. via
306
- * {@link GPUAnimationManager#register_skin} and
307
- * {@link GPUAnimationManager#register_clip}) once `scene.build` has
308
- * populated `id_mapping` for the joint and target nodes.
309
- *
310
- * @param {string} url un-resolved — the asset manager resolves network paths
311
- * @param {Object} options
312
- * @param {AssetManager} options.assetManager where the container, its buffers and its images come
313
- * from. Required: a glTF is several files, and which of them are already in memory is not this
314
- * parser's business to know.
315
- * @param {AssetRequestScope} [options.scope] the load these requests belong to
316
- * @param {Map<string, File|Blob|ArrayBuffer>} [options.fileMap] Map of relative paths to file data.
317
- * When provided, buffer and image URIs in the GLTF are resolved from this map before the asset
318
- * framework is asked. Enables multi-file GLTF loading from drag-and-drop.
319
- * @return {Promise<SceneBundle>}
320
- */
321
- export function load_gltf(url, { assetManager, scope, fileMap } = {}) {
322
- // TODO
323
- // apply some checks to the model, things like non-uniform scales, that can be fixed potentially
324
- // see https://www.youtube.com/watch?v=FJRO5wFTEc8 for common ideas
325
- // check for inverted normals
326
- // check for duplicated vertices
327
- // check for overlapping faces
328
-
329
- async function process(gltf) {
330
- // console.log(gltf);
331
-
332
- /**
333
- * @type {{type:string, componentType:number, count:number, bufferView:number, byteOffset:number, normalized:boolean, min?:number[], max?:number}[]}
334
- */
335
- const accessors = gltf.accessors;
336
-
337
- /**
338
- * `aabb` is six numbers, `[x0, y0, z0, x1, y1, z1]`, in world space — and is absent on a node
339
- * that bounds nothing, meaning neither it nor anything below it declared any.
340
- *
341
- * {{aabb?:Float64Array, mesh:number, worldMatrix:Float32Array}[]}
342
- */
343
- const nodes = gltf.nodes;
344
-
345
- /**
346
- *
347
- * @type {{aabb:Float64Array, primitives:({attributes:Object<number>,indices:number, material:number, mode:number}[])}[]}
348
- */
349
- const meshes = gltf.meshes;
350
-
351
- /**
352
- *
353
- * @type {{}[]}
354
- */
355
- const scenes = gltf.scenes;
356
-
357
- /**
358
- * Engine Node3Ds indexed by glTF node index populated lazily
359
- * by {@link process_node} as the scene-graph recursion visits
360
- * each node. Used afterwards to resolve skin joint references
361
- * and animation channel targets (both of which point at glTF
362
- * node indices, not at any in-memory object).
363
- *
364
- * @type {Node3D[]}
365
- */
366
- const node3d_by_index = new Array((gltf.nodes ?? []).length);
367
-
368
- /**
369
- * Queue of pending `skin.meshes` pushes. process_node() can't
370
- * resolve `node.skin → Skin` directly because skins[] is built
371
- * *after* the recursion completes (the joint lookup needs
372
- * node3d_by_index fully populated). So we enqueue the produced
373
- * SkinnedMeshes here and drain into the matching skin once the
374
- * walk finishes.
375
- *
376
- * @type {{ skin_index: number, meshes: Mesh[] }[]}
377
- */
378
- const skin_mesh_pushes = [];
379
-
380
- /**
381
- * Primitive converted to JSON string serves as key
382
- * @type {Map<string, MeshletGeometry>}
383
- */
384
- const geometry_cache = new Map();
385
-
386
- /**
387
- *
388
- * @type {HashSet<MeshletGeometry>}
389
- */
390
- const geometry_cache_secondary = new HashSet();
391
-
392
- /**
393
- * Indexed as `gltf.images` is, and populated only where an image was actually fetched.
394
- *
395
- * Built from {@link gltf_used_image_indices} rather than by mapping the whole list, because
396
- * that is the same function the fetch is filtered by: the two cannot drift into decoding one
397
- * set and sampling another, and there is no slot here for an image that was never brought in.
398
- *
399
- * @type {ShadeImage[]}
400
- */
401
- const mapped_images = [];
402
-
403
- for (const index of gltf_used_image_indices(gltf)) {
404
- mapped_images[index] = ShadeImage.fromImageBitmap(gltf.images[index]);
405
- }
406
-
407
- /**
408
- * used when no material is specified
409
- * @type {StandardShadeMaterial}
410
- */
411
- const default_material = new StandardShadeMaterial();
412
-
413
- /**
414
- * Used when no sampler is present
415
- * @type {{}}
416
- */
417
- const default_sampler_description = {};
418
-
419
- /**
420
- *
421
- * @type {ShadeTexture[]}
422
- */
423
- const mapped_textures = (gltf.textures ?? []).map(gltf_texture => {
424
-
425
- const sampler = gltf_texture.sampler;
426
-
427
- let source;
428
-
429
- const extensions = gltf_texture.extensions;
430
- if (extensions !== undefined) {
431
-
432
- source = extensions.EXT_texture_webp?.source;
433
-
434
- }
435
-
436
- if (source === undefined) {
437
- source = gltf_texture.source;
438
- }
439
-
440
- const image = mapped_images[source];
441
-
442
-
443
- /**
444
- * @type {{magFilter:number, minFilter:number, wrapS:number, wrapT:number}}
445
- */
446
- let sampler_descriptor;
447
-
448
- if (gltf.samplers !== undefined && gltf.samplers[sampler] !== undefined) {
449
- sampler_descriptor = gltf.samplers[sampler]
450
- } else {
451
- sampler_descriptor = default_sampler_description;
452
- }
453
-
454
- const texture = ShadeTexture.from(image);
455
-
456
- texture.magFilter = WEBGL_FILTERS[sampler_descriptor.magFilter] ?? TextureFilterType.Linear;
457
- texture.minFilter = WEBGL_FILTERS[sampler_descriptor.minFilter] ?? TextureFilterType.Linear;
458
- texture.mipmapFilter = webgl_filter_mipmap(sampler_descriptor.minFilter);
459
-
460
- texture.wrapS = WEBGL_WRAPPINGS[sampler_descriptor.wrapS] ?? TextureWrapType.Repeat;
461
- texture.wrapT = WEBGL_WRAPPINGS[sampler_descriptor.wrapT] ?? TextureWrapType.Repeat;
462
-
463
- return texture;
464
- });
465
-
466
- coalesce_array_duplicates(mapped_textures);
467
-
468
- // account for materials missing
469
- const gltf_materials = gltf.materials ?? [];
470
-
471
- const mapped_materials = gltf_materials.map(gltf_mat => gltf_create_material(gltf_mat, mapped_textures));
472
-
473
- // dedupe materials
474
- coalesce_array_duplicates(mapped_materials);
475
-
476
-
477
- /**
478
- * One accessor as an attribute in the shape the renderer stores it.
479
- *
480
- * The read itself stride, sparse overlay, a view-less accessor's zeroes — belongs to the
481
- * format and is done by {@link gltf_read_accessor}; what is left here is the engine's own
482
- * question of which storage type an attribute of this name is kept in.
483
- *
484
- * @param {number} accessor_index
485
- * @param {string} name
486
- * @returns {Attribute}
487
- */
488
- function buffer_to_attribute(accessor_index, name) {
489
- const data = gltf_read_accessor(gltf, accessor_index);
490
-
491
- const raw_attribute = Attribute.from(data.values, data.components, name);
492
-
493
- raw_attribute.spec.normalized = data.normalized;
494
-
495
- return normalize_attribute(raw_attribute);
496
- }
497
-
498
- /**
499
- *
500
- * @type {HashMap<Object, Attribute>}
501
- */
502
- const attribute_cache = new HashMap({
503
- keyEqualityFunction: objectDeepEquals,
504
- keyHashFunction: computeObjectHash
505
- });
506
-
507
- /**
508
- *
509
- * @param {number} attribute_accessor
510
- * @param {string} name
511
- * @returns {Attribute}
512
- */
513
- function obtain_attribute(attribute_accessor, name) {
514
- const key = {
515
- attribute_accessor, name
516
- };
517
-
518
- let attribute = attribute_cache.get(key);
519
-
520
- if (attribute === undefined) {
521
- attribute = buffer_to_attribute(attribute_accessor, name);
522
- attribute_cache.set(key, attribute);
523
- } else {
524
- // console.warn('attribute reuse')
525
- }
526
-
527
- return attribute;
528
- }
529
-
530
- /**
531
- * A FLOAT-componentType accessor's values as a flat `Float32Array`. Used for animation
532
- * sampler inputs/outputs (times, values) and the skin inverse-bind matrices, where
533
- * downstream code wants a stride-free flat buffer.
534
- *
535
- * @param {number} accessor_index
536
- * @returns {Float32Array}
537
- */
538
- function read_accessor_as_float32_array(accessor_index) {
539
- const accessor = accessors[accessor_index];
540
-
541
- assert.equal(
542
- accessor.componentType, GLTF_COMPONENT_TYPE.FLOAT,
543
- `accessor[${accessor_index}].componentType must be FLOAT for read_accessor_as_float32_array`
544
- );
545
-
546
- return gltf_read_accessor(gltf, accessor_index).values;
547
- }
548
-
549
- /**
550
- *
551
- * @returns {MeshletGeometry}
552
- */
553
- function primitive_to_geometry(primitive) {
554
- const geometry = new Geometry();
555
-
556
- const mode = primitive.mode ?? GLTF_PRIMITIVE_MODE_DEFAULT;
557
-
558
- if (mode !== GLTF_PRIMITIVE_MODE.TRIANGLES) {
559
- throw new Error('Unsupported draw method');
560
- }
561
-
562
- for (const attribute_key in primitive.attributes) {
563
-
564
- const name = gltf_attribute_id_to_standard(attribute_key);
565
-
566
- if (geometry.getAttribute(name) !== undefined) {
567
- console.warn(`attribute '${name}' already exists, skipping. Primitive.attributes = ${JSON.stringify(primitive.attributes)}`)
568
- }
569
-
570
- /**
571
- * @type {number}
572
- */
573
- const attribute_accessor = primitive.attributes[attribute_key];
574
-
575
- let attribute;
576
- try {
577
- attribute = obtain_attribute(attribute_accessor, name);
578
- } catch (e) {
579
- console.warn(`Failed to parse attribute '${name}'. Skipping`, e);
580
- continue;
581
- }
582
-
583
- geometry.addAttribute(attribute);
584
-
585
-
586
- if (attribute_key === "POSITION") {
587
- // The spec mandates POSITION accessors carry min/max,
588
- // so we can adopt them as the bounding box without
589
- // walking the vertex data. The sphere is derived from
590
- // the box inside meshlet_geometry_build_from_geometry,
591
- // so we just clear the dirty flag here.
592
- const accessor = accessors[attribute_accessor];
593
-
594
- if (accessor.min !== undefined && accessor.max !== undefined) {
595
- geometry.bounding_box.set([
596
- ...accessor.min,
597
- ...accessor.max
598
- ]);
599
-
600
- geometry.clearFlag(GeometryFlags.BoundsNeedUpdate);
601
- }
602
- }
603
- }
604
-
605
- if (primitive.indices !== undefined) {
606
-
607
- geometry.index = obtain_attribute(primitive.indices, 'index');
608
-
609
- // geometry_fix_index(geometry.index, geometry.getVertexCount());
610
- }
611
-
612
-
613
- // vertex optimize
614
- if (geometry.index !== null && OPTIMIZE_GEOMETRIES) {
615
- meshopt_optimizeVertexCache(geometry.index.data, geometry.index.data, geometry.index.count, geometry.getVertexCount());
616
- }
617
-
618
- return meshlet_geometry_build_from_geometry(geometry);
619
- }
620
-
621
- function obtain_geometry_by_primitive(primitive) {
622
- const key = JSON.stringify(primitive);
623
-
624
- let geometry = geometry_cache.get(key);
625
-
626
- if (geometry === undefined) {
627
- geometry = primitive_to_geometry(primitive)
628
-
629
- const secondary_cached = geometry_cache_secondary.get(geometry);
630
-
631
- if (secondary_cached !== undefined) {
632
- // found an equivalent geometry in the secondary cache, use it instead
633
- geometry = secondary_cached;
634
- // console.warn("secondary reuse");
635
- } else {
636
- geometry_cache_secondary.add(geometry);
637
- }
638
-
639
- geometry_cache.set(key, geometry);
640
- } else {
641
- // console.warn('geometry reuse');
642
- }
643
-
644
- return geometry;
645
- }
646
-
647
-
648
- /**
649
- * Build the renderable mesh(es) for one glTF node.
650
- *
651
- * A glTF mesh is a list of primitives sharing a name and an
652
- * `aabb`, and each primitive becomes one engine-side {@link Mesh}.
653
- * When the owning glTF node references a skin, every primitive is
654
- * instead constructed as a {@link SkinnedMesh} so the renderer
655
- * routes it through a per-instance geometry clone for deformation.
656
- *
657
- * @param {number} mesh_index
658
- * @param {{}} node
659
- * @param {boolean} is_skinned
660
- * @returns {Mesh[]}
661
- */
662
- function process_mesh(mesh_index, node, is_skinned) {
663
-
664
- const mesh = meshes[mesh_index];
665
-
666
- const primitives = mesh.primitives;
667
-
668
- const primitive_count = primitives.length;
669
-
670
- /**
671
- *
672
- * @type {Mesh[]}
673
- */
674
- const result = [];
675
-
676
- for (let i = 0; i < primitive_count; i++) {
677
- const primitive = primitives[i];
678
-
679
- // build geometry
680
-
681
- /**
682
- * @type {MeshletGeometry}
683
- */
684
- let geometry;
685
-
686
- try {
687
- geometry = obtain_geometry_by_primitive(primitive);
688
- } catch (e) {
689
- console.error(`Failed to obtain geometry for primitive [${i}] ${primitive}. `, e);
690
- console.log('Ignoring mesh');
691
- continue;
692
- }
693
-
694
- if (primitive_count === 1 && mesh.name !== undefined) {
695
- geometry.name = mesh.name;
696
- }
697
-
698
- const material_id = primitive.material;
699
-
700
- let material;
701
-
702
- if (material_id !== undefined) {
703
- material = mapped_materials[material_id];
704
-
705
- if (material === undefined) {
706
- console.warn(`specified material ${material_id} does not exist. Using default.`);
707
-
708
- material = default_material;
709
- }
710
-
711
- } else {
712
- // no material specified, use default
713
- material = default_material;
714
- }
715
-
716
- const engine_mesh = is_skinned ? new SkinnedMesh() : new Mesh();
717
- engine_mesh.geometry = geometry;
718
- engine_mesh.material = material;
719
- engine_mesh.transform_global.fromMatrix(node.worldMatrix);
720
-
721
-
722
- if (mesh.name !== undefined) {
723
- engine_mesh.name = mesh.name;
724
- }
725
-
726
- result.push(engine_mesh);
727
- }
728
-
729
- return result;
730
- }
731
-
732
- /**
733
- *
734
- * @param {number} light_index
735
- * @param {{}} node
736
- * @returns {AbstractLight}
737
- */
738
- function process_light(light_index, node) {
739
-
740
- // SPEC: https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_lights_punctual/README.md
741
-
742
- const gltf_light = gltf.extensions.KHR_lights_punctual.lights[light_index];
743
-
744
- // parse color
745
- const color = new Color();
746
-
747
- if (gltf_light.color !== undefined) {
748
- color.fromArray(gltf_light.color);
749
- } else {
750
- color.setRGB(1, 1, 1);
751
- }
752
-
753
- const intensity = gltf_light.intensity ?? 1;
754
-
755
- const name = gltf_light.name ?? "";
756
-
757
- let light;
758
-
759
- const type = gltf_light.type;
760
-
761
- switch (type) {
762
- case "directional":
763
- light = new DirectionalLight();
764
- break;
765
- case "point":
766
- light = new PointLight();
767
- light.distance = gltf_light.range ?? 1e20; // default light radius
768
- break;
769
- case "spot":
770
- light = new SpotLight();
771
-
772
- const gltf_spot = gltf_light.spot;
773
-
774
- const outerCone = gltf_spot?.outerConeAngle ?? (Math.PI / 4); // default PI/4
775
- const innerCone = gltf_spot?.innerConeAngle ?? 0;
776
-
777
- light.angle = clamp(
778
- outerCone,
779
- 0,
780
- Math.PI / 2
781
- );
782
-
783
- light.penumbra = clamp01(
784
- inverseLerp(light.angle, 0, innerCone)
785
- );
786
-
787
- light.distance = gltf_light.range ?? 1e20;
788
- // TODO rotation is messed up?
789
- break;
790
- default:
791
- throw new Error(`Unsupported light type ${type}`);
792
- }
793
-
794
- light.color.copy(color);
795
- light.intensity = intensity;
796
- light.name = name;
797
-
798
- // check for light radius
799
- light.radius = gltf_light.extras?.radius ?? 0;
800
-
801
- light.near_clip_distance = gltf_light.extras?.near_clip_distance ?? light.radius;
802
-
803
- light.casts_shadow = true;
804
-
805
- return light;
806
- }
807
-
808
- /**
809
- *
810
- * @param {Node3D} parent
811
- * @param {number} node_index
812
- */
813
- function process_node(parent, node_index) {
814
-
815
- const node = nodes[node_index];
816
-
817
- // glTF "skin" attaches at the node, not the mesh: every
818
- // primitive of the referenced mesh becomes a SkinnedMesh
819
- // bound to this skin. Resolved later (after the recursion
820
- // is done) against `skins[]`, which we've already built
821
- // the joint Node3Ds may be visited *after* this node,
822
- // so we just record the produced SkinnedMeshes here and
823
- // push them into `skin.meshes` once the walk finishes.
824
- const skin_index = typeof node.skin === "number" ? node.skin : -1;
825
-
826
- let node3d;
827
- let produced_skinned_meshes = null;
828
-
829
- if (node.extensions !== undefined && node.extensions.KHR_lights_punctual !== undefined) {
830
- const light_index = node.extensions.KHR_lights_punctual.light;
831
-
832
- try {
833
- node3d = process_light(light_index, node);
834
- } catch (e) {
835
- console.error("Failed to process light ", light_index, " ", e);
836
- }
837
- }
838
-
839
-
840
- if (typeof node.mesh === "number") {
841
- const meshes = process_mesh(node.mesh, node, skin_index !== -1);
842
-
843
- if (meshes.length === 1) {
844
- node3d = meshes[0];
845
- } else if (meshes.length > 1) {
846
- node3d = new Node3D();
847
-
848
- node3d.addChildren(meshes)
849
- }
850
-
851
- if (skin_index !== -1) {
852
- produced_skinned_meshes = meshes;
853
- }
854
- }
855
-
856
- if (node3d === undefined) {
857
- node3d = new Node3D();
858
- }
859
-
860
- // Stash by glTF index — joint refs and animation channel
861
- // targets resolve through this lookup once the recursion
862
- // unwinds.
863
- node3d_by_index[node_index] = node3d;
864
-
865
- if (node.name !== undefined) {
866
- node3d.name = node.name;
867
- }
868
-
869
- if (node.matrix !== undefined) {
870
-
871
- node3d.transform_local.fromMatrix(node.matrix);
872
-
873
- } else {
874
-
875
- const t = node3d.transform_local;
876
-
877
- if (node.translation !== undefined) {
878
- const v = node.translation;
879
-
880
- t.setTranslation(v[0], v[1], v[2]);
881
- }
882
-
883
- if (node.rotation !== undefined) {
884
- const q = node.rotation;
885
-
886
- t.setRotation(q[0], q[1], q[2], q[3]);
887
- }
888
-
889
- if (node.scale !== undefined) {
890
- const v = node.scale;
891
-
892
- t.setScale(v[0], v[1], v[2]);
893
- }
894
- }
895
-
896
-
897
- if (node3d.isDirectionalLight || node3d.isSpotLight) {
898
- // glTF lights shine along their local -Z; engine convention is forward = shining direction
899
- const t = node3d.transform_local;
900
-
901
- // the direction is read off the matrix, and a Transform64 does not maintain its own
902
- t.updateMatrix();
903
-
904
- t64_transform_direction(SCRATCH_DIRECTION, t, 0, 0, 1);
905
-
906
- t64_look_rotation(
907
- t,
908
- -SCRATCH_DIRECTION.x, -SCRATCH_DIRECTION.y, -SCRATCH_DIRECTION.z,
909
- 0, 1, 0
910
- );
911
- }
912
-
913
- parent.addChild(node3d);
914
-
915
- if (produced_skinned_meshes !== null) {
916
- // Defer the `skin.meshes` push to after `skins[]` is
917
- // built we collect into a queue here and process it
918
- // at the end of process().
919
- skin_mesh_pushes.push({
920
- skin_index,
921
- meshes: produced_skinned_meshes,
922
- });
923
- }
924
-
925
-
926
- if (node.children !== undefined) {
927
-
928
- for (let i = 0; i < node.children.length; i++) {
929
- const node_index = node.children[i];
930
-
931
- process_node(node3d, node_index);
932
- }
933
- }
934
- }
935
-
936
- // console.time('parse-gltf');
937
- // console.profile('parse-gltf');
938
-
939
- /**
940
- *
941
- * @type {Node3D[]}
942
- */
943
- const scene_nodes3d = [];
944
-
945
- for (let i = 0; i < scenes.length; i++) {
946
- const scene = scenes[i];
947
-
948
- const scene_node3d = new Node3D();
949
-
950
- scene_nodes3d.push(scene_node3d);
951
-
952
- /**
953
- * @type {number[]}
954
- */
955
- const scene_nodes = scene.nodes;
956
-
957
- const node_count = scene_nodes.length;
958
-
959
- for (let i = 0; i < node_count; i++) {
960
- const node_index = scene_nodes[i];
961
- process_node(scene_node3d, node_index);
962
- }
963
-
964
- scene_node3d.updateMatrices();
965
- }
966
-
967
- // ── Skins ──────────────────────────────────────────────────
968
- //
969
- // Build {@link Skin} objects from `gltf.skins[]`. Joints
970
- // resolve to Node3D refs through `node3d_by_index` (fully
971
- // populated by the recursion above). Inverse-bind matrices
972
- // come from a single MAT4 accessor — `joint_count * 16` f32s
973
- // laid out column-major, copied into a flat Float32Array that
974
- // the manager can subarray-view at registration time.
975
- const skins = (gltf.skins ?? []).map((gltf_skin, skin_index) => {
976
- const joint_indices = gltf_skin.joints;
977
- const joint_count = joint_indices.length;
978
-
979
- const joint_nodes = new Array(joint_count);
980
- for (let i = 0; i < joint_count; i++) {
981
- const joint_node_index = joint_indices[i];
982
- const joint_node = node3d_by_index[joint_node_index];
983
-
984
- assert.defined(
985
- joint_node,
986
- `skin[${skin_index}].joints[${i}] references unknown node index ${joint_node_index}`
987
- );
988
-
989
- joint_nodes[i] = joint_node;
990
- }
991
-
992
- // Inverse-bind matrices: glTF stores them MAT4-typed
993
- // (column-major, 16 f32s per joint). When the accessor is
994
- // omitted, the spec says every joint's IBM is identity
995
- // we materialise that here so the manager always sees a
996
- // ready-to-use flat array.
997
- let inverse_bind_matrices;
998
- if (gltf_skin.inverseBindMatrices !== undefined) {
999
- inverse_bind_matrices = read_accessor_as_float32_array(gltf_skin.inverseBindMatrices);
1000
- } else {
1001
- inverse_bind_matrices = new Float32Array(joint_count * 16);
1002
- for (let i = 0; i < joint_count; i++) {
1003
- inverse_bind_matrices[i * 16 + 0] = 1;
1004
- inverse_bind_matrices[i * 16 + 5] = 1;
1005
- inverse_bind_matrices[i * 16 + 10] = 1;
1006
- inverse_bind_matrices[i * 16 + 15] = 1;
1007
- }
1008
- }
1009
-
1010
- return Skin.from({
1011
- name: gltf_skin.name ?? "",
1012
- joints: joint_nodes,
1013
- inverse_bind_matrices,
1014
- meshes: [],
1015
- });
1016
- });
1017
-
1018
- // Drain the deferred skin.meshes pushes captured during the
1019
- // node walk.
1020
- for (let i = 0; i < skin_mesh_pushes.length; i++) {
1021
- const { skin_index, meshes: skin_meshes } = skin_mesh_pushes[i];
1022
- skins[skin_index].meshes.push(...skin_meshes);
1023
- }
1024
-
1025
- // ── Animation clips ───────────────────────────────────────
1026
- //
1027
- // One glTF animation → one {@link ShadeAnimationClip}. Each
1028
- // channel becomes a {@link ShadeAnimationChannel}; per-component
1029
- // curves are built from the sampler's input (times) / output
1030
- // (values) accessors via the engine's curve_from_track_data
1031
- // helpers, which already handle STEP / LINEAR / CUBICSPLINE.
1032
- const clips = [];
1033
- const gltf_animations = gltf.animations ?? [];
1034
- for (let a = 0; a < gltf_animations.length; a++) {
1035
- const gltf_animation = gltf_animations[a];
1036
-
1037
- const channels = [];
1038
-
1039
- for (let c = 0; c < gltf_animation.channels.length; c++) {
1040
- const gltf_channel = gltf_animation.channels[c];
1041
- const target = gltf_channel.target;
1042
-
1043
- const property = gltf_animation_path_to_property(target.path);
1044
- if (property === -1) {
1045
- // Morph-target weights or other unsupported paths.
1046
- continue;
1047
- }
1048
-
1049
- if (target.node === undefined) {
1050
- // Channels without a node target are a glTF
1051
- // extension hook and not actionable here.
1052
- continue;
1053
- }
1054
-
1055
- const target_node = node3d_by_index[target.node];
1056
-
1057
- assert.defined(
1058
- target_node,
1059
- `animations[${a}].channels[${c}].target.node ${target.node} not resolved`
1060
- );
1061
-
1062
- const sampler = gltf_animation.samplers[gltf_channel.sampler];
1063
- const times = read_accessor_as_float32_array(sampler.input);
1064
- const values = read_accessor_as_float32_array(sampler.output);
1065
- const interpolation = gltf_interpolation_to_kind(sampler.interpolation);
1066
- const component_count = node3d_property_component_count(property);
1067
-
1068
- // Canonicalize quaternion signs on rotation channels.
1069
- //
1070
- // glTF stores rotation keyframes as raw (x, y, z, w)
1071
- // quaternions, but `q` and `-q` represent the same
1072
- // orientation. Authoring tools (notably Mixamo) often
1073
- // alternate signs across consecutive keyframes when a
1074
- // bone passes through 180°. Per-component interpolation
1075
- // between sign-mismatched keyframes especially
1076
- // CUBICSPLINE passes through near-zero quaternions
1077
- // mid-segment; the apply shader's `normalize(value)`
1078
- // call then produces an effectively-identity quaternion
1079
- // for one frame, which reads as a one-frame snap to
1080
- // bind pose.
1081
- //
1082
- // Fix: flip the sign of every keyframe whose val-quat
1083
- // has negative dot product with the prior keyframe's
1084
- // val-quat. For CUBICSPLINE, flip the in/out tangents
1085
- // alongside the value so the cubic stays consistent.
1086
- // The leading sign is anchored against the target
1087
- // node's authored rest rotation so all clips driving
1088
- // one node land in the same hemisphere — required
1089
- // for weighted multi-clip blends, where the pose
1090
- // accumulator sums raw components across clips.
1091
- // No-op when the property isn't Rotation, or when the
1092
- // data was already canonicalized at export time.
1093
- if (property === Node3DProperty.Rotation && times.length >= 1) {
1094
- // `canonicalize_quaternion_signs` reads the rest rotation by component name,
1095
- // which a `Transform64` does not offer — hand it a quaternion instead
1096
- const rest = target_node.transform_local;
1097
-
1098
- SCRATCH_REST_ROTATION.set(
1099
- rest.rotation_x,
1100
- rest.rotation_y,
1101
- rest.rotation_z,
1102
- rest.rotation_w
1103
- );
1104
-
1105
- canonicalize_quaternion_signs(
1106
- values, times.length, interpolation,
1107
- SCRATCH_REST_ROTATION
1108
- );
1109
- }
1110
-
1111
- // Build the per-axis curves object. component_count
1112
- // is property-driven (3 for Translation/Scale, 4 for
1113
- // Rotation); slots beyond what the property uses are
1114
- // omitted. The keys align with the GPU track's
1115
- // (x, y, z, w) vec4f output — see ShadeAnimationChannel.
1116
- const axis_keys = ['x', 'y', 'z', 'w'];
1117
- const curves = {};
1118
- for (let comp = 0; comp < component_count; comp++) {
1119
- const curve = new AnimationCurve();
1120
- curve_from_track_data(curve, interpolation, values, times, component_count, comp);
1121
- curves[axis_keys[comp]] = curve;
1122
- }
1123
-
1124
- channels.push(ShadeAnimationChannel.from({
1125
- target: target_node,
1126
- property,
1127
- curves,
1128
- }));
1129
- }
1130
-
1131
- if (channels.length === 0) {
1132
- // All channels were unsupported / unresolved — skip
1133
- // the clip entirely so we don't emit a zero-channel
1134
- // record the manager would reject.
1135
- continue;
1136
- }
1137
-
1138
- const clip = ShadeAnimationClip.from({
1139
- name: gltf_animation.name ?? "",
1140
- channels,
1141
- });
1142
-
1143
- // Default optimization pass: strip channels that
1144
- // evaluate to the identity transform and individual
1145
- // per-axis curves that are constant at identity, then
1146
- // key-reduce the survivors. glTF exporters often emit
1147
- // redundant bind-pose channels (every joint gets a
1148
- // translation channel even when only rotation is
1149
- // animated), so this typically trims a sizeable
1150
- // fraction of the channel + curve count. Behaviour
1151
- // unchanged applying the optimised clip produces
1152
- // the same poses.
1153
- //
1154
- // Stats are computed by diffing channel + total-curve
1155
- // counts before and after; the methods don't carry
1156
- // them in their return values.
1157
- const before_channels = clip.channels.length;
1158
- let before_curves = 0;
1159
- for (let i = 0; i < clip.channels.length; i++) {
1160
- before_curves += clip.channels[i].curve_count;
1161
- }
1162
-
1163
- clip.optimize();
1164
-
1165
- const after_channels = clip.channels.length;
1166
- let after_curves = 0;
1167
- for (let i = 0; i < clip.channels.length; i++) {
1168
- after_curves += clip.channels[i].curve_count;
1169
- }
1170
-
1171
- const removed_channels = before_channels - after_channels;
1172
- const removed_curves = before_curves - after_curves;
1173
- if (removed_channels > 0 || removed_curves > 0) {
1174
- // console.log(
1175
- // `[load_gltf] optimised clip '${clip.name}': ` +
1176
- // `removed ${removed_channels} track(s), ` +
1177
- // `${removed_curves} curve(s)`
1178
- // );
1179
- }
1180
-
1181
- clips.push(clip);
1182
- }
1183
-
1184
- // console.profileEnd('parse-gltf');
1185
- // console.timeEnd('parse-gltf');
1186
-
1187
- const bundle = new SceneBundle();
1188
- bundle.scenes = scene_nodes3d;
1189
- bundle.skins = skins;
1190
- bundle.clips = clips;
1191
- return bundle;
1192
- }
1193
-
1194
- /**
1195
- *
1196
- * @param {Node3D[]} scenes
1197
- */
1198
- function fix_scene_material_sidedness(scenes) {
1199
- const meshes = new Set();
1200
-
1201
- for (const s of scenes) {
1202
- s.traverse(node => {
1203
- if (node.isMesh) {
1204
- meshes.add(node);
1205
- }
1206
- });
1207
- }
1208
-
1209
- const { geometries_modified: fixed_count, primitives_delta } = fix_up_material_sides(Array.from(meshes));
1210
-
1211
- if (fixed_count > 0) {
1212
- console.warn(`Fixed ${fixed_count} geometries in accordance with material sidedness. Primitives added: ${number_format_by_thousands(primitives_delta)}`);
1213
- }
1214
-
1215
- return scenes;
1216
- }
1217
-
1218
-
1219
- return load_gltf_document(url, { assetManager, scope, fileMap })
1220
- .then(process)
1221
- // .then(fix_scene_material_sidedness)
1222
- // .then(prepare_lightmap)
1223
- ;
1224
- }
1225
-
1226
- /**
1227
- * The same file, parsed and with its dependencies in memory, **without** being turned into anything
1228
- * a renderer draws: the glTF's own JSON alongside `buffers` as `Uint8Array`s and `images` as
1229
- * `ImageBitmap`s.
1230
- *
1231
- * The half of {@link load_gltf} that is not about pictures. A glTF carries more than a scene to draw
1232
- * — collision hulls, navigation surfaces, spawn markers, whatever a tool reads accessors for — and
1233
- * those consumers want the accessors and the bytes behind them, not a {@link SceneBundle} they would
1234
- * have to take apart again.
1235
- *
1236
- * @param {string} url un-resolved — the asset manager resolves network paths
1237
- * @param {Object} options
1238
- * @param {AssetManager} options.assetManager
1239
- * @param {AssetRequestScope} [options.scope]
1240
- * @param {Map<string, File|Blob|ArrayBuffer>} [options.fileMap]
1241
- * @returns {Promise<TinyGltf>}
1242
- */
1243
- export function load_gltf_document(url, { assetManager, scope, fileMap } = {}) {
1244
- const gltf = new TinyGltf(assetManager, scope);
1245
-
1246
- if (fileMap) {
1247
- gltf.fileMap = fileMap;
1248
- }
1249
-
1250
- return gltf.loadFromUrl(url);
1251
- }
1252
-
1253
-
1
+ import { assert } from "../../../../core/assert.js";
2
+ import { HashMap } from "../../../../core/collection/map/HashMap.js";
3
+ import { HashSet } from "../../../../core/collection/set/HashSet.js";
4
+ import { Color } from "../../../../core/color/Color.js";
5
+ import { Quaternion } from "../../../../core/geom/Quaternion.js";
6
+ import Vector3 from "../../../../core/geom/Vector3.js";
7
+ import { clamp } from "../../../../core/math/clamp.js";
8
+ import { clamp01 } from "../../../../core/math/clamp01.js";
9
+ import { computeObjectHash } from "../../../../core/math/hash/computeObjectHash.js";
10
+ import { inverseLerp } from "../../../../core/math/inverseLerp.js";
11
+ import { objectDeepEquals } from "../../../../core/model/object/objectDeepEquals.js";
12
+ import { number_format_by_thousands } from "../../../../core/primitives/numbers/number_format_by_thousands.js";
13
+ import { AnimationInterpolationKind } from "../../../../engine/animation/clip/AnimationInterpolationKind.js";
14
+ import { curve_from_track_data } from "../../../../engine/animation/clip/curve_from_track_data.js";
15
+ import { AnimationCurve } from "../../../../engine/animation/curve/AnimationCurve.js";
16
+ import { t64_look_rotation } from "../../../../engine/ecs/transform/t64_look_rotation.js";
17
+ import { t64_transform_direction } from "../../../../engine/ecs/transform/t64_transform_direction.js";
18
+ import { meshopt_optimizeVertexCache } from "../../../../engine/graphics/geometry/optimization/VertexCacheOptimizer.js";
19
+ import { ShadeAnimationChannel } from "../../animation/ShadeAnimationChannel.js";
20
+ import { ShadeAnimationClip } from "../../animation/ShadeAnimationClip.js";
21
+ import { Skin } from "../../animation/Skin.js";
22
+ import { Attribute } from "../../geometry/Attribute.js";
23
+ import { Geometry, GeometryFlags } from "../../geometry/Geometry.js";
24
+ import { meshlet_geometry_build_from_geometry } from "../../geometry/meshlet_geometry_build_from_geometry.js";
25
+ import { StandardAttributes } from "../../geometry/StandardAttributes.js";
26
+ import { normalize_attribute } from "../../geometry/util/normalize_attribute.js";
27
+ import { DirectionalLight } from "../../light/model/DirectionalLight.js";
28
+ import { PointLight } from "../../light/model/PointLight.js";
29
+ import { SpotLight } from "../../light/model/SpotLight.js";
30
+
31
+ import { StandardShadeMaterial } from "../../material/StandardShadeMaterial.js";
32
+ import { Node3DProperty } from "../../object_property/Node3DProperty.js";
33
+ import { Mesh } from "../../scene/Mesh.js";
34
+ import { Node3D } from "../../scene/Node3D.js";
35
+ import { SkinnedMesh } from "../../scene/SkinnedMesh.js";
36
+ import { ShadeTexture } from "../../texture/ShadeTexture.js";
37
+ import { ShadeImage } from "../../texture/source/ShadeImage.js";
38
+ import { SceneBundle } from "../SceneBundle.js";
39
+ import { coalesce_array_duplicates } from "../../../../format/scene/gltf/coalesce_array_duplicates.js";
40
+ import { fix_up_material_sides } from "./fix_up_material_sides.js";
41
+ import { GLTF_COMPONENT_TYPE } from "../../../../format/scene/gltf/gltf_component_type.js";
42
+ import { gltf_create_material } from "./gltf_create_material.js";
43
+ import { gltf_create_texture } from "./gltf_create_texture.js";
44
+ import { GLTF_PRIMITIVE_MODE, GLTF_PRIMITIVE_MODE_DEFAULT } from "../../../../format/scene/gltf/GLTF_PRIMITIVE_MODE.js";
45
+ import { gltf_read_accessor } from "../../../../format/scene/gltf/gltf_read_accessor.js";
46
+ import { gltf_texture_image_index, gltf_used_image_indices } from "../../../../format/scene/gltf/gltf_used_image_indices.js";
47
+ import { TinyGltf } from "./tiny-gltf.js";
48
+
49
+
50
+ /**
51
+ * Somewhere to hand `canonicalize_quaternion_signs` a rest rotation it can read by component name —
52
+ * a `Transform64` addresses its rotation by index, and the function's contract is named components.
53
+ *
54
+ * @type {Quaternion}
55
+ */
56
+ const SCRATCH_REST_ROTATION = new Quaternion();
57
+
58
+ /**
59
+ * Somewhere to read a light's facing before flipping it.
60
+ *
61
+ * @type {Vector3}
62
+ */
63
+ const SCRATCH_DIRECTION = new Vector3();
64
+ const OPTIMIZE_GEOMETRIES = false;
65
+
66
+ /**
67
+ * @see https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html
68
+ * @param {string} id
69
+ */
70
+ function gltf_attribute_id_to_standard(id) {
71
+ switch (id) {
72
+ case "POSITION":
73
+ return StandardAttributes.Position;
74
+ case "NORMAL":
75
+ return StandardAttributes.Normal;
76
+ case "TEXCOORD_0":
77
+ return StandardAttributes.TextureCoordinates0;
78
+ case "TEXCOORD_1":
79
+ return StandardAttributes.TextureCoordinates1;
80
+ case "TANGENT":
81
+ return StandardAttributes.Tangent;
82
+ case "COLOR_0":
83
+ return StandardAttributes.Color;
84
+ case "JOINTS_0":
85
+ return StandardAttributes.SkinningJoints;
86
+ case "WEIGHTS_0":
87
+ return StandardAttributes.SkinningWeights;
88
+ default:
89
+ return id;
90
+ }
91
+ }
92
+
93
+ /**
94
+ * Map glTF `animation.channels[].target.path` to {@link Node3DProperty}.
95
+ * Returns `-1` for paths we don't yet drive (morph-target `weights`),
96
+ * so the caller can skip those channels without throwing.
97
+ *
98
+ * @param {string} path
99
+ * @returns {number}
100
+ */
101
+ function gltf_animation_path_to_property(path) {
102
+ switch (path) {
103
+ case "translation":
104
+ return Node3DProperty.Translation;
105
+ case "rotation":
106
+ return Node3DProperty.Rotation;
107
+ case "scale":
108
+ return Node3DProperty.Scale;
109
+ default:
110
+ // "weights" (morph targets) lands here; we don't yet have
111
+ // morph-target support in the renderer.
112
+ return -1;
113
+ }
114
+ }
115
+
116
+ /**
117
+ * Number of scalar components per keyframe value for a given Node3D
118
+ * property — translation/scale = 3 (vec3), rotation = 4 (quaternion
119
+ * x/y/z/w).
120
+ *
121
+ * @param {number} property one of {@link Node3DProperty}
122
+ * @returns {number}
123
+ */
124
+ function node3d_property_component_count(property) {
125
+ switch (property) {
126
+ case Node3DProperty.Translation:
127
+ case Node3DProperty.Scale:
128
+ return 3;
129
+ case Node3DProperty.Rotation:
130
+ return 4;
131
+ default:
132
+ throw new Error(`Unsupported animated property ${property}`);
133
+ }
134
+ }
135
+
136
+ /**
137
+ * Walk a flat keyframe-values buffer for a rotation channel and flip
138
+ * the sign of any keyframe whose val-quaternion has negative dot
139
+ * product with the previous keyframe's val-quaternion. The same flip
140
+ * is applied to that keyframe's in/out tangents in CUBICSPLINE mode
141
+ * so the cubic remains internally consistent.
142
+ *
143
+ * The flip preserves the rotation (q and -q encode the same
144
+ * orientation) while ensuring per-component interpolation between
145
+ * consecutive keyframes follows the short arc instead of passing
146
+ * through a near-zero quaternion mid-segment.
147
+ *
148
+ * The curve's leading sign is anchored against `rest_rotation`
149
+ * the target node's authored local rest rotation: when the first
150
+ * keyframe's val-quat has negative dot product with the rest
151
+ * quaternion, the whole first keyframe block is negated (and the
152
+ * consecutive-keyframe pass propagates that sign down the curve).
153
+ * Every rotation curve targeting one node aligns against the same
154
+ * reference, so weighted multi-clip blends accumulate
155
+ * hemisphere-consistent contributions instead of cancelling toward
156
+ * a near-zero quaternion. Residual limitation: the anchor is the
157
+ * FIRST keyframe only — a curve that swings more than 90° away
158
+ * from the rest rotation mid-clip can still contribute opposite
159
+ * signs to another clip at those times; fixing that would need
160
+ * apply-time alignment, which the atomic pose accumulator cannot
161
+ * do order-independently.
162
+ *
163
+ * Mutates `values` in place. Safe to call on an output array that's
164
+ * a fresh copy of the source accessor (which is what
165
+ * {@link read_accessor_as_float32_array} produces).
166
+ *
167
+ * Exported for spec coverage; not part of the loader's public API.
168
+ *
169
+ * @param {Float32Array} values flat values: STEP/LINEAR uses 4
170
+ * floats/keyframe (x, y, z, w); CUBICSPLINE uses 12 (inX, inY,
171
+ * inZ, inW, valX, valY, valZ, valW, outX, outY, outZ, outW).
172
+ * @param {number} key_count
173
+ * @param {number} interpolation one of {@link AnimationInterpolationKind}
174
+ * @param {{x:number, y:number, z:number, w:number}} [rest_rotation]
175
+ * target node's authored local rest rotation; omitted → the
176
+ * leading sign is kept as authored.
177
+ */
178
+ export function canonicalize_quaternion_signs(values, key_count, interpolation, rest_rotation) {
179
+ const is_cubic = interpolation === AnimationInterpolationKind.CubicTangents;
180
+ const stride = is_cubic ? 12 : 4;
181
+ // Offset into a keyframe block at which the val-quat sits.
182
+ // CUBICSPLINE has [in, val, out]; the val starts at offset 4 (i.e.
183
+ // after the 4-float in-tangent). STEP/LINEAR has just val at 0.
184
+ const val_offset = is_cubic ? 4 : 0;
185
+
186
+ if (key_count >= 1 && rest_rotation !== undefined) {
187
+ const rest_dot =
188
+ values[val_offset + 0] * rest_rotation.x +
189
+ values[val_offset + 1] * rest_rotation.y +
190
+ values[val_offset + 2] * rest_rotation.z +
191
+ values[val_offset + 3] * rest_rotation.w;
192
+
193
+ if (rest_dot < 0) {
194
+ // Negate the whole first keyframe block (value +
195
+ // tangents); the loop below carries the flip through
196
+ // the remaining keyframes.
197
+ for (let i = 0; i < stride; i++) {
198
+ values[i] = -values[i];
199
+ }
200
+ }
201
+ }
202
+
203
+ for (let k = 1; k < key_count; k++) {
204
+ const prev_base = (k - 1) * stride + val_offset;
205
+ const cur_base = k * stride + val_offset;
206
+
207
+ const dot =
208
+ values[prev_base + 0] * values[cur_base + 0] +
209
+ values[prev_base + 1] * values[cur_base + 1] +
210
+ values[prev_base + 2] * values[cur_base + 2] +
211
+ values[prev_base + 3] * values[cur_base + 3];
212
+
213
+ if (dot < 0) {
214
+ // Flip the whole keyframe block (value + tangents).
215
+ const start = k * stride;
216
+ const end = start + stride;
217
+ for (let i = start; i < end; i++) {
218
+ values[i] = -values[i];
219
+ }
220
+ }
221
+ }
222
+ }
223
+
224
+ /**
225
+ * Map glTF interpolation strings to the engine's enum. Defaults to
226
+ * LINEAR when missing the glTF spec's default.
227
+ *
228
+ * @param {string|undefined} interpolation
229
+ * @returns {number} one of {@link AnimationInterpolationKind}
230
+ */
231
+ function gltf_interpolation_to_kind(interpolation) {
232
+ switch (interpolation) {
233
+ case "STEP":
234
+ return AnimationInterpolationKind.Discrete;
235
+ case "CUBICSPLINE":
236
+ return AnimationInterpolationKind.CubicTangents;
237
+ case "LINEAR":
238
+ case undefined:
239
+ return AnimationInterpolationKind.Linear;
240
+ default:
241
+ throw new Error(`Unsupported interpolation '${interpolation}'`);
242
+ }
243
+ }
244
+
245
+ /**
246
+ * Input can be a .glb or .gltf file.
247
+ *
248
+ * Does not support most compression GLTF extensions such as draco, basis etc.
249
+ *
250
+ * Returns a {@link SceneBundle} that groups the parsed scene roots
251
+ * with any skins and animation clips extracted from the same asset.
252
+ * Callers add `bundle.scenes` to their scene, then pass the bundle's
253
+ * `skins` / `clips` to the scene's animation manager (e.g. via
254
+ * {@link GPUAnimationManager#register_skin} and
255
+ * {@link GPUAnimationManager#register_clip}) once `scene.build` has
256
+ * populated `id_mapping` for the joint and target nodes.
257
+ *
258
+ * @param {string} url un-resolved — the asset manager resolves network paths
259
+ * @param {Object} options
260
+ * @param {AssetManager} options.assetManager where the container, its buffers and its images come
261
+ * from. Required: a glTF is several files, and which of them are already in memory is not this
262
+ * parser's business to know.
263
+ * @param {AssetRequestScope} [options.scope] the load these requests belong to
264
+ * @param {Map<string, File|Blob|ArrayBuffer>} [options.fileMap] Map of relative paths to file data.
265
+ * When provided, buffer and image URIs in the GLTF are resolved from this map before the asset
266
+ * framework is asked. Enables multi-file GLTF loading from drag-and-drop.
267
+ * @param {Set<GPUTextureFormat>} [options.texture_support] what the device can sample, from
268
+ * `gpu_texture_compression_support(device)`. Only a `KHR_texture_basisu` image reads it, to choose
269
+ * what to transcode into; omitted, the loader targets the best format the transcoder writes.
270
+ * @return {Promise<SceneBundle>}
271
+ */
272
+ export function load_gltf(url, { assetManager, scope, fileMap, texture_support } = {}) {
273
+ // TODO
274
+ // apply some checks to the model, things like non-uniform scales, that can be fixed potentially
275
+ // see https://www.youtube.com/watch?v=FJRO5wFTEc8 for common ideas
276
+ // check for inverted normals
277
+ // check for duplicated vertices
278
+ // check for overlapping faces
279
+
280
+ async function process(gltf) {
281
+ // console.log(gltf);
282
+
283
+ /**
284
+ * @type {{type:string, componentType:number, count:number, bufferView:number, byteOffset:number, normalized:boolean, min?:number[], max?:number}[]}
285
+ */
286
+ const accessors = gltf.accessors;
287
+
288
+ /**
289
+ * `aabb` is six numbers, `[x0, y0, z0, x1, y1, z1]`, in world space — and is absent on a node
290
+ * that bounds nothing, meaning neither it nor anything below it declared any.
291
+ *
292
+ * {{aabb?:Float64Array, mesh:number, worldMatrix:Float32Array}[]}
293
+ */
294
+ const nodes = gltf.nodes;
295
+
296
+ /**
297
+ *
298
+ * @type {{aabb:Float64Array, primitives:({attributes:Object<number>,indices:number, material:number, mode:number}[])}[]}
299
+ */
300
+ const meshes = gltf.meshes;
301
+
302
+ /**
303
+ *
304
+ * @type {{}[]}
305
+ */
306
+ const scenes = gltf.scenes;
307
+
308
+ /**
309
+ * Engine Node3Ds indexed by glTF node index — populated lazily
310
+ * by {@link process_node} as the scene-graph recursion visits
311
+ * each node. Used afterwards to resolve skin joint references
312
+ * and animation channel targets (both of which point at glTF
313
+ * node indices, not at any in-memory object).
314
+ *
315
+ * @type {Node3D[]}
316
+ */
317
+ const node3d_by_index = new Array((gltf.nodes ?? []).length);
318
+
319
+ /**
320
+ * Queue of pending `skin.meshes` pushes. process_node() can't
321
+ * resolve `node.skin Skin` directly because skins[] is built
322
+ * *after* the recursion completes (the joint lookup needs
323
+ * node3d_by_index fully populated). So we enqueue the produced
324
+ * SkinnedMeshes here and drain into the matching skin once the
325
+ * walk finishes.
326
+ *
327
+ * @type {{ skin_index: number, meshes: Mesh[] }[]}
328
+ */
329
+ const skin_mesh_pushes = [];
330
+
331
+ /**
332
+ * Primitive converted to JSON string serves as key
333
+ * @type {Map<string, MeshletGeometry>}
334
+ */
335
+ const geometry_cache = new Map();
336
+
337
+ /**
338
+ *
339
+ * @type {HashSet<MeshletGeometry>}
340
+ */
341
+ const geometry_cache_secondary = new HashSet();
342
+
343
+ /**
344
+ * Indexed as `gltf.images` is, and populated only where an image was actually fetched.
345
+ *
346
+ * Built from {@link gltf_used_image_indices} rather than by mapping the whole list, because
347
+ * that is the same function the fetch is filtered by: the two cannot drift into decoding one
348
+ * set and sampling another, and there is no slot here for an image that was never brought in.
349
+ *
350
+ * @type {ShadeImage[]}
351
+ */
352
+ const mapped_images = [];
353
+
354
+ for (const index of gltf_used_image_indices(gltf)) {
355
+ const source = gltf.images[index];
356
+
357
+ /*
358
+ A `KHR_texture_basisu` image arrives already transcoded the container reader ran in
359
+ the parser, where the bytes were, and what came back is texels in a device format. Every
360
+ other image is an `ImageBitmap` the browser decoded. Below this line the two are the same
361
+ thing: a `ShadeImage`, which is what §3.1 bought.
362
+ */
363
+ mapped_images[index] = source.isShadeTexelData === true
364
+ ? ShadeImage.fromTexelData(source)
365
+ : ShadeImage.fromImageBitmap(source);
366
+ }
367
+
368
+ /**
369
+ * used when no material is specified
370
+ * @type {StandardShadeMaterial}
371
+ */
372
+ const default_material = new StandardShadeMaterial();
373
+
374
+ /**
375
+ *
376
+ * @type {ShadeTexture[]}
377
+ */
378
+ const mapped_textures = (gltf.textures ?? []).map(gltf_texture => gltf_create_texture(
379
+ gltf_texture,
380
+ /*
381
+ The same function the fetch was filtered by. Asking it twice is the point: this is the
382
+ half that decides what to *sample*, and the half in `gltf_used_image_indices` decides
383
+ what to *fetch*. When those two disagreed, every model in the game's level failed to
384
+ load see the note at the top of that file.
385
+ */
386
+ mapped_images[gltf_texture_image_index(gltf_texture)],
387
+ gltf.samplers
388
+ ));
389
+
390
+ coalesce_array_duplicates(mapped_textures);
391
+
392
+ // account for materials missing
393
+ const gltf_materials = gltf.materials ?? [];
394
+
395
+ const mapped_materials = gltf_materials.map(gltf_mat => gltf_create_material(gltf_mat, mapped_textures));
396
+
397
+ // dedupe materials
398
+ coalesce_array_duplicates(mapped_materials);
399
+
400
+
401
+ /**
402
+ * One accessor as an attribute in the shape the renderer stores it.
403
+ *
404
+ * The read itself — stride, sparse overlay, a view-less accessor's zeroes — belongs to the
405
+ * format and is done by {@link gltf_read_accessor}; what is left here is the engine's own
406
+ * question of which storage type an attribute of this name is kept in.
407
+ *
408
+ * @param {number} accessor_index
409
+ * @param {string} name
410
+ * @returns {Attribute}
411
+ */
412
+ function buffer_to_attribute(accessor_index, name) {
413
+ const data = gltf_read_accessor(gltf, accessor_index);
414
+
415
+ const raw_attribute = Attribute.from(data.values, data.components, name);
416
+
417
+ raw_attribute.spec.normalized = data.normalized;
418
+
419
+ return normalize_attribute(raw_attribute);
420
+ }
421
+
422
+ /**
423
+ *
424
+ * @type {HashMap<Object, Attribute>}
425
+ */
426
+ const attribute_cache = new HashMap({
427
+ keyEqualityFunction: objectDeepEquals,
428
+ keyHashFunction: computeObjectHash
429
+ });
430
+
431
+ /**
432
+ *
433
+ * @param {number} attribute_accessor
434
+ * @param {string} name
435
+ * @returns {Attribute}
436
+ */
437
+ function obtain_attribute(attribute_accessor, name) {
438
+ const key = {
439
+ attribute_accessor, name
440
+ };
441
+
442
+ let attribute = attribute_cache.get(key);
443
+
444
+ if (attribute === undefined) {
445
+ attribute = buffer_to_attribute(attribute_accessor, name);
446
+ attribute_cache.set(key, attribute);
447
+ } else {
448
+ // console.warn('attribute reuse')
449
+ }
450
+
451
+ return attribute;
452
+ }
453
+
454
+ /**
455
+ * A FLOAT-componentType accessor's values as a flat `Float32Array`. Used for animation
456
+ * sampler inputs/outputs (times, values) and the skin inverse-bind matrices, where
457
+ * downstream code wants a stride-free flat buffer.
458
+ *
459
+ * @param {number} accessor_index
460
+ * @returns {Float32Array}
461
+ */
462
+ function read_accessor_as_float32_array(accessor_index) {
463
+ const accessor = accessors[accessor_index];
464
+
465
+ assert.equal(
466
+ accessor.componentType, GLTF_COMPONENT_TYPE.FLOAT,
467
+ `accessor[${accessor_index}].componentType must be FLOAT for read_accessor_as_float32_array`
468
+ );
469
+
470
+ return gltf_read_accessor(gltf, accessor_index).values;
471
+ }
472
+
473
+ /**
474
+ *
475
+ * @returns {MeshletGeometry}
476
+ */
477
+ function primitive_to_geometry(primitive) {
478
+ const geometry = new Geometry();
479
+
480
+ const mode = primitive.mode ?? GLTF_PRIMITIVE_MODE_DEFAULT;
481
+
482
+ if (mode !== GLTF_PRIMITIVE_MODE.TRIANGLES) {
483
+ throw new Error('Unsupported draw method');
484
+ }
485
+
486
+ for (const attribute_key in primitive.attributes) {
487
+
488
+ const name = gltf_attribute_id_to_standard(attribute_key);
489
+
490
+ if (geometry.getAttribute(name) !== undefined) {
491
+ console.warn(`attribute '${name}' already exists, skipping. Primitive.attributes = ${JSON.stringify(primitive.attributes)}`)
492
+ }
493
+
494
+ /**
495
+ * @type {number}
496
+ */
497
+ const attribute_accessor = primitive.attributes[attribute_key];
498
+
499
+ let attribute;
500
+ try {
501
+ attribute = obtain_attribute(attribute_accessor, name);
502
+ } catch (e) {
503
+ console.warn(`Failed to parse attribute '${name}'. Skipping`, e);
504
+ continue;
505
+ }
506
+
507
+ geometry.addAttribute(attribute);
508
+
509
+
510
+ if (attribute_key === "POSITION") {
511
+ // The spec mandates POSITION accessors carry min/max,
512
+ // so we can adopt them as the bounding box without
513
+ // walking the vertex data. The sphere is derived from
514
+ // the box inside meshlet_geometry_build_from_geometry,
515
+ // so we just clear the dirty flag here.
516
+ const accessor = accessors[attribute_accessor];
517
+
518
+ if (accessor.min !== undefined && accessor.max !== undefined) {
519
+ geometry.bounding_box.set([
520
+ ...accessor.min,
521
+ ...accessor.max
522
+ ]);
523
+
524
+ geometry.clearFlag(GeometryFlags.BoundsNeedUpdate);
525
+ }
526
+ }
527
+ }
528
+
529
+ if (primitive.indices !== undefined) {
530
+
531
+ geometry.index = obtain_attribute(primitive.indices, 'index');
532
+
533
+ // geometry_fix_index(geometry.index, geometry.getVertexCount());
534
+ }
535
+
536
+
537
+ // vertex optimize
538
+ if (geometry.index !== null && OPTIMIZE_GEOMETRIES) {
539
+ meshopt_optimizeVertexCache(geometry.index.data, geometry.index.data, geometry.index.count, geometry.getVertexCount());
540
+ }
541
+
542
+ return meshlet_geometry_build_from_geometry(geometry);
543
+ }
544
+
545
+ function obtain_geometry_by_primitive(primitive) {
546
+ const key = JSON.stringify(primitive);
547
+
548
+ let geometry = geometry_cache.get(key);
549
+
550
+ if (geometry === undefined) {
551
+ geometry = primitive_to_geometry(primitive)
552
+
553
+ const secondary_cached = geometry_cache_secondary.get(geometry);
554
+
555
+ if (secondary_cached !== undefined) {
556
+ // found an equivalent geometry in the secondary cache, use it instead
557
+ geometry = secondary_cached;
558
+ // console.warn("secondary reuse");
559
+ } else {
560
+ geometry_cache_secondary.add(geometry);
561
+ }
562
+
563
+ geometry_cache.set(key, geometry);
564
+ } else {
565
+ // console.warn('geometry reuse');
566
+ }
567
+
568
+ return geometry;
569
+ }
570
+
571
+
572
+ /**
573
+ * Build the renderable mesh(es) for one glTF node.
574
+ *
575
+ * A glTF mesh is a list of primitives sharing a name and an
576
+ * `aabb`, and each primitive becomes one engine-side {@link Mesh}.
577
+ * When the owning glTF node references a skin, every primitive is
578
+ * instead constructed as a {@link SkinnedMesh} so the renderer
579
+ * routes it through a per-instance geometry clone for deformation.
580
+ *
581
+ * @param {number} mesh_index
582
+ * @param {{}} node
583
+ * @param {boolean} is_skinned
584
+ * @returns {Mesh[]}
585
+ */
586
+ function process_mesh(mesh_index, node, is_skinned) {
587
+
588
+ const mesh = meshes[mesh_index];
589
+
590
+ const primitives = mesh.primitives;
591
+
592
+ const primitive_count = primitives.length;
593
+
594
+ /**
595
+ *
596
+ * @type {Mesh[]}
597
+ */
598
+ const result = [];
599
+
600
+ for (let i = 0; i < primitive_count; i++) {
601
+ const primitive = primitives[i];
602
+
603
+ // build geometry
604
+
605
+ /**
606
+ * @type {MeshletGeometry}
607
+ */
608
+ let geometry;
609
+
610
+ try {
611
+ geometry = obtain_geometry_by_primitive(primitive);
612
+ } catch (e) {
613
+ console.error(`Failed to obtain geometry for primitive [${i}] ${primitive}. `, e);
614
+ console.log('Ignoring mesh');
615
+ continue;
616
+ }
617
+
618
+ if (primitive_count === 1 && mesh.name !== undefined) {
619
+ geometry.name = mesh.name;
620
+ }
621
+
622
+ const material_id = primitive.material;
623
+
624
+ let material;
625
+
626
+ if (material_id !== undefined) {
627
+ material = mapped_materials[material_id];
628
+
629
+ if (material === undefined) {
630
+ console.warn(`specified material ${material_id} does not exist. Using default.`);
631
+
632
+ material = default_material;
633
+ }
634
+
635
+ } else {
636
+ // no material specified, use default
637
+ material = default_material;
638
+ }
639
+
640
+ const engine_mesh = is_skinned ? new SkinnedMesh() : new Mesh();
641
+ engine_mesh.geometry = geometry;
642
+ engine_mesh.material = material;
643
+ engine_mesh.transform_global.fromMatrix(node.worldMatrix);
644
+
645
+
646
+ if (mesh.name !== undefined) {
647
+ engine_mesh.name = mesh.name;
648
+ }
649
+
650
+ result.push(engine_mesh);
651
+ }
652
+
653
+ return result;
654
+ }
655
+
656
+ /**
657
+ *
658
+ * @param {number} light_index
659
+ * @param {{}} node
660
+ * @returns {AbstractLight}
661
+ */
662
+ function process_light(light_index, node) {
663
+
664
+ // SPEC: https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_lights_punctual/README.md
665
+
666
+ const gltf_light = gltf.extensions.KHR_lights_punctual.lights[light_index];
667
+
668
+ // parse color
669
+ const color = new Color();
670
+
671
+ if (gltf_light.color !== undefined) {
672
+ color.fromArray(gltf_light.color);
673
+ } else {
674
+ color.setRGB(1, 1, 1);
675
+ }
676
+
677
+ const intensity = gltf_light.intensity ?? 1;
678
+
679
+ const name = gltf_light.name ?? "";
680
+
681
+ let light;
682
+
683
+ const type = gltf_light.type;
684
+
685
+ switch (type) {
686
+ case "directional":
687
+ light = new DirectionalLight();
688
+ break;
689
+ case "point":
690
+ light = new PointLight();
691
+ light.distance = gltf_light.range ?? 1e20; // default light radius
692
+ break;
693
+ case "spot":
694
+ light = new SpotLight();
695
+
696
+ const gltf_spot = gltf_light.spot;
697
+
698
+ const outerCone = gltf_spot?.outerConeAngle ?? (Math.PI / 4); // default PI/4
699
+ const innerCone = gltf_spot?.innerConeAngle ?? 0;
700
+
701
+ light.angle = clamp(
702
+ outerCone,
703
+ 0,
704
+ Math.PI / 2
705
+ );
706
+
707
+ light.penumbra = clamp01(
708
+ inverseLerp(light.angle, 0, innerCone)
709
+ );
710
+
711
+ light.distance = gltf_light.range ?? 1e20;
712
+ // TODO rotation is messed up?
713
+ break;
714
+ default:
715
+ throw new Error(`Unsupported light type ${type}`);
716
+ }
717
+
718
+ light.color.copy(color);
719
+ light.intensity = intensity;
720
+ light.name = name;
721
+
722
+ // check for light radius
723
+ light.radius = gltf_light.extras?.radius ?? 0;
724
+
725
+ light.near_clip_distance = gltf_light.extras?.near_clip_distance ?? light.radius;
726
+
727
+ light.casts_shadow = true;
728
+
729
+ return light;
730
+ }
731
+
732
+ /**
733
+ *
734
+ * @param {Node3D} parent
735
+ * @param {number} node_index
736
+ */
737
+ function process_node(parent, node_index) {
738
+
739
+ const node = nodes[node_index];
740
+
741
+ // glTF "skin" attaches at the node, not the mesh: every
742
+ // primitive of the referenced mesh becomes a SkinnedMesh
743
+ // bound to this skin. Resolved later (after the recursion
744
+ // is done) against `skins[]`, which we've already built
745
+ // the joint Node3Ds may be visited *after* this node,
746
+ // so we just record the produced SkinnedMeshes here and
747
+ // push them into `skin.meshes` once the walk finishes.
748
+ const skin_index = typeof node.skin === "number" ? node.skin : -1;
749
+
750
+ let node3d;
751
+ let produced_skinned_meshes = null;
752
+
753
+ if (node.extensions !== undefined && node.extensions.KHR_lights_punctual !== undefined) {
754
+ const light_index = node.extensions.KHR_lights_punctual.light;
755
+
756
+ try {
757
+ node3d = process_light(light_index, node);
758
+ } catch (e) {
759
+ console.error("Failed to process light ", light_index, " ", e);
760
+ }
761
+ }
762
+
763
+
764
+ if (typeof node.mesh === "number") {
765
+ const meshes = process_mesh(node.mesh, node, skin_index !== -1);
766
+
767
+ if (meshes.length === 1) {
768
+ node3d = meshes[0];
769
+ } else if (meshes.length > 1) {
770
+ node3d = new Node3D();
771
+
772
+ node3d.addChildren(meshes)
773
+ }
774
+
775
+ if (skin_index !== -1) {
776
+ produced_skinned_meshes = meshes;
777
+ }
778
+ }
779
+
780
+ if (node3d === undefined) {
781
+ node3d = new Node3D();
782
+ }
783
+
784
+ // Stash by glTF index — joint refs and animation channel
785
+ // targets resolve through this lookup once the recursion
786
+ // unwinds.
787
+ node3d_by_index[node_index] = node3d;
788
+
789
+ if (node.name !== undefined) {
790
+ node3d.name = node.name;
791
+ }
792
+
793
+ if (node.matrix !== undefined) {
794
+
795
+ node3d.transform_local.fromMatrix(node.matrix);
796
+
797
+ } else {
798
+
799
+ const t = node3d.transform_local;
800
+
801
+ if (node.translation !== undefined) {
802
+ const v = node.translation;
803
+
804
+ t.setTranslation(v[0], v[1], v[2]);
805
+ }
806
+
807
+ if (node.rotation !== undefined) {
808
+ const q = node.rotation;
809
+
810
+ t.setRotation(q[0], q[1], q[2], q[3]);
811
+ }
812
+
813
+ if (node.scale !== undefined) {
814
+ const v = node.scale;
815
+
816
+ t.setScale(v[0], v[1], v[2]);
817
+ }
818
+ }
819
+
820
+
821
+ if (node3d.isDirectionalLight || node3d.isSpotLight) {
822
+ // glTF lights shine along their local -Z; engine convention is forward = shining direction
823
+ const t = node3d.transform_local;
824
+
825
+ // the direction is read off the matrix, and a Transform64 does not maintain its own
826
+ t.updateMatrix();
827
+
828
+ t64_transform_direction(SCRATCH_DIRECTION, t, 0, 0, 1);
829
+
830
+ t64_look_rotation(
831
+ t,
832
+ -SCRATCH_DIRECTION.x, -SCRATCH_DIRECTION.y, -SCRATCH_DIRECTION.z,
833
+ 0, 1, 0
834
+ );
835
+ }
836
+
837
+ parent.addChild(node3d);
838
+
839
+ if (produced_skinned_meshes !== null) {
840
+ // Defer the `skin.meshes` push to after `skins[]` is
841
+ // built we collect into a queue here and process it
842
+ // at the end of process().
843
+ skin_mesh_pushes.push({
844
+ skin_index,
845
+ meshes: produced_skinned_meshes,
846
+ });
847
+ }
848
+
849
+
850
+ if (node.children !== undefined) {
851
+
852
+ for (let i = 0; i < node.children.length; i++) {
853
+ const node_index = node.children[i];
854
+
855
+ process_node(node3d, node_index);
856
+ }
857
+ }
858
+ }
859
+
860
+ // console.time('parse-gltf');
861
+ // console.profile('parse-gltf');
862
+
863
+ /**
864
+ *
865
+ * @type {Node3D[]}
866
+ */
867
+ const scene_nodes3d = [];
868
+
869
+ for (let i = 0; i < scenes.length; i++) {
870
+ const scene = scenes[i];
871
+
872
+ const scene_node3d = new Node3D();
873
+
874
+ scene_nodes3d.push(scene_node3d);
875
+
876
+ /**
877
+ * @type {number[]}
878
+ */
879
+ const scene_nodes = scene.nodes;
880
+
881
+ const node_count = scene_nodes.length;
882
+
883
+ for (let i = 0; i < node_count; i++) {
884
+ const node_index = scene_nodes[i];
885
+ process_node(scene_node3d, node_index);
886
+ }
887
+
888
+ scene_node3d.updateMatrices();
889
+ }
890
+
891
+ // ── Skins ──────────────────────────────────────────────────
892
+ //
893
+ // Build {@link Skin} objects from `gltf.skins[]`. Joints
894
+ // resolve to Node3D refs through `node3d_by_index` (fully
895
+ // populated by the recursion above). Inverse-bind matrices
896
+ // come from a single MAT4 accessor — `joint_count * 16` f32s
897
+ // laid out column-major, copied into a flat Float32Array that
898
+ // the manager can subarray-view at registration time.
899
+ const skins = (gltf.skins ?? []).map((gltf_skin, skin_index) => {
900
+ const joint_indices = gltf_skin.joints;
901
+ const joint_count = joint_indices.length;
902
+
903
+ const joint_nodes = new Array(joint_count);
904
+ for (let i = 0; i < joint_count; i++) {
905
+ const joint_node_index = joint_indices[i];
906
+ const joint_node = node3d_by_index[joint_node_index];
907
+
908
+ assert.defined(
909
+ joint_node,
910
+ `skin[${skin_index}].joints[${i}] references unknown node index ${joint_node_index}`
911
+ );
912
+
913
+ joint_nodes[i] = joint_node;
914
+ }
915
+
916
+ // Inverse-bind matrices: glTF stores them MAT4-typed
917
+ // (column-major, 16 f32s per joint). When the accessor is
918
+ // omitted, the spec says every joint's IBM is identity —
919
+ // we materialise that here so the manager always sees a
920
+ // ready-to-use flat array.
921
+ let inverse_bind_matrices;
922
+ if (gltf_skin.inverseBindMatrices !== undefined) {
923
+ inverse_bind_matrices = read_accessor_as_float32_array(gltf_skin.inverseBindMatrices);
924
+ } else {
925
+ inverse_bind_matrices = new Float32Array(joint_count * 16);
926
+ for (let i = 0; i < joint_count; i++) {
927
+ inverse_bind_matrices[i * 16 + 0] = 1;
928
+ inverse_bind_matrices[i * 16 + 5] = 1;
929
+ inverse_bind_matrices[i * 16 + 10] = 1;
930
+ inverse_bind_matrices[i * 16 + 15] = 1;
931
+ }
932
+ }
933
+
934
+ return Skin.from({
935
+ name: gltf_skin.name ?? "",
936
+ joints: joint_nodes,
937
+ inverse_bind_matrices,
938
+ meshes: [],
939
+ });
940
+ });
941
+
942
+ // Drain the deferred skin.meshes pushes captured during the
943
+ // node walk.
944
+ for (let i = 0; i < skin_mesh_pushes.length; i++) {
945
+ const { skin_index, meshes: skin_meshes } = skin_mesh_pushes[i];
946
+ skins[skin_index].meshes.push(...skin_meshes);
947
+ }
948
+
949
+ // ── Animation clips ───────────────────────────────────────
950
+ //
951
+ // One glTF animation → one {@link ShadeAnimationClip}. Each
952
+ // channel becomes a {@link ShadeAnimationChannel}; per-component
953
+ // curves are built from the sampler's input (times) / output
954
+ // (values) accessors via the engine's curve_from_track_data
955
+ // helpers, which already handle STEP / LINEAR / CUBICSPLINE.
956
+ const clips = [];
957
+ const gltf_animations = gltf.animations ?? [];
958
+ for (let a = 0; a < gltf_animations.length; a++) {
959
+ const gltf_animation = gltf_animations[a];
960
+
961
+ const channels = [];
962
+
963
+ for (let c = 0; c < gltf_animation.channels.length; c++) {
964
+ const gltf_channel = gltf_animation.channels[c];
965
+ const target = gltf_channel.target;
966
+
967
+ const property = gltf_animation_path_to_property(target.path);
968
+ if (property === -1) {
969
+ // Morph-target weights or other unsupported paths.
970
+ continue;
971
+ }
972
+
973
+ if (target.node === undefined) {
974
+ // Channels without a node target are a glTF
975
+ // extension hook and not actionable here.
976
+ continue;
977
+ }
978
+
979
+ const target_node = node3d_by_index[target.node];
980
+
981
+ assert.defined(
982
+ target_node,
983
+ `animations[${a}].channels[${c}].target.node ${target.node} not resolved`
984
+ );
985
+
986
+ const sampler = gltf_animation.samplers[gltf_channel.sampler];
987
+ const times = read_accessor_as_float32_array(sampler.input);
988
+ const values = read_accessor_as_float32_array(sampler.output);
989
+ const interpolation = gltf_interpolation_to_kind(sampler.interpolation);
990
+ const component_count = node3d_property_component_count(property);
991
+
992
+ // Canonicalize quaternion signs on rotation channels.
993
+ //
994
+ // glTF stores rotation keyframes as raw (x, y, z, w)
995
+ // quaternions, but `q` and `-q` represent the same
996
+ // orientation. Authoring tools (notably Mixamo) often
997
+ // alternate signs across consecutive keyframes when a
998
+ // bone passes through 180°. Per-component interpolation
999
+ // between sign-mismatched keyframes — especially
1000
+ // CUBICSPLINE — passes through near-zero quaternions
1001
+ // mid-segment; the apply shader's `normalize(value)`
1002
+ // call then produces an effectively-identity quaternion
1003
+ // for one frame, which reads as a one-frame snap to
1004
+ // bind pose.
1005
+ //
1006
+ // Fix: flip the sign of every keyframe whose val-quat
1007
+ // has negative dot product with the prior keyframe's
1008
+ // val-quat. For CUBICSPLINE, flip the in/out tangents
1009
+ // alongside the value so the cubic stays consistent.
1010
+ // The leading sign is anchored against the target
1011
+ // node's authored rest rotation so all clips driving
1012
+ // one node land in the same hemisphere — required
1013
+ // for weighted multi-clip blends, where the pose
1014
+ // accumulator sums raw components across clips.
1015
+ // No-op when the property isn't Rotation, or when the
1016
+ // data was already canonicalized at export time.
1017
+ if (property === Node3DProperty.Rotation && times.length >= 1) {
1018
+ // `canonicalize_quaternion_signs` reads the rest rotation by component name,
1019
+ // which a `Transform64` does not offer — hand it a quaternion instead
1020
+ const rest = target_node.transform_local;
1021
+
1022
+ SCRATCH_REST_ROTATION.set(
1023
+ rest.rotation_x,
1024
+ rest.rotation_y,
1025
+ rest.rotation_z,
1026
+ rest.rotation_w
1027
+ );
1028
+
1029
+ canonicalize_quaternion_signs(
1030
+ values, times.length, interpolation,
1031
+ SCRATCH_REST_ROTATION
1032
+ );
1033
+ }
1034
+
1035
+ // Build the per-axis curves object. component_count
1036
+ // is property-driven (3 for Translation/Scale, 4 for
1037
+ // Rotation); slots beyond what the property uses are
1038
+ // omitted. The keys align with the GPU track's
1039
+ // (x, y, z, w) vec4f output see ShadeAnimationChannel.
1040
+ const axis_keys = ['x', 'y', 'z', 'w'];
1041
+ const curves = {};
1042
+ for (let comp = 0; comp < component_count; comp++) {
1043
+ const curve = new AnimationCurve();
1044
+ curve_from_track_data(curve, interpolation, values, times, component_count, comp);
1045
+ curves[axis_keys[comp]] = curve;
1046
+ }
1047
+
1048
+ channels.push(ShadeAnimationChannel.from({
1049
+ target: target_node,
1050
+ property,
1051
+ curves,
1052
+ }));
1053
+ }
1054
+
1055
+ if (channels.length === 0) {
1056
+ // All channels were unsupported / unresolved — skip
1057
+ // the clip entirely so we don't emit a zero-channel
1058
+ // record the manager would reject.
1059
+ continue;
1060
+ }
1061
+
1062
+ const clip = ShadeAnimationClip.from({
1063
+ name: gltf_animation.name ?? "",
1064
+ channels,
1065
+ });
1066
+
1067
+ // Default optimization pass: strip channels that
1068
+ // evaluate to the identity transform and individual
1069
+ // per-axis curves that are constant at identity, then
1070
+ // key-reduce the survivors. glTF exporters often emit
1071
+ // redundant bind-pose channels (every joint gets a
1072
+ // translation channel even when only rotation is
1073
+ // animated), so this typically trims a sizeable
1074
+ // fraction of the channel + curve count. Behaviour
1075
+ // unchanged applying the optimised clip produces
1076
+ // the same poses.
1077
+ //
1078
+ // Stats are computed by diffing channel + total-curve
1079
+ // counts before and after; the methods don't carry
1080
+ // them in their return values.
1081
+ const before_channels = clip.channels.length;
1082
+ let before_curves = 0;
1083
+ for (let i = 0; i < clip.channels.length; i++) {
1084
+ before_curves += clip.channels[i].curve_count;
1085
+ }
1086
+
1087
+ clip.optimize();
1088
+
1089
+ const after_channels = clip.channels.length;
1090
+ let after_curves = 0;
1091
+ for (let i = 0; i < clip.channels.length; i++) {
1092
+ after_curves += clip.channels[i].curve_count;
1093
+ }
1094
+
1095
+ const removed_channels = before_channels - after_channels;
1096
+ const removed_curves = before_curves - after_curves;
1097
+ if (removed_channels > 0 || removed_curves > 0) {
1098
+ // console.log(
1099
+ // `[load_gltf] optimised clip '${clip.name}': ` +
1100
+ // `removed ${removed_channels} track(s), ` +
1101
+ // `${removed_curves} curve(s)`
1102
+ // );
1103
+ }
1104
+
1105
+ clips.push(clip);
1106
+ }
1107
+
1108
+ // console.profileEnd('parse-gltf');
1109
+ // console.timeEnd('parse-gltf');
1110
+
1111
+ const bundle = new SceneBundle();
1112
+ bundle.scenes = scene_nodes3d;
1113
+ bundle.skins = skins;
1114
+ bundle.clips = clips;
1115
+ return bundle;
1116
+ }
1117
+
1118
+ /**
1119
+ *
1120
+ * @param {Node3D[]} scenes
1121
+ */
1122
+ function fix_scene_material_sidedness(scenes) {
1123
+ const meshes = new Set();
1124
+
1125
+ for (const s of scenes) {
1126
+ s.traverse(node => {
1127
+ if (node.isMesh) {
1128
+ meshes.add(node);
1129
+ }
1130
+ });
1131
+ }
1132
+
1133
+ const { geometries_modified: fixed_count, primitives_delta } = fix_up_material_sides(Array.from(meshes));
1134
+
1135
+ if (fixed_count > 0) {
1136
+ console.warn(`Fixed ${fixed_count} geometries in accordance with material sidedness. Primitives added: ${number_format_by_thousands(primitives_delta)}`);
1137
+ }
1138
+
1139
+ return scenes;
1140
+ }
1141
+
1142
+
1143
+ return load_gltf_document(url, { assetManager, scope, fileMap, texture_support })
1144
+ .then(process)
1145
+ // .then(fix_scene_material_sidedness)
1146
+ // .then(prepare_lightmap)
1147
+ ;
1148
+ }
1149
+
1150
+ /**
1151
+ * The same file, parsed and with its dependencies in memory, **without** being turned into anything
1152
+ * a renderer draws: the glTF's own JSON alongside `buffers` as `Uint8Array`s and `images` as
1153
+ * `ImageBitmap`s — or, for a `KHR_texture_basisu` image, as a `ShadeTexelData` already in a device
1154
+ * format, because no browser decodes a KTX2 container into a bitmap.
1155
+ *
1156
+ * The half of {@link load_gltf} that is not about pictures. A glTF carries more than a scene to draw
1157
+ * collision hulls, navigation surfaces, spawn markers, whatever a tool reads accessors for — and
1158
+ * those consumers want the accessors and the bytes behind them, not a {@link SceneBundle} they would
1159
+ * have to take apart again.
1160
+ *
1161
+ * @param {string} url un-resolved — the asset manager resolves network paths
1162
+ * @param {Object} options
1163
+ * @param {AssetManager} options.assetManager
1164
+ * @param {AssetRequestScope} [options.scope]
1165
+ * @param {Map<string, File|Blob|ArrayBuffer>} [options.fileMap]
1166
+ * @param {Set<GPUTextureFormat>} [options.texture_support] see {@link load_gltf}
1167
+ * @returns {Promise<TinyGltf>}
1168
+ */
1169
+ export function load_gltf_document(url, { assetManager, scope, fileMap, texture_support } = {}) {
1170
+ const gltf = new TinyGltf(assetManager, scope, texture_support);
1171
+
1172
+ if (fileMap) {
1173
+ gltf.fileMap = fileMap;
1174
+ }
1175
+
1176
+ return gltf.loadFromUrl(url);
1177
+ }
1178
+
1179
+