@woosh/meep-engine 3.60.4 → 3.60.6

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 (419) hide show
  1. package/CHANGELOG.md +2621 -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/package.json +6 -2
  9. package/src/engine/EngineHarness.d.ts +3 -9
  10. package/src/engine/EngineHarness.d.ts.map +1 -1
  11. package/src/engine/EngineHarness.js +6 -8
  12. package/src/engine/graphics/camera/makeOrbitalCameraController.d.ts +9 -6
  13. package/src/engine/graphics/camera/makeOrbitalCameraController.d.ts.map +1 -1
  14. package/src/engine/graphics/camera/makeOrbitalCameraController.js +44 -71
  15. package/src/engine/graphics/camera/orbital/MomentumAxis.d.ts +64 -0
  16. package/src/engine/graphics/camera/orbital/MomentumAxis.d.ts.map +1 -0
  17. package/src/engine/graphics/camera/orbital/MomentumAxis.js +187 -0
  18. package/src/engine/graphics/camera/orbital/OrbitalCameraRig.d.ts +86 -0
  19. package/src/engine/graphics/camera/orbital/OrbitalCameraRig.d.ts.map +1 -0
  20. package/src/engine/graphics/camera/orbital/OrbitalCameraRig.js +319 -0
  21. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.d.ts +34 -10
  22. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.d.ts.map +1 -1
  23. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.js +116 -30
  24. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.d.ts +1 -7
  25. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.d.ts.map +1 -1
  26. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.js +1 -37
  27. package/src/engine/graphics/ecs/water/Water.d.ts +8 -0
  28. package/src/engine/graphics/ecs/water/Water.d.ts.map +1 -1
  29. package/src/engine/graphics/ecs/water/Water.js +8 -0
  30. package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
  31. package/src/engine/graphics3/WaterSystem.js +731 -734
  32. package/src/engine/graphics3/decal/DecalTileShader.d.ts +61 -0
  33. package/src/engine/graphics3/decal/DecalTileShader.d.ts.map +1 -0
  34. package/src/engine/graphics3/decal/DecalTileShader.js +138 -0
  35. package/src/engine/graphics3/decal/GPUDecalRenderer.d.ts +10 -4
  36. package/src/engine/graphics3/decal/GPUDecalRenderer.d.ts.map +1 -1
  37. package/src/engine/graphics3/decal/GPUDecalRenderer.js +149 -44
  38. package/src/engine/graphics3/decal/chunk_decal_tile_vertex.d.ts +25 -0
  39. package/src/engine/graphics3/decal/chunk_decal_tile_vertex.d.ts.map +1 -0
  40. package/src/engine/graphics3/decal/chunk_decal_tile_vertex.js +55 -0
  41. package/src/engine/graphics3/decal/graph_gather_decal_tiles.d.ts +22 -0
  42. package/src/engine/graphics3/decal/graph_gather_decal_tiles.d.ts.map +1 -0
  43. package/src/engine/graphics3/decal/graph_gather_decal_tiles.js +70 -0
  44. package/src/engine/graphics3/decal/shader_decal_composite.d.ts +7 -5
  45. package/src/engine/graphics3/decal/shader_decal_composite.d.ts.map +1 -1
  46. package/src/engine/graphics3/decal/shader_decal_composite.js +48 -44
  47. package/src/engine/graphics3/decal/shader_decal_tile_copy.d.ts +12 -0
  48. package/src/engine/graphics3/decal/shader_decal_tile_copy.d.ts.map +1 -0
  49. package/src/engine/graphics3/decal/shader_decal_tile_copy.js +78 -0
  50. package/src/engine/graphics3/decal/shader_gather_decal_tiles.d.ts +11 -0
  51. package/src/engine/graphics3/decal/shader_gather_decal_tiles.d.ts.map +1 -0
  52. package/src/engine/graphics3/decal/shader_gather_decal_tiles.js +80 -0
  53. package/src/engine/input/devices/mouse/MouseEventButtons.d.ts +13 -0
  54. package/src/engine/input/devices/mouse/MouseEventButtons.d.ts.map +1 -0
  55. package/src/engine/input/devices/mouse/MouseEventButtons.js +23 -0
  56. package/src/engine/input/ecs/controllers/KeyboardCameraController.d.ts +4 -0
  57. package/src/engine/input/ecs/controllers/KeyboardCameraController.d.ts.map +1 -1
  58. package/src/engine/input/ecs/controllers/KeyboardCameraController.js +9 -45
  59. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  60. package/src/shade/playground/water_refraction/README.md +5 -6
  61. package/src/shade/playground/water_refraction/index.html +1 -1
  62. package/src/shade/renderer/Renderer.d.ts +11 -0
  63. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  64. package/src/shade/renderer/Renderer.js +50 -6
  65. package/src/shade/renderer/camera/orbital/OrbitalCameraController.d.ts +40 -80
  66. package/src/shade/renderer/camera/orbital/OrbitalCameraController.d.ts.map +1 -1
  67. package/src/shade/renderer/camera/orbital/OrbitalCameraController.js +197 -147
  68. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +3 -3
  69. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +1 -1
  70. package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +6 -6
  71. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +1 -1
  72. package/src/shade/renderer/fluid/query/GPUFluidQueries.d.ts +1 -1
  73. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts +28 -45
  74. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts.map +1 -1
  75. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +111 -119
  76. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts +22 -3
  77. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts.map +1 -1
  78. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.js +84 -3
  79. package/src/shade/renderer/geometry/virtual/proxy/vgeo_proxy_triangle_limit.d.ts +19 -0
  80. package/src/shade/renderer/geometry/virtual/proxy/vgeo_proxy_triangle_limit.d.ts.map +1 -0
  81. package/src/shade/renderer/geometry/virtual/proxy/vgeo_proxy_triangle_limit.js +25 -0
  82. package/src/shade/renderer/geometry/virtual/proxy/vgeo_to_proxy_mesh.d.ts +31 -0
  83. package/src/shade/renderer/geometry/virtual/proxy/vgeo_to_proxy_mesh.d.ts.map +1 -0
  84. package/src/shade/renderer/geometry/virtual/proxy/vgeo_to_proxy_mesh.js +343 -0
  85. package/src/shade/renderer/geometry/virtual/runtime/VirtualGeometry.d.ts +15 -0
  86. package/src/shade/renderer/geometry/virtual/runtime/VirtualGeometry.d.ts.map +1 -1
  87. package/src/shade/renderer/geometry/virtual/runtime/VirtualGeometry.js +38 -0
  88. package/src/shade/renderer/geometry/virtual/runtime/vgeo_meshlet_metadata_write.d.ts +17 -0
  89. package/src/shade/renderer/geometry/virtual/runtime/vgeo_meshlet_metadata_write.d.ts.map +1 -0
  90. package/src/shade/renderer/geometry/virtual/runtime/vgeo_meshlet_metadata_write.js +29 -0
  91. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_meshlet_batch.d.ts.map +1 -1
  92. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_meshlet_batch.js +7 -13
  93. package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.d.ts +28 -59
  94. package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.d.ts.map +1 -1
  95. package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.js +84 -789
  96. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts.map +1 -1
  97. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.js +1 -8
  98. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts +7 -6
  99. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts.map +1 -1
  100. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.js +12 -11
  101. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.d.ts +2 -2
  102. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.js +2 -2
  103. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts +1 -4
  104. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts.map +1 -1
  105. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.js +1 -10
  106. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.d.ts +5 -15
  107. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.d.ts.map +1 -1
  108. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.js +6 -34
  109. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.d.ts.map +1 -1
  110. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.js +1 -7
  111. package/src/shade/renderer/hiz/HZBFootprint.d.ts +14 -0
  112. package/src/shade/renderer/hiz/HZBFootprint.d.ts.map +1 -0
  113. package/src/shade/renderer/hiz/HZBFootprint.js +16 -0
  114. package/src/shade/renderer/hiz/HZB_FOOTPRINT_X.d.ts +10 -0
  115. package/src/shade/renderer/hiz/HZB_FOOTPRINT_X.d.ts.map +1 -0
  116. package/src/shade/renderer/hiz/HZB_FOOTPRINT_X.js +11 -0
  117. package/src/shade/renderer/hiz/HZB_FOOTPRINT_Y.d.ts +10 -0
  118. package/src/shade/renderer/hiz/HZB_FOOTPRINT_Y.d.ts.map +1 -0
  119. package/src/shade/renderer/hiz/HZB_FOOTPRINT_Y.js +11 -0
  120. package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts +0 -7
  121. package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts.map +1 -1
  122. package/src/shade/renderer/hiz/HierarchicalZBuffer.js +405 -350
  123. package/src/shade/renderer/hiz/chunk_hzb_footprint_x.d.ts +12 -0
  124. package/src/shade/renderer/hiz/chunk_hzb_footprint_x.d.ts.map +1 -0
  125. package/src/shade/renderer/hiz/chunk_hzb_footprint_x.js +27 -0
  126. package/src/shade/renderer/hiz/chunk_hzb_footprint_y.d.ts +12 -0
  127. package/src/shade/renderer/hiz/chunk_hzb_footprint_y.d.ts.map +1 -0
  128. package/src/shade/renderer/hiz/chunk_hzb_footprint_y.js +27 -0
  129. package/src/shade/renderer/hiz/hzb_footprint_texels.d.ts +14 -0
  130. package/src/shade/renderer/hiz/hzb_footprint_texels.d.ts.map +1 -0
  131. package/src/shade/renderer/hiz/hzb_footprint_texels.js +34 -0
  132. package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts +0 -5
  133. package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts.map +1 -1
  134. package/src/shade/renderer/hiz/shader_hzb_reduce_any.js +37 -57
  135. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0.d.ts +11 -0
  136. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0.d.ts.map +1 -0
  137. package/src/shade/renderer/hiz/{shader_hzb_reduce_mip0_clip.js → shader_hzb_reduce_mip0.js} +120 -111
  138. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  139. package/src/shade/renderer/material/GPUMaterialManager.d.ts +11 -1
  140. package/src/shade/renderer/material/GPUMaterialManager.d.ts.map +1 -1
  141. package/src/shade/renderer/material/GPUMaterialManager.js +16 -8
  142. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts +12 -12
  143. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts.map +1 -1
  144. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.js +17 -118
  145. package/src/shade/renderer/postprocess/gtao/GTAO.d.ts +7 -3
  146. package/src/shade/renderer/postprocess/gtao/GTAO.d.ts.map +1 -1
  147. package/src/shade/renderer/postprocess/gtao/GTAO.js +26 -13
  148. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.d.ts +14 -0
  149. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.d.ts.map +1 -1
  150. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.js +196 -68
  151. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.d.ts.map +1 -1
  152. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.js +42 -28
  153. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.d.ts.map +1 -1
  154. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.js +429 -414
  155. package/src/shade/renderer/postprocess/gtao/shader_gtao_spatial_denoise.d.ts +16 -0
  156. package/src/shade/renderer/postprocess/gtao/shader_gtao_spatial_denoise.d.ts.map +1 -0
  157. package/src/shade/renderer/postprocess/gtao/shader_gtao_spatial_denoise.js +156 -0
  158. package/src/shade/renderer/scene/GPUSceneContext.d.ts +2 -2
  159. package/src/shade/renderer/scene/GPUSceneContext.js +5 -5
  160. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
  161. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +7 -2
  162. package/src/shade/renderer/water/GPUWaterRenderer.d.ts +0 -6
  163. package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
  164. package/src/shade/renderer/water/GPUWaterRenderer.js +12 -17
  165. package/src/shade/renderer/water/medium/graph_water_meshlets.d.ts +35 -0
  166. package/src/shade/renderer/water/medium/graph_water_meshlets.d.ts.map +1 -0
  167. package/src/shade/renderer/water/medium/graph_water_meshlets.js +89 -0
  168. package/src/shade/renderer/water/query/GPUWaterQueries.d.ts +1 -1
  169. package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
  170. package/src/shade/renderer/water/shader_water.js +22 -13
  171. package/src/shade/renderer/water/shader_water_avboit.d.ts.map +1 -1
  172. package/src/shade/renderer/water/shader_water_avboit.js +7 -7
  173. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts +1 -1
  174. package/src/shade/renderer/water/surface/graph_water_tessellation.js +1 -1
  175. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +9 -1
  176. package/editor/REWORK_PLAN_2026_08.md +0 -692
  177. package/src/CODEC_LAYOUT_VERIFICATION.md +0 -419
  178. package/src/CORRECTNESS_HUNT_2026_07_24.md +0 -142
  179. package/src/DUPLICATION_AUDIT_2026_08_07/00_core_reuse_surface.md +0 -738
  180. package/src/DUPLICATION_AUDIT_2026_08_07/A_core_math_geom.md +0 -79
  181. package/src/DUPLICATION_AUDIT_2026_08_07/B_core_data.md +0 -93
  182. package/src/DUPLICATION_AUDIT_2026_08_07/C_gfx_render.md +0 -80
  183. package/src/DUPLICATION_AUDIT_2026_08_07/D_gfx_features.md +0 -164
  184. package/src/DUPLICATION_AUDIT_2026_08_07/E_physics.md +0 -69
  185. package/src/DUPLICATION_AUDIT_2026_08_07/F_sound.md +0 -110
  186. package/src/DUPLICATION_AUDIT_2026_08_07/G_net_save.md +0 -129
  187. package/src/DUPLICATION_AUDIT_2026_08_07/H_engine_misc.md +0 -72
  188. package/src/DUPLICATION_AUDIT_2026_08_07/I_generation_view.md +0 -74
  189. package/src/DUPLICATION_AUDIT_2026_08_07/K_crosscutting.md +0 -169
  190. package/src/DUPLICATION_AUDIT_2026_08_07.md +0 -254
  191. package/src/DUPLICATION_AUDIT_REMEDIATION.md +0 -250
  192. package/src/DUPLICATION_REVIEW_2026_10_24.md +0 -1072
  193. package/src/REVIEW_2026_08_06/adv-core.md +0 -511
  194. package/src/REVIEW_2026_08_06/adv-gfx.md +0 -480
  195. package/src/REVIEW_2026_08_06/adv-view.md +0 -446
  196. package/src/REVIEW_2026_08_06/api-core.md +0 -296
  197. package/src/REVIEW_2026_08_06/api-engine.md +0 -195
  198. package/src/REVIEW_2026_08_06/bvh-phys-sound-net.md +0 -507
  199. package/src/REVIEW_2026_08_06/core-binary.md +0 -348
  200. package/src/REVIEW_2026_08_06/core-collection.md +0 -376
  201. package/src/REVIEW_2026_08_06/core-math.md +0 -221
  202. package/src/REVIEW_2026_08_06/core-process.md +0 -266
  203. package/src/REVIEW_2026_08_06/core-science.md +0 -223
  204. package/src/REVIEW_2026_08_06/engine-ai-nav.md +0 -279
  205. package/src/REVIEW_2026_08_06/engine-animation.md +0 -167
  206. package/src/REVIEW_2026_08_06/engine-asset.md +0 -166
  207. package/src/REVIEW_2026_08_06/engine-ecs.md +0 -920
  208. package/src/REVIEW_2026_08_06/engine-input.md +0 -197
  209. package/src/REVIEW_2026_08_06/engine-misc.md +0 -248
  210. package/src/REVIEW_2026_08_06/engine-terrain.md +0 -52
  211. package/src/REVIEW_2026_08_06/generation.md +0 -176
  212. package/src/REVIEW_2026_08_06/geom-2d.md +0 -434
  213. package/src/REVIEW_2026_08_06/geom-3d.md +0 -117
  214. package/src/REVIEW_2026_08_06/gfx-gi.md +0 -143
  215. package/src/REVIEW_2026_08_06/gfx-render.md +0 -740
  216. package/src/REVIEW_2026_08_06/gfx-texture.md +0 -690
  217. package/src/REVIEW_2026_08_06/prior-criticals.md +0 -49
  218. package/src/REVIEW_2026_08_06/prior-highs.md +0 -138
  219. package/src/REVIEW_2026_08_06/test-gaps.md +0 -364
  220. package/src/REVIEW_2026_08_06/view.md +0 -667
  221. package/src/REVIEW_2026_08_06.md +0 -610
  222. package/src/core/binary/lz4/LZ4_HIGH_COMPRESSION_PLAN_2026_09_14.md +0 -542
  223. package/src/core/bvh2/bvh3/NOTES.md +0 -2
  224. package/src/core/bvh8/NOTES.md +0 -63
  225. package/src/core/cache/wtinylfu/benchmark/CacheWTinylfu.bench.md +0 -243
  226. package/src/core/color/COLOR_FIX_PLAN_2026_08_28.md +0 -417
  227. package/src/core/color/COLOR_REVIEW_2026_08_28.md +0 -779
  228. package/src/core/geom/2d/polygon/TRIANGULATION_DESIGN.md +0 -433
  229. package/src/core/geom/3d/atlas/ATLAS_PORT_PLAN.md +0 -486
  230. package/src/core/geom/3d/atlas/BFF_PLAN.md +0 -174
  231. package/src/core/geom/3d/atlas/REVIEW_02.md +0 -392
  232. package/src/core/geom/3d/gjk/GJK_REVIEW_NOTES.md +0 -146
  233. package/src/core/geom/3d/gjk/NOTES.md +0 -8
  234. package/src/core/geom/3d/topology/TOPO_MESH_RETIREMENT_PLAN.md +0 -135
  235. package/src/core/geom/GEOMETRY_REVIEW_002_API_ISSUES.md +0 -381
  236. package/src/core/geom/GEOMETRY_REVIEW_002_NAMING.md +0 -684
  237. package/src/core/geom/MANIFOLD_COMPARISON_2026_08_01.md +0 -554
  238. package/src/core/model/reactive/evaluation/PREDICATE_APPLICABILITY_PROPOSAL.md +0 -446
  239. package/src/engine/REVIEW_2026_07_03.md +0 -211
  240. package/src/engine/asset/loaders/image/IMAGE_CODEC_REVIEW_2026_08_28.md +0 -815
  241. package/src/engine/control/first-person/DESIGN.md +0 -658
  242. package/src/engine/control/first-person/DESIGN_COLLISION.md +0 -382
  243. package/src/engine/control/first-person/DESIGN_EXTENSIONS.md +0 -563
  244. package/src/engine/control/first-person/TODO.md +0 -160
  245. package/src/engine/ecs/ASYNC_SYSTEMS_PROPOSAL.md +0 -531
  246. package/src/engine/ecs/HIERARCHY_REVIEW.md +0 -717
  247. package/src/engine/ecs/async/WORKER_SYSTEM_PLAN.md +0 -262
  248. package/src/engine/ecs/ik/PLAN.md +0 -179
  249. package/src/engine/ecs/storage/binary/SERIALIZATION_COVERAGE.md +0 -272
  250. package/src/engine/ecs/storage/binary/object-v2/DESIGN.md +0 -199
  251. package/src/engine/ecs/transform/TRANSFORM64_MIGRATION_PLAN_2026_09_04.md +0 -521
  252. package/src/engine/graphics/CONTEXT_LOSS_RECOVERY_PLAN.md +0 -463
  253. package/src/engine/graphics/ecs/camera/pp/NOTES.md +0 -48
  254. package/src/engine/graphics/render/frame_graph/CORRECTNESS_FIXES_2026_09_04.md +0 -659
  255. package/src/engine/graphics/render/frame_graph/FRAME_GRAPH_RECOMMENDATIONS.md +0 -235
  256. package/src/engine/graphics/sh3/path_tracer/REVIEW_001_ACTION_PLAN.md +0 -490
  257. package/src/engine/graphics/texture/sampler/compare/FLIP_IMPLEMENTATION_PLAN.md +0 -466
  258. package/src/engine/input/GAMEPAD_API_PROPOSAL.md +0 -717
  259. package/src/engine/input/ecs/ism/ISM_DESIGN.md +0 -1523
  260. package/src/engine/input/ecs/ism/ISM_IMPLEMENTATION_PLAN.md +0 -627
  261. package/src/engine/navigation/mesh/OVERLAPPING_SURFACES_2026_08_25.md +0 -661
  262. package/src/engine/navigation/mesh/PATHFINDING_PLAN.md +0 -229
  263. package/src/engine/network/CONGESTION_CONTROL.md +0 -87
  264. package/src/engine/network/MESSAGE_TRANSPORT.md +0 -364
  265. package/src/engine/network/SMOOTHNESS_DESIGN.md +0 -400
  266. package/src/engine/physics/cloth/MEASUREMENTS.md +0 -5304
  267. package/src/engine/physics/cloth/PLAN.md +0 -3056
  268. package/src/engine/physics/fluid/GPU_FLUID_CASCADES_PROPOSAL_2026_10_16.md +0 -1382
  269. package/src/engine/physics/fluid/REVIEW_02_PLAN.md +0 -243
  270. package/src/engine/physics/fluid/solver/NOTES.md +0 -46
  271. package/src/engine/sound/SOUND_EMITTER_RETIREMENT_PLAN.md +0 -536
  272. package/src/engine/sound/simulation/IMPLEMENTATION_PLAN.md +0 -432
  273. package/src/engine/sound/simulation/PROBE_PLACEMENT.md +0 -250
  274. package/src/engine/sound/simulation/PROBE_TRANSFER_RESEARCH.md +0 -322
  275. package/src/engine/sound/simulation/REFLECTION_IR_PLAN.md +0 -261
  276. package/src/engine/sound/simulation/VISIBILITY_GRAPH_PLAN.md +0 -121
  277. package/src/engine/sound/sopra/IMPLEMENTATION_PLAN.md +0 -999
  278. package/src/format/image/avif/DECISIONS.md +0 -545
  279. package/src/format/image/jpeg/NOTES.md +0 -3
  280. package/src/format/scene/gltf/MESHOPT_COMPRESSION_PLAN.md +0 -814
  281. package/src/generation/COORDINATES.md +0 -54
  282. package/src/generation/REVIEW_01_ACTION_PLAN.md +0 -628
  283. package/src/generation/foliage/ANNUAL_SHOOTS_BRIEF_2026_10_25.md +0 -220
  284. package/src/generation/foliage/CROWN_FILLING_BRIEF_2026_10_26.md +0 -172
  285. package/src/generation/foliage/CROWN_FULLNESS_BRIEF_2026_10_26.md +0 -86
  286. package/src/generation/foliage/FOLIAGE_DESIGN.md +0 -547
  287. package/src/generation/foliage/FOLIAGE_PLAN.md +0 -198
  288. package/src/generation/foliage/LEAF_ARCHITECTURE_BRIEF_2026_10_26.md +0 -158
  289. package/src/generation/foliage/LOD_REWORK_BRIEF_2026_10_27.md +0 -521
  290. package/src/generation/foliage/REAL_TIME_TREES_BRIEF_2026_10_27.md +0 -86
  291. package/src/generation/foliage/SELF_ORGANIZING_FRAMEWORK_BRIEF_2026_10_26.md +0 -347
  292. package/src/generation/foliage/SHOOT_SYSTEMS_ALL_SPECIES_BRIEF_2026_10_26.md +0 -248
  293. package/src/generation/foliage/SPEEDTREE_COMPARISON_2026_10_24.md +0 -694
  294. package/src/generation/foliage/TWO_FRONT_ENDS_BRIEF_2026_10_28.md +0 -552
  295. package/src/shade/RENDERER_CONTRACT.md +0 -697
  296. package/src/shade/SHADER_F16_PROPOSAL_2026_10_24.md +0 -263
  297. package/src/shade/device/IMMEDIATE_DATA_PLAN_2026_08_28.md +0 -569
  298. package/src/shade/device/PASS_ENCODER_PROPOSAL_2026_08_31.md +0 -755
  299. package/src/shade/device/mock/EXTENSION_PROPOSAL_2026_08_22.md +0 -458
  300. package/src/shade/device/mock/IMPLEMENTATION_PLAN.md +0 -255
  301. package/src/shade/device/mock/REVIEW_2026_08_22.md +0 -527
  302. package/src/shade/device/timing/GPU_PROFILER_PROPOSAL_2026_08_28.md +0 -894
  303. package/src/shade/device/timing/profile/SGPT_FORMAT.md +0 -345
  304. package/src/shade/renderer/NOTES.md +0 -78
  305. package/src/shade/renderer/PLAN.md +0 -8
  306. package/src/shade/renderer/animation/ADDITIVE_BLENDING_PLAN.md +0 -145
  307. package/src/shade/renderer/animation/SKINNING_FRAME_PLAN.md +0 -357
  308. package/src/shade/renderer/atmosphere/NOTES.md +0 -6
  309. package/src/shade/renderer/camera/orbital/MomentumAxis.d.ts +0 -76
  310. package/src/shade/renderer/camera/orbital/MomentumAxis.d.ts.map +0 -1
  311. package/src/shade/renderer/camera/orbital/MomentumAxis.js +0 -164
  312. package/src/shade/renderer/camera/orbital/OrbitalCameraConfig.d.ts +0 -45
  313. package/src/shade/renderer/camera/orbital/OrbitalCameraConfig.d.ts.map +0 -1
  314. package/src/shade/renderer/camera/orbital/OrbitalCameraConfig.js +0 -66
  315. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts +0 -98
  316. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts.map +0 -1
  317. package/src/shade/renderer/camera/orbital/OrbitalCameraInput.js +0 -184
  318. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts +0 -175
  319. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts.map +0 -1
  320. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.js +0 -411
  321. package/src/shade/renderer/camera/orbital/README.md +0 -81
  322. package/src/shade/renderer/camera/orbital/index.d.ts +0 -6
  323. package/src/shade/renderer/camera/orbital/index.d.ts.map +0 -1
  324. package/src/shade/renderer/camera/orbital/index.js +0 -9
  325. package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +0 -964
  326. package/src/shade/renderer/fluid/GPU_FLUID_OCCUPANCY_AND_SOTA_REVIEW_2026_10_26.md +0 -361
  327. package/src/shade/renderer/geometry/bvh/BLAS_REFIT_BATCH_PLAN.md +0 -619
  328. package/src/shade/renderer/geometry/meshlet/COMPACTION_PLAN_2026_09_16.md +0 -674
  329. package/src/shade/renderer/geometry/sdf/NOTES.md +0 -6
  330. package/src/shade/renderer/geometry/virtual/ATTRIBUTE_PLAN_2026_09_18.md +0 -540
  331. package/src/shade/renderer/geometry/virtual/MICRON_COMPARISON_2026_08_20.md +0 -305
  332. package/src/shade/renderer/geometry/virtual/VGEO_FORMAT.md +0 -913
  333. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +0 -787
  334. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_PLAN.md +0 -481
  335. package/src/shade/renderer/geometry/virtual/VK_LOD_CLUSTERS_COMPARISON_2026_08_20.md +0 -301
  336. package/src/shade/renderer/geometry/virtual/WEDGE_PLAN_2026_09_18.md +0 -448
  337. package/src/shade/renderer/geometry/virtual/runtime/CULL_PLAN_2026_09_16.md +0 -385
  338. package/src/shade/renderer/geometry/virtual/runtime/CUT_PLAN_2026_09_14.md +0 -656
  339. package/src/shade/renderer/geometry/virtual/runtime/REVIEW_LEDGER.md +0 -308
  340. package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN.md +0 -657
  341. package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN_2026_09_14.md +0 -551
  342. package/src/shade/renderer/geometry/virtual/runtime/SHADOW_PLAN_2026_09_28.md +0 -529
  343. package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.d.ts +0 -47
  344. package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.d.ts.map +0 -1
  345. package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.js +0 -80
  346. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.d.ts +0 -16
  347. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.d.ts.map +0 -1
  348. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.js +0 -67
  349. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.d.ts +0 -17
  350. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.d.ts.map +0 -1
  351. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.js +0 -145
  352. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.d.ts +0 -12
  353. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.d.ts.map +0 -1
  354. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.js +0 -105
  355. package/src/shade/renderer/global_illumination/lpv/NOTES.md +0 -3
  356. package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_CLIPMAP_PROPOSAL_2026_10_27.md +0 -4306
  357. package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_RAYS_VARIABLE_AND_SORTED_SCOPE_2026_10_30.md +0 -410
  358. package/src/shade/renderer/global_illumination/sharc/NOTES.md +0 -8
  359. package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +0 -1369
  360. package/src/shade/renderer/gpu_primitive/bvh/PHASE1_HANDOVER.md +0 -202
  361. package/src/shade/renderer/gpu_primitive/indirect/NOTES.md +0 -94
  362. package/src/shade/renderer/hiz/NOTES.md +0 -3
  363. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts +0 -8
  364. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts.map +0 -1
  365. package/src/shade/renderer/light/cluster/NOTES.md +0 -11
  366. package/src/shade/renderer/light/cluster/PROPOSAL_ALGORITHM_2026_10_16.md +0 -524
  367. package/src/shade/renderer/light/cluster/PROPOSAL_HIERARCHICAL_2026_10_16.md +0 -1101
  368. package/src/shade/renderer/material/resident/shader_resident_texture_means.d.ts +0 -24
  369. package/src/shade/renderer/material/resident/shader_resident_texture_means.d.ts.map +0 -1
  370. package/src/shade/renderer/material/resident/shader_resident_texture_means.js +0 -120
  371. package/src/shade/renderer/particles/DESIGN.md +0 -1011
  372. package/src/shade/renderer/particles/EMITTER_GLOBAL_STATE_PLAN_2026_10_29.md +0 -280
  373. package/src/shade/renderer/particles/ORIENTATION_PLAN_2026_10_15.md +0 -453
  374. package/src/shade/renderer/path_tracer/PATH_TRACED_MEDIA_PLAN_2026_10_02.md +0 -520
  375. package/src/shade/renderer/postprocess/bloom/NOTES.md +0 -6
  376. package/src/shade/renderer/postprocess/fsr/NOTES.md +0 -4
  377. package/src/shade/renderer/postprocess/gtao/NOTES.md +0 -6
  378. package/src/shade/renderer/postprocess/nss/NOTES.md +0 -332
  379. package/src/shade/renderer/postprocess/perspective/NOTES.md +0 -3
  380. package/src/shade/renderer/postprocess/sscs/NOTES.md +0 -5
  381. package/src/shade/renderer/postprocess/ssr/NOTES.md +0 -14
  382. package/src/shade/renderer/postprocess/ssr/REPROJECTION_PROPOSAL.md +0 -286
  383. package/src/shade/renderer/postprocess/ssr/prefilter/NOTES.md +0 -39
  384. package/src/shade/renderer/postprocess/taa/NOTES.md +0 -11
  385. package/src/shade/renderer/postprocess/upscale-dither/NOTES.md +0 -78
  386. package/src/shade/renderer/postprocess/vrs/NOTES.md +0 -4
  387. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_LEDGER.md +0 -1218
  388. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_PLAN_2026_09_03.md +0 -600
  389. package/src/shade/renderer/restir/reservoir/NOTES.md +0 -6
  390. package/src/shade/renderer/shader/chunk/atmosphere/NOTES.md +0 -6
  391. package/src/shade/renderer/shader/chunk/brdf/FRESNEL_BRIEF_2026_10_16.md +0 -391
  392. package/src/shade/renderer/shader/chunk/color/tonemap/ACES_TONE_MAPPING_BRIEF_2026_10_17.md +0 -153
  393. package/src/shade/renderer/shader/chunk/color/tonemap/HDR_TONE_MAPPING_FORMS_BRIEF_2026_10_16.md +0 -322
  394. package/src/shade/renderer/shader/chunk/color/tonemap/SDR_TONE_MAPPING_BRIEF_2026_10_16.md +0 -247
  395. package/src/shade/renderer/shader/chunk/fsr/NOTES.md +0 -3
  396. package/src/shade/renderer/shader/chunk/fsr/spd/NOTES.md +0 -4
  397. package/src/shade/renderer/shader/chunk/geometry/ray/NOTES.md +0 -4
  398. package/src/shade/renderer/shader/chunk/material/MULTISCATTER.md +0 -159
  399. package/src/shade/renderer/shader/chunk/mboit/NOTES.md +0 -38
  400. package/src/shade/renderer/shader/chunk/spherical_harmonics/l1i/NOTES.md +0 -3
  401. package/src/shade/renderer/shader/chunk/spherical_harmonics/sampling/NOTES.md +0 -8
  402. package/src/shade/renderer/shader/compiler/SHADER_SWITCH_PROPOSAL_2026_10_16.md +0 -927
  403. package/src/shade/renderer/shadow/contact/FINDINGS.md +0 -413
  404. package/src/shade/renderer/shadow/map/csm/NOTES.md +0 -5
  405. package/src/shade/renderer/shadow/ray/NOTES.md +0 -31
  406. package/src/shade/renderer/shadow/sdf/NOTES.md +0 -9
  407. package/src/shade/renderer/shadow/sdf/brixelizer/NOTES.md +0 -5
  408. package/src/shade/renderer/shadow/sdf/cascade/NOTES.md +0 -9
  409. package/src/shade/renderer/shadow/vsm/NOTES.md +0 -12
  410. package/src/shade/renderer/shadow/vsm/PLAN.md +0 -442
  411. package/src/shade/renderer/shadow/vsm/REVIEW_LEDGER.md +0 -43
  412. package/src/shade/renderer/texture/COMPRESSED_TEXTURE_PLAN_2026_09_01.md +0 -2444
  413. package/src/shade/renderer/texture/mipmaps/NOTES.md +0 -3
  414. package/src/shade/renderer/volumetrics/NOTES.md +0 -1329
  415. package/src/shade/renderer/volumetrics/VOLUMETRIC_NOISE_PLAN_2026_10_15.md +0 -336
  416. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts +0 -23
  417. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +0 -1
  418. package/src/shade/renderer/water/medium/GPUWaterBodies.js +0 -75
  419. package/src/shade/wgsl/NOTES.md +0 -4
