@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.
- package/CHANGELOG.md +2621 -0
- package/CONTRIBUTING.md +7 -0
- package/MIGRATION_2_TO_3.md +136 -0
- package/SECURITY.md +4 -0
- package/editor/EditorCameraNavigation.d.ts +2 -1
- package/editor/EditorCameraNavigation.d.ts.map +1 -1
- package/editor/EditorCameraNavigation.js +51 -57
- package/package.json +6 -2
- package/src/engine/EngineHarness.d.ts +3 -9
- package/src/engine/EngineHarness.d.ts.map +1 -1
- package/src/engine/EngineHarness.js +6 -8
- package/src/engine/graphics/camera/makeOrbitalCameraController.d.ts +9 -6
- package/src/engine/graphics/camera/makeOrbitalCameraController.d.ts.map +1 -1
- package/src/engine/graphics/camera/makeOrbitalCameraController.js +44 -71
- package/src/engine/graphics/camera/orbital/MomentumAxis.d.ts +64 -0
- package/src/engine/graphics/camera/orbital/MomentumAxis.d.ts.map +1 -0
- package/src/engine/graphics/camera/orbital/MomentumAxis.js +187 -0
- package/src/engine/graphics/camera/orbital/OrbitalCameraRig.d.ts +86 -0
- package/src/engine/graphics/camera/orbital/OrbitalCameraRig.d.ts.map +1 -0
- package/src/engine/graphics/camera/orbital/OrbitalCameraRig.js +319 -0
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.d.ts +34 -10
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.d.ts.map +1 -1
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.js +116 -30
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.d.ts +1 -7
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.d.ts.map +1 -1
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.js +1 -37
- package/src/engine/graphics/ecs/water/Water.d.ts +8 -0
- package/src/engine/graphics/ecs/water/Water.d.ts.map +1 -1
- package/src/engine/graphics/ecs/water/Water.js +8 -0
- package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/WaterSystem.js +731 -734
- package/src/engine/graphics3/decal/DecalTileShader.d.ts +61 -0
- package/src/engine/graphics3/decal/DecalTileShader.d.ts.map +1 -0
- package/src/engine/graphics3/decal/DecalTileShader.js +138 -0
- package/src/engine/graphics3/decal/GPUDecalRenderer.d.ts +10 -4
- package/src/engine/graphics3/decal/GPUDecalRenderer.d.ts.map +1 -1
- package/src/engine/graphics3/decal/GPUDecalRenderer.js +149 -44
- package/src/engine/graphics3/decal/chunk_decal_tile_vertex.d.ts +25 -0
- package/src/engine/graphics3/decal/chunk_decal_tile_vertex.d.ts.map +1 -0
- package/src/engine/graphics3/decal/chunk_decal_tile_vertex.js +55 -0
- package/src/engine/graphics3/decal/graph_gather_decal_tiles.d.ts +22 -0
- package/src/engine/graphics3/decal/graph_gather_decal_tiles.d.ts.map +1 -0
- package/src/engine/graphics3/decal/graph_gather_decal_tiles.js +70 -0
- package/src/engine/graphics3/decal/shader_decal_composite.d.ts +7 -5
- package/src/engine/graphics3/decal/shader_decal_composite.d.ts.map +1 -1
- package/src/engine/graphics3/decal/shader_decal_composite.js +48 -44
- package/src/engine/graphics3/decal/shader_decal_tile_copy.d.ts +12 -0
- package/src/engine/graphics3/decal/shader_decal_tile_copy.d.ts.map +1 -0
- package/src/engine/graphics3/decal/shader_decal_tile_copy.js +78 -0
- package/src/engine/graphics3/decal/shader_gather_decal_tiles.d.ts +11 -0
- package/src/engine/graphics3/decal/shader_gather_decal_tiles.d.ts.map +1 -0
- package/src/engine/graphics3/decal/shader_gather_decal_tiles.js +80 -0
- package/src/engine/input/devices/mouse/MouseEventButtons.d.ts +13 -0
- package/src/engine/input/devices/mouse/MouseEventButtons.d.ts.map +1 -0
- package/src/engine/input/devices/mouse/MouseEventButtons.js +23 -0
- package/src/engine/input/ecs/controllers/KeyboardCameraController.d.ts +4 -0
- package/src/engine/input/ecs/controllers/KeyboardCameraController.d.ts.map +1 -1
- package/src/engine/input/ecs/controllers/KeyboardCameraController.js +9 -45
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/shade/playground/water_refraction/README.md +5 -6
- package/src/shade/playground/water_refraction/index.html +1 -1
- package/src/shade/renderer/Renderer.d.ts +11 -0
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +50 -6
- package/src/shade/renderer/camera/orbital/OrbitalCameraController.d.ts +40 -80
- package/src/shade/renderer/camera/orbital/OrbitalCameraController.d.ts.map +1 -1
- package/src/shade/renderer/camera/orbital/OrbitalCameraController.js +197 -147
- package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +3 -3
- package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +1 -1
- package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +6 -6
- package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +1 -1
- package/src/shade/renderer/fluid/query/GPUFluidQueries.d.ts +1 -1
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts +28 -45
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +111 -119
- package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts +22 -3
- package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.js +84 -3
- package/src/shade/renderer/geometry/virtual/proxy/vgeo_proxy_triangle_limit.d.ts +19 -0
- package/src/shade/renderer/geometry/virtual/proxy/vgeo_proxy_triangle_limit.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/proxy/vgeo_proxy_triangle_limit.js +25 -0
- package/src/shade/renderer/geometry/virtual/proxy/vgeo_to_proxy_mesh.d.ts +31 -0
- package/src/shade/renderer/geometry/virtual/proxy/vgeo_to_proxy_mesh.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/proxy/vgeo_to_proxy_mesh.js +343 -0
- package/src/shade/renderer/geometry/virtual/runtime/VirtualGeometry.d.ts +15 -0
- package/src/shade/renderer/geometry/virtual/runtime/VirtualGeometry.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/VirtualGeometry.js +38 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_meshlet_metadata_write.d.ts +17 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_meshlet_metadata_write.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_meshlet_metadata_write.js +29 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_meshlet_batch.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_meshlet_batch.js +7 -13
- package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.d.ts +28 -59
- package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.js +84 -789
- package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.js +1 -8
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts +7 -6
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.js +12 -11
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.d.ts +2 -2
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.js +2 -2
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts +1 -4
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.js +1 -10
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.d.ts +5 -15
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_surface.js +6 -34
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.js +1 -7
- package/src/shade/renderer/hiz/HZBFootprint.d.ts +14 -0
- package/src/shade/renderer/hiz/HZBFootprint.d.ts.map +1 -0
- package/src/shade/renderer/hiz/HZBFootprint.js +16 -0
- package/src/shade/renderer/hiz/HZB_FOOTPRINT_X.d.ts +10 -0
- package/src/shade/renderer/hiz/HZB_FOOTPRINT_X.d.ts.map +1 -0
- package/src/shade/renderer/hiz/HZB_FOOTPRINT_X.js +11 -0
- package/src/shade/renderer/hiz/HZB_FOOTPRINT_Y.d.ts +10 -0
- package/src/shade/renderer/hiz/HZB_FOOTPRINT_Y.d.ts.map +1 -0
- package/src/shade/renderer/hiz/HZB_FOOTPRINT_Y.js +11 -0
- package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts +0 -7
- package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts.map +1 -1
- package/src/shade/renderer/hiz/HierarchicalZBuffer.js +405 -350
- package/src/shade/renderer/hiz/chunk_hzb_footprint_x.d.ts +12 -0
- package/src/shade/renderer/hiz/chunk_hzb_footprint_x.d.ts.map +1 -0
- package/src/shade/renderer/hiz/chunk_hzb_footprint_x.js +27 -0
- package/src/shade/renderer/hiz/chunk_hzb_footprint_y.d.ts +12 -0
- package/src/shade/renderer/hiz/chunk_hzb_footprint_y.d.ts.map +1 -0
- package/src/shade/renderer/hiz/chunk_hzb_footprint_y.js +27 -0
- package/src/shade/renderer/hiz/hzb_footprint_texels.d.ts +14 -0
- package/src/shade/renderer/hiz/hzb_footprint_texels.d.ts.map +1 -0
- package/src/shade/renderer/hiz/hzb_footprint_texels.js +34 -0
- package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts +0 -5
- package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts.map +1 -1
- package/src/shade/renderer/hiz/shader_hzb_reduce_any.js +37 -57
- package/src/shade/renderer/hiz/shader_hzb_reduce_mip0.d.ts +11 -0
- package/src/shade/renderer/hiz/shader_hzb_reduce_mip0.d.ts.map +1 -0
- package/src/shade/renderer/hiz/{shader_hzb_reduce_mip0_clip.js → shader_hzb_reduce_mip0.js} +120 -111
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/material/GPUMaterialManager.d.ts +11 -1
- package/src/shade/renderer/material/GPUMaterialManager.d.ts.map +1 -1
- package/src/shade/renderer/material/GPUMaterialManager.js +16 -8
- package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts +12 -12
- package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts.map +1 -1
- package/src/shade/renderer/material/resident/GPUResidentMaterialContext.js +17 -118
- package/src/shade/renderer/postprocess/gtao/GTAO.d.ts +7 -3
- package/src/shade/renderer/postprocess/gtao/GTAO.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/gtao/GTAO.js +26 -13
- package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.d.ts +14 -0
- package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.js +196 -68
- package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.js +42 -28
- package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.js +429 -414
- package/src/shade/renderer/postprocess/gtao/shader_gtao_spatial_denoise.d.ts +16 -0
- package/src/shade/renderer/postprocess/gtao/shader_gtao_spatial_denoise.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/gtao/shader_gtao_spatial_denoise.js +156 -0
- package/src/shade/renderer/scene/GPUSceneContext.d.ts +2 -2
- package/src/shade/renderer/scene/GPUSceneContext.js +5 -5
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +7 -2
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts +0 -6
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
- package/src/shade/renderer/water/GPUWaterRenderer.js +12 -17
- package/src/shade/renderer/water/medium/graph_water_meshlets.d.ts +35 -0
- package/src/shade/renderer/water/medium/graph_water_meshlets.d.ts.map +1 -0
- package/src/shade/renderer/water/medium/graph_water_meshlets.js +89 -0
- package/src/shade/renderer/water/query/GPUWaterQueries.d.ts +1 -1
- package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
- package/src/shade/renderer/water/shader_water.js +22 -13
- package/src/shade/renderer/water/shader_water_avboit.d.ts.map +1 -1
- package/src/shade/renderer/water/shader_water_avboit.js +7 -7
- package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts +1 -1
- package/src/shade/renderer/water/surface/graph_water_tessellation.js +1 -1
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +9 -1
- package/editor/REWORK_PLAN_2026_08.md +0 -692
- package/src/CODEC_LAYOUT_VERIFICATION.md +0 -419
- package/src/CORRECTNESS_HUNT_2026_07_24.md +0 -142
- package/src/DUPLICATION_AUDIT_2026_08_07/00_core_reuse_surface.md +0 -738
- package/src/DUPLICATION_AUDIT_2026_08_07/A_core_math_geom.md +0 -79
- package/src/DUPLICATION_AUDIT_2026_08_07/B_core_data.md +0 -93
- package/src/DUPLICATION_AUDIT_2026_08_07/C_gfx_render.md +0 -80
- package/src/DUPLICATION_AUDIT_2026_08_07/D_gfx_features.md +0 -164
- package/src/DUPLICATION_AUDIT_2026_08_07/E_physics.md +0 -69
- package/src/DUPLICATION_AUDIT_2026_08_07/F_sound.md +0 -110
- package/src/DUPLICATION_AUDIT_2026_08_07/G_net_save.md +0 -129
- package/src/DUPLICATION_AUDIT_2026_08_07/H_engine_misc.md +0 -72
- package/src/DUPLICATION_AUDIT_2026_08_07/I_generation_view.md +0 -74
- package/src/DUPLICATION_AUDIT_2026_08_07/K_crosscutting.md +0 -169
- package/src/DUPLICATION_AUDIT_2026_08_07.md +0 -254
- package/src/DUPLICATION_AUDIT_REMEDIATION.md +0 -250
- package/src/DUPLICATION_REVIEW_2026_10_24.md +0 -1072
- package/src/REVIEW_2026_08_06/adv-core.md +0 -511
- package/src/REVIEW_2026_08_06/adv-gfx.md +0 -480
- package/src/REVIEW_2026_08_06/adv-view.md +0 -446
- package/src/REVIEW_2026_08_06/api-core.md +0 -296
- package/src/REVIEW_2026_08_06/api-engine.md +0 -195
- package/src/REVIEW_2026_08_06/bvh-phys-sound-net.md +0 -507
- package/src/REVIEW_2026_08_06/core-binary.md +0 -348
- package/src/REVIEW_2026_08_06/core-collection.md +0 -376
- package/src/REVIEW_2026_08_06/core-math.md +0 -221
- package/src/REVIEW_2026_08_06/core-process.md +0 -266
- package/src/REVIEW_2026_08_06/core-science.md +0 -223
- package/src/REVIEW_2026_08_06/engine-ai-nav.md +0 -279
- package/src/REVIEW_2026_08_06/engine-animation.md +0 -167
- package/src/REVIEW_2026_08_06/engine-asset.md +0 -166
- package/src/REVIEW_2026_08_06/engine-ecs.md +0 -920
- package/src/REVIEW_2026_08_06/engine-input.md +0 -197
- package/src/REVIEW_2026_08_06/engine-misc.md +0 -248
- package/src/REVIEW_2026_08_06/engine-terrain.md +0 -52
- package/src/REVIEW_2026_08_06/generation.md +0 -176
- package/src/REVIEW_2026_08_06/geom-2d.md +0 -434
- package/src/REVIEW_2026_08_06/geom-3d.md +0 -117
- package/src/REVIEW_2026_08_06/gfx-gi.md +0 -143
- package/src/REVIEW_2026_08_06/gfx-render.md +0 -740
- package/src/REVIEW_2026_08_06/gfx-texture.md +0 -690
- package/src/REVIEW_2026_08_06/prior-criticals.md +0 -49
- package/src/REVIEW_2026_08_06/prior-highs.md +0 -138
- package/src/REVIEW_2026_08_06/test-gaps.md +0 -364
- package/src/REVIEW_2026_08_06/view.md +0 -667
- package/src/REVIEW_2026_08_06.md +0 -610
- package/src/core/binary/lz4/LZ4_HIGH_COMPRESSION_PLAN_2026_09_14.md +0 -542
- package/src/core/bvh2/bvh3/NOTES.md +0 -2
- package/src/core/bvh8/NOTES.md +0 -63
- package/src/core/cache/wtinylfu/benchmark/CacheWTinylfu.bench.md +0 -243
- package/src/core/color/COLOR_FIX_PLAN_2026_08_28.md +0 -417
- package/src/core/color/COLOR_REVIEW_2026_08_28.md +0 -779
- package/src/core/geom/2d/polygon/TRIANGULATION_DESIGN.md +0 -433
- package/src/core/geom/3d/atlas/ATLAS_PORT_PLAN.md +0 -486
- package/src/core/geom/3d/atlas/BFF_PLAN.md +0 -174
- package/src/core/geom/3d/atlas/REVIEW_02.md +0 -392
- package/src/core/geom/3d/gjk/GJK_REVIEW_NOTES.md +0 -146
- package/src/core/geom/3d/gjk/NOTES.md +0 -8
- package/src/core/geom/3d/topology/TOPO_MESH_RETIREMENT_PLAN.md +0 -135
- package/src/core/geom/GEOMETRY_REVIEW_002_API_ISSUES.md +0 -381
- package/src/core/geom/GEOMETRY_REVIEW_002_NAMING.md +0 -684
- package/src/core/geom/MANIFOLD_COMPARISON_2026_08_01.md +0 -554
- package/src/core/model/reactive/evaluation/PREDICATE_APPLICABILITY_PROPOSAL.md +0 -446
- package/src/engine/REVIEW_2026_07_03.md +0 -211
- package/src/engine/asset/loaders/image/IMAGE_CODEC_REVIEW_2026_08_28.md +0 -815
- package/src/engine/control/first-person/DESIGN.md +0 -658
- package/src/engine/control/first-person/DESIGN_COLLISION.md +0 -382
- package/src/engine/control/first-person/DESIGN_EXTENSIONS.md +0 -563
- package/src/engine/control/first-person/TODO.md +0 -160
- package/src/engine/ecs/ASYNC_SYSTEMS_PROPOSAL.md +0 -531
- package/src/engine/ecs/HIERARCHY_REVIEW.md +0 -717
- package/src/engine/ecs/async/WORKER_SYSTEM_PLAN.md +0 -262
- package/src/engine/ecs/ik/PLAN.md +0 -179
- package/src/engine/ecs/storage/binary/SERIALIZATION_COVERAGE.md +0 -272
- package/src/engine/ecs/storage/binary/object-v2/DESIGN.md +0 -199
- package/src/engine/ecs/transform/TRANSFORM64_MIGRATION_PLAN_2026_09_04.md +0 -521
- package/src/engine/graphics/CONTEXT_LOSS_RECOVERY_PLAN.md +0 -463
- package/src/engine/graphics/ecs/camera/pp/NOTES.md +0 -48
- package/src/engine/graphics/render/frame_graph/CORRECTNESS_FIXES_2026_09_04.md +0 -659
- package/src/engine/graphics/render/frame_graph/FRAME_GRAPH_RECOMMENDATIONS.md +0 -235
- package/src/engine/graphics/sh3/path_tracer/REVIEW_001_ACTION_PLAN.md +0 -490
- package/src/engine/graphics/texture/sampler/compare/FLIP_IMPLEMENTATION_PLAN.md +0 -466
- package/src/engine/input/GAMEPAD_API_PROPOSAL.md +0 -717
- package/src/engine/input/ecs/ism/ISM_DESIGN.md +0 -1523
- package/src/engine/input/ecs/ism/ISM_IMPLEMENTATION_PLAN.md +0 -627
- package/src/engine/navigation/mesh/OVERLAPPING_SURFACES_2026_08_25.md +0 -661
- package/src/engine/navigation/mesh/PATHFINDING_PLAN.md +0 -229
- package/src/engine/network/CONGESTION_CONTROL.md +0 -87
- package/src/engine/network/MESSAGE_TRANSPORT.md +0 -364
- package/src/engine/network/SMOOTHNESS_DESIGN.md +0 -400
- package/src/engine/physics/cloth/MEASUREMENTS.md +0 -5304
- package/src/engine/physics/cloth/PLAN.md +0 -3056
- package/src/engine/physics/fluid/GPU_FLUID_CASCADES_PROPOSAL_2026_10_16.md +0 -1382
- package/src/engine/physics/fluid/REVIEW_02_PLAN.md +0 -243
- package/src/engine/physics/fluid/solver/NOTES.md +0 -46
- package/src/engine/sound/SOUND_EMITTER_RETIREMENT_PLAN.md +0 -536
- package/src/engine/sound/simulation/IMPLEMENTATION_PLAN.md +0 -432
- package/src/engine/sound/simulation/PROBE_PLACEMENT.md +0 -250
- package/src/engine/sound/simulation/PROBE_TRANSFER_RESEARCH.md +0 -322
- package/src/engine/sound/simulation/REFLECTION_IR_PLAN.md +0 -261
- package/src/engine/sound/simulation/VISIBILITY_GRAPH_PLAN.md +0 -121
- package/src/engine/sound/sopra/IMPLEMENTATION_PLAN.md +0 -999
- package/src/format/image/avif/DECISIONS.md +0 -545
- package/src/format/image/jpeg/NOTES.md +0 -3
- package/src/format/scene/gltf/MESHOPT_COMPRESSION_PLAN.md +0 -814
- package/src/generation/COORDINATES.md +0 -54
- package/src/generation/REVIEW_01_ACTION_PLAN.md +0 -628
- package/src/generation/foliage/ANNUAL_SHOOTS_BRIEF_2026_10_25.md +0 -220
- package/src/generation/foliage/CROWN_FILLING_BRIEF_2026_10_26.md +0 -172
- package/src/generation/foliage/CROWN_FULLNESS_BRIEF_2026_10_26.md +0 -86
- package/src/generation/foliage/FOLIAGE_DESIGN.md +0 -547
- package/src/generation/foliage/FOLIAGE_PLAN.md +0 -198
- package/src/generation/foliage/LEAF_ARCHITECTURE_BRIEF_2026_10_26.md +0 -158
- package/src/generation/foliage/LOD_REWORK_BRIEF_2026_10_27.md +0 -521
- package/src/generation/foliage/REAL_TIME_TREES_BRIEF_2026_10_27.md +0 -86
- package/src/generation/foliage/SELF_ORGANIZING_FRAMEWORK_BRIEF_2026_10_26.md +0 -347
- package/src/generation/foliage/SHOOT_SYSTEMS_ALL_SPECIES_BRIEF_2026_10_26.md +0 -248
- package/src/generation/foliage/SPEEDTREE_COMPARISON_2026_10_24.md +0 -694
- package/src/generation/foliage/TWO_FRONT_ENDS_BRIEF_2026_10_28.md +0 -552
- package/src/shade/RENDERER_CONTRACT.md +0 -697
- package/src/shade/SHADER_F16_PROPOSAL_2026_10_24.md +0 -263
- package/src/shade/device/IMMEDIATE_DATA_PLAN_2026_08_28.md +0 -569
- package/src/shade/device/PASS_ENCODER_PROPOSAL_2026_08_31.md +0 -755
- package/src/shade/device/mock/EXTENSION_PROPOSAL_2026_08_22.md +0 -458
- package/src/shade/device/mock/IMPLEMENTATION_PLAN.md +0 -255
- package/src/shade/device/mock/REVIEW_2026_08_22.md +0 -527
- package/src/shade/device/timing/GPU_PROFILER_PROPOSAL_2026_08_28.md +0 -894
- package/src/shade/device/timing/profile/SGPT_FORMAT.md +0 -345
- package/src/shade/renderer/NOTES.md +0 -78
- package/src/shade/renderer/PLAN.md +0 -8
- package/src/shade/renderer/animation/ADDITIVE_BLENDING_PLAN.md +0 -145
- package/src/shade/renderer/animation/SKINNING_FRAME_PLAN.md +0 -357
- package/src/shade/renderer/atmosphere/NOTES.md +0 -6
- package/src/shade/renderer/camera/orbital/MomentumAxis.d.ts +0 -76
- package/src/shade/renderer/camera/orbital/MomentumAxis.d.ts.map +0 -1
- package/src/shade/renderer/camera/orbital/MomentumAxis.js +0 -164
- package/src/shade/renderer/camera/orbital/OrbitalCameraConfig.d.ts +0 -45
- package/src/shade/renderer/camera/orbital/OrbitalCameraConfig.d.ts.map +0 -1
- package/src/shade/renderer/camera/orbital/OrbitalCameraConfig.js +0 -66
- package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts +0 -98
- package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts.map +0 -1
- package/src/shade/renderer/camera/orbital/OrbitalCameraInput.js +0 -184
- package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts +0 -175
- package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts.map +0 -1
- package/src/shade/renderer/camera/orbital/OrbitalCameraRig.js +0 -411
- package/src/shade/renderer/camera/orbital/README.md +0 -81
- package/src/shade/renderer/camera/orbital/index.d.ts +0 -6
- package/src/shade/renderer/camera/orbital/index.d.ts.map +0 -1
- package/src/shade/renderer/camera/orbital/index.js +0 -9
- package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +0 -964
- package/src/shade/renderer/fluid/GPU_FLUID_OCCUPANCY_AND_SOTA_REVIEW_2026_10_26.md +0 -361
- package/src/shade/renderer/geometry/bvh/BLAS_REFIT_BATCH_PLAN.md +0 -619
- package/src/shade/renderer/geometry/meshlet/COMPACTION_PLAN_2026_09_16.md +0 -674
- package/src/shade/renderer/geometry/sdf/NOTES.md +0 -6
- package/src/shade/renderer/geometry/virtual/ATTRIBUTE_PLAN_2026_09_18.md +0 -540
- package/src/shade/renderer/geometry/virtual/MICRON_COMPARISON_2026_08_20.md +0 -305
- package/src/shade/renderer/geometry/virtual/VGEO_FORMAT.md +0 -913
- package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +0 -787
- package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_PLAN.md +0 -481
- package/src/shade/renderer/geometry/virtual/VK_LOD_CLUSTERS_COMPARISON_2026_08_20.md +0 -301
- package/src/shade/renderer/geometry/virtual/WEDGE_PLAN_2026_09_18.md +0 -448
- package/src/shade/renderer/geometry/virtual/runtime/CULL_PLAN_2026_09_16.md +0 -385
- package/src/shade/renderer/geometry/virtual/runtime/CUT_PLAN_2026_09_14.md +0 -656
- package/src/shade/renderer/geometry/virtual/runtime/REVIEW_LEDGER.md +0 -308
- package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN.md +0 -657
- package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN_2026_09_14.md +0 -551
- package/src/shade/renderer/geometry/virtual/runtime/SHADOW_PLAN_2026_09_28.md +0 -529
- package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.d.ts +0 -47
- package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.js +0 -80
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.d.ts +0 -16
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.js +0 -67
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.d.ts +0 -17
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.js +0 -145
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.d.ts +0 -12
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.js +0 -105
- package/src/shade/renderer/global_illumination/lpv/NOTES.md +0 -3
- package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_CLIPMAP_PROPOSAL_2026_10_27.md +0 -4306
- package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_RAYS_VARIABLE_AND_SORTED_SCOPE_2026_10_30.md +0 -410
- package/src/shade/renderer/global_illumination/sharc/NOTES.md +0 -8
- package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +0 -1369
- package/src/shade/renderer/gpu_primitive/bvh/PHASE1_HANDOVER.md +0 -202
- package/src/shade/renderer/gpu_primitive/indirect/NOTES.md +0 -94
- package/src/shade/renderer/hiz/NOTES.md +0 -3
- package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts +0 -8
- package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts.map +0 -1
- package/src/shade/renderer/light/cluster/NOTES.md +0 -11
- package/src/shade/renderer/light/cluster/PROPOSAL_ALGORITHM_2026_10_16.md +0 -524
- package/src/shade/renderer/light/cluster/PROPOSAL_HIERARCHICAL_2026_10_16.md +0 -1101
- package/src/shade/renderer/material/resident/shader_resident_texture_means.d.ts +0 -24
- package/src/shade/renderer/material/resident/shader_resident_texture_means.d.ts.map +0 -1
- package/src/shade/renderer/material/resident/shader_resident_texture_means.js +0 -120
- package/src/shade/renderer/particles/DESIGN.md +0 -1011
- package/src/shade/renderer/particles/EMITTER_GLOBAL_STATE_PLAN_2026_10_29.md +0 -280
- package/src/shade/renderer/particles/ORIENTATION_PLAN_2026_10_15.md +0 -453
- package/src/shade/renderer/path_tracer/PATH_TRACED_MEDIA_PLAN_2026_10_02.md +0 -520
- package/src/shade/renderer/postprocess/bloom/NOTES.md +0 -6
- package/src/shade/renderer/postprocess/fsr/NOTES.md +0 -4
- package/src/shade/renderer/postprocess/gtao/NOTES.md +0 -6
- package/src/shade/renderer/postprocess/nss/NOTES.md +0 -332
- package/src/shade/renderer/postprocess/perspective/NOTES.md +0 -3
- package/src/shade/renderer/postprocess/sscs/NOTES.md +0 -5
- package/src/shade/renderer/postprocess/ssr/NOTES.md +0 -14
- package/src/shade/renderer/postprocess/ssr/REPROJECTION_PROPOSAL.md +0 -286
- package/src/shade/renderer/postprocess/ssr/prefilter/NOTES.md +0 -39
- package/src/shade/renderer/postprocess/taa/NOTES.md +0 -11
- package/src/shade/renderer/postprocess/upscale-dither/NOTES.md +0 -78
- package/src/shade/renderer/postprocess/vrs/NOTES.md +0 -4
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_LEDGER.md +0 -1218
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_PLAN_2026_09_03.md +0 -600
- package/src/shade/renderer/restir/reservoir/NOTES.md +0 -6
- package/src/shade/renderer/shader/chunk/atmosphere/NOTES.md +0 -6
- package/src/shade/renderer/shader/chunk/brdf/FRESNEL_BRIEF_2026_10_16.md +0 -391
- package/src/shade/renderer/shader/chunk/color/tonemap/ACES_TONE_MAPPING_BRIEF_2026_10_17.md +0 -153
- package/src/shade/renderer/shader/chunk/color/tonemap/HDR_TONE_MAPPING_FORMS_BRIEF_2026_10_16.md +0 -322
- package/src/shade/renderer/shader/chunk/color/tonemap/SDR_TONE_MAPPING_BRIEF_2026_10_16.md +0 -247
- package/src/shade/renderer/shader/chunk/fsr/NOTES.md +0 -3
- package/src/shade/renderer/shader/chunk/fsr/spd/NOTES.md +0 -4
- package/src/shade/renderer/shader/chunk/geometry/ray/NOTES.md +0 -4
- package/src/shade/renderer/shader/chunk/material/MULTISCATTER.md +0 -159
- package/src/shade/renderer/shader/chunk/mboit/NOTES.md +0 -38
- package/src/shade/renderer/shader/chunk/spherical_harmonics/l1i/NOTES.md +0 -3
- package/src/shade/renderer/shader/chunk/spherical_harmonics/sampling/NOTES.md +0 -8
- package/src/shade/renderer/shader/compiler/SHADER_SWITCH_PROPOSAL_2026_10_16.md +0 -927
- package/src/shade/renderer/shadow/contact/FINDINGS.md +0 -413
- package/src/shade/renderer/shadow/map/csm/NOTES.md +0 -5
- package/src/shade/renderer/shadow/ray/NOTES.md +0 -31
- package/src/shade/renderer/shadow/sdf/NOTES.md +0 -9
- package/src/shade/renderer/shadow/sdf/brixelizer/NOTES.md +0 -5
- package/src/shade/renderer/shadow/sdf/cascade/NOTES.md +0 -9
- package/src/shade/renderer/shadow/vsm/NOTES.md +0 -12
- package/src/shade/renderer/shadow/vsm/PLAN.md +0 -442
- package/src/shade/renderer/shadow/vsm/REVIEW_LEDGER.md +0 -43
- package/src/shade/renderer/texture/COMPRESSED_TEXTURE_PLAN_2026_09_01.md +0 -2444
- package/src/shade/renderer/texture/mipmaps/NOTES.md +0 -3
- package/src/shade/renderer/volumetrics/NOTES.md +0 -1329
- package/src/shade/renderer/volumetrics/VOLUMETRIC_NOISE_PLAN_2026_10_15.md +0 -336
- package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts +0 -23
- package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +0 -1
- package/src/shade/renderer/water/medium/GPUWaterBodies.js +0 -75
- 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";
|