@woosh/meep-engine 3.14.2 → 3.14.4

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 (1252) 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/Engine.d.ts.map +1 -1
  23. package/src/engine/Engine.js +733 -726
  24. package/src/engine/asset/GameAssetType.d.ts +1 -0
  25. package/src/engine/asset/GameAssetType.js +8 -0
  26. package/src/engine/asset/codec/DecodedImage.d.ts +39 -0
  27. package/src/engine/asset/codec/DecodedImage.d.ts.map +1 -0
  28. package/src/engine/asset/codec/DecodedImage.js +26 -0
  29. package/src/engine/asset/guessAssetType.d.ts.map +1 -1
  30. package/src/engine/asset/guessAssetType.js +10 -0
  31. package/src/engine/asset/load_model_scene_bundle.d.ts +1 -1
  32. package/src/engine/asset/load_model_scene_bundle.d.ts.map +1 -1
  33. package/src/engine/asset/load_model_scene_bundle.js +6 -2
  34. package/src/engine/asset/loaders/USDSceneBundleAssetLoader.d.ts +37 -0
  35. package/src/engine/asset/loaders/USDSceneBundleAssetLoader.d.ts.map +1 -0
  36. package/src/engine/asset/loaders/USDSceneBundleAssetLoader.js +104 -0
  37. package/src/engine/asset/loaders/image/IMAGE_CODEC_REVIEW_2026_08_28.md +83 -71
  38. package/src/engine/asset/loaders/image/ImageDecoderWorker.js +2 -2
  39. package/src/engine/asset/loaders/image/ImageRGBADataLoader.d.ts +8 -9
  40. package/src/engine/asset/loaders/image/ImageRGBADataLoader.d.ts.map +1 -1
  41. package/src/engine/asset/loaders/image/ImageRGBADataLoader.js +12 -3
  42. package/src/engine/asset/loaders/image/avif/encode_image_source.d.ts +70 -0
  43. package/src/engine/asset/loaders/image/avif/encode_image_source.d.ts.map +1 -0
  44. package/src/engine/asset/loaders/image/avif/encode_image_source.js +117 -0
  45. package/src/engine/asset/loaders/image/avif/encoder_worker.d.ts.map +1 -0
  46. package/src/engine/asset/loaders/image/avif/threaded_image_encoder.d.ts.map +1 -0
  47. package/src/engine/asset/loaders/image/codec/AvifCodec.d.ts +34 -0
  48. package/src/engine/asset/loaders/image/codec/AvifCodec.d.ts.map +1 -0
  49. package/src/engine/asset/loaders/image/codec/AvifCodec.js +85 -0
  50. package/src/engine/asset/loaders/image/codec/JpegCodec.d.ts +26 -0
  51. package/src/engine/asset/loaders/image/codec/JpegCodec.d.ts.map +1 -0
  52. package/src/engine/asset/loaders/image/codec/JpegCodec.js +66 -0
  53. package/src/engine/asset/loaders/image/codec/NativeImageDecoder.d.ts +4 -16
  54. package/src/engine/asset/loaders/image/codec/NativeImageDecoder.d.ts.map +1 -1
  55. package/src/engine/asset/loaders/image/codec/NativeImageDecoder.js +2 -2
  56. package/src/engine/asset/loaders/image/codec/ThreadedImageDecoder.d.ts +21 -1
  57. package/src/engine/asset/loaders/image/codec/ThreadedImageDecoder.d.ts.map +1 -1
  58. package/src/engine/asset/loaders/image/codec/ThreadedImageDecoder.js +21 -1
  59. package/src/engine/asset/loaders/image/prototypePNG.d.ts.map +1 -0
  60. package/src/engine/asset/loaders/image/prototypePNG.js +37 -0
  61. package/src/engine/asset/preloader/extractAssetListFromManager.d.ts.map +1 -1
  62. package/src/engine/asset/preloader/extractAssetListFromManager.js +2 -1
  63. package/src/engine/graphics/ecs/mesh/assetTypeByPath.d.ts.map +1 -1
  64. package/src/engine/graphics/ecs/mesh/assetTypeByPath.js +6 -0
  65. package/src/engine/graphics/texture/sampler/avif_to_sampler2d.d.ts +25 -0
  66. package/src/engine/graphics/texture/sampler/avif_to_sampler2d.d.ts.map +1 -0
  67. package/src/engine/graphics/texture/sampler/avif_to_sampler2d.js +42 -0
  68. package/src/engine/graphics/texture/sampler/compare/sampler2d_compare.d.ts.map +1 -0
  69. package/src/engine/graphics/texture/sampler/compare/sampler2d_compare.js +94 -0
  70. package/src/engine/graphics/texture/sampler/compare/sampler2d_max_absolute_difference.d.ts +19 -0
  71. package/src/engine/graphics/texture/sampler/compare/sampler2d_max_absolute_difference.d.ts.map +1 -0
  72. package/src/engine/graphics/texture/sampler/compare/sampler2d_max_absolute_difference.js +62 -0
  73. package/src/engine/graphics/texture/sampler/compare/sampler2d_psnr.d.ts +30 -0
  74. package/src/engine/graphics/texture/sampler/compare/sampler2d_psnr.d.ts.map +1 -0
  75. package/src/engine/graphics/texture/sampler/compare/sampler2d_psnr.js +115 -0
  76. package/src/engine/graphics/texture/sampler/sampler2d_to_avif.d.ts.map +1 -0
  77. package/src/engine/graphics/texture/sampler/sampler2d_to_avif.js +108 -0
  78. package/src/engine/graphics/texture/sampler/sampler2d_to_f16.d.ts +7 -1
  79. package/src/engine/graphics/texture/sampler/sampler2d_to_f16.d.ts.map +1 -1
  80. package/src/engine/graphics/texture/sampler/sampler2d_to_f16.js +28 -21
  81. package/src/engine/graphics/texture/sampler/sampler2d_to_uint8_RGBA.d.ts.map +1 -1
  82. package/src/engine/graphics/texture/sampler/sampler2d_to_uint8_RGBA.js +3 -0
  83. package/src/engine/network/NetworkSession.d.ts +24 -4
  84. package/src/engine/network/NetworkSession.d.ts.map +1 -1
  85. package/src/engine/network/NetworkSession.js +28 -4
  86. package/src/engine/network/orchestrator/NetworkPeer.d.ts +47 -6
  87. package/src/engine/network/orchestrator/NetworkPeer.d.ts.map +1 -1
  88. package/src/engine/network/orchestrator/NetworkPeer.js +184 -56
  89. package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts +97 -11
  90. package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts.map +1 -1
  91. package/src/engine/network/orchestrator/ServerAuthoritativeServer.js +304 -22
  92. package/src/engine/network/replication/Replicator.d.ts +14 -1
  93. package/src/engine/network/replication/Replicator.d.ts.map +1 -1
  94. package/src/engine/network/replication/Replicator.js +44 -3
  95. package/src/engine/network/sim/ActionLog.d.ts +21 -3
  96. package/src/engine/network/sim/ActionLog.d.ts.map +1 -1
  97. package/src/engine/network/sim/ActionLog.js +24 -3
  98. package/src/engine/network/sim/SimAction.d.ts +15 -0
  99. package/src/engine/network/sim/SimAction.d.ts.map +1 -1
  100. package/src/engine/network/sim/SimAction.js +15 -0
  101. package/src/engine/network/sim/SimActionExecutor.d.ts +51 -1
  102. package/src/engine/network/sim/SimActionExecutor.d.ts.map +1 -1
  103. package/src/engine/network/sim/SimActionExecutor.js +73 -5
  104. package/src/engine/network/transport/Channel.d.ts +1 -1
  105. package/src/engine/network/transport/Channel.js +1 -1
  106. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  107. package/src/engine/simulation/Ticker.d.ts.map +1 -1
  108. package/src/engine/simulation/Ticker.js +4 -1
  109. package/src/engine/ui/GUIEngine.d.ts.map +1 -1
  110. package/src/engine/ui/GUIEngine.js +6 -0
  111. package/src/format/image/avif/DECISIONS.md +545 -0
  112. package/src/format/image/avif/api/AvifDecoder.d.ts.map +1 -0
  113. package/src/format/image/avif/api/apply_transformations.d.ts.map +1 -0
  114. package/src/format/image/avif/api/convert_to_rgba.d.ts.map +1 -0
  115. package/src/format/image/avif/api/convert_to_rgba.js +204 -0
  116. package/src/format/image/avif/api/decode_avif.d.ts.map +1 -0
  117. package/src/format/image/avif/api/decode_image_item.d.ts.map +1 -0
  118. package/src/format/image/avif/api/encode_avif.d.ts.map +1 -0
  119. package/src/format/image/avif/av1/decode/Av1FrameContext.d.ts.map +1 -0
  120. package/src/format/image/avif/av1/decode/block_decoded.d.ts.map +1 -0
  121. package/src/format/image/avif/av1/decode/decode_av1_still.d.ts.map +1 -0
  122. package/src/format/image/avif/av1/decode/decode_coefficients.d.ts.map +1 -0
  123. package/src/format/image/avif/av1/decode/decode_palette.d.ts.map +1 -0
  124. package/src/format/image/avif/av1/decode/decode_palette.js +442 -0
  125. package/src/format/image/avif/av1/decode/decode_tile.d.ts.map +1 -0
  126. package/src/format/image/avif/av1/decode/decode_tile.js +1213 -0
  127. package/src/format/image/avif/av1/decode/get_scan.d.ts.map +1 -0
  128. package/src/format/image/avif/av1/decode/read_lr.d.ts.map +1 -0
  129. package/src/format/image/avif/av1/decode/read_lr.js +277 -0
  130. package/src/format/image/avif/av1/decode/read_transform_type.d.ts.map +1 -0
  131. package/src/format/image/avif/av1/decode/read_transform_type.js +92 -0
  132. package/src/format/image/avif/av1/decode/reconstruct.d.ts.map +1 -0
  133. package/src/format/image/avif/av1/decode/reconstruct.js +241 -0
  134. package/src/format/image/avif/av1/decode/transform_type.d.ts.map +1 -0
  135. package/src/format/image/avif/av1/encode/Av1BlockSnapshot.d.ts.map +1 -0
  136. package/src/format/image/avif/av1/encode/Av1EncodeContext.d.ts.map +1 -0
  137. package/src/format/image/avif/av1/encode/build_headers.d.ts.map +1 -0
  138. package/src/format/image/avif/av1/encode/choose_chroma_alpha.d.ts.map +1 -0
  139. package/src/format/image/avif/av1/encode/choose_filters.d.ts.map +1 -0
  140. package/src/format/image/avif/av1/encode/choose_restoration.d.ts.map +1 -0
  141. package/src/format/image/avif/av1/encode/choose_restoration.js +616 -0
  142. package/src/format/image/avif/av1/encode/decode_effort.d.ts.map +1 -0
  143. package/src/format/image/avif/av1/encode/encode_av1_still.d.ts.map +1 -0
  144. package/src/format/image/avif/av1/encode/encode_effort.d.ts.map +1 -0
  145. package/src/format/image/avif/av1/encode/encode_tile.d.ts.map +1 -0
  146. package/src/format/image/avif/av1/encode/encode_tile.js +2331 -0
  147. package/src/format/image/avif/av1/encode/quantise.d.ts.map +1 -0
  148. package/src/format/image/avif/av1/encode/write_coefficients.d.ts.map +1 -0
  149. package/src/format/image/avif/av1/encode/write_lr.d.ts.map +1 -0
  150. package/src/format/image/avif/av1/encode/write_transform_type.d.ts.map +1 -0
  151. package/src/format/image/avif/av1/entropy/CdfContext.d.ts.map +1 -0
  152. package/src/format/image/avif/av1/entropy/SymbolReader.d.ts.map +1 -0
  153. package/src/format/image/avif/av1/entropy/SymbolWriter.d.ts.map +1 -0
  154. package/src/format/image/avif/av1/entropy/coefficient_context.d.ts.map +1 -0
  155. package/src/format/image/avif/av1/entropy/partition_cdf.d.ts.map +1 -0
  156. package/src/format/image/avif/av1/entropy/symbol_cost.d.ts.map +1 -0
  157. package/src/format/image/avif/av1/filter/cdef.d.ts.map +1 -0
  158. package/src/format/image/avif/av1/filter/cdef.js +313 -0
  159. package/src/format/image/avif/av1/filter/loop_filter.d.ts.map +1 -0
  160. package/src/format/image/avif/av1/filter/loop_filter.js +377 -0
  161. package/src/format/image/avif/av1/filter/loop_restoration.d.ts.map +1 -0
  162. package/src/format/image/avif/av1/filter/loop_restoration.js +451 -0
  163. package/src/format/image/avif/av1/filter/superres.d.ts.map +1 -0
  164. package/src/format/image/avif/av1/filter/superres.js +86 -0
  165. package/src/format/image/avif/av1/grain/FilmGrainState.d.ts.map +1 -0
  166. package/src/format/image/avif/av1/grain/film_grain.d.ts.map +1 -0
  167. package/src/format/image/avif/av1/grain/film_grain.js +623 -0
  168. package/src/format/image/avif/av1/obu/FrameHeader.d.ts.map +1 -0
  169. package/src/format/image/avif/av1/obu/ObuHeader.d.ts.map +1 -0
  170. package/src/format/image/avif/av1/obu/SequenceHeader.d.ts.map +1 -0
  171. package/src/format/image/avif/av1/obu/for_each_obu.d.ts.map +1 -0
  172. package/src/format/image/avif/av1/obu/parse_frame_header.d.ts.map +1 -0
  173. package/src/format/image/avif/av1/obu/parse_frame_header.js +841 -0
  174. package/src/format/image/avif/av1/obu/parse_obu_header.d.ts.map +1 -0
  175. package/src/format/image/avif/av1/obu/parse_sequence_header.d.ts.map +1 -0
  176. package/src/format/image/avif/av1/obu/write_frame_header.d.ts.map +1 -0
  177. package/src/format/image/avif/av1/obu/write_sequence_header.d.ts.map +1 -0
  178. package/src/format/image/avif/av1/predict/IntraPredictionState.d.ts.map +1 -0
  179. package/src/format/image/avif/av1/predict/intra_filter_type.d.ts.map +1 -0
  180. package/src/format/image/avif/av1/predict/predict_chroma_from_luma.d.ts.map +1 -0
  181. package/src/format/image/avif/av1/predict/predict_chroma_from_luma.js +153 -0
  182. package/src/format/image/avif/av1/predict/predict_intra.d.ts.map +1 -0
  183. package/src/format/image/avif/av1/predict/predict_intra.js +803 -0
  184. package/src/format/image/avif/av1/predict/predict_palette.d.ts.map +1 -0
  185. package/src/format/image/avif/av1/tables/av1_symbols.d.ts.map +1 -0
  186. package/src/format/image/avif/av1/tables/av1_symbols.js +419 -0
  187. package/src/format/image/avif/av1/tables/block_tables.d.ts.map +1 -0
  188. package/src/format/image/avif/av1/tables/block_tables.js +270 -0
  189. package/src/format/image/avif/av1/tables/cdf_tables.d.ts.map +1 -0
  190. package/src/format/image/avif/av1/tables/cdf_tables.js +1893 -0
  191. package/src/format/image/avif/av1/tables/coefficient_tables.d.ts.map +1 -0
  192. package/src/format/image/avif/av1/tables/coefficient_tables.js +82 -0
  193. package/src/format/image/avif/av1/tables/derived_block_tables.d.ts.map +1 -0
  194. package/src/format/image/avif/av1/tables/filter_tables.d.ts.map +1 -0
  195. package/src/format/image/avif/av1/tables/filter_tables.js +313 -0
  196. package/src/format/image/avif/av1/tables/grain_tables.d.ts.map +1 -0
  197. package/src/format/image/avif/av1/tables/grain_tables.js +190 -0
  198. package/src/format/image/avif/av1/tables/prediction_tables.d.ts.map +1 -0
  199. package/src/format/image/avif/av1/tables/prediction_tables.js +223 -0
  200. package/src/format/image/avif/av1/tables/quantizer_matrix_tables.d.ts.map +1 -0
  201. package/src/format/image/avif/av1/tables/quantizer_matrix_tables.js +38 -0
  202. package/src/format/image/avif/av1/tables/quantizer_tables.d.ts.map +1 -0
  203. package/src/format/image/avif/av1/tables/quantizer_tables.js +160 -0
  204. package/src/format/image/avif/av1/tables/scan_tables.d.ts.map +1 -0
  205. package/src/format/image/avif/av1/tables/scan_tables.js +727 -0
  206. package/src/format/image/avif/av1/tables/segmentation_tables.d.ts.map +1 -0
  207. package/src/format/image/avif/av1/tables/segmentation_tables.js +48 -0
  208. package/src/format/image/avif/av1/tables/transform_tables.d.ts.map +1 -0
  209. package/src/format/image/avif/av1/tables/transform_tables.js +140 -0
  210. package/src/format/image/avif/av1/tables/unpack_table.d.ts.map +1 -0
  211. package/src/format/image/avif/av1/tables/unpack_table.js +73 -0
  212. package/src/format/image/avif/av1/transform/forward_transform_2d.d.ts.map +1 -0
  213. package/src/format/image/avif/av1/transform/inverse_transform_1d.d.ts.map +1 -0
  214. package/src/format/image/avif/av1/transform/inverse_transform_1d.js +590 -0
  215. package/src/format/image/avif/av1/transform/inverse_transform_2d.d.ts.map +1 -0
  216. package/src/format/image/avif/av1/transform/inverse_transform_2d.js +180 -0
  217. package/src/format/image/avif/av1/util/ceil_log2.d.ts.map +1 -0
  218. package/src/format/image/avif/av1/util/floor_log2.d.ts +20 -0
  219. package/src/format/image/avif/av1/util/floor_log2.d.ts.map +1 -0
  220. package/src/format/image/avif/av1/util/floor_log2.js +20 -0
  221. package/src/format/image/avif/av1/util/round2.d.ts.map +1 -0
  222. package/src/format/image/avif/av1/util/round2_signed.d.ts.map +1 -0
  223. package/src/format/image/avif/av1/util/tile_log2.d.ts.map +1 -0
  224. package/src/format/image/avif/bitstream/BitReader.d.ts.map +1 -0
  225. package/src/format/image/avif/bitstream/BitWriter.d.ts.map +1 -0
  226. package/src/format/image/avif/color/ColourTransform.d.ts.map +1 -0
  227. package/src/format/image/avif/color/YuvImage.d.ts.map +1 -0
  228. package/src/format/image/avif/color/clamp_sample.d.ts.map +1 -0
  229. package/src/format/image/avif/color/linear_to_transfer.d.ts.map +1 -0
  230. package/src/format/image/avif/color/linear_to_transfer.js +126 -0
  231. package/src/format/image/avif/color/primaries.d.ts.map +1 -0
  232. package/src/format/image/avif/color/rgb_row_to_ycbcr.d.ts.map +1 -0
  233. package/src/format/image/avif/color/transfer_to_linear.d.ts.map +1 -0
  234. package/src/format/image/avif/color/transfer_to_linear.js +171 -0
  235. package/src/format/image/avif/color/upsample_chroma_row.d.ts.map +1 -0
  236. package/src/format/image/avif/color/upsample_chroma_row.js +89 -0
  237. package/src/format/image/avif/color/ycbcr_row_to_rgb.d.ts.map +1 -0
  238. package/src/format/image/avif/color/ycbcr_row_to_rgb.js +78 -0
  239. package/src/format/image/avif/heif/AvifFile.d.ts.map +1 -0
  240. package/src/format/image/avif/heif/ItemProperty.d.ts.map +1 -0
  241. package/src/format/image/avif/heif/find_item_property.d.ts.map +1 -0
  242. package/src/format/image/avif/heif/find_item_references.d.ts.map +1 -0
  243. package/src/format/image/avif/heif/find_items_referencing.d.ts.map +1 -0
  244. package/src/format/image/avif/heif/parse_avif_file.d.ts.map +1 -0
  245. package/src/format/image/avif/heif/parse_avif_file.js +384 -0
  246. package/src/format/image/avif/heif/parse_image_grid.d.ts.map +1 -0
  247. package/src/format/image/avif/heif/parse_image_grid.js +49 -0
  248. package/src/format/image/avif/heif/parse_item_property.d.ts.map +1 -0
  249. package/src/format/image/avif/heif/read_item_data.d.ts.map +1 -0
  250. package/src/format/image/avif/heif/write_avif_file.d.ts.map +1 -0
  251. package/src/format/image/avif/heif/write_item_property.d.ts.map +1 -0
  252. package/src/format/image/avif/index.d.ts +12 -0
  253. package/src/format/image/avif/index.d.ts.map +1 -0
  254. package/src/format/image/avif/index.js +58 -0
  255. package/src/format/image/avif/isobmff/BoxHeader.d.ts.map +1 -0
  256. package/src/format/image/avif/isobmff/BoxWriter.d.ts +118 -0
  257. package/src/format/image/avif/isobmff/BoxWriter.d.ts.map +1 -0
  258. package/src/format/image/avif/isobmff/BoxWriter.js +264 -0
  259. package/src/format/image/avif/isobmff/for_each_box.d.ts.map +1 -0
  260. package/src/format/image/avif/isobmff/read_box_header.d.ts.map +1 -0
  261. package/src/format/image/avif/isobmff/read_full_box_header.d.ts.map +1 -0
  262. package/src/format/image/jpeg/JpegFrame.d.ts.map +1 -0
  263. package/src/format/image/jpeg/JpegFrameComponent.d.ts.map +1 -0
  264. package/src/format/image/jpeg/JpegImage.d.ts.map +1 -0
  265. package/src/format/image/jpeg/JpegImage.js +664 -0
  266. package/src/format/image/jpeg/buildComponentData.d.ts.map +1 -0
  267. package/src/format/image/jpeg/buildHuffmanTable.d.ts.map +1 -0
  268. package/src/format/image/jpeg/decodeScan.d.ts.map +1 -0
  269. package/src/format/image/jpeg/idct8x8_float.d.ts.map +1 -0
  270. package/src/format/image/jpeg/idct8x8_float.js +31 -0
  271. package/src/format/image/jpeg/jpeg_component_row.d.ts.map +1 -0
  272. package/src/format/image/jpeg/jpeg_decode.d.ts.map +1 -0
  273. package/src/format/image/png/PNG.d.ts.map +1 -0
  274. package/src/format/image/png/PNGReader.d.ts +158 -0
  275. package/src/format/image/png/PNGReader.d.ts.map +1 -0
  276. package/src/format/image/png/PNGReader.js +656 -0
  277. package/src/format/image/png/PNG_HEADER_BYTES.d.ts.map +1 -0
  278. package/src/format/image/png/chunk/png_chunk_decode_iTXt.d.ts.map +1 -0
  279. package/src/format/image/png/chunk/png_chunk_decode_iTXt.js +53 -0
  280. package/src/format/image/png/chunk/png_chunk_decode_zTXt.d.ts.map +1 -0
  281. package/src/format/image/png/chunk/png_chunk_decode_zTXt.js +42 -0
  282. package/src/format/image/png/crc32.d.ts +2 -0
  283. package/src/format/image/png/crc32.d.ts.map +1 -0
  284. package/src/format/image/png/crc32.js +8 -0
  285. package/src/format/image/png/filter/png_filter_unFilterAverage.d.ts.map +1 -0
  286. package/src/format/image/png/filter/png_filter_unFilterNone.d.ts.map +1 -0
  287. package/src/format/image/png/filter/png_filter_unFilterPaeth.d.ts.map +1 -0
  288. package/src/format/image/png/filter/png_filter_unFilterSub.d.ts.map +1 -0
  289. package/src/format/image/png/filter/png_filter_unFilterUp.d.ts.map +1 -0
  290. package/src/format/image/png/filter/png_unfilter.d.ts.map +1 -0
  291. package/src/format/image/png/filter/png_unfilter.js +68 -0
  292. package/src/format/image/png/png_inflate.d.ts.map +1 -0
  293. package/src/format/image/png/png_unpack_samples.d.ts.map +1 -0
  294. package/src/format/scene/gltf/GLTF_PRIMITIVE_MODE.d.ts.map +1 -0
  295. package/src/format/scene/gltf/MESHOPT_COMPRESSION_PLAN.md +793 -0
  296. package/src/format/scene/gltf/coalesce_array_duplicates.d.ts.map +1 -0
  297. package/src/format/scene/gltf/ext/GltfBufferViewExtension.d.ts.map +1 -0
  298. package/src/format/scene/gltf/ext/GltfBufferViewExtensionSet.d.ts.map +1 -0
  299. package/src/format/scene/gltf/ext/GltfBufferViewExtensionSet.js +109 -0
  300. package/src/format/scene/gltf/ext/gltf_apply_buffer_view_extensions.d.ts.map +1 -0
  301. package/src/format/scene/gltf/ext/gltf_buffer_view_extensions.d.ts.map +1 -0
  302. package/src/format/scene/gltf/ext/gltf_geometry_extensions.d.ts.map +1 -0
  303. package/src/format/scene/gltf/ext/meshopt/MeshoptBufferViewExtension.d.ts.map +1 -0
  304. package/src/format/scene/gltf/ext/meshopt/MeshoptBufferViewExtension.js +301 -0
  305. package/src/format/scene/gltf/gltf_component_type.d.ts.map +1 -0
  306. package/src/format/scene/gltf/gltf_node_world_matrices.d.ts.map +1 -0
  307. package/src/format/scene/gltf/gltf_node_world_matrices.js +137 -0
  308. package/src/format/scene/gltf/gltf_parse_container.d.ts.map +1 -0
  309. package/src/format/scene/gltf/gltf_read_accessor.d.ts.map +1 -0
  310. package/src/format/scene/gltf/gltf_read_accessor.js +294 -0
  311. package/src/format/scene/gltf/gltf_used_image_indices.d.ts +51 -0
  312. package/src/format/scene/gltf/gltf_used_image_indices.d.ts.map +1 -0
  313. package/src/format/scene/gltf/gltf_used_image_indices.js +122 -0
  314. package/src/format/scene/usd/UsdError.d.ts.map +1 -0
  315. package/src/format/scene/usd/parse_usda.d.ts.map +1 -0
  316. package/src/format/scene/usd/unpack_usdz.d.ts.map +1 -0
  317. package/src/format/scene/usd/unpack_usdz.js +106 -0
  318. package/src/format/scene/usd/usd_compose_transform.d.ts.map +1 -0
  319. package/src/format/scene/usd/usd_compose_transform.js +258 -0
  320. package/src/format/scene/usd/usd_lz4.d.ts.map +1 -0
  321. package/src/format/scene/usd/usd_lz4.js +182 -0
  322. package/src/format/scene/usd/usd_triangulate.d.ts.map +1 -0
  323. package/src/format/texture/TexelPayload.d.ts +55 -0
  324. package/src/format/texture/TexelPayload.d.ts.map +1 -0
  325. package/src/format/texture/TexelPayload.js +39 -0
  326. package/src/format/texture/basis/BasisBitReader.d.ts +77 -0
  327. package/src/format/texture/basis/BasisBitReader.d.ts.map +1 -0
  328. package/src/format/texture/basis/BasisBitReader.js +231 -0
  329. package/src/format/texture/basis/BasisHuffmanTable.d.ts.map +1 -0
  330. package/src/format/texture/basis/astc_block.d.ts +92 -0
  331. package/src/format/texture/basis/astc_block.d.ts.map +1 -0
  332. package/src/format/texture/basis/astc_block.js +164 -0
  333. package/src/format/texture/basis/astc_integer_sequence.d.ts +59 -0
  334. package/src/format/texture/basis/astc_integer_sequence.d.ts.map +1 -0
  335. package/src/format/texture/basis/astc_integer_sequence.js +251 -0
  336. package/src/format/texture/basis/astc_partition.d.ts +56 -0
  337. package/src/format/texture/basis/astc_partition.d.ts.map +1 -0
  338. package/src/format/texture/basis/astc_partition.js +199 -0
  339. package/src/format/texture/basis/basis_read_huffman_table.d.ts.map +1 -0
  340. package/src/format/texture/basis/etc1s/Etc1sSelectorHistory.d.ts.map +1 -0
  341. package/src/format/texture/basis/etc1s/etc1s_block_colors.d.ts.map +1 -0
  342. package/src/format/texture/basis/etc1s/etc1s_decode_slice.d.ts.map +1 -0
  343. package/src/format/texture/basis/etc1s/etc1s_decode_slice.js +290 -0
  344. package/src/format/texture/basis/etc1s/etc1s_read_endpoint_codebook.d.ts.map +1 -0
  345. package/src/format/texture/basis/etc1s/etc1s_read_selector_codebook.d.ts.map +1 -0
  346. package/src/format/texture/basis/etc1s/etc1s_read_slice_tables.d.ts.map +1 -0
  347. package/src/format/texture/basis/transcode/build_range_plan.d.ts +46 -0
  348. package/src/format/texture/basis/transcode/build_range_plan.d.ts.map +1 -0
  349. package/src/format/texture/basis/transcode/etc1s_to_astc.d.ts +30 -0
  350. package/src/format/texture/basis/transcode/etc1s_to_astc.d.ts.map +1 -0
  351. package/src/format/texture/basis/transcode/etc1s_to_astc.js +328 -0
  352. package/src/format/texture/basis/transcode/etc1s_to_bc1.d.ts +34 -0
  353. package/src/format/texture/basis/transcode/etc1s_to_bc1.d.ts.map +1 -0
  354. package/src/format/texture/basis/transcode/etc1s_to_bc1.js +486 -0
  355. package/src/format/texture/basis/transcode/etc1s_to_bc7.d.ts +27 -0
  356. package/src/format/texture/basis/transcode/etc1s_to_bc7.d.ts.map +1 -0
  357. package/src/format/texture/basis/transcode/etc1s_to_etc2.d.ts +31 -0
  358. package/src/format/texture/basis/transcode/etc1s_to_etc2.d.ts.map +1 -0
  359. package/src/format/texture/basis/transcode/etc1s_to_etc2.js +332 -0
  360. package/src/format/texture/basis/transcode/etc1s_to_rgba8.d.ts +39 -0
  361. package/src/format/texture/basis/transcode/etc1s_to_rgba8.d.ts.map +1 -0
  362. package/src/format/texture/basis/transcode/etc1s_to_rgba8.js +115 -0
  363. package/src/format/texture/basis/transcode/fit_endpoints.d.ts +79 -0
  364. package/src/format/texture/basis/transcode/fit_endpoints.d.ts.map +1 -0
  365. package/src/format/texture/basis/transcode/fit_endpoints.js +297 -0
  366. package/src/format/texture/basis/transcode_basis.d.ts +109 -0
  367. package/src/format/texture/basis/transcode_basis.d.ts.map +1 -0
  368. package/src/format/texture/basis/transcode_basis.js +250 -0
  369. package/src/format/texture/basis/transcode_uastc.d.ts +55 -0
  370. package/src/format/texture/basis/transcode_uastc.d.ts.map +1 -0
  371. package/src/format/texture/basis/transcode_uastc.js +117 -0
  372. package/src/format/texture/basis/uastc/bc7_tables.d.ts +111 -0
  373. package/src/format/texture/basis/uastc/bc7_tables.d.ts.map +1 -0
  374. package/src/format/texture/basis/uastc/bc7_tables.js +276 -0
  375. package/src/format/texture/basis/uastc/bc7_write_block.d.ts +124 -0
  376. package/src/format/texture/basis/uastc/bc7_write_block.d.ts.map +1 -0
  377. package/src/format/texture/basis/uastc/bc7_write_block.js +227 -0
  378. package/src/format/texture/basis/uastc/uastc_decode_block.d.ts +105 -0
  379. package/src/format/texture/basis/uastc/uastc_decode_block.d.ts.map +1 -0
  380. package/src/format/texture/basis/uastc/uastc_decode_block.js +480 -0
  381. package/src/format/texture/basis/uastc/uastc_tables.d.ts +240 -0
  382. package/src/format/texture/basis/uastc/uastc_tables.d.ts.map +1 -0
  383. package/src/format/texture/basis/uastc/uastc_tables.js +383 -0
  384. package/src/format/texture/basis/uastc/uastc_to_astc.d.ts +30 -0
  385. package/src/format/texture/basis/uastc/uastc_to_astc.d.ts.map +1 -0
  386. package/src/format/texture/basis/uastc/uastc_to_astc.js +421 -0
  387. package/src/format/texture/basis/uastc/uastc_to_bc5.d.ts +26 -0
  388. package/src/format/texture/basis/uastc/uastc_to_bc5.d.ts.map +1 -0
  389. package/src/format/texture/basis/uastc/uastc_to_bc5.js +115 -0
  390. package/src/format/texture/basis/uastc/uastc_to_bc7.d.ts +36 -0
  391. package/src/format/texture/basis/uastc/uastc_to_bc7.d.ts.map +1 -0
  392. package/src/format/texture/basis/uastc/uastc_to_bc7.js +602 -0
  393. package/src/format/texture/basis/uastc/uastc_to_rgba8.d.ts +37 -0
  394. package/src/format/texture/basis/uastc/uastc_to_rgba8.d.ts.map +1 -0
  395. package/src/format/texture/basis/uastc/uastc_to_rgba8.js +87 -0
  396. package/src/format/texture/bc/bc1_write_block.d.ts +28 -0
  397. package/src/format/texture/bc/bc1_write_block.d.ts.map +1 -0
  398. package/src/format/texture/bc/bc1_write_block.js +41 -0
  399. package/src/format/texture/bc/bc4_write_block.d.ts +32 -0
  400. package/src/format/texture/bc/bc4_write_block.d.ts.map +1 -0
  401. package/src/format/texture/bc/bc4_write_block.js +50 -0
  402. package/src/format/texture/bc/bc6h_write_block_mode11.d.ts +30 -0
  403. package/src/format/texture/bc/bc6h_write_block_mode11.d.ts.map +1 -0
  404. package/src/format/texture/bc/bc6h_write_block_mode11.js +62 -0
  405. package/src/format/texture/ktx2/KTX2_IDENTIFIER.d.ts.map +1 -0
  406. package/src/format/texture/ktx2/KhrDfModel.d.ts.map +1 -0
  407. package/src/format/texture/ktx2/SupercompressionScheme.d.ts.map +1 -0
  408. package/src/format/texture/ktx2/ktx2_read.d.ts +105 -0
  409. package/src/format/texture/ktx2/ktx2_read.d.ts.map +1 -0
  410. package/src/format/texture/ktx2/ktx2_read.js +909 -0
  411. package/src/format/texture/ktx2/ktx2_read_basis_lz_global_data.d.ts +27 -0
  412. package/src/format/texture/ktx2/ktx2_read_basis_lz_global_data.d.ts.map +1 -0
  413. package/src/format/texture/ktx2/ktx2_read_basis_lz_global_data.js +189 -0
  414. package/src/format/texture/ktx2/vk_format_to_texture_format.d.ts +55 -0
  415. package/src/format/texture/ktx2/vk_format_to_texture_format.d.ts.map +1 -0
  416. package/src/format/texture/ktx2/vk_format_to_texture_format.js +290 -0
  417. package/src/shade/descriptor/texture/format/gpu_texture_format_feature.d.ts +16 -0
  418. package/src/shade/descriptor/texture/format/gpu_texture_format_feature.d.ts.map +1 -0
  419. package/src/shade/descriptor/texture/format/gpu_texture_format_feature.js +44 -0
  420. package/src/shade/descriptor/texture/format/gpu_texture_format_info.d.ts +16 -0
  421. package/src/shade/descriptor/texture/format/gpu_texture_format_info.d.ts.map +1 -1
  422. package/src/shade/descriptor/texture/format/gpu_texture_format_info.js +24 -0
  423. package/src/shade/descriptor/texture/format/gpu_texture_format_srgb.d.ts +19 -0
  424. package/src/shade/descriptor/texture/format/gpu_texture_format_srgb.d.ts.map +1 -0
  425. package/src/shade/descriptor/texture/format/gpu_texture_format_srgb.js +50 -0
  426. package/src/shade/device/COPY_BYTES_PER_ROW_ALIGNMENT.d.ts +14 -0
  427. package/src/shade/device/COPY_BYTES_PER_ROW_ALIGNMENT.d.ts.map +1 -0
  428. package/src/shade/device/COPY_BYTES_PER_ROW_ALIGNMENT.js +13 -0
  429. package/src/shade/device/mock/SoftwareGPUDevice.d.ts.map +1 -1
  430. package/src/shade/device/mock/SoftwareGPUDevice.js +37 -3
  431. package/src/shade/device/mock/SoftwareGPUTexture.d.ts +4 -2
  432. package/src/shade/device/mock/SoftwareGPUTexture.d.ts.map +1 -1
  433. package/src/shade/device/mock/SoftwareGPUTexture.js +39 -3
  434. package/src/shade/device/mock/SoftwareGPUTextureView.d.ts +7 -0
  435. package/src/shade/device/mock/SoftwareGPUTextureView.d.ts.map +1 -1
  436. package/src/shade/device/mock/SoftwareGPUTextureView.js +8 -0
  437. package/src/shade/device/mock/texture_copy.d.ts.map +1 -1
  438. package/src/shade/device/mock/texture_copy.js +74 -12
  439. package/src/shade/playground/basis_textures/README.md +105 -0
  440. package/src/shade/playground/basis_textures/index.html +141 -0
  441. package/src/shade/playground/basis_textures/main.d.ts +8 -0
  442. package/src/shade/playground/basis_textures/main.d.ts.map +1 -0
  443. package/src/shade/playground/basis_textures/main.js +351 -0
  444. package/src/shade/playground/basis_textures/make_basis_gltf.d.mts +2 -0
  445. package/src/shade/playground/basis_textures/make_basis_gltf.d.mts.map +1 -0
  446. package/src/shade/playground/basis_textures/make_basis_gltf.mjs +197 -0
  447. package/src/shade/playground/basis_textures/node_modules/basis_universal/bin/basisu.exe +0 -0
  448. package/src/shade/playground/basis_textures/texture_inventory.d.ts +28 -0
  449. package/src/shade/playground/basis_textures/texture_inventory.d.ts.map +1 -0
  450. package/src/shade/playground/basis_textures/texture_inventory.js +98 -0
  451. package/src/shade/playground/image_decode_bench/README.md +42 -0
  452. package/src/shade/playground/image_decode_bench/decode_worker.d.ts +2 -0
  453. package/src/shade/playground/image_decode_bench/decode_worker.d.ts.map +1 -0
  454. package/src/shade/playground/image_decode_bench/decode_worker.js +19 -0
  455. package/src/shade/playground/image_decode_bench/index.html +34 -0
  456. package/src/shade/playground/image_decode_bench/main.d.ts +2 -0
  457. package/src/shade/playground/image_decode_bench/main.d.ts.map +1 -0
  458. package/src/shade/playground/image_decode_bench/main.js +211 -0
  459. package/src/shade/playground/particle_system/README.md +98 -0
  460. package/src/shade/playground/particle_system/index.html +124 -0
  461. package/src/shade/playground/particle_system/main.d.ts +2 -0
  462. package/src/shade/playground/particle_system/main.d.ts.map +1 -0
  463. package/src/shade/playground/particle_system/main.js +180 -0
  464. package/src/shade/playground/particle_system/particle_scene.d.ts +52 -0
  465. package/src/shade/playground/particle_system/particle_scene.d.ts.map +1 -0
  466. package/src/shade/playground/particle_system/particle_scene.js +552 -0
  467. package/src/shade/playground/skinned_blas_refit/README.md +1 -1
  468. package/src/shade/playground/skinned_blas_refit/index.html +15 -1
  469. package/src/shade/playground/skinned_blas_refit/main.d.ts.map +1 -1
  470. package/src/shade/playground/skinned_blas_refit/main.js +339 -3
  471. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts +8 -1
  472. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts.map +1 -1
  473. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.js +27 -5
  474. package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.d.ts +27 -0
  475. package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.d.ts.map +1 -0
  476. package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.js +127 -0
  477. package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.d.ts.map +1 -1
  478. package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.js +3 -3
  479. package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.d.ts.map +1 -1
  480. package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.js +10 -8
  481. package/src/shade/playground/skinned_mesh_soup/README.md +122 -0
  482. package/src/shade/playground/skinned_mesh_soup/index.html +199 -0
  483. package/src/shade/playground/skinned_mesh_soup/main.d.ts +7 -0
  484. package/src/shade/playground/skinned_mesh_soup/main.d.ts.map +1 -0
  485. package/src/shade/playground/skinned_mesh_soup/main.js +564 -0
  486. package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.d.ts +23 -0
  487. package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.d.ts.map +1 -0
  488. package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.js +409 -0
  489. package/src/shade/playground/texture_encode/README.md +109 -0
  490. package/src/shade/playground/texture_encode/index.html +133 -0
  491. package/src/shade/playground/texture_encode/main.d.ts +24 -0
  492. package/src/shade/playground/texture_encode/main.d.ts.map +1 -0
  493. package/src/shade/playground/texture_encode/main.js +1430 -0
  494. package/src/shade/playground/texture_encode/panel_view.d.ts +118 -0
  495. package/src/shade/playground/texture_encode/panel_view.d.ts.map +1 -0
  496. package/src/shade/playground/texture_encode/panel_view.js +363 -0
  497. package/src/shade/renderer/Renderer.js +2 -2
  498. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  499. package/src/shade/renderer/animation/GPUAnimationManager.js +49 -5
  500. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  501. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +32 -14
  502. package/src/shade/renderer/geometry/GPUGeometryManager.d.ts.map +1 -1
  503. package/src/shade/renderer/geometry/GPUGeometryManager.js +591 -497
  504. package/src/shade/renderer/geometry/GPUGeometryMetadata.d.ts +9 -0
  505. package/src/shade/renderer/geometry/GPUGeometryMetadata.d.ts.map +1 -1
  506. package/src/shade/renderer/geometry/GPUGeometryMetadata.js +10 -0
  507. package/src/shade/renderer/geometry/bvh/BLAS_REFIT_BATCH_PLAN.md +606 -0
  508. package/src/shade/renderer/geometry/bvh/BLAS_REFIT_TARGET_STRUCT.d.ts +17 -0
  509. package/src/shade/renderer/geometry/bvh/BLAS_REFIT_TARGET_STRUCT.d.ts.map +1 -0
  510. package/src/shade/renderer/geometry/bvh/BLAS_REFIT_TARGET_STRUCT.js +44 -0
  511. package/src/shade/renderer/geometry/bvh/GPUBLASRefitBatch.d.ts +58 -0
  512. package/src/shade/renderer/geometry/bvh/GPUBLASRefitBatch.d.ts.map +1 -0
  513. package/src/shade/renderer/geometry/bvh/GPUBLASRefitBatch.js +362 -0
  514. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts +38 -0
  515. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
  516. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +730 -617
  517. package/src/shade/renderer/geometry/bvh/GPUGeometryMeshletsBVH.d.ts +15 -2
  518. package/src/shade/renderer/geometry/bvh/GPUGeometryMeshletsBVH.d.ts.map +1 -1
  519. package/src/shade/renderer/geometry/bvh/GPUGeometryMeshletsBVH.js +15 -1
  520. package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch.d.ts +39 -0
  521. package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch.d.ts.map +1 -0
  522. package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch.js +134 -0
  523. package/src/shade/renderer/geometry/virtual/build/gltf/gltf_collect_geometries.js +3 -3
  524. package/src/shade/renderer/geometry/virtual/build/gltf/gltf_open_document.js +3 -3
  525. package/src/shade/renderer/geometry/virtual/build/gltf/gltf_read_geometry.js +1 -1
  526. package/src/shade/renderer/gpu_primitive/bvh/BVH_NODE_LAYOUT_DEFINITION.d.ts +17 -0
  527. package/src/shade/renderer/gpu_primitive/bvh/BVH_NODE_LAYOUT_DEFINITION.d.ts.map +1 -0
  528. package/src/shade/renderer/gpu_primitive/bvh/BVH_NODE_LAYOUT_DEFINITION.js +30 -0
  529. package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +8 -1
  530. package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_refit_climb.d.ts +34 -0
  531. package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_refit_climb.d.ts.map +1 -0
  532. package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_refit_climb.js +102 -0
  533. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.d.ts +11 -9
  534. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.d.ts.map +1 -1
  535. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.js +24 -86
  536. package/src/shade/renderer/loader/gltf/gltf_create_texture.d.ts +18 -0
  537. package/src/shade/renderer/loader/gltf/gltf_create_texture.d.ts.map +1 -0
  538. package/src/shade/renderer/loader/gltf/gltf_create_texture.js +103 -0
  539. package/src/shade/renderer/loader/gltf/gltf_image_roles.d.ts +26 -0
  540. package/src/shade/renderer/loader/gltf/gltf_image_roles.d.ts.map +1 -0
  541. package/src/shade/renderer/loader/gltf/gltf_image_roles.js +108 -0
  542. package/src/shade/renderer/loader/gltf/load_gltf.d.ts +10 -3
  543. package/src/shade/renderer/loader/gltf/load_gltf.d.ts.map +1 -1
  544. package/src/shade/renderer/loader/gltf/load_gltf.js +1179 -1253
  545. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +18 -1
  546. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts.map +1 -1
  547. package/src/shade/renderer/loader/gltf/tiny-gltf.js +837 -646
  548. package/src/shade/renderer/loader/usd/load_usd.js +3 -3
  549. package/src/shade/renderer/loader/usd/usd_build_scene.js +2 -2
  550. package/src/shade/renderer/loader/usd/usd_decode_image.d.ts +6 -5
  551. package/src/shade/renderer/loader/usd/usd_decode_image.d.ts.map +1 -1
  552. package/src/shade/renderer/loader/usd/usd_decode_image.js +197 -384
  553. package/src/shade/renderer/particles/cull/chunk_particle_cull.d.ts.map +1 -1
  554. package/src/shade/renderer/particles/cull/chunk_particle_cull.js +3 -1
  555. package/src/shade/renderer/particles/data/chunk_particle_emitter.js +1 -1
  556. package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts +1 -1
  557. package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts.map +1 -1
  558. package/src/shade/renderer/particles/isa/InstructionStream.d.ts +89 -0
  559. package/src/shade/renderer/particles/isa/InstructionStream.d.ts.map +1 -0
  560. package/src/shade/renderer/particles/isa/InstructionStream.js +162 -0
  561. package/src/shade/renderer/particles/isa/ParticleAssembler.d.ts +1 -48
  562. package/src/shade/renderer/particles/isa/ParticleAssembler.d.ts.map +1 -1
  563. package/src/shade/renderer/particles/isa/ParticleAssembler.js +25 -114
  564. package/src/shade/renderer/particles/shaders/chunk_particle_curve_animation.d.ts.map +1 -1
  565. package/src/shade/renderer/particles/shaders/chunk_particle_curve_animation.js +4 -2
  566. package/src/shade/renderer/particles/shaders/chunk_particle_lighting.d.ts +4 -4
  567. package/src/shade/renderer/particles/shaders/chunk_particle_lighting.d.ts.map +1 -1
  568. package/src/shade/renderer/particles/shaders/chunk_particle_lighting.js +7 -5
  569. package/src/shade/renderer/particles/shaders/chunk_particle_render_math.d.ts.map +1 -1
  570. package/src/shade/renderer/particles/shaders/chunk_particle_render_math.js +3 -1
  571. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  572. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +3 -1
  573. package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
  574. package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +5 -2
  575. package/src/shade/renderer/particles/shaders/shader_particle_render.d.ts.map +1 -1
  576. package/src/shade/renderer/particles/shaders/shader_particle_render.js +9 -2
  577. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  578. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +3 -1
  579. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  580. package/src/shade/renderer/postprocess/taa/TAA.d.ts +3 -3
  581. package/src/shade/renderer/postprocess/taa/TAA.d.ts.map +1 -1
  582. package/src/shade/renderer/postprocess/taa/TAA.js +2 -6
  583. package/src/shade/renderer/postprocess/taa/chunk_depth_clip_offset_codec.d.ts +18 -0
  584. package/src/shade/renderer/postprocess/taa/chunk_depth_clip_offset_codec.d.ts.map +1 -0
  585. package/src/shade/renderer/postprocess/taa/chunk_depth_clip_offset_codec.js +36 -0
  586. package/src/shade/renderer/postprocess/taa/chunk_taa_history_color_bounding_box_YCoCg.d.ts.map +1 -1
  587. package/src/shade/renderer/postprocess/taa/chunk_taa_history_color_bounding_box_YCoCg.js +4 -1
  588. package/src/shade/renderer/postprocess/taa/shader_depth_occlusion_clip.d.ts.map +1 -1
  589. package/src/shade/renderer/postprocess/taa/shader_depth_occlusion_clip.js +13 -8
  590. package/src/shade/renderer/postprocess/taa/shader_taa.d.ts +1 -1
  591. package/src/shade/renderer/postprocess/taa/shader_taa.d.ts.map +1 -1
  592. package/src/shade/renderer/postprocess/taa/shader_taa.js +52 -38
  593. package/src/shade/renderer/restir/di/chunk_restir_temporal_reuse.d.ts +4 -2
  594. package/src/shade/renderer/restir/di/chunk_restir_temporal_reuse.d.ts.map +1 -1
  595. package/src/shade/renderer/restir/di/chunk_restir_temporal_reuse.js +9 -6
  596. package/src/shade/renderer/scene/optimization/deduplicate_images.js +93 -93
  597. package/src/shade/renderer/scene/optimization/downscale_images.js +216 -216
  598. package/src/shade/renderer/scene/serialization/decode_image_source_hdr.js +1 -1
  599. package/src/shade/renderer/scene/serialization/deserialize_scene.js +1 -1
  600. package/src/shade/renderer/scene/serialization/write_image_source.js +1 -1
  601. package/src/shade/renderer/shader/chunk/color/iCtCp/chunk_eotf_st2084.d.ts +1 -1
  602. package/src/shade/renderer/shader/chunk/color/iCtCp/chunk_eotf_st2084.js +1 -1
  603. package/src/shade/renderer/shader/chunk/texture/sample/chunk_texture_sample_catmullrom_hardware_5tap_uv.d.ts +2 -1
  604. package/src/shade/renderer/shader/chunk/texture/sample/chunk_texture_sample_catmullrom_hardware_5tap_uv.d.ts.map +1 -1
  605. package/src/shade/renderer/shader/chunk/texture/sample/chunk_texture_sample_catmullrom_hardware_5tap_uv.js +2 -1
  606. package/src/shade/renderer/texture/COMPRESSED_TEXTURE_PLAN_2026_09_01.md +893 -10
  607. package/src/shade/renderer/texture/encode/ENCODE_NOTES_2026_09_02.md +462 -0
  608. package/src/shade/renderer/texture/encode/chunk_astc_encode_block_4x4_rgb.d.ts +33 -0
  609. package/src/shade/renderer/texture/encode/chunk_astc_encode_block_4x4_rgb.d.ts.map +1 -0
  610. package/src/shade/renderer/texture/encode/chunk_astc_encode_block_4x4_rgb.js +310 -0
  611. package/src/shade/renderer/texture/encode/chunk_astc_pack_4x4_rgb.d.ts +17 -0
  612. package/src/shade/renderer/texture/encode/chunk_astc_pack_4x4_rgb.d.ts.map +1 -0
  613. package/src/shade/renderer/texture/encode/chunk_astc_pack_4x4_rgb.js +51 -0
  614. package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.d.ts +42 -0
  615. package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.d.ts.map +1 -0
  616. package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.js +375 -0
  617. package/src/shade/renderer/texture/encode/chunk_bc1_pack_block.d.ts +12 -0
  618. package/src/shade/renderer/texture/encode/chunk_bc1_pack_block.d.ts.map +1 -0
  619. package/src/shade/renderer/texture/encode/chunk_bc1_pack_block.js +24 -0
  620. package/src/shade/renderer/texture/encode/chunk_bc4_encode_block.d.ts +45 -0
  621. package/src/shade/renderer/texture/encode/chunk_bc4_encode_block.d.ts.map +1 -0
  622. package/src/shade/renderer/texture/encode/chunk_bc4_encode_block.js +348 -0
  623. package/src/shade/renderer/texture/encode/chunk_bc4_pack_block.d.ts +16 -0
  624. package/src/shade/renderer/texture/encode/chunk_bc4_pack_block.d.ts.map +1 -0
  625. package/src/shade/renderer/texture/encode/chunk_bc4_pack_block.js +33 -0
  626. package/src/shade/renderer/texture/encode/chunk_bc6h_encode_block_mode11.d.ts +32 -0
  627. package/src/shade/renderer/texture/encode/chunk_bc6h_encode_block_mode11.d.ts.map +1 -0
  628. package/src/shade/renderer/texture/encode/chunk_bc6h_encode_block_mode11.js +346 -0
  629. package/src/shade/renderer/texture/encode/chunk_bc6h_pack_mode11.d.ts +10 -0
  630. package/src/shade/renderer/texture/encode/chunk_bc6h_pack_mode11.d.ts.map +1 -0
  631. package/src/shade/renderer/texture/encode/chunk_bc6h_pack_mode11.js +54 -0
  632. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.d.ts +36 -0
  633. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.d.ts.map +1 -0
  634. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.js +327 -0
  635. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.d.ts +22 -0
  636. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.d.ts.map +1 -0
  637. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.js +71 -0
  638. package/src/shade/renderer/texture/encode/chunk_texture_encode_level.d.ts +20 -0
  639. package/src/shade/renderer/texture/encode/chunk_texture_encode_level.d.ts.map +1 -0
  640. package/src/shade/renderer/texture/encode/chunk_texture_encode_level.js +73 -0
  641. package/src/shade/renderer/texture/encode/chunk_texture_encode_load_block.d.ts +16 -0
  642. package/src/shade/renderer/texture/encode/chunk_texture_encode_load_block.d.ts.map +1 -0
  643. package/src/shade/renderer/texture/encode/chunk_texture_encode_load_block.js +36 -0
  644. package/src/shade/renderer/texture/encode/shader_texture_encode_astc_4x4.d.ts +13 -0
  645. package/src/shade/renderer/texture/encode/shader_texture_encode_astc_4x4.d.ts.map +1 -0
  646. package/src/shade/renderer/texture/encode/shader_texture_encode_astc_4x4.js +63 -0
  647. package/src/shade/renderer/texture/encode/shader_texture_encode_bc1.d.ts +12 -0
  648. package/src/shade/renderer/texture/encode/shader_texture_encode_bc1.d.ts.map +1 -0
  649. package/src/shade/renderer/texture/encode/shader_texture_encode_bc1.js +60 -0
  650. package/src/shade/renderer/texture/encode/shader_texture_encode_bc4.d.ts +28 -0
  651. package/src/shade/renderer/texture/encode/shader_texture_encode_bc4.d.ts.map +1 -0
  652. package/src/shade/renderer/texture/encode/shader_texture_encode_bc4.js +76 -0
  653. package/src/shade/renderer/texture/encode/shader_texture_encode_bc4_snorm.d.ts +16 -0
  654. package/src/shade/renderer/texture/encode/shader_texture_encode_bc4_snorm.d.ts.map +1 -0
  655. package/src/shade/renderer/texture/encode/shader_texture_encode_bc4_snorm.js +64 -0
  656. package/src/shade/renderer/texture/encode/shader_texture_encode_bc5.d.ts +14 -0
  657. package/src/shade/renderer/texture/encode/shader_texture_encode_bc5.d.ts.map +1 -0
  658. package/src/shade/renderer/texture/encode/shader_texture_encode_bc5.js +67 -0
  659. package/src/shade/renderer/texture/encode/shader_texture_encode_bc5_snorm.d.ts +10 -0
  660. package/src/shade/renderer/texture/encode/shader_texture_encode_bc5_snorm.d.ts.map +1 -0
  661. package/src/shade/renderer/texture/encode/shader_texture_encode_bc5_snorm.js +63 -0
  662. package/src/shade/renderer/texture/encode/shader_texture_encode_bc6h.d.ts +12 -0
  663. package/src/shade/renderer/texture/encode/shader_texture_encode_bc6h.d.ts.map +1 -0
  664. package/src/shade/renderer/texture/encode/shader_texture_encode_bc6h.js +62 -0
  665. package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.d.ts +14 -0
  666. package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.d.ts.map +1 -0
  667. package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.js +58 -0
  668. package/src/shade/renderer/texture/encode/texture_encode.d.ts +84 -0
  669. package/src/shade/renderer/texture/encode/texture_encode.d.ts.map +1 -0
  670. package/src/shade/renderer/texture/encode/texture_encode.js +168 -0
  671. package/src/shade/renderer/texture/encode/texture_encode_layout.d.ts +196 -0
  672. package/src/shade/renderer/texture/encode/texture_encode_layout.d.ts.map +1 -0
  673. package/src/shade/renderer/texture/encode/texture_encode_layout.js +248 -0
  674. package/src/shade/renderer/texture/encode/texture_encode_resources.d.ts +15 -0
  675. package/src/shade/renderer/texture/encode/texture_encode_resources.d.ts.map +1 -0
  676. package/src/shade/renderer/texture/encode/texture_encode_resources.js +25 -0
  677. package/src/shade/renderer/texture/encode/texture_encode_shader.d.ts +30 -0
  678. package/src/shade/renderer/texture/encode/texture_encode_shader.d.ts.map +1 -0
  679. package/src/shade/renderer/texture/encode/texture_encode_shader.js +108 -0
  680. package/src/shade/renderer/texture/format/gpu_texture_compression_support.d.ts +3 -1
  681. package/src/shade/renderer/texture/format/gpu_texture_compression_support.d.ts.map +1 -1
  682. package/src/shade/renderer/texture/format/gpu_texture_compression_support.js +8 -25
  683. package/src/shade/renderer/texture/format/texture_format_from_shade_image.d.ts.map +1 -1
  684. package/src/shade/renderer/texture/format/texture_format_from_shade_image.js +26 -2
  685. package/src/shade/renderer/texture/source/texel_data_from_ktx2.d.ts +32 -0
  686. package/src/shade/renderer/texture/source/texel_data_from_ktx2.d.ts.map +1 -0
  687. package/src/shade/renderer/texture/source/texel_data_from_ktx2.js +48 -0
  688. package/src/shade/renderer/texture/texture_write_level.d.ts.map +1 -1
  689. package/src/shade/renderer/texture/texture_write_level.js +11 -1
  690. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
  691. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +20 -0
  692. package/src/shade/renderer/volumetrics/NOTES.md +28 -0
  693. package/src/shade/renderer/volumetrics/taa/chunk_volumetric_history_bounding_box.d.ts.map +1 -1
  694. package/src/shade/renderer/volumetrics/taa/chunk_volumetric_history_bounding_box.js +7 -2
  695. package/src/shade/renderer/volumetrics/taa/chunk_volumetrics_taa_reproject.d.ts +17 -0
  696. package/src/shade/renderer/volumetrics/taa/chunk_volumetrics_taa_reproject.d.ts.map +1 -0
  697. package/src/shade/renderer/volumetrics/taa/chunk_volumetrics_taa_reproject.js +168 -0
  698. package/src/shade/renderer/volumetrics/taa/chunk_volumetrics_taa_resolve.d.ts +13 -0
  699. package/src/shade/renderer/volumetrics/taa/chunk_volumetrics_taa_resolve.d.ts.map +1 -0
  700. package/src/shade/renderer/volumetrics/taa/chunk_volumetrics_taa_resolve.js +56 -0
  701. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts.map +1 -1
  702. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js +134 -334
  703. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
  704. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +49 -21
  705. package/src/avif/encode_image_source.d.ts +0 -70
  706. package/src/avif/encode_image_source.d.ts.map +0 -1
  707. package/src/avif/encode_image_source.js +0 -117
  708. package/src/avif/encoder_worker.d.ts.map +0 -1
  709. package/src/avif/index.d.ts +0 -5
  710. package/src/avif/index.d.ts.map +0 -1
  711. package/src/avif/index.js +0 -21
  712. package/src/avif/native/DECISIONS.md +0 -545
  713. package/src/avif/native/api/AvifDecoder.d.ts.map +0 -1
  714. package/src/avif/native/api/apply_transformations.d.ts.map +0 -1
  715. package/src/avif/native/api/avif_to_sampler2d.d.ts +0 -25
  716. package/src/avif/native/api/avif_to_sampler2d.d.ts.map +0 -1
  717. package/src/avif/native/api/avif_to_sampler2d.js +0 -42
  718. package/src/avif/native/api/convert_to_rgba.d.ts.map +0 -1
  719. package/src/avif/native/api/convert_to_rgba.js +0 -204
  720. package/src/avif/native/api/decode_avif.d.ts.map +0 -1
  721. package/src/avif/native/api/decode_image_item.d.ts.map +0 -1
  722. package/src/avif/native/api/encode_avif.d.ts.map +0 -1
  723. package/src/avif/native/api/sampler2d_to_avif.d.ts.map +0 -1
  724. package/src/avif/native/api/sampler2d_to_avif.js +0 -108
  725. package/src/avif/native/av1/decode/Av1FrameContext.d.ts.map +0 -1
  726. package/src/avif/native/av1/decode/block_decoded.d.ts.map +0 -1
  727. package/src/avif/native/av1/decode/decode_av1_still.d.ts.map +0 -1
  728. package/src/avif/native/av1/decode/decode_coefficients.d.ts.map +0 -1
  729. package/src/avif/native/av1/decode/decode_palette.d.ts.map +0 -1
  730. package/src/avif/native/av1/decode/decode_palette.js +0 -442
  731. package/src/avif/native/av1/decode/decode_tile.d.ts.map +0 -1
  732. package/src/avif/native/av1/decode/decode_tile.js +0 -1213
  733. package/src/avif/native/av1/decode/get_scan.d.ts.map +0 -1
  734. package/src/avif/native/av1/decode/read_lr.d.ts.map +0 -1
  735. package/src/avif/native/av1/decode/read_lr.js +0 -277
  736. package/src/avif/native/av1/decode/read_transform_type.d.ts.map +0 -1
  737. package/src/avif/native/av1/decode/read_transform_type.js +0 -92
  738. package/src/avif/native/av1/decode/reconstruct.d.ts.map +0 -1
  739. package/src/avif/native/av1/decode/reconstruct.js +0 -241
  740. package/src/avif/native/av1/decode/transform_type.d.ts.map +0 -1
  741. package/src/avif/native/av1/encode/Av1BlockSnapshot.d.ts.map +0 -1
  742. package/src/avif/native/av1/encode/Av1EncodeContext.d.ts.map +0 -1
  743. package/src/avif/native/av1/encode/build_headers.d.ts.map +0 -1
  744. package/src/avif/native/av1/encode/choose_chroma_alpha.d.ts.map +0 -1
  745. package/src/avif/native/av1/encode/choose_filters.d.ts.map +0 -1
  746. package/src/avif/native/av1/encode/choose_restoration.d.ts.map +0 -1
  747. package/src/avif/native/av1/encode/choose_restoration.js +0 -616
  748. package/src/avif/native/av1/encode/decode_effort.d.ts.map +0 -1
  749. package/src/avif/native/av1/encode/encode_av1_still.d.ts.map +0 -1
  750. package/src/avif/native/av1/encode/encode_effort.d.ts.map +0 -1
  751. package/src/avif/native/av1/encode/encode_tile.d.ts.map +0 -1
  752. package/src/avif/native/av1/encode/encode_tile.js +0 -2331
  753. package/src/avif/native/av1/encode/quantise.d.ts.map +0 -1
  754. package/src/avif/native/av1/encode/write_coefficients.d.ts.map +0 -1
  755. package/src/avif/native/av1/encode/write_lr.d.ts.map +0 -1
  756. package/src/avif/native/av1/encode/write_transform_type.d.ts.map +0 -1
  757. package/src/avif/native/av1/entropy/CdfContext.d.ts.map +0 -1
  758. package/src/avif/native/av1/entropy/SymbolReader.d.ts.map +0 -1
  759. package/src/avif/native/av1/entropy/SymbolWriter.d.ts.map +0 -1
  760. package/src/avif/native/av1/entropy/coefficient_context.d.ts.map +0 -1
  761. package/src/avif/native/av1/entropy/partition_cdf.d.ts.map +0 -1
  762. package/src/avif/native/av1/entropy/symbol_cost.d.ts.map +0 -1
  763. package/src/avif/native/av1/filter/cdef.d.ts.map +0 -1
  764. package/src/avif/native/av1/filter/cdef.js +0 -313
  765. package/src/avif/native/av1/filter/loop_filter.d.ts.map +0 -1
  766. package/src/avif/native/av1/filter/loop_filter.js +0 -377
  767. package/src/avif/native/av1/filter/loop_restoration.d.ts.map +0 -1
  768. package/src/avif/native/av1/filter/loop_restoration.js +0 -451
  769. package/src/avif/native/av1/filter/superres.d.ts.map +0 -1
  770. package/src/avif/native/av1/filter/superres.js +0 -86
  771. package/src/avif/native/av1/grain/FilmGrainState.d.ts.map +0 -1
  772. package/src/avif/native/av1/grain/film_grain.d.ts.map +0 -1
  773. package/src/avif/native/av1/grain/film_grain.js +0 -623
  774. package/src/avif/native/av1/obu/FrameHeader.d.ts.map +0 -1
  775. package/src/avif/native/av1/obu/ObuHeader.d.ts.map +0 -1
  776. package/src/avif/native/av1/obu/SequenceHeader.d.ts.map +0 -1
  777. package/src/avif/native/av1/obu/for_each_obu.d.ts.map +0 -1
  778. package/src/avif/native/av1/obu/parse_frame_header.d.ts.map +0 -1
  779. package/src/avif/native/av1/obu/parse_frame_header.js +0 -841
  780. package/src/avif/native/av1/obu/parse_obu_header.d.ts.map +0 -1
  781. package/src/avif/native/av1/obu/parse_sequence_header.d.ts.map +0 -1
  782. package/src/avif/native/av1/obu/write_frame_header.d.ts.map +0 -1
  783. package/src/avif/native/av1/obu/write_sequence_header.d.ts.map +0 -1
  784. package/src/avif/native/av1/predict/IntraPredictionState.d.ts.map +0 -1
  785. package/src/avif/native/av1/predict/intra_filter_type.d.ts.map +0 -1
  786. package/src/avif/native/av1/predict/predict_chroma_from_luma.d.ts.map +0 -1
  787. package/src/avif/native/av1/predict/predict_chroma_from_luma.js +0 -153
  788. package/src/avif/native/av1/predict/predict_intra.d.ts.map +0 -1
  789. package/src/avif/native/av1/predict/predict_intra.js +0 -803
  790. package/src/avif/native/av1/predict/predict_palette.d.ts.map +0 -1
  791. package/src/avif/native/av1/tables/av1_symbols.d.ts.map +0 -1
  792. package/src/avif/native/av1/tables/av1_symbols.js +0 -419
  793. package/src/avif/native/av1/tables/block_tables.d.ts.map +0 -1
  794. package/src/avif/native/av1/tables/block_tables.js +0 -270
  795. package/src/avif/native/av1/tables/cdf_tables.d.ts.map +0 -1
  796. package/src/avif/native/av1/tables/cdf_tables.js +0 -1893
  797. package/src/avif/native/av1/tables/coefficient_tables.d.ts.map +0 -1
  798. package/src/avif/native/av1/tables/coefficient_tables.js +0 -82
  799. package/src/avif/native/av1/tables/derived_block_tables.d.ts.map +0 -1
  800. package/src/avif/native/av1/tables/filter_tables.d.ts.map +0 -1
  801. package/src/avif/native/av1/tables/filter_tables.js +0 -313
  802. package/src/avif/native/av1/tables/grain_tables.d.ts.map +0 -1
  803. package/src/avif/native/av1/tables/grain_tables.js +0 -190
  804. package/src/avif/native/av1/tables/prediction_tables.d.ts.map +0 -1
  805. package/src/avif/native/av1/tables/prediction_tables.js +0 -223
  806. package/src/avif/native/av1/tables/quantizer_matrix_tables.d.ts.map +0 -1
  807. package/src/avif/native/av1/tables/quantizer_matrix_tables.js +0 -38
  808. package/src/avif/native/av1/tables/quantizer_tables.d.ts.map +0 -1
  809. package/src/avif/native/av1/tables/quantizer_tables.js +0 -160
  810. package/src/avif/native/av1/tables/scan_tables.d.ts.map +0 -1
  811. package/src/avif/native/av1/tables/scan_tables.js +0 -727
  812. package/src/avif/native/av1/tables/segmentation_tables.d.ts.map +0 -1
  813. package/src/avif/native/av1/tables/segmentation_tables.js +0 -48
  814. package/src/avif/native/av1/tables/transform_tables.d.ts.map +0 -1
  815. package/src/avif/native/av1/tables/transform_tables.js +0 -140
  816. package/src/avif/native/av1/tables/unpack_table.d.ts.map +0 -1
  817. package/src/avif/native/av1/tables/unpack_table.js +0 -73
  818. package/src/avif/native/av1/transform/forward_transform_2d.d.ts.map +0 -1
  819. package/src/avif/native/av1/transform/inverse_transform_1d.d.ts.map +0 -1
  820. package/src/avif/native/av1/transform/inverse_transform_1d.js +0 -590
  821. package/src/avif/native/av1/transform/inverse_transform_2d.d.ts.map +0 -1
  822. package/src/avif/native/av1/transform/inverse_transform_2d.js +0 -180
  823. package/src/avif/native/av1/util/ceil_log2.d.ts.map +0 -1
  824. package/src/avif/native/av1/util/floor_log2.d.ts +0 -20
  825. package/src/avif/native/av1/util/floor_log2.d.ts.map +0 -1
  826. package/src/avif/native/av1/util/floor_log2.js +0 -20
  827. package/src/avif/native/av1/util/round2.d.ts.map +0 -1
  828. package/src/avif/native/av1/util/round2_signed.d.ts.map +0 -1
  829. package/src/avif/native/av1/util/tile_log2.d.ts.map +0 -1
  830. package/src/avif/native/bitstream/BitReader.d.ts.map +0 -1
  831. package/src/avif/native/bitstream/BitWriter.d.ts.map +0 -1
  832. package/src/avif/native/color/ColourTransform.d.ts.map +0 -1
  833. package/src/avif/native/color/YuvImage.d.ts.map +0 -1
  834. package/src/avif/native/color/clamp_sample.d.ts.map +0 -1
  835. package/src/avif/native/color/linear_to_transfer.d.ts.map +0 -1
  836. package/src/avif/native/color/linear_to_transfer.js +0 -126
  837. package/src/avif/native/color/primaries.d.ts.map +0 -1
  838. package/src/avif/native/color/rgb_row_to_ycbcr.d.ts.map +0 -1
  839. package/src/avif/native/color/transfer_to_linear.d.ts.map +0 -1
  840. package/src/avif/native/color/transfer_to_linear.js +0 -171
  841. package/src/avif/native/color/upsample_chroma_row.d.ts.map +0 -1
  842. package/src/avif/native/color/upsample_chroma_row.js +0 -89
  843. package/src/avif/native/color/ycbcr_row_to_rgb.d.ts.map +0 -1
  844. package/src/avif/native/color/ycbcr_row_to_rgb.js +0 -78
  845. package/src/avif/native/heif/AvifFile.d.ts.map +0 -1
  846. package/src/avif/native/heif/ItemProperty.d.ts.map +0 -1
  847. package/src/avif/native/heif/find_item_property.d.ts.map +0 -1
  848. package/src/avif/native/heif/find_item_references.d.ts.map +0 -1
  849. package/src/avif/native/heif/find_items_referencing.d.ts.map +0 -1
  850. package/src/avif/native/heif/parse_avif_file.d.ts.map +0 -1
  851. package/src/avif/native/heif/parse_avif_file.js +0 -384
  852. package/src/avif/native/heif/parse_image_grid.d.ts.map +0 -1
  853. package/src/avif/native/heif/parse_image_grid.js +0 -49
  854. package/src/avif/native/heif/parse_item_property.d.ts.map +0 -1
  855. package/src/avif/native/heif/read_item_data.d.ts.map +0 -1
  856. package/src/avif/native/heif/write_avif_file.d.ts.map +0 -1
  857. package/src/avif/native/heif/write_item_property.d.ts.map +0 -1
  858. package/src/avif/native/index.d.ts +0 -14
  859. package/src/avif/native/index.d.ts.map +0 -1
  860. package/src/avif/native/index.js +0 -56
  861. package/src/avif/native/isobmff/BoxHeader.d.ts.map +0 -1
  862. package/src/avif/native/isobmff/BoxWriter.d.ts +0 -118
  863. package/src/avif/native/isobmff/BoxWriter.d.ts.map +0 -1
  864. package/src/avif/native/isobmff/BoxWriter.js +0 -264
  865. package/src/avif/native/isobmff/for_each_box.d.ts.map +0 -1
  866. package/src/avif/native/isobmff/read_box_header.d.ts.map +0 -1
  867. package/src/avif/native/isobmff/read_full_box_header.d.ts.map +0 -1
  868. package/src/avif/threaded_image_encoder.d.ts.map +0 -1
  869. package/src/basis/BasisBitReader.d.ts +0 -77
  870. package/src/basis/BasisBitReader.d.ts.map +0 -1
  871. package/src/basis/BasisBitReader.js +0 -231
  872. package/src/basis/BasisHuffmanTable.d.ts.map +0 -1
  873. package/src/basis/basis_read_huffman_table.d.ts.map +0 -1
  874. package/src/basis/etc1s/Etc1sSelectorHistory.d.ts.map +0 -1
  875. package/src/basis/etc1s/etc1s_block_colors.d.ts.map +0 -1
  876. package/src/basis/etc1s/etc1s_decode_slice.d.ts.map +0 -1
  877. package/src/basis/etc1s/etc1s_decode_slice.js +0 -258
  878. package/src/basis/etc1s/etc1s_read_endpoint_codebook.d.ts.map +0 -1
  879. package/src/basis/etc1s/etc1s_read_selector_codebook.d.ts.map +0 -1
  880. package/src/basis/etc1s/etc1s_read_slice_tables.d.ts.map +0 -1
  881. package/src/basis/transcode/etc1s_to_bc1.d.ts +0 -24
  882. package/src/basis/transcode/etc1s_to_bc1.d.ts.map +0 -1
  883. package/src/basis/transcode/etc1s_to_bc1.js +0 -205
  884. package/src/basis/transcode/etc1s_to_bc7.d.ts +0 -30
  885. package/src/basis/transcode/etc1s_to_bc7.d.ts.map +0 -1
  886. package/src/basis/transcode/fit_endpoints.d.ts +0 -59
  887. package/src/basis/transcode/fit_endpoints.d.ts.map +0 -1
  888. package/src/basis/transcode/fit_endpoints.js +0 -226
  889. package/src/engine/asset/loaders/gltf/computeObjectBoundingSphere.d.ts +0 -8
  890. package/src/engine/asset/loaders/gltf/computeObjectBoundingSphere.d.ts.map +0 -1
  891. package/src/engine/asset/loaders/gltf/computeObjectBoundingSphere.js +0 -70
  892. package/src/engine/asset/loaders/gltf/isMesh.d.ts +0 -7
  893. package/src/engine/asset/loaders/gltf/isMesh.d.ts.map +0 -1
  894. package/src/engine/asset/loaders/gltf/isMesh.js +0 -8
  895. package/src/engine/asset/loaders/image/jpeg/JpegFrame.d.ts.map +0 -1
  896. package/src/engine/asset/loaders/image/jpeg/JpegFrameComponent.d.ts.map +0 -1
  897. package/src/engine/asset/loaders/image/jpeg/JpegImage.d.ts.map +0 -1
  898. package/src/engine/asset/loaders/image/jpeg/JpegImage.js +0 -664
  899. package/src/engine/asset/loaders/image/jpeg/buildComponentData.d.ts.map +0 -1
  900. package/src/engine/asset/loaders/image/jpeg/buildHuffmanTable.d.ts.map +0 -1
  901. package/src/engine/asset/loaders/image/jpeg/decodeScan.d.ts.map +0 -1
  902. package/src/engine/asset/loaders/image/jpeg/idct8x8_float.d.ts.map +0 -1
  903. package/src/engine/asset/loaders/image/jpeg/idct8x8_float.js +0 -31
  904. package/src/engine/asset/loaders/image/jpeg/jpeg_component_row.d.ts.map +0 -1
  905. package/src/engine/asset/loaders/image/jpeg/jpeg_decode.d.ts.map +0 -1
  906. package/src/engine/asset/loaders/image/png/PNG.d.ts.map +0 -1
  907. package/src/engine/asset/loaders/image/png/PNGReader.d.ts +0 -158
  908. package/src/engine/asset/loaders/image/png/PNGReader.d.ts.map +0 -1
  909. package/src/engine/asset/loaders/image/png/PNGReader.js +0 -656
  910. package/src/engine/asset/loaders/image/png/PNG_HEADER_BYTES.d.ts.map +0 -1
  911. package/src/engine/asset/loaders/image/png/chunk/png_chunk_decode_iTXt.d.ts.map +0 -1
  912. package/src/engine/asset/loaders/image/png/chunk/png_chunk_decode_iTXt.js +0 -53
  913. package/src/engine/asset/loaders/image/png/chunk/png_chunk_decode_zTXt.d.ts.map +0 -1
  914. package/src/engine/asset/loaders/image/png/chunk/png_chunk_decode_zTXt.js +0 -42
  915. package/src/engine/asset/loaders/image/png/crc32.d.ts +0 -2
  916. package/src/engine/asset/loaders/image/png/crc32.d.ts.map +0 -1
  917. package/src/engine/asset/loaders/image/png/crc32.js +0 -8
  918. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterAverage.d.ts.map +0 -1
  919. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterNone.d.ts.map +0 -1
  920. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterPaeth.d.ts.map +0 -1
  921. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterSub.d.ts.map +0 -1
  922. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterUp.d.ts.map +0 -1
  923. package/src/engine/asset/loaders/image/png/filter/png_unfilter.d.ts.map +0 -1
  924. package/src/engine/asset/loaders/image/png/filter/png_unfilter.js +0 -68
  925. package/src/engine/asset/loaders/image/png/png_inflate.d.ts.map +0 -1
  926. package/src/engine/asset/loaders/image/png/png_unpack_samples.d.ts.map +0 -1
  927. package/src/engine/asset/loaders/image/png/prototypePNG.d.ts.map +0 -1
  928. package/src/engine/asset/loaders/image/png/prototypePNG.js +0 -37
  929. package/src/ktx2/KTX2_IDENTIFIER.d.ts.map +0 -1
  930. package/src/ktx2/KhrDfModel.d.ts.map +0 -1
  931. package/src/ktx2/SupercompressionScheme.d.ts.map +0 -1
  932. package/src/ktx2/ktx2_read.d.ts +0 -71
  933. package/src/ktx2/ktx2_read.d.ts.map +0 -1
  934. package/src/ktx2/ktx2_read.js +0 -581
  935. package/src/ktx2/ktx2_read_basis_lz_global_data.d.ts +0 -27
  936. package/src/ktx2/ktx2_read_basis_lz_global_data.d.ts.map +0 -1
  937. package/src/ktx2/ktx2_read_basis_lz_global_data.js +0 -189
  938. package/src/ktx2/vk_format_to_texture_format.d.ts +0 -55
  939. package/src/ktx2/vk_format_to_texture_format.d.ts.map +0 -1
  940. package/src/ktx2/vk_format_to_texture_format.js +0 -290
  941. package/src/shade/renderer/geometry/bvh/record_blas_refit.d.ts +0 -25
  942. package/src/shade/renderer/geometry/bvh/record_blas_refit.d.ts.map +0 -1
  943. package/src/shade/renderer/geometry/bvh/record_blas_refit.js +0 -102
  944. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.d.ts +0 -30
  945. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.d.ts.map +0 -1
  946. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.js +0 -125
  947. package/src/shade/renderer/loader/gltf/GLTF_PRIMITIVE_MODE.d.ts.map +0 -1
  948. package/src/shade/renderer/loader/gltf/MESHOPT_COMPRESSION_PLAN.md +0 -793
  949. package/src/shade/renderer/loader/gltf/coalesce_array_duplicates.d.ts.map +0 -1
  950. package/src/shade/renderer/loader/gltf/ext/GltfBufferViewExtension.d.ts.map +0 -1
  951. package/src/shade/renderer/loader/gltf/ext/GltfBufferViewExtensionSet.d.ts.map +0 -1
  952. package/src/shade/renderer/loader/gltf/ext/GltfBufferViewExtensionSet.js +0 -109
  953. package/src/shade/renderer/loader/gltf/ext/gltf_apply_buffer_view_extensions.d.ts.map +0 -1
  954. package/src/shade/renderer/loader/gltf/ext/gltf_buffer_view_extensions.d.ts.map +0 -1
  955. package/src/shade/renderer/loader/gltf/ext/gltf_geometry_extensions.d.ts.map +0 -1
  956. package/src/shade/renderer/loader/gltf/ext/meshopt/MeshoptBufferViewExtension.d.ts.map +0 -1
  957. package/src/shade/renderer/loader/gltf/ext/meshopt/MeshoptBufferViewExtension.js +0 -301
  958. package/src/shade/renderer/loader/gltf/gltf_component_type.d.ts.map +0 -1
  959. package/src/shade/renderer/loader/gltf/gltf_node_world_matrices.d.ts.map +0 -1
  960. package/src/shade/renderer/loader/gltf/gltf_node_world_matrices.js +0 -137
  961. package/src/shade/renderer/loader/gltf/gltf_parse_container.d.ts.map +0 -1
  962. package/src/shade/renderer/loader/gltf/gltf_read_accessor.d.ts.map +0 -1
  963. package/src/shade/renderer/loader/gltf/gltf_read_accessor.js +0 -294
  964. package/src/shade/renderer/loader/gltf/gltf_used_image_indices.d.ts +0 -25
  965. package/src/shade/renderer/loader/gltf/gltf_used_image_indices.d.ts.map +0 -1
  966. package/src/shade/renderer/loader/gltf/gltf_used_image_indices.js +0 -49
  967. package/src/shade/renderer/loader/usd/UsdError.d.ts.map +0 -1
  968. package/src/shade/renderer/loader/usd/parse_usda.d.ts.map +0 -1
  969. package/src/shade/renderer/loader/usd/unpack_usdz.d.ts.map +0 -1
  970. package/src/shade/renderer/loader/usd/unpack_usdz.js +0 -106
  971. package/src/shade/renderer/loader/usd/usd_compose_transform.d.ts.map +0 -1
  972. package/src/shade/renderer/loader/usd/usd_compose_transform.js +0 -258
  973. package/src/shade/renderer/loader/usd/usd_lz4.d.ts.map +0 -1
  974. package/src/shade/renderer/loader/usd/usd_lz4.js +0 -182
  975. package/src/shade/renderer/loader/usd/usd_triangulate.d.ts.map +0 -1
  976. package/src/shade/renderer/particles/prototypeParticleSystem.d.ts +0 -2
  977. package/src/shade/renderer/particles/prototypeParticleSystem.d.ts.map +0 -1
  978. package/src/shade/renderer/particles/prototypeParticleSystem.js +0 -448
  979. package/src/shade/renderer/postprocess/taa/chunk_taa_sample_history_color.d.ts +0 -2
  980. package/src/shade/renderer/postprocess/taa/chunk_taa_sample_history_color.d.ts.map +0 -1
  981. package/src/shade/renderer/postprocess/taa/chunk_taa_sample_history_color.js +0 -43
  982. package/src/shade/renderer/scene/optimization/sampler2d_compare.d.ts.map +0 -1
  983. package/src/shade/renderer/scene/optimization/sampler2d_compare.js +0 -94
  984. /package/src/{avif → engine/asset/loaders/image/avif}/encoder_worker.d.ts +0 -0
  985. /package/src/{avif → engine/asset/loaders/image/avif}/encoder_worker.js +0 -0
  986. /package/src/{avif → engine/asset/loaders/image/avif}/threaded_image_encoder.d.ts +0 -0
  987. /package/src/{avif → engine/asset/loaders/image/avif}/threaded_image_encoder.js +0 -0
  988. /package/src/engine/asset/loaders/image/{png/prototypePNG.d.ts → prototypePNG.d.ts} +0 -0
  989. /package/src/{shade/renderer/scene/optimization → engine/graphics/texture/sampler/compare}/sampler2d_compare.d.ts +0 -0
  990. /package/src/{avif/native/api → engine/graphics/texture/sampler}/sampler2d_to_avif.d.ts +0 -0
  991. /package/src/{avif/native → format/image/avif}/NOTICE.md +0 -0
  992. /package/src/{avif/native → format/image/avif}/api/AvifDecoder.d.ts +0 -0
  993. /package/src/{avif/native → format/image/avif}/api/AvifDecoder.js +0 -0
  994. /package/src/{avif/native → format/image/avif}/api/apply_transformations.d.ts +0 -0
  995. /package/src/{avif/native → format/image/avif}/api/apply_transformations.js +0 -0
  996. /package/src/{avif/native → format/image/avif}/api/convert_to_rgba.d.ts +0 -0
  997. /package/src/{avif/native → format/image/avif}/api/decode_avif.d.ts +0 -0
  998. /package/src/{avif/native → format/image/avif}/api/decode_avif.js +0 -0
  999. /package/src/{avif/native → format/image/avif}/api/decode_image_item.d.ts +0 -0
  1000. /package/src/{avif/native → format/image/avif}/api/decode_image_item.js +0 -0
  1001. /package/src/{avif/native → format/image/avif}/api/encode_avif.d.ts +0 -0
  1002. /package/src/{avif/native → format/image/avif}/api/encode_avif.js +0 -0
  1003. /package/src/{avif/native → format/image/avif}/av1/decode/Av1FrameContext.d.ts +0 -0
  1004. /package/src/{avif/native → format/image/avif}/av1/decode/Av1FrameContext.js +0 -0
  1005. /package/src/{avif/native → format/image/avif}/av1/decode/block_decoded.d.ts +0 -0
  1006. /package/src/{avif/native → format/image/avif}/av1/decode/block_decoded.js +0 -0
  1007. /package/src/{avif/native → format/image/avif}/av1/decode/decode_av1_still.d.ts +0 -0
  1008. /package/src/{avif/native → format/image/avif}/av1/decode/decode_av1_still.js +0 -0
  1009. /package/src/{avif/native → format/image/avif}/av1/decode/decode_coefficients.d.ts +0 -0
  1010. /package/src/{avif/native → format/image/avif}/av1/decode/decode_coefficients.js +0 -0
  1011. /package/src/{avif/native → format/image/avif}/av1/decode/decode_palette.d.ts +0 -0
  1012. /package/src/{avif/native → format/image/avif}/av1/decode/decode_tile.d.ts +0 -0
  1013. /package/src/{avif/native → format/image/avif}/av1/decode/get_scan.d.ts +0 -0
  1014. /package/src/{avif/native → format/image/avif}/av1/decode/get_scan.js +0 -0
  1015. /package/src/{avif/native → format/image/avif}/av1/decode/read_lr.d.ts +0 -0
  1016. /package/src/{avif/native → format/image/avif}/av1/decode/read_transform_type.d.ts +0 -0
  1017. /package/src/{avif/native → format/image/avif}/av1/decode/reconstruct.d.ts +0 -0
  1018. /package/src/{avif/native → format/image/avif}/av1/decode/transform_type.d.ts +0 -0
  1019. /package/src/{avif/native → format/image/avif}/av1/decode/transform_type.js +0 -0
  1020. /package/src/{avif/native → format/image/avif}/av1/encode/Av1BlockSnapshot.d.ts +0 -0
  1021. /package/src/{avif/native → format/image/avif}/av1/encode/Av1BlockSnapshot.js +0 -0
  1022. /package/src/{avif/native → format/image/avif}/av1/encode/Av1EncodeContext.d.ts +0 -0
  1023. /package/src/{avif/native → format/image/avif}/av1/encode/Av1EncodeContext.js +0 -0
  1024. /package/src/{avif/native → format/image/avif}/av1/encode/build_headers.d.ts +0 -0
  1025. /package/src/{avif/native → format/image/avif}/av1/encode/build_headers.js +0 -0
  1026. /package/src/{avif/native → format/image/avif}/av1/encode/choose_chroma_alpha.d.ts +0 -0
  1027. /package/src/{avif/native → format/image/avif}/av1/encode/choose_chroma_alpha.js +0 -0
  1028. /package/src/{avif/native → format/image/avif}/av1/encode/choose_filters.d.ts +0 -0
  1029. /package/src/{avif/native → format/image/avif}/av1/encode/choose_filters.js +0 -0
  1030. /package/src/{avif/native → format/image/avif}/av1/encode/choose_restoration.d.ts +0 -0
  1031. /package/src/{avif/native → format/image/avif}/av1/encode/decode_effort.d.ts +0 -0
  1032. /package/src/{avif/native → format/image/avif}/av1/encode/decode_effort.js +0 -0
  1033. /package/src/{avif/native → format/image/avif}/av1/encode/encode_av1_still.d.ts +0 -0
  1034. /package/src/{avif/native → format/image/avif}/av1/encode/encode_av1_still.js +0 -0
  1035. /package/src/{avif/native → format/image/avif}/av1/encode/encode_effort.d.ts +0 -0
  1036. /package/src/{avif/native → format/image/avif}/av1/encode/encode_effort.js +0 -0
  1037. /package/src/{avif/native → format/image/avif}/av1/encode/encode_tile.d.ts +0 -0
  1038. /package/src/{avif/native → format/image/avif}/av1/encode/quantise.d.ts +0 -0
  1039. /package/src/{avif/native → format/image/avif}/av1/encode/quantise.js +0 -0
  1040. /package/src/{avif/native → format/image/avif}/av1/encode/write_coefficients.d.ts +0 -0
  1041. /package/src/{avif/native → format/image/avif}/av1/encode/write_coefficients.js +0 -0
  1042. /package/src/{avif/native → format/image/avif}/av1/encode/write_lr.d.ts +0 -0
  1043. /package/src/{avif/native → format/image/avif}/av1/encode/write_lr.js +0 -0
  1044. /package/src/{avif/native → format/image/avif}/av1/encode/write_transform_type.d.ts +0 -0
  1045. /package/src/{avif/native → format/image/avif}/av1/encode/write_transform_type.js +0 -0
  1046. /package/src/{avif/native → format/image/avif}/av1/entropy/CdfContext.d.ts +0 -0
  1047. /package/src/{avif/native → format/image/avif}/av1/entropy/CdfContext.js +0 -0
  1048. /package/src/{avif/native → format/image/avif}/av1/entropy/SymbolReader.d.ts +0 -0
  1049. /package/src/{avif/native → format/image/avif}/av1/entropy/SymbolReader.js +0 -0
  1050. /package/src/{avif/native → format/image/avif}/av1/entropy/SymbolWriter.d.ts +0 -0
  1051. /package/src/{avif/native → format/image/avif}/av1/entropy/SymbolWriter.js +0 -0
  1052. /package/src/{avif/native → format/image/avif}/av1/entropy/coefficient_context.d.ts +0 -0
  1053. /package/src/{avif/native → format/image/avif}/av1/entropy/coefficient_context.js +0 -0
  1054. /package/src/{avif/native → format/image/avif}/av1/entropy/partition_cdf.d.ts +0 -0
  1055. /package/src/{avif/native → format/image/avif}/av1/entropy/partition_cdf.js +0 -0
  1056. /package/src/{avif/native → format/image/avif}/av1/entropy/symbol_cost.d.ts +0 -0
  1057. /package/src/{avif/native → format/image/avif}/av1/entropy/symbol_cost.js +0 -0
  1058. /package/src/{avif/native → format/image/avif}/av1/filter/cdef.d.ts +0 -0
  1059. /package/src/{avif/native → format/image/avif}/av1/filter/loop_filter.d.ts +0 -0
  1060. /package/src/{avif/native → format/image/avif}/av1/filter/loop_restoration.d.ts +0 -0
  1061. /package/src/{avif/native → format/image/avif}/av1/filter/superres.d.ts +0 -0
  1062. /package/src/{avif/native → format/image/avif}/av1/grain/FilmGrainState.d.ts +0 -0
  1063. /package/src/{avif/native → format/image/avif}/av1/grain/FilmGrainState.js +0 -0
  1064. /package/src/{avif/native → format/image/avif}/av1/grain/film_grain.d.ts +0 -0
  1065. /package/src/{avif/native → format/image/avif}/av1/obu/FrameHeader.d.ts +0 -0
  1066. /package/src/{avif/native → format/image/avif}/av1/obu/FrameHeader.js +0 -0
  1067. /package/src/{avif/native → format/image/avif}/av1/obu/ObuHeader.d.ts +0 -0
  1068. /package/src/{avif/native → format/image/avif}/av1/obu/ObuHeader.js +0 -0
  1069. /package/src/{avif/native → format/image/avif}/av1/obu/SequenceHeader.d.ts +0 -0
  1070. /package/src/{avif/native → format/image/avif}/av1/obu/SequenceHeader.js +0 -0
  1071. /package/src/{avif/native → format/image/avif}/av1/obu/for_each_obu.d.ts +0 -0
  1072. /package/src/{avif/native → format/image/avif}/av1/obu/for_each_obu.js +0 -0
  1073. /package/src/{avif/native → format/image/avif}/av1/obu/parse_frame_header.d.ts +0 -0
  1074. /package/src/{avif/native → format/image/avif}/av1/obu/parse_obu_header.d.ts +0 -0
  1075. /package/src/{avif/native → format/image/avif}/av1/obu/parse_obu_header.js +0 -0
  1076. /package/src/{avif/native → format/image/avif}/av1/obu/parse_sequence_header.d.ts +0 -0
  1077. /package/src/{avif/native → format/image/avif}/av1/obu/parse_sequence_header.js +0 -0
  1078. /package/src/{avif/native → format/image/avif}/av1/obu/write_frame_header.d.ts +0 -0
  1079. /package/src/{avif/native → format/image/avif}/av1/obu/write_frame_header.js +0 -0
  1080. /package/src/{avif/native → format/image/avif}/av1/obu/write_sequence_header.d.ts +0 -0
  1081. /package/src/{avif/native → format/image/avif}/av1/obu/write_sequence_header.js +0 -0
  1082. /package/src/{avif/native → format/image/avif}/av1/predict/IntraPredictionState.d.ts +0 -0
  1083. /package/src/{avif/native → format/image/avif}/av1/predict/IntraPredictionState.js +0 -0
  1084. /package/src/{avif/native → format/image/avif}/av1/predict/intra_filter_type.d.ts +0 -0
  1085. /package/src/{avif/native → format/image/avif}/av1/predict/intra_filter_type.js +0 -0
  1086. /package/src/{avif/native → format/image/avif}/av1/predict/predict_chroma_from_luma.d.ts +0 -0
  1087. /package/src/{avif/native → format/image/avif}/av1/predict/predict_intra.d.ts +0 -0
  1088. /package/src/{avif/native → format/image/avif}/av1/predict/predict_palette.d.ts +0 -0
  1089. /package/src/{avif/native → format/image/avif}/av1/predict/predict_palette.js +0 -0
  1090. /package/src/{avif/native → format/image/avif}/av1/tables/av1_symbols.d.ts +0 -0
  1091. /package/src/{avif/native → format/image/avif}/av1/tables/block_tables.d.ts +0 -0
  1092. /package/src/{avif/native → format/image/avif}/av1/tables/cdf_tables.d.ts +0 -0
  1093. /package/src/{avif/native → format/image/avif}/av1/tables/coefficient_tables.d.ts +0 -0
  1094. /package/src/{avif/native → format/image/avif}/av1/tables/derived_block_tables.d.ts +0 -0
  1095. /package/src/{avif/native → format/image/avif}/av1/tables/derived_block_tables.js +0 -0
  1096. /package/src/{avif/native → format/image/avif}/av1/tables/filter_tables.d.ts +0 -0
  1097. /package/src/{avif/native → format/image/avif}/av1/tables/grain_tables.d.ts +0 -0
  1098. /package/src/{avif/native → format/image/avif}/av1/tables/prediction_tables.d.ts +0 -0
  1099. /package/src/{avif/native → format/image/avif}/av1/tables/quantizer_matrix_tables.d.ts +0 -0
  1100. /package/src/{avif/native → format/image/avif}/av1/tables/quantizer_tables.d.ts +0 -0
  1101. /package/src/{avif/native → format/image/avif}/av1/tables/scan_tables.d.ts +0 -0
  1102. /package/src/{avif/native → format/image/avif}/av1/tables/segmentation_tables.d.ts +0 -0
  1103. /package/src/{avif/native → format/image/avif}/av1/tables/transform_tables.d.ts +0 -0
  1104. /package/src/{avif/native → format/image/avif}/av1/tables/unpack_table.d.ts +0 -0
  1105. /package/src/{avif/native → format/image/avif}/av1/transform/forward_transform_2d.d.ts +0 -0
  1106. /package/src/{avif/native → format/image/avif}/av1/transform/forward_transform_2d.js +0 -0
  1107. /package/src/{avif/native → format/image/avif}/av1/transform/inverse_transform_1d.d.ts +0 -0
  1108. /package/src/{avif/native → format/image/avif}/av1/transform/inverse_transform_2d.d.ts +0 -0
  1109. /package/src/{avif/native → format/image/avif}/av1/util/ceil_log2.d.ts +0 -0
  1110. /package/src/{avif/native → format/image/avif}/av1/util/ceil_log2.js +0 -0
  1111. /package/src/{avif/native → format/image/avif}/av1/util/round2.d.ts +0 -0
  1112. /package/src/{avif/native → format/image/avif}/av1/util/round2.js +0 -0
  1113. /package/src/{avif/native → format/image/avif}/av1/util/round2_signed.d.ts +0 -0
  1114. /package/src/{avif/native → format/image/avif}/av1/util/round2_signed.js +0 -0
  1115. /package/src/{avif/native → format/image/avif}/av1/util/tile_log2.d.ts +0 -0
  1116. /package/src/{avif/native → format/image/avif}/av1/util/tile_log2.js +0 -0
  1117. /package/src/{avif/native → format/image/avif}/bitstream/BitReader.d.ts +0 -0
  1118. /package/src/{avif/native → format/image/avif}/bitstream/BitReader.js +0 -0
  1119. /package/src/{avif/native → format/image/avif}/bitstream/BitWriter.d.ts +0 -0
  1120. /package/src/{avif/native → format/image/avif}/bitstream/BitWriter.js +0 -0
  1121. /package/src/{avif/native → format/image/avif}/color/ColourTransform.d.ts +0 -0
  1122. /package/src/{avif/native → format/image/avif}/color/ColourTransform.js +0 -0
  1123. /package/src/{avif/native → format/image/avif}/color/YuvImage.d.ts +0 -0
  1124. /package/src/{avif/native → format/image/avif}/color/YuvImage.js +0 -0
  1125. /package/src/{avif/native → format/image/avif}/color/clamp_sample.d.ts +0 -0
  1126. /package/src/{avif/native → format/image/avif}/color/clamp_sample.js +0 -0
  1127. /package/src/{avif/native → format/image/avif}/color/linear_to_transfer.d.ts +0 -0
  1128. /package/src/{avif/native → format/image/avif}/color/primaries.d.ts +0 -0
  1129. /package/src/{avif/native → format/image/avif}/color/primaries.js +0 -0
  1130. /package/src/{avif/native → format/image/avif}/color/rgb_row_to_ycbcr.d.ts +0 -0
  1131. /package/src/{avif/native → format/image/avif}/color/rgb_row_to_ycbcr.js +0 -0
  1132. /package/src/{avif/native → format/image/avif}/color/transfer_to_linear.d.ts +0 -0
  1133. /package/src/{avif/native → format/image/avif}/color/upsample_chroma_row.d.ts +0 -0
  1134. /package/src/{avif/native → format/image/avif}/color/ycbcr_row_to_rgb.d.ts +0 -0
  1135. /package/src/{avif/native → format/image/avif}/heif/AvifFile.d.ts +0 -0
  1136. /package/src/{avif/native → format/image/avif}/heif/AvifFile.js +0 -0
  1137. /package/src/{avif/native → format/image/avif}/heif/ItemProperty.d.ts +0 -0
  1138. /package/src/{avif/native → format/image/avif}/heif/ItemProperty.js +0 -0
  1139. /package/src/{avif/native → format/image/avif}/heif/find_item_property.d.ts +0 -0
  1140. /package/src/{avif/native → format/image/avif}/heif/find_item_property.js +0 -0
  1141. /package/src/{avif/native → format/image/avif}/heif/find_item_references.d.ts +0 -0
  1142. /package/src/{avif/native → format/image/avif}/heif/find_item_references.js +0 -0
  1143. /package/src/{avif/native → format/image/avif}/heif/find_items_referencing.d.ts +0 -0
  1144. /package/src/{avif/native → format/image/avif}/heif/find_items_referencing.js +0 -0
  1145. /package/src/{avif/native → format/image/avif}/heif/parse_avif_file.d.ts +0 -0
  1146. /package/src/{avif/native → format/image/avif}/heif/parse_image_grid.d.ts +0 -0
  1147. /package/src/{avif/native → format/image/avif}/heif/parse_item_property.d.ts +0 -0
  1148. /package/src/{avif/native → format/image/avif}/heif/parse_item_property.js +0 -0
  1149. /package/src/{avif/native → format/image/avif}/heif/read_item_data.d.ts +0 -0
  1150. /package/src/{avif/native → format/image/avif}/heif/read_item_data.js +0 -0
  1151. /package/src/{avif/native → format/image/avif}/heif/write_avif_file.d.ts +0 -0
  1152. /package/src/{avif/native → format/image/avif}/heif/write_avif_file.js +0 -0
  1153. /package/src/{avif/native → format/image/avif}/heif/write_item_property.d.ts +0 -0
  1154. /package/src/{avif/native → format/image/avif}/heif/write_item_property.js +0 -0
  1155. /package/src/{avif/native → format/image/avif}/isobmff/BoxHeader.d.ts +0 -0
  1156. /package/src/{avif/native → format/image/avif}/isobmff/BoxHeader.js +0 -0
  1157. /package/src/{avif/native → format/image/avif}/isobmff/for_each_box.d.ts +0 -0
  1158. /package/src/{avif/native → format/image/avif}/isobmff/for_each_box.js +0 -0
  1159. /package/src/{avif/native → format/image/avif}/isobmff/read_box_header.d.ts +0 -0
  1160. /package/src/{avif/native → format/image/avif}/isobmff/read_box_header.js +0 -0
  1161. /package/src/{avif/native → format/image/avif}/isobmff/read_full_box_header.d.ts +0 -0
  1162. /package/src/{avif/native → format/image/avif}/isobmff/read_full_box_header.js +0 -0
  1163. /package/src/{engine/asset/loaders → format}/image/jpeg/JpegFrame.d.ts +0 -0
  1164. /package/src/{engine/asset/loaders → format}/image/jpeg/JpegFrame.js +0 -0
  1165. /package/src/{engine/asset/loaders → format}/image/jpeg/JpegFrameComponent.d.ts +0 -0
  1166. /package/src/{engine/asset/loaders → format}/image/jpeg/JpegFrameComponent.js +0 -0
  1167. /package/src/{engine/asset/loaders → format}/image/jpeg/JpegImage.d.ts +0 -0
  1168. /package/src/{engine/asset/loaders → format}/image/jpeg/NOTES.md +0 -0
  1169. /package/src/{engine/asset/loaders → format}/image/jpeg/buildComponentData.d.ts +0 -0
  1170. /package/src/{engine/asset/loaders → format}/image/jpeg/buildComponentData.js +0 -0
  1171. /package/src/{engine/asset/loaders → format}/image/jpeg/buildHuffmanTable.d.ts +0 -0
  1172. /package/src/{engine/asset/loaders → format}/image/jpeg/buildHuffmanTable.js +0 -0
  1173. /package/src/{engine/asset/loaders → format}/image/jpeg/decodeScan.d.ts +0 -0
  1174. /package/src/{engine/asset/loaders → format}/image/jpeg/decodeScan.js +0 -0
  1175. /package/src/{engine/asset/loaders → format}/image/jpeg/idct8x8_float.d.ts +0 -0
  1176. /package/src/{engine/asset/loaders → format}/image/jpeg/jpeg_component_row.d.ts +0 -0
  1177. /package/src/{engine/asset/loaders → format}/image/jpeg/jpeg_component_row.js +0 -0
  1178. /package/src/{engine/asset/loaders → format}/image/jpeg/jpeg_decode.d.ts +0 -0
  1179. /package/src/{engine/asset/loaders → format}/image/jpeg/jpeg_decode.js +0 -0
  1180. /package/src/{engine/asset/loaders → format}/image/png/PNG.d.ts +0 -0
  1181. /package/src/{engine/asset/loaders → format}/image/png/PNG.js +0 -0
  1182. /package/src/{engine/asset/loaders → format}/image/png/PNG_HEADER_BYTES.d.ts +0 -0
  1183. /package/src/{engine/asset/loaders → format}/image/png/PNG_HEADER_BYTES.js +0 -0
  1184. /package/src/{engine/asset/loaders → format}/image/png/chunk/png_chunk_decode_iTXt.d.ts +0 -0
  1185. /package/src/{engine/asset/loaders → format}/image/png/chunk/png_chunk_decode_zTXt.d.ts +0 -0
  1186. /package/src/{engine/asset/loaders → format}/image/png/filter/png_filter_unFilterAverage.d.ts +0 -0
  1187. /package/src/{engine/asset/loaders → format}/image/png/filter/png_filter_unFilterAverage.js +0 -0
  1188. /package/src/{engine/asset/loaders → format}/image/png/filter/png_filter_unFilterNone.d.ts +0 -0
  1189. /package/src/{engine/asset/loaders → format}/image/png/filter/png_filter_unFilterNone.js +0 -0
  1190. /package/src/{engine/asset/loaders → format}/image/png/filter/png_filter_unFilterPaeth.d.ts +0 -0
  1191. /package/src/{engine/asset/loaders → format}/image/png/filter/png_filter_unFilterPaeth.js +0 -0
  1192. /package/src/{engine/asset/loaders → format}/image/png/filter/png_filter_unFilterSub.d.ts +0 -0
  1193. /package/src/{engine/asset/loaders → format}/image/png/filter/png_filter_unFilterSub.js +0 -0
  1194. /package/src/{engine/asset/loaders → format}/image/png/filter/png_filter_unFilterUp.d.ts +0 -0
  1195. /package/src/{engine/asset/loaders → format}/image/png/filter/png_filter_unFilterUp.js +0 -0
  1196. /package/src/{engine/asset/loaders → format}/image/png/filter/png_unfilter.d.ts +0 -0
  1197. /package/src/{engine/asset/loaders → format}/image/png/png_inflate.d.ts +0 -0
  1198. /package/src/{engine/asset/loaders → format}/image/png/png_inflate.js +0 -0
  1199. /package/src/{engine/asset/loaders → format}/image/png/png_unpack_samples.d.ts +0 -0
  1200. /package/src/{engine/asset/loaders → format}/image/png/png_unpack_samples.js +0 -0
  1201. /package/src/{shade/renderer/loader → format/scene}/gltf/GLTF_PRIMITIVE_MODE.d.ts +0 -0
  1202. /package/src/{shade/renderer/loader → format/scene}/gltf/GLTF_PRIMITIVE_MODE.js +0 -0
  1203. /package/src/{shade/renderer/loader → format/scene}/gltf/coalesce_array_duplicates.d.ts +0 -0
  1204. /package/src/{shade/renderer/loader → format/scene}/gltf/coalesce_array_duplicates.js +0 -0
  1205. /package/src/{shade/renderer/loader → format/scene}/gltf/ext/GltfBufferViewExtension.d.ts +0 -0
  1206. /package/src/{shade/renderer/loader → format/scene}/gltf/ext/GltfBufferViewExtension.js +0 -0
  1207. /package/src/{shade/renderer/loader → format/scene}/gltf/ext/GltfBufferViewExtensionSet.d.ts +0 -0
  1208. /package/src/{shade/renderer/loader → format/scene}/gltf/ext/gltf_apply_buffer_view_extensions.d.ts +0 -0
  1209. /package/src/{shade/renderer/loader → format/scene}/gltf/ext/gltf_apply_buffer_view_extensions.js +0 -0
  1210. /package/src/{shade/renderer/loader → format/scene}/gltf/ext/gltf_buffer_view_extensions.d.ts +0 -0
  1211. /package/src/{shade/renderer/loader → format/scene}/gltf/ext/gltf_buffer_view_extensions.js +0 -0
  1212. /package/src/{shade/renderer/loader → format/scene}/gltf/ext/gltf_geometry_extensions.d.ts +0 -0
  1213. /package/src/{shade/renderer/loader → format/scene}/gltf/ext/gltf_geometry_extensions.js +0 -0
  1214. /package/src/{shade/renderer/loader → format/scene}/gltf/ext/meshopt/MeshoptBufferViewExtension.d.ts +0 -0
  1215. /package/src/{shade/renderer/loader → format/scene}/gltf/gltf_component_type.d.ts +0 -0
  1216. /package/src/{shade/renderer/loader → format/scene}/gltf/gltf_component_type.js +0 -0
  1217. /package/src/{shade/renderer/loader → format/scene}/gltf/gltf_node_world_matrices.d.ts +0 -0
  1218. /package/src/{shade/renderer/loader → format/scene}/gltf/gltf_parse_container.d.ts +0 -0
  1219. /package/src/{shade/renderer/loader → format/scene}/gltf/gltf_parse_container.js +0 -0
  1220. /package/src/{shade/renderer/loader → format/scene}/gltf/gltf_read_accessor.d.ts +0 -0
  1221. /package/src/{shade/renderer/loader → format/scene}/usd/UsdError.d.ts +0 -0
  1222. /package/src/{shade/renderer/loader → format/scene}/usd/UsdError.js +0 -0
  1223. /package/src/{shade/renderer/loader → format/scene}/usd/parse_usda.d.ts +0 -0
  1224. /package/src/{shade/renderer/loader → format/scene}/usd/parse_usda.js +0 -0
  1225. /package/src/{shade/renderer/loader → format/scene}/usd/unpack_usdz.d.ts +0 -0
  1226. /package/src/{shade/renderer/loader → format/scene}/usd/usd_compose_transform.d.ts +0 -0
  1227. /package/src/{shade/renderer/loader → format/scene}/usd/usd_lz4.d.ts +0 -0
  1228. /package/src/{shade/renderer/loader → format/scene}/usd/usd_triangulate.d.ts +0 -0
  1229. /package/src/{shade/renderer/loader → format/scene}/usd/usd_triangulate.js +0 -0
  1230. /package/src/{basis → format/texture/basis}/BasisHuffmanTable.d.ts +0 -0
  1231. /package/src/{basis → format/texture/basis}/BasisHuffmanTable.js +0 -0
  1232. /package/src/{basis → format/texture/basis}/basis_read_huffman_table.d.ts +0 -0
  1233. /package/src/{basis → format/texture/basis}/basis_read_huffman_table.js +0 -0
  1234. /package/src/{basis → format/texture/basis}/etc1s/Etc1sSelectorHistory.d.ts +0 -0
  1235. /package/src/{basis → format/texture/basis}/etc1s/Etc1sSelectorHistory.js +0 -0
  1236. /package/src/{basis → format/texture/basis}/etc1s/etc1s_block_colors.d.ts +0 -0
  1237. /package/src/{basis → format/texture/basis}/etc1s/etc1s_block_colors.js +0 -0
  1238. /package/src/{basis → format/texture/basis}/etc1s/etc1s_decode_slice.d.ts +0 -0
  1239. /package/src/{basis → format/texture/basis}/etc1s/etc1s_read_endpoint_codebook.d.ts +0 -0
  1240. /package/src/{basis → format/texture/basis}/etc1s/etc1s_read_endpoint_codebook.js +0 -0
  1241. /package/src/{basis → format/texture/basis}/etc1s/etc1s_read_selector_codebook.d.ts +0 -0
  1242. /package/src/{basis → format/texture/basis}/etc1s/etc1s_read_selector_codebook.js +0 -0
  1243. /package/src/{basis → format/texture/basis}/etc1s/etc1s_read_slice_tables.d.ts +0 -0
  1244. /package/src/{basis → format/texture/basis}/etc1s/etc1s_read_slice_tables.js +0 -0
  1245. /package/src/{basis → format/texture/basis}/transcode/build_range_plan.js +0 -0
  1246. /package/src/{basis → format/texture/basis}/transcode/etc1s_to_bc7.js +0 -0
  1247. /package/src/{ktx2 → format/texture/ktx2}/KTX2_IDENTIFIER.d.ts +0 -0
  1248. /package/src/{ktx2 → format/texture/ktx2}/KTX2_IDENTIFIER.js +0 -0
  1249. /package/src/{ktx2 → format/texture/ktx2}/KhrDfModel.d.ts +0 -0
  1250. /package/src/{ktx2 → format/texture/ktx2}/KhrDfModel.js +0 -0
  1251. /package/src/{ktx2 → format/texture/ktx2}/SupercompressionScheme.d.ts +0 -0
  1252. /package/src/{ktx2 → format/texture/ktx2}/SupercompressionScheme.js +0 -0
