@woosh/meep-engine 3.17.2 → 3.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/editor/actions/concrete/ComponentAddAction.d.ts +1 -0
- package/editor/actions/concrete/ComponentAddAction.d.ts.map +1 -1
- package/editor/actions/concrete/ComponentAddAction.js +4 -0
- package/editor/actions/concrete/ComponentRemoveAction.d.ts +1 -0
- package/editor/actions/concrete/ComponentRemoveAction.d.ts.map +1 -1
- package/editor/actions/concrete/ComponentRemoveAction.js +4 -0
- package/editor/actions/concrete/EntityCreateAction.d.ts +1 -0
- package/editor/actions/concrete/EntityCreateAction.d.ts.map +1 -1
- package/editor/actions/concrete/EntityCreateAction.js +7 -0
- package/editor/actions/concrete/EntityRemoveAction.d.ts +1 -0
- package/editor/actions/concrete/EntityRemoveAction.d.ts.map +1 -1
- package/editor/actions/concrete/EntityRemoveAction.js +4 -0
- package/editor/actions/concrete/PatchTerrainHeightAction.d.ts +10 -0
- package/editor/actions/concrete/PatchTerrainHeightAction.d.ts.map +1 -1
- package/editor/actions/concrete/PatchTerrainHeightAction.js +107 -85
- package/editor/actions/concrete/TransformModifyAction.d.ts +1 -0
- package/editor/actions/concrete/TransformModifyAction.d.ts.map +1 -1
- package/editor/actions/concrete/TransformModifyAction.js +4 -0
- package/editor/particles/effect/ParticleEffectDocument.d.ts.map +1 -1
- package/editor/particles/effect/ParticleEffectDocument.js +10 -6
- package/editor/particles/effect/ParticleReferenceSimulation.d.ts.map +1 -1
- package/editor/particles/effect/ParticleReferenceSimulation.js +98 -4
- package/editor/particles/effect/make_starter_particle_effect.d.ts.map +1 -1
- package/editor/particles/effect/make_starter_particle_effect.js +0 -2
- package/editor/tools/engine/ToolEngine.d.ts +30 -0
- package/editor/tools/engine/ToolEngine.d.ts.map +1 -1
- package/editor/tools/engine/ToolEngine.js +257 -188
- package/editor/view/ecs/EntityList.d.ts.map +1 -1
- package/editor/view/ecs/EntityList.js +6 -5
- package/editor/view/particles/effect/ParticleEmitterInspectorView.d.ts.map +1 -1
- package/editor/view/particles/effect/ParticleEmitterInspectorView.js +17 -9
- package/package.json +1 -1
- package/src/CODEC_LAYOUT_VERIFICATION.md +1 -2
- package/src/core/binary/meshopt/MESHOPT_VERTEX_BLOCK.d.ts +56 -0
- package/src/core/binary/meshopt/MESHOPT_VERTEX_BLOCK.d.ts.map +1 -0
- package/src/core/binary/meshopt/MESHOPT_VERTEX_BLOCK.js +73 -0
- package/src/core/binary/meshopt/meshopt_decode_vertex_buffer.d.ts.map +1 -1
- package/src/core/binary/meshopt/meshopt_decode_vertex_buffer.js +18 -63
- package/src/core/binary/meshopt/meshopt_encode_byte_group.d.ts +53 -0
- package/src/core/binary/meshopt/meshopt_encode_byte_group.d.ts.map +1 -0
- package/src/core/binary/meshopt/meshopt_encode_byte_group.js +140 -0
- package/src/core/binary/meshopt/meshopt_encode_data_block.d.ts +32 -0
- package/src/core/binary/meshopt/meshopt_encode_data_block.d.ts.map +1 -0
- package/src/core/binary/meshopt/meshopt_encode_data_block.js +77 -0
- package/src/core/binary/meshopt/meshopt_encode_index_sequence.d.ts +46 -0
- package/src/core/binary/meshopt/meshopt_encode_index_sequence.d.ts.map +1 -0
- package/src/core/binary/meshopt/meshopt_encode_index_sequence.js +146 -0
- package/src/core/binary/meshopt/meshopt_encode_vertex_buffer.d.ts +40 -0
- package/src/core/binary/meshopt/meshopt_encode_vertex_buffer.d.ts.map +1 -0
- package/src/core/binary/meshopt/meshopt_encode_vertex_buffer.js +700 -0
- package/src/core/binary/meshopt/meshopt_write_uint_var.d.ts +24 -0
- package/src/core/binary/meshopt/meshopt_write_uint_var.d.ts.map +1 -0
- package/src/core/binary/meshopt/meshopt_write_uint_var.js +39 -0
- package/src/core/math/random/seededRandom_Mulberry32.d.ts.map +1 -1
- package/src/core/math/random/seededRandom_Mulberry32.js +4 -2
- package/src/core/process/undo/Action.d.ts +19 -0
- package/src/core/process/undo/Action.d.ts.map +1 -1
- package/src/core/process/undo/Action.js +17 -0
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +78 -0
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -0
- package/src/engine/graphics3/GPUParticleEmitterSystem.js +310 -0
- package/src/engine/graphics3/GraphicsEngine.d.ts +17 -0
- package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -1
- package/src/engine/graphics3/GraphicsEngine.js +30 -10
- package/src/engine/graphics3/particles/particle_gpu_records.d.ts.map +1 -1
- package/src/engine/graphics3/particles/particle_gpu_records.js +0 -2
- package/src/engine/interpolation/InterpolationSystem.d.ts +7 -0
- package/src/engine/interpolation/InterpolationSystem.d.ts.map +1 -1
- package/src/engine/interpolation/InterpolationSystem.js +10 -0
- package/src/engine/network/NetworkSession.d.ts.map +1 -1
- package/src/engine/network/NetworkSession.js +14 -34
- package/src/engine/network/time/RenderPlayout.d.ts +76 -0
- package/src/engine/network/time/RenderPlayout.d.ts.map +1 -0
- package/src/engine/network/time/RenderPlayout.js +163 -0
- package/src/engine/network/transport/adapters/WebSocketTransport.d.ts.map +1 -1
- package/src/engine/network/transport/adapters/WebSocketTransport.js +11 -4
- package/src/engine/physics/ecs/PhysicsSystem.d.ts +4 -12
- package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
- package/src/engine/physics/ecs/PhysicsSystem.js +39 -13
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/engine/sound/simulation/core/VolumeField.d.ts.map +1 -1
- package/src/engine/sound/simulation/core/VolumeField.js +4 -1
- package/src/format/scene/gltf/MESHOPT_COMPRESSION_PLAN.md +23 -2
- package/src/shade/playground/particle_system/README.md +139 -139
- package/src/shade/playground/particle_system/particle_prototype.d.ts.map +1 -1
- package/src/shade/playground/particle_system/particle_prototype.js +0 -2
- package/src/shade/playground/particle_system/particle_scene.d.ts +6 -9
- package/src/shade/playground/particle_system/particle_scene.d.ts.map +1 -1
- package/src/shade/playground/particle_system/particle_scene.js +6 -13
- package/src/shade/playground/ssr_reprojection/README.md +103 -0
- package/src/shade/playground/ssr_reprojection/SpatialFilterProbe.d.ts +17 -0
- package/src/shade/playground/ssr_reprojection/SpatialFilterProbe.d.ts.map +1 -0
- package/src/shade/playground/ssr_reprojection/SpatialFilterProbe.js +68 -0
- package/src/shade/playground/ssr_reprojection/index.html +79 -0
- package/src/shade/playground/ssr_reprojection/main.d.ts +2 -0
- package/src/shade/playground/ssr_reprojection/main.d.ts.map +1 -0
- package/src/shade/playground/ssr_reprojection/main.js +245 -0
- package/src/shade/playground/ssr_reprojection/scene.d.ts +18 -0
- package/src/shade/playground/ssr_reprojection/scene.d.ts.map +1 -0
- package/src/shade/playground/ssr_reprojection/scene.js +51 -0
- package/src/shade/renderer/Renderer.d.ts +2 -23
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +185 -218
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts +5 -8
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
- package/src/shade/renderer/animation/GPUAnimationManager.js +12 -12
- package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUTypedTable.js +6 -0
- package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +7 -0
- package/src/shade/renderer/global_illumination/brick4/gpu/draw/chunk_brick4_sample_specular.d.ts +4 -0
- package/src/shade/renderer/global_illumination/brick4/gpu/draw/chunk_brick4_sample_specular.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/brick4/gpu/draw/chunk_brick4_sample_specular.js +51 -0
- package/src/shade/renderer/global_illumination/brick4/gpu/draw/shader_brick4_specular.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/brick4/gpu/draw/shader_brick4_specular.js +5 -35
- package/src/shade/renderer/particles/DESIGN.md +703 -514
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts +16 -4
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
- package/src/shade/renderer/particles/GPUParticleSystem.js +1189 -991
- package/src/shade/renderer/particles/ParticleConstants.d.ts +64 -0
- package/src/shade/renderer/particles/ParticleConstants.d.ts.map +1 -1
- package/src/shade/renderer/particles/ParticleConstants.js +71 -0
- package/src/shade/renderer/particles/bounds/chunk_particle_bounds.d.ts +57 -0
- package/src/shade/renderer/particles/bounds/chunk_particle_bounds.d.ts.map +1 -0
- package/src/shade/renderer/particles/bounds/chunk_particle_bounds.js +181 -0
- package/src/shade/renderer/particles/bounds/chunk_particle_bounds_unknown.d.ts +7 -0
- package/src/shade/renderer/particles/bounds/chunk_particle_bounds_unknown.d.ts.map +1 -0
- package/src/shade/renderer/particles/bounds/chunk_particle_bounds_unknown.js +12 -0
- package/src/shade/renderer/particles/bounds/graph_particle_bounds.d.ts +33 -0
- package/src/shade/renderer/particles/bounds/graph_particle_bounds.d.ts.map +1 -0
- package/src/shade/renderer/particles/bounds/graph_particle_bounds.js +67 -0
- package/src/shade/renderer/particles/bounds/shader_particle_bounds.d.ts +40 -0
- package/src/shade/renderer/particles/bounds/shader_particle_bounds.d.ts.map +1 -0
- package/src/shade/renderer/particles/bounds/shader_particle_bounds.js +187 -0
- package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts +15 -2
- package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts.map +1 -1
- package/src/shade/renderer/particles/coherence/graph_particle_bucket.js +14 -8
- package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.d.ts +58 -4
- package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.d.ts.map +1 -1
- package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.js +79 -4
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STATE.d.ts +23 -1
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STATE.d.ts.map +1 -1
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STATE.js +35 -2
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts +4 -2
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.js +5 -8
- package/src/shade/renderer/particles/data/particle_emitter_record.d.ts.map +1 -1
- package/src/shade/renderer/particles/data/particle_emitter_record.js +0 -6
- package/src/shade/renderer/particles/graph_particles.d.ts +25 -3
- package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph_particles.js +108 -31
- package/src/shade/renderer/particles/graph_particles_avboit.d.ts +6 -4
- package/src/shade/renderer/particles/graph_particles_avboit.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph_particles_avboit.js +5 -5
- package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +5 -0
- package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/EmitterRegistry.js +27 -6
- package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts +4 -0
- package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.js +6 -1
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +35 -27
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/ParticleEmitter.js +424 -425
- package/src/shade/renderer/particles/shaders/chunk_particle_emitter_warmup.d.ts +20 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_emitter_warmup.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_render_math.d.ts +4 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_render_math.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/chunk_particle_render_math.js +38 -2
- package/src/shade/renderer/particles/shaders/chunk_particle_spawn_budget.d.ts +22 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_spawn_budget.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_spawn_budget.js +42 -0
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.js +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_occupancy.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_occupancy.js +53 -22
- package/src/shade/renderer/particles/shaders/shader_particle_emitter_tick.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_emitter_tick.js +213 -216
- package/src/shade/renderer/particles/shaders/shader_particle_reclaim.d.ts +50 -0
- package/src/shade/renderer/particles/shaders/shader_particle_reclaim.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/shader_particle_render.js +1 -1
- package/src/shade/renderer/particles/warmup/chunk_particle_warmup_step.d.ts +36 -0
- package/src/shade/renderer/particles/warmup/chunk_particle_warmup_step.d.ts.map +1 -0
- package/src/shade/renderer/particles/warmup/chunk_particle_warmup_step.js +102 -0
- package/src/shade/renderer/particles/warmup/graph_particle_warmup.d.ts +102 -0
- package/src/shade/renderer/particles/warmup/graph_particle_warmup.d.ts.map +1 -0
- package/src/shade/renderer/particles/warmup/graph_particle_warmup.js +329 -0
- package/src/shade/renderer/particles/warmup/shader_particle_warmup.d.ts +112 -0
- package/src/shade/renderer/particles/warmup/shader_particle_warmup.d.ts.map +1 -0
- package/src/shade/renderer/particles/warmup/shader_particle_warmup.js +318 -0
- package/src/shade/renderer/particles/warmup/shader_particle_warmup_advance.d.ts +35 -0
- package/src/shade/renderer/particles/warmup/shader_particle_warmup_advance.d.ts.map +1 -0
- package/src/shade/renderer/particles/warmup/shader_particle_warmup_advance.js +108 -0
- package/src/shade/renderer/particles/warmup/shader_particle_warmup_advance_wide.d.ts +3 -0
- package/src/shade/renderer/particles/warmup/shader_particle_warmup_advance_wide.d.ts.map +1 -0
- package/src/shade/renderer/particles/warmup/shader_particle_warmup_advance_wide.js +70 -0
- package/src/shade/renderer/particles/warmup/warmup_schedule.d.ts +62 -0
- package/src/shade/renderer/particles/warmup/warmup_schedule.d.ts.map +1 -0
- package/src/shade/renderer/particles/warmup/warmup_schedule.js +55 -0
- package/src/shade/renderer/postprocess/PostProcess.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/PostProcess.js +2 -1
- package/src/shade/renderer/postprocess/ssr/REPROJECTION_PROPOSAL.md +286 -0
- package/src/shade/renderer/postprocess/ssr/SSR.d.ts +57 -21
- package/src/shade/renderer/postprocess/ssr/SSR.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/SSR.js +230 -129
- package/src/shade/renderer/postprocess/ssr/SSRReprojectionMode.d.ts +11 -0
- package/src/shade/renderer/postprocess/ssr/SSRReprojectionMode.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/ssr/SSRReprojectionMode.js +6 -0
- package/src/shade/renderer/postprocess/ssr/chunk_ssr_metadata.d.ts +4 -0
- package/src/shade/renderer/postprocess/ssr/chunk_ssr_metadata.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/ssr/chunk_ssr_metadata.js +32 -0
- package/src/shade/renderer/postprocess/ssr/chunk_ssr_spatial_variance.d.ts +4 -0
- package/src/shade/renderer/postprocess/ssr/chunk_ssr_spatial_variance.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/ssr/chunk_ssr_spatial_variance.js +41 -0
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_reprojection.d.ts +3 -0
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_reprojection.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_reprojection.js +30 -0
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_sample_history.d.ts +4 -0
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_sample_history.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_sample_history.js +70 -0
- package/src/shade/renderer/postprocess/ssr/resolve/build_ssr_resolve_shader.d.ts +21 -0
- package/src/shade/renderer/postprocess/ssr/resolve/build_ssr_resolve_shader.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/ssr/resolve/build_ssr_resolve_shader.js +363 -0
- package/src/shade/renderer/postprocess/ssr/resolve/chunk_get_neighbour_weight.js +1 -1
- package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_Brick4.d.ts +2 -0
- package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_Brick4.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_Brick4.js +24 -0
- package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_IBL.d.ts +1 -6
- package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_IBL.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_IBL.js +16 -332
- package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_LPV.d.ts +1 -6
- package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_LPV.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_LPV.js +25 -358
- package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.d.ts +0 -5
- package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.js +201 -276
- package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts +1 -0
- package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js +167 -143
- package/src/shade/renderer/shader/graph/graph_create_buffer.d.ts +15 -0
- package/src/shade/renderer/shader/graph/graph_create_buffer.d.ts.map +1 -0
- package/src/shade/renderer/shader/graph/graph_create_buffer.js +20 -0
- package/src/shade/renderer/view/GPUViewContext.d.ts +3 -4
- package/src/shade/renderer/view/GPUViewContext.d.ts.map +1 -1
- package/src/shade/renderer/view/GPUViewContext.js +5 -5
- package/src/core/binary/meshopt/__meshopt_test_streams.d.ts +0 -24
- package/src/core/binary/meshopt/__meshopt_test_streams.d.ts.map +0 -1
- package/src/core/binary/meshopt/__meshopt_test_streams.js +0 -237
- package/src/core/geom/3d/atlas/atlas_test_fixtures.d.ts +0 -84
- package/src/core/geom/3d/atlas/atlas_test_fixtures.d.ts.map +0 -1
- package/src/core/geom/3d/atlas/atlas_test_fixtures.js +0 -266
- package/src/engine/asset/loaders/gltf_test_fixtures.d.ts +0 -97
- package/src/engine/asset/loaders/gltf_test_fixtures.d.ts.map +0 -1
- package/src/engine/asset/loaders/gltf_test_fixtures.js +0 -359
- package/src/shade/renderer/animation/skin_test_fixtures.d.ts +0 -86
- package/src/shade/renderer/animation/skin_test_fixtures.d.ts.map +0 -1
- package/src/shade/renderer/animation/skin_test_fixtures.js +0 -250
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_test_fixtures.d.ts +0 -16
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_test_fixtures.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_test_fixtures.js +0 -27
- package/src/shade/renderer/particles/particle_test_fixtures.d.ts +0 -151
- package/src/shade/renderer/particles/particle_test_fixtures.d.ts.map +0 -1
- package/src/shade/renderer/particles/particle_test_fixtures.js +0 -229
- package/src/shade/renderer/particles/shaders/chunk_particle_emitter_world_sphere.js +0 -23
- package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.js +0 -457
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InterpolationSystem.d.ts","sourceRoot":"","sources":["../../../../src/engine/interpolation/InterpolationSystem.js"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH;IAOI;;OAEG;IACH,0DAFW;QAAE,qBAAqB,CAAC,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,EA6CvE;IAnDD,sCAA8B;IAC9B,oEAEE;IAQE;;;;OAIG;IACH,KAFU,gBAAgB,CAEkD;IAE5E;;;;;OAKG;IACH,mBAA2B;IAE3B;;;;OAIG;IACH,kBAAmC;IAGnC;;;;;;;OAOG;IACH,kBAA0B;IAE1B;;;;;OAKG;IACH,yBAAiC;IAGrC;;;;;;;;;;;OAWG;IACH,yBAJW,MAAM,OACN,gBAAgB,UAChB,MAAM;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,QAI7D;IASD;;;OAGG;IACH,mBAHW,YAAY,UACZ,MAAM,QAShB;IAED;;;OAGG;IACH,qBAHW,YAAY,UACZ,MAAM,QAIhB;IAED,sBA0FC;IAGL;;;OAGG;IACH,gCAFU,OAAO,CAEkC;CANlD;
|
|
1
|
+
{"version":3,"file":"InterpolationSystem.d.ts","sourceRoot":"","sources":["../../../../src/engine/interpolation/InterpolationSystem.js"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH;IAOI;;OAEG;IACH,0DAFW;QAAE,qBAAqB,CAAC,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,EA6CvE;IAnDD,sCAA8B;IAC9B,oEAEE;IAQE;;;;OAIG;IACH,KAFU,gBAAgB,CAEkD;IAE5E;;;;;OAKG;IACH,mBAA2B;IAE3B;;;;OAIG;IACH,kBAAmC;IAGnC;;;;;;;OAOG;IACH,kBAA0B;IAE1B;;;;;OAKG;IACH,yBAAiC;IAGrC;;;;;;;;;;;OAWG;IACH,yBAJW,MAAM,OACN,gBAAgB,UAChB,MAAM;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,QAI7D;IAED;;;;;OAKG;IACH,2BAHW,MAAM,GACJ,OAAO,CAInB;IASD;;;OAGG;IACH,mBAHW,YAAY,UACZ,MAAM,QAShB;IAED;;;OAGG;IACH,qBAHW,YAAY,UACZ,MAAM,QAIhB;IAED,sBA0FC;IAGL;;;OAGG;IACH,gCAFU,OAAO,CAEkC;CANlD;uBAxOsB,kBAAkB;6BAEyC,mBAAmB;4CAHzD,iDAAiD;iCAE5D,uBAAuB"}
|
|
@@ -104,6 +104,16 @@ export class InterpolationSystem extends System {
|
|
|
104
104
|
this.__sources.set(sourceId, { log, sample });
|
|
105
105
|
}
|
|
106
106
|
|
|
107
|
+
/**
|
|
108
|
+
* Forget a source (its peer left). Entities still marked with it are left where they are
|
|
109
|
+
* until their marker goes; the system does not blend from a source it does not have.
|
|
110
|
+
* @param {number} sourceId
|
|
111
|
+
* @returns {boolean} whether it was registered
|
|
112
|
+
*/
|
|
113
|
+
unregisterSource(sourceId) {
|
|
114
|
+
return this.__sources.delete(sourceId);
|
|
115
|
+
}
|
|
116
|
+
|
|
107
117
|
/**
|
|
108
118
|
* @param {EntityManager} entityManager
|
|
109
119
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NetworkSession.d.ts","sourceRoot":"","sources":["../../../../src/engine/network/NetworkSession.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"NetworkSession.d.ts","sourceRoot":"","sources":["../../../../src/engine/network/NetworkSession.js"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,7 @@ import { InterpolationLog } from "../interpolation/InterpolationLog.js";
|
|
|
18
18
|
import { SimAction } from "./sim/SimAction.js";
|
|
19
19
|
import { snapshotter_emit } from "./sim/Snapshotter.js";
|
|
20
20
|
import { AdaptiveRenderDelay } from "./time/AdaptiveRenderDelay.js";
|
|
21
|
+
import { RenderPlayout } from "./time/RenderPlayout.js";
|
|
21
22
|
import { TimeDilation } from "./time/TimeDilation.js";
|
|
22
23
|
|
|
23
24
|
/**
|
|
@@ -65,7 +66,6 @@ const DEFAULT_INITIAL_RENDER_DELAY_FRAMES = 6;
|
|
|
65
66
|
* orchestrator, so it is cheap to grow).
|
|
66
67
|
*/
|
|
67
68
|
const DEFAULT_ACTION_LOG_FRAME_CAPACITY = 32;
|
|
68
|
-
const PULL_PER_MS = 0.0005; // wall-clock low-pass on render frame state machine
|
|
69
69
|
const MAX_CLIENT_DILATED_TICKS_PER_STEP = 3;
|
|
70
70
|
const MAX_FIXED_STEPS_PER_TICK = 8;
|
|
71
71
|
|
|
@@ -207,9 +207,12 @@ export class NetworkSession {
|
|
|
207
207
|
|
|
208
208
|
// ---- Render-frame interpolation state ----
|
|
209
209
|
|
|
210
|
-
/**
|
|
211
|
-
|
|
212
|
-
|
|
210
|
+
/**
|
|
211
|
+
* The render-delayed playhead over the remote frame stream (latest frame, adaptive delay,
|
|
212
|
+
* smoothed head). Shared with anything else that plays out a fixed-period stream.
|
|
213
|
+
* @private @type {RenderPlayout}
|
|
214
|
+
*/
|
|
215
|
+
#playout;
|
|
213
216
|
|
|
214
217
|
/**
|
|
215
218
|
* Set after `#render_interpolated_entities` writes interp values into
|
|
@@ -532,6 +535,7 @@ export class NetworkSession {
|
|
|
532
535
|
safety_multiplier: 2.0,
|
|
533
536
|
decay_per_sample_ms: 1.0,
|
|
534
537
|
});
|
|
538
|
+
this.#playout = new RenderPlayout({ tick_period_ms: this.tick_period_ms, delay: this.#adaptive_render_delay });
|
|
535
539
|
|
|
536
540
|
this.#scratch_send_buf = new BinaryBuffer();
|
|
537
541
|
this.#scratch_send_buf.setCapacity(SCRATCH_BUFFER_BYTES);
|
|
@@ -950,7 +954,7 @@ export class NetworkSession {
|
|
|
950
954
|
// we don't speak is one the host has to time out.
|
|
951
955
|
const token = this.session_token;
|
|
952
956
|
if (token !== null || this.#has_ever_connected) {
|
|
953
|
-
const last_acked = Math.max(0, this.#
|
|
957
|
+
const last_acked = Math.max(0, this.#playout.latest_frame);
|
|
954
958
|
this.#peer.send_resume_hello(
|
|
955
959
|
remote_peer_id, this.local_peer_id, last_acked,
|
|
956
960
|
token !== null, token !== null ? token.data : NO_SESSION_TOKEN,
|
|
@@ -1138,11 +1142,11 @@ export class NetworkSession {
|
|
|
1138
1142
|
if (!this.render_dirty) return;
|
|
1139
1143
|
this.render_dirty = false;
|
|
1140
1144
|
|
|
1141
|
-
if (this.#
|
|
1145
|
+
if (!this.#playout.has_frames) return;
|
|
1142
1146
|
if (this.#remote_entities.size === 0) return;
|
|
1143
1147
|
|
|
1144
1148
|
const scratch = this.#scratch_interp_buf;
|
|
1145
|
-
const tick = this.#
|
|
1149
|
+
const tick = this.#playout.latest_frame;
|
|
1146
1150
|
|
|
1147
1151
|
for (const entity_id of this.#remote_entities) {
|
|
1148
1152
|
const identity = this.world.getComponent(entity_id, NetworkIdentity);
|
|
@@ -2247,10 +2251,7 @@ export class NetworkSession {
|
|
|
2247
2251
|
}
|
|
2248
2252
|
this.#interp_log.end_tick();
|
|
2249
2253
|
|
|
2250
|
-
|
|
2251
|
-
this.#adaptive_render_delay.record_arrival(performance.now(), frame_number);
|
|
2252
|
-
this.#latest_received_frame = frame_number;
|
|
2253
|
-
}
|
|
2254
|
+
this.#playout.record_arrival(performance.now(), frame_number);
|
|
2254
2255
|
}
|
|
2255
2256
|
|
|
2256
2257
|
/**
|
|
@@ -2262,31 +2263,10 @@ export class NetworkSession {
|
|
|
2262
2263
|
* recorded — deferred-apply path doesn't fire `onFrameApplied`).
|
|
2263
2264
|
*/
|
|
2264
2265
|
#render_interpolated_entities() {
|
|
2265
|
-
if (this.#
|
|
2266
|
+
if (!this.#playout.has_frames) return;
|
|
2266
2267
|
if (this.#remote_entities.size === 0) return;
|
|
2267
2268
|
|
|
2268
|
-
const
|
|
2269
|
-
const render_delay_frames = this.#adaptive_render_delay.delay_ms() / this.tick_period_ms;
|
|
2270
|
-
const target = this.#latest_received_frame - render_delay_frames;
|
|
2271
|
-
|
|
2272
|
-
if (this.#smooth_render_frame < 0) {
|
|
2273
|
-
this.#smooth_render_frame = target < 0 ? 0 : target;
|
|
2274
|
-
this.#smooth_last_wall_ms = now_ms;
|
|
2275
|
-
} else {
|
|
2276
|
-
const dt_ms = now_ms - this.#smooth_last_wall_ms;
|
|
2277
|
-
this.#smooth_last_wall_ms = now_ms;
|
|
2278
|
-
this.#smooth_render_frame += dt_ms / this.tick_period_ms;
|
|
2279
|
-
const alpha = 1 - Math.exp(-PULL_PER_MS * dt_ms);
|
|
2280
|
-
this.#smooth_render_frame += (target - this.#smooth_render_frame) * alpha;
|
|
2281
|
-
}
|
|
2282
|
-
if (this.#smooth_render_frame > this.#latest_received_frame) {
|
|
2283
|
-
this.#smooth_render_frame = this.#latest_received_frame;
|
|
2284
|
-
}
|
|
2285
|
-
if (this.#smooth_render_frame < 0) this.#smooth_render_frame = 0;
|
|
2286
|
-
|
|
2287
|
-
const tick_a = Math.floor(this.#smooth_render_frame);
|
|
2288
|
-
const tick_b = tick_a + 1;
|
|
2289
|
-
const t = this.#smooth_render_frame - tick_a;
|
|
2269
|
+
const { tick_a, tick_b, t } = this.#playout.window(performance.now());
|
|
2290
2270
|
|
|
2291
2271
|
const scratch = this.#scratch_interp_buf;
|
|
2292
2272
|
let wrote_anything = false;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The render-delayed playhead over a sender's fixed-period frame stream — the piece of snapshot
|
|
3
|
+
* interpolation that decides *which two frames to blend and by how much* on each render.
|
|
4
|
+
*
|
|
5
|
+
* Owns an {@link AdaptiveRenderDelay} (or is given one). Feed it every arriving frame with
|
|
6
|
+
* {@link record_arrival}; ask it for the {@link window} once per render. The playhead advances
|
|
7
|
+
* with wall time, is pulled toward `latest_frame - delay` by a low-pass so changes in the delay
|
|
8
|
+
* never skip, and is clamped to `[0, latest_frame]` so the blend never extrapolates past what has
|
|
9
|
+
* arrived. Extracted from `NetworkSession` so any fixed-period stream — a peer's netcode frames, a
|
|
10
|
+
* remote editor's presence samples — plays out the same way.
|
|
11
|
+
*
|
|
12
|
+
* No allocation per call: {@link window} fills and returns one reused object.
|
|
13
|
+
*
|
|
14
|
+
* @author Alex Goldring
|
|
15
|
+
* @copyright Company Named Limited (c) 2026
|
|
16
|
+
*/
|
|
17
|
+
export class RenderPlayout {
|
|
18
|
+
/**
|
|
19
|
+
* @param {{
|
|
20
|
+
* tick_period_ms: number,
|
|
21
|
+
* delay?: AdaptiveRenderDelay,
|
|
22
|
+
* pull_per_ms?: number
|
|
23
|
+
* }} options `tick_period_ms` MUST be the sender's real period (see {@link AdaptiveRenderDelay})
|
|
24
|
+
*/
|
|
25
|
+
constructor({ tick_period_ms, delay, pull_per_ms }: {
|
|
26
|
+
tick_period_ms: number;
|
|
27
|
+
delay?: AdaptiveRenderDelay;
|
|
28
|
+
pull_per_ms?: number;
|
|
29
|
+
});
|
|
30
|
+
/** @readonly @type {number} */
|
|
31
|
+
readonly tick_period_ms: number;
|
|
32
|
+
/** @readonly @type {AdaptiveRenderDelay} */
|
|
33
|
+
readonly delay: AdaptiveRenderDelay;
|
|
34
|
+
/** @readonly @type {number} */
|
|
35
|
+
readonly pull_per_ms: number;
|
|
36
|
+
/** @type {number} highest frame number recorded; -1 before the first */
|
|
37
|
+
latest_frame: number;
|
|
38
|
+
/**
|
|
39
|
+
* A frame from the sender has been applied locally. Frames at or below the latest are
|
|
40
|
+
* accepted data (a reordered or retransmitted frame) but do not move the head.
|
|
41
|
+
*
|
|
42
|
+
* @param {number} now_ms wall clock
|
|
43
|
+
* @param {number} frame_number the sender's frame index
|
|
44
|
+
* @returns {boolean} true when this frame advanced the head
|
|
45
|
+
*/
|
|
46
|
+
record_arrival(now_ms: number, frame_number: number): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* @returns {boolean} whether anything has arrived yet
|
|
49
|
+
*/
|
|
50
|
+
get has_frames(): boolean;
|
|
51
|
+
/**
|
|
52
|
+
* The smoothed playhead in frames after the last {@link window} call (or -1).
|
|
53
|
+
* @returns {number}
|
|
54
|
+
*/
|
|
55
|
+
get playhead(): number;
|
|
56
|
+
/**
|
|
57
|
+
* Advance the playhead to `now_ms` and return the frames to blend. `tick_b` may not have
|
|
58
|
+
* arrived (the playhead sits on `latest_frame`): the log's `interpolate` snaps to the frame it
|
|
59
|
+
* has. Before the first arrival the window is `(0, 0, 0)`.
|
|
60
|
+
*
|
|
61
|
+
* @param {number} now_ms wall clock
|
|
62
|
+
* @returns {{tick_a:number, tick_b:number, t:number}} a reused object — read it, do not keep it
|
|
63
|
+
*/
|
|
64
|
+
window(now_ms: number): {
|
|
65
|
+
tick_a: number;
|
|
66
|
+
tick_b: number;
|
|
67
|
+
t: number;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Forget the stream (a reconnect, a new sender).
|
|
71
|
+
*/
|
|
72
|
+
reset(): void;
|
|
73
|
+
#private;
|
|
74
|
+
}
|
|
75
|
+
import { AdaptiveRenderDelay } from "./AdaptiveRenderDelay.js";
|
|
76
|
+
//# sourceMappingURL=RenderPlayout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RenderPlayout.d.ts","sourceRoot":"","sources":["../../../../../src/engine/network/time/RenderPlayout.js"],"names":[],"mappings":"AAWA;;;;;;;;;;;;;;;GAeG;AACH;IAsBI;;;;;;OAMG;IACH,oDANW;QACV,cAAkB,EAAE,MAAM,CAAC;QAC3B,KAAS,CAAC,EAAE,mBAAmB,CAAC;QAChC,WAAe,CAAC,EAAE,MAAM,CAAA;KACrB,EAWH;IArCD,+BAA+B;IAC/B,yBADqB,MAAM,CACZ;IAEf,4CAA4C;IAC5C,gBADqB,mBAAmB,CAClC;IAEN,+BAA+B;IAC/B,sBADqB,MAAM,CACf;IAEZ,wEAAwE;IACxE,cADW,MAAM,CACC;IA6BlB;;;;;;;OAOG;IACH,uBAJW,MAAM,gBACN,MAAM,GACJ,OAAO,CAWnB;IAED;;OAEG;IACH,0BAEC;IAED;;;OAGG;IACH,uBAEC;IAED;;;;;;;OAOG;IACH,eAHW,MAAM;gBACI,MAAM;gBAAS,MAAM;WAAI,MAAM;MA4CnD;IAED;;OAEG;IACH,cAKC;;CACJ;oCAjKmC,0BAA0B"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { assert } from "../../../core/assert.js";
|
|
2
|
+
import { AdaptiveRenderDelay } from "./AdaptiveRenderDelay.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Wall-clock low-pass on the render frame state machine: how hard the smoothed playhead is
|
|
6
|
+
* pulled toward its target per millisecond. Small, so a jump in the target (the delay widening
|
|
7
|
+
* after a jitter spike, a burst of late frames) is absorbed over ~2 s instead of a visible skip.
|
|
8
|
+
* @type {number}
|
|
9
|
+
*/
|
|
10
|
+
const PULL_PER_MS = 0.0005;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* The render-delayed playhead over a sender's fixed-period frame stream — the piece of snapshot
|
|
14
|
+
* interpolation that decides *which two frames to blend and by how much* on each render.
|
|
15
|
+
*
|
|
16
|
+
* Owns an {@link AdaptiveRenderDelay} (or is given one). Feed it every arriving frame with
|
|
17
|
+
* {@link record_arrival}; ask it for the {@link window} once per render. The playhead advances
|
|
18
|
+
* with wall time, is pulled toward `latest_frame - delay` by a low-pass so changes in the delay
|
|
19
|
+
* never skip, and is clamped to `[0, latest_frame]` so the blend never extrapolates past what has
|
|
20
|
+
* arrived. Extracted from `NetworkSession` so any fixed-period stream — a peer's netcode frames, a
|
|
21
|
+
* remote editor's presence samples — plays out the same way.
|
|
22
|
+
*
|
|
23
|
+
* No allocation per call: {@link window} fills and returns one reused object.
|
|
24
|
+
*
|
|
25
|
+
* @author Alex Goldring
|
|
26
|
+
* @copyright Company Named Limited (c) 2026
|
|
27
|
+
*/
|
|
28
|
+
export class RenderPlayout {
|
|
29
|
+
/** @readonly @type {number} */
|
|
30
|
+
tick_period_ms;
|
|
31
|
+
|
|
32
|
+
/** @readonly @type {AdaptiveRenderDelay} */
|
|
33
|
+
delay;
|
|
34
|
+
|
|
35
|
+
/** @readonly @type {number} */
|
|
36
|
+
pull_per_ms;
|
|
37
|
+
|
|
38
|
+
/** @type {number} highest frame number recorded; -1 before the first */
|
|
39
|
+
latest_frame = -1;
|
|
40
|
+
|
|
41
|
+
/** @private @type {number} smoothed playhead in frames; -1 until the first window */
|
|
42
|
+
#smooth_frame = -1;
|
|
43
|
+
|
|
44
|
+
/** @private @type {number} */
|
|
45
|
+
#last_wall_ms = -1;
|
|
46
|
+
|
|
47
|
+
/** @private @type {{tick_a:number, tick_b:number, t:number}} */
|
|
48
|
+
#window = { tick_a: 0, tick_b: 0, t: 0 };
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* @param {{
|
|
52
|
+
* tick_period_ms: number,
|
|
53
|
+
* delay?: AdaptiveRenderDelay,
|
|
54
|
+
* pull_per_ms?: number
|
|
55
|
+
* }} options `tick_period_ms` MUST be the sender's real period (see {@link AdaptiveRenderDelay})
|
|
56
|
+
*/
|
|
57
|
+
constructor({ tick_period_ms, delay = undefined, pull_per_ms = PULL_PER_MS }) {
|
|
58
|
+
assert.isNumber(tick_period_ms, 'tick_period_ms');
|
|
59
|
+
assert.ok(tick_period_ms > 0, 'tick_period_ms must be > 0');
|
|
60
|
+
assert.isNumber(pull_per_ms, 'pull_per_ms');
|
|
61
|
+
assert.ok(pull_per_ms >= 0, 'pull_per_ms must be >= 0');
|
|
62
|
+
|
|
63
|
+
this.tick_period_ms = tick_period_ms;
|
|
64
|
+
this.delay = delay === undefined ? new AdaptiveRenderDelay({ tick_period_ms }) : delay;
|
|
65
|
+
this.pull_per_ms = pull_per_ms;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* A frame from the sender has been applied locally. Frames at or below the latest are
|
|
70
|
+
* accepted data (a reordered or retransmitted frame) but do not move the head.
|
|
71
|
+
*
|
|
72
|
+
* @param {number} now_ms wall clock
|
|
73
|
+
* @param {number} frame_number the sender's frame index
|
|
74
|
+
* @returns {boolean} true when this frame advanced the head
|
|
75
|
+
*/
|
|
76
|
+
record_arrival(now_ms, frame_number) {
|
|
77
|
+
if (frame_number <= this.latest_frame) {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
this.delay.record_arrival(now_ms, frame_number);
|
|
82
|
+
this.latest_frame = frame_number;
|
|
83
|
+
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* @returns {boolean} whether anything has arrived yet
|
|
89
|
+
*/
|
|
90
|
+
get has_frames() {
|
|
91
|
+
return this.latest_frame >= 0;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* The smoothed playhead in frames after the last {@link window} call (or -1).
|
|
96
|
+
* @returns {number}
|
|
97
|
+
*/
|
|
98
|
+
get playhead() {
|
|
99
|
+
return this.#smooth_frame;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Advance the playhead to `now_ms` and return the frames to blend. `tick_b` may not have
|
|
104
|
+
* arrived (the playhead sits on `latest_frame`): the log's `interpolate` snaps to the frame it
|
|
105
|
+
* has. Before the first arrival the window is `(0, 0, 0)`.
|
|
106
|
+
*
|
|
107
|
+
* @param {number} now_ms wall clock
|
|
108
|
+
* @returns {{tick_a:number, tick_b:number, t:number}} a reused object — read it, do not keep it
|
|
109
|
+
*/
|
|
110
|
+
window(now_ms) {
|
|
111
|
+
const w = this.#window;
|
|
112
|
+
const latest = this.latest_frame;
|
|
113
|
+
|
|
114
|
+
if (latest < 0) {
|
|
115
|
+
w.tick_a = 0;
|
|
116
|
+
w.tick_b = 0;
|
|
117
|
+
w.t = 0;
|
|
118
|
+
return w;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const period = this.tick_period_ms;
|
|
122
|
+
const target = latest - this.delay.delay_ms() / period;
|
|
123
|
+
let frame = this.#smooth_frame;
|
|
124
|
+
|
|
125
|
+
if (frame < 0) {
|
|
126
|
+
frame = target < 0 ? 0 : target;
|
|
127
|
+
} else {
|
|
128
|
+
const dt_ms = now_ms - this.#last_wall_ms;
|
|
129
|
+
frame += dt_ms / period;
|
|
130
|
+
const alpha = 1 - Math.exp(-this.pull_per_ms * dt_ms);
|
|
131
|
+
frame += (target - frame) * alpha;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
this.#last_wall_ms = now_ms;
|
|
135
|
+
|
|
136
|
+
if (frame > latest) {
|
|
137
|
+
frame = latest;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
if (frame < 0) {
|
|
141
|
+
frame = 0;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
this.#smooth_frame = frame;
|
|
145
|
+
|
|
146
|
+
const tick_a = Math.floor(frame);
|
|
147
|
+
w.tick_a = tick_a;
|
|
148
|
+
w.tick_b = tick_a + 1;
|
|
149
|
+
w.t = frame - tick_a;
|
|
150
|
+
|
|
151
|
+
return w;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Forget the stream (a reconnect, a new sender).
|
|
156
|
+
*/
|
|
157
|
+
reset() {
|
|
158
|
+
this.latest_frame = -1;
|
|
159
|
+
this.#smooth_frame = -1;
|
|
160
|
+
this.#last_wall_ms = -1;
|
|
161
|
+
this.delay.reset();
|
|
162
|
+
}
|
|
163
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebSocketTransport.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/network/transport/adapters/WebSocketTransport.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH;IAUI;;OAEG;IACH,8BAFW;QAAE,MAAM,CAAC,EAAE,SAAS,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,
|
|
1
|
+
{"version":3,"file":"WebSocketTransport.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/network/transport/adapters/WebSocketTransport.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH;IAUI;;OAEG;IACH,8BAFW;QAAE,MAAM,CAAC,EAAE,SAAS,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,EAqD9C;IA7CG,wBAAwB;IACxB,QADW,SAAS,CAC4C;IA0DpE;;;;;;;;;;OAUG;IACH,WAFa,QAAQ,IAAI,CAAC,CA4BzB;;CAmBJ;0BA/JyB,iBAAiB"}
|
|
@@ -54,11 +54,18 @@ export class WebSocketTransport extends Transport {
|
|
|
54
54
|
this.#on_message = (event) => {
|
|
55
55
|
// event.data is ArrayBuffer (binaryType set above) for binary frames,
|
|
56
56
|
// or string for text frames. We treat strings as text payloads converted to UTF-8 bytes.
|
|
57
|
+
//
|
|
58
|
+
// The buffer may come from another realm — a socket created in an iframe, a worker,
|
|
59
|
+
// or a node socket under a jsdom test — where `instanceof ArrayBuffer` is false for a
|
|
60
|
+
// perfectly good ArrayBuffer. The brand check and `isView` see through that.
|
|
61
|
+
const data = event.data;
|
|
57
62
|
let bytes;
|
|
58
|
-
if (
|
|
59
|
-
bytes = new
|
|
60
|
-
} else if (
|
|
61
|
-
bytes = new
|
|
63
|
+
if (typeof data === "string") {
|
|
64
|
+
bytes = new TextEncoder().encode(data);
|
|
65
|
+
} else if (data instanceof ArrayBuffer || Object.prototype.toString.call(data) === "[object ArrayBuffer]") {
|
|
66
|
+
bytes = new Uint8Array(data);
|
|
67
|
+
} else if (ArrayBuffer.isView(data)) {
|
|
68
|
+
bytes = new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
|
|
62
69
|
} else {
|
|
63
70
|
// Some browsers wrap as Blob if binaryType is misset; ignore.
|
|
64
71
|
return;
|
|
@@ -468,17 +468,13 @@ export class PhysicsSystem extends System<any> {
|
|
|
468
468
|
* @param {RigidBody} rigidBody
|
|
469
469
|
* @param {Transform64} transform body's current world Transform (used for r and I_w)
|
|
470
470
|
* @param {Vector3|{x:number,y:number,z:number}} impulse
|
|
471
|
-
* @param {Vector3|
|
|
471
|
+
* @param {Vector3|ArrayLike<number>} worldPoint world-space point indexed as [x, y, z]
|
|
472
472
|
*/
|
|
473
473
|
applyImpulseAt(rigidBody: RigidBody, transform: Transform64, impulse: Vector3 | {
|
|
474
474
|
x: number;
|
|
475
475
|
y: number;
|
|
476
476
|
z: number;
|
|
477
|
-
}, worldPoint: Vector3 |
|
|
478
|
-
x: number;
|
|
479
|
-
y: number;
|
|
480
|
-
z: number;
|
|
481
|
-
}): void;
|
|
477
|
+
}, worldPoint: Vector3 | ArrayLike<number>): void;
|
|
482
478
|
/**
|
|
483
479
|
* Accumulate a continuous torque (world-space) for integration on the
|
|
484
480
|
* next fixedUpdate. Pairs with {@link applyForce} for the rotational case.
|
|
@@ -503,17 +499,13 @@ export class PhysicsSystem extends System<any> {
|
|
|
503
499
|
* @param {RigidBody} rigidBody
|
|
504
500
|
* @param {Transform64} transform body's current world Transform
|
|
505
501
|
* @param {Vector3|{x:number,y:number,z:number}} force
|
|
506
|
-
* @param {Vector3|
|
|
502
|
+
* @param {Vector3|ArrayLike<number>} worldPoint world-space point indexed as [x, y, z]
|
|
507
503
|
*/
|
|
508
504
|
applyForceAt(rigidBody: RigidBody, transform: Transform64, force: Vector3 | {
|
|
509
505
|
x: number;
|
|
510
506
|
y: number;
|
|
511
507
|
z: number;
|
|
512
|
-
}, worldPoint: Vector3 |
|
|
513
|
-
x: number;
|
|
514
|
-
y: number;
|
|
515
|
-
z: number;
|
|
516
|
-
}): void;
|
|
508
|
+
}, worldPoint: Vector3 | ArrayLike<number>): void;
|
|
517
509
|
/**
|
|
518
510
|
* Accumulate a continuous force to be integrated next fixedUpdate step.
|
|
519
511
|
* Wakes the body if asleep.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PhysicsSystem.d.ts","sourceRoot":"","sources":["../../../../../src/engine/physics/ecs/PhysicsSystem.js"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"PhysicsSystem.d.ts","sourceRoot":"","sources":["../../../../../src/engine/physics/ecs/PhysicsSystem.js"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,7 @@ import Vector3 from "../../../core/geom/Vector3.js";
|
|
|
11
11
|
import { ResourceAccessKind } from "../../../core/model/ResourceAccessKind.js";
|
|
12
12
|
import { ResourceAccessSpecification } from "../../../core/model/ResourceAccessSpecification.js";
|
|
13
13
|
import { System } from "../../ecs/System.js";
|
|
14
|
+
import { t64_announce_change } from "../../ecs/transform/t64_announce_change.js";
|
|
14
15
|
import { Transform64 } from "../../ecs/transform/Transform64.js";
|
|
15
16
|
import { Interpolated } from "../../interpolation/Interpolated.js";
|
|
16
17
|
import { body_id_index, BodyStorage } from "../body/BodyStorage.js";
|
|
@@ -49,7 +50,6 @@ import { PhysicsEvents } from "./PhysicsEvents.js";
|
|
|
49
50
|
import { RIGID_BODY_UNALLOCATED, RigidBody } from "./RigidBody.js";
|
|
50
51
|
import { RigidBodyFlags } from "./RigidBodyFlags.js";
|
|
51
52
|
import { SleepState } from "./SleepState.js";
|
|
52
|
-
import { t64_announce_change } from "../../ecs/transform/t64_announce_change.js";
|
|
53
53
|
|
|
54
54
|
/**
|
|
55
55
|
* Scratch for {@link applyImpulseAt}'s angular delta calculation.
|
|
@@ -594,7 +594,7 @@ export class PhysicsSystem extends System {
|
|
|
594
594
|
bvh.node_get_aabb(node, scratch_world_aabb);
|
|
595
595
|
|
|
596
596
|
let n;
|
|
597
|
-
for (
|
|
597
|
+
for (; ;) {
|
|
598
598
|
n = bvh_query_user_data_intersects_aabb(scratch_wake_candidates, 0, this.dynamicBvh, scratch_world_aabb);
|
|
599
599
|
if (n <= scratch_wake_candidates.length) break;
|
|
600
600
|
// TRUE count returned, overflow writes dropped — grow and re-query.
|
|
@@ -924,29 +924,50 @@ export class PhysicsSystem extends System {
|
|
|
924
924
|
* @param {RigidBody} rigidBody
|
|
925
925
|
* @param {Transform64} transform body's current world Transform (used for r and I_w)
|
|
926
926
|
* @param {Vector3|{x:number,y:number,z:number}} impulse
|
|
927
|
-
* @param {Vector3|
|
|
927
|
+
* @param {Vector3|ArrayLike<number>} worldPoint world-space point indexed as [x, y, z]
|
|
928
928
|
*/
|
|
929
|
-
applyImpulseAt(
|
|
929
|
+
applyImpulseAt(
|
|
930
|
+
rigidBody,
|
|
931
|
+
transform,
|
|
932
|
+
impulse,
|
|
933
|
+
worldPoint
|
|
934
|
+
) {
|
|
935
|
+
|
|
936
|
+
assert.defined(impulse, 'impulse');
|
|
937
|
+
assert.defined(worldPoint, 'worldPoint');
|
|
938
|
+
assert.isNumber(worldPoint[0], 'worldPoint[0]');
|
|
939
|
+
assert.isNumber(worldPoint[1], 'worldPoint[1]');
|
|
940
|
+
assert.isNumber(worldPoint[2], 'worldPoint[2]');
|
|
941
|
+
|
|
930
942
|
if (rigidBody.kind !== BodyKind.Dynamic) {
|
|
931
943
|
return;
|
|
932
944
|
}
|
|
945
|
+
|
|
933
946
|
const inv_m = rigidBody.mass > 0 ? 1 / rigidBody.mass : 0;
|
|
934
947
|
|
|
948
|
+
const impulse_x = impulse.x;
|
|
949
|
+
const impulse_y = impulse.y;
|
|
950
|
+
const impulse_z = impulse.z;
|
|
951
|
+
|
|
952
|
+
assert.isNumber(impulse_x, 'impulse_x');
|
|
953
|
+
assert.isNumber(impulse_y, 'impulse_y');
|
|
954
|
+
assert.isNumber(impulse_z, 'impulse_z');
|
|
955
|
+
|
|
935
956
|
rigidBody.linearVelocity.set(
|
|
936
|
-
rigidBody.linearVelocity.x +
|
|
937
|
-
rigidBody.linearVelocity.y +
|
|
938
|
-
rigidBody.linearVelocity.z +
|
|
957
|
+
rigidBody.linearVelocity.x + impulse_x * inv_m,
|
|
958
|
+
rigidBody.linearVelocity.y + impulse_y * inv_m,
|
|
959
|
+
rigidBody.linearVelocity.z + impulse_z * inv_m
|
|
939
960
|
);
|
|
940
961
|
|
|
941
|
-
//
|
|
962
|
+
// World points use indexed coordinates, including Transform64 translation views.
|
|
942
963
|
const rx = worldPoint[0] - transform.translation_x;
|
|
943
964
|
const ry = worldPoint[1] - transform.translation_y;
|
|
944
965
|
const rz = worldPoint[2] - transform.translation_z;
|
|
945
966
|
|
|
946
967
|
// Δω = I_w⁻¹ · (r × P)
|
|
947
|
-
const tx = ry *
|
|
948
|
-
const ty = rz *
|
|
949
|
-
const tz = rx *
|
|
968
|
+
const tx = ry * impulse_z - rz * impulse_y;
|
|
969
|
+
const ty = rz * impulse_x - rx * impulse_z;
|
|
970
|
+
const tz = rx * impulse_y - ry * impulse_x;
|
|
950
971
|
|
|
951
972
|
// LockRot* masks the BODY-LOCAL inverse-inertia diagonal here exactly
|
|
952
973
|
// as the solver gather does, so a user impulse cannot spin a locked
|
|
@@ -998,9 +1019,14 @@ export class PhysicsSystem extends System {
|
|
|
998
1019
|
* @param {RigidBody} rigidBody
|
|
999
1020
|
* @param {Transform64} transform body's current world Transform
|
|
1000
1021
|
* @param {Vector3|{x:number,y:number,z:number}} force
|
|
1001
|
-
* @param {Vector3|
|
|
1022
|
+
* @param {Vector3|ArrayLike<number>} worldPoint world-space point indexed as [x, y, z]
|
|
1002
1023
|
*/
|
|
1003
1024
|
applyForceAt(rigidBody, transform, force, worldPoint) {
|
|
1025
|
+
assert.defined(worldPoint, 'worldPoint');
|
|
1026
|
+
assert.isNumber(worldPoint[0], 'worldPoint[0]');
|
|
1027
|
+
assert.isNumber(worldPoint[1], 'worldPoint[1]');
|
|
1028
|
+
assert.isNumber(worldPoint[2], 'worldPoint[2]');
|
|
1029
|
+
|
|
1004
1030
|
if (rigidBody.kind !== BodyKind.Dynamic) {
|
|
1005
1031
|
return;
|
|
1006
1032
|
}
|
|
@@ -1010,7 +1036,7 @@ export class PhysicsSystem extends System {
|
|
|
1010
1036
|
rigidBody.accumulatedForce.z + force.z
|
|
1011
1037
|
);
|
|
1012
1038
|
|
|
1013
|
-
//
|
|
1039
|
+
// World points use indexed coordinates, including Transform64 translation views.
|
|
1014
1040
|
const rx = worldPoint[0] - transform.translation_x;
|
|
1015
1041
|
const ry = worldPoint[1] - transform.translation_y;
|
|
1016
1042
|
const rz = worldPoint[2] - transform.translation_z;
|
|
@@ -64,11 +64,11 @@ export class FluidObstacleSystem extends System<any> {
|
|
|
64
64
|
/**
|
|
65
65
|
* @param {FluidComponent} fluid
|
|
66
66
|
*/
|
|
67
|
-
static "__#
|
|
67
|
+
static "__#380@#refresh_masks"(fluid: FluidComponent): void;
|
|
68
68
|
/**
|
|
69
69
|
* @param {FluidComponent} fluid
|
|
70
70
|
*/
|
|
71
|
-
static "__#
|
|
71
|
+
static "__#380@#clear_field"(fluid: FluidComponent): void;
|
|
72
72
|
/**
|
|
73
73
|
* Mark every cell of `fluid` whose centre lies within `inflation` of the
|
|
74
74
|
* posed shape as solid. Iteration is clipped to the shape's world AABB
|
|
@@ -80,7 +80,7 @@ export class FluidObstacleSystem extends System<any> {
|
|
|
80
80
|
* @param {number} inflation world-units SDF threshold
|
|
81
81
|
* @param {Float64Array} point length-3 scratch
|
|
82
82
|
*/
|
|
83
|
-
static "__#
|
|
83
|
+
static "__#380@#voxelize"(fluid: FluidComponent, posed: PosedShape3D, aabb: Float64Array, inflation: number, point: Float64Array): void;
|
|
84
84
|
/**
|
|
85
85
|
* Write the obstacle's translation velocity onto every face of every cell
|
|
86
86
|
* it voxelized — the moving-wall boundary condition. Runs AFTER the mask
|
|
@@ -100,7 +100,7 @@ export class FluidObstacleSystem extends System<any> {
|
|
|
100
100
|
* @param {number} wvy
|
|
101
101
|
* @param {number} wvz
|
|
102
102
|
*/
|
|
103
|
-
static "__#
|
|
103
|
+
static "__#380@#stamp_wall_velocity"(fluid: FluidComponent, posed: PosedShape3D, aabb: Float64Array, inflation: number, point: Float64Array, wvx: number, wvy: number, wvz: number): void;
|
|
104
104
|
constructor();
|
|
105
105
|
dependencies: (typeof FluidObstacle)[];
|
|
106
106
|
components_used: (ResourceAccessSpecification<typeof Transform64> | ResourceAccessSpecification<typeof RigidBody> | ResourceAccessSpecification<typeof Collider> | ResourceAccessSpecification<typeof FluidComponent> | ResourceAccessSpecification<typeof FluidObstacle>)[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VolumeField.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/sound/simulation/core/VolumeField.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"VolumeField.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/sound/simulation/core/VolumeField.js"],"names":[],"mappings":"AAiBA;;;;;GAKG;AACH;IAMI;;OAEG;IACH,4BAFW,cAAc,EAIxB;IASD;;OAEG;IACH,uCAEC;IAZD;;OAEG;IACH,oCAEC;IASD;;;;;;;;;;;;OAYG;IACH,4CALW,MAAM,KACN,MAAM,KACN,MAAM,OACN,cAAc,QA0BxB;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,gEARW,MAAM,YACN,MAAM,YACN,MAAM,cACN,MAAM,cACN,MAAM,cACN,MAAM,WACN,YAAY,QA0DtB;;CACJ;+BAtK8B,qBAAqB"}
|
|
@@ -9,7 +9,10 @@ const AIR_INTEGRAL_SAMPLES = 8;
|
|
|
9
9
|
// module-static scratch for the per-step blended medium during integration (allocation-free)
|
|
10
10
|
const STEP_MEDIUM = new AcousticMedium();
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
/**
|
|
13
|
+
* module-static scratch — regions gathered at a query point (reused; sample is synchronous)
|
|
14
|
+
* @type {AcousticVolumeRegion[]}
|
|
15
|
+
*/
|
|
13
16
|
const GATHERED = [];
|
|
14
17
|
|
|
15
18
|
/**
|