@woosh/meep-engine 3.50.0 → 3.52.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 (180) hide show
  1. package/package.json +1 -1
  2. package/src/engine/graphics3/make_default_environment.d.ts.map +1 -1
  3. package/src/engine/graphics3/make_default_environment.js +11 -5
  4. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  5. package/src/shade/playground/particle_ecs/moonlit_environment.d.ts.map +1 -1
  6. package/src/shade/playground/particle_ecs/moonlit_environment.js +11 -5
  7. package/src/shade/playground/sh_exponential/sh_exp_playground_shaders.d.ts.map +1 -1
  8. package/src/shade/playground/sh_exponential/sh_exp_playground_shaders.js +3 -1
  9. package/src/shade/playground/tonemap_sdr/README.md +5 -3
  10. package/src/shade/renderer/Renderer.d.ts +1 -1
  11. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  12. package/src/shade/renderer/Renderer.js +43 -15
  13. package/src/shade/renderer/ShadeToneMappingMode.d.ts +3 -2
  14. package/src/shade/renderer/ShadeToneMappingMode.js +15 -4
  15. package/src/shade/renderer/atmosphere/chunk_sample_environment_color.d.ts +3 -0
  16. package/src/shade/renderer/atmosphere/chunk_sample_environment_color.d.ts.map +1 -1
  17. package/src/shade/renderer/atmosphere/chunk_sample_environment_color.js +11 -8
  18. package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.d.ts +6 -0
  19. package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.d.ts.map +1 -1
  20. package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.js +227 -215
  21. package/src/shade/renderer/deferred/SHADING_LIGHT_RESOURCE_GROUP.d.ts.map +1 -1
  22. package/src/shade/renderer/deferred/SHADING_LIGHT_RESOURCE_GROUP.js +2 -0
  23. package/src/shade/renderer/deferred/indirect/chunk_get_ibl_irradiance.d.ts.map +1 -1
  24. package/src/shade/renderer/deferred/indirect/chunk_get_ibl_irradiance.js +4 -2
  25. package/src/shade/renderer/deferred/indirect/chunk_get_ibl_radiance.d.ts.map +1 -1
  26. package/src/shade/renderer/deferred/indirect/chunk_get_ibl_radiance.js +4 -2
  27. package/src/shade/renderer/deferred/shader_background.d.ts.map +1 -1
  28. package/src/shade/renderer/deferred/shader_background.js +4 -2
  29. package/src/shade/renderer/deferred/tonemap/TonemapAces2Tables.d.ts +38 -0
  30. package/src/shade/renderer/deferred/tonemap/TonemapAces2Tables.d.ts.map +1 -0
  31. package/src/shade/renderer/deferred/tonemap/TonemapAces2Tables.js +97 -0
  32. package/src/shade/renderer/deferred/{TonemapDisplaySettings.d.ts → tonemap/TonemapDisplaySettings.d.ts} +1 -1
  33. package/src/shade/renderer/deferred/tonemap/TonemapDisplaySettings.d.ts.map +1 -0
  34. package/src/shade/renderer/deferred/{TonemapDisplaySettings.js → tonemap/TonemapDisplaySettings.js} +5 -5
  35. package/src/shade/renderer/deferred/{shader_tonemap_HDR.d.ts → tonemap/shader_tonemap_HDR.d.ts} +1 -1
  36. package/src/shade/renderer/deferred/tonemap/shader_tonemap_HDR.d.ts.map +1 -0
  37. package/src/shade/renderer/deferred/{shader_tonemap_HDR.js → tonemap/shader_tonemap_HDR.js} +9 -9
  38. package/src/shade/renderer/deferred/tonemap/shader_tonemap_HDR_aces.d.ts +17 -0
  39. package/src/shade/renderer/deferred/tonemap/shader_tonemap_HDR_aces.d.ts.map +1 -0
  40. package/src/shade/renderer/deferred/tonemap/shader_tonemap_HDR_aces.js +101 -0
  41. package/src/shade/renderer/deferred/{shader_tonemap_HDR_none.d.ts → tonemap/shader_tonemap_HDR_none.d.ts} +1 -1
  42. package/src/shade/renderer/deferred/tonemap/shader_tonemap_HDR_none.d.ts.map +1 -0
  43. package/src/shade/renderer/deferred/{shader_tonemap_HDR_none.js → tonemap/shader_tonemap_HDR_none.js} +6 -6
  44. package/src/shade/renderer/deferred/{shader_tonemap_HDR_pbr_neutral.d.ts → tonemap/shader_tonemap_HDR_pbr_neutral.d.ts} +1 -1
  45. package/src/shade/renderer/deferred/tonemap/shader_tonemap_HDR_pbr_neutral.d.ts.map +1 -0
  46. package/src/shade/renderer/deferred/{shader_tonemap_HDR_pbr_neutral.js → tonemap/shader_tonemap_HDR_pbr_neutral.js} +8 -8
  47. package/src/shade/renderer/deferred/{shader_tonemap_LDR.d.ts → tonemap/shader_tonemap_LDR.d.ts} +1 -1
  48. package/src/shade/renderer/deferred/tonemap/shader_tonemap_LDR.d.ts.map +1 -0
  49. package/src/shade/renderer/deferred/{shader_tonemap_LDR.js → tonemap/shader_tonemap_LDR.js} +10 -10
  50. package/src/shade/renderer/deferred/tonemap/shader_tonemap_LDR_aces.d.ts +10 -0
  51. package/src/shade/renderer/deferred/tonemap/shader_tonemap_LDR_aces.d.ts.map +1 -0
  52. package/src/shade/renderer/deferred/tonemap/shader_tonemap_LDR_aces.js +77 -0
  53. package/src/shade/renderer/deferred/{shader_tonemap_LDR_none.d.ts → tonemap/shader_tonemap_LDR_none.d.ts} +1 -1
  54. package/src/shade/renderer/deferred/tonemap/shader_tonemap_LDR_none.d.ts.map +1 -0
  55. package/src/shade/renderer/deferred/{shader_tonemap_LDR_none.js → tonemap/shader_tonemap_LDR_none.js} +7 -7
  56. package/src/shade/renderer/deferred/{shader_tonemap_LDR_pbr_neutral.d.ts → tonemap/shader_tonemap_LDR_pbr_neutral.d.ts} +1 -1
  57. package/src/shade/renderer/deferred/tonemap/shader_tonemap_LDR_pbr_neutral.d.ts.map +1 -0
  58. package/src/shade/renderer/deferred/{shader_tonemap_LDR_pbr_neutral.js → tonemap/shader_tonemap_LDR_pbr_neutral.js} +8 -8
  59. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +3 -3
  60. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +1 -1
  61. package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +6 -6
  62. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +1 -1
  63. package/src/shade/renderer/fluid/query/GPUFluidQueries.d.ts +1 -1
  64. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.d.ts.map +1 -1
  65. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.js +3 -1
  66. package/src/shade/renderer/global_illumination/ibl/shader_diffuse_IBL.d.ts.map +1 -1
  67. package/src/shade/renderer/global_illumination/ibl/shader_diffuse_IBL.js +3 -1
  68. package/src/shade/renderer/global_illumination/ibl/shader_specular_IBL.d.ts.map +1 -1
  69. package/src/shade/renderer/global_illumination/ibl/shader_specular_IBL.js +3 -1
  70. package/src/shade/renderer/global_illumination/lpv/deprecated/probe_trace_compute_shader_code.d.ts.map +1 -1
  71. package/src/shade/renderer/global_illumination/lpv/deprecated/probe_trace_compute_shader_code.js +3 -1
  72. package/src/shade/renderer/global_illumination/probe/octahedral/shader_lpv_build_gbuffer.d.ts.map +1 -1
  73. package/src/shade/renderer/global_illumination/probe/octahedral/shader_lpv_build_gbuffer.js +4 -2
  74. package/src/shade/renderer/light/GPULightCollection.d.ts.map +1 -1
  75. package/src/shade/renderer/light/GPULightCollection.js +44 -0
  76. package/src/shade/renderer/light/environment/ENVIRONMENT_MAP_RESOURCE.d.ts +2 -1
  77. package/src/shade/renderer/light/environment/ENVIRONMENT_MAP_RESOURCE.d.ts.map +1 -1
  78. package/src/shade/renderer/light/environment/ENVIRONMENT_MAP_RESOURCE.js +3 -2
  79. package/src/shade/renderer/light/environment/ENVIRONMENT_MAP_SAMPLER_RESOURCE.d.ts +14 -0
  80. package/src/shade/renderer/light/environment/ENVIRONMENT_MAP_SAMPLER_RESOURCE.d.ts.map +1 -0
  81. package/src/shade/renderer/light/environment/ENVIRONMENT_MAP_SAMPLER_RESOURCE.js +25 -0
  82. package/src/shade/renderer/light/environment/execute_filter_environment_map.d.ts.map +1 -1
  83. package/src/shade/renderer/light/environment/execute_filter_environment_map.js +3 -4
  84. package/src/shade/renderer/light/environment/octahedral_skirt_matches.d.ts +19 -0
  85. package/src/shade/renderer/light/environment/octahedral_skirt_matches.d.ts.map +1 -0
  86. package/src/shade/renderer/light/environment/octahedral_skirt_matches.js +67 -0
  87. package/src/shade/renderer/light/environment/octahedral_skirt_source_texel.d.ts +16 -0
  88. package/src/shade/renderer/light/environment/octahedral_skirt_source_texel.d.ts.map +1 -0
  89. package/src/shade/renderer/light/environment/octahedral_skirt_source_texel.js +35 -0
  90. package/src/shade/renderer/light/environment/resample_cube_to_octahedral.d.ts +7 -2
  91. package/src/shade/renderer/light/environment/resample_cube_to_octahedral.d.ts.map +1 -1
  92. package/src/shade/renderer/light/environment/resample_cube_to_octahedral.js +23 -7
  93. package/src/shade/renderer/light/environment/resample_equirectangular_to_octahedral.d.ts +8 -2
  94. package/src/shade/renderer/light/environment/resample_equirectangular_to_octahedral.d.ts.map +1 -1
  95. package/src/shade/renderer/light/environment/resample_equirectangular_to_octahedral.js +24 -7
  96. package/src/shade/renderer/light/environment/sampler2d_octahedral_skirt_fill.d.ts +12 -0
  97. package/src/shade/renderer/light/environment/sampler2d_octahedral_skirt_fill.d.ts.map +1 -0
  98. package/src/shade/renderer/light/environment/sampler2d_octahedral_skirt_fill.js +54 -0
  99. package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_environment_cells.d.ts +2 -2
  100. package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_environment_cells.d.ts.map +1 -1
  101. package/src/shade/renderer/light/environment/sh_exponential/shader_sh_exp_environment_cells.js +5 -4
  102. package/src/shade/renderer/light/environment/shader_convolve_reflection_map.d.ts.map +1 -1
  103. package/src/shade/renderer/light/environment/shader_convolve_reflection_map.js +13 -9
  104. package/src/shade/renderer/light/environment/shader_project_environment_sh.d.ts.map +1 -1
  105. package/src/shade/renderer/light/environment/shader_project_environment_sh.js +3 -1
  106. package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_irradiance_flat.d.ts.map +1 -1
  107. package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_irradiance_flat.js +3 -1
  108. package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_sh.d.ts.map +1 -1
  109. package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_sh.js +3 -1
  110. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  111. package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.d.ts.map +1 -1
  112. package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.js +3 -1
  113. package/src/shade/renderer/path_tracer/graph_path_trace_scene.d.ts.map +1 -1
  114. package/src/shade/renderer/path_tracer/graph_path_trace_scene.js +3 -1
  115. package/src/shade/renderer/path_tracer/shader/chunk_render_trace_path.js +1 -1
  116. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  117. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.d.ts.map +1 -1
  118. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.js +3 -1
  119. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_CONSTANTS.d.ts +0 -5
  120. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_CONSTANTS.d.ts.map +1 -1
  121. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_CONSTANTS.js +0 -6
  122. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_counts_to_extinction.d.ts.map +1 -1
  123. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_counts_to_extinction.js +4 -1
  124. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -1
  125. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +3 -0
  126. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.d.ts.map +1 -1
  127. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +3 -0
  128. package/src/shade/renderer/shader/chunk/color/tonemap/ACES_TONE_MAPPING_BRIEF_2026_10_17.md +160 -0
  129. package/src/shade/renderer/shader/chunk/color/tonemap/HDR_TONE_MAPPING_FORMS_BRIEF_2026_10_16.md +5 -1
  130. package/src/shade/renderer/shader/chunk/color/tonemap/SDR_TONE_MAPPING_BRIEF_2026_10_16.md +15 -5
  131. package/src/shade/renderer/shader/chunk/color/tonemap/aces/aces2_transform_block.d.ts +41 -0
  132. package/src/shade/renderer/shader/chunk/color/tonemap/aces/aces2_transform_block.d.ts.map +1 -0
  133. package/src/shade/renderer/shader/chunk/color/tonemap/aces/aces2_transform_block.js +692 -0
  134. package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_aces2_output_transform.d.ts +25 -0
  135. package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_aces2_output_transform.d.ts.map +1 -0
  136. package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_aces2_output_transform.js +446 -0
  137. package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_aces_ue_matrices.d.ts +22 -0
  138. package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_aces_ue_matrices.d.ts.map +1 -0
  139. package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_aces_ue_matrices.js +68 -0
  140. package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_tonemap_ue_filmic.d.ts +32 -0
  141. package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_tonemap_ue_filmic.d.ts.map +1 -0
  142. package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_tonemap_ue_filmic.js +163 -0
  143. package/src/shade/renderer/shader/chunk/color/tonemap/chunk_PAPER_WHITE_NITS.d.ts +10 -3
  144. package/src/shade/renderer/shader/chunk/color/tonemap/chunk_PAPER_WHITE_NITS.d.ts.map +1 -1
  145. package/src/shade/renderer/shader/chunk/color/tonemap/chunk_PAPER_WHITE_NITS.js +12 -4
  146. package/src/shade/renderer/shader/chunk/texture/octahedral/chunk_texture_octahedral_skirt_texel_uv.d.ts +15 -0
  147. package/src/shade/renderer/shader/chunk/texture/octahedral/chunk_texture_octahedral_skirt_texel_uv.d.ts.map +1 -0
  148. package/src/shade/renderer/shader/chunk/texture/octahedral/chunk_texture_octahedral_skirt_texel_uv.js +27 -0
  149. package/src/shade/renderer/shader/chunk/texture/octahedral/chunk_texture_octahedral_skirt_uv.d.ts +18 -0
  150. package/src/shade/renderer/shader/chunk/texture/octahedral/chunk_texture_octahedral_skirt_uv.d.ts.map +1 -0
  151. package/src/shade/renderer/shader/chunk/texture/octahedral/chunk_texture_octahedral_skirt_uv.js +24 -0
  152. package/src/shade/renderer/shader/chunk/texture/sample/chunk_sample_environment_map.d.ts +18 -1
  153. package/src/shade/renderer/shader/chunk/texture/sample/chunk_sample_environment_map.d.ts.map +1 -1
  154. package/src/shade/renderer/shader/chunk/texture/sample/chunk_sample_environment_map.js +45 -27
  155. package/src/shade/renderer/view/GPUViewSkyContext.js +169 -169
  156. package/src/shade/renderer/volumetrics/NOTES.md +209 -0
  157. package/src/shade/renderer/volumetrics/VOLUMETRICS_METADATA_STRUCT.d.ts.map +1 -1
  158. package/src/shade/renderer/volumetrics/VOLUMETRICS_METADATA_STRUCT.js +1 -1
  159. package/src/shade/renderer/volumetrics/chunk_volumetrics_media_group_list.d.ts +36 -0
  160. package/src/shade/renderer/volumetrics/chunk_volumetrics_media_group_list.d.ts.map +1 -0
  161. package/src/shade/renderer/volumetrics/chunk_volumetrics_media_group_list.js +129 -0
  162. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
  163. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +75 -0
  164. package/src/shade/renderer/volumetrics/shader_volumetrics_bin_participating_media.d.ts +26 -0
  165. package/src/shade/renderer/volumetrics/shader_volumetrics_bin_participating_media.d.ts.map +1 -0
  166. package/src/shade/renderer/volumetrics/shader_volumetrics_bin_participating_media.js +110 -0
  167. package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.d.ts.map +1 -1
  168. package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.js +38 -14
  169. package/src/shade/renderer/volumetrics/shader_volumetrics_build_scattering_lut.d.ts.map +1 -1
  170. package/src/shade/renderer/volumetrics/shader_volumetrics_build_scattering_lut.js +9 -4
  171. package/src/shade/renderer/volumetrics/shader_volumetrics_split_participating_media.d.ts +31 -0
  172. package/src/shade/renderer/volumetrics/shader_volumetrics_split_participating_media.d.ts.map +1 -0
  173. package/src/shade/renderer/volumetrics/shader_volumetrics_split_participating_media.js +139 -0
  174. package/src/shade/renderer/deferred/TonemapDisplaySettings.d.ts.map +0 -1
  175. package/src/shade/renderer/deferred/shader_tonemap_HDR.d.ts.map +0 -1
  176. package/src/shade/renderer/deferred/shader_tonemap_HDR_none.d.ts.map +0 -1
  177. package/src/shade/renderer/deferred/shader_tonemap_HDR_pbr_neutral.d.ts.map +0 -1
  178. package/src/shade/renderer/deferred/shader_tonemap_LDR.d.ts.map +0 -1
  179. package/src/shade/renderer/deferred/shader_tonemap_LDR_none.d.ts.map +0 -1
  180. package/src/shade/renderer/deferred/shader_tonemap_LDR_pbr_neutral.d.ts.map +0 -1
