@woosh/meep-engine 3.11.1 → 3.11.3

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 (225) hide show
  1. package/build/bundle-worker-terrain.js +1 -1
  2. package/package.json +1 -1
  3. package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
  4. package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +294 -290
  5. package/src/engine/graphics3/ParticipatingMedia.d.ts +111 -0
  6. package/src/engine/graphics3/ParticipatingMedia.d.ts.map +1 -0
  7. package/src/engine/graphics3/ParticipatingMedia.js +203 -0
  8. package/src/engine/graphics3/ParticipatingMediaSerializationAdapter.d.ts +34 -0
  9. package/src/engine/graphics3/ParticipatingMediaSerializationAdapter.d.ts.map +1 -0
  10. package/src/engine/graphics3/ParticipatingMediaSerializationAdapter.js +73 -0
  11. package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts +87 -0
  12. package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts.map +1 -0
  13. package/src/engine/graphics3/ParticipatingMediaSystem3.js +184 -0
  14. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  15. package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.d.ts +16 -2
  16. package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.d.ts.map +1 -1
  17. package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.js +28 -4
  18. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts +1 -1
  19. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts.map +1 -1
  20. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.js +5 -2
  21. package/src/shade/device/IMMEDIATE_DATA_PLAN_2026_08_28.md +564 -451
  22. package/src/shade/device/ShadeGPUCommandContext.d.ts +18 -2
  23. package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
  24. package/src/shade/device/ShadeGPUCommandContext.js +994 -940
  25. package/src/shade/device/immediate_data_supported.d.ts +33 -0
  26. package/src/shade/device/immediate_data_supported.d.ts.map +1 -0
  27. package/src/shade/device/immediate_data_supported.js +53 -0
  28. package/src/shade/device/mock/SoftwareGPUCommandEncoder.d.ts +18 -0
  29. package/src/shade/device/mock/SoftwareGPUCommandEncoder.d.ts.map +1 -1
  30. package/src/shade/device/mock/SoftwareGPUCommandEncoder.js +24 -0
  31. package/src/shade/device/mock/SoftwareGPUComputePassEncoder.d.ts +7 -0
  32. package/src/shade/device/mock/SoftwareGPUComputePassEncoder.d.ts.map +1 -1
  33. package/src/shade/device/mock/SoftwareGPUComputePassEncoder.js +49 -1
  34. package/src/shade/device/mock/SoftwareGPUDevice.d.ts.map +1 -1
  35. package/src/shade/device/mock/SoftwareGPUDevice.js +20 -2
  36. package/src/shade/device/mock/SoftwareGPUImmediateData.d.ts +65 -0
  37. package/src/shade/device/mock/SoftwareGPUImmediateData.d.ts.map +1 -0
  38. package/src/shade/device/mock/SoftwareGPUImmediateData.js +160 -0
  39. package/src/shade/device/mock/SoftwareGPURenderPassEncoder.d.ts +7 -0
  40. package/src/shade/device/mock/SoftwareGPURenderPassEncoder.d.ts.map +1 -1
  41. package/src/shade/device/mock/SoftwareGPURenderPassEncoder.js +50 -0
  42. package/src/shade/device/mock/pipeline_immediate_size.d.ts +11 -0
  43. package/src/shade/device/mock/pipeline_immediate_size.d.ts.map +1 -0
  44. package/src/shade/device/mock/pipeline_immediate_size.js +18 -0
  45. package/src/shade/device/pipeline/PipelineLayoutManager.d.ts.map +1 -1
  46. package/src/shade/device/pipeline/PipelineLayoutManager.js +1 -0
  47. package/src/shade/playground/volumetrics_froxel/README.md +104 -1
  48. package/src/shade/playground/volumetrics_froxel/index.html +20 -1
  49. package/src/shade/playground/volumetrics_froxel/main.d.ts.map +1 -1
  50. package/src/shade/playground/volumetrics_froxel/main.js +298 -0
  51. package/src/shade/playground/volumetrics_froxel/measure.d.ts +119 -0
  52. package/src/shade/playground/volumetrics_froxel/measure.d.ts.map +1 -0
  53. package/src/shade/playground/volumetrics_froxel/measure.js +559 -0
  54. package/src/shade/renderer/GraphicsContext.d.ts +9 -2
  55. package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
  56. package/src/shade/renderer/GraphicsContext.js +13 -1
  57. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  58. package/src/shade/renderer/Renderer.js +22 -18
  59. package/src/shade/renderer/atmosphere/GPUSky.d.ts.map +1 -1
  60. package/src/shade/renderer/atmosphere/GPUSky.js +145 -142
  61. package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.d.ts +34 -0
  62. package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.d.ts.map +1 -0
  63. package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.js +36 -0
  64. package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.d.ts +20 -0
  65. package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.d.ts.map +1 -0
  66. package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.js +25 -0
  67. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts +14 -1
  68. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts.map +1 -1
  69. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.js +163 -177
  70. package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.d.ts +20 -0
  71. package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.d.ts.map +1 -0
  72. package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.js +46 -0
  73. package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.d.ts +11 -1
  74. package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.d.ts.map +1 -1
  75. package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.js +57 -27
  76. package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.d.ts +19 -1
  77. package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.d.ts.map +1 -1
  78. package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.js +69 -33
  79. package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.d.ts +13 -0
  80. package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.d.ts.map +1 -1
  81. package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.js +35 -35
  82. package/src/shade/renderer/atmosphere/chunk_sky_lut_params.d.ts +13 -0
  83. package/src/shade/renderer/atmosphere/chunk_sky_lut_params.d.ts.map +1 -0
  84. package/src/shade/renderer/atmosphere/chunk_sky_lut_params.js +38 -0
  85. package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.d.ts +17 -0
  86. package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.d.ts.map +1 -0
  87. package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.js +29 -0
  88. package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.d.ts +21 -0
  89. package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.d.ts.map +1 -0
  90. package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.js +42 -0
  91. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.d.ts +2 -2
  92. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.d.ts.map +1 -1
  93. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.js +165 -84
  94. package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.d.ts.map +1 -1
  95. package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.js +215 -204
  96. package/src/shade/renderer/atmosphere/shader_transmittance_lut.d.ts.map +1 -1
  97. package/src/shade/renderer/atmosphere/shader_transmittance_lut.js +79 -67
  98. package/src/shade/renderer/light/cluster/graph_assign_clsuters.d.ts.map +1 -1
  99. package/src/shade/renderer/light/cluster/graph_assign_clsuters.js +6 -2
  100. package/src/shade/renderer/postprocess/gtao/GTAO.d.ts.map +1 -1
  101. package/src/shade/renderer/postprocess/gtao/GTAO.js +4 -0
  102. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  103. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  104. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +341 -345
  105. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts +0 -2
  106. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts.map +1 -1
  107. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +58 -57
  108. package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.d.ts.map +1 -1
  109. package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.js +7 -3
  110. package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.d.ts.map +1 -1
  111. package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.js +77 -81
  112. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts.map +1 -1
  113. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +5 -1
  114. package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
  115. package/src/shade/renderer/shader/ComputeShader.js +6 -2
  116. package/src/shade/renderer/shader/ImageShader.d.ts.map +1 -1
  117. package/src/shade/renderer/shader/ImageShader.js +4 -1
  118. package/src/shade/renderer/shader/ShaderDescriptor.d.ts.map +1 -1
  119. package/src/shade/renderer/shader/ShaderDescriptor.js +26 -0
  120. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.d.ts +18 -0
  121. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.d.ts.map +1 -0
  122. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.js +32 -0
  123. package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.d.ts +7 -0
  124. package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.d.ts.map +1 -1
  125. package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.js +17 -6
  126. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.d.ts +21 -0
  127. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.d.ts.map +1 -0
  128. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.js +69 -0
  129. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.d.ts +9 -0
  130. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.d.ts.map +1 -0
  131. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.js +22 -0
  132. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.d.ts +16 -0
  133. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.d.ts.map +1 -0
  134. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.js +41 -0
  135. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.d.ts +11 -0
  136. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.d.ts.map +1 -1
  137. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.js +15 -19
  138. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.d.ts +23 -0
  139. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.d.ts.map +1 -0
  140. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.js +44 -0
  141. package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.d.ts.map +1 -1
  142. package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.js +1 -4
  143. package/src/shade/renderer/shader/compiler/CodeChunk.d.ts +7 -1
  144. package/src/shade/renderer/shader/compiler/CodeChunk.d.ts.map +1 -1
  145. package/src/shade/renderer/shader/compiler/CodeChunk.js +37 -2
  146. package/src/shade/renderer/shader/graph/compute/compute_binding_read_names.d.ts.map +1 -1
  147. package/src/shade/renderer/shader/graph/compute/compute_binding_read_names.js +6 -0
  148. package/src/shade/renderer/shader/graph/compute/graph_compute_indirect_pass.js +1 -1
  149. package/src/shade/renderer/shader/graph/compute/graph_compute_pass.js +1 -1
  150. package/src/shade/renderer/shader/graph/graph_image_pass.js +1 -1
  151. package/src/shade/renderer/shader/graph/graph_prepare_bindings.d.ts.map +1 -1
  152. package/src/shade/renderer/shader/graph/graph_prepare_bindings.js +7 -0
  153. package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.d.ts +3 -1
  154. package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.d.ts.map +1 -1
  155. package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.js +12 -1
  156. package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts.map +1 -1
  157. package/src/shade/renderer/shader/pass/RenderPassDescriptor.js +1 -0
  158. package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.d.ts +21 -0
  159. package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.d.ts.map +1 -0
  160. package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.js +21 -0
  161. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts +59 -1
  162. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  163. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +195 -2
  164. package/src/shade/renderer/shader/type/type_has_arrays.d.ts +14 -0
  165. package/src/shade/renderer/shader/type/type_has_arrays.d.ts.map +1 -0
  166. package/src/shade/renderer/shader/type/type_has_arrays.js +33 -0
  167. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_point2.d.ts +14 -13
  168. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_point2.d.ts.map +1 -1
  169. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_point2.js +133 -129
  170. package/src/shade/renderer/view/GPUViewSkyContext.d.ts.map +1 -1
  171. package/src/shade/renderer/view/GPUViewSkyContext.js +169 -173
  172. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
  173. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +480 -315
  174. package/src/shade/renderer/volumetrics/NOTES.md +887 -8
  175. package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.d.ts +5 -0
  176. package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.d.ts.map +1 -1
  177. package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.js +21 -2
  178. package/src/shade/renderer/volumetrics/SceneVolumetrics.d.ts +26 -0
  179. package/src/shade/renderer/volumetrics/SceneVolumetrics.d.ts.map +1 -1
  180. package/src/shade/renderer/volumetrics/SceneVolumetrics.js +64 -21
  181. package/src/shade/renderer/volumetrics/VOLUMETRICS_METADATA_STRUCT.d.ts.map +1 -1
  182. package/src/shade/renderer/volumetrics/VOLUMETRICS_METADATA_STRUCT.js +84 -28
  183. package/src/shade/renderer/volumetrics/VOLUMETRICS_SUN_SHADOW_RESOLUTION.d.ts +98 -0
  184. package/src/shade/renderer/volumetrics/VOLUMETRICS_SUN_SHADOW_RESOLUTION.d.ts.map +1 -0
  185. package/src/shade/renderer/volumetrics/VOLUMETRICS_SUN_SHADOW_RESOLUTION.js +111 -0
  186. package/src/shade/renderer/volumetrics/build_volumetrics_sun_shadow_transform.d.ts +84 -0
  187. package/src/shade/renderer/volumetrics/build_volumetrics_sun_shadow_transform.d.ts.map +1 -0
  188. package/src/shade/renderer/volumetrics/build_volumetrics_sun_shadow_transform.js +252 -0
  189. package/src/shade/renderer/volumetrics/chunk_integrate_optical_depth.js +75 -75
  190. package/src/shade/renderer/volumetrics/chunk_volumetrics_local_light_shadow.d.ts +43 -0
  191. package/src/shade/renderer/volumetrics/chunk_volumetrics_local_light_shadow.d.ts.map +1 -0
  192. package/src/shade/renderer/volumetrics/chunk_volumetrics_local_light_shadow.js +145 -0
  193. package/src/shade/renderer/volumetrics/chunk_volumetrics_sample_froxel_extinction.d.ts +20 -0
  194. package/src/shade/renderer/volumetrics/chunk_volumetrics_sample_froxel_extinction.d.ts.map +1 -0
  195. package/src/shade/renderer/volumetrics/chunk_volumetrics_sample_froxel_extinction.js +48 -0
  196. package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_optical_depth.d.ts +38 -0
  197. package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_optical_depth.d.ts.map +1 -0
  198. package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_optical_depth.js +130 -0
  199. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts +18 -3
  200. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
  201. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +193 -70
  202. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts +16 -0
  203. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
  204. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +83 -15
  205. package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.d.ts.map +1 -1
  206. package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.js +29 -18
  207. package/src/shade/renderer/volumetrics/shader_volumetrics_build_scattering_lut.js +260 -260
  208. package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.d.ts +58 -0
  209. package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.d.ts.map +1 -0
  210. package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.js +290 -0
  211. package/src/shade/wgsl/emulator/CPUBitmapData.d.ts +25 -0
  212. package/src/shade/wgsl/emulator/CPUBitmapData.d.ts.map +1 -1
  213. package/src/shade/wgsl/emulator/CPUBitmapData.js +33 -0
  214. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +2228 -2215
  215. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  216. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +210 -2
  217. package/src/shade/wgsl/emulator/cpu_texture_gather.d.ts +69 -0
  218. package/src/shade/wgsl/emulator/cpu_texture_gather.d.ts.map +1 -0
  219. package/src/shade/wgsl/emulator/cpu_texture_gather.js +148 -0
  220. package/src/shade/wgsl/emulator/cpu_texture_sample.d.ts +16 -0
  221. package/src/shade/wgsl/emulator/cpu_texture_sample.d.ts.map +1 -1
  222. package/src/shade/wgsl/emulator/cpu_texture_sample.js +176 -172
  223. package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.d.ts +0 -2
  224. package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.d.ts.map +0 -1
  225. package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.js +0 -1
