@woosh/meep-engine 3.46.0 → 3.49.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/build/bundle-worker-terrain.js +1 -1
- package/editor/actions/concrete/TransformModifyAction.d.ts.map +1 -1
- package/editor/actions/concrete/TransformModifyAction.js +10 -2
- package/editor/ecs/component/FieldDescriptor.js +15 -0
- package/editor/ecs/component/createObjectEditor.js +41 -12
- package/editor/ecs/component/editors/ecs/Transform64Editor.d.ts.map +1 -1
- package/editor/ecs/component/editors/ecs/Transform64Editor.js +77 -70
- package/editor/particles/effect/ParticleReferenceSimulation.d.ts +1 -2
- package/editor/particles/effect/ParticleReferenceSimulation.d.ts.map +1 -1
- package/editor/particles/effect/ParticleReferenceSimulation.js +2 -4
- package/editor/tools/TransformToolV2.d.ts.map +1 -1
- package/editor/tools/TransformToolV2.js +4 -0
- package/editor/tools/v2/TransformControls.d.ts.map +1 -1
- package/editor/tools/v2/TransformControls.js +7 -0
- package/editor/view/ecs/EntityEditor.d.ts.map +1 -1
- package/editor/view/ecs/EntityEditor.js +4 -2
- package/editor/view/particles/effect/ParticleGraphEditorView.js +1 -1
- package/package.json +1 -1
- package/src/core/collection/array/array_insert_at.d.ts +16 -0
- package/src/core/collection/array/array_insert_at.d.ts.map +1 -0
- package/src/core/collection/array/array_insert_at.js +32 -0
- package/src/core/collection/array/array_remove_at.d.ts +15 -0
- package/src/core/collection/array/array_remove_at.d.ts.map +1 -0
- package/src/core/collection/array/array_remove_at.js +30 -0
- package/src/core/geom/3d/quaternion/quat3_look_rotation.d.ts +37 -0
- package/src/core/geom/3d/quaternion/quat3_look_rotation.d.ts.map +1 -0
- package/src/core/geom/3d/quaternion/quat3_look_rotation.js +172 -0
- package/src/core/geom/Quaternion.d.ts +1 -0
- package/src/core/geom/Quaternion.d.ts.map +1 -1
- package/src/core/geom/Quaternion.js +12 -48
- package/src/engine/Engine.d.ts.map +1 -1
- package/src/engine/Engine.js +9 -4
- package/src/engine/ecs/async/WORKER_SYSTEM_PLAN.md +27 -11
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +21 -0
- package/src/engine/ecs/transform/t64_look_rotation.d.ts +4 -4
- package/src/engine/ecs/transform/t64_look_rotation.d.ts.map +1 -1
- package/src/engine/ecs/transform/t64_look_rotation.js +7 -18
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.d.ts.map +1 -1
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.js +30 -1
- package/src/engine/graphics/ecs/particles/ParticleEffect.d.ts +2 -2
- package/src/engine/graphics/ecs/particles/ParticleEffect.d.ts.map +1 -1
- package/src/engine/graphics/ecs/particles/ParticleEffect.js +7 -7
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.d.ts +8 -0
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.d.ts.map +1 -1
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.js +11 -3
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_1_2.d.ts +26 -0
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_1_2.d.ts.map +1 -0
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_1_2.js +91 -0
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +6 -0
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/GPUParticleEmitterSystem.js +72 -29
- package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -1
- package/src/engine/graphics3/GraphicsEngine.js +8 -1
- package/src/engine/graphics3/ParticipatingMedia.d.ts +84 -1
- package/src/engine/graphics3/ParticipatingMedia.d.ts.map +1 -1
- package/src/engine/graphics3/ParticipatingMedia.js +139 -5
- package/src/engine/graphics3/ParticipatingMediaSerializationAdapter.d.ts +6 -2
- package/src/engine/graphics3/ParticipatingMediaSerializationAdapter.d.ts.map +1 -1
- package/src/engine/graphics3/ParticipatingMediaSerializationAdapter.js +29 -4
- package/src/engine/graphics3/ParticipatingMediaSerializationUpgrader_0_1.d.ts +10 -0
- package/src/engine/graphics3/ParticipatingMediaSerializationUpgrader_0_1.d.ts.map +1 -0
- package/src/engine/graphics3/ParticipatingMediaSerializationUpgrader_0_1.js +38 -0
- package/src/engine/graphics3/ParticipatingMediaSystem.d.ts.map +1 -1
- package/src/engine/graphics3/ParticipatingMediaSystem.js +46 -3
- package/src/engine/input/devices/KeyboardDevice.d.ts +1 -0
- package/src/engine/input/devices/KeyboardDevice.d.ts.map +1 -1
- package/src/engine/input/devices/KeyboardDevice.js +7 -6
- package/src/engine/navigation/ecs/path_following/PathFollowingSystem.d.ts.map +1 -1
- package/src/engine/navigation/ecs/path_following/PathFollowingSystem.js +15 -2
- package/src/engine/network/CONGESTION_CONTROL.md +9 -9
- package/src/engine/network/MESSAGE_TRANSPORT.md +364 -0
- package/src/engine/network/NetworkSession.d.ts +47 -16
- package/src/engine/network/NetworkSession.d.ts.map +1 -1
- package/src/engine/network/NetworkSession.js +556 -292
- package/src/engine/network/README.md +104 -28
- package/src/engine/network/SMOOTHNESS_DESIGN.md +13 -5
- package/src/engine/network/diagnostics/BandwidthMeter.d.ts +1 -1
- package/src/engine/network/diagnostics/BandwidthMeter.js +1 -1
- package/src/engine/network/orchestrator/HostJoin.d.ts +111 -0
- package/src/engine/network/orchestrator/HostJoin.d.ts.map +1 -0
- package/src/engine/network/orchestrator/HostJoin.js +271 -0
- package/src/engine/network/orchestrator/NetworkPeer.d.ts +151 -112
- package/src/engine/network/orchestrator/NetworkPeer.d.ts.map +1 -1
- package/src/engine/network/orchestrator/NetworkPeer.js +450 -499
- package/src/engine/network/orchestrator/PendingSlices.d.ts +30 -0
- package/src/engine/network/orchestrator/PendingSlices.d.ts.map +1 -0
- package/src/engine/network/orchestrator/PendingSlices.js +83 -0
- package/src/engine/network/orchestrator/ReliableFrames.d.ts +34 -0
- package/src/engine/network/orchestrator/ReliableFrames.d.ts.map +1 -0
- package/src/engine/network/orchestrator/ReliableFrames.js +96 -0
- package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts +77 -10
- package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts.map +1 -1
- package/src/engine/network/orchestrator/ServerAuthoritativeClient.js +236 -61
- package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts +59 -23
- package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts.map +1 -1
- package/src/engine/network/orchestrator/ServerAuthoritativeServer.js +213 -198
- package/src/engine/network/replication/Replicator.d.ts +15 -4
- package/src/engine/network/replication/Replicator.d.ts.map +1 -1
- package/src/engine/network/replication/Replicator.js +57 -17
- package/src/engine/network/sim/ActionLog.d.ts +32 -5
- package/src/engine/network/sim/ActionLog.d.ts.map +1 -1
- package/src/engine/network/sim/ActionLog.js +47 -5
- package/src/engine/network/sim/SimActionExecutor.d.ts +42 -2
- package/src/engine/network/sim/SimActionExecutor.d.ts.map +1 -1
- package/src/engine/network/sim/SimActionExecutor.js +100 -4
- package/src/engine/network/sim/Snapshotter.d.ts +12 -0
- package/src/engine/network/sim/Snapshotter.d.ts.map +1 -1
- package/src/engine/network/sim/Snapshotter.js +43 -0
- package/src/engine/network/state/Baseline.d.ts +1 -1
- package/src/engine/network/state/Baseline.js +1 -1
- package/src/engine/network/state/FrameBufferRing.d.ts +25 -6
- package/src/engine/network/state/FrameBufferRing.d.ts.map +1 -1
- package/src/engine/network/state/FrameBufferRing.js +51 -6
- package/src/engine/network/state/InputRing.d.ts +4 -0
- package/src/engine/network/state/InputRing.d.ts.map +1 -1
- package/src/engine/network/state/InputRing.js +7 -0
- package/src/engine/network/state/RecordArrivalRing.d.ts +57 -0
- package/src/engine/network/state/RecordArrivalRing.d.ts.map +1 -0
- package/src/engine/network/state/RecordArrivalRing.js +144 -0
- package/src/engine/network/transport/DeferredTransport.d.ts.map +1 -1
- package/src/engine/network/transport/DeferredTransport.js +1 -0
- package/src/engine/network/transport/LoopbackTransport.d.ts.map +1 -1
- package/src/engine/network/transport/LoopbackTransport.js +4 -2
- package/src/engine/network/transport/Transport.d.ts +7 -0
- package/src/engine/network/transport/Transport.d.ts.map +1 -1
- package/src/engine/network/transport/Transport.js +8 -0
- package/src/engine/network/transport/adapters/NodeUDPTransport.d.ts.map +1 -1
- package/src/engine/network/transport/adapters/NodeUDPTransport.js +20 -5
- package/src/engine/network/transport/adapters/WebRTCDataChannelTransport.d.ts.map +1 -1
- package/src/engine/network/transport/adapters/WebRTCDataChannelTransport.js +8 -0
- package/src/engine/network/transport/adapters/WebTransportTransport.d.ts.map +1 -1
- package/src/engine/network/transport/adapters/WebTransportTransport.js +6 -0
- package/src/engine/network/transport/connection/Connection.d.ts +191 -0
- package/src/engine/network/transport/connection/Connection.d.ts.map +1 -0
- package/src/engine/network/transport/connection/Connection.js +1262 -0
- package/src/engine/network/transport/connection/RangeSet.d.ts +94 -0
- package/src/engine/network/transport/connection/RangeSet.d.ts.map +1 -0
- package/src/engine/network/transport/connection/RangeSet.js +260 -0
- package/src/engine/network/transport/connection/RxStream.d.ts +48 -0
- package/src/engine/network/transport/connection/RxStream.d.ts.map +1 -0
- package/src/engine/network/transport/connection/RxStream.js +211 -0
- package/src/engine/network/transport/connection/TxStream.d.ts +90 -0
- package/src/engine/network/transport/connection/TxStream.d.ts.map +1 -0
- package/src/engine/network/transport/connection/TxStream.js +243 -0
- package/src/engine/network/transport/connection/bytes_copy.d.ts +17 -0
- package/src/engine/network/transport/connection/bytes_copy.d.ts.map +1 -0
- package/src/engine/network/transport/connection/bytes_copy.js +34 -0
- package/src/engine/network/transport/connection/varint.d.ts +46 -0
- package/src/engine/network/transport/connection/varint.d.ts.map +1 -0
- package/src/engine/network/transport/connection/varint.js +107 -0
- package/src/engine/physics/cloth/MEASUREMENTS.md +354 -0
- package/src/engine/physics/cloth/PLAN.md +85 -5
- package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +0 -12
- package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothInstance.js +0 -13
- package/src/engine/physics/cloth/ecs/ClothSystem.d.ts +2 -1
- package/src/engine/physics/cloth/ecs/ClothSystem.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothSystem.js +7 -1
- package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothWorld.js +4 -15
- package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts +2 -1
- package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/WorkerClothSystem.js +6 -1
- package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_build_rows.js +20 -10
- package/src/engine/physics/cloth/playground/collide.html +5 -3
- package/src/engine/physics/cloth/playground/collide_main.js +14 -13
- package/src/engine/physics/cloth/solver/ClothState.d.ts +30 -2
- package/src/engine/physics/cloth/solver/ClothState.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/ClothState.js +62 -4
- package/src/engine/physics/cloth/solver/cloth_self_find.d.ts +11 -3
- package/src/engine/physics/cloth/solver/cloth_self_find.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_self_find.js +52 -11
- package/src/engine/physics/cloth/solver/cloth_self_radius.d.ts +42 -0
- package/src/engine/physics/cloth/solver/cloth_self_radius.d.ts.map +1 -0
- package/src/engine/physics/cloth/solver/cloth_self_radius.js +64 -0
- package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts +99 -24
- package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_solver_constants.js +102 -25
- package/src/engine/physics/cloth/solver/cloth_step.d.ts +5 -1
- package/src/engine/physics/cloth/solver/cloth_step.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_step.js +13 -3
- package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts +0 -1
- package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_step_instance.js +12 -14
- package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.d.ts +23 -4
- package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.js +36 -8
- package/src/engine/physics/cloth/solver/constraint/cloth_self_row.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/constraint/cloth_self_row.js +4 -2
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/engine/sound/ecs/audio/AudioEmitter.d.ts +38 -7
- package/src/engine/sound/ecs/audio/AudioEmitter.d.ts.map +1 -1
- package/src/engine/sound/ecs/audio/AudioEmitter.js +35 -7
- package/src/engine/sound/ecs/audio/AudioEmitterSerializationAdapter.d.ts.map +1 -1
- package/src/engine/sound/ecs/audio/AudioEmitterSerializationAdapter.js +5 -1
- package/src/engine/sound/ecs/audio/AudioEmitterSerializationUpgrader_0_1.d.ts +18 -0
- package/src/engine/sound/ecs/audio/AudioEmitterSerializationUpgrader_0_1.d.ts.map +1 -0
- package/src/engine/sound/ecs/audio/AudioEmitterSerializationUpgrader_0_1.js +48 -0
- package/src/engine/sound/ecs/audio/AudioEmitterSystem.d.ts +12 -2
- package/src/engine/sound/ecs/audio/AudioEmitterSystem.d.ts.map +1 -1
- package/src/engine/sound/ecs/audio/AudioEmitterSystem.js +173 -9
- package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts +9 -3
- package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts.map +1 -1
- package/src/engine/sound/ecs/audio/LiveEmitterSet.js +28 -8
- package/src/engine/sound/ecs/trigger/AudioEventTrigger.d.ts +8 -0
- package/src/engine/sound/ecs/trigger/AudioEventTrigger.d.ts.map +1 -1
- package/src/engine/sound/ecs/trigger/AudioEventTriggerSerializationAdapter.d.ts.map +1 -1
- package/src/engine/sound/ecs/trigger/AudioEventTriggerSerializationAdapter.js +5 -1
- package/src/engine/sound/ecs/trigger/AudioEventTriggerSerializationUpgrader_0_1.d.ts +18 -0
- package/src/engine/sound/ecs/trigger/AudioEventTriggerSerializationUpgrader_0_1.d.ts.map +1 -0
- package/src/engine/sound/ecs/trigger/AudioEventTriggerSerializationUpgrader_0_1.js +51 -0
- package/src/engine/sound/ecs/trigger/AudioEventTriggerSystem.d.ts.map +1 -1
- package/src/engine/sound/ecs/trigger/AudioEventTriggerSystem.js +15 -1
- package/src/engine/sound/sopra/README.md +768 -644
- package/src/engine/sound/sopra/SopraEngine.d.ts +104 -8
- package/src/engine/sound/sopra/SopraEngine.d.ts.map +1 -1
- package/src/engine/sound/sopra/SopraEngine.js +327 -12
- package/src/engine/sound/sopra/definition/EventDescription.d.ts +28 -2
- package/src/engine/sound/sopra/definition/EventDescription.d.ts.map +1 -1
- package/src/engine/sound/sopra/definition/EventDescription.js +55 -5
- package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.d.ts +10 -0
- package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.d.ts.map +1 -1
- package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.js +77 -55
- package/src/engine/sound/sopra/definition/EventDescriptionSerializationUpgrader_0_1.d.ts +31 -0
- package/src/engine/sound/sopra/definition/EventDescriptionSerializationUpgrader_0_1.d.ts.map +1 -0
- package/src/engine/sound/sopra/definition/EventDescriptionSerializationUpgrader_0_1.js +75 -0
- package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.d.ts +38 -9
- package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.d.ts.map +1 -1
- package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.js +34 -5
- package/src/engine/sound/sopra/definition/effect/CompressorEffect.d.ts +7 -2
- package/src/engine/sound/sopra/definition/effect/CompressorEffect.d.ts.map +1 -1
- package/src/engine/sound/sopra/definition/effect/CompressorEffect.js +137 -122
- package/src/engine/sound/sopra/definition/effect/EqEffect.d.ts +3 -1
- package/src/engine/sound/sopra/definition/effect/EqEffect.d.ts.map +1 -1
- package/src/engine/sound/sopra/definition/effect/EqEffect.js +146 -131
- package/src/engine/sound/sopra/definition/effect/ReverbEffect.d.ts +1 -0
- package/src/engine/sound/sopra/definition/effect/ReverbEffect.d.ts.map +1 -1
- package/src/engine/sound/sopra/definition/effect/ReverbEffect.js +6 -1
- package/src/engine/sound/sopra/runtime/BusGraph.d.ts +44 -2
- package/src/engine/sound/sopra/runtime/BusGraph.d.ts.map +1 -1
- package/src/engine/sound/sopra/runtime/BusGraph.js +83 -43
- package/src/engine/sound/sopra/runtime/EffectChain.d.ts +96 -0
- package/src/engine/sound/sopra/runtime/EffectChain.d.ts.map +1 -0
- package/src/engine/sound/sopra/runtime/EffectChain.js +286 -0
- package/src/engine/sound/sopra/runtime/EffectParamOverrides.d.ts +123 -0
- package/src/engine/sound/sopra/runtime/EffectParamOverrides.d.ts.map +1 -0
- package/src/engine/sound/sopra/runtime/EffectParamOverrides.js +320 -0
- package/src/engine/sound/sopra/runtime/EventInstance.d.ts +55 -5
- package/src/engine/sound/sopra/runtime/EventInstance.d.ts.map +1 -1
- package/src/engine/sound/sopra/runtime/EventInstance.js +201 -26
- package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.d.ts +2 -1
- package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.d.ts.map +1 -1
- package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.js +6 -1
- package/src/engine/sound/sopra/serialization/sopraSerializationHarness.d.ts +15 -0
- package/src/engine/sound/sopra/serialization/sopraSerializationHarness.d.ts.map +1 -1
- package/src/engine/sound/sopra/serialization/sopraSerializationHarness.js +32 -0
- package/src/engine/sound/sopra/util/MockAudioContext.d.ts.map +1 -1
- package/src/engine/sound/sopra/util/MockAudioContext.js +3 -0
- package/src/engine/sound/sopra/util/fadeOutAndStop.d.ts +13 -3
- package/src/engine/sound/sopra/util/fadeOutAndStop.d.ts.map +1 -1
- package/src/engine/sound/sopra/util/fadeOutAndStop.js +25 -13
- package/src/shade/RENDERER_CONTRACT.md +6 -3
- package/src/shade/device/SHADE_DEVICE_FLOOR.d.ts +24 -0
- package/src/shade/device/SHADE_DEVICE_FLOOR.d.ts.map +1 -0
- package/src/shade/device/SHADE_DEVICE_FLOOR.js +34 -0
- package/src/shade/device/ShadeDeviceFailure.d.ts +12 -5
- package/src/shade/device/ShadeDeviceFailure.d.ts.map +1 -1
- package/src/shade/device/ShadeDeviceFailure.js +17 -8
- package/src/shade/device/ShadeDeviceFailureReason.d.ts +1 -1
- package/src/shade/device/ShadeDeviceFailureReason.js +2 -2
- package/src/shade/device/mock/SoftwareGPUDevice.d.ts +15 -0
- package/src/shade/device/mock/SoftwareGPUDevice.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPUDevice.js +21 -0
- package/src/shade/device/pipeline/ComputePipelineManager.d.ts +20 -0
- package/src/shade/device/pipeline/ComputePipelineManager.d.ts.map +1 -1
- package/src/shade/device/pipeline/ComputePipelineManager.js +80 -6
- package/src/shade/device/pipeline/PipelineEnquiry.d.ts +52 -0
- package/src/shade/device/pipeline/PipelineEnquiry.d.ts.map +1 -0
- package/src/shade/device/pipeline/PipelineEnquiry.js +63 -0
- package/src/shade/device/pipeline/RenderPipelineManager.d.ts +21 -0
- package/src/shade/device/pipeline/RenderPipelineManager.d.ts.map +1 -1
- package/src/shade/device/pipeline/RenderPipelineManager.js +84 -4
- package/src/shade/device/shade_device_floor_unmet.d.ts +13 -0
- package/src/shade/device/shade_device_floor_unmet.d.ts.map +1 -0
- package/src/shade/device/shade_device_floor_unmet.js +32 -0
- package/src/shade/playground/contact_shadows/ContactShadowLab.d.ts +137 -0
- package/src/shade/playground/contact_shadows/ContactShadowLab.d.ts.map +1 -0
- package/src/shade/playground/contact_shadows/ContactShadowLab.js +654 -0
- package/src/shade/playground/contact_shadows/README.md +126 -0
- package/src/shade/playground/contact_shadows/index.html +191 -0
- package/src/shade/playground/contact_shadows/main.d.ts +2 -0
- package/src/shade/playground/contact_shadows/main.d.ts.map +1 -0
- package/src/shade/playground/contact_shadows/main.js +888 -0
- package/src/shade/playground/contact_shadows/scenes.d.ts +48 -0
- package/src/shade/playground/contact_shadows/scenes.d.ts.map +1 -0
- package/src/shade/playground/contact_shadows/scenes.js +620 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_composite.d.ts +36 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_composite.d.ts.map +1 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_composite.js +245 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_reference.d.ts +15 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_reference.d.ts.map +1 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_reference.js +120 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_stats.d.ts +55 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_stats.d.ts.map +1 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_stats.js +216 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_view.d.ts +20 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_view.d.ts.map +1 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_view.js +114 -0
- package/src/shade/playground/contact_shadows/shader_contact_shadow_march.d.ts +11 -0
- package/src/shade/playground/contact_shadows/shader_contact_shadow_march.d.ts.map +1 -0
- package/src/shade/playground/contact_shadows/shader_contact_shadow_march.js +90 -0
- package/src/shade/playground/contact_shadows/textures.d.ts +16 -0
- package/src/shade/playground/contact_shadows/textures.d.ts.map +1 -0
- package/src/shade/playground/contact_shadows/textures.js +123 -0
- package/src/shade/playground/particle_ecs/README.md +1 -1
- package/src/shade/playground/particle_ecs/effects/flame.json +1932 -1881
- package/src/shade/playground/particle_ecs/effects/smoke.json +99 -1
- package/src/shade/playground/particle_ecs/effects/soot.json +152 -145
- package/src/shade/playground/tonemap_sdr/README.md +90 -0
- package/src/shade/playground/tonemap_sdr/ToneMapCompare.d.ts +105 -0
- package/src/shade/playground/tonemap_sdr/ToneMapCompare.d.ts.map +1 -0
- package/src/shade/playground/tonemap_sdr/ToneMapCompare.js +380 -0
- package/src/shade/playground/tonemap_sdr/chunk_tonemap_gt7_sdr_reference.d.ts +32 -0
- package/src/shade/playground/tonemap_sdr/chunk_tonemap_gt7_sdr_reference.d.ts.map +1 -0
- package/src/shade/playground/tonemap_sdr/chunk_tonemap_gt7_sdr_reference.js +104 -0
- package/src/shade/playground/tonemap_sdr/index.html +90 -0
- package/src/shade/playground/tonemap_sdr/main.d.ts +2 -0
- package/src/shade/playground/tonemap_sdr/main.d.ts.map +1 -0
- package/src/shade/playground/tonemap_sdr/main.js +306 -0
- package/src/shade/playground/tonemap_sdr/scenes.d.ts +26 -0
- package/src/shade/playground/tonemap_sdr/scenes.d.ts.map +1 -0
- package/src/shade/playground/tonemap_sdr/scenes.js +404 -0
- package/src/shade/playground/volumetrics_froxel/main.d.ts.map +1 -1
- package/src/shade/playground/volumetrics_froxel/main.js +85 -4
- package/src/shade/playground/water_refraction/README.md +26 -18
- package/src/shade/playground/water_refraction/index.html +1 -1
- package/src/shade/renderer/Renderer.d.ts +37 -3
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +237 -67
- package/src/shade/renderer/ShadeToneMappingMode.d.ts +14 -0
- package/src/shade/renderer/ShadeToneMappingMode.d.ts.map +1 -0
- package/src/shade/renderer/ShadeToneMappingMode.js +30 -0
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts +9 -0
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
- package/src/shade/renderer/animation/GPUAnimationManager.js +14 -0
- package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.js +5 -3
- package/src/shade/renderer/buffer/GPUBufferAllocator.d.ts.map +1 -1
- package/src/shade/renderer/buffer/GPUBufferAllocator.js +9 -0
- package/src/shade/renderer/buffer/buffer_pool_ops.d.ts +21 -12
- package/src/shade/renderer/buffer/buffer_pool_ops.d.ts.map +1 -1
- package/src/shade/renderer/buffer/buffer_pool_ops.js +18 -19
- package/src/shade/renderer/buffer/table/GPUDatabase.d.ts +7 -0
- package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUDatabase.js +12 -0
- package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts +8 -0
- package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +12 -0
- package/src/shade/renderer/camera/GPUCameraContext.d.ts.map +1 -1
- package/src/shade/renderer/camera/GPUCameraContext.js +19 -8
- package/src/shade/renderer/deferred/chunk_read_gBuffer_material.d.ts.map +1 -1
- package/src/shade/renderer/deferred/chunk_read_gBuffer_material.js +4 -0
- package/src/shade/renderer/deferred/chunk_shade_standard_material_direct.d.ts.map +1 -1
- package/src/shade/renderer/deferred/chunk_shade_standard_material_direct.js +4 -0
- package/src/shade/renderer/deferred/chunk_shade_standard_material_direct_restir.d.ts.map +1 -1
- package/src/shade/renderer/deferred/chunk_shade_standard_material_direct_restir.js +4 -0
- package/src/shade/renderer/deferred/shader_deferred_main.d.ts.map +1 -1
- package/src/shade/renderer/deferred/shader_deferred_main.js +3 -0
- package/src/shade/renderer/deferred/shader_tonemap_HDR.d.ts +6 -0
- package/src/shade/renderer/deferred/shader_tonemap_HDR.d.ts.map +1 -1
- package/src/shade/renderer/deferred/shader_tonemap_HDR.js +13 -3
- package/src/shade/renderer/deferred/shader_tonemap_HDR_none.d.ts +9 -0
- package/src/shade/renderer/deferred/shader_tonemap_HDR_none.d.ts.map +1 -0
- package/src/shade/renderer/deferred/shader_tonemap_HDR_none.js +63 -0
- package/src/shade/renderer/deferred/shader_tonemap_HDR_pbr_neutral.d.ts +10 -0
- package/src/shade/renderer/deferred/shader_tonemap_HDR_pbr_neutral.d.ts.map +1 -0
- package/src/shade/renderer/deferred/shader_tonemap_HDR_pbr_neutral.js +87 -0
- package/src/shade/renderer/deferred/shader_tonemap_LDR.d.ts +6 -0
- package/src/shade/renderer/deferred/shader_tonemap_LDR.d.ts.map +1 -1
- package/src/shade/renderer/deferred/shader_tonemap_LDR.js +23 -5
- package/src/shade/renderer/deferred/shader_tonemap_LDR_none.d.ts +9 -0
- package/src/shade/renderer/deferred/shader_tonemap_LDR_none.d.ts.map +1 -0
- package/src/shade/renderer/deferred/shader_tonemap_LDR_none.js +68 -0
- package/src/shade/renderer/deferred/shader_tonemap_LDR_pbr_neutral.d.ts +10 -0
- package/src/shade/renderer/deferred/shader_tonemap_LDR_pbr_neutral.d.ts.map +1 -0
- package/src/shade/renderer/deferred/shader_tonemap_LDR_pbr_neutral.js +73 -0
- package/src/shade/renderer/geometry/meshlet/MeshletBatch.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/MeshletBatch.js +58 -9
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts +35 -25
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +97 -196
- package/src/shade/renderer/geometry/sdf/shader_build_sdf.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/shader_build_sdf.js +121 -129
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/brick4_bake_basic.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/brick4_bake_basic.js +3 -0
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.js +4 -0
- package/src/shade/renderer/global_illumination/brick4/gpu/draw/shader_brick4_indirect_lighting.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/brick4/gpu/draw/shader_brick4_indirect_lighting.js +4 -0
- package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.js +3 -0
- package/src/shade/renderer/global_illumination/lpv/deprecated/probe_trace_compute_shader_code.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/lpv/deprecated/probe_trace_compute_shader_code.js +4 -0
- package/src/shade/renderer/global_illumination/probe/octahedral/graph_sample_light_probes.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/graph_sample_light_probes.js +4 -0
- package/src/shade/renderer/global_illumination/shader_resolve_indirect_lighting.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/shader_resolve_indirect_lighting.js +4 -0
- package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +131 -1
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_delta.d.ts +7 -0
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_delta.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_delta.js +45 -38
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_determine_range.d.ts +2 -0
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_determine_range.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_determine_range.js +81 -79
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_find_split.d.ts +2 -0
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_find_split.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_find_split.js +5 -3
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_internal_children.d.ts +21 -0
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_internal_children.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_internal_children.js +42 -0
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_morton_code.d.ts +19 -0
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_morton_code.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_morton_code.js +44 -0
- package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.d.ts +23 -5
- package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.js +139 -23
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_build_single_workgroup.d.ts +25 -0
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_build_single_workgroup.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_build_single_workgroup.js +179 -0
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts +2 -2
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.js +7 -16
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.d.ts +3 -4
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.js +6 -23
- package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.d.ts +11 -0
- package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.js +14 -3
- package/src/shade/renderer/gpu_primitive/indirect/build_indirect_draw_command.d.ts +10 -0
- package/src/shade/renderer/gpu_primitive/indirect/build_indirect_draw_command.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/indirect/build_indirect_draw_command.js +13 -3
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.d.ts +10 -0
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.js +14 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_bitonic_comparator.d.ts +26 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_bitonic_comparator.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_bitonic_comparator.js +52 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_bitonic_workgroup.d.ts +32 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_bitonic_workgroup.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_bitonic_workgroup.js +89 -0
- package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts +10 -0
- package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js +20 -1
- package/src/shade/renderer/gpu_primitive/test/gpu_test.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/test/gpu_test.js +8 -11
- package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts +10 -0
- package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts.map +1 -1
- package/src/shade/renderer/hiz/HierarchicalZBuffer.js +294 -281
- package/src/shade/renderer/light/GPULightCollection.d.ts +8 -0
- package/src/shade/renderer/light/GPULightCollection.d.ts.map +1 -1
- package/src/shade/renderer/light/GPULightCollection.js +18 -1
- package/src/shade/renderer/light/cluster/cull/graph_cull_lights.d.ts +8 -0
- package/src/shade/renderer/light/cluster/cull/graph_cull_lights.d.ts.map +1 -1
- package/src/shade/renderer/light/cluster/cull/graph_cull_lights.js +234 -218
- package/src/shade/renderer/light/cluster/graph_assign_clsuters.d.ts +7 -0
- package/src/shade/renderer/light/cluster/graph_assign_clsuters.d.ts.map +1 -1
- package/src/shade/renderer/light/cluster/graph_assign_clsuters.js +13 -0
- package/src/shade/renderer/light/cluster/graph_build_light_clusters.d.ts +7 -0
- package/src/shade/renderer/light/cluster/graph_build_light_clusters.d.ts.map +1 -1
- package/src/shade/renderer/light/cluster/graph_build_light_clusters.js +16 -2
- package/src/shade/renderer/light/environment/execute_filter_environment_map.d.ts +10 -0
- package/src/shade/renderer/light/environment/execute_filter_environment_map.d.ts.map +1 -1
- package/src/shade/renderer/light/environment/execute_filter_environment_map.js +13 -0
- package/src/shade/renderer/lightmap/GPULightMap.d.ts.map +1 -1
- package/src/shade/renderer/lightmap/GPULightMap.js +3 -0
- package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_irradiance_flat.d.ts.map +1 -1
- package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_irradiance_flat.js +4 -0
- package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_sh.d.ts.map +1 -1
- package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_sh.js +4 -0
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/material/GPUMaterialManager.d.ts +16 -4
- package/src/shade/renderer/material/GPUMaterialManager.d.ts.map +1 -1
- package/src/shade/renderer/material/GPUMaterialManager.js +38 -8
- package/src/shade/renderer/particles/DESIGN.md +49 -7
- package/src/shade/renderer/particles/ORIENTATION_PLAN_2026_10_15.md +453 -0
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts +5 -1
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.js +13 -5
- package/src/shade/renderer/particles/data/particle_emitter_record.js +2 -2
- package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.js +12 -0
- package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.d.ts +60 -0
- package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.js +156 -0
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +2 -2
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/ParticleEmitter.js +8 -8
- package/src/shade/renderer/particles/shaders/chunk_particle_billboard_vertex.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/chunk_particle_billboard_vertex.js +6 -4
- package/src/shade/renderer/particles/shaders/chunk_particle_render_math.d.ts +7 -6
- 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 +91 -58
- package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +10 -0
- package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.js +5 -1
- package/src/shade/renderer/path_tracer/graph_path_trace_scene.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/graph_path_trace_scene.js +6 -0
- package/src/shade/renderer/pool/TransientResourcePool.d.ts +24 -0
- package/src/shade/renderer/pool/TransientResourcePool.d.ts.map +1 -1
- package/src/shade/renderer/pool/TransientResourcePool.js +41 -10
- package/src/shade/renderer/postprocess/bloom/graph_postprocess_bloom.d.ts +7 -0
- package/src/shade/renderer/postprocess/bloom/graph_postprocess_bloom.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/bloom/graph_postprocess_bloom.js +18 -0
- package/src/shade/renderer/postprocess/denoise/LigmaDenoiser.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/denoise/LigmaDenoiser.js +1 -0
- package/src/shade/renderer/postprocess/denoise/shader_temporal_reprojection_luma.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/denoise/shader_temporal_reprojection_luma.js +6 -4
- package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.d.ts +11 -0
- package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.js +16 -0
- package/src/shade/renderer/postprocess/gtao/GTAO.d.ts +10 -0
- package/src/shade/renderer/postprocess/gtao/GTAO.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/gtao/GTAO.js +16 -0
- package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.js +32 -10
- package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.js +3 -0
- package/src/shade/renderer/postprocess/ssr/resolve/build_ssr_resolve_shader.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/resolve/build_ssr_resolve_shader.js +6 -3
- package/src/shade/renderer/postprocess/taa/TAA.d.ts +12 -0
- package/src/shade/renderer/postprocess/taa/TAA.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/taa/TAA.js +15 -0
- package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.d.ts +7 -0
- package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.js +13 -0
- package/src/shade/renderer/rasterize/TemplatePassDescriptor.d.ts +31 -3
- package/src/shade/renderer/rasterize/TemplatePassDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/TemplatePassDescriptor.js +79 -4
- package/src/shade/renderer/rasterize/bucket/graph_meshlets_rasterize_by_bucket.d.ts +17 -0
- package/src/shade/renderer/rasterize/bucket/graph_meshlets_rasterize_by_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/graph_meshlets_rasterize_by_bucket.js +35 -4
- package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.d.ts +7 -0
- package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.js +182 -169
- package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_meshes_classify_buckets.d.ts +10 -0
- package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_meshes_classify_buckets.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_meshes_classify_buckets.js +20 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_extract_meshlets_from_bucket.d.ts +10 -0
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_extract_meshlets_from_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_extract_meshlets_from_bucket.js +18 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_sort_meshlets_by_bucket_id.d.ts +10 -0
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_sort_meshlets_by_bucket_id.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_sort_meshlets_by_bucket_id.js +20 -1
- package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.d.ts +7 -0
- package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.js +187 -170
- package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_one_way.d.ts +10 -0
- package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_one_way.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_one_way.js +19 -1
- package/src/shade/renderer/rasterize/expand/graph_meshlets_rasterize.d.ts +13 -0
- package/src/shade/renderer/rasterize/expand/graph_meshlets_rasterize.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/graph_meshlets_rasterize.js +25 -1
- package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.d.ts +10 -0
- package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.js +20 -0
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_brick4.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_brick4.js +6 -0
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_ibl.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_ibl.js +6 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +3 -2
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +3 -2
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts +7 -2
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +12 -4
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_brick4.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_brick4.js +4 -3
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_ibl.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_ibl.js +4 -3
- package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.d.ts +2 -1
- package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +11 -3
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.js +4 -3
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.js +4 -3
- package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts +15 -0
- package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +35 -2
- package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts +14 -0
- package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +32 -4
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts +17 -0
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +34 -4
- package/src/shade/renderer/restir/di/chunk_restir_resolve.d.ts +5 -3
- package/src/shade/renderer/restir/di/chunk_restir_resolve.d.ts.map +1 -1
- package/src/shade/renderer/restir/di/chunk_restir_resolve.js +8 -3
- package/src/shade/renderer/restir/di/graph_restir_di.d.ts.map +1 -1
- package/src/shade/renderer/restir/di/graph_restir_di.js +1 -0
- package/src/shade/renderer/restir/di/shader_restir_di_resolve.d.ts.map +1 -1
- package/src/shade/renderer/restir/di/shader_restir_di_resolve.js +5 -1
- package/src/shade/renderer/restir/reservoir/shader.d.ts.map +1 -1
- package/src/shade/renderer/restir/reservoir/shader.js +7 -4
- package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts +7 -0
- package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts.map +1 -1
- package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +13 -1
- package/src/shade/renderer/scene/GPUSceneContext.d.ts +10 -0
- package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
- package/src/shade/renderer/scene/GPUSceneContext.js +19 -0
- package/src/shade/renderer/scene/SceneManager.d.ts +9 -0
- package/src/shade/renderer/scene/SceneManager.d.ts.map +1 -1
- package/src/shade/renderer/scene/SceneManager.js +11 -0
- package/src/shade/renderer/scene/hierarchy/graph_nodes_update_transform_hierarchy.d.ts +11 -0
- package/src/shade/renderer/scene/hierarchy/graph_nodes_update_transform_hierarchy.d.ts.map +1 -1
- package/src/shade/renderer/scene/hierarchy/graph_nodes_update_transform_hierarchy.js +17 -0
- package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.d.ts +11 -0
- package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.d.ts.map +1 -1
- package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.js +18 -1
- package/src/shade/renderer/shader/ComputeShader.d.ts +12 -0
- package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
- package/src/shade/renderer/shader/ComputeShader.js +71 -2
- package/src/shade/renderer/shader/ImageShader.d.ts +27 -8
- package/src/shade/renderer/shader/ImageShader.d.ts.map +1 -1
- package/src/shade/renderer/shader/ImageShader.js +299 -218
- package/src/shade/renderer/shader/ShaderDescriptor.d.ts +21 -0
- package/src/shade/renderer/shader/ShaderDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/shader/ShaderDescriptor.js +71 -1
- package/src/shade/renderer/shader/chunk/camera/chunk_project_view_position_from_depth.d.ts +17 -0
- package/src/shade/renderer/shader/chunk/camera/chunk_project_view_position_from_depth.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/camera/chunk_project_view_position_from_depth.js +45 -0
- package/src/shade/renderer/shader/chunk/camera/chunk_screen_coordinate_to_view.js +3 -3
- package/src/shade/renderer/shader/chunk/color/iCtCp/chunk_eotf_st2084.d.ts +1 -1
- package/src/shade/renderer/shader/chunk/color/iCtCp/chunk_eotf_st2084.js +62 -62
- package/src/shade/renderer/shader/chunk/color/tonemap/HDR_TONE_MAPPING_FORMS_BRIEF_2026_10_16.md +318 -0
- package/src/shade/renderer/shader/chunk/color/tonemap/SDR_TONE_MAPPING_BRIEF_2026_10_16.md +237 -0
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_PAPER_WHITE_NITS.d.ts +17 -0
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_PAPER_WHITE_NITS.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_PAPER_WHITE_NITS.js +22 -0
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_khronos_pbr.d.ts +14 -1
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_khronos_pbr.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_khronos_pbr.js +28 -15
- package/src/shade/renderer/shader/chunk/color/tonemap/gt7/chunk_tonemap_gt7.d.ts +12 -0
- package/src/shade/renderer/shader/chunk/color/tonemap/gt7/chunk_tonemap_gt7.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/color/tonemap/gt7/chunk_tonemap_gt7.js +128 -110
- package/src/shade/renderer/shader/chunk/geometry/ray/chunk_offset_ray_from_depth.d.ts +20 -0
- package/src/shade/renderer/shader/chunk/geometry/ray/chunk_offset_ray_from_depth.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/ray/chunk_offset_ray_from_depth.js +33 -0
- package/src/shade/renderer/shader/chunk/light/chunk_compute_multiscattering_specular.d.ts +4 -0
- package/src/shade/renderer/shader/chunk/light/chunk_compute_multiscattering_specular.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/light/chunk_compute_multiscattering_specular.js +12 -1
- package/src/shade/renderer/shader/chunk/material/MATERIAL_SHADING_INFO_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/material/MATERIAL_SHADING_INFO_STRUCT.js +7 -0
- package/src/shade/renderer/shader/chunk/material/MULTISCATTER.md +108 -0
- package/src/shade/renderer/shader/chunk/material/chunk_compute_indirect_specular.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/material/chunk_compute_indirect_specular.js +23 -4
- package/src/shade/renderer/shader/chunk/material/chunk_re_direct_multiscatter.d.ts +18 -0
- package/src/shade/renderer/shader/chunk/material/chunk_re_direct_multiscatter.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/material/chunk_re_direct_multiscatter.js +56 -0
- package/src/shade/renderer/shader/chunk/material/chunk_re_indirect_specular_physical.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/material/chunk_re_indirect_specular_physical.js +2 -0
- package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_space_linear_ray.d.ts +43 -0
- package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_space_linear_ray.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_space_linear_ray.js +319 -0
- package/src/shade/renderer/shader/compiler/CodeChunk.d.ts +33 -0
- package/src/shade/renderer/shader/compiler/CodeChunk.d.ts.map +1 -1
- package/src/shade/renderer/shader/compiler/CodeChunk.js +140 -0
- package/src/shade/renderer/shader/compiler/CodeChunkChoice.d.ts +74 -0
- package/src/shade/renderer/shader/compiler/CodeChunkChoice.d.ts.map +1 -0
- package/src/shade/renderer/shader/compiler/CodeChunkChoice.js +166 -0
- package/src/shade/renderer/shader/compiler/SHADER_SWITCH_PROPOSAL_2026_10_16.md +680 -0
- package/src/shade/renderer/shader/compiler/ShaderSwitch.d.ts +86 -0
- package/src/shade/renderer/shader/compiler/ShaderSwitch.d.ts.map +1 -0
- package/src/shade/renderer/shader/compiler/ShaderSwitch.js +178 -0
- package/src/shade/renderer/shader/compiler/ShaderSwitchSet.d.ts +67 -0
- package/src/shade/renderer/shader/compiler/ShaderSwitchSet.d.ts.map +1 -0
- package/src/shade/renderer/shader/compiler/ShaderSwitchSet.js +205 -0
- package/src/shade/renderer/shadow/contact/CONTACT_SHADOW_WAVE_SIZE.d.ts +14 -0
- package/src/shade/renderer/shadow/contact/CONTACT_SHADOW_WAVE_SIZE.d.ts.map +1 -0
- package/src/shade/renderer/shadow/contact/CONTACT_SHADOW_WAVE_SIZE.js +13 -0
- package/src/shade/renderer/shadow/contact/ContactShadowDispatchList.d.ts +65 -0
- package/src/shade/renderer/shadow/contact/ContactShadowDispatchList.d.ts.map +1 -0
- package/src/shade/renderer/shadow/contact/ContactShadowDispatchList.js +252 -0
- package/src/shade/renderer/shadow/contact/FINDINGS.md +413 -0
- package/src/shade/renderer/shadow/contact/chunk_contact_shadow_wavefront_extents.d.ts +29 -0
- package/src/shade/renderer/shadow/contact/chunk_contact_shadow_wavefront_extents.d.ts.map +1 -0
- package/src/shade/renderer/shadow/contact/chunk_contact_shadow_wavefront_extents.js +105 -0
- package/src/shade/renderer/shadow/contact/graph_contact_shadow_linear.d.ts +29 -0
- package/src/shade/renderer/shadow/contact/graph_contact_shadow_linear.d.ts.map +1 -0
- package/src/shade/renderer/shadow/contact/graph_contact_shadow_linear.js +39 -0
- package/src/shade/renderer/shadow/contact/graph_contact_shadow_wavefront.d.ts +29 -0
- package/src/shade/renderer/shadow/contact/graph_contact_shadow_wavefront.d.ts.map +1 -0
- package/src/shade/renderer/shadow/contact/graph_contact_shadow_wavefront.js +92 -0
- package/src/shade/renderer/shadow/contact/shader_contact_shadow_linear.d.ts +29 -0
- package/src/shade/renderer/shadow/contact/shader_contact_shadow_linear.d.ts.map +1 -0
- package/src/shade/renderer/shadow/contact/shader_contact_shadow_linear.js +128 -0
- package/src/shade/renderer/shadow/contact/shader_contact_shadow_wavefront.d.ts +52 -0
- package/src/shade/renderer/shadow/contact/shader_contact_shadow_wavefront.d.ts.map +1 -0
- package/src/shade/renderer/shadow/contact/shader_contact_shadow_wavefront.js +358 -0
- package/src/shade/renderer/shadow/map/ShadowDirectionalTechnique.d.ts +10 -0
- package/src/shade/renderer/shadow/map/ShadowDirectionalTechnique.d.ts.map +1 -0
- package/src/shade/renderer/shadow/map/ShadowDirectionalTechnique.js +12 -0
- package/src/shade/renderer/shadow/map/shader/SHADOW_DIRECTIONAL_TECHNIQUE.d.ts +13 -0
- package/src/shade/renderer/shadow/map/shader/SHADOW_DIRECTIONAL_TECHNIQUE.d.ts.map +1 -0
- package/src/shade/renderer/shadow/map/shader/SHADOW_DIRECTIONAL_TECHNIQUE.js +14 -0
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.d.ts +14 -8
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.js +20 -86
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional_cascades.d.ts +14 -0
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional_cascades.d.ts.map +1 -0
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional_cascades.js +79 -0
- package/src/shade/renderer/shadow/ray/shader_ray_shadow_code.d.ts.map +1 -1
- package/src/shade/renderer/shadow/ray/shader_ray_shadow_code.js +12 -12
- package/src/shade/renderer/shadow/ray/staged/gen/shader_generate_rays.d.ts.map +1 -1
- package/src/shade/renderer/shadow/ray/staged/gen/shader_generate_rays.js +153 -151
- package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_directional_virtual.d.ts +13 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_directional_virtual.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_directional_virtual.js +48 -0
- package/src/shade/renderer/texture/GPUTextureContext.d.ts +10 -0
- package/src/shade/renderer/texture/GPUTextureContext.d.ts.map +1 -1
- package/src/shade/renderer/texture/GPUTextureContext.js +24 -0
- package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.d.ts +219 -0
- package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.d.ts.map +1 -0
- package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.js +671 -0
- package/src/shade/renderer/volumetrics/GPUSceneVolumetrics.d.ts +26 -2
- package/src/shade/renderer/volumetrics/GPUSceneVolumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/GPUSceneVolumetrics.js +108 -4
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts +5 -1
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +6 -0
- package/src/shade/renderer/volumetrics/NOTES.md +50 -0
- package/src/shade/renderer/volumetrics/PARTICIPATING_MEDIA_VOLUME_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/PARTICIPATING_MEDIA_VOLUME_STRUCT.js +30 -1
- package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.d.ts +51 -13
- package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.js +98 -13
- package/src/shade/renderer/volumetrics/SceneVolumetrics.d.ts +9 -0
- package/src/shade/renderer/volumetrics/SceneVolumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/SceneVolumetrics.js +78 -68
- package/src/shade/renderer/volumetrics/VOLUMETRIC_NOISE_PLAN_2026_10_15.md +326 -0
- package/src/shade/renderer/volumetrics/chunk_participating_media_volume_sample.d.ts +7 -4
- package/src/shade/renderer/volumetrics/chunk_participating_media_volume_sample.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/chunk_participating_media_volume_sample.js +21 -9
- package/src/shade/renderer/volumetrics/chunk_volumetrics_froxel_uvw_from_clip.d.ts +19 -0
- package/src/shade/renderer/volumetrics/chunk_volumetrics_froxel_uvw_from_clip.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/chunk_volumetrics_froxel_uvw_from_clip.js +53 -0
- package/src/shade/renderer/volumetrics/chunk_volumetrics_sample_froxel_extinction.d.ts +12 -3
- package/src/shade/renderer/volumetrics/chunk_volumetrics_sample_froxel_extinction.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/chunk_volumetrics_sample_froxel_extinction.js +85 -48
- package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.d.ts +4 -1
- package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.js +4 -1
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts +4 -1
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +21 -1
- package/src/shade/renderer/volumetrics/noise/PARTICIPATING_MEDIA_NOISE.d.ts +98 -0
- package/src/shade/renderer/volumetrics/noise/PARTICIPATING_MEDIA_NOISE.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/noise/PARTICIPATING_MEDIA_NOISE.js +115 -0
- package/src/shade/renderer/volumetrics/noise/VOLUMETRICS_NOISE_TILE_BAKE_SETTINGS_STRUCT.d.ts +9 -0
- package/src/shade/renderer/volumetrics/noise/VOLUMETRICS_NOISE_TILE_BAKE_SETTINGS_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/noise/VOLUMETRICS_NOISE_TILE_BAKE_SETTINGS_STRUCT.js +24 -0
- package/src/shade/renderer/volumetrics/noise/bake_volumetrics_noise_tile.d.ts +27 -0
- package/src/shade/renderer/volumetrics/noise/bake_volumetrics_noise_tile.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/noise/bake_volumetrics_noise_tile.js +91 -0
- package/src/shade/renderer/volumetrics/noise/chunk_participating_media_noise.d.ts +35 -0
- package/src/shade/renderer/volumetrics/noise/chunk_participating_media_noise.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/noise/chunk_participating_media_noise.js +92 -0
- package/src/shade/renderer/volumetrics/noise/shader_volumetrics_noise_tile_bake.d.ts +10 -0
- package/src/shade/renderer/volumetrics/noise/shader_volumetrics_noise_tile_bake.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/noise/shader_volumetrics_noise_tile_bake.js +121 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.js +38 -3
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.js +311 -290
- package/src/shade/renderer/volumetrics/volumetrics_position_world_to_froxel_uvw.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/volumetrics_position_world_to_froxel_uvw.js +28 -49
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts +3 -1
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
- package/src/shade/renderer/water/GPUWaterRenderer.js +24 -18
- package/src/shade/renderer/water/chunk_water_transport.d.ts +0 -1
- package/src/shade/renderer/water/chunk_water_transport.d.ts.map +1 -1
- package/src/shade/renderer/water/chunk_water_transport.js +0 -17
- package/src/shade/renderer/water/shader_water.d.ts +4 -2
- package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
- package/src/shade/renderer/water/shader_water.js +27 -16
- package/src/shade/renderer/water/shader_water_avboit.d.ts +0 -4
- package/src/shade/renderer/water/shader_water_avboit.d.ts.map +1 -1
- package/src/shade/renderer/water/shader_water_avboit.js +0 -63
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +43 -9
- package/src/view/graphics/GraphicsContextFailureView.d.ts +1 -2
- package/src/view/graphics/GraphicsContextFailureView.d.ts.map +1 -1
- package/src/view/graphics/GraphicsContextFailureView.js +1 -2
- package/src/engine/network/transport/Channel.d.ts +0 -85
- package/src/engine/network/transport/Channel.d.ts.map +0 -1
- package/src/engine/network/transport/Channel.js +0 -336
- package/src/engine/network/transport/ReliableCommandPipeline.d.ts +0 -155
- package/src/engine/network/transport/ReliableCommandPipeline.d.ts.map +0 -1
- package/src/engine/network/transport/ReliableCommandPipeline.js +0 -335
- package/src/engine/network/transport/fragments/FragmentAssembler.d.ts +0 -105
- package/src/engine/network/transport/fragments/FragmentAssembler.d.ts.map +0 -1
- package/src/engine/network/transport/fragments/FragmentAssembler.js +0 -350
- package/src/engine/network/transport/fragments/FragmentRetention.d.ts +0 -103
- package/src/engine/network/transport/fragments/FragmentRetention.d.ts.map +0 -1
- package/src/engine/network/transport/fragments/FragmentRetention.js +0 -191
- package/src/engine/network/transport/fragments/fragment_send.d.ts +0 -61
- package/src/engine/network/transport/fragments/fragment_send.d.ts.map +0 -1
- package/src/engine/network/transport/fragments/fragment_send.js +0 -157
- package/src/engine/network/transport/fragments/packet_size.d.ts +0 -99
- package/src/engine/network/transport/fragments/packet_size.d.ts.map +0 -1
- package/src/engine/network/transport/fragments/packet_size.js +0 -107
- package/src/shade/renderer/shader/chunk/color/sRGB/chunk_RRTAndODTFit.d.ts +0 -6
- package/src/shade/renderer/shader/chunk/color/sRGB/chunk_RRTAndODTFit.d.ts.map +0 -1
- package/src/shade/renderer/shader/chunk/color/sRGB/chunk_RRTAndODTFit.js +0 -16
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_aces.d.ts +0 -7
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_aces.d.ts.map +0 -1
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_aces.js +0 -46
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_agx.d.ts +0 -10
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_agx.d.ts.map +0 -1
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_agx.js +0 -127
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_pbr_neutral.d.ts +0 -7
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_pbr_neutral.d.ts.map +0 -1
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_pbr_neutral.js +0 -39
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { assert } from "../../../core/assert.js";
|
|
2
2
|
import { BinaryBuffer } from "../../../core/binary/BinaryBuffer.js";
|
|
3
3
|
import { binarySearchHighIndex } from "../../../core/collection/array/binarySearchHighIndex.js";
|
|
4
|
-
import { fastArrayEquals } from "../../../core/collection/array/fastArrayEquals.js";
|
|
5
4
|
import Signal from "../../../core/events/signal/Signal.js";
|
|
6
5
|
import { number_compare_ascending } from "../../../core/primitives/numbers/number_compare_ascending.js";
|
|
7
6
|
import { NetworkIdentity } from "../ecs/components/NetworkIdentity.js";
|
|
@@ -11,6 +10,7 @@ import { AlwaysRelevantScope } from "../replication/ScopeFilter.js";
|
|
|
11
10
|
import { ActionRecordCursor } from "../sim/ActionRecordCursor.js";
|
|
12
11
|
import { RewindEngine } from "../sim/RewindEngine.js";
|
|
13
12
|
import { SENDER_DERIVED, SENDER_LOCAL, SENDER_RECORDED } from "../sim/SimActionExecutor.js";
|
|
13
|
+
import { RecordArrivalRing } from "../state/RecordArrivalRing.js";
|
|
14
14
|
import { NetworkPeer } from "./NetworkPeer.js";
|
|
15
15
|
|
|
16
16
|
/**
|
|
@@ -43,10 +43,12 @@ export const LateInput = Object.freeze({
|
|
|
43
43
|
* 1. Inbound action packets do NOT execute on arrival. Instead, a deferral
|
|
44
44
|
* hook on the {@link Replicator} drops them into a per-tick pending log
|
|
45
45
|
* tagged with `(client_frame, sender_id, type_id, payload_bytes)` —
|
|
46
|
-
* unless the
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
46
|
+
* unless the record has arrived before. A record is known by
|
|
47
|
+
* `(sender, frame, ordinal)`, never by its bytes; a per-sender
|
|
48
|
+
* {@link RecordArrivalRing} answers that. The action stream re-sends
|
|
49
|
+
* every unconfirmed frame each tick, so most arrivals at any real latency
|
|
50
|
+
* are copies of applied records; those are dropped where they arrive, and
|
|
51
|
+
* pending holds only input that is new.
|
|
50
52
|
* 2. Once per server tick, `tick(current_frame)` consumes the pending log:
|
|
51
53
|
* - Rejects entries older than the action_log's rewindable window.
|
|
52
54
|
* - Determines `replay_start`: the oldest pending frame, which by the
|
|
@@ -123,7 +125,7 @@ export class ServerAuthoritativeServer {
|
|
|
123
125
|
#carried_scratch = [];
|
|
124
126
|
#sort_scratch = /** @type {Array<{sender_id:number, type_id:number, payload:Uint8Array}>} */ ([]);
|
|
125
127
|
#payload_buf;
|
|
126
|
-
// Walks a frame's records, for the history read
|
|
128
|
+
// Walks a frame's records, for the history read.
|
|
127
129
|
#cursor = new ActionRecordCursor();
|
|
128
130
|
// Locally-authored actions waiting for the next fresh frame. Parallel
|
|
129
131
|
// arrays, serialized at enqueue time so the caller's instance is not
|
|
@@ -133,8 +135,8 @@ export class ServerAuthoritativeServer {
|
|
|
133
135
|
#local_payloads = /** @type {Uint8Array[]} */ ([]);
|
|
134
136
|
#local_buf;
|
|
135
137
|
/**
|
|
136
|
-
* Count of inbound pending entries dropped
|
|
137
|
-
*
|
|
138
|
+
* Count of inbound pending entries dropped: tagged past the future horizon, below the
|
|
139
|
+
* rewindable window, or over the total cap. See {@link onPendingActionDropped}.
|
|
138
140
|
* @private @type {number}
|
|
139
141
|
*/
|
|
140
142
|
#pending_dropped = 0;
|
|
@@ -144,13 +146,15 @@ export class ServerAuthoritativeServer {
|
|
|
144
146
|
*/
|
|
145
147
|
#open_sim_frame = -1;
|
|
146
148
|
/**
|
|
147
|
-
*
|
|
148
|
-
*
|
|
149
|
-
*
|
|
150
|
-
*
|
|
151
|
-
*
|
|
149
|
+
* Per sender, which records of its frames have arrived — by the frame the sender tagged and the
|
|
150
|
+
* record's ordinal in that frame, which is a record's identity on the stream. The stream re-sends
|
|
151
|
+
* every unconfirmed frame each tick, and this is how a copy is told from a new record; the bytes
|
|
152
|
+
* take no part (see {@link #pending_add}). A ring spans the oldest rewindable frame to the future
|
|
153
|
+
* horizon; what is tagged outside that is dropped before it is marked. Never cleared for a peer:
|
|
154
|
+
* one that drops and resumes re-sends what was not acknowledged, some of which has been applied.
|
|
155
|
+
* @type {Map<number, RecordArrivalRing>}
|
|
152
156
|
*/
|
|
153
|
-
#
|
|
157
|
+
#arrivals = new Map();
|
|
154
158
|
|
|
155
159
|
/**
|
|
156
160
|
* Most recently simulated frame. `-1` during warmup
|
|
@@ -172,11 +176,19 @@ export class ServerAuthoritativeServer {
|
|
|
172
176
|
* simulation_delay_ticks?: number,
|
|
173
177
|
* max_packets_per_tick?: number,
|
|
174
178
|
* late_input?: LateInput|string,
|
|
179
|
+
* clock: function(): number,
|
|
180
|
+
* tick_period_ms: number,
|
|
181
|
+
* send_rate_bytes_per_second?: number,
|
|
182
|
+
* max_message_bytes?: number,
|
|
183
|
+
* receive_window_bytes?: number,
|
|
184
|
+
* max_queued_bytes?: number,
|
|
175
185
|
* }} options
|
|
176
186
|
*
|
|
177
187
|
* `max_packets_per_tick`: forwarded to {@link NetworkPeer}; how many
|
|
178
188
|
* action-stream packets a tick may send one peer.
|
|
179
189
|
*
|
|
190
|
+
* `clock`, `tick_period_ms` and the connection options: forwarded to {@link NetworkPeer}.
|
|
191
|
+
*
|
|
180
192
|
* `late_input`: see {@link LateInput}. Default {@link LateInput.Rollback}.
|
|
181
193
|
*
|
|
182
194
|
* `simulation_delay_ticks`: server-side input buffer (Overwatch-style).
|
|
@@ -199,14 +211,22 @@ export class ServerAuthoritativeServer {
|
|
|
199
211
|
simulation_delay_ticks = 0,
|
|
200
212
|
max_pending_future_lead = 256,
|
|
201
213
|
max_pending_total = 4096,
|
|
214
|
+
max_records_per_frame = 4096,
|
|
202
215
|
identity_class = NetworkIdentity,
|
|
203
216
|
server_peer_id = -1,
|
|
204
217
|
max_packets_per_tick,
|
|
205
218
|
late_input = LateInput.Rollback,
|
|
219
|
+
clock,
|
|
220
|
+
tick_period_ms,
|
|
221
|
+
send_rate_bytes_per_second,
|
|
222
|
+
max_message_bytes,
|
|
223
|
+
receive_window_bytes,
|
|
224
|
+
max_queued_bytes,
|
|
206
225
|
}) {
|
|
207
226
|
assert.isNonNegativeInteger(simulation_delay_ticks, 'simulation_delay_ticks');
|
|
208
227
|
assert.isPositiveInteger(max_pending_future_lead, 'max_pending_future_lead');
|
|
209
228
|
assert.isPositiveInteger(max_pending_total, 'max_pending_total');
|
|
229
|
+
assert.isPositiveInteger(max_records_per_frame, 'max_records_per_frame');
|
|
210
230
|
if (late_input !== LateInput.Rollback && late_input !== LateInput.Apply) {
|
|
211
231
|
throw new Error(`ServerAuthoritativeServer: late_input must be one of ${Object.values(LateInput).join(', ')}, got '${late_input}'`);
|
|
212
232
|
}
|
|
@@ -227,6 +247,12 @@ export class ServerAuthoritativeServer {
|
|
|
227
247
|
frame_capacity,
|
|
228
248
|
initial_buffer_size,
|
|
229
249
|
max_packets_per_tick,
|
|
250
|
+
clock,
|
|
251
|
+
tick_period_ms,
|
|
252
|
+
send_rate_bytes_per_second,
|
|
253
|
+
max_message_bytes,
|
|
254
|
+
receive_window_bytes,
|
|
255
|
+
max_queued_bytes,
|
|
230
256
|
});
|
|
231
257
|
|
|
232
258
|
/** @type {EntityComponentDataset} */
|
|
@@ -302,16 +328,27 @@ export class ServerAuthoritativeServer {
|
|
|
302
328
|
|
|
303
329
|
/**
|
|
304
330
|
* Absolute backstop on the number of buffered pending entries. Even
|
|
305
|
-
* within the future window a peer can
|
|
306
|
-
*
|
|
307
|
-
*
|
|
308
|
-
*
|
|
309
|
-
*
|
|
310
|
-
* counts.
|
|
331
|
+
* within the future window a peer can claim as many ordinals per frame
|
|
332
|
+
* as it likes and pile up distinct entries; this caps total memory
|
|
333
|
+
* regardless. Legitimate pending depth is tiny (≈ delay × actions/frame
|
|
334
|
+
* × peers), so this only ever trips under abuse. Raise it for very high
|
|
335
|
+
* concurrent-player counts.
|
|
311
336
|
* @type {number}
|
|
312
337
|
*/
|
|
313
338
|
this.max_pending_total = max_pending_total;
|
|
314
339
|
|
|
340
|
+
/**
|
|
341
|
+
* Upper bound on a record's ordinal — its index in the sender's frame.
|
|
342
|
+
* The ordinal is an attacker-controlled varint and the arrival ring
|
|
343
|
+
* sizes its per-frame bitsets to the ordinals it is asked to mark, so
|
|
344
|
+
* without a ceiling one record claiming to be its frame's 2^30th is a
|
|
345
|
+
* request for gigabytes. A frame is one step of a sender's input;
|
|
346
|
+
* thousands of records in one is not input. Dropped records are
|
|
347
|
+
* reported `'ordinal'` on {@link onPendingActionDropped}.
|
|
348
|
+
* @type {number}
|
|
349
|
+
*/
|
|
350
|
+
this.max_records_per_frame = max_records_per_frame;
|
|
351
|
+
|
|
315
352
|
/**
|
|
316
353
|
* Running watermark per peer: highest client-tagged frame received
|
|
317
354
|
* from each peer. {@link buffer_depth_for_peer} reads this minus
|
|
@@ -338,10 +375,11 @@ export class ServerAuthoritativeServer {
|
|
|
338
375
|
|
|
339
376
|
// Switch the Replicator to deferred-execute mode: incoming actions
|
|
340
377
|
// accumulate in pending until tick() drains them.
|
|
341
|
-
this.peer.replicator.on_pending_action = (peer_id, frame_number, type_id, buf, off, len) => {
|
|
378
|
+
this.peer.replicator.on_pending_action = (peer_id, frame_number, type_id, buf, off, len, ordinal) => {
|
|
379
|
+
assert.isNonNegativeInteger(ordinal, 'ordinal');
|
|
342
380
|
const payload = new Uint8Array(len);
|
|
343
381
|
payload.set(buf.raw_bytes.subarray(off, off + len));
|
|
344
|
-
this.#pending_add(frame_number, peer_id, type_id, payload);
|
|
382
|
+
this.#pending_add(frame_number, ordinal, peer_id, type_id, payload);
|
|
345
383
|
if (frame_number > this.last_client_frame_processed) {
|
|
346
384
|
this.last_client_frame_processed = frame_number;
|
|
347
385
|
}
|
|
@@ -422,11 +460,21 @@ export class ServerAuthoritativeServer {
|
|
|
422
460
|
this.onRewind = new Signal();
|
|
423
461
|
|
|
424
462
|
/**
|
|
425
|
-
* Fired when an inbound pending action is dropped
|
|
426
|
-
*
|
|
427
|
-
*
|
|
428
|
-
* `'
|
|
429
|
-
*
|
|
463
|
+
* Fired when an inbound pending action is dropped. Args:
|
|
464
|
+
* `(sender_id, frame_number, reason)` where `reason` is `'future'` (tagged
|
|
465
|
+
* past the future horizon), `'capacity'` (the total cap: a flood),
|
|
466
|
+
* `'ordinal'` (a record claiming an index in its frame past
|
|
467
|
+
* `max_records_per_frame`: not input) or `'window'` (tagged for a frame
|
|
468
|
+
* older than the log can rewind to, so it can never be applied where it
|
|
469
|
+
* was tagged — a client that stalled, or one far behind the host's
|
|
470
|
+
* time). A copy of a record that was accepted is recognised before any
|
|
471
|
+
* of these and never reported, however old its frame has become. A
|
|
472
|
+
* record that was never accepted is reported once per copy that
|
|
473
|
+
* arrives: a stalled client's frame is re-sent until its
|
|
474
|
+
* acknowledgement round-trips, so one lost input shows as a few of
|
|
475
|
+
* these. Observable so an abusive peer can be logged / kicked, and so a
|
|
476
|
+
* game can see input that vanished; until 2026-10-15 the `'window'`
|
|
477
|
+
* case was silent. The dropped action is simply not buffered.
|
|
430
478
|
* @type {Signal}
|
|
431
479
|
*/
|
|
432
480
|
this.onPendingActionDropped = new Signal();
|
|
@@ -466,12 +514,11 @@ export class ServerAuthoritativeServer {
|
|
|
466
514
|
}
|
|
467
515
|
|
|
468
516
|
/**
|
|
469
|
-
*
|
|
470
|
-
* empty ACK packets in the prototype). Most callers won't need this.
|
|
517
|
+
* A peer's connection, for diagnostics. See {@link NetworkPeer#connection_for}.
|
|
471
518
|
* @param {number} peer_id
|
|
472
519
|
*/
|
|
473
|
-
|
|
474
|
-
return this.peer.
|
|
520
|
+
connection_for(peer_id) {
|
|
521
|
+
return this.peer.connection_for(peer_id);
|
|
475
522
|
}
|
|
476
523
|
|
|
477
524
|
/**
|
|
@@ -484,7 +531,7 @@ export class ServerAuthoritativeServer {
|
|
|
484
531
|
* @param {number} peer_id
|
|
485
532
|
*/
|
|
486
533
|
send_time_dilation_feedback(peer_id) {
|
|
487
|
-
this.peer.send_time_dilation_feedback(peer_id, this.buffer_depth_for_peer(peer_id));
|
|
534
|
+
this.peer.send_time_dilation_feedback(peer_id, this.buffer_depth_for_peer(peer_id), Math.max(0, this.current_sim_frame));
|
|
488
535
|
}
|
|
489
536
|
|
|
490
537
|
/**
|
|
@@ -597,11 +644,6 @@ export class ServerAuthoritativeServer {
|
|
|
597
644
|
if (this.#pending_frames.length > 0 && this.#pending_referenced_frames[0] < window_oldest) {
|
|
598
645
|
this.#pending_trim_to_window(window_oldest);
|
|
599
646
|
}
|
|
600
|
-
if (this.#folded.size > 0) {
|
|
601
|
-
for (const frame of this.#folded.keys()) {
|
|
602
|
-
if (frame < window_oldest) this.#folded.delete(frame);
|
|
603
|
-
}
|
|
604
|
-
}
|
|
605
647
|
|
|
606
648
|
// 1a. Late input folded into this frame instead of rolled back to its own.
|
|
607
649
|
if (this.late_input === LateInput.Apply) {
|
|
@@ -652,13 +694,18 @@ export class ServerAuthoritativeServer {
|
|
|
652
694
|
|
|
653
695
|
/**
|
|
654
696
|
* Second half of a tick: run {@link onLocalSim} for the open frame, close it, publish the new
|
|
655
|
-
* {@link current_sim_frame},
|
|
656
|
-
*
|
|
697
|
+
* {@link current_sim_frame}, queue the action stream, fire {@link onTickComplete}, and send
|
|
698
|
+
* everything queued — what the handlers queued included, so the tick leaves together. After a
|
|
699
|
+
* warmup {@link begin_tick} it only sends what is queued.
|
|
657
700
|
*/
|
|
658
701
|
end_tick() {
|
|
659
702
|
const sim_frame = this.#open_sim_frame;
|
|
660
703
|
|
|
661
|
-
if (sim_frame === -1)
|
|
704
|
+
if (sim_frame === -1) {
|
|
705
|
+
// warmup, or no begin_tick: nothing simulated, but answers and acknowledgements go
|
|
706
|
+
this.peer.send_queued();
|
|
707
|
+
return;
|
|
708
|
+
}
|
|
662
709
|
|
|
663
710
|
this.#open_sim_frame = -1;
|
|
664
711
|
|
|
@@ -672,6 +719,7 @@ export class ServerAuthoritativeServer {
|
|
|
672
719
|
this.current_sim_frame = sim_frame;
|
|
673
720
|
this.peer.flush_outbound(sim_frame);
|
|
674
721
|
this.onTickComplete.send1(sim_frame);
|
|
722
|
+
this.peer.send_queued();
|
|
675
723
|
}
|
|
676
724
|
|
|
677
725
|
/**
|
|
@@ -698,47 +746,6 @@ export class ServerAuthoritativeServer {
|
|
|
698
746
|
return max - this.current_sim_frame;
|
|
699
747
|
}
|
|
700
748
|
|
|
701
|
-
/**
|
|
702
|
-
* Walk `action_log[frame_number]` looking for a record identical to
|
|
703
|
-
* `(sender_id, type_id, payload)`. Compares the payload in place against
|
|
704
|
-
* the log's own bytes — no copy, unlike {@link __read_historical}, because
|
|
705
|
-
* this runs once per arriving action.
|
|
706
|
-
*
|
|
707
|
-
* The key can only recognise records the log actually holds. An action
|
|
708
|
-
* the executor REJECTED (owner authorization) writes nothing, so each of
|
|
709
|
-
* its retransmissions still reads as new input and still costs a rewind —
|
|
710
|
-
* self-limiting, because the sender stops re-sending the frame once it is
|
|
711
|
-
* acked.
|
|
712
|
-
*
|
|
713
|
-
* Caller must have checked `action_log.has_frame(frame_number)`, and that
|
|
714
|
-
* the frame is closed.
|
|
715
|
-
*
|
|
716
|
-
* @param {number} frame_number
|
|
717
|
-
* @param {number} sender_id
|
|
718
|
-
* @param {number} type_id
|
|
719
|
-
* @param {Uint8Array} payload
|
|
720
|
-
* @returns {boolean}
|
|
721
|
-
* @private
|
|
722
|
-
*/
|
|
723
|
-
#log_holds_record(frame_number, sender_id, type_id, payload) {
|
|
724
|
-
const cursor = this.#cursor;
|
|
725
|
-
cursor.open(this.action_log, frame_number);
|
|
726
|
-
const bytes = cursor.buffer.raw_bytes;
|
|
727
|
-
while (cursor.next()) {
|
|
728
|
-
if (cursor.action_type_id !== type_id) continue;
|
|
729
|
-
if (cursor.sender_id !== sender_id) continue;
|
|
730
|
-
if (cursor.payload_len !== payload.length) continue;
|
|
731
|
-
|
|
732
|
-
const payload_start = cursor.payload_start;
|
|
733
|
-
let same = true;
|
|
734
|
-
for (let i = 0; i < payload.length; i++) {
|
|
735
|
-
if (bytes[payload_start + i] !== payload[i]) { same = false; break; }
|
|
736
|
-
}
|
|
737
|
-
if (same) return true;
|
|
738
|
-
}
|
|
739
|
-
return false;
|
|
740
|
-
}
|
|
741
|
-
|
|
742
749
|
/**
|
|
743
750
|
* Execute frame `f` whole: {@link #open_frame} then {@link #close_frame}.
|
|
744
751
|
*
|
|
@@ -773,32 +780,17 @@ export class ServerAuthoritativeServer {
|
|
|
773
780
|
this.#sort_scratch.push({ sender_id: h.sender_id, type_id: h.type_id, payload: h.payload });
|
|
774
781
|
}
|
|
775
782
|
|
|
776
|
-
// Append the pending actions for this frame.
|
|
777
|
-
//
|
|
778
|
-
//
|
|
779
|
-
//
|
|
780
|
-
// that reached this point would merge with the historical record and
|
|
781
|
-
// execute the action twice, diverging the world, and the cost of the
|
|
782
|
-
// check is a scan of a small frame's copied history.
|
|
783
|
-
//
|
|
784
|
-
// Dedup key: (sender_id, type_id, payload bytes). Two actions are
|
|
785
|
-
// "the same arrival" if all three match. (Same sender_id and
|
|
786
|
-
// type_id but different payload = legitimately distinct actions
|
|
787
|
-
// for the same frame, e.g. fire + move in the same tick.)
|
|
783
|
+
// Append the pending actions for this frame. Pending holds only records that had not
|
|
784
|
+
// arrived before (see #pending_add): a copy of what the log already holds is recognised on
|
|
785
|
+
// arrival by its identity and never gets here, so nothing in it duplicates history. Nothing
|
|
786
|
+
// is compared by bytes — two records alike in every byte are two records (a held key).
|
|
788
787
|
for (let i = 0; i < this.#pending_frames.length; i++) {
|
|
789
788
|
if (this.#pending_frames[i] !== f) continue;
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
const h = this.#historical_scratch[j];
|
|
796
|
-
if (h.sender_id !== p_sender) continue;
|
|
797
|
-
if (h.type_id !== p_type) continue;
|
|
798
|
-
if (fastArrayEquals(h.payload, p_payload)) { is_dup = true; break; }
|
|
799
|
-
}
|
|
800
|
-
if (is_dup) continue;
|
|
801
|
-
this.#sort_scratch.push({ sender_id: p_sender, type_id: p_type, payload: p_payload });
|
|
789
|
+
this.#sort_scratch.push({
|
|
790
|
+
sender_id: this.#pending_senders[i],
|
|
791
|
+
type_id: this.#pending_type_ids[i],
|
|
792
|
+
payload: this.#pending_payloads[i],
|
|
793
|
+
});
|
|
802
794
|
}
|
|
803
795
|
|
|
804
796
|
// Locally-authored actions join the merge as input, and only on the
|
|
@@ -957,80 +949,88 @@ export class ServerAuthoritativeServer {
|
|
|
957
949
|
}
|
|
958
950
|
|
|
959
951
|
/**
|
|
960
|
-
* Number of inbound pending actions dropped
|
|
961
|
-
*
|
|
952
|
+
* Number of inbound pending actions dropped so far — tagged past the future horizon, below the
|
|
953
|
+
* rewindable window, or over the total cap. See {@link onPendingActionDropped}.
|
|
962
954
|
* @returns {number}
|
|
963
955
|
*/
|
|
964
956
|
pending_dropped_count() {
|
|
965
957
|
return this.#pending_dropped;
|
|
966
958
|
}
|
|
967
959
|
|
|
968
|
-
/**
|
|
969
|
-
|
|
960
|
+
/**
|
|
961
|
+
* Take a record the stream delivered into pending, or drop it and say so: tagged past the
|
|
962
|
+
* future horizon (`'future'`), below the oldest frame the log can still rewind to (`'window'`),
|
|
963
|
+
* claiming an ordinal past `max_records_per_frame` (`'ordinal'`), or over the total cap
|
|
964
|
+
* (`'capacity'`). A copy of a record that has arrived already is not input
|
|
965
|
+
* and is dropped without a word: `Replicator.pack_for_peer` packs every frame in
|
|
966
|
+
* [last_acked + 1, current_frame] each tick, so a record arrives once per tick until its ack
|
|
967
|
+
* round-trips, and copies are the common case.
|
|
968
|
+
*
|
|
969
|
+
* A record is known by the frame its sender tagged it for and its ordinal in that frame — never
|
|
970
|
+
* by its bytes. Two inputs with the same payload at different ordinals, or in different frames,
|
|
971
|
+
* are two inputs; a held key is the same payload every frame. Until 2026-10-15 copies were
|
|
972
|
+
* recognised by `(sender, type, payload)` against pending, against the log's records at the
|
|
973
|
+
* frame, and against a side-table of late input folded elsewhere, and a held key whose input
|
|
974
|
+
* arrived late and was folded into one frame lost 44% of it (measured; the spec is
|
|
975
|
+
* `NetworkSession.late_input.spec.js`). The arrival ring answers in constant time, and what it
|
|
976
|
+
* admits is what pending holds, so `tick` takes the oldest pending frame as its replay window
|
|
977
|
+
* without a second look and `#open_frame` merges pending into history without comparing.
|
|
978
|
+
*
|
|
979
|
+
* @param {number} frame_number
|
|
980
|
+
* @param {number} ordinal the record's index in the sender's frame, from the wire
|
|
981
|
+
* @param {number} sender_id
|
|
982
|
+
* @param {number} type_id
|
|
983
|
+
* @param {Uint8Array} payload
|
|
984
|
+
* @private
|
|
985
|
+
*/
|
|
986
|
+
#pending_add(frame_number, ordinal, sender_id, type_id, payload) {
|
|
987
|
+
const ring = this.#arrival_ring_for(sender_id);
|
|
988
|
+
|
|
989
|
+
// A copy first — already pending, already in the log, or already folded into a later
|
|
990
|
+
// frame. Before the bounds, because a record applied at the edge of the window is re-sent
|
|
991
|
+
// until its acknowledgement round-trips, and by then its frame is below the window: those
|
|
992
|
+
// copies are the stream's redundancy, not lost input, and are not reported. (`has` never
|
|
993
|
+
// grows the ring, whatever the ordinal.)
|
|
994
|
+
if (ring.has(frame_number, ordinal)) return;
|
|
995
|
+
|
|
970
996
|
// Reject far-future frame numbers. `frame_number` is an attacker-
|
|
971
|
-
// controlled varint;
|
|
972
|
-
//
|
|
973
|
-
//
|
|
974
|
-
//
|
|
975
|
-
//
|
|
976
|
-
|
|
997
|
+
// controlled varint; without this ceiling a peer can pin unbounded
|
|
998
|
+
// memory by tagging actions near 2^32. A well-behaved client tags at
|
|
999
|
+
// most ~simulation_delay_ticks ahead plus jitter lead. Real runtime
|
|
1000
|
+
// check — asserts strip in prod. The horizon is also no further than
|
|
1001
|
+
// this sender's ring tells frames apart: the ring was sized from the
|
|
1002
|
+
// lead at the sender's first record, and a lead raised since must not
|
|
1003
|
+
// put a record in a live frame's slot.
|
|
1004
|
+
const future_horizon = Math.min(
|
|
1005
|
+
this.current_sim_frame + this.simulation_delay_ticks + this.max_pending_future_lead,
|
|
1006
|
+
this.#window_oldest() + ring.frame_span - 1,
|
|
1007
|
+
);
|
|
977
1008
|
if (frame_number > future_horizon) {
|
|
978
|
-
this.#
|
|
979
|
-
this.onPendingActionDropped.send3(sender_id, frame_number, 'future');
|
|
1009
|
+
this.#drop_pending(sender_id, frame_number, 'future');
|
|
980
1010
|
return;
|
|
981
1011
|
}
|
|
982
|
-
//
|
|
983
|
-
//
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
1012
|
+
// And the past: tagged below the oldest frame the log can rewind to, a record can never be
|
|
1013
|
+
// applied where it was tagged — a late-applying host folds only what is inside the window
|
|
1014
|
+
// (see begin_tick). Dropped here rather than by the next tick's trim, so that it is never
|
|
1015
|
+
// marked: the arrival ring tells frames apart only from the window to the horizon.
|
|
1016
|
+
if (frame_number < this.#window_oldest()) {
|
|
1017
|
+
this.#drop_pending(sender_id, frame_number, 'window');
|
|
987
1018
|
return;
|
|
988
1019
|
}
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
// an action arrives once per tick until its ack round-trips, and
|
|
993
|
-
// several copies can land in the same server tick when the round trip
|
|
994
|
-
// exceeds the tick period. A copy is recognised by its whole identity,
|
|
995
|
-
// (sender_id, type_id, payload bytes) — distinct payloads from the
|
|
996
|
-
// same sender at the same frame are legitimately different actions
|
|
997
|
-
// (move + fire) and both flow through.
|
|
998
|
-
//
|
|
999
|
-
// First against everything already pending for the frame, which
|
|
1000
|
-
// catches the copies that arrive before the frame is simulated.
|
|
1001
|
-
for (let i = 0; i < this.#pending_frames.length; i++) {
|
|
1002
|
-
if (this.#pending_frames[i] !== frame_number) continue;
|
|
1003
|
-
if (this.#pending_senders[i] !== sender_id) continue;
|
|
1004
|
-
if (this.#pending_type_ids[i] !== type_id) continue;
|
|
1005
|
-
if (fastArrayEquals(this.#pending_payloads[i], payload)) return; // duplicate already in pending; drop
|
|
1006
|
-
}
|
|
1007
|
-
|
|
1008
|
-
// Then against the action log, which catches the copies that arrive
|
|
1009
|
-
// after it. A record the log already holds is not input — applying it
|
|
1010
|
-
// again would apply the action twice, and rewinding for it would
|
|
1011
|
-
// replay the world into the state it is already in — so it is dropped
|
|
1012
|
-
// here, and pending holds only input the log does not. That is what
|
|
1013
|
-
// lets `tick` take the oldest pending frame as its replay window
|
|
1014
|
-
// without a second look.
|
|
1015
|
-
//
|
|
1016
|
-
// Frames are only open inside `tick`, and packets arrive between
|
|
1017
|
-
// ticks, so an open frame here means a call pattern this orchestrator
|
|
1018
|
-
// does not support (a packet delivered from inside a local-sim
|
|
1019
|
-
// handler). The check is skipped rather than reading an open frame's
|
|
1020
|
-
// stale length; the copy then costs one spurious rewind, and
|
|
1021
|
-
// `__replay_frame`'s own dedup keeps it from applying twice.
|
|
1022
|
-
if (this.action_log.has_frame(frame_number)
|
|
1023
|
-
&& !this.action_log.has_open_frame()
|
|
1024
|
-
&& this.#log_holds_record(frame_number, sender_id, type_id, payload)) {
|
|
1020
|
+
// And the ordinal, which sizes the arrival ring's bitsets: bounded before the ring sees it.
|
|
1021
|
+
if (ordinal >= this.max_records_per_frame) {
|
|
1022
|
+
this.#drop_pending(sender_id, frame_number, 'ordinal');
|
|
1025
1023
|
return;
|
|
1026
1024
|
}
|
|
1027
|
-
|
|
1028
|
-
//
|
|
1029
|
-
|
|
1030
|
-
|
|
1025
|
+
// Absolute backstop on buffered entries: within the window and the
|
|
1026
|
+
// ordinal bound a peer can still pile up distinct entries.
|
|
1027
|
+
if (this.#pending_frames.length >= this.max_pending_total) {
|
|
1028
|
+
this.#drop_pending(sender_id, frame_number, 'capacity');
|
|
1031
1029
|
return;
|
|
1032
1030
|
}
|
|
1033
1031
|
|
|
1032
|
+
ring.mark(frame_number, ordinal);
|
|
1033
|
+
|
|
1034
1034
|
this.#pending_frames.push(frame_number);
|
|
1035
1035
|
this.#pending_senders.push(sender_id);
|
|
1036
1036
|
this.#pending_type_ids.push(type_id);
|
|
@@ -1038,6 +1038,45 @@ export class ServerAuthoritativeServer {
|
|
|
1038
1038
|
this.#track_referenced_frame(frame_number);
|
|
1039
1039
|
}
|
|
1040
1040
|
|
|
1041
|
+
/**
|
|
1042
|
+
* The oldest frame the log can still rewind to, as of the last simulated frame.
|
|
1043
|
+
* @returns {number}
|
|
1044
|
+
* @private
|
|
1045
|
+
*/
|
|
1046
|
+
#window_oldest() {
|
|
1047
|
+
return Math.max(0, this.current_sim_frame - this.action_log.frame_capacity + 1);
|
|
1048
|
+
}
|
|
1049
|
+
|
|
1050
|
+
/**
|
|
1051
|
+
* @param {number} sender_id
|
|
1052
|
+
* @returns {RecordArrivalRing}
|
|
1053
|
+
* @private
|
|
1054
|
+
*/
|
|
1055
|
+
#arrival_ring_for(sender_id) {
|
|
1056
|
+
let ring = this.#arrivals.get(sender_id);
|
|
1057
|
+
if (ring === undefined) {
|
|
1058
|
+
// every frame a record can be accepted for, from the oldest rewindable to the horizon,
|
|
1059
|
+
// as the bounds stand at the sender's first record; `#pending_add` clamps the horizon
|
|
1060
|
+
// to it afterwards, so raising `max_pending_future_lead` reaches new senders only
|
|
1061
|
+
ring = new RecordArrivalRing({
|
|
1062
|
+
frame_span: this.action_log.frame_capacity + this.simulation_delay_ticks + this.max_pending_future_lead + 1,
|
|
1063
|
+
});
|
|
1064
|
+
this.#arrivals.set(sender_id, ring);
|
|
1065
|
+
}
|
|
1066
|
+
return ring;
|
|
1067
|
+
}
|
|
1068
|
+
|
|
1069
|
+
/**
|
|
1070
|
+
* @param {number} sender_id
|
|
1071
|
+
* @param {number} frame_number
|
|
1072
|
+
* @param {'future'|'window'|'ordinal'|'capacity'} reason
|
|
1073
|
+
* @private
|
|
1074
|
+
*/
|
|
1075
|
+
#drop_pending(sender_id, frame_number, reason) {
|
|
1076
|
+
this.#pending_dropped++;
|
|
1077
|
+
this.onPendingActionDropped.send3(sender_id, frame_number, reason);
|
|
1078
|
+
}
|
|
1079
|
+
|
|
1041
1080
|
/**
|
|
1042
1081
|
* Insert `frame_number` into the monotonically-sorted referenced-frames
|
|
1043
1082
|
* index, leaving it untouched if already present. Single source of truth
|
|
@@ -1053,7 +1092,12 @@ export class ServerAuthoritativeServer {
|
|
|
1053
1092
|
if (arr[i] !== frame_number) arr.splice(i, 0, frame_number);
|
|
1054
1093
|
}
|
|
1055
1094
|
|
|
1056
|
-
/**
|
|
1095
|
+
/**
|
|
1096
|
+
* Drop every pending entry tagged below `window_oldest` — input that waited in pending while the
|
|
1097
|
+
* window moved past it — and report each (`'window'`).
|
|
1098
|
+
* @param {number} window_oldest
|
|
1099
|
+
* @private
|
|
1100
|
+
*/
|
|
1057
1101
|
#pending_trim_to_window(window_oldest) {
|
|
1058
1102
|
let kept = 0;
|
|
1059
1103
|
for (let i = 0; i < this.#pending_frames.length; i++) {
|
|
@@ -1063,6 +1107,8 @@ export class ServerAuthoritativeServer {
|
|
|
1063
1107
|
this.#pending_type_ids[kept] = this.#pending_type_ids[i];
|
|
1064
1108
|
this.#pending_payloads[kept] = this.#pending_payloads[i];
|
|
1065
1109
|
kept++;
|
|
1110
|
+
} else {
|
|
1111
|
+
this.#drop_pending(this.#pending_senders[i], this.#pending_frames[i], 'window');
|
|
1066
1112
|
}
|
|
1067
1113
|
}
|
|
1068
1114
|
this.#pending_frames.length = kept;
|
|
@@ -1077,7 +1123,9 @@ export class ServerAuthoritativeServer {
|
|
|
1077
1123
|
|
|
1078
1124
|
/**
|
|
1079
1125
|
* {@link LateInput.Apply}: move every pending entry tagged for a frame before `sim_frame` into
|
|
1080
|
-
* `sim_frame
|
|
1126
|
+
* `sim_frame`. Only where the record is applied moves: its identity is the frame its sender
|
|
1127
|
+
* tagged and its ordinal there, marked in the arrival ring when it came, so its copies are still
|
|
1128
|
+
* recognised, and two folded records alike in every byte are still two records.
|
|
1081
1129
|
* @param {number} sim_frame
|
|
1082
1130
|
* @private
|
|
1083
1131
|
*/
|
|
@@ -1086,20 +1134,7 @@ export class ServerAuthoritativeServer {
|
|
|
1086
1134
|
let folded_any = false;
|
|
1087
1135
|
|
|
1088
1136
|
for (let i = 0; i < frames.length; i++) {
|
|
1089
|
-
|
|
1090
|
-
if (frame >= sim_frame) continue;
|
|
1091
|
-
|
|
1092
|
-
let list = this.#folded.get(frame);
|
|
1093
|
-
if (list === undefined) {
|
|
1094
|
-
list = [];
|
|
1095
|
-
this.#folded.set(frame, list);
|
|
1096
|
-
}
|
|
1097
|
-
list.push({
|
|
1098
|
-
sender_id: this.#pending_senders[i],
|
|
1099
|
-
type_id: this.#pending_type_ids[i],
|
|
1100
|
-
payload: this.#pending_payloads[i],
|
|
1101
|
-
});
|
|
1102
|
-
|
|
1137
|
+
if (frames[i] >= sim_frame) continue;
|
|
1103
1138
|
frames[i] = sim_frame;
|
|
1104
1139
|
folded_any = true;
|
|
1105
1140
|
}
|
|
@@ -1112,26 +1147,6 @@ export class ServerAuthoritativeServer {
|
|
|
1112
1147
|
}
|
|
1113
1148
|
}
|
|
1114
1149
|
|
|
1115
|
-
/**
|
|
1116
|
-
* @param {number} frame_number
|
|
1117
|
-
* @param {number} sender_id
|
|
1118
|
-
* @param {number} type_id
|
|
1119
|
-
* @param {Uint8Array} payload
|
|
1120
|
-
* @returns {boolean}
|
|
1121
|
-
* @private
|
|
1122
|
-
*/
|
|
1123
|
-
#was_folded(frame_number, sender_id, type_id, payload) {
|
|
1124
|
-
const list = this.#folded.get(frame_number);
|
|
1125
|
-
if (list === undefined) return false;
|
|
1126
|
-
for (let i = 0; i < list.length; i++) {
|
|
1127
|
-
const f = list[i];
|
|
1128
|
-
if (f.sender_id === sender_id && f.type_id === type_id && fastArrayEquals(f.payload, payload)) {
|
|
1129
|
-
return true;
|
|
1130
|
-
}
|
|
1131
|
-
}
|
|
1132
|
-
return false;
|
|
1133
|
-
}
|
|
1134
|
-
|
|
1135
1150
|
/** @private */
|
|
1136
1151
|
#pending_clear() {
|
|
1137
1152
|
this.#pending_frames.length = 0;
|