@@ -0,0 +1,97 @@
1
+ import { assert } from "../../../../core/assert.js";
2
+ import {
3
+ ACES2_BLOCK_FLOATS,
4
+ ACES2_LIMITING_REC709,
5
+ aces2_transform_block_write
6
+ } from "../../shader/chunk/color/tonemap/aces/aces2_transform_block.js";
7
+ import { PAPER_WHITE_NITS } from "../../shader/chunk/color/tonemap/chunk_PAPER_WHITE_NITS.js";
8
+
9
+ /**
10
+ * What {@link shader_tonemap_HDR_aces} binds as `aces2_tables`: two ACES 2.0 output transforms, each its parameters and
11
+ * gamut tables, both limited to Rec.709, the gamut of the SDR picture they expand.
12
+ *
13
+ * 1. An SDR display, 100 cd/m². The pass runs it backwards, from the SDR picture to the scene.
14
+ * 2. This display: the peak over the paper white, times 100 cd/m². A display at or under the paper white gets
15
+ * 100 cd/m², which the pass does not read.
16
+ *
17
+ * Both take SDR white for 100 cd/m², ACES 2.0's reference, so an SDR picture expanded for a display keeps SDR white
18
+ * where the paper white puts it.
19
+ *
20
+ * Building one transform takes 7 to 13 ms, so the tables are built on the first {@link update} rather than with the
21
+ * renderer, and again only when the display's peak changes.
22
+ */
23
+ export class TonemapAces2Tables {
24
+ /**
25
+ * Both blocks, the SDR one first. Zero until the first {@link update}.
26
+ * @type {Float32Array}
27
+ */
28
+ data = new Float32Array(2 * ACES2_BLOCK_FLOATS);
29
+
30
+ #peak_nits = NaN;
31
+
32
+ /**
33
+ * @type {GPUBuffer|null}
34
+ */
35
+ #buffer = null;
36
+
37
+ #uploaded = false;
38
+
39
+ /**
40
+ * Build the tables for a display, if they are not built for it already.
41
+ *
42
+ * @param {number} peak_nits the display's peak, cd/m²
43
+ * @returns {boolean} whether {@link data} changed
44
+ */
45
+ update(peak_nits) {
46
+ assert.isNumber(peak_nits, 'peak_nits');
47
+ assert.greaterThan(peak_nits, 0, 'peak_nits');
48
+
49
+ if (peak_nits === this.#peak_nits) {
50
+ return false;
51
+ }
52
+
53
+ if (Number.isNaN(this.#peak_nits)) {
54
+ aces2_transform_block_write(this.data, 0, 100, ACES2_LIMITING_REC709);
55
+ }
56
+
57
+ const headroom = Math.max(peak_nits / PAPER_WHITE_NITS, 1);
58
+
59
+ aces2_transform_block_write(this.data, ACES2_BLOCK_FLOATS, 100 * headroom, ACES2_LIMITING_REC709);
60
+
61
+ this.#peak_nits = peak_nits;
62
+ this.#uploaded = false;
63
+
64
+ return true;
65
+ }
66
+
67
+ /**
68
+ * The tables on the device, written if they changed since the last call.
69
+ *
70
+ * @param {GPUDevice} device
71
+ * @returns {GPUBuffer}
72
+ */
73
+ gpu_buffer(device) {
74
+ if (this.#buffer === null) {
75
+ this.#buffer = device.createBuffer({
76
+ label: "tonemap/aces2 tables",
77
+ size: this.data.byteLength,
78
+ usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
79
+ });
80
+ this.#uploaded = false;
81
+ }
82
+
83
+ if (!this.#uploaded) {
84
+ device.queue.writeBuffer(this.#buffer, 0, this.data);
85
+ this.#uploaded = true;
86
+ }
87
+
88
+ return this.#buffer;
89
+ }
90
+
91
+ destroy() {
92
+ if (this.#buffer !== null) {
93
+ this.#buffer.destroy();
94
+ this.#buffer = null;
95
+ }
96
+ }
97
+ }
@@ -46,5 +46,5 @@ export const TONEMAP_SETTINGS_REC2020: WebGPUStruct;
46
46
  * TonemapDisplaySettings}.
