@woosh/meep-engine 3.8.0 → 3.10.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 (735) hide show
  1. package/build/bundle-worker-image-decoder.js +1 -1
  2. package/build/bundle-worker-terrain.js +1 -1
  3. package/package.json +3 -2
  4. package/src/avif/encode_image_source.d.ts +70 -0
  5. package/src/avif/encode_image_source.d.ts.map +1 -0
  6. package/src/avif/encode_image_source.js +117 -0
  7. package/src/avif/encoder_worker.js +15 -126
  8. package/src/avif/index.d.ts +4 -2
  9. package/src/avif/index.js +21 -2
  10. package/src/avif/native/DECISIONS.md +537 -0
  11. package/src/avif/native/NOTICE.md +61 -0
  12. package/src/avif/native/api/AvifDecoder.d.ts +67 -0
  13. package/src/avif/native/api/AvifDecoder.d.ts.map +1 -0
  14. package/src/avif/native/api/AvifDecoder.js +121 -0
  15. package/src/avif/native/api/apply_transformations.d.ts +30 -0
  16. package/src/avif/native/api/apply_transformations.d.ts.map +1 -0
  17. package/src/avif/native/api/apply_transformations.js +120 -0
  18. package/src/avif/native/api/avif_to_sampler2d.d.ts +25 -0
  19. package/src/avif/native/api/avif_to_sampler2d.d.ts.map +1 -0
  20. package/src/avif/native/api/avif_to_sampler2d.js +42 -0
  21. package/src/avif/native/api/convert_to_rgba.d.ts +54 -0
  22. package/src/avif/native/api/convert_to_rgba.d.ts.map +1 -0
  23. package/src/avif/native/api/convert_to_rgba.js +204 -0
  24. package/src/avif/native/api/decode_avif.d.ts +24 -0
  25. package/src/avif/native/api/decode_avif.d.ts.map +1 -0
  26. package/src/avif/native/api/decode_avif.js +111 -0
  27. package/src/avif/native/api/decode_image_item.d.ts +18 -0
  28. package/src/avif/native/api/decode_image_item.d.ts.map +1 -0
  29. package/src/avif/native/api/decode_image_item.js +234 -0
  30. package/src/avif/native/api/encode_avif.d.ts +73 -0
  31. package/src/avif/native/api/encode_avif.d.ts.map +1 -0
  32. package/src/avif/native/api/encode_avif.js +488 -0
  33. package/src/avif/native/api/sampler2d_to_avif.d.ts +22 -0
  34. package/src/avif/native/api/sampler2d_to_avif.d.ts.map +1 -0
  35. package/src/avif/native/api/sampler2d_to_avif.js +108 -0
  36. package/src/avif/native/av1/decode/Av1FrameContext.d.ts +286 -0
  37. package/src/avif/native/av1/decode/Av1FrameContext.d.ts.map +1 -0
  38. package/src/avif/native/av1/decode/Av1FrameContext.js +622 -0
  39. package/src/avif/native/av1/decode/block_decoded.d.ts +27 -0
  40. package/src/avif/native/av1/decode/block_decoded.d.ts.map +1 -0
  41. package/src/avif/native/av1/decode/block_decoded.js +59 -0
  42. package/src/avif/native/av1/decode/decode_av1_still.d.ts +22 -0
  43. package/src/avif/native/av1/decode/decode_av1_still.d.ts.map +1 -0
  44. package/src/avif/native/av1/decode/decode_av1_still.js +309 -0
  45. package/src/avif/native/av1/decode/decode_coefficients.d.ts +20 -0
  46. package/src/avif/native/av1/decode/decode_coefficients.d.ts.map +1 -0
  47. package/src/avif/native/av1/decode/decode_coefficients.js +259 -0
  48. package/src/avif/native/av1/decode/decode_palette.d.ts +28 -0
  49. package/src/avif/native/av1/decode/decode_palette.d.ts.map +1 -0
  50. package/src/avif/native/av1/decode/decode_palette.js +442 -0
  51. package/src/avif/native/av1/decode/decode_tile.d.ts +14 -0
  52. package/src/avif/native/av1/decode/decode_tile.d.ts.map +1 -0
  53. package/src/avif/native/av1/decode/decode_tile.js +1213 -0
  54. package/src/avif/native/av1/decode/get_scan.d.ts +16 -0
  55. package/src/avif/native/av1/decode/get_scan.d.ts.map +1 -0
  56. package/src/avif/native/av1/decode/get_scan.js +138 -0
  57. package/src/avif/native/av1/decode/read_lr.d.ts +35 -0
  58. package/src/avif/native/av1/decode/read_lr.d.ts.map +1 -0
  59. package/src/avif/native/av1/decode/read_lr.js +277 -0
  60. package/src/avif/native/av1/decode/read_transform_type.d.ts +19 -0
  61. package/src/avif/native/av1/decode/read_transform_type.d.ts.map +1 -0
  62. package/src/avif/native/av1/decode/read_transform_type.js +92 -0
  63. package/src/avif/native/av1/decode/reconstruct.d.ts +36 -0
  64. package/src/avif/native/av1/decode/reconstruct.d.ts.map +1 -0
  65. package/src/avif/native/av1/decode/reconstruct.js +241 -0
  66. package/src/avif/native/av1/decode/transform_type.d.ts +49 -0
  67. package/src/avif/native/av1/decode/transform_type.d.ts.map +1 -0
  68. package/src/avif/native/av1/decode/transform_type.js +137 -0
  69. package/src/avif/native/av1/encode/Av1BlockSnapshot.d.ts +81 -0
  70. package/src/avif/native/av1/encode/Av1BlockSnapshot.d.ts.map +1 -0
  71. package/src/avif/native/av1/encode/Av1BlockSnapshot.js +299 -0
  72. package/src/avif/native/av1/encode/Av1EncodeContext.d.ts +384 -0
  73. package/src/avif/native/av1/encode/Av1EncodeContext.d.ts.map +1 -0
  74. package/src/avif/native/av1/encode/Av1EncodeContext.js +590 -0
  75. package/src/avif/native/av1/encode/build_headers.d.ts +50 -0
  76. package/src/avif/native/av1/encode/build_headers.d.ts.map +1 -0
  77. package/src/avif/native/av1/encode/build_headers.js +359 -0
  78. package/src/avif/native/av1/encode/choose_chroma_alpha.d.ts +26 -0
  79. package/src/avif/native/av1/encode/choose_chroma_alpha.d.ts.map +1 -0
  80. package/src/avif/native/av1/encode/choose_chroma_alpha.js +90 -0
  81. package/src/avif/native/av1/encode/choose_filters.d.ts +21 -0
  82. package/src/avif/native/av1/encode/choose_filters.d.ts.map +1 -0
  83. package/src/avif/native/av1/encode/choose_filters.js +318 -0
  84. package/src/avif/native/av1/encode/choose_restoration.d.ts +35 -0
  85. package/src/avif/native/av1/encode/choose_restoration.d.ts.map +1 -0
  86. package/src/avif/native/av1/encode/choose_restoration.js +616 -0
  87. package/src/avif/native/av1/encode/decode_effort.d.ts +57 -0
  88. package/src/avif/native/av1/encode/decode_effort.d.ts.map +1 -0
  89. package/src/avif/native/av1/encode/decode_effort.js +59 -0
  90. package/src/avif/native/av1/encode/encode_av1_still.d.ts +17 -0
  91. package/src/avif/native/av1/encode/encode_av1_still.d.ts.map +1 -0
  92. package/src/avif/native/av1/encode/encode_av1_still.js +194 -0
  93. package/src/avif/native/av1/encode/encode_effort.d.ts +56 -0
  94. package/src/avif/native/av1/encode/encode_effort.d.ts.map +1 -0
  95. package/src/avif/native/av1/encode/encode_effort.js +97 -0
  96. package/src/avif/native/av1/encode/encode_tile.d.ts +26 -0
  97. package/src/avif/native/av1/encode/encode_tile.d.ts.map +1 -0
  98. package/src/avif/native/av1/encode/encode_tile.js +2331 -0
  99. package/src/avif/native/av1/encode/quantise.d.ts +51 -0
  100. package/src/avif/native/av1/encode/quantise.d.ts.map +1 -0
  101. package/src/avif/native/av1/encode/quantise.js +212 -0
  102. package/src/avif/native/av1/encode/write_coefficients.d.ts +42 -0
  103. package/src/avif/native/av1/encode/write_coefficients.d.ts.map +1 -0
  104. package/src/avif/native/av1/encode/write_coefficients.js +367 -0
  105. package/src/avif/native/av1/encode/write_lr.d.ts +33 -0
  106. package/src/avif/native/av1/encode/write_lr.d.ts.map +1 -0
  107. package/src/avif/native/av1/encode/write_lr.js +174 -0
  108. package/src/avif/native/av1/encode/write_transform_type.d.ts +21 -0
  109. package/src/avif/native/av1/encode/write_transform_type.d.ts.map +1 -0
  110. package/src/avif/native/av1/encode/write_transform_type.js +70 -0
  111. package/src/avif/native/av1/entropy/CdfContext.d.ts +167 -0
  112. package/src/avif/native/av1/entropy/CdfContext.d.ts.map +1 -0
  113. package/src/avif/native/av1/entropy/CdfContext.js +433 -0
  114. package/src/avif/native/av1/entropy/SymbolReader.d.ts +103 -0
  115. package/src/avif/native/av1/entropy/SymbolReader.d.ts.map +1 -0
  116. package/src/avif/native/av1/entropy/SymbolReader.js +317 -0
  117. package/src/avif/native/av1/entropy/SymbolWriter.d.ts +107 -0
  118. package/src/avif/native/av1/entropy/SymbolWriter.d.ts.map +1 -0
  119. package/src/avif/native/av1/entropy/SymbolWriter.js +352 -0
  120. package/src/avif/native/av1/entropy/coefficient_context.d.ts +71 -0
  121. package/src/avif/native/av1/entropy/coefficient_context.d.ts.map +1 -0
  122. package/src/avif/native/av1/entropy/coefficient_context.js +325 -0
  123. package/src/avif/native/av1/entropy/partition_cdf.d.ts +54 -0
  124. package/src/avif/native/av1/entropy/partition_cdf.d.ts.map +1 -0
  125. package/src/avif/native/av1/entropy/partition_cdf.js +98 -0
  126. package/src/avif/native/av1/entropy/symbol_cost.d.ts +37 -0
  127. package/src/avif/native/av1/entropy/symbol_cost.d.ts.map +1 -0
  128. package/src/avif/native/av1/entropy/symbol_cost.js +76 -0
  129. package/src/avif/native/av1/filter/cdef.d.ts +15 -0
  130. package/src/avif/native/av1/filter/cdef.d.ts.map +1 -0
  131. package/src/avif/native/av1/filter/cdef.js +313 -0
  132. package/src/avif/native/av1/filter/loop_filter.d.ts +14 -0
  133. package/src/avif/native/av1/filter/loop_filter.d.ts.map +1 -0
  134. package/src/avif/native/av1/filter/loop_filter.js +377 -0
  135. package/src/avif/native/av1/filter/loop_restoration.d.ts +42 -0
  136. package/src/avif/native/av1/filter/loop_restoration.d.ts.map +1 -0
  137. package/src/avif/native/av1/filter/loop_restoration.js +451 -0
  138. package/src/avif/native/av1/filter/superres.d.ts +18 -0
  139. package/src/avif/native/av1/filter/superres.d.ts.map +1 -0
  140. package/src/avif/native/av1/filter/superres.js +86 -0
  141. package/src/avif/native/av1/grain/FilmGrainState.d.ts +62 -0
  142. package/src/avif/native/av1/grain/FilmGrainState.d.ts.map +1 -0
  143. package/src/avif/native/av1/grain/FilmGrainState.js +87 -0
  144. package/src/avif/native/av1/grain/film_grain.d.ts +16 -0
  145. package/src/avif/native/av1/grain/film_grain.d.ts.map +1 -0
  146. package/src/avif/native/av1/grain/film_grain.js +623 -0
  147. package/src/avif/native/av1/obu/FrameHeader.d.ts +248 -0
  148. package/src/avif/native/av1/obu/FrameHeader.d.ts.map +1 -0
  149. package/src/avif/native/av1/obu/FrameHeader.js +381 -0
  150. package/src/avif/native/av1/obu/ObuHeader.d.ts +53 -0
  151. package/src/avif/native/av1/obu/ObuHeader.d.ts.map +1 -0
  152. package/src/avif/native/av1/obu/ObuHeader.js +62 -0
  153. package/src/avif/native/av1/obu/SequenceHeader.d.ts +157 -0
  154. package/src/avif/native/av1/obu/SequenceHeader.d.ts.map +1 -0
  155. package/src/avif/native/av1/obu/SequenceHeader.js +225 -0
  156. package/src/avif/native/av1/obu/for_each_obu.d.ts +24 -0
  157. package/src/avif/native/av1/obu/for_each_obu.d.ts.map +1 -0
  158. package/src/avif/native/av1/obu/for_each_obu.js +50 -0
  159. package/src/avif/native/av1/obu/parse_frame_header.d.ts +18 -0
  160. package/src/avif/native/av1/obu/parse_frame_header.d.ts.map +1 -0
  161. package/src/avif/native/av1/obu/parse_frame_header.js +841 -0
  162. package/src/avif/native/av1/obu/parse_obu_header.d.ts +23 -0
  163. package/src/avif/native/av1/obu/parse_obu_header.d.ts.map +1 -0
  164. package/src/avif/native/av1/obu/parse_obu_header.js +69 -0
  165. package/src/avif/native/av1/obu/parse_sequence_header.d.ts +17 -0
  166. package/src/avif/native/av1/obu/parse_sequence_header.d.ts.map +1 -0
  167. package/src/avif/native/av1/obu/parse_sequence_header.js +263 -0
  168. package/src/avif/native/av1/obu/write_frame_header.d.ts +16 -0
  169. package/src/avif/native/av1/obu/write_frame_header.d.ts.map +1 -0
  170. package/src/avif/native/av1/obu/write_frame_header.js +579 -0
  171. package/src/avif/native/av1/obu/write_sequence_header.d.ts +17 -0
  172. package/src/avif/native/av1/obu/write_sequence_header.d.ts.map +1 -0
  173. package/src/avif/native/av1/obu/write_sequence_header.js +189 -0
  174. package/src/avif/native/av1/predict/IntraPredictionState.d.ts +49 -0
  175. package/src/avif/native/av1/predict/IntraPredictionState.d.ts.map +1 -0
  176. package/src/avif/native/av1/predict/IntraPredictionState.js +58 -0
  177. package/src/avif/native/av1/predict/intra_filter_type.d.ts +17 -0
  178. package/src/avif/native/av1/predict/intra_filter_type.d.ts.map +1 -0
  179. package/src/avif/native/av1/predict/intra_filter_type.js +79 -0
  180. package/src/avif/native/av1/predict/predict_chroma_from_luma.d.ts +50 -0
  181. package/src/avif/native/av1/predict/predict_chroma_from_luma.d.ts.map +1 -0
  182. package/src/avif/native/av1/predict/predict_chroma_from_luma.js +153 -0
  183. package/src/avif/native/av1/predict/predict_intra.d.ts +42 -0
  184. package/src/avif/native/av1/predict/predict_intra.d.ts.map +1 -0
  185. package/src/avif/native/av1/predict/predict_intra.js +803 -0
  186. package/src/avif/native/av1/predict/predict_palette.d.ts +23 -0
  187. package/src/avif/native/av1/predict/predict_palette.d.ts.map +1 -0
  188. package/src/avif/native/av1/predict/predict_palette.js +36 -0
  189. package/src/avif/native/av1/tables/av1_symbols.d.ts +411 -0
  190. package/src/avif/native/av1/tables/av1_symbols.d.ts.map +1 -0
  191. package/src/avif/native/av1/tables/av1_symbols.js +419 -0
  192. package/src/avif/native/av1/tables/block_tables.d.ts +181 -0
  193. package/src/avif/native/av1/tables/block_tables.d.ts.map +1 -0
  194. package/src/avif/native/av1/tables/block_tables.js +270 -0
  195. package/src/avif/native/av1/tables/cdf_tables.d.ts +961 -0
  196. package/src/avif/native/av1/tables/cdf_tables.d.ts.map +1 -0
  197. package/src/avif/native/av1/tables/cdf_tables.js +1893 -0
  198. package/src/avif/native/av1/tables/coefficient_tables.d.ts +41 -0
  199. package/src/avif/native/av1/tables/coefficient_tables.d.ts.map +1 -0
  200. package/src/avif/native/av1/tables/coefficient_tables.js +82 -0
  201. package/src/avif/native/av1/tables/derived_block_tables.d.ts +15 -0
  202. package/src/avif/native/av1/tables/derived_block_tables.d.ts.map +1 -0
  203. package/src/avif/native/av1/tables/derived_block_tables.js +23 -0
  204. package/src/avif/native/av1/tables/filter_tables.d.ts +171 -0
  205. package/src/avif/native/av1/tables/filter_tables.d.ts.map +1 -0
  206. package/src/avif/native/av1/tables/filter_tables.js +313 -0
  207. package/src/avif/native/av1/tables/grain_tables.d.ts +11 -0
  208. package/src/avif/native/av1/tables/grain_tables.d.ts.map +1 -0
  209. package/src/avif/native/av1/tables/grain_tables.js +190 -0
  210. package/src/avif/native/av1/tables/prediction_tables.d.ts +141 -0
  211. package/src/avif/native/av1/tables/prediction_tables.d.ts.map +1 -0
  212. package/src/avif/native/av1/tables/prediction_tables.js +223 -0
  213. package/src/avif/native/av1/tables/quantizer_matrix_tables.d.ts +21 -0
  214. package/src/avif/native/av1/tables/quantizer_matrix_tables.d.ts.map +1 -0
  215. package/src/avif/native/av1/tables/quantizer_matrix_tables.js +38 -0
  216. package/src/avif/native/av1/tables/quantizer_tables.d.ts +21 -0
  217. package/src/avif/native/av1/tables/quantizer_tables.d.ts.map +1 -0
  218. package/src/avif/native/av1/tables/quantizer_tables.js +160 -0
  219. package/src/avif/native/av1/tables/scan_tables.d.ts +321 -0
  220. package/src/avif/native/av1/tables/scan_tables.d.ts.map +1 -0
  221. package/src/avif/native/av1/tables/scan_tables.js +727 -0
  222. package/src/avif/native/av1/tables/segmentation_tables.d.ts +31 -0
  223. package/src/avif/native/av1/tables/segmentation_tables.d.ts.map +1 -0
  224. package/src/avif/native/av1/tables/segmentation_tables.js +48 -0
  225. package/src/avif/native/av1/tables/transform_tables.d.ts +91 -0
  226. package/src/avif/native/av1/tables/transform_tables.d.ts.map +1 -0
  227. package/src/avif/native/av1/tables/transform_tables.js +140 -0
  228. package/src/avif/native/av1/tables/unpack_table.d.ts +33 -0
  229. package/src/avif/native/av1/tables/unpack_table.d.ts.map +1 -0
  230. package/src/avif/native/av1/tables/unpack_table.js +73 -0
  231. package/src/avif/native/av1/transform/forward_transform_2d.d.ts +61 -0
  232. package/src/avif/native/av1/transform/forward_transform_2d.d.ts.map +1 -0
  233. package/src/avif/native/av1/transform/forward_transform_2d.js +574 -0
  234. package/src/avif/native/av1/transform/inverse_transform_1d.d.ts +76 -0
  235. package/src/avif/native/av1/transform/inverse_transform_1d.d.ts.map +1 -0
  236. package/src/avif/native/av1/transform/inverse_transform_1d.js +590 -0
  237. package/src/avif/native/av1/transform/inverse_transform_2d.d.ts +46 -0
  238. package/src/avif/native/av1/transform/inverse_transform_2d.d.ts.map +1 -0
  239. package/src/avif/native/av1/transform/inverse_transform_2d.js +180 -0
  240. package/src/avif/native/av1/util/ceil_log2.d.ts +13 -0
  241. package/src/avif/native/av1/util/ceil_log2.d.ts.map +1 -0
  242. package/src/avif/native/av1/util/ceil_log2.js +18 -0
  243. package/src/avif/native/av1/util/floor_log2.d.ts +20 -0
  244. package/src/avif/native/av1/util/floor_log2.d.ts.map +1 -0
  245. package/src/avif/native/av1/util/floor_log2.js +20 -0
  246. package/src/avif/native/av1/util/round2.d.ts +22 -0
  247. package/src/avif/native/av1/util/round2.d.ts.map +1 -0
  248. package/src/avif/native/av1/util/round2.js +27 -0
  249. package/src/avif/native/av1/util/round2_signed.d.ts +14 -0
  250. package/src/avif/native/av1/util/round2_signed.d.ts.map +1 -0
  251. package/src/avif/native/av1/util/round2_signed.js +17 -0
  252. package/src/avif/native/av1/util/tile_log2.d.ts +16 -0
  253. package/src/avif/native/av1/util/tile_log2.d.ts.map +1 -0
  254. package/src/avif/native/av1/util/tile_log2.js +23 -0
  255. package/src/avif/native/bitstream/BitReader.d.ts +174 -0
  256. package/src/avif/native/bitstream/BitReader.d.ts.map +1 -0
  257. package/src/avif/native/bitstream/BitReader.js +391 -0
  258. package/src/avif/native/bitstream/BitWriter.d.ts +122 -0
  259. package/src/avif/native/bitstream/BitWriter.d.ts.map +1 -0
  260. package/src/avif/native/bitstream/BitWriter.js +351 -0
  261. package/src/avif/native/color/ColourTransform.d.ts +62 -0
  262. package/src/avif/native/color/ColourTransform.d.ts.map +1 -0
  263. package/src/avif/native/color/ColourTransform.js +189 -0
  264. package/src/avif/native/color/YuvImage.d.ts +51 -0
  265. package/src/avif/native/color/YuvImage.d.ts.map +1 -0
  266. package/src/avif/native/color/YuvImage.js +66 -0
  267. package/src/avif/native/color/clamp_sample.d.ts +18 -0
  268. package/src/avif/native/color/clamp_sample.d.ts.map +1 -0
  269. package/src/avif/native/color/clamp_sample.js +25 -0
  270. package/src/avif/native/color/linear_to_transfer.d.ts +24 -0
  271. package/src/avif/native/color/linear_to_transfer.d.ts.map +1 -0
  272. package/src/avif/native/color/linear_to_transfer.js +126 -0
  273. package/src/avif/native/color/primaries.d.ts +20 -0
  274. package/src/avif/native/color/primaries.d.ts.map +1 -0
  275. package/src/avif/native/color/primaries.js +94 -0
  276. package/src/avif/native/color/rgb_row_to_ycbcr.d.ts +20 -0
  277. package/src/avif/native/color/rgb_row_to_ycbcr.d.ts.map +1 -0
  278. package/src/avif/native/color/rgb_row_to_ycbcr.js +78 -0
  279. package/src/avif/native/color/transfer_to_linear.d.ts +49 -0
  280. package/src/avif/native/color/transfer_to_linear.d.ts.map +1 -0
  281. package/src/avif/native/color/transfer_to_linear.js +171 -0
  282. package/src/avif/native/color/upsample_chroma_row.d.ts +35 -0
  283. package/src/avif/native/color/upsample_chroma_row.d.ts.map +1 -0
  284. package/src/avif/native/color/upsample_chroma_row.js +89 -0
  285. package/src/avif/native/color/ycbcr_row_to_rgb.d.ts +23 -0
  286. package/src/avif/native/color/ycbcr_row_to_rgb.d.ts.map +1 -0
  287. package/src/avif/native/color/ycbcr_row_to_rgb.js +78 -0
  288. package/src/avif/native/heif/AvifFile.d.ts +112 -0
  289. package/src/avif/native/heif/AvifFile.d.ts.map +1 -0
  290. package/src/avif/native/heif/AvifFile.js +142 -0
  291. package/src/avif/native/heif/ItemProperty.d.ts +244 -0
  292. package/src/avif/native/heif/ItemProperty.d.ts.map +1 -0
  293. package/src/avif/native/heif/ItemProperty.js +321 -0
  294. package/src/avif/native/heif/find_item_property.d.ts +17 -0
  295. package/src/avif/native/heif/find_item_property.d.ts.map +1 -0
  296. package/src/avif/native/heif/find_item_property.js +28 -0
  297. package/src/avif/native/heif/find_item_references.d.ts +16 -0
  298. package/src/avif/native/heif/find_item_references.d.ts.map +1 -0
  299. package/src/avif/native/heif/find_item_references.js +29 -0
  300. package/src/avif/native/heif/find_items_referencing.d.ts +17 -0
  301. package/src/avif/native/heif/find_items_referencing.d.ts.map +1 -0
  302. package/src/avif/native/heif/find_items_referencing.js +36 -0
  303. package/src/avif/native/heif/parse_avif_file.d.ts +15 -0
  304. package/src/avif/native/heif/parse_avif_file.d.ts.map +1 -0
  305. package/src/avif/native/heif/parse_avif_file.js +383 -0
  306. package/src/avif/native/heif/parse_image_grid.d.ts +18 -0
  307. package/src/avif/native/heif/parse_image_grid.d.ts.map +1 -0
  308. package/src/avif/native/heif/parse_image_grid.js +48 -0
  309. package/src/avif/native/heif/parse_item_property.d.ts +18 -0
  310. package/src/avif/native/heif/parse_item_property.d.ts.map +1 -0
  311. package/src/avif/native/heif/parse_item_property.js +243 -0
  312. package/src/avif/native/heif/read_item_data.d.ts +22 -0
  313. package/src/avif/native/heif/read_item_data.d.ts.map +1 -0
  314. package/src/avif/native/heif/read_item_data.js +97 -0
  315. package/src/avif/native/heif/write_avif_file.d.ts +50 -0
  316. package/src/avif/native/heif/write_avif_file.d.ts.map +1 -0
  317. package/src/avif/native/heif/write_avif_file.js +348 -0
  318. package/src/avif/native/heif/write_item_property.d.ts +16 -0
  319. package/src/avif/native/heif/write_item_property.d.ts.map +1 -0
  320. package/src/avif/native/heif/write_item_property.js +182 -0
  321. package/src/avif/native/index.d.ts +14 -0
  322. package/src/avif/native/index.d.ts.map +1 -0
  323. package/src/avif/native/index.js +56 -0
  324. package/src/avif/native/isobmff/BoxHeader.d.ts +50 -0
  325. package/src/avif/native/isobmff/BoxHeader.d.ts.map +1 -0
  326. package/src/avif/native/isobmff/BoxHeader.js +57 -0
  327. package/src/avif/native/isobmff/BoxWriter.d.ts +118 -0
  328. package/src/avif/native/isobmff/BoxWriter.d.ts.map +1 -0
  329. package/src/avif/native/isobmff/BoxWriter.js +264 -0
  330. package/src/avif/native/isobmff/ByteCursor.d.ts +125 -0
  331. package/src/avif/native/isobmff/ByteCursor.d.ts.map +1 -0
  332. package/src/avif/native/isobmff/ByteCursor.js +298 -0
  333. package/src/avif/native/isobmff/for_each_box.d.ts +23 -0
  334. package/src/avif/native/isobmff/for_each_box.d.ts.map +1 -0
  335. package/src/avif/native/isobmff/for_each_box.js +39 -0
  336. package/src/avif/native/isobmff/read_box_header.d.ts +22 -0
  337. package/src/avif/native/isobmff/read_box_header.d.ts.map +1 -0
  338. package/src/avif/native/isobmff/read_box_header.js +59 -0
  339. package/src/avif/native/isobmff/read_full_box_header.d.ts +26 -0
  340. package/src/avif/native/isobmff/read_full_box_header.d.ts.map +1 -0
  341. package/src/avif/native/isobmff/read_full_box_header.js +33 -0
  342. package/src/avif/threaded_image_encoder.d.ts +7 -2
  343. package/src/avif/threaded_image_encoder.d.ts.map +1 -1
  344. package/src/avif/threaded_image_encoder.js +107 -21
  345. package/src/core/binary/BinaryBuffer.d.ts +40 -0
  346. package/src/core/binary/BinaryBuffer.d.ts.map +1 -1
  347. package/src/core/binary/BinaryBuffer.js +100 -0
  348. package/src/core/binary/hash/crc32.d.ts +16 -0
  349. package/src/core/binary/hash/crc32.d.ts.map +1 -0
  350. package/src/core/binary/hash/crc32.js +96 -0
  351. package/src/core/binary/utf8/utf8_decode.d.ts +21 -0
  352. package/src/core/binary/utf8/utf8_decode.d.ts.map +1 -0
  353. package/src/core/binary/utf8/utf8_decode.js +43 -0
  354. package/src/core/binary/utf8/utf8_encode_into.d.ts +20 -0
  355. package/src/core/binary/utf8/utf8_encode_into.d.ts.map +1 -0
  356. package/src/core/binary/utf8/utf8_encode_into.js +48 -0
  357. package/src/core/binary/utf8/utf8_encoded_length.d.ts +14 -0
  358. package/src/core/binary/utf8/utf8_encoded_length.d.ts.map +1 -0
  359. package/src/core/binary/utf8/utf8_encoded_length.js +36 -0
  360. package/src/core/color/COLOR_FIX_PLAN_2026_08_28.md +417 -0
  361. package/src/core/color/COLOR_REVIEW_2026_08_28.md +779 -0
  362. package/src/core/color/Color.d.ts +128 -20
  363. package/src/core/color/Color.d.ts.map +1 -1
  364. package/src/core/color/Color.js +959 -866
  365. package/src/core/color/PQ/PQ_constants.d.ts +10 -0
  366. package/src/core/color/PQ/PQ_constants.d.ts.map +1 -1
  367. package/src/core/color/PQ/PQ_constants.js +10 -0
  368. package/src/core/color/PQ/linear_to_PQ.d.ts.map +1 -1
  369. package/src/core/color/PQ/linear_to_PQ.js +6 -0
  370. package/src/core/color/REC709_PRIMARIES.d.ts +50 -0
  371. package/src/core/color/REC709_PRIMARIES.d.ts.map +1 -0
  372. package/src/core/color/REC709_PRIMARIES.js +53 -0
  373. package/src/core/color/construct/color_from_hex.d.ts +21 -0
  374. package/src/core/color/construct/color_from_hex.d.ts.map +1 -0
  375. package/src/core/color/construct/color_from_hex.js +33 -0
  376. package/src/core/color/construct/color_from_temperature.d.ts +22 -0
  377. package/src/core/color/construct/color_from_temperature.d.ts.map +1 -0
  378. package/src/core/color/construct/color_from_temperature.js +33 -0
  379. package/src/core/color/construct/color_from_uint24.d.ts +19 -0
  380. package/src/core/color/construct/color_from_uint24.d.ts.map +1 -0
  381. package/src/core/color/construct/color_from_uint24.js +26 -0
  382. package/src/core/color/construct/color_from_uint32.d.ts +20 -0
  383. package/src/core/color/construct/color_from_uint32.d.ts.map +1 -0
  384. package/src/core/color/construct/color_from_uint32.js +39 -0
  385. package/src/core/color/construct/color_gray.d.ts +17 -0
  386. package/src/core/color/construct/color_gray.d.ts.map +1 -0
  387. package/src/core/color/construct/color_gray.js +22 -0
  388. package/src/core/color/hex/hex2rgb.d.ts +1 -11
  389. package/src/core/color/hex/hex2rgb.d.ts.map +1 -1
  390. package/src/core/color/hex/hex2rgb.js +7 -24
  391. package/src/core/color/hex/hex_to_rgb.d.ts +18 -0
  392. package/src/core/color/hex/hex_to_rgb.d.ts.map +1 -0
  393. package/src/core/color/hex/hex_to_rgb.js +62 -0
  394. package/src/core/color/hex/rgb2hex.d.ts +1 -8
  395. package/src/core/color/hex/rgb2hex.d.ts.map +1 -1
  396. package/src/core/color/hex/rgb2hex.js +7 -13
  397. package/src/core/color/hex/rgb_to_hex.d.ts +9 -0
  398. package/src/core/color/hex/rgb_to_hex.d.ts.map +1 -0
  399. package/src/core/color/hex/rgb_to_hex.js +13 -0
  400. package/src/core/color/hex/rgba_to_hex.d.ts +19 -0
  401. package/src/core/color/hex/rgba_to_hex.d.ts.map +1 -0
  402. package/src/core/color/hex/rgba_to_hex.js +23 -0
  403. package/src/core/color/hsv/hsv2rgb.d.ts +1 -12
  404. package/src/core/color/hsv/hsv2rgb.d.ts.map +1 -1
  405. package/src/core/color/hsv/hsv2rgb.js +8 -21
  406. package/src/core/color/hsv/hsv2rgb_float.d.ts +1 -12
  407. package/src/core/color/hsv/hsv2rgb_float.d.ts.map +1 -1
  408. package/src/core/color/hsv/hsv2rgb_float.js +8 -56
  409. package/src/core/color/hsv/hsv_to_rgb.d.ts +13 -0
  410. package/src/core/color/hsv/hsv_to_rgb.d.ts.map +1 -0
  411. package/src/core/color/hsv/hsv_to_rgb.js +39 -0
  412. package/src/core/color/hsv/hsv_to_rgb_uint8.d.ts +13 -0
  413. package/src/core/color/hsv/hsv_to_rgb_uint8.d.ts.map +1 -0
  414. package/src/core/color/hsv/hsv_to_rgb_uint8.js +21 -0
  415. package/src/core/color/hsv/hue_to_rgb_sextant.d.ts +24 -0
  416. package/src/core/color/hsv/hue_to_rgb_sextant.d.ts.map +1 -0
  417. package/src/core/color/hsv/hue_to_rgb_sextant.js +67 -0
  418. package/src/core/color/hsv/rgb2hsv.d.ts +1 -12
  419. package/src/core/color/hsv/rgb2hsv.d.ts.map +1 -1
  420. package/src/core/color/hsv/rgb2hsv.js +7 -42
  421. package/src/core/color/hsv/rgb_to_hsv.d.ts +13 -0
  422. package/src/core/color/hsv/rgb_to_hsv.d.ts.map +1 -0
  423. package/src/core/color/hsv/rgb_to_hsv.js +42 -0
  424. package/src/core/color/hunt/hpe_to_xyz.d.ts +2 -0
  425. package/src/core/color/hunt/hpe_to_xyz.d.ts.map +1 -0
  426. package/src/core/color/hunt/hpe_to_xyz.js +4 -0
  427. package/src/core/color/hunt/xyz_to_hpe.d.ts +1 -6
  428. package/src/core/color/hunt/xyz_to_hpe.d.ts.map +1 -1
  429. package/src/core/color/hunt/xyz_to_hpe.js +12 -15
  430. package/src/core/color/illuminant/D65_spd_tabulated.d.ts.map +1 -1
  431. package/src/core/color/illuminant/D65_spd_tabulated.js +107 -104
  432. package/src/core/color/int2rgb.d.ts +1 -10
  433. package/src/core/color/int2rgb.d.ts.map +1 -1
  434. package/src/core/color/int2rgb.js +7 -12
  435. package/src/core/color/int_to_rgb.d.ts +21 -0
  436. package/src/core/color/int_to_rgb.d.ts.map +1 -0
  437. package/src/core/color/int_to_rgb.js +33 -0
  438. package/src/core/color/kelvin/kelvin_to_rgb.d.ts.map +1 -1
  439. package/src/core/color/kelvin/kelvin_to_rgb.js +22 -2
  440. package/src/core/color/kelvin/rgb_to_kelvin.d.ts +22 -2
  441. package/src/core/color/kelvin/rgb_to_kelvin.d.ts.map +1 -1
  442. package/src/core/color/kelvin/rgb_to_kelvin.js +22 -2
  443. package/src/core/color/lab/lab_to_xyz.d.ts +20 -0
  444. package/src/core/color/lab/lab_to_xyz.d.ts.map +1 -0
  445. package/src/core/color/lab/lab_to_xyz.js +69 -0
  446. package/src/core/color/oklab/gamut_clip_adaptive_l0.d.ts +34 -0
  447. package/src/core/color/oklab/gamut_clip_adaptive_l0.d.ts.map +1 -0
  448. package/src/core/color/oklab/gamut_clip_adaptive_l0.js +46 -0
  449. package/src/core/color/oklab/gamut_clip_at_l0.d.ts +33 -0
  450. package/src/core/color/oklab/gamut_clip_at_l0.d.ts.map +1 -0
  451. package/src/core/color/oklab/gamut_clip_at_l0.js +84 -0
  452. package/src/core/color/oklab/gamut_clip_preserve_chroma.d.ts +24 -0
  453. package/src/core/color/oklab/gamut_clip_preserve_chroma.d.ts.map +1 -0
  454. package/src/core/color/oklab/gamut_clip_preserve_chroma.js +37 -0
  455. package/src/core/color/oklab/gamut_clip_project_to_lcusp.d.ts +23 -0
  456. package/src/core/color/oklab/gamut_clip_project_to_lcusp.d.ts.map +1 -0
  457. package/src/core/color/oklab/gamut_clip_project_to_lcusp.js +46 -0
  458. package/src/core/color/oklab/linear_srgb_to_okhsl.d.ts +19 -0
  459. package/src/core/color/oklab/linear_srgb_to_okhsl.d.ts.map +1 -0
  460. package/src/core/color/oklab/linear_srgb_to_okhsl.js +93 -0
  461. package/src/core/color/oklab/linear_srgb_to_okhsv.d.ts +12 -4
  462. package/src/core/color/oklab/linear_srgb_to_okhsv.d.ts.map +1 -1
  463. package/src/core/color/oklab/linear_srgb_to_okhsv.js +108 -84
  464. package/src/core/color/oklab/linear_srgb_to_oklab.d.ts +13 -4
  465. package/src/core/color/oklab/linear_srgb_to_oklab.d.ts.map +1 -1
  466. package/src/core/color/oklab/linear_srgb_to_oklab.js +28 -19
  467. package/src/core/color/oklab/okhsl_chroma_bounds.d.ts +51 -0
  468. package/src/core/color/oklab/okhsl_chroma_bounds.d.ts.map +1 -0
  469. package/src/core/color/oklab/okhsl_chroma_bounds.js +128 -0
  470. package/src/core/color/oklab/okhsl_to_linear_srgb.d.ts +19 -0
  471. package/src/core/color/oklab/okhsl_to_linear_srgb.d.ts.map +1 -0
  472. package/src/core/color/oklab/okhsl_to_linear_srgb.js +85 -0
  473. package/src/core/color/oklab/oklab_to_oklch.d.ts +24 -0
  474. package/src/core/color/oklab/oklab_to_oklch.d.ts.map +1 -0
  475. package/src/core/color/oklab/oklab_to_oklch.js +35 -0
  476. package/src/core/color/oklab/oklch_to_oklab.d.ts +18 -0
  477. package/src/core/color/oklab/oklch_to_oklab.d.ts.map +1 -0
  478. package/src/core/color/oklab/oklch_to_oklab.js +26 -0
  479. package/src/core/color/oklab/toe.d.ts +12 -0
  480. package/src/core/color/oklab/toe.d.ts.map +1 -1
  481. package/src/core/color/oklab/toe.js +34 -22
  482. package/src/core/color/operations/color_add.d.ts +21 -0
  483. package/src/core/color/operations/color_add.d.ts.map +1 -0
  484. package/src/core/color/operations/color_add.js +23 -0
  485. package/src/core/color/operations/color_add_scaled.d.ts +20 -0
  486. package/src/core/color/operations/color_add_scaled.d.ts.map +1 -0
  487. package/src/core/color/operations/color_add_scaled.js +30 -0
  488. package/src/core/color/operations/color_clamp.d.ts +22 -0
  489. package/src/core/color/operations/color_clamp.d.ts.map +1 -0
  490. package/src/core/color/operations/color_clamp.js +25 -0
  491. package/src/core/color/operations/color_darken.d.ts +2 -1
  492. package/src/core/color/operations/color_darken.d.ts.map +1 -1
  493. package/src/core/color/operations/color_darken.js +25 -24
  494. package/src/core/color/operations/color_desaturate.d.ts +2 -1
  495. package/src/core/color/operations/color_desaturate.d.ts.map +1 -1
  496. package/src/core/color/operations/color_desaturate.js +25 -24
  497. package/src/core/color/operations/color_get_hsl.d.ts +18 -0
  498. package/src/core/color/operations/color_get_hsl.d.ts.map +1 -0
  499. package/src/core/color/operations/color_get_hsl.js +60 -0
  500. package/src/core/color/operations/color_is_in_gamut.d.ts +20 -0
  501. package/src/core/color/operations/color_is_in_gamut.d.ts.map +1 -0
  502. package/src/core/color/operations/color_is_in_gamut.js +30 -0
  503. package/src/core/color/operations/color_lerp.d.ts +12 -3
  504. package/src/core/color/operations/color_lerp.d.ts.map +1 -1
  505. package/src/core/color/operations/color_lerp.js +55 -46
  506. package/src/core/color/operations/color_lighten.d.ts +9 -5
  507. package/src/core/color/operations/color_lighten.d.ts.map +1 -1
  508. package/src/core/color/operations/color_lighten.js +29 -24
  509. package/src/core/color/operations/color_mix_okhsv_channel.d.ts +24 -0
  510. package/src/core/color/operations/color_mix_okhsv_channel.d.ts.map +1 -0
  511. package/src/core/color/operations/color_mix_okhsv_channel.js +48 -0
  512. package/src/core/color/operations/color_multiply_rgb.d.ts +21 -0
  513. package/src/core/color/operations/color_multiply_rgb.d.ts.map +1 -0
  514. package/src/core/color/operations/color_multiply_rgb.js +26 -0
  515. package/src/core/color/operations/color_saturate.d.ts +9 -5
  516. package/src/core/color/operations/color_saturate.d.ts.map +1 -1
  517. package/src/core/color/operations/color_saturate.js +29 -24
  518. package/src/core/color/operations/color_scale_okhsv_channel.d.ts +1 -1
  519. package/src/core/color/operations/color_scale_okhsv_channel.d.ts.map +1 -1
  520. package/src/core/color/operations/color_scale_okhsv_channel.js +58 -45
  521. package/src/core/color/operations/color_srgb_apply.d.ts +28 -0
  522. package/src/core/color/operations/color_srgb_apply.d.ts.map +1 -0
  523. package/src/core/color/operations/color_srgb_apply.js +40 -0
  524. package/src/core/color/operations/color_sub.d.ts +16 -0
  525. package/src/core/color/operations/color_sub.d.ts.map +1 -0
  526. package/src/core/color/operations/color_sub.js +18 -0
  527. package/src/core/color/parse_color.d.ts +10 -1
  528. package/src/core/color/parse_color.d.ts.map +1 -1
  529. package/src/core/color/parse_color.js +100 -84
  530. package/src/core/color/parse_color_normalized.d.ts +24 -0
  531. package/src/core/color/parse_color_normalized.d.ts.map +1 -0
  532. package/src/core/color/parse_color_normalized.js +38 -0
  533. package/src/core/color/rgb2uint24.d.ts +1 -8
  534. package/src/core/color/rgb2uint24.d.ts.map +1 -1
  535. package/src/core/color/rgb2uint24.js +7 -20
  536. package/src/core/color/rgb2uint32.d.ts +1 -9
  537. package/src/core/color/rgb2uint32.d.ts.map +1 -1
  538. package/src/core/color/rgb2uint32.js +7 -18
  539. package/src/core/color/rgb_to_luminance.d.ts +14 -5
  540. package/src/core/color/rgb_to_luminance.d.ts.map +1 -1
  541. package/src/core/color/rgb_to_luminance.js +24 -13
  542. package/src/core/color/rgb_to_uint24.d.ts +9 -0
  543. package/src/core/color/rgb_to_uint24.d.ts.map +1 -0
  544. package/src/core/color/rgb_to_uint24.js +20 -0
  545. package/src/core/color/rgb_to_uint32.d.ts +10 -0
  546. package/src/core/color/rgb_to_uint32.d.ts.map +1 -0
  547. package/src/core/color/rgb_to_uint32.js +21 -0
  548. package/src/core/color/sRGB/linear_to_sRGB.d.ts +7 -0
  549. package/src/core/color/sRGB/linear_to_sRGB.d.ts.map +1 -1
  550. package/src/core/color/sRGB/linear_to_sRGB.js +39 -32
  551. package/src/core/color/xyz/hpe_to_xyz.d.ts +24 -0
  552. package/src/core/color/xyz/hpe_to_xyz.d.ts.map +1 -0
  553. package/src/core/color/xyz/hpe_to_xyz.js +39 -0
  554. package/src/core/color/xyz/rgb_to_xyz.d.ts +17 -2
  555. package/src/core/color/xyz/rgb_to_xyz.d.ts.map +1 -1
  556. package/src/core/color/xyz/rgb_to_xyz.js +44 -18
  557. package/src/core/color/xyz/xyz_cmf_tabulated.d.ts.map +1 -1
  558. package/src/core/color/xyz/xyz_cmf_tabulated.js +217 -211
  559. package/src/core/color/xyz/xyz_cmf_wyman.d.ts +4 -0
  560. package/src/core/color/xyz/xyz_cmf_wyman.d.ts.map +1 -1
  561. package/src/core/color/xyz/xyz_cmf_wyman.js +74 -65
  562. package/src/core/color/xyz/xyz_to_hpe.d.ts +18 -0
  563. package/src/core/color/xyz/xyz_to_hpe.d.ts.map +1 -0
  564. package/src/core/color/xyz/xyz_to_hpe.js +33 -0
  565. package/src/core/color/xyz/xyz_to_rgb.d.ts +17 -2
  566. package/src/core/color/xyz/xyz_to_rgb.d.ts.map +1 -1
  567. package/src/core/color/xyz/xyz_to_rgb.js +39 -16
  568. package/src/core/color/ycxcz/xyz_to_ycxcz.d.ts +7 -2
  569. package/src/core/color/ycxcz/xyz_to_ycxcz.d.ts.map +1 -1
  570. package/src/core/color/ycxcz/xyz_to_ycxcz.js +33 -28
  571. package/src/core/events/signal/Signal.js +820 -820
  572. package/src/core/math/clamp_index.d.ts +18 -0
  573. package/src/core/math/clamp_index.d.ts.map +1 -0
  574. package/src/core/math/clamp_index.js +23 -0
  575. package/src/engine/asset/loaders/image/IMAGE_CODEC_REVIEW_2026_08_28.md +803 -0
  576. package/src/engine/asset/loaders/image/jpeg/JpegFrame.d.ts +5 -3
  577. package/src/engine/asset/loaders/image/jpeg/JpegFrame.d.ts.map +1 -1
  578. package/src/engine/asset/loaders/image/jpeg/JpegFrame.js +5 -3
  579. package/src/engine/asset/loaders/image/jpeg/JpegFrameComponent.d.ts +2 -1
  580. package/src/engine/asset/loaders/image/jpeg/JpegFrameComponent.d.ts.map +1 -1
  581. package/src/engine/asset/loaders/image/jpeg/JpegFrameComponent.js +2 -1
  582. package/src/engine/asset/loaders/image/jpeg/JpegImage.d.ts +17 -0
  583. package/src/engine/asset/loaders/image/jpeg/JpegImage.d.ts.map +1 -1
  584. package/src/engine/asset/loaders/image/jpeg/JpegImage.js +197 -157
  585. package/src/engine/asset/loaders/image/jpeg/idct8x8_float.d.ts +0 -1
  586. package/src/engine/asset/loaders/image/jpeg/idct8x8_float.d.ts.map +1 -1
  587. package/src/engine/asset/loaders/image/jpeg/idct8x8_float.js +0 -1
  588. package/src/engine/asset/loaders/image/jpeg/jpeg_component_row.d.ts +28 -0
  589. package/src/engine/asset/loaders/image/jpeg/jpeg_component_row.d.ts.map +1 -0
  590. package/src/engine/asset/loaders/image/jpeg/jpeg_component_row.js +31 -0
  591. package/src/engine/asset/loaders/image/png/PNG.d.ts +3 -18
  592. package/src/engine/asset/loaders/image/png/PNG.d.ts.map +1 -1
  593. package/src/engine/asset/loaders/image/png/PNG.js +3 -139
  594. package/src/engine/asset/loaders/image/png/PNGReader.d.ts +16 -16
  595. package/src/engine/asset/loaders/image/png/PNGReader.d.ts.map +1 -1
  596. package/src/engine/asset/loaders/image/png/PNGReader.js +143 -160
  597. package/src/engine/asset/loaders/image/png/chunk/png_chunk_decode_iTXt.js +3 -3
  598. package/src/engine/asset/loaders/image/png/chunk/png_chunk_decode_zTXt.js +3 -3
  599. package/src/engine/asset/loaders/image/png/crc32.d.ts +1 -15
  600. package/src/engine/asset/loaders/image/png/crc32.d.ts.map +1 -1
  601. package/src/engine/asset/loaders/image/png/crc32.js +5 -89
  602. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterNone.d.ts +12 -10
  603. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterNone.d.ts.map +1 -1
  604. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterNone.js +20 -45
  605. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterSub.d.ts +2 -1
  606. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterSub.d.ts.map +1 -1
  607. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterSub.js +2 -0
  608. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterUp.d.ts +2 -1
  609. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterUp.d.ts.map +1 -1
  610. package/src/engine/asset/loaders/image/png/filter/png_filter_unFilterUp.js +2 -0
  611. package/src/engine/asset/loaders/image/png/filter/png_unfilter.d.ts +22 -0
  612. package/src/engine/asset/loaders/image/png/filter/png_unfilter.d.ts.map +1 -0
  613. package/src/engine/asset/loaders/image/png/filter/png_unfilter.js +68 -0
  614. package/src/engine/asset/loaders/image/png/png_inflate.d.ts +20 -0
  615. package/src/engine/asset/loaders/image/png/png_inflate.d.ts.map +1 -0
  616. package/src/engine/asset/loaders/image/png/png_inflate.js +85 -0
  617. package/src/engine/asset/loaders/image/png/png_unpack_samples.d.ts +22 -0
  618. package/src/engine/asset/loaders/image/png/png_unpack_samples.d.ts.map +1 -0
  619. package/src/engine/asset/loaders/image/png/png_unpack_samples.js +38 -0
  620. package/src/engine/graphics/ecs/sprite/SpriteSystemPE.d.ts.map +1 -1
  621. package/src/engine/graphics/ecs/sprite/SpriteSystemPE.js +135 -132
  622. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts +16 -3
  623. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts.map +1 -1
  624. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +1157 -1149
  625. package/src/engine/graphics/render/frame_graph/FrameGraph.js +900 -900
  626. package/src/engine/physics/ecs/PhysicsSystem.d.ts +72 -81
  627. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  628. package/src/engine/physics/ecs/PhysicsSystem.js +86 -77
  629. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  630. package/src/shade/device/IMMEDIATE_DATA_PLAN_2026_08_28.md +451 -0
  631. package/src/shade/device/timing/GPU_PROFILER_PROPOSAL_2026_08_28.md +625 -0
  632. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  633. package/src/shade/renderer/rasterize/native/oit/shader_oit_blend.d.ts.map +1 -1
  634. package/src/shade/renderer/rasterize/native/oit/shader_oit_blend.js +5 -4
  635. package/src/shade/renderer/scene/serialization/decode_image_source_hdr.d.ts +14 -3
  636. package/src/shade/renderer/scene/serialization/decode_image_source_hdr.d.ts.map +1 -1
  637. package/src/shade/renderer/scene/serialization/decode_image_source_hdr.js +50 -51
  638. package/src/shade/renderer/scene/serialization/deserialize_scene.d.ts.map +1 -1
  639. package/src/shade/renderer/scene/serialization/deserialize_scene.js +531 -521
  640. package/src/shade/renderer/scene/serialization/write_image_source.d.ts.map +1 -1
  641. package/src/shade/renderer/scene/serialization/write_image_source.js +6 -4
  642. package/src/shade/renderer/shader/chunk/color/chunk_rgb_to_luminance.d.ts.map +1 -1
  643. package/src/shade/renderer/shader/chunk/color/chunk_rgb_to_luminance.js +34 -32
  644. package/src/shade/renderer/shader/chunk/color/iCtCp/chunk_eotf_st2084.d.ts +31 -0
  645. package/src/shade/renderer/shader/chunk/color/iCtCp/chunk_eotf_st2084.d.ts.map +1 -1
  646. package/src/shade/renderer/shader/chunk/color/iCtCp/chunk_eotf_st2084.js +62 -31
  647. package/src/shade/renderer/shader/chunk/color/iCtCp/chunk_inverse_eotf_st2084.d.ts +10 -0
  648. package/src/shade/renderer/shader/chunk/color/iCtCp/chunk_inverse_eotf_st2084.d.ts.map +1 -1
  649. package/src/shade/renderer/shader/chunk/color/iCtCp/chunk_inverse_eotf_st2084.js +32 -22
  650. package/src/shade/renderer/shader/chunk/color/sRGB/chunk_sRGBTransferOETF.d.ts.map +1 -1
  651. package/src/shade/renderer/shader/chunk/color/sRGB/chunk_sRGBTransferOETF.js +22 -21
  652. package/src/shade/renderer/shader/chunk/color/tonemap/gt7/chunk_tonemap_gt7.d.ts +6 -0
  653. package/src/shade/renderer/shader/chunk/color/tonemap/gt7/chunk_tonemap_gt7.d.ts.map +1 -1
  654. package/src/shade/renderer/shader/chunk/color/tonemap/gt7/chunk_tonemap_gt7.js +110 -104
  655. package/src/shade/renderer/shader/chunk/color/xyz/chunk_rgb_to_xyz.d.ts.map +1 -1
  656. package/src/shade/renderer/shader/chunk/color/xyz/chunk_rgb_to_xyz.js +23 -21
  657. package/src/shade/renderer/shader/chunk/math/chunk_magnitude_floor.d.ts +9 -0
  658. package/src/shade/renderer/shader/chunk/math/chunk_magnitude_floor.d.ts.map +1 -0
  659. package/src/shade/renderer/shader/chunk/math/chunk_magnitude_floor.js +16 -0
  660. package/src/shade/renderer/shader/chunk/math/complex/chunk_complex_magnitude_floor.d.ts +10 -0
  661. package/src/shade/renderer/shader/chunk/math/complex/chunk_complex_magnitude_floor.d.ts.map +1 -0
  662. package/src/shade/renderer/shader/chunk/math/complex/chunk_complex_magnitude_floor.js +17 -0
  663. package/src/shade/renderer/shader/chunk/math/complex/chunk_complex_solve_cubic_blinn.d.ts.map +1 -1
  664. package/src/shade/renderer/shader/chunk/math/complex/chunk_complex_solve_cubic_blinn.js +7 -1
  665. package/src/shade/renderer/shader/chunk/math/complex/chunk_complex_square_root.d.ts.map +1 -1
  666. package/src/shade/renderer/shader/chunk/math/complex/chunk_complex_square_root.js +9 -3
  667. package/src/shade/renderer/shader/chunk/math/polynomial/chunk_solve_cubic.d.ts.map +1 -1
  668. package/src/shade/renderer/shader/chunk/math/polynomial/chunk_solve_cubic.js +13 -7
  669. package/src/shade/renderer/shader/chunk/math/polynomial/chunk_solve_cubic_blinn_smallest.d.ts.map +1 -1
  670. package/src/shade/renderer/shader/chunk/math/polynomial/chunk_solve_cubic_blinn_smallest.js +13 -4
  671. package/src/shade/renderer/shader/chunk/math/polynomial/chunk_solve_quadratic.d.ts.map +1 -1
  672. package/src/shade/renderer/shader/chunk/math/polynomial/chunk_solve_quadratic.js +20 -13
  673. package/src/shade/renderer/shader/chunk/math/polynomial/chunk_solve_quartic_neumark.d.ts.map +1 -1
  674. package/src/shade/renderer/shader/chunk/math/polynomial/chunk_solve_quartic_neumark.js +8 -4
  675. package/src/shade/renderer/shader/chunk/mboit/NOTES.md +35 -1
  676. package/src/shade/renderer/shader/chunk/mboit/moments/geometric/chunk_compute_transmittance_from_2_trigonometric_moments.d.ts.map +1 -1
  677. package/src/shade/renderer/shader/chunk/mboit/moments/geometric/chunk_compute_transmittance_from_2_trigonometric_moments.js +18 -5
  678. package/src/shade/renderer/shader/chunk/mboit/moments/geometric/chunk_compute_transmittance_from_3_trigonometric_moments.d.ts.map +1 -1
  679. package/src/shade/renderer/shader/chunk/mboit/moments/geometric/chunk_compute_transmittance_from_3_trigonometric_moments.js +21 -8
  680. package/src/shade/renderer/shader/chunk/mboit/moments/geometric/chunk_compute_transmittance_from_4_trigonometric_moments.d.ts.map +1 -1
  681. package/src/shade/renderer/shader/chunk/mboit/moments/geometric/chunk_compute_transmittance_from_4_trigonometric_moments.js +25 -12
  682. package/src/shade/renderer/shader/chunk/mboit/moments/geometric/chunk_generate_trigonometric_moments_4.d.ts +6 -2
  683. package/src/shade/renderer/shader/chunk/mboit/moments/geometric/chunk_generate_trigonometric_moments_4.d.ts.map +1 -1
  684. package/src/shade/renderer/shader/chunk/mboit/moments/geometric/chunk_generate_trigonometric_moments_4.js +42 -35
  685. package/src/shade/renderer/shader/chunk/mboit/moments/power/chunk_compute_transmittance_from_4_power_moments.d.ts.map +1 -1
  686. package/src/shade/renderer/shader/chunk/mboit/moments/power/chunk_compute_transmittance_from_4_power_moments.js +18 -5
  687. package/src/shade/renderer/shader/chunk/mboit/moments/power/chunk_compute_transmittance_from_6_power_moments.d.ts.map +1 -1
  688. package/src/shade/renderer/shader/chunk/mboit/moments/power/chunk_compute_transmittance_from_6_power_moments.js +24 -9
  689. package/src/shade/renderer/shader/chunk/mboit/moments/power/chunk_compute_transmittance_from_8_power_moments.d.ts.map +1 -1
  690. package/src/shade/renderer/shader/chunk/mboit/moments/power/chunk_compute_transmittance_from_8_power_moments.js +29 -13
  691. package/src/shade/renderer/shader/chunk/mboit/moments/power/chunk_generate_power_moments_4.d.ts +12 -0
  692. package/src/shade/renderer/shader/chunk/mboit/moments/power/chunk_generate_power_moments_4.d.ts.map +1 -1
  693. package/src/shade/renderer/shader/chunk/mboit/moments/power/chunk_generate_power_moments_4.js +38 -48
  694. package/src/view/elements/ColorPickerView.js +296 -296
  695. package/src/avif/codec/dec/Readme.md +0 -14
  696. package/src/avif/codec/dec/avif_dec.cpp +0 -234
  697. package/src/avif/codec/dec/avif_dec.d.ts +0 -3
  698. package/src/avif/codec/dec/avif_dec.d.ts.map +0 -1
  699. package/src/avif/codec/dec/avif_dec.js +0 -16
  700. package/src/avif/codec/dec/avif_dec.wasm +0 -0
  701. package/src/avif/codec/enc/README.md +0 -37
  702. package/src/avif/codec/enc/avif_enc.cpp +0 -216
  703. package/src/avif/codec/enc/avif_enc.d.ts +0 -3
  704. package/src/avif/codec/enc/avif_enc.d.ts.map +0 -1
  705. package/src/avif/codec/enc/avif_enc.js +0 -6144
  706. package/src/avif/codec/enc/avif_enc.wasm +0 -0
  707. package/src/avif/codec/enc/avif_enc_mt.d.ts +0 -3
  708. package/src/avif/codec/enc/avif_enc_mt.d.ts.map +0 -1
  709. package/src/avif/codec/enc/avif_enc_mt.js +0 -6811
  710. package/src/avif/codec/enc/avif_enc_mt.wasm +0 -0
  711. package/src/avif/codec/enc/avif_enc_mt.worker.d.mts +0 -2
  712. package/src/avif/codec/enc/avif_enc_mt.worker.d.mts.map +0 -1
  713. package/src/avif/codec/enc/avif_enc_mt.worker.d.ts +0 -11
  714. package/src/avif/codec/enc/avif_enc_mt.worker.d.ts.map +0 -1
  715. package/src/avif/codec/enc/avif_enc_mt.worker.js +0 -171
  716. package/src/avif/codec/enc/avif_enc_mt.worker.mjs +0 -1
  717. package/src/avif/decode.d.ts +0 -3
  718. package/src/avif/decode.d.ts.map +0 -1
  719. package/src/avif/decode.js +0 -42
  720. package/src/avif/encode.d.ts +0 -3
  721. package/src/avif/encode.d.ts.map +0 -1
  722. package/src/avif/encode.js +0 -75
  723. package/src/avif/meta.d.ts +0 -24
  724. package/src/avif/meta.d.ts.map +0 -1
  725. package/src/avif/meta.js +0 -23
  726. package/src/avif/tsconfig.tsbuildinfo +0 -1
  727. package/src/avif/utils.d.ts +0 -17
  728. package/src/avif/utils.d.ts.map +0 -1
  729. package/src/avif/utils.js +0 -31
  730. package/src/engine/asset/loaders/image/jpeg/idct8x8_fixed.d.ts +0 -23
  731. package/src/engine/asset/loaders/image/jpeg/idct8x8_fixed.d.ts.map +0 -1
  732. package/src/engine/asset/loaders/image/jpeg/idct8x8_fixed.js +0 -214
  733. package/src/engine/asset/loaders/image/png/inflate.d.ts +0 -7
  734. package/src/engine/asset/loaders/image/png/inflate.d.ts.map +0 -1
  735. package/src/engine/asset/loaders/image/png/inflate.js +0 -20