@@ -1,411 +0,0 @@
1
- import { clamp } from "../../../../core/math/clamp.js";
2
- import { clamp01 } from "../../../../core/math/clamp01.js";
3
- import { lerp } from "../../../../core/math/lerp.js";
4
- import { smoothStep } from "../../../../core/math/smoothStep.js";
5
- import { NumericInterval } from "../../../../core/math/interval/NumericInterval.js";
6
- import Vector3 from "../../../../core/geom/Vector3.js";
7
- import { Transform64 } from "../../../../engine/ecs/transform/Transform64.js";
8
- import { MomentumAxis } from "./MomentumAxis.js";
9
- import { createOrbitalCameraConfig } from "./OrbitalCameraConfig.js";
10
-
11
- const TAU = Math.PI * 2;
12
-
13
- /**
14
- * The CONTROL CORE of the orbital camera — pure kinematics with no knowledge of
15
- * the DOM, input devices, or a wall clock. Drive it with intents, advance it
16
- * with an explicit `dt`, read a {@link Transform} back out. Unit testable with
17
- * plain numbers (see `OrbitalCameraRig.spec.js`).
18
- *
19
- * Feel model: **direct drive + release momentum** (a "throw"), via
20
- * {@link MomentumAxis}. A drag is bracketed by `engageRotate`/`disengageRotate`
21
- * (or pan); between them the orbit angles / target follow input 1:1 — no lag.
22
- * On disengage the recent input velocity is carried forward and decays to a
23
- * weighty stop. This is the Google-Earth/Cesium feel, not a spring chasing a
24
- * goal. Set `config.momentumEnabled = false` for an instant stop (precision).
25
- *
26
- * Zoom is applied directly (multiplicative, instant) — wheel notches are
27
- * discrete impulses, so there is nothing to "catch up" and no lag to hide.
28
- *
29
- * @author Alex Goldring (orbital rework)
30
- * @copyright Company Named Limited (c) 2026
31
- */
32
- export class OrbitalCameraRig {
33
- /**
34
- * @param {object} [options]
35
- * @param {ReturnType<typeof createOrbitalCameraConfig>} [options.config]
36
- * @param {NumericInterval} [options.distanceLimits]
37
- * @param {number} [options.movementSpeedScale]
38
- */
39
- constructor({ config = createOrbitalCameraConfig(), distanceLimits, movementSpeedScale = 1 } = {}) {
40
- this.config = config;
41
- this.distanceLimits = distanceLimits ?? new NumericInterval(0.1, 1000);
42
- this.movementSpeedScale = movementSpeedScale;
43
-
44
- // orbit angles + target, each a direct-drive momentum axis
45
- this._phi = new MomentumAxis(Math.PI / 2);
46
- this._theta = new MomentumAxis(0);
47
- this._tx = new MomentumAxis(0);
48
- this._ty = new MomentumAxis(0);
49
- this._tz = new MomentumAxis(0);
50
-
51
- // zoom is direct/instant — a plain clamped scalar
52
- this.distance = 1;
53
-
54
- // set by direct (non-momentum) edits — dolly / truck — so update() knows
55
- // to recompose even though no axis is engaged or coasting
56
- this._directDirty = false;
57
-
58
- // programmatic framing glide; null when not animating
59
- this._fly = null;
60
-
61
- // scratch — reused, never allocated per frame
62
- this._basisTransform = new Transform64();
63
- this._scratchTransform = new Transform64();
64
- this._scratchTarget = new Vector3();
65
- }
66
-
67
- // ─────────────────────────────────────────────────────────────────────────
68
- // Rotate intents
69
- // ─────────────────────────────────────────────────────────────────────────
70
-
71
- /** Begin an orbit drag (pointer down). Cancels any coast/fly and takes direct control. */
72
- engageRotate() {
73
- this._fly = null;
74
- this._phi.engage();
75
- this._theta.engage();
76
- }
77
-
78
- /**
79
- * Apply an orbit delta directly (1:1). `dPhi` pitches (clamped to the polar
80
- * range), `dTheta` yaws. Radians.
81
- * @param {number} dPhi
82
- * @param {number} dTheta
83
- */
84
- rotate(dPhi, dTheta) {
85
- this._phi.dragClamped(dPhi, this.config.minPolar, this.config.maxPolar);
86
- this._theta.drag(dTheta);
87
- }
88
-
89
- /** End the orbit drag (pointer up): throw with the recent input velocity (or stop dead). */
90
- disengageRotate() {
91
- this._phi.release(this.config.velocityWindow, this.config.momentumEnabled);
92
- this._theta.release(this.config.velocityWindow, this.config.momentumEnabled);
93
- }
94
-
95
- // ─────────────────────────────────────────────────────────────────────────
96
- // Pan intents
97
- // ─────────────────────────────────────────────────────────────────────────
98
-
99
- /** Begin a pan drag (pointer down, pan button). */
100
- engagePan() {
101
- this._fly = null;
102
- this._tx.engage();
103
- this._ty.engage();
104
- this._tz.engage();
105
- }
106
-
107
- /**
108
- * Screen-space pan: drag the target in the current view plane, directly (1:1).
109
- * `dx`/`dy` are pointer-pixel deltas (sign: last − current, "grab the world").
110
- * @param {number} dx pixels
111
- * @param {number} dy pixels
112
- * @param {number} viewportHeight pixels
113
- * @param {number} fov vertical fov, radians
114
- */
115
- panScreen(dx, dy, viewportHeight, fov) {
116
- if (viewportHeight <= 0) {
117
- return;
118
- }
119
-
120
- const m = this._currentBasisMatrix();
121
- const scale = this.distance * Math.tan(fov * 0.5);
122
- const kx = (2 * dx * scale) / viewportHeight;
123
- const ky = (2 * dy * scale) / viewportHeight;
124
-
125
- // move the target opposite the drag, along camera right (col0) / up (col1)
126
- this._tx.drag(-(kx * m[0] + ky * m[4]));
127
- this._ty.drag(-(kx * m[1] + ky * m[5]));
128
- this._tz.drag(-(kx * m[2] + ky * m[6]));
129
-
130
- // a standalone (non-gesture) pan still needs a recompose; during a real
131
- // pan gesture the engaged-axis path already reports the move
132
- if (!this._tx.engaged) {
133
- this._directDirty = true;
134
- }
135
- }
136
-
137
- /** End the pan drag: throw the target with the recent velocity (or stop dead). */
138
- disengagePan() {
139
- const w = this.config.velocityWindow;
140
- const m = this.config.momentumEnabled;
141
- this._tx.release(w, m);
142
- this._ty.release(w, m);
143
- this._tz.release(w, m);
144
- }
145
-
146
- /** Abort direct control without throwing, retaining the last applied pose. */
147
- cancelGesture() {
148
- this._phi.settle(this._phi.value);
149
- this._theta.settle(this._theta.value);
150
- this._tx.settle(this._tx.value);
151
- this._ty.settle(this._ty.value);
152
- this._tz.settle(this._tz.value);
153
- // The last drag may not have reached the facade's next frame yet.
154
- this._directDirty = true;
155
- }
156
-
157
- // ─────────────────────────────────────────────────────────────────────────
158
- // Zoom + keyboard (direct, no momentum)
159
- // ─────────────────────────────────────────────────────────────────────────
160
-
161
- /**
162
- * Multiplicative zoom, applied directly. `factor < 1` zooms in, `> 1` out.
163
- * Scale-uniform and clamped to {@link distanceLimits}.
164
- * @param {number} factor
165
- */
166
- dolly(factor) {
167
- const next = clamp(this.distance * factor, this.distanceLimits.min, this.distanceLimits.max);
168
- if (next !== this.distance) {
169
- this.distance = next;
170
- this._directDirty = true;
171
- }
172
- }
173
-
174
- /** Set the zoom distance directly (world units), clamped. */
175
- setDistance(distance) {
176
- this.distance = clamp(distance, this.distanceLimits.min, this.distanceLimits.max);
177
- this._directDirty = true;
178
- }
179
-
180
- /**
181
- * Keyboard fly: move the target in the camera-local XZ plane (directly).
182
- * `x` strafe (±1), `z` forward/back (±1); speed scales with
183
- * {@link movementSpeedScale} and zoom-out, integrated over `dt`.
184
- * @param {number} x
185
- * @param {number} z
186
- * @param {number} dt seconds
187
- */
188
- truckLocal(x, z, dt) {
189
- const rawLen = Math.hypot(x, z);
190
- if (rawLen === 0 || dt <= 0) {
191
- return;
192
- }
193
-
194
- const zoomScale = lerp(1, 2, clamp01(this.distanceLimits.normalizeValue(this.distance)));
195
- const dist = this.movementSpeedScale * zoomScale * dt * rawLen;
196
-
197
- const nx = x / rawLen;
198
- const nz = z / rawLen;
199
-
200
- const m = this._currentBasisMatrix();
201
- const wx = nx * m[0] + nz * m[8];
202
- const wy = nx * m[1] + nz * m[9];
203
- const wz = nx * m[2] + nz * m[10];
204
-
205
- this._tx.value += wx * dist;
206
- this._ty.value += wy * dist;
207
- this._tz.value += wz * dist;
208
- this._directDirty = true;
209
- }
210
-
211
- // ─────────────────────────────────────────────────────────────────────────
212
- // Framing
213
- // ─────────────────────────────────────────────────────────────────────────
214
-
215
- /**
216
- * Point the camera at `to` from `from`. Instant by default (snap), or an
217
- * eased glide over `config.flyToDuration` when `animate` is true.
218
- * @param {Vector3} from eye position
219
- * @param {Vector3} to look-at target
220
- * @param {object} [opts]
221
- * @param {boolean} [opts.animate=false]
222
- */
223
- frameTo(from, to, { animate = false } = {}) {
224
- const { phi, theta, distance } = this._deriveOrbit(from, to);
225
-
226
- if (!animate || this.config.flyToDuration <= 0) {
227
- this._phi.settle(phi);
228
- this._theta.settle(theta);
229
- this._tx.settle(to.x);
230
- this._ty.settle(to.y);
231
- this._tz.settle(to.z);
232
- this.distance = distance;
233
- this._fly = null;
234
- this._directDirty = true;
235
- return;
236
- }
237
-
238
- // animated: ease from the current pose to the new one (shortest azimuth)
239
- this._fly = {
240
- phi0: this._phi.value, theta0: this._theta.value, dist0: this.distance,
241
- tx0: this._tx.value, ty0: this._ty.value, tz0: this._tz.value,
242
- phi1: phi, theta1: this._shortestAzimuth(theta, this._theta.value), dist1: distance,
243
- tx1: to.x, ty1: to.y, tz1: to.z,
244
- t: 0,
245
- };
246
- }
247
-
248
- // ─────────────────────────────────────────────────────────────────────────
249
- // Simulation + output
250
- // ─────────────────────────────────────────────────────────────────────────
251
-
252
- /**
253
- * Advance one frame. Returns whether the pose changed (so the caller can skip
254
- * a redundant transform write when the camera is fully at rest).
255
- * @param {number} dt seconds
256
- * @returns {boolean}
257
- */
258
- update(dt) {
259
- if (!(dt > 0)) {
260
- return false;
261
- }
262
-
263
- if (this._fly !== null) {
264
- return this._advanceFly(dt);
265
- }
266
-
267
- let moved = this._directDirty;
268
- this._directDirty = false;
269
-
270
- const hl = this.config.momentumDecayHalfLife;
271
- const rotStop = this.config.momentumStopSpeed;
272
- const panStop = this.config.momentumStopSpeed * this.distance;
273
-
274
- moved = this._phi.update(dt, hl, rotStop) || moved;
275
- // stop a coast at the pole instead of gliding through it
276
- if (this._phi.value < this.config.minPolar) {
277
- this._phi.value = this.config.minPolar;
278
- this._phi.velocity = 0;
279
- } else if (this._phi.value > this.config.maxPolar) {
280
- this._phi.value = this.config.maxPolar;
281
- this._phi.velocity = 0;
282
- }
283
- moved = this._theta.update(dt, hl, rotStop) || moved;
284
- moved = this._tx.update(dt, hl, panStop) || moved;
285
- moved = this._ty.update(dt, hl, panStop) || moved;
286
- moved = this._tz.update(dt, hl, panStop) || moved;
287
-
288
- // keep azimuth bounded over long sessions (periodic, so visually a no-op)
289
- this._theta.value -= TAU * Math.round(this._theta.value / TAU);
290
-
291
- return moved;
292
- }
293
-
294
- /**
295
- * Write the current pose into `out` (position + look rotation), preserving
296
- * its scale. Returns `out`.
297
- * @param {Transform} out
298
- * @returns {Transform}
299
- */
300
- composeTransform(out) {
301
- this._scratchTransform.copy(out);
302
- this._poseToTransform(
303
- this._scratchTransform,
304
- this._phi.value, this._theta.value, this.distance,
305
- this._currentTarget()
306
- );
307
- out.copy(this._scratchTransform);
308
- return out;
309
- }
310
-
311
- // ── read-only views ──────────────────────────────────────────────────────
312
-
313
- get phi() { return this._phi.value; }
314
- get theta() { return this._theta.value; }
315
- /** True when nothing is engaged, coasting, or flying. */
316
- get isAtRest() {
317
- return (
318
- this._fly === null &&
319
- !this._phi.engaged && !this._theta.engaged &&
320
- !this._tx.engaged && !this._ty.engaged && !this._tz.engaged &&
321
- this._phi.velocity === 0 && this._theta.velocity === 0 &&
322
- this._tx.velocity === 0 && this._ty.velocity === 0 && this._tz.velocity === 0
323
- );
324
- }
325
-
326
- /**
327
- * Current target. Writes into `out` if given (no allocation), else a shared
328
- * scratch vector — copy it if you need to retain it.
329
- * @param {Vector3} [out]
330
- * @returns {Vector3}
331
- */
332
- getTarget(out) {
333
- const v = out ?? this._scratchTarget;
334
- v.set(this._tx.value, this._ty.value, this._tz.value);
335
- return v;
336
- }
337
-
338
- // ─────────────────────────────────────────────────────────────────────────
339
- // Internals
340
- // ─────────────────────────────────────────────────────────────────────────
341
-
342
- _advanceFly(dt) {
343
- const f = this._fly;
344
- f.t += dt;
345
- const u = clamp01(f.t / this.config.flyToDuration);
346
- const e = smoothStep(0, 1, u);
347
-
348
- this._phi.settle(lerp(f.phi0, f.phi1, e));
349
- this._theta.settle(lerp(f.theta0, f.theta1, e));
350
- this._tx.settle(lerp(f.tx0, f.tx1, e));
351
- this._ty.settle(lerp(f.ty0, f.ty1, e));
352
- this._tz.settle(lerp(f.tz0, f.tz1, e));
353
- this.distance = lerp(f.dist0, f.dist1, e);
354
-
355
- if (u >= 1) {
356
- this._fly = null;
357
- }
358
- return true;
359
- }
360
-
361
- _deriveOrbit(from, to) {
362
- const radius = Vector3.distance(from, to);
363
- let phi = 0;
364
- let theta = 0;
365
- if (radius > 1e-9) {
366
- theta = Math.atan2(from.x - to.x, from.z - to.z);
367
- phi = Math.acos(clamp((from.y - to.y) / radius, -1, 1));
368
- }
369
- return {
370
- phi: clamp(phi, this.config.minPolar, this.config.maxPolar),
371
- theta,
372
- distance: clamp(radius, this.distanceLimits.min, this.distanceLimits.max),
373
- };
374
- }
375
-
376
- _currentTarget() {
377
- this._scratchTarget.set(this._tx.value, this._ty.value, this._tz.value);
378
- return this._scratchTarget;
379
- }
380
-
381
- /** Matrix of the current pose, for deriving the pan/truck view basis. */
382
- _currentBasisMatrix() {
383
- this._poseToTransform(
384
- this._basisTransform,
385
- this._phi.value, this._theta.value, this.distance,
386
- this._currentTarget()
387
- );
388
- return this._basisTransform.matrix;
389
- }
390
-
391
- _poseToTransform(out, phi, theta, radius, target) {
392
- const sinPhiR = Math.sin(phi) * radius;
393
- out.setTranslation(
394
- target.x + sinPhiR * Math.sin(theta),
395
- target.y + Math.cos(phi) * radius,
396
- target.z + sinPhiR * Math.cos(theta)
397
- );
398
- out.lookAt(target);
399
-
400
- // lookAt set the rotation and nothing recomposes on its own, so callers reading the
401
- // matrix - _currentBasisMatrix does, immediately - would otherwise get the previous pose
402
- out.updateMatrix();
403
- }
404
-
405
- /** Representative of `target` angle nearest `current` (shortest arc). */
406
- _shortestAzimuth(target, current) {
407
- let d = target - current;
408
- d = d - TAU * Math.floor((d + Math.PI) / TAU); // wrap to (-π, π]
409
- return current + d;
410
- }
411
- }
@@ -1,81 +0,0 @@
1
- # Orbital camera (momentum)
2
-
3
- A drop-in replacement for the legacy orbital camera controller
4
- that makes orbit/pan **responsive while dragging** and **weighty on release** —
5
- the "throw" feel of Google Earth / Maps, not a spring.
6
-
7
- ## Feel model — direct drive + release momentum
8
-
9
- The mistake to avoid is a smoothed-target spring (camera chases a goal): it lags
10
- behind the cursor during a drag (floaty, unresponsive) and just arrives at the
11
- goal on release (no follow-through). Instead:
12
-
13
- - **Position is applied directly.** A drag moves the orbit angle / target 1:1,
14
- zero lag — the camera tracks your hand exactly.
15
- - **Only the velocity is filtered.** Each frame's motion goes into a short
16
- time-windowed history; on release the average velocity over the last
17
- ~100 ms becomes the throw. Averaging the *velocity* (not the position) gives a
18
- clean throw without adding any drag-time lag.
19
- - **On release it coasts** — `value += velocity·dt` with the velocity decaying
20
- exponentially (integrated analytically, so it's exactly frame-rate
21
- independent), settling to a weighty stop. Grab it again and it stops dead.
22
-
23
- Holding still before releasing yields ~zero velocity, so a deliberate slow drag
24
- stops precisely while a flick throws — no special click-vs-drag handling. Set
25
- `momentumEnabled: false` for an instant stop (Maya/CAD precision feel).
26
-
27
- Zoom is applied directly/instantly (wheel notches are discrete, nothing to lag).
28
-
29
- ## Architecture — input and control are separated
30
-
31
- ```
32
- events ──▶ OrbitalCameraInput ──intents──▶ OrbitalCameraRig ──pose──▶ Transform
33
- (adapter, no kinematics) (control core, pure) │
34
- uses MomentumAxis per DOF │
35
- OrbitalCameraController (facade: devices, dt, external-change contract)
36
- ```
37
-
38
- | Layer | File | Responsibility | DOM/clock? |
39
- |---|---|---|---|
40
- | **Momentum primitive** | `MomentumAxis.js` | one DOF: direct drive, windowed-velocity release, exponential coast | **No** |
41
- | **Control core** | `OrbitalCameraRig.js` | orbit/pan/zoom kinematics over momentum axes; `engage*/rotate/panScreen/disengage*/dolly/frameTo`, `update(dt)`, `composeTransform` | **No** |
42
- | **Input adapter** | `OrbitalCameraInput.js` | bracket gestures (`dragStart`→engage, `drag`→apply, `dragEnd`→release); wheel/keys | devices only |
43
- | **Facade** | `OrbitalCameraController.js` | device lifecycle, frame `dt`, write the transform, external-change detection | yes |
44
- | **Config** | `OrbitalCameraConfig.js` | shared feel object + `createPrecisionProfile()` | no |
45
-
46
- The rig and `MomentumAxis` are unit-testable with plain numbers (no browser);
47
- the input adapter is tested by firing synthetic signals at injected fake devices.
48
- 28 specs: direct-drive responsiveness, windowed-velocity throw, frame-rate-
49
- independent coast, hold-still-no-throw, pole clamp, precision (no-momentum) mode,
50
- event→intent mapping.
51
-
52
- ## Import
53
-
54
- ```js
55
- import { OrbitalCameraController } from "@woosh/meep-engine/src/shade/renderer/camera/orbital/index.js";
56
- ```
57
-
58
- Constructor `(camera, domElement)` and `look` / `from_transform` / `pan` /
59
- `update` / `flyTo` plus `distanceLimits` / `movement_speed_scale` / `camera` are
60
- preserved. Pass the frame time to `update()` (`create_frame_loop` already
61
- provides it): `controller.update(frame_time_s)`.
62
-
63
- ## Tuning
64
-
65
- ```js
66
- import { createPrecisionProfile } from "../../webgpu/renderer/camera/orbital/index.js";
67
-
68
- // no inertia, direct control (Maya/CAD)
69
- new OrbitalCameraController(camera, dom, { momentumEnabled: false });
70
-
71
- // heavier / longer glide, or a snappier one
72
- new OrbitalCameraController(camera, dom, { momentumDecayHalfLife: 0.4 }); // weightier
73
- new OrbitalCameraController(camera, dom, { momentumDecayHalfLife: 0.12 }); // snappier
74
- ```
75
-
76
- Key knobs (see `OrbitalCameraConfig.js`): `momentumDecayHalfLife` (glide length),
77
- `velocityWindow` (how much recent motion the throw averages), `momentumStopSpeed`
78
- (when the coast ends), `zoomStep`, `rotateSpeed`/`panSpeed`, `flyToDuration`.
79
-
80
- Touch pinch-zoom is wired but inert until meep's `PointerDevice` dispatches
81
- `on.pinch` (it declares the signal but never fires it).
@@ -1,6 +0,0 @@
1
- export { OrbitalCameraController } from "./OrbitalCameraController.js";
2
- export { OrbitalCameraRig } from "./OrbitalCameraRig.js";
3
- export { OrbitalCameraInput } from "./OrbitalCameraInput.js";
4
- export { MomentumAxis } from "./MomentumAxis.js";
5
- export { ORBITAL_CAMERA_FEEL_DEFAULTS, createOrbitalCameraConfig, createPrecisionProfile } from "./OrbitalCameraConfig.js";
6
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/camera/orbital/index.js"],"names":[],"mappings":""}
@@ -1,9 +0,0 @@
1
- export { OrbitalCameraController } from "./OrbitalCameraController.js";
2
- export { OrbitalCameraRig } from "./OrbitalCameraRig.js";
3
- export { OrbitalCameraInput } from "./OrbitalCameraInput.js";
4
- export { MomentumAxis } from "./MomentumAxis.js";
5
- export {
6
- ORBITAL_CAMERA_FEEL_DEFAULTS,
7
- createOrbitalCameraConfig,
8
- createPrecisionProfile,
9
- } from "./OrbitalCameraConfig.js";