@woosh/meep-engine 3.51.0 → 3.53.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 (433) hide show
  1. package/package.json +1 -1
  2. package/src/engine/ecs/animation/Animation.d.ts +4 -25
  3. package/src/engine/ecs/animation/Animation.d.ts.map +1 -1
  4. package/src/engine/ecs/animation/Animation.js +9 -41
  5. package/src/engine/ecs/ik/IKGoalSystem.d.ts +4 -5
  6. package/src/engine/ecs/ik/IKGoalSystem.d.ts.map +1 -1
  7. package/src/engine/ecs/ik/IKGoalSystem.js +4 -6
  8. package/src/engine/graphics/ecs/mesh/assetTypeByPath.js +1 -1
  9. package/src/engine/graphics3/AnimationGraphSystem.d.ts +9 -22
  10. package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -1
  11. package/src/engine/graphics3/AnimationGraphSystem.js +58 -203
  12. package/src/engine/graphics3/AnimationSystem.d.ts +7 -18
  13. package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -1
  14. package/src/engine/graphics3/AnimationSystem.js +62 -243
  15. package/src/engine/graphics3/FoliageWindSystem.d.ts +67 -0
  16. package/src/engine/graphics3/FoliageWindSystem.d.ts.map +1 -0
  17. package/src/engine/graphics3/FoliageWindSystem.js +257 -0
  18. package/src/engine/graphics3/GPUFluidSystem.d.ts +7 -0
  19. package/src/engine/graphics3/GPUFluidSystem.d.ts.map +1 -1
  20. package/src/engine/graphics3/GPUFluidSystem.js +39 -1
  21. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +0 -1
  22. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
  23. package/src/engine/graphics3/GPUParticleEmitterSystem.js +19 -5
  24. package/src/engine/graphics3/animation/AnimationClips.d.ts +107 -13
  25. package/src/engine/graphics3/animation/AnimationClips.d.ts.map +1 -1
  26. package/src/engine/graphics3/animation/AnimationClips.js +207 -10
  27. package/src/engine/graphics3/animation/AnimationClipsSink.d.ts +89 -0
  28. package/src/engine/graphics3/animation/AnimationClipsSink.d.ts.map +1 -0
  29. package/src/engine/graphics3/animation/AnimationClipsSink.js +205 -0
  30. package/src/engine/graphics3/animation/FoliageWindRigs.d.ts +43 -0
  31. package/src/engine/graphics3/animation/FoliageWindRigs.d.ts.map +1 -0
  32. package/src/engine/graphics3/animation/FoliageWindRigs.js +69 -0
  33. package/src/engine/graphics3/animation/write_clip_playback.d.ts +17 -11
  34. package/src/engine/graphics3/animation/write_clip_playback.d.ts.map +1 -1
  35. package/src/engine/graphics3/animation/write_clip_playback.js +36 -27
  36. package/src/engine/graphics3/decal/GPUDecalRenderer.d.ts.map +1 -1
  37. package/src/engine/graphics3/decal/GPUDecalRenderer.js +8 -6
  38. package/src/engine/graphics3/decal/shader_decal_composite.d.ts.map +1 -1
  39. package/src/engine/graphics3/decal/shader_decal_composite.js +11 -5
  40. package/src/engine/graphics3/pose/collect_entity_playbacks.d.ts +7 -7
  41. package/src/engine/graphics3/pose/collect_entity_playbacks.d.ts.map +1 -1
  42. package/src/engine/graphics3/pose/collect_entity_playbacks.js +14 -15
  43. package/src/engine/graphics3/prefab/Prefab.d.ts +6 -0
  44. package/src/engine/graphics3/prefab/Prefab.d.ts.map +1 -1
  45. package/src/engine/graphics3/prefab/Prefab.js +169 -162
  46. package/src/engine/graphics3/prefab/prefab_compile.d.ts.map +1 -1
  47. package/src/engine/graphics3/prefab/prefab_compile.js +369 -334
  48. package/src/engine/graphics3/prefab/prefab_instantiate.d.ts.map +1 -1
  49. package/src/engine/graphics3/prefab/prefab_instantiate.js +43 -2
  50. package/src/engine/graphics3/terrain/chunk_terrain_material_surface.js +2 -2
  51. package/src/engine/physics/ecs/ContactProbeSystem.d.ts +2 -3
  52. package/src/engine/physics/ecs/ContactProbeSystem.d.ts.map +1 -1
  53. package/src/engine/physics/ecs/ContactProbeSystem.js +2 -4
  54. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  55. package/src/engine/sound/simulation/PROBE_PLACEMENT.md +4 -4
  56. package/src/engine/sound/simulation/README.md +1 -1
  57. package/src/engine/sound/simulation/probe/bakeProbeField.d.ts +22 -8
  58. package/src/engine/sound/simulation/probe/bakeProbeField.d.ts.map +1 -1
  59. package/src/engine/sound/simulation/probe/bakeProbeField.js +60 -15
  60. package/src/engine/sound/simulation/probe/bakeProbeReflectors.d.ts.map +1 -1
  61. package/src/engine/sound/simulation/probe/bakeProbeReflectors.js +19 -23
  62. package/src/engine/sound/simulation/probe/probe_sdf_grid.d.ts +63 -17
  63. package/src/engine/sound/simulation/probe/probe_sdf_grid.d.ts.map +1 -1
  64. package/src/engine/sound/simulation/probe/probe_sdf_grid.js +67 -17
  65. package/src/generation/foliage/FOLIAGE_DESIGN.md +318 -0
  66. package/src/generation/foliage/FOLIAGE_PLAN.md +198 -0
  67. package/src/generation/foliage/animation/build_tree_wind_rig.d.ts +20 -0
  68. package/src/generation/foliage/animation/build_tree_wind_rig.d.ts.map +1 -0
  69. package/src/generation/foliage/animation/build_tree_wind_rig.js +108 -0
  70. package/src/generation/foliage/asset/TreeAsset.d.ts +86 -0
  71. package/src/generation/foliage/asset/TreeAsset.d.ts.map +1 -0
  72. package/src/generation/foliage/asset/TreeAsset.js +111 -0
  73. package/src/generation/foliage/asset/TreeLODAsset.d.ts +115 -0
  74. package/src/generation/foliage/asset/TreeLODAsset.d.ts.map +1 -0
  75. package/src/generation/foliage/asset/TreeLODAsset.js +346 -0
  76. package/src/generation/foliage/asset/generate_tree.d.ts +15 -0
  77. package/src/generation/foliage/asset/generate_tree.d.ts.map +1 -0
  78. package/src/generation/foliage/asset/generate_tree.js +93 -0
  79. package/src/generation/foliage/asset/place_tree.d.ts +82 -0
  80. package/src/generation/foliage/asset/place_tree.d.ts.map +1 -0
  81. package/src/generation/foliage/asset/place_tree.js +194 -0
  82. package/src/generation/foliage/config/BarkMaterialConfig.d.ts +120 -0
  83. package/src/generation/foliage/config/BarkMaterialConfig.d.ts.map +1 -0
  84. package/src/generation/foliage/config/BarkMaterialConfig.js +250 -0
  85. package/src/generation/foliage/config/BranchLevelConfig.d.ts +288 -0
  86. package/src/generation/foliage/config/BranchLevelConfig.d.ts.map +1 -0
  87. package/src/generation/foliage/config/BranchLevelConfig.js +536 -0
  88. package/src/generation/foliage/config/CrownConfig.d.ts +100 -0
  89. package/src/generation/foliage/config/CrownConfig.d.ts.map +1 -0
  90. package/src/generation/foliage/config/CrownConfig.js +186 -0
  91. package/src/generation/foliage/config/CrownEnvelopeType.d.ts +16 -0
  92. package/src/generation/foliage/config/CrownEnvelopeType.d.ts.map +1 -0
  93. package/src/generation/foliage/config/CrownEnvelopeType.js +17 -0
  94. package/src/generation/foliage/config/FoliageCardType.d.ts +12 -0
  95. package/src/generation/foliage/config/FoliageCardType.d.ts.map +1 -0
  96. package/src/generation/foliage/config/FoliageCardType.js +18 -0
  97. package/src/generation/foliage/config/FoliageConfig.d.ts +151 -0
  98. package/src/generation/foliage/config/FoliageConfig.d.ts.map +1 -0
  99. package/src/generation/foliage/config/FoliageConfig.js +283 -0
  100. package/src/generation/foliage/config/FoliageMaterialConfig.d.ts +90 -0
  101. package/src/generation/foliage/config/FoliageMaterialConfig.d.ts.map +1 -0
  102. package/src/generation/foliage/config/FoliageMaterialConfig.js +181 -0
  103. package/src/generation/foliage/config/PhyllotaxisMode.d.ts +13 -0
  104. package/src/generation/foliage/config/PhyllotaxisMode.d.ts.map +1 -0
  105. package/src/generation/foliage/config/PhyllotaxisMode.js +20 -0
  106. package/src/generation/foliage/config/TreeLODConfig.d.ts +87 -0
  107. package/src/generation/foliage/config/TreeLODConfig.d.ts.map +1 -0
  108. package/src/generation/foliage/config/TreeLODConfig.js +211 -0
  109. package/src/generation/foliage/config/TreePreset.d.ts +16 -0
  110. package/src/generation/foliage/config/TreePreset.d.ts.map +1 -0
  111. package/src/generation/foliage/config/TreePreset.js +17 -0
  112. package/src/generation/foliage/config/TreeSpeciesConfig.d.ts +109 -0
  113. package/src/generation/foliage/config/TreeSpeciesConfig.d.ts.map +1 -0
  114. package/src/generation/foliage/config/TreeSpeciesConfig.js +400 -0
  115. package/src/generation/foliage/config/TreeWindConfig.d.ts +84 -0
  116. package/src/generation/foliage/config/TreeWindConfig.d.ts.map +1 -0
  117. package/src/generation/foliage/config/TreeWindConfig.js +157 -0
  118. package/src/generation/foliage/index.d.ts +38 -0
  119. package/src/generation/foliage/index.d.ts.map +1 -0
  120. package/src/generation/foliage/index.js +43 -0
  121. package/src/generation/foliage/material/make_bark_material.d.ts +37 -0
  122. package/src/generation/foliage/material/make_bark_material.d.ts.map +1 -0
  123. package/src/generation/foliage/material/make_bark_material.js +802 -0
  124. package/src/generation/foliage/material/make_foliage_material.d.ts +14 -0
  125. package/src/generation/foliage/material/make_foliage_material.d.ts.map +1 -0
  126. package/src/generation/foliage/material/make_foliage_material.js +359 -0
  127. package/src/generation/foliage/mesh/branch_collar_project.d.ts +42 -0
  128. package/src/generation/foliage/mesh/branch_collar_project.d.ts.map +1 -0
  129. package/src/generation/foliage/mesh/branch_collar_project.js +203 -0
  130. package/src/generation/foliage/mesh/branch_ring_triangulate.d.ts +35 -0
  131. package/src/generation/foliage/mesh/branch_ring_triangulate.d.ts.map +1 -0
  132. package/src/generation/foliage/mesh/branch_ring_triangulate.js +72 -0
  133. package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts +80 -0
  134. package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts.map +1 -0
  135. package/src/generation/foliage/mesh/foliage_collect_attachments.js +502 -0
  136. package/src/generation/foliage/mesh/tree_mesh_apply_canopy_ao.d.ts +19 -0
  137. package/src/generation/foliage/mesh/tree_mesh_apply_canopy_ao.d.ts.map +1 -0
  138. package/src/generation/foliage/mesh/tree_mesh_apply_canopy_ao.js +150 -0
  139. package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts +55 -0
  140. package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts.map +1 -0
  141. package/src/generation/foliage/mesh/tree_mesh_build_bark.js +1047 -0
  142. package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts +21 -0
  143. package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts.map +1 -0
  144. package/src/generation/foliage/mesh/tree_mesh_build_foliage.js +415 -0
  145. package/src/generation/foliage/presets/make_tree_species_preset.d.ts +13 -0
  146. package/src/generation/foliage/presets/make_tree_species_preset.d.ts.map +1 -0
  147. package/src/generation/foliage/presets/make_tree_species_preset.js +837 -0
  148. package/src/generation/foliage/skeleton/TreeSkeleton.d.ts +443 -0
  149. package/src/generation/foliage/skeleton/TreeSkeleton.d.ts.map +1 -0
  150. package/src/generation/foliage/skeleton/TreeSkeleton.js +1100 -0
  151. package/src/generation/foliage/skeleton/crown_envelope_evaluate.d.ts +27 -0
  152. package/src/generation/foliage/skeleton/crown_envelope_evaluate.d.ts.map +1 -0
  153. package/src/generation/foliage/skeleton/crown_envelope_evaluate.js +121 -0
  154. package/src/generation/foliage/skeleton/spine_frame_double_reflection.d.ts +32 -0
  155. package/src/generation/foliage/skeleton/spine_frame_double_reflection.d.ts.map +1 -0
  156. package/src/generation/foliage/skeleton/spine_frame_double_reflection.js +87 -0
  157. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts +33 -0
  158. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts.map +1 -0
  159. package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.js +205 -0
  160. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts +14 -0
  161. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts.map +1 -0
  162. package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.js +179 -0
  163. package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts +18 -0
  164. package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts.map +1 -0
  165. package/src/generation/foliage/skeleton/tree_skeleton_grow.js +1104 -0
  166. package/src/shade/playground/additive_blending/index.html +197 -0
  167. package/src/shade/playground/additive_blending/main.d.ts +2 -0
  168. package/src/shade/playground/additive_blending/main.d.ts.map +1 -0
  169. package/src/shade/playground/additive_blending/main.js +529 -0
  170. package/src/shade/playground/foliage_wind/README.md +18 -0
  171. package/src/shade/playground/foliage_wind/foliage_world.d.ts +127 -0
  172. package/src/shade/playground/foliage_wind/foliage_world.d.ts.map +1 -0
  173. package/src/shade/playground/foliage_wind/foliage_world.js +593 -0
  174. package/src/shade/playground/foliage_wind/index.html +254 -0
  175. package/src/shade/playground/foliage_wind/main.d.ts +2 -0
  176. package/src/shade/playground/foliage_wind/main.d.ts.map +1 -0
  177. package/src/shade/playground/foliage_wind/main.js +263 -0
  178. package/src/shade/playground/tonemap_sdr/README.md +5 -3
  179. package/src/shade/renderer/Renderer.d.ts +1 -1
  180. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  181. package/src/shade/renderer/Renderer.js +88 -31
  182. package/src/shade/renderer/ShadeToneMappingMode.d.ts +3 -2
  183. package/src/shade/renderer/ShadeToneMappingMode.js +15 -4
  184. package/src/shade/renderer/animation/ADDITIVE_BLENDING_PLAN.md +145 -0
  185. package/src/shade/renderer/animation/ANIMATION_DATABASE_SPEC.d.ts +9 -1
  186. package/src/shade/renderer/animation/ANIMATION_DATABASE_SPEC.d.ts.map +1 -1
  187. package/src/shade/renderer/animation/ANIMATION_DATABASE_SPEC.js +53 -1
  188. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_JOINT_STRUCT.d.ts +8 -0
  189. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_JOINT_STRUCT.d.ts.map +1 -0
  190. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_JOINT_STRUCT.js +71 -0
  191. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_RIG_STRUCT.d.ts +11 -0
  192. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_RIG_STRUCT.d.ts.map +1 -0
  193. package/src/shade/renderer/animation/ANIMATION_FOLIAGE_RIG_STRUCT.js +32 -0
  194. package/src/shade/renderer/animation/GPUAnimationManager.d.ts +30 -3
  195. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  196. package/src/shade/renderer/animation/GPUAnimationManager.js +532 -79
  197. package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.d.ts +19 -12
  198. package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.d.ts.map +1 -1
  199. package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.js +20 -13
  200. package/src/shade/renderer/animation/ShadeAnimationClip.d.ts +35 -8
  201. package/src/shade/renderer/animation/ShadeAnimationClip.d.ts.map +1 -1
  202. package/src/shade/renderer/animation/ShadeAnimationClip.js +433 -2
  203. package/src/shade/renderer/animation/chunk_pose_accumulator.d.ts.map +1 -1
  204. package/src/shade/renderer/animation/chunk_pose_accumulator.js +40 -32
  205. package/src/shade/renderer/animation/foliage/FoliageWindJoint.d.ts +97 -0
  206. package/src/shade/renderer/animation/foliage/FoliageWindJoint.d.ts.map +1 -0
  207. package/src/shade/renderer/animation/foliage/FoliageWindJoint.js +161 -0
  208. package/src/shade/renderer/animation/foliage/FoliageWindRig.d.ts +65 -0
  209. package/src/shade/renderer/animation/foliage/FoliageWindRig.d.ts.map +1 -0
  210. package/src/shade/renderer/animation/foliage/FoliageWindRig.js +89 -0
  211. package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.d.ts +19 -0
  212. package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.d.ts.map +1 -0
  213. package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.js +143 -0
  214. package/src/shade/renderer/animation/foliage/shader_foliage_wind_apply.d.ts +14 -0
  215. package/src/shade/renderer/animation/foliage/shader_foliage_wind_apply.d.ts.map +1 -0
  216. package/src/shade/renderer/animation/foliage/shader_foliage_wind_apply.js +116 -0
  217. package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts.map +1 -1
  218. package/src/shade/renderer/animation/pose/pose_evaluate_local.js +39 -29
  219. package/src/shade/renderer/animation/shader_animation_pose_resolve.js +37 -37
  220. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +2 -2
  221. package/src/shade/renderer/deferred/tonemap/TonemapAces2Tables.d.ts +38 -0
  222. package/src/shade/renderer/deferred/tonemap/TonemapAces2Tables.d.ts.map +1 -0
  223. package/src/shade/renderer/deferred/tonemap/TonemapAces2Tables.js +97 -0
  224. package/src/shade/renderer/deferred/{TonemapDisplaySettings.d.ts → tonemap/TonemapDisplaySettings.d.ts} +1 -1
  225. package/src/shade/renderer/deferred/tonemap/TonemapDisplaySettings.d.ts.map +1 -0
  226. package/src/shade/renderer/deferred/{TonemapDisplaySettings.js → tonemap/TonemapDisplaySettings.js} +5 -5
  227. package/src/shade/renderer/deferred/{shader_tonemap_HDR.d.ts → tonemap/shader_tonemap_HDR.d.ts} +1 -1
  228. package/src/shade/renderer/deferred/tonemap/shader_tonemap_HDR.d.ts.map +1 -0
  229. package/src/shade/renderer/deferred/{shader_tonemap_HDR.js → tonemap/shader_tonemap_HDR.js} +9 -9
  230. package/src/shade/renderer/deferred/tonemap/shader_tonemap_HDR_aces.d.ts +17 -0
  231. package/src/shade/renderer/deferred/tonemap/shader_tonemap_HDR_aces.d.ts.map +1 -0
  232. package/src/shade/renderer/deferred/tonemap/shader_tonemap_HDR_aces.js +101 -0
  233. package/src/shade/renderer/deferred/{shader_tonemap_HDR_none.d.ts → tonemap/shader_tonemap_HDR_none.d.ts} +1 -1
  234. package/src/shade/renderer/deferred/tonemap/shader_tonemap_HDR_none.d.ts.map +1 -0
  235. package/src/shade/renderer/deferred/{shader_tonemap_HDR_none.js → tonemap/shader_tonemap_HDR_none.js} +6 -6
  236. package/src/shade/renderer/deferred/{shader_tonemap_HDR_pbr_neutral.d.ts → tonemap/shader_tonemap_HDR_pbr_neutral.d.ts} +1 -1
  237. package/src/shade/renderer/deferred/tonemap/shader_tonemap_HDR_pbr_neutral.d.ts.map +1 -0
  238. package/src/shade/renderer/deferred/{shader_tonemap_HDR_pbr_neutral.js → tonemap/shader_tonemap_HDR_pbr_neutral.js} +8 -8
  239. package/src/shade/renderer/deferred/{shader_tonemap_LDR.d.ts → tonemap/shader_tonemap_LDR.d.ts} +1 -1
  240. package/src/shade/renderer/deferred/tonemap/shader_tonemap_LDR.d.ts.map +1 -0
  241. package/src/shade/renderer/deferred/{shader_tonemap_LDR.js → tonemap/shader_tonemap_LDR.js} +10 -10
  242. package/src/shade/renderer/deferred/tonemap/shader_tonemap_LDR_aces.d.ts +10 -0
  243. package/src/shade/renderer/deferred/tonemap/shader_tonemap_LDR_aces.d.ts.map +1 -0
  244. package/src/shade/renderer/deferred/tonemap/shader_tonemap_LDR_aces.js +77 -0
  245. package/src/shade/renderer/deferred/{shader_tonemap_LDR_none.d.ts → tonemap/shader_tonemap_LDR_none.d.ts} +1 -1
  246. package/src/shade/renderer/deferred/tonemap/shader_tonemap_LDR_none.d.ts.map +1 -0
  247. package/src/shade/renderer/deferred/{shader_tonemap_LDR_none.js → tonemap/shader_tonemap_LDR_none.js} +7 -7
  248. package/src/shade/renderer/deferred/{shader_tonemap_LDR_pbr_neutral.d.ts → tonemap/shader_tonemap_LDR_pbr_neutral.d.ts} +1 -1
  249. package/src/shade/renderer/deferred/tonemap/shader_tonemap_LDR_pbr_neutral.d.ts.map +1 -0
  250. package/src/shade/renderer/deferred/{shader_tonemap_LDR_pbr_neutral.js → tonemap/shader_tonemap_LDR_pbr_neutral.js} +8 -8
  251. package/src/shade/renderer/extension/RenderExtension.d.ts +7 -0
  252. package/src/shade/renderer/extension/RenderExtension.d.ts.map +1 -1
  253. package/src/shade/renderer/extension/RenderExtension.js +9 -0
  254. package/src/shade/renderer/extension/RenderExtensionRegistry.d.ts +6 -0
  255. package/src/shade/renderer/extension/RenderExtensionRegistry.d.ts.map +1 -1
  256. package/src/shade/renderer/extension/RenderExtensionRegistry.js +15 -0
  257. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +10 -3
  258. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts.map +1 -1
  259. package/src/shade/renderer/fluid/GPUFluidCascade.js +15 -0
  260. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +8 -1
  261. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts.map +1 -1
  262. package/src/shade/renderer/fluid/GPUFluidCascadeStack.js +11 -0
  263. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.d.ts.map +1 -1
  264. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.js +51 -48
  265. package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +6 -6
  266. package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts +6 -0
  267. package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts.map +1 -1
  268. package/src/shade/renderer/fluid/mac/FluidMacPasses.js +16 -0
  269. package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.d.ts.map +1 -1
  270. package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.js +15 -3
  271. package/src/shade/renderer/fluid/mac/chunk_v3_mac_lattice_corners.d.ts.map +1 -1
  272. package/src/shade/renderer/fluid/mac/chunk_v3_mac_lattice_corners.js +102 -96
  273. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.js +12 -12
  274. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_predict.js +12 -12
  275. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +8 -1
  276. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts.map +1 -1
  277. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.js +16 -0
  278. package/src/shade/renderer/fluid/publish/FluidWindPublish.d.ts +7 -0
  279. package/src/shade/renderer/fluid/publish/FluidWindPublish.d.ts.map +1 -1
  280. package/src/shade/renderer/fluid/publish/FluidWindPublish.js +10 -0
  281. package/src/shade/renderer/fluid/query/GPUFluidQueries.d.ts +1 -1
  282. package/src/shade/renderer/geometry/bvh/GPUBLASRefitBatch.js +2 -2
  283. package/src/shade/renderer/loader/SceneBundle.d.ts +7 -0
  284. package/src/shade/renderer/loader/SceneBundle.d.ts.map +1 -1
  285. package/src/shade/renderer/loader/SceneBundle.js +119 -111
  286. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  287. package/src/shade/renderer/material/standard/fragment_gbuffer.d.ts +4 -0
  288. package/src/shade/renderer/material/standard/fragment_gbuffer.d.ts.map +1 -1
  289. package/src/shade/renderer/material/standard/fragment_gbuffer.js +6 -5
  290. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts +8 -7
  291. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts.map +1 -1
  292. package/src/shade/renderer/object_property/chunk_write_object_property_node3d.js +9 -8
  293. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  294. package/src/shade/renderer/particles/GPUParticleSystem.js +3 -1
  295. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts.map +1 -1
  296. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.js +9 -4
  297. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  298. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.d.ts.map +1 -1
  299. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.js +9 -7
  300. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment.d.ts.map +1 -1
  301. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment.js +15 -7
  302. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.d.ts.map +1 -1
  303. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.js +6 -4
  304. package/src/shade/renderer/rasterize/native/oit/oit_resolve_fragment_body.js +3 -3
  305. package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.d.ts.map +1 -1
  306. package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.js +8 -5
  307. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.d.ts.map +1 -1
  308. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js +4 -3
  309. package/src/shade/renderer/shader/chunk/color/tonemap/ACES_TONE_MAPPING_BRIEF_2026_10_17.md +160 -0
  310. package/src/shade/renderer/shader/chunk/color/tonemap/HDR_TONE_MAPPING_FORMS_BRIEF_2026_10_16.md +5 -1
  311. package/src/shade/renderer/shader/chunk/color/tonemap/SDR_TONE_MAPPING_BRIEF_2026_10_16.md +15 -5
  312. package/src/shade/renderer/shader/chunk/color/tonemap/aces/aces2_transform_block.d.ts +41 -0
  313. package/src/shade/renderer/shader/chunk/color/tonemap/aces/aces2_transform_block.d.ts.map +1 -0
  314. package/src/shade/renderer/shader/chunk/color/tonemap/aces/aces2_transform_block.js +692 -0
  315. package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_aces2_output_transform.d.ts +25 -0
  316. package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_aces2_output_transform.d.ts.map +1 -0
  317. package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_aces2_output_transform.js +446 -0
  318. package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_aces_ue_matrices.d.ts +22 -0
  319. package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_aces_ue_matrices.d.ts.map +1 -0
  320. package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_aces_ue_matrices.js +68 -0
  321. package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_tonemap_ue_filmic.d.ts +32 -0
  322. package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_tonemap_ue_filmic.d.ts.map +1 -0
  323. package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_tonemap_ue_filmic.js +163 -0
  324. package/src/shade/renderer/shader/chunk/color/tonemap/chunk_PAPER_WHITE_NITS.d.ts +10 -3
  325. package/src/shade/renderer/shader/chunk/color/tonemap/chunk_PAPER_WHITE_NITS.d.ts.map +1 -1
  326. package/src/shade/renderer/shader/chunk/color/tonemap/chunk_PAPER_WHITE_NITS.js +12 -4
  327. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +1 -1
  328. package/src/shade/renderer/texture/SAMPLER_ANISOTROPIC_CLAMP.d.ts +9 -0
  329. package/src/shade/renderer/texture/SAMPLER_ANISOTROPIC_CLAMP.d.ts.map +1 -0
  330. package/src/shade/renderer/texture/SAMPLER_ANISOTROPIC_CLAMP.js +17 -0
  331. package/src/shade/renderer/texture/SAMPLER_LINEAR_UPSCALE.d.ts +8 -0
  332. package/src/shade/renderer/texture/SAMPLER_LINEAR_UPSCALE.d.ts.map +1 -1
  333. package/src/shade/renderer/texture/SAMPLER_LINEAR_UPSCALE.js +28 -20
  334. package/src/shade/renderer/texture/SAMPLER_TRILINEAR_CLAMP.d.ts +8 -0
  335. package/src/shade/renderer/texture/SAMPLER_TRILINEAR_CLAMP.d.ts.map +1 -0
  336. package/src/shade/renderer/texture/SAMPLER_TRILINEAR_CLAMP.js +15 -0
  337. package/src/shade/renderer/view/chunk_view_mip_bias.d.ts +21 -0
  338. package/src/shade/renderer/view/chunk_view_mip_bias.d.ts.map +1 -0
  339. package/src/shade/renderer/view/chunk_view_mip_bias.js +44 -0
  340. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +1 -1
  341. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  342. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +105 -26
  343. package/src/engine/graphics/composit/CompositingStages.d.ts +0 -6
  344. package/src/engine/graphics/composit/CompositingStages.d.ts.map +0 -1
  345. package/src/engine/graphics/composit/CompositingStages.js +0 -8
  346. package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.d.ts +0 -7
  347. package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.d.ts.map +0 -1
  348. package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.js +0 -24
  349. package/src/engine/graphics/geometry/buffered/computeGeometryBoundingSphereMiniball.d.ts +0 -8
  350. package/src/engine/graphics/geometry/buffered/computeGeometryBoundingSphereMiniball.d.ts.map +0 -1
  351. package/src/engine/graphics/geometry/buffered/computeGeometryBoundingSphereMiniball.js +0 -17
  352. package/src/engine/graphics/geometry/buffered/computeGeometryEquality.d.ts +0 -8
  353. package/src/engine/graphics/geometry/buffered/computeGeometryEquality.d.ts.map +0 -1
  354. package/src/engine/graphics/geometry/buffered/computeGeometryEquality.js +0 -60
  355. package/src/engine/graphics/geometry/buffered/computeGeometryHash.d.ts +0 -7
  356. package/src/engine/graphics/geometry/buffered/computeGeometryHash.d.ts.map +0 -1
  357. package/src/engine/graphics/geometry/buffered/computeGeometryHash.js +0 -26
  358. package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.d.ts +0 -7
  359. package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.d.ts.map +0 -1
  360. package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.js +0 -23
  361. package/src/engine/graphics/geometry/instancing/geometry_copy.d.ts +0 -7
  362. package/src/engine/graphics/geometry/instancing/geometry_copy.d.ts.map +0 -1
  363. package/src/engine/graphics/geometry/instancing/geometry_copy.js +0 -15
  364. package/src/engine/graphics/geometry/instancing/rewriteMaterial.d.ts +0 -2
  365. package/src/engine/graphics/geometry/instancing/rewriteMaterial.d.ts.map +0 -1
  366. package/src/engine/graphics/geometry/instancing/rewriteMaterial.js +0 -57
  367. package/src/engine/graphics/geometry/ribbon/Quad.d.ts +0 -96
  368. package/src/engine/graphics/geometry/ribbon/Quad.d.ts.map +0 -1
  369. package/src/engine/graphics/geometry/ribbon/Quad.js +0 -213
  370. package/src/engine/graphics/geometry/ribbon/copyAttributeV3.d.ts +0 -9
  371. package/src/engine/graphics/geometry/ribbon/copyAttributeV3.d.ts.map +0 -1
  372. package/src/engine/graphics/geometry/ribbon/copyAttributeV3.js +0 -12
  373. package/src/engine/graphics/geometry/ribbon/copyAttributeValue.d.ts +0 -10
  374. package/src/engine/graphics/geometry/ribbon/copyAttributeValue.d.ts.map +0 -1
  375. package/src/engine/graphics/geometry/ribbon/copyAttributeValue.js +0 -17
  376. package/src/engine/graphics/geometry/ribbon/equalAttributeV3.d.ts +0 -10
  377. package/src/engine/graphics/geometry/ribbon/equalAttributeV3.d.ts.map +0 -1
  378. package/src/engine/graphics/geometry/ribbon/equalAttributeV3.js +0 -13
  379. package/src/engine/graphics/geometry/ribbon/equalAttributeValue.d.ts +0 -11
  380. package/src/engine/graphics/geometry/ribbon/equalAttributeValue.d.ts.map +0 -1
  381. package/src/engine/graphics/geometry/ribbon/equalAttributeValue.js +0 -24
  382. package/src/engine/graphics/geometry/ribbon/rotateRibbon.d.ts +0 -6
  383. package/src/engine/graphics/geometry/ribbon/rotateRibbon.d.ts.map +0 -1
  384. package/src/engine/graphics/geometry/ribbon/rotateRibbon.js +0 -37
  385. package/src/engine/graphics/geometry/ribbon/updateTipPosition.d.ts +0 -9
  386. package/src/engine/graphics/geometry/ribbon/updateTipPosition.d.ts.map +0 -1
  387. package/src/engine/graphics/geometry/ribbon/updateTipPosition.js +0 -52
  388. package/src/engine/graphics/geometry/skining/computeSkinnedMeshVertices.d.ts +0 -8
  389. package/src/engine/graphics/geometry/skining/computeSkinnedMeshVertices.d.ts.map +0 -1
  390. package/src/engine/graphics/geometry/skining/computeSkinnedMeshVertices.js +0 -54
  391. package/src/engine/graphics/render/RenderPassType.d.ts +0 -6
  392. package/src/engine/graphics/render/RenderPassType.d.ts.map +0 -1
  393. package/src/engine/graphics/render/RenderPassType.js +0 -8
  394. package/src/engine/graphics/render/layers/RenderLayer.d.ts +0 -78
  395. package/src/engine/graphics/render/layers/RenderLayer.d.ts.map +0 -1
  396. package/src/engine/graphics/render/layers/RenderLayer.js +0 -95
  397. package/src/engine/graphics/render/layers/RenderLayerManager.d.ts +0 -72
  398. package/src/engine/graphics/render/layers/RenderLayerManager.d.ts.map +0 -1
  399. package/src/engine/graphics/render/layers/RenderLayerManager.js +0 -160
  400. package/src/engine/graphics/render/layers/RenderLayerManagerState.d.ts +0 -18
  401. package/src/engine/graphics/render/layers/RenderLayerManagerState.d.ts.map +0 -1
  402. package/src/engine/graphics/render/layers/RenderLayerManagerState.js +0 -48
  403. package/src/engine/graphics/render/layers/RenderLayerState.d.ts +0 -18
  404. package/src/engine/graphics/render/layers/RenderLayerState.d.ts.map +0 -1
  405. package/src/engine/graphics/render/layers/RenderLayerState.js +0 -27
  406. package/src/engine/graphics/render/layers/RenderLayerUtils.d.ts +0 -8
  407. package/src/engine/graphics/render/layers/RenderLayerUtils.d.ts.map +0 -1
  408. package/src/engine/graphics/render/layers/RenderLayerUtils.js +0 -103
  409. package/src/engine/graphics/render/make_bvh_visibility_builder.d.ts +0 -10
  410. package/src/engine/graphics/render/make_bvh_visibility_builder.d.ts.map +0 -1
  411. package/src/engine/graphics/render/make_bvh_visibility_builder.js +0 -64
  412. package/src/engine/graphics/render/view/CameraViewFlags.d.ts +0 -7
  413. package/src/engine/graphics/render/view/CameraViewFlags.d.ts.map +0 -1
  414. package/src/engine/graphics/render/view/CameraViewFlags.js +0 -9
  415. package/src/engine/graphics/render/visibility/IncrementalDeltaSet.d.ts +0 -143
  416. package/src/engine/graphics/render/visibility/IncrementalDeltaSet.d.ts.map +0 -1
  417. package/src/engine/graphics/render/visibility/IncrementalDeltaSet.js +0 -328
  418. package/src/engine/graphics/render/visibility/VisibilityComputer.d.ts +0 -39
  419. package/src/engine/graphics/render/visibility/VisibilityComputer.d.ts.map +0 -1
  420. package/src/engine/graphics/render/visibility/VisibilityComputer.js +0 -80
  421. package/src/engine/graphics/render/visibility/VisibilityFilter.d.ts +0 -29
  422. package/src/engine/graphics/render/visibility/VisibilityFilter.d.ts.map +0 -1
  423. package/src/engine/graphics/render/visibility/VisibilityFilter.js +0 -37
  424. package/src/engine/graphics3/animation/write_graph_playback.d.ts +0 -24
  425. package/src/engine/graphics3/animation/write_graph_playback.d.ts.map +0 -1
  426. package/src/engine/graphics3/animation/write_graph_playback.js +0 -48
  427. package/src/shade/renderer/deferred/TonemapDisplaySettings.d.ts.map +0 -1
  428. package/src/shade/renderer/deferred/shader_tonemap_HDR.d.ts.map +0 -1
  429. package/src/shade/renderer/deferred/shader_tonemap_HDR_none.d.ts.map +0 -1
  430. package/src/shade/renderer/deferred/shader_tonemap_HDR_pbr_neutral.d.ts.map +0 -1
  431. package/src/shade/renderer/deferred/shader_tonemap_LDR.d.ts.map +0 -1
  432. package/src/shade/renderer/deferred/shader_tonemap_LDR_none.d.ts.map +0 -1
  433. package/src/shade/renderer/deferred/shader_tonemap_LDR_pbr_neutral.d.ts.map +0 -1
