@woosh/meep-engine 3.60.3 → 3.60.5

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 (514) hide show
  1. package/CHANGELOG.md +2602 -0
  2. package/CONTRIBUTING.md +7 -0
  3. package/MIGRATION_2_TO_3.md +136 -0
  4. package/SECURITY.md +4 -0
  5. package/editor/EditorCameraNavigation.d.ts +2 -1
  6. package/editor/EditorCameraNavigation.d.ts.map +1 -1
  7. package/editor/EditorCameraNavigation.js +51 -57
  8. package/editor/ecs/component/editors/ecs/Trail3DEditor.d.ts +3 -0
  9. package/editor/ecs/component/editors/ecs/Trail3DEditor.d.ts.map +1 -1
  10. package/editor/ecs/component/editors/ecs/Trail3DEditor.js +6 -0
  11. package/package.json +6 -2
  12. package/src/engine/EngineHarness.d.ts +3 -9
  13. package/src/engine/EngineHarness.d.ts.map +1 -1
  14. package/src/engine/EngineHarness.js +6 -8
  15. package/src/engine/graphics/camera/makeOrbitalCameraController.d.ts +9 -6
  16. package/src/engine/graphics/camera/makeOrbitalCameraController.d.ts.map +1 -1
  17. package/src/engine/graphics/camera/makeOrbitalCameraController.js +44 -71
  18. package/src/engine/graphics/camera/orbital/MomentumAxis.d.ts +64 -0
  19. package/src/engine/graphics/camera/orbital/MomentumAxis.d.ts.map +1 -0
  20. package/src/engine/graphics/camera/orbital/MomentumAxis.js +187 -0
  21. package/src/engine/graphics/camera/orbital/OrbitalCameraRig.d.ts +86 -0
  22. package/src/engine/graphics/camera/orbital/OrbitalCameraRig.d.ts.map +1 -0
  23. package/src/engine/graphics/camera/orbital/OrbitalCameraRig.js +319 -0
  24. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.d.ts +34 -10
  25. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.d.ts.map +1 -1
  26. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.js +116 -30
  27. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.d.ts +1 -7
  28. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.d.ts.map +1 -1
  29. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.js +1 -37
  30. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometryFlags.js +1 -2
  31. package/src/engine/graphics/ecs/trail3d/TRAIL3D_FADE_LINEAR.d.ts +14 -0
  32. package/src/engine/graphics/ecs/trail3d/TRAIL3D_FADE_LINEAR.d.ts.map +1 -0
  33. package/src/engine/graphics/ecs/trail3d/TRAIL3D_FADE_LINEAR.js +22 -0
  34. package/src/engine/graphics/ecs/trail3d/Trail3D.d.ts +19 -3
  35. package/src/engine/graphics/ecs/trail3d/Trail3D.d.ts.map +1 -1
  36. package/src/engine/graphics/ecs/trail3d/Trail3D.js +31 -4
  37. package/src/engine/graphics/ecs/trail3d/advance_trail.js +1 -1
  38. package/src/engine/graphics/ecs/water/Water.d.ts +8 -0
  39. package/src/engine/graphics/ecs/water/Water.d.ts.map +1 -1
  40. package/src/engine/graphics/ecs/water/Water.js +8 -0
  41. package/src/engine/graphics/trail/tube/simulator/TubeXFixedPhysicsSimulator.d.ts +5 -5
  42. package/src/engine/graphics/trail/tube/simulator/TubeXFixedPhysicsSimulator.d.ts.map +1 -1
  43. package/src/engine/graphics/trail/tube/simulator/TubeXFixedPhysicsSimulator.js +6 -6
  44. package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
  45. package/src/engine/graphics3/WaterSystem.js +731 -734
  46. package/src/engine/graphics3/decal/DecalTileShader.d.ts +61 -0
  47. package/src/engine/graphics3/decal/DecalTileShader.d.ts.map +1 -0
  48. package/src/engine/graphics3/decal/DecalTileShader.js +138 -0
  49. package/src/engine/graphics3/decal/GPUDecalRenderer.d.ts +10 -4
  50. package/src/engine/graphics3/decal/GPUDecalRenderer.d.ts.map +1 -1
  51. package/src/engine/graphics3/decal/GPUDecalRenderer.js +149 -44
  52. package/src/engine/graphics3/decal/chunk_decal_tile_vertex.d.ts +25 -0
  53. package/src/engine/graphics3/decal/chunk_decal_tile_vertex.d.ts.map +1 -0
  54. package/src/engine/graphics3/decal/chunk_decal_tile_vertex.js +55 -0
  55. package/src/engine/graphics3/decal/graph_gather_decal_tiles.d.ts +22 -0
  56. package/src/engine/graphics3/decal/graph_gather_decal_tiles.d.ts.map +1 -0
  57. package/src/engine/graphics3/decal/graph_gather_decal_tiles.js +70 -0
  58. package/src/engine/graphics3/decal/shader_decal_composite.d.ts +7 -5
  59. package/src/engine/graphics3/decal/shader_decal_composite.d.ts.map +1 -1
  60. package/src/engine/graphics3/decal/shader_decal_composite.js +48 -44
  61. package/src/engine/graphics3/decal/shader_decal_tile_copy.d.ts +12 -0
  62. package/src/engine/graphics3/decal/shader_decal_tile_copy.d.ts.map +1 -0
  63. package/src/engine/graphics3/decal/shader_decal_tile_copy.js +78 -0
  64. package/src/engine/graphics3/decal/shader_gather_decal_tiles.d.ts +11 -0
  65. package/src/engine/graphics3/decal/shader_gather_decal_tiles.d.ts.map +1 -0
  66. package/src/engine/graphics3/decal/shader_gather_decal_tiles.js +80 -0
  67. package/src/engine/graphics3/trail/trail_tube_write_geometry.d.ts +10 -0
  68. package/src/engine/graphics3/trail/trail_tube_write_geometry.d.ts.map +1 -1
  69. package/src/engine/graphics3/trail/trail_tube_write_geometry.js +13 -1
  70. package/src/engine/input/devices/mouse/MouseEventButtons.d.ts +13 -0
  71. package/src/engine/input/devices/mouse/MouseEventButtons.d.ts.map +1 -0
  72. package/src/engine/input/devices/mouse/MouseEventButtons.js +23 -0
  73. package/src/engine/input/ecs/controllers/KeyboardCameraController.d.ts +4 -0
  74. package/src/engine/input/ecs/controllers/KeyboardCameraController.d.ts.map +1 -1
  75. package/src/engine/input/ecs/controllers/KeyboardCameraController.js +9 -45
  76. package/src/engine/physics/cloth/ecs/cloth_geodesic.d.ts +2 -2
  77. package/src/engine/physics/cloth/ecs/cloth_geodesic.js +2 -2
  78. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  79. package/src/shade/playground/probe_clipmap/README.md +1 -0
  80. package/src/shade/playground/probe_clipmap/index.html +5 -0
  81. package/src/shade/playground/probe_clipmap/main.d.ts.map +1 -1
  82. package/src/shade/playground/probe_clipmap/main.js +16 -2
  83. package/src/shade/playground/vgeo_scene/README.md +1 -1
  84. package/src/shade/playground/water_refraction/README.md +5 -6
  85. package/src/shade/playground/water_refraction/index.html +1 -1
  86. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  87. package/src/shade/renderer/Renderer.js +7 -5
  88. package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.d.ts +4 -6
  89. package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.d.ts.map +1 -1
  90. package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.js +34 -36
  91. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts +1 -1
  92. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts.map +1 -1
  93. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.js +162 -163
  94. package/src/shade/renderer/atmosphere/compute_mie_absorption.d.ts +1 -1
  95. package/src/shade/renderer/atmosphere/compute_mie_absorption.js +1 -1
  96. package/src/shade/renderer/atmosphere/hillaire/ATMOSPHERE_EARTH.js +1 -1
  97. package/src/shade/renderer/atmosphere/hillaire/ATMOSPHERE_PARAMETERS_STRUCT.js +1 -1
  98. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.js +164 -164
  99. package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.js +1 -1
  100. package/src/shade/renderer/camera/orbital/OrbitalCameraController.d.ts +40 -80
  101. package/src/shade/renderer/camera/orbital/OrbitalCameraController.d.ts.map +1 -1
  102. package/src/shade/renderer/camera/orbital/OrbitalCameraController.js +197 -147
  103. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +3 -3
  104. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +1 -1
  105. package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +6 -6
  106. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +1 -1
  107. package/src/shade/renderer/fluid/query/GPUFluidQueries.d.ts +1 -1
  108. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts +4 -4
  109. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +4 -4
  110. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts +2 -1
  111. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts.map +1 -1
  112. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.js +18 -1
  113. package/src/shade/renderer/geometry/sdf/cards/mesh_cards_raster_pass_descriptor.js +2 -2
  114. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_histogram.d.ts +1 -1
  115. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_histogram.js +1 -1
  116. package/src/shade/renderer/geometry/sdf/chunk_blas_query_band_sdf.d.ts +4 -5
  117. package/src/shade/renderer/geometry/sdf/chunk_blas_query_band_sdf.d.ts.map +1 -1
  118. package/src/shade/renderer/geometry/sdf/chunk_blas_query_band_sdf.js +6 -7
  119. package/src/shade/renderer/geometry/virtual/proxy/vgeo_to_proxy_mesh.d.ts +31 -0
  120. package/src/shade/renderer/geometry/virtual/proxy/vgeo_to_proxy_mesh.d.ts.map +1 -0
  121. package/src/shade/renderer/geometry/virtual/proxy/vgeo_to_proxy_mesh.js +343 -0
  122. package/src/shade/renderer/geometry/virtual/runtime/vgeo_meshlet_metadata_write.d.ts +17 -0
  123. package/src/shade/renderer/geometry/virtual/runtime/vgeo_meshlet_metadata_write.d.ts.map +1 -0
  124. package/src/shade/renderer/geometry/virtual/runtime/vgeo_meshlet_metadata_write.js +29 -0
  125. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_meshlet_batch.d.ts.map +1 -1
  126. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_meshlet_batch.js +7 -13
  127. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts.map +1 -1
  128. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.js +2 -8
  129. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts +5 -5
  130. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts.map +1 -1
  131. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.js +10 -10
  132. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.d.ts +12 -0
  133. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.d.ts.map +1 -1
  134. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.js +22 -0
  135. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts +4 -4
  136. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts.map +1 -1
  137. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.js +50 -13
  138. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts +6 -0
  139. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts.map +1 -1
  140. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.js +7 -0
  141. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP_RESAMPLING.d.ts +13 -0
  142. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP_RESAMPLING.d.ts.map +1 -0
  143. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP_RESAMPLING.js +13 -0
  144. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts +17 -0
  145. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts.map +1 -1
  146. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.js +20 -0
  147. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.d.ts +5 -15
  148. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.d.ts.map +1 -1
  149. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.js +6 -34
  150. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_resampled.d.ts +18 -0
  151. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_resampled.d.ts.map +1 -0
  152. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_resampled.js +42 -0
  153. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.d.ts.map +1 -1
  154. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.js +5 -4
  155. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.d.ts +4 -0
  156. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.d.ts.map +1 -1
  157. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.js +13 -2
  158. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_resample.d.ts +52 -0
  159. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_resample.d.ts.map +1 -0
  160. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_resample.js +250 -0
  161. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.d.ts.map +1 -1
  162. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.js +1 -7
  163. package/src/shade/renderer/hiz/HZBFootprint.d.ts +14 -0
  164. package/src/shade/renderer/hiz/HZBFootprint.d.ts.map +1 -0
  165. package/src/shade/renderer/hiz/HZBFootprint.js +16 -0
  166. package/src/shade/renderer/hiz/HZB_FOOTPRINT_X.d.ts +10 -0
  167. package/src/shade/renderer/hiz/HZB_FOOTPRINT_X.d.ts.map +1 -0
  168. package/src/shade/renderer/hiz/HZB_FOOTPRINT_X.js +11 -0
  169. package/src/shade/renderer/hiz/HZB_FOOTPRINT_Y.d.ts +10 -0
  170. package/src/shade/renderer/hiz/HZB_FOOTPRINT_Y.d.ts.map +1 -0
  171. package/src/shade/renderer/hiz/HZB_FOOTPRINT_Y.js +11 -0
  172. package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts +0 -7
  173. package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts.map +1 -1
  174. package/src/shade/renderer/hiz/HierarchicalZBuffer.js +405 -350
  175. package/src/shade/renderer/hiz/chunk_hzb_footprint_x.d.ts +12 -0
  176. package/src/shade/renderer/hiz/chunk_hzb_footprint_x.d.ts.map +1 -0
  177. package/src/shade/renderer/hiz/chunk_hzb_footprint_x.js +27 -0
  178. package/src/shade/renderer/hiz/chunk_hzb_footprint_y.d.ts +12 -0
  179. package/src/shade/renderer/hiz/chunk_hzb_footprint_y.d.ts.map +1 -0
  180. package/src/shade/renderer/hiz/chunk_hzb_footprint_y.js +27 -0
  181. package/src/shade/renderer/hiz/hzb_footprint_texels.d.ts +14 -0
  182. package/src/shade/renderer/hiz/hzb_footprint_texels.d.ts.map +1 -0
  183. package/src/shade/renderer/hiz/hzb_footprint_texels.js +34 -0
  184. package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts +0 -5
  185. package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts.map +1 -1
  186. package/src/shade/renderer/hiz/shader_hzb_reduce_any.js +37 -57
  187. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0.d.ts +11 -0
  188. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0.d.ts.map +1 -0
  189. package/src/shade/renderer/hiz/{shader_hzb_reduce_mip0_clip.js → shader_hzb_reduce_mip0.js} +120 -111
  190. package/src/shade/renderer/light/environment/environment_level_1_blur_plan.d.ts +39 -0
  191. package/src/shade/renderer/light/environment/environment_level_1_blur_plan.d.ts.map +1 -0
  192. package/src/shade/renderer/light/environment/environment_level_1_blur_plan.js +119 -0
  193. package/src/shade/renderer/light/environment/execute_filter_environment_map.d.ts +15 -7
  194. package/src/shade/renderer/light/environment/execute_filter_environment_map.d.ts.map +1 -1
  195. package/src/shade/renderer/light/environment/execute_filter_environment_map.js +66 -83
  196. package/src/shade/renderer/light/environment/graph_filter_environment_map.d.ts.map +1 -1
  197. package/src/shade/renderer/light/environment/graph_filter_environment_map.js +15 -6
  198. package/src/shade/renderer/light/environment/shader_blur_environment_map.d.ts +3 -0
  199. package/src/shade/renderer/light/environment/shader_blur_environment_map.d.ts.map +1 -0
  200. package/src/shade/renderer/light/environment/shader_blur_environment_map.js +111 -0
  201. package/src/shade/renderer/light/environment/shader_convolve_reflection_map_from_blurred.d.ts +3 -0
  202. package/src/shade/renderer/light/environment/shader_convolve_reflection_map_from_blurred.d.ts.map +1 -0
  203. package/src/shade/renderer/light/environment/shader_convolve_reflection_map_from_blurred.js +128 -0
  204. package/src/shade/renderer/light/environment/shader_downsample_environment_map.d.ts.map +1 -1
  205. package/src/shade/renderer/light/environment/shader_downsample_environment_map.js +0 -1
  206. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  207. package/src/shade/renderer/material/GPUMaterialManager.d.ts +7 -0
  208. package/src/shade/renderer/material/GPUMaterialManager.d.ts.map +1 -1
  209. package/src/shade/renderer/material/GPUMaterialManager.js +11 -0
  210. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts +12 -12
  211. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts.map +1 -1
  212. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.js +17 -118
  213. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -3
  214. package/src/shade/renderer/postprocess/nss/NSS.d.ts.map +1 -1
  215. package/src/shade/renderer/postprocess/nss/NSS.js +1 -3
  216. package/src/shade/renderer/postprocess/nss/NSS_NETWORK_SCHEMA.d.ts +5 -6
  217. package/src/shade/renderer/postprocess/nss/NSS_NETWORK_SCHEMA.d.ts.map +1 -1
  218. package/src/shade/renderer/postprocess/nss/NSS_NETWORK_SCHEMA.js +9 -10
  219. package/src/shade/renderer/postprocess/nss/shader_nss_extract_feedback.d.ts.map +1 -1
  220. package/src/shade/renderer/postprocess/nss/shader_nss_extract_feedback.js +48 -49
  221. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.d.ts.map +1 -1
  222. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.js +12 -16
  223. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.js +246 -246
  224. package/src/shade/renderer/rasterize/chunk_triangle_winding_is_reversed.d.ts +1 -2
  225. package/src/shade/renderer/rasterize/chunk_triangle_winding_is_reversed.d.ts.map +1 -1
  226. package/src/shade/renderer/rasterize/chunk_triangle_winding_is_reversed.js +34 -35
  227. package/src/shade/renderer/shader/chunk/atmosphere/C_MIE_SCATTERING_DECLARATION.d.ts +2 -2
  228. package/src/shade/renderer/shader/chunk/atmosphere/C_MIE_SCATTERING_DECLARATION.js +2 -2
  229. package/src/shade/renderer/shader/chunk/atmosphere/chunk_compute_extinction.js +1 -1
  230. package/src/shade/renderer/shader/chunk/atmosphere/hillaire/DENSITY_PROFILE_LAYER_STRUCT.d.ts +1 -1
  231. package/src/shade/renderer/shader/chunk/atmosphere/hillaire/DENSITY_PROFILE_LAYER_STRUCT.js +1 -1
  232. package/src/shade/renderer/shader/chunk/brdf/fresnel/chunk_F_Schlick.d.ts +3 -3
  233. package/src/shade/renderer/shader/chunk/brdf/fresnel/chunk_F_Schlick.js +3 -3
  234. package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_aces_ue_matrices.d.ts +9 -10
  235. package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_aces_ue_matrices.d.ts.map +1 -1
  236. package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_aces_ue_matrices.js +9 -10
  237. package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_tonemap_ue_filmic.d.ts +4 -4
  238. package/src/shade/renderer/shader/chunk/color/tonemap/aces/chunk_tonemap_ue_filmic.js +5 -5
  239. package/src/shade/renderer/shader/chunk/math/chunk_f16_round_stochastic.d.ts +1 -2
  240. package/src/shade/renderer/shader/chunk/math/chunk_f16_round_stochastic.d.ts.map +1 -1
  241. package/src/shade/renderer/shader/chunk/math/chunk_f16_round_stochastic.js +1 -2
  242. package/src/shade/renderer/shader/chunk/noise/chunk_stbn_sample_vec2.d.ts +14 -1
  243. package/src/shade/renderer/shader/chunk/noise/chunk_stbn_sample_vec2.d.ts.map +1 -1
  244. package/src/shade/renderer/shader/chunk/noise/chunk_stbn_sample_vec2.js +19 -6
  245. package/src/shade/renderer/shader/chunk/noise/chunk_stbn_sample_vec3.d.ts +10 -1
  246. package/src/shade/renderer/shader/chunk/noise/chunk_stbn_sample_vec3.d.ts.map +1 -1
  247. package/src/shade/renderer/shader/chunk/noise/chunk_stbn_sample_vec3.js +14 -6
  248. package/src/shade/renderer/shader/chunk/random/murmur/chunk_murmur3_vec3u.d.ts +1 -1
  249. package/src/shade/renderer/shader/chunk/random/murmur/chunk_murmur3_vec3u.js +1 -1
  250. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
  251. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +7 -2
  252. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_MAX_DYNAMIC_LOD_BIAS.d.ts +2 -3
  253. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_MAX_DYNAMIC_LOD_BIAS.d.ts.map +1 -1
  254. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_MAX_DYNAMIC_LOD_BIAS.js +7 -8
  255. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_MAX_LOAD_FACTOR.d.ts +1 -1
  256. package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_MAX_LOAD_FACTOR.js +12 -12
  257. package/src/shade/renderer/shadow/vsm/VSMPageManager.d.ts +2 -2
  258. package/src/shade/renderer/shadow/vsm/VSMPageManager.d.ts.map +1 -1
  259. package/src/shade/renderer/shadow/vsm/VSMPageManager.js +3 -4
  260. package/src/shade/renderer/water/GPUWaterRenderer.d.ts +0 -6
  261. package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
  262. package/src/shade/renderer/water/GPUWaterRenderer.js +12 -17
  263. package/src/shade/renderer/water/medium/graph_water_meshlets.d.ts +35 -0
  264. package/src/shade/renderer/water/medium/graph_water_meshlets.d.ts.map +1 -0
  265. package/src/shade/renderer/water/medium/graph_water_meshlets.js +89 -0
  266. package/src/shade/renderer/water/query/GPUWaterQueries.d.ts +1 -1
  267. package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
  268. package/src/shade/renderer/water/shader_water.js +22 -13
  269. package/src/shade/renderer/water/shader_water_avboit.d.ts.map +1 -1
  270. package/src/shade/renderer/water/shader_water_avboit.js +7 -7
  271. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts +1 -1
  272. package/src/shade/renderer/water/surface/graph_water_tessellation.js +1 -1
  273. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +9 -1
  274. package/src/view/elements/progress/segmented/SegmentedResourceBarView.d.ts +0 -19
  275. package/src/view/elements/progress/segmented/SegmentedResourceBarView.d.ts.map +1 -1
  276. package/src/view/elements/progress/segmented/SegmentedResourceBarView.js +2 -52
  277. package/editor/REWORK_PLAN_2026_08.md +0 -692
  278. package/src/CODEC_LAYOUT_VERIFICATION.md +0 -419
  279. package/src/CORRECTNESS_HUNT_2026_07_24.md +0 -142
  280. package/src/DUPLICATION_AUDIT_2026_08_07/00_core_reuse_surface.md +0 -738
  281. package/src/DUPLICATION_AUDIT_2026_08_07/A_core_math_geom.md +0 -79
  282. package/src/DUPLICATION_AUDIT_2026_08_07/B_core_data.md +0 -93
  283. package/src/DUPLICATION_AUDIT_2026_08_07/C_gfx_render.md +0 -80
  284. package/src/DUPLICATION_AUDIT_2026_08_07/D_gfx_features.md +0 -164
  285. package/src/DUPLICATION_AUDIT_2026_08_07/E_physics.md +0 -69
  286. package/src/DUPLICATION_AUDIT_2026_08_07/F_sound.md +0 -110
  287. package/src/DUPLICATION_AUDIT_2026_08_07/G_net_save.md +0 -129
  288. package/src/DUPLICATION_AUDIT_2026_08_07/H_engine_misc.md +0 -72
  289. package/src/DUPLICATION_AUDIT_2026_08_07/I_generation_view.md +0 -74
  290. package/src/DUPLICATION_AUDIT_2026_08_07/K_crosscutting.md +0 -169
  291. package/src/DUPLICATION_AUDIT_2026_08_07.md +0 -254
  292. package/src/DUPLICATION_AUDIT_REMEDIATION.md +0 -250
  293. package/src/DUPLICATION_REVIEW_2026_10_24.md +0 -1072
  294. package/src/REVIEW_2026_08_06/adv-core.md +0 -511
  295. package/src/REVIEW_2026_08_06/adv-gfx.md +0 -480
  296. package/src/REVIEW_2026_08_06/adv-view.md +0 -446
  297. package/src/REVIEW_2026_08_06/api-core.md +0 -296
  298. package/src/REVIEW_2026_08_06/api-engine.md +0 -195
  299. package/src/REVIEW_2026_08_06/bvh-phys-sound-net.md +0 -507
  300. package/src/REVIEW_2026_08_06/core-binary.md +0 -348
  301. package/src/REVIEW_2026_08_06/core-collection.md +0 -376
  302. package/src/REVIEW_2026_08_06/core-math.md +0 -221
  303. package/src/REVIEW_2026_08_06/core-process.md +0 -266
  304. package/src/REVIEW_2026_08_06/core-science.md +0 -223
  305. package/src/REVIEW_2026_08_06/engine-ai-nav.md +0 -279
  306. package/src/REVIEW_2026_08_06/engine-animation.md +0 -167
  307. package/src/REVIEW_2026_08_06/engine-asset.md +0 -166
  308. package/src/REVIEW_2026_08_06/engine-ecs.md +0 -920
  309. package/src/REVIEW_2026_08_06/engine-input.md +0 -197
  310. package/src/REVIEW_2026_08_06/engine-misc.md +0 -248
  311. package/src/REVIEW_2026_08_06/engine-terrain.md +0 -52
  312. package/src/REVIEW_2026_08_06/generation.md +0 -176
  313. package/src/REVIEW_2026_08_06/geom-2d.md +0 -434
  314. package/src/REVIEW_2026_08_06/geom-3d.md +0 -117
  315. package/src/REVIEW_2026_08_06/gfx-gi.md +0 -143
  316. package/src/REVIEW_2026_08_06/gfx-render.md +0 -740
  317. package/src/REVIEW_2026_08_06/gfx-texture.md +0 -690
  318. package/src/REVIEW_2026_08_06/prior-criticals.md +0 -49
  319. package/src/REVIEW_2026_08_06/prior-highs.md +0 -138
  320. package/src/REVIEW_2026_08_06/test-gaps.md +0 -364
  321. package/src/REVIEW_2026_08_06/view.md +0 -667
  322. package/src/REVIEW_2026_08_06.md +0 -610
  323. package/src/core/binary/lz4/LZ4_HIGH_COMPRESSION_PLAN_2026_09_14.md +0 -542
  324. package/src/core/bvh2/bvh3/NOTES.md +0 -2
  325. package/src/core/bvh8/NOTES.md +0 -63
  326. package/src/core/cache/wtinylfu/benchmark/CacheWTinylfu.bench.md +0 -243
  327. package/src/core/color/COLOR_FIX_PLAN_2026_08_28.md +0 -417
  328. package/src/core/color/COLOR_REVIEW_2026_08_28.md +0 -779
  329. package/src/core/geom/2d/polygon/TRIANGULATION_DESIGN.md +0 -433
  330. package/src/core/geom/3d/atlas/ATLAS_PORT_PLAN.md +0 -486
  331. package/src/core/geom/3d/atlas/BFF_PLAN.md +0 -174
  332. package/src/core/geom/3d/atlas/REVIEW_02.md +0 -392
  333. package/src/core/geom/3d/gjk/GJK_REVIEW_NOTES.md +0 -146
  334. package/src/core/geom/3d/gjk/NOTES.md +0 -8
  335. package/src/core/geom/3d/topology/TOPO_MESH_RETIREMENT_PLAN.md +0 -135
  336. package/src/core/geom/GEOMETRY_REVIEW_002_API_ISSUES.md +0 -381
  337. package/src/core/geom/GEOMETRY_REVIEW_002_NAMING.md +0 -684
  338. package/src/core/geom/MANIFOLD_COMPARISON_2026_08_01.md +0 -554
  339. package/src/core/model/reactive/evaluation/PREDICATE_APPLICABILITY_PROPOSAL.md +0 -446
  340. package/src/engine/REVIEW_2026_07_03.md +0 -211
  341. package/src/engine/asset/loaders/image/IMAGE_CODEC_REVIEW_2026_08_28.md +0 -815
  342. package/src/engine/control/first-person/DESIGN.md +0 -658
  343. package/src/engine/control/first-person/DESIGN_COLLISION.md +0 -382
  344. package/src/engine/control/first-person/DESIGN_EXTENSIONS.md +0 -563
  345. package/src/engine/control/first-person/TODO.md +0 -160
  346. package/src/engine/ecs/ASYNC_SYSTEMS_PROPOSAL.md +0 -531
  347. package/src/engine/ecs/HIERARCHY_REVIEW.md +0 -717
  348. package/src/engine/ecs/async/WORKER_SYSTEM_PLAN.md +0 -262
  349. package/src/engine/ecs/ik/PLAN.md +0 -179
  350. package/src/engine/ecs/storage/binary/SERIALIZATION_COVERAGE.md +0 -272
  351. package/src/engine/ecs/storage/binary/object-v2/DESIGN.md +0 -199
  352. package/src/engine/ecs/transform/TRANSFORM64_MIGRATION_PLAN_2026_09_04.md +0 -521
  353. package/src/engine/graphics/CONTEXT_LOSS_RECOVERY_PLAN.md +0 -463
  354. package/src/engine/graphics/ecs/camera/pp/NOTES.md +0 -48
  355. package/src/engine/graphics/render/frame_graph/CORRECTNESS_FIXES_2026_09_04.md +0 -659
  356. package/src/engine/graphics/render/frame_graph/FRAME_GRAPH_RECOMMENDATIONS.md +0 -235
  357. package/src/engine/graphics/sh3/path_tracer/REVIEW_001_ACTION_PLAN.md +0 -490
  358. package/src/engine/graphics/texture/sampler/compare/FLIP_IMPLEMENTATION_PLAN.md +0 -466
  359. package/src/engine/input/GAMEPAD_API_PROPOSAL.md +0 -717
  360. package/src/engine/input/ecs/ism/ISM_DESIGN.md +0 -1523
  361. package/src/engine/input/ecs/ism/ISM_IMPLEMENTATION_PLAN.md +0 -627
  362. package/src/engine/navigation/mesh/OVERLAPPING_SURFACES_2026_08_25.md +0 -661
  363. package/src/engine/navigation/mesh/PATHFINDING_PLAN.md +0 -229
  364. package/src/engine/network/CONGESTION_CONTROL.md +0 -87
  365. package/src/engine/network/MESSAGE_TRANSPORT.md +0 -364
  366. package/src/engine/network/SMOOTHNESS_DESIGN.md +0 -400
  367. package/src/engine/physics/cloth/MEASUREMENTS.md +0 -5304
  368. package/src/engine/physics/cloth/PLAN.md +0 -3056
  369. package/src/engine/physics/fluid/GPU_FLUID_CASCADES_PROPOSAL_2026_10_16.md +0 -1382
  370. package/src/engine/physics/fluid/REVIEW_02_PLAN.md +0 -243
  371. package/src/engine/physics/fluid/solver/NOTES.md +0 -46
  372. package/src/engine/sound/SOUND_EMITTER_RETIREMENT_PLAN.md +0 -536
  373. package/src/engine/sound/simulation/IMPLEMENTATION_PLAN.md +0 -432
  374. package/src/engine/sound/simulation/PROBE_PLACEMENT.md +0 -250
  375. package/src/engine/sound/simulation/PROBE_TRANSFER_RESEARCH.md +0 -322
  376. package/src/engine/sound/simulation/REFLECTION_IR_PLAN.md +0 -261
  377. package/src/engine/sound/simulation/VISIBILITY_GRAPH_PLAN.md +0 -121
  378. package/src/engine/sound/sopra/IMPLEMENTATION_PLAN.md +0 -999
  379. package/src/format/image/avif/DECISIONS.md +0 -545
  380. package/src/format/image/jpeg/NOTES.md +0 -3
  381. package/src/format/scene/gltf/MESHOPT_COMPRESSION_PLAN.md +0 -814
  382. package/src/generation/COORDINATES.md +0 -54
  383. package/src/generation/REVIEW_01_ACTION_PLAN.md +0 -628
  384. package/src/generation/foliage/ANNUAL_SHOOTS_BRIEF_2026_10_25.md +0 -220
  385. package/src/generation/foliage/CROWN_FILLING_BRIEF_2026_10_26.md +0 -172
  386. package/src/generation/foliage/CROWN_FULLNESS_BRIEF_2026_10_26.md +0 -86
  387. package/src/generation/foliage/FOLIAGE_DESIGN.md +0 -547
  388. package/src/generation/foliage/FOLIAGE_PLAN.md +0 -198
  389. package/src/generation/foliage/LEAF_ARCHITECTURE_BRIEF_2026_10_26.md +0 -158
  390. package/src/generation/foliage/LOD_REWORK_BRIEF_2026_10_27.md +0 -521
  391. package/src/generation/foliage/REAL_TIME_TREES_BRIEF_2026_10_27.md +0 -86
  392. package/src/generation/foliage/SELF_ORGANIZING_FRAMEWORK_BRIEF_2026_10_26.md +0 -347
  393. package/src/generation/foliage/SHOOT_SYSTEMS_ALL_SPECIES_BRIEF_2026_10_26.md +0 -248
  394. package/src/generation/foliage/SPEEDTREE_COMPARISON_2026_10_24.md +0 -694
  395. package/src/generation/foliage/TWO_FRONT_ENDS_BRIEF_2026_10_28.md +0 -552
  396. package/src/shade/RENDERER_CONTRACT.md +0 -697
  397. package/src/shade/SHADER_F16_PROPOSAL_2026_10_24.md +0 -263
  398. package/src/shade/device/IMMEDIATE_DATA_PLAN_2026_08_28.md +0 -569
  399. package/src/shade/device/PASS_ENCODER_PROPOSAL_2026_08_31.md +0 -755
  400. package/src/shade/device/mock/EXTENSION_PROPOSAL_2026_08_22.md +0 -458
  401. package/src/shade/device/mock/IMPLEMENTATION_PLAN.md +0 -255
  402. package/src/shade/device/mock/REVIEW_2026_08_22.md +0 -527
  403. package/src/shade/device/timing/GPU_PROFILER_PROPOSAL_2026_08_28.md +0 -894
  404. package/src/shade/device/timing/profile/SGPT_FORMAT.md +0 -345
  405. package/src/shade/renderer/NOTES.md +0 -78
  406. package/src/shade/renderer/PLAN.md +0 -8
  407. package/src/shade/renderer/animation/ADDITIVE_BLENDING_PLAN.md +0 -145
  408. package/src/shade/renderer/animation/SKINNING_FRAME_PLAN.md +0 -357
  409. package/src/shade/renderer/atmosphere/NOTES.md +0 -6
  410. package/src/shade/renderer/camera/orbital/MomentumAxis.d.ts +0 -76
  411. package/src/shade/renderer/camera/orbital/MomentumAxis.d.ts.map +0 -1
  412. package/src/shade/renderer/camera/orbital/MomentumAxis.js +0 -164
  413. package/src/shade/renderer/camera/orbital/OrbitalCameraConfig.d.ts +0 -45
  414. package/src/shade/renderer/camera/orbital/OrbitalCameraConfig.d.ts.map +0 -1
  415. package/src/shade/renderer/camera/orbital/OrbitalCameraConfig.js +0 -66
  416. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts +0 -98
  417. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts.map +0 -1
  418. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.js +0 -184
  419. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts +0 -175
  420. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts.map +0 -1
  421. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.js +0 -411
  422. package/src/shade/renderer/camera/orbital/README.md +0 -81
  423. package/src/shade/renderer/camera/orbital/index.d.ts +0 -6
  424. package/src/shade/renderer/camera/orbital/index.d.ts.map +0 -1
  425. package/src/shade/renderer/camera/orbital/index.js +0 -9
  426. package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +0 -964
  427. package/src/shade/renderer/fluid/GPU_FLUID_OCCUPANCY_AND_SOTA_REVIEW_2026_10_26.md +0 -361
  428. package/src/shade/renderer/geometry/bvh/BLAS_REFIT_BATCH_PLAN.md +0 -619
  429. package/src/shade/renderer/geometry/meshlet/COMPACTION_PLAN_2026_09_16.md +0 -674
  430. package/src/shade/renderer/geometry/sdf/NOTES.md +0 -6
  431. package/src/shade/renderer/geometry/virtual/ATTRIBUTE_PLAN_2026_09_18.md +0 -540
  432. package/src/shade/renderer/geometry/virtual/MICRON_COMPARISON_2026_08_20.md +0 -305
  433. package/src/shade/renderer/geometry/virtual/VGEO_FORMAT.md +0 -913
  434. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +0 -787
  435. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_PLAN.md +0 -483
  436. package/src/shade/renderer/geometry/virtual/VK_LOD_CLUSTERS_COMPARISON_2026_08_20.md +0 -301
  437. package/src/shade/renderer/geometry/virtual/WEDGE_PLAN_2026_09_18.md +0 -448
  438. package/src/shade/renderer/geometry/virtual/runtime/CULL_PLAN_2026_09_16.md +0 -385
  439. package/src/shade/renderer/geometry/virtual/runtime/CUT_PLAN_2026_09_14.md +0 -656
  440. package/src/shade/renderer/geometry/virtual/runtime/REVIEW_LEDGER.md +0 -308
  441. package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN.md +0 -657
  442. package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN_2026_09_14.md +0 -551
  443. package/src/shade/renderer/geometry/virtual/runtime/SHADOW_PLAN_2026_09_28.md +0 -536
  444. package/src/shade/renderer/global_illumination/lpv/NOTES.md +0 -3
  445. package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_CLIPMAP_PROPOSAL_2026_10_27.md +0 -4225
  446. package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_RAYS_VARIABLE_AND_SORTED_SCOPE_2026_10_30.md +0 -410
  447. package/src/shade/renderer/global_illumination/sharc/NOTES.md +0 -8
  448. package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +0 -1369
  449. package/src/shade/renderer/gpu_primitive/bvh/PHASE1_HANDOVER.md +0 -202
  450. package/src/shade/renderer/gpu_primitive/indirect/NOTES.md +0 -94
  451. package/src/shade/renderer/hiz/NOTES.md +0 -3
  452. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts +0 -8
  453. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts.map +0 -1
  454. package/src/shade/renderer/light/cluster/NOTES.md +0 -11
  455. package/src/shade/renderer/light/cluster/PROPOSAL_ALGORITHM_2026_10_16.md +0 -524
  456. package/src/shade/renderer/light/cluster/PROPOSAL_HIERARCHICAL_2026_10_16.md +0 -1101
  457. package/src/shade/renderer/light/environment/shader_convolve_reflection_map_from_averages.d.ts +0 -13
  458. package/src/shade/renderer/light/environment/shader_convolve_reflection_map_from_averages.d.ts.map +0 -1
  459. package/src/shade/renderer/light/environment/shader_convolve_reflection_map_from_averages.js +0 -198
  460. package/src/shade/renderer/material/resident/shader_resident_texture_means.d.ts +0 -24
  461. package/src/shade/renderer/material/resident/shader_resident_texture_means.d.ts.map +0 -1
  462. package/src/shade/renderer/material/resident/shader_resident_texture_means.js +0 -120
  463. package/src/shade/renderer/particles/DESIGN.md +0 -1011
  464. package/src/shade/renderer/particles/EMITTER_GLOBAL_STATE_PLAN_2026_10_29.md +0 -283
  465. package/src/shade/renderer/particles/ORIENTATION_PLAN_2026_10_15.md +0 -453
  466. package/src/shade/renderer/path_tracer/PATH_TRACED_MEDIA_PLAN_2026_10_02.md +0 -520
  467. package/src/shade/renderer/postprocess/bloom/NOTES.md +0 -6
  468. package/src/shade/renderer/postprocess/fsr/NOTES.md +0 -4
  469. package/src/shade/renderer/postprocess/gtao/NOTES.md +0 -6
  470. package/src/shade/renderer/postprocess/nss/NOTES.md +0 -339
  471. package/src/shade/renderer/postprocess/perspective/NOTES.md +0 -3
  472. package/src/shade/renderer/postprocess/sscs/NOTES.md +0 -5
  473. package/src/shade/renderer/postprocess/ssr/NOTES.md +0 -14
  474. package/src/shade/renderer/postprocess/ssr/REPROJECTION_PROPOSAL.md +0 -286
  475. package/src/shade/renderer/postprocess/ssr/prefilter/NOTES.md +0 -39
  476. package/src/shade/renderer/postprocess/taa/NOTES.md +0 -11
  477. package/src/shade/renderer/postprocess/upscale-dither/NOTES.md +0 -78
  478. package/src/shade/renderer/postprocess/vrs/NOTES.md +0 -4
  479. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_LEDGER.md +0 -1218
  480. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_PLAN_2026_09_03.md +0 -600
  481. package/src/shade/renderer/restir/reservoir/NOTES.md +0 -6
  482. package/src/shade/renderer/shader/chunk/atmosphere/NOTES.md +0 -6
  483. package/src/shade/renderer/shader/chunk/brdf/FRESNEL_BRIEF_2026_10_16.md +0 -394
  484. package/src/shade/renderer/shader/chunk/color/tonemap/ACES_TONE_MAPPING_BRIEF_2026_10_17.md +0 -160
  485. package/src/shade/renderer/shader/chunk/color/tonemap/HDR_TONE_MAPPING_FORMS_BRIEF_2026_10_16.md +0 -322
  486. package/src/shade/renderer/shader/chunk/color/tonemap/SDR_TONE_MAPPING_BRIEF_2026_10_16.md +0 -247
  487. package/src/shade/renderer/shader/chunk/fsr/NOTES.md +0 -3
  488. package/src/shade/renderer/shader/chunk/fsr/spd/NOTES.md +0 -4
  489. package/src/shade/renderer/shader/chunk/geometry/ray/NOTES.md +0 -4
  490. package/src/shade/renderer/shader/chunk/material/MULTISCATTER.md +0 -159
  491. package/src/shade/renderer/shader/chunk/mboit/NOTES.md +0 -38
  492. package/src/shade/renderer/shader/chunk/spherical_harmonics/l1i/NOTES.md +0 -3
  493. package/src/shade/renderer/shader/chunk/spherical_harmonics/sampling/NOTES.md +0 -8
  494. package/src/shade/renderer/shader/compiler/SHADER_SWITCH_PROPOSAL_2026_10_16.md +0 -932
  495. package/src/shade/renderer/shadow/contact/FINDINGS.md +0 -413
  496. package/src/shade/renderer/shadow/map/csm/NOTES.md +0 -5
  497. package/src/shade/renderer/shadow/ray/NOTES.md +0 -31
  498. package/src/shade/renderer/shadow/sdf/NOTES.md +0 -9
  499. package/src/shade/renderer/shadow/sdf/brixelizer/NOTES.md +0 -5
  500. package/src/shade/renderer/shadow/sdf/cascade/NOTES.md +0 -9
  501. package/src/shade/renderer/shadow/vsm/NOTES.md +0 -12
  502. package/src/shade/renderer/shadow/vsm/PLAN.md +0 -442
  503. package/src/shade/renderer/shadow/vsm/REVIEW_LEDGER.md +0 -43
  504. package/src/shade/renderer/texture/COMPRESSED_TEXTURE_PLAN_2026_09_01.md +0 -2444
  505. package/src/shade/renderer/texture/mipmaps/NOTES.md +0 -4
  506. package/src/shade/renderer/volumetrics/NOTES.md +0 -1329
  507. package/src/shade/renderer/volumetrics/VOLUMETRIC_NOISE_PLAN_2026_10_15.md +0 -336
  508. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts +0 -23
  509. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +0 -1
  510. package/src/shade/renderer/water/medium/GPUWaterBodies.js +0 -75
  511. package/src/shade/wgsl/NOTES.md +0 -4
  512. package/src/view/elements/progress/segmented/segment_frame_transform.d.ts +0 -15
  513. package/src/view/elements/progress/segmented/segment_frame_transform.d.ts.map +0 -1
  514. package/src/view/elements/progress/segmented/segment_frame_transform.js +0 -69