@@ -1,129 +1,133 @@
1
- import { LIGHT_DATABASE_SPEC } from "../../../light/LIGHT_DATABASE_SPEC.js";
2
- import { chunk_cone_sample_direction } from "../../../shader/chunk/geometry/cone/chunk_cone_sample_direction.js";
3
- import {
4
- chunk_uv_octahedral_unit_encode
5
- } from "../../../shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_encode.js";
6
- import { chunk_random } from "../../../shader/chunk/random/chunk_random.js";
7
- import { chunk_random_round_vec2 } from "../../../shader/chunk/random/chunk_random_round_vec2.js";
8
- import { chunk_random_vec2 } from "../../../shader/chunk/random/chunk_random_vec2.js";
9
- import { chunk_uv_to_texel_coordinate } from "../../../shader/chunk/texture/chunk_uv_to_texel_coordinate.js";
10
- import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
11
- import { chunk_get_shadow_offsets } from "./chunk_get_shadow_offsets.js";
12
- import { chunk_contact_harden_pcf_kernel } from "./dpcf/chunk_contact_harden_pcf_kernel.js";
13
- import { chunk_max_penumbra_percentage } from "./dpcf/chunk_max_penumbra_percentage.js";
14
-
15
- const SHADOW_POINT_DESCRIPTOR = LIGHT_DATABASE_SPEC.get('shadow_point');
16
-
17
- /**
18
- * Cone-sampled point shadow PCF. Samples random directions inside a cone around the receiver-
19
- * to-light vector and re-encodes each one to the octahedral atlas. The cone aperture comes
20
- * from the GDC bulb-radius scaling in {@link chunk_max_penumbra_percentage}; the factor of 2
21
- * carries over the texels tangent-plane conversion an earlier disk-based variant used (1
22
- * atlas texel 2/face_dim of Δn.xy near the +Z pole), so the angular footprint stays
23
- * comparable.
24
- *
25
- * No blue-noise disk, no rotation table, no atlas-border clamp. Random tap directions come
26
- * from {@link chunk_random}, which the calling shader (deferred lighting / volumetrics)
27
- * initialises per invocation, so neighbours decorrelate naturally. Each tap is one
28
- * \`textureLoad\` and the loop ends in {@link chunk_contact_harden_pcf_kernel} unchanged.
29
- *
30
- * No clamp on the aperture: the receiver direction is sampled in 3D and re-encoded per tap, so
31
- * the octahedral encode always lands in [0, 1 even a full-sphere aperture stays inside
32
- * this light's slot.
33
- *
34
- * @see chunk_cone_sample_direction
35
- * @type {CodeChunk}
36
- */
37
- export const chunk_shadowmap_sample_point2 = CodeChunk.from(
38
- //language=WGSL
39
- `
40
- fn shadowmap_sample_point(
41
- database: ptr<storage, array<u32>>,
42
- shadow_id: u32,
43
- position_ws: vec3f,
44
- surface_normal_ws: vec3f,
45
- light_position_ws: vec3f,
46
- light_max_distance: f32,
47
- light_radius: f32,
48
- ) -> f32 {
49
- const NORMAL_BIAS_SCALE = 2.0;
50
- const DEPTH_OFFSET_BIAS = 0.0001;
51
-
52
- let atlas_aabb = ${SHADOW_POINT_DESCRIPTOR.marshalling_method_read}(database, shadow_id);
53
-
54
- // unbiased distance and light direction, used to compute the bias amounts
55
- let to_light_unbiased = light_position_ws - position_ws;
56
- let dist_to_light_unbiased = length(to_light_unbiased);
57
- let light_direction = to_light_unbiased / max(dist_to_light_unbiased, 1e-6);
58
-
59
- let world_pixel_size = 2.0 * dist_to_light_unbiased / max(atlas_aabb.z, 1.0);
60
- let shadowmap_bias = get_shadow_offsets(surface_normal_ws, light_direction);
61
- let normal_offset = world_pixel_size * shadowmap_bias.x * surface_normal_ws * NORMAL_BIAS_SCALE;
62
-
63
- // re-evaluate direction and distance from the normal-biased position
64
- let to_surface = (position_ws + normal_offset) - light_position_ws;
65
- let distance_to_center = length(to_surface);
66
-
67
- // Direction the cube faces captured: FROM LIGHT TO SURFACE
68
- let dir_light_to_surface = to_surface / max(distance_to_center, 1e-6);
69
-
70
- let face_size = vec2u(atlas_aabb.zw);
71
-
72
- // reverse-Z convention: close to light -> 1, at or beyond light_max_distance -> 0.
73
- let radial = distance_to_center / max(light_max_distance, 1e-6);
74
- let depth_bias = DEPTH_OFFSET_BIAS * shadowmap_bias.y;
75
- let reference_depth = (1.0 - saturate(radial)) + depth_bias;
76
-
77
- // Cone aperture (~ tan of the half-angle). max_penumbra_percentage is the GDC formula
78
- // mapping bulb radius to a fraction of the atlas face; the 2× factor is the texels
79
- // tangent-plane conversion. Unclamped: any aperture is valid because the octahedral
80
- // re-encode in the loop always stays inside this light's slot.
81
- let cone_aperture = 2.0 * max_penumbra_percentage(light_radius, light_radius);
82
-
83
- var occluders: f32 = 0.0;
84
- var occluder_dist_sum: f32 = 0.0;
85
-
86
- for (var tap: u32 = 0u; tap < 8u; tap++) {
87
-
88
- let xi = random_vec2();
89
-
90
- let perturbed_dir = cone_sample_direction(dir_light_to_surface, cone_aperture, xi);
91
-
92
- let octahedral_uv = uv_octahedral_unit_encode(perturbed_dir);
93
- let local_texel = uv_to_texel_coordinate(octahedral_uv, face_size);
94
-
95
- // instead of doing bilinear, we use stochastic sampling instead
96
- let rounded_local_texel = random_round_vec2(local_texel);
97
-
98
- let sample_texel = vec2<u32>(rounded_local_texel) + vec2<u32>(atlas_aabb.xy);
99
-
100
- let stored = textureLoad(shadowmapAtlas, sample_texel, 0);
101
- let dist = stored - reference_depth;
102
-
103
- // Per-tap binary compare; reverse-Z + step(0, stored - ref) ⇒ 1 = occluded.
104
- let occluded = step(0.0, dist);
105
-
106
- occluders += occluded;
107
- occluder_dist_sum += dist * occluded;
108
- }
109
-
110
- return contact_harden_pcf_kernel(
111
- occluders,
112
- occluder_dist_sum,
113
- reference_depth,
114
-
115
- );
116
- }
117
- `, [
118
- SHADOW_POINT_DESCRIPTOR.chunk_read,
119
- chunk_cone_sample_direction,
120
- chunk_contact_harden_pcf_kernel,
121
- chunk_get_shadow_offsets,
122
- chunk_max_penumbra_percentage,
123
- chunk_random,
124
- chunk_uv_octahedral_unit_encode,
125
- chunk_uv_to_texel_coordinate,
126
- chunk_random_round_vec2,
127
- chunk_random_vec2,
128
- ]
129
- );
1
+ import { LIGHT_DATABASE_SPEC } from "../../../light/LIGHT_DATABASE_SPEC.js";
2
+ import { chunk_cone_sample_direction } from "../../../shader/chunk/geometry/cone/chunk_cone_sample_direction.js";
3
+ import {
4
+ chunk_uv_octahedral_unit_encode
5
+ } from "../../../shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_encode.js";
6
+ import { chunk_random } from "../../../shader/chunk/random/chunk_random.js";
7
+ import { chunk_random_round_vec2 } from "../../../shader/chunk/random/chunk_random_round_vec2.js";
8
+ import { chunk_random_vec2 } from "../../../shader/chunk/random/chunk_random_vec2.js";
9
+ import { chunk_uv_to_texel_coordinate } from "../../../shader/chunk/texture/chunk_uv_to_texel_coordinate.js";
10
+ import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
11
+ import { chunk_get_shadow_offsets } from "./chunk_get_shadow_offsets.js";
12
+ import { chunk_contact_harden_pcf_kernel } from "./dpcf/chunk_contact_harden_pcf_kernel.js";
13
+ import { chunk_max_penumbra_percentage } from "./dpcf/chunk_max_penumbra_percentage.js";
14
+
15
+ const SHADOW_POINT_DESCRIPTOR = LIGHT_DATABASE_SPEC.get('shadow_point');
16
+
17
+ /**
18
+ * Cone-sampled point shadow PCF: 8 random directions inside a cone around the receiver-to-light
19
+ * vector, each re-encoded to the light's octahedral map, one `textureLoad` per tap, ending in
20
+ * {@link chunk_contact_harden_pcf_kernel}. Tap directions come from {@link chunk_random}, which the
21
+ * calling shader (deferred lighting / volumetrics) initialises per invocation, so neighbouring
22
+ * pixels decorrelate without a rotation table or a blue-noise disk.
23
+ *
24
+ * The aperture is the GDC bulb-radius scaling in {@link chunk_max_penumbra_percentage}; the factor
25
+ * of 2 carries over the texels tangent-plane conversion an earlier disk-based variant used (1
26
+ * atlas texel 2/face_dim of Δn.xy near the +Z pole), so the angular footprint stays comparable.
27
+ *
28
+ * Addressing: `atlas_aabb` is the INNER octahedral surface, and the cube → octahedral remap
29
+ * surrounds it with a `SHADOWMAP_ATLAS_BORDER`-texel skirt holding
30
+ * `inner[texture_octahedral_wrap_texel_coordinates(local)]`. Under the bilinear convention
31
+ * `uv * size - 0.5` a uv on the edge of the square rounds to -1 or `size` one texel into that
32
+ * skirt, which is this light's own wrapped data. The encode always lands in [0, 1]² and the round
33
+ * can overshoot by at most one texel, so the aperture needs no clamp.
34
+ *
35
+ * @see chunk_cone_sample_direction
36
+ * @type {CodeChunk}
37
+ */
38
+ export const chunk_shadowmap_sample_point2 = CodeChunk.from(
39
+ //language=WGSL
40
+ `
41
+ fn shadowmap_sample_point(
42
+ database: ptr<storage, array<u32>>,
43
+ shadow_id: u32,
44
+ position_ws: vec3f,
45
+ surface_normal_ws: vec3f,
46
+ light_position_ws: vec3f,
47
+ light_max_distance: f32,
48
+ light_radius: f32,
49
+ ) -> f32 {
50
+ const NORMAL_BIAS_SCALE = 2.0;
51
+ const DEPTH_OFFSET_BIAS = 0.0001;
52
+
53
+ let atlas_aabb = ${SHADOW_POINT_DESCRIPTOR.marshalling_method_read}(database, shadow_id);
54
+
55
+ // unbiased distance and light direction, used to compute the bias amounts
56
+ let to_light_unbiased = light_position_ws - position_ws;
57
+ let dist_to_light_unbiased = length(to_light_unbiased);
58
+ let light_direction = to_light_unbiased / max(dist_to_light_unbiased, 1e-6);
59
+
60
+ let world_pixel_size = 2.0 * dist_to_light_unbiased / max(atlas_aabb.z, 1.0);
61
+ let shadowmap_bias = get_shadow_offsets(surface_normal_ws, light_direction);
62
+ let normal_offset = world_pixel_size * shadowmap_bias.x * surface_normal_ws * NORMAL_BIAS_SCALE;
63
+
64
+ // re-evaluate direction and distance from the normal-biased position
65
+ let to_surface = (position_ws + normal_offset) - light_position_ws;
66
+ let distance_to_center = length(to_surface);
67
+
68
+ // Direction the cube faces captured: FROM LIGHT TO SURFACE
69
+ let dir_light_to_surface = to_surface / max(distance_to_center, 1e-6);
70
+
71
+ let face_size = vec2u(atlas_aabb.zw);
72
+
73
+ // reverse-Z convention: close to light -> 1, at or beyond light_max_distance -> 0.
74
+ let radial = distance_to_center / max(light_max_distance, 1e-6);
75
+ let depth_bias = DEPTH_OFFSET_BIAS * shadowmap_bias.y;
76
+ let reference_depth = (1.0 - saturate(radial)) + depth_bias;
77
+
78
+ // Cone aperture (~ tan of the half-angle). max_penumbra_percentage is the GDC formula mapping
79
+ // bulb radius to a fraction of the atlas face; the 2× factor is the texels → tangent-plane
80
+ // conversion. Unclamped — see the header on why any aperture stays addressable.
81
+ let cone_aperture = 2.0 * max_penumbra_percentage(light_radius, light_radius);
82
+
83
+ var occluders: f32 = 0.0;
84
+ var occluder_dist_sum: f32 = 0.0;
85
+
86
+ for (var tap: u32 = 0u; tap < 8u; tap++) {
87
+
88
+ let xi = random_vec2();
89
+
90
+ let perturbed_dir = cone_sample_direction(dir_light_to_surface, cone_aperture, xi);
91
+
92
+ let octahedral_uv = uv_octahedral_unit_encode(perturbed_dir);
93
+ let local_texel = uv_to_texel_coordinate(octahedral_uv, face_size);
94
+
95
+ // one of the two neighbours at random rather than a blend of them: stochastic bilinear
96
+ let rounded_local_texel = random_round_vec2(local_texel);
97
+
98
+ // Signed: the round reaches -1 at a uv of 0, and the skirt is where that tap belongs. Via
99
+ // u32 the -1 would be an indeterminate conversion — 0xFFFFFFFF reaches the skirt through
100
+ // the wrapping add, 0 silently reads the opposite edge of the inner surface. i32 is exact
101
+ // here, and the inner origin is at least SHADOWMAP_ATLAS_BORDER, so the sum is positive.
102
+ let sample_texel = vec2<u32>(vec2<i32>(rounded_local_texel) + vec2<i32>(atlas_aabb.xy));
103
+
104
+ let stored = textureLoad(shadowmapAtlas, sample_texel, 0);
105
+ let dist = stored - reference_depth;
106
+
107
+ // Per-tap binary compare; reverse-Z + step(0, stored - ref) ⇒ 1 = occluded.
108
+ let occluded = step(0.0, dist);
109
+
110
+ occluders += occluded;
111
+ occluder_dist_sum += dist * occluded;
112
+ }
113
+
114
+ return contact_harden_pcf_kernel(
115
+ occluders,
116
+ occluder_dist_sum,
117
+ reference_depth,
118
+
119
+ );
120
+ }
121
+ `, [
122
+ SHADOW_POINT_DESCRIPTOR.chunk_read,
123
+ chunk_cone_sample_direction,
124
+ chunk_contact_harden_pcf_kernel,
125
+ chunk_get_shadow_offsets,
126
+ chunk_max_penumbra_percentage,
127
+ chunk_random,
128
+ chunk_uv_octahedral_unit_encode,
129
+ chunk_uv_to_texel_coordinate,
130
+ chunk_random_round_vec2,
131
+ chunk_random_vec2,
132
+ ]
133
+ );
@@ -1 +1 @@
1
- {"version":3,"file":"GPUViewSkyContext.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/view/GPUViewSkyContext.js"],"names":[],"mappings":"AAiBA;IAsBI;;;OAGG;IACH,uCAgBC;IA5BD;;;OAGG;IACH,wCAEC;IA0BD,2BAIC;IAED;;;;OAIG;IACH,+DA2DC;IAED,mCAiCC;IA5BG,yBAA2B;IAyB3B,kCAA4B;IAKhC,gBAEC;;CACJ;kCAjKiC,iCAAiC"}
1
+ {"version":3,"file":"GPUViewSkyContext.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/view/GPUViewSkyContext.js"],"names":[],"mappings":"AAiBA;IAsBI;;;OAGG;IACH,uCAgBC;IA5BD;;;OAGG;IACH,wCAEC;IA0BD,2BAIC;IAED;;;;OAIG;IACH,+DAuDC;IAED,mCAiCC;IA5BG,yBAA2B;IAyB3B,kCAA4B;IAKhC,gBAEC;;CACJ;kCA7JiC,iCAAiC"}
@@ -1,174 +1,170 @@
1
- import { m3_cm_compose_transform } from "../../../core/geom/mat3/m3_cm_compose_transform.js";
2
- import { FrameGraph } from "../../../engine/graphics/render/frame_graph/FrameGraph.js";
3
- import { Sampler2D } from "../../../engine/graphics/texture/sampler/Sampler2D.js";
4
- import sampler2d_to_html_canvas
5
- from "../../../engine/graphics/texture/sampler/sampler2d_to_html_canvas.js";
6
- import { writeCssTransformMatrix } from "../../../view/writeCssTransformMatrix.js";
7
- import { TextureResourceDescriptor } from "../../device/graph/TextureResourceDescriptor.js";
8
- import { ShadeGPUCommandContext } from "../../device/ShadeGPUCommandContext.js";
9
- import { SPHERE_PROBE_MIPMAP_LEVELS } from "../light/environment/DEFINES.js";
10
- import { graph_filter_environment_map } from "../light/environment/graph_filter_environment_map.js";
11
- import { shader_sky_irradiance_lut } from "../atmosphere/shader_sky_irradiance_lut.js";
12
- import { graph_image_pass } from "../shader/graph/graph_image_pass.js";
13
- import { GPUTextureContext } from "../texture/GPUTextureContext.js";
14
- import { sampler_linear_to_sRGB } from "../texture/sampler_linear_to_sRGB.js";
15
-
16
- let debug_counter = 0;
17
-
18
- export class GPUViewSkyContext {
19
-
20
-
21
- /**
22
- * @type {GraphicsContext}
23
- */
24
- #graphics;
25
-
26
- /**
27
- * @type {GPUTextureContext}
28
- */
29
- #lut_sky;
30
-
31
-
32
- /**
33
- *
34
- * @returns {GPUTextureContext}
35
- */
36
- get irradiance_lut() {
37
- return this.#lut_sky;
38
- }
39
-
40
- /**
41
- *
42
- * @param {GraphicsContext} graphics
43
- */
44
- constructor(graphics) {
45
- this.#graphics = graphics;
46
-
47
- const device = graphics.device;
48
-
49
- this.#lut_sky = new GPUTextureContext(device);
50
- this.#lut_sky.descriptor.label = "Sky / Irradiance LUT";
51
- this.#lut_sky.descriptor.format = "rgba16float";
52
- this.#lut_sky.descriptor.mipLevelCount = SPHERE_PROBE_MIPMAP_LEVELS;
53
- this.#lut_sky.descriptor.usage = GPUTextureUsage.RENDER_ATTACHMENT
54
- | GPUTextureUsage.TEXTURE_BINDING
55
- | GPUTextureUsage.STORAGE_BINDING
56
- | GPUTextureUsage.COPY_SRC
57
- ;
58
- this.#lut_sky.resize(1024, 1024);
59
-
60
- }
61
-
62
- #needs_update = true;
63
-
64
- set needs_update(v) {
65
- if (v) {
66
- this.#needs_update = true;
67
- }
68
- }
69
-
70
- /**
71
- *
72
- * @param {GPUCameraContext} camera
73
- * @param {GPUSceneContext} scene
74
- */
75
- update(camera, scene) {
76
-
77
- if (!this.#needs_update) {
78
- return;
79
- }
80
-
81
- this.#needs_update = false;
82
-
83
- // ensure base sky LUTs are up-to-date
84
- /**
85
- *
86
- * @type {GPUSky}
87
- */
88
- const scene_sky = scene.sky;
89
- scene_sky.update();
90
-
91
- const graph = new FrameGraph("sky update");
92
-
93
- const command_ctx = ShadeGPUCommandContext.create(
94
- this.#graphics,
95
- "Renderer/main"
96
- );
97
-
98
- const gr_transmittance = graph.import_resource("transmittance", TextureResourceDescriptor.fromTexture(scene_sky.lut_transmittance.gpu_texture), scene_sky.lut_transmittance);
99
- const gr_multiscatter = graph.import_resource("multiscatter", TextureResourceDescriptor.fromTexture(scene_sky.lut_multiple_scattering.gpu_texture), scene_sky.lut_multiple_scattering);
100
- const gr_sky = graph.import_resource("sky_irradiance", TextureResourceDescriptor.fromTexture(this.#lut_sky.gpu_texture), this.#lut_sky);
101
-
102
- let [out] = graph_image_pass({
103
- graph,
104
- shader: shader_sky_irradiance_lut,
105
- inputs: {
106
- settings: {
107
- steps: 32,
108
- },
109
-
110
- camera: camera.buffer,
111
-
112
- light_data: scene.lights.buffer_data,
113
-
114
- tSkyLutTransmittance: gr_transmittance,
115
- tSkyLutMultiscatter: gr_multiscatter
116
- },
117
- output: [gr_sky]
118
- });
119
-
120
- // convolve
121
- out = graph_filter_environment_map({
122
- graph,
123
- map: out
124
- });
125
-
126
- command_ctx.encodeGraph(graph);
127
-
128
- command_ctx.finish();
129
-
130
- debug_counter++;
131
-
132
-
133
- // this.debug(3);
134
- }
135
-
136
- async debug(mip = 0) {
137
- if (this.__debug_waiting) {
138
- return;
139
- }
140
-
141
- this.__debug_waiting = true;
142
-
143
- const texture = this.#lut_sky;
144
-
145
- const data = await texture.download(mip);
146
-
147
- const s = new Sampler2D(data, 4, texture.size[0] >> mip, texture.size[1] >> mip);
148
- sampler_linear_to_sRGB(s);
149
-
150
- const canvas = sampler2d_to_html_canvas(s, 255, 0, this.__debug_canvas);
151
-
152
- if (this.__debug_canvas === undefined) {
153
-
154
- canvas.style.zIndex = "100";
155
- canvas.style.position = "absolute";
156
- canvas.style.bottom = `${32}px`;
157
- canvas.style.right = `${32}px`;
158
-
159
- const transform = new Float32Array(9);
160
- m3_cm_compose_transform(transform, 0, 0, 1, -1, 0, 0, 0);
161
- writeCssTransformMatrix(transform, canvas);
162
-
163
- document.body.appendChild(canvas);
164
- }
165
-
166
- this.__debug_canvas = canvas;
167
-
168
- this.__debug_waiting = false;
169
- }
170
-
171
- destroy() {
172
- this.#lut_sky.destroy();
173
- }
1
+ import { m3_cm_compose_transform } from "../../../core/geom/mat3/m3_cm_compose_transform.js";
2
+ import { FrameGraph } from "../../../engine/graphics/render/frame_graph/FrameGraph.js";
3
+ import { Sampler2D } from "../../../engine/graphics/texture/sampler/Sampler2D.js";
4
+ import sampler2d_to_html_canvas
5
+ from "../../../engine/graphics/texture/sampler/sampler2d_to_html_canvas.js";
6
+ import { writeCssTransformMatrix } from "../../../view/writeCssTransformMatrix.js";
7
+ import { TextureResourceDescriptor } from "../../device/graph/TextureResourceDescriptor.js";
8
+ import { ShadeGPUCommandContext } from "../../device/ShadeGPUCommandContext.js";
9
+ import { SPHERE_PROBE_MIPMAP_LEVELS } from "../light/environment/DEFINES.js";
10
+ import { graph_filter_environment_map } from "../light/environment/graph_filter_environment_map.js";
11
+ import { shader_sky_irradiance_lut } from "../atmosphere/shader_sky_irradiance_lut.js";
12
+ import { graph_image_pass } from "../shader/graph/graph_image_pass.js";
13
+ import { GPUTextureContext } from "../texture/GPUTextureContext.js";
14
+ import { sampler_linear_to_sRGB } from "../texture/sampler_linear_to_sRGB.js";
15
+
16
+ let debug_counter = 0;
17
+
18
+ export class GPUViewSkyContext {
19
+
20
+
21
+ /**
22
+ * @type {GraphicsContext}
23
+ */
24
+ #graphics;
25
+
26
+ /**
27
+ * @type {GPUTextureContext}
28
+ */
29
+ #lut_sky;
30
+
31
+
32
+ /**
33
+ *
34
+ * @returns {GPUTextureContext}
35
+ */
36
+ get irradiance_lut() {
37
+ return this.#lut_sky;
38
+ }
39
+
40
+ /**
41
+ *
42
+ * @param {GraphicsContext} graphics
43
+ */
44
+ constructor(graphics) {
45
+ this.#graphics = graphics;
46
+
47
+ const device = graphics.device;
48
+
49
+ this.#lut_sky = new GPUTextureContext(device);
50
+ this.#lut_sky.descriptor.label = "Sky / Irradiance LUT";
51
+ this.#lut_sky.descriptor.format = "rgba16float";
52
+ this.#lut_sky.descriptor.mipLevelCount = SPHERE_PROBE_MIPMAP_LEVELS;
53
+ this.#lut_sky.descriptor.usage = GPUTextureUsage.RENDER_ATTACHMENT
54
+ | GPUTextureUsage.TEXTURE_BINDING
55
+ | GPUTextureUsage.STORAGE_BINDING
56
+ | GPUTextureUsage.COPY_SRC
57
+ ;
58
+ this.#lut_sky.resize(1024, 1024);
59
+
60
+ }
61
+
62
+ #needs_update = true;
63
+
64
+ set needs_update(v) {
65
+ if (v) {
66
+ this.#needs_update = true;
67
+ }
68
+ }
69
+
70
+ /**
71
+ *
72
+ * @param {GPUCameraContext} camera
73
+ * @param {GPUSceneContext} scene
74
+ */
75
+ update(camera, scene) {
76
+
77
+ if (!this.#needs_update) {
78
+ return;
79
+ }
80
+
81
+ this.#needs_update = false;
82
+
83
+ // ensure base sky LUTs are up-to-date
84
+ /**
85
+ *
86
+ * @type {GPUSky}
87
+ */
88
+ const scene_sky = scene.sky;
89
+ scene_sky.update();
90
+
91
+ const graph = new FrameGraph("sky update");
92
+
93
+ const command_ctx = ShadeGPUCommandContext.create(
94
+ this.#graphics,
95
+ "Renderer/main"
96
+ );
97
+
98
+ const gr_transmittance = graph.import_resource("transmittance", TextureResourceDescriptor.fromTexture(scene_sky.lut_transmittance.gpu_texture), scene_sky.lut_transmittance);
99
+ const gr_multiscatter = graph.import_resource("multiscatter", TextureResourceDescriptor.fromTexture(scene_sky.lut_multiple_scattering.gpu_texture), scene_sky.lut_multiple_scattering);
100
+ const gr_sky = graph.import_resource("sky_irradiance", TextureResourceDescriptor.fromTexture(this.#lut_sky.gpu_texture), this.#lut_sky);
101
+
102
+ let [out] = graph_image_pass({
103
+ graph,
104
+ shader: shader_sky_irradiance_lut,
105
+ inputs: {
106
+ camera: camera.buffer,
107
+
108
+ light_data: scene.lights.buffer_data,
109
+
110
+ tSkyLutTransmittance: gr_transmittance,
111
+ tSkyLutMultiscatter: gr_multiscatter
112
+ },
113
+ output: [gr_sky]
114
+ });
115
+
116
+ // convolve
117
+ out = graph_filter_environment_map({
118
+ graph,
119
+ map: out
120
+ });
121
+
122
+ command_ctx.encodeGraph(graph);
123
+
124
+ command_ctx.finish();
125
+
126
+ debug_counter++;
127
+
128
+
129
+ // this.debug(3);
130
+ }
131
+
132
+ async debug(mip = 0) {
133
+ if (this.__debug_waiting) {
134
+ return;
135
+ }
136
+
137
+ this.__debug_waiting = true;
138
+
139
+ const texture = this.#lut_sky;
140
+
141
+ const data = await texture.download(mip);
142
+
143
+ const s = new Sampler2D(data, 4, texture.size[0] >> mip, texture.size[1] >> mip);
144
+ sampler_linear_to_sRGB(s);
145
+
146
+ const canvas = sampler2d_to_html_canvas(s, 255, 0, this.__debug_canvas);
147
+
148
+ if (this.__debug_canvas === undefined) {
149
+
150
+ canvas.style.zIndex = "100";
151
+ canvas.style.position = "absolute";
152
+ canvas.style.bottom = `${32}px`;
153
+ canvas.style.right = `${32}px`;
154
+
155
+ const transform = new Float32Array(9);
156
+ m3_cm_compose_transform(transform, 0, 0, 1, -1, 0, 0, 0);
157
+ writeCssTransformMatrix(transform, canvas);
158
+
159
+ document.body.appendChild(canvas);
160
+ }
161
+
162
+ this.__debug_canvas = canvas;
163
+
164
+ this.__debug_waiting = false;
165
+ }
166
+
167
+ destroy() {
168
+ this.#lut_sky.destroy();
169
+ }
174
170
  }
@@ -1 +1 @@
1
- {"version":3,"file":"GPUViewVolumetrics.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/volumetrics/GPUViewVolumetrics.js"],"names":[],"mappings":"AAkBA;IAgFI;;;;OAIG;IACH,qDAqBC;IAtED;;OAEG;IACH,8BAOC;IAjBD;;OAEG;IACH,2BAEC;IA6BD;;OAEG;IACH,4BAEC;IAZD;;OAEG;IACH,yBAEC;IA+CD,gBAWC;IAgGD;;;;;;;OAOG;IACH;;;MAwEC;;CAEJ"}
1
+ {"version":3,"file":"GPUViewVolumetrics.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/volumetrics/GPUViewVolumetrics.js"],"names":[],"mappings":"AA4BA;IAyHI;;;;OAIG;IACH,qDAqBC;IA/GD;;OAEG;IACH,8BAOC;IAjBD;;OAEG;IACH,2BAEC;IA6BD;;OAEG;IACH,4BAEC;IAZD;;OAEG;IACH,yBAEC;IAwFD,gBAWC;IAiND;;;;;;;OAOG;IACH;;;MAyEC;;CAEJ"}