@@ -1,21 +1,23 @@
1
- import { CodeChunk } from "../../../compiler/CodeChunk.js";
2
-
3
- /**
4
- * Transforms an RGB color in Rec.709 to CIE XYZ.
5
- * @type {CodeChunk}
6
- */
7
- export const chunk_rgb_to_xyz = CodeChunk.from(
8
- //language=WGSL
9
- `
10
- fn rgb_to_xyz(c: vec3<f32>) -> vec3<f32>{
11
- const M = mat3x3(
12
- 0.4123907992659595, 0.3575843393838780, 0.1804807884018343,
13
- 0.2126390058715104, 0.7151686787677559, 0.0721923153607337,
14
- 0.0193308187155918, 0.1191947797946259, 0.9505321522496608
15
- );
16
-
17
- return c * M;
18
- }
19
- `
20
- );
21
-
1
+ import { CodeChunk } from "../../../compiler/CodeChunk.js";
2
+
3
+ /**
4
+ * Transforms an RGB color in Rec.709 to CIE XYZ.
5
+ * @type {CodeChunk}
6
+ */
7
+ export const chunk_rgb_to_xyz = CodeChunk.from(
8
+ //language=WGSL
9
+ `
10
+ fn rgb_to_xyz(c: vec3<f32>) -> vec3<f32>{
11
+ // the same matrix as core/color/xyz/rgb_to_xyz.js, digit for digit; the middle row is
12
+ // REC709_LUMINANCE_R/G/B from core/color/REC709_PRIMARIES.js
13
+ const M = mat3x3(
14
+ 0.41239079926595948129, 0.35758433938387796373, 0.18048078840183428751,
15
+ 0.21263900587151035754, 0.71516867876775592746, 0.07219231536073371500,
16
+ 0.01933081871559185069, 0.11919477979462598791, 0.95053215224966058086
17
+ );
18
+
19
+ return c * M;
20
+ }
21
+ `
22
+ );
23
+
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Sign-preserving lower bound on magnitude: |result| >= eps, sign kept (zero counts as
3
+ * positive). For divisors that legitimately pass through zero — the quotient stays finite
4
+ * and keeps its direction as the divisor shrinks.
5
+ * @type {CodeChunk}
6
+ */
7
+ export const chunk_magnitude_floor: CodeChunk;
8
+ import { CodeChunk } from "../../compiler/CodeChunk.js";
9
+ //# sourceMappingURL=chunk_magnitude_floor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk_magnitude_floor.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/shader/chunk/math/chunk_magnitude_floor.js"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,oCAFU,SAAS,CASjB;0BAfwB,6BAA6B"}
@@ -0,0 +1,16 @@
1
+ import { CodeChunk } from "../../compiler/CodeChunk.js";
2
+
3
+ /**
4
+ * Sign-preserving lower bound on magnitude: |result| >= eps, sign kept (zero counts as
5
+ * positive). For divisors that legitimately pass through zero — the quotient stays finite
6
+ * and keeps its direction as the divisor shrinks.
7
+ * @type {CodeChunk}
8
+ */
9
+ export const chunk_magnitude_floor = CodeChunk.from(
10
+ //language=WGSL
11
+ `
12
+ fn magnitude_floor(x: f32, eps: f32) -> f32 {
13
+ return select(min(x, -eps), max(x, eps), x >= 0.0);
14
+ }
15
+ `
16
+ );
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Lower bound on the magnitude of a complex number: a value with |z| < eps is snapped to
3
+ * the real value (eps, 0). The direction of a vanishing complex number is numerical noise,
4
+ * so only the magnitude needs preserving. For divisors and normalizers that legitimately
5
+ * pass through zero.
6
+ * @type {CodeChunk}
7
+ */
8
+ export const chunk_complex_magnitude_floor: CodeChunk;
9
+ import { CodeChunk } from "../../../compiler/CodeChunk.js";
10
+ //# sourceMappingURL=chunk_complex_magnitude_floor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk_complex_magnitude_floor.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/shader/chunk/math/complex/chunk_complex_magnitude_floor.js"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,4CAFU,SAAS,CASjB;0BAhBwB,gCAAgC"}
@@ -0,0 +1,17 @@
1
+ import { CodeChunk } from "../../../compiler/CodeChunk.js";
2
+
3
+ /**
4
+ * Lower bound on the magnitude of a complex number: a value with |z| < eps is snapped to
5
+ * the real value (eps, 0). The direction of a vanishing complex number is numerical noise,
6
+ * so only the magnitude needs preserving. For divisors and normalizers that legitimately
7
+ * pass through zero.
8
+ * @type {CodeChunk}
9
+ */
10
+ export const chunk_complex_magnitude_floor = CodeChunk.from(
11
+ //language=WGSL
12
+ `
13
+ fn complex_magnitude_floor(z: vec2<f32>, eps: f32) -> vec2<f32> {
14
+ return select(z, vec2<f32>(eps, 0.0), dot(z, z) < eps * eps);
15
+ }
16
+ `
17
+ );
@@ -1 +1 @@
1
- {"version":3,"file":"chunk_complex_solve_cubic_blinn.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/shader/chunk/math/complex/chunk_complex_solve_cubic_blinn.js"],"names":[],"mappings":"AAOA;;;;;GAKG;AACH,8CAFU,SAAS,CAoEjB;0BA/EwB,gCAAgC"}
1
+ {"version":3,"file":"chunk_complex_solve_cubic_blinn.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/shader/chunk/math/complex/chunk_complex_solve_cubic_blinn.js"],"names":[],"mappings":"AAQA;;;;;GAKG;AACH,8CAFU,SAAS,CAyEjB;0BArFwB,gCAAgC"}
@@ -1,5 +1,6 @@
1
1
  import { CodeChunk } from "../../../compiler/CodeChunk.js";