@@ -1,357 +0,0 @@
1
- # The skinning frame
2
-
3
- **Status:** phase 1 landed, §9 with it, both confirmed on a device. §4 is detected but not
4
- carried.
5
-
6
- A skinned mesh's vertices are written in a frame, and the renderer re-applies that frame. Today the
7
- frame is whatever the asset's mesh node happens to carry, and nothing checks that it is a frame the
8
- skinning pass can actually work in. This plan makes the frame the engine's, derived from the skin,
9
- and makes the condition it must satisfy a checked one.
10
-
11
- ## 1. The defect
12
-
13
- The pipeline is two multiplications:
14
-
15
- ```
16
- A_j(t) = joint.global(t) · inverse_bind shader_skin_matrix_prep writes this
17
- M_j(t) = mesh.global⁻¹ · A_j(t) chunk_skin_blend_mesh_local converts this to a DQ
18
- ```
19
-
20
- `dual_quat_from_m4` builds a unit quaternion out of `sqrt(max(0, 1 ± m00 ± m11 ± m22))`. It can
21
- represent a rotation and a translation and nothing else, so **`M_j` must be rigid**. Whether it is
22
- depends on `mesh.global` — a value the exporter chose, that glTF declares meaningless for a skinned
23
- mesh, and that this engine neither derives nor validates.
24
-
25
- `compute_skin_world_bounds` already refuses to use `mesh.global` for exactly that reason, and says
26
- so in its doc comment. The skinning pass still does, and inverts it.
27
-
28
- ### What it looks like when it is violated
29
-
30
- Measured on `test_assets/Michelle.glb`, in `playground/skinned_mesh_soup/__soup_blend_probe.spec.js`
31
- — the shader's own chunks ported to JS and run over the character's own matrices:
32
-
33
- | | |
34
- | --- | --- |
35
- | `joint.global · inverse_bind` at rest | the **identity**, for all 65 joints |
36
- | `mesh.global` | `0.01` scale × the file's up-axis rotation |
37
- | column length of `M_j` | **100.0000**, at rest and under the dance, where rigid is 1 |
38
-
39
- At rest every joint folds to the *same* matrix, `100·Rx(90°)`, whose `w` and `x` terms are both
40
- `1 + 100` and whose `y` and `z` both clamp to zero — the normalize recovers `Rx(90°)` by luck, and
41
- only the scale is lost. Output is `expected / 100` to the digit: the right character, 1/100 the
42
- size.
43
-
44
- Under the dance the joints' matrices differ, each loses a different amount, and the mesh comes
45
- apart. Mean error 121 in a mesh-local space where the body is 224 across; worst 165, on vertices
46
- bound to **a single joint at weight 1**, so the blend is not even involved. That is the soup.
47
-
48
- ### What it is not
49
-
50
- Ruled out on the CPU, on the parsed asset, before a GPU is involved
51
- (`playground/skinned_mesh_soup/__soup_probe.spec.js`):
52
-
53
- - the geometry is a surface — 28 106 triangles, no degenerates, longest edge 0.093 against a 2.24
54
- diagonal, every meshlet index in range;
55
- - the skinning attributes are sound — all 19 106 vertices land back on their rest position under
56
- `joint.global · inverse_bind`, no zero-weight vertices, no out-of-range joint;
57
- - the source BLAS is exact — 56 211 nodes all reachable, 28 106 leaves each naming a distinct
58
- triangle whose box matches to the bit, all 28 105 internal nodes exactly their children's union.
59
-
60
- Worth stating plainly: `skinned_blas_refit`'s `verify()` is structurally blind to this. It holds the
61
- tree's root box against the bounds chain's box, and **both derive from the clone's vertex region**.
62
- Vertices wrong in the same way agree with each other perfectly. A green `verify()` and a soup
63
- picture are consistent, and were.
64
-
65
- ### The precondition as currently written is the wrong one
66
-
67
- `chunk_skin_blend_mesh_local` states it as *"the four products must be rigid, which holds whenever
68
- the joints and the mesh node share the scaling ancestors — the shape a glTF skin has."* Michelle's
69
- joints and mesh node **do** share their scaling ancestor (`Character`, carrying the 0.01), and it
70
- still breaks. Sharing ancestors is neither necessary nor sufficient. §2 is the condition that is.
71
-
72
- ## 2. The invariant
73
-
74
- At rest, `A_j` collapses to one matrix for every joint — `compute_skin_world_bounds` already names
75
- it, as "the character's placement in the world". Call it `A_bind`.
76
-
77
- > **A skinned mesh's node transform is not the file's. It is the skin's bind transform:
78
- > `mesh.global == A_bind`.**
79
-
80
- Three consequences, each of them testable:
81
-
82
- 1. `M_j(rest) = I`. The clone at rest is bit-identical to the source geometry — which `SkinnedMesh`'s
83
- class doc already claims ("until bound … its vertices stay at the source's bind-pose values") and
84
- today only accidentally delivers.
85
- 2. `M_j(t) = A_bind⁻¹ · A_j(t)` — the joint's **displacement from bind**. Rigid exactly when the clip
86
- rotates and translates and does not scale. That is the honest precondition of dual-quaternion
87
- skinning: a property of the *animation*, not of the exporter's unit conventions.
88
- 3. It is *checkable* — from data the engine already holds, on the CPU, once per skin.
89
-
90
- ## 3. Enforcement
91
-
92
- At `register_skin`, per skinned mesh:
93
-
94
- ```
95
- C := mesh.global⁻¹ · A_bind
96
- mesh.transform_local := mesh.transform_local · C
97
- mesh.updateMatrices()
98
- ```
99
-
100
- - **`C` is constant.** Anything applied above both the mesh node and the joints — placement,
101
- movement, re-parenting — left-multiplies `mesh.global` and `A_bind` alike and cancels. Compute it
102
- once.
103
- - **It is idempotent.** After the correction `mesh.global == A_bind`, so a second `C` is the
104
- identity. Re-registering a skin changes nothing.
105
- - **It is a no-op for an asset that already satisfies the invariant.** An FBX-derived model whose
106
- inverse-bind matrices are authored in pre-scale space has `A_bind == mesh.global` and gets
107
- `C = I`. That is the no-regression pin, and it is a test rather than an assumption.
108
- - For Michelle, `C = 100·R⁻¹` on `Ch03`, whose local transform is the identity today.
109
-
110
- ### Why this layer
111
-
112
- The mesh node is the last node on the mesh-only path — the one place a correction reaches the mesh
113
- without disturbing the joints. Correcting it fixes the frame identically for the rasterizer, the
114
- path tracer, the TLAS instance transform, the bounds chain and the motion vectors, because all of
115
- them read one transform. **No shader changes. No per-vertex cost.** One matrix per skin, once.
116
-
117
- `register_skin` rather than the loader because every skin passes through it — glTF, USD, the
118
- editor, `instantiate_scene_bundle`, and skins built in code, which never see a loader at all.
119
-
120
- ### The sharp edge
121
-
122
- Children of a skinned mesh node would inherit the correction. In this engine sockets, effect anchors
123
- and projectile spawns are authored as *bones*, so a skinned mesh node should have no children — but
124
- "should" is what got us here. The normalisation asserts it, and says which node and which children if
125
- it fires.
126
-
127
- ### Where it is not representable
128
-
129
- `Transform64` recomposes its local from TRS components, so a correction carrying shear does not
130
- survive the round trip. Rather than test `C` for shear, the normalisation applies it and then
131
- measures the residual directly — `max |mesh.global − A_bind|` — which is the end-to-end quantity and
132
- catches decomposition loss, a non-agreeing skeleton and a bad `C` in one number.
133
-
134
- ## 4. What no frame can fix
135
-
136
- The correction absorbs a *constant* linear part. A clip that scales a joint makes `A_j` non-rigid
137
- per joint and per frame, and no choice of frame fixes that. The ladder:
138
-
139
- | `A_j` | answer |
140
- | --- | --- |
141
- | rigid | DQS, unchanged. Every asset in practice. |
142
- | per-joint **uniform** scale | DQS with scale: factor `M_j = S(s_j) · (Rot \| t/s_j)`, DQ the rigid part, blend `s = Σ wⱼsⱼ` alongside, multiply the transformed point by `s`. One divide and one multiply per joint. |
143
- | **non-uniform** or sheared | a dual quaternion cannot represent it at all. Either a per-skin linear-blend path — correct, candy-wrapper on those assets only — or a hard import error. |
144
-
145
- ### The detector — landed
146
-
147
- Rows 2 and 3 are contingencies rather than requirements, so neither is carried. What *is* built is
148
- the thing that says whether they are ever needed, and it says it without a device:
149
- `skin_clip_scale_conflicts`, called from `register_skin` and `register_clip` alike.
150
-
151
- The condition is sharper than this section first stated. "A clip animating a `Scale` channel on a
152
- joint" understates it in one direction and overstates it in another, and both matter:
153
-
154
- - a scale on the character's **own root** reaches the mesh *and* every joint, enters `mesh.global`
155
- and every `joint.global` alike, and cancels out of the fold. That is how a model is made to grow
156
- and it has to stay legal — a joint-targeting test would have called it clean, which is right by
157
- luck, and a "does it scale anything under the skin" test would have called it broken, which is
158
- wrong;
159
- - a scale on a node **above only some of the joints** never targets a joint at all and breaks the
160
- fold exactly as a joint-targeted one does.
161
-
162
- So the question is reachability, not targeting: **a scale is safe exactly when the node carrying it
163
- reaches the mesh and all of the joints, or none of them.** Anything between is a conflict.
164
-
165
- Two further refinements the curves themselves settle. A channel whose curves never leave 1 is not a
166
- scale, whatever it targets — clips arrive unoptimized and an identity channel on a joint is noise.
167
- And the range comes from `animation_curve_compute_aabb`, which follows the Hermite spline between
168
- keys rather than reading the keys alone: a curve that leaves 1 and returns to it scales the joints
169
- for most of the clip, and reading its endpoints would call it flat.
170
-
171
- The report says which rung would be needed. `uniform` is true only when all three axes are driven by
172
- equal curves, so an axis left unanimated — a squash — reads as non-uniform, which is the safe
173
- direction.
174
-
175
- **Cost.** `clip_scale_channels` is asked first and is one pass over a clip's channel list with a
176
- `property !== Scale` early-out. A clip that scales nothing is remembered by nothing and compared
177
- against nothing, which is every clip a character normally carries. Only a clip that scales something
178
- is held in the manager's index and paired off against the registered skins, in both registration
179
- orders — a clip can arrive before its skin as easily as after, and neither may pass in silence.
180
-
181
- ## 5. Rejected
182
-
183
- - **Patch `dual_quat_from_m4` to swallow the scale.** Moves an asset-conditioning problem into the
184
- per-vertex hot loop; correct only for a uniform scale, so it still needs the check; and it leaves
185
- the invariant unstated, so the next asset shape breaks it silently. The band-aid.
186
- - **Drop the fold; write clones in world space.** The cleanest mathematically — glTF says skinned
187
- vertices are world-space and the node transform is ignored. But f32 vertex storage at world
188
- coordinates costs about a millimetre of precision per ten kilometres from the origin, and it forces
189
- a skinned special case into the rasterizer's uniform "apply `node.global`" path. Correctness bought
190
- with a precision bug.
191
- - **Bake the scale into geometry at import.** Does not defend the editor's drag-and-drop or anything
192
- the importer never saw; mutates geometry that content-keyed registration now keys on; costs a full
193
- vertex rewrite per asset. Worth doing *additionally*, offline, so the runtime correction is a
194
- no-op — not instead of it.
195
-
196
- ## 6. Tiers
197
-
198
- Kept as low as they will go, for as long as they will go. Every assertion below runs without a
199
- device and without an asset.
200
-
201
- | tier | what it holds | file |
202
- | --- | --- | --- |
203
- | 1 — pure arithmetic | a rigid matrix has zero defect; a scaled, sheared, degenerate or reflected one is reported as it should be | `core/geom/3d/mat4/m4_rigidity_defect.spec.js` |
204
- | 2 — the skin, on the CPU | what each asset shape's bind transform *is*, and that the mesh node is a frame for one and not the other; the correction lands `mesh.global` on the bind transform for both; the pre-scale shape is untouched, element for element; idempotent; survives the walk; placement-invariant; children named; a skin no frame can fix is reported and left alone | `skin_bind_transform.spec.js`, `skin_normalize_mesh_frame.spec.js` |
205
- | 3 — the shader's own WGSL, in the emulator | a vertex lands where its skin matrix says — every joint, both bind spaces, three conversions, at rest and posed apart — plus the negative control: the same vertex on the asset's own mesh node, most of a body away | `skinning/chunk_skin_blend_mesh_local.spec.js` |
206
- | 2b — the clip against the skin | a scale on a joint conflicts and a scale on the character's root does not; a curve flat at 1 is not a scale and one that leaves 1 between its keys is; uniform told from squash; and the manager reports it in both registration orders | `skin_clip_scale_conflicts.spec.js` |
207
- | 3b — the real asset, on the CPU | the whole chain over `Michelle.glb`'s own matrices and her `SambaDance`: the folded scale, the correction, and where every sampled vertex lands, before and after | `playground/skinned_mesh_soup/__soup_blend_probe.spec.js` |
208
- | 4 — the browser | `?skin=bind` is a full-size character; `?skin=animated` dances | `playground/skinned_mesh_soup/` |
209
-
210
- Tier 3 is the one that would have caught this: it already ran the real chunk over a synthetic model,
211
- and it only ever built the one asset shape. Adding the other shape was the whole test change.
212
-
213
- **Run, on an NVIDIA RTX 4090.** Phase 1: the console reported `absorbing 99.0000 of non-rigidity the
214
- skinning pass could not have carried`, `?skin=bind` drew a full-size character, `?skin=animated`
215
- danced, and the published box came back `1.4556 × 1.6644 × 0.3872 m` — a character, not a coin.
216
- Then §9, whose WGSL nothing offline type-checks: compiles and runs. Then `await diagnose()` at
217
- `?skin=bind`, which reads the clone's vertices back off the device and holds them against the bind
218
- pose — **all 19 106 of them, worst error `7.96e-7`**, no wrong meshlets and no wrong vertex slots.
219
- That is the f32 floor of a matrix product, a quaternion conversion and a screw motion at single
220
- precision, and it is four orders below the smallest violation the tool can report.
221
-
222
- Held red by hand before landing: with the correction's body removed, 11 tests fail — four of them
223
- tier 3, and only the world-space rows. Every pre-scale row stays green, which is the no-regression
224
- claim stated as an experiment rather than as a hope.
225
-
226
- Measured on `Michelle.glb`, 2 486 vertices sampled, in a mesh-local space where the body is 2.24
227
- across:
228
-
229
- | | folded scale | mean error | worst | worst on a single-joint vertex |
230
- | --- | --- | --- | --- | --- |
231
- | bind, mesh node as the file gave it | 100.0000 | 121.2470 | 165.4281 | 165.4281 |
232
- | posed at 0.5 s, the same | 100.0000 | 121.6197 | 165.5332 | — |
233
- | bind, on the skin frame | 1.0000 | 0.0002 | 0.0016 | 0.0014 |
234
- | posed at 0.5 s, on the skin frame | 1.0000 | 0.0001 | 0.0062 | 0.000014 |
235
- | bind, skin frame **and §9** | 1.0000 | 0.0000 | 0.0000 | **0** |
236
- | posed at 0.5 s, skin frame and §9 | 1.0000 | 0.0001 | 0.0062 | **0.000001** |
237
-
238
- The one residual left is the blended vertices — 0.0062 at 0.76 / 0.23 across a bent joint — which is
239
- dual-quaternion skinning declining to be a linear blend, and is what it is for. The 0.0014 at bind
240
- was §9, and is gone.
241
-
242
- ## 7. What landed
243
-
244
- 1. `m4_rigidity_defect` — tier 1.
245
- 2. `skin_joint_matrix`, `skin_bind_transform`, `skin_frame_defect` — the three questions, one file
246
- each; `skin_test_fixtures` builds both asset shapes as scene graphs, off the hierarchy rather
247
- than by hand.
248
- 3. `skin_normalize_mesh_frame` — the correction, with the report `register_skin` logs from.
249
- 4. `GPUAnimationManager#register_skin` calls it ahead of the bind loop, and names an asset it cannot
250
- put right.
251
- 5. Doc corrections: `chunk_skin_blend_mesh_local`'s stated precondition, `SkinnedMesh`'s class doc
252
- (`transform_global` on a skinned mesh is now the engine's, and says so), and the fixture header in
253
- `SkinnedMesh.spec.js` that had drawn the wrong conclusion from the right observation.
254
-
255
- Then §9, and §4's detector — `skin_clip_scale_conflicts`, with the manager keeping an index of
256
- skins by id and of the clips that scale anything, so the pairing runs whichever order they arrive in.
257
-
258
- Not carried: §4's rows 2 and 3 themselves. The detector is what would say they are needed.
259
-
260
- ## 8. Risks
261
-
262
- - **Something reads a skinned mesh's `transform_global` expecting the file's value.**
263
- `compute_skin_world_bounds` does not, and glTF says the value is meaningless for a skinned mesh.
264
- After this it *means* something: the frame the mesh's vertices are expressed in. Any consumer that
265
- wanted the file's node transform wanted the wrong thing.
266
- - **An asset whose rest pose is not its bind pose** has no single `A_bind`. The deviation number says
267
- so by name rather than the engine guessing. Not seen in practice; the check is what would find it.
268
- - **The eighteen creature models.** Whether they satisfy the invariant today cannot be measured from
269
- this repository — they are the game's. The check answers it on their first frame, which is itself
270
- the argument for landing the check before the correction.
271
-
272
- ## 9. Landed: `dual_quat_from_m4` was ill-conditioned near the identity
273
-
274
- Not caused by phase 1, and exposed by it. The conversion took all four quaternion components as
275
-
276
- ```wgsl
277
- sqrt(max(0, 1 ± m00 ± m11 ± m22)) * 0.5
278
- ```
279
-
280
- and near the identity three of those radicands are near zero. A square root turns an error of `e`
281
- into one of `sqrt(e)`, and it lands on the rotation *axis* rather than its angle, so it does not
282
- average out.
283
-
284
- Measured on Michelle after the frame correction: every folded matrix is the identity to `1.131e-6`
285
- (worst joint, `mixamorig:LeftUpLeg`), predicting `sqrt(3 × 1.131e-6) / 2 = 9.21e-4` per component, an
286
- angular error of `1.84e-3` rad, and `1.418e-3` at the worst vertex's radius. Observed: `1.402e-3` —
287
- a millimetre and a half on a 1.66 m character. It showed **only at bind**, because that is the one
288
- pose where the fold lands every joint on the identity; posed at 0.5 s the same measurement gave
289
- `1.4e-5`.
290
-
291
- **The fix was already in the tree.** `chunk_quat_from_m3` is Shoemake's branch-picking form —
292
- compute whichever component the diagonal says is largest, derive the other three by division — and
293
- it was written, correct, and used by nothing but a doc reference. `dual_quat_from_m4` now delegates
294
- its real part to it. One `sqrt` and a reciprocal instead of four `sqrt`s and a normalize, every
295
- branch dividing by at least 2, and the error passes through in proportion rather than as its square
296
- root.
297
-
298
- On Michelle: `1.402e-3` → `0` at bind, `1.4e-5` → `1e-6` posed.
299
-
300
- Three tiers, all device-free. `chunk_quat_from_m3.spec.js` is new, because delegating put a chunk
301
- with no spec of its own on the path of every skinned vertex: a sweep of rotations about four axes
302
- against what the matrix does to three off-axis probes, all four branches reached and each exact
303
- where it takes over, the near-identity scaling law over three decades, and a hair either side of a
304
- half turn. `chunk_dual_quat_from_m4.spec.js` gained the composed form of the same question and a
305
- case for a translation carried by a rotation that is barely there. `__soup_blend_probe.spec.js`'s
306
- ported chunk follows the real one, and its single-joint tolerance went from `5e-3` to `1e-5`.
307
-
308
- Held red by hand, with the four-`sqrt` form swapped back in: four tests fail. The near-identity one
309
- reports `0.000863` against the `8.66e-4` predicted above — three digits — and, as a bonus nobody was
310
- looking for, a genuine rotation of `1e-5` came back as **exactly zero**: f32 rounds the diagonal to 1,
311
- every radicand to 0 or 4, and the rotation is not amplified but destroyed.
312
-
313
- One consequence worth naming: the old form recovered `Rx(90°)` exactly from `100·Rx(90°)`, because
314
- its `w` and `x` radicands were both `1 + 100` and its `y` and `z` both clamped — the coincidence §1
315
- describes, where only the scale was lost and the character came out the right shape at 1/100 size.
316
- The branch form has no such luck, so a frame violation now looks wrong rather than small. That is the
317
- better failure, and the negative controls in `chunk_skin_blend_mesh_local.spec.js` still hold.
318
-
319
- ### Still open
320
-
321
- `quat_from_m3` reads a matrix's upper 3×3 as a rotation, which is the same contract
322
- `dual_quat_from_m4` has and the same one `m4_rigidity_defect` exists to check. Nothing calls it with
323
- a scale on purpose now, and nothing warns if something starts to.
324
-
325
- ## 10. Adversarial review
326
-
327
- Of §§1–9's own work, after it was green. Findings in the order they matter.
328
-
329
- | | severity | finding | resolution |
330
- | --- | --- | --- | --- |
331
- | A1 | **must-fix** | `transform_global` is derived and a fresh `Transform64` is the **identity**, not zeros — so a skin whose scene has never been walked answers "every joint is at the origin", and that answer passes every check in §3. The folds come out `inverse_bind_0⁻¹ × inverse_bind_j`, which on a real character differ by rigid motions and read as perfectly rigid; a correction would be computed from nothing, applied, and then confirmed by a residual whose two halves both come from the same unwalked state. The exact class of silent wrongness this whole change exists to end, reintroduced inside its own guard. | **Fixed.** `Node3D#version` is bumped by `updateMatrices` and by nothing else, so a node at version 0 has never been derived. `skin_normalize_mesh_frame` refuses before measuring, reports the nodes, and `register_skin` names one. Pinned twice: the refusal, and the premise — that an all-identity skeleton scores under `1e-6` on the defect. |
332
- | A2 | **must-fix** | A reflection scores **zero** on `m4_rigidity_defect`, because it is orthonormal and that is what the defect measures. So a mirrored joint passed the frame check and `quat_from_m3` would answer with a rotation, silently. The one way a fold can be unrepresentable and still look perfect. | **Fixed.** `skin_frame_defect` checks the sign of the fold's linear determinant and answers `Infinity`. A reflection the frame and every joint share cancels and never reaches it, so what does reach it is a skeleton disagreeing with itself about handedness, which no frame reconciles. |
333
- | A3 | should-fix | `skin_frame_defect_by_joint` — the diagnostic that says *which* joint — did not make A2's refusal, so the gate and the explanation of the gate would have disagreed about which joints were the problem. | **Fixed** alongside A2, and the test now asserts both halves: joint 0 clean, joints 1 and 2 `Infinity`. |
334
- | A4 | should-fix | `__soup_probe.spec.js`'s bind-pose probe compared against `mesh.transform_global × rest` — a composition the renderer *cancels* — and printed "worst bind-pose deviation 1.672182" next to a `skinned` column that was exactly right. A trap rather than a measurement, and it asserted nothing. | **Fixed.** It compares against the skin's bind transform, prints `5.65e-7`, and now asserts: no zero-weight vertices, no out-of-range joints, worst under `1e-5`. |
335
- | A5 | nit | `skin_normalize_mesh_frame` measured `frame_defect` before the unwalked check could reject the data it was measured from, leaving a meaningful-looking number in a report where it meant nothing. | **Fixed**: measured after the refusal, `NaN` before it, and said so in the return doc. |
336
- | A6 | nit | `chunk_dual_quat_from_m4`'s doc claimed "one `sqrt` and a reciprocal, against four `sqrt`s and a normalize" while keeping the normalize. | **Fixed**, and the normalize's actual job — a degenerate 3×3, where `quat_from_m3` lands on a branch whose answer has length 0.5 — is stated instead of implied. |
337
- | A7 | nit | `verify_clone_vertices` dereferenced an unregistered source geometry's record. | **Fixed**: reported as a verdict rather than a `TypeError`. |
338
- | A8 | nit | The rotation fixture in `chunk_quat_from_m3.spec.js` recomputed one cross product three times, and — found the hard way — took its axis on trust. `[0.4243, -0.5657, 0.7071]` has norm `0.99982`, and that `1.8e-4` came back out as `1.15e-4` of "disagreement" that read as a defect in the conversion for a good ten minutes. | **Fixed**: normalized in the fixture, with the incident in its doc comment so the next person does not spend the ten minutes. |
339
-
340
- ### Left, with reasons
341
-
342
- - **`skin_bind_transform` takes joint 0's matrix.** In a file whose rest pose is its bind pose every
343
- joint answers the same one. In a file where they differ there is no single answer, and it does not
344
- matter: the frame cancels out of the rendered position entirely — `mesh.global × (mesh.global⁻¹ ×
345
- A_j) = A_j` for any invertible frame — so the frame's only job is to make `M_j` *representable*, and
346
- `skin_frame_defect` is what checks that. Joints disagreeing by rigid motions cost nothing.
347
- - **A skeleton walked, then moved, then not walked again.** Not detectable by `version`, which counts
348
- walks rather than staleness. The mesh half of it *is* caught: the correction is computed from the
349
- stale global but applied to the local, and the residual is measured against the live one, so it
350
- fires. The joint half is the caller's contract.
351
- - **The `TOLERANCE` constant gates two different quantities** — a dimensionless rigidity measure and
352
- a matrix distance mixing linear and translation units. Defensible at `1e-4` against a smallest real
353
- violation of `99`, and splitting it would invite two numbers nobody can justify separately.
354
- - **No offline tier in this engine type-checks WGSL.** The emulator builds the whole skinning shader
355
- from its chunk graph, which catches an undefined function and a syntax error, and that is where the
356
- coverage stops. §9's `mat3x3<f32>(m[0].xyz, …)` was settled by a page load rather than by a test,
357
- and the next chunk edit will be too.
@@ -1,6 +0,0 @@
1
- References:
2
-
3
- * https://www.shadertoy.com/view/slSXRW
4
- * "How Big Budget AAA Games Render Clouds" by SimonDev : https://www.youtube.com/watch?v=Qj_tK_mdRcA
5
- * Physically Based and Unified Volumetric Rendering in Frostbite (SIGGRAPH
6
- 2015) https://www.youtube.com/watch?v=ddfEnuXZijM
@@ -1,76 +0,0 @@
1
- /**
2
- * One degree of freedom with **direct drive + release momentum** — the "throw"
3
- * model (Google Earth / Maps / Cesium), NOT a spring.
4
- *
5
- * The distinction that matters for feel:
6
- * - **Position is applied directly** (`drag` moves `value` 1:1, zero lag) — so
7
- * while the user is dragging, the camera tracks the input exactly. Responsive.
8
- * - **Only the velocity is filtered.** Each frame the per-frame motion is pushed
9
- * into a short time-windowed history; on release the average velocity over the
10
- * last `windowSeconds` is taken as the throw velocity. Averaging the velocity
11
- * (not the position) gives a clean, jitter-free throw without adding any lag
12
- * to the live drag.
13
- * - **On release it coasts**: `value += velocity·dt` with the velocity decaying
14
- * exponentially (frame-rate independent), settling to a weighty stop. Grabbing
15
- * it again (`engage`) cancels the coast instantly.
16
- *
17
- * Holding still before releasing naturally yields ~zero velocity (the recent
18
- * window fills with no-motion frames), so a deliberate slow drag stops dead while
19
- * a flick throws — no explicit click-vs-drag gate needed.
20
- *
21
- * Pure: no DOM, no clock. `update(dt)` is the only time input. Unit tested in
22
- * `MomentumAxis.spec.js`.
23
- *
24
- * @author Alex Goldring (orbital rework)
25
- * @copyright Company Named Limited (c) 2026
26
- */
27
- export class MomentumAxis {
28
- /**
29
- * @param {number} [value] initial position
30
- */
31
- constructor(value?: number);
32
- /** Current position — read this for rendering. */
33
- value: number;
34
- /** Current velocity (units/second). Nonzero while coasting. */
35
- velocity: number;
36
- /** True while the user is actively driving this axis. */
37
- engaged: boolean;
38
- _pending: number;
39
- _d: any[];
40
- _dt: any[];
41
- /** Begin direct control: cancel any coast and drop stale history. */
42
- engage(): void;
43
- /** Apply input immediately (1:1) and record it for velocity estimation. */
44
- drag(delta: any): void;
45
- /**
46
- * Apply input immediately but clamp the position to [min, max]; only the
47
- * motion that actually happened is recorded (so pushing into a limit builds
48
- * no phantom velocity). Used for the polar/pitch limit.
49
- */
50
- dragClamped(delta: any, min: any, max: any): void;
51
- /**
52
- * End the gesture: derive the throw velocity from the recent window, then
53
- * (if momentum is on) let `update` coast it out. `momentum=false` stops dead.
54
- * @param {number} windowSeconds history window to average
55
- * @param {boolean} [momentum=true]
56
- */
57
- release(windowSeconds: number, momentum?: boolean): void;
58
- /** Hard reset to a position with no motion (teleport / external adopt). */
59
- settle(value: any): void;
60
- /**
61
- * Advance one frame.
62
- * - engaged: record this frame's motion for the velocity estimate (the
63
- * position was already moved by `drag`). Returns whether it moved.
64
- * - free + coasting: integrate and exponentially decay the velocity,
65
- * snapping to rest below `stopSpeed`. Returns whether it moved.
66
- *
67
- * @param {number} dt seconds
68
- * @param {number} decayHalfLife seconds for the coast velocity to halve
69
- * @param {number} stopSpeed below this |velocity| the coast ends
70
- * @returns {boolean} true if `value` changed this frame
71
- */
72
- update(dt: number, decayHalfLife: number, stopSpeed: number): boolean;
73
- /** Average velocity over the most recent `windowSeconds` of history. */
74
- _windowedVelocity(windowSeconds: any): number;
75
- }
76
- //# sourceMappingURL=MomentumAxis.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MomentumAxis.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/camera/orbital/MomentumAxis.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH;IACI;;OAEG;IACH,oBAFW,MAAM,EAehB;IAZG,kDAAkD;IAClD,cAAkB;IAClB,+DAA+D;IAC/D,iBAAiB;IACjB,yDAAyD;IACzD,iBAAoB;IAGpB,iBAAiB;IAEjB,UAAY;IACZ,WAAa;IAGjB,qEAAqE;IACrE,eAMC;IAED,2EAA2E;IAC3E,uBAGC;IAED;;;;OAIG;IACH,kDAUC;IAED;;;;;OAKG;IACH,uBAHW,MAAM,aACN,OAAO,QAYjB;IAED,2EAA2E;IAC3E,yBAOC;IAED;;;;;;;;;;;OAWG;IACH,WALW,MAAM,iBACN,MAAM,aACN,MAAM,GACJ,OAAO,CA+BnB;IAED,wEAAwE;IACxE,8CAWC;CACJ"}
@@ -1,164 +0,0 @@
1
- const LN2 = 0.6931471805599453;
2
-
3
- /**
4
- * One degree of freedom with **direct drive + release momentum** — the "throw"
5
- * model (Google Earth / Maps / Cesium), NOT a spring.
6
- *
7
- * The distinction that matters for feel:
8
- * - **Position is applied directly** (`drag` moves `value` 1:1, zero lag) — so
9
- * while the user is dragging, the camera tracks the input exactly. Responsive.
10
- * - **Only the velocity is filtered.** Each frame the per-frame motion is pushed
11
- * into a short time-windowed history; on release the average velocity over the
12
- * last `windowSeconds` is taken as the throw velocity. Averaging the velocity
13
- * (not the position) gives a clean, jitter-free throw without adding any lag
14
- * to the live drag.
15
- * - **On release it coasts**: `value += velocity·dt` with the velocity decaying
16
- * exponentially (frame-rate independent), settling to a weighty stop. Grabbing
17
- * it again (`engage`) cancels the coast instantly.
18
- *
19
- * Holding still before releasing naturally yields ~zero velocity (the recent
20
- * window fills with no-motion frames), so a deliberate slow drag stops dead while
21
- * a flick throws — no explicit click-vs-drag gate needed.
22
- *
23
- * Pure: no DOM, no clock. `update(dt)` is the only time input. Unit tested in
24
- * `MomentumAxis.spec.js`.
25
- *
26
- * @author Alex Goldring (orbital rework)
27
- * @copyright Company Named Limited (c) 2026
28
- */
29
- export class MomentumAxis {
30
- /**
31
- * @param {number} [value] initial position
32
- */
33
- constructor(value = 0) {
34
- /** Current position — read this for rendering. */
35
- this.value = value;
36
- /** Current velocity (units/second). Nonzero while coasting. */
37
- this.velocity = 0;
38
- /** True while the user is actively driving this axis. */
39
- this.engaged = false;
40
-
41
- // motion applied since the last per-frame sample
42
- this._pending = 0;
43
- // recent per-frame motion history: parallel ring of deltas + durations
44
- this._d = [];
45
- this._dt = [];
46
- }
47
-
48
- /** Begin direct control: cancel any coast and drop stale history. */
49
- engage() {
50
- this.engaged = true;
51
- this.velocity = 0;
52
- this._pending = 0;
53
- this._d.length = 0;
54
- this._dt.length = 0;
55
- }
56
-
57
- /** Apply input immediately (1:1) and record it for velocity estimation. */
58
- drag(delta) {
59
- this.value += delta;
60
- this._pending += delta;
61
- }
62
-
63
- /**
64
- * Apply input immediately but clamp the position to [min, max]; only the
65
- * motion that actually happened is recorded (so pushing into a limit builds
66
- * no phantom velocity). Used for the polar/pitch limit.
67
- */
68
- dragClamped(delta, min, max) {
69
- const before = this.value;
70
- let next = before + delta;
71
- if (next < min) {
72
- next = min;
73
- } else if (next > max) {
74
- next = max;
75
- }
76
- this.value = next;
77
- this._pending += next - before;
78
- }
79
-
80
- /**
81
- * End the gesture: derive the throw velocity from the recent window, then
82
- * (if momentum is on) let `update` coast it out. `momentum=false` stops dead.
83
- * @param {number} windowSeconds history window to average
84
- * @param {boolean} [momentum=true]
85
- */
86
- release(windowSeconds, momentum = true) {
87
- // fold the not-yet-sampled residual into the most recent frame
88
- if (this._pending !== 0 && this._d.length > 0) {
89
- this._d[this._d.length - 1] += this._pending;
90
- }
91
- this.velocity = momentum ? this._windowedVelocity(windowSeconds) : 0;
92
- this.engaged = false;
93
- this._pending = 0;
94
- this._d.length = 0;
95
- this._dt.length = 0;
96
- }
97
-
98
- /** Hard reset to a position with no motion (teleport / external adopt). */
99
- settle(value) {
100
- this.value = value;
101
- this.velocity = 0;
102
- this.engaged = false;
103
- this._pending = 0;
104
- this._d.length = 0;
105
- this._dt.length = 0;
106
- }
107
-
108
- /**
109
- * Advance one frame.
110
- * - engaged: record this frame's motion for the velocity estimate (the
111
- * position was already moved by `drag`). Returns whether it moved.
112
- * - free + coasting: integrate and exponentially decay the velocity,
113
- * snapping to rest below `stopSpeed`. Returns whether it moved.
114
- *
115
- * @param {number} dt seconds
116
- * @param {number} decayHalfLife seconds for the coast velocity to halve
117
- * @param {number} stopSpeed below this |velocity| the coast ends
118
- * @returns {boolean} true if `value` changed this frame
119
- */
120
- update(dt, decayHalfLife, stopSpeed) {
121
- if (this.engaged) {
122
- this._d.push(this._pending);
123
- this._dt.push(dt);
124
- // bound history (defensive; ~1.5s at 60fps)
125
- if (this._d.length > 90) {
126
- this._d.shift();
127
- this._dt.shift();
128
- }
129
- const moved = this._pending !== 0;
130
- this._pending = 0;
131
- return moved;
132
- }
133
-
134
- if (this.velocity !== 0) {
135
- // Analytic integration of a decaying velocity, so the coast distance
136
- // is EXACTLY frame-rate independent (forward-Euler would drift ~1%
137
- // between 60 and 144 Hz). Over dt: Δx = v·τ·(1 − e^(−dt/τ)), v ·= e^(−dt/τ).
138
- const tau = decayHalfLife / LN2;
139
- const decay = Math.exp(-dt / tau);
140
- this.value += this.velocity * tau * (1 - decay);
141
- this.velocity *= decay;
142
- if (Math.abs(this.velocity) <= stopSpeed) {
143
- this.velocity = 0;
144
- }
145
- return true;
146
- }
147
-
148
- return false;
149
- }
150
-
151
- /** Average velocity over the most recent `windowSeconds` of history. */
152
- _windowedVelocity(windowSeconds) {
153
- let sumD = 0;
154
- let sumDt = 0;
155
- for (let i = this._d.length - 1; i >= 0; i--) {
156
- sumD += this._d[i];
157
- sumDt += this._dt[i];
158
- if (sumDt >= windowSeconds) {
159
- break;
160
- }
161
- }
162
- return sumDt > 0 ? sumD / sumDt : 0;
163
- }
164
- }
@@ -1,45 +0,0 @@
1
- /**
2
- * Merge overrides over the defaults to produce a controller config.
3
- * @param {Partial<typeof ORBITAL_CAMERA_FEEL_DEFAULTS>} [overrides]
4
- * @returns {typeof ORBITAL_CAMERA_FEEL_DEFAULTS}
5
- */
6
- export function createOrbitalCameraConfig(overrides?: Partial<typeof ORBITAL_CAMERA_FEEL_DEFAULTS>): typeof ORBITAL_CAMERA_FEEL_DEFAULTS;
7
- /**
8
- * Ready-made "Precision" profile: no inertia — the camera stops the instant you
9
- * release (direct mouse-delta control, can stop on a pixel), the Maya/CAD
10
- * convention.
11
- * @param {Partial<typeof ORBITAL_CAMERA_FEEL_DEFAULTS>} [overrides]
12
- * @returns {typeof ORBITAL_CAMERA_FEEL_DEFAULTS}
13
- */
14
- export function createPrecisionProfile(overrides?: Partial<typeof ORBITAL_CAMERA_FEEL_DEFAULTS>): typeof ORBITAL_CAMERA_FEEL_DEFAULTS;
15
- /**
16
- * Tunable "feel" parameters for the orbital camera, shared by the control core
17
- * ({@link OrbitalCameraRig}) and the input adapter ({@link OrbitalCameraInput}).
18
- * One frozen source of truth so the two layers can never disagree.
19
- *
20
- * The model is **direct drive + release momentum** (a "throw", like Google Earth
21
- * / Cesium), NOT a smoothed-target spring. While dragging, the camera follows
22
- * input 1:1 (no lag, fully responsive). On release the recent input velocity is
23
- * carried forward and decays exponentially — the weighty follow-through. See
24
- * {@link MomentumAxis}.
25
- *
26
- * Defaults grounded in the competitor survey:
27
- * - `momentumDecayHalfLife` ≈ Cesium spin inertia (tau 2.5 → half-life 0.28 s).
28
- * - `velocityWindow` ≈ Mapbox's 160 ms release-velocity window (a touch shorter).
29
- * - `zoomStep` 0.9 multiplicative per notch ≈ three.js `pow(0.95, zoomSpeed)`.
30
- */
31
- export const ORBITAL_CAMERA_FEEL_DEFAULTS: Readonly<{
32
- momentumEnabled: true;
33
- momentumDecayHalfLife: 0.1;
34
- velocityWindow: 0.1;
35
- momentumStopSpeed: 0.012;
36
- rotateSpeed: 1;
37
- panSpeed: 1;
38
- zoomStep: 0.9;
39
- invertWheel: false;
40
- minPolar: 0.000001;
41
- maxPolar: number;
42
- flyToDuration: 0.35;
43
- maxDt: 0.1;
44
- }>;
45
- //# sourceMappingURL=OrbitalCameraConfig.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"OrbitalCameraConfig.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/camera/orbital/OrbitalCameraConfig.js"],"names":[],"mappings":"AA+CA;;;;GAIG;AACH,sDAHW,QAAQ,mCAAmC,CAAC,GAC1C,mCAAmC,CAI/C;AAED;;;;;;GAMG;AACH,mDAHW,QAAQ,mCAAmC,CAAC,GAC1C,mCAAmC,CAI/C;AAjED;;;;;;;;;;;;;;;GAeG;AACH;;;;;;;;;;;;;GA6BG"}