@@ -0,0 +1,1430 @@
1
+ import { MAGMA_LUT } from "../../../core/color/colormap/MAGMA_LUT.js";
2
+ import { FlipParameters } from "../../../engine/graphics/texture/sampler/compare/flip/FlipParameters.js";
3
+ import { flip_pool } from "../../../engine/graphics/texture/sampler/compare/flip/flip_pool.js";
4
+ import { sampler2d_flip_ldr } from "../../../engine/graphics/texture/sampler/compare/flip/sampler2d_flip_ldr.js";
5
+ import { Sampler2D } from "../../../engine/graphics/texture/sampler/Sampler2D.js";
6
+ import { sampler2d_channel_apply_lut } from "../../../engine/graphics/texture/sampler/sampler2d_channel_apply_lut.js";
7
+ import {
8
+ sampler2d_max_absolute_difference
9
+ } from "../../../engine/graphics/texture/sampler/compare/sampler2d_max_absolute_difference.js";
10
+ import { sampler2d_psnr } from "../../../engine/graphics/texture/sampler/compare/sampler2d_psnr.js";
11
+ import {
12
+ decode_astc_4x4,
13
+ decode_bc1,
14
+ decode_bc4,
15
+ decode_bc4_snorm,
16
+ decode_bc5,
17
+ decode_bc5_snorm,
18
+ decode_bc6h_ufloat,
19
+ decode_bc7
20
+ } from "../../../format/texture/basis/__fixtures__/decode_blocks.js";
21
+ import { ShadeGPUCommandContext } from "../../device/ShadeGPUCommandContext.js";
22
+ import { GraphicsContext } from "../../renderer/GraphicsContext.js";
23
+ import {
24
+ block_bytes,
25
+ encode_image_with_block_encoder
26
+ } from "../../renderer/texture/encode/__fixtures__/encode_image_with_block_encoder.js";
27
+ import {
28
+ color_correlated_image,
29
+ hdr_image,
30
+ mask_image,
31
+ normal_map_image,
32
+ rough_image,
33
+ smooth_image
34
+ } from "../../renderer/texture/encode/__fixtures__/encode_test_images.js";
35
+ import { chunk_astc_encode_block_4x4_rgb } from "../../renderer/texture/encode/chunk_astc_encode_block_4x4_rgb.js";
36
+ import { chunk_bc1_encode_block } from "../../renderer/texture/encode/chunk_bc1_encode_block.js";
37
+ import { chunk_bc4_encode_block } from "../../renderer/texture/encode/chunk_bc4_encode_block.js";
38
+ import { chunk_bc6h_encode_block_mode11 } from "../../renderer/texture/encode/chunk_bc6h_encode_block_mode11.js";
39
+ import { chunk_bc7_encode_block_mode6 } from "../../renderer/texture/encode/chunk_bc7_encode_block_mode6.js";
40
+ import { texture_encode } from "../../renderer/texture/encode/texture_encode.js";
41
+ import { texture_encode_level_blocks } from "../../renderer/texture/encode/texture_encode_layout.js";
42
+ import { gpu_texture_compression_support } from "../../renderer/texture/format/gpu_texture_compression_support.js";
43
+ import { texture_write_level } from "../../renderer/texture/texture_write_level.js";
44
+ import { texture_mip_level_count } from "../../util/texture_mip_extent.js";
45
+ import { ComputeShaderEmulator } from "../../wgsl/emulator/ComputeShaderEmulator.js";
46
+ import { create_panel_group } from "./panel_view.js";
47
+
48
+ /**
49
+ * The GPU block encoder on a real device.
50
+ *
51
+ * **Drives the device directly, without the renderer.** The renderer's frame loop needs immediate
52
+ * data, which not every browser build offers, and nothing here needs a frame: the encoder is a
53
+ * dispatch and some copies recorded into a command context, and the proof is read back. What the
54
+ * device-free tiers established — the encoder's quality, the layout, the wiring — is taken as read;
55
+ * what this page adds is everything only hardware can answer:
56
+ *
57
+ * 1. `createTexture` accepts the block format, and `copyBufferToTexture` accepts the padded rows.
58
+ * 2. The blocks in the texture are the blocks the shader wrote — read back with
59
+ * `copyTextureToBuffer` and compared byte for byte with the block buffer.
60
+ * 3. The hardware decodes them to the texels the test decoder predicts — read back through a
61
+ * `textureLoad` pass, which is the GPU's own BC decoder speaking.
62
+ * 4. The device's f32 arithmetic lands on the blocks the f64 emulator chose, or on blocks no worse.
63
+ *
64
+ * Every number on the page is against the source image, through the quality harness the transcoders
65
+ * were held to.
66
+ *
67
+ * @author Alex Goldring
68
+ * @copyright Company Named Limited (c) 2026
69
+ */
70
+
71
+ /**
72
+ * @param {string} id
73
+ * @returns {HTMLElement}
74
+ */
75
+ function element(id) {
76
+ return document.getElementById(id);
77
+ }
78
+
79
+ /**
80
+ * Side of each of the three panels, CSS pixels
81
+ * @type {number}
82
+ */
83
+ const PANEL_SIZE = 384;
84
+
85
+ const PANEL_SOURCE = 0;
86
+ const PANEL_HARDWARE = 1;
87
+ const PANEL_FLIP = 2;
88
+
89
+ /**
90
+ * How long to wait for a frame before going on without one, milliseconds. A document that is not
91
+ * shown runs no frames, and a run should not stand still until its tab is looked at.
92
+ *
93
+ * @type {number}
94
+ */
95
+ const PAINT_FALLBACK_MS = 250;
96
+
97
+ /**
98
+ * Resolves once the page has painted, or once the fallback has passed. A status set right before a
99
+ * long synchronous pass is never seen unless a frame goes by first.
100
+ *
101
+ * @returns {Promise<void>}
102
+ */
103
+ function painted() {
104
+ return new Promise(resolve => {
105
+ const fallback = setTimeout(resolve, PAINT_FALLBACK_MS);
106
+
107
+ requestAnimationFrame(() => setTimeout(() => {
108
+ clearTimeout(fallback);
109
+ resolve();
110
+ }, 0));
111
+ });
112
+ }
113
+
114
+ /**
115
+ * One level of a source image, as bytes and as the sampler the harness compares with.
116
+ *
117
+ * @typedef {Object} SourceLevel
118
+ * @property {number} width
119
+ * @property {number} height
120
+ * @property {Uint8Array} rgba `width * height * 4` bytes of the texel format — `rgba8unorm`,
121
+ * `rgba8snorm`, or the half floats of `rgba16float` for an HDR level, in which case it is
122
+ * `width * height * 8` bytes
123
+ * @property {Float32Array} [hdr] `width * height * 3` linear RGB floats, present for an HDR level
124
+ */
125
+
126
+ /**
127
+ * A 2x2 box filter, per channel, rounded — the mip chain a source is given so every level of the
128
+ * encode has a truth to be judged against.
129
+ *
130
+ * @param {SourceLevel} level
131
+ * @returns {SourceLevel}
132
+ */
133
+ function halve(level) {
134
+ const width = Math.max(1, level.width >> 1);
135
+ const height = Math.max(1, level.height >> 1);
136
+
137
+ if (level.hdr !== undefined) {
138
+ const hdr = new Float32Array(width * height * 3);
139
+
140
+ for (let y = 0; y < height; y++) {
141
+ for (let x = 0; x < width; x++) {
142
+ for (let c = 0; c < 3; c++) {
143
+ const x0 = Math.min(x * 2, level.width - 1);
144
+ const x1 = Math.min(x * 2 + 1, level.width - 1);
145
+ const y0 = Math.min(y * 2, level.height - 1);
146
+ const y1 = Math.min(y * 2 + 1, level.height - 1);
147
+
148
+ hdr[(y * width + x) * 3 + c] = (
149
+ level.hdr[(y0 * level.width + x0) * 3 + c]
150
+ + level.hdr[(y0 * level.width + x1) * 3 + c]
151
+ + level.hdr[(y1 * level.width + x0) * 3 + c]
152
+ + level.hdr[(y1 * level.width + x1) * 3 + c]
153
+ ) / 4;
154
+ }
155
+ }
156
+ }
157
+
158
+ return { width, height, hdr, rgba: hdr_bytes(hdr, width * height) };
159
+ }
160
+
161
+ const rgba = new Uint8Array(width * height * 4);
162
+
163
+ for (let y = 0; y < height; y++) {
164
+ for (let x = 0; x < width; x++) {
165
+ for (let c = 0; c < 4; c++) {
166
+ const x0 = Math.min(x * 2, level.width - 1);
167
+ const x1 = Math.min(x * 2 + 1, level.width - 1);
168
+ const y0 = Math.min(y * 2, level.height - 1);
169
+ const y1 = Math.min(y * 2 + 1, level.height - 1);
170
+
171
+ const sum = level.rgba[(y0 * level.width + x0) * 4 + c]
172
+ + level.rgba[(y0 * level.width + x1) * 4 + c]
173
+ + level.rgba[(y1 * level.width + x0) * 4 + c]
174
+ + level.rgba[(y1 * level.width + x1) * 4 + c];
175
+
176
+ rgba[(y * width + x) * 4 + c] = Math.round(sum / 4);
177
+ }
178
+ }
179
+ }
180
+
181
+ return { width, height, rgba };
182
+ }
183
+
184
+ /**
185
+ * The bytes of an `rgba16float` level: each channel a half, alpha one.
186
+ *
187
+ * @param {Float32Array} hdr `texels * 3` linear floats
188
+ * @param {number} texels
189
+ * @returns {Uint8Array} `texels * 8`
190
+ */
191
+ function hdr_bytes(hdr, texels) {
192
+ const halves = new Float16Array(texels * 4);
193
+
194
+ for (let i = 0; i < texels; i++) {
195
+ halves[i * 4] = hdr[i * 3];
196
+ halves[i * 4 + 1] = hdr[i * 3 + 1];
197
+ halves[i * 4 + 2] = hdr[i * 3 + 2];
198
+ halves[i * 4 + 3] = 1;
199
+ }
200
+
201
+ return new Uint8Array(halves.buffer);
202
+ }
203
+
204
+ /**
205
+ * The half-float bit patterns of linear values, which is the domain BC6H's error lives in.
206
+ *
207
+ * @param {Float32Array} values
208
+ * @returns {Uint16Array}
209
+ */
210
+ function half_bits_of(values) {
211
+ const halves = new Float16Array(values.length);
212
+
213
+ for (let i = 0; i < values.length; i++) {
214
+ halves[i] = Math.min(65504, Math.max(0, values[i]));
215
+ }
216
+
217
+ return new Uint16Array(halves.buffer);
218
+ }
219
+
220
+ /**
221
+ * @param {SourceLevel} base
222
+ * @returns {SourceLevel[]} the full chain, base first
223
+ */
224
+ function mip_chain(base) {
225
+ const levels = [base];
226
+
227
+ const count = texture_mip_level_count(base.width, base.height, 1, "2d");
228
+
229
+ for (let level = 1; level < count; level++) {
230
+ levels.push(halve(levels[level - 1]));
231
+ }
232
+
233
+ return levels;
234
+ }
235
+
236
+ /**
237
+ * The three fixture images the specs measure with, one per channel, at a size worth timing —
238
+ * three channels with nothing in common, which is the hard case for a colour format. Or, with
239
+ * `correlated`, the colour fixture whose channels move together, which is what a photograph is. Or,
240
+ * with `normal`, a tangent-space normal map in red and green — as unsigned bytes, or as the signed
241
+ * bytes a signed target reads, so the picture is the same picture either way rather than a ramp
242
+ * wrapped into a cliff by a change of sign.
243
+ *
244
+ * @param {number} size
245
+ * @param {'independent'|'correlated'|'normal'} kind
246
+ * @param {boolean} signed
247
+ * @returns {SourceLevel}
248
+ */
249
+ function synthetic_source(size, kind, signed) {
250
+ const rgba = new Uint8Array(size * size * 4);
251
+
252
+ if (kind === 'hdr') {
253
+ const hdr = hdr_image(size, size);
254
+
255
+ return { width: size, height: size, hdr, rgba: hdr_bytes(hdr, size * size) };
256
+ }
257
+
258
+ if (kind === 'normal') {
259
+ const normals = normal_map_image(size, size, 3);
260
+
261
+ for (let i = 0; i < size * size; i++) {
262
+ for (let c = 0; c < 2; c++) {
263
+ const unorm = normals[i * 2 + c];
264
+
265
+ // the byte a signed format stores for the same direction: [-127, 127], wrapped
266
+ rgba[i * 4 + c] = signed ? (Math.round((unorm / 255) * 254 - 127) & 0xFF) : unorm;
267
+ }
268
+
269
+ rgba[i * 4 + 2] = signed ? 127 : 255;
270
+ rgba[i * 4 + 3] = signed ? 127 : 255;
271
+ }
272
+
273
+ return { width: size, height: size, rgba };
274
+ }
275
+
276
+ if (kind === 'correlated') {
277
+ const rgb = color_correlated_image(size, size);
278
+
279
+ for (let i = 0; i < size * size; i++) {
280
+ rgba[i * 4] = rgb[i * 3];
281
+ rgba[i * 4 + 1] = rgb[i * 3 + 1];
282
+ rgba[i * 4 + 2] = rgb[i * 3 + 2];
283
+ rgba[i * 4 + 3] = 255;
284
+ }
285
+
286
+ return { width: size, height: size, rgba };
287
+ }
288
+
289
+ const channels = [smooth_image(size, size), rough_image(size, size, 7), mask_image(size, size)];
290
+
291
+ for (let i = 0; i < size * size; i++) {
292
+ rgba[i * 4] = channels[0][i];
293
+ rgba[i * 4 + 1] = channels[1][i];
294
+ rgba[i * 4 + 2] = channels[2][i];
295
+ rgba[i * 4 + 3] = 255;
296
+ }
297
+
298
+ return { width: size, height: size, rgba };
299
+ }
300
+
301
+ /**
302
+ * @param {File} file
303
+ * @returns {Promise<SourceLevel>}
304
+ */
305
+ async function file_source(file) {
306
+ const bitmap = await createImageBitmap(file);
307
+
308
+ const canvas = new OffscreenCanvas(bitmap.width, bitmap.height);
309
+ const context = canvas.getContext('2d');
310
+
311
+ context.drawImage(bitmap, 0, 0);
312
+
313
+ const data = context.getImageData(0, 0, bitmap.width, bitmap.height);
314
+
315
+ return { width: bitmap.width, height: bitmap.height, rgba: new Uint8Array(data.data.buffer) };
316
+ }
317
+
318
+ /**
319
+ * The leading `count` channels of interleaved texels, re-interleaved on their own.
320
+ *
321
+ * @param {Uint8Array} data
322
+ * @param {number} stride channels per texel in `data`
323
+ * @param {number} count channels to keep
324
+ * @param {number} texels
325
+ * @returns {Uint8Array} `texels * count` bytes
326
+ */
327
+ function leading_channels(data, stride, count, texels, signed = false) {
328
+ const out = data instanceof Float32Array
329
+ ? new Float32Array(texels * count)
330
+ : signed ? new Int8Array(texels * count) : new Uint8Array(texels * count);
331
+
332
+ for (let i = 0; i < texels; i++) {
333
+ for (let c = 0; c < count; c++) {
334
+ const value = data[i * stride + c];
335
+
336
+ // a signed format's byte is two's complement, and -128 reads as -127
337
+ out[i * count + c] = signed ? Math.max(-127, (value << 24) >> 24) : value;
338
+ }
339
+ }
340
+
341
+ return out;
342
+ }
343
+
344
+ /**
345
+ * What the page knows about each target it can encode to: how many of the source's channels the
346
+ * format carries, how the test decoder reads its blocks back to those channels, and how the same
347
+ * encoder runs in the emulator on the host.
348
+ *
349
+ * @type {Object<string, {channels: number, bytes_per_block: number, decode: (blocks: Uint8Array, width: number, height: number) => Uint8Array, emulate: () => Promise<(values: Uint8Array) => Uint8Array>}>}
350
+ */
351
+ const FORMATS = {
352
+ 'bc4-r-snorm': {
353
+ channels: 1,
354
+ bytes_per_block: 8,
355
+ signed: true,
356
+ decode: (blocks, width, height) => decode_bc4_snorm(blocks, width, height),
357
+ emulate: async () => {
358
+ const lib = await ComputeShaderEmulator.fromCodeChunk(chunk_bc4_encode_block);
359
+
360
+ return values => {
361
+ const snorm = new Float32Array(16);
362
+
363
+ for (let i = 0; i < 16; i++) {
364
+ snorm[i] = Math.max(-127, (values[i] << 24) >> 24) / 127;
365
+ }
366
+
367
+ return block_bytes(lib.bc4_encode_block_snorm(snorm));
368
+ };
369
+ },
370
+ },
371
+ 'bc5-rg-snorm': {
372
+ channels: 2,
373
+ bytes_per_block: 16,
374
+ signed: true,
375
+ decode: (blocks, width, height) => decode_bc5_snorm(blocks, width, height),
376
+ emulate: async () => {
377
+ const lib = await ComputeShaderEmulator.fromCodeChunk(chunk_bc4_encode_block);
378
+
379
+ return values => {
380
+ const out = new Uint8Array(16);
381
+
382
+ for (let channel = 0; channel < 2; channel++) {
383
+ const snorm = new Float32Array(16);
384
+
385
+ for (let i = 0; i < 16; i++) {
386
+ snorm[i] = Math.max(-127, (values[i * 2 + channel] << 24) >> 24) / 127;
387
+ }
388
+
389
+ out.set(block_bytes(lib.bc4_encode_block_snorm(snorm)), channel * 8);
390
+ }
391
+
392
+ return out;
393
+ };
394
+ },
395
+ },
396
+ 'bc4-r-unorm': {
397
+ channels: 1,
398
+ bytes_per_block: 8,
399
+ signed: false,
400
+ decode: (blocks, width, height) => decode_bc4(blocks, width, height),
401
+ emulate: async () => {
402
+ const lib = await ComputeShaderEmulator.fromCodeChunk(chunk_bc4_encode_block);
403
+
404
+ return values => {
405
+ const unorm = new Float32Array(16);
406
+
407
+ for (let i = 0; i < 16; i++) {
408
+ unorm[i] = values[i] / 255;
409
+ }
410
+
411
+ return block_bytes(lib.bc4_encode_block(unorm));
412
+ };
413
+ },
414
+ },
415
+ 'bc5-rg-unorm': {
416
+ channels: 2,
417
+ bytes_per_block: 16,
418
+ signed: false,
419
+ decode: (blocks, width, height) => leading_channels(decode_bc5(blocks, width, height), 4, 2, width * height),
420
+ emulate: async () => {
421
+ const lib = await ComputeShaderEmulator.fromCodeChunk(chunk_bc4_encode_block);
422
+
423
+ return values => {
424
+ const out = new Uint8Array(16);
425
+
426
+ for (let channel = 0; channel < 2; channel++) {
427
+ const unorm = new Float32Array(16);
428
+
429
+ for (let i = 0; i < 16; i++) {
430
+ unorm[i] = values[i * 2 + channel] / 255;
431
+ }
432
+
433
+ out.set(block_bytes(lib.bc4_encode_block(unorm)), channel * 8);
434
+ }
435
+
436
+ return out;
437
+ };
438
+ },
439
+ },
440
+ 'bc6h-rgb-ufloat': {
441
+ channels: 3,
442
+ bytes_per_block: 16,
443
+ signed: false,
444
+ hdr: true,
445
+ decode: (blocks, width, height) => decode_bc6h_ufloat(blocks, width, height),
446
+ emulate: async () => {
447
+ const lib = await ComputeShaderEmulator.fromCodeChunk(chunk_bc6h_encode_block_mode11);
448
+
449
+ // handed floats rather than bytes: an HDR level's truth is its linear values
450
+ return values => {
451
+ const texels = [];
452
+
453
+ for (let i = 0; i < 16; i++) {
454
+ texels.push(new Float32Array([values[i * 3], values[i * 3 + 1], values[i * 3 + 2]]));
455
+ }
456
+
457
+ return block_bytes(lib.bc6h_encode_block_mode11(texels));
458
+ };
459
+ },
460
+ },
461
+ 'bc7-rgba-unorm': {
462
+ channels: 4,
463
+ bytes_per_block: 16,
464
+ signed: false,
465
+ decode: (blocks, width, height) => decode_bc7(blocks, width, height),
466
+ emulate: async () => {
467
+ const lib = await ComputeShaderEmulator.fromCodeChunk(chunk_bc7_encode_block_mode6);
468
+
469
+ return values => {
470
+ const texels = [];
471
+
472
+ for (let i = 0; i < 16; i++) {
473
+ texels.push(new Float32Array([values[i * 4] / 255, values[i * 4 + 1] / 255, values[i * 4 + 2] / 255, values[i * 4 + 3] / 255]));
474
+ }
475
+
476
+ return block_bytes(lib.bc7_encode_block_mode6(texels));
477
+ };
478
+ },
479
+ },
480
+ 'astc-4x4-unorm': {
481
+ channels: 3,
482
+ bytes_per_block: 16,
483
+ signed: false,
484
+ decode: (blocks, width, height) => {
485
+ const blocks_x = Math.ceil(width / 4);
486
+ const blocks_y = Math.ceil(height / 4);
487
+
488
+ const out = new Uint8Array(width * height * 3);
489
+
490
+ for (let by = 0; by < blocks_y; by++) {
491
+ for (let bx = 0; bx < blocks_x; bx++) {
492
+ const texels = decode_astc_4x4(blocks, (by * blocks_x + bx) * 16);
493
+
494
+ if (texels === null) {
495
+ throw new Error(`block ${by * blocks_x + bx} is not the shape the decoder reads`);
496
+ }
497
+
498
+ for (let i = 0; i < 16; i++) {
499
+ const x = bx * 4 + (i & 3);
500
+ const y = by * 4 + (i >> 2);
501
+
502
+ if (x < width && y < height) {
503
+ out.set(texels[i], (y * width + x) * 3);
504
+ }
505
+ }
506
+ }
507
+ }
508
+
509
+ return out;
510
+ },
511
+ emulate: async () => {
512
+ const lib = await ComputeShaderEmulator.fromCodeChunk(chunk_astc_encode_block_4x4_rgb);
513
+
514
+ return values => {
515
+ const texels = [];
516
+
517
+ for (let i = 0; i < 16; i++) {
518
+ texels.push(new Float32Array([values[i * 3] / 255, values[i * 3 + 1] / 255, values[i * 3 + 2] / 255]));
519
+ }
520
+
521
+ return block_bytes(lib.astc_encode_block_4x4_rgb(texels));
522
+ };
523
+ },
524
+ },
525
+ 'bc1-rgba-unorm': {
526
+ channels: 3,
527
+ bytes_per_block: 8,
528
+ signed: false,
529
+ decode: (blocks, width, height) => leading_channels(decode_bc1(blocks, width, height), 4, 3, width * height),
530
+ emulate: async () => {
531
+ const lib = await ComputeShaderEmulator.fromCodeChunk(chunk_bc1_encode_block);
532
+
533
+ return values => {
534
+ const texels = [];
535
+
536
+ for (let i = 0; i < 16; i++) {
537
+ texels.push(new Float32Array([values[i * 3] / 255, values[i * 3 + 1] / 255, values[i * 3 + 2] / 255]));
538
+ }
539
+
540
+ return block_bytes(lib.bc1_encode_block(texels));
541
+ };
542
+ },
543
+ },
544
+ };
545
+
546
+ /**
547
+ * Read one level of a block-compressed texture back through the hardware's decoder: a
548
+ * `textureLoad` per texel into a buffer of words.
549
+ *
550
+ * @param {GPUDevice} device
551
+ * @param {GPUTexture} texture
552
+ * @param {number} level
553
+ * @param {number} width
554
+ * @param {number} height
555
+ * @param {'bytes'|'signed'|'float'|'exact_red'} mode `bytes` answers every channel rounded to
556
+ * eight-bit levels, `signed` the same as signed bytes, `float` every channel as the f32 the
557
+ * sampler delivers, and `exact_red` the red channel alone as f32 — the decoder produces more
558
+ * precision than eight bits, and the probe wants it
559
+ * @returns {Promise<Uint8Array|Int8Array|Float32Array>} interleaved RGBA, `width * height * 4`
560
+ * samples; or the red channel's `width * height` floats
561
+ */
562
+ async function hardware_decode(device, texture, level, width, height, mode) {
563
+ const per_texel = mode === 'float' ? 4 : 1;
564
+
565
+ const store = {
566
+ bytes: 'out[at] = pack4x8unorm(texel);',
567
+ signed: 'out[at] = pack4x8snorm(texel);',
568
+ exact_red: 'out[at] = bitcast<u32>(texel.r);',
569
+ float: 'out[at * 4u] = bitcast<u32>(texel.r); out[at * 4u + 1u] = bitcast<u32>(texel.g); out[at * 4u + 2u] = bitcast<u32>(texel.b); out[at * 4u + 3u] = bitcast<u32>(texel.a);',
570
+ }[mode];
571
+
572
+ const module = device.createShaderModule({
573
+ code: `
574
+ @group(0) @binding(0) var tex: texture_2d<f32>;
575
+ @group(0) @binding(1) var<storage, read_write> out: array<u32>;
576
+ @group(0) @binding(2) var<uniform> level: vec4<u32>;
577
+
578
+ @compute @workgroup_size(8, 8, 1)
579
+ fn main(@builtin(global_invocation_id) id: vec3<u32>) {
580
+ let size = textureDimensions(tex, i32(level.x));
581
+
582
+ if (id.x >= size.x || id.y >= size.y) {
583
+ return;
584
+ }
585
+
586
+ let texel = textureLoad(tex, vec2<i32>(id.xy), i32(level.x));
587
+ let at = id.y * size.x + id.x;
588
+
589
+ ${store}
590
+ }
591
+ `,
592
+ });
593
+
594
+ const pipeline = device.createComputePipeline({ layout: 'auto', compute: { module, entryPoint: 'main' } });
595
+
596
+ const byte_length = width * height * 4 * per_texel;
597
+
598
+ const out = device.createBuffer({ size: byte_length, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC });
599
+ const uniform = device.createBuffer({ size: 16, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST });
600
+ const readback = device.createBuffer({ size: byte_length, usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST });
601
+
602
+ device.queue.writeBuffer(uniform, 0, new Uint32Array([level, 0, 0, 0]));
603
+
604
+ const bind_group = device.createBindGroup({
605
+ layout: pipeline.getBindGroupLayout(0),
606
+ entries: [
607
+ { binding: 0, resource: texture.createView() },
608
+ { binding: 1, resource: { buffer: out } },
609
+ { binding: 2, resource: { buffer: uniform } },
610
+ ],
611
+ });
612
+
613
+ const encoder = device.createCommandEncoder();
614
+
615
+ const pass = encoder.beginComputePass();
616
+
617
+ pass.setPipeline(pipeline);
618
+ pass.setBindGroup(0, bind_group);
619
+ pass.dispatchWorkgroups(Math.ceil(width / 8), Math.ceil(height / 8), 1);
620
+ pass.end();
621
+
622
+ encoder.copyBufferToBuffer(out, 0, readback, 0, byte_length);
623
+
624
+ device.queue.submit([encoder.finish()]);
625
+
626
+ await readback.mapAsync(GPUMapMode.READ);
627
+
628
+ const range = readback.getMappedRange().slice(0);
629
+
630
+ readback.unmap();
631
+
632
+ out.destroy();
633
+ uniform.destroy();
634
+ readback.destroy();
635
+
636
+ // the packing puts red in the low byte, which is where a little-endian byte view starts
637
+ if (mode === 'bytes') {
638
+ return new Uint8Array(range);
639
+ }
640
+
641
+ if (mode === 'signed') {
642
+ return new Int8Array(range);
643
+ }
644
+
645
+ return new Float32Array(range);
646
+ }
647
+
648
+ /**
649
+ * @param {GPUDevice} device
650
+ * @param {GPUBuffer} source
651
+ * @param {number} byte_length
652
+ * @returns {Promise<Uint8Array>}
653
+ */
654
+ async function read_buffer(device, source, byte_length) {
655
+ const readback = device.createBuffer({ size: byte_length, usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST });
656
+
657
+ const encoder = device.createCommandEncoder();
658
+
659
+ encoder.copyBufferToBuffer(source, 0, readback, 0, byte_length);
660
+
661
+ device.queue.submit([encoder.finish()]);
662
+
663
+ await readback.mapAsync(GPUMapMode.READ);
664
+
665
+ const bytes = new Uint8Array(readback.getMappedRange().slice(0));
666
+
667
+ readback.unmap();
668
+ readback.destroy();
669
+
670
+ return bytes;
671
+ }
672
+
673
+ /**
674
+ * The blocks of one level of a compressed texture, read back with the copy the encoder's copy is the
675
+ * inverse of.
676
+ *
677
+ * @param {GPUDevice} device
678
+ * @param {GPUTexture} texture
679
+ * @param {TextureEncodeLevel} level
680
+ * @param {number} bytes_per_block
681
+ * @returns {Promise<Uint8Array>} tightly packed
682
+ */
683
+ async function read_texture_level(device, texture, level, bytes_per_block) {
684
+ const padded = level.bytes_per_row * level.blocks_y;
685
+
686
+ const readback = device.createBuffer({ size: padded, usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST });
687
+
688
+ const encoder = device.createCommandEncoder();
689
+
690
+ // sized in whole blocks, as the encoder's own copy is — the device refuses a 2x2 extent
691
+ encoder.copyTextureToBuffer(
692
+ { texture, mipLevel: level.level },
693
+ { buffer: readback, bytesPerRow: level.bytes_per_row, rowsPerImage: level.blocks_y },
694
+ [level.copy_width, level.copy_height, 1]
695
+ );
696
+
697
+ device.queue.submit([encoder.finish()]);
698
+
699
+ await readback.mapAsync(GPUMapMode.READ);
700
+
701
+ const bytes = new Uint8Array(readback.getMappedRange().slice(0));
702
+
703
+ readback.unmap();
704
+ readback.destroy();
705
+
706
+ const row_bytes = level.blocks_x * bytes_per_block;
707
+
708
+ const out = new Uint8Array(row_bytes * level.blocks_y);
709
+
710
+ for (let row = 0; row < level.blocks_y; row++) {
711
+ out.set(bytes.subarray(row * level.bytes_per_row, row * level.bytes_per_row + row_bytes), row * row_bytes);
712
+ }
713
+
714
+ return out;
715
+ }
716
+
717
+ /**
718
+ * Linear HDR values as display bytes: a Reinhard curve and a display gamma, so the sun clips and
719
+ * the shadows show.
720
+ *
721
+ * @param {Float32Array} values
722
+ * @returns {Uint8Array}
723
+ */
724
+ function tonemap(values) {
725
+ const out = new Uint8Array(values.length);
726
+
727
+ for (let i = 0; i < values.length; i++) {
728
+ const v = Math.max(0, values[i]);
729
+
730
+ out[i] = Math.round(Math.min(1, (v / (1 + v)) ** (1 / 2.2)) * 255);
731
+ }
732
+
733
+ return out;
734
+ }
735
+
736
+ /**
737
+ * An HDR image through a block encoder that takes forty-eight floats, edge texels repeated.
738
+ *
739
+ * @param {(values: Float32Array) => Uint8Array} encode_block
740
+ * @param {Float32Array} image `width * height * 3`
741
+ * @param {number} width
742
+ * @param {number} height
743
+ * @returns {Uint8Array} tightly packed blocks
744
+ */
745
+ function encode_hdr_image(encode_block, image, width, height) {
746
+ const blocks_x = Math.ceil(width / 4);
747
+ const blocks_y = Math.ceil(height / 4);
748
+
749
+ const out = new Uint8Array(blocks_x * blocks_y * 16);
750
+ const values = new Float32Array(48);
751
+
752
+ for (let by = 0; by < blocks_y; by++) {
753
+ for (let bx = 0; bx < blocks_x; bx++) {
754
+ for (let i = 0; i < 16; i++) {
755
+ const x = Math.min(bx * 4 + (i & 3), width - 1);
756
+ const y = Math.min(by * 4 + (i >> 2), height - 1);
757
+
758
+ for (let c = 0; c < 3; c++) {
759
+ values[i * 3 + c] = image[(y * width + x) * 3 + c];
760
+ }
761
+ }
762
+
763
+ out.set(encode_block(values), (by * blocks_x + bx) * 16);
764
+ }
765
+ }
766
+
767
+ return out;
768
+ }
769
+
770
+ /**
771
+ * The bytes a canvas shows for one, two or three interleaved channels: one as grey, two as red and
772
+ * green, three as colour — opaque RGBA, which is also what FLIP compares, since FLIP judges what is
773
+ * displayed.
774
+ *
775
+ * @param {ArrayLike<number>} data
776
+ * @param {number} channels
777
+ * @param {number} texels
778
+ * @param {number} gain
779
+ * @param {boolean} signed values in [-127, 127], shown with zero at mid grey
780
+ * @returns {Uint8Array} `texels * 4`
781
+ */
782
+ function display_rgba(data, channels, texels, gain = 1, signed = false) {
783
+ const out = new Uint8Array(texels * 4);
784
+
785
+ for (let i = 0; i < texels; i++) {
786
+ for (let c = 0; c < 3; c++) {
787
+ const source = channels === 1 ? 0 : c;
788
+
789
+ const value = source < channels ? data[i * channels + source] : (signed ? -128 : 0);
790
+
791
+ out[i * 4 + c] = Math.min(255, (signed ? value + 128 : value) * gain);
792
+ }
793
+
794
+ out[i * 4 + 3] = 255;
795
+ }
796
+
797
+ return out;
798
+ }
799
+
800
+ /**
801
+ * Stand the page up.
802
+ *
803
+ * @returns {Promise<void>}
804
+ */
805
+ export async function start() {
806
+ const status_element = element('status');
807
+ const report_element = element('report');
808
+ const readout_element = element('readout');
809
+
810
+ /**
811
+ * What each panel holds at a texel, for the line under the panels; set by the run that drew
812
+ * them, null before the first.
813
+ *
814
+ * @type {?function(number, number): string}
815
+ */
816
+ let describe_texel = null;
817
+
818
+ const panels = create_panel_group({
819
+ canvases: [element('source_view'), element('decoded_view'), element('difference_view')],
820
+ size: PANEL_SIZE,
821
+ on_cursor: texel => {
822
+ readout_element.textContent = texel === null || describe_texel === null ? '' : describe_texel(texel.x, texel.y);
823
+ }
824
+ });
825
+
826
+ /**
827
+ * @param {string} text
828
+ * @param {string} [kind]
829
+ */
830
+ function set_status(text, kind = '') {
831
+ status_element.textContent = text;
832
+ status_element.className = kind;
833
+ }
834
+
835
+ if (navigator.gpu === undefined) {
836
+ set_status('no WebGPU in this browser', 'fail');
837
+
838
+ return;
839
+ }
840
+
841
+ const adapter = await navigator.gpu.requestAdapter();
842
+
843
+ if (adapter === null) {
844
+ set_status('no WebGPU adapter', 'fail');
845
+
846
+ return;
847
+ }
848
+
849
+ // every compression family the adapter offers is asked for, so the encoder can be handed any
850
+ // of its targets; the encoder itself needs no feature at all
851
+ const requiredFeatures = ['texture-compression-bc', 'texture-compression-etc2', 'texture-compression-astc']
852
+ .filter(feature => adapter.features.has(feature));
853
+
854
+ const device = await adapter.requestDevice({ requiredFeatures });
855
+
856
+ const support = gpu_texture_compression_support(device);
857
+
858
+ element('device').textContent = `${adapter.info?.vendor ?? '?'} ${adapter.info?.architecture ?? ''}`
859
+ + ` — ${support.size} compressed formats sampleable, features: ${requiredFeatures.join(', ') || 'none'}`;
860
+
861
+ const graphics = new GraphicsContext(device);
862
+
863
+ /** @type {SourceLevel|null} */
864
+ let uploaded_source = null;
865
+
866
+ globalThis.device = device;
867
+
868
+ /**
869
+ * @param {SourceLevel} base
870
+ */
871
+ async function run(base) {
872
+ const format = element('format').value;
873
+
874
+ const info = FORMATS[format];
875
+
876
+ if (info === undefined) {
877
+ set_status(`${format} is not a format this page knows how to judge`, 'fail');
878
+
879
+ return;
880
+ }
881
+
882
+ if (!support.has(format)) {
883
+ set_status(`${format} cannot be sampled on this device, so the texture cannot be created`, 'fail');
884
+
885
+ return;
886
+ }
887
+
888
+ set_status(`encoding ${base.width}x${base.height} to ${format}…`);
889
+
890
+ const levels = mip_chain(base);
891
+
892
+ if (info.hdr === true && base.hdr === undefined) {
893
+ set_status(`${format} wants an HDR source; pick the HDR synthetic one`, 'fail');
894
+
895
+ return;
896
+ }
897
+
898
+ // a signed target reads a signed source: the same bytes, meaning [-1, 1] to the sampler;
899
+ // an HDR target reads halves
900
+ const source = device.createTexture({
901
+ label: 'source',
902
+ size: [base.width, base.height, 1],
903
+ format: info.hdr ? 'rgba16float' : (info.signed ? 'rgba8snorm' : 'rgba8unorm'),
904
+ mipLevelCount: levels.length,
905
+ usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,
906
+ });
907
+
908
+ for (let level = 0; level < levels.length; level++) {
909
+ texture_write_level(device.queue, source, level, levels[level].rgba);
910
+ }
911
+
912
+ const lines = [];
913
+
914
+ /**
915
+ * Record, submit and wait, answering with the result and the wall time.
916
+ *
917
+ * @returns {Promise<{result: TextureEncodeResult, blocks_copy: GPUBuffer, wall_ms: number}>}
918
+ */
919
+ async function encode_once() {
920
+ const cmd = ShadeGPUCommandContext.create(graphics, 'texture encode');
921
+
922
+ const started = performance.now();
923
+
924
+ const result = texture_encode(cmd, {
925
+ source,
926
+ format,
927
+ level_count: levels.length,
928
+ usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC,
929
+ });
930
+
931
+ // the block buffer is transient and goes back to the pool at finish, so it is copied out now
932
+ const blocks_copy = device.createBuffer({
933
+ size: result.layout.byte_length,
934
+ usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC,
935
+ });
936
+
937
+ cmd.copyBufferToBuffer(result.blocks, 0, blocks_copy, 0, result.layout.byte_length);
938
+
939
+ cmd.finish();
940
+
941
+ await device.queue.onSubmittedWorkDone();
942
+
943
+ return { result, blocks_copy, wall_ms: performance.now() - started };
944
+ }
945
+
946
+ device.pushErrorScope('validation');
947
+
948
+ // twice: the first run compiles the pipeline, the second is what a second texture costs
949
+ const first = await encode_once();
950
+
951
+ first.result.texture.destroy();
952
+ first.blocks_copy.destroy();
953
+
954
+ const { result, blocks_copy, wall_ms } = await encode_once();
955
+
956
+ const validation = await device.popErrorScope();
957
+
958
+ if (validation !== null) {
959
+ set_status(`validation error: ${validation.message}`, 'fail');
960
+
961
+ lines.push(validation.message);
962
+ report_element.textContent = lines.join('\n');
963
+
964
+ return;
965
+ }
966
+
967
+ const texels = levels.reduce((sum, level) => sum + level.width * level.height, 0);
968
+
969
+ lines.push(`${format} ${base.width}x${base.height}, ${levels.length} levels, ${result.layout.block_count} blocks`);
970
+ lines.push(` wall time, record to done ${wall_ms.toFixed(2)} ms (${(texels / 1e6 / (wall_ms / 1000)).toFixed(1)} MP/s; first run with pipeline compile ${first.wall_ms.toFixed(1)} ms)`);
971
+ lines.push(` block buffer ${result.layout.byte_length} bytes, rows padded to ${result.layout.levels[0].bytes_per_row}`);
972
+ lines.push('');
973
+ lines.push(' level size PSNR dB max hw PSNR hw max texture==buffer hw decode vs CPU decode');
974
+
975
+ const blocks = await read_buffer(device, blocks_copy, result.layout.byte_length);
976
+
977
+ blocks_copy.destroy();
978
+
979
+ let all_texture_match = true;
980
+ let hardware_mismatch_total = 0;
981
+ let hardware_max = 0;
982
+ let hardware_psnr_gap = 0;
983
+ let flip_line = '';
984
+
985
+ for (const level of result.layout.levels) {
986
+ const texel_count = level.width * level.height;
987
+
988
+ const truth = info.hdr
989
+ ? levels[level.level].hdr
990
+ : leading_channels(levels[level.level].rgba, 4, info.channels, texel_count, info.signed);
991
+
992
+ const level_blocks = texture_encode_level_blocks(result.layout, blocks, level.level);
993
+
994
+ const decoded = info.decode(level_blocks, level.width, level.height);
995
+
996
+ /*
997
+ What a sampler is measured over: bytes for an LDR format, and for BC6H the half-float
998
+ bit patterns, which is the domain its decoder interpolates in and a relative error in
999
+ value — with the largest finite half as the peak.
1000
+ */
1001
+ const measure = samples => info.hdr ? half_bits_of(samples) : samples;
1002
+ const peak = info.hdr ? 0x7BFF : (info.signed ? 127 : 255);
1003
+
1004
+ // the PSNR of one level everywhere: no picture is credited as closer to the source than
1005
+ // a rounding, so a level one decoder reproduces exactly still has a ratio to take
1006
+ const rounding_psnr = 20 * Math.log10(peak);
1007
+
1008
+ const reference = new Sampler2D(measure(truth), info.channels, level.width, level.height);
1009
+ const test = new Sampler2D(measure(decoded), info.channels, level.width, level.height);
1010
+
1011
+ const psnr = sampler2d_psnr(reference, test, info.channels, peak);
1012
+ const max = sampler2d_max_absolute_difference(reference, test);
1013
+
1014
+ // 2. the texture holds the buffer's blocks
1015
+ const from_texture = await read_texture_level(device, result.texture, level, result.layout.bytes_per_block);
1016
+
1017
+ let texture_match = from_texture.length === level_blocks.length;
1018
+
1019
+ for (let i = 0; texture_match && i < level_blocks.length; i++) {
1020
+ texture_match = from_texture[i] === level_blocks[i];
1021
+ }
1022
+
1023
+ all_texture_match = all_texture_match && texture_match;
1024
+
1025
+ // 3. the hardware decodes what the test decoder predicts
1026
+ const hardware = leading_channels(
1027
+ await hardware_decode(device, result.texture, level.level, level.width, level.height, info.hdr ? 'float' : (info.signed ? 'signed' : 'bytes')),
1028
+ 4, info.channels, texel_count, info.signed
1029
+ );
1030
+
1031
+ const hardware_measured = measure(hardware);
1032
+ const decoded_measured = measure(decoded);
1033
+
1034
+ let mismatches = 0;
1035
+ let worst = 0;
1036
+
1037
+ for (let i = 0; i < hardware_measured.length; i++) {
1038
+ const delta = Math.abs(hardware_measured[i] - decoded_measured[i]);
1039
+
1040
+ if (delta !== 0) {
1041
+ mismatches++;
1042
+ }
1043
+
1044
+ worst = Math.max(worst, delta);
1045
+ }
1046
+
1047
+ hardware_mismatch_total += mismatches;
1048
+ hardware_max = Math.max(hardware_max, worst);
1049
+
1050
+ // what the GPU actually shows against the source — the number a user would see
1051
+ const hardware_sampler = new Sampler2D(hardware_measured, info.channels, level.width, level.height);
1052
+
1053
+ const hardware_psnr = sampler2d_psnr(reference, hardware_sampler, info.channels, peak);
1054
+ const hardware_worst = sampler2d_max_absolute_difference(reference, hardware_sampler);
1055
+
1056
+ /*
1057
+ The gap is the CPU decoder's reading minus the hardware's, where the hardware is worse,
1058
+ both held at the PSNR of a rounding. A tail level the CPU decoder reproduces exactly has
1059
+ infinite PSNR, and against a hardware texel one level off the ratio is whatever the
1060
+ ceiling makes it — a 200 dB ceiling read BC1's 1x1 level as a 150 dB gap. Under the
1061
+ rounding ceiling that level is no gap at all, while a misread block on it stays tens of
1062
+ decibels under.
1063
+ */
1064
+ hardware_psnr_gap = Math.max(hardware_psnr_gap, Math.min(psnr, rounding_psnr) - Math.min(hardware_psnr, rounding_psnr));
1065
+
1066
+ lines.push(
1067
+ ` ${String(level.level).padStart(5)} ${`${level.width}x${level.height}`.padStart(9)}`
1068
+ + ` ${psnr.toFixed(2).padStart(7)} ${String(max).padStart(3)}`
1069
+ + ` ${hardware_psnr.toFixed(2).padStart(7)} ${String(hardware_worst).padStart(6)}`
1070
+ + ` ${texture_match ? 'yes' : 'NO '} `
1071
+ + ` ${mismatches} samples differ, worst ${worst}`
1072
+ );
1073
+
1074
+ if (level.level === 0) {
1075
+ const shown_truth = info.hdr ? tonemap(truth) : truth;
1076
+ const shown_hardware = info.hdr ? tonemap(hardware) : hardware;
1077
+
1078
+ const truth_rgba = display_rgba(shown_truth, info.channels, texel_count, 1, info.signed);
1079
+ const hardware_rgba = display_rgba(shown_hardware, info.channels, texel_count, 1, info.signed);
1080
+
1081
+ panels.set_picture(PANEL_SOURCE, truth_rgba, level.width, level.height);
1082
+ panels.set_picture(PANEL_HARDWARE, hardware_rgba, level.width, level.height);
1083
+
1084
+ /*
1085
+ The third panel is FLIP: how likely a viewer flipping between the two pictures is
1086
+ to notice a difference, and where. A tint nobody would see scores low and a
1087
+ displaced edge scores high, which is what an amplified pixel difference gets
1088
+ backwards. It compares the displayed bytes — the tone-mapped picture for HDR, the
1089
+ mid-grey-centred one for a signed format — because that is what is seen. It is a
1090
+ CPU pass over the whole image, seconds at 2048x2048, so the status says what the
1091
+ page is doing and a frame goes by so that it shows.
1092
+ */
1093
+ set_status(`encoded; FLIP over ${level.width}x${level.height}…`);
1094
+
1095
+ await painted();
1096
+
1097
+ const flip_started = performance.now();
1098
+
1099
+ const error = sampler2d_flip_ldr(
1100
+ new Sampler2D(truth_rgba, 4, level.width, level.height),
1101
+ new Sampler2D(hardware_rgba, 4, level.width, level.height)
1102
+ );
1103
+
1104
+ const flip_ms = performance.now() - flip_started;
1105
+
1106
+ // the readbacks of the other levels are awaited, so this one paints on its own
1107
+ set_status(`FLIP done in ${flip_ms.toFixed(0)} ms; the other levels, then the emulator over level 0…`);
1108
+
1109
+ const pooled = flip_pool(error);
1110
+
1111
+ panels.set_picture(PANEL_FLIP, display_rgba(sampler2d_channel_apply_lut(error, 0, MAGMA_LUT, 3).data, 3, texel_count), level.width, level.height);
1112
+
1113
+ // the bytes the panels show at a texel, in the format's own units — a signed
1114
+ // format's are shown about mid grey and an HDR one's tone-mapped — and FLIP there
1115
+ const shown_channels = Math.min(info.channels, 3);
1116
+
1117
+ describe_texel = (x, y) => {
1118
+ const i = y * level.width + x;
1119
+
1120
+ const bytes = rgba => Array.from(rgba.subarray(i * 4, i * 4 + shown_channels), byte => info.signed ? byte - 128 : byte).join(' ');
1121
+
1122
+ return `texel ${x}, ${y} source ${bytes(truth_rgba)} hardware ${bytes(hardware_rgba)}${info.hdr ? ' (tone-mapped bytes)' : ''} FLIP ${error.data[i].toFixed(4)}`;
1123
+ };
1124
+
1125
+ flip_line = ` FLIP, level 0, hardware picture against the source at ${new FlipParameters().pixels_per_degree.toFixed(1)} pixels per degree:`
1126
+ + ` mean ${pooled.mean.toFixed(4)}, weighted median ${pooled.weighted_median.toFixed(4)}, max ${pooled.maximum.toFixed(4)}`
1127
+ + ` (${flip_ms.toFixed(0)} ms)`;
1128
+ }
1129
+ }
1130
+
1131
+ lines.push('');
1132
+ lines.push(flip_line);
1133
+
1134
+ // 4. the device against the emulator, block by block, on level 0 — the emulator runs a
1135
+ // block in a fraction of a millisecond, which is fine at 512x512 and a hang at 2048
1136
+ lines.push('');
1137
+
1138
+ const emulator_limit = 32768;
1139
+
1140
+ if (base.width * base.height / 16 > emulator_limit) {
1141
+ lines.push(` device against the emulator: skipped above ${emulator_limit} blocks; use the 512x512 source`);
1142
+ } else try {
1143
+ const encode_block = await info.emulate();
1144
+
1145
+ const truth = info.hdr
1146
+ ? levels[0].hdr
1147
+ : leading_channels(levels[0].rgba, 4, info.channels, base.width * base.height, info.signed);
1148
+
1149
+ // the helper hands the encoder bytes; a signed encoder reads them as two's complement,
1150
+ // and an HDR level is encoded from its floats directly
1151
+ const emulated = info.hdr
1152
+ ? encode_hdr_image(encode_block, truth, base.width, base.height)
1153
+ : encode_image_with_block_encoder(
1154
+ encode_block, info.bytes_per_block, new Uint8Array(truth.buffer), base.width, base.height, info.channels
1155
+ );
1156
+
1157
+ const gpu = texture_encode_level_blocks(result.layout, blocks, 0);
1158
+
1159
+ const bytes_per_block = info.bytes_per_block;
1160
+ const block_count = gpu.length / bytes_per_block;
1161
+
1162
+ let identical = 0;
1163
+ let gpu_better = 0;
1164
+ let gpu_worse = 0;
1165
+ let gpu_equal = 0;
1166
+
1167
+ const gpu_decoded = info.decode(gpu, base.width, base.height);
1168
+ const emulated_decoded = info.decode(emulated, base.width, base.height);
1169
+
1170
+ for (let block = 0; block < block_count; block++) {
1171
+ let same = true;
1172
+
1173
+ for (let i = 0; i < bytes_per_block; i++) {
1174
+ same = same && gpu[block * bytes_per_block + i] === emulated[block * bytes_per_block + i];
1175
+ }
1176
+
1177
+ if (same) {
1178
+ identical++;
1179
+
1180
+ continue;
1181
+ }
1182
+
1183
+ // a different block is fine if it is no worse; the device's f32 rounds differently
1184
+ const bx = block % Math.ceil(base.width / 4);
1185
+ const by = Math.floor(block / Math.ceil(base.width / 4));
1186
+
1187
+ let gpu_error = 0;
1188
+ let emulated_error = 0;
1189
+
1190
+ for (let y = by * 4; y < Math.min(by * 4 + 4, base.height); y++) {
1191
+ for (let x = bx * 4; x < Math.min(bx * 4 + 4, base.width); x++) {
1192
+ for (let c = 0; c < info.channels; c++) {
1193
+ const at = (y * base.width + x) * info.channels + c;
1194
+
1195
+ gpu_error += (gpu_decoded[at] - truth[at]) ** 2;
1196
+ emulated_error += (emulated_decoded[at] - truth[at]) ** 2;
1197
+ }
1198
+ }
1199
+ }
1200
+
1201
+ if (gpu_error < emulated_error) {
1202
+ gpu_better++;
1203
+ } else if (gpu_error > emulated_error) {
1204
+ gpu_worse++;
1205
+ } else {
1206
+ gpu_equal++;
1207
+ }
1208
+ }
1209
+
1210
+ lines.push(` device against the emulator, level 0: ${identical} of ${block_count} blocks identical;`
1211
+ + ` of the rest ${gpu_equal} equal in error, ${gpu_better} better on the device, ${gpu_worse} worse`);
1212
+ } catch (error) {
1213
+ lines.push(` emulator comparison skipped: ${error.message}`);
1214
+ }
1215
+
1216
+ report_element.textContent = lines.join('\n');
1217
+
1218
+ /*
1219
+ The hardware's interpolation is not the specification's rounding — the probe below has the
1220
+ exact weights — so a few levels against the CPU decoder on a wide-span block is the
1221
+ decoder's arithmetic, not a wrong block. What a wrong block does is move whole texels by
1222
+ tens, which shows up as the hardware's picture being decibels worse than the CPU decoder's
1223
+ reading of the same bytes. So the verdict is that difference, per level, with nothing finer
1224
+ than a rounding counted.
1225
+ */
1226
+ const verdict = all_texture_match && hardware_psnr_gap <= 1;
1227
+
1228
+ set_status(
1229
+ verdict
1230
+ ? `ok — texture holds the shader's blocks on every level; the hardware's picture is within ${hardware_psnr_gap.toFixed(2)} dB of the CPU decoder's, a rounding forgiven; samples within ${hardware_max} (${hardware_mismatch_total} differ)`
1231
+ : `problem — texture matches buffer: ${all_texture_match}; the hardware's picture is ${hardware_psnr_gap.toFixed(2)} dB under the CPU decoder's, a rounding forgiven; samples up to ${hardware_max} apart`,
1232
+ verdict ? 'pass' : 'fail'
1233
+ );
1234
+
1235
+ globalThis.last_result = result;
1236
+
1237
+ source.destroy();
1238
+ }
1239
+
1240
+ /**
1241
+ * What the hardware's BC4 decoder actually computes, found rather than assumed.
1242
+ *
1243
+ * A 1024x1024 BC4 texture holds every pair of endpoints as one block each, with texels 0..7
1244
+ * carrying indices 0..7 — so a hardware read of the texture is the whole decode table, 256 x
1245
+ * 256 x 8 entries, read back at the precision the sampler delivers rather than rounded to eight
1246
+ * bits. From that the interpolation weight at every index is fitted exactly, and the difference
1247
+ * from the CPU decoder the specs judge with is tabulated. The specification writes the
1248
+ * interpolation in real arithmetic and leaves the precision to the implementation; this is what
1249
+ * one implementation chose.
1250
+ */
1251
+ async function probe_decoder() {
1252
+ // 65536 pairs at 256 blocks a row is 256 rows of blocks: 1024 texels tall, not 512
1253
+ const width = 1024;
1254
+ const height = 1024;
1255
+
1256
+ const blocks_x = width / 4;
1257
+
1258
+ const blocks = new Uint8Array(blocks_x * (height / 4) * 8);
1259
+
1260
+ for (let first = 0; first < 256; first++) {
1261
+ for (let second = 0; second < 256; second++) {
1262
+ const block = first * 256 + second;
1263
+
1264
+ const at = block * 8;
1265
+
1266
+ blocks[at] = first;
1267
+ blocks[at + 1] = second;
1268
+
1269
+ // texels 0..7 take indices 0..7 in order: eight three-bit fields, 24 bits, 3 bytes
1270
+ const word = 0 | (1 << 3) | (2 << 6) | (3 << 9) | (4 << 12) | (5 << 15) | (6 << 18) | (7 << 21);
1271
+
1272
+ blocks[at + 2] = word & 0xFF;
1273
+ blocks[at + 3] = (word >> 8) & 0xFF;
1274
+ blocks[at + 4] = (word >> 16) & 0xFF;
1275
+ }
1276
+ }
1277
+
1278
+ const texture = device.createTexture({
1279
+ label: 'decoder probe',
1280
+ size: [width, height, 1],
1281
+ format: 'bc4-r-unorm',
1282
+ usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
1283
+ });
1284
+
1285
+ texture_write_level(device.queue, texture, 0, blocks);
1286
+
1287
+ const exact = await hardware_decode(device, texture, 0, width, height, 'exact_red');
1288
+
1289
+ texture.destroy();
1290
+
1291
+ /**
1292
+ * The hardware's value for one entry of one pair's palette, as the unorm it sampled.
1293
+ *
1294
+ * @param {number} first
1295
+ * @param {number} second
1296
+ * @param {number} index
1297
+ * @returns {number}
1298
+ */
1299
+ const sampled = (first, second, index) => {
1300
+ const block = first * 256 + second;
1301
+
1302
+ const x = (block % blocks_x) * 4 + (index & 3);
1303
+ const y = Math.floor(block / blocks_x) * 4 + (index >> 2);
1304
+
1305
+ return exact[y * width + x];
1306
+ };
1307
+
1308
+ const lines = [
1309
+ 'the hardware BC4 decoder, over every pair of endpoints:',
1310
+ '',
1311
+ ' the weight of the second endpoint at each index, fitted from the unrounded samples as',
1312
+ ' value = A + (B - A) * w over 16-bit endpoints A = 257a. An interval is the set of weights',
1313
+ ' every pair agrees with; an empty one would mean no single weight does.',
1314
+ '',
1315
+ ];
1316
+
1317
+ for (const [mode, indices] of [['eight-value (first > second)', [2, 3, 4, 5, 6, 7]], ['six-value (first <= second)', [2, 3, 4, 5]]]) {
1318
+ for (const index of indices) {
1319
+ let low = -Infinity;
1320
+ let high = Infinity;
1321
+
1322
+ for (let first = 0; first < 256; first += 3) {
1323
+ for (let second = 0; second < 256; second += 3) {
1324
+ const eight = first > second;
1325
+ const wanted_eight = indices.length === 6;
1326
+
1327
+ if (eight !== wanted_eight || Math.abs(first - second) < 32) {
1328
+ continue;
1329
+ }
1330
+
1331
+ const A = first * 257;
1332
+ const B = second * 257;
1333
+
1334
+ const w = (sampled(first, second, index) * 65535 - A) / (B - A);
1335
+
1336
+ // the 16-bit value is within half a unit of what the hardware computed
1337
+ const tolerance = 0.51 / Math.abs(B - A);
1338
+
1339
+ low = Math.max(low, w - tolerance);
1340
+ high = Math.min(high, w + tolerance);
1341
+ }
1342
+ }
1343
+
1344
+ const mid = (low + high) / 2;
1345
+
1346
+ lines.push(
1347
+ ` ${mode} index ${index}: w = ${mid.toFixed(6)}`
1348
+ + ` (x257 = ${(mid * 257).toFixed(2)}, the specification's ${(indices.length === 6 ? (index - 1) / 7 : (index - 1) / 5).toFixed(6)})`
1349
+ + (high < low ? ' EMPTY' : '')
1350
+ );
1351
+ }
1352
+ }
1353
+
1354
+ // and, rounded to eight bits, how far that is from the CPU decoder the specs judge with
1355
+ const histogram = new Map();
1356
+
1357
+ for (let first = 0; first < 256; first++) {
1358
+ for (let second = 0; second < 256; second++) {
1359
+ const block = new Uint8Array(8);
1360
+
1361
+ block[0] = first;
1362
+ block[1] = second;
1363
+ block[2] = 0b10001000;
1364
+ block[3] = 0b11000110;
1365
+ block[4] = 0b11111010;
1366
+
1367
+ const reference = decode_bc4(block, 4, 2);
1368
+
1369
+ for (let index = 0; index < 8; index++) {
1370
+ const delta = Math.round(sampled(first, second, index) * 255) - reference[index];
1371
+
1372
+ histogram.set(delta, (histogram.get(delta) ?? 0) + 1);
1373
+ }
1374
+ }
1375
+ }
1376
+
1377
+ const total = 65536 * 8;
1378
+
1379
+ lines.push('');
1380
+ lines.push(' hardware, rounded to eight bits, minus the CPU decoder, over every pair and index:');
1381
+
1382
+ for (const delta of [...histogram.keys()].sort((a, b) => a - b)) {
1383
+ lines.push(` ${String(delta).padStart(3)}: ${String(histogram.get(delta)).padStart(7)} (${(100 * histogram.get(delta) / total).toFixed(2)}%)`);
1384
+ }
1385
+
1386
+ report_element.textContent = lines.join('\n');
1387
+
1388
+ set_status('decoder probe done', 'pass');
1389
+ }
1390
+
1391
+ element('probe').addEventListener('click', () => {
1392
+ probe_decoder().catch(error => {
1393
+ set_status(error.message, 'fail');
1394
+
1395
+ console.error(error);
1396
+ });
1397
+ });
1398
+
1399
+ element('run').addEventListener('click', () => {
1400
+ const choice = element('source').value;
1401
+
1402
+ const kind = choice.startsWith('correlated') ? 'correlated'
1403
+ : choice.startsWith('normal') ? 'normal'
1404
+ : choice.startsWith('hdr') ? 'hdr'
1405
+ : 'independent';
1406
+ const signed = FORMATS[element('format').value]?.signed === true;
1407
+
1408
+ const base = uploaded_source ?? synthetic_source(Number(choice.replace(/[a-z]+/, '')), kind, signed);
1409
+
1410
+ run(base).catch(error => {
1411
+ set_status(error.message, 'fail');
1412
+
1413
+ console.error(error);
1414
+ });
1415
+ });
1416
+
1417
+ element('file').addEventListener('change', async event => {
1418
+ const file = event.target.files[0];
1419
+
1420
+ if (file === undefined) {
1421
+ return;
1422
+ }
1423
+
1424
+ uploaded_source = await file_source(file);
1425
+
1426
+ set_status(`${file.name}: ${uploaded_source.width}x${uploaded_source.height} ready`, 'pass');
1427
+ });
1428
+
1429
+ set_status('ready', 'pass');
1430
+ }