2
2
  import { chunk_complex_cubic_root } from "./chunk_complex_cubic_root.js";
3
+ import { chunk_complex_magnitude_floor } from "./chunk_complex_magnitude_floor.js";
3
4
  import { chunk_complex_multiply } from "./chunk_complex_multiply.js";
4
5
  import { chunk_complex_reciprocal } from "./chunk_complex_reciprocal.js";
5
6
  import { chunk_complex_square } from "./chunk_complex_square.js";
@@ -45,7 +46,11 @@ fn complex_solve_cubic_blinn(
45
46
  // faceforward: force discriminant_root OPPOSITE to depressed_d so the subtraction below adds
46
47
  // magnitudes (avoids catastrophic cancellation). The sign was inverted vs the HLSL reference.
47
48
  let discriminant_root_adj = select(discriminant_root, -discriminant_root, dot(discriminant_root, depressed_d) >= 0.0);
48
- let cubed_root = discriminant_root_adj - depressed_d;
49
+ // cubed_root vanishes at a triple root, its cubic root with it, and the reciprocal
50
+ // below would then be inf/NaN. The snap keeps the reciprocal finite while
51
+ // depressed_c also vanishes there, so the roots still collapse to the correct
52
+ // limit -b_third.
53
+ let cubed_root = complex_magnitude_floor(discriminant_root_adj - depressed_d, 1e-20);
49
54
  let first_root = complex_cubic_root(0.5 * cubed_root);
50
55
 
51
56
  let cubic_roots = array<vec2<f32>, 3>(
@@ -76,5 +81,6 @@ fn complex_solve_cubic_blinn(
76
81
  chunk_complex_cubic_root,
77
82
  chunk_complex_multiply,
78
83
  chunk_complex_reciprocal,
84
+ chunk_complex_magnitude_floor,
79
85
  ]
80
86
  );
@@ -1 +1 @@
1
- {"version":3,"file":"chunk_complex_square_root.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/shader/chunk/math/complex/chunk_complex_square_root.js"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,wCAFU,SAAS,CAajB;0BArBwB,gCAAgC"}
1
+ {"version":3,"file":"chunk_complex_square_root.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/shader/chunk/math/complex/chunk_complex_square_root.js"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,wCAFU,SAAS,CAkBjB;0BA3BwB,gCAAgC"}
@@ -1,4 +1,5 @@
1
1
  import { CodeChunk } from "../../../compiler/CodeChunk.js";
2
+ import { chunk_complex_magnitude_floor } from "./chunk_complex_magnitude_floor.js";
2
3
  import { chunk_complex_square_root_unsafe } from "./chunk_complex_square_root_unsafe.js";
3
4
 
4
5
  /**
@@ -12,11 +13,16 @@ export const chunk_complex_square_root = CodeChunk.from(
12
13
  //language=WGSL
13
14
  `
14
15
  fn complex_square_root(z: vec2<f32>) -> vec2<f32>{
15
- let z_positive_real_part = vec2<f32>(abs(z.x), z.y);
16
+ // The unsafe kernel evaluates 0 * inverseSqrt(0) = NaN at z = 0 — and a vanishing
17
+ // discriminant (a double root) lands exactly there. The snap degrades a double root
18
+ // into a pair 1e-10 apart instead of poisoning both.
19
+ let z_safe = complex_magnitude_floor(z, 1e-20);
20
+ let z_positive_real_part = vec2<f32>(abs(z_safe.x), z_safe.y);
16
21
  let computed_root = complex_square_root_unsafe(z_positive_real_part);
17
- return select(computed_root.yx, computed_root, z.x >= 0.0);
22
+ return select(computed_root.yx, computed_root, z_safe.x >= 0.0);
18
23
  }
19
24
  `, [
20
- chunk_complex_square_root_unsafe
25
+ chunk_complex_square_root_unsafe,
26
+ chunk_complex_magnitude_floor
21
27
  ]
22
28
  );
@@ -1 +1 @@
1
- {"version":3,"file":"chunk_solve_cubic.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/shader/chunk/math/polynomial/chunk_solve_cubic.js"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,gCAFU,SAAS,CA2CjB;0BAnDwB,gCAAgC"}
1
+ {"version":3,"file":"chunk_solve_cubic.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/shader/chunk/math/polynomial/chunk_solve_cubic.js"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AACH,gCAFU,SAAS,CAgDjB;0BAzDwB,gCAAgC"}
@@ -1,4 +1,5 @@
1
1
  import { CodeChunk } from "../../../compiler/CodeChunk.js";
2
+ import { chunk_safe_sqrt } from "../chunk_safe_sqrt.js";
2
3
 
3
4
  /**
4
5
  * Code taken from the blog "Moments in Graphics" by Christoph Peters.
@@ -34,19 +35,24 @@ fn solve_cubic(coefficient: vec4<f32>) -> vec3<f32> {
34
35
  delta.x
35
36
  );
36
37
 
37
- // Take the cubic root of a normalized complex number
38
- let theta = atan2(sqrt(discriminant), -depressed.x) / 3.0;
38
+ // Take the cubic root of a normalized complex number.
39
+ // Both radicands are >= 0 whenever the promised three real roots exist; rounding can
40
+ // push either across zero near a repeated root, and sqrt would then poison every root
41
+ // with NaN.
42
+ let theta = atan2(safe_sqrt(discriminant), -depressed.x) / 3.0;
39
43
  let cubic_root = vec2<f32>(cos(theta), sin(theta));
40
-
41
- // Compute the three roots, scale appropriately and
44
+
45
+ // Compute the three roots, scale appropriately and
42
46
  // revert the depression transform
43
47
  let root = vec3<f32>(
44
48
  cubic_root.x,
45
49
  dot(vec2<f32>(-0.5, -0.5 * sqrt(3.0)), cubic_root),
46
50
  dot(vec2<f32>(-0.5, 0.5 * sqrt(3.0)), cubic_root)
47
51
  );
48
-
49
- return 2.0 * sqrt(-depressed.y) * root + vec3<f32>(-coeff.z);
52
+
53
+ return 2.0 * safe_sqrt(-depressed.y) * root + vec3<f32>(-coeff.z);
50
54
  }
51
- `
55
+ `, [
56
+ chunk_safe_sqrt
57
+ ]
52
58
  );
@@ -1 +1 @@
1
- {"version":3,"file":"chunk_solve_cubic_blinn_smallest.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/shader/chunk/math/polynomial/chunk_solve_cubic_blinn_smallest.js"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,+CAFU,SAAS,CAqCjB;0BA5CwB,gCAAgC"}
1
+ {"version":3,"file":"chunk_solve_cubic_blinn_smallest.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/shader/chunk/math/polynomial/chunk_solve_cubic_blinn_smallest.js"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,+CAFU,SAAS,CA4CjB;0BArDwB,gCAAgC"}
@@ -1,4 +1,6 @@
1
1
  import { CodeChunk } from "../../../compiler/CodeChunk.js";
2
+ import { chunk_magnitude_floor } from "../chunk_magnitude_floor.js";
3
+ import { chunk_safe_sqrt } from "../chunk_safe_sqrt.js";
2
4
 
3
5
  /**
4
6
  * Given coefficients of a cubic polynomial
@@ -26,9 +28,11 @@ fn solve_cubic_blinn_smallest(coeffs: vec4<f32>) -> f32 {
26
28
  delta.z,
27
29
  -coeff.x * delta.y + 2.0 * coeff.y * delta.z
28
30
  );
29
- let theta = abs(atan2(coeff.x * sqrt(discriminant), -depressed.y)) / 3.0;
31
+ // Both radicands are >= 0 whenever the promised three real roots exist; rounding can
32
+ // push either across zero near a repeated root, and sqrt would then return NaN.
33
+ let theta = abs(atan2(coeff.x * safe_sqrt(discriminant), -depressed.y)) / 3.0;
30
34
  let sin_cos = vec2<f32>(sin(theta), cos(theta));
31
- let tmp = 2.0 * sqrt(-depressed.x);
35
+ let tmp = 2.0 * safe_sqrt(-depressed.x);
32
36
  let x = vec2<f32>(
33
37
  tmp * sin_cos.y,
34
38
  tmp * (-0.5 * sin_cos.y - 0.5 * sqrt(3.0) * sin_cos.x)
@@ -39,7 +43,12 @@ fn solve_cubic_blinn_smallest(coeffs: vec4<f32>) -> f32 {
39
43
  x.x + x.y < 2.0 * coeff.y
40
44
  );
41
45
 
42
- return s.x / s.y;
46
+ // s.y reaches 0 only when the smallest root escapes to infinity; keep it
47
+ // huge-but-finite rather than inf/NaN.
48
+ return s.x / magnitude_floor(s.y, 1e-10);
43
49
  }
44
- `
50
+ `, [
51
+ chunk_safe_sqrt,
52
+ chunk_magnitude_floor
53
+ ]
45
54
  );
@@ -1 +1 @@
1
- {"version":3,"file":"chunk_solve_quadratic.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/shader/chunk/math/polynomial/chunk_solve_quadratic.js"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,oCAFU,SAAS,CA+BjB;0BArCwB,gCAAgC"}
1
+ {"version":3,"file":"chunk_solve_quadratic.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/shader/chunk/math/polynomial/chunk_solve_quadratic.js"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,oCAFU,SAAS,CAqCjB;0BA5CwB,gCAAgC"}
@@ -1,4 +1,5 @@
1
1
  import { CodeChunk } from "../../../compiler/CodeChunk.js";
2
+ import { chunk_safe_sqrt } from "../chunk_safe_sqrt.js";
2
3
 
3
4
  /**
4
5
  * Given coefficients of a quadratic polynomial A*x^2+B*x+C, this function
@@ -13,27 +14,33 @@ fn solve_quadratic(coeffs: vec3<f32>) -> vec2<f32>{
13
14
  let a = coeffs[0];
14
15
  let b = coeffs[1] * 0.5;
15
16
  let c = coeffs[2];
16
-
17
+
17
18
  var x1: f32;
18
19
  var x2: f32;
19
-
20
- let tmp_discriminant = b * b - a * c;
21
- let tmp = sqrt(tmp_discriminant);
22
-
20
+
21
+ // >= 0 whenever the promised two real roots exist; rounding can cross zero at a
22
+ // double root.
23
+ let tmp = safe_sqrt(b * b - a * c);
24
+
25
+ // The citardauq denominators are >= 0 in their branches, and reach 0 only for a
26
+ // double root at x = 0 (b = tmp = 0 forces c = 0), where the division becomes
27
+ // 0/0 = NaN. The floor turns that root into an exact 0.
23
28
  if (b >= 0.0) {
24
-
25
- x1 = (-c) / (b + tmp);
29
+
30
+ x1 = (-c) / max(b + tmp, 1e-20);
26
31
  x2 = (-b - tmp) / a;
27
-
32
+
28
33
  } else {
29
-
34
+
30
35
  x1 = (-b + tmp) / a;
31
- x2 = c / (-b + tmp);
32
-
36
+ x2 = c / max(-b + tmp, 1e-20);
37
+
33
38
  }
34
-
39
+
35
40
  return vec2<f32>(x1, x2);
36
41
  }
37
- `
42
+ `, [
43
+ chunk_safe_sqrt
44
+ ]
38
45
  );
39
46
 
@@ -1 +1 @@
1
- {"version":3,"file":"chunk_solve_quartic_neumark.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/shader/chunk/math/polynomial/chunk_solve_quartic_neumark.js"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,0CAFU,SAAS,CAiEjB;0BA1EwB,gCAAgC"}
1
+ {"version":3,"file":"chunk_solve_quartic_neumark.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/shader/chunk/math/polynomial/chunk_solve_quartic_neumark.js"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,0CAFU,SAAS,CAqEjB;0BA9EwB,gCAAgC"}
@@ -41,11 +41,15 @@ fn solve_quartic_neumark(coeffs: array<f32, 5>) -> vec4<f32> {
41
41
  var h: f32;
42
42
  var h_small: f32;
43
43
 
44
- // Compute the coefficients of the quadratics adaptively using the two
45
- // proposed factorizations by Neumark. Choose the appropriate
44
+ // Compute the coefficients of the quadratics adaptively using the two
45
+ // proposed factorizations by Neumark. Choose the appropriate
46
46
  // factorizations using the heuristic proposed by Herbison-Evans.
47
+ // Either radicand is >= 0 whenever the promised four real roots exist, and rounding
48
+ // can push it across zero near a repeated root; tmp also divides the linear terms, so
49
+ // it is floored to stay real AND nonzero — a paired root degrades into two roots a
50
+ // hair apart instead of an inf/NaN cascade.
47
51
  if (y < 0.0 || (zz + f_e) * bb_fy > zz_f_e * (bb + fy)) {
48
- let tmp = sqrt(bb_fy);
52
+ let tmp = sqrt(max(bb_fy, 1e-20));
49
53
  g = (b + tmp) * 0.5;
50
54
  g_small = (b - tmp) * 0.5;
51
55
 
@@ -53,7 +57,7 @@ fn solve_quartic_neumark(coeffs: array<f32, 5>) -> vec4<f32> {
53
57
  h = z * 0.5 + tmp2;
54
58
  h_small = z * 0.5 - tmp2;
55
59
  } else {
56
- let tmp = sqrt(zz_f_e);
60
+ let tmp = sqrt(max(zz_f_e, 1e-20));
57
61
  h = (z + tmp) * 0.5;
58
62
  h_small = (z - tmp) * 0.5;
59
63
 
@@ -1,4 +1,38 @@
1
1
  Alan Wake 2 talk references moment-based OIT, they used it due to simplicity of implementation and integration.
2
2
 
3
3
  * https://github.com/fedoriusv/V3DGameEngine/blob/1f3ef7ad93ee023dfb8f00518f40e55a46b68fe4/Engine/Data/Shaders/transparency_mboit.hlsl#L244
4
- * https://github.com/AlicesoftHumika/UnityOIT/blob/612c3c04263acb22980f33fa3cb2d3653ed389ff/Assets/Shader/MBOIT/MomentOIT.hlsli#L123
4
+ * https://github.com/AlicesoftHumika/UnityOIT/blob/612c3c04263acb22980f33fa3cb2d3653ed389ff/Assets/Shader/MBOIT/MomentOIT.hlsli#L123
5
+
6
+ ## Numerical guards
7
+
8
+ The reference HLSL divides by quantities that legitimately reach zero; the live
9
+ 4-power-moment chunk guards its inline quadratic (magnitude clamp on `c[2]`, discriminant
10
+ floor, citardauq root recovery), and the unused 6/8-power and trigonometric variants carry
11
+ the same treatment so they are safe to wire up later:
12
+
13
+ * Deflated-polynomial leading coefficients are clamped through `magnitude_floor` /
14
+ `complex_magnitude_floor` at 1e-4 **of the largest lower coefficient** before entering a
15
+ root solver. The ratio is a range budget, not a precision limit: the solvers normalize
16
+ by the leading coefficient, and normalized coefficients <= ~1e4 keep every solver
17
+ intermediate inside f32 range even when the pivot scaling has amplified the whole
18
+ vector, while the escaped support point out at ~1e4 carries negligible weight in the
19
+ reconstruction.
20
+ * Divided-difference denominators (support-point separations) are floored at the same
21
+ 1e-4 — coincident support points otherwise produce 0/0 = NaN.
22
+ * Solver-internal radicands that are non-negative under the "all real roots" contract are
23
+ floored (`safe_sqrt`, or `max(x, 1e-20)` where the root also divides, as in Neumark's
24
+ `tmp`) — rounding pushes them across zero near repeated roots.
25
+ * `complex_square_root` snaps `|z| < 1e-20` to `(1e-20, 0)`: the unsafe kernel evaluates
26
+ `0 * inverseSqrt(0) = NaN` at zero, exactly where a double root lands.
27
+ `complex_solve_cubic_blinn` snaps its `cubed_root` the same way (triple root).
28
+
29
+ The generate chunks (power and trigonometric) return the fragment's raw contribution as a
30
+ struct; summing belongs to additive blending. The reference's quantized-storage variant
31
+ (quantize + normalize + offset against the already-accumulated moments, an ROV) is
32
+ deliberately not ported — it cannot be expressed through additive blending.
33
+
34
+ Specs sit next to the chunks. The division singularities are pinned with exactly-singular
35
+ dyadic moment vectors, because the WGSL emulator computes in f64 — inputs must collapse
36
+ the leading coefficient to exactly 0.0, not merely near it. The emulator also does not
37
+ propagate writes through pointer-to-scalar parameters, which is why the generate chunks
38
+ return structs instead of filling scalar out-parameters.
@@ -1 +1 @@
1
- {"version":3,"file":"chunk_compute_transmittance_from_2_trigonometric_moments.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/shade/renderer/shader/chunk/mboit/moments/geometric/chunk_compute_transmittance_from_2_trigonometric_moments.js"],"names":[],"mappings":"AAUA;;;;GAIG;AACH,uEAFU,SAAS,CAiGjB;0BA9GwB,mCAAmC"}
1
+ {"version":3,"file":"chunk_compute_transmittance_from_2_trigonometric_moments.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/shade/renderer/shader/chunk/mboit/moments/geometric/chunk_compute_transmittance_from_2_trigonometric_moments.js"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,uEAFU,SAAS,CA6GjB;0BA3HwB,mCAAmC"}
@@ -1,6 +1,7 @@
1
1
  import { CodeChunk } from "../../../../compiler/CodeChunk.js";
2
2
  import { chunk_complex_conjugate } from "../../../math/complex/chunk_complex_conjugate.js";
3
3
  import { chunk_complex_divide } from "../../../math/complex/chunk_complex_divide.js";
4
+ import { chunk_complex_magnitude_floor } from "../../../math/complex/chunk_complex_magnitude_floor.js";
4
5
  import { chunk_complex_divide_real } from "../../../math/complex/chunk_complex_divide_real.js";
5
6
  import { chunk_complex_multiply } from "../../../math/complex/chunk_complex_multiply.js";
6
7
  import { chunk_complex_real_part } from "../../../math/complex/chunk_complex_real_part.js";
@@ -60,8 +61,17 @@ fn compute_transmittance_from_2_trigonometric_moments(
60
61
  c[1] -= complex_multiply(complex_conjugate(l21), c[2]);
61
62
  c[0] -= complex_multiply(complex_conjugate(l10), c[1]) + complex_multiply(complex_conjugate(l20), c[2]);
62
63
 
63
- // Compute roots of the polynomial
64
- let roots = complex_solve_quadratic(complex_conjugate(c[2]), complex_conjugate(c[1]), complex_conjugate(c[0]));
64
+ // Compute roots of the polynomial.
65
+ // c[2] -> 0 when the canonical distribution needs fewer support points than the
66
+ // solver assumes (e.g. the query sitting on a support point of a sparse pixel); the
67
+ // solver normalizes by it, which unguarded throws the spurious roots to inf/NaN and
68
+ // poisons the weights below. Floored, they land huge-but-finite off the circle where
69
+ // their contribution stays negligible. The floor is relative to the largest lower
70
+ // coefficient — the Toeplitz pivot scaling can amplify the whole vector — so the
71
+ // solver-normalized coefficients stay <= ~1e4 and every solver intermediate fits f32.
72
+ let c_scale = max(1.0, sqrt(max(dot(c[0], c[0]), dot(c[1], c[1]))));
73
+ let c_2 = complex_magnitude_floor(c[2], 1e-4 * c_scale);
74
+ let roots = complex_solve_quadratic(complex_conjugate(c_2), complex_conjugate(c[1]), complex_conjugate(c[0]));
65
75
 
66
76
  // Figure out how to weight the weights
67
77
  let depth_parameter = circle_to_parameter(circle_point);
@@ -77,9 +87,11 @@ fn compute_transmittance_from_2_trigonometric_moments(
77
87
  let f0 = weight_factor[0];
78
88
  let f1 = weight_factor[1];
79
89
  let f2 = weight_factor[2];
80
- let f01 = complex_divide_real(f1 - f0, z[1] - z[0]);
81
- let f12 = complex_divide_real(f2 - f1, z[2] - z[1]);
82
- let f012 = complex_divide(f12 - f01, z[2] - z[0]);
90
+ // Coincident support points zero these separations, and complex division by (0, 0)
91
+ // is NaN. Floored, a merged pair contributes one bounded term instead.
92
+ let f01 = complex_divide_real(f1 - f0, complex_magnitude_floor(z[1] - z[0], 1e-4));
93
+ let f12 = complex_divide_real(f2 - f1, complex_magnitude_floor(z[2] - z[1], 1e-4));
94
+ let f012 = complex_divide(f12 - f01, complex_magnitude_floor(z[2] - z[0], 1e-4));
83
95
 
84
96
  var polynomial = array<vec2<f32>, 3>();
85
97
  polynomial[0] = f012;
@@ -104,6 +116,7 @@ fn compute_transmittance_from_2_trigonometric_moments(
104
116
  chunk_complex_divide,
105
117
  chunk_complex_solve_quadratic,
106
118
  chunk_complex_conjugate,
119
+ chunk_complex_magnitude_floor,
107
120
  //
108
121
  chunk_circle_to_parameter,
109
122
  chunk_get_root_weight_factor,
@@ -1 +1 @@
1
- {"version":3,"file":"chunk_compute_transmittance_from_3_trigonometric_moments.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/shade/renderer/shader/chunk/mboit/moments/geometric/chunk_compute_transmittance_from_3_trigonometric_moments.js"],"names":[],"mappings":"AAUA;;;;GAIG;AACH,uEAFU,SAAS,CAsHjB;0BAnIwB,mCAAmC"}
1
+ {"version":3,"file":"chunk_compute_transmittance_from_3_trigonometric_moments.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/shade/renderer/shader/chunk/mboit/moments/geometric/chunk_compute_transmittance_from_3_trigonometric_moments.js"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,uEAFU,SAAS,CAkIjB;0BAhJwB,mCAAmC"}
@@ -1,6 +1,7 @@
1
1
  import { CodeChunk } from "../../../../compiler/CodeChunk.js";
2
2
  import { chunk_complex_conjugate } from "../../../math/complex/chunk_complex_conjugate.js";
3
3
  import { chunk_complex_divide } from "../../../math/complex/chunk_complex_divide.js";
4
+ import { chunk_complex_magnitude_floor } from "../../../math/complex/chunk_complex_magnitude_floor.js";
4
5
  import { chunk_complex_divide_real } from "../../../math/complex/chunk_complex_divide_real.js";
5
6
  import { chunk_complex_multiply } from "../../../math/complex/chunk_complex_multiply.js";
6
7
  import { chunk_complex_real_part } from "../../../math/complex/chunk_complex_real_part.js";
@@ -71,8 +72,17 @@ fn compute_transmittance_from_3_trigonometric_moments(
71
72
  c[1] -= complex_multiply(complex_conjugate(l21), c[2]) + complex_multiply(complex_conjugate(l31), c[3]);
72
73
  c[0] -= complex_multiply(complex_conjugate(l10), c[1]) + complex_multiply(complex_conjugate(l20), c[2]) + complex_multiply(complex_conjugate(l30), c[3]);
73
74
 
74
- // Compute roots of the polynomial
75
- let roots = complex_solve_cubic_blinn(complex_conjugate(c[3]), complex_conjugate(c[2]), complex_conjugate(c[1]), complex_conjugate(c[0]));
75
+ // Compute roots of the polynomial.
76
+ // c[3] -> 0 when the canonical distribution needs fewer support points than the
77
+ // solver assumes (e.g. the query sitting on a support point of a sparse pixel); the
78
+ // solver normalizes by it, which unguarded throws the spurious roots to inf/NaN and
79
+ // poisons the weights below. Floored, they land huge-but-finite off the circle where
80
+ // their contribution stays negligible. The floor is relative to the largest lower
81
+ // coefficient — the Toeplitz pivot scaling can amplify the whole vector — so the
82
+ // solver-normalized coefficients stay <= ~1e4 and every solver intermediate fits f32.
83
+ let c_scale = max(1.0, sqrt(max(dot(c[0], c[0]), max(dot(c[1], c[1]), dot(c[2], c[2])))));
84
+ let c_3 = complex_magnitude_floor(c[3], 1e-4 * c_scale);
85
+ let roots = complex_solve_cubic_blinn(complex_conjugate(c_3), complex_conjugate(c[2]), complex_conjugate(c[1]), complex_conjugate(c[0]));
76
86
 
77
87
  // Figure out how to weight the weights
78
88
  let depth_parameter = circle_to_parameter(circle_point);
@@ -89,12 +99,14 @@ fn compute_transmittance_from_3_trigonometric_moments(
89
99
  let f1 = weight_factor[1];
90
100
  let f2 = weight_factor[2];
91
101
  let f3 = weight_factor[3];
92
- let f01 = complex_divide_real(f1 - f0, z[1] - z[0]);
93
- let f12 = complex_divide_real(f2 - f1, z[2] - z[1]);
94
- let f23 = complex_divide_real(f3 - f2, z[3] - z[2]);
95
- let f012 = complex_divide(f12 - f01, z[2] - z[0]);
96
- let f123 = complex_divide(f23 - f12, z[3] - z[1]);
97
- let f0123 = complex_divide(f123 - f012, z[3] - z[0]);
102
+ // Coincident support points zero these separations, and complex division by (0, 0)
103
+ // is NaN. Floored, a merged pair contributes one bounded term instead.
104
+ let f01 = complex_divide_real(f1 - f0, complex_magnitude_floor(z[1] - z[0], 1e-4));
105
+ let f12 = complex_divide_real(f2 - f1, complex_magnitude_floor(z[2] - z[1], 1e-4));
106
+ let f23 = complex_divide_real(f3 - f2, complex_magnitude_floor(z[3] - z[2], 1e-4));
107
+ let f012 = complex_divide(f12 - f01, complex_magnitude_floor(z[2] - z[0], 1e-4));
108
+ let f123 = complex_divide(f23 - f12, complex_magnitude_floor(z[3] - z[1], 1e-4));
109
+ let f0123 = complex_divide(f123 - f012, complex_magnitude_floor(z[3] - z[0], 1e-4));
98
110
 
99
111
  var polynomial = array<vec2<f32>, 4>();
100
112
  polynomial[0] = f0123;
@@ -124,6 +136,7 @@ fn compute_transmittance_from_3_trigonometric_moments(
124
136
  chunk_complex_divide_real,
125
137
  chunk_complex_conjugate,
126
138
  chunk_complex_solve_cubic_blinn,
139
+ chunk_complex_magnitude_floor,
127
140
 
128
141
  //
129
142
  chunk_circle_to_parameter,
@@ -1 +1 @@
1
- {"version":3,"file":"chunk_compute_transmittance_from_4_trigonometric_moments.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/shade/renderer/shader/chunk/mboit/moments/geometric/chunk_compute_transmittance_from_4_trigonometric_moments.js"],"names":[],"mappings":"AAUA;;;;GAIG;AACH,uEAFU,SAAS,CA2IjB;0BAxJwB,mCAAmC"}
1
+ {"version":3,"file":"chunk_compute_transmittance_from_4_trigonometric_moments.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/shade/renderer/shader/chunk/mboit/moments/geometric/chunk_compute_transmittance_from_4_trigonometric_moments.js"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,uEAFU,SAAS,CAuJjB;0BArKwB,mCAAmC"}
@@ -1,6 +1,7 @@
1
1
  import { CodeChunk } from "../../../../compiler/CodeChunk.js";
2
2
  import { chunk_complex_conjugate } from "../../../math/complex/chunk_complex_conjugate.js";
3
3
  import { chunk_complex_divide } from "../../../math/complex/chunk_complex_divide.js";
4
+ import { chunk_complex_magnitude_floor } from "../../../math/complex/chunk_complex_magnitude_floor.js";
4
5
  import { chunk_complex_divide_real } from "../../../math/complex/chunk_complex_divide_real.js";
5
6
  import { chunk_complex_multiply } from "../../../math/complex/chunk_complex_multiply.js";
6
7
  import { chunk_complex_real_part } from "../../../math/complex/chunk_complex_real_part.js";
@@ -82,8 +83,17 @@ fn compute_transmittance_from_4_trigonometric_moments(
82
83
  c[1] -= complex_multiply(complex_conjugate(l21), c[2]) + complex_multiply(complex_conjugate(l31), c[3]) + complex_multiply(complex_conjugate(l41), c[4]);
83
84
  c[0] -= complex_multiply(complex_conjugate(l10), c[1]) + complex_multiply(complex_conjugate(l20), c[2]) + complex_multiply(complex_conjugate(l30), c[3]) + complex_multiply(complex_conjugate(l40), c[4]);
84
85
 
85
- // Compute roots of the polynomial
86
- let roots = complex_solve_quartic_neumark(complex_conjugate(c[4]), complex_conjugate(c[3]), complex_conjugate(c[2]), complex_conjugate(c[1]), complex_conjugate(c[0]));
86
+ // Compute roots of the polynomial.
87
+ // c[4] -> 0 when the canonical distribution needs fewer support points than the
88
+ // solver assumes (e.g. the query sitting on a support point of a sparse pixel); the
89
+ // solver normalizes by it, which unguarded throws the spurious roots to inf/NaN and
90
+ // poisons the weights below. Floored, they land huge-but-finite off the circle where
91
+ // their contribution stays negligible. The floor is relative to the largest lower
92
+ // coefficient — the Toeplitz pivot scaling can amplify the whole vector — so the
93
+ // solver-normalized coefficients stay <= ~1e4 and every solver intermediate fits f32.
94
+ let c_scale = max(1.0, sqrt(max(max(dot(c[0], c[0]), dot(c[1], c[1])), max(dot(c[2], c[2]), dot(c[3], c[3])))));
95
+ let c_4 = complex_magnitude_floor(c[4], 1e-4 * c_scale);
96
+ let roots = complex_solve_quartic_neumark(complex_conjugate(c_4), complex_conjugate(c[3]), complex_conjugate(c[2]), complex_conjugate(c[1]), complex_conjugate(c[0]));
87
97
 
88
98
  // Figure out how to weight the weights
89
99
  let depth_parameter = circle_to_parameter(circle_point);
@@ -101,16 +111,18 @@ fn compute_transmittance_from_4_trigonometric_moments(
101
111
  let f2 = weight_factor[2];
102
112
  let f3 = weight_factor[3];
103
113
  let f4 = weight_factor[4];
104
- let f01 = complex_divide_real(f1 - f0, z[1] - z[0]);
105
- let f12 = complex_divide_real(f2 - f1, z[2] - z[1]);
106
- let f23 = complex_divide_real(f3 - f2, z[3] - z[2]);
107
- let f34 = complex_divide_real(f4 - f3, z[4] - z[3]);
108
- let f012 = complex_divide(f12 - f01, z[2] - z[0]);
109
- let f123 = complex_divide(f23 - f12, z[3] - z[1]);
110
- let f234 = complex_divide(f34 - f23, z[4] - z[2]);
111
- let f0123 = complex_divide(f123 - f012, z[3] - z[0]);
112
- let f1234 = complex_divide(f234 - f123, z[4] - z[1]);
113
- let f01234 = complex_divide(f1234 - f0123, z[4] - z[0]);
114
+ // Coincident support points zero these separations, and complex division by (0, 0)
115
+ // is NaN. Floored, a merged pair contributes one bounded term instead.
116
+ let f01 = complex_divide_real(f1 - f0, complex_magnitude_floor(z[1] - z[0], 1e-4));
117
+ let f12 = complex_divide_real(f2 - f1, complex_magnitude_floor(z[2] - z[1], 1e-4));
118
+ let f23 = complex_divide_real(f3 - f2, complex_magnitude_floor(z[3] - z[2], 1e-4));
119
+ let f34 = complex_divide_real(f4 - f3, complex_magnitude_floor(z[4] - z[3], 1e-4));
120
+ let f012 = complex_divide(f12 - f01, complex_magnitude_floor(z[2] - z[0], 1e-4));
121
+ let f123 = complex_divide(f23 - f12, complex_magnitude_floor(z[3] - z[1], 1e-4));
122
+ let f234 = complex_divide(f34 - f23, complex_magnitude_floor(z[4] - z[2], 1e-4));
123
+ let f0123 = complex_divide(f123 - f012, complex_magnitude_floor(z[3] - z[0], 1e-4));
124
+ let f1234 = complex_divide(f234 - f123, complex_magnitude_floor(z[4] - z[1], 1e-4));
125
+ let f01234 = complex_divide(f1234 - f0123, complex_magnitude_floor(z[4] - z[0], 1e-4));
114
126
 
115
127
  var polynomial = array<vec2<f32>, 5>();
116
128
  polynomial[0] = f01234;
@@ -146,6 +158,7 @@ fn compute_transmittance_from_4_trigonometric_moments(
146
158
  chunk_complex_divide_real,
147
159
  chunk_complex_conjugate,
148
160
  chunk_complex_solve_quartic_neumark,
161
+ chunk_complex_magnitude_floor,
149
162
  //
150
163
  chunk_circle_to_parameter,
151
164
  chunk_get_root_weight_factor,
@@ -1,6 +1,10 @@
1
1
  /**
2
- * This function handles the actual computation of the new vector of
3
- * trigonometric moments for NUM_MOMENTS = 4 with SINGLE_PRECISION = true.
2
+ * This function computes one fragment's contribution to the vector of
3
+ * trigonometric moments, for NUM_MOMENTS = 4 with SINGLE_PRECISION = true.
4
+ * b_12 packs the two complex moments as (re_1, im_1, re_2, im_2). The
5
+ * contribution is returned raw; summing across fragments is the caller's
6
+ * business (additive blending into float render targets, or component-wise
7
+ * addition in a loop).
4
8
  * @see https://github.com/AlicesoftHumika/UnityOIT/blob/612c3c04263acb22980f33fa3cb2d3653ed389ff/Assets/Shader/MBOIT/MomentOIT.hlsli#L123
5
9
  * @type {CodeChunk}
6
10
  */
@@ -1 +1 @@
1
- {"version":3,"file":"chunk_generate_trigonometric_moments_4.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/shade/renderer/shader/chunk/mboit/moments/geometric/chunk_generate_trigonometric_moments_4.js"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,qDAFU,SAAS,CA2BjB;0BAlCwB,mCAAmC"}
1
+ {"version":3,"file":"chunk_generate_trigonometric_moments_4.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/shade/renderer/shader/chunk/mboit/moments/geometric/chunk_generate_trigonometric_moments_4.js"],"names":[],"mappings":"AAGA;;;;;;;;;GASG;AACH,qDAFU,SAAS,CA8BjB;0BAzCwB,mCAAmC"}