47
47
  */
48
48
  export const TONEMAP_SETTINGS_REC2020_PEAK: WebGPUStruct;
49
- import { WebGPUStruct } from "../shader/type/WebGPUStruct.js";
49
+ import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
50
50
  //# sourceMappingURL=TonemapDisplaySettings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TonemapDisplaySettings.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/deferred/tonemap/TonemapDisplaySettings.js"],"names":[],"mappings":"AAiDA;;;;;;;;;GASG;AACH;IACI,qCAAqD;IACrD,qCAAqD;IACrD,qCAAqD;IAErD,sCAA8C;IAC9C,sCAA8C;IAC9C,sCAA8C;IAE9C;;;OAGG;IACH,WAFU,MAAM,CAEC;IAMjB;;;;;OAKG;IACH,oCAHW,oBAAoB,GAAC,MAAM,QAkBrC;CACJ;AAqBD;;GAEG;AACH,mDAAqF;AAErF;;;GAGG;AACH,wDAAmG;AAEnG;;GAEG;AACH,oDAAuF;AAEvF;;;GAGG;AACH,yDAAqG;6BAzIxE,mCAAmC"}
@@ -1,8 +1,8 @@
1
- import { m3_rgb_to_xyz_from_primaries } from "../../../core/color/xyz/m3_rgb_to_xyz_from_primaries.js";
2
- import { m3_invert } from "../../../core/geom/mat3/m3_invert.js";
3
- import { m3_multiply } from "../../../core/geom/mat3/m3_multiply.js";
4
- import { f32, vec3f } from "../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
5
- import { WebGPUStruct } from "../shader/type/WebGPUStruct.js";
1
+ import { m3_rgb_to_xyz_from_primaries } from "../../../../core/color/xyz/m3_rgb_to_xyz_from_primaries.js";
2
+ import { m3_invert } from "../../../../core/geom/mat3/m3_invert.js";
3
+ import { m3_multiply } from "../../../../core/geom/mat3/m3_multiply.js";
4
+ import { f32, vec3f } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
5
+ import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
6
6
 
