@woosh/meep-engine 3.9.0 → 3.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (832) hide show
  1. package/README.md +168 -152
  2. package/build/bundle-worker-image-decoder.js +1 -1
  3. package/build/bundle-worker-terrain.js +1 -1
  4. package/package.json +3 -2
  5. package/src/REVIEW_2026_08_06.md +610 -610
  6. package/src/avif/encode_image_source.d.ts +70 -0
  7. package/src/avif/encode_image_source.d.ts.map +1 -0
  8. package/src/avif/encode_image_source.js +117 -0
  9. package/src/avif/encoder_worker.js +15 -126
  10. package/src/avif/index.d.ts +4 -2
  11. package/src/avif/index.js +21 -2
  12. package/src/avif/native/DECISIONS.md +537 -0
  13. package/src/avif/native/NOTICE.md +61 -0
  14. package/src/avif/native/api/AvifDecoder.d.ts +67 -0
  15. package/src/avif/native/api/AvifDecoder.d.ts.map +1 -0
  16. package/src/avif/native/api/AvifDecoder.js +121 -0
  17. package/src/avif/native/api/apply_transformations.d.ts +30 -0
  18. package/src/avif/native/api/apply_transformations.d.ts.map +1 -0
  19. package/src/avif/native/api/apply_transformations.js +120 -0
  20. package/src/avif/native/api/avif_to_sampler2d.d.ts +25 -0
  21. package/src/avif/native/api/avif_to_sampler2d.d.ts.map +1 -0
  22. package/src/avif/native/api/avif_to_sampler2d.js +42 -0
  23. package/src/avif/native/api/convert_to_rgba.d.ts +54 -0
  24. package/src/avif/native/api/convert_to_rgba.d.ts.map +1 -0
  25. package/src/avif/native/api/convert_to_rgba.js +204 -0
  26. package/src/avif/native/api/decode_avif.d.ts +24 -0
  27. package/src/avif/native/api/decode_avif.d.ts.map +1 -0
  28. package/src/avif/native/api/decode_avif.js +111 -0
  29. package/src/avif/native/api/decode_image_item.d.ts +18 -0
  30. package/src/avif/native/api/decode_image_item.d.ts.map +1 -0
  31. package/src/avif/native/api/decode_image_item.js +234 -0
  32. package/src/avif/native/api/encode_avif.d.ts +73 -0
  33. package/src/avif/native/api/encode_avif.d.ts.map +1 -0
  34. package/src/avif/native/api/encode_avif.js +488 -0
  35. package/src/avif/native/api/sampler2d_to_avif.d.ts +22 -0
  36. package/src/avif/native/api/sampler2d_to_avif.d.ts.map +1 -0
  37. package/src/avif/native/api/sampler2d_to_avif.js +108 -0
  38. package/src/avif/native/av1/decode/Av1FrameContext.d.ts +286 -0
  39. package/src/avif/native/av1/decode/Av1FrameContext.d.ts.map +1 -0
  40. package/src/avif/native/av1/decode/Av1FrameContext.js +622 -0
  41. package/src/avif/native/av1/decode/block_decoded.d.ts +27 -0
  42. package/src/avif/native/av1/decode/block_decoded.d.ts.map +1 -0
  43. package/src/avif/native/av1/decode/block_decoded.js +59 -0
  44. package/src/avif/native/av1/decode/decode_av1_still.d.ts +22 -0
  45. package/src/avif/native/av1/decode/decode_av1_still.d.ts.map +1 -0
  46. package/src/avif/native/av1/decode/decode_av1_still.js +309 -0
  47. package/src/avif/native/av1/decode/decode_coefficients.d.ts +20 -0
  48. package/src/avif/native/av1/decode/decode_coefficients.d.ts.map +1 -0
  49. package/src/avif/native/av1/decode/decode_coefficients.js +259 -0
  50. package/src/avif/native/av1/decode/decode_palette.d.ts +28 -0
  51. package/src/avif/native/av1/decode/decode_palette.d.ts.map +1 -0
  52. package/src/avif/native/av1/decode/decode_palette.js +442 -0
  53. package/src/avif/native/av1/decode/decode_tile.d.ts +14 -0
  54. package/src/avif/native/av1/decode/decode_tile.d.ts.map +1 -0
  55. package/src/avif/native/av1/decode/decode_tile.js +1213 -0
  56. package/src/avif/native/av1/decode/get_scan.d.ts +16 -0
  57. package/src/avif/native/av1/decode/get_scan.d.ts.map +1 -0
  58. package/src/avif/native/av1/decode/get_scan.js +138 -0
  59. package/src/avif/native/av1/decode/read_lr.d.ts +35 -0
  60. package/src/avif/native/av1/decode/read_lr.d.ts.map +1 -0
  61. package/src/avif/native/av1/decode/read_lr.js +277 -0
  62. package/src/avif/native/av1/decode/read_transform_type.d.ts +19 -0
  63. package/src/avif/native/av1/decode/read_transform_type.d.ts.map +1 -0
  64. package/src/avif/native/av1/decode/read_transform_type.js +92 -0
  65. package/src/avif/native/av1/decode/reconstruct.d.ts +36 -0
  66. package/src/avif/native/av1/decode/reconstruct.d.ts.map +1 -0
  67. package/src/avif/native/av1/decode/reconstruct.js +241 -0
  68. package/src/avif/native/av1/decode/transform_type.d.ts +49 -0
  69. package/src/avif/native/av1/decode/transform_type.d.ts.map +1 -0
  70. package/src/avif/native/av1/decode/transform_type.js +137 -0
  71. package/src/avif/native/av1/encode/Av1BlockSnapshot.d.ts +81 -0
  72. package/src/avif/native/av1/encode/Av1BlockSnapshot.d.ts.map +1 -0
  73. package/src/avif/native/av1/encode/Av1BlockSnapshot.js +299 -0
  74. package/src/avif/native/av1/encode/Av1EncodeContext.d.ts +384 -0
  75. package/src/avif/native/av1/encode/Av1EncodeContext.d.ts.map +1 -0
  76. package/src/avif/native/av1/encode/Av1EncodeContext.js +590 -0
  77. package/src/avif/native/av1/encode/build_headers.d.ts +50 -0
  78. package/src/avif/native/av1/encode/build_headers.d.ts.map +1 -0
  79. package/src/avif/native/av1/encode/build_headers.js +359 -0
  80. package/src/avif/native/av1/encode/choose_chroma_alpha.d.ts +26 -0
  81. package/src/avif/native/av1/encode/choose_chroma_alpha.d.ts.map +1 -0
  82. package/src/avif/native/av1/encode/choose_chroma_alpha.js +90 -0
  83. package/src/avif/native/av1/encode/choose_filters.d.ts +21 -0
  84. package/src/avif/native/av1/encode/choose_filters.d.ts.map +1 -0
  85. package/src/avif/native/av1/encode/choose_filters.js +318 -0
  86. package/src/avif/native/av1/encode/choose_restoration.d.ts +35 -0
  87. package/src/avif/native/av1/encode/choose_restoration.d.ts.map +1 -0
  88. package/src/avif/native/av1/encode/choose_restoration.js +616 -0
  89. package/src/avif/native/av1/encode/decode_effort.d.ts +57 -0
  90. package/src/avif/native/av1/encode/decode_effort.d.ts.map +1 -0
  91. package/src/avif/native/av1/encode/decode_effort.js +59 -0
  92. package/src/avif/native/av1/encode/encode_av1_still.d.ts +17 -0
  93. package/src/avif/native/av1/encode/encode_av1_still.d.ts.map +1 -0
  94. package/src/avif/native/av1/encode/encode_av1_still.js +194 -0
  95. package/src/avif/native/av1/encode/encode_effort.d.ts +56 -0
  96. package/src/avif/native/av1/encode/encode_effort.d.ts.map +1 -0
  97. package/src/avif/native/av1/encode/encode_effort.js +97 -0
  98. package/src/avif/native/av1/encode/encode_tile.d.ts +26 -0
  99. package/src/avif/native/av1/encode/encode_tile.d.ts.map +1 -0
  100. package/src/avif/native/av1/encode/encode_tile.js +2331 -0
  101. package/src/avif/native/av1/encode/quantise.d.ts +51 -0
  102. package/src/avif/native/av1/encode/quantise.d.ts.map +1 -0
  103. package/src/avif/native/av1/encode/quantise.js +212 -0
  104. package/src/avif/native/av1/encode/write_coefficients.d.ts +42 -0
  105. package/src/avif/native/av1/encode/write_coefficients.d.ts.map +1 -0
  106. package/src/avif/native/av1/encode/write_coefficients.js +367 -0
  107. package/src/avif/native/av1/encode/write_lr.d.ts +33 -0
  108. package/src/avif/native/av1/encode/write_lr.d.ts.map +1 -0
  109. package/src/avif/native/av1/encode/write_lr.js +174 -0
  110. package/src/avif/native/av1/encode/write_transform_type.d.ts +21 -0
  111. package/src/avif/native/av1/encode/write_transform_type.d.ts.map +1 -0
  112. package/src/avif/native/av1/encode/write_transform_type.js +70 -0
  113. package/src/avif/native/av1/entropy/CdfContext.d.ts +167 -0
  114. package/src/avif/native/av1/entropy/CdfContext.d.ts.map +1 -0
  115. package/src/avif/native/av1/entropy/CdfContext.js +433 -0
  116. package/src/avif/native/av1/entropy/SymbolReader.d.ts +103 -0
  117. package/src/avif/native/av1/entropy/SymbolReader.d.ts.map +1 -0
  118. package/src/avif/native/av1/entropy/SymbolReader.js +317 -0
  119. package/src/avif/native/av1/entropy/SymbolWriter.d.ts +107 -0
  120. package/src/avif/native/av1/entropy/SymbolWriter.d.ts.map +1 -0
  121. package/src/avif/native/av1/entropy/SymbolWriter.js +352 -0
  122. package/src/avif/native/av1/entropy/coefficient_context.d.ts +71 -0
  123. package/src/avif/native/av1/entropy/coefficient_context.d.ts.map +1 -0
  124. package/src/avif/native/av1/entropy/coefficient_context.js +325 -0
  125. package/src/avif/native/av1/entropy/partition_cdf.d.ts +54 -0
  126. package/src/avif/native/av1/entropy/partition_cdf.d.ts.map +1 -0
  127. package/src/avif/native/av1/entropy/partition_cdf.js +98 -0
  128. package/src/avif/native/av1/entropy/symbol_cost.d.ts +37 -0
  129. package/src/avif/native/av1/entropy/symbol_cost.d.ts.map +1 -0
  130. package/src/avif/native/av1/entropy/symbol_cost.js +76 -0
  131. package/src/avif/native/av1/filter/cdef.d.ts +15 -0
  132. package/src/avif/native/av1/filter/cdef.d.ts.map +1 -0
  133. package/src/avif/native/av1/filter/cdef.js +313 -0
  134. package/src/avif/native/av1/filter/loop_filter.d.ts +14 -0
  135. package/src/avif/native/av1/filter/loop_filter.d.ts.map +1 -0
  136. package/src/avif/native/av1/filter/loop_filter.js +377 -0
  137. package/src/avif/native/av1/filter/loop_restoration.d.ts +42 -0
  138. package/src/avif/native/av1/filter/loop_restoration.d.ts.map +1 -0
  139. package/src/avif/native/av1/filter/loop_restoration.js +451 -0
  140. package/src/avif/native/av1/filter/superres.d.ts +18 -0
  141. package/src/avif/native/av1/filter/superres.d.ts.map +1 -0
  142. package/src/avif/native/av1/filter/superres.js +86 -0
  143. package/src/avif/native/av1/grain/FilmGrainState.d.ts +62 -0
  144. package/src/avif/native/av1/grain/FilmGrainState.d.ts.map +1 -0
  145. package/src/avif/native/av1/grain/FilmGrainState.js +87 -0
  146. package/src/avif/native/av1/grain/film_grain.d.ts +16 -0
  147. package/src/avif/native/av1/grain/film_grain.d.ts.map +1 -0
  148. package/src/avif/native/av1/grain/film_grain.js +623 -0
  149. package/src/avif/native/av1/obu/FrameHeader.d.ts +248 -0
  150. package/src/avif/native/av1/obu/FrameHeader.d.ts.map +1 -0
  151. package/src/avif/native/av1/obu/FrameHeader.js +381 -0
  152. package/src/avif/native/av1/obu/ObuHeader.d.ts +53 -0
  153. package/src/avif/native/av1/obu/ObuHeader.d.ts.map +1 -0
  154. package/src/avif/native/av1/obu/ObuHeader.js +62 -0
  155. package/src/avif/native/av1/obu/SequenceHeader.d.ts +157 -0
  156. package/src/avif/native/av1/obu/SequenceHeader.d.ts.map +1 -0
  157. package/src/avif/native/av1/obu/SequenceHeader.js +225 -0
  158. package/src/avif/native/av1/obu/for_each_obu.d.ts +24 -0
  159. package/src/avif/native/av1/obu/for_each_obu.d.ts.map +1 -0
  160. package/src/avif/native/av1/obu/for_each_obu.js +50 -0
  161. package/src/avif/native/av1/obu/parse_frame_header.d.ts +18 -0
  162. package/src/avif/native/av1/obu/parse_frame_header.d.ts.map +1 -0
  163. package/src/avif/native/av1/obu/parse_frame_header.js +841 -0
  164. package/src/avif/native/av1/obu/parse_obu_header.d.ts +23 -0
  165. package/src/avif/native/av1/obu/parse_obu_header.d.ts.map +1 -0
  166. package/src/avif/native/av1/obu/parse_obu_header.js +69 -0
  167. package/src/avif/native/av1/obu/parse_sequence_header.d.ts +17 -0
  168. package/src/avif/native/av1/obu/parse_sequence_header.d.ts.map +1 -0
  169. package/src/avif/native/av1/obu/parse_sequence_header.js +263 -0
  170. package/src/avif/native/av1/obu/write_frame_header.d.ts +16 -0
  171. package/src/avif/native/av1/obu/write_frame_header.d.ts.map +1 -0
  172. package/src/avif/native/av1/obu/write_frame_header.js +579 -0
  173. package/src/avif/native/av1/obu/write_sequence_header.d.ts +17 -0
  174. package/src/avif/native/av1/obu/write_sequence_header.d.ts.map +1 -0
  175. package/src/avif/native/av1/obu/write_sequence_header.js +189 -0
  176. package/src/avif/native/av1/predict/IntraPredictionState.d.ts +49 -0
  177. package/src/avif/native/av1/predict/IntraPredictionState.d.ts.map +1 -0
  178. package/src/avif/native/av1/predict/IntraPredictionState.js +58 -0
  179. package/src/avif/native/av1/predict/intra_filter_type.d.ts +17 -0
  180. package/src/avif/native/av1/predict/intra_filter_type.d.ts.map +1 -0
  181. package/src/avif/native/av1/predict/intra_filter_type.js +79 -0
  182. package/src/avif/native/av1/predict/predict_chroma_from_luma.d.ts +50 -0
  183. package/src/avif/native/av1/predict/predict_chroma_from_luma.d.ts.map +1 -0
  184. package/src/avif/native/av1/predict/predict_chroma_from_luma.js +153 -0
  185. package/src/avif/native/av1/predict/predict_intra.d.ts +42 -0
  186. package/src/avif/native/av1/predict/predict_intra.d.ts.map +1 -0
  187. package/src/avif/native/av1/predict/predict_intra.js +803 -0
  188. package/src/avif/native/av1/predict/predict_palette.d.ts +23 -0
  189. package/src/avif/native/av1/predict/predict_palette.d.ts.map +1 -0
  190. package/src/avif/native/av1/predict/predict_palette.js +36 -0
  191. package/src/avif/native/av1/tables/av1_symbols.d.ts +411 -0
  192. package/src/avif/native/av1/tables/av1_symbols.d.ts.map +1 -0
  193. package/src/avif/native/av1/tables/av1_symbols.js +419 -0
  194. package/src/avif/native/av1/tables/block_tables.d.ts +181 -0
  195. package/src/avif/native/av1/tables/block_tables.d.ts.map +1 -0
  196. package/src/avif/native/av1/tables/block_tables.js +270 -0
  197. package/src/avif/native/av1/tables/cdf_tables.d.ts +961 -0
  198. package/src/avif/native/av1/tables/cdf_tables.d.ts.map +1 -0
  199. package/src/avif/native/av1/tables/cdf_tables.js +1893 -0
  200. package/src/avif/native/av1/tables/coefficient_tables.d.ts +41 -0
  201. package/src/avif/native/av1/tables/coefficient_tables.d.ts.map +1 -0
  202. package/src/avif/native/av1/tables/coefficient_tables.js +82 -0
  203. package/src/avif/native/av1/tables/derived_block_tables.d.ts +15 -0
  204. package/src/avif/native/av1/tables/derived_block_tables.d.ts.map +1 -0
  205. package/src/avif/native/av1/tables/derived_block_tables.js +23 -0
  206. package/src/avif/native/av1/tables/filter_tables.d.ts +171 -0
  207. package/src/avif/native/av1/tables/filter_tables.d.ts.map +1 -0
  208. package/src/avif/native/av1/tables/filter_tables.js +313 -0
  209. package/src/avif/native/av1/tables/grain_tables.d.ts +11 -0
  210. package/src/avif/native/av1/tables/grain_tables.d.ts.map +1 -0
  211. package/src/avif/native/av1/tables/grain_tables.js +190 -0
  212. package/src/avif/native/av1/tables/prediction_tables.d.ts +141 -0
  213. package/src/avif/native/av1/tables/prediction_tables.d.ts.map +1 -0
  214. package/src/avif/native/av1/tables/prediction_tables.js +223 -0
  215. package/src/avif/native/av1/tables/quantizer_matrix_tables.d.ts +21 -0
  216. package/src/avif/native/av1/tables/quantizer_matrix_tables.d.ts.map +1 -0
  217. package/src/avif/native/av1/tables/quantizer_matrix_tables.js +38 -0
  218. package/src/avif/native/av1/tables/quantizer_tables.d.ts +21 -0
  219. package/src/avif/native/av1/tables/quantizer_tables.d.ts.map +1 -0
  220. package/src/avif/native/av1/tables/quantizer_tables.js +160 -0
  221. package/src/avif/native/av1/tables/scan_tables.d.ts +321 -0
  222. package/src/avif/native/av1/tables/scan_tables.d.ts.map +1 -0
  223. package/src/avif/native/av1/tables/scan_tables.js +727 -0
  224. package/src/avif/native/av1/tables/segmentation_tables.d.ts +31 -0
  225. package/src/avif/native/av1/tables/segmentation_tables.d.ts.map +1 -0
  226. package/src/avif/native/av1/tables/segmentation_tables.js +48 -0
  227. package/src/avif/native/av1/tables/transform_tables.d.ts +91 -0
  228. package/src/avif/native/av1/tables/transform_tables.d.ts.map +1 -0
  229. package/src/avif/native/av1/tables/transform_tables.js +140 -0
  230. package/src/avif/native/av1/tables/unpack_table.d.ts +33 -0
  231. package/src/avif/native/av1/tables/unpack_table.d.ts.map +1 -0
  232. package/src/avif/native/av1/tables/unpack_table.js +73 -0
  233. package/src/avif/native/av1/transform/forward_transform_2d.d.ts +61 -0
  234. package/src/avif/native/av1/transform/forward_transform_2d.d.ts.map +1 -0
  235. package/src/avif/native/av1/transform/forward_transform_2d.js +574 -0
  236. package/src/avif/native/av1/transform/inverse_transform_1d.d.ts +76 -0
  237. package/src/avif/native/av1/transform/inverse_transform_1d.d.ts.map +1 -0
  238. package/src/avif/native/av1/transform/inverse_transform_1d.js +590 -0
  239. package/src/avif/native/av1/transform/inverse_transform_2d.d.ts +46 -0
  240. package/src/avif/native/av1/transform/inverse_transform_2d.d.ts.map +1 -0
  241. package/src/avif/native/av1/transform/inverse_transform_2d.js +180 -0
  242. package/src/avif/native/av1/util/ceil_log2.d.ts +13 -0
  243. package/src/avif/native/av1/util/ceil_log2.d.ts.map +1 -0
  244. package/src/avif/native/av1/util/ceil_log2.js +18 -0
  245. package/src/avif/native/av1/util/floor_log2.d.ts +20 -0
  246. package/src/avif/native/av1/util/floor_log2.d.ts.map +1 -0
  247. package/src/avif/native/av1/util/floor_log2.js +20 -0
  248. package/src/avif/native/av1/util/round2.d.ts +22 -0
  249. package/src/avif/native/av1/util/round2.d.ts.map +1 -0
  250. package/src/avif/native/av1/util/round2.js +27 -0
  251. package/src/avif/native/av1/util/round2_signed.d.ts +14 -0
  252. package/src/avif/native/av1/util/round2_signed.d.ts.map +1 -0
  253. package/src/avif/native/av1/util/round2_signed.js +17 -0
  254. package/src/avif/native/av1/util/tile_log2.d.ts +16 -0
  255. package/src/avif/native/av1/util/tile_log2.d.ts.map +1 -0
  256. package/src/avif/native/av1/util/tile_log2.js +23 -0
  257. package/src/avif/native/bitstream/BitReader.d.ts +174 -0
  258. package/src/avif/native/bitstream/BitReader.d.ts.map +1 -0
  259. package/src/avif/native/bitstream/BitReader.js +391 -0
  260. package/src/avif/native/bitstream/BitWriter.d.ts +122 -0
  261. package/src/avif/native/bitstream/BitWriter.d.ts.map +1 -0
  262. package/src/avif/native/bitstream/BitWriter.js +351 -0
  263. package/src/avif/native/color/ColourTransform.d.ts +62 -0
  264. package/src/avif/native/color/ColourTransform.d.ts.map +1 -0
  265. package/src/avif/native/color/ColourTransform.js +189 -0
  266. package/src/avif/native/color/YuvImage.d.ts +51 -0
  267. package/src/avif/native/color/YuvImage.d.ts.map +1 -0
  268. package/src/avif/native/color/YuvImage.js +66 -0
  269. package/src/avif/native/color/clamp_sample.d.ts +18 -0
  270. package/src/avif/native/color/clamp_sample.d.ts.map +1 -0
  271. package/src/avif/native/color/clamp_sample.js +25 -0
  272. package/src/avif/native/color/linear_to_transfer.d.ts +24 -0
  273. package/src/avif/native/color/linear_to_transfer.d.ts.map +1 -0
  274. package/src/avif/native/color/linear_to_transfer.js +126 -0
  275. package/src/avif/native/color/primaries.d.ts +20 -0
  276. package/src/avif/native/color/primaries.d.ts.map +1 -0
  277. package/src/avif/native/color/primaries.js +94 -0
  278. package/src/avif/native/color/rgb_row_to_ycbcr.d.ts +20 -0
  279. package/src/avif/native/color/rgb_row_to_ycbcr.d.ts.map +1 -0
  280. package/src/avif/native/color/rgb_row_to_ycbcr.js +78 -0
  281. package/src/avif/native/color/transfer_to_linear.d.ts +49 -0
  282. package/src/avif/native/color/transfer_to_linear.d.ts.map +1 -0
  283. package/src/avif/native/color/transfer_to_linear.js +171 -0
  284. package/src/avif/native/color/upsample_chroma_row.d.ts +35 -0
  285. package/src/avif/native/color/upsample_chroma_row.d.ts.map +1 -0
  286. package/src/avif/native/color/upsample_chroma_row.js +89 -0
  287. package/src/avif/native/color/ycbcr_row_to_rgb.d.ts +23 -0
  288. package/src/avif/native/color/ycbcr_row_to_rgb.d.ts.map +1 -0
  289. package/src/avif/native/color/ycbcr_row_to_rgb.js +78 -0
  290. package/src/avif/native/heif/AvifFile.d.ts +112 -0
  291. package/src/avif/native/heif/AvifFile.d.ts.map +1 -0
  292. package/src/avif/native/heif/AvifFile.js +142 -0
  293. package/src/avif/native/heif/ItemProperty.d.ts +244 -0
  294. package/src/avif/native/heif/ItemProperty.d.ts.map +1 -0
  295. package/src/avif/native/heif/ItemProperty.js +321 -0
  296. package/src/avif/native/heif/find_item_property.d.ts +17 -0
  297. package/src/avif/native/heif/find_item_property.d.ts.map +1 -0
  298. package/src/avif/native/heif/find_item_property.js +28 -0
  299. package/src/avif/native/heif/find_item_references.d.ts +16 -0
  300. package/src/avif/native/heif/find_item_references.d.ts.map +1 -0
  301. package/src/avif/native/heif/find_item_references.js +29 -0
  302. package/src/avif/native/heif/find_items_referencing.d.ts +17 -0
  303. package/src/avif/native/heif/find_items_referencing.d.ts.map +1 -0
  304. package/src/avif/native/heif/find_items_referencing.js +36 -0
  305. package/src/avif/native/heif/parse_avif_file.d.ts +15 -0
  306. package/src/avif/native/heif/parse_avif_file.d.ts.map +1 -0
  307. package/src/avif/native/heif/parse_avif_file.js +383 -0
  308. package/src/avif/native/heif/parse_image_grid.d.ts +18 -0
  309. package/src/avif/native/heif/parse_image_grid.d.ts.map +1 -0
  310. package/src/avif/native/heif/parse_image_grid.js +48 -0
  311. package/src/avif/native/heif/parse_item_property.d.ts +18 -0
  312. package/src/avif/native/heif/parse_item_property.d.ts.map +1 -0
  313. package/src/avif/native/heif/parse_item_property.js +243 -0
  314. package/src/avif/native/heif/read_item_data.d.ts +22 -0
  315. package/src/avif/native/heif/read_item_data.d.ts.map +1 -0
  316. package/src/avif/native/heif/read_item_data.js +97 -0
  317. package/src/avif/native/heif/write_avif_file.d.ts +50 -0
  318. package/src/avif/native/heif/write_avif_file.d.ts.map +1 -0
  319. package/src/avif/native/heif/write_avif_file.js +348 -0
  320. package/src/avif/native/heif/write_item_property.d.ts +16 -0
  321. package/src/avif/native/heif/write_item_property.d.ts.map +1 -0
  322. package/src/avif/native/heif/write_item_property.js +182 -0
  323. package/src/avif/native/index.d.ts +14 -0
  324. package/src/avif/native/index.d.ts.map +1 -0
  325. package/src/avif/native/index.js +56 -0
  326. package/src/avif/native/isobmff/BoxHeader.d.ts +50 -0
  327. package/src/avif/native/isobmff/BoxHeader.d.ts.map +1 -0
  328. package/src/avif/native/isobmff/BoxHeader.js +57 -0
  329. package/src/avif/native/isobmff/BoxWriter.d.ts +118 -0
  330. package/src/avif/native/isobmff/BoxWriter.d.ts.map +1 -0
  331. package/src/avif/native/isobmff/BoxWriter.js +264 -0
  332. package/src/avif/native/isobmff/ByteCursor.d.ts +125 -0
  333. package/src/avif/native/isobmff/ByteCursor.d.ts.map +1 -0
  334. package/src/avif/native/isobmff/ByteCursor.js +298 -0
  335. package/src/avif/native/isobmff/for_each_box.d.ts +23 -0
  336. package/src/avif/native/isobmff/for_each_box.d.ts.map +1 -0
  337. package/src/avif/native/isobmff/for_each_box.js +39 -0
  338. package/src/avif/native/isobmff/read_box_header.d.ts +22 -0
  339. package/src/avif/native/isobmff/read_box_header.d.ts.map +1 -0
  340. package/src/avif/native/isobmff/read_box_header.js +59 -0
  341. package/src/avif/native/isobmff/read_full_box_header.d.ts +26 -0
  342. package/src/avif/native/isobmff/read_full_box_header.d.ts.map +1 -0
  343. package/src/avif/native/isobmff/read_full_box_header.js +33 -0
  344. package/src/avif/threaded_image_encoder.d.ts +7 -2
  345. package/src/avif/threaded_image_encoder.d.ts.map +1 -1
  346. package/src/avif/threaded_image_encoder.js +107 -21
  347. package/src/core/binary/BinaryBuffer.d.ts +40 -0
  348. package/src/core/binary/BinaryBuffer.d.ts.map +1 -1
  349. package/src/core/binary/BinaryBuffer.js +100 -0
  350. package/src/core/binary/hash/crc32.d.ts +16 -0
  351. package/src/core/binary/hash/crc32.d.ts.map +1 -0
  352. package/src/core/binary/hash/crc32.js +96 -0
  353. package/src/core/binary/utf8/utf8_decode.d.ts +21 -0
  354. package/src/core/binary/utf8/utf8_decode.d.ts.map +1 -0
  355. package/src/core/binary/utf8/utf8_decode.js +43 -0
  356. package/src/core/binary/utf8/utf8_encode_into.d.ts +20 -0
  357. package/src/core/binary/utf8/utf8_encode_into.d.ts.map +1 -0
  358. package/src/core/binary/utf8/utf8_encode_into.js +48 -0
  359. package/src/core/binary/utf8/utf8_encoded_length.d.ts +14 -0
  360. package/src/core/binary/utf8/utf8_encoded_length.d.ts.map +1 -0
  361. package/src/core/binary/utf8/utf8_encoded_length.js +36 -0
  362. package/src/core/color/COLOR_FIX_PLAN_2026_08_28.md +417 -0
  363. package/src/core/color/COLOR_REVIEW_2026_08_28.md +779 -0
  364. package/src/core/color/Color.d.ts +128 -20
  365. package/src/core/color/Color.d.ts.map +1 -1
  366. package/src/core/color/Color.js +959 -866
  367. package/src/core/color/PQ/PQ_constants.d.ts +10 -0
  368. package/src/core/color/PQ/PQ_constants.d.ts.map +1 -1
  369. package/src/core/color/PQ/PQ_constants.js +10 -0
  370. package/src/core/color/PQ/linear_to_PQ.d.ts.map +1 -1
  371. package/src/core/color/PQ/linear_to_PQ.js +6 -0
  372. package/src/core/color/REC709_PRIMARIES.d.ts +50 -0
  373. package/src/core/color/REC709_PRIMARIES.d.ts.map +1 -0
  374. package/src/core/color/REC709_PRIMARIES.js +53 -0
  375. package/src/core/color/construct/color_from_hex.d.ts +21 -0
  376. package/src/core/color/construct/color_from_hex.d.ts.map +1 -0
  377. package/src/core/color/construct/color_from_hex.js +33 -0
  378. package/src/core/color/construct/color_from_temperature.d.ts +22 -0
  379. package/src/core/color/construct/color_from_temperature.d.ts.map +1 -0
  380. package/src/core/color/construct/color_from_temperature.js +33 -0
  381. package/src/core/color/construct/color_from_uint24.d.ts +19 -0
  382. package/src/core/color/construct/color_from_uint24.d.ts.map +1 -0
  383. package/src/core/color/construct/color_from_uint24.js +26 -0
  384. package/src/core/color/construct/color_from_uint32.d.ts +20 -0
  385. package/src/core/color/construct/color_from_uint32.d.ts.map +1 -0
  386. package/src/core/color/construct/color_from_uint32.js +39 -0
  387. package/src/core/color/construct/color_gray.d.ts +17 -0
  388. package/src/core/color/construct/color_gray.d.ts.map +1 -0
  389. package/src/core/color/construct/color_gray.js +22 -0
  390. package/src/core/color/hex/hex2rgb.d.ts +1 -11
  391. package/src/core/color/hex/hex2rgb.d.ts.map +1 -1
  392. package/src/core/color/hex/hex2rgb.js +7 -24
  393. package/src/core/color/hex/hex_to_rgb.d.ts +18 -0
  394. package/src/core/color/hex/hex_to_rgb.d.ts.map +1 -0
  395. package/src/core/color/hex/hex_to_rgb.js +62 -0
  396. package/src/core/color/hex/rgb2hex.d.ts +1 -8
  397. package/src/core/color/hex/rgb2hex.d.ts.map +1 -1
  398. package/src/core/color/hex/rgb2hex.js +7 -13
  399. package/src/core/color/hex/rgb_to_hex.d.ts +9 -0
  400. package/src/core/color/hex/rgb_to_hex.d.ts.map +1 -0
  401. package/src/core/color/hex/rgb_to_hex.js +13 -0
  402. package/src/core/color/hex/rgba_to_hex.d.ts +19 -0
  403. package/src/core/color/hex/rgba_to_hex.d.ts.map +1 -0
  404. package/src/core/color/hex/rgba_to_hex.js +23 -0
  405. package/src/core/color/hsv/hsv2rgb.d.ts +1 -12
  406. package/src/core/color/hsv/hsv2rgb.d.ts.map +1 -1
  407. package/src/core/color/hsv/hsv2rgb.js +8 -21
  408. package/src/core/color/hsv/hsv2rgb_float.d.ts +1 -12
  409. package/src/core/color/hsv/hsv2rgb_float.d.ts.map +1 -1
  410. package/src/core/color/hsv/hsv2rgb_float.js +8 -56
  411. package/src/core/color/hsv/hsv_to_rgb.d.ts +13 -0
  412. package/src/core/color/hsv/hsv_to_rgb.d.ts.map +1 -0
  413. package/src/core/color/hsv/hsv_to_rgb.js +39 -0
  414. package/src/core/color/hsv/hsv_to_rgb_uint8.d.ts +13 -0
  415. package/src/core/color/hsv/hsv_to_rgb_uint8.d.ts.map +1 -0
  416. package/src/core/color/hsv/hsv_to_rgb_uint8.js +21 -0
  417. package/src/core/color/hsv/hue_to_rgb_sextant.d.ts +24 -0
  418. package/src/core/color/hsv/hue_to_rgb_sextant.d.ts.map +1 -0
  419. package/src/core/color/hsv/hue_to_rgb_sextant.js +67 -0
  420. package/src/core/color/hsv/rgb2hsv.d.ts +1 -12
  421. package/src/core/color/hsv/rgb2hsv.d.ts.map +1 -1
  422. package/src/core/color/hsv/rgb2hsv.js +7 -42
  423. package/src/core/color/hsv/rgb_to_hsv.d.ts +13 -0
  424. package/src/core/color/hsv/rgb_to_hsv.d.ts.map +1 -0
  425. package/src/core/color/hsv/rgb_to_hsv.js +42 -0
  426. package/src/core/color/hunt/hpe_to_xyz.d.ts +2 -0
  427. package/src/core/color/hunt/hpe_to_xyz.d.ts.map +1 -0
  428. package/src/core/color/hunt/hpe_to_xyz.js +4 -0
  429. package/src/core/color/hunt/xyz_to_hpe.d.ts +1 -6
  430. package/src/core/color/hunt/xyz_to_hpe.d.ts.map +1 -1
  431. package/src/core/color/hunt/xyz_to_hpe.js +12 -15
  432. package/src/core/color/illuminant/D65_spd_tabulated.d.ts.map +1 -1
  433. package/src/core/color/illuminant/D65_spd_tabulated.js +107 -104
  434. package/src/core/color/int2rgb.d.ts +1 -10
  435. package/src/core/color/int2rgb.d.ts.map +1 -1
  436. package/src/core/color/int2rgb.js +7 -12
  437. package/src/core/color/int_to_rgb.d.ts +21 -0
  438. package/src/core/color/int_to_rgb.d.ts.map +1 -0
  439. package/src/core/color/int_to_rgb.js +33 -0
  440. package/src/core/color/kelvin/kelvin_to_rgb.d.ts.map +1 -1
  441. package/src/core/color/kelvin/kelvin_to_rgb.js +22 -2
  442. package/src/core/color/kelvin/rgb_to_kelvin.d.ts +22 -2
  443. package/src/core/color/kelvin/rgb_to_kelvin.d.ts.map +1 -1
  444. package/src/core/color/kelvin/rgb_to_kelvin.js +22 -2
  445. package/src/core/color/lab/lab_to_xyz.d.ts +20 -0
  446. package/src/core/color/lab/lab_to_xyz.d.ts.map +1 -0
  447. package/src/core/color/lab/lab_to_xyz.js +69 -0
  448. package/src/core/color/oklab/gamut_clip_adaptive_l0.d.ts +34 -0
  449. package/src/core/color/oklab/gamut_clip_adaptive_l0.d.ts.map +1 -0
  450. package/src/core/color/oklab/gamut_clip_adaptive_l0.js +46 -0
  451. package/src/core/color/oklab/gamut_clip_at_l0.d.ts +33 -0
  452. package/src/core/color/oklab/gamut_clip_at_l0.d.ts.map +1 -0
  453. package/src/core/color/oklab/gamut_clip_at_l0.js +84 -0
  454. package/src/core/color/oklab/gamut_clip_preserve_chroma.d.ts +24 -0
  455. package/src/core/color/oklab/gamut_clip_preserve_chroma.d.ts.map +1 -0
  456. package/src/core/color/oklab/gamut_clip_preserve_chroma.js +37 -0
  457. package/src/core/color/oklab/gamut_clip_project_to_lcusp.d.ts +23 -0
  458. package/src/core/color/oklab/gamut_clip_project_to_lcusp.d.ts.map +1 -0
  459. package/src/core/color/oklab/gamut_clip_project_to_lcusp.js +46 -0
  460. package/src/core/color/oklab/linear_srgb_to_okhsl.d.ts +19 -0
  461. package/src/core/color/oklab/linear_srgb_to_okhsl.d.ts.map +1 -0
  462. package/src/core/color/oklab/linear_srgb_to_okhsl.js +93 -0
  463. package/src/core/color/oklab/linear_srgb_to_okhsv.d.ts +12 -4
  464. package/src/core/color/oklab/linear_srgb_to_okhsv.d.ts.map +1 -1
  465. package/src/core/color/oklab/linear_srgb_to_okhsv.js +108 -84
  466. package/src/core/color/oklab/linear_srgb_to_oklab.d.ts +13 -4
  467. package/src/core/color/oklab/linear_srgb_to_oklab.d.ts.map +1 -1
  468. package/src/core/color/oklab/linear_srgb_to_oklab.js +28 -19
  469. package/src/core/color/oklab/okhsl_chroma_bounds.d.ts +51 -0
  470. package/src/core/color/oklab/okhsl_chroma_bounds.d.ts.map +1 -0
  471. package/src/core/color/oklab/okhsl_chroma_bounds.js +128 -0
  472. package/src/core/color/oklab/okhsl_to_linear_srgb.d.ts +19 -0
  473. package/src/core/color/oklab/okhsl_to_linear_srgb.d.ts.map +1 -0
  474. package/src/core/color/oklab/okhsl_to_linear_srgb.js +85 -0
  475. package/src/core/color/oklab/oklab_to_oklch.d.ts +24 -0
  476. package/src/core/color/oklab/oklab_to_oklch.d.ts.map +1 -0
  477. package/src/core/color/oklab/oklab_to_oklch.js +35 -0
  478. package/src/core/color/oklab/oklch_to_oklab.d.ts +18 -0
  479. package/src/core/color/oklab/oklch_to_oklab.d.ts.map +1 -0
  480. package/src/core/color/oklab/oklch_to_oklab.js +26 -0
  481. package/src/core/color/oklab/toe.d.ts +12 -0
  482. package/src/core/color/oklab/toe.d.ts.map +1 -1
  483. package/src/core/color/oklab/toe.js +34 -22
  484. package/src/core/color/operations/color_add.d.ts +21 -0
  485. package/src/core/color/operations/color_add.d.ts.map +1 -0
  486. package/src/core/color/operations/color_add.js +23 -0
  487. package/src/core/color/operations/color_add_scaled.d.ts +20 -0
  488. package/src/core/color/operations/color_add_scaled.d.ts.map +1 -0
  489. package/src/core/color/operations/color_add_scaled.js +30 -0
  490. package/src/core/color/operations/color_clamp.d.ts +22 -0
  491. package/src/core/color/operations/color_clamp.d.ts.map +1 -0
  492. package/src/core/color/operations/color_clamp.js +25 -0
  493. package/src/core/color/operations/color_darken.d.ts +2 -1
  494. package/src/core/color/operations/color_darken.d.ts.map +1 -1
  495. package/src/core/color/operations/color_darken.js +25 -24
  496. package/src/core/color/operations/color_desaturate.d.ts +2 -1
  497. package/src/core/color/operations/color_desaturate.d.ts.map +1 -1
  498. package/src/core/color/operations/color_desaturate.js +25 -24
  499. package/src/core/color/operations/color_get_hsl.d.ts +18 -0
  500. package/src/core/color/operations/color_get_hsl.d.ts.map +1 -0
  501. package/src/core/color/operations/color_get_hsl.js +60 -0
  502. package/src/core/color/operations/color_is_in_gamut.d.ts +20 -0
  503. package/src/core/color/operations/color_is_in_gamut.d.ts.map +1 -0
  504. package/src/core/color/operations/color_is_in_gamut.js +30 -0
  505. package/src/core/color/operations/color_lerp.d.ts +12 -3
  506. package/src/core/color/operations/color_lerp.d.ts.map +1 -1
  507. package/src/core/color/operations/color_lerp.js +55 -46
  508. package/src/core/color/operations/color_lighten.d.ts +9 -5
  509. package/src/core/color/operations/color_lighten.d.ts.map +1 -1
  510. package/src/core/color/operations/color_lighten.js +29 -24
  511. package/src/core/color/operations/color_mix_okhsv_channel.d.ts +24 -0
  512. package/src/core/color/operations/color_mix_okhsv_channel.d.ts.map +1 -0
  513. package/src/core/color/operations/color_mix_okhsv_channel.js +48 -0
  514. package/src/core/color/operations/color_multiply_rgb.d.ts +21 -0
  515. package/src/core/color/operations/color_multiply_rgb.d.ts.map +1 -0
  516. package/src/core/color/operations/color_multiply_rgb.js +26 -0
  517. package/src/core/color/operations/color_saturate.d.ts +9 -5
  518. package/src/core/color/operations/color_saturate.d.ts.map +1 -1
  519. package/src/core/color/operations/color_saturate.js +29 -24
  520. package/src/core/color/operations/color_scale_okhsv_channel.d.ts +1 -1
  521. package/src/core/color/operations/color_scale_okhsv_channel.d.ts.map +1 -1
  522. package/src/core/color/operations/color_scale_okhsv_channel.js +58 -45
  523. package/src/core/color/operations/color_srgb_apply.d.ts +28 -0
  524. package/src/core/color/operations/color_srgb_apply.d.ts.map +1 -0
  525. package/src/core/color/operations/color_srgb_apply.js +40 -0
  526. package/src/core/color/operations/color_sub.d.ts +16 -0
  527. package/src/core/color/operations/color_sub.d.ts.map +1 -0
  528. package/src/core/color/operations/color_sub.js +18 -0
  529. package/src/core/color/parse_color.d.ts +10 -1
  530. package/src/core/color/parse_color.d.ts.map +1 -1
  531. package/src/core/color/parse_color.js +100 -84
  532. package/src/core/color/parse_color_normalized.d.ts +24 -0
  533. package/src/core/color/parse_color_normalized.d.ts.map +1 -0
  534. package/src/core/color/parse_color_normalized.js +38 -0
  535. package/src/core/color/rgb2uint24.d.ts +1 -8
  536. package/src/core/color/rgb2uint24.d.ts.map +1 -1
  537. package/src/core/color/rgb2uint24.js +7 -20
  538. package/src/core/color/rgb2uint32.d.ts +1 -9
  539. package/src/core/color/rgb2uint32.d.ts.map +1 -1
  540. package/src/core/color/rgb2uint32.js +7 -18
  541. package/src/core/color/rgb_to_luminance.d.ts +14 -5
  542. package/src/core/color/rgb_to_luminance.d.ts.map +1 -1
  543. package/src/core/color/rgb_to_luminance.js +24 -13
  544. package/src/core/color/rgb_to_uint24.d.ts +9 -0
  545. package/src/core/color/rgb_to_uint24.d.ts.map +1 -0
  546. package/src/core/color/rgb_to_uint24.js +20 -0
  547. package/src/core/color/rgb_to_uint32.d.ts +10 -0
  548. package/src/core/color/rgb_to_uint32.d.ts.map +1 -0
  549. package/src/core/color/rgb_to_uint32.js +21 -0
  550. package/src/core/color/sRGB/linear_to_sRGB.d.ts +7 -0
  551. package/src/core/color/sRGB/linear_to_sRGB.d.ts.map +1 -1
  552. package/src/core/color/sRGB/linear_to_sRGB.js +39 -32
  553. package/src/core/color/xyz/hpe_to_xyz.d.ts +24 -0
  554. package/src/core/color/xyz/hpe_to_xyz.d.ts.map +1 -0
  555. package/src/core/color/xyz/hpe_to_xyz.js +39 -0
  556. package/src/core/color/xyz/rgb_to_xyz.d.ts +17 -2
  557. package/src/core/color/xyz/rgb_to_xyz.d.ts.map +1 -1
  558. package/src/core/color/xyz/rgb_to_xyz.js +44 -18
  559. package/src/core/color/xyz/xyz_cmf_tabulated.d.ts.map +1 -1
  560. package/src/core/color/xyz/xyz_cmf_tabulated.js +217 -211
  561. package/src/core/color/xyz/xyz_cmf_wyman.d.ts +4 -0
  562. package/src/core/color/xyz/xyz_cmf_wyman.d.ts.map +1 -1
  563. package/src/core/color/xyz/xyz_cmf_wyman.js +74 -65
  564. package/src/core/color/xyz/xyz_to_hpe.d.ts +18 -0
  565. package/src/core/color/xyz/xyz_to_hpe.d.ts.map +1 -0
  566. package/src/core/color/xyz/xyz_to_hpe.js +33 -0
  567. package/src/core/color/xyz/xyz_to_rgb.d.ts +17 -2
  568. package/src/core/color/xyz/xyz_to_rgb.d.ts.map +1 -1
  569. package/src/core/color/xyz/xyz_to_rgb.js +39 -16
  570. package/src/core/color/ycxcz/xyz_to_ycxcz.d.ts +7 -2
  571. package/src/core/color/ycxcz/xyz_to_ycxcz.d.ts.map +1 -1
  572. package/src/core/color/ycxcz/xyz_to_ycxcz.js +33 -28
  573. package/src/core/events/signal/Signal.js +820 -820
  574. package/src/core/geom/3d/shape/ConvexHullShape3D.d.ts.map +1 -1
  575. package/src/core/geom/3d/shape/ConvexHullShape3D.js +28 -4
  576. package/src/core/math/clamp_index.d.ts +18 -0
  577. package/src/core/math/clamp_index.d.ts.map +1 -0
  578. package/src/core/math/clamp_index.js +23 -0
  579. package/src/engine/asset/loaders/image/IMAGE_CODEC_REVIEW_2026_08_28.md +803 -0
  580. package/src/engine/asset/loaders/image/jpeg/JpegFrame.d.ts +5 -3
  581. package/src/engine/asset/loaders/image/jpeg/JpegFrame.d.ts.map +1 -1
  582. package/src/engine/asset/loaders/image/jpeg/JpegFrame.js +5 -3
  583. package/src/engine/asset/loaders/image/jpeg/JpegFrameComponent.d.ts +2 -1
  584. package/src/engine/asset/loaders/image/jpeg/JpegFrameComponent.d.ts.map +1 -1
  585. package/src/engine/asset/loaders/image/jpeg/JpegFrameComponent.js +2 -1
  586. package/src/engine/asset/loaders/image/jpeg/JpegImage.d.ts +17 -0
  587. package/src/engine/asset/loaders/image/jpeg/JpegImage.d.ts.map +1 -1
  588. package/src/engine/asset/loaders/image/jpeg/JpegImage.js +197 -157
  589. package/src/engine/asset/loaders/image/jpeg/idct8x8_float.d.ts +0 -1
  590. package/src/engine/asset/loaders/image/jpeg/idct8x8_float.d.ts.map +1 -1
  591. package/src/engine/asset/loaders/image/jpeg/idct8x8_float.js +0 -1
  592. package/src/engine/asset/loaders/image/jpeg/jpeg_component_row.d.ts +28 -0
  593. package/src/engine/asset/loaders/image/jpeg/jpeg_component_row.d.ts.map +1 -0
  594. package/src/engine/asset/loaders/image/jpeg/jpeg_component_row.js +31 -0
  595. package/src/engine/asset/loaders/image/png/PNG.d.ts +3 -18
  596. package/src/engine/asset/loaders/image/png/PNG.d.ts.map +1 -1
  597. package/src/engine/asset/loaders/image/png/PNG.js +3 -139
  598. package/src/engine/asset/loaders/image/png/PNGReader.d.ts +16 -16
  599. package/src/engine/asset/loaders/image/png/PNGReader.d.ts.map +1 -1
  600. package/src/engine/asset/loaders/image/png/PNGReader.js +143 -160
  601. package/src/engine/asset/loaders/image/png/chunk/png_chunk_decode_iTXt.js +3 -3
  602. package/src/engine/asset/loaders/image/png/chunk/png_chunk_decode_zTXt.js +3 -3
  603. package/src/engine/asset/loaders/image/png/crc32.d.ts +1 -15
  604. package/src/engine/asset/loaders/image/png/crc32.d.ts.map +1 -1
  605. package/src/engine/asset/loaders/image/png/crc32.js +5 -89
  606. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterNone.d.ts +12 -10
  607. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterNone.d.ts.map +1 -1
  608. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterNone.js +20 -45
  609. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterSub.d.ts +2 -1
  610. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterSub.d.ts.map +1 -1
  611. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterSub.js +2 -0
  612. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterUp.d.ts +2 -1
  613. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterUp.d.ts.map +1 -1
  614. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterUp.js +2 -0
  615. package/src/engine/asset/loaders/image/png/filter/png_unfilter.d.ts +22 -0
  616. package/src/engine/asset/loaders/image/png/filter/png_unfilter.d.ts.map +1 -0
  617. package/src/engine/asset/loaders/image/png/filter/png_unfilter.js +68 -0
  618. package/src/engine/asset/loaders/image/png/png_inflate.d.ts +20 -0
  619. package/src/engine/asset/loaders/image/png/png_inflate.d.ts.map +1 -0
  620. package/src/engine/asset/loaders/image/png/png_inflate.js +85 -0
  621. package/src/engine/asset/loaders/image/png/png_unpack_samples.d.ts +22 -0
  622. package/src/engine/asset/loaders/image/png/png_unpack_samples.d.ts.map +1 -0
  623. package/src/engine/asset/loaders/image/png/png_unpack_samples.js +38 -0
  624. package/src/engine/graphics/ecs/sprite/SpriteSystemPE.d.ts.map +1 -1
  625. package/src/engine/graphics/ecs/sprite/SpriteSystemPE.js +135 -132
  626. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts +16 -3
  627. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts.map +1 -1
  628. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +1157 -1149
  629. package/src/engine/graphics/render/frame_graph/FrameGraph.d.ts +26 -0
  630. package/src/engine/graphics/render/frame_graph/FrameGraph.d.ts.map +1 -1
  631. package/src/engine/graphics/render/frame_graph/FrameGraph.js +947 -900
  632. package/src/engine/physics/ecs/PhysicsSystem.d.ts +69 -81
  633. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  634. package/src/engine/physics/ecs/PhysicsSystem.js +83 -77
  635. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  636. package/src/shade/device/IMMEDIATE_DATA_PLAN_2026_08_28.md +451 -0
  637. package/src/shade/device/ShadeGPUCommandContext.d.ts +21 -0
  638. package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
  639. package/src/shade/device/ShadeGPUCommandContext.js +940 -749
  640. package/src/shade/device/timing/GPUTimerArray.d.ts +22 -4
  641. package/src/shade/device/timing/GPUTimerArray.d.ts.map +1 -1
  642. package/src/shade/device/timing/GPUTimerArray.js +88 -14
  643. package/src/shade/device/timing/GPU_PROFILER_PROPOSAL_2026_08_28.md +876 -0
  644. package/src/shade/device/timing/profile/GPUFrameRecorder.d.ts +93 -0
  645. package/src/shade/device/timing/profile/GPUFrameRecorder.d.ts.map +1 -0
  646. package/src/shade/device/timing/profile/GPUFrameRecorder.js +297 -0
  647. package/src/shade/device/timing/profile/GPUProfileCapture.d.ts +62 -0
  648. package/src/shade/device/timing/profile/GPUProfileCapture.d.ts.map +1 -0
  649. package/src/shade/device/timing/profile/GPUProfileCapture.js +77 -0
  650. package/src/shade/device/timing/profile/GPUProfileFrame.d.ts +73 -0
  651. package/src/shade/device/timing/profile/GPUProfileFrame.d.ts.map +1 -0
  652. package/src/shade/device/timing/profile/GPUProfileFrame.js +88 -0
  653. package/src/shade/device/timing/profile/GPUProfileLevel.d.ts +20 -0
  654. package/src/shade/device/timing/profile/GPUProfileLevel.d.ts.map +1 -0
  655. package/src/shade/device/timing/profile/GPUProfileLevel.js +50 -0
  656. package/src/shade/device/timing/profile/GPUProfileMeta.d.ts +63 -0
  657. package/src/shade/device/timing/profile/GPUProfileMeta.d.ts.map +1 -0
  658. package/src/shade/device/timing/profile/GPUProfileMeta.js +73 -0
  659. package/src/shade/device/timing/profile/GPUProfileSession.d.ts +173 -0
  660. package/src/shade/device/timing/profile/GPUProfileSession.d.ts.map +1 -0
  661. package/src/shade/device/timing/profile/GPUProfileSession.js +470 -0
  662. package/src/shade/device/timing/profile/GPUProfileSpan.d.ts +60 -0
  663. package/src/shade/device/timing/profile/GPUProfileSpan.d.ts.map +1 -0
  664. package/src/shade/device/timing/profile/GPUProfileSpan.js +65 -0
  665. package/src/shade/device/timing/profile/GPUProfileSpanKind.d.ts +19 -0
  666. package/src/shade/device/timing/profile/GPUProfileSpanKind.d.ts.map +1 -0
  667. package/src/shade/device/timing/profile/GPUProfileSpanKind.js +25 -0
  668. package/src/shade/device/timing/profile/GPUProfileTopology.d.ts +159 -0
  669. package/src/shade/device/timing/profile/GPUProfileTopology.d.ts.map +1 -0
  670. package/src/shade/device/timing/profile/GPUProfileTopology.js +202 -0
  671. package/src/shade/device/timing/profile/GPUProfileWork.d.ts +90 -0
  672. package/src/shade/device/timing/profile/GPUProfileWork.d.ts.map +1 -0
  673. package/src/shade/device/timing/profile/GPUProfileWork.js +115 -0
  674. package/src/shade/device/timing/profile/SGPTDefect.d.ts +43 -0
  675. package/src/shade/device/timing/profile/SGPTDefect.d.ts.map +1 -0
  676. package/src/shade/device/timing/profile/SGPTDefect.js +65 -0
  677. package/src/shade/device/timing/profile/SGPTHeader.d.ts +38 -0
  678. package/src/shade/device/timing/profile/SGPTHeader.d.ts.map +1 -0
  679. package/src/shade/device/timing/profile/SGPTHeader.js +46 -0
  680. package/src/shade/device/timing/profile/SGPTRecordRef.d.ts +37 -0
  681. package/src/shade/device/timing/profile/SGPTRecordRef.d.ts.map +1 -0
  682. package/src/shade/device/timing/profile/SGPTRecordRef.js +45 -0
  683. package/src/shade/device/timing/profile/SGPTWriteStream.d.ts +103 -0
  684. package/src/shade/device/timing/profile/SGPTWriteStream.d.ts.map +1 -0
  685. package/src/shade/device/timing/profile/SGPTWriteStream.js +287 -0
  686. package/src/shade/device/timing/profile/SGPT_DEFECT.d.ts +19 -0
  687. package/src/shade/device/timing/profile/SGPT_DEFECT.d.ts.map +1 -0
  688. package/src/shade/device/timing/profile/SGPT_DEFECT.js +26 -0
  689. package/src/shade/device/timing/profile/SGPT_FLAG.d.ts +8 -0
  690. package/src/shade/device/timing/profile/SGPT_FLAG.d.ts.map +1 -0
  691. package/src/shade/device/timing/profile/SGPT_FLAG.js +15 -0
  692. package/src/shade/device/timing/profile/SGPT_FORMAT.md +345 -0
  693. package/src/shade/device/timing/profile/SGPT_FORMAT_VERSION.d.ts +10 -0
  694. package/src/shade/device/timing/profile/SGPT_FORMAT_VERSION.d.ts.map +1 -0
  695. package/src/shade/device/timing/profile/SGPT_FORMAT_VERSION.js +9 -0
  696. package/src/shade/device/timing/profile/SGPT_FRAME_SLACK.d.ts +17 -0
  697. package/src/shade/device/timing/profile/SGPT_FRAME_SLACK.d.ts.map +1 -0
  698. package/src/shade/device/timing/profile/SGPT_FRAME_SLACK.js +16 -0
  699. package/src/shade/device/timing/profile/SGPT_HEADER_CHECKSUM_COVERAGE.d.ts +16 -0
  700. package/src/shade/device/timing/profile/SGPT_HEADER_CHECKSUM_COVERAGE.d.ts.map +1 -0
  701. package/src/shade/device/timing/profile/SGPT_HEADER_CHECKSUM_COVERAGE.js +15 -0
  702. package/src/shade/device/timing/profile/SGPT_HEADER_OFFSET.d.ts +15 -0
  703. package/src/shade/device/timing/profile/SGPT_HEADER_OFFSET.d.ts.map +1 -0
  704. package/src/shade/device/timing/profile/SGPT_HEADER_OFFSET.js +29 -0
  705. package/src/shade/device/timing/profile/SGPT_HEADER_SIZE.d.ts +7 -0
  706. package/src/shade/device/timing/profile/SGPT_HEADER_SIZE.d.ts.map +1 -0
  707. package/src/shade/device/timing/profile/SGPT_HEADER_SIZE.js +6 -0
  708. package/src/shade/device/timing/profile/SGPT_MAGIC.d.ts +7 -0
  709. package/src/shade/device/timing/profile/SGPT_MAGIC.d.ts.map +1 -0
  710. package/src/shade/device/timing/profile/SGPT_MAGIC.js +6 -0
  711. package/src/shade/device/timing/profile/SGPT_MIN_READER_VERSION.d.ts +16 -0
  712. package/src/shade/device/timing/profile/SGPT_MIN_READER_VERSION.d.ts.map +1 -0
  713. package/src/shade/device/timing/profile/SGPT_MIN_READER_VERSION.js +15 -0
  714. package/src/shade/device/timing/profile/SGPT_RECORD_HEADER_SIZE.d.ts +7 -0
  715. package/src/shade/device/timing/profile/SGPT_RECORD_HEADER_SIZE.d.ts.map +1 -0
  716. package/src/shade/device/timing/profile/SGPT_RECORD_HEADER_SIZE.js +6 -0
  717. package/src/shade/device/timing/profile/SGPT_RECORD_OFFSET.d.ts +13 -0
  718. package/src/shade/device/timing/profile/SGPT_RECORD_OFFSET.d.ts.map +1 -0
  719. package/src/shade/device/timing/profile/SGPT_RECORD_OFFSET.js +23 -0
  720. package/src/shade/device/timing/profile/SGPT_RECORD_SYNC.d.ts +12 -0
  721. package/src/shade/device/timing/profile/SGPT_RECORD_SYNC.d.ts.map +1 -0
  722. package/src/shade/device/timing/profile/SGPT_RECORD_SYNC.js +11 -0
  723. package/src/shade/device/timing/profile/SGPT_RECORD_TYPE.d.ts +18 -0
  724. package/src/shade/device/timing/profile/SGPT_RECORD_TYPE.d.ts.map +1 -0
  725. package/src/shade/device/timing/profile/SGPT_RECORD_TYPE.js +46 -0
  726. package/src/shade/device/timing/profile/frame_graph_extract_topology.d.ts +20 -0
  727. package/src/shade/device/timing/profile/frame_graph_extract_topology.d.ts.map +1 -0
  728. package/src/shade/device/timing/profile/frame_graph_extract_topology.js +174 -0
  729. package/src/shade/device/timing/profile/make_profiling_pass_encoder.d.ts +21 -0
  730. package/src/shade/device/timing/profile/make_profiling_pass_encoder.d.ts.map +1 -0
  731. package/src/shade/device/timing/profile/make_profiling_pass_encoder.js +114 -0
  732. package/src/shade/device/timing/profile/parse_workgroup_size.d.ts +20 -0
  733. package/src/shade/device/timing/profile/parse_workgroup_size.d.ts.map +1 -0
  734. package/src/shade/device/timing/profile/parse_workgroup_size.js +43 -0
  735. package/src/shade/device/timing/profile/sgpt_fourcc.d.ts +18 -0
  736. package/src/shade/device/timing/profile/sgpt_fourcc.d.ts.map +1 -0
  737. package/src/shade/device/timing/profile/sgpt_fourcc.js +34 -0
  738. package/src/shade/device/timing/profile/sgpt_frame_codec.d.ts +42 -0
  739. package/src/shade/device/timing/profile/sgpt_frame_codec.d.ts.map +1 -0
  740. package/src/shade/device/timing/profile/sgpt_frame_codec.js +172 -0
  741. package/src/shade/device/timing/profile/sgpt_meta_codec.d.ts +20 -0
  742. package/src/shade/device/timing/profile/sgpt_meta_codec.d.ts.map +1 -0
  743. package/src/shade/device/timing/profile/sgpt_meta_codec.js +65 -0
  744. package/src/shade/device/timing/profile/sgpt_read_capture.d.ts +19 -0
  745. package/src/shade/device/timing/profile/sgpt_read_capture.d.ts.map +1 -0
  746. package/src/shade/device/timing/profile/sgpt_read_capture.js +134 -0
  747. package/src/shade/device/timing/profile/sgpt_read_header.d.ts +22 -0
  748. package/src/shade/device/timing/profile/sgpt_read_header.d.ts.map +1 -0
  749. package/src/shade/device/timing/profile/sgpt_read_header.js +94 -0
  750. package/src/shade/device/timing/profile/sgpt_read_records.d.ts +27 -0
  751. package/src/shade/device/timing/profile/sgpt_read_records.d.ts.map +1 -0
  752. package/src/shade/device/timing/profile/sgpt_read_records.js +153 -0
  753. package/src/shade/device/timing/profile/sgpt_topology_codec.d.ts +54 -0
  754. package/src/shade/device/timing/profile/sgpt_topology_codec.d.ts.map +1 -0
  755. package/src/shade/device/timing/profile/sgpt_topology_codec.js +329 -0
  756. package/src/shade/device/timing/profile/sgpt_write_header.d.ts +22 -0
  757. package/src/shade/device/timing/profile/sgpt_write_header.d.ts.map +1 -0
  758. package/src/shade/device/timing/profile/sgpt_write_header.js +47 -0
  759. package/src/shade/device/timing/profile/sgpt_write_record.d.ts +23 -0
  760. package/src/shade/device/timing/profile/sgpt_write_record.d.ts.map +1 -0
  761. package/src/shade/device/timing/profile/sgpt_write_record.js +62 -0
  762. package/src/shade/renderer/Renderer.d.ts +21 -0
  763. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  764. package/src/shade/renderer/Renderer.js +2513 -2455
  765. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  766. package/src/shade/renderer/scene/serialization/decode_image_source_hdr.d.ts +14 -3
  767. package/src/shade/renderer/scene/serialization/decode_image_source_hdr.d.ts.map +1 -1
  768. package/src/shade/renderer/scene/serialization/decode_image_source_hdr.js +50 -51
  769. package/src/shade/renderer/scene/serialization/deserialize_scene.d.ts.map +1 -1
  770. package/src/shade/renderer/scene/serialization/deserialize_scene.js +531 -521
  771. package/src/shade/renderer/scene/serialization/write_image_source.d.ts.map +1 -1
  772. package/src/shade/renderer/scene/serialization/write_image_source.js +6 -4
  773. package/src/shade/renderer/shader/chunk/color/chunk_rgb_to_luminance.d.ts.map +1 -1
  774. package/src/shade/renderer/shader/chunk/color/chunk_rgb_to_luminance.js +34 -32
  775. package/src/shade/renderer/shader/chunk/color/iCtCp/chunk_eotf_st2084.d.ts +31 -0
  776. package/src/shade/renderer/shader/chunk/color/iCtCp/chunk_eotf_st2084.d.ts.map +1 -1
  777. package/src/shade/renderer/shader/chunk/color/iCtCp/chunk_eotf_st2084.js +62 -31
  778. package/src/shade/renderer/shader/chunk/color/iCtCp/chunk_inverse_eotf_st2084.d.ts +10 -0
  779. package/src/shade/renderer/shader/chunk/color/iCtCp/chunk_inverse_eotf_st2084.d.ts.map +1 -1
  780. package/src/shade/renderer/shader/chunk/color/iCtCp/chunk_inverse_eotf_st2084.js +32 -22
  781. package/src/shade/renderer/shader/chunk/color/sRGB/chunk_sRGBTransferOETF.d.ts.map +1 -1
  782. package/src/shade/renderer/shader/chunk/color/sRGB/chunk_sRGBTransferOETF.js +22 -21
  783. package/src/shade/renderer/shader/chunk/color/tonemap/gt7/chunk_tonemap_gt7.d.ts +6 -0
  784. package/src/shade/renderer/shader/chunk/color/tonemap/gt7/chunk_tonemap_gt7.d.ts.map +1 -1
  785. package/src/shade/renderer/shader/chunk/color/tonemap/gt7/chunk_tonemap_gt7.js +110 -104
  786. package/src/shade/renderer/shader/chunk/color/xyz/chunk_rgb_to_xyz.d.ts.map +1 -1
  787. package/src/shade/renderer/shader/chunk/color/xyz/chunk_rgb_to_xyz.js +23 -21
  788. package/src/view/elements/ColorPickerView.js +296 -296
  789. package/src/avif/codec/dec/Readme.md +0 -14
  790. package/src/avif/codec/dec/avif_dec.cpp +0 -234
  791. package/src/avif/codec/dec/avif_dec.d.ts +0 -3
  792. package/src/avif/codec/dec/avif_dec.d.ts.map +0 -1
  793. package/src/avif/codec/dec/avif_dec.js +0 -16
  794. package/src/avif/codec/dec/avif_dec.wasm +0 -0
  795. package/src/avif/codec/enc/README.md +0 -37
  796. package/src/avif/codec/enc/avif_enc.cpp +0 -216
  797. package/src/avif/codec/enc/avif_enc.d.ts +0 -3
  798. package/src/avif/codec/enc/avif_enc.d.ts.map +0 -1
  799. package/src/avif/codec/enc/avif_enc.js +0 -6144
  800. package/src/avif/codec/enc/avif_enc.wasm +0 -0
  801. package/src/avif/codec/enc/avif_enc_mt.d.ts +0 -3
  802. package/src/avif/codec/enc/avif_enc_mt.d.ts.map +0 -1
  803. package/src/avif/codec/enc/avif_enc_mt.js +0 -6811
  804. package/src/avif/codec/enc/avif_enc_mt.wasm +0 -0
  805. package/src/avif/codec/enc/avif_enc_mt.worker.d.mts +0 -2
  806. package/src/avif/codec/enc/avif_enc_mt.worker.d.mts.map +0 -1
  807. package/src/avif/codec/enc/avif_enc_mt.worker.d.ts +0 -11
  808. package/src/avif/codec/enc/avif_enc_mt.worker.d.ts.map +0 -1
  809. package/src/avif/codec/enc/avif_enc_mt.worker.js +0 -171
  810. package/src/avif/codec/enc/avif_enc_mt.worker.mjs +0 -1
  811. package/src/avif/decode.d.ts +0 -3
  812. package/src/avif/decode.d.ts.map +0 -1
  813. package/src/avif/decode.js +0 -42
  814. package/src/avif/encode.d.ts +0 -3
  815. package/src/avif/encode.d.ts.map +0 -1
  816. package/src/avif/encode.js +0 -75
  817. package/src/avif/meta.d.ts +0 -24
  818. package/src/avif/meta.d.ts.map +0 -1
  819. package/src/avif/meta.js +0 -23
  820. package/src/avif/tsconfig.tsbuildinfo +0 -1
  821. package/src/avif/utils.d.ts +0 -17
  822. package/src/avif/utils.d.ts.map +0 -1
  823. package/src/avif/utils.js +0 -31
  824. package/src/engine/asset/loaders/image/jpeg/idct8x8_fixed.d.ts +0 -23
  825. package/src/engine/asset/loaders/image/jpeg/idct8x8_fixed.d.ts.map +0 -1
  826. package/src/engine/asset/loaders/image/jpeg/idct8x8_fixed.js +0 -214
  827. package/src/engine/asset/loaders/image/png/inflate.d.ts +0 -7
  828. package/src/engine/asset/loaders/image/png/inflate.d.ts.map +0 -1
  829. package/src/engine/asset/loaders/image/png/inflate.js +0 -20
  830. package/src/engine/save/GameStateLoader.d.ts +0 -49
  831. package/src/engine/save/GameStateLoader.d.ts.map +0 -1
  832. package/src/engine/save/GameStateLoader.js +0 -168
