@woosh/meep-engine 3.60.4 → 3.60.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2602 -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.map +1 -1
- package/src/shade/renderer/Renderer.js +7 -5
- 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 +2 -2
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +2 -2
- package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts +2 -1
- package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.js +18 -1
- 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/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/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 +5 -5
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.js +10 -10
- 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 +7 -0
- package/src/shade/renderer/material/GPUMaterialManager.d.ts.map +1 -1
- package/src/shade/renderer/material/GPUMaterialManager.js +11 -0
- 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/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/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,66 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tunable "feel" parameters for the orbital camera, shared by the control core
|
|
3
|
-
* ({@link OrbitalCameraRig}) and the input adapter ({@link OrbitalCameraInput}).
|
|
4
|
-
* One frozen source of truth so the two layers can never disagree.
|
|
5
|
-
*
|
|
6
|
-
* The model is **direct drive + release momentum** (a "throw", like Google Earth
|
|
7
|
-
* / Cesium), NOT a smoothed-target spring. While dragging, the camera follows
|
|
8
|
-
* input 1:1 (no lag, fully responsive). On release the recent input velocity is
|
|
9
|
-
* carried forward and decays exponentially — the weighty follow-through. See
|
|
10
|
-
* {@link MomentumAxis}.
|
|
11
|
-
*
|
|
12
|
-
* Defaults grounded in the competitor survey:
|
|
13
|
-
* - `momentumDecayHalfLife` ≈ Cesium spin inertia (tau 2.5 → half-life 0.28 s).
|
|
14
|
-
* - `velocityWindow` ≈ Mapbox's 160 ms release-velocity window (a touch shorter).
|
|
15
|
-
* - `zoomStep` 0.9 multiplicative per notch ≈ three.js `pow(0.95, zoomSpeed)`.
|
|
16
|
-
*/
|
|
17
|
-
export const ORBITAL_CAMERA_FEEL_DEFAULTS = Object.freeze({
|
|
18
|
-
// ── momentum / inertia (rotate + pan) ───────────────────────────────────
|
|
19
|
-
// false → motion stops the instant input ends (direct, zero-inertia; the
|
|
20
|
-
// Maya/CAD "precision" feel).
|
|
21
|
-
momentumEnabled: true,
|
|
22
|
-
// seconds for the coast velocity to halve. Larger = longer, heavier glide.
|
|
23
|
-
momentumDecayHalfLife: 0.10,
|
|
24
|
-
// seconds of recent input averaged to derive the throw velocity on release.
|
|
25
|
-
// Averaging (vs. taking the last frame) rejects a single jittery final frame.
|
|
26
|
-
velocityWindow: 0.10,
|
|
27
|
-
// below this angular speed (rad/s) the coast snaps to rest. Pan scales this
|
|
28
|
-
// by the orbit distance so the stop feels the same at any zoom.
|
|
29
|
-
momentumStopSpeed: 0.012,
|
|
30
|
-
|
|
31
|
-
// ── input mapping ───────────────────────────────────────────────────────
|
|
32
|
-
rotateSpeed: 1.0, // gain on pointer-pixels → radians
|
|
33
|
-
panSpeed: 1.0, // gain on pan drag
|
|
34
|
-
zoomStep: 0.9, // multiplicative distance factor per wheel notch (direct/instant)
|
|
35
|
-
invertWheel: false,
|
|
36
|
-
|
|
37
|
-
// ── orbit limits ────────────────────────────────────────────────────────
|
|
38
|
-
minPolar: 1e-6, // pitch clamp (radians), keep off the exact poles
|
|
39
|
-
maxPolar: Math.PI - 1e-6,
|
|
40
|
-
|
|
41
|
-
// ── programmatic framing glide (flyTo); 0 = instant snap ────────────────
|
|
42
|
-
flyToDuration: 0.35,
|
|
43
|
-
|
|
44
|
-
// ── dt safety ───────────────────────────────────────────────────────────
|
|
45
|
-
maxDt: 0.1, // clamp tab-hitch / first-frame spikes (seconds)
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Merge overrides over the defaults to produce a controller config.
|
|
50
|
-
* @param {Partial<typeof ORBITAL_CAMERA_FEEL_DEFAULTS>} [overrides]
|
|
51
|
-
* @returns {typeof ORBITAL_CAMERA_FEEL_DEFAULTS}
|
|
52
|
-
*/
|
|
53
|
-
export function createOrbitalCameraConfig(overrides = {}) {
|
|
54
|
-
return { ...ORBITAL_CAMERA_FEEL_DEFAULTS, ...overrides };
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Ready-made "Precision" profile: no inertia — the camera stops the instant you
|
|
59
|
-
* release (direct mouse-delta control, can stop on a pixel), the Maya/CAD
|
|
60
|
-
* convention.
|
|
61
|
-
* @param {Partial<typeof ORBITAL_CAMERA_FEEL_DEFAULTS>} [overrides]
|
|
62
|
-
* @returns {typeof ORBITAL_CAMERA_FEEL_DEFAULTS}
|
|
63
|
-
*/
|
|
64
|
-
export function createPrecisionProfile(overrides = {}) {
|
|
65
|
-
return createOrbitalCameraConfig({ momentumEnabled: false, ...overrides });
|
|
66
|
-
}
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The INPUT ADAPTER for the orbital camera. Translates pointer/keyboard events
|
|
3
|
-
* into {@link OrbitalCameraRig} intents — no camera state, no kinematics. Input
|
|
4
|
-
* and control stay decoupled, so the rig is testable with plain numbers and this
|
|
5
|
-
* adapter is testable by firing synthetic signals at injected fake devices.
|
|
6
|
-
*
|
|
7
|
-
* A drag is a bracketed gesture: `dragStart` engages the rig (rotate or pan,
|
|
8
|
-
* chosen by which button is down), each `drag` applies a delta directly (1:1),
|
|
9
|
-
* and `dragEnd` releases — handing the rig the recent velocity so it can throw.
|
|
10
|
-
* Continuous WASD is sampled per frame from {@link update}.
|
|
11
|
-
*
|
|
12
|
-
* @author Alex Goldring (orbital rework)
|
|
13
|
-
* @copyright Company Named Limited (c) 2026
|
|
14
|
-
*/
|
|
15
|
-
export class OrbitalCameraInput {
|
|
16
|
-
/**
|
|
17
|
-
* @param {object} deps
|
|
18
|
-
* @param {import("./OrbitalCameraRig.js").OrbitalCameraRig} deps.rig
|
|
19
|
-
* @param {import("../../../../engine/input/devices/PointerDevice.js").PointerDevice} deps.pointer
|
|
20
|
-
* @param {import("../../../../engine/input/devices/KeyboardDevice.js").default} deps.keyboard
|
|
21
|
-
* @param {{ clientHeight: number }} deps.viewport pixel→angle scaling source (canvas/DOM element)
|
|
22
|
-
* @param {{ fov: number }} deps.lens vertical fov in radians (e.g. the PerspectiveCamera)
|
|
23
|
-
* @param {object} deps.config shared feel config
|
|
24
|
-
*/
|
|
25
|
-
constructor({ rig, pointer, keyboard, viewport, lens, config }: {
|
|
26
|
-
rig: import("./OrbitalCameraRig.js").OrbitalCameraRig;
|
|
27
|
-
pointer: import("../../../../engine/input/devices/PointerDevice.js").PointerDevice;
|
|
28
|
-
keyboard: import("../../../../engine/input/devices/KeyboardDevice.js").default;
|
|
29
|
-
viewport: {
|
|
30
|
-
clientHeight: number;
|
|
31
|
-
};
|
|
32
|
-
lens: {
|
|
33
|
-
fov: number;
|
|
34
|
-
};
|
|
35
|
-
config: object;
|
|
36
|
-
});
|
|
37
|
-
rig: import("./OrbitalCameraRig.js").OrbitalCameraRig;
|
|
38
|
-
pointer: import("../../../../engine/input/devices/PointerDevice.js").PointerDevice;
|
|
39
|
-
keyboard: import("../../../../engine/input/devices/KeyboardDevice.js").default;
|
|
40
|
-
viewport: {
|
|
41
|
-
clientHeight: number;
|
|
42
|
-
};
|
|
43
|
-
lens: {
|
|
44
|
-
fov: number;
|
|
45
|
-
};
|
|
46
|
-
config: any;
|
|
47
|
-
_connected: boolean;
|
|
48
|
-
/** @type {'rotate'|'pan'|null} active gesture */
|
|
49
|
-
_mode: 'rotate' | 'pan' | null;
|
|
50
|
-
_onDragStart: any;
|
|
51
|
-
_onDrag: any;
|
|
52
|
-
_onDragEnd: any;
|
|
53
|
-
_onWheel: any;
|
|
54
|
-
_onPinch: any;
|
|
55
|
-
_onCancel: any;
|
|
56
|
-
_cancelTarget: Element;
|
|
57
|
-
/** Subscribe to device signals. Idempotent. */
|
|
58
|
-
connect(): void;
|
|
59
|
-
/** Unsubscribe. Releases any in-flight gesture so the rig doesn't hang engaged. */
|
|
60
|
-
disconnect(): void;
|
|
61
|
-
/**
|
|
62
|
-
* Sample continuous (held-key) input. Called once per frame with the frame dt.
|
|
63
|
-
* @param {number} dt seconds
|
|
64
|
-
*/
|
|
65
|
-
update(dt: number): void;
|
|
66
|
-
_handleDragStart(): void;
|
|
67
|
-
/**
|
|
68
|
-
* @param {{x:number,y:number}} position
|
|
69
|
-
* @param {{x:number,y:number}} _origin
|
|
70
|
-
* @param {{x:number,y:number}} lastPosition
|
|
71
|
-
*/
|
|
72
|
-
_handleDrag(position: {
|
|
73
|
-
x: number;
|
|
74
|
-
y: number;
|
|
75
|
-
}, _origin: {
|
|
76
|
-
x: number;
|
|
77
|
-
y: number;
|
|
78
|
-
}, lastPosition: {
|
|
79
|
-
x: number;
|
|
80
|
-
y: number;
|
|
81
|
-
}): void;
|
|
82
|
-
_handleDragEnd(): void;
|
|
83
|
-
_endGesture(): void;
|
|
84
|
-
_cancelGesture(): void;
|
|
85
|
-
/** @param {{x:number,y:number,z:number}} delta wheel delta (meep normalizes to signs) */
|
|
86
|
-
_handleWheel(delta: {
|
|
87
|
-
x: number;
|
|
88
|
-
y: number;
|
|
89
|
-
z: number;
|
|
90
|
-
}): void;
|
|
91
|
-
/**
|
|
92
|
-
* Forward-compatible pinch handler. `scale` is the finger-spread ratio
|
|
93
|
-
* (>1 spreading = zoom in). Inert until meep dispatches on.pinch.
|
|
94
|
-
* @param {number} scale
|
|
95
|
-
*/
|
|
96
|
-
_handlePinch(scale: number): void;
|
|
97
|
-
}
|
|
98
|
-
//# sourceMappingURL=OrbitalCameraInput.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"OrbitalCameraInput.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/camera/orbital/OrbitalCameraInput.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH;IACI;;;;;;;;OAQG;IACH;QAPkE,GAAG,EAA1D,OAAO,uBAAuB,EAAE,gBAAgB;QACgC,OAAO,EAAvF,OAAO,mDAAmD,EAAE,aAAa;QACE,QAAQ,EAAnF,OAAO,oDAAoD,EAAE,OAAO;QACrC,QAAQ,EAAvC;YAAE,YAAY,EAAE,MAAM,CAAA;SAAE;QACF,IAAI,EAA1B;YAAE,GAAG,EAAE,MAAM,CAAA;SAAE;QACF,MAAM,EAAnB,MAAM;OAqBhB;IAlBG,sDAAc;IACd,mFAAsB;IACtB,+EAAwB;IACxB;sBARuB,MAAM;MAQL;IACxB;aARc,MAAM;MAQJ;IAChB,YAAoB;IAEpB,oBAAuB;IACvB,iDAAiD;IACjD,OADW,QAAQ,GAAC,KAAK,GAAC,IAAI,CACb;IAEjB,kBAAoD;IACpD,aAA0C;IAC1C,gBAAgD;IAChD,cAA4C;IAC5C,cAA4C;IAC5C,eAA+C;IAC/C,uBAAyB;IAG7B,+CAA+C;IAC/C,gBAgBC;IAED,mFAAmF;IACnF,mBAgBC;IAED;;;OAGG;IACH,WAFW,MAAM,QAShB;IAID,yBAQC;IAED;;;;OAIG;IACH,sBAJW;QAAC,CAAC,EAAC,MAAM,CAAC;QAAA,CAAC,EAAC,MAAM,CAAA;KAAC,WACnB;QAAC,CAAC,EAAC,MAAM,CAAC;QAAA,CAAC,EAAC,MAAM,CAAA;KAAC,gBACnB;QAAC,CAAC,EAAC,MAAM,CAAC;QAAA,CAAC,EAAC,MAAM,CAAA;KAAC,QAe7B;IAED,uBAEC;IAED,oBAOC;IAED,uBAMC;IAID,yFAAyF;IACzF,oBADY;QAAC,CAAC,EAAC,MAAM,CAAC;QAAA,CAAC,EAAC,MAAM,CAAC;QAAA,CAAC,EAAC,MAAM,CAAA;KAAC,QAmBvC;IAED;;;;OAIG;IACH,oBAFW,MAAM,QAOhB;CACJ"}
|
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The INPUT ADAPTER for the orbital camera. Translates pointer/keyboard events
|
|
3
|
-
* into {@link OrbitalCameraRig} intents — no camera state, no kinematics. Input
|
|
4
|
-
* and control stay decoupled, so the rig is testable with plain numbers and this
|
|
5
|
-
* adapter is testable by firing synthetic signals at injected fake devices.
|
|
6
|
-
*
|
|
7
|
-
* A drag is a bracketed gesture: `dragStart` engages the rig (rotate or pan,
|
|
8
|
-
* chosen by which button is down), each `drag` applies a delta directly (1:1),
|
|
9
|
-
* and `dragEnd` releases — handing the rig the recent velocity so it can throw.
|
|
10
|
-
* Continuous WASD is sampled per frame from {@link update}.
|
|
11
|
-
*
|
|
12
|
-
* @author Alex Goldring (orbital rework)
|
|
13
|
-
* @copyright Company Named Limited (c) 2026
|
|
14
|
-
*/
|
|
15
|
-
export class OrbitalCameraInput {
|
|
16
|
-
/**
|
|
17
|
-
* @param {object} deps
|
|
18
|
-
* @param {import("./OrbitalCameraRig.js").OrbitalCameraRig} deps.rig
|
|
19
|
-
* @param {import("../../../../engine/input/devices/PointerDevice.js").PointerDevice} deps.pointer
|
|
20
|
-
* @param {import("../../../../engine/input/devices/KeyboardDevice.js").default} deps.keyboard
|
|
21
|
-
* @param {{ clientHeight: number }} deps.viewport pixel→angle scaling source (canvas/DOM element)
|
|
22
|
-
* @param {{ fov: number }} deps.lens vertical fov in radians (e.g. the PerspectiveCamera)
|
|
23
|
-
* @param {object} deps.config shared feel config
|
|
24
|
-
*/
|
|
25
|
-
constructor({ rig, pointer, keyboard, viewport, lens, config }) {
|
|
26
|
-
this.rig = rig;
|
|
27
|
-
this.pointer = pointer;
|
|
28
|
-
this.keyboard = keyboard;
|
|
29
|
-
this.viewport = viewport;
|
|
30
|
-
this.lens = lens;
|
|
31
|
-
this.config = config;
|
|
32
|
-
|
|
33
|
-
this._connected = false;
|
|
34
|
-
/** @type {'rotate'|'pan'|null} active gesture */
|
|
35
|
-
this._mode = null;
|
|
36
|
-
|
|
37
|
-
this._onDragStart = this._handleDragStart.bind(this);
|
|
38
|
-
this._onDrag = this._handleDrag.bind(this);
|
|
39
|
-
this._onDragEnd = this._handleDragEnd.bind(this);
|
|
40
|
-
this._onWheel = this._handleWheel.bind(this);
|
|
41
|
-
this._onPinch = this._handlePinch.bind(this);
|
|
42
|
-
this._onCancel = this._cancelGesture.bind(this);
|
|
43
|
-
this._cancelTarget = null;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/** Subscribe to device signals. Idempotent. */
|
|
47
|
-
connect() {
|
|
48
|
-
if (this._connected) {
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
this._connected = true;
|
|
52
|
-
|
|
53
|
-
this.pointer.on.dragStart.add(this._onDragStart);
|
|
54
|
-
this.pointer.on.drag.add(this._onDrag);
|
|
55
|
-
this.pointer.on.dragEnd.add(this._onDragEnd);
|
|
56
|
-
this.pointer.on.wheel.add(this._onWheel);
|
|
57
|
-
// meep declares on.pinch but does not yet dispatch it (touch users get
|
|
58
|
-
// single-pointer rotate via drag). Wired so pinch works once it lands.
|
|
59
|
-
this.pointer.on.pinch.add(this._onPinch);
|
|
60
|
-
this._cancelTarget = this.pointer.domElement;
|
|
61
|
-
this._cancelTarget.addEventListener("pointercancel", this._onCancel);
|
|
62
|
-
window.addEventListener("blur", this._onCancel);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/** Unsubscribe. Releases any in-flight gesture so the rig doesn't hang engaged. */
|
|
66
|
-
disconnect() {
|
|
67
|
-
if (!this._connected) {
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
this._connected = false;
|
|
71
|
-
|
|
72
|
-
this.pointer.on.dragStart.remove(this._onDragStart);
|
|
73
|
-
this.pointer.on.drag.remove(this._onDrag);
|
|
74
|
-
this.pointer.on.dragEnd.remove(this._onDragEnd);
|
|
75
|
-
this.pointer.on.wheel.remove(this._onWheel);
|
|
76
|
-
this.pointer.on.pinch.remove(this._onPinch);
|
|
77
|
-
this._cancelTarget.removeEventListener("pointercancel", this._onCancel);
|
|
78
|
-
this._cancelTarget = null;
|
|
79
|
-
window.removeEventListener("blur", this._onCancel);
|
|
80
|
-
|
|
81
|
-
this._endGesture();
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Sample continuous (held-key) input. Called once per frame with the frame dt.
|
|
86
|
-
* @param {number} dt seconds
|
|
87
|
-
*/
|
|
88
|
-
update(dt) {
|
|
89
|
-
const keys = this.keyboard.keys;
|
|
90
|
-
const z = (keys.w?.is_down ? 1 : 0) + (keys.s?.is_down ? -1 : 0);
|
|
91
|
-
const x = (keys.a?.is_down ? 1 : 0) + (keys.d?.is_down ? -1 : 0);
|
|
92
|
-
if (x !== 0 || z !== 0) {
|
|
93
|
-
this.rig.truckLocal(x, z, dt);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// ── gesture lifecycle ────────────────────────────────────────────────────
|
|
98
|
-
|
|
99
|
-
_handleDragStart() {
|
|
100
|
-
// pick the gesture by which button is held when the drag begins
|
|
101
|
-
this._mode = this.pointer.mouseButtonRight?.is_down ? "pan" : "rotate";
|
|
102
|
-
if (this._mode === "pan") {
|
|
103
|
-
this.rig.engagePan();
|
|
104
|
-
} else {
|
|
105
|
-
this.rig.engageRotate();
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* @param {{x:number,y:number}} position
|
|
111
|
-
* @param {{x:number,y:number}} _origin
|
|
112
|
-
* @param {{x:number,y:number}} lastPosition
|
|
113
|
-
*/
|
|
114
|
-
_handleDrag(position, _origin, lastPosition) {
|
|
115
|
-
if (this._mode === null) {
|
|
116
|
-
return;
|
|
117
|
-
}
|
|
118
|
-
const dx = lastPosition.x - position.x;
|
|
119
|
-
const dy = lastPosition.y - position.y;
|
|
120
|
-
|
|
121
|
-
if (this._mode === "pan") {
|
|
122
|
-
this.rig.panScreen(dx * this.config.panSpeed, dy * this.config.panSpeed, this.viewport.clientHeight, this.lens.fov);
|
|
123
|
-
} else {
|
|
124
|
-
const scale = (this.config.rotateSpeed * Math.PI * 2) / this.viewport.clientHeight;
|
|
125
|
-
this.rig.rotate(dy * scale, dx * scale); // dPhi from vertical, dTheta from horizontal
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
_handleDragEnd() {
|
|
130
|
-
this._endGesture();
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
_endGesture() {
|
|
134
|
-
if (this._mode === "pan") {
|
|
135
|
-
this.rig.disengagePan();
|
|
136
|
-
} else if (this._mode === "rotate") {
|
|
137
|
-
this.rig.disengageRotate();
|
|
138
|
-
}
|
|
139
|
-
this._mode = null;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
_cancelGesture() {
|
|
143
|
-
if (this._mode === null) {
|
|
144
|
-
return;
|
|
145
|
-
}
|
|
146
|
-
this.rig.cancelGesture();
|
|
147
|
-
this._mode = null;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
// ── zoom ─────────────────────────────────────────────────────────────────
|
|
151
|
-
|
|
152
|
-
/** @param {{x:number,y:number,z:number}} delta wheel delta (meep normalizes to signs) */
|
|
153
|
-
_handleWheel(delta) {
|
|
154
|
-
let max = delta.x;
|
|
155
|
-
if (Math.abs(delta.y) > Math.abs(max)) {
|
|
156
|
-
max = delta.y;
|
|
157
|
-
}
|
|
158
|
-
if (Math.abs(delta.z) > Math.abs(max)) {
|
|
159
|
-
max = delta.z;
|
|
160
|
-
}
|
|
161
|
-
if (max === 0) {
|
|
162
|
-
return;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
let s = Math.sign(max);
|
|
166
|
-
if (this.config.invertWheel) {
|
|
167
|
-
s = -s;
|
|
168
|
-
}
|
|
169
|
-
// scroll down (s>0) → factor>1 → zoom out; multiplicative = scale-uniform
|
|
170
|
-
this.rig.dolly(Math.pow(this.config.zoomStep, -s));
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* Forward-compatible pinch handler. `scale` is the finger-spread ratio
|
|
175
|
-
* (>1 spreading = zoom in). Inert until meep dispatches on.pinch.
|
|
176
|
-
* @param {number} scale
|
|
177
|
-
*/
|
|
178
|
-
_handlePinch(scale) {
|
|
179
|
-
if (typeof scale !== "number" || !(scale > 0)) {
|
|
180
|
-
return;
|
|
181
|
-
}
|
|
182
|
-
this.rig.dolly(1 / scale);
|
|
183
|
-
}
|
|
184
|
-
}
|
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The CONTROL CORE of the orbital camera — pure kinematics with no knowledge of
|
|
3
|
-
* the DOM, input devices, or a wall clock. Drive it with intents, advance it
|
|
4
|
-
* with an explicit `dt`, read a {@link Transform} back out. Unit testable with
|
|
5
|
-
* plain numbers (see `OrbitalCameraRig.spec.js`).
|
|
6
|
-
*
|
|
7
|
-
* Feel model: **direct drive + release momentum** (a "throw"), via
|
|
8
|
-
* {@link MomentumAxis}. A drag is bracketed by `engageRotate`/`disengageRotate`
|
|
9
|
-
* (or pan); between them the orbit angles / target follow input 1:1 — no lag.
|
|
10
|
-
* On disengage the recent input velocity is carried forward and decays to a
|
|
11
|
-
* weighty stop. This is the Google-Earth/Cesium feel, not a spring chasing a
|
|
12
|
-
* goal. Set `config.momentumEnabled = false` for an instant stop (precision).
|
|
13
|
-
*
|
|
14
|
-
* Zoom is applied directly (multiplicative, instant) — wheel notches are
|
|
15
|
-
* discrete impulses, so there is nothing to "catch up" and no lag to hide.
|
|
16
|
-
*
|
|
17
|
-
* @author Alex Goldring (orbital rework)
|
|
18
|
-
* @copyright Company Named Limited (c) 2026
|
|
19
|
-
*/
|
|
20
|
-
export class OrbitalCameraRig {
|
|
21
|
-
/**
|
|
22
|
-
* @param {object} [options]
|
|
23
|
-
* @param {ReturnType<typeof createOrbitalCameraConfig>} [options.config]
|
|
24
|
-
* @param {NumericInterval} [options.distanceLimits]
|
|
25
|
-
* @param {number} [options.movementSpeedScale]
|
|
26
|
-
*/
|
|
27
|
-
constructor({ config, distanceLimits, movementSpeedScale }?: {
|
|
28
|
-
config?: ReturnType<typeof createOrbitalCameraConfig>;
|
|
29
|
-
distanceLimits?: NumericInterval;
|
|
30
|
-
movementSpeedScale?: number;
|
|
31
|
-
});
|
|
32
|
-
config: Readonly<{
|
|
33
|
-
momentumEnabled: true;
|
|
34
|
-
momentumDecayHalfLife: 0.1;
|
|
35
|
-
velocityWindow: 0.1;
|
|
36
|
-
momentumStopSpeed: 0.012; /**
|
|
37
|
-
* @param {object} [options]
|
|
38
|
-
* @param {ReturnType<typeof createOrbitalCameraConfig>} [options.config]
|
|
39
|
-
* @param {NumericInterval} [options.distanceLimits]
|
|
40
|
-
* @param {number} [options.movementSpeedScale]
|
|
41
|
-
*/
|
|
42
|
-
rotateSpeed: 1;
|
|
43
|
-
panSpeed: 1;
|
|
44
|
-
zoomStep: 0.9;
|
|
45
|
-
invertWheel: false;
|
|
46
|
-
minPolar: 0.000001;
|
|
47
|
-
maxPolar: number;
|
|
48
|
-
flyToDuration: 0.35;
|
|
49
|
-
maxDt: 0.1;
|
|
50
|
-
}>;
|
|
51
|
-
distanceLimits: NumericInterval;
|
|
52
|
-
movementSpeedScale: number;
|
|
53
|
-
_phi: MomentumAxis;
|
|
54
|
-
_theta: MomentumAxis;
|
|
55
|
-
_tx: MomentumAxis;
|
|
56
|
-
_ty: MomentumAxis;
|
|
57
|
-
_tz: MomentumAxis;
|
|
58
|
-
distance: number;
|
|
59
|
-
_directDirty: boolean;
|
|
60
|
-
_fly: {
|
|
61
|
-
phi0: number;
|
|
62
|
-
theta0: number;
|
|
63
|
-
dist0: number;
|
|
64
|
-
tx0: number;
|
|
65
|
-
ty0: number;
|
|
66
|
-
tz0: number;
|
|
67
|
-
phi1: number;
|
|
68
|
-
theta1: any;
|
|
69
|
-
dist1: number;
|
|
70
|
-
tx1: number;
|
|
71
|
-
ty1: number;
|
|
72
|
-
tz1: number;
|
|
73
|
-
t: number;
|
|
74
|
-
};
|
|
75
|
-
_basisTransform: Transform64;
|
|
76
|
-
_scratchTransform: Transform64;
|
|
77
|
-
_scratchTarget: Vector3;
|
|
78
|
-
/** Begin an orbit drag (pointer down). Cancels any coast/fly and takes direct control. */
|
|
79
|
-
engageRotate(): void;
|
|
80
|
-
/**
|
|
81
|
-
* Apply an orbit delta directly (1:1). `dPhi` pitches (clamped to the polar
|
|
82
|
-
* range), `dTheta` yaws. Radians.
|
|
83
|
-
* @param {number} dPhi
|
|
84
|
-
* @param {number} dTheta
|
|
85
|
-
*/
|
|
86
|
-
rotate(dPhi: number, dTheta: number): void;
|
|
87
|
-
/** End the orbit drag (pointer up): throw with the recent input velocity (or stop dead). */
|
|
88
|
-
disengageRotate(): void;
|
|
89
|
-
/** Begin a pan drag (pointer down, pan button). */
|
|
90
|
-
engagePan(): void;
|
|
91
|
-
/**
|
|
92
|
-
* Screen-space pan: drag the target in the current view plane, directly (1:1).
|
|
93
|
-
* `dx`/`dy` are pointer-pixel deltas (sign: last − current, "grab the world").
|
|
94
|
-
* @param {number} dx pixels
|
|
95
|
-
* @param {number} dy pixels
|
|
96
|
-
* @param {number} viewportHeight pixels
|
|
97
|
-
* @param {number} fov vertical fov, radians
|
|
98
|
-
*/
|
|
99
|
-
panScreen(dx: number, dy: number, viewportHeight: number, fov: number): void;
|
|
100
|
-
/** End the pan drag: throw the target with the recent velocity (or stop dead). */
|
|
101
|
-
disengagePan(): void;
|
|
102
|
-
/** Abort direct control without throwing, retaining the last applied pose. */
|
|
103
|
-
cancelGesture(): void;
|
|
104
|
-
/**
|
|
105
|
-
* Multiplicative zoom, applied directly. `factor < 1` zooms in, `> 1` out.
|
|
106
|
-
* Scale-uniform and clamped to {@link distanceLimits}.
|
|
107
|
-
* @param {number} factor
|
|
108
|
-
*/
|
|
109
|
-
dolly(factor: number): void;
|
|
110
|
-
/** Set the zoom distance directly (world units), clamped. */
|
|
111
|
-
setDistance(distance: any): void;
|
|
112
|
-
/**
|
|
113
|
-
* Keyboard fly: move the target in the camera-local XZ plane (directly).
|
|
114
|
-
* `x` strafe (±1), `z` forward/back (±1); speed scales with
|
|
115
|
-
* {@link movementSpeedScale} and zoom-out, integrated over `dt`.
|
|
116
|
-
* @param {number} x
|
|
117
|
-
* @param {number} z
|
|
118
|
-
* @param {number} dt seconds
|
|
119
|
-
*/
|
|
120
|
-
truckLocal(x: number, z: number, dt: number): void;
|
|
121
|
-
/**
|
|
122
|
-
* Point the camera at `to` from `from`. Instant by default (snap), or an
|
|
123
|
-
* eased glide over `config.flyToDuration` when `animate` is true.
|
|
124
|
-
* @param {Vector3} from eye position
|
|
125
|
-
* @param {Vector3} to look-at target
|
|
126
|
-
* @param {object} [opts]
|
|
127
|
-
* @param {boolean} [opts.animate=false]
|
|
128
|
-
*/
|
|
129
|
-
frameTo(from: Vector3, to: Vector3, { animate }?: {
|
|
130
|
-
animate?: boolean;
|
|
131
|
-
}): void;
|
|
132
|
-
/**
|
|
133
|
-
* Advance one frame. Returns whether the pose changed (so the caller can skip
|
|
134
|
-
* a redundant transform write when the camera is fully at rest).
|
|
135
|
-
* @param {number} dt seconds
|
|
136
|
-
* @returns {boolean}
|
|
137
|
-
*/
|
|
138
|
-
update(dt: number): boolean;
|
|
139
|
-
/**
|
|
140
|
-
* Write the current pose into `out` (position + look rotation), preserving
|
|
141
|
-
* its scale. Returns `out`.
|
|
142
|
-
* @param {Transform} out
|
|
143
|
-
* @returns {Transform}
|
|
144
|
-
*/
|
|
145
|
-
composeTransform(out: Transform): Transform;
|
|
146
|
-
get phi(): number;
|
|
147
|
-
get theta(): number;
|
|
148
|
-
/** True when nothing is engaged, coasting, or flying. */
|
|
149
|
-
get isAtRest(): boolean;
|
|
150
|
-
/**
|
|
151
|
-
* Current target. Writes into `out` if given (no allocation), else a shared
|
|
152
|
-
* scratch vector — copy it if you need to retain it.
|
|
153
|
-
* @param {Vector3} [out]
|
|
154
|
-
* @returns {Vector3}
|
|
155
|
-
*/
|
|
156
|
-
getTarget(out?: Vector3): Vector3;
|
|
157
|
-
_advanceFly(dt: any): boolean;
|
|
158
|
-
_deriveOrbit(from: any, to: any): {
|
|
159
|
-
phi: number;
|
|
160
|
-
theta: number;
|
|
161
|
-
distance: number;
|
|
162
|
-
};
|
|
163
|
-
_currentTarget(): Vector3;
|
|
164
|
-
/** Matrix of the current pose, for deriving the pan/truck view basis. */
|
|
165
|
-
_currentBasisMatrix(): Float64Array;
|
|
166
|
-
_poseToTransform(out: any, phi: any, theta: any, radius: any, target: any): void;
|
|
167
|
-
/** Representative of `target` angle nearest `current` (shortest arc). */
|
|
168
|
-
_shortestAzimuth(target: any, current: any): any;
|
|
169
|
-
}
|
|
170
|
-
import { NumericInterval } from "../../../../core/math/interval/NumericInterval.js";
|
|
171
|
-
import { MomentumAxis } from "./MomentumAxis.js";
|
|
172
|
-
import { Transform64 } from "../../../../engine/ecs/transform/Transform64.js";
|
|
173
|
-
import Vector3 from "../../../../core/geom/Vector3.js";
|
|
174
|
-
import { createOrbitalCameraConfig } from "./OrbitalCameraConfig.js";
|
|
175
|
-
//# sourceMappingURL=OrbitalCameraRig.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"OrbitalCameraRig.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/camera/orbital/OrbitalCameraRig.js"],"names":[],"mappings":"AAYA;;;;;;;;;;;;;;;;;;GAkBG;AACH;IACI;;;;;OAKG;IACH;QAJkE,MAAM,GAA7D,WAAW,gCAAgC,CAAC;QAClB,cAAc,GAAxC,eAAe;QACE,kBAAkB,GAAnC,MAAM;OA4BhB;IAzBG;;;;kCAPJ;;;;;WAKG;;;;;;;;;OAEqB;IACpB,gCAAsE;IACtE,2BAA4C;IAG5C,mBAAyC;IACzC,qBAAiC;IACjC,kBAA8B;IAC9B,kBAA8B;IAC9B,kBAA8B;IAG9B,iBAAiB;IAIjB,sBAAyB;IAGzB;;;;;;;;;;;;;;MAAgB;IAGhB,6BAAwC;IACxC,+BAA0C;IAC1C,wBAAmC;IAOvC,0FAA0F;IAC1F,qBAIC;IAED;;;;;OAKG;IACH,aAHW,MAAM,UACN,MAAM,QAKhB;IAED,4FAA4F;IAC5F,wBAGC;IAMD,mDAAmD;IACnD,kBAKC;IAED;;;;;;;OAOG;IACH,cALW,MAAM,MACN,MAAM,kBACN,MAAM,OACN,MAAM,QAsBhB;IAED,kFAAkF;IAClF,qBAMC;IAED,8EAA8E;IAC9E,sBAQC;IAMD;;;;OAIG;IACH,cAFW,MAAM,QAQhB;IAED,6DAA6D;IAC7D,iCAGC;IAED;;;;;;;OAOG;IACH,cAJW,MAAM,KACN,MAAM,MACN,MAAM,QAuBhB;IAMD;;;;;;;OAOG;IACH,cALW,OAAO,MACP,OAAO;QAEQ,OAAO,GAAtB,OAAO;aAyBjB;IAMD;;;;;OAKG;IACH,WAHW,MAAM,GACJ,OAAO,CAoCnB;IAED;;;;;OAKG;IACH,4CASC;IAID,kBAAqC;IACrC,oBAAyC;IACzC,yDAAyD;IACzD,wBAQC;IAED;;;;;OAKG;IACH,gBAHW,OAAO,GACL,OAAO,CAMnB;IAMD,8BAiBC;IAED;;;;MAaC;IAED,0BAGC;IAED,yEAAyE;IACzE,oCAOC;IAED,iFAYC;IAED,yEAAyE;IACzE,iDAIC;CACJ;gCAtZ+B,mDAAmD;6BAGtD,mBAAmB;4BADpB,iDAAiD;oBADzD,kCAAkC;0CAGZ,0BAA0B"}
|