7
7
  // chromaticities of red, green and blue; every space here has a D65 white, so none needs chromatic adaptation
8
8
  const PRIMARIES_REC709 = [0.640, 0.330, 0.300, 0.600, 0.150, 0.060];
@@ -5,5 +5,5 @@
5
5
  * @type {ImageShader}
6
6
  */
7
7
  export const shader_tonemap_HDR: ImageShader;
8
- import { ImageShader } from "../shader/ImageShader.js";
8
+ import { ImageShader } from "../../shader/ImageShader.js";
9
9
  //# sourceMappingURL=shader_tonemap_HDR.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shader_tonemap_HDR.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/deferred/tonemap/shader_tonemap_HDR.js"],"names":[],"mappings":"AA4DA;;;;;GAKG;AACH,iCAFU,WAAW,CAclB;4BAvEyB,6BAA6B"}
@@ -1,13 +1,13 @@
1
- import { F32_CONTAINER_STRUCT } from "../shader/type/F32_CONTAINER_STRUCT.js";
1
+ import { F32_CONTAINER_STRUCT } from "../../shader/type/F32_CONTAINER_STRUCT.js";
2
2
  import { TONEMAP_SETTINGS_REC2020_PEAK } from "./TonemapDisplaySettings.js";
3
- import { chunk_CRM_FROM_REC709_TO_REC2020 } from "../shader/chunk/color/conversion/chunk_CRM_FROM_REC709_TO_REC2020.js";
4
- import { chunk_sRGBTransferOETF } from "../shader/chunk/color/sRGB/chunk_sRGBTransferOETF.js";
5
- import { chunk_PAPER_WHITE_NITS } from "../shader/chunk/color/tonemap/chunk_PAPER_WHITE_NITS.js";
6
- import { chunk_tonemap_gt7 } from "../shader/chunk/color/tonemap/gt7/chunk_tonemap_gt7.js";
7
- import { CodeChunk } from "../shader/compiler/CodeChunk.js";
8
- import { ImageShader } from "../shader/ImageShader.js";
9
- import { ShaderResourceSetDescriptor } from "../shader/resource/ShaderResourceSetDescriptor.js";
10
- import { ShaderDescriptor } from "../shader/ShaderDescriptor.js";
3
+ import { chunk_CRM_FROM_REC709_TO_REC2020 } from "../../shader/chunk/color/conversion/chunk_CRM_FROM_REC709_TO_REC2020.js";
4
+ import { chunk_sRGBTransferOETF } from "../../shader/chunk/color/sRGB/chunk_sRGBTransferOETF.js";
5
+ import { chunk_PAPER_WHITE_NITS } from "../../shader/chunk/color/tonemap/chunk_PAPER_WHITE_NITS.js";
6
+ import { chunk_tonemap_gt7 } from "../../shader/chunk/color/tonemap/gt7/chunk_tonemap_gt7.js";
7
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
8
+ import { ImageShader } from "../../shader/ImageShader.js";
9
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
10
+ import { ShaderDescriptor } from "../../shader/ShaderDescriptor.js";
11
11
 
12
12
  const resources = new ShaderResourceSetDescriptor();
13
13
 
