@woosh/meep-engine 3.39.0 → 3.40.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 (367) hide show
  1. package/build/bundle-worker-terrain.js +1 -1
  2. package/package.json +1 -1
  3. package/src/engine/EngineHarness.d.ts.map +1 -1
  4. package/src/engine/EngineHarness.js +17 -4
  5. package/src/engine/asset/loaders/image/avif/threaded_image_encoder.js +1 -1
  6. package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
  7. package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +4 -0
  8. package/src/engine/graphics/ecs/water/Water.d.ts +14 -17
  9. package/src/engine/graphics/ecs/water/Water.d.ts.map +1 -1
  10. package/src/engine/graphics/ecs/water/Water.js +100 -110
  11. package/src/engine/graphics/ecs/water/WaterSerializationAdapter.d.ts.map +1 -1
  12. package/src/engine/graphics/ecs/water/WaterSerializationAdapter.js +36 -38
  13. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_3_4.d.ts +6 -0
  14. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_3_4.d.ts.map +1 -0
  15. package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_3_4.js +10 -0
  16. package/src/engine/graphics/ecs/water/WaterWaves.d.ts +3 -3
  17. package/src/engine/graphics/ecs/water/WaterWaves.js +46 -46
  18. package/src/engine/graphics/texture/sampler/sampler2d_to_avif.d.ts.map +1 -1
  19. package/src/engine/graphics/texture/sampler/sampler2d_to_avif.js +8 -5
  20. package/src/engine/graphics3/WaterSystem.d.ts +21 -74
  21. package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
  22. package/src/engine/graphics3/WaterSystem.js +174 -367
  23. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  24. package/src/format/image/avif/api/convert_to_rgba.d.ts +2 -2
  25. package/src/format/image/avif/api/convert_to_rgba.d.ts.map +1 -1
  26. package/src/format/image/avif/api/convert_to_rgba.js +10 -9
  27. package/src/format/image/avif/api/decode_avif.d.ts +2 -2
  28. package/src/format/image/avif/api/decode_avif.d.ts.map +1 -1
  29. package/src/format/image/avif/api/decode_avif.js +1 -1
  30. package/src/shade/playground/ssr_reprojection/README.md +111 -103
  31. package/src/shade/playground/ssr_reprojection/SpatialFilterProbe.js +68 -68
  32. package/src/shade/playground/ssr_reprojection/index.html +80 -79
  33. package/src/shade/playground/ssr_reprojection/main.js +256 -247
  34. package/src/shade/playground/ssr_variance/capture.js +96 -96
  35. package/src/shade/playground/ssr_variance/reference.js +78 -78
  36. package/src/shade/playground/vsm/README.md +96 -0
  37. package/src/shade/playground/vsm/VSMDebugOverlay.d.ts +49 -0
  38. package/src/shade/playground/vsm/VSMDebugOverlay.d.ts.map +1 -0
  39. package/src/shade/playground/vsm/VSMDebugOverlay.js +351 -0
  40. package/src/shade/playground/vsm/clipmap_panel.d.ts +8 -0
  41. package/src/shade/playground/vsm/clipmap_panel.d.ts.map +1 -0
  42. package/src/shade/playground/vsm/clipmap_panel.js +138 -0
  43. package/src/shade/playground/vsm/index.html +170 -0
  44. package/src/shade/playground/vsm/main.d.ts +2 -0
  45. package/src/shade/playground/vsm/main.d.ts.map +1 -0
  46. package/src/shade/playground/vsm/main.js +389 -0
  47. package/src/shade/playground/vsm/scenes.d.ts +52 -0
  48. package/src/shade/playground/vsm/scenes.d.ts.map +1 -0
  49. package/src/shade/playground/vsm/scenes.js +320 -0
  50. package/src/shade/playground/vsm/verify_vsm.d.ts +38 -0
  51. package/src/shade/playground/vsm/verify_vsm.d.ts.map +1 -0
  52. package/src/shade/playground/vsm/verify_vsm.js +305 -0
  53. package/src/shade/playground/water_refraction/README.md +57 -9
  54. package/src/shade/playground/water_refraction/main.js +12 -3
  55. package/src/shade/playground/water_refraction/world.d.ts +1 -0
  56. package/src/shade/playground/water_refraction/world.d.ts.map +1 -1
  57. package/src/shade/playground/water_refraction/world.js +15 -5
  58. package/src/shade/renderer/Renderer.d.ts +19 -0
  59. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  60. package/src/shade/renderer/Renderer.js +72 -1
  61. package/src/shade/renderer/animation/GPUAnimationManager.d.ts +8 -0
  62. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  63. package/src/shade/renderer/animation/GPUAnimationManager.js +18 -0
  64. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts +7 -0
  65. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  66. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +11 -0
  67. package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.d.ts +3 -1
  68. package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.d.ts.map +1 -1
  69. package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.js +10 -1
  70. package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_read_code.d.ts.map +1 -1
  71. package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_read_code.js +28 -0
  72. package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_write_code.d.ts.map +1 -1
  73. package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_write_code.js +31 -1
  74. package/src/shade/renderer/geometry/MeshletGeometry.d.ts +3 -0
  75. package/src/shade/renderer/geometry/MeshletGeometry.d.ts.map +1 -1
  76. package/src/shade/renderer/geometry/MeshletGeometry.js +1 -0
  77. package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.d.ts.map +1 -1
  78. package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.js +62 -4
  79. package/src/shade/renderer/light/environment/rgbe/parse_rgbe.d.ts +1 -1
  80. package/src/shade/renderer/light/environment/rgbe/parse_rgbe.js +2 -2
  81. package/src/shade/renderer/light/environment/rgbe/rgbe_byte_to_rgb_half.d.ts +2 -2
  82. package/src/shade/renderer/light/environment/rgbe/rgbe_byte_to_rgb_half.d.ts.map +1 -1
  83. package/src/shade/renderer/light/environment/rgbe/rgbe_byte_to_rgb_half.js +6 -14
  84. package/src/shade/renderer/light/environment/sh_exponential/chunk_sh_exp_workgroup_sum.d.ts.map +1 -1
  85. package/src/shade/renderer/light/environment/sh_exponential/chunk_sh_exp_workgroup_sum.js +5 -1
  86. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  87. package/src/shade/renderer/medium/ParticipatingMedium.d.ts +3 -0
  88. package/src/shade/renderer/medium/ParticipatingMedium.d.ts.map +1 -1
  89. package/src/shade/renderer/medium/ParticipatingMedium.js +7 -0
  90. package/src/shade/renderer/postprocess/eye/shader_autoexposure_build_histogram.d.ts.map +1 -1
  91. package/src/shade/renderer/postprocess/eye/shader_autoexposure_build_histogram.js +5 -35
  92. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  93. package/src/shade/renderer/postprocess/ssr/SSR.d.ts +12 -4
  94. package/src/shade/renderer/postprocess/ssr/SSR.d.ts.map +1 -1
  95. package/src/shade/renderer/postprocess/ssr/SSR.js +36 -8
  96. package/src/shade/renderer/postprocess/ssr/SSR_DENOISE_TILE_SIZE.d.ts +3 -0
  97. package/src/shade/renderer/postprocess/ssr/SSR_DENOISE_TILE_SIZE.d.ts.map +1 -0
  98. package/src/shade/renderer/postprocess/ssr/SSR_DENOISE_TILE_SIZE.js +2 -0
  99. package/src/shade/renderer/postprocess/ssr/chunk_ssr_denoise_tile_active.d.ts +8 -0
  100. package/src/shade/renderer/postprocess/ssr/chunk_ssr_denoise_tile_active.d.ts.map +1 -0
  101. package/src/shade/renderer/postprocess/ssr/chunk_ssr_denoise_tile_active.js +40 -0
  102. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.d.ts.map +1 -1
  103. package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.js +150 -137
  104. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_classify.d.ts +3 -0
  105. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_classify.d.ts.map +1 -0
  106. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_classify.js +44 -0
  107. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_dilate.d.ts +5 -0
  108. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_dilate.d.ts.map +1 -0
  109. package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_dilate.js +35 -0
  110. package/src/shade/renderer/postprocess/ssr/ssr_graph_denoise_tiles.d.ts +26 -0
  111. package/src/shade/renderer/postprocess/ssr/ssr_graph_denoise_tiles.d.ts.map +1 -0
  112. package/src/shade/renderer/postprocess/ssr/ssr_graph_denoise_tiles.js +42 -0
  113. package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.d.ts +1 -0
  114. package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.d.ts.map +1 -1
  115. package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.js +113 -105
  116. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts +2 -0
  117. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts.map +1 -1
  118. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js +177 -167
  119. package/src/shade/renderer/rasterize/DEPTH_STENCIL_STATE_SHADOW.d.ts.map +1 -1
  120. package/src/shade/renderer/rasterize/DEPTH_STENCIL_STATE_SHADOW.js +10 -0
  121. package/src/shade/renderer/rasterize/RasterizationJob.d.ts +1 -2
  122. package/src/shade/renderer/rasterize/RasterizationJob.d.ts.map +1 -1
  123. package/src/shade/renderer/rasterize/RasterizationJob.js +1 -2
  124. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts +5 -6
  125. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts.map +1 -1
  126. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.js +5 -6
  127. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +2 -2
  128. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -1
  129. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +1 -1
  130. package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.d.ts.map +1 -1
  131. package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.js +11 -0
  132. package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/build_lut_fog_parameters_jendersie_deon.d.ts.map +1 -1
  133. package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/build_lut_fog_parameters_jendersie_deon.js +4 -5
  134. package/src/shade/renderer/shader/chunk/brdf/dfg/generate_dfg_texture.d.ts.map +1 -1
  135. package/src/shade/renderer/shader/chunk/brdf/dfg/generate_dfg_texture.js +1 -5
  136. package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_importance.d.ts +30 -0
  137. package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_importance.d.ts.map +1 -0
  138. package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_importance.js +54 -0
  139. package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.d.ts.map +1 -1
  140. package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.js +3 -2
  141. package/src/shade/renderer/shadow/map/DIRECTIONAL_SHADOWMAP_STRUCT.d.ts +19 -0
  142. package/src/shade/renderer/shadow/map/DIRECTIONAL_SHADOWMAP_STRUCT.d.ts.map +1 -0
  143. package/src/shade/renderer/shadow/map/DIRECTIONAL_SHADOWMAP_STRUCT.js +27 -0
  144. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts +1 -0
  145. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts.map +1 -1
  146. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.js +4 -0
  147. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts +54 -0
  148. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
  149. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +502 -10
  150. package/src/shade/renderer/shadow/map/Shadowmap.d.ts +3 -2
  151. package/src/shade/renderer/shadow/map/Shadowmap.d.ts.map +1 -1
  152. package/src/shade/renderer/shadow/map/Shadowmap.js +3 -2
  153. package/src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.d.ts +8 -0
  154. package/src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.d.ts.map +1 -1
  155. package/src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.js +34 -3
  156. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.d.ts +3 -2
  157. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.d.ts.map +1 -1
  158. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.js +17 -2
  159. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_point2.d.ts.map +1 -1
  160. package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_point2.js +137 -133
  161. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_FIRST_TEXEL_SIZE.d.ts +15 -0
  162. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_FIRST_TEXEL_SIZE.d.ts.map +1 -0
  163. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_FIRST_TEXEL_SIZE.js +14 -0
  164. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_PAGE_BUDGET.d.ts +16 -0
  165. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_PAGE_BUDGET.d.ts.map +1 -0
  166. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_PAGE_BUDGET.js +15 -0
  167. package/src/shade/renderer/shadow/vsm/PLAN.md +440 -0
  168. package/src/shade/renderer/shadow/vsm/REVIEW_LEDGER.md +43 -0
  169. package/src/shade/renderer/shadow/vsm/VSMMoverTracker.d.ts +42 -0
  170. package/src/shade/renderer/shadow/vsm/VSMMoverTracker.d.ts.map +1 -0
  171. package/src/shade/renderer/shadow/vsm/VSMMoverTracker.js +153 -0
  172. package/src/shade/renderer/shadow/vsm/VSMPageManager.d.ts +327 -0
  173. package/src/shade/renderer/shadow/vsm/VSMPageManager.d.ts.map +1 -0
  174. package/src/shade/renderer/shadow/vsm/VSMPageManager.js +1408 -0
  175. package/src/shade/renderer/shadow/vsm/VSM_COVER_LEVEL_STEP.d.ts +14 -0
  176. package/src/shade/renderer/shadow/vsm/VSM_COVER_LEVEL_STEP.d.ts.map +1 -0
  177. package/src/shade/renderer/shadow/vsm/VSM_COVER_LEVEL_STEP.js +13 -0
  178. package/src/shade/renderer/shadow/vsm/VSM_FEEDBACK_LAYOUT.d.ts +63 -0
  179. package/src/shade/renderer/shadow/vsm/VSM_FEEDBACK_LAYOUT.d.ts.map +1 -0
  180. package/src/shade/renderer/shadow/vsm/VSM_FEEDBACK_LAYOUT.js +70 -0
  181. package/src/shade/renderer/shadow/vsm/VSM_LEVEL_LIMIT.d.ts +11 -0
  182. package/src/shade/renderer/shadow/vsm/VSM_LEVEL_LIMIT.d.ts.map +1 -0
  183. package/src/shade/renderer/shadow/vsm/VSM_LEVEL_LIMIT.js +10 -0
  184. package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.d.ts +54 -0
  185. package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.d.ts.map +1 -0
  186. package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.js +75 -0
  187. package/src/shade/renderer/shadow/vsm/VSM_RECORD_STRUCT.d.ts +23 -0
  188. package/src/shade/renderer/shadow/vsm/VSM_RECORD_STRUCT.d.ts.map +1 -0
  189. package/src/shade/renderer/shadow/vsm/VSM_RECORD_STRUCT.js +85 -0
  190. package/src/shade/renderer/shadow/vsm/VSM_SLOT_STRUCT.d.ts +16 -0
  191. package/src/shade/renderer/shadow/vsm/VSM_SLOT_STRUCT.d.ts.map +1 -0
  192. package/src/shade/renderer/shadow/vsm/VSM_SLOT_STRUCT.js +29 -0
  193. package/src/shade/renderer/shadow/vsm/VirtualShadowMap.d.ts +136 -25
  194. package/src/shade/renderer/shadow/vsm/VirtualShadowMap.d.ts.map +1 -1
  195. package/src/shade/renderer/shadow/vsm/VirtualShadowMap.js +282 -116
  196. package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.d.ts +39 -0
  197. package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.d.ts.map +1 -0
  198. package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.js +289 -0
  199. package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_virtual.d.ts +18 -0
  200. package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_virtual.d.ts.map +1 -0
  201. package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_virtual.js +65 -0
  202. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_addressing.d.ts +17 -0
  203. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_addressing.d.ts.map +1 -0
  204. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_addressing.js +75 -0
  205. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.d.ts +14 -0
  206. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.d.ts.map +1 -0
  207. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.js +45 -0
  208. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_find_page.d.ts +17 -0
  209. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_find_page.d.ts.map +1 -0
  210. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_find_page.js +100 -0
  211. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_page_view_projection.d.ts +15 -0
  212. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_page_view_projection.d.ts.map +1 -0
  213. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_page_view_projection.js +47 -0
  214. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_demand.d.ts +26 -0
  215. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_demand.d.ts.map +1 -0
  216. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_demand.js +156 -0
  217. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_gather_counts.d.ts +13 -0
  218. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_gather_counts.d.ts.map +1 -0
  219. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_gather_counts.js +65 -0
  220. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.d.ts +30 -0
  221. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.d.ts.map +1 -0
  222. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.js +184 -0
  223. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.d.ts +23 -0
  224. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.d.ts.map +1 -0
  225. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.js +109 -0
  226. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.d.ts +56 -0
  227. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.d.ts.map +1 -0
  228. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.js +211 -0
  229. package/src/shade/renderer/texture/format/decode_typed_gpu_data.d.ts +1 -1
  230. package/src/shade/renderer/texture/format/decode_typed_gpu_data.d.ts.map +1 -1
  231. package/src/shade/renderer/texture/format/decode_typed_gpu_data.js +3 -13
  232. package/src/shade/renderer/texture/format/infer_format_from_parameters.d.ts.map +1 -1
  233. package/src/shade/renderer/texture/format/infer_format_from_parameters.js +2 -3
  234. package/src/shade/renderer/texture/texture_write_to_gpu.d.ts.map +1 -1
  235. package/src/shade/renderer/texture/texture_write_to_gpu.js +16 -16
  236. package/src/shade/renderer/texture/virtual/VTPhysicalCache.d.ts +4 -90
  237. package/src/shade/renderer/texture/virtual/VTPhysicalCache.d.ts.map +1 -1
  238. package/src/shade/renderer/texture/virtual/VTPhysicalCache.js +6 -210
  239. package/src/shade/renderer/texture/virtual/VTPhysicalSlots.d.ts +119 -0
  240. package/src/shade/renderer/texture/virtual/VTPhysicalSlots.d.ts.map +1 -0
  241. package/src/shade/renderer/texture/virtual/VTPhysicalSlots.js +245 -0
  242. package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.d.ts +1 -1
  243. package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.d.ts.map +1 -1
  244. package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.js +3 -19
  245. package/src/shade/renderer/texture/virtual/chunk_vt_page_table_entry.d.ts +13 -0
  246. package/src/shade/renderer/texture/virtual/chunk_vt_page_table_entry.d.ts.map +1 -0
  247. package/src/shade/renderer/texture/virtual/chunk_vt_page_table_entry.js +34 -0
  248. package/src/shade/renderer/water/GPUWaterRenderer.d.ts +7 -2
  249. package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
  250. package/src/shade/renderer/water/GPUWaterRenderer.js +49 -49
  251. package/src/shade/renderer/water/chunk_water_transport.js +3 -3
  252. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts +11 -25
  253. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +1 -1
  254. package/src/shade/renderer/water/medium/GPUWaterBodies.js +64 -116
  255. package/src/shade/renderer/water/medium/WATER_BODIES_STRUCT.d.ts +1 -20
  256. package/src/shade/renderer/water/medium/WATER_BODIES_STRUCT.d.ts.map +1 -1
  257. package/src/shade/renderer/water/medium/WATER_BODIES_STRUCT.js +10 -42
  258. package/src/shade/renderer/water/medium/chunk_water_bodies.d.ts +3 -0
  259. package/src/shade/renderer/water/medium/chunk_water_bodies.d.ts.map +1 -0
  260. package/src/shade/renderer/water/medium/chunk_water_bodies.js +3 -0
  261. package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts +1 -5
  262. package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts.map +1 -1
  263. package/src/shade/renderer/water/medium/shader_water_bodies_derive.js +32 -30
  264. package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts +4 -0
  265. package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts.map +1 -0
  266. package/src/shade/renderer/water/medium/shader_water_meshlets.js +69 -0
  267. package/src/shade/renderer/water/optics/chunk_water_inscatter.d.ts.map +1 -1
  268. package/src/shade/renderer/water/optics/chunk_water_inscatter.js +124 -123
  269. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.d.ts.map +1 -1
  270. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.js +75 -74
  271. package/src/shade/renderer/water/shader_water.d.ts +1 -1
  272. package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
  273. package/src/shade/renderer/water/shader_water.js +490 -406
  274. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts +12 -85
  275. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts.map +1 -1
  276. package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.js +128 -408
  277. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts +6 -0
  278. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts.map +1 -0
  279. package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.js +23 -0
  280. package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts +9 -0
  281. package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts.map +1 -0
  282. package/src/shade/renderer/water/surface/chunk_water_tessellation.js +144 -0
  283. package/src/shade/renderer/water/surface/chunk_water_wave.d.ts +3 -5
  284. package/src/shade/renderer/water/surface/chunk_water_wave.d.ts.map +1 -1
  285. package/src/shade/renderer/water/surface/chunk_water_wave.js +40 -48
  286. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts +14 -0
  287. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts.map +1 -0
  288. package/src/shade/renderer/water/surface/graph_water_tessellation.js +34 -0
  289. package/src/shade/renderer/water/surface/shader_water_tiles.d.ts +4 -0
  290. package/src/shade/renderer/water/surface/shader_water_tiles.d.ts.map +1 -0
  291. package/src/shade/renderer/water/surface/shader_water_tiles.js +123 -0
  292. package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts +6 -0
  293. package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts.map +1 -0
  294. package/src/shade/renderer/water/surface/shader_water_wave_batch.js +85 -0
  295. package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts +6 -0
  296. package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts.map +1 -0
  297. package/src/shade/renderer/water/surface/shader_water_wave_domain.js +83 -0
  298. package/src/shade/renderer/water/water_height_texture_from_sampler.d.ts.map +1 -1
  299. package/src/shade/renderer/water/water_height_texture_from_sampler.js +4 -3
  300. package/src/engine/graphics/ecs/water/WATER_SIZE.d.ts +0 -2
  301. package/src/engine/graphics/ecs/water/WATER_SIZE.d.ts.map +0 -1
  302. package/src/engine/graphics/ecs/water/WATER_SIZE.js +0 -1
  303. package/src/shade/renderer/light/GPUViewLightContext.d.ts +0 -22
  304. package/src/shade/renderer/light/GPUViewLightContext.d.ts.map +0 -1
  305. package/src/shade/renderer/light/GPUViewLightContext.js +0 -62
  306. package/src/shade/renderer/shadow/map/csm/CSM_SHADOWMAP_STRUCT.d.ts +0 -14
  307. package/src/shade/renderer/shadow/map/csm/CSM_SHADOWMAP_STRUCT.d.ts.map +0 -1
  308. package/src/shade/renderer/shadow/map/csm/CSM_SHADOWMAP_STRUCT.js +0 -20
  309. package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.d.ts +0 -27
  310. package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.d.ts.map +0 -1
  311. package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.js +0 -147
  312. package/src/shade/renderer/shadow/vsm/GPUVirtualShadowTextureResidence.d.ts +0 -7
  313. package/src/shade/renderer/shadow/vsm/GPUVirtualShadowTextureResidence.d.ts.map +0 -1
  314. package/src/shade/renderer/shadow/vsm/GPUVirtualShadowTextureResidence.js +0 -10
  315. package/src/shade/renderer/shadow/vsm/VSM_RESIDENCE_WORKGROUP_TILE_RESOLUTION.d.ts +0 -2
  316. package/src/shade/renderer/shadow/vsm/VSM_RESIDENCE_WORKGROUP_TILE_RESOLUTION.d.ts.map +0 -1
  317. package/src/shade/renderer/shadow/vsm/VSM_RESIDENCE_WORKGROUP_TILE_RESOLUTION.js +0 -1
  318. package/src/shade/renderer/shadow/vsm/VSM_UNIFORMS_STRUCT.d.ts +0 -3
  319. package/src/shade/renderer/shadow/vsm/VSM_UNIFORMS_STRUCT.d.ts.map +0 -1
  320. package/src/shade/renderer/shadow/vsm/VSM_UNIFORMS_STRUCT.js +0 -8
  321. package/src/shade/renderer/shadow/vsm/VirtualShadowmapRenderer.d.ts +0 -27
  322. package/src/shade/renderer/shadow/vsm/VirtualShadowmapRenderer.d.ts.map +0 -1
  323. package/src/shade/renderer/shadow/vsm/VirtualShadowmapRenderer.js +0 -102
  324. package/src/shade/renderer/shadow/vsm/debug_inspect_coarse_bounds_buffer.d.ts +0 -8
  325. package/src/shade/renderer/shadow/vsm/debug_inspect_coarse_bounds_buffer.d.ts.map +0 -1
  326. package/src/shade/renderer/shadow/vsm/debug_inspect_coarse_bounds_buffer.js +0 -34
  327. package/src/shade/renderer/shadow/vsm/debug_inspect_residence_buffer.d.ts +0 -10
  328. package/src/shade/renderer/shadow/vsm/debug_inspect_residence_buffer.d.ts.map +0 -1
  329. package/src/shade/renderer/shadow/vsm/debug_inspect_residence_buffer.js +0 -64
  330. package/src/shade/renderer/shadow/vsm/decode_tile_address.d.ts +0 -11
  331. package/src/shade/renderer/shadow/vsm/decode_tile_address.d.ts.map +0 -1
  332. package/src/shade/renderer/shadow/vsm/decode_tile_address.js +0 -26
  333. package/src/shade/renderer/shadow/vsm/render/vms_render_tiles.d.ts +0 -2
  334. package/src/shade/renderer/shadow/vsm/render/vms_render_tiles.d.ts.map +0 -1
  335. package/src/shade/renderer/shadow/vsm/render/vms_render_tiles.js +0 -11
  336. package/src/shade/renderer/shadow/vsm/vms_pipeline_compute_coarse_bounds.d.ts +0 -20
  337. package/src/shade/renderer/shadow/vsm/vms_pipeline_compute_coarse_bounds.d.ts.map +0 -1
  338. package/src/shade/renderer/shadow/vsm/vms_pipeline_compute_coarse_bounds.js +0 -184
  339. package/src/shade/renderer/shadow/vsm/vsm_residence_pipeline.d.ts +0 -25
  340. package/src/shade/renderer/shadow/vsm/vsm_residence_pipeline.d.ts.map +0 -1
  341. package/src/shade/renderer/shadow/vsm/vsm_residence_pipeline.js +0 -230
  342. package/src/shade/renderer/shadow/vsm/vsm_tile_allocation_pipeline.d.ts +0 -19
  343. package/src/shade/renderer/shadow/vsm/vsm_tile_allocation_pipeline.d.ts.map +0 -1
  344. package/src/shade/renderer/shadow/vsm/vsm_tile_allocation_pipeline.js +0 -127
  345. package/src/shade/renderer/texture/encode/ENCODE_NOTES_2026_09_02.md +0 -462
  346. package/src/shade/renderer/water/optics/chunk_water_light_transmittance.d.ts +0 -23
  347. package/src/shade/renderer/water/optics/chunk_water_light_transmittance.d.ts.map +0 -1
  348. package/src/shade/renderer/water/optics/chunk_water_light_transmittance_dry.d.ts +0 -18
  349. package/src/shade/renderer/water/optics/chunk_water_light_transmittance_dry.d.ts.map +0 -1
  350. package/src/shade/renderer/water/surface/WATER_SURFACE_VERTEX_STRUCT.d.ts +0 -12
  351. package/src/shade/renderer/water/surface/WATER_SURFACE_VERTEX_STRUCT.d.ts.map +0 -1
  352. package/src/shade/renderer/water/surface/WATER_SURFACE_VERTEX_STRUCT.js +0 -27
  353. package/src/shade/renderer/water/surface/WATER_WAVE_PARAMETERS_STRUCT.d.ts +0 -14
  354. package/src/shade/renderer/water/surface/WATER_WAVE_PARAMETERS_STRUCT.d.ts.map +0 -1
  355. package/src/shade/renderer/water/surface/WATER_WAVE_PARAMETERS_STRUCT.js +0 -49
  356. package/src/shade/renderer/water/surface/chunk_water_wave_grid.d.ts +0 -9
  357. package/src/shade/renderer/water/surface/chunk_water_wave_grid.d.ts.map +0 -1
  358. package/src/shade/renderer/water/surface/chunk_water_wave_grid.js +0 -47
  359. package/src/shade/renderer/water/surface/shader_water_surface_write.d.ts +0 -10
  360. package/src/shade/renderer/water/surface/shader_water_surface_write.d.ts.map +0 -1
  361. package/src/shade/renderer/water/surface/shader_water_surface_write.js +0 -51
  362. package/src/shade/renderer/water/surface/shader_water_wave_step.d.ts +0 -12
  363. package/src/shade/renderer/water/surface/shader_water_wave_step.d.ts.map +0 -1
  364. package/src/shade/renderer/water/surface/shader_water_wave_step.js +0 -54
  365. package/src/shade/renderer/water/surface/water_surface_grid_indices.d.ts +0 -13
  366. package/src/shade/renderer/water/surface/water_surface_grid_indices.d.ts.map +0 -1
  367. package/src/shade/renderer/water/surface/water_surface_grid_indices.js +0 -39
