@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,25 @@
1
+ /**
2
+ * The ACES 2.0 output transform, forward and inverse, for a display whose parameters and gamut tables sit in
3
+ * `aces2_tables` from float `block` on, as {@link aces2_transform_block_write} lays them out.
4
+ *
5
+ * This is OpenColorIO v2.6.0's `ACES_OUTPUT_TRANSFORM_20` (ops/fixedfunction/ACES2/Transform.cpp), which implements the
6
+ * Academy's reference, with what OCIO's builtin output transforms put around it: a clamp of the input to the AP1
7
+ * gamut and to the tone scale's reach, and a clamp of the output to the display's peak. Units on the display side are
8
+ * 100 cd/m² to 1.0.
9
+ *
10
+ * - `aces2_forward(block, aces)`: ACES2065-1 (AP0) in, display-linear RGB in the block's limiting primaries out.
11
+ * - `aces2_inverse(block, rgb)`: the way back, which needs the same block.
12
+ *
13
+ * One difference from OCIO, where OCIO produces a NaN: the gamut boundary's power is taken of a base clamped at zero.
14
+ * A colour at the display's peak white can put the J intersection a rounding error past the upper hull, and OCIO's
15
+ * `powf` of the negative base returns NaN there.
16
+ *
17
+ * Reads a storage binding `aces2_tables: array<f32>`, declared by the pass.
18
+ *
19
+ * @see https://github.com/ampas/aces-core
20
+ * @see https://github.com/AcademySoftwareFoundation/OpenColorIO/tree/main/src/OpenColorIO/ops/fixedfunction/ACES2
21
+ * @type {CodeChunk}
22
+ */
23
+ export const chunk_aces2_output_transform: CodeChunk;
24
+ import { CodeChunk } from "../../../../compiler/CodeChunk.js";
25
+ //# sourceMappingURL=chunk_aces2_output_transform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk_aces2_output_transform.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_aces2_output_transform.js"],"names":[],"mappings":"AAcA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,2CAFU,SAAS,CA2ZjB;0BA7bwB,mCAAmC"}
@@ -0,0 +1,446 @@
1
+ import { CodeChunk } from "../../../../compiler/CodeChunk.js";
2
+ import {
3
+ ACES2_AAB_TO_CONE,
4
+ ACES2_CONE_TO_AAB,
5
+ ACES2_CUSP_TABLE,
6
+ ACES2_IN_CAM_TO_RGB,
7
+ ACES2_IN_RGB_TO_CAM,
8
+ ACES2_OUT_CAM_TO_RGB,
9
+ ACES2_OUT_RGB_TO_CAM,
10
+ ACES2_REACH_TABLE,
11
+ ACES2_SCALARS
12
+ } from "./aces2_transform_block.js";
13
+ import { chunk_aces_ue_matrices } from "./chunk_aces_ue_matrices.js";
14
+
15
+ /**
16
+ * The ACES 2.0 output transform, forward and inverse, for a display whose parameters and gamut tables sit in
17
+ * `aces2_tables` from float `block` on, as {@link aces2_transform_block_write} lays them out.
18
+ *
19
+ * This is OpenColorIO v2.6.0's `ACES_OUTPUT_TRANSFORM_20` (ops/fixedfunction/ACES2/Transform.cpp), which implements the
20
+ * Academy's reference, with what OCIO's builtin output transforms put around it: a clamp of the input to the AP1
21
+ * gamut and to the tone scale's reach, and a clamp of the output to the display's peak. Units on the display side are
22
+ * 100 cd/m² to 1.0.
23
+ *
24
+ * - `aces2_forward(block, aces)`: ACES2065-1 (AP0) in, display-linear RGB in the block's limiting primaries out.
25
+ * - `aces2_inverse(block, rgb)`: the way back, which needs the same block.
26
+ *
27
+ * One difference from OCIO, where OCIO produces a NaN: the gamut boundary's power is taken of a base clamped at zero.
28
+ * A colour at the display's peak white can put the J intersection a rounding error past the upper hull, and OCIO's
29
+ * `powf` of the negative base returns NaN there.
30
+ *
31
+ * Reads a storage binding `aces2_tables: array<f32>`, declared by the pass.
32
+ *
33
+ * @see https://github.com/ampas/aces-core
34
+ * @see https://github.com/AcademySoftwareFoundation/OpenColorIO/tree/main/src/OpenColorIO/ops/fixedfunction/ACES2
35
+ * @type {CodeChunk}
36
+ */
37
+ export const chunk_aces2_output_transform = CodeChunk.from(
38
+ //language=WGSL
39
+ `
40
+ const ACES2_CAM_NL_OFFSET: f32 = 27.13;
41
+ const ACES2_J_SCALE: f32 = 100.0;
42
+ const ACES2_SMOOTH_CUSPS: f32 = 0.12;
43
+ const ACES2_CUSP_MID_BLEND: f32 = 1.3;
44
+ const ACES2_FOCUS_GAIN_BLEND: f32 = 0.3;
45
+ const ACES2_COMPRESSION_THRESHOLD: f32 = 0.75;
46
+ const ACES2_DEGREES_PER_RADIAN: f32 = 57.29577951308232;
47
+ // how far below the peak's J the inverse starts fading out its gamut decompression; see aces2_gamut_compress
48
+ const ACES2_INVERSE_FADE_J: f32 = 1.0;
49
+ // the most the inverse's gamut decompression multiplies colourfulness by; see aces2_gamut_compress
50
+ const ACES2_INVERSE_GAIN_LIMIT: f32 = 5.0;
51
+
52
+ fn aces2_scalar(block: u32, index: u32) -> f32 {
53
+ return aces2_tables[block + ${ACES2_SCALARS}u + index];
54
+ }
55
+
56
+ fn aces2_matrix(at: u32) -> mat3x3<f32> {
57
+ return mat3x3<f32>(
58
+ vec3<f32>(aces2_tables[at], aces2_tables[at + 1u], aces2_tables[at + 2u]),
59
+ vec3<f32>(aces2_tables[at + 3u], aces2_tables[at + 4u], aces2_tables[at + 5u]),
60
+ vec3<f32>(aces2_tables[at + 6u], aces2_tables[at + 7u], aces2_tables[at + 8u])
61
+ );
62
+ }
63
+
64
+ // post-adaptation cone response compression, odd in its argument
65
+ fn aces2_compress_cone(v: vec3<f32>) -> vec3<f32> {
66
+ let F = pow(abs(v), vec3<f32>(0.42));
67
+ return sign(v) * F / (ACES2_CAM_NL_OFFSET + F);
68
+ }
69
+
70
+ fn aces2_compress_cone_inverse(v: vec3<f32>) -> vec3<f32> {
71
+ let a = min(abs(v), vec3<f32>(0.99));
72
+ let F = ACES2_CAM_NL_OFFSET * a / (1.0 - a);
73
+ return sign(v) * pow(F, vec3<f32>(1.0 / 0.42));
74
+ }
75
+
76
+ fn aces2_compress_cone_scalar(v: f32) -> f32 {
77
+ let F = pow(abs(v), 0.42);
78
+ return sign(v) * F / (ACES2_CAM_NL_OFFSET + F);
79
+ }
80
+
81
+ fn aces2_compress_cone_inverse_scalar(v: f32) -> f32 {
82
+ let a = min(abs(v), 0.99);
83
+ return sign(v) * pow(ACES2_CAM_NL_OFFSET * a / (1.0 - a), 1.0 / 0.42);
84
+ }
85
+
86
+ // RGB to (A, a, b), through the given primaries' adapted cone space
87
+ fn aces2_rgb_to_Aab(block: u32, rgb_to_cam: u32, rgb: vec3<f32>) -> vec3<f32> {
88
+ let cone = aces2_matrix(block + rgb_to_cam) * rgb;
89
+ return aces2_matrix(block + ${ACES2_CONE_TO_AAB}u) * aces2_compress_cone(cone);
90
+ }
91
+
92
+ fn aces2_Aab_to_rgb(block: u32, cam_to_rgb: u32, Aab: vec3<f32>) -> vec3<f32> {
93
+ let cone = aces2_matrix(block + ${ACES2_AAB_TO_CONE}u) * Aab;
94
+ return aces2_matrix(block + cam_to_rgb) * aces2_compress_cone_inverse(cone);
95
+ }
96
+
97
+ fn aces2_Aab_to_JMh(block: u32, Aab: vec3<f32>) -> vec3<f32> {
98
+ if (Aab.x <= 0.0) {
99
+ return vec3<f32>(0.0);
100
+ }
101
+ let J = ACES2_J_SCALE * pow(Aab.x, aces2_scalar(block, 18u));
102
+ let M = length(Aab.yz);
103
+ var h = atan2(Aab.z, Aab.y) * ACES2_DEGREES_PER_RADIAN;
104
+ if (h < 0.0) {
105
+ h += 360.0;
106
+ }
107
+ return vec3<f32>(J, M, h);
108
+ }
109
+
110
+ fn aces2_J_to_A(block: u32, J: f32) -> f32 {
111
+ return pow(J / ACES2_J_SCALE, aces2_scalar(block, 19u));
112
+ }
113
+
114
+ // achromatic response to luminance, and luminance to lightness J, for the AP0 input
115
+ fn aces2_A_to_Y(block: u32, A: f32) -> f32 {
116
+ return aces2_compress_cone_inverse_scalar(aces2_scalar(block, 20u) * A) / aces2_scalar(block, 17u);
117
+ }
118
+
119
+ fn aces2_Y_to_J(block: u32, Y: f32) -> f32 {
120
+ let Ra = aces2_compress_cone_scalar(Y * aces2_scalar(block, 17u));
121
+ return ACES2_J_SCALE * pow(Ra * aces2_scalar(block, 21u), aces2_scalar(block, 18u));
122
+ }
123
+
124
+ // the tone scale, in luminance, 1.0 = 100 cd/m² on the way out
125
+ fn aces2_tonescale(block: u32, Y: f32) -> f32 {
126
+ let s_2 = aces2_scalar(block, 5u);
127
+ let m_2 = aces2_scalar(block, 6u);
128
+ let g = aces2_scalar(block, 7u);
129
+ let t_1 = aces2_scalar(block, 8u);
130
+ let n_r = aces2_scalar(block, 9u);
131
+
132
+ let f = m_2 * pow(Y / (Y + s_2), g);
133
+ return max(0.0, f * f / (f + t_1)) * n_r;
134
+ }
135
+
136
+ fn aces2_tonescale_inverse(block: u32, Y: f32) -> f32 {
137
+ let s_2 = aces2_scalar(block, 5u);
138
+ let m_2 = aces2_scalar(block, 6u);
139
+ let g = aces2_scalar(block, 7u);
140
+ let t_1 = aces2_scalar(block, 8u);
141
+ let inverse_limit = aces2_scalar(block, 10u);
142
+
143
+ let Z = clamp(Y / 100.0, 0.0, inverse_limit);
144
+ let f = (Z + sqrt(Z * (4.0 * t_1 + Z))) / 2.0;
145
+ return s_2 / (pow(m_2 / f, 1.0 / g) - 1.0);
146
+ }
147
+
148
+ fn aces2_chroma_compress_norm(cos_h: f32, sin_h: f32, scale: f32) -> f32 {
149
+ let cos_h2 = 2.0 * cos_h * cos_h - 1.0;
150
+ let sin_h2 = 2.0 * cos_h * sin_h;
151
+ let cos_h3 = 4.0 * cos_h * cos_h * cos_h - 3.0 * cos_h;
152
+ let sin_h3 = 3.0 * sin_h - 4.0 * sin_h * sin_h * sin_h;
153
+
154
+ let M = 11.34072 * cos_h + 16.46899 * cos_h2 + 7.88380 * cos_h3
155
+ + 14.66441 * sin_h - 6.37224 * sin_h2 + 9.19364 * sin_h3
156
+ + 77.12896;
157
+
158
+ return M * scale;
159
+ }
160
+
161
+ fn aces2_toe(x: f32, limit: f32, k1_in: f32, k2_in: f32) -> f32 {
162
+ if (x > limit) {
163
+ return x;
164
+ }
165
+ let k2 = max(k2_in, 0.001);
166
+ let k1 = sqrt(k1_in * k1_in + k2 * k2);
167
+ let k3 = (limit + k1) / (limit + k2);
168
+ let minus_b = k3 * x - k1;
169
+ let minus_ac = k2 * k3 * x;
170
+ return 0.5 * (minus_b + sqrt(minus_b * minus_b + 4.0 * minus_ac));
171
+ }
172
+
173
+ fn aces2_toe_inverse(x: f32, limit: f32, k1_in: f32, k2_in: f32) -> f32 {
174
+ if (x > limit) {
175
+ return x;
176
+ }
177
+ let k2 = max(k2_in, 0.001);
178
+ let k1 = sqrt(k1_in * k1_in + k2 * k2);
179
+ let k3 = (limit + k1) / (limit + k2);
180
+ return (x * x + k1 * x) / (k3 * (x + k2));
181
+ }
182
+
183
+ // M of the reach gamut at limit_J_max, one table entry a degree
184
+ fn aces2_reach_M(block: u32, h: f32) -> f32 {
185
+ let base = u32(h);
186
+ let t = h - f32(base);
187
+ let at = block + ${ACES2_REACH_TABLE}u + 1u + base;
188
+ return mix(aces2_tables[at], aces2_tables[at + 1u], t);
189
+ }
190
+
191
+ fn aces2_cusp_entry(block: u32, i: i32) -> vec4<f32> {
192
+ let at = block + ${ACES2_CUSP_TABLE}u + u32(i) * 4u;
193
+ return vec4<f32>(aces2_tables[at], aces2_tables[at + 1u], aces2_tables[at + 2u], aces2_tables[at + 3u]);
194
+ }
195
+
196
+ // (cusp J, cusp M, upper hull 1 / gamma) at hue h, from the non-uniform hue table
197
+ fn aces2_cusp(block: u32, h: f32) -> vec3<f32> {
198
+ var i = 1 + i32(h);
199
+ var i_lo = max(0, i + i32(aces2_scalar(block, 22u)));
200
+ var i_hi = min(361, i + i32(aces2_scalar(block, 23u)));
201
+
202
+ // a handful of steps: the table strays from one entry a degree by a few entries at most, and 9 halvings cover
203
+ // all 363
204
+ for (var step = 0; step < 9; step++) {
205
+ if (i_lo + 1 >= i_hi) {
206
+ break;
207
+ }
208
+ if (h > aces2_cusp_entry(block, i).x) {
209
+ i_lo = i;
210
+ } else {
211
+ i_hi = i;
212
+ }
213
+ i = (i_lo + i_hi) / 2;
214
+ }
215
+ i_hi = max(1, i_hi);
216
+
217
+ let lower = aces2_cusp_entry(block, i_hi - 1);
218
+ let upper = aces2_cusp_entry(block, i_hi);
219
+ let t = (h - lower.x) / (upper.x - lower.x);
220
+ return mix(lower.yzw, upper.yzw, t);
221
+ }
222
+
223
+ fn aces2_focus_gain(J: f32, threshold: f32, J_max: f32, focus_dist: f32) -> f32 {
224
+ var gain = J_max * focus_dist;
225
+ if (J > threshold) {
226
+ let adjustment = log2((J_max - threshold) / max(0.0001, J_max - J)) * 0.30102999566398120;
227
+ gain *= adjustment * adjustment + 1.0;
228
+ }
229
+ return gain;
230
+ }
231
+
232
+ fn aces2_solve_J_intersect(J: f32, M: f32, focusJ: f32, J_max: f32, slope_gain: f32) -> f32 {
233
+ let M_scaled = M / slope_gain;
234
+ let a = M_scaled / focusJ;
235
+ if (J < focusJ) {
236
+ let b = 1.0 - M_scaled;
237
+ let c = -J;
238
+ return -2.0 * c / (b + sqrt(b * b - 4.0 * a * c));
239
+ }
240
+ let b = -(1.0 + M_scaled + J_max * a);
241
+ let c = J_max * M_scaled + J;
242
+ return -2.0 * c / (b - sqrt(b * b - 4.0 * a * c));
243
+ }
244
+
245
+ fn aces2_line_boundary_M(J_axis_intersect: f32, slope: f32, inv_gamma: f32, J_max: f32, M_max: f32, J_reference: f32) -> f32 {
246
+ let shifted = J_reference * pow(max(J_axis_intersect / J_reference, 0.0), inv_gamma);
247
+ return shifted * M_max / (J_max - slope * M_max);
248
+ }
249
+
250
+ fn aces2_remap_M(M: f32, gamut_M: f32, reach_M: f32, inverse: bool) -> f32 {
251
+ let proportion = max(gamut_M / reach_M, ACES2_COMPRESSION_THRESHOLD);
252
+ let threshold = proportion * gamut_M;
253
+ if (M <= threshold || proportion >= 1.0) {
254
+ return M;
255
+ }
256
+
257
+ let m_offset = M - threshold;
258
+ let gamut_offset = gamut_M - threshold;
259
+ let reach_offset = reach_M - threshold;
260
+ let scale = reach_offset / ((reach_offset / gamut_offset) - 1.0);
261
+ let nd = m_offset / scale;
262
+
263
+ if (inverse) {
264
+ if (nd >= 1.0) {
265
+ return threshold + scale;
266
+ }
267
+ return threshold + scale * -(nd / (nd - 1.0));
268
+ }
269
+ return threshold + scale * nd / (1.0 + nd);
270
+ }
271
+
272
+ // compressGamut: pulls (J, M) toward the focus point onto the display's gamut, or back out of it
273
+ fn aces2_gamut_compress(block: u32, JMh: vec3<f32>, Jx: f32, reach_M: f32, cusp: vec3<f32>, inverse: bool) -> vec3<f32> {
274
+ let J_max = aces2_scalar(block, 0u);
275
+ let model_gamma_inv = aces2_scalar(block, 1u);
276
+ let mid_J = aces2_scalar(block, 2u);
277
+ let focus_dist = aces2_scalar(block, 3u);
278
+ let gamma_bottom_inv = aces2_scalar(block, 4u);
279
+
280
+ let focusJ = mix(cusp.x, mid_J, min(1.0, ACES2_CUSP_MID_BLEND - cusp.x / J_max));
281
+ let threshold = mix(cusp.x, J_max, ACES2_FOCUS_GAIN_BLEND);
282
+
283
+ let slope_gain = aces2_focus_gain(Jx, threshold, J_max, focus_dist);
284
+ let J_intersect_source = aces2_solve_J_intersect(JMh.x, JMh.y, focusJ, J_max, slope_gain);
285
+ let direction = select(J_max - J_intersect_source, J_intersect_source, J_intersect_source < focusJ);
286
+ let slope = direction * (J_intersect_source - focusJ) / (focusJ * slope_gain);
287
+ let J_intersect_cusp = aces2_solve_J_intersect(cusp.x, cusp.y, focusJ, J_max, slope_gain);
288
+
289
+ // find_gamut_boundary_intersection: the lower hull, and the upper one flipped about J_max, smoothly minimised
290
+ let lower = aces2_line_boundary_M(J_intersect_source, slope, gamma_bottom_inv, cusp.x, cusp.y, J_intersect_cusp);
291
+ let upper = aces2_line_boundary_M(J_max - J_intersect_source, -slope, cusp.z, J_max - cusp.x, cusp.y, J_max - J_intersect_cusp);
292
+ let s = ACES2_SMOOTH_CUSPS * cusp.y;
293
+ let k = max(s - abs(lower - upper), 0.0) / s;
294
+ let gamut_M = min(lower, upper) - k * k * k * s * (1.0 / 6.0);
295
+
296
+ if (gamut_M <= 0.0) {
297
+ return vec3<f32>(JMh.x, 0.0, JMh.z);
298
+ }
299
+
300
+ let reach_boundary_M = aces2_line_boundary_M(J_intersect_source, slope, model_gamma_inv, J_max, reach_M, J_max);
301
+
302
+ // Going back, a colour past the estimated gamut boundary is one the forward transform never writes: the estimate
303
+ // lies inside the display's real gamut, and OCIO's inverse extrapolates from there toward infinity, then snaps.
304
+ // Clamped at the boundary it comes back as the reach boundary, which the forward transform takes to it.
305
+ var M_source = JMh.y;
306
+ if (inverse) {
307
+ M_source = min(M_source, gamut_M);
308
+ }
309
+ var M = aces2_remap_M(M_source, gamut_M, reach_boundary_M, inverse);
310
+
311
+ // In the last unit of J before the peak, the display's gamut closes on white while the reach does not, so the
312
+ // inverse multiplies colourfulness by hundreds to thousands, where everywhere below that unit it multiplies by
313
+ // under 4.9 (3,000 Filmic outputs), and white itself, past J_max, comes back neutral. So the gain is held to what
314
+ // the rest of the gamut sees, which keeps float32 rounding from being multiplied a thousandfold, and fades out
315
+ // over that unit, which takes a near-white colour continuously to the neutral that white goes to.
316
+ if (inverse) {
317
+ M = min(M, ACES2_INVERSE_GAIN_LIMIT * M_source);
318
+ M = mix(M, M_source, smoothstep(J_max - ACES2_INVERSE_FADE_J, J_max, JMh.x));
319
+ }
320
+
321
+ return vec3<f32>(J_intersect_source + M * slope, M, JMh.z);
322
+ }
323
+
324
+ fn aces2_clamp_to_ap1(block: u32, aces: vec3<f32>) -> vec3<f32> {
325
+ let upper_bound = aces2_scalar(block, 11u);
326
+ return UE_AP1_TO_AP0 * clamp(UE_AP0_TO_AP1 * aces, vec3<f32>(0.0), vec3<f32>(upper_bound));
327
+ }
328
+
329
+ fn aces2_forward(block: u32, aces_in: vec3<f32>) -> vec3<f32> {
330
+ let J_max = aces2_scalar(block, 0u);
331
+ let model_gamma_inv = aces2_scalar(block, 1u);
332
+
333
+ let aces = aces2_clamp_to_ap1(block, aces_in);
334
+
335
+ let Aab = aces2_rgb_to_Aab(block, ${ACES2_IN_RGB_TO_CAM}u, aces);
336
+ let JMh = aces2_Aab_to_JMh(block, Aab);
337
+ let h = JMh.z;
338
+
339
+ let reach_M = aces2_reach_M(block, h);
340
+ let h_rad = h / ACES2_DEGREES_PER_RADIAN;
341
+ let cos_h = cos(h_rad);
342
+ let sin_h = sin(h_rad);
343
+ let M_norm = aces2_chroma_compress_norm(cos_h, sin_h, aces2_scalar(block, 15u));
344
+
345
+ // the tone scale, applied to the achromatic response's luminance. A response at or under zero comes out at zero,
346
+ // which is where OCIO's max(0, NaN) lands it
347
+ var Y_ts = 0.0;
348
+ if (Aab.x > 0.0) {
349
+ Y_ts = aces2_tonescale(block, aces2_A_to_Y(block, Aab.x));
350
+ }
351
+ let J_ts = aces2_Y_to_J(block, Y_ts);
352
+
353
+ // chroma compression
354
+ var M = JMh.y;
355
+ if (M != 0.0) {
356
+ let sat = aces2_scalar(block, 12u);
357
+ let sat_thr = aces2_scalar(block, 13u);
358
+ let compr = aces2_scalar(block, 14u);
359
+
360
+ let nJ = J_ts / J_max;
361
+ let snJ = max(0.0, 1.0 - nJ);
362
+ let limit = pow(nJ, model_gamma_inv) * reach_M / M_norm;
363
+
364
+ M = M * pow(J_ts / JMh.x, model_gamma_inv) / M_norm;
365
+ M = limit - aces2_toe(limit - M, limit - 0.001, snJ * sat, sqrt(nJ * nJ + sat_thr));
366
+ M = aces2_toe(M, limit, nJ * compr, snJ);
367
+ M = M * M_norm;
368
+ }
369
+
370
+ // gamut compression
371
+ var compressed = vec3<f32>(J_ts, M, h);
372
+ if (J_ts <= 0.0) {
373
+ compressed = vec3<f32>(0.0, 0.0, h);
374
+ } else if (M <= 0.0 || J_ts > J_max) {
375
+ compressed = vec3<f32>(J_ts, 0.0, h);
376
+ } else {
377
+ compressed = aces2_gamut_compress(block, compressed, J_ts, reach_M, aces2_cusp(block, h), false);
378
+ }
379
+
380
+ let Aab_out = vec3<f32>(aces2_J_to_A(block, compressed.x), compressed.y * cos_h, compressed.y * sin_h);
381
+ let rgb = aces2_Aab_to_rgb(block, ${ACES2_OUT_CAM_TO_RGB}u, Aab_out);
382
+
383
+ return clamp(rgb, vec3<f32>(0.0), vec3<f32>(aces2_scalar(block, 16u)));
384
+ }
385
+
386
+ fn aces2_inverse(block: u32, rgb_in: vec3<f32>) -> vec3<f32> {
387
+ let J_max = aces2_scalar(block, 0u);
388
+ let model_gamma_inv = aces2_scalar(block, 1u);
389
+
390
+ let rgb = clamp(rgb_in, vec3<f32>(0.0), vec3<f32>(aces2_scalar(block, 16u)));
391
+
392
+ let JMh = aces2_Aab_to_JMh(block, aces2_rgb_to_Aab(block, ${ACES2_OUT_RGB_TO_CAM}u, rgb));
393
+ let h = JMh.z;
394
+
395
+ let reach_M = aces2_reach_M(block, h);
396
+ let h_rad = h / ACES2_DEGREES_PER_RADIAN;
397
+ let cos_h = cos(h_rad);
398
+ let sin_h = sin(h_rad);
399
+ let M_norm = aces2_chroma_compress_norm(cos_h, sin_h, aces2_scalar(block, 15u));
400
+
401
+ // gamut compression, undone; above the analytical threshold J itself is estimated by one compression first
402
+ var tonemapped = JMh;
403
+ if (JMh.x <= 0.0) {
404
+ tonemapped = vec3<f32>(0.0, 0.0, h);
405
+ } else if (JMh.y <= 0.0 || JMh.x > J_max) {
406
+ tonemapped = vec3<f32>(JMh.x, 0.0, h);
407
+ } else {
408
+ let cusp = aces2_cusp(block, h);
409
+ let threshold = mix(cusp.x, J_max, ACES2_FOCUS_GAIN_BLEND);
410
+ var Jx = JMh.x;
411
+ if (Jx > threshold) {
412
+ Jx = aces2_gamut_compress(block, JMh, Jx, reach_M, cusp, true).x;
413
+ }
414
+ tonemapped = aces2_gamut_compress(block, JMh, Jx, reach_M, cusp, true);
415
+ }
416
+
417
+ // the tone scale, undone
418
+ let J_ts = tonemapped.x;
419
+ let Y_in = aces2_A_to_Y(block, aces2_J_to_A(block, abs(J_ts)));
420
+ let J = sign(J_ts) * aces2_Y_to_J(block, aces2_tonescale_inverse(block, Y_in));
421
+
422
+ // chroma compression, undone
423
+ var M = tonemapped.y;
424
+ if (M != 0.0) {
425
+ let sat = aces2_scalar(block, 12u);
426
+ let sat_thr = aces2_scalar(block, 13u);
427
+ let compr = aces2_scalar(block, 14u);
428
+
429
+ let nJ = J_ts / J_max;
430
+ let snJ = max(0.0, 1.0 - nJ);
431
+ let limit = pow(nJ, model_gamma_inv) * reach_M / M_norm;
432
+
433
+ M = M / M_norm;
434
+ M = aces2_toe_inverse(M, limit, nJ * compr, snJ);
435
+ M = limit - aces2_toe_inverse(limit - M, limit - 0.001, snJ * sat, sqrt(nJ * nJ + sat_thr));
436
+ M = M * M_norm * pow(J_ts / J, -model_gamma_inv);
437
+ }
438
+
439
+ let Aab = vec3<f32>(aces2_J_to_A(block, J), M * cos_h, M * sin_h);
440
+ let aces = aces2_Aab_to_rgb(block, ${ACES2_IN_CAM_TO_RGB}u, Aab);
441
+
442
+ return aces2_clamp_to_ap1(block, aces);
443
+ }
444
+ `,
445
+ [chunk_aces_ue_matrices]
446
+ );
@@ -0,0 +1,22 @@
1
+ /**
2
+ * The colour matrices of Unreal Engine 5.4's default tone mapping, each the product UE forms from the constants in
3
+ * `Engine/Shaders/Private/ACES.ush`, taken in float64 and written out. `M * v` here is UE's `mul(M, v)`.
4
+ *
5
+ * - `UE_REC709_TO_AP1`, `UE_AP1_TO_REC709`: UE's default working space (sRGB primaries, D65) to ACEScg and back,
6
+ * through XYZ with UE's Bradford D65/D60 adaptation (`XYZ_2_AP1_MAT · D65_2_D60_CAT · sRGB_2_XYZ_MAT`).
7
+ * - `UE_AP1_TO_AP0`, `UE_AP0_TO_AP1`: `AP1_2_AP0_MAT` and `AP0_2_AP1_MAT` as UE spells them.
8
+ * - `UE_EXPAND_GAMUT`: PostProcessCombineLUTs.usf's `ExpandMat`, from sRGB toward the "wide" primaries the file
9
+ * lists, `(XYZ_2_AP1_MAT · Wide_2_XYZ_MAT) · AP1_2_sRGB`. UE applies no adaptation on the wide side, and nor does
10
+ * this.
11
+ * - `UE_BLUE_CORRECT`, `UE_BLUE_CORRECT_INVERSE`: the file's `BlueCorrect` and `BlueCorrectInv`, both defined on
12
+ * AP0, conjugated into AP1 (`AP0_2_AP1 · BlueCorrect · AP1_2_AP0`).
13
+ *
14
+ * `UE_AP1_LUMINANCE` is `AP1_RGB2Y`, the Y row of `AP1_2_XYZ_MAT`.
15
+ *
16
+ * @see chunk_tonemap_ue_filmic
17
+ * @see chunk_aces2_output_transform
18
+ * @type {CodeChunk}
19
+ */
20
+ export const chunk_aces_ue_matrices: CodeChunk;
21
+ import { CodeChunk } from "../../../../compiler/CodeChunk.js";
22
+ //# sourceMappingURL=chunk_aces_ue_matrices.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk_aces_ue_matrices.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_aces_ue_matrices.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;GAkBG;AACH,qCAFU,SAAS,CAgDjB;0BAnEwB,mCAAmC"}
@@ -0,0 +1,68 @@
1
+ import { CodeChunk } from "../../../../compiler/CodeChunk.js";
2
+
3
+ /**
4
+ * The colour matrices of Unreal Engine 5.4's default tone mapping, each the product UE forms from the constants in
5
+ * `Engine/Shaders/Private/ACES.ush`, taken in float64 and written out. `M * v` here is UE's `mul(M, v)`.
6
+ *
7
+ * - `UE_REC709_TO_AP1`, `UE_AP1_TO_REC709`: UE's default working space (sRGB primaries, D65) to ACEScg and back,
8
+ * through XYZ with UE's Bradford D65/D60 adaptation (`XYZ_2_AP1_MAT · D65_2_D60_CAT · sRGB_2_XYZ_MAT`).
9
+ * - `UE_AP1_TO_AP0`, `UE_AP0_TO_AP1`: `AP1_2_AP0_MAT` and `AP0_2_AP1_MAT` as UE spells them.
10
+ * - `UE_EXPAND_GAMUT`: PostProcessCombineLUTs.usf's `ExpandMat`, from sRGB toward the "wide" primaries the file
11
+ * lists, `(XYZ_2_AP1_MAT · Wide_2_XYZ_MAT) · AP1_2_sRGB`. UE applies no adaptation on the wide side, and nor does
12
+ * this.
13
+ * - `UE_BLUE_CORRECT`, `UE_BLUE_CORRECT_INVERSE`: the file's `BlueCorrect` and `BlueCorrectInv`, both defined on
14
+ * AP0, conjugated into AP1 (`AP0_2_AP1 · BlueCorrect · AP1_2_AP0`).
15
+ *
16
+ * `UE_AP1_LUMINANCE` is `AP1_RGB2Y`, the Y row of `AP1_2_XYZ_MAT`.
17
+ *
18
+ * @see chunk_tonemap_ue_filmic
19
+ * @see chunk_aces2_output_transform
20
+ * @type {CodeChunk}
21
+ */
22
+ export const chunk_aces_ue_matrices = CodeChunk.from(
23
+ //language=WGSL
24
+ `
25
+ const UE_AP1_LUMINANCE = vec3<f32>(0.2722287168, 0.6740817658, 0.0536895174);
26
+
27
+ const UE_REC709_TO_AP1 = mat3x3<f32>(
28
+ vec3<f32>( 0.6130974024, 0.0701937225, 0.0206155929),
29
+ vec3<f32>( 0.3395231461, 0.9163538791, 0.1095697729),
30
+ vec3<f32>( 0.0473794514, 0.0134523986, 0.8698146341)
31
+ );
32
+
33
+ const UE_AP1_TO_REC709 = mat3x3<f32>(
34
+ vec3<f32>( 1.7050509926, -0.1302564175, -0.0240033568),
35
+ vec3<f32>(-0.6217921205, 1.1408047365, -0.1289689761),
36
+ vec3<f32>(-0.0832588722, -0.0105483190, 1.1529723328)
37
+ );
38
+
39
+ const UE_AP1_TO_AP0 = mat3x3<f32>(
40
+ vec3<f32>( 0.6954522414, 0.0447945634, -0.0055258826),
41
+ vec3<f32>( 0.1406786965, 0.8596711185, 0.0040252103),
42
+ vec3<f32>( 0.1638690622, 0.0955343182, 1.0015006723)
43
+ );
44
+
45
+ const UE_AP0_TO_AP1 = mat3x3<f32>(
46
+ vec3<f32>( 1.4514393161, -0.0765537734, 0.0083161484),
47
+ vec3<f32>(-0.2365107469, 1.1762296998, -0.0060324498),
48
+ vec3<f32>(-0.2149285693, -0.0996759264, 0.9977163014)
49
+ );
50
+
51
+ const UE_EXPAND_GAMUT = mat3x3<f32>(
52
+ vec3<f32>( 1.3704123718, -0.0834334917, -0.0257933209),
53
+ vec3<f32>(-0.3292921877, 1.0970927480, -0.0986257988),
54
+ vec3<f32>(-0.0636831194, -0.0108613795, 1.2036949526)
55
+ );
56
+
57
+ const UE_BLUE_CORRECT = mat3x3<f32>(
58
+ vec3<f32>( 0.9386393778, 0.0000000001, 0.0000000000),
59
+ vec3<f32>( 0.0000000001, 0.8307941329, 0.0000000000),
60
+ vec3<f32>( 0.0613606221, 0.1692058671, 1.0000000000)
61
+ );
62
+
63
+ const UE_BLUE_CORRECT_INVERSE = mat3x3<f32>(
64
+ vec3<f32>( 1.0653748754, -0.0000003455, 0.0000000199),
65
+ vec3<f32>( 0.0000014468, 1.2036635244, 0.0000000212),
66
+ vec3<f32>(-0.0653710053, -0.2036677199, 0.9999996001)
67
+ );`
68
+ );
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Unreal Engine's default SDR tone mapping, "Filmic", with every setting at its default.
3
+ *
4
+ * A line-for-line port of UE 5.4's `CombineLUTsCommon` (PostProcessCombineLUTs.usf) for the sRGB output device and
5
+ * `FilmToneMap` (TonemapCommon.ush), as UE evaluates them into its colour grading LUT, here evaluated per pixel:
6
+ *
7
+ * 1. into ACEScg (AP1) from UE's default sRGB working space;
8
+ * 2. Expand Gamut at its default 1.0, which pushes bright saturated colours toward wider primaries;
9
+ * 3. the colour corrections at their defaults, which only clamp AP1 at zero;
10
+ * 4. Blue Correction at its default 0.6, a matrix that turns bright blue toward cyan rather than violet, before the
11
+ * curve, and its inverse after;
12
+ * 5. `FilmToneMap` with Slope 0.88, Toe 0.55, Shoulder 0.26, Black Clip 0 and White Clip 0.04 (`FPostProcessSettings`'
13
+ * defaults, Scene.cpp). It is the ACES reference rendering's glow and red modifier and its 0.96 desaturation, then a
14
+ * parametric toe-straight-shoulder curve on log10 of each AP1 channel, solved so that 0.18 comes out at 0.18, then a
15
+ * 0.93 desaturation;
16
+ * 6. back to the working space, clamped at zero, and clipped at 1 as the sRGB target clips it.
17
+ *
18
+ * UE 5.8 keeps Filmic as its default method and its SDR output unchanged. What it does on an HDR display is in
19
+ * shader_tonemap_HDR_aces.
20
+ *
21
+ * Where UE divides 0 by 0 (gamut expansion of black) or takes log10(0), this takes the limit, so black stays black.
22
+ * UE's LUT also limits its input to 43.7, the top of its log encoding; this does not, which moves a few saturated
23
+ * highlights over 43.7 by a few codes.
24
+ *
25
+ * Input: exposed linear Rec.709. Output: display-linear Rec.709 in [0, 1].
26
+ *
27
+ * @see "Color Grading and the Filmic Tonemapper in Unreal Engine", Epic Games
28
+ * @type {CodeChunk}
29
+ */
30
+ export const chunk_tonemap_ue_filmic: CodeChunk;
31
+ import { CodeChunk } from "../../../../compiler/CodeChunk.js";
32
+ //# sourceMappingURL=chunk_tonemap_ue_filmic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk_tonemap_ue_filmic.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_tonemap_ue_filmic.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,sCAFU,SAAS,CAoIjB;0BAlKwB,mCAAmC"}