@@ -0,0 +1,17 @@
1
+ /**
2
+ * The HDR output with {@link ShadeToneMappingMode.ACES}, as Unreal Engine 5.8 does it with its default "Filmic" method
3
+ * on a display past 100 cd/m²: the SDR picture of {@link shader_tonemap_LDR_aces}, taken back to the scene through the
4
+ * inverse ACES 2.0 output transform for an SDR display, and rendered again with the ACES 2.0 output transform for this
5
+ * display, limited to Rec.709 as the SDR picture is. Written in the canvas's primaries, extended, where 1.0 is SDR
6
+ * white.
7
+ *
8
+ * A display at or under the paper white shows the SDR picture.
9
+ *
10
+ * Binds `aces2_tables`, the two transforms' parameters and gamut tables, which {@link TonemapAces2Tables} builds for
11
+ * the display.
12
+ *
13
+ * @type {ImageShader}
14
+ */
15
+ export const shader_tonemap_HDR_aces: ImageShader;
16
+ import { ImageShader } from "../../shader/ImageShader.js";
17
+ //# sourceMappingURL=shader_tonemap_HDR_aces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shader_tonemap_HDR_aces.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/deferred/tonemap/shader_tonemap_HDR_aces.js"],"names":[],"mappings":"AA0EA;;;;;;;;;;;;;GAaG;AACH,sCAFU,WAAW,CAclB;4BA1FyB,6BAA6B"}
@@ -0,0 +1,101 @@
1
+ import { F32_CONTAINER_STRUCT } from "../../shader/type/F32_CONTAINER_STRUCT.js";
2
+ import { f32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
3
+ import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
4
+ import { TONEMAP_SETTINGS_REC709_PEAK } from "./TonemapDisplaySettings.js";
5
+ import { chunk_sRGBTransferOETF } from "../../shader/chunk/color/sRGB/chunk_sRGBTransferOETF.js";
6
+ import { ACES2_BLOCK_FLOATS } from "../../shader/chunk/color/tonemap/aces/aces2_transform_block.js";
7
+ import { chunk_aces2_output_transform } from "../../shader/chunk/color/tonemap/aces/chunk_aces2_output_transform.js";
8
+ import { chunk_tonemap_ue_filmic } from "../../shader/chunk/color/tonemap/aces/chunk_tonemap_ue_filmic.js";
9
+ import { chunk_PAPER_WHITE_NITS } from "../../shader/chunk/color/tonemap/chunk_PAPER_WHITE_NITS.js";
10
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
11
+ import { ImageShader } from "../../shader/ImageShader.js";
12
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
13
+ import { ShaderDescriptor } from "../../shader/ShaderDescriptor.js";
14
+
15
+ const resources = new ShaderResourceSetDescriptor();
16
+
17
+ resources.setImmediate("settings", TONEMAP_SETTINGS_REC709_PEAK);
18
+ resources.createGroup()
19
+ .addTexture("input_color", "float")
20
+ .addUniform("exposure", F32_CONTAINER_STRUCT)
21
+ // two ACES 2.0 output transforms, TonemapAces2Tables: 100 cd/m² first, then the display's headroom
22
+ .addStorageBuffer("aces2_tables", WebGPUArray.from(f32))
23
+
24
+ const body = CodeChunk.from(
25
+ //language=WGSL
26
+ `
27
+ const ACES2_SDR_BLOCK: u32 = 0u;
28
+ const ACES2_DISPLAY_BLOCK: u32 = ${ACES2_BLOCK_FLOATS}u;
29
+
30
+ @fragment
31
+ fn main(
32
+ @builtin(position) coord : vec4<f32>,
33
+ ) -> @location(0) vec4<f32> {
34
+
35
+ // scene color in linear Rec. 709
36
+ var color = textureLoad(input_color, vec2i(coord.xy), 0).rgb;
37
+
38
+ // Apply exposure
39
+ color *= exposure.value;
40
+
41
+ // the SDR picture first, which is what Unreal 5.8 does with Filmic on any display
42
+ let film = tonemap_ue_filmic(color);
43
+
44
+ var picture = film;
45
+
46
+ if (settings.peak_nits > PAPER_WHITE_NITS) {
47
+ // back to the scene through ACES 2.0 at SDR white, then out again through ACES 2.0 at the display's peak over
48
+ // the paper white. Both transforms take SDR white for 100 cd/m² and both are limited to Rec.709, the SDR
49
+ // picture's own gamut, so as the headroom shrinks to none the picture becomes the SDR one.
50
+ let aces = aces2_inverse(ACES2_SDR_BLOCK, film);
51
+ picture = aces2_forward(ACES2_DISPLAY_BLOCK, aces);
52
+ }
53
+
54
+ // into the primaries the canvas reports it was configured with (Renderer#configure_context): Display P3, or
55
+ // sRGB where the browser would not configure P3
56
+ let color_display = mat3x3<f32>(
57
+ settings.display_from_rec709_c0,
58
+ settings.display_from_rec709_c1,
59
+ settings.display_from_rec709_c2
60
+ ) * picture;
61
+
62
+ // NOTE: no dithering, colorspace is wide
63
+
64
+ // apply gamma. Note that gamma is the same for "Display P3" and "sRGB"
65
+ return vec4(sRGBTransferOETF(color_display), 1.0);
66
+ }
67
+ `, [
68
+ chunk_tonemap_ue_filmic,
69
+ chunk_aces2_output_transform,
70
+ chunk_PAPER_WHITE_NITS,
71
+ chunk_sRGBTransferOETF,
72
+ ]
73
+ );
74
+
75
+ /**
76
+ * The HDR output with {@link ShadeToneMappingMode.ACES}, as Unreal Engine 5.8 does it with its default "Filmic" method
77
+ * on a display past 100 cd/m²: the SDR picture of {@link shader_tonemap_LDR_aces}, taken back to the scene through the
78
+ * inverse ACES 2.0 output transform for an SDR display, and rendered again with the ACES 2.0 output transform for this
79
+ * display, limited to Rec.709 as the SDR picture is. Written in the canvas's primaries, extended, where 1.0 is SDR
80
+ * white.
81
+ *
82
+ * A display at or under the paper white shows the SDR picture.
83
+ *
84
+ * Binds `aces2_tables`, the two transforms' parameters and gamut tables, which {@link TonemapAces2Tables} builds for
85
+ * the display.
86
+ *
87
+ * @type {ImageShader}
88
+ */
89
+ export const shader_tonemap_HDR_aces = new ImageShader({
90
+ descriptor: ShaderDescriptor.from({
91
+ label: "Tonemap/HDR/aces",
92
+ resources,
93
+ body
94
+ }),
95
+ targets: [
96
+ {
97
+ label: "tone-mapped",
98
+ format: "rgba16float"
99
+ }
100
+ ]
101
+ });
@@ -5,5 +5,5 @@
5
5
  * @type {ImageShader}
6
6
  */
7
7
  export const shader_tonemap_HDR_none: ImageShader;
8
- import { ImageShader } from "../shader/ImageShader.js";
8
+ import { ImageShader } from "../../shader/ImageShader.js";
9
9
  //# sourceMappingURL=shader_tonemap_HDR_none.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shader_tonemap_HDR_none.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/deferred/tonemap/shader_tonemap_HDR_none.js"],"names":[],"mappings":"AA+CA;;;;;GAKG;AACH,sCAFU,WAAW,CAclB;4BA7DyB,6BAA6B"}
@@ -1,10 +1,10 @@
1
- import { F32_CONTAINER_STRUCT } from "../shader/type/F32_CONTAINER_STRUCT.js";
1
+ import { F32_CONTAINER_STRUCT } from "../../shader/type/F32_CONTAINER_STRUCT.js";
2
2
  import { TONEMAP_SETTINGS_REC709 } from "./TonemapDisplaySettings.js";
3
- import { chunk_sRGBTransferOETF } from "../shader/chunk/color/sRGB/chunk_sRGBTransferOETF.js";
4
- import { CodeChunk } from "../shader/compiler/CodeChunk.js";
5
- import { ImageShader } from "../shader/ImageShader.js";
6
- import { ShaderResourceSetDescriptor } from "../shader/resource/ShaderResourceSetDescriptor.js";
7
- import { ShaderDescriptor } from "../shader/ShaderDescriptor.js";
3
+ import { chunk_sRGBTransferOETF } from "../../shader/chunk/color/sRGB/chunk_sRGBTransferOETF.js";
4
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
5
+ import { ImageShader } from "../../shader/ImageShader.js";
6
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
7
+ import { ShaderDescriptor } from "../../shader/ShaderDescriptor.js";
8
8
 
9
9
  const resources = new ShaderResourceSetDescriptor();
10
10
  resources.setImmediate("settings", TONEMAP_SETTINGS_REC709);
@@ -6,5 +6,5 @@
6
6
  * @type {ImageShader}
7
7
  */
8
8
  export const shader_tonemap_HDR_pbr_neutral: ImageShader;
9
- import { ImageShader } from "../shader/ImageShader.js";
9
+ import { ImageShader } from "../../shader/ImageShader.js";
10
10
  //# sourceMappingURL=shader_tonemap_HDR_pbr_neutral.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shader_tonemap_HDR_pbr_neutral.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/deferred/tonemap/shader_tonemap_HDR_pbr_neutral.js"],"names":[],"mappings":"AA4DA;;;;;;GAMG;AACH,6CAFU,WAAW,CAclB;4BAzEyB,6BAA6B"}
@@ -1,12 +1,12 @@
1
- import { F32_CONTAINER_STRUCT } from "../shader/type/F32_CONTAINER_STRUCT.js";
1
+ import { F32_CONTAINER_STRUCT } from "../../shader/type/F32_CONTAINER_STRUCT.js";
2
2
  import { TONEMAP_SETTINGS_REC709_PEAK } from "./TonemapDisplaySettings.js";
3
- import { chunk_sRGBTransferOETF } from "../shader/chunk/color/sRGB/chunk_sRGBTransferOETF.js";
4
- import { chunk_PAPER_WHITE_NITS } from "../shader/chunk/color/tonemap/chunk_PAPER_WHITE_NITS.js";
5
- import { chunk_tonemap_khronos_pbr } from "../shader/chunk/color/tonemap/chunk_tonemap_khronos_pbr.js";
6
- import { CodeChunk } from "../shader/compiler/CodeChunk.js";
7
- import { ImageShader } from "../shader/ImageShader.js";
8
- import { ShaderResourceSetDescriptor } from "../shader/resource/ShaderResourceSetDescriptor.js";
9
- import { ShaderDescriptor } from "../shader/ShaderDescriptor.js";
3
+ import { chunk_sRGBTransferOETF } from "../../shader/chunk/color/sRGB/chunk_sRGBTransferOETF.js";
4
+ import { chunk_PAPER_WHITE_NITS } from "../../shader/chunk/color/tonemap/chunk_PAPER_WHITE_NITS.js";
5
+ import { chunk_tonemap_khronos_pbr } from "../../shader/chunk/color/tonemap/chunk_tonemap_khronos_pbr.js";
6
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
7
+ import { ImageShader } from "../../shader/ImageShader.js";
8
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
9
+ import { ShaderDescriptor } from "../../shader/ShaderDescriptor.js";
10
10
 
11
11
  const resources = new ShaderResourceSetDescriptor();
12
12
 
@@ -5,5 +5,5 @@
5
5
  * @type {ImageShader}
6
6
  */
7
7
  export const shader_tonemap_LDR: ImageShader;
8
- import { ImageShader } from "../shader/ImageShader.js";
8
+ import { ImageShader } from "../../shader/ImageShader.js";
9
9
  //# sourceMappingURL=shader_tonemap_LDR.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shader_tonemap_LDR.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/deferred/tonemap/shader_tonemap_LDR.js"],"names":[],"mappings":"AA6DA;;;;;GAKG;AACH,iCAFU,WAAW,CAclB;4BArEyB,6BAA6B"}
@@ -1,16 +1,16 @@
1
- import { F32_CONTAINER_STRUCT } from "../shader/type/F32_CONTAINER_STRUCT.js";
1
+ import { F32_CONTAINER_STRUCT } from "../../shader/type/F32_CONTAINER_STRUCT.js";
2
2
  import { TONEMAP_SETTINGS_REC2020 } from "./TonemapDisplaySettings.js";
3
- import { chunk_CRM_FROM_REC709_TO_REC2020 } from "../shader/chunk/color/conversion/chunk_CRM_FROM_REC709_TO_REC2020.js";
4
- import { chunk_sRGBTransferOETF } from "../shader/chunk/color/sRGB/chunk_sRGBTransferOETF.js";
5
- import { chunk_PAPER_WHITE_NITS } from "../shader/chunk/color/tonemap/chunk_PAPER_WHITE_NITS.js";
6
- import { chunk_tonemap_gt7 } from "../shader/chunk/color/tonemap/gt7/chunk_tonemap_gt7.js";
3
+ import { chunk_CRM_FROM_REC709_TO_REC2020 } from "../../shader/chunk/color/conversion/chunk_CRM_FROM_REC709_TO_REC2020.js";
4
+ import { chunk_sRGBTransferOETF } from "../../shader/chunk/color/sRGB/chunk_sRGBTransferOETF.js";
5
+ import { chunk_PAPER_WHITE_NITS } from "../../shader/chunk/color/tonemap/chunk_PAPER_WHITE_NITS.js";
6
+ import { chunk_tonemap_gt7 } from "../../shader/chunk/color/tonemap/gt7/chunk_tonemap_gt7.js";
7
7
  import {
8
8
  chunk_dither_color_8bit_triangle_noise
9
- } from "../shader/chunk/texture/dither/chunk_dither_color_8bit_triangle_noise.js";
10
- import { CodeChunk } from "../shader/compiler/CodeChunk.js";
11
- import { ImageShader } from "../shader/ImageShader.js";
12
- import { ShaderResourceSetDescriptor } from "../shader/resource/ShaderResourceSetDescriptor.js";
13
- import { ShaderDescriptor } from "../shader/ShaderDescriptor.js";
9
+ } from "../../shader/chunk/texture/dither/chunk_dither_color_8bit_triangle_noise.js";
10
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
11
+ import { ImageShader } from "../../shader/ImageShader.js";
12
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
13
+ import { ShaderDescriptor } from "../../shader/ShaderDescriptor.js";
14
14
 