@@ -13,11 +13,10 @@
13
13
  * no mip chain — virtual mip selection happens in the page table, physical
14
14
  * sampling is always level 0.
15
15
  *
16
- * Eviction metadata (last-touch frame, lock flag) lives here as flat
17
- * parallel arrays; the pick is a linear scan, which at the typical slot
18
- * count (≤ ~1k) is cheaper than maintaining a heap.
16
+ * The slot bookkeeping — allocation, touches, locks, the eviction pick — is
17
+ * {@link VTPhysicalSlots}'; this adds the textures the slots address.
19
18
  */
20
- export class VTPhysicalCache {
19
+ export class VTPhysicalCache extends VTPhysicalSlots {
21
20
  /**
22
21
  *
23
22
  * @param {GPUDevice} device
@@ -40,42 +39,6 @@ export class VTPhysicalCache {
40
39
  premultiplied?: boolean;
41
40
  }[];
42
41
  });
43
- /**
44
- * Payload texels per page side, without border.
45
- * @type {number}
46
- * @readonly
47
- */
48
- readonly page_size: number;
49
- /**
50
- * Border texels on each side of the payload.
51
- * @type {number}
52
- * @readonly
53
- */
54
- readonly border: number;
55
- /**
56
- * page_size + 2*border.
57
- * @type {number}
58
- * @readonly
59
- */
60
- readonly slot_size: number;
61
- /**
62
- * Atlas side length in texels.
63
- * @type {number}
64
- * @readonly
65
- */
66
- readonly atlas_size: number;
67
- /**
68
- * Slots along one atlas axis.
69
- * @type {number}
70
- * @readonly
71
- */
72
- readonly slots_per_axis: number;
73
- /**
74
- * Total slot count.
75
- * @type {number}
76
- * @readonly
77
- */
78
- readonly capacity: number;
79
42
  /**
80
43
  * @typedef {Object} VTCacheLayer
81
44
  * @property {string} name
@@ -106,55 +69,6 @@ export class VTPhysicalCache {
106
69
  * @readonly
107
70
  */
108
71
  readonly views: GPUTextureView[];
109
- /**
110
- * Number of allocated slots.
111
- * @returns {number}
112
- */
113
- get used(): number;
114
- /**
115
- *
116
- * @param {number} slot
117
- * @returns {{x: number, y: number}} slot grid coordinates
118
- */
119
- slot_coords(slot: number): {
120
- x: number;
121
- y: number;
122
- };
123
- /**
124
- *
125
- * @param {number} current_frame
126
- * @param {boolean} [locked]
127
- * @param {number} [mip] virtual mip of the incoming page
128
- * @returns {number} slot index, or -1 when full
129
- */
130
- allocate(current_frame: number, locked?: boolean, mip?: number): number;
131
- /**
132
- *
133
- * @param {number} slot
134
- */
135
- free(slot: number): void;
136
- /**
137
- *
138
- * @param {number} slot
139
- * @param {number} frame
140
- */
141
- touch(slot: number, frame: number): void;
142
- /**
143
- *
144
- * @param {number} slot
145
- * @returns {number}
146
- */
147
- last_touch(slot: number): number;
148
- /**
149
- * Pick the least-recently-touched evictable slot.
150
- *
151
- * @param {number} current_frame
152
- * @param {number} protect_window slots touched within this many frames
153
- * are not eligible — feedback readback runs a couple of frames
154
- * behind, so "recently touched" really means "probably on screen"
155
- * @returns {number} slot index, or -1 when nothing is evictable
156
- */
157
- find_eviction_candidate(current_frame: number, protect_window: number): number;
158
72
  /**
159
73
  * Upload one layer of a page into a slot.
160
74
  *
@@ -173,6 +87,6 @@ export class VTPhysicalCache {
173
87
  bytes_per_row?: number;
174
88
  }): void;
175
89
  destroy(): void;
176
- #private;
177
90
  }
91
+ import { VTPhysicalSlots } from "./VTPhysicalSlots.js";
178
92
  //# sourceMappingURL=VTPhysicalCache.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"VTPhysicalCache.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/texture/virtual/VTPhysicalCache.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;GAkBG;AACH;IAuGI;;;;;;;;OAQG;IACH;qBALW,MAAM;oBACN,MAAM;iBACN,MAAM;;kBA/DH,MAAM;;;;;4BAEN,OAAO;;OAgHpB;IA9JD;;;;OAIG;IACH,oBAHU,MAAM,CAGN;IAEV;;;;OAIG;IACH,iBAHU,MAAM,CAGT;IAEP;;;;OAIG;IACH,oBAHU,MAAM,CAGN;IAEV;;;;OAIG;IACH,qBAHU,MAAM,CAGL;IAEX;;;;OAIG;IACH,yBAHU,MAAM,CAGD;IAEf;;;;OAIG;IACH,mBAHU,MAAM,CAGP;IAET;;;;;OAKG;IAEH;;;OAGG;IACH;cATc,MAAM;;;;;wBAEN,OAAO;QAOd;IAEP;;;OAGG;IACH,mBAHU,YAAY,CAGR;IAEd;;;;;OAKG;IACH,gBAHU,gBAAgB,CAGf;IA6FX;;;OAGG;IACH,mBAEC;IAED;;;;OAIG;IACH,kBAHW,MAAM,GACJ;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAC,CAOlC;IAED;;;;;;OAMG;IACH,wBALW,MAAM,WACN,OAAO,QACP,MAAM,GACJ,MAAM,CAelB;IAED;;;OAGG;IACH,WAFW,MAAM,QAShB;IAED;;;;OAIG;IACH,YAHW,MAAM,SACN,MAAM,QAIhB;IAED;;;;OAIG;IACH,iBAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;;;;;;OAQG;IACH,uCANW,MAAM,kBACN,MAAM,GAGJ,MAAM,CA4BlB;IAED;;;;;;;;;;;;OAYG;IACH,8BAJW,MAAM,eACN,MAAM,WACN,WAAW,GAAC,eAAe,GAAC,iBAAiB,GAAC,SAAS,GAAC;QAAC,IAAI,EAAE,UAAU,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAC,QAqC5G;IAED,gBAIC;;CACJ"}
1
+ {"version":3,"file":"VTPhysicalCache.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/texture/virtual/VTPhysicalCache.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;GAiBG;AACH;IA6BI;;;;;;;;OAQG;IACH;qBALW,MAAM;oBACN,MAAM;iBACN,MAAM;;kBA/BH,MAAM;;;;;4BAEN,OAAO;;OA4DpB;IAhED;;;;;OAKG;IAEH;;;OAGG;IACH;cATc,MAAM;;;;;wBAEN,OAAO;QAOd;IAEP;;;OAGG;IACH,mBAHU,YAAY,CAGR;IAEd;;;;;OAKG;IACH,gBAHU,gBAAgB,CAGf;IAyCX;;;;;;;;;;;;OAYG;IACH,8BAJW,MAAM,eACN,MAAM,WACN,WAAW,GAAC,eAAe,GAAC,iBAAiB,GAAC,SAAS,GAAC;QAAC,IAAI,EAAE,UAAU,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAC,QAqC5G;IAED,gBAIC;CACJ;gCA/I+B,sBAAsB"}
@@ -1,4 +1,5 @@
1
1
  import { assert } from "../../../../core/assert.js";
2
+ import { VTPhysicalSlots } from "./VTPhysicalSlots.js";
2
3
 
3
4
  /**
4
5
  * Physical page cache: one atlas texture per layer, all layers sharing a
@@ -15,53 +16,10 @@ import { assert } from "../../../../core/assert.js";
15
16
  * no mip chain — virtual mip selection happens in the page table, physical
16
17
  * sampling is always level 0.
17
18
  *
18
- * Eviction metadata (last-touch frame, lock flag) lives here as flat
19
- * parallel arrays; the pick is a linear scan, which at the typical slot
20
- * count (≤ ~1k) is cheaper than maintaining a heap.
19
+ * The slot bookkeeping — allocation, touches, locks, the eviction pick — is
20
+ * {@link VTPhysicalSlots}'; this adds the textures the slots address.
21
21
  */
22
- export class VTPhysicalCache {
23
-
24
- /**
25
- * Payload texels per page side, without border.
26
- * @type {number}
27
- * @readonly
28
- */
29
- page_size;
30
-
31
- /**
32
- * Border texels on each side of the payload.
33
- * @type {number}
34
- * @readonly
35
- */
36
- border;
37
-
38
- /**
39
- * page_size + 2*border.
40
- * @type {number}
41
- * @readonly
42
- */
43
- slot_size;
44
-
45
- /**
46
- * Atlas side length in texels.
47
- * @type {number}
48
- * @readonly
49
- */
50
- atlas_size;
51
-
52
- /**
53
- * Slots along one atlas axis.
54
- * @type {number}
55
- * @readonly
56
- */
57
- slots_per_axis;
58
-
59
- /**
60
- * Total slot count.
61
- * @type {number}
62
- * @readonly
63
- */
64
- capacity;
22
+ export class VTPhysicalCache extends VTPhysicalSlots {
65
23
 
66
24
  /**
67
25
  * @typedef {Object} VTCacheLayer
@@ -90,38 +48,6 @@ export class VTPhysicalCache {
90
48
  */
91
49
  views = [];
92
50
 
93
- /**
94
- * Free slot indices, used as a stack.
95
- * @type {number[]}
96
- */
97
- #free = [];
98
-
99
- /**
100
- * Per-slot: frame index of the last feedback touch.
101
- * @type {Uint32Array}
102
- */
103
- #last_touch;
104
-
105
- /**
106
- * Per-slot: 1 when the slot must never be evicted (stack root pages).
107
- * @type {Uint8Array}
108
- */
109
- #locked;
110
-
111
- /**
112
- * Per-slot: 1 when the slot is allocated.
113
- * @type {Uint8Array}
114
- */
115
- #occupied;
116
-
117
- /**
118
- * Per-slot: virtual mip of the resident page — eviction tie-break only
119
- * (prefer shedding fine pages, shrinking the resident quadtree from the
120
- * leaves).
121
- * @type {Uint8Array}
122
- */
123
- #mip;
124
-
125
51
  /**
126
52
  *
127
53
  * @param {GPUDevice} device
@@ -138,21 +64,10 @@ export class VTPhysicalCache {
138
64
  layers,
139
65
  }) {
140
66
  assert.defined(device, 'device');
141
- assert.isNonNegativeInteger(atlas_size, 'atlas_size');
142
- assert.isNonNegativeInteger(page_size, 'page_size');
143
- assert.isNonNegativeInteger(border, 'border');
144
67
  assert.isArray(layers, 'layers');
145
68
  assert.greaterThan(layers.length, 0, 'layers.length');
146
69
 
147
- this.page_size = page_size;
148
- this.border = border;
149
- this.slot_size = page_size + border * 2;
150
- this.atlas_size = atlas_size;
151
-
152
- this.slots_per_axis = Math.floor(atlas_size / this.slot_size);
153
- this.capacity = this.slots_per_axis * this.slots_per_axis;
154
-
155
- assert.greaterThan(this.capacity, 0, 'cache capacity');
70
+ super({ atlas_size, page_size, border });
156
71
 
157
72
  this.layers = layers;
158
73
 
@@ -170,125 +85,6 @@ export class VTPhysicalCache {
170
85
  this.textures.push(texture);
171
86
  this.views.push(texture.createView());
172
87
  }
173
-
174
- this.#last_touch = new Uint32Array(this.capacity);
175
- this.#locked = new Uint8Array(this.capacity);
176
- this.#occupied = new Uint8Array(this.capacity);
177
- this.#mip = new Uint8Array(this.capacity);
178
-
179
- for (let i = this.capacity - 1; i >= 0; i--) {
180
- this.#free.push(i);
181
- }
182
- }
183
-
184
- /**
185
- * Number of allocated slots.
186
- * @returns {number}
187
- */
188
- get used() {
189
- return this.capacity - this.#free.length;
190
- }
191
-
192
- /**
193
- *
194
- * @param {number} slot
195
- * @returns {{x: number, y: number}} slot grid coordinates
196
- */
197
- slot_coords(slot) {
198
- return {
199
- x: slot % this.slots_per_axis,
200
- y: (slot / this.slots_per_axis) | 0,
201
- };
202
- }
203
-
204
- /**
205
- *
206
- * @param {number} current_frame
207
- * @param {boolean} [locked]
208
- * @param {number} [mip] virtual mip of the incoming page
209
- * @returns {number} slot index, or -1 when full
210
- */
211
- allocate(current_frame, locked = false, mip = 0) {
212
- if (this.#free.length === 0) {
213
- return -1;
214
- }
215
-
216
- const slot = this.#free.pop();
217
-
218
- this.#occupied[slot] = 1;
219
- this.#locked[slot] = locked ? 1 : 0;
220
- this.#last_touch[slot] = current_frame;
221
- this.#mip[slot] = mip;
222
-
223
- return slot;
224
- }
225
-
226
- /**
227
- *
228
- * @param {number} slot
229
- */
230
- free(slot) {
231
- assert.equal(this.#occupied[slot], 1, `slot ${slot} is not allocated`);
232
-
233
- this.#occupied[slot] = 0;
234
- this.#locked[slot] = 0;
235
-
236
- this.#free.push(slot);
237
- }
238
-
239
- /**
240
- *
241
- * @param {number} slot
242
- * @param {number} frame
243
- */
244
- touch(slot, frame) {
245
- this.#last_touch[slot] = frame;
246
- }
247
-
248
- /**
249
- *
250
- * @param {number} slot
251
- * @returns {number}
252
- */
253
- last_touch(slot) {
254
- return this.#last_touch[slot];
255
- }
256
-
257
- /**
258
- * Pick the least-recently-touched evictable slot.
259
- *
260
- * @param {number} current_frame
261
- * @param {number} protect_window slots touched within this many frames
262
- * are not eligible — feedback readback runs a couple of frames
263
- * behind, so "recently touched" really means "probably on screen"
264
- * @returns {number} slot index, or -1 when nothing is evictable
265
- */
266
- find_eviction_candidate(current_frame, protect_window) {
267
- let best = -1;
268
- let best_touch = 0xFFFFFFFF;
269
- let best_mip = 0xFF;
270
-
271
- for (let slot = 0; slot < this.capacity; slot++) {
272
- if (this.#occupied[slot] === 0 || this.#locked[slot] === 1) {
273
- continue;
274
- }
275
-
276
- const touch = this.#last_touch[slot];
277
-
278
- if (current_frame - touch < protect_window) {
279
- continue;
280
- }
281
-
282
- const mip = this.#mip[slot];
283
-
284
- if (touch < best_touch || (touch === best_touch && mip < best_mip)) {
285
- best_touch = touch;
286
- best_mip = mip;
287
- best = slot;
288
- }
289
- }
290
-
291
- return best;
292
88
  }
293
89
 
294
90
  /**
@@ -305,7 +101,7 @@ export class VTPhysicalCache {
305
101
  * @param {ImageBitmap|OffscreenCanvas|HTMLCanvasElement|ImageData|{data: Uint8Array, bytes_per_row?: number}} payload
306
102
  */
307
103
  upload(queue, slot, layer_index, payload) {
308
- assert.equal(this.#occupied[slot], 1, `slot ${slot} is not allocated`);
104
+ assert.equal(this.is_occupied(slot), true, `slot ${slot} is not allocated`);
309
105
 
310
106
  const layer = this.layers[layer_index];
311
107
  const { x, y } = this.slot_coords(slot);
@@ -0,0 +1,119 @@
1
+ /**
2
+ * The slot bookkeeping of a physical page cache — a square grid of `page_size + 2*border` slots
3
+ * over an atlas — with no texture behind it: which slots are taken, when each was last touched,
4
+ * which may never be evicted, and the mip each holds.
5
+ *
6
+ * {@link VTPhysicalCache} adds the layer textures and uploads on top of this. A cache whose pages
7
+ * are drawn rather than uploaded — the virtual shadow map's pool is a region of the shadow atlas —
8
+ * uses it on its own.
9
+ *
10
+ * Eviction metadata lives here as flat parallel arrays; the pick is a linear scan, which at the
11
+ * typical slot count (≤ ~1k) is cheaper than maintaining a heap.
12
+ */
13
+ export class VTPhysicalSlots {
14
+ /**
15
+ *
16
+ * @param {Object} options
17
+ * @param {number} [options.atlas_size]
18
+ * @param {number} [options.page_size]
19
+ * @param {number} [options.border]
20
+ */
21
+ constructor({ atlas_size, page_size, border, }: {
22
+ atlas_size?: number;
23
+ page_size?: number;
24
+ border?: number;
25
+ });
26
+ /**
27
+ * Payload texels per page side, without border.
28
+ * @type {number}
29
+ * @readonly
30
+ */
31
+ readonly page_size: number;
32
+ /**
33
+ * Border texels on each side of the payload.
34
+ * @type {number}
35
+ * @readonly
36
+ */
37
+ readonly border: number;
38
+ /**
39
+ * page_size + 2*border.
40
+ * @type {number}
41
+ * @readonly
42
+ */
43
+ readonly slot_size: number;
44
+ /**
45
+ * Atlas side length in texels.
46
+ * @type {number}
47
+ * @readonly
48
+ */
49
+ readonly atlas_size: number;
50
+ /**
51
+ * Slots along one atlas axis.
52
+ * @type {number}
53
+ * @readonly
54
+ */
55
+ readonly slots_per_axis: number;
56
+ /**
57
+ * Total slot count.
58
+ * @type {number}
59
+ * @readonly
60
+ */
61
+ readonly capacity: number;
62
+ /**
63
+ * Number of allocated slots.
64
+ * @returns {number}
65
+ */
66
+ get used(): number;
67
+ /**
68
+ *
69
+ * @param {number} slot
70
+ * @returns {{x: number, y: number}} slot grid coordinates
71
+ */
72
+ slot_coords(slot: number): {
73
+ x: number;
74
+ y: number;
75
+ };
76
+ /**
77
+ *
78
+ * @param {number} slot
79
+ * @returns {boolean}
80
+ */
81
+ is_occupied(slot: number): boolean;
82
+ /**
83
+ *
84
+ * @param {number} current_frame
85
+ * @param {boolean} [locked]
86
+ * @param {number} [mip] virtual mip of the incoming page
87
+ * @returns {number} slot index, or -1 when full
88
+ */
89
+ allocate(current_frame: number, locked?: boolean, mip?: number): number;
90
+ /**
91
+ *
92
+ * @param {number} slot
93
+ */
94
+ free(slot: number): void;
95
+ /**
96
+ *
97
+ * @param {number} slot
98
+ * @param {number} frame
99
+ */
100
+ touch(slot: number, frame: number): void;
101
+ /**
102
+ *
103
+ * @param {number} slot
104
+ * @returns {number}
105
+ */
106
+ last_touch(slot: number): number;
107
+ /**
108
+ * Pick the least-recently-touched evictable slot.
109
+ *
110
+ * @param {number} current_frame
111
+ * @param {number} protect_window slots touched within this many frames
112
+ * are not eligible — feedback readback runs a couple of frames
113
+ * behind, so "recently touched" really means "probably on screen"
114
+ * @returns {number} slot index, or -1 when nothing is evictable
115
+ */
116
+ find_eviction_candidate(current_frame: number, protect_window: number): number;
117
+ #private;
118
+ }
119
+ //# sourceMappingURL=VTPhysicalSlots.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VTPhysicalSlots.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/texture/virtual/VTPhysicalSlots.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH;IA4EI;;;;;;OAMG;IACH;QAJ4B,UAAU,GAA3B,MAAM;QACW,SAAS,GAA1B,MAAM;QACW,MAAM,GAAvB,MAAM;OA6BhB;IA5GD;;;;OAIG;IACH,oBAHU,MAAM,CAGN;IAEV;;;;OAIG;IACH,iBAHU,MAAM,CAGT;IAEP;;;;OAIG;IACH,oBAHU,MAAM,CAGN;IAEV;;;;OAIG;IACH,qBAHU,MAAM,CAGL;IAEX;;;;OAIG;IACH,yBAHU,MAAM,CAGD;IAEf;;;;OAIG;IACH,mBAHU,MAAM,CAGP;IAsET;;;OAGG;IACH,mBAEC;IAED;;;;OAIG;IACH,kBAHW,MAAM,GACJ;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAC,CAOlC;IAED;;;;OAIG;IACH,kBAHW,MAAM,GACJ,OAAO,CAInB;IAED;;;;;;OAMG;IACH,wBALW,MAAM,WACN,OAAO,QACP,MAAM,GACJ,MAAM,CAelB;IAED;;;OAGG;IACH,WAFW,MAAM,QAShB;IAED;;;;OAIG;IACH,YAHW,MAAM,SACN,MAAM,QAIhB;IAED;;;;OAIG;IACH,iBAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;;;;;;OAQG;IACH,uCANW,MAAM,kBACN,MAAM,GAGJ,MAAM,CA4BlB;;CACJ"}