@@ -1,521 +1,531 @@
1
- import { assert } from "../../../../core/assert.js";
2
- import { BinaryBuffer } from "../../../../core/binary/BinaryBuffer.js";
3
- import { BinaryDataType } from "../../../../core/binary/type/BinaryDataType.js";
4
- import LinearModifier from "../../../../core/model/stat/LinearModifier.js";
5
- import { Sampler2D } from "../../../../engine/graphics/texture/sampler/Sampler2D.js";
6
- import { MeshletGeometry } from "../../geometry/MeshletGeometry.js";
7
- import { MeshletGeometrySerializationAdapter } from "../../geometry/MeshletGeometrySerializationAdapter.js";
8
- import { DirectionalLight } from "../../light/model/DirectionalLight.js";
9
- import { PointLight } from "../../light/model/PointLight.js";
10
- import { SpotLight } from "../../light/model/SpotLight.js";
11
- import { StandardShadeMaterial } from "../../material/StandardShadeMaterial.js";
12
- import { Mesh } from "../Mesh.js";
13
- import { ShadeTexture } from "../../texture/ShadeTexture.js";
14
- import { ShadeImage } from "../../texture/source/ShadeImage.js";
15
- import { decode_image_source_hdr } from "./decode_image_source_hdr.js";
16
- import { LightTypeSerializationIndex } from "./LightTypeSerializationIndex.js";
17
- import { STANDARD_MATERIAL_SERIALIZED_BYTE_SIZE } from "./STANDARD_MATERIAL_SERIALIZED_BYTE_SIZE.js";
18
-
19
- const NULL_TEXTURE_INDEX = 0xFFFFFFFF;
20
-
21
- /**
22
- * Reverse lookup: index → BinaryDataType string
23
- * @type {Object<number, string>}
24
- */
25
- const DataTypeFromIndex = {
26
- 0: BinaryDataType.Uint8,
27
- 1: BinaryDataType.Uint16,
28
- 2: BinaryDataType.Uint32,
29
- 3: BinaryDataType.Int8,
30
- 4: BinaryDataType.Int16,
31
- 5: BinaryDataType.Int32,
32
- 6: BinaryDataType.Float32,
33
- 7: BinaryDataType.Float64,
34
- 8: BinaryDataType.Float16,
35
- };
36
-
37
- /**
38
- * Decode a uint32 back into a Color (inverse of Color.toUint32 / rgb2uint32).
39
- *
40
- * Format v2+, written with meep-engine >= 2.157 whose rgb2uint32 is the straight layout:
41
- * bits 31..24 = R, 23..16 = G, 15..8 = B, 7..0 = A
42
- *
43
- * @param {Color} color
44
- * @param {number} v uint32 value
45
- */
46
- function color_from_uint32(color, v) {
47
- const a = (v & 0xFF) / 255;
48
- const b = ((v >>> 8) & 0xFF) / 255;
49
- const g = ((v >>> 16) & 0xFF) / 255;
50
- const r = ((v >>> 24) & 0xFF) / 255;
51
-
52
- color.set(r, g, b, a);
53
- }
54
-
55
-
56
- /**
57
- * Read raw AVIF bytes from the buffer without decoding.
58
- *
59
- * @param {BinaryBuffer} buffer
60
- * @returns {ArrayBuffer}
61
- */
62
- function read_image_source_bytes(buffer) {
63
- const byte_length = buffer.readUint32();
64
-
65
- const slice = buffer.data.slice(buffer.position, buffer.position + byte_length);
66
-
67
- // advance cursor
68
- buffer.skip(byte_length);
69
-
70
- return slice;
71
- }
72
-
73
- /**
74
- * Decode an AVIF blob to an ImageBitmap using the browser's HW-accelerated decoder.
75
- * Used for LDR (Uint8) image sources.
76
- *
77
- * @param {ArrayBuffer} avif_buffer
78
- * @returns {Promise<ImageBitmap>}
79
- */
80
- async function decode_image_source_default(avif_buffer) {
81
- const blob = new Blob([avif_buffer], { type: "image/avif" });
82
- return createImageBitmap(blob, {
83
- colorSpaceConversion: 'none',
84
- premultiplyAlpha: 'none',
85
- });
86
- }
87
-
88
- /**
89
- * Scan the raw ISOBMFF structure of the AVIF to detect PQ HDR Transfer Characteristics (ST 2084)
90
- * @param {ArrayBuffer} array_buffer
91
- * @returns {boolean}
92
- */
93
- function is_avif_hdr(array_buffer) {
94
- const bytes = new Uint8Array(array_buffer);
95
- // Scan for 'colr' (c, o, l, r) followed by 'nclx'
96
- for (let i = 0; i < bytes.length - 16; i++) {
97
- // 'colr'
98
- if (bytes[i] === 99 && bytes[i + 1] === 111 && bytes[i + 2] === 108 && bytes[i + 3] === 114) {
99
- // 'nclx'
100
- if (bytes[i + 4] === 110 && bytes[i + 5] === 99 && bytes[i + 6] === 108 && bytes[i + 7] === 120) {
101
- // transfer_characteristics is bytes 10 and 11 after 'colr'
102
- const transfer_characteristics = (bytes[i + 10] << 8) | bytes[i + 11];
103
- if (transfer_characteristics === 16) { // PQ (ST 2084)
104
- return true;
105
- }
106
- }
107
- }
108
- }
109
- return false;
110
- }
111
-
112
- /**
113
- * @param {BinaryBuffer} buffer
114
- * @param {ShadeTexture[]} textures indexed texture table
115
- * @param {StandardShadeMaterial} material
116
- */
117
- function material_read_standard(buffer, material, textures) {
118
- // texture indices
119
- const albedo_index = buffer.readUint32();
120
- const normal_index = buffer.readUint32();
121
- const orm_index = buffer.readUint32();
122
- const emissive_index = buffer.readUint32();
123
-
124
- material.texture_albedo = albedo_index !== NULL_TEXTURE_INDEX ? textures[albedo_index] : undefined;
125
- material.texture_normal = normal_index !== NULL_TEXTURE_INDEX ? textures[normal_index] : undefined;
126
- material.texture_orm = orm_index !== NULL_TEXTURE_INDEX ? textures[orm_index] : undefined;
127
- material.texture_emissive = emissive_index !== NULL_TEXTURE_INDEX ? textures[emissive_index] : undefined;
128
-
129
- // colors and factors as floats (HDR-safe), including transmission/ior
130
-
131
- material.diffuse_color.set(
132
- buffer.readFloat32(),
133
- buffer.readFloat32(),
134
- buffer.readFloat32(),
135
- buffer.readFloat32()
136
- );
137
-
138
- material.roughness_factor = buffer.readFloat32();
139
- material.metallic_factor = buffer.readFloat32();
140
-
141
- material.emissive_factor.set(
142
- buffer.readFloat32(),
143
- buffer.readFloat32(),
144
- buffer.readFloat32(),
145
- buffer.readFloat32()
146
- );
147
-
148
- material.transmission_factor = buffer.readFloat32();
149
- material.ior_factor = buffer.readFloat32();
150
-
151
- const ambient_a = buffer.readFloat32();
152
- const ambient_b = buffer.readFloat32();
153
- material.ambient_factors = new LinearModifier(ambient_a, ambient_b);
154
- }
155
-
156
- /**
157
- * @param {BinaryBuffer} buffer
158
- * @returns {Light}
159
- */
160
- function deserialize_light(buffer) {
161
- const light_type = buffer.readUint8();
162
-
163
- let light;
164
-
165
- if (light_type === LightTypeSerializationIndex.DirectionalLight) {
166
- light = new DirectionalLight();
167
- } else if (light_type === LightTypeSerializationIndex.PointLight) {
168
- light = new PointLight();
169
- } else if (light_type === LightTypeSerializationIndex.SpotLight) {
170
- light = new SpotLight();
171
- } else {
172
- throw new Error(`Unsupported light type: ${light_type}`);
173
- }
174
-
175
- const light_matrix = new Float32Array(16);
176
- buffer.readFloat32Array(light_matrix, 0, 16);
177
- light.transform_global.fromMatrix(light_matrix);
178
-
179
- light.intensity = buffer.readFloat32();
180
-
181
- const color_uint32 = buffer.readUint32();
182
- color_from_uint32(light.color, color_uint32);
183
-
184
- light.radius = buffer.readFloat32();
185
- light.near_clip_distance = buffer.readFloat32();
186
-
187
- if (light_type === LightTypeSerializationIndex.DirectionalLight) {
188
- // no extra data
189
- } else if (light_type === LightTypeSerializationIndex.PointLight) {
190
- light.distance = buffer.readFloat32();
191
- } else if (light_type === LightTypeSerializationIndex.SpotLight) {
192
- light.distance = buffer.readFloat32();
193
- light.angle = buffer.readFloat32();
194
- light.penumbra = buffer.readFloat32();
195
- }
196
-
197
- return light;
198
- }
199
-
200
- /**
201
- * Deserialize a scene from a BinaryBuffer that was produced by {@link serialize_scene}.
202
- *
203
- * @param {BinaryBuffer} buffer positioned at the start of the serialized data
204
- * @param {Scene} scene an empty Scene instance to populate
205
- * @returns {Promise<Scene>}
206
- */
207
- export async function deserialize_scene(buffer, scene) {
208
-
209
- const adapter_geometry = new MeshletGeometrySerializationAdapter();
210
-
211
-
212
- const format_tag = buffer.readASCIICharacters(5);
213
- if (format_tag !== "SHADE") {
214
- throw new Error(`Unsupported wrong format tag: "${format_tag}", expected "SHADE"`);
215
- }
216
-
217
- // No backward compatibility by design: refusing an old file beats silently loading
218
- // wrong data. v1 predates the meep 2.157 color-encoding fix, the explicit
219
- // texture→image indices and the float material factors — re-export old scenes.
220
- const format_version = buffer.readUint32();
221
- if (format_version !== 2) {
222
- throw new Error(`Unsupported format version: ${format_version}, expected 2`);
223
- }
224
-
225
- // ── Meshes (header pass — geometry/material indices are resolved later) ──
226
-
227
- const mesh_count = buffer.readUint32();
228
-
229
- /**
230
- * Temporary records for meshes before geometry/material resolution
231
- * @type {{name: string, material_index: number, geometry_index: number, transform: Float32Array}[]}
232
- */
233
- const mesh_records = [];
234
-
235
- for (let i = 0; i < mesh_count; i++) {
236
- const name = buffer.readUTF8String();
237
- const material_index = buffer.readUint32();
238
- const geometry_index = buffer.readUint32();
239
-
240
- const transform = new Float32Array(16);
241
- buffer.readFloat32Array(transform, 0, 16);
242
-
243
- mesh_records.push({ name, material_index, geometry_index, transform });
244
- }
245
-
246
- // ── Geometries ──
247
-
248
- const geometry_count = buffer.readUint32();
249
-
250
- /** @type {MeshletGeometry[]} */
251
- const geometries = [];
252
-
253
- for (let i = 0; i < geometry_count; i++) {
254
- const geometry = new MeshletGeometry();
255
- adapter_geometry.deserialize(buffer, geometry);
256
- geometries.push(geometry);
257
- }
258
-
259
- // ── Materials (first pass — texture indices stored, resolved after textures) ──
260
-
261
- const material_count = buffer.readUint32();
262
-
263
- /**
264
- * Temporary records: material objects + the buffer state needed for
265
- * the standard-material texture fields (which reference textures by index).
266
- *
267
- * We read everything except the standard fields into the material now,
268
- * and defer the standard fields until we have the texture array.
269
- */
270
-
271
- /** @type {{ material: StandardShadeMaterial, buffer_position: number }[]} */
272
- const material_records = [];
273
-
274
- for (let i = 0; i < material_count; i++) {
275
- const material = new StandardShadeMaterial();
276
- material.name = buffer.readUTF8String();
277
- material.transparency_mode = buffer.readUint32();
278
- material.draw_mode = buffer.readUint32();
279
- material.draw_side = buffer.readUint32();
280
-
281
- // Remember position — we need textures resolved first
282
- const pos = buffer.position;
283
-
284
- // Skip past the standard material payload so we can continue reading the rest of the
285
- // stream in order. The distance must match material_write_standard exactly (v2 layout,
286
- // colours/factors as f32) — see STANDARD_MATERIAL_SERIALIZED_BYTE_SIZE.
287
- buffer.position = pos + STANDARD_MATERIAL_SERIALIZED_BYTE_SIZE;
288
-
289
- material_records.push({ material, buffer_position: pos });
290
- }
291
-
292
- // ── Textures (first pass — image link deferred) ──
293
-
294
- const texture_count = buffer.readUint32();
295
-
296
- /** @type {{ texture: ShadeTexture }[]} */
297
- const texture_records = [];
298
-
299
- for (let i = 0; i < texture_count; i++) {
300
- const texture = new ShadeTexture();
301
- texture.label = buffer.readUTF8String();
302
- texture.flags = buffer.readUint32();
303
-
304
- texture.dimensions = buffer.readUint8();
305
-
306
- texture.minFilter = buffer.readUint8();
307
- texture.magFilter = buffer.readUint8();
308
- texture.mipmapFilter = buffer.readUint8();
309
-
310
- texture.wrapS = buffer.readUint8();
311
- texture.wrapT = buffer.readUint8();
312
- texture.wrapR = buffer.readUint8();
313
-
314
- texture.mipmapGenerationFilter = buffer.readUint32();
315
-
316
- // explicit image reference — images are deduplicated, several textures may share one
317
- const image_index = buffer.readUint32();
318
-
319
- texture_records.push({ texture, image_index });
320
- }
321
-
322
- // ── Images ──
323
-
324
- const image_count = buffer.readUint32();
325
-
326
- /**
327
- * Partially constructed images — source will be attached after image sources are decoded.
328
- * @type {{ image: ShadeImage, source_index: number }[]}
329
- */
330
- const image_records = [];
331
-
332
- for (let i = 0; i < image_count; i++) {
333
- const width = buffer.readUint32();
334
- const height = buffer.readUint32();
335
- const depth = buffer.readUint32();
336
- const source_index = buffer.readUint32();
337
- const data_type_index = buffer.readUint32();
338
- const channel_count = buffer.readUint32();
339
- const flags = buffer.readUint32();
340
-
341
- const normalized = (flags & 1) !== 0;
342
- const data_type = DataTypeFromIndex[data_type_index];
343
-
344
- const image = new ShadeImage();
345
- image.width = width;
346
- image.height = height;
347
- image.depth = depth;
348
- image.data_type = data_type;
349
- image.channel_count = channel_count;
350
- image.normalized = normalized;
351
-
352
- const color_space_value = (flags >>> 4) & 0xF;
353
- image.color_space = color_space_value;
354
-
355
- image_records.push({ image, source_index });
356
- }
357
-
358
- // ── Image Sources (read raw AVIF blobs) ──
359
-
360
- const source_count = buffer.readUint32();
361
-
362
- /** @type {ArrayBuffer[]} */
363
- const raw_source_buffers = [];
364
-
365
- for (let i = 0; i < source_count; i++) {
366
- raw_source_buffers.push(read_image_source_bytes(buffer));
367
- }
368
-
369
- // Decode all sources: HW path for LDR, WASM + inverse PQ for HDR
370
- const image_source_promises = [];
371
-
372
- for (let i = 0; i < source_count; i++) {
373
- const buffer = raw_source_buffers[i];
374
-
375
- const is_hdr = is_avif_hdr(buffer);
376
-
377
- let p;
378
- if (is_hdr) {
379
- p = decode_image_source_hdr(buffer);
380
- } else {
381
- p = decode_image_source_default(buffer);
382
- }
383
-
384
- image_source_promises.push(p);
385
- }
386
-
387
- /** @type {(ImageBitmap|Sampler2D)[]} */
388
- const image_sources = await Promise.all(image_source_promises);
389
-
390
- // ── Link images → sources ──
391
-
392
- /** @type {ShadeImage[]} */
393
- const images = [];
394
-
395
- for (const { image, source_index } of image_records) {
396
- image.source = image_sources[source_index];
397
-
398
- if (image.source && image.source.isSampler2D) {
399
- image.channel_count = image.source.itemSize;
400
- image.data_type = BinaryDataType.Float16; // TODO infer from data type if necessary
401
- }
402
-
403
- images.push(image);
404
- }
405
-
406
- // ── Link textures → images ──
407
- // v2 carries an explicit image index per texture (images are deduplicated, several
408
- // textures may share one). v1 assumed positional texture[i] → image[i], which only
409
- // holds when no two textures share an image — kept for compatibility.
410
-
411
- /** @type {ShadeTexture[]} */
412
- const textures = [];
413
-
414
- for (let i = 0; i < texture_count; i++) {
415
- const { texture, image_index } = texture_records[i];
416
-
417
- const image = images[image_index];
418
- assert.defined(image, `image for texture ${i} (image_index ${image_index})`);
419
-
420
- // ShadeTexture.from() is the factory that sets the private #image field
421
- // We reconstruct via the factory since #image is private
422
- const rebuilt = ShadeTexture.from(image);
423
-
424
- // Copy all the non-image properties we read from the stream
425
- rebuilt.label = texture.label;
426
- rebuilt.flags = texture.flags;
427
- rebuilt.dimensions = texture.dimensions;
428
- rebuilt.minFilter = texture.minFilter;
429
- rebuilt.magFilter = texture.magFilter;
430
- rebuilt.mipmapFilter = texture.mipmapFilter;
431
- rebuilt.wrapS = texture.wrapS;
432
- rebuilt.wrapT = texture.wrapT;
433
- rebuilt.wrapR = texture.wrapR;
434
- rebuilt.mipmapGenerationFilter = texture.mipmapGenerationFilter;
435
-
436
- textures.push(rebuilt);
437
- }
438
-
439
- // ── Resolve material standard fields (now that textures exist) ──
440
-
441
- /** @type {StandardShadeMaterial[]} */
442
- const materials = [];
443
-
444
- for (const { material, buffer_position } of material_records) {
445
- const saved_position = buffer.position;
446
- buffer.position = buffer_position;
447
-
448
- material_read_standard(buffer, material, textures);
449
-
450
- buffer.position = saved_position;
451
- materials.push(material);
452
- }
453
-
454
- // ── Lighting ──
455
-
456
- // Environment texture
457
- const environment_index = buffer.readUint32();
458
- if (environment_index !== NULL_TEXTURE_INDEX) {
459
- scene.lights.environment = textures[environment_index];
460
- }
461
-
462
- // Light elements
463
- const light_count = buffer.readUint32();
464
- for (let i = 0; i < light_count; i++) {
465
- const light = deserialize_light(buffer);
466
- scene.lights.add(light);
467
- }
468
-
469
- // ── Assemble Meshes ──
470
-
471
- for (const record of mesh_records) {
472
- const mesh = new Mesh();
473
- mesh.name = record.name;
474
- mesh.geometry = geometries[record.geometry_index];
475
- mesh.material = materials[record.material_index];
476
- // serialized transform is world-space; meshes deserialize without a parent, so
477
- // local == global. Setting only transform_global would leave transform_local at
478
- // identity, and the next updateMatrices() / GPU hierarchy pass (which recompose
479
- // global from local TRS) would snap the mesh to the origin.
480
- mesh.transform_local.fromMatrix(record.transform);
481
- mesh.updateMatrices();
482
-
483
- // Compute world-space bounds from geometry bounds + transform
484
- mesh.updateBoundsBasic();
485
-
486
- scene.instances.add(mesh);
487
- }
488
-
489
- return scene;
490
- }
491
-
492
- /**
493
- * Fetch a serialized scene binary from a URL and deserialize it into the given Scene.
494
- * Convenience wrapper for testing.
495
- *
496
- * @param {string} url URL pointing to the binary blob produced by serialize_scene
497
- * @param {Scene} scene an empty Scene instance to populate
498
- * @returns {Promise<Scene>}
499
- */
500
- export async function load_scene_from_url(url, scene) {
501
- assert.defined(scene, 'scene');
502
- assert.notNull(scene, 'scene');
503
- assert.isObject(scene, 'scene');
504
- assert.equal(scene.isScene, true, 'scene.isScene !== true');
505
-
506
- assert.isString(url, 'url');
507
-
508
- const response = await fetch(url);
509
-
510
- if (!response.ok) {
511
- throw new Error(`Failed to fetch scene: ${response.status} ${response.statusText}`);
512
- }
513
-
514
- const array_buffer = await response.arrayBuffer();
515
-
516
- assert.defined(array_buffer, 'array_buffer');
517
-
518
- const buffer = BinaryBuffer.fromArrayBuffer(array_buffer);
519
-
520
- return deserialize_scene(buffer, scene);
521
- }
1
+ import { assert } from "../../../../core/assert.js";
2
+ import { BinaryBuffer } from "../../../../core/binary/BinaryBuffer.js";
3
+ import { BinaryDataType } from "../../../../core/binary/type/BinaryDataType.js";
4
+ import LinearModifier from "../../../../core/model/stat/LinearModifier.js";
5
+ import { Sampler2D } from "../../../../engine/graphics/texture/sampler/Sampler2D.js";
6
+ import { MeshletGeometry } from "../../geometry/MeshletGeometry.js";
7
+ import { MeshletGeometrySerializationAdapter } from "../../geometry/MeshletGeometrySerializationAdapter.js";
8
+ import { DirectionalLight } from "../../light/model/DirectionalLight.js";
9
+ import { PointLight } from "../../light/model/PointLight.js";
10
+ import { SpotLight } from "../../light/model/SpotLight.js";
11
+ import { StandardShadeMaterial } from "../../material/StandardShadeMaterial.js";
12
+ import { Mesh } from "../Mesh.js";
13
+ import { ShadeTexture } from "../../texture/ShadeTexture.js";
14
+ import { ShadeImage } from "../../texture/source/ShadeImage.js";
15
+ import { avif_to_sampler2d } from "../../../../avif/native/api/avif_to_sampler2d.js";
16
+ import { decode_image_source_hdr } from "./decode_image_source_hdr.js";
17
+ import { LightTypeSerializationIndex } from "./LightTypeSerializationIndex.js";
18
+ import { STANDARD_MATERIAL_SERIALIZED_BYTE_SIZE } from "./STANDARD_MATERIAL_SERIALIZED_BYTE_SIZE.js";
19
+
20
+ const NULL_TEXTURE_INDEX = 0xFFFFFFFF;
21
+
22
+ /**
23
+ * Reverse lookup: index → BinaryDataType string
24
+ * @type {Object<number, string>}
25
+ */
26
+ const DataTypeFromIndex = {
27
+ 0: BinaryDataType.Uint8,
28
+ 1: BinaryDataType.Uint16,
29
+ 2: BinaryDataType.Uint32,
30
+ 3: BinaryDataType.Int8,
31
+ 4: BinaryDataType.Int16,
32
+ 5: BinaryDataType.Int32,
33
+ 6: BinaryDataType.Float32,
34
+ 7: BinaryDataType.Float64,
35
+ 8: BinaryDataType.Float16,
36
+ };
37
+
38
+ /**
39
+ * Decode a uint32 back into a Color (inverse of Color.toUint32 / rgb_to_uint32).
40
+ *
41
+ * Format v2+, written with meep-engine >= 2.157 whose rgb_to_uint32 is the straight layout:
42
+ * bits 31..24 = R, 23..16 = G, 15..8 = B, 7..0 = A
43
+ *
44
+ * @param {Color} color
45
+ * @param {number} v uint32 value
46
+ */
47
+ function color_from_uint32(color, v) {
48
+ const a = (v & 0xFF) / 255;
49
+ const b = ((v >>> 8) & 0xFF) / 255;
50
+ const g = ((v >>> 16) & 0xFF) / 255;
51
+ const r = ((v >>> 24) & 0xFF) / 255;
52
+
53
+ color.set(r, g, b, a);
54
+ }
55
+
56
+
57
+ /**
58
+ * Read raw AVIF bytes from the buffer without decoding.
59
+ *
60
+ * @param {BinaryBuffer} buffer
61
+ * @returns {ArrayBuffer}
62
+ */
63
+ function read_image_source_bytes(buffer) {
64
+ const byte_length = buffer.readUint32();
65
+
66
+ const slice = buffer.data.slice(buffer.position, buffer.position + byte_length);
67
+
68
+ // advance cursor
69
+ buffer.skip(byte_length);
70
+
71
+ return slice;
72
+ }
73
+
74
+ /**
75
+ * Decode an AVIF blob for LDR (Uint8) image sources.
76
+ *
77
+ * Prefers the browser's own decoder, which is hardware accelerated and hands back an ImageBitmap
78
+ * the GPU upload path can take directly. Where there is no such decoder — node, a worker without
79
+ * `createImageBitmap`, anything that is not a browser — meep's own decoder produces a sampler
80
+ * instead, which the same path already handles because the HDR sources arrive that way.
81
+ *
82
+ * @param {ArrayBuffer} avif_buffer
83
+ * @returns {Promise<ImageBitmap|Sampler2D>}
84
+ */
85
+ async function decode_image_source_default(avif_buffer) {
86
+ if (typeof createImageBitmap === "undefined" || typeof Blob === "undefined") {
87
+ return avif_to_sampler2d(avif_buffer);
88
+ }
89
+
90
+ const blob = new Blob([avif_buffer], { type: "image/avif" });
91
+ return createImageBitmap(blob, {
92
+ colorSpaceConversion: 'none',
93
+ premultiplyAlpha: 'none',
94
+ });
95
+ }
96
+
97
+ /**
98
+ * Scan the raw ISOBMFF structure of the AVIF to detect PQ HDR Transfer Characteristics (ST 2084)
99
+ * @param {ArrayBuffer} array_buffer
100
+ * @returns {boolean}
101
+ */
102
+ function is_avif_hdr(array_buffer) {
103
+ const bytes = new Uint8Array(array_buffer);
104
+ // Scan for 'colr' (c, o, l, r) followed by 'nclx'
105
+ for (let i = 0; i < bytes.length - 16; i++) {
106
+ // 'colr'
107
+ if (bytes[i] === 99 && bytes[i + 1] === 111 && bytes[i + 2] === 108 && bytes[i + 3] === 114) {
108
+ // 'nclx'
109
+ if (bytes[i + 4] === 110 && bytes[i + 5] === 99 && bytes[i + 6] === 108 && bytes[i + 7] === 120) {
110
+ // transfer_characteristics is bytes 10 and 11 after 'colr'
111
+ const transfer_characteristics = (bytes[i + 10] << 8) | bytes[i + 11];
112
+ if (transfer_characteristics === 16) { // PQ (ST 2084)
113
+ return true;
114
+ }
115
+ }
116
+ }
117
+ }
118
+ return false;
119
+ }
120
+
121
+ /**
122
+ * @param {BinaryBuffer} buffer
123
+ * @param {ShadeTexture[]} textures indexed texture table
124
+ * @param {StandardShadeMaterial} material
125
+ */
126
+ function material_read_standard(buffer, material, textures) {
127
+ // texture indices
128
+ const albedo_index = buffer.readUint32();
129
+ const normal_index = buffer.readUint32();
130
+ const orm_index = buffer.readUint32();
131
+ const emissive_index = buffer.readUint32();
132
+
133
+ material.texture_albedo = albedo_index !== NULL_TEXTURE_INDEX ? textures[albedo_index] : undefined;
134
+ material.texture_normal = normal_index !== NULL_TEXTURE_INDEX ? textures[normal_index] : undefined;
135
+ material.texture_orm = orm_index !== NULL_TEXTURE_INDEX ? textures[orm_index] : undefined;
136
+ material.texture_emissive = emissive_index !== NULL_TEXTURE_INDEX ? textures[emissive_index] : undefined;
137
+
138
+ // colors and factors as floats (HDR-safe), including transmission/ior
139
+
140
+ material.diffuse_color.set(
141
+ buffer.readFloat32(),
142
+ buffer.readFloat32(),
143
+ buffer.readFloat32(),
144
+ buffer.readFloat32()
145
+ );
146
+
147
+ material.roughness_factor = buffer.readFloat32();
148
+ material.metallic_factor = buffer.readFloat32();
149
+
150
+ material.emissive_factor.set(
151
+ buffer.readFloat32(),
152
+ buffer.readFloat32(),
153
+ buffer.readFloat32(),
154
+ buffer.readFloat32()
155
+ );
156
+
157
+ material.transmission_factor = buffer.readFloat32();
158
+ material.ior_factor = buffer.readFloat32();
159
+
160
+ const ambient_a = buffer.readFloat32();
161
+ const ambient_b = buffer.readFloat32();
162
+ material.ambient_factors = new LinearModifier(ambient_a, ambient_b);
163
+ }
164
+
165
+ /**
166
+ * @param {BinaryBuffer} buffer
167
+ * @returns {Light}
168
+ */
169
+ function deserialize_light(buffer) {
170
+ const light_type = buffer.readUint8();
171
+
172
+ let light;
173
+
174
+ if (light_type === LightTypeSerializationIndex.DirectionalLight) {
175
+ light = new DirectionalLight();
176
+ } else if (light_type === LightTypeSerializationIndex.PointLight) {
177
+ light = new PointLight();
178
+ } else if (light_type === LightTypeSerializationIndex.SpotLight) {
179
+ light = new SpotLight();
180
+ } else {
181
+ throw new Error(`Unsupported light type: ${light_type}`);
182
+ }
183
+
184
+ const light_matrix = new Float32Array(16);
185
+ buffer.readFloat32Array(light_matrix, 0, 16);
186
+ light.transform_global.fromMatrix(light_matrix);
187
+
188
+ light.intensity = buffer.readFloat32();
189
+
190
+ const color_uint32 = buffer.readUint32();
191
+ color_from_uint32(light.color, color_uint32);
192
+
193
+ light.radius = buffer.readFloat32();
194
+ light.near_clip_distance = buffer.readFloat32();
195
+
196
+ if (light_type === LightTypeSerializationIndex.DirectionalLight) {
197
+ // no extra data
198
+ } else if (light_type === LightTypeSerializationIndex.PointLight) {
199
+ light.distance = buffer.readFloat32();
200
+ } else if (light_type === LightTypeSerializationIndex.SpotLight) {
201
+ light.distance = buffer.readFloat32();
202
+ light.angle = buffer.readFloat32();
203
+ light.penumbra = buffer.readFloat32();
204
+ }
205
+
206
+ return light;
207
+ }
208
+
209
+ /**
210
+ * Deserialize a scene from a BinaryBuffer that was produced by {@link serialize_scene}.
211
+ *
212
+ * @param {BinaryBuffer} buffer positioned at the start of the serialized data
213
+ * @param {Scene} scene an empty Scene instance to populate
214
+ * @returns {Promise<Scene>}
215
+ */
216
+ export async function deserialize_scene(buffer, scene) {
217
+
218
+ const adapter_geometry = new MeshletGeometrySerializationAdapter();
219
+
220
+
221
+ const format_tag = buffer.readASCIICharacters(5);
222
+ if (format_tag !== "SHADE") {
223
+ throw new Error(`Unsupported wrong format tag: "${format_tag}", expected "SHADE"`);
224
+ }
225
+
226
+ // No backward compatibility by design: refusing an old file beats silently loading
227
+ // wrong data. v1 predates the meep 2.157 color-encoding fix, the explicit
228
+ // texture→image indices and the float material factors — re-export old scenes.
229
+ const format_version = buffer.readUint32();
230
+ if (format_version !== 2) {
231
+ throw new Error(`Unsupported format version: ${format_version}, expected 2`);
232
+ }
233
+
234
+ // ── Meshes (header pass — geometry/material indices are resolved later) ──
235
+
236
+ const mesh_count = buffer.readUint32();
237
+
238
+ /**
239
+ * Temporary records for meshes before geometry/material resolution
240
+ * @type {{name: string, material_index: number, geometry_index: number, transform: Float32Array}[]}
241
+ */
242
+ const mesh_records = [];
243
+
244
+ for (let i = 0; i < mesh_count; i++) {
245
+ const name = buffer.readUTF8String();
246
+ const material_index = buffer.readUint32();
247
+ const geometry_index = buffer.readUint32();
248
+
249
+ const transform = new Float32Array(16);
250
+ buffer.readFloat32Array(transform, 0, 16);
251
+
252
+ mesh_records.push({ name, material_index, geometry_index, transform });
253
+ }
254
+
255
+ // ── Geometries ──
256
+
257
+ const geometry_count = buffer.readUint32();
258
+
259
+ /** @type {MeshletGeometry[]} */
260
+ const geometries = [];
261
+
262
+ for (let i = 0; i < geometry_count; i++) {
263
+ const geometry = new MeshletGeometry();
264
+ adapter_geometry.deserialize(buffer, geometry);
265
+ geometries.push(geometry);
266
+ }
267
+
268
+ // ── Materials (first pass texture indices stored, resolved after textures) ──
269
+
270
+ const material_count = buffer.readUint32();
271
+
272
+ /**
273
+ * Temporary records: material objects + the buffer state needed for
274
+ * the standard-material texture fields (which reference textures by index).
275
+ *
276
+ * We read everything except the standard fields into the material now,
277
+ * and defer the standard fields until we have the texture array.
278
+ */
279
+
280
+ /** @type {{ material: StandardShadeMaterial, buffer_position: number }[]} */
281
+ const material_records = [];
282
+
283
+ for (let i = 0; i < material_count; i++) {
284
+ const material = new StandardShadeMaterial();
285
+ material.name = buffer.readUTF8String();
286
+ material.transparency_mode = buffer.readUint32();
287
+ material.draw_mode = buffer.readUint32();
288
+ material.draw_side = buffer.readUint32();
289
+
290
+ // Remember position — we need textures resolved first
291
+ const pos = buffer.position;
292
+
293
+ // Skip past the standard material payload so we can continue reading the rest of the
294
+ // stream in order. The distance must match material_write_standard exactly (v2 layout,
295
+ // colours/factors as f32) — see STANDARD_MATERIAL_SERIALIZED_BYTE_SIZE.
296
+ buffer.position = pos + STANDARD_MATERIAL_SERIALIZED_BYTE_SIZE;
297
+
298
+ material_records.push({ material, buffer_position: pos });
299
+ }
300
+
301
+ // ── Textures (first pass — image link deferred) ──
302
+
303
+ const texture_count = buffer.readUint32();
304
+
305
+ /** @type {{ texture: ShadeTexture }[]} */
306
+ const texture_records = [];
307
+
308
+ for (let i = 0; i < texture_count; i++) {
309
+ const texture = new ShadeTexture();
310
+ texture.label = buffer.readUTF8String();
311
+ texture.flags = buffer.readUint32();
312
+
313
+ texture.dimensions = buffer.readUint8();
314
+
315
+ texture.minFilter = buffer.readUint8();
316
+ texture.magFilter = buffer.readUint8();
317
+ texture.mipmapFilter = buffer.readUint8();
318
+
319
+ texture.wrapS = buffer.readUint8();
320
+ texture.wrapT = buffer.readUint8();
321
+ texture.wrapR = buffer.readUint8();
322
+
323
+ texture.mipmapGenerationFilter = buffer.readUint32();
324
+
325
+ // explicit image reference — images are deduplicated, several textures may share one
326
+ const image_index = buffer.readUint32();
327
+
328
+ texture_records.push({ texture, image_index });
329
+ }
330
+
331
+ // ── Images ──
332
+
333
+ const image_count = buffer.readUint32();
334
+
335
+ /**
336
+ * Partially constructed images — source will be attached after image sources are decoded.
337
+ * @type {{ image: ShadeImage, source_index: number }[]}
338
+ */
339
+ const image_records = [];
340
+
341
+ for (let i = 0; i < image_count; i++) {
342
+ const width = buffer.readUint32();
343
+ const height = buffer.readUint32();
344
+ const depth = buffer.readUint32();
345
+ const source_index = buffer.readUint32();
346
+ const data_type_index = buffer.readUint32();
347
+ const channel_count = buffer.readUint32();
348
+ const flags = buffer.readUint32();
349
+
350
+ const normalized = (flags & 1) !== 0;
351
+ const data_type = DataTypeFromIndex[data_type_index];
352
+
353
+ const image = new ShadeImage();
354
+ image.width = width;
355
+ image.height = height;
356
+ image.depth = depth;
357
+ image.data_type = data_type;
358
+ image.channel_count = channel_count;
359
+ image.normalized = normalized;
360
+
361
+ const color_space_value = (flags >>> 4) & 0xF;
362
+ image.color_space = color_space_value;
363
+
364
+ image_records.push({ image, source_index });
365
+ }
366
+
367
+ // ── Image Sources (read raw AVIF blobs) ──
368
+
369
+ const source_count = buffer.readUint32();
370
+
371
+ /** @type {ArrayBuffer[]} */
372
+ const raw_source_buffers = [];
373
+
374
+ for (let i = 0; i < source_count; i++) {
375
+ raw_source_buffers.push(read_image_source_bytes(buffer));
376
+ }
377
+
378
+ // Decode all sources: the browser's decoder for LDR where there is one, meep's own — through
379
+ // the inverse transfer function — for HDR
380
+ const image_source_promises = [];
381
+
382
+ for (let i = 0; i < source_count; i++) {
383
+ const buffer = raw_source_buffers[i];
384
+
385
+ const is_hdr = is_avif_hdr(buffer);
386
+
387
+ let p;
388
+ if (is_hdr) {
389
+ p = decode_image_source_hdr(buffer);
390
+ } else {
391
+ p = decode_image_source_default(buffer);
392
+ }
393
+
394
+ image_source_promises.push(p);
395
+ }
396
+
397
+ /** @type {(ImageBitmap|Sampler2D)[]} */
398
+ const image_sources = await Promise.all(image_source_promises);
399
+
400
+ // ── Link images sources ──
401
+
402
+ /** @type {ShadeImage[]} */
403
+ const images = [];
404
+
405
+ for (const { image, source_index } of image_records) {
406
+ image.source = image_sources[source_index];
407
+
408
+ if (image.source && image.source.isSampler2D) {
409
+ image.channel_count = image.source.itemSize;
410
+ image.data_type = BinaryDataType.Float16; // TODO infer from data type if necessary
411
+ }
412
+
413
+ images.push(image);
414
+ }
415
+
416
+ // ── Link textures → images ──
417
+ // v2 carries an explicit image index per texture (images are deduplicated, several
418
+ // textures may share one). v1 assumed positional texture[i] → image[i], which only
419
+ // holds when no two textures share an image — kept for compatibility.
420
+
421
+ /** @type {ShadeTexture[]} */
422
+ const textures = [];
423
+
424
+ for (let i = 0; i < texture_count; i++) {
425
+ const { texture, image_index } = texture_records[i];
426
+
427
+ const image = images[image_index];
428
+ assert.defined(image, `image for texture ${i} (image_index ${image_index})`);
429
+
430
+ // ShadeTexture.from() is the factory that sets the private #image field
431
+ // We reconstruct via the factory since #image is private
432
+ const rebuilt = ShadeTexture.from(image);
433
+
434
+ // Copy all the non-image properties we read from the stream
435
+ rebuilt.label = texture.label;
436
+ rebuilt.flags = texture.flags;
437
+ rebuilt.dimensions = texture.dimensions;
438
+ rebuilt.minFilter = texture.minFilter;
439
+ rebuilt.magFilter = texture.magFilter;
440
+ rebuilt.mipmapFilter = texture.mipmapFilter;
441
+ rebuilt.wrapS = texture.wrapS;
442
+ rebuilt.wrapT = texture.wrapT;
443
+ rebuilt.wrapR = texture.wrapR;
444
+ rebuilt.mipmapGenerationFilter = texture.mipmapGenerationFilter;
445
+
446
+ textures.push(rebuilt);
447
+ }
448
+
449
+ // ── Resolve material standard fields (now that textures exist) ──
450
+
451
+ /** @type {StandardShadeMaterial[]} */
452
+ const materials = [];
453
+
454
+ for (const { material, buffer_position } of material_records) {
455
+ const saved_position = buffer.position;
456
+ buffer.position = buffer_position;
457
+
458
+ material_read_standard(buffer, material, textures);
459
+
460
+ buffer.position = saved_position;
461
+ materials.push(material);
462
+ }
463
+
464
+ // ── Lighting ──
465
+
466
+ // Environment texture
467
+ const environment_index = buffer.readUint32();
468
+ if (environment_index !== NULL_TEXTURE_INDEX) {
469
+ scene.lights.environment = textures[environment_index];
470
+ }
471
+
472
+ // Light elements
473
+ const light_count = buffer.readUint32();
474
+ for (let i = 0; i < light_count; i++) {
475
+ const light = deserialize_light(buffer);
476
+ scene.lights.add(light);
477
+ }
478
+
479
+ // ── Assemble Meshes ──
480
+
481
+ for (const record of mesh_records) {
482
+ const mesh = new Mesh();
483
+ mesh.name = record.name;
484
+ mesh.geometry = geometries[record.geometry_index];
485
+ mesh.material = materials[record.material_index];
486
+ // serialized transform is world-space; meshes deserialize without a parent, so
487
+ // local == global. Setting only transform_global would leave transform_local at
488
+ // identity, and the next updateMatrices() / GPU hierarchy pass (which recompose
489
+ // global from local TRS) would snap the mesh to the origin.
490
+ mesh.transform_local.fromMatrix(record.transform);
491
+ mesh.updateMatrices();
492
+
493
+ // Compute world-space bounds from geometry bounds + transform
494
+ mesh.updateBoundsBasic();
495
+
496
+ scene.instances.add(mesh);
497
+ }
498
+
499
+ return scene;
500
+ }
501
+
502
+ /**
503
+ * Fetch a serialized scene binary from a URL and deserialize it into the given Scene.
504
+ * Convenience wrapper for testing.
505
+ *
506
+ * @param {string} url URL pointing to the binary blob produced by serialize_scene
507
+ * @param {Scene} scene an empty Scene instance to populate
508
+ * @returns {Promise<Scene>}
509
+ */
510
+ export async function load_scene_from_url(url, scene) {
511
+ assert.defined(scene, 'scene');
512
+ assert.notNull(scene, 'scene');
513
+ assert.isObject(scene, 'scene');
514
+ assert.equal(scene.isScene, true, 'scene.isScene !== true');
515
+
516
+ assert.isString(url, 'url');
517
+
518
+ const response = await fetch(url);
519
+
520
+ if (!response.ok) {
521
+ throw new Error(`Failed to fetch scene: ${response.status} ${response.statusText}`);
522
+ }
523
+
524
+ const array_buffer = await response.arrayBuffer();
525
+
526
+ assert.defined(array_buffer, 'array_buffer');
527
+
528
+ const buffer = BinaryBuffer.fromArrayBuffer(array_buffer);
529
+
530
+ return deserialize_scene(buffer, scene);
531
+ }