15
15
  const resources = new ShaderResourceSetDescriptor();
16
16
  resources.setImmediate("settings", TONEMAP_SETTINGS_REC2020);
@@ -0,0 +1,10 @@
1
+ /**
2
+ * The SDR output with {@link ShadeToneMappingMode.ACES}: exposure, Unreal Engine's default "Filmic" tone mapping, the
3
+ * canvas's primaries, the sRGB transfer curve and an 8-bit dither. {@link shader_tonemap_HDR_aces} expands the same
4
+ * picture into an HDR display's headroom.
5
+ *
6
+ * @type {ImageShader}
7
+ */
8
+ export const shader_tonemap_LDR_aces: ImageShader;
9
+ import { ImageShader } from "../../shader/ImageShader.js";
10
+ //# sourceMappingURL=shader_tonemap_LDR_aces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shader_tonemap_LDR_aces.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/deferred/tonemap/shader_tonemap_LDR_aces.js"],"names":[],"mappings":"AAyDA;;;;;;GAMG;AACH,sCAFU,WAAW,CAclB;4BApEyB,6BAA6B"}
@@ -0,0 +1,77 @@
1
+ import { F32_CONTAINER_STRUCT } from "../../shader/type/F32_CONTAINER_STRUCT.js";
2
+ import { TONEMAP_SETTINGS_REC709 } from "./TonemapDisplaySettings.js";
3
+ import { chunk_sRGBTransferOETF } from "../../shader/chunk/color/sRGB/chunk_sRGBTransferOETF.js";
4
+ import { chunk_tonemap_ue_filmic } from "../../shader/chunk/color/tonemap/aces/chunk_tonemap_ue_filmic.js";
5
+ import {
6
+ chunk_dither_color_8bit_triangle_noise
7
+ } from "../../shader/chunk/texture/dither/chunk_dither_color_8bit_triangle_noise.js";
8
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
9
+ import { ImageShader } from "../../shader/ImageShader.js";
10
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
11
+ import { ShaderDescriptor } from "../../shader/ShaderDescriptor.js";
12
+
13
+ const resources = new ShaderResourceSetDescriptor();
14
+ resources.setImmediate("settings", TONEMAP_SETTINGS_REC709);
15
+ resources.createGroup()
16
+ .addTexture("input_color", "float")
17
+ .addUniform("exposure", F32_CONTAINER_STRUCT)
18
+
19
+ const body = CodeChunk.from(
20
+ //language=WGSL
21
+ `
22
+ @fragment
23
+ fn main(
24
+ @builtin(position) coord : vec4<f32>,
25
+ ) -> @location(0) vec4<f32> {
26
+
27
+ // scene color in linear Rec. 709
28
+ var color = textureLoad(input_color, vec2i(coord.xy), 0).rgb;
29
+
30
+ color *= exposure.value;
31
+
32
+ // Unreal's default SDR rendering, in Rec.709 and within it
33
+ color = tonemap_ue_filmic(color);
34
+
35
+ // into the primaries the canvas reports it was configured with (Renderer#configure_context): Display P3, or
36
+ // sRGB where the browser would not configure P3. A Rec.709 colour sits inside both.
37
+ let color_display = mat3x3<f32>(
38
+ settings.display_from_rec709_c0,
39
+ settings.display_from_rec709_c1,
40
+ settings.display_from_rec709_c2
41
+ ) * color;
42
+
43
+ // apply gamma. Note that gamma is the same for "Display P3" and "sRGB"
44
+ color = sRGBTransferOETF(color_display);
45
+
46
+ // apply dither to remove color banding
47
+ color += dither_color_8bit_triangle_noise(coord.xy);
48
+
49
+ return vec4(color, 1.0);
50
+ }
51
+ `, [
52
+ chunk_tonemap_ue_filmic,
53
+ chunk_dither_color_8bit_triangle_noise,
54
+ chunk_sRGBTransferOETF,
55
+ ]
56
+ );
57
+
58
+ /**
59
+ * The SDR output with {@link ShadeToneMappingMode.ACES}: exposure, Unreal Engine's default "Filmic" tone mapping, the
60
+ * canvas's primaries, the sRGB transfer curve and an 8-bit dither. {@link shader_tonemap_HDR_aces} expands the same
61
+ * picture into an HDR display's headroom.
62
+ *
63
+ * @type {ImageShader}
64
+ */
65
+ export const shader_tonemap_LDR_aces = new ImageShader({
66
+ descriptor: ShaderDescriptor.from({
67
+ label: "Tonemap/LDR/aces",
68
+ resources,
69
+ body
70
+ }),
71
+ targets: [
72
+ {
73
+ label: "tone-mapped",
74
+ format: "rgba8unorm"
75
+ }
76
+ ]
77
+ });
@@ -5,5 +5,5 @@
5
5
  * @type {ImageShader}
