@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
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "description": "Advanced 3D game engine",
7
7
  "type": "module",
8
8
  "author": "Alexander Goldring",
9
- "version": "3.50.0",
9
+ "version": "3.52.0",
10
10
  "exports": {
11
11
  "./build/*": "./build/*",
12
12
  "./src/*": "./src/*",
@@ -1 +1 @@
1
- {"version":3,"file":"make_default_environment.d.ts","sourceRoot":"","sources":["../../../../src/engine/graphics3/make_default_environment.js"],"names":[],"mappings":"AA6DA;;;;;;;;;;;GAWG;AACH,4CAFa,YAAY,CAmCxB;6BAlG4B,8CAA8C"}
1
+ {"version":3,"file":"make_default_environment.d.ts","sourceRoot":"","sources":["../../../../src/engine/graphics3/make_default_environment.js"],"names":[],"mappings":"AA8DA;;;;;;;;;;;GAWG;AACH,4CAFa,YAAY,CAwCxB;6BAvG4B,8CAA8C"}
@@ -4,12 +4,13 @@ import { sampler2d_to_f16 } from "../graphics/texture/sampler/sampler2d_to_f16.j
4
4
  import {
5
5
  octahedral_uv_to_direction
6
6
  } from "../../shade/renderer/light/environment/octahedral_uv_to_direction.js";
7
+ import { sampler2d_octahedral_skirt_fill } from "../../shade/renderer/light/environment/sampler2d_octahedral_skirt_fill.js";
7
8
  import { ColorSpace } from "../../shade/renderer/texture/ColorSpace.js";
8
9
  import { ShadeImage } from "../../shade/renderer/texture/source/ShadeImage.js";
9
10
  import { ShadeTexture } from "../../shade/renderer/texture/ShadeTexture.js";
10
11
 
11
12
  /**
12
- * Resolution of the generated map, per octahedral face grid.
13
+ * Side of the generated map, its one-texel octahedral skirt included.
13
14
  *
14
15
  * Small on purpose. This is an *ambient* source — it is convolved into irradiance and a handful of
15
16
  * roughness mips before anything samples it, so detail here buys nothing. What it has to be is
@@ -77,13 +78,16 @@ export function make_default_environment() {
77
78
  const data = sampler.data;
78
79
  const rgb = [0, 0, 0];
79
80
 
80
- for (let v = 0; v < RESOLUTION; v++) {
81
- for (let u = 0; u < RESOLUTION; u++) {
81
+ // the octahedral square inside the one-texel skirt an environment map carries
82
+ const interior = RESOLUTION - 2;
83
+
84
+ for (let v = 1; v <= interior; v++) {
85
+ for (let u = 1; u <= interior; u++) {
82
86
  // texel centres, so the mapping is symmetric across the octahedron's folds
83
87
  octahedral_uv_to_direction(
84
88
  SCRATCH_DIRECTION,
85
- (u + 0.5) / RESOLUTION,
86
- (v + 0.5) / RESOLUTION
89
+ (u - 0.5) / interior,
90
+ (v - 0.5) / interior
87
91
  );
88
92
 
89
93
  sky_radiance(rgb, SCRATCH_DIRECTION.x, SCRATCH_DIRECTION.y, SCRATCH_DIRECTION.z);
@@ -97,6 +101,8 @@ export function make_default_environment() {
97
101
  }
98
102
  }
99
103
 
104
+ sampler2d_octahedral_skirt_fill(sampler);
105
+
100
106
  const image = ShadeImage.fromSampler2D(sampler2d_to_f16(sampler));
101
107
 
102
108
  // radiance, not colour: the values above are light arriving, and treating them as sRGB would
@@ -66,11 +66,11 @@ export class FluidObstacleSystem extends System<any> {
66
66
  /**
67
67
  * @param {FluidComponent} fluid
68
68
  */
69
- static "__#461@#refresh_masks"(fluid: FluidComponent): void;
69
+ static "__#462@#refresh_masks"(fluid: FluidComponent): void;
70
70
  /**
71
71
  * @param {FluidComponent} fluid
72
72
  */
73
- static "__#461@#clear_field"(fluid: FluidComponent): void;
73
+ static "__#462@#clear_field"(fluid: FluidComponent): void;
74
74
  /**
75
75
  * Mark every cell of `fluid` whose centre lies within `inflation` of the
76
76
  * posed shape as solid. Iteration is clipped to the shape's world AABB
@@ -82,7 +82,7 @@ export class FluidObstacleSystem extends System<any> {
82
82
  * @param {number} inflation world-units SDF threshold
83
83
  * @param {Float64Array} point length-3 scratch
84
84
  */
85
- static "__#461@#voxelize"(fluid: FluidComponent, posed: PosedShape3D, aabb: Float64Array, inflation: number, point: Float64Array): void;
85
+ static "__#462@#voxelize"(fluid: FluidComponent, posed: PosedShape3D, aabb: Float64Array, inflation: number, point: Float64Array): void;
86
86
  /**
87
87
  * Write the obstacle's translation velocity onto every face of every cell
88
88
  * it voxelized — the moving-wall boundary condition. Runs AFTER the mask
@@ -102,7 +102,7 @@ export class FluidObstacleSystem extends System<any> {
102
102
  * @param {number} wvy
103
103
  * @param {number} wvz
104
104
  */
105
- static "__#461@#stamp_wall_velocity"(fluid: FluidComponent, posed: PosedShape3D, aabb: Float64Array, inflation: number, point: Float64Array, wvx: number, wvy: number, wvz: number): void;
105
+ static "__#462@#stamp_wall_velocity"(fluid: FluidComponent, posed: PosedShape3D, aabb: Float64Array, inflation: number, point: Float64Array, wvx: number, wvy: number, wvz: number): void;
106
106
  constructor();
107
107
  dependencies: (typeof FluidObstacle)[];
108
108
  components_used: (ResourceAccessSpecification<typeof Transform64> | ResourceAccessSpecification<typeof FluidObstacle> | ResourceAccessSpecification<typeof Collider> | ResourceAccessSpecification<typeof RigidBody> | ResourceAccessSpecification<typeof FluidComponent>)[];
@@ -1 +1 @@
1
- {"version":3,"file":"moonlit_environment.d.ts","sourceRoot":"","sources":["../../../../../src/shade/playground/particle_ecs/moonlit_environment.js"],"names":[],"mappings":"AAyGA;;;;GAIG;AACH,uCAFa,YAAY,CAmCxB;AA9GD;;;;;GAKG;AACH,6BAFU,OAAO,CAEyD;6BAjC7C,wCAAwC;oBANjD,+BAA+B"}
1
+ {"version":3,"file":"moonlit_environment.d.ts","sourceRoot":"","sources":["../../../../../src/shade/playground/particle_ecs/moonlit_environment.js"],"names":[],"mappings":"AA0GA;;;;GAIG;AACH,uCAFa,YAAY,CAwCxB;AAnHD;;;;;GAKG;AACH,6BAFU,OAAO,CAEyD;6BAjC7C,wCAAwC;oBAPjD,+BAA+B"}
@@ -2,6 +2,7 @@ import Vector3 from "../../../core/geom/Vector3.js";
2
2
  import { Sampler2D } from "../../../engine/graphics/texture/sampler/Sampler2D.js";
3
3
  import { sampler2d_to_f16 } from "../../../engine/graphics/texture/sampler/sampler2d_to_f16.js";
4
4
  import { octahedral_z_pole_uv_to_direction } from "../../renderer/light/environment/octahedral_z_pole_uv_to_direction.js";
5
+ import { sampler2d_octahedral_skirt_fill } from "../../renderer/light/environment/sampler2d_octahedral_skirt_fill.js";
5
6
  import { ColorSpace } from "../../renderer/texture/ColorSpace.js";
6
7
  import { ShadeImage } from "../../renderer/texture/source/ShadeImage.js";
7
8
  import { ShadeTexture } from "../../renderer/texture/ShadeTexture.js";
@@ -22,7 +23,7 @@ import { ShadeTexture } from "../../renderer/texture/ShadeTexture.js";
22
23
  */
23
24
 
24
25
  /**
25
- * Resolution per octahedral face grid.
26
+ * Side of the map, its one-texel octahedral skirt included.
26
27
  *
27
28
  * Small on purpose: this is an ambient source, convolved into irradiance and a handful of roughness
28
29
  * mips before anything samples it. What it has to be is smooth and correctly oriented.
@@ -114,13 +115,16 @@ export function moonlit_environment() {
114
115
  const data = sampler.data;
115
116
  const rgb = [0, 0, 0];
116
117
 
117
- for (let v = 0; v < RESOLUTION; v++) {
118
- for (let u = 0; u < RESOLUTION; u++) {
118
+ // the octahedral square inside the one-texel skirt an environment map carries
119
+ const interior = RESOLUTION - 2;
120
+
121
+ for (let v = 1; v <= interior; v++) {
122
+ for (let u = 1; u <= interior; u++) {
119
123
  // texel centres, so the mapping is symmetric across the octahedron's folds
120
124
  octahedral_z_pole_uv_to_direction(
121
125
  SCRATCH_DIRECTION,
122
- (u + 0.5) / RESOLUTION,
123
- (v + 0.5) / RESOLUTION
126
+ (u - 0.5) / interior,
127
+ (v - 0.5) / interior
124
128
  );
125
129
 
126
130
  moonlit_radiance(rgb, SCRATCH_DIRECTION.x, SCRATCH_DIRECTION.y, SCRATCH_DIRECTION.z);
@@ -134,6 +138,8 @@ export function moonlit_environment() {
134
138
  }
135
139
  }
136
140
 
141
+ sampler2d_octahedral_skirt_fill(sampler);
142
+
137
143
  const image = ShadeImage.fromSampler2D(sampler2d_to_f16(sampler));
138
144
 
139
145
  // radiance, not colour: the values above are light arriving, and treating them as sRGB would
@@ -1 +1 @@
1
- {"version":3,"file":"sh_exp_playground_shaders.d.ts","sourceRoot":"","sources":["../../../../../src/shade/playground/sh_exponential/sh_exp_playground_shaders.js"],"names":[],"mappings":"AAaA;;;GAGG;AACH,8BAFU,MAAM,EAAE,CAOhB;AAEF;;;;;;GAMG;AACH,oCAFU,MAAM,CAE0B;AAE1C;;;;;;;;;;;;;GAaG;AACH,qCAFU,YAAY,CAgBI;AAsC1B;;;;;;GAMG;AACH,qDAFU,aAAa,CAuDpB;AAcH;;;;;GAKG;AACH,qCAFU,aAAa,CA4FpB;6BAnQ0B,4CAA4C;8BAJ3C,wCAAwC"}
1
+ {"version":3,"file":"sh_exp_playground_shaders.d.ts","sourceRoot":"","sources":["../../../../../src/shade/playground/sh_exponential/sh_exp_playground_shaders.js"],"names":[],"mappings":"AAcA;;;GAGG;AACH,8BAFU,MAAM,EAAE,CAOhB;AAEF;;;;;;GAMG;AACH,oCAFU,MAAM,CAE0B;AAE1C;;;;;;;;;;;;;GAaG;AACH,qCAFU,YAAY,CAgBI;AAsC1B;;;;;;GAMG;AACH,qDAFU,aAAa,CAuDpB;AAeH;;;;;GAKG;AACH,qCAFU,aAAa,CA4FpB;6BArQ0B,4CAA4C;8BAJ3C,wCAAwC"}
@@ -10,6 +10,7 @@ import { WebGPUArray } from "../../renderer/shader/type/WebGPUArray.js";
10
10
  import { f32, u32, vec4f } from "../../renderer/shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
11
11
  import { WebGPUStruct } from "../../renderer/shader/type/WebGPUStruct.js";
12
12
  import { SAMPLER_LINEAR_UPSCALE } from "../../renderer/texture/SAMPLER_LINEAR_UPSCALE.js";
13
+ import { ENVIRONMENT_MAP_SAMPLER_RESOURCE } from "../../renderer/light/environment/ENVIRONMENT_MAP_SAMPLER_RESOURCE.js";
13
14
 
14
15
  /**
15
16
  * Rows of the sphere grid, top to bottom.
@@ -163,7 +164,8 @@ const view_resources = new ShaderResourceSetDescriptor();
163
164
 
164
165
  view_resources.createGroup()
165
166
  .addUniform("view", PLAYGROUND_VIEW_STRUCT)
166
- .addTexture("tEnvironment")
167
+ .addTexture("tEnvironment", "float")
168
+ .add(ENVIRONMENT_MAP_SAMPLER_RESOURCE)
167
169
  .addTexture("tSplitSum", "float")
168
170
  .addSampler("sLinear", "filtering", SAMPLER_LINEAR_UPSCALE)
169
171
  .addStorageBuffer("probe", SH_EXP_P4Q2_PROBE_STRUCT, false)
@@ -1,12 +1,14 @@
1
1
  # Tone mapping: GT7 and PBR Neutral, SDR and HDR
2
2
 
3
- The renderer has three tone mapping modes, each one operator on every output (`ShadeToneMappingMode`):
3
+ The renderer has four tone mapping modes, each one choice for every output (`ShadeToneMappingMode`):
4
4
 
5
- - `GT7`, the default;
5
+ - `ACES`, the default: Unreal Engine's look;
6
+ - `GT7`;
6
7
  - `PBR_NEUTRAL`;
7
8
  - `NONE`.
8
9
 
9
- This page compares the two operators, and shows each one's HDR form beside its SDR form.
10
+ This page compares GT7 and PBR Neutral, and shows each one's HDR form beside its SDR form. ACES is not one of its
11
+ views; the engine's own canvas shows it, and `shader_tonemap_aces.spec.js` holds it to Unreal's and OpenColorIO's numbers.
10
12
 
11
13
  The engine renders and tonemaps each frame as usual. Two extensions then redraw the canvas from the HDR colour the
12
14
  tonemapper was given:
@@ -40,7 +40,7 @@ export class Renderer {
40
40
  transparency_mode: ShadeTransparencyMode;
41
41
  /**
42
42
  * How the exposed scene colour becomes display colour, on every output. An SDR and an HDR display run the same
43
- * mode, so a scene looks alike on both; see {@link ShadeToneMappingMode}. Read every frame, so it can be flipped
43
+ * mode, so a scene looks alike on both; see {@link ShadeToneMappingMode}. ACES, Unreal's default look, unless set. Read every frame, so it can be flipped
44
44
  * at runtime. A mode not in use at {@link initialize} compiles its pass on the first frame that draws with it.
45
45
  * @type {ShadeToneMappingMode}
46
46
  */
@@ -1 +1 @@
1
- {"version":3,"file":"Renderer.d.ts","sourceRoot":"","sources":["../../../../src/shade/renderer/Renderer.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Renderer.d.ts","sourceRoot":"","sources":["../../../../src/shade/renderer/Renderer.js"],"names":[],"mappings":"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"}
@@ -22,13 +22,16 @@ import { shader_composite_volumetrics } from "./deferred/shader_composite_volume
22
22
  import { shader_deferred_main } from "./deferred/shader_deferred_main.js";
23
23
  import { LOCAL_LIGHT_SHADING } from "./deferred/LOCAL_LIGHT_SHADING.js";
24
24
  import { LocalLightShading } from "./deferred/LocalLightShading.js";
25
- import { shader_tonemap_HDR } from "./deferred/shader_tonemap_HDR.js";
26
- import { shader_tonemap_HDR_none } from "./deferred/shader_tonemap_HDR_none.js";
27
- import { shader_tonemap_HDR_pbr_neutral } from "./deferred/shader_tonemap_HDR_pbr_neutral.js";
28
- import { shader_tonemap_LDR } from "./deferred/shader_tonemap_LDR.js";
29
- import { shader_tonemap_LDR_none } from "./deferred/shader_tonemap_LDR_none.js";
30
- import { shader_tonemap_LDR_pbr_neutral } from "./deferred/shader_tonemap_LDR_pbr_neutral.js";
31
- import { TonemapDisplaySettings } from "./deferred/TonemapDisplaySettings.js";
25
+ import { shader_tonemap_HDR } from "./deferred/tonemap/shader_tonemap_HDR.js";
26
+ import { shader_tonemap_HDR_aces } from "./deferred/tonemap/shader_tonemap_HDR_aces.js";
27
+ import { shader_tonemap_HDR_none } from "./deferred/tonemap/shader_tonemap_HDR_none.js";
28
+ import { shader_tonemap_HDR_pbr_neutral } from "./deferred/tonemap/shader_tonemap_HDR_pbr_neutral.js";
29
+ import { shader_tonemap_LDR } from "./deferred/tonemap/shader_tonemap_LDR.js";
30
+ import { shader_tonemap_LDR_aces } from "./deferred/tonemap/shader_tonemap_LDR_aces.js";
31
+ import { shader_tonemap_LDR_none } from "./deferred/tonemap/shader_tonemap_LDR_none.js";
32
+ import { shader_tonemap_LDR_pbr_neutral } from "./deferred/tonemap/shader_tonemap_LDR_pbr_neutral.js";
33
+ import { TonemapAces2Tables } from "./deferred/tonemap/TonemapAces2Tables.js";
34
+ import { TonemapDisplaySettings } from "./deferred/tonemap/TonemapDisplaySettings.js";
32
35
  import { FrameContext } from "./extension/FrameContext.js";
33
36
  import { FramePhase } from "./extension/FramePhase.js";
34
37
  import { GBufferTextures } from "./extension/GBufferTextures.js";
@@ -225,11 +228,11 @@ export class Renderer {
225
228
 
226
229
  /**
227
230
  * How the exposed scene colour becomes display colour, on every output. An SDR and an HDR display run the same
228
- * mode, so a scene looks alike on both; see {@link ShadeToneMappingMode}. Read every frame, so it can be flipped
231
+ * mode, so a scene looks alike on both; see {@link ShadeToneMappingMode}. ACES, Unreal's default look, unless set. Read every frame, so it can be flipped
229
232
  * at runtime. A mode not in use at {@link initialize} compiles its pass on the first frame that draws with it.
230
233
  * @type {ShadeToneMappingMode}
231
234
  */
232
- tone_mapping_mode = ShadeToneMappingMode.GT7;
235
+ tone_mapping_mode = ShadeToneMappingMode.ACES;
233
236
 
234
237
  /**
235
238
  * Switches of the AVBOIT mode, read every frame while {@link transparency_mode} selects it.
@@ -1399,6 +1402,13 @@ export class Renderer {
1399
1402
  */
1400
1403
  #tonemap_settings = new TonemapDisplaySettings();
1401
1404
 
1405
+ /**
1406
+ * The ACES HDR pass's two output transforms, built for the display in {@link #tonemap_settings}.
1407
+ *
1408
+ * @type {TonemapAces2Tables}
1409
+ */
1410
+ #tonemap_aces2_tables = new TonemapAces2Tables();
1411
+
1402
1412
  #update_presentation_format() {
1403
1413
 
1404
1414
  const format8bit = navigator.gpu.getPreferredCanvasFormat();
@@ -1741,6 +1751,10 @@ export class Renderer {
1741
1751
  return this.#hdr_supported ? shader_tonemap_HDR_none : shader_tonemap_LDR_none;
1742
1752
  }
1743
1753
 
1754
+ if (this.tone_mapping_mode === ShadeToneMappingMode.ACES) {
1755
+ return this.#hdr_supported ? shader_tonemap_HDR_aces : shader_tonemap_LDR_aces;
1756
+ }
1757
+
1744
1758
  if (this.tone_mapping_mode === ShadeToneMappingMode.PBR_NEUTRAL) {
1745
1759
  return this.#hdr_supported ? shader_tonemap_HDR_pbr_neutral : shader_tonemap_LDR_pbr_neutral;
1746
1760
  }
@@ -1822,6 +1836,7 @@ export class Renderer {
1822
1836
  this.#scene_sdfs.clear();
1823
1837
 
1824
1838
  this.#autoexposure?.destroy();
1839
+ this.#tonemap_aces2_tables.destroy();
1825
1840
  this.#depth_of_field?.destroy();
1826
1841
  this.#depth_of_field_unreal?.destroy();
1827
1842
  this.#restir_di?.destroy();
@@ -3177,16 +3192,29 @@ export class Renderer {
3177
3192
 
3178
3193
  current_color_out = record_scene_color.color;
3179
3194
 
3195
+ const tonemap_shader = this.#tonemap_shader();
3196
+
3180
3197
  // every pass reads from the settings only the members its immediate struct names: the canvas's primaries
3181
3198
  // from its working space, and, on an HDR display, the peak
3199
+ const tonemap_inputs = {
3200
+ input_color: current_color_out,
3201
+ settings: this.#tonemap_settings,
3202
+ exposure,
3203
+ };
3204
+
3205
+ if (tonemap_shader === shader_tonemap_HDR_aces) {
3206
+ // the two ACES 2.0 transforms for this display, rebuilt only when the display changed
3207
+ const display = this.#tonemap_settings;
3208
+ const tables = this.#tonemap_aces2_tables;
3209
+
3210
+ tables.update(display.peak_nits);
3211
+ tonemap_inputs.aces2_tables = graph_import_buffer(graph, tables.gpu_buffer(this.device), "tonemap/aces2 tables");
3212
+ }
3213
+
3182
3214
  [current_color_out] = graph_image_pass({
3183
3215
  graph,
3184
- shader: this.#tonemap_shader(),
3185
- inputs: {
3186
- input_color: current_color_out,
3187
- settings: this.#tonemap_settings,
3188
- exposure
3189
- },
3216
+ shader: tonemap_shader,
3217
+ inputs: tonemap_inputs,
3190
3218
  output: [gr_texture_canvas]
3191
3219
  });
3192
3220
 
@@ -2,13 +2,14 @@
2
2
  * How the exposed scene colour becomes display colour.
3
3
  *
4
4
  * One choice for every display. The same mode runs on an SDR and an HDR output, so a scene looks the same on both up
5
- * to the SDR display's limits. That is the reason Polyphony give for GT7's operator, and there is no per-output
6
- * setting on purpose.
5
+ * to the SDR display's limits. That is the reason Polyphony give for GT7's operator, and Epic's for how Unreal 5.8
6
+ * takes its Filmic picture to HDR, and there is no per-output setting on purpose.
7
7
  */
8
8
  export type ShadeToneMappingMode = number;
9
9
  export namespace ShadeToneMappingMode {
10
10
  let GT7: number;
11
11
  let NONE: number;
12
12
  let PBR_NEUTRAL: number;
13
+ let ACES: number;
13
14
  }
14
15
  //# sourceMappingURL=ShadeToneMappingMode.d.ts.map
@@ -2,15 +2,15 @@
2
2
  * How the exposed scene colour becomes display colour.
3
3
  *
4
4
  * One choice for every display. The same mode runs on an SDR and an HDR output, so a scene looks the same on both up
5
- * to the SDR display's limits. That is the reason Polyphony give for GT7's operator, and there is no per-output
6
- * setting on purpose.
5
+ * to the SDR display's limits. That is the reason Polyphony give for GT7's operator, and Epic's for how Unreal 5.8
6
+ * takes its Filmic picture to HDR, and there is no per-output setting on purpose.
7
7
  *
8
8
  * @enum {number}
9
9
  */
10
10
  export const ShadeToneMappingMode = {
11
11
  /**
12
- * GT7 tone mapping (Polyphony Digital, SIGGRAPH 2025). An exposed 1.0 shows at a 250 cd/m² paper white on both
13
- * outputs. SDR clips at that paper white, the curve's SDR mode, and HDR rolls off to the display's peak.
12
+ * GT7 tone mapping (Polyphony Digital, SIGGRAPH 2025). An exposed 1.0 shows at the paper white on both outputs.
13
+ * SDR clips at that paper white, the curve's SDR mode, and HDR rolls off to the display's peak.
14
14
  */
15
15
  GT7: 0,
16
16
  /**
@@ -27,4 +27,15 @@ export const ShadeToneMappingMode = {
27
27
  * An exposed 0.18 shows at 0.14 of SDR white, where {@link GT7} shows it at 0.179.
28
28
  */
29
29
  PBR_NEUTRAL: 2,
30
+ /**
31
+ * Unreal Engine's default look, the default here too. SDR is UE's "Filmic" tone mapper at its default settings,
32
+ * the ACES-derived curve every Unreal title ships with unless it chose otherwise. HDR is what Unreal 5.8 does with
33
+ * the same method: the SDR picture, taken back to the scene through the inverse ACES 2.0 output transform for an
34
+ * SDR display, and rendered again with the ACES 2.0 output transform for the display's headroom.
35
+ *
36
+ * An exposed 0.18 shows at 0.18 of SDR white, as with {@link GT7}, with a mid-tone contrast of 1.36 against GT7's
37
+ * 1.05. On HDR the picture expands into the headroom and mid-grey rises with it, by ACES 2.0's design: 0.26 of SDR
38
+ * white at a 1000 cd/m² display.
39
+ */
40
+ ACES: 3,
30
41
  };
@@ -1,4 +1,7 @@
1
1
  /**
2
+ * The environment map's level 0 in a direction: one hardware bilinear tap through the octahedral
3
+ * skirt (see `texture_octahedral_skirt_uv`).
4
+ *
2
5
  * see {@link shader_sky_irradiance_lut}
3
6
  * @type {CodeChunk}
4
7
  */
@@ -1 +1 @@
1
- {"version":3,"file":"chunk_sample_environment_color.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/atmosphere/chunk_sample_environment_color.js"],"names":[],"mappings":"AAKA;;;GAGG;AACH,6CAFU,SAAS,CAajB;0BAjBwB,iCAAiC"}
1
+ {"version":3,"file":"chunk_sample_environment_color.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/atmosphere/chunk_sample_environment_color.js"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,6CAFU,SAAS,CAcjB;0BArBwB,iCAAiC"}
@@ -1,21 +1,24 @@
1
- import {
2
- chunk_texture_octahedral_sample_bilinear
3
- } from "../shader/chunk/texture/octahedral/chunk_texture_octahedral_sample_bilinear.js";
1
+ import { chunk_uv_octahedral_unit_encode } from "../shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_encode.js";
2
+ import { chunk_texture_octahedral_skirt_uv } from "../shader/chunk/texture/octahedral/chunk_texture_octahedral_skirt_uv.js";
4
3
  import { CodeChunk } from "../shader/compiler/CodeChunk.js";
5
4
 
6
5
  /**
6
+ * The environment map's level 0 in a direction: one hardware bilinear tap through the octahedral
7
+ * skirt (see `texture_octahedral_skirt_uv`).
8
+ *
7
9
  * see {@link shader_sky_irradiance_lut}
8
10
  * @type {CodeChunk}
9
11
  */
10
12
  export const chunk_sample_environment_color = CodeChunk.from(
11
13
  //language=WGSL
12
14
  `
13
- fn sample_environment_color( tEnvironment:texture_2d<f32>, rayDir: vec3<f32> )-> vec3<f32>{
14
- let texture_size = textureDimensions(tEnvironment, 0);
15
+ fn sample_environment_color(tEnvironment: texture_2d<f32>, sEnvironment: sampler, rayDir: vec3<f32>) -> vec3<f32> {
16
+ let uv = texture_octahedral_skirt_uv(uv_octahedral_unit_encode(rayDir), f32(textureDimensions(tEnvironment).x));
15
17
 
16
- return texture_octahedral_sample_bilinear( tEnvironment, vec2(0), texture_size.x, rayDir, 0 ).rgb;
18
+ return textureSampleLevel(tEnvironment, sEnvironment, uv, 0.0).rgb;
17
19
  }
18
20
  `, [
19
- chunk_texture_octahedral_sample_bilinear,
21
+ chunk_uv_octahedral_unit_encode,
22
+ chunk_texture_octahedral_skirt_uv,
20
23
  ]
21
- );
24
+ );
@@ -1,3 +1,9 @@
1
+ /**
2
+ * Side of the sky irradiance map, skirt included: it is an environment map like any other, so its
3
+ * level 0 carries the one-texel octahedral skirt (see `texture_octahedral_skirt_uv`).
4
+ * @type {number}
5
+ */
6
+ export const SKY_IRRADIANCE_LUT_RESOLUTION: number;
1
7
  export const shader_sky_irradiance_lut: ImageShader;
2
8
  import { ImageShader } from "../shader/ImageShader.js";
3
9
  //# sourceMappingURL=shader_sky_irradiance_lut.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shader_sky_irradiance_lut.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/atmosphere/shader_sky_irradiance_lut.js"],"names":[],"mappings":"AA4MA,oDAWG;4BA1LyB,0BAA0B"}
1
+ {"version":3,"file":"shader_sky_irradiance_lut.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/atmosphere/shader_sky_irradiance_lut.js"],"names":[],"mappings":"AAiDA;;;;GAIG;AACH,4CAFU,MAAM,CAEkC;AAkKlD,oDAWG;4BAnMyB,0BAA0B"}