@@ -0,0 +1,692 @@
1
+ import { m3_invert } from "../../../../../../../core/geom/mat3/m3_invert.js";
2
+ import { m3_multiply } from "../../../../../../../core/geom/mat3/m3_multiply.js";
3
+ import { m3_rgb_to_xyz_from_primaries } from "../../../../../../../core/color/xyz/m3_rgb_to_xyz_from_primaries.js";
4
+
5
+ /*
6
+ The CPU half of the ACES 2.0 output transform: everything OpenColorIO's `init_*` functions compute from a display's
7
+ peak and limiting primaries, written as one block of floats that `chunk_aces2_output_transform` reads.
8
+
9
+ Ported from OpenColorIO v2.6.0 (BSD-3-Clause), src/OpenColorIO/ops/fixedfunction/ACES2/Transform.cpp, which is the
10
+ Academy's reference (ampas/aces-core, Lib.Academy.OutputTransform.ctl) with its gamut tables. Matrices are row-major
11
+ here and `M · v` everywhere, as in that file.
12
+ */
13
+
14
+ /** hue tables: 360 one-degree entries, one lower and two upper wrap entries */
15
+ const NOMINAL = 360;
16
+ const TOTAL = NOMINAL + 3;
17
+ const FIRST_NOMINAL = 1;
18
+ const UPPER_WRAP = FIRST_NOMINAL + NOMINAL;
19
+ const LAST_NOMINAL = UPPER_WRAP - 1;
20
+ const LOWER_WRAP = 0;
21
+
22
+ const REFERENCE_LUMINANCE = 100;
23
+ const L_A = 100;
24
+ const Y_B = 20;
25
+ const SURROUND = [0.9, 0.59, 0.9];
26
+ const J_SCALE = 100;
27
+ const CAM_NL_OFFSET = 0.2713 * 100;
28
+ const CAM_NL_SCALE = 4 * 100;
29
+
30
+ const CHROMA_COMPRESS = 2.4;
31
+ const CHROMA_COMPRESS_FACT = 3.3;
32
+ const CHROMA_EXPAND = 1.3;
33
+ const CHROMA_EXPAND_FACT = 0.69;
34
+ const CHROMA_EXPAND_THR = 0.5;
35
+
36
+ const SMOOTH_CUSPS = 0.12;
37
+ const SMOOTH_M = 0.27;
38
+ const CUSP_MID_BLEND = 1.3;
39
+ const FOCUS_GAIN_BLEND = 0.3;
40
+ const FOCUS_DISTANCE = 1.35;
41
+ const FOCUS_DISTANCE_SCALING = 1.75;
42
+
43
+ const GAMMA_MINIMUM = 0;
44
+ const GAMMA_MAXIMUM = 5;
45
+ const GAMMA_SEARCH_STEP = 0.4;
46
+ const GAMMA_ACCURACY = 1e-5;
47
+ const REACH_CUSP_TOLERANCE = 1e-3;
48
+ const DISPLAY_CUSP_TOLERANCE = 1e-7;
49
+
50
+ /** red, green, blue and white xy */
51
+ const PRIMARIES_CAM16 = [0.8336, 0.1735, 2.3854, -1.4659, 0.087, -0.125, 0.333, 0.333];
52
+ const PRIMARIES_AP0 = [0.7347, 0.2653, 0.0, 1.0, 0.0001, -0.0770, 0.32168, 0.33767];
53
+ const PRIMARIES_AP1 = [0.713, 0.293, 0.165, 0.830, 0.128, 0.044, 0.32168, 0.33767];
54
+
55
+ /**
56
+ * Rec.709's red, green, blue and white xy: the limiting primaries the ACES tone mapping uses.
57
+ * @type {number[]}
58
+ */
59
+ export const ACES2_LIMITING_REC709 = [0.64, 0.33, 0.30, 0.60, 0.15, 0.06, 0.3127, 0.3290];
60
+
61
+ /*
62
+ The block, in floats. Matrices are three columns of three, so WGSL reads a column with three loads.
63
+ */
64
+ /** limiting primaries to the CAM16 cone space, white-adapted */
65
+ export const ACES2_OUT_RGB_TO_CAM = 0;
66
+ export const ACES2_OUT_CAM_TO_RGB = 9;
67
+ /** ACES2065-1 (AP0) to the cone space and back */
68
+ export const ACES2_IN_RGB_TO_CAM = 18;
69
+ export const ACES2_IN_CAM_TO_RGB = 27;
70
+ /** compressed cone response to achromatic and opponent (A, a, b) and back; the same for every set of primaries */
71
+ export const ACES2_CONE_TO_AAB = 36;
72
+ export const ACES2_AAB_TO_CONE = 45;
73
+ /**
74
+ * scalars, in this order: limit_J_max, model_gamma_inv, mid_J, focus_dist, lower_hull_gamma_inv, s_2, m_2, g, t_1,
75
+ * n_r, inverse_limit, AP1 upper bound, sat, sat_thr, compr, chroma_compress_scale, peak / 100, F_L_n, cz, inv_cz,
76
+ * A_w_J, inv_A_w_J, the hue search range's lower and upper offsets
77
+ */
78
+ export const ACES2_SCALARS = 54;
79
+ export const ACES2_SCALAR_COUNT = 24;
80
+ /** TOTAL entries of (hue, cusp J, cusp M, upper hull inverse gamma) */
81
+ export const ACES2_CUSP_TABLE = ACES2_SCALARS + ACES2_SCALAR_COUNT;
82
+ /** TOTAL entries of the reach gamut's M at limit_J_max, one per degree from the first nominal entry */
83
+ export const ACES2_REACH_TABLE = ACES2_CUSP_TABLE + TOTAL * 4;
84
+ /** floats in one block */
85
+ export const ACES2_BLOCK_FLOATS = ACES2_REACH_TABLE + TOTAL;
86
+
87
+ // ---------------------------------------------------------------------------------------------------------------
88
+ // matrices, row-major
89
+
90
+ function rgb_to_xyz(out, P) {
91
+ m3_rgb_to_xyz_from_primaries(out, P.slice(0, 6), P[6], P[7]);
92
+ return out;
93
+ }
94
+
95
+ function mul_m3_v3(out, M, x, y, z) {
96
+ out[0] = M[0] * x + M[1] * y + M[2] * z;
97
+ out[1] = M[3] * x + M[4] * y + M[5] * z;
98
+ out[2] = M[6] * x + M[7] * y + M[8] * z;
99
+ return out;
100
+ }
101
+
102
+ // ---------------------------------------------------------------------------------------------------------------
103
+ // the colour appearance model (CAM16 in Hellwig's 2022 form)
104
+
105
+ function model_gamma() {
106
+ return SURROUND[1] * (1.48 + Math.sqrt(Y_B / REFERENCE_LUMINANCE));
107
+ }
108
+
109
+ function pacrc_fwd(v) {
110
+ const F = Math.pow(Math.abs(v), 0.42);
111
+ const Ra = F / (CAM_NL_OFFSET + F);
112
+ return v < 0 ? -Ra : Ra;
113
+ }
114
+
115
+ function pacrc_inv(v) {
116
+ const a = Math.min(Math.abs(v), 0.99);
117
+ const F = CAM_NL_OFFSET * a / (1 - a);
118
+ const Rc = Math.pow(F, 1 / 0.42);
119
+ return v < 0 ? -Rc : Rc;
120
+ }
121
+
122
+ /**
123
+ * OCIO's JMhParams for one set of primaries.
124
+ */
125
+ class JMhParams {
126
+ rgb_to_cam = new Float64Array(9);
127
+ cam_to_rgb = new Float64Array(9);
128
+ cone_to_Aab = new Float64Array(9);
129
+ Aab_to_cone = new Float64Array(9);
130
+ F_L_n = 0;
131
+ cz = 0;
132
+ inv_cz = 0;
133
+ A_w_J = 0;
134
+ inv_A_w_J = 0;
135
+
136
+ /**
137
+ * @param {number[]} P red, green, blue and white xy
138
+ */
139
+ constructor(P) {
140
+ const base = [2, 1, 1 / 20, 1, -12 / 11, 1 / 11, 1 / 9, 1 / 9, -2 / 9];
141
+
142
+ const m16 = rgb_to_xyz(new Float64Array(9), PRIMARIES_CAM16);
143
+ m3_invert(m16, m16);
144
+
145
+ const to_xyz = rgb_to_xyz(new Float64Array(9), P);
146
+ const XYZ_w = mul_m3_v3([0, 0, 0], to_xyz, REFERENCE_LUMINANCE, REFERENCE_LUMINANCE, REFERENCE_LUMINANCE);
147
+ const Y_W = XYZ_w[1];
148
+ const RGB_w = mul_m3_v3([0, 0, 0], m16, XYZ_w[0], XYZ_w[1], XYZ_w[2]);
149
+
150
+ const K = 1 / (5 * L_A + 1);
151
+ const K4 = K * K * K * K;
152
+ const F_L = 0.2 * K4 * (5 * L_A) + 0.1 * Math.pow(1 - K4, 2) * Math.pow(5 * L_A, 1 / 3);
153
+
154
+ this.F_L_n = F_L / REFERENCE_LUMINANCE;
155
+ this.cz = model_gamma();
156
+ this.inv_cz = 1 / this.cz;
157
+
158
+ const D = [0, 1, 2].map(i => this.F_L_n * Y_W / RGB_w[i]);
159
+ const RGB_AW = [0, 1, 2].map(i => pacrc_fwd(D[i] * RGB_w[i]));
160
+
161
+ const A_w = CAM_NL_SCALE * (base[0] * RGB_AW[0] + base[1] * RGB_AW[1] + base[2] * RGB_AW[2]);
162
+
163
+ this.A_w_J = pacrc_fwd(F_L);
164
+ this.inv_A_w_J = 1 / this.A_w_J;
165
+
166
+ // limiting primaries to CAM16, prescaled by the reference luminance and the white's discount
167
+ const xyz_to_cam = m16;
168
+ const to_cam = new Float64Array(9);
169
+ m3_multiply(to_cam, xyz_to_cam, to_xyz);
170
+ for (let row = 0; row < 3; row++) {
171
+ for (let column = 0; column < 3; column++) {
172
+ this.rgb_to_cam[row * 3 + column] = D[row] * to_cam[row * 3 + column] * REFERENCE_LUMINANCE;
173
+ }
174
+ }
175
+ m3_invert(this.cam_to_rgb, this.rgb_to_cam);
176
+
177
+ for (let column = 0; column < 3; column++) {
178
+ this.cone_to_Aab[column] = CAM_NL_SCALE * base[column] / A_w;
179
+ this.cone_to_Aab[3 + column] = CAM_NL_SCALE * base[3 + column] * 43 * SURROUND[2];
180
+ this.cone_to_Aab[6 + column] = CAM_NL_SCALE * base[6 + column] * 43 * SURROUND[2];
181
+ }
182
+ m3_invert(this.Aab_to_cone, this.cone_to_Aab);
183
+ }
184
+ }
185
+
186
+ const scratch_v = [0, 0, 0];
187
+ const scratch_c = [0, 0, 0];
188
+
189
+ function RGB_to_Aab(out, r, g, b, p) {
190
+ mul_m3_v3(scratch_c, p.rgb_to_cam, r, g, b);
191
+ return mul_m3_v3(out, p.cone_to_Aab, pacrc_fwd(scratch_c[0]), pacrc_fwd(scratch_c[1]), pacrc_fwd(scratch_c[2]));
192
+ }
193
+
194
+ /** JMh from Aab, in place */
195
+ function Aab_to_JMh(v, p) {
196
+ if (v[0] <= 0) {
197
+ v[0] = 0;
198
+ v[1] = 0;
199
+ v[2] = 0;
200
+ return v;
201
+ }
202
+ const J = J_SCALE * Math.pow(v[0], p.cz);
203
+ const M = Math.sqrt(v[1] * v[1] + v[2] * v[2]);
204
+ let h = 180 * Math.atan2(v[2], v[1]) / Math.PI;
205
+ if (h < 0) {
206
+ h += 360;
207
+ }
208
+ v[0] = J;
209
+ v[1] = M;
210
+ v[2] = h;
211
+ return v;
212
+ }
213
+
214
+ function RGB_to_JMh(out, r, g, b, p) {
215
+ return Aab_to_JMh(RGB_to_Aab(out, r, g, b, p), p);
216
+ }
217
+
218
+ function JMh_to_RGB(out, J, M, h, p) {
219
+ const hr = h * Math.PI / 180;
220
+ const A = Math.pow(J / J_SCALE, p.inv_cz);
221
+ mul_m3_v3(scratch_c, p.Aab_to_cone, A, M * Math.cos(hr), M * Math.sin(hr));
222
+ return mul_m3_v3(out, p.cam_to_rgb, pacrc_inv(scratch_c[0]), pacrc_inv(scratch_c[1]), pacrc_inv(scratch_c[2]));
223
+ }
224
+
225
+ function Y_to_J(Y, p) {
226
+ const abs_Y = Math.abs(Y);
227
+ const J = J_SCALE * Math.pow(pacrc_fwd(abs_Y * p.F_L_n) * p.inv_A_w_J, p.cz);
228
+ return Y < 0 ? -J : J;
229
+ }
230
+
231
+ // ---------------------------------------------------------------------------------------------------------------
232
+ // gamut compression helpers the table search evaluates
233
+
234
+ function get_focus_gain(J, threshold, J_max, focus_dist) {
235
+ let gain = J_max * focus_dist;
236
+ if (J > threshold) {
237
+ const adjustment = Math.log10((J_max - threshold) / Math.max(0.0001, J_max - J));
238
+ gain *= adjustment * adjustment + 1;
239
+ }
240
+ return gain;
241
+ }
242
+
243
+ function solve_J_intersect(J, M, focusJ, maxJ, slope_gain) {
244
+ const M_scaled = M / slope_gain;
245
+ const a = M_scaled / focusJ;
246
+ if (J < focusJ) {
247
+ const b = 1 - M_scaled;
248
+ const c = -J;
249
+ return -2 * c / (b + Math.sqrt(b * b - 4 * a * c));
250
+ }
251
+ const b = -(1 + M_scaled + maxJ * a);
252
+ const c = maxJ * M_scaled + J;
253
+ return -2 * c / (b - Math.sqrt(b * b - 4 * a * c));
254
+ }
255
+
256
+ function smin_scaled(a, b, reference) {
257
+ const s = SMOOTH_CUSPS * reference;
258
+ const h = Math.max(s - Math.abs(a - b), 0) / s;
259
+ return Math.min(a, b) - h * h * h * s / 6;
260
+ }
261
+
262
+ function compression_vector_slope(J_intersect, focusJ, J_max, slope_gain) {
263
+ const direction = J_intersect < focusJ ? J_intersect : J_max - J_intersect;
264
+ return direction * (J_intersect - focusJ) / (focusJ * slope_gain);
265
+ }
266
+
267
+ function line_boundary_M(J_axis_intersect, slope, inv_gamma, J_max, M_max, J_reference) {
268
+ const shifted = J_reference * Math.pow(J_axis_intersect / J_reference, inv_gamma);
269
+ return shifted * M_max / (J_max - slope * M_max);
270
+ }
271
+
272
+ function gamut_boundary_M(cusp_J, cusp_M, J_max, gamma_top_inv, gamma_bottom_inv, J_intersect_source, slope, J_intersect_cusp) {
273
+ const lower = line_boundary_M(J_intersect_source, slope, gamma_bottom_inv, cusp_J, cusp_M, J_intersect_cusp);
274
+ const upper = line_boundary_M(J_max - J_intersect_source, -slope, gamma_top_inv, J_max - cusp_J, cusp_M, J_max - J_intersect_cusp);
275
+ return smin_scaled(lower, upper, cusp_M);
276
+ }
277
+
278
+ function compute_focusJ(cusp_J, mid_J, J_max) {
279
+ const t = Math.min(1, CUSP_MID_BLEND - cusp_J / J_max);
280
+ return cusp_J + (mid_J - cusp_J) * t;
281
+ }
282
+
283
+ // ---------------------------------------------------------------------------------------------------------------
284
+ // tables
285
+
286
+ function unit_cube_corner(out, i) {
287
+ out[0] = ((i + 1) % 6) < 3 ? 1 : 0;
288
+ out[1] = ((i + 5) % 6) < 3 ? 1 : 0;
289
+ out[2] = ((i + 3) % 6) < 3 ? 1 : 0;
290
+ return out;
291
+ }
292
+
293
+ /**
294
+ * Six corners, lowest hue at [1], wrapped at [0] and [7] with their hues taken out of [0, 360).
295
+ * @returns {{rgb: number[][], jmh: number[][]}}
296
+ */
297
+ function cycle_corners(rgb6, jmh6) {
298
+ let lowest = 0;
299
+ for (let i = 0; i < 6; i++) {
300
+ if (jmh6[i][2] < jmh6[lowest][2]) {
301
+ lowest = i;
302
+ }
303
+ }
304
+ const rgb = new Array(8);
305
+ const jmh = new Array(8);
306
+ for (let i = 0; i < 6; i++) {
307
+ rgb[i + 1] = rgb6[(i + lowest) % 6];
308
+ jmh[i + 1] = jmh6[(i + lowest) % 6].slice();
309
+ }
310
+ rgb[0] = rgb[6];
311
+ rgb[7] = rgb[1];
312
+ jmh[0] = jmh[6].slice();
313
+ jmh[7] = jmh[1].slice();
314
+ jmh[0][2] -= 360;
315
+ jmh[7][2] += 360;
316
+ return { rgb, jmh };
317
+ }
318
+
319
+ function limiting_corners(p, peak) {
320
+ const rgb6 = [];
321
+ const jmh6 = [];
322
+ for (let i = 0; i < 6; i++) {
323
+ const c = unit_cube_corner([0, 0, 0], i).map(v => v * peak / REFERENCE_LUMINANCE);
324
+ rgb6.push(c);
325
+ jmh6.push(RGB_to_JMh([0, 0, 0], c[0], c[1], c[2], p));
326
+ }
327
+ return cycle_corners(rgb6, jmh6);
328
+ }
329
+
330
+ function reach_corners(p, limit_J, maximum_source) {
331
+ const limit_A = Math.pow(limit_J / J_SCALE, p.inv_cz);
332
+ const jmh6 = [];
333
+ const corner = [0, 0, 0];
334
+ for (let i = 0; i < 6; i++) {
335
+ unit_cube_corner(corner, i);
336
+ let lower = 0;
337
+ let upper = maximum_source;
338
+ while (upper - lower > REACH_CUSP_TOLERANCE) {
339
+ const test = (lower + upper) / 2;
340
+ const A = RGB_to_Aab(scratch_v, test * corner[0], test * corner[1], test * corner[2], p)[0];
341
+ if (A < limit_A) {
342
+ lower = test;
343
+ } else {
344
+ upper = test;
345
+ }
346
+ if (A === limit_A) {
347
+ break;
348
+ }
349
+ }
350
+ jmh6.push(RGB_to_JMh([0, 0, 0], upper * corner[0], upper * corner[1], upper * corner[2], p));
351
+ }
352
+ return cycle_corners(jmh6, jmh6).jmh;
353
+ }
354
+
355
+ function sorted_cube_hues(reach, display) {
356
+ const out = [];
357
+ let r = 1;
358
+ let d = 1;
359
+ while (r < 7 || d < 7) {
360
+ const reach_hue = reach[r][2];
361
+ const display_hue = display[d][2];
362
+ if (reach_hue === display_hue) {
363
+ out.push(reach_hue);
364
+ r++;
365
+ d++;
366
+ } else if (reach_hue < display_hue) {
367
+ out.push(reach_hue);
368
+ r++;
369
+ } else {
370
+ out.push(display_hue);
371
+ d++;
372
+ }
373
+ }
374
+ return out;
375
+ }
376
+
377
+ function build_hue_table(hues) {
378
+ const table = new Float64Array(TOTAL);
379
+ const counts = new Array(14).fill(0);
380
+ let last = -1;
381
+ let min_index = hues[0] === 0 ? 0 : 1;
382
+
383
+ for (let k = 0; k < hues.length; k++) {
384
+ // std::round, half away from zero
385
+ let nominal = Math.min(Math.max(Math.floor(hues[k] * (NOMINAL / 360) + 0.5), min_index), NOMINAL - 1);
386
+ if (last === nominal) {
387
+ if (k > 1 && counts[k - 2] !== counts[k - 1] - 1) {
388
+ counts[k - 1] -= 1;
389
+ } else {
390
+ nominal += 1;
391
+ }
392
+ }
393
+ counts[k] = Math.min(nominal, NOMINAL - 1);
394
+ last = min_index = nominal;
395
+ }
396
+
397
+ let total = 0;
398
+ const interval = (samples, lower, upper, base) => {
399
+ const delta = (upper - lower) / samples;
400
+ for (let i = 0; i < samples; i++) {
401
+ table[base + i] = lower + i * delta;
402
+ }
403
+ };
404
+
405
+ interval(counts[0], 0, hues[0], total + 1);
406
+ total += counts[0];
407
+ let i = 1;
408
+ for (; i < hues.length; i++) {
409
+ const samples = counts[i] - counts[i - 1];
410
+ interval(samples, hues[i - 1], hues[i], total + 1);
411
+ total += samples;
412
+ }
413
+ interval(NOMINAL - total, hues[i - 1], 360, total + 1);
414
+
415
+ table[LOWER_WRAP] = table[LAST_NOMINAL] - 360;
416
+ table[UPPER_WRAP] = table[FIRST_NOMINAL] + 360;
417
+ table[UPPER_WRAP + 1] = table[FIRST_NOMINAL + 1] + 360;
418
+ return table;
419
+ }
420
+
421
+ function find_display_cusp(out, hue, rgb, jmh, p, previous) {
422
+ let upper = 1;
423
+ for (let i = 1; i < 8; i++) {
424
+ if (jmh[i][2] > hue) {
425
+ upper = i;
426
+ break;
427
+ }
428
+ }
429
+ const lower = upper - 1;
430
+ if (jmh[lower][2] === hue) {
431
+ out[0] = jmh[lower][0];
432
+ out[1] = jmh[lower][1];
433
+ return out;
434
+ }
435
+
436
+ const a = rgb[lower];
437
+ const b = rgb[upper];
438
+ let lower_t = upper === previous[0] ? previous[1] : 0;
439
+ let upper_t = 1;
440
+ const sample = [0, 0, 0];
441
+
442
+ while (upper_t - lower_t > DISPLAY_CUSP_TOLERANCE) {
443
+ const t = (lower_t + upper_t) / 2;
444
+ RGB_to_JMh(sample, a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t, a[2] + (b[2] - a[2]) * t, p);
445
+ if (sample[2] < jmh[lower][2]) {
446
+ upper_t = t;
447
+ } else if (sample[2] >= jmh[upper][2]) {
448
+ lower_t = t;
449
+ } else if (sample[2] > hue) {
450
+ upper_t = t;
451
+ } else {
452
+ lower_t = t;
453
+ }
454
+ }
455
+
456
+ const t = (lower_t + upper_t) / 2;
457
+ RGB_to_JMh(sample, a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t, a[2] + (b[2] - a[2]) * t, p);
458
+ previous[0] = upper;
459
+ previous[1] = t;
460
+ out[0] = sample[0];
461
+ out[1] = sample[1];
462
+ return out;
463
+ }
464
+
465
+ function make_reach_table(table, p, limit_J_max) {
466
+ const rgb = [0, 0, 0];
467
+ const outside = (M, hue) => {
468
+ JMh_to_RGB(rgb, limit_J_max, M, hue, p);
469
+ return rgb[0] < 0 || rgb[1] < 0 || rgb[2] < 0;
470
+ };
471
+ for (let i = 0; i < NOMINAL; i++) {
472
+ const hue = i;
473
+ let low = 0;
474
+ let high = 50;
475
+ let is_outside = false;
476
+ while (!is_outside && high < 1300) {
477
+ is_outside = outside(high, hue);
478
+ if (!is_outside) {
479
+ low = high;
480
+ high += 50;
481
+ }
482
+ }
483
+ while (high - low > 1e-2) {
484
+ const M = (high + low) / 2;
485
+ if (outside(M, hue)) {
486
+ high = M;
487
+ } else {
488
+ low = M;
489
+ }
490
+ }
491
+ table[i + FIRST_NOMINAL] = high;
492
+ }
493
+ table[LOWER_WRAP] = table[LAST_NOMINAL];
494
+ table[UPPER_WRAP] = table[FIRST_NOMINAL];
495
+ table[UPPER_WRAP + 1] = table[FIRST_NOMINAL + 1];
496
+ }
497
+
498
+ const GAMMA_TEST_POSITIONS = [0.01, 0.1, 0.5, 0.8, 0.99];
499
+
500
+ function gamma_fits(cusp_J, cusp_M, hue, J_max, mid_J, focus_dist, gamma_top_inv, peak, gamma_bottom_inv, p) {
501
+ const threshold = cusp_J + (J_max - cusp_J) * FOCUS_GAIN_BLEND;
502
+ const focusJ = compute_focusJ(cusp_J, mid_J, J_max);
503
+ const luminance_limit = peak / REFERENCE_LUMINANCE;
504
+ const rgb = [0, 0, 0];
505
+
506
+ for (let i = 0; i < GAMMA_TEST_POSITIONS.length; i++) {
507
+ const test_J = cusp_J + (J_max - cusp_J) * GAMMA_TEST_POSITIONS[i];
508
+ const gain = get_focus_gain(test_J, threshold, J_max, focus_dist);
509
+ const J_intersect_source = solve_J_intersect(test_J, cusp_M, focusJ, J_max, gain);
510
+ const slope = compression_vector_slope(J_intersect_source, focusJ, J_max, gain);
511
+ const J_intersect_cusp = solve_J_intersect(cusp_J, cusp_M, focusJ, J_max, gain);
512
+
513
+ const M = gamut_boundary_M(cusp_J, cusp_M, J_max, gamma_top_inv, gamma_bottom_inv, J_intersect_source, slope, J_intersect_cusp);
514
+ const J = J_intersect_source + slope * M;
515
+
516
+ JMh_to_RGB(rgb, J, M, hue, p);
517
+ if (!(rgb[0] > luminance_limit || rgb[1] > luminance_limit || rgb[2] > luminance_limit)) {
518
+ return false;
519
+ }
520
+ }
521
+ return true;
522
+ }
523
+
524
+ // ---------------------------------------------------------------------------------------------------------------
525
+
526
+ const PARAMS_AP0 = new JMhParams(PRIMARIES_AP0);
527
+ const PARAMS_AP1 = new JMhParams(PRIMARIES_AP1);
528
+
529
+ /**
530
+ * @param {Float32Array} out
531
+ * @param {number} offset
532
+ * @param {Float64Array} M row-major
533
+ */
534
+ function write_columns(out, offset, M) {
535
+ for (let column = 0; column < 3; column++) {
536
+ for (let row = 0; row < 3; row++) {
537
+ out[offset + column * 3 + row] = M[row * 3 + column];
538
+ }
539
+ }
540
+ }
541
+
542
+ /**
543
+ * Fill one block of the ACES 2.0 output transform for a display: its peak and the primaries it limits to.
544
+ *
545
+ * Matches OpenColorIO's `ACES_OUTPUT_TRANSFORM_20` set up with the same two values, and the builtin transforms' AP1
546
+ * clamp before it and clamp at the peak after it. Takes a few tens of milliseconds, so it is for a display that
547
+ * changed, not for a frame.
548
+ *
549
+ * @param {Float32Array} out
550
+ * @param {number} offset first float of the block
551
+ * @param {number} peak_nits the display's peak, cd/m², where 100 is what an exposed 1.0 shows at
552
+ * @param {number[]} limiting red, green, blue and white xy
553
+ */
554
+ export function aces2_transform_block_write(out, offset, peak_nits, limiting) {
555
+ const p_out = new JMhParams(limiting);
556
+ const p_in = PARAMS_AP0;
557
+ const reach = PARAMS_AP1;
558
+
559
+ // tone scale, init_ToneScaleParams
560
+ const n = peak_nits;
561
+ const n_r = 100;
562
+ const g = 1.15;
563
+ const c = 0.18;
564
+ const c_d = 10.013;
565
+ const w_g = 0.14;
566
+ const t_1 = 0.04;
567
+ const r_hit = 128 + (896 - 128) * (Math.log(n / n_r) / Math.log(10000 / 100));
568
+ const m_0 = n / n_r;
569
+ const m_1 = 0.5 * (m_0 + Math.sqrt(m_0 * (m_0 + 4 * t_1)));
570
+ const u = Math.pow((r_hit / m_1) / ((r_hit / m_1) + 1), g);
571
+ const m = m_1 / u;
572
+ const w_i = Math.log(n / 100) / Math.log(2);
573
+ const c_t = c_d / n_r * (1 + w_i * w_g);
574
+ const g_ip = 0.5 * (c_t + Math.sqrt(c_t * (c_t + 4 * t_1)));
575
+ const g_ipp2 = -(m_1 * Math.pow(g_ip / m, 1 / g)) / (Math.pow(g_ip / m, 1 / g) - 1);
576
+ const w_2 = c / g_ipp2;
577
+ const s_2 = w_2 * m_1 * REFERENCE_LUMINANCE;
578
+ const u_2 = Math.pow((r_hit / m_1) / ((r_hit / m_1) + w_2), g);
579
+ const m_2 = m_1 / u_2;
580
+ const inverse_limit = n / (u_2 * n_r);
581
+ const forward_limit = 8 * r_hit;
582
+ const log_peak = Math.log10(n / n_r);
583
+
584
+ // shared, chroma and gamut parameters
585
+ const limit_J_max = Y_to_J(peak_nits, p_in);
586
+ const model_gamma_inv = 1 / model_gamma();
587
+
588
+ const compr = CHROMA_COMPRESS + CHROMA_COMPRESS * CHROMA_COMPRESS_FACT * log_peak;
589
+ const sat = Math.max(0.2, CHROMA_EXPAND - CHROMA_EXPAND * CHROMA_EXPAND_FACT * log_peak);
590
+ const sat_thr = CHROMA_EXPAND_THR / n;
591
+ const chroma_compress_scale = Math.pow(0.03379 * peak_nits, 0.30596) - 0.45135;
592
+
593
+ const mid_J = Y_to_J(c_t * REFERENCE_LUMINANCE, p_in);
594
+ const focus_dist = FOCUS_DISTANCE + FOCUS_DISTANCE * FOCUS_DISTANCE_SCALING * log_peak;
595
+ const lower_hull_gamma_inv = 1 / (1.14 + 0.07 * log_peak);
596
+
597
+ // reach table
598
+ const reach_table = new Float64Array(TOTAL);
599
+ make_reach_table(reach_table, reach, limit_J_max);
600
+
601
+ // hue and cusp tables
602
+ const reach_jmh = reach_corners(reach, limit_J_max, forward_limit);
603
+ const corners = limiting_corners(p_out, peak_nits);
604
+ const hue_table = build_hue_table(sorted_cube_hues(reach_jmh, corners.jmh));
605
+
606
+ const cusp = new Float64Array(TOTAL * 3);
607
+ const previous = [0, 0];
608
+ const JM = [0, 0];
609
+ for (let i = FIRST_NOMINAL; i < UPPER_WRAP; i++) {
610
+ find_display_cusp(JM, hue_table[i], corners.rgb, corners.jmh, p_out, previous);
611
+ cusp[i * 3] = JM[0];
612
+ cusp[i * 3 + 1] = JM[1] * (1 + SMOOTH_M * SMOOTH_CUSPS);
613
+ cusp[i * 3 + 2] = hue_table[i];
614
+ }
615
+ for (const [to, from] of [[LOWER_WRAP, LAST_NOMINAL], [UPPER_WRAP, FIRST_NOMINAL], [UPPER_WRAP + 1, FIRST_NOMINAL + 1]]) {
616
+ cusp[to * 3] = cusp[from * 3];
617
+ cusp[to * 3 + 1] = cusp[from * 3 + 1];
618
+ cusp[to * 3 + 2] = hue_table[to];
619
+ }
620
+
621
+ // how far the searched hue table strays from one entry a degree
622
+ let search_lower = 0;
623
+ let search_upper = 1;
624
+ for (let i = FIRST_NOMINAL; i < UPPER_WRAP; i++) {
625
+ const position = FIRST_NOMINAL + Math.trunc(cusp[i * 3 + 2]);
626
+ const delta = i - position;
627
+ search_lower = Math.min(search_lower, delta);
628
+ search_upper = Math.max(search_upper, delta + 1);
629
+ }
630
+
631
+ // upper hull gamma, make_upper_hull_gamma; overwrites the hue in the third column
632
+ for (let i = FIRST_NOMINAL; i < UPPER_WRAP; i++) {
633
+ const hue = hue_table[i];
634
+ const cusp_J = cusp[i * 3];
635
+ const cusp_M = cusp[i * 3 + 1];
636
+ const fits = gamma => gamma_fits(cusp_J, cusp_M, hue, limit_J_max, mid_J, focus_dist, 1 / gamma, peak_nits, lower_hull_gamma_inv, p_out);
637
+
638
+ let low = GAMMA_MINIMUM;
639
+ let high = low + GAMMA_SEARCH_STEP;
640
+ let found = false;
641
+ while (!found && high < GAMMA_MAXIMUM) {
642
+ if (fits(high)) {
643
+ found = true;
644
+ } else {
645
+ low = high;
646
+ high += GAMMA_SEARCH_STEP;
647
+ }
648
+ }
649
+ while (high - low > GAMMA_ACCURACY) {
650
+ const test = (high + low) / 2;
651
+ if (fits(test)) {
652
+ high = test;
653
+ } else {
654
+ low = test;
655
+ }
656
+ }
657
+ cusp[i * 3 + 2] = 1 / high;
658
+ }
659
+ cusp[LOWER_WRAP * 3 + 2] = cusp[LAST_NOMINAL * 3 + 2];
660
+ cusp[UPPER_WRAP * 3 + 2] = cusp[FIRST_NOMINAL * 3 + 2];
661
+ cusp[(UPPER_WRAP + 1) * 3 + 2] = cusp[(FIRST_NOMINAL + 1) * 3 + 2];
662
+
663
+ // write
664
+ write_columns(out, offset + ACES2_OUT_RGB_TO_CAM, p_out.rgb_to_cam);
665
+ write_columns(out, offset + ACES2_OUT_CAM_TO_RGB, p_out.cam_to_rgb);
666
+ write_columns(out, offset + ACES2_IN_RGB_TO_CAM, p_in.rgb_to_cam);
667
+ write_columns(out, offset + ACES2_IN_CAM_TO_RGB, p_in.cam_to_rgb);
668
+ write_columns(out, offset + ACES2_CONE_TO_AAB, p_in.cone_to_Aab);
669
+ write_columns(out, offset + ACES2_AAB_TO_CONE, p_in.Aab_to_cone);
670
+
671
+ const ap1_upper_bound = 8 * (128 + 768 * (Math.log(peak_nits / 100) / Math.log(10000 / 100)));
672
+
673
+ const scalars = [
674
+ limit_J_max, model_gamma_inv, mid_J, focus_dist,
675
+ lower_hull_gamma_inv, s_2, m_2, g,
676
+ t_1, n_r, inverse_limit, ap1_upper_bound,
677
+ sat, sat_thr, compr, chroma_compress_scale,
678
+ peak_nits / REFERENCE_LUMINANCE, p_in.F_L_n, p_in.cz, p_in.inv_cz,
679
+ p_in.A_w_J, p_in.inv_A_w_J, search_lower, search_upper,
680
+ ];
681
+ for (let i = 0; i < ACES2_SCALAR_COUNT; i++) {
682
+ out[offset + ACES2_SCALARS + i] = scalars[i];
683
+ }
684
+
685
+ for (let i = 0; i < TOTAL; i++) {
686
+ out[offset + ACES2_CUSP_TABLE + i * 4] = hue_table[i];
687
+ out[offset + ACES2_CUSP_TABLE + i * 4 + 1] = cusp[i * 3];
688
+ out[offset + ACES2_CUSP_TABLE + i * 4 + 2] = cusp[i * 3 + 1];
689
+ out[offset + ACES2_CUSP_TABLE + i * 4 + 3] = cusp[i * 3 + 2];
690
+ out[offset + ACES2_REACH_TABLE + i] = reach_table[i];
691
+ }
692
+ }