6
6
  */
7
7
  export const shader_tonemap_LDR_none: ImageShader;
8
- import { ImageShader } from "../shader/ImageShader.js";
8
+ import { ImageShader } from "../../shader/ImageShader.js";
9
9
  //# sourceMappingURL=shader_tonemap_LDR_none.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shader_tonemap_LDR_none.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/deferred/tonemap/shader_tonemap_LDR_none.js"],"names":[],"mappings":"AAoDA;;;;;GAKG;AACH,sCAFU,WAAW,CAclB;4BA/DyB,6BAA6B"}
@@ -1,13 +1,13 @@
1
- import { F32_CONTAINER_STRUCT } from "../shader/type/F32_CONTAINER_STRUCT.js";
1
+ import { F32_CONTAINER_STRUCT } from "../../shader/type/F32_CONTAINER_STRUCT.js";
2
2
  import { TONEMAP_SETTINGS_REC709 } from "./TonemapDisplaySettings.js";
3
- import { chunk_sRGBTransferOETF } from "../shader/chunk/color/sRGB/chunk_sRGBTransferOETF.js";
3
+ import { chunk_sRGBTransferOETF } from "../../shader/chunk/color/sRGB/chunk_sRGBTransferOETF.js";
4
4
  import {
5
5
  chunk_dither_color_8bit_triangle_noise
6
- } from "../shader/chunk/texture/dither/chunk_dither_color_8bit_triangle_noise.js";
7
- import { CodeChunk } from "../shader/compiler/CodeChunk.js";
8
- import { ImageShader } from "../shader/ImageShader.js";
9
- import { ShaderResourceSetDescriptor } from "../shader/resource/ShaderResourceSetDescriptor.js";
10
- import { ShaderDescriptor } from "../shader/ShaderDescriptor.js";
6
+ } from "../../shader/chunk/texture/dither/chunk_dither_color_8bit_triangle_noise.js";
7
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
8
+ import { ImageShader } from "../../shader/ImageShader.js";
9
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
10
+ import { ShaderDescriptor } from "../../shader/ShaderDescriptor.js";
11
11
 
12
12
  const resources = new ShaderResourceSetDescriptor();
13
13
  resources.setImmediate("settings", TONEMAP_SETTINGS_REC709);
@@ -6,5 +6,5 @@
6
6
  * @type {ImageShader}
7
7
  */
8
8
  export const shader_tonemap_LDR_pbr_neutral: ImageShader;
9
- import { ImageShader } from "../shader/ImageShader.js";
9
+ import { ImageShader } from "../../shader/ImageShader.js";
10
10
  //# sourceMappingURL=shader_tonemap_LDR_pbr_neutral.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shader_tonemap_LDR_pbr_neutral.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/deferred/tonemap/shader_tonemap_LDR_pbr_neutral.js"],"names":[],"mappings":"AAwDA;;;;;;GAMG;AACH,6CAFU,WAAW,CAclB;4BAnEyB,6BAA6B"}
@@ -1,14 +1,14 @@
1
- import { F32_CONTAINER_STRUCT } from "../shader/type/F32_CONTAINER_STRUCT.js";
1
+ import { F32_CONTAINER_STRUCT } from "../../shader/type/F32_CONTAINER_STRUCT.js";
2
2
  import { TONEMAP_SETTINGS_REC709 } from "./TonemapDisplaySettings.js";
3
- import { chunk_sRGBTransferOETF } from "../shader/chunk/color/sRGB/chunk_sRGBTransferOETF.js";
4
- import { chunk_tonemap_khronos_pbr } from "../shader/chunk/color/tonemap/chunk_tonemap_khronos_pbr.js";
3
+ import { chunk_sRGBTransferOETF } from "../../shader/chunk/color/sRGB/chunk_sRGBTransferOETF.js";
4
+ import { chunk_tonemap_khronos_pbr } from "../../shader/chunk/color/tonemap/chunk_tonemap_khronos_pbr.js";
5
5
  import {
6
6
  chunk_dither_color_8bit_triangle_noise
7
- } from "../shader/chunk/texture/dither/chunk_dither_color_8bit_triangle_noise.js";
8
- import { CodeChunk } from "../shader/compiler/CodeChunk.js";
9
- import { ImageShader } from "../shader/ImageShader.js";
10
- import { ShaderResourceSetDescriptor } from "../shader/resource/ShaderResourceSetDescriptor.js";
11
- import { ShaderDescriptor } from "../shader/ShaderDescriptor.js";
7
+ } from "../../shader/chunk/texture/dither/chunk_dither_color_8bit_triangle_noise.js";
8
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
9
+ import { ImageShader } from "../../shader/ImageShader.js";
10
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
11
+ import { ShaderDescriptor } from "../../shader/ShaderDescriptor.js";
12
12
 
13
13
  const resources = new ShaderResourceSetDescriptor();
14
14
  resources.setImmediate("settings", TONEMAP_SETTINGS_REC709);
@@ -136,7 +136,7 @@ export class GPUFluidCascade {
136
136
  * @param {*} _resources
137
137
  * @param {{encoder: ShadeGPUCommandContext}} context
138
138
  */
139
- static "__#263@#execute_restrict"(record: object, _resources: any, context: {
139
+ static "__#264@#execute_restrict"(record: object, _resources: any, context: {
140
140
  encoder: ShadeGPUCommandContext;
141
141
  }): void;
142
142
  /**
@@ -144,7 +144,7 @@ export class GPUFluidCascade {
144
144
  * @param {*} _resources
145
145
  * @param {{encoder: ShadeGPUCommandContext}} context
146
146
  */
147
- static "__#263@#execute_fill"(record: object, _resources: any, context: {
147
+ static "__#264@#execute_fill"(record: object, _resources: any, context: {
148
148
  encoder: ShadeGPUCommandContext;
149
149
  }): void;
150
150
  /**
@@ -152,7 +152,7 @@ export class GPUFluidCascade {
152
152
  * @param {import("../../../engine/graphics/render/frame_graph/FramePassResources.js").FramePassResources} resources
153
153
  * @param {{encoder: ShadeGPUCommandContext}} context
154
154
  */
155
- static "__#263@#execute"(record: object, resources: import("../../../engine/graphics/render/frame_graph/FramePassResources.js").FramePassResources, context: {
155
+ static "__#264@#execute"(record: object, resources: import("../../../engine/graphics/render/frame_graph/FramePassResources.js").FramePassResources, context: {
156
156
  encoder: ShadeGPUCommandContext;
157
157
  }): void;
158
158
  /**
@@ -56,7 +56,7 @@ export class GPUFluidCascadeStack {
56
56
  * @param {*} _resources
57
57
  * @param {{encoder: import("../../device/ShadeGPUCommandContext.js").ShadeGPUCommandContext}} context
58
58
  */
59
- static "__#265@#execute_publish"(pass: object, _resources: any, context: {
59
+ static "__#266@#execute_publish"(pass: object, _resources: any, context: {
60
60
  encoder: import("../../device/ShadeGPUCommandContext.js").ShadeGPUCommandContext;
61
61
  }): void;
62
62
  /**
@@ -90,19 +90,19 @@ export class GPUFluidForcing {
90
90
  * @param {number} clear_size bytes cleared from 0 when the pool reuses the buffer
91
91
  * @returns {BufferResourceDescriptor}
92
92
  */
93
- static "__#266@#descriptor"(kept: BufferResourceDescriptor[], role: number, size: number, usage: number, clear_size: number): BufferResourceDescriptor;
93
+ static "__#267@#descriptor"(kept: BufferResourceDescriptor[], role: number, size: number, usage: number, clear_size: number): BufferResourceDescriptor;
94
94
  /**
95
95
  * @param {object} record
96
96
  * @param {FramePassResources} resources
97
97
  * @param {{encoder: ShadeGPUCommandContext}} context
98
98
  */
99
- static "__#266@#execute_extract"(record: object, resources: FramePassResources, context: {
99
+ static "__#267@#execute_extract"(record: object, resources: FramePassResources, context: {
100
100
  encoder: ShadeGPUCommandContext;
101
101
  }): void;
102
- static "__#266@#execute_clear"(record: any, _resources: any, context: any): void;
103
- static "__#266@#execute_query"(record: any, resources: any, context: any): void;
104
- static "__#266@#execute_command"(record: any, resources: any, context: any): void;
105
- static "__#266@#execute_apply"(record: any, resources: any, context: any): void;
102
+ static "__#267@#execute_clear"(record: any, _resources: any, context: any): void;
103
+ static "__#267@#execute_query"(record: any, resources: any, context: any): void;
104
+ static "__#267@#execute_command"(record: any, resources: any, context: any): void;
105
+ static "__#267@#execute_apply"(record: any, resources: any, context: any): void;
106
106
  /**
107
107
  * @param {object} options
108
108
  * @param {GPUDevice} options.device