@babylonjs/core 9.11.0 → 9.12.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/Actions/actionManager.d.ts +1 -1
- package/Actions/actionManager.js +8 -5
- package/Actions/actionManager.js.map +1 -1
- package/Animations/animatable.core.d.ts +1 -1
- package/Animations/animatable.core.js +2 -2
- package/Animations/animatable.core.js.map +1 -1
- package/Animations/animationPropertiesOverride.js +1 -1
- package/Animations/animationPropertiesOverride.js.map +1 -1
- package/Animations/animatorAvatar.d.ts +2 -2
- package/Animations/animatorAvatar.js +3 -3
- package/Animations/animatorAvatar.js.map +1 -1
- package/Animations/pathCursor.d.ts +1 -1
- package/Animations/pathCursor.js +1 -1
- package/Animations/pathCursor.js.map +1 -1
- package/Animations/runtimeAnimation.d.ts +1 -1
- package/Animations/runtimeAnimation.js +2 -2
- package/Animations/runtimeAnimation.js.map +1 -1
- package/Audio/analyser.js +1 -1
- package/Audio/analyser.js.map +1 -1
- package/AudioV2/abstractAudio/components/spatialAudioAttacherComponent.js +1 -1
- package/AudioV2/abstractAudio/components/spatialAudioAttacherComponent.js.map +1 -1
- package/AudioV2/abstractAudio/subProperties/abstractSpatialAudio.d.ts +1 -1
- package/AudioV2/abstractAudio/subProperties/abstractSpatialAudio.js +1 -1
- package/AudioV2/abstractAudio/subProperties/abstractSpatialAudio.js.map +1 -1
- package/AudioV2/abstractAudio/subProperties/abstractSpatialAudioListener.d.ts +1 -1
- package/AudioV2/abstractAudio/subProperties/abstractSpatialAudioListener.js +1 -1
- package/AudioV2/abstractAudio/subProperties/abstractSpatialAudioListener.js.map +1 -1
- package/AudioV2/webAudio/subNodes/spatialWebAudioSubNode.d.ts +1 -1
- package/AudioV2/webAudio/subNodes/spatialWebAudioSubNode.js +1 -1
- package/AudioV2/webAudio/subNodes/spatialWebAudioSubNode.js.map +1 -1
- package/AudioV2/webAudio/subProperties/spatialWebAudioListener.js +1 -1
- package/AudioV2/webAudio/subProperties/spatialWebAudioListener.js.map +1 -1
- package/AudioV2/webAudio/webAudioStreamingSound.js +1 -1
- package/AudioV2/webAudio/webAudioStreamingSound.js.map +1 -1
- package/BakedVertexAnimation/bakedVertexAnimationManager.d.ts +1 -1
- package/BakedVertexAnimation/bakedVertexAnimationManager.js +1 -1
- package/BakedVertexAnimation/bakedVertexAnimationManager.js.map +1 -1
- package/BakedVertexAnimation/vertexAnimationBaker.js +1 -1
- package/BakedVertexAnimation/vertexAnimationBaker.js.map +1 -1
- package/Behaviors/Cameras/bouncingBehavior.js +1 -1
- package/Behaviors/Cameras/bouncingBehavior.js.map +1 -1
- package/Behaviors/Cameras/framingBehavior.d.ts +1 -1
- package/Behaviors/Cameras/framingBehavior.js +2 -2
- package/Behaviors/Cameras/framingBehavior.js.map +1 -1
- package/Behaviors/Cameras/interpolatingBehavior.d.ts +13 -1
- package/Behaviors/Cameras/interpolatingBehavior.js +13 -1
- package/Behaviors/Cameras/interpolatingBehavior.js.map +1 -1
- package/Behaviors/Meshes/attachToBoxBehavior.js +1 -1
- package/Behaviors/Meshes/attachToBoxBehavior.js.map +1 -1
- package/Behaviors/Meshes/baseSixDofDragBehavior.d.ts +3 -3
- package/Behaviors/Meshes/baseSixDofDragBehavior.js +4 -4
- package/Behaviors/Meshes/baseSixDofDragBehavior.js.map +1 -1
- package/Behaviors/Meshes/followBehavior.js +1 -1
- package/Behaviors/Meshes/followBehavior.js.map +1 -1
- package/Behaviors/Meshes/handConstraintBehavior.js +2 -2
- package/Behaviors/Meshes/handConstraintBehavior.js.map +1 -1
- package/Behaviors/Meshes/multiPointerScaleBehavior.js +1 -1
- package/Behaviors/Meshes/multiPointerScaleBehavior.js.map +1 -1
- package/Behaviors/Meshes/pointerDragBehavior.d.ts +3 -3
- package/Behaviors/Meshes/pointerDragBehavior.js +5 -5
- package/Behaviors/Meshes/pointerDragBehavior.js.map +1 -1
- package/Behaviors/Meshes/sixDofDragBehavior.d.ts +1 -1
- package/Behaviors/Meshes/sixDofDragBehavior.js +2 -2
- package/Behaviors/Meshes/sixDofDragBehavior.js.map +1 -1
- package/Behaviors/Meshes/surfaceMagnetismBehavior.js +1 -1
- package/Behaviors/Meshes/surfaceMagnetismBehavior.js.map +1 -1
- package/Bones/boneIKController.d.ts +1 -1
- package/Bones/boneIKController.js +1 -1
- package/Bones/boneIKController.js.map +1 -1
- package/Bones/boneLookController.d.ts +1 -1
- package/Bones/boneLookController.js +1 -1
- package/Bones/boneLookController.js.map +1 -1
- package/Bones/skeleton.d.ts +2 -2
- package/Bones/skeleton.functions.d.ts +1 -1
- package/Bones/skeleton.functions.js +3 -3
- package/Bones/skeleton.functions.js.map +1 -1
- package/Bones/skeleton.js +3 -4
- package/Bones/skeleton.js.map +1 -1
- package/Buffers/buffer.align.pure.js +6 -0
- package/Buffers/buffer.align.pure.js.map +1 -1
- package/Buffers/buffer.nonFloatVertexBuffers.js +2 -1
- package/Buffers/buffer.nonFloatVertexBuffers.js.map +1 -1
- package/Buffers/buffer.pure.d.ts +8 -0
- package/Buffers/buffer.pure.js +31 -2
- package/Buffers/buffer.pure.js.map +1 -1
- package/Buffers/bufferUtils.js +17 -5
- package/Buffers/bufferUtils.js.map +1 -1
- package/Cameras/Inputs/BaseCameraMouseWheelInput.js +1 -1
- package/Cameras/Inputs/BaseCameraMouseWheelInput.js.map +1 -1
- package/Cameras/Inputs/BaseCameraPointersInput.js +1 -1
- package/Cameras/Inputs/BaseCameraPointersInput.js.map +1 -1
- package/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.js +1 -1
- package/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.js.map +1 -1
- package/Cameras/Inputs/arcRotateCameraMouseWheelInput.js +2 -2
- package/Cameras/Inputs/arcRotateCameraMouseWheelInput.js.map +1 -1
- package/Cameras/Inputs/flyCameraKeyboardInput.js +2 -2
- package/Cameras/Inputs/flyCameraKeyboardInput.js.map +1 -1
- package/Cameras/Inputs/flyCameraMouseInput.js +2 -2
- package/Cameras/Inputs/flyCameraMouseInput.js.map +1 -1
- package/Cameras/Inputs/followCameraKeyboardMoveInput.js +1 -1
- package/Cameras/Inputs/followCameraKeyboardMoveInput.js.map +1 -1
- package/Cameras/Inputs/followCameraMouseWheelInput.js +1 -1
- package/Cameras/Inputs/followCameraMouseWheelInput.js.map +1 -1
- package/Cameras/Inputs/freeCameraGamepadInput.js +1 -1
- package/Cameras/Inputs/freeCameraGamepadInput.js.map +1 -1
- package/Cameras/Inputs/freeCameraKeyboardMoveInput.js +2 -2
- package/Cameras/Inputs/freeCameraKeyboardMoveInput.js.map +1 -1
- package/Cameras/Inputs/freeCameraMouseInput.js +1 -1
- package/Cameras/Inputs/freeCameraMouseInput.js.map +1 -1
- package/Cameras/Inputs/freeCameraMouseWheelInput.js +1 -1
- package/Cameras/Inputs/freeCameraMouseWheelInput.js.map +1 -1
- package/Cameras/Inputs/freeCameraTouchInput.js +2 -2
- package/Cameras/Inputs/freeCameraTouchInput.js.map +1 -1
- package/Cameras/Inputs/geospatialCameraKeyboardInput.js +1 -1
- package/Cameras/Inputs/geospatialCameraKeyboardInput.js.map +1 -1
- package/Cameras/Limits/geospatialLimits.d.ts +1 -1
- package/Cameras/Limits/geospatialLimits.js +1 -1
- package/Cameras/Limits/geospatialLimits.js.map +1 -1
- package/Cameras/RigModes/stereoscopicAnaglyphRigMode.js +2 -2
- package/Cameras/RigModes/stereoscopicAnaglyphRigMode.js.map +1 -1
- package/Cameras/RigModes/stereoscopicRigMode.d.ts +1 -1
- package/Cameras/RigModes/stereoscopicRigMode.js +3 -3
- package/Cameras/RigModes/stereoscopicRigMode.js.map +1 -1
- package/Cameras/RigModes/vrRigMode.js +2 -2
- package/Cameras/RigModes/vrRigMode.js.map +1 -1
- package/Cameras/Stereoscopic/stereoscopicScreenUniversalCamera.d.ts +3 -3
- package/Cameras/Stereoscopic/stereoscopicScreenUniversalCamera.js +5 -5
- package/Cameras/Stereoscopic/stereoscopicScreenUniversalCamera.js.map +1 -1
- package/Cameras/VR/vrCameraMetrics.d.ts +1 -1
- package/Cameras/VR/vrCameraMetrics.js +1 -1
- package/Cameras/VR/vrCameraMetrics.js.map +1 -1
- package/Cameras/cameraInputsManager.d.ts +1 -1
- package/Cameras/cameraInputsManager.js +1 -1
- package/Cameras/cameraInputsManager.js.map +1 -1
- package/Collisions/collider.d.ts +1 -1
- package/Collisions/collider.js +1 -1
- package/Collisions/collider.js.map +1 -1
- package/Collisions/gpuPicker.d.ts +1 -1
- package/Collisions/gpuPicker.js +5 -5
- package/Collisions/gpuPicker.js.map +1 -1
- package/Collisions/meshCollisionData.d.ts +1 -1
- package/Collisions/meshCollisionData.js +1 -1
- package/Collisions/meshCollisionData.js.map +1 -1
- package/Collisions/pickingInfo.d.ts +1 -1
- package/Collisions/pickingInfo.js +2 -2
- package/Collisions/pickingInfo.js.map +1 -1
- package/Culling/Octrees/octreeBlock.d.ts +1 -1
- package/Culling/Octrees/octreeBlock.js +1 -1
- package/Culling/Octrees/octreeBlock.js.map +1 -1
- package/Culling/boundingBox.d.ts +1 -1
- package/Culling/boundingBox.js +1 -1
- package/Culling/boundingBox.js.map +1 -1
- package/Culling/boundingInfo.d.ts +1 -1
- package/Culling/boundingInfo.js +1 -1
- package/Culling/boundingInfo.js.map +1 -1
- package/Culling/boundingSphere.d.ts +1 -1
- package/Culling/boundingSphere.js +1 -1
- package/Culling/boundingSphere.js.map +1 -1
- package/Culling/ray.core.d.ts +1 -1
- package/Culling/ray.core.js +1 -1
- package/Culling/ray.core.js.map +1 -1
- package/Debug/axesViewer.d.ts +1 -1
- package/Debug/axesViewer.js +3 -3
- package/Debug/axesViewer.js.map +1 -1
- package/Debug/boneAxesViewer.d.ts +1 -1
- package/Debug/boneAxesViewer.js +1 -1
- package/Debug/boneAxesViewer.js.map +1 -1
- package/Debug/directionalLightFrustumViewer.d.ts +1 -1
- package/Debug/directionalLightFrustumViewer.js +6 -6
- package/Debug/directionalLightFrustumViewer.js.map +1 -1
- package/Debug/rayHelper.d.ts +1 -1
- package/Debug/rayHelper.js +2 -2
- package/Debug/rayHelper.js.map +1 -1
- package/Debug/skeletonViewer.d.ts +2 -2
- package/Debug/skeletonViewer.js +10 -10
- package/Debug/skeletonViewer.js.map +1 -1
- package/DeviceInput/internalDeviceSourceManager.d.ts +1 -1
- package/DeviceInput/internalDeviceSourceManager.js +0 -1
- package/DeviceInput/internalDeviceSourceManager.js.map +1 -1
- package/DeviceInput/webDeviceInputSystem.js +1 -1
- package/DeviceInput/webDeviceInputSystem.js.map +1 -1
- package/Engines/Extensions/engine.views.d.ts +1 -1
- package/Engines/Extensions/engine.views.js +1 -1
- package/Engines/Extensions/engine.views.js.map +1 -1
- package/Engines/Native/nativeHelpers.js +4 -1
- package/Engines/Native/nativeHelpers.js.map +1 -1
- package/Engines/WebGPU/webgpuCacheRenderPipeline.d.ts +1 -1
- package/Engines/WebGPU/webgpuCacheRenderPipeline.js +11 -1
- package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
- package/Engines/WebGPU/webgpuComputeContext.d.ts +1 -1
- package/Engines/WebGPU/webgpuComputeContext.js.map +1 -1
- package/Engines/WebGPU/webgpuTintWASM.js +1 -1
- package/Engines/WebGPU/webgpuTintWASM.js.map +1 -1
- package/Engines/abstractEngine.pure.js +2 -2
- package/Engines/abstractEngine.pure.js.map +1 -1
- package/Engines/constants.d.ts +4 -0
- package/Engines/constants.js +4 -0
- package/Engines/constants.js.map +1 -1
- package/Engines/engineFactory.d.ts +2 -2
- package/Engines/engineFactory.js +3 -3
- package/Engines/engineFactory.js.map +1 -1
- package/Events/pointerEvents.d.ts +1 -1
- package/Events/pointerEvents.js +1 -1
- package/Events/pointerEvents.js.map +1 -1
- package/FlowGraph/Blocks/Data/Utils/flowGraphCodeExecutionBlock.js +1 -1
- package/FlowGraph/Blocks/Data/Utils/flowGraphCodeExecutionBlock.js.map +1 -1
- package/FlowGraph/Blocks/Data/flowGraphCachedOperationBlock.d.ts +1 -1
- package/FlowGraph/Blocks/Data/flowGraphCachedOperationBlock.js +1 -1
- package/FlowGraph/Blocks/Data/flowGraphCachedOperationBlock.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphKeyboardEventBlock.js +1 -1
- package/FlowGraph/Blocks/Event/flowGraphKeyboardEventBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/Animation/flowGraphInterpolationBlock.pure.d.ts +1 -1
- package/FlowGraph/Blocks/Execution/Animation/flowGraphInterpolationBlock.pure.js +3 -3
- package/FlowGraph/Blocks/Execution/Animation/flowGraphInterpolationBlock.pure.js.map +1 -1
- package/FlowGraph/CustomTypes/flowGraphMatrix.d.ts +1 -1
- package/FlowGraph/CustomTypes/flowGraphMatrix.js +1 -1
- package/FlowGraph/CustomTypes/flowGraphMatrix.js.map +1 -1
- package/FlowGraph/flowGraphBlock.d.ts +1 -1
- package/FlowGraph/flowGraphBlock.js +1 -1
- package/FlowGraph/flowGraphBlock.js.map +1 -1
- package/FlowGraph/flowGraphExecutionBlock.d.ts +1 -1
- package/FlowGraph/flowGraphExecutionBlock.js +1 -1
- package/FlowGraph/flowGraphExecutionBlock.js.map +1 -1
- package/FlowGraph/flowGraphMath.d.ts +1 -1
- package/FlowGraph/flowGraphMath.js +1 -1
- package/FlowGraph/flowGraphMath.js.map +1 -1
- package/FlowGraph/flowGraphParser.js +1 -1
- package/FlowGraph/flowGraphParser.js.map +1 -1
- package/FlowGraph/flowGraphPathConverterComponent.d.ts +1 -1
- package/FlowGraph/flowGraphPathConverterComponent.js +2 -2
- package/FlowGraph/flowGraphPathConverterComponent.js.map +1 -1
- package/FlowGraph/flowGraphValidator.js.map +1 -1
- package/FlowGraph/serialization.js +4 -4
- package/FlowGraph/serialization.js.map +1 -1
- package/FlowGraph/utils.js.map +1 -1
- package/FrameGraph/Node/nodeRenderGraph.d.ts +2 -2
- package/FrameGraph/Node/nodeRenderGraph.js +7 -7
- package/FrameGraph/Node/nodeRenderGraph.js.map +1 -1
- package/FrameGraph/Tasks/Layers/baseLayerTask.d.ts +30 -0
- package/FrameGraph/Tasks/Layers/baseLayerTask.js +28 -1
- package/FrameGraph/Tasks/Layers/baseLayerTask.js.map +1 -1
- package/FrameGraph/Tasks/Misc/computeShaderTask.d.ts +2 -2
- package/FrameGraph/Tasks/Misc/computeShaderTask.js +2 -2
- package/FrameGraph/Tasks/Misc/computeShaderTask.js.map +1 -1
- package/FrameGraph/Tasks/Misc/lightingVolumeTask.d.ts +1 -1
- package/FrameGraph/Tasks/Misc/lightingVolumeTask.js +2 -2
- package/FrameGraph/Tasks/Misc/lightingVolumeTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/blurTask.d.ts +7 -0
- package/FrameGraph/Tasks/PostProcesses/blurTask.js +8 -1
- package/FrameGraph/Tasks/PostProcesses/blurTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/depthOfFieldBlurTask.js +1 -1
- package/FrameGraph/Tasks/PostProcesses/depthOfFieldBlurTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/ssrBlurTask.js +1 -1
- package/FrameGraph/Tasks/PostProcesses/ssrBlurTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/volumetricLightingBlendVolumeTask.d.ts +1 -1
- package/FrameGraph/Tasks/PostProcesses/volumetricLightingBlendVolumeTask.js +1 -1
- package/FrameGraph/Tasks/PostProcesses/volumetricLightingBlendVolumeTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/volumetricLightingTask.d.ts +2 -2
- package/FrameGraph/Tasks/PostProcesses/volumetricLightingTask.js +3 -3
- package/FrameGraph/Tasks/PostProcesses/volumetricLightingTask.js.map +1 -1
- package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.d.ts +1 -1
- package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.js +2 -2
- package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.js.map +1 -1
- package/FrameGraph/Tasks/Rendering/geometryRendererTask.d.ts +6 -0
- package/FrameGraph/Tasks/Rendering/geometryRendererTask.js +14 -5
- package/FrameGraph/Tasks/Rendering/geometryRendererTask.js.map +1 -1
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsAccumulationTask.d.ts +1 -1
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsAccumulationTask.js +1 -1
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsAccumulationTask.js.map +1 -1
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsSpatialBlurTask.d.ts +1 -1
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsSpatialBlurTask.js +1 -1
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsSpatialBlurTask.js.map +1 -1
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsTracingTask.d.ts +1 -1
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsTracingTask.js +2 -2
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsTracingTask.js.map +1 -1
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsVoxelizationTask.d.ts +1 -1
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsVoxelizationTask.js +2 -2
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsVoxelizationTask.js.map +1 -1
- package/FrameGraph/Tasks/Rendering/objectRendererTask.d.ts +7 -1
- package/FrameGraph/Tasks/Rendering/objectRendererTask.js +7 -1
- package/FrameGraph/Tasks/Rendering/objectRendererTask.js.map +1 -1
- package/FrameGraph/Tasks/Texture/clearTextureTask.d.ts +1 -1
- package/FrameGraph/Tasks/Texture/clearTextureTask.js +1 -1
- package/FrameGraph/Tasks/Texture/clearTextureTask.js.map +1 -1
- package/FrameGraph/frameGraphRenderContext.js +1 -1
- package/FrameGraph/frameGraphRenderContext.js.map +1 -1
- package/FrameGraph/frameGraphTextureManager.d.ts +1 -1
- package/FrameGraph/frameGraphTextureManager.js +1 -1
- package/FrameGraph/frameGraphTextureManager.js.map +1 -1
- package/Gamepads/gamepadManager.js +1 -1
- package/Gamepads/gamepadManager.js.map +1 -1
- package/Gizmos/axisDragGizmo.d.ts +5 -5
- package/Gizmos/axisDragGizmo.js +6 -6
- package/Gizmos/axisDragGizmo.js.map +1 -1
- package/Gizmos/axisScaleGizmo.d.ts +4 -4
- package/Gizmos/axisScaleGizmo.js +6 -6
- package/Gizmos/axisScaleGizmo.js.map +1 -1
- package/Gizmos/boundingBoxGizmo.d.ts +5 -5
- package/Gizmos/boundingBoxGizmo.js +7 -7
- package/Gizmos/boundingBoxGizmo.js.map +1 -1
- package/Gizmos/cameraGizmo.d.ts +3 -3
- package/Gizmos/cameraGizmo.js +7 -7
- package/Gizmos/cameraGizmo.js.map +1 -1
- package/Gizmos/gizmo.d.ts +2 -2
- package/Gizmos/gizmo.js +3 -3
- package/Gizmos/gizmo.js.map +1 -1
- package/Gizmos/gizmoManager.d.ts +2 -2
- package/Gizmos/gizmoManager.js +2 -2
- package/Gizmos/gizmoManager.js.map +1 -1
- package/Gizmos/lightGizmo.d.ts +4 -4
- package/Gizmos/lightGizmo.js +11 -11
- package/Gizmos/lightGizmo.js.map +1 -1
- package/Gizmos/planeDragGizmo.d.ts +4 -4
- package/Gizmos/planeDragGizmo.js +5 -5
- package/Gizmos/planeDragGizmo.js.map +1 -1
- package/Gizmos/positionGizmo.d.ts +1 -1
- package/Gizmos/positionGizmo.js +2 -2
- package/Gizmos/positionGizmo.js.map +1 -1
- package/Gizmos/rotationGizmo.d.ts +3 -3
- package/Gizmos/rotationGizmo.js +3 -3
- package/Gizmos/rotationGizmo.js.map +1 -1
- package/Gizmos/scaleGizmo.d.ts +2 -2
- package/Gizmos/scaleGizmo.js +4 -4
- package/Gizmos/scaleGizmo.js.map +1 -1
- package/Gizmos/spatialAudioGizmo.d.ts +2 -2
- package/Gizmos/spatialAudioGizmo.js +6 -6
- package/Gizmos/spatialAudioGizmo.js.map +1 -1
- package/Helpers/environmentHelper.d.ts +6 -6
- package/Helpers/environmentHelper.js +12 -12
- package/Helpers/environmentHelper.js.map +1 -1
- package/Helpers/materialConversionHelper.d.ts +1 -1
- package/Helpers/materialConversionHelper.js +1 -1
- package/Helpers/materialConversionHelper.js.map +1 -1
- package/Helpers/photoDome.d.ts +1 -1
- package/Helpers/photoDome.js +1 -1
- package/Helpers/photoDome.js.map +1 -1
- package/Helpers/textureDome.d.ts +4 -4
- package/Helpers/textureDome.js +6 -6
- package/Helpers/textureDome.js.map +1 -1
- package/Helpers/videoDome.d.ts +1 -1
- package/Helpers/videoDome.js +2 -2
- package/Helpers/videoDome.js.map +1 -1
- package/Inputs/scene.inputManager.d.ts +1 -1
- package/Inputs/scene.inputManager.js +1 -1
- package/Inputs/scene.inputManager.js.map +1 -1
- package/Instrumentation/sceneInstrumentation.js +1 -1
- package/Instrumentation/sceneInstrumentation.js.map +1 -1
- package/Layers/effectLayer.d.ts +1 -1
- package/Layers/effectLayer.js +3 -3
- package/Layers/effectLayer.js.map +1 -1
- package/Layers/layer.d.ts +2 -2
- package/Layers/layer.js +4 -4
- package/Layers/layer.js.map +1 -1
- package/Layers/thinEffectLayer.d.ts +2 -2
- package/Layers/thinEffectLayer.js +3 -3
- package/Layers/thinEffectLayer.js.map +1 -1
- package/Layers/thinGlowLayer.d.ts +1 -1
- package/Layers/thinGlowLayer.js +3 -3
- package/Layers/thinGlowLayer.js.map +1 -1
- package/Layers/thinHighlightLayer.d.ts +1 -1
- package/Layers/thinHighlightLayer.js +3 -3
- package/Layers/thinHighlightLayer.js.map +1 -1
- package/Layers/thinSelectionOutlineLayer.d.ts +1 -1
- package/Layers/thinSelectionOutlineLayer.js +3 -3
- package/Layers/thinSelectionOutlineLayer.js.map +1 -1
- package/Legacy/legacy.js +12 -1
- package/Legacy/legacy.js.map +1 -1
- package/LensFlares/lensFlare.d.ts +2 -2
- package/LensFlares/lensFlare.js +3 -3
- package/LensFlares/lensFlare.js.map +1 -1
- package/LensFlares/lensFlareSystem.d.ts +1 -1
- package/LensFlares/lensFlareSystem.js +6 -6
- package/LensFlares/lensFlareSystem.js.map +1 -1
- package/Lights/LTC/ltcTextureTool.js +1 -1
- package/Lights/LTC/ltcTextureTool.js.map +1 -1
- package/Lights/Shadows/cascadedShadowGenerator.d.ts +1 -285
- package/Lights/Shadows/cascadedShadowGenerator.js +3 -857
- package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
- package/Lights/Shadows/cascadedShadowGenerator.pure.d.ts +290 -0
- package/Lights/Shadows/cascadedShadowGenerator.pure.js +868 -0
- package/Lights/Shadows/cascadedShadowGenerator.pure.js.map +1 -0
- package/Lights/Shadows/pure.d.ts +1 -0
- package/Lights/Shadows/pure.js +1 -0
- package/Lights/Shadows/pure.js.map +1 -1
- package/Lights/Shadows/shadowGenerator.d.ts +3 -3
- package/Lights/Shadows/shadowGenerator.js +7 -7
- package/Lights/Shadows/shadowGenerator.js.map +1 -1
- package/Lights/areaLight.d.ts +1 -1
- package/Lights/areaLight.js +0 -1
- package/Lights/areaLight.js.map +1 -1
- package/Lights/light.d.ts +2 -2
- package/Lights/light.js +2 -2
- package/Lights/light.js.map +1 -1
- package/Lights/shadowLight.d.ts +1 -1
- package/Lights/shadowLight.js +1 -1
- package/Lights/shadowLight.js.map +1 -1
- package/Loading/sceneLoader.d.ts +2 -2
- package/Loading/sceneLoader.js +3 -3
- package/Loading/sceneLoader.js.map +1 -1
- package/Materials/GreasedLine/greasedLineMaterialDefaults.d.ts +1 -1
- package/Materials/GreasedLine/greasedLineMaterialDefaults.js +1 -1
- package/Materials/GreasedLine/greasedLineMaterialDefaults.js.map +1 -1
- package/Materials/GreasedLine/greasedLineSimpleMaterial.d.ts +3 -3
- package/Materials/GreasedLine/greasedLineSimpleMaterial.js +3 -3
- package/Materials/GreasedLine/greasedLineSimpleMaterial.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/prePassOutputBlock.pure.js +6 -6
- package/Materials/Node/Blocks/Fragment/prePassOutputBlock.pure.js.map +1 -1
- package/Materials/Node/nodeMaterial.pure.d.ts +12 -0
- package/Materials/Node/nodeMaterial.pure.js +68 -13
- package/Materials/Node/nodeMaterial.pure.js.map +1 -1
- package/Materials/Node/nodeMaterialDefault.js +14 -14
- package/Materials/Node/nodeMaterialDefault.js.map +1 -1
- package/Materials/PBR/openpbrMaterial.pure.js +19 -4
- package/Materials/PBR/openpbrMaterial.pure.js.map +1 -1
- package/Materials/PBR/pbrAnisotropicConfiguration.d.ts +40 -2
- package/Materials/PBR/pbrAnisotropicConfiguration.js +41 -3
- package/Materials/PBR/pbrAnisotropicConfiguration.js.map +1 -1
- package/Materials/PBR/pbrBRDFConfiguration.d.ts +5 -1
- package/Materials/PBR/pbrBRDFConfiguration.js +5 -1
- package/Materials/PBR/pbrBRDFConfiguration.js.map +1 -1
- package/Materials/PBR/pbrBaseSimpleMaterial.d.ts +2 -2
- package/Materials/PBR/pbrBaseSimpleMaterial.js +2 -2
- package/Materials/PBR/pbrBaseSimpleMaterial.js.map +1 -1
- package/Materials/PBR/pbrClearCoatConfiguration.d.ts +42 -2
- package/Materials/PBR/pbrClearCoatConfiguration.js +42 -2
- package/Materials/PBR/pbrClearCoatConfiguration.js.map +1 -1
- package/Materials/PBR/pbrIridescenceConfiguration.d.ts +38 -1
- package/Materials/PBR/pbrIridescenceConfiguration.js +38 -1
- package/Materials/PBR/pbrIridescenceConfiguration.js.map +1 -1
- package/Materials/PBR/pbrSheenConfiguration.d.ts +41 -2
- package/Materials/PBR/pbrSheenConfiguration.js +41 -2
- package/Materials/PBR/pbrSheenConfiguration.js.map +1 -1
- package/Materials/PBR/pbrSubSurfaceConfiguration.d.ts +41 -2
- package/Materials/PBR/pbrSubSurfaceConfiguration.js +42 -3
- package/Materials/PBR/pbrSubSurfaceConfiguration.js.map +1 -1
- package/Materials/Textures/Filtering/hdrFiltering.js +1 -1
- package/Materials/Textures/Filtering/hdrFiltering.js.map +1 -1
- package/Materials/Textures/Filtering/hdrIrradianceFiltering.d.ts +1 -1
- package/Materials/Textures/Filtering/hdrIrradianceFiltering.js +2 -2
- package/Materials/Textures/Filtering/hdrIrradianceFiltering.js.map +1 -1
- package/Materials/Textures/Loaders/EXR/exrLoader.core.d.ts +1 -1
- package/Materials/Textures/Loaders/EXR/exrLoader.core.js +5 -109
- package/Materials/Textures/Loaders/EXR/exrLoader.core.js.map +1 -1
- package/Materials/Textures/Loaders/EXR/exrLoader.decoder.js +1 -1
- package/Materials/Textures/Loaders/EXR/exrLoader.decoder.js.map +1 -1
- package/Materials/Textures/Loaders/basisTextureLoader.js +2 -2
- package/Materials/Textures/Loaders/basisTextureLoader.js.map +1 -1
- package/Materials/Textures/Loaders/ddsTextureLoader.js +1 -1
- package/Materials/Textures/Loaders/ddsTextureLoader.js.map +1 -1
- package/Materials/Textures/Loaders/envTextureLoader.js +3 -1
- package/Materials/Textures/Loaders/envTextureLoader.js.map +1 -1
- package/Materials/Textures/Loaders/ktxTextureLoader.js +11 -2
- package/Materials/Textures/Loaders/ktxTextureLoader.js.map +1 -1
- package/Materials/Textures/MultiviewRenderTarget.d.ts +1 -1
- package/Materials/Textures/MultiviewRenderTarget.js +1 -1
- package/Materials/Textures/MultiviewRenderTarget.js.map +1 -1
- package/Materials/Textures/Packer/packer.d.ts +1 -1
- package/Materials/Textures/Packer/packer.js +6 -6
- package/Materials/Textures/Packer/packer.js.map +1 -1
- package/Materials/Textures/Procedurals/customProceduralTexture.d.ts +2 -2
- package/Materials/Textures/Procedurals/customProceduralTexture.js +4 -4
- package/Materials/Textures/Procedurals/customProceduralTexture.js.map +1 -1
- package/Materials/Textures/Procedurals/proceduralTexture.pure.js +4 -1
- package/Materials/Textures/Procedurals/proceduralTexture.pure.js.map +1 -1
- package/Materials/Textures/Procedurals/proceduralTextureSceneComponent.js +1 -1
- package/Materials/Textures/Procedurals/proceduralTextureSceneComponent.js.map +1 -1
- package/Materials/Textures/prePassRenderTarget.d.ts +1 -1
- package/Materials/Textures/prePassRenderTarget.js +1 -1
- package/Materials/Textures/prePassRenderTarget.js.map +1 -1
- package/Materials/Textures/rawCubeTexture.d.ts +1 -1
- package/Materials/Textures/rawCubeTexture.js +2 -2
- package/Materials/Textures/rawCubeTexture.js.map +1 -1
- package/Materials/Textures/rawTexture.d.ts +1 -1
- package/Materials/Textures/rawTexture.js +1 -1
- package/Materials/Textures/rawTexture.js.map +1 -1
- package/Materials/Textures/rawTexture2DArray.d.ts +1 -1
- package/Materials/Textures/rawTexture2DArray.js +1 -1
- package/Materials/Textures/rawTexture2DArray.js.map +1 -1
- package/Materials/Textures/rawTexture3D.d.ts +1 -1
- package/Materials/Textures/rawTexture3D.js +1 -1
- package/Materials/Textures/rawTexture3D.js.map +1 -1
- package/Materials/Textures/refractionTexture.d.ts +1 -1
- package/Materials/Textures/refractionTexture.js +1 -1
- package/Materials/Textures/refractionTexture.js.map +1 -1
- package/Materials/Textures/textureMerger.d.ts +1 -1
- package/Materials/Textures/textureMerger.js +1 -1
- package/Materials/Textures/textureMerger.js.map +1 -1
- package/Materials/Textures/textureProcessor.d.ts +1 -1
- package/Materials/Textures/textureProcessor.js +2 -2
- package/Materials/Textures/textureProcessor.js.map +1 -1
- package/Materials/Textures/thinRenderTargetTexture.d.ts +4 -4
- package/Materials/Textures/thinRenderTargetTexture.js +2 -2
- package/Materials/Textures/thinRenderTargetTexture.js.map +1 -1
- package/Materials/clipPlaneMaterialHelper.js +1 -1
- package/Materials/clipPlaneMaterialHelper.js.map +1 -1
- package/Materials/effectRenderer.pure.js +4 -2
- package/Materials/effectRenderer.pure.js.map +1 -1
- package/Materials/floatingOriginMatrixOverrides.d.ts +1 -1
- package/Materials/floatingOriginMatrixOverrides.js +1 -1
- package/Materials/floatingOriginMatrixOverrides.js.map +1 -1
- package/Materials/material.detailMapConfiguration.d.ts +39 -1
- package/Materials/material.detailMapConfiguration.js +39 -1
- package/Materials/material.detailMapConfiguration.js.map +1 -1
- package/Materials/materialHelper.functions.js +45 -1
- package/Materials/materialHelper.functions.js.map +1 -1
- package/Materials/materialHelper.geometryrendering.d.ts +1 -1
- package/Materials/materialHelper.geometryrendering.js +1 -1
- package/Materials/materialHelper.geometryrendering.js.map +1 -1
- package/Materials/materialPluginFactoryExport.js +2 -2
- package/Materials/materialPluginFactoryExport.js.map +1 -1
- package/Materials/pushMaterial.d.ts +7 -1
- package/Materials/pushMaterial.js +7 -1
- package/Materials/pushMaterial.js.map +1 -1
- package/Materials/uniformBuffer.js +1 -1
- package/Materials/uniformBuffer.js.map +1 -1
- package/Maths/math.axis.d.ts +1 -1
- package/Maths/math.axis.js +1 -1
- package/Maths/math.axis.js.map +1 -1
- package/Maths/math.d.ts +2 -2
- package/Maths/math.functions.d.ts +1 -1
- package/Maths/math.functions.js +1 -1
- package/Maths/math.functions.js.map +1 -1
- package/Maths/math.isovector.d.ts +1 -1
- package/Maths/math.isovector.js +1 -1
- package/Maths/math.isovector.js.map +1 -1
- package/Maths/math.js +2 -2
- package/Maths/math.js.map +1 -1
- package/Maths/math.path.d.ts +1 -1
- package/Maths/math.path.js +1 -1
- package/Maths/math.path.js.map +1 -1
- package/Maths/math.plane.d.ts +1 -1
- package/Maths/math.plane.js +1 -1
- package/Maths/math.plane.js.map +1 -1
- package/Maths/math.polar.d.ts +1 -1
- package/Maths/math.polar.js +1 -1
- package/Maths/math.polar.js.map +1 -1
- package/Maths/math.vertexFormat.d.ts +1 -1
- package/Maths/math.vertexFormat.js +1 -1
- package/Maths/math.vertexFormat.js.map +1 -1
- package/Maths/pure.d.ts +1 -0
- package/Maths/pure.js +1 -0
- package/Maths/pure.js.map +1 -1
- package/Meshes/Builders/geodesicBuilder.js +1 -1
- package/Meshes/Builders/geodesicBuilder.js.map +1 -1
- package/Meshes/Builders/goldbergBuilder.d.ts +1 -1
- package/Meshes/Builders/goldbergBuilder.js +4 -4
- package/Meshes/Builders/goldbergBuilder.js.map +1 -1
- package/Meshes/Builders/greasedLineBuilder.d.ts +4 -4
- package/Meshes/Builders/greasedLineBuilder.js +5 -5
- package/Meshes/Builders/greasedLineBuilder.js.map +1 -1
- package/Meshes/Builders/textBuilder.d.ts +2 -2
- package/Meshes/Builders/textBuilder.js +4 -4
- package/Meshes/Builders/textBuilder.js.map +1 -1
- package/Meshes/Builders/tiledBoxBuilder.d.ts +3 -3
- package/Meshes/Builders/tiledBoxBuilder.js +3 -3
- package/Meshes/Builders/tiledBoxBuilder.js.map +1 -1
- package/Meshes/Builders/tiledPlaneBuilder.d.ts +1 -1
- package/Meshes/Builders/tiledPlaneBuilder.js +1 -1
- package/Meshes/Builders/tiledPlaneBuilder.js.map +1 -1
- package/Meshes/Compression/dracoCodec.js +1 -1
- package/Meshes/Compression/dracoCodec.js.map +1 -1
- package/Meshes/Compression/dracoDecoder.js +1 -1
- package/Meshes/Compression/dracoDecoder.js.map +1 -1
- package/Meshes/Compression/dracoEncoder.d.ts +1 -1
- package/Meshes/Compression/dracoEncoder.js +2 -2
- package/Meshes/Compression/dracoEncoder.js.map +1 -1
- package/Meshes/Compression/meshoptCompression.js +1 -1
- package/Meshes/Compression/meshoptCompression.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js +64 -3
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js.map +1 -1
- package/Meshes/GreasedLine/greasedLineBaseMesh.d.ts +2 -2
- package/Meshes/GreasedLine/greasedLineBaseMesh.js +3 -3
- package/Meshes/GreasedLine/greasedLineBaseMesh.js.map +1 -1
- package/Meshes/Node/nodeGeometry.d.ts +2 -2
- package/Meshes/Node/nodeGeometry.js +4 -4
- package/Meshes/Node/nodeGeometry.js.map +1 -1
- package/Meshes/Node/nodeGeometryBuildState.d.ts +1 -1
- package/Meshes/Node/nodeGeometryBuildState.js +1 -1
- package/Meshes/Node/nodeGeometryBuildState.js.map +1 -1
- package/Meshes/abstractMesh.hotSpot.d.ts +1 -1
- package/Meshes/abstractMesh.hotSpot.js +2 -2
- package/Meshes/abstractMesh.hotSpot.js.map +1 -1
- package/Meshes/abstractMesh.pure.js +2 -13
- package/Meshes/abstractMesh.pure.js.map +1 -1
- package/Meshes/buffer.d.ts +1 -1
- package/Meshes/buffer.js +1 -1
- package/Meshes/buffer.js.map +1 -1
- package/Meshes/csg.d.ts +3 -3
- package/Meshes/csg.js +4 -4
- package/Meshes/csg.js.map +1 -1
- package/Meshes/csg2.d.ts +1 -1
- package/Meshes/csg2.js +38 -11
- package/Meshes/csg2.js.map +1 -1
- package/Meshes/geodesicMesh.d.ts +1 -1
- package/Meshes/geodesicMesh.js +1 -1
- package/Meshes/geodesicMesh.js.map +1 -1
- package/Meshes/geometry.d.ts +2 -2
- package/Meshes/geometry.js +4 -4
- package/Meshes/geometry.js.map +1 -1
- package/Meshes/lattice.d.ts +1 -1
- package/Meshes/lattice.js +1 -1
- package/Meshes/lattice.js.map +1 -1
- package/Meshes/lattice.material.d.ts +1 -1
- package/Meshes/lattice.material.js +1 -1
- package/Meshes/lattice.material.js.map +1 -1
- package/Meshes/mesh.vertexData.d.ts +2 -2
- package/Meshes/mesh.vertexData.js +3 -4
- package/Meshes/mesh.vertexData.js.map +1 -1
- package/Meshes/mesh.vertexData.subdivide.js +1 -1
- package/Meshes/mesh.vertexData.subdivide.js.map +1 -1
- package/Meshes/meshBuilder.d.ts +18 -18
- package/Meshes/meshBuilder.js +18 -18
- package/Meshes/meshBuilder.js.map +1 -1
- package/Meshes/meshSimplification.d.ts +1 -1
- package/Meshes/meshSimplification.js +4 -4
- package/Meshes/meshSimplification.js.map +1 -1
- package/Meshes/meshUVSpaceRenderer.d.ts +1 -1
- package/Meshes/meshUVSpaceRenderer.js +0 -1
- package/Meshes/meshUVSpaceRenderer.js.map +1 -1
- package/Meshes/meshUtils.d.ts +1 -1
- package/Meshes/meshUtils.js +2 -2
- package/Meshes/meshUtils.js.map +1 -1
- package/Meshes/polygonMesh.d.ts +2 -2
- package/Meshes/polygonMesh.js +3 -3
- package/Meshes/polygonMesh.js.map +1 -1
- package/Misc/HighDynamicRange/cubemapToSphericalPolynomial.js +2 -2
- package/Misc/HighDynamicRange/cubemapToSphericalPolynomial.js.map +1 -1
- package/Misc/HighDynamicRange/panoramaToCubemap.js +1 -1
- package/Misc/HighDynamicRange/panoramaToCubemap.js.map +1 -1
- package/Misc/PerformanceViewer/performanceViewerCollector.js +1 -1
- package/Misc/PerformanceViewer/performanceViewerCollector.js.map +1 -1
- package/Misc/areaLightsTextureTools.d.ts +1 -1
- package/Misc/areaLightsTextureTools.js +3 -3
- package/Misc/areaLightsTextureTools.js.map +1 -1
- package/Misc/assetsManager.d.ts +4 -4
- package/Misc/assetsManager.js +5 -5
- package/Misc/assetsManager.js.map +1 -1
- package/Misc/basisWorker.js +1 -1
- package/Misc/basisWorker.js.map +1 -1
- package/Misc/brdfTextureTools.js +1 -1
- package/Misc/brdfTextureTools.js.map +1 -1
- package/Misc/copyTextureToTexture.d.ts +1 -1
- package/Misc/copyTextureToTexture.js +1 -1
- package/Misc/copyTextureToTexture.js.map +1 -1
- package/Misc/decorators.serialization.js +2 -2
- package/Misc/decorators.serialization.js.map +1 -1
- package/Misc/depthReducer.d.ts +2 -2
- package/Misc/depthReducer.js +2 -2
- package/Misc/depthReducer.js.map +1 -1
- package/Misc/gradients.d.ts +1 -1
- package/Misc/gradients.js +1 -1
- package/Misc/gradients.js.map +1 -1
- package/Misc/greasedLineTools.d.ts +1 -1
- package/Misc/greasedLineTools.js +3 -3
- package/Misc/greasedLineTools.js.map +1 -1
- package/Misc/halfFloat.d.ts +17 -0
- package/Misc/halfFloat.js +131 -0
- package/Misc/halfFloat.js.map +1 -0
- package/Misc/khronosTextureContainer2.js +1 -1
- package/Misc/khronosTextureContainer2.js.map +1 -1
- package/Misc/meshExploder.js +1 -1
- package/Misc/meshExploder.js.map +1 -1
- package/Misc/pivotTools.js +1 -1
- package/Misc/pivotTools.js.map +1 -1
- package/Misc/rgbdTextureTools.js +1 -1
- package/Misc/rgbdTextureTools.js.map +1 -1
- package/Misc/sceneOptimizer.js +1 -1
- package/Misc/sceneOptimizer.js.map +1 -1
- package/Misc/sceneRecorder.js +7 -7
- package/Misc/sceneRecorder.js.map +1 -1
- package/Misc/sceneSerializer.js +3 -3
- package/Misc/sceneSerializer.js.map +1 -1
- package/Misc/snapshotRenderingHelper.js +1 -1
- package/Misc/snapshotRenderingHelper.js.map +1 -1
- package/Misc/textureTools.d.ts +3 -13
- package/Misc/textureTools.js +6 -64
- package/Misc/textureTools.js.map +1 -1
- package/Misc/thinMinMaxReducer.d.ts +1 -1
- package/Misc/thinMinMaxReducer.js +1 -1
- package/Misc/thinMinMaxReducer.js.map +1 -1
- package/Misc/tools.internals.js +1 -1
- package/Misc/tools.internals.js.map +1 -1
- package/Misc/tools.pure.js +1 -1
- package/Misc/tools.pure.js.map +1 -1
- package/Misc/trajectoryClassifier.d.ts +1 -1
- package/Misc/trajectoryClassifier.js +1 -1
- package/Misc/trajectoryClassifier.js.map +1 -1
- package/Misc/videoRecorder.js +1 -1
- package/Misc/videoRecorder.js.map +1 -1
- package/Misc/virtualJoystick.d.ts +1 -1
- package/Misc/virtualJoystick.js +1 -1
- package/Misc/virtualJoystick.js.map +1 -1
- package/Morph/morphTarget.js +1 -1
- package/Morph/morphTarget.js.map +1 -1
- package/Navigation/Plugins/recastJSPlugin.d.ts +1 -1
- package/Navigation/Plugins/recastJSPlugin.js +2 -2
- package/Navigation/Plugins/recastJSPlugin.js.map +1 -1
- package/Particles/EmitterTypes/boxParticleEmitter.d.ts +1 -1
- package/Particles/EmitterTypes/boxParticleEmitter.js +1 -1
- package/Particles/EmitterTypes/boxParticleEmitter.js.map +1 -1
- package/Particles/EmitterTypes/coneParticleEmitter.d.ts +1 -1
- package/Particles/EmitterTypes/coneParticleEmitter.js +1 -1
- package/Particles/EmitterTypes/coneParticleEmitter.js.map +1 -1
- package/Particles/EmitterTypes/customParticleEmitter.d.ts +1 -1
- package/Particles/EmitterTypes/customParticleEmitter.js +1 -1
- package/Particles/EmitterTypes/customParticleEmitter.js.map +1 -1
- package/Particles/EmitterTypes/cylinderParticleEmitter.d.ts +1 -1
- package/Particles/EmitterTypes/cylinderParticleEmitter.js +1 -1
- package/Particles/EmitterTypes/cylinderParticleEmitter.js.map +1 -1
- package/Particles/EmitterTypes/hemisphericParticleEmitter.d.ts +1 -1
- package/Particles/EmitterTypes/hemisphericParticleEmitter.js +1 -1
- package/Particles/EmitterTypes/hemisphericParticleEmitter.js.map +1 -1
- package/Particles/EmitterTypes/meshParticleEmitter.d.ts +1 -1
- package/Particles/EmitterTypes/meshParticleEmitter.js +2 -2
- package/Particles/EmitterTypes/meshParticleEmitter.js.map +1 -1
- package/Particles/EmitterTypes/pointParticleEmitter.d.ts +1 -1
- package/Particles/EmitterTypes/pointParticleEmitter.js +1 -1
- package/Particles/EmitterTypes/pointParticleEmitter.js.map +1 -1
- package/Particles/EmitterTypes/sphereParticleEmitter.d.ts +1 -1
- package/Particles/EmitterTypes/sphereParticleEmitter.js +1 -1
- package/Particles/EmitterTypes/sphereParticleEmitter.js.map +1 -1
- package/Particles/Node/nodeParticleBuildState.d.ts +4 -4
- package/Particles/Node/nodeParticleBuildState.js +2 -2
- package/Particles/Node/nodeParticleBuildState.js.map +1 -1
- package/Particles/Node/nodeParticleSystemSet.d.ts +2 -2
- package/Particles/Node/nodeParticleSystemSet.helper.js +31 -31
- package/Particles/Node/nodeParticleSystemSet.helper.js.map +1 -1
- package/Particles/Node/nodeParticleSystemSet.js +8 -8
- package/Particles/Node/nodeParticleSystemSet.js.map +1 -1
- package/Particles/attractor.d.ts +1 -1
- package/Particles/attractor.js +1 -1
- package/Particles/attractor.js.map +1 -1
- package/Particles/flowMap.d.ts +7 -1
- package/Particles/flowMap.js +7 -1
- package/Particles/flowMap.js.map +1 -1
- package/Particles/particle.d.ts +2 -2
- package/Particles/particle.js +2 -2
- package/Particles/particle.js.map +1 -1
- package/Particles/particleHelper.js +5 -5
- package/Particles/particleHelper.js.map +1 -1
- package/Particles/particleSystem.functions.d.ts +1 -1
- package/Particles/particleSystem.functions.js +1 -1
- package/Particles/particleSystem.functions.js.map +1 -1
- package/Particles/particleSystemSet.d.ts +1 -1
- package/Particles/particleSystemSet.js +5 -5
- package/Particles/particleSystemSet.js.map +1 -1
- package/Particles/pointsCloudSystem.d.ts +1 -1
- package/Particles/pointsCloudSystem.js +6 -6
- package/Particles/pointsCloudSystem.js.map +1 -1
- package/Particles/solidParticle.d.ts +2 -2
- package/Particles/solidParticle.js +3 -3
- package/Particles/solidParticle.js.map +1 -1
- package/Particles/solidParticleSystem.d.ts +4 -4
- package/Particles/solidParticleSystem.js +7 -7
- package/Particles/solidParticleSystem.js.map +1 -1
- package/Particles/subEmitter.js +1 -1
- package/Particles/subEmitter.js.map +1 -1
- package/Particles/thinParticleSystem.function.js +2 -2
- package/Particles/thinParticleSystem.function.js.map +1 -1
- package/Physics/Plugins/cannonJSPlugin.d.ts +1 -1
- package/Physics/Plugins/cannonJSPlugin.js +1 -1
- package/Physics/Plugins/cannonJSPlugin.js.map +1 -1
- package/Physics/castingResult.d.ts +1 -1
- package/Physics/castingResult.js +1 -1
- package/Physics/castingResult.js.map +1 -1
- package/Physics/physicsHelper.d.ts +1 -1
- package/Physics/physicsHelper.js +4 -4
- package/Physics/physicsHelper.js.map +1 -1
- package/Physics/physicsImpostor.d.ts +1 -1
- package/Physics/physicsImpostor.js +1 -1
- package/Physics/physicsImpostor.js.map +1 -1
- package/Physics/physicsRaycastResult.d.ts +1 -1
- package/Physics/physicsRaycastResult.js +1 -1
- package/Physics/physicsRaycastResult.js.map +1 -1
- package/Physics/v1/Plugins/ammoJSPlugin.d.ts +2 -2
- package/Physics/v1/Plugins/ammoJSPlugin.js +5 -5
- package/Physics/v1/Plugins/ammoJSPlugin.js.map +1 -1
- package/Physics/v1/Plugins/oimoJSPlugin.d.ts +2 -2
- package/Physics/v1/Plugins/oimoJSPlugin.js +2 -2
- package/Physics/v1/Plugins/oimoJSPlugin.js.map +1 -1
- package/Physics/v1/physicsEngine.d.ts +1 -1
- package/Physics/v1/physicsEngine.js +1 -1
- package/Physics/v1/physicsEngine.js.map +1 -1
- package/Physics/v2/Plugins/havokPlugin.d.ts +14 -2
- package/Physics/v2/Plugins/havokPlugin.js +45 -7
- package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
- package/Physics/v2/characterController.d.ts +1 -1
- package/Physics/v2/characterController.js +2 -2
- package/Physics/v2/characterController.js.map +1 -1
- package/Physics/v2/physicsAggregate.d.ts +3 -3
- package/Physics/v2/physicsAggregate.js +10 -6
- package/Physics/v2/physicsAggregate.js.map +1 -1
- package/Physics/v2/physicsBody.d.ts +1 -1
- package/Physics/v2/physicsBody.js +1 -1
- package/Physics/v2/physicsBody.js.map +1 -1
- package/Physics/v2/physicsEngine.d.ts +1 -1
- package/Physics/v2/physicsEngine.js +1 -1
- package/Physics/v2/physicsEngine.js.map +1 -1
- package/Physics/v2/physicsShape.d.ts +1 -1
- package/Physics/v2/physicsShape.js +1 -1
- package/Physics/v2/physicsShape.js.map +1 -1
- package/Physics/v2/ragdoll.d.ts +2 -2
- package/Physics/v2/ragdoll.js +2 -2
- package/Physics/v2/ragdoll.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.pure.d.ts +1 -0
- package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.pure.js +8 -6
- package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.pure.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/thinSSRRenderingPipeline.js +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/thinSSRRenderingPipeline.js.map +1 -1
- package/PostProcesses/RenderPipeline/postProcessRenderEffect.js +1 -1
- package/PostProcesses/RenderPipeline/postProcessRenderEffect.js.map +1 -1
- package/PostProcesses/RenderPipeline/postProcessRenderPipeline.js +3 -2
- package/PostProcesses/RenderPipeline/postProcessRenderPipeline.js.map +1 -1
- package/PostProcesses/bloomEffect.d.ts +1 -1
- package/PostProcesses/bloomEffect.js +4 -4
- package/PostProcesses/bloomEffect.js.map +1 -1
- package/PostProcesses/depthOfFieldEffect.d.ts +1 -1
- package/PostProcesses/depthOfFieldEffect.js +3 -3
- package/PostProcesses/depthOfFieldEffect.js.map +1 -1
- package/PostProcesses/depthOfFieldMergePostProcess.d.ts +1 -1
- package/PostProcesses/depthOfFieldMergePostProcess.js +1 -1
- package/PostProcesses/depthOfFieldMergePostProcess.js.map +1 -1
- package/PostProcesses/highlightsPostProcess.d.ts +1 -1
- package/PostProcesses/highlightsPostProcess.js +1 -1
- package/PostProcesses/highlightsPostProcess.js.map +1 -1
- package/PostProcesses/imageProcessingPostProcess.d.ts +1 -1
- package/PostProcesses/imageProcessingPostProcess.js +1 -1
- package/PostProcesses/imageProcessingPostProcess.js.map +1 -1
- package/PostProcesses/postProcessManager.d.ts +3 -0
- package/PostProcesses/postProcessManager.js +4 -1
- package/PostProcesses/postProcessManager.js.map +1 -1
- package/PostProcesses/subSurfaceScatteringPostProcess.pure.d.ts +1 -0
- package/PostProcesses/subSurfaceScatteringPostProcess.pure.js +10 -0
- package/PostProcesses/subSurfaceScatteringPostProcess.pure.js.map +1 -1
- package/PostProcesses/thinAnaglyphPostProcess.d.ts +1 -1
- package/PostProcesses/thinAnaglyphPostProcess.js +1 -1
- package/PostProcesses/thinAnaglyphPostProcess.js.map +1 -1
- package/PostProcesses/thinBlackAndWhitePostProcess.d.ts +1 -1
- package/PostProcesses/thinBlackAndWhitePostProcess.js +1 -1
- package/PostProcesses/thinBlackAndWhitePostProcess.js.map +1 -1
- package/PostProcesses/thinBloomEffect.js +1 -1
- package/PostProcesses/thinBloomEffect.js.map +1 -1
- package/PostProcesses/thinBloomMergePostProcess.d.ts +1 -1
- package/PostProcesses/thinBloomMergePostProcess.js +1 -1
- package/PostProcesses/thinBloomMergePostProcess.js.map +1 -1
- package/PostProcesses/thinBlurPostProcess.d.ts +1 -1
- package/PostProcesses/thinBlurPostProcess.js +1 -1
- package/PostProcesses/thinBlurPostProcess.js.map +1 -1
- package/PostProcesses/thinChromaticAberrationPostProcess.d.ts +2 -2
- package/PostProcesses/thinChromaticAberrationPostProcess.js +2 -2
- package/PostProcesses/thinChromaticAberrationPostProcess.js.map +1 -1
- package/PostProcesses/thinCircleOfConfusionPostProcess.d.ts +1 -1
- package/PostProcesses/thinCircleOfConfusionPostProcess.js +1 -1
- package/PostProcesses/thinCircleOfConfusionPostProcess.js.map +1 -1
- package/PostProcesses/thinColorCorrectionPostProcess.d.ts +1 -1
- package/PostProcesses/thinColorCorrectionPostProcess.js +2 -2
- package/PostProcesses/thinColorCorrectionPostProcess.js.map +1 -1
- package/PostProcesses/thinConvolutionPostProcess.d.ts +1 -1
- package/PostProcesses/thinConvolutionPostProcess.js +1 -1
- package/PostProcesses/thinConvolutionPostProcess.js.map +1 -1
- package/PostProcesses/thinCustomPostProcess.d.ts +1 -1
- package/PostProcesses/thinCustomPostProcess.js +1 -1
- package/PostProcesses/thinCustomPostProcess.js.map +1 -1
- package/PostProcesses/thinDepthOfFieldEffect.d.ts +3 -0
- package/PostProcesses/thinDepthOfFieldEffect.js +4 -1
- package/PostProcesses/thinDepthOfFieldEffect.js.map +1 -1
- package/PostProcesses/thinDepthOfFieldMergePostProcess.d.ts +1 -1
- package/PostProcesses/thinDepthOfFieldMergePostProcess.js +1 -1
- package/PostProcesses/thinDepthOfFieldMergePostProcess.js.map +1 -1
- package/PostProcesses/thinExtractHighlightsPostProcess.d.ts +1 -1
- package/PostProcesses/thinExtractHighlightsPostProcess.js +1 -1
- package/PostProcesses/thinExtractHighlightsPostProcess.js.map +1 -1
- package/PostProcesses/thinFXAAPostProcess.d.ts +2 -2
- package/PostProcesses/thinFXAAPostProcess.js +2 -2
- package/PostProcesses/thinFXAAPostProcess.js.map +1 -1
- package/PostProcesses/thinFilterPostProcess.d.ts +2 -2
- package/PostProcesses/thinFilterPostProcess.js +2 -2
- package/PostProcesses/thinFilterPostProcess.js.map +1 -1
- package/PostProcesses/thinGrainPostProcess.d.ts +1 -1
- package/PostProcesses/thinGrainPostProcess.js +1 -1
- package/PostProcesses/thinGrainPostProcess.js.map +1 -1
- package/PostProcesses/thinImageProcessingPostProcess.d.ts +2 -2
- package/PostProcesses/thinImageProcessingPostProcess.js +2 -2
- package/PostProcesses/thinImageProcessingPostProcess.js.map +1 -1
- package/PostProcesses/thinMotionBlurPostProcess.d.ts +1 -1
- package/PostProcesses/thinMotionBlurPostProcess.js +2 -2
- package/PostProcesses/thinMotionBlurPostProcess.js.map +1 -1
- package/PostProcesses/thinPassPostProcess.d.ts +1 -1
- package/PostProcesses/thinPassPostProcess.js +1 -1
- package/PostProcesses/thinPassPostProcess.js.map +1 -1
- package/PostProcesses/thinSSAO2BlurPostProcess.d.ts +1 -1
- package/PostProcesses/thinSSAO2BlurPostProcess.js +1 -1
- package/PostProcesses/thinSSAO2BlurPostProcess.js.map +1 -1
- package/PostProcesses/thinSSAO2CombinePostProcess.d.ts +1 -1
- package/PostProcesses/thinSSAO2CombinePostProcess.js +2 -2
- package/PostProcesses/thinSSAO2CombinePostProcess.js.map +1 -1
- package/PostProcesses/thinSSAO2PostProcess.d.ts +7 -2
- package/PostProcesses/thinSSAO2PostProcess.js +36 -4
- package/PostProcesses/thinSSAO2PostProcess.js.map +1 -1
- package/PostProcesses/thinSSRBlurCombinerPostProcess.d.ts +1 -1
- package/PostProcesses/thinSSRBlurCombinerPostProcess.js +2 -2
- package/PostProcesses/thinSSRBlurCombinerPostProcess.js.map +1 -1
- package/PostProcesses/thinSSRBlurPostProcess.d.ts +2 -2
- package/PostProcesses/thinSSRBlurPostProcess.js +2 -2
- package/PostProcesses/thinSSRBlurPostProcess.js.map +1 -1
- package/PostProcesses/thinSSRPostProcess.d.ts +1 -1
- package/PostProcesses/thinSSRPostProcess.js +2 -2
- package/PostProcesses/thinSSRPostProcess.js.map +1 -1
- package/PostProcesses/thinScreenSpaceCurvaturePostProcess.d.ts +1 -1
- package/PostProcesses/thinScreenSpaceCurvaturePostProcess.js +1 -1
- package/PostProcesses/thinScreenSpaceCurvaturePostProcess.js.map +1 -1
- package/PostProcesses/thinSharpenPostProcess.d.ts +1 -1
- package/PostProcesses/thinSharpenPostProcess.js +1 -1
- package/PostProcesses/thinSharpenPostProcess.js.map +1 -1
- package/PostProcesses/thinTAAPostProcess.d.ts +3 -3
- package/PostProcesses/thinTAAPostProcess.js +4 -4
- package/PostProcesses/thinTAAPostProcess.js.map +1 -1
- package/PostProcesses/thinTonemapPostProcess.d.ts +1 -1
- package/PostProcesses/thinTonemapPostProcess.js +1 -1
- package/PostProcesses/thinTonemapPostProcess.js.map +1 -1
- package/PostProcesses/vrDistortionCorrectionPostProcess.d.ts +1 -1
- package/PostProcesses/vrDistortionCorrectionPostProcess.js +3 -3
- package/PostProcesses/vrDistortionCorrectionPostProcess.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsAccumulationPass.d.ts +2 -2
- package/Rendering/IBLShadows/iblShadowsAccumulationPass.js +4 -4
- package/Rendering/IBLShadows/iblShadowsAccumulationPass.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsSpatialBlurPass.d.ts +2 -2
- package/Rendering/IBLShadows/iblShadowsSpatialBlurPass.js +4 -4
- package/Rendering/IBLShadows/iblShadowsSpatialBlurPass.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.d.ts +3 -3
- package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js +4 -4
- package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js.map +1 -1
- package/Rendering/depthPeelingRenderer.d.ts +1 -1
- package/Rendering/depthPeelingRenderer.js +2 -2
- package/Rendering/depthPeelingRenderer.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingObject.d.ts +1 -1
- package/Rendering/fluidRenderer/fluidRenderingObject.js +1 -1
- package/Rendering/fluidRenderer/fluidRenderingObject.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.d.ts +1 -1
- package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.js +2 -2
- package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.d.ts +3 -3
- package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js +3 -3
- package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingTextures.d.ts +2 -2
- package/Rendering/fluidRenderer/fluidRenderingTextures.js +3 -3
- package/Rendering/fluidRenderer/fluidRenderingTextures.js.map +1 -1
- package/Rendering/iblCdfGenerator.d.ts +3 -3
- package/Rendering/iblCdfGenerator.js +5 -5
- package/Rendering/iblCdfGenerator.js.map +1 -1
- package/Rendering/renderingGroup.js +1 -1
- package/Rendering/renderingGroup.js.map +1 -1
- package/Rendering/subSurfaceConfiguration.d.ts +2 -2
- package/Rendering/subSurfaceConfiguration.js +2 -2
- package/Rendering/subSurfaceConfiguration.js.map +1 -1
- package/Rendering/utilityLayerRenderer.d.ts +2 -2
- package/Rendering/utilityLayerRenderer.js +4 -4
- package/Rendering/utilityLayerRenderer.js.map +1 -1
- package/Shaders/ssao2.fragment.js +10 -2
- package/Shaders/ssao2.fragment.js.map +1 -1
- package/ShadersWGSL/ssao2.fragment.js +10 -2
- package/ShadersWGSL/ssao2.fragment.js.map +1 -1
- package/SmartAssets/smartAssetSerializer.js +1 -1
- package/SmartAssets/smartAssetSerializer.js.map +1 -1
- package/Sprites/sprite.d.ts +2 -2
- package/Sprites/sprite.js +2 -2
- package/Sprites/sprite.js.map +1 -1
- package/Sprites/spriteManager.d.ts +2 -2
- package/Sprites/spriteManager.js +4 -5
- package/Sprites/spriteManager.js.map +1 -1
- package/Sprites/spritePackedManager.js +1 -1
- package/Sprites/spritePackedManager.js.map +1 -1
- package/Sprites/spriteRenderer.js +2 -2
- package/Sprites/spriteRenderer.js.map +1 -1
- package/XR/features/WebXRHitTestLegacy.d.ts +1 -1
- package/XR/features/WebXRHitTestLegacy.js +2 -2
- package/XR/features/WebXRHitTestLegacy.js.map +1 -1
- package/XR/motionController/webXRAbstractMotionController.js +2 -2
- package/XR/motionController/webXRAbstractMotionController.js.map +1 -1
- package/XR/motionController/webXRGenericMotionController.js +2 -2
- package/XR/motionController/webXRGenericMotionController.js.map +1 -1
- package/XR/motionController/webXRProfiledMotionController.js +4 -4
- package/XR/motionController/webXRProfiledMotionController.js.map +1 -1
- package/XR/webXRCamera.d.ts +3 -3
- package/XR/webXRCamera.js +4 -4
- package/XR/webXRCamera.js.map +1 -1
- package/XR/webXRDefaultExperience.d.ts +4 -4
- package/XR/webXRDefaultExperience.js +4 -4
- package/XR/webXRDefaultExperience.js.map +1 -1
- package/XR/webXREnterExitUI.js +1 -1
- package/XR/webXREnterExitUI.js.map +1 -1
- package/XR/webXRExperienceHelper.js +2 -2
- package/XR/webXRExperienceHelper.js.map +1 -1
- package/XR/webXRFeaturesManager.d.ts +47 -0
- package/XR/webXRFeaturesManager.js +1 -1
- package/XR/webXRFeaturesManager.js.map +1 -1
- package/XR/webXRInput.js +1 -1
- package/XR/webXRInput.js.map +1 -1
- package/XR/webXRInputSource.js +4 -4
- package/XR/webXRInputSource.js.map +1 -1
- package/XR/webXRManagedOutputCanvas.js +1 -1
- package/XR/webXRManagedOutputCanvas.js.map +1 -1
- package/XR/webXRRenderTargetTextureProvider.d.ts +1 -1
- package/XR/webXRRenderTargetTextureProvider.js +1 -1
- package/XR/webXRRenderTargetTextureProvider.js.map +1 -1
- package/assetContainer.d.ts +4 -4
- package/assetContainer.js +6 -6
- package/assetContainer.js.map +1 -1
- package/node.d.ts +1 -1
- package/node.js +6 -2
- package/node.js.map +1 -1
- package/package.json +44 -174
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trajectoryClassifier.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/trajectoryClassifier.ts"],"names":[],"mappings":"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","sourcesContent":["import { type DeepImmutable, type Nullable } from \"../types\";\r\nimport { Matrix, Vector3 } from \"../Maths/math.vector\";\r\n\r\n// This implementation was based on the original MIT-licensed TRACE repository\r\n// from https://github.com/septagon/TRACE.\r\n\r\n/**\r\n * Generic implementation of Levenshtein distance.\r\n */\r\nnamespace Levenshtein {\r\n /**\r\n * Alphabet from which to construct sequences to be compared using Levenshtein\r\n * distance.\r\n */\r\n export class Alphabet<T> {\r\n private _characterToIdx: Map<T, number>;\r\n private _insertionCosts: number[];\r\n private _deletionCosts: number[];\r\n private _substitutionCosts: number[][];\r\n\r\n /**\r\n * Serialize the Alphabet to JSON string.\r\n * @returns JSON serialization\r\n */\r\n public serialize(): string {\r\n const jsonObject: any = {};\r\n\r\n const characters = new Array<T>(this._characterToIdx.size);\r\n this._characterToIdx.forEach((v, k) => {\r\n characters[v] = k;\r\n });\r\n jsonObject[\"characters\"] = characters;\r\n\r\n jsonObject[\"insertionCosts\"] = this._insertionCosts;\r\n jsonObject[\"deletionCosts\"] = this._deletionCosts;\r\n jsonObject[\"substitutionCosts\"] = this._substitutionCosts;\r\n\r\n return JSON.stringify(jsonObject);\r\n }\r\n\r\n /**\r\n * Parse an Alphabet from a JSON serialization.\r\n * @param json JSON string to deserialize\r\n * @returns deserialized Alphabet\r\n */\r\n public static Deserialize<T>(json: string): Alphabet<T> {\r\n const jsonObject = JSON.parse(json);\r\n const alphabet = new Alphabet(jsonObject[\"characters\"] as T[]);\r\n alphabet._insertionCosts = jsonObject[\"insertionCosts\"];\r\n alphabet._deletionCosts = jsonObject[\"deletionCosts\"];\r\n alphabet._substitutionCosts = jsonObject[\"substitutionCosts\"];\r\n return alphabet;\r\n }\r\n\r\n /**\r\n * Create a new Alphabet.\r\n * @param characters characters of the alphabet\r\n * @param charToInsertionCost function mapping characters to insertion costs\r\n * @param charToDeletionCost function mapping characters to deletion costs\r\n * @param charsToSubstitutionCost function mapping character pairs to substitution costs\r\n */\r\n public constructor(\r\n characters: Array<T>,\r\n charToInsertionCost: Nullable<(char: T) => number> = null,\r\n charToDeletionCost: Nullable<(char: T) => number> = null,\r\n charsToSubstitutionCost: Nullable<(outChar: T, inChar: T) => number> = null\r\n ) {\r\n charToInsertionCost = charToInsertionCost ?? (() => 1);\r\n charToDeletionCost = charToDeletionCost ?? (() => 1);\r\n charsToSubstitutionCost = charsToSubstitutionCost ?? ((a: T, b: T) => (a === b ? 0 : 1));\r\n\r\n this._characterToIdx = new Map<T, number>();\r\n this._insertionCosts = new Array<number>(characters.length);\r\n this._deletionCosts = new Array<number>(characters.length);\r\n this._substitutionCosts = new Array<Array<number>>(characters.length);\r\n\r\n let c: T;\r\n for (let outerIdx = 0; outerIdx < characters.length; ++outerIdx) {\r\n c = characters[outerIdx];\r\n this._characterToIdx.set(c, outerIdx);\r\n this._insertionCosts[outerIdx] = charToInsertionCost(c);\r\n this._deletionCosts[outerIdx] = charToDeletionCost(c);\r\n\r\n this._substitutionCosts[outerIdx] = new Array<number>(characters.length);\r\n for (let innerIdx = outerIdx; innerIdx < characters.length; ++innerIdx) {\r\n this._substitutionCosts[outerIdx][innerIdx] = charsToSubstitutionCost(c, characters[innerIdx]);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get the index (internally-assigned number) for a character.\r\n * @param char character\r\n * @returns index\r\n */\r\n public getCharacterIdx(char: T): number {\r\n return this._characterToIdx.get(char)!;\r\n }\r\n\r\n /**\r\n * Get the insertion cost of a character from its index.\r\n * @param idx character index\r\n * @returns insertion cost\r\n */\r\n public getInsertionCost(idx: number): number {\r\n return this._insertionCosts[idx];\r\n }\r\n\r\n /**\r\n * Get the deletion cost of a character from its index.\r\n * @param idx character index\r\n * @returns deletion cost\r\n */\r\n public getDeletionCost(idx: number): number {\r\n return this._deletionCosts[idx];\r\n }\r\n\r\n /**\r\n * Gets the cost to substitute two characters. NOTE: this cost is\r\n * required to be bi-directional, meaning it cannot matter which of\r\n * the provided characters is being removed and which is being inserted.\r\n * @param idx1 the first character index\r\n * @param idx2 the second character index\r\n * @returns substitution cost\r\n */\r\n public getSubstitutionCost(idx1: number, idx2: number): number {\r\n const min = Math.min(idx1, idx2);\r\n const max = Math.max(idx1, idx2);\r\n\r\n return this._substitutionCosts[min][max];\r\n }\r\n }\r\n\r\n /**\r\n * Character sequence intended to be compared against other Sequences created\r\n * with the same Alphabet in order to compute Levenshtein distance.\r\n */\r\n export class Sequence<T> {\r\n private _alphabet: Alphabet<T>;\r\n private _characters: number[];\r\n\r\n // Scratch values\r\n private static readonly _MAX_SEQUENCE_LENGTH = 256;\r\n private static _CostMatrix = [...Array(Sequence._MAX_SEQUENCE_LENGTH + 1)].map(() => new Array<number>(Sequence._MAX_SEQUENCE_LENGTH + 1));\r\n private static _InsertionCost: number;\r\n private static _DeletionCost: number;\r\n private static _SubstitutionCost: number;\r\n\r\n /**\r\n * Serialize to JSON string. JSON representation does NOT include the Alphabet\r\n * from which this Sequence was created; Alphabet must be independently\r\n * serialized.\r\n * @returns JSON string\r\n */\r\n public serialize(): string {\r\n return JSON.stringify(this._characters);\r\n }\r\n\r\n /**\r\n * Deserialize from JSON string and Alphabet. This should be the same Alphabet\r\n * from which the Sequence was originally created, which must be serialized and\r\n * deserialized independently so that it can be passed in here.\r\n * @param json JSON string representation of Sequence\r\n * @param alphabet Alphabet from which Sequence was originally created\r\n * @returns Sequence\r\n */\r\n public static Deserialize<T>(json: string, alphabet: Alphabet<T>): Sequence<T> {\r\n const sequence = new Sequence([], alphabet);\r\n sequence._characters = JSON.parse(json);\r\n return sequence;\r\n }\r\n\r\n /**\r\n * Create a new Sequence.\r\n * @param characters characters in the new Sequence\r\n * @param alphabet Alphabet, which must include all used characters\r\n */\r\n public constructor(characters: T[], alphabet: Alphabet<T>) {\r\n if (characters.length > Sequence._MAX_SEQUENCE_LENGTH) {\r\n throw new Error(\"Sequences longer than \" + Sequence._MAX_SEQUENCE_LENGTH + \" not supported.\");\r\n }\r\n this._alphabet = alphabet;\r\n this._characters = characters.map((c) => this._alphabet.getCharacterIdx(c));\r\n }\r\n\r\n /**\r\n * Get the distance between this Sequence and another.\r\n * @param other sequence to compare to\r\n * @returns Levenshtein distance\r\n */\r\n public distance(other: Sequence<T>): number {\r\n return Sequence._Distance<T>(this, other);\r\n }\r\n\r\n /**\r\n * Compute the Levenshtein distance between two Sequences.\r\n * @param a first Sequence\r\n * @param b second Sequence\r\n * @returns Levenshtein distance\r\n */\r\n private static _Distance<T>(a: Sequence<T>, b: Sequence<T>): number {\r\n const alphabet = a._alphabet;\r\n if (alphabet !== b._alphabet) {\r\n throw new Error(\"Cannot Levenshtein compare Sequences built from different alphabets.\");\r\n }\r\n const aChars = a._characters;\r\n const bChars = b._characters;\r\n const aLength = aChars.length;\r\n const bLength = bChars.length;\r\n\r\n const costMatrix = Sequence._CostMatrix;\r\n costMatrix[0][0] = 0;\r\n for (let idx = 0; idx < aLength; ++idx) {\r\n costMatrix[idx + 1][0] = costMatrix[idx][0] + alphabet.getInsertionCost(aChars[idx]);\r\n }\r\n for (let idx = 0; idx < bLength; ++idx) {\r\n costMatrix[0][idx + 1] = costMatrix[0][idx] + alphabet.getInsertionCost(bChars[idx]);\r\n }\r\n\r\n for (let aIdx = 0; aIdx < aLength; ++aIdx) {\r\n for (let bIdx = 0; bIdx < bLength; ++bIdx) {\r\n Sequence._InsertionCost = costMatrix[aIdx + 1][bIdx] + alphabet.getInsertionCost(bChars[bIdx]);\r\n Sequence._DeletionCost = costMatrix[aIdx][bIdx + 1] + alphabet.getDeletionCost(aChars[aIdx]);\r\n Sequence._SubstitutionCost = costMatrix[aIdx][bIdx] + alphabet.getSubstitutionCost(aChars[aIdx], bChars[bIdx]);\r\n\r\n costMatrix[aIdx + 1][bIdx + 1] = Math.min(Sequence._InsertionCost, Sequence._DeletionCost, Sequence._SubstitutionCost);\r\n }\r\n }\r\n\r\n return costMatrix[aLength][bLength];\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * A 3D trajectory consisting of an order list of vectors describing a\r\n * path of motion through 3D space.\r\n */\r\nexport class Trajectory {\r\n private _points: Vector3[];\r\n private readonly _segmentLength: number;\r\n\r\n /**\r\n * Serialize to JSON.\r\n * @returns serialized JSON string\r\n */\r\n public serialize(): string {\r\n return JSON.stringify(this);\r\n }\r\n\r\n /**\r\n * Deserialize from JSON.\r\n * @param json serialized JSON string\r\n * @returns deserialized Trajectory\r\n */\r\n public static Deserialize(json: string): Trajectory {\r\n const jsonObject = JSON.parse(json);\r\n const trajectory = new Trajectory(jsonObject[\"_segmentLength\"]);\r\n trajectory._points = jsonObject[\"_points\"].map((pt: any) => {\r\n return new Vector3(pt[\"_x\"], pt[\"_y\"], pt[\"_z\"]);\r\n });\r\n return trajectory;\r\n }\r\n\r\n /**\r\n * Create a new empty Trajectory.\r\n * @param segmentLength radius of discretization for Trajectory points\r\n */\r\n public constructor(segmentLength: number = 0.01) {\r\n this._points = [];\r\n this._segmentLength = segmentLength;\r\n }\r\n\r\n /**\r\n * Get the length of the Trajectory.\r\n * @returns length of the Trajectory\r\n */\r\n public getLength(): number {\r\n return this._points.length * this._segmentLength;\r\n }\r\n\r\n /**\r\n * Append a new point to the Trajectory.\r\n * NOTE: This implementation has many allocations.\r\n * @param point point to append to the Trajectory\r\n */\r\n public add(point: DeepImmutable<Vector3>): void {\r\n let numPoints = this._points.length;\r\n if (numPoints === 0) {\r\n this._points.push(point.clone());\r\n } else {\r\n const getT = () => this._segmentLength / Vector3.Distance(this._points[numPoints - 1], point);\r\n for (let t = getT(); t <= 1.0; t = getT()) {\r\n const newPoint = this._points[numPoints - 1].scale(1.0 - t);\r\n point.scaleAndAddToRef(t, newPoint);\r\n this._points.push(newPoint);\r\n ++numPoints;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Create a new Trajectory with a segment length chosen to make it\r\n * probable that the new Trajectory will have a specified number of\r\n * segments. This operation is imprecise.\r\n * @param targetResolution number of segments desired\r\n * @returns new Trajectory with approximately the requested number of segments\r\n */\r\n public resampleAtTargetResolution(targetResolution: number): Trajectory {\r\n const resampled = new Trajectory(this.getLength() / targetResolution);\r\n for (const pt of this._points) {\r\n resampled.add(pt);\r\n }\r\n return resampled;\r\n }\r\n\r\n /**\r\n * Convert Trajectory segments into tokenized representation. This\r\n * representation is an array of numbers where each nth number is the\r\n * index of the token which is most similar to the nth segment of the\r\n * Trajectory.\r\n * @param tokens list of vectors which serve as discrete tokens\r\n * @returns list of indices of most similar token per segment\r\n */\r\n public tokenize(tokens: DeepImmutable<Vector3[]>): number[] {\r\n const tokenization: number[] = [];\r\n\r\n const segmentDir = new Vector3();\r\n for (let idx = 2; idx < this._points.length; ++idx) {\r\n if (Trajectory._TransformSegmentDirToRef(this._points[idx - 2], this._points[idx - 1], this._points[idx], segmentDir)) {\r\n tokenization.push(Trajectory._TokenizeSegment(segmentDir, tokens));\r\n }\r\n }\r\n\r\n return tokenization;\r\n }\r\n\r\n private static _ForwardDir = new Vector3();\r\n private static _InverseFromVec = new Vector3();\r\n private static _UpDir = new Vector3();\r\n private static _FromToVec = new Vector3();\r\n private static _LookMatrix = new Matrix();\r\n\r\n /**\r\n * Transform the rotation (i.e., direction) of a segment to isolate\r\n * the relative transformation represented by the segment. This operation\r\n * may or may not succeed due to singularities in the equations that define\r\n * motion relativity in this context.\r\n * @param priorVec the origin of the prior segment\r\n * @param fromVec the origin of the current segment\r\n * @param toVec the destination of the current segment\r\n * @param result reference to output variable\r\n * @returns whether or not transformation was successful\r\n */\r\n private static _TransformSegmentDirToRef(priorVec: DeepImmutable<Vector3>, fromVec: DeepImmutable<Vector3>, toVec: DeepImmutable<Vector3>, result: Vector3): boolean {\r\n const dotProductSampleRejectionThreshold = 0.98;\r\n\r\n fromVec.subtractToRef(priorVec, Trajectory._ForwardDir);\r\n Trajectory._ForwardDir.normalize();\r\n fromVec.scaleToRef(-1, Trajectory._InverseFromVec);\r\n Trajectory._InverseFromVec.normalize();\r\n\r\n if (Math.abs(Vector3.Dot(Trajectory._ForwardDir, Trajectory._InverseFromVec)) > dotProductSampleRejectionThreshold) {\r\n return false;\r\n }\r\n\r\n Vector3.CrossToRef(Trajectory._ForwardDir, Trajectory._InverseFromVec, Trajectory._UpDir);\r\n Trajectory._UpDir.normalize();\r\n Matrix.LookAtLHToRef(priorVec, fromVec, Trajectory._UpDir, Trajectory._LookMatrix);\r\n toVec.subtractToRef(fromVec, Trajectory._FromToVec);\r\n Trajectory._FromToVec.normalize();\r\n Vector3.TransformNormalToRef(Trajectory._FromToVec, Trajectory._LookMatrix, result);\r\n return true;\r\n }\r\n\r\n private static _BestMatch: number;\r\n private static _Score: number;\r\n private static _BestScore: number;\r\n\r\n /**\r\n * Determine which token vector is most similar to the\r\n * segment vector.\r\n * @param segment segment vector\r\n * @param tokens token vector list\r\n * @returns index of the most similar token to the segment\r\n */\r\n private static _TokenizeSegment(segment: DeepImmutable<Vector3>, tokens: DeepImmutable<Vector3[]>): number {\r\n Trajectory._BestMatch = 0;\r\n Trajectory._Score = Vector3.Dot(segment, tokens[0]);\r\n Trajectory._BestScore = Trajectory._Score;\r\n for (let idx = 1; idx < tokens.length; ++idx) {\r\n Trajectory._Score = Vector3.Dot(segment, tokens[idx]);\r\n if (Trajectory._Score > Trajectory._BestScore) {\r\n Trajectory._BestMatch = idx;\r\n Trajectory._BestScore = Trajectory._Score;\r\n }\r\n }\r\n\r\n return Trajectory._BestMatch;\r\n }\r\n}\r\n\r\n/**\r\n * Collection of vectors intended to be used as the basis of Trajectory\r\n * tokenization for Levenshtein distance comparison. Canonically, a\r\n * Vector3Alphabet will resemble a \"spikeball\" of vectors distributed\r\n * roughly evenly over the surface of the unit sphere.\r\n */\r\nclass Vector3Alphabet {\r\n /**\r\n * Characters in the alphabet.\r\n * NOTE: There is no reason for this property to exist and this class should just extend\r\n * Array<Vector3>, except that doing so produces bizarre build-time errors indicating that\r\n * the ES5 library itself fails its own TypeDoc validation.\r\n */\r\n public chars: Vector3[];\r\n\r\n /**\r\n * Helper method to create new \"spikeball\" Vector3Alphabets. Uses a naive\r\n * optimize-from-random strategy to space points around the unit sphere\r\n * surface as a simple alternative to really doing the math to tile the\r\n * sphere.\r\n * @param alphabetSize size of the desired alphabet\r\n * @param iterations number of iterations over which to optimize the \"spikeball\"\r\n * @param startingStepSize distance factor to move points in early optimization iterations\r\n * @param endingStepSize distance factor to move points in late optimization iterations\r\n * @param fixedValues alphabet \"characters\" that are required and cannot be moved by optimization\r\n * @returns a new randomly generated and optimized Vector3Alphabet of the specified size\r\n */\r\n public static Generate(\r\n alphabetSize: number = 64,\r\n iterations: number = 256,\r\n startingStepSize: number = 0.1,\r\n endingStepSize: number = 0.001,\r\n fixedValues: DeepImmutable<Vector3[]> = []\r\n ): Vector3Alphabet {\r\n const epsilon = 0.001;\r\n const epsilonSquared = epsilon * epsilon;\r\n\r\n const alphabet = new Vector3Alphabet(alphabetSize);\r\n for (let idx = 0; idx < alphabetSize; ++idx) {\r\n alphabet.chars[idx] = new Vector3(Math.random() - 0.5, Math.random() - 0.5, Math.random() - 0.5);\r\n alphabet.chars[idx].normalize();\r\n }\r\n\r\n for (let idx = 0; idx < fixedValues.length; ++idx) {\r\n alphabet.chars[idx].copyFrom(fixedValues[idx]);\r\n }\r\n\r\n let stepSize: number;\r\n let distSq: number;\r\n const force = new Vector3();\r\n const scratch = new Vector3();\r\n const lerp = (l: number, r: number, t: number) => (1.0 - t) * l + t * r;\r\n for (let iteration = 0; iteration < iterations; ++iteration) {\r\n stepSize = lerp(startingStepSize, endingStepSize, iteration / (iterations - 1));\r\n for (let idx = fixedValues.length; idx < alphabet.chars.length; ++idx) {\r\n force.copyFromFloats(0, 0, 0);\r\n for (const pt of alphabet.chars) {\r\n alphabet.chars[idx].subtractToRef(pt, scratch);\r\n distSq = scratch.lengthSquared();\r\n if (distSq > epsilonSquared) {\r\n scratch.scaleAndAddToRef(1 / (scratch.lengthSquared() * distSq), force);\r\n }\r\n }\r\n force.scaleInPlace(stepSize);\r\n alphabet.chars[idx].addInPlace(force);\r\n alphabet.chars[idx].normalize();\r\n }\r\n }\r\n\r\n return alphabet;\r\n }\r\n\r\n /**\r\n * Serialize to JSON.\r\n * @returns JSON serialization\r\n */\r\n public serialize(): string {\r\n return JSON.stringify(this.chars);\r\n }\r\n\r\n /**\r\n * Deserialize from JSON.\r\n * @param json JSON serialization\r\n * @returns deserialized Vector3Alphabet\r\n */\r\n public static Deserialize(json: string): Vector3Alphabet {\r\n const jsonObject = JSON.parse(json);\r\n const alphabet = new Vector3Alphabet(jsonObject.length);\r\n for (let idx = 0; idx < jsonObject.length; ++idx) {\r\n alphabet.chars[idx] = new Vector3(jsonObject[idx][\"_x\"], jsonObject[idx][\"_y\"], jsonObject[idx][\"_z\"]);\r\n }\r\n return alphabet;\r\n }\r\n\r\n private constructor(size: number) {\r\n this.chars = new Array(size);\r\n }\r\n}\r\n\r\n/**\r\n * Class which formalizes the manner in which a Vector3Alphabet is used to tokenize and\r\n * describe a Trajectory. This class houses the functionality which determines what\r\n * attributes of Trajectories are and are not considered important, such as scale.\r\n */\r\nclass TrajectoryDescriptor {\r\n private static readonly _FINEST_DESCRIPTOR_RESOLUTION = 32;\r\n\r\n private _sequences: Levenshtein.Sequence<number>[];\r\n\r\n /**\r\n * Serialize to JSON.\r\n * @returns JSON serialization\r\n */\r\n public serialize(): string {\r\n return JSON.stringify(this._sequences.map((sequence) => sequence.serialize()));\r\n }\r\n\r\n /**\r\n * Deserialize from JSON string and Alphabet. This should be the same Alphabet\r\n * from which the descriptor was originally created, which must be serialized and\r\n * deserialized independently so that it can be passed in here.\r\n * @param json JSON serialization\r\n * @param alphabet Alphabet from which descriptor was originally created\r\n * @returns deserialized TrajectoryDescriptor\r\n */\r\n public static Deserialize(json: string, alphabet: Levenshtein.Alphabet<number>): TrajectoryDescriptor {\r\n const descriptor = new TrajectoryDescriptor();\r\n descriptor._sequences = (JSON.parse(json) as string[]).map((s) => Levenshtein.Sequence.Deserialize(s, alphabet));\r\n return descriptor;\r\n }\r\n\r\n /**\r\n * Create a new TrajectoryDescriptor to describe a provided Trajectory according\r\n * to the provided alphabets.\r\n * @param trajectory Trajectory to be described\r\n * @param vector3Alphabet Vector3Alphabet to be used to tokenize the Trajectory\r\n * @param levenshteinAlphabet Levenshtein.Alphabet to be used as basis for comparison with other descriptors\r\n * @returns TrajectoryDescriptor describing provided Trajectory\r\n */\r\n public static CreateFromTrajectory(trajectory: Trajectory, vector3Alphabet: Vector3Alphabet, levenshteinAlphabet: Levenshtein.Alphabet<number>): TrajectoryDescriptor {\r\n return TrajectoryDescriptor.CreateFromTokenizationPyramid(TrajectoryDescriptor._GetTokenizationPyramid(trajectory, vector3Alphabet), levenshteinAlphabet);\r\n }\r\n\r\n /**\r\n * Create a new TrajectoryDescriptor from a pre-existing pyramid of tokens.\r\n * NOTE: This function exists to support an outdated serialization mechanism and should\r\n * be deleted if it is no longer useful.\r\n * @param pyramid tokenization pyramid\r\n * @param levenshteinAlphabet Levenshtein.Alphabet to be uses as basis for comparison with other descriptors\r\n * @returns TrajectoryDescriptor describing the Trajectory from which the pyramid was built\r\n */\r\n public static CreateFromTokenizationPyramid(pyramid: number[][], levenshteinAlphabet: Levenshtein.Alphabet<number>): TrajectoryDescriptor {\r\n const descriptor = new TrajectoryDescriptor();\r\n descriptor._sequences = pyramid.map((tokens) => new Levenshtein.Sequence<number>(tokens, levenshteinAlphabet));\r\n return descriptor;\r\n }\r\n\r\n private constructor() {\r\n this._sequences = [];\r\n }\r\n\r\n /**\r\n * Create the tokenization pyramid for the provided Trajectory according to the given\r\n * Vector3Alphabet.\r\n * @param trajectory Trajectory to be tokenized\r\n * @param alphabet Vector3Alphabet containing tokens\r\n * @param targetResolution finest resolution of descriptor\r\n * @returns tokenization pyramid for Trajectory\r\n */\r\n private static _GetTokenizationPyramid(\r\n trajectory: Trajectory,\r\n alphabet: Vector3Alphabet,\r\n targetResolution: number = TrajectoryDescriptor._FINEST_DESCRIPTOR_RESOLUTION\r\n ): number[][] {\r\n const pyramid: number[][] = [];\r\n for (let res = targetResolution; res > 4; res = Math.floor(res / 2)) {\r\n pyramid.push(trajectory.resampleAtTargetResolution(res).tokenize(alphabet.chars));\r\n }\r\n return pyramid;\r\n }\r\n\r\n /**\r\n * Calculate a distance metric between this TrajectoryDescriptor and another. This is\r\n * essentially a similarity score and does not directly represent Euclidean distance,\r\n * edit distance, or any other formal distance metric.\r\n * @param other TrajectoryDescriptor from which to determine distance\r\n * @returns distance, a nonnegative similarity score where larger values indicate dissimilarity\r\n */\r\n public distance(other: TrajectoryDescriptor): number {\r\n let totalDistance = 0;\r\n let weight: number;\r\n for (let idx = 0; idx < this._sequences.length; ++idx) {\r\n weight = Math.pow(2, idx);\r\n totalDistance += weight * this._sequences[idx].distance(other._sequences[idx]);\r\n }\r\n return totalDistance;\r\n }\r\n}\r\n\r\n/**\r\n * A set of TrajectoryDescriptors defined to be \"the same.\" This is essentially a helper\r\n * class to facilitate methods of Trajectory clustering.\r\n */\r\nclass TrajectoryClass {\r\n private static readonly _MIN_AVERAGE_DISTANCE = 1;\r\n\r\n private _descriptors: TrajectoryDescriptor[];\r\n private _centroidIdx: number;\r\n private _averageDistance: number;\r\n\r\n /**\r\n * Serialize to JSON.\r\n * @returns JSON serialization\r\n */\r\n public serialize(): string {\r\n const jsonObject: any = {};\r\n jsonObject.descriptors = this._descriptors.map((desc) => desc.serialize());\r\n jsonObject.centroidIdx = this._centroidIdx;\r\n jsonObject.averageDistance = this._averageDistance;\r\n return JSON.stringify(jsonObject);\r\n }\r\n\r\n /**\r\n * Deserialize from JSON string and Alphabet. This should be the same Alphabet\r\n * from which the descriptors were originally created, which must be serialized and\r\n * deserialized independently so that it can be passed in here.\r\n * @param json JSON string representation\r\n * @param alphabet Alphabet from which TrajectoryDescriptors were originally created\r\n * @returns deserialized TrajectoryDescriptor\r\n */\r\n public static Deserialize(json: string, alphabet: Levenshtein.Alphabet<number>): TrajectoryClass {\r\n const jsonObject = JSON.parse(json);\r\n const described = new TrajectoryClass();\r\n described._descriptors = jsonObject.descriptors.map((s: string) => TrajectoryDescriptor.Deserialize(s, alphabet));\r\n described._centroidIdx = jsonObject.centroidIdx;\r\n described._averageDistance = jsonObject.averageDistance;\r\n return described;\r\n }\r\n\r\n /**\r\n * Create a new DescribedTrajectory.\r\n * @param descriptors currently-known TrajectoryDescriptors, if any\r\n */\r\n public constructor(descriptors: TrajectoryDescriptor[] = []) {\r\n this._descriptors = descriptors;\r\n this._centroidIdx = -1;\r\n this._averageDistance = 0;\r\n\r\n this._refreshDescription();\r\n }\r\n\r\n /**\r\n * Add a new TrajectoryDescriptor to the list of descriptors known to describe\r\n * this same DescribedTrajectory.\r\n * @param descriptor descriptor to be added\r\n */\r\n public add(descriptor: TrajectoryDescriptor): void {\r\n this._descriptors.push(descriptor);\r\n this._refreshDescription();\r\n }\r\n\r\n /**\r\n * Compute the cost, which is inversely related to the likelihood that the provided\r\n * TrajectoryDescriptor describes a Trajectory that is considered to be the same as\r\n * the class represented by this DescribedTrajectory.\r\n * @param descriptor the descriptor to be costed\r\n * @returns cost of the match, which is a nonnegative similarity metric where larger values indicate dissimilarity\r\n */\r\n public getMatchCost(descriptor: TrajectoryDescriptor): number {\r\n return descriptor.distance(this._descriptors[this._centroidIdx]) / this._averageDistance;\r\n }\r\n\r\n /**\r\n * Compute the minimum distance between the queried TrajectoryDescriptor and a\r\n * descriptor which is a member of this collection. This is an alternative way of\r\n * conceptualizing match cost from getMatchCost(), and it serves a different function.\r\n * @param descriptor the descriptor to find the minimum distance to\r\n * @returns minimum descriptor distance to a member descriptor of this DescribedTrajectory\r\n */\r\n public getMatchMinimumDistance(descriptor: TrajectoryDescriptor): number {\r\n return Math.min(...this._descriptors.map((desc) => desc.distance(descriptor)));\r\n }\r\n\r\n /**\r\n * Refreshes the internal representation of this DescribedTrajectory.\r\n */\r\n private _refreshDescription(): void {\r\n this._centroidIdx = -1;\r\n let sum: number;\r\n const distances = this._descriptors.map((a) => {\r\n sum = 0;\r\n for (const b of this._descriptors) {\r\n sum += a.distance(b);\r\n }\r\n return sum;\r\n });\r\n for (let idx = 0; idx < distances.length; ++idx) {\r\n if (this._centroidIdx < 0 || distances[idx] < distances[this._centroidIdx]) {\r\n this._centroidIdx = idx;\r\n }\r\n }\r\n\r\n this._averageDistance = 0;\r\n for (const desc of this._descriptors) {\r\n this._averageDistance += desc.distance(this._descriptors[this._centroidIdx]);\r\n }\r\n if (this._descriptors.length > 0) {\r\n this._averageDistance = Math.max(this._averageDistance / this._descriptors.length, TrajectoryClass._MIN_AVERAGE_DISTANCE);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Class representing a set of known, named trajectories to which Trajectories can be\r\n * added and using which Trajectories can be recognized.\r\n */\r\nexport class TrajectoryClassifier {\r\n private _maximumAllowableMatchCost: number = 4;\r\n private _vector3Alphabet: Vector3Alphabet;\r\n private _levenshteinAlphabet: Levenshtein.Alphabet<number>;\r\n private _nameToDescribedTrajectory: Map<string, TrajectoryClass>;\r\n\r\n /**\r\n * Serialize to JSON.\r\n * @returns JSON serialization\r\n */\r\n public serialize(): string {\r\n const jsonObject: any = {};\r\n jsonObject.maximumAllowableMatchCost = this._maximumAllowableMatchCost;\r\n jsonObject.vector3Alphabet = this._vector3Alphabet.serialize();\r\n jsonObject.levenshteinAlphabet = this._levenshteinAlphabet.serialize();\r\n jsonObject.nameToDescribedTrajectory = [];\r\n this._nameToDescribedTrajectory.forEach((described, name) => {\r\n jsonObject.nameToDescribedTrajectory.push(name);\r\n jsonObject.nameToDescribedTrajectory.push(described.serialize());\r\n });\r\n return JSON.stringify(jsonObject);\r\n }\r\n\r\n /**\r\n * Deserialize from JSON.\r\n * @param json JSON serialization\r\n * @returns deserialized TrajectorySet\r\n */\r\n public static Deserialize(json: string): TrajectoryClassifier {\r\n const jsonObject = JSON.parse(json);\r\n const classifier = new TrajectoryClassifier();\r\n classifier._maximumAllowableMatchCost = jsonObject.maximumAllowableMatchCost;\r\n classifier._vector3Alphabet = Vector3Alphabet.Deserialize(jsonObject.vector3Alphabet);\r\n classifier._levenshteinAlphabet = Levenshtein.Alphabet.Deserialize<number>(jsonObject.levenshteinAlphabet);\r\n for (let idx = 0; idx < jsonObject.nameToDescribedTrajectory.length; idx += 2) {\r\n classifier._nameToDescribedTrajectory.set(\r\n jsonObject.nameToDescribedTrajectory[idx],\r\n TrajectoryClass.Deserialize(jsonObject.nameToDescribedTrajectory[idx + 1], classifier._levenshteinAlphabet)\r\n );\r\n }\r\n return classifier;\r\n }\r\n\r\n /**\r\n * Initialize a new empty TrajectorySet with auto-generated Alphabets.\r\n * VERY naive, need to be generating these things from known\r\n * sets. Better version later, probably eliminating this one.\r\n * @returns auto-generated TrajectorySet\r\n */\r\n public static Generate(): TrajectoryClassifier {\r\n const vecs = Vector3Alphabet.Generate(64, 256, 0.1, 0.001, [Vector3.Forward()]);\r\n\r\n const charIdxs = new Array(vecs.chars.length);\r\n for (let idx = 0; idx < charIdxs.length; ++idx) {\r\n charIdxs[idx] = idx;\r\n }\r\n\r\n const alphabet = new Levenshtein.Alphabet<number>(\r\n charIdxs,\r\n (idx) => (idx === 0 ? 0 : 1),\r\n (idx) => (idx === 0 ? 0 : 1),\r\n (a, b) => Math.min(1 - Vector3.Dot(vecs.chars[a], vecs.chars[b]), 1)\r\n );\r\n\r\n const trajectorySet = new TrajectoryClassifier();\r\n trajectorySet._vector3Alphabet = vecs;\r\n trajectorySet._levenshteinAlphabet = alphabet;\r\n return trajectorySet;\r\n }\r\n\r\n private constructor() {\r\n this._nameToDescribedTrajectory = new Map<string, TrajectoryClass>();\r\n }\r\n\r\n /**\r\n * Add a new Trajectory to the set with a given name.\r\n * @param trajectory new Trajectory to be added\r\n * @param classification name to which to add the Trajectory\r\n */\r\n public addTrajectoryToClassification(trajectory: Trajectory, classification: string): void {\r\n if (!this._nameToDescribedTrajectory.has(classification)) {\r\n this._nameToDescribedTrajectory.set(classification, new TrajectoryClass());\r\n }\r\n\r\n this._nameToDescribedTrajectory.get(classification)!.add(TrajectoryDescriptor.CreateFromTrajectory(trajectory, this._vector3Alphabet, this._levenshteinAlphabet));\r\n }\r\n\r\n /**\r\n * Remove a known named trajectory and all Trajectories associated with it.\r\n * @param classification name to remove\r\n * @returns whether anything was removed\r\n */\r\n public deleteClassification(classification: string): boolean {\r\n return this._nameToDescribedTrajectory.delete(classification);\r\n }\r\n\r\n /**\r\n * Attempt to recognize a Trajectory from among all the classifications\r\n * already known to the classifier.\r\n * @param trajectory Trajectory to be recognized\r\n * @returns classification of Trajectory if recognized, null otherwise\r\n */\r\n public classifyTrajectory(trajectory: Trajectory): Nullable<string> {\r\n const descriptor = TrajectoryDescriptor.CreateFromTrajectory(trajectory, this._vector3Alphabet, this._levenshteinAlphabet);\r\n\r\n const allowableMatches: string[] = [];\r\n this._nameToDescribedTrajectory.forEach((trajectoryClass, classification) => {\r\n if (trajectoryClass.getMatchCost(descriptor) < this._maximumAllowableMatchCost) {\r\n allowableMatches.push(classification);\r\n }\r\n });\r\n\r\n if (allowableMatches.length === 0) {\r\n return null;\r\n }\r\n\r\n let bestIdx = 0;\r\n let bestMatch = this._nameToDescribedTrajectory.get(allowableMatches[bestIdx])!.getMatchMinimumDistance(descriptor);\r\n let match: number;\r\n for (let idx = 0; idx < allowableMatches.length; ++idx) {\r\n match = this._nameToDescribedTrajectory.get(allowableMatches[idx])!.getMatchMinimumDistance(descriptor);\r\n if (match < bestMatch) {\r\n bestMatch = match;\r\n bestIdx = idx;\r\n }\r\n }\r\n return allowableMatches[bestIdx];\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"trajectoryClassifier.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/trajectoryClassifier.ts"],"names":[],"mappings":"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","sourcesContent":["import { type DeepImmutable, type Nullable } from \"../types\";\r\nimport { Matrix, Vector3 } from \"../Maths/math.vector.pure\";\r\n\r\n// This implementation was based on the original MIT-licensed TRACE repository\r\n// from https://github.com/septagon/TRACE.\r\n\r\n/**\r\n * Generic implementation of Levenshtein distance.\r\n */\r\nnamespace Levenshtein {\r\n /**\r\n * Alphabet from which to construct sequences to be compared using Levenshtein\r\n * distance.\r\n */\r\n export class Alphabet<T> {\r\n private _characterToIdx: Map<T, number>;\r\n private _insertionCosts: number[];\r\n private _deletionCosts: number[];\r\n private _substitutionCosts: number[][];\r\n\r\n /**\r\n * Serialize the Alphabet to JSON string.\r\n * @returns JSON serialization\r\n */\r\n public serialize(): string {\r\n const jsonObject: any = {};\r\n\r\n const characters = new Array<T>(this._characterToIdx.size);\r\n this._characterToIdx.forEach((v, k) => {\r\n characters[v] = k;\r\n });\r\n jsonObject[\"characters\"] = characters;\r\n\r\n jsonObject[\"insertionCosts\"] = this._insertionCosts;\r\n jsonObject[\"deletionCosts\"] = this._deletionCosts;\r\n jsonObject[\"substitutionCosts\"] = this._substitutionCosts;\r\n\r\n return JSON.stringify(jsonObject);\r\n }\r\n\r\n /**\r\n * Parse an Alphabet from a JSON serialization.\r\n * @param json JSON string to deserialize\r\n * @returns deserialized Alphabet\r\n */\r\n public static Deserialize<T>(json: string): Alphabet<T> {\r\n const jsonObject = JSON.parse(json);\r\n const alphabet = new Alphabet(jsonObject[\"characters\"] as T[]);\r\n alphabet._insertionCosts = jsonObject[\"insertionCosts\"];\r\n alphabet._deletionCosts = jsonObject[\"deletionCosts\"];\r\n alphabet._substitutionCosts = jsonObject[\"substitutionCosts\"];\r\n return alphabet;\r\n }\r\n\r\n /**\r\n * Create a new Alphabet.\r\n * @param characters characters of the alphabet\r\n * @param charToInsertionCost function mapping characters to insertion costs\r\n * @param charToDeletionCost function mapping characters to deletion costs\r\n * @param charsToSubstitutionCost function mapping character pairs to substitution costs\r\n */\r\n public constructor(\r\n characters: Array<T>,\r\n charToInsertionCost: Nullable<(char: T) => number> = null,\r\n charToDeletionCost: Nullable<(char: T) => number> = null,\r\n charsToSubstitutionCost: Nullable<(outChar: T, inChar: T) => number> = null\r\n ) {\r\n charToInsertionCost = charToInsertionCost ?? (() => 1);\r\n charToDeletionCost = charToDeletionCost ?? (() => 1);\r\n charsToSubstitutionCost = charsToSubstitutionCost ?? ((a: T, b: T) => (a === b ? 0 : 1));\r\n\r\n this._characterToIdx = new Map<T, number>();\r\n this._insertionCosts = new Array<number>(characters.length);\r\n this._deletionCosts = new Array<number>(characters.length);\r\n this._substitutionCosts = new Array<Array<number>>(characters.length);\r\n\r\n let c: T;\r\n for (let outerIdx = 0; outerIdx < characters.length; ++outerIdx) {\r\n c = characters[outerIdx];\r\n this._characterToIdx.set(c, outerIdx);\r\n this._insertionCosts[outerIdx] = charToInsertionCost(c);\r\n this._deletionCosts[outerIdx] = charToDeletionCost(c);\r\n\r\n this._substitutionCosts[outerIdx] = new Array<number>(characters.length);\r\n for (let innerIdx = outerIdx; innerIdx < characters.length; ++innerIdx) {\r\n this._substitutionCosts[outerIdx][innerIdx] = charsToSubstitutionCost(c, characters[innerIdx]);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get the index (internally-assigned number) for a character.\r\n * @param char character\r\n * @returns index\r\n */\r\n public getCharacterIdx(char: T): number {\r\n return this._characterToIdx.get(char)!;\r\n }\r\n\r\n /**\r\n * Get the insertion cost of a character from its index.\r\n * @param idx character index\r\n * @returns insertion cost\r\n */\r\n public getInsertionCost(idx: number): number {\r\n return this._insertionCosts[idx];\r\n }\r\n\r\n /**\r\n * Get the deletion cost of a character from its index.\r\n * @param idx character index\r\n * @returns deletion cost\r\n */\r\n public getDeletionCost(idx: number): number {\r\n return this._deletionCosts[idx];\r\n }\r\n\r\n /**\r\n * Gets the cost to substitute two characters. NOTE: this cost is\r\n * required to be bi-directional, meaning it cannot matter which of\r\n * the provided characters is being removed and which is being inserted.\r\n * @param idx1 the first character index\r\n * @param idx2 the second character index\r\n * @returns substitution cost\r\n */\r\n public getSubstitutionCost(idx1: number, idx2: number): number {\r\n const min = Math.min(idx1, idx2);\r\n const max = Math.max(idx1, idx2);\r\n\r\n return this._substitutionCosts[min][max];\r\n }\r\n }\r\n\r\n /**\r\n * Character sequence intended to be compared against other Sequences created\r\n * with the same Alphabet in order to compute Levenshtein distance.\r\n */\r\n export class Sequence<T> {\r\n private _alphabet: Alphabet<T>;\r\n private _characters: number[];\r\n\r\n // Scratch values\r\n private static readonly _MAX_SEQUENCE_LENGTH = 256;\r\n private static _CostMatrix = [...Array(Sequence._MAX_SEQUENCE_LENGTH + 1)].map(() => new Array<number>(Sequence._MAX_SEQUENCE_LENGTH + 1));\r\n private static _InsertionCost: number;\r\n private static _DeletionCost: number;\r\n private static _SubstitutionCost: number;\r\n\r\n /**\r\n * Serialize to JSON string. JSON representation does NOT include the Alphabet\r\n * from which this Sequence was created; Alphabet must be independently\r\n * serialized.\r\n * @returns JSON string\r\n */\r\n public serialize(): string {\r\n return JSON.stringify(this._characters);\r\n }\r\n\r\n /**\r\n * Deserialize from JSON string and Alphabet. This should be the same Alphabet\r\n * from which the Sequence was originally created, which must be serialized and\r\n * deserialized independently so that it can be passed in here.\r\n * @param json JSON string representation of Sequence\r\n * @param alphabet Alphabet from which Sequence was originally created\r\n * @returns Sequence\r\n */\r\n public static Deserialize<T>(json: string, alphabet: Alphabet<T>): Sequence<T> {\r\n const sequence = new Sequence([], alphabet);\r\n sequence._characters = JSON.parse(json);\r\n return sequence;\r\n }\r\n\r\n /**\r\n * Create a new Sequence.\r\n * @param characters characters in the new Sequence\r\n * @param alphabet Alphabet, which must include all used characters\r\n */\r\n public constructor(characters: T[], alphabet: Alphabet<T>) {\r\n if (characters.length > Sequence._MAX_SEQUENCE_LENGTH) {\r\n throw new Error(\"Sequences longer than \" + Sequence._MAX_SEQUENCE_LENGTH + \" not supported.\");\r\n }\r\n this._alphabet = alphabet;\r\n this._characters = characters.map((c) => this._alphabet.getCharacterIdx(c));\r\n }\r\n\r\n /**\r\n * Get the distance between this Sequence and another.\r\n * @param other sequence to compare to\r\n * @returns Levenshtein distance\r\n */\r\n public distance(other: Sequence<T>): number {\r\n return Sequence._Distance<T>(this, other);\r\n }\r\n\r\n /**\r\n * Compute the Levenshtein distance between two Sequences.\r\n * @param a first Sequence\r\n * @param b second Sequence\r\n * @returns Levenshtein distance\r\n */\r\n private static _Distance<T>(a: Sequence<T>, b: Sequence<T>): number {\r\n const alphabet = a._alphabet;\r\n if (alphabet !== b._alphabet) {\r\n throw new Error(\"Cannot Levenshtein compare Sequences built from different alphabets.\");\r\n }\r\n const aChars = a._characters;\r\n const bChars = b._characters;\r\n const aLength = aChars.length;\r\n const bLength = bChars.length;\r\n\r\n const costMatrix = Sequence._CostMatrix;\r\n costMatrix[0][0] = 0;\r\n for (let idx = 0; idx < aLength; ++idx) {\r\n costMatrix[idx + 1][0] = costMatrix[idx][0] + alphabet.getInsertionCost(aChars[idx]);\r\n }\r\n for (let idx = 0; idx < bLength; ++idx) {\r\n costMatrix[0][idx + 1] = costMatrix[0][idx] + alphabet.getInsertionCost(bChars[idx]);\r\n }\r\n\r\n for (let aIdx = 0; aIdx < aLength; ++aIdx) {\r\n for (let bIdx = 0; bIdx < bLength; ++bIdx) {\r\n Sequence._InsertionCost = costMatrix[aIdx + 1][bIdx] + alphabet.getInsertionCost(bChars[bIdx]);\r\n Sequence._DeletionCost = costMatrix[aIdx][bIdx + 1] + alphabet.getDeletionCost(aChars[aIdx]);\r\n Sequence._SubstitutionCost = costMatrix[aIdx][bIdx] + alphabet.getSubstitutionCost(aChars[aIdx], bChars[bIdx]);\r\n\r\n costMatrix[aIdx + 1][bIdx + 1] = Math.min(Sequence._InsertionCost, Sequence._DeletionCost, Sequence._SubstitutionCost);\r\n }\r\n }\r\n\r\n return costMatrix[aLength][bLength];\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * A 3D trajectory consisting of an order list of vectors describing a\r\n * path of motion through 3D space.\r\n */\r\nexport class Trajectory {\r\n private _points: Vector3[];\r\n private readonly _segmentLength: number;\r\n\r\n /**\r\n * Serialize to JSON.\r\n * @returns serialized JSON string\r\n */\r\n public serialize(): string {\r\n return JSON.stringify(this);\r\n }\r\n\r\n /**\r\n * Deserialize from JSON.\r\n * @param json serialized JSON string\r\n * @returns deserialized Trajectory\r\n */\r\n public static Deserialize(json: string): Trajectory {\r\n const jsonObject = JSON.parse(json);\r\n const trajectory = new Trajectory(jsonObject[\"_segmentLength\"]);\r\n trajectory._points = jsonObject[\"_points\"].map((pt: any) => {\r\n return new Vector3(pt[\"_x\"], pt[\"_y\"], pt[\"_z\"]);\r\n });\r\n return trajectory;\r\n }\r\n\r\n /**\r\n * Create a new empty Trajectory.\r\n * @param segmentLength radius of discretization for Trajectory points\r\n */\r\n public constructor(segmentLength: number = 0.01) {\r\n this._points = [];\r\n this._segmentLength = segmentLength;\r\n }\r\n\r\n /**\r\n * Get the length of the Trajectory.\r\n * @returns length of the Trajectory\r\n */\r\n public getLength(): number {\r\n return this._points.length * this._segmentLength;\r\n }\r\n\r\n /**\r\n * Append a new point to the Trajectory.\r\n * NOTE: This implementation has many allocations.\r\n * @param point point to append to the Trajectory\r\n */\r\n public add(point: DeepImmutable<Vector3>): void {\r\n let numPoints = this._points.length;\r\n if (numPoints === 0) {\r\n this._points.push(point.clone());\r\n } else {\r\n const getT = () => this._segmentLength / Vector3.Distance(this._points[numPoints - 1], point);\r\n for (let t = getT(); t <= 1.0; t = getT()) {\r\n const newPoint = this._points[numPoints - 1].scale(1.0 - t);\r\n point.scaleAndAddToRef(t, newPoint);\r\n this._points.push(newPoint);\r\n ++numPoints;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Create a new Trajectory with a segment length chosen to make it\r\n * probable that the new Trajectory will have a specified number of\r\n * segments. This operation is imprecise.\r\n * @param targetResolution number of segments desired\r\n * @returns new Trajectory with approximately the requested number of segments\r\n */\r\n public resampleAtTargetResolution(targetResolution: number): Trajectory {\r\n const resampled = new Trajectory(this.getLength() / targetResolution);\r\n for (const pt of this._points) {\r\n resampled.add(pt);\r\n }\r\n return resampled;\r\n }\r\n\r\n /**\r\n * Convert Trajectory segments into tokenized representation. This\r\n * representation is an array of numbers where each nth number is the\r\n * index of the token which is most similar to the nth segment of the\r\n * Trajectory.\r\n * @param tokens list of vectors which serve as discrete tokens\r\n * @returns list of indices of most similar token per segment\r\n */\r\n public tokenize(tokens: DeepImmutable<Vector3[]>): number[] {\r\n const tokenization: number[] = [];\r\n\r\n const segmentDir = new Vector3();\r\n for (let idx = 2; idx < this._points.length; ++idx) {\r\n if (Trajectory._TransformSegmentDirToRef(this._points[idx - 2], this._points[idx - 1], this._points[idx], segmentDir)) {\r\n tokenization.push(Trajectory._TokenizeSegment(segmentDir, tokens));\r\n }\r\n }\r\n\r\n return tokenization;\r\n }\r\n\r\n private static _ForwardDir = new Vector3();\r\n private static _InverseFromVec = new Vector3();\r\n private static _UpDir = new Vector3();\r\n private static _FromToVec = new Vector3();\r\n private static _LookMatrix = new Matrix();\r\n\r\n /**\r\n * Transform the rotation (i.e., direction) of a segment to isolate\r\n * the relative transformation represented by the segment. This operation\r\n * may or may not succeed due to singularities in the equations that define\r\n * motion relativity in this context.\r\n * @param priorVec the origin of the prior segment\r\n * @param fromVec the origin of the current segment\r\n * @param toVec the destination of the current segment\r\n * @param result reference to output variable\r\n * @returns whether or not transformation was successful\r\n */\r\n private static _TransformSegmentDirToRef(priorVec: DeepImmutable<Vector3>, fromVec: DeepImmutable<Vector3>, toVec: DeepImmutable<Vector3>, result: Vector3): boolean {\r\n const dotProductSampleRejectionThreshold = 0.98;\r\n\r\n fromVec.subtractToRef(priorVec, Trajectory._ForwardDir);\r\n Trajectory._ForwardDir.normalize();\r\n fromVec.scaleToRef(-1, Trajectory._InverseFromVec);\r\n Trajectory._InverseFromVec.normalize();\r\n\r\n if (Math.abs(Vector3.Dot(Trajectory._ForwardDir, Trajectory._InverseFromVec)) > dotProductSampleRejectionThreshold) {\r\n return false;\r\n }\r\n\r\n Vector3.CrossToRef(Trajectory._ForwardDir, Trajectory._InverseFromVec, Trajectory._UpDir);\r\n Trajectory._UpDir.normalize();\r\n Matrix.LookAtLHToRef(priorVec, fromVec, Trajectory._UpDir, Trajectory._LookMatrix);\r\n toVec.subtractToRef(fromVec, Trajectory._FromToVec);\r\n Trajectory._FromToVec.normalize();\r\n Vector3.TransformNormalToRef(Trajectory._FromToVec, Trajectory._LookMatrix, result);\r\n return true;\r\n }\r\n\r\n private static _BestMatch: number;\r\n private static _Score: number;\r\n private static _BestScore: number;\r\n\r\n /**\r\n * Determine which token vector is most similar to the\r\n * segment vector.\r\n * @param segment segment vector\r\n * @param tokens token vector list\r\n * @returns index of the most similar token to the segment\r\n */\r\n private static _TokenizeSegment(segment: DeepImmutable<Vector3>, tokens: DeepImmutable<Vector3[]>): number {\r\n Trajectory._BestMatch = 0;\r\n Trajectory._Score = Vector3.Dot(segment, tokens[0]);\r\n Trajectory._BestScore = Trajectory._Score;\r\n for (let idx = 1; idx < tokens.length; ++idx) {\r\n Trajectory._Score = Vector3.Dot(segment, tokens[idx]);\r\n if (Trajectory._Score > Trajectory._BestScore) {\r\n Trajectory._BestMatch = idx;\r\n Trajectory._BestScore = Trajectory._Score;\r\n }\r\n }\r\n\r\n return Trajectory._BestMatch;\r\n }\r\n}\r\n\r\n/**\r\n * Collection of vectors intended to be used as the basis of Trajectory\r\n * tokenization for Levenshtein distance comparison. Canonically, a\r\n * Vector3Alphabet will resemble a \"spikeball\" of vectors distributed\r\n * roughly evenly over the surface of the unit sphere.\r\n */\r\nclass Vector3Alphabet {\r\n /**\r\n * Characters in the alphabet.\r\n * NOTE: There is no reason for this property to exist and this class should just extend\r\n * Array<Vector3>, except that doing so produces bizarre build-time errors indicating that\r\n * the ES5 library itself fails its own TypeDoc validation.\r\n */\r\n public chars: Vector3[];\r\n\r\n /**\r\n * Helper method to create new \"spikeball\" Vector3Alphabets. Uses a naive\r\n * optimize-from-random strategy to space points around the unit sphere\r\n * surface as a simple alternative to really doing the math to tile the\r\n * sphere.\r\n * @param alphabetSize size of the desired alphabet\r\n * @param iterations number of iterations over which to optimize the \"spikeball\"\r\n * @param startingStepSize distance factor to move points in early optimization iterations\r\n * @param endingStepSize distance factor to move points in late optimization iterations\r\n * @param fixedValues alphabet \"characters\" that are required and cannot be moved by optimization\r\n * @returns a new randomly generated and optimized Vector3Alphabet of the specified size\r\n */\r\n public static Generate(\r\n alphabetSize: number = 64,\r\n iterations: number = 256,\r\n startingStepSize: number = 0.1,\r\n endingStepSize: number = 0.001,\r\n fixedValues: DeepImmutable<Vector3[]> = []\r\n ): Vector3Alphabet {\r\n const epsilon = 0.001;\r\n const epsilonSquared = epsilon * epsilon;\r\n\r\n const alphabet = new Vector3Alphabet(alphabetSize);\r\n for (let idx = 0; idx < alphabetSize; ++idx) {\r\n alphabet.chars[idx] = new Vector3(Math.random() - 0.5, Math.random() - 0.5, Math.random() - 0.5);\r\n alphabet.chars[idx].normalize();\r\n }\r\n\r\n for (let idx = 0; idx < fixedValues.length; ++idx) {\r\n alphabet.chars[idx].copyFrom(fixedValues[idx]);\r\n }\r\n\r\n let stepSize: number;\r\n let distSq: number;\r\n const force = new Vector3();\r\n const scratch = new Vector3();\r\n const lerp = (l: number, r: number, t: number) => (1.0 - t) * l + t * r;\r\n for (let iteration = 0; iteration < iterations; ++iteration) {\r\n stepSize = lerp(startingStepSize, endingStepSize, iteration / (iterations - 1));\r\n for (let idx = fixedValues.length; idx < alphabet.chars.length; ++idx) {\r\n force.copyFromFloats(0, 0, 0);\r\n for (const pt of alphabet.chars) {\r\n alphabet.chars[idx].subtractToRef(pt, scratch);\r\n distSq = scratch.lengthSquared();\r\n if (distSq > epsilonSquared) {\r\n scratch.scaleAndAddToRef(1 / (scratch.lengthSquared() * distSq), force);\r\n }\r\n }\r\n force.scaleInPlace(stepSize);\r\n alphabet.chars[idx].addInPlace(force);\r\n alphabet.chars[idx].normalize();\r\n }\r\n }\r\n\r\n return alphabet;\r\n }\r\n\r\n /**\r\n * Serialize to JSON.\r\n * @returns JSON serialization\r\n */\r\n public serialize(): string {\r\n return JSON.stringify(this.chars);\r\n }\r\n\r\n /**\r\n * Deserialize from JSON.\r\n * @param json JSON serialization\r\n * @returns deserialized Vector3Alphabet\r\n */\r\n public static Deserialize(json: string): Vector3Alphabet {\r\n const jsonObject = JSON.parse(json);\r\n const alphabet = new Vector3Alphabet(jsonObject.length);\r\n for (let idx = 0; idx < jsonObject.length; ++idx) {\r\n alphabet.chars[idx] = new Vector3(jsonObject[idx][\"_x\"], jsonObject[idx][\"_y\"], jsonObject[idx][\"_z\"]);\r\n }\r\n return alphabet;\r\n }\r\n\r\n private constructor(size: number) {\r\n this.chars = new Array(size);\r\n }\r\n}\r\n\r\n/**\r\n * Class which formalizes the manner in which a Vector3Alphabet is used to tokenize and\r\n * describe a Trajectory. This class houses the functionality which determines what\r\n * attributes of Trajectories are and are not considered important, such as scale.\r\n */\r\nclass TrajectoryDescriptor {\r\n private static readonly _FINEST_DESCRIPTOR_RESOLUTION = 32;\r\n\r\n private _sequences: Levenshtein.Sequence<number>[];\r\n\r\n /**\r\n * Serialize to JSON.\r\n * @returns JSON serialization\r\n */\r\n public serialize(): string {\r\n return JSON.stringify(this._sequences.map((sequence) => sequence.serialize()));\r\n }\r\n\r\n /**\r\n * Deserialize from JSON string and Alphabet. This should be the same Alphabet\r\n * from which the descriptor was originally created, which must be serialized and\r\n * deserialized independently so that it can be passed in here.\r\n * @param json JSON serialization\r\n * @param alphabet Alphabet from which descriptor was originally created\r\n * @returns deserialized TrajectoryDescriptor\r\n */\r\n public static Deserialize(json: string, alphabet: Levenshtein.Alphabet<number>): TrajectoryDescriptor {\r\n const descriptor = new TrajectoryDescriptor();\r\n descriptor._sequences = (JSON.parse(json) as string[]).map((s) => Levenshtein.Sequence.Deserialize(s, alphabet));\r\n return descriptor;\r\n }\r\n\r\n /**\r\n * Create a new TrajectoryDescriptor to describe a provided Trajectory according\r\n * to the provided alphabets.\r\n * @param trajectory Trajectory to be described\r\n * @param vector3Alphabet Vector3Alphabet to be used to tokenize the Trajectory\r\n * @param levenshteinAlphabet Levenshtein.Alphabet to be used as basis for comparison with other descriptors\r\n * @returns TrajectoryDescriptor describing provided Trajectory\r\n */\r\n public static CreateFromTrajectory(trajectory: Trajectory, vector3Alphabet: Vector3Alphabet, levenshteinAlphabet: Levenshtein.Alphabet<number>): TrajectoryDescriptor {\r\n return TrajectoryDescriptor.CreateFromTokenizationPyramid(TrajectoryDescriptor._GetTokenizationPyramid(trajectory, vector3Alphabet), levenshteinAlphabet);\r\n }\r\n\r\n /**\r\n * Create a new TrajectoryDescriptor from a pre-existing pyramid of tokens.\r\n * NOTE: This function exists to support an outdated serialization mechanism and should\r\n * be deleted if it is no longer useful.\r\n * @param pyramid tokenization pyramid\r\n * @param levenshteinAlphabet Levenshtein.Alphabet to be uses as basis for comparison with other descriptors\r\n * @returns TrajectoryDescriptor describing the Trajectory from which the pyramid was built\r\n */\r\n public static CreateFromTokenizationPyramid(pyramid: number[][], levenshteinAlphabet: Levenshtein.Alphabet<number>): TrajectoryDescriptor {\r\n const descriptor = new TrajectoryDescriptor();\r\n descriptor._sequences = pyramid.map((tokens) => new Levenshtein.Sequence<number>(tokens, levenshteinAlphabet));\r\n return descriptor;\r\n }\r\n\r\n private constructor() {\r\n this._sequences = [];\r\n }\r\n\r\n /**\r\n * Create the tokenization pyramid for the provided Trajectory according to the given\r\n * Vector3Alphabet.\r\n * @param trajectory Trajectory to be tokenized\r\n * @param alphabet Vector3Alphabet containing tokens\r\n * @param targetResolution finest resolution of descriptor\r\n * @returns tokenization pyramid for Trajectory\r\n */\r\n private static _GetTokenizationPyramid(\r\n trajectory: Trajectory,\r\n alphabet: Vector3Alphabet,\r\n targetResolution: number = TrajectoryDescriptor._FINEST_DESCRIPTOR_RESOLUTION\r\n ): number[][] {\r\n const pyramid: number[][] = [];\r\n for (let res = targetResolution; res > 4; res = Math.floor(res / 2)) {\r\n pyramid.push(trajectory.resampleAtTargetResolution(res).tokenize(alphabet.chars));\r\n }\r\n return pyramid;\r\n }\r\n\r\n /**\r\n * Calculate a distance metric between this TrajectoryDescriptor and another. This is\r\n * essentially a similarity score and does not directly represent Euclidean distance,\r\n * edit distance, or any other formal distance metric.\r\n * @param other TrajectoryDescriptor from which to determine distance\r\n * @returns distance, a nonnegative similarity score where larger values indicate dissimilarity\r\n */\r\n public distance(other: TrajectoryDescriptor): number {\r\n let totalDistance = 0;\r\n let weight: number;\r\n for (let idx = 0; idx < this._sequences.length; ++idx) {\r\n weight = Math.pow(2, idx);\r\n totalDistance += weight * this._sequences[idx].distance(other._sequences[idx]);\r\n }\r\n return totalDistance;\r\n }\r\n}\r\n\r\n/**\r\n * A set of TrajectoryDescriptors defined to be \"the same.\" This is essentially a helper\r\n * class to facilitate methods of Trajectory clustering.\r\n */\r\nclass TrajectoryClass {\r\n private static readonly _MIN_AVERAGE_DISTANCE = 1;\r\n\r\n private _descriptors: TrajectoryDescriptor[];\r\n private _centroidIdx: number;\r\n private _averageDistance: number;\r\n\r\n /**\r\n * Serialize to JSON.\r\n * @returns JSON serialization\r\n */\r\n public serialize(): string {\r\n const jsonObject: any = {};\r\n jsonObject.descriptors = this._descriptors.map((desc) => desc.serialize());\r\n jsonObject.centroidIdx = this._centroidIdx;\r\n jsonObject.averageDistance = this._averageDistance;\r\n return JSON.stringify(jsonObject);\r\n }\r\n\r\n /**\r\n * Deserialize from JSON string and Alphabet. This should be the same Alphabet\r\n * from which the descriptors were originally created, which must be serialized and\r\n * deserialized independently so that it can be passed in here.\r\n * @param json JSON string representation\r\n * @param alphabet Alphabet from which TrajectoryDescriptors were originally created\r\n * @returns deserialized TrajectoryDescriptor\r\n */\r\n public static Deserialize(json: string, alphabet: Levenshtein.Alphabet<number>): TrajectoryClass {\r\n const jsonObject = JSON.parse(json);\r\n const described = new TrajectoryClass();\r\n described._descriptors = jsonObject.descriptors.map((s: string) => TrajectoryDescriptor.Deserialize(s, alphabet));\r\n described._centroidIdx = jsonObject.centroidIdx;\r\n described._averageDistance = jsonObject.averageDistance;\r\n return described;\r\n }\r\n\r\n /**\r\n * Create a new DescribedTrajectory.\r\n * @param descriptors currently-known TrajectoryDescriptors, if any\r\n */\r\n public constructor(descriptors: TrajectoryDescriptor[] = []) {\r\n this._descriptors = descriptors;\r\n this._centroidIdx = -1;\r\n this._averageDistance = 0;\r\n\r\n this._refreshDescription();\r\n }\r\n\r\n /**\r\n * Add a new TrajectoryDescriptor to the list of descriptors known to describe\r\n * this same DescribedTrajectory.\r\n * @param descriptor descriptor to be added\r\n */\r\n public add(descriptor: TrajectoryDescriptor): void {\r\n this._descriptors.push(descriptor);\r\n this._refreshDescription();\r\n }\r\n\r\n /**\r\n * Compute the cost, which is inversely related to the likelihood that the provided\r\n * TrajectoryDescriptor describes a Trajectory that is considered to be the same as\r\n * the class represented by this DescribedTrajectory.\r\n * @param descriptor the descriptor to be costed\r\n * @returns cost of the match, which is a nonnegative similarity metric where larger values indicate dissimilarity\r\n */\r\n public getMatchCost(descriptor: TrajectoryDescriptor): number {\r\n return descriptor.distance(this._descriptors[this._centroidIdx]) / this._averageDistance;\r\n }\r\n\r\n /**\r\n * Compute the minimum distance between the queried TrajectoryDescriptor and a\r\n * descriptor which is a member of this collection. This is an alternative way of\r\n * conceptualizing match cost from getMatchCost(), and it serves a different function.\r\n * @param descriptor the descriptor to find the minimum distance to\r\n * @returns minimum descriptor distance to a member descriptor of this DescribedTrajectory\r\n */\r\n public getMatchMinimumDistance(descriptor: TrajectoryDescriptor): number {\r\n return Math.min(...this._descriptors.map((desc) => desc.distance(descriptor)));\r\n }\r\n\r\n /**\r\n * Refreshes the internal representation of this DescribedTrajectory.\r\n */\r\n private _refreshDescription(): void {\r\n this._centroidIdx = -1;\r\n let sum: number;\r\n const distances = this._descriptors.map((a) => {\r\n sum = 0;\r\n for (const b of this._descriptors) {\r\n sum += a.distance(b);\r\n }\r\n return sum;\r\n });\r\n for (let idx = 0; idx < distances.length; ++idx) {\r\n if (this._centroidIdx < 0 || distances[idx] < distances[this._centroidIdx]) {\r\n this._centroidIdx = idx;\r\n }\r\n }\r\n\r\n this._averageDistance = 0;\r\n for (const desc of this._descriptors) {\r\n this._averageDistance += desc.distance(this._descriptors[this._centroidIdx]);\r\n }\r\n if (this._descriptors.length > 0) {\r\n this._averageDistance = Math.max(this._averageDistance / this._descriptors.length, TrajectoryClass._MIN_AVERAGE_DISTANCE);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Class representing a set of known, named trajectories to which Trajectories can be\r\n * added and using which Trajectories can be recognized.\r\n */\r\nexport class TrajectoryClassifier {\r\n private _maximumAllowableMatchCost: number = 4;\r\n private _vector3Alphabet: Vector3Alphabet;\r\n private _levenshteinAlphabet: Levenshtein.Alphabet<number>;\r\n private _nameToDescribedTrajectory: Map<string, TrajectoryClass>;\r\n\r\n /**\r\n * Serialize to JSON.\r\n * @returns JSON serialization\r\n */\r\n public serialize(): string {\r\n const jsonObject: any = {};\r\n jsonObject.maximumAllowableMatchCost = this._maximumAllowableMatchCost;\r\n jsonObject.vector3Alphabet = this._vector3Alphabet.serialize();\r\n jsonObject.levenshteinAlphabet = this._levenshteinAlphabet.serialize();\r\n jsonObject.nameToDescribedTrajectory = [];\r\n this._nameToDescribedTrajectory.forEach((described, name) => {\r\n jsonObject.nameToDescribedTrajectory.push(name);\r\n jsonObject.nameToDescribedTrajectory.push(described.serialize());\r\n });\r\n return JSON.stringify(jsonObject);\r\n }\r\n\r\n /**\r\n * Deserialize from JSON.\r\n * @param json JSON serialization\r\n * @returns deserialized TrajectorySet\r\n */\r\n public static Deserialize(json: string): TrajectoryClassifier {\r\n const jsonObject = JSON.parse(json);\r\n const classifier = new TrajectoryClassifier();\r\n classifier._maximumAllowableMatchCost = jsonObject.maximumAllowableMatchCost;\r\n classifier._vector3Alphabet = Vector3Alphabet.Deserialize(jsonObject.vector3Alphabet);\r\n classifier._levenshteinAlphabet = Levenshtein.Alphabet.Deserialize<number>(jsonObject.levenshteinAlphabet);\r\n for (let idx = 0; idx < jsonObject.nameToDescribedTrajectory.length; idx += 2) {\r\n classifier._nameToDescribedTrajectory.set(\r\n jsonObject.nameToDescribedTrajectory[idx],\r\n TrajectoryClass.Deserialize(jsonObject.nameToDescribedTrajectory[idx + 1], classifier._levenshteinAlphabet)\r\n );\r\n }\r\n return classifier;\r\n }\r\n\r\n /**\r\n * Initialize a new empty TrajectorySet with auto-generated Alphabets.\r\n * VERY naive, need to be generating these things from known\r\n * sets. Better version later, probably eliminating this one.\r\n * @returns auto-generated TrajectorySet\r\n */\r\n public static Generate(): TrajectoryClassifier {\r\n const vecs = Vector3Alphabet.Generate(64, 256, 0.1, 0.001, [Vector3.Forward()]);\r\n\r\n const charIdxs = new Array(vecs.chars.length);\r\n for (let idx = 0; idx < charIdxs.length; ++idx) {\r\n charIdxs[idx] = idx;\r\n }\r\n\r\n const alphabet = new Levenshtein.Alphabet<number>(\r\n charIdxs,\r\n (idx) => (idx === 0 ? 0 : 1),\r\n (idx) => (idx === 0 ? 0 : 1),\r\n (a, b) => Math.min(1 - Vector3.Dot(vecs.chars[a], vecs.chars[b]), 1)\r\n );\r\n\r\n const trajectorySet = new TrajectoryClassifier();\r\n trajectorySet._vector3Alphabet = vecs;\r\n trajectorySet._levenshteinAlphabet = alphabet;\r\n return trajectorySet;\r\n }\r\n\r\n private constructor() {\r\n this._nameToDescribedTrajectory = new Map<string, TrajectoryClass>();\r\n }\r\n\r\n /**\r\n * Add a new Trajectory to the set with a given name.\r\n * @param trajectory new Trajectory to be added\r\n * @param classification name to which to add the Trajectory\r\n */\r\n public addTrajectoryToClassification(trajectory: Trajectory, classification: string): void {\r\n if (!this._nameToDescribedTrajectory.has(classification)) {\r\n this._nameToDescribedTrajectory.set(classification, new TrajectoryClass());\r\n }\r\n\r\n this._nameToDescribedTrajectory.get(classification)!.add(TrajectoryDescriptor.CreateFromTrajectory(trajectory, this._vector3Alphabet, this._levenshteinAlphabet));\r\n }\r\n\r\n /**\r\n * Remove a known named trajectory and all Trajectories associated with it.\r\n * @param classification name to remove\r\n * @returns whether anything was removed\r\n */\r\n public deleteClassification(classification: string): boolean {\r\n return this._nameToDescribedTrajectory.delete(classification);\r\n }\r\n\r\n /**\r\n * Attempt to recognize a Trajectory from among all the classifications\r\n * already known to the classifier.\r\n * @param trajectory Trajectory to be recognized\r\n * @returns classification of Trajectory if recognized, null otherwise\r\n */\r\n public classifyTrajectory(trajectory: Trajectory): Nullable<string> {\r\n const descriptor = TrajectoryDescriptor.CreateFromTrajectory(trajectory, this._vector3Alphabet, this._levenshteinAlphabet);\r\n\r\n const allowableMatches: string[] = [];\r\n this._nameToDescribedTrajectory.forEach((trajectoryClass, classification) => {\r\n if (trajectoryClass.getMatchCost(descriptor) < this._maximumAllowableMatchCost) {\r\n allowableMatches.push(classification);\r\n }\r\n });\r\n\r\n if (allowableMatches.length === 0) {\r\n return null;\r\n }\r\n\r\n let bestIdx = 0;\r\n let bestMatch = this._nameToDescribedTrajectory.get(allowableMatches[bestIdx])!.getMatchMinimumDistance(descriptor);\r\n let match: number;\r\n for (let idx = 0; idx < allowableMatches.length; ++idx) {\r\n match = this._nameToDescribedTrajectory.get(allowableMatches[idx])!.getMatchMinimumDistance(descriptor);\r\n if (match < bestMatch) {\r\n bestMatch = match;\r\n bestIdx = idx;\r\n }\r\n }\r\n return allowableMatches[bestIdx];\r\n }\r\n}\r\n"]}
|
package/Misc/videoRecorder.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"videoRecorder.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/videoRecorder.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\n/* eslint-disable no-var */\r\nimport { type Nullable } from \"../types\";\r\nimport { Tools } from \"./tools\";\r\nimport { type AbstractEngine } from \"../Engines/abstractEngine\";\r\n\r\ninterface MediaRecorder {\r\n /** Starts recording */\r\n start(timeSlice: number): void;\r\n /** Stops recording */\r\n stop(): void;\r\n\r\n /** Event raised when an error arised. */\r\n onerror: (event: ErrorEvent) => void;\r\n /** Event raised when the recording stops. */\r\n onstop: (event: Event) => void;\r\n /** Event raised when a new chunk of data is available and should be tracked. */\r\n ondataavailable: (event: Event) => void;\r\n}\r\n\r\ninterface MediaRecorderOptions {\r\n /** The mime type you want to use as the recording container for the new MediaRecorder. */\r\n mimeType?: string;\r\n /** The chosen bitrate for the audio component of the media. */\r\n audioBitsPerSecond?: number;\r\n /** The chosen bitrate for the video component of the media. */\r\n videoBitsPerSecond?: number;\r\n /** The chosen bitrate for the audio and video components of the media. This can be specified instead of the above two properties.\r\n * If this is specified along with one or the other of the above properties, this will be used for the one that isn't specified. */\r\n bitsPerSecond?: number;\r\n}\r\n\r\ninterface MediaRecorderConstructor {\r\n /**\r\n * A reference to the prototype.\r\n */\r\n readonly prototype: MediaRecorder;\r\n\r\n /**\r\n * Creates a new MediaRecorder.\r\n * @param stream Defines the stream to record.\r\n * @param options Defines the options for the recorder available in the type MediaRecorderOptions.\r\n */\r\n new (stream: MediaStream, options?: MediaRecorderOptions): MediaRecorder;\r\n}\r\n\r\n/**\r\n * MediaRecorder object available in some browsers.\r\n */\r\ndeclare var MediaRecorder: MediaRecorderConstructor;\r\n\r\n/**\r\n * This represents the different options available for the video capture.\r\n */\r\nexport interface VideoRecorderOptions {\r\n /** The canvas you want to record */\r\n canvas?: HTMLCanvasElement;\r\n /** Defines the mime type of the video. */\r\n mimeType: string;\r\n /** Defines the FPS the video should be recorded at. */\r\n fps: number;\r\n /** Defines the chunk size for the recording data. */\r\n recordChunckSize: number;\r\n /** The audio tracks to attach to the recording. */\r\n audioTracks?: MediaStreamTrack[];\r\n}\r\n\r\n/**\r\n * This can help with recording videos from BabylonJS.\r\n * This is based on the available WebRTC functionalities of the browser.\r\n *\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToVideo\r\n */\r\nexport class VideoRecorder {\r\n private static readonly _DefaultOptions = {\r\n mimeType: \"video/webm\",\r\n fps: 25,\r\n recordChunckSize: 3000,\r\n };\r\n\r\n /**\r\n * Returns whether or not the VideoRecorder is available in your browser.\r\n * @param engine Defines the Babylon Engine.\r\n * @param canvas Defines the canvas to record. If not provided, the engine canvas will be used.\r\n * @returns true if supported otherwise false.\r\n */\r\n public static IsSupported(engine: AbstractEngine, canvas?: HTMLCanvasElement): boolean {\r\n const targetCanvas = canvas ?? engine.getRenderingCanvas();\r\n return !!targetCanvas && typeof (<any>targetCanvas).captureStream === \"function\";\r\n }\r\n\r\n private readonly _options: VideoRecorderOptions;\r\n private _canvas: Nullable<HTMLCanvasElement>;\r\n private _mediaRecorder: Nullable<MediaRecorder>;\r\n\r\n private _recordedChunks: any[];\r\n private _fileName: Nullable<string>;\r\n private _resolve: Nullable<(blob: Blob) => void>;\r\n private _reject: Nullable<(error: any) => void>;\r\n\r\n private _isRecording: boolean;\r\n\r\n /**\r\n * True when a recording is already in progress.\r\n */\r\n public get isRecording(): boolean {\r\n return !!this._canvas && this._isRecording;\r\n }\r\n\r\n /**\r\n * Create a new VideoCapture object which can help converting what you see in Babylon to a video file.\r\n * @param engine Defines the BabylonJS Engine you wish to record.\r\n * @param options Defines options that can be used to customize the capture.\r\n */\r\n constructor(engine: AbstractEngine, options: Partial<VideoRecorderOptions> = {}) {\r\n if (!VideoRecorder.IsSupported(engine, options.canvas)) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"Your browser does not support recording so far.\";\r\n }\r\n\r\n const canvas = options.canvas ?? engine.getRenderingCanvas();\r\n if (!canvas) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"The babylon engine must have a canvas to be recorded\";\r\n }\r\n\r\n this._canvas = canvas;\r\n this._isRecording = false;\r\n\r\n this._options = {\r\n ...VideoRecorder._DefaultOptions,\r\n ...options,\r\n };\r\n\r\n const stream = this._canvas.captureStream(this._options.fps);\r\n if (this._options.audioTracks) {\r\n for (const track of this._options.audioTracks) {\r\n stream.addTrack(track);\r\n }\r\n }\r\n\r\n this._mediaRecorder = new MediaRecorder(stream, { mimeType: this._options.mimeType });\r\n this._mediaRecorder.ondataavailable = (evt: Event) => this._handleDataAvailable(evt);\r\n this._mediaRecorder.onerror = (evt: ErrorEvent) => this._handleError(evt);\r\n this._mediaRecorder.onstop = () => this._handleStop();\r\n }\r\n\r\n /**\r\n * Stops the current recording before the default capture timeout passed in the startRecording function.\r\n */\r\n public stopRecording(): void {\r\n if (!this._canvas || !this._mediaRecorder) {\r\n return;\r\n }\r\n\r\n if (!this.isRecording) {\r\n return;\r\n }\r\n\r\n this._isRecording = false;\r\n this._mediaRecorder.stop();\r\n }\r\n\r\n /**\r\n * Starts recording the canvas for a max duration specified in parameters.\r\n * @param fileName Defines the name of the file to be downloaded when the recording stop.\r\n * If null no automatic download will start and you can rely on the promise to get the data back.\r\n * @param maxDuration Defines the maximum recording time in seconds.\r\n * It defaults to 7 seconds. A value of zero will not stop automatically, you would need to call stopRecording manually.\r\n * @returns A promise callback at the end of the recording with the video data in Blob.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async\r\n public startRecording(fileName: Nullable<string> = \"babylonjs.webm\", maxDuration = 7): Promise<Blob> {\r\n if (!this._canvas || !this._mediaRecorder) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"Recorder has already been disposed\";\r\n }\r\n\r\n if (this.isRecording) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"Recording already in progress\";\r\n }\r\n\r\n if (maxDuration > 0) {\r\n setTimeout(() => {\r\n this.stopRecording();\r\n }, maxDuration * 1000);\r\n }\r\n\r\n this._fileName = fileName;\r\n this._recordedChunks = [];\r\n this._resolve = null;\r\n this._reject = null;\r\n\r\n this._isRecording = true;\r\n this._mediaRecorder.start(this._options.recordChunckSize);\r\n\r\n return new Promise<Blob>((resolve, reject) => {\r\n this._resolve = resolve;\r\n this._reject = reject;\r\n });\r\n }\r\n\r\n /**\r\n * Releases internal resources used during the recording.\r\n */\r\n public dispose() {\r\n this._canvas = null;\r\n this._mediaRecorder = null;\r\n\r\n this._recordedChunks = [];\r\n this._fileName = null;\r\n this._resolve = null;\r\n this._reject = null;\r\n }\r\n\r\n private _handleDataAvailable(event: any): void {\r\n if (event.data.size > 0) {\r\n this._recordedChunks.push(event.data);\r\n }\r\n }\r\n\r\n private _handleError(event: ErrorEvent): void {\r\n this.stopRecording();\r\n\r\n if (this._reject) {\r\n this._reject(event.error);\r\n } else {\r\n throw new event.error();\r\n }\r\n }\r\n\r\n private _handleStop(): void {\r\n this.stopRecording();\r\n\r\n const superBuffer = new Blob(this._recordedChunks);\r\n if (this._resolve) {\r\n this._resolve(superBuffer);\r\n }\r\n\r\n window.URL.createObjectURL(superBuffer);\r\n\r\n if (this._fileName) {\r\n Tools.Download(superBuffer, this._fileName);\r\n }\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"videoRecorder.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/videoRecorder.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\n/* eslint-disable no-var */\r\nimport { type Nullable } from \"../types\";\r\nimport { Tools } from \"./tools.pure\";\r\nimport { type AbstractEngine } from \"../Engines/abstractEngine\";\r\n\r\ninterface MediaRecorder {\r\n /** Starts recording */\r\n start(timeSlice: number): void;\r\n /** Stops recording */\r\n stop(): void;\r\n\r\n /** Event raised when an error arised. */\r\n onerror: (event: ErrorEvent) => void;\r\n /** Event raised when the recording stops. */\r\n onstop: (event: Event) => void;\r\n /** Event raised when a new chunk of data is available and should be tracked. */\r\n ondataavailable: (event: Event) => void;\r\n}\r\n\r\ninterface MediaRecorderOptions {\r\n /** The mime type you want to use as the recording container for the new MediaRecorder. */\r\n mimeType?: string;\r\n /** The chosen bitrate for the audio component of the media. */\r\n audioBitsPerSecond?: number;\r\n /** The chosen bitrate for the video component of the media. */\r\n videoBitsPerSecond?: number;\r\n /** The chosen bitrate for the audio and video components of the media. This can be specified instead of the above two properties.\r\n * If this is specified along with one or the other of the above properties, this will be used for the one that isn't specified. */\r\n bitsPerSecond?: number;\r\n}\r\n\r\ninterface MediaRecorderConstructor {\r\n /**\r\n * A reference to the prototype.\r\n */\r\n readonly prototype: MediaRecorder;\r\n\r\n /**\r\n * Creates a new MediaRecorder.\r\n * @param stream Defines the stream to record.\r\n * @param options Defines the options for the recorder available in the type MediaRecorderOptions.\r\n */\r\n new (stream: MediaStream, options?: MediaRecorderOptions): MediaRecorder;\r\n}\r\n\r\n/**\r\n * MediaRecorder object available in some browsers.\r\n */\r\ndeclare var MediaRecorder: MediaRecorderConstructor;\r\n\r\n/**\r\n * This represents the different options available for the video capture.\r\n */\r\nexport interface VideoRecorderOptions {\r\n /** The canvas you want to record */\r\n canvas?: HTMLCanvasElement;\r\n /** Defines the mime type of the video. */\r\n mimeType: string;\r\n /** Defines the FPS the video should be recorded at. */\r\n fps: number;\r\n /** Defines the chunk size for the recording data. */\r\n recordChunckSize: number;\r\n /** The audio tracks to attach to the recording. */\r\n audioTracks?: MediaStreamTrack[];\r\n}\r\n\r\n/**\r\n * This can help with recording videos from BabylonJS.\r\n * This is based on the available WebRTC functionalities of the browser.\r\n *\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToVideo\r\n */\r\nexport class VideoRecorder {\r\n private static readonly _DefaultOptions = {\r\n mimeType: \"video/webm\",\r\n fps: 25,\r\n recordChunckSize: 3000,\r\n };\r\n\r\n /**\r\n * Returns whether or not the VideoRecorder is available in your browser.\r\n * @param engine Defines the Babylon Engine.\r\n * @param canvas Defines the canvas to record. If not provided, the engine canvas will be used.\r\n * @returns true if supported otherwise false.\r\n */\r\n public static IsSupported(engine: AbstractEngine, canvas?: HTMLCanvasElement): boolean {\r\n const targetCanvas = canvas ?? engine.getRenderingCanvas();\r\n return !!targetCanvas && typeof (<any>targetCanvas).captureStream === \"function\";\r\n }\r\n\r\n private readonly _options: VideoRecorderOptions;\r\n private _canvas: Nullable<HTMLCanvasElement>;\r\n private _mediaRecorder: Nullable<MediaRecorder>;\r\n\r\n private _recordedChunks: any[];\r\n private _fileName: Nullable<string>;\r\n private _resolve: Nullable<(blob: Blob) => void>;\r\n private _reject: Nullable<(error: any) => void>;\r\n\r\n private _isRecording: boolean;\r\n\r\n /**\r\n * True when a recording is already in progress.\r\n */\r\n public get isRecording(): boolean {\r\n return !!this._canvas && this._isRecording;\r\n }\r\n\r\n /**\r\n * Create a new VideoCapture object which can help converting what you see in Babylon to a video file.\r\n * @param engine Defines the BabylonJS Engine you wish to record.\r\n * @param options Defines options that can be used to customize the capture.\r\n */\r\n constructor(engine: AbstractEngine, options: Partial<VideoRecorderOptions> = {}) {\r\n if (!VideoRecorder.IsSupported(engine, options.canvas)) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"Your browser does not support recording so far.\";\r\n }\r\n\r\n const canvas = options.canvas ?? engine.getRenderingCanvas();\r\n if (!canvas) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"The babylon engine must have a canvas to be recorded\";\r\n }\r\n\r\n this._canvas = canvas;\r\n this._isRecording = false;\r\n\r\n this._options = {\r\n ...VideoRecorder._DefaultOptions,\r\n ...options,\r\n };\r\n\r\n const stream = this._canvas.captureStream(this._options.fps);\r\n if (this._options.audioTracks) {\r\n for (const track of this._options.audioTracks) {\r\n stream.addTrack(track);\r\n }\r\n }\r\n\r\n this._mediaRecorder = new MediaRecorder(stream, { mimeType: this._options.mimeType });\r\n this._mediaRecorder.ondataavailable = (evt: Event) => this._handleDataAvailable(evt);\r\n this._mediaRecorder.onerror = (evt: ErrorEvent) => this._handleError(evt);\r\n this._mediaRecorder.onstop = () => this._handleStop();\r\n }\r\n\r\n /**\r\n * Stops the current recording before the default capture timeout passed in the startRecording function.\r\n */\r\n public stopRecording(): void {\r\n if (!this._canvas || !this._mediaRecorder) {\r\n return;\r\n }\r\n\r\n if (!this.isRecording) {\r\n return;\r\n }\r\n\r\n this._isRecording = false;\r\n this._mediaRecorder.stop();\r\n }\r\n\r\n /**\r\n * Starts recording the canvas for a max duration specified in parameters.\r\n * @param fileName Defines the name of the file to be downloaded when the recording stop.\r\n * If null no automatic download will start and you can rely on the promise to get the data back.\r\n * @param maxDuration Defines the maximum recording time in seconds.\r\n * It defaults to 7 seconds. A value of zero will not stop automatically, you would need to call stopRecording manually.\r\n * @returns A promise callback at the end of the recording with the video data in Blob.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async\r\n public startRecording(fileName: Nullable<string> = \"babylonjs.webm\", maxDuration = 7): Promise<Blob> {\r\n if (!this._canvas || !this._mediaRecorder) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"Recorder has already been disposed\";\r\n }\r\n\r\n if (this.isRecording) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"Recording already in progress\";\r\n }\r\n\r\n if (maxDuration > 0) {\r\n setTimeout(() => {\r\n this.stopRecording();\r\n }, maxDuration * 1000);\r\n }\r\n\r\n this._fileName = fileName;\r\n this._recordedChunks = [];\r\n this._resolve = null;\r\n this._reject = null;\r\n\r\n this._isRecording = true;\r\n this._mediaRecorder.start(this._options.recordChunckSize);\r\n\r\n return new Promise<Blob>((resolve, reject) => {\r\n this._resolve = resolve;\r\n this._reject = reject;\r\n });\r\n }\r\n\r\n /**\r\n * Releases internal resources used during the recording.\r\n */\r\n public dispose() {\r\n this._canvas = null;\r\n this._mediaRecorder = null;\r\n\r\n this._recordedChunks = [];\r\n this._fileName = null;\r\n this._resolve = null;\r\n this._reject = null;\r\n }\r\n\r\n private _handleDataAvailable(event: any): void {\r\n if (event.data.size > 0) {\r\n this._recordedChunks.push(event.data);\r\n }\r\n }\r\n\r\n private _handleError(event: ErrorEvent): void {\r\n this.stopRecording();\r\n\r\n if (this._reject) {\r\n this._reject(event.error);\r\n } else {\r\n throw new event.error();\r\n }\r\n }\r\n\r\n private _handleStop(): void {\r\n this.stopRecording();\r\n\r\n const superBuffer = new Blob(this._recordedChunks);\r\n if (this._resolve) {\r\n this._resolve(superBuffer);\r\n }\r\n\r\n window.URL.createObjectURL(superBuffer);\r\n\r\n if (this._fileName) {\r\n Tools.Download(superBuffer, this._fileName);\r\n }\r\n }\r\n}\r\n"]}
|
package/Misc/virtualJoystick.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Vector3, Vector2 } from "../Maths/math.vector.js";
|
|
1
|
+
import { Vector3, Vector2 } from "../Maths/math.vector.pure.js";
|
|
2
2
|
import { StringDictionary } from "./stringDictionary.js";
|
|
3
3
|
// Mainly based on these 2 articles :
|
|
4
4
|
// Creating an universal virtual touch joystick working for all Touch models thanks to Hand.JS : http://blogs.msdn.com/b/davrous/archive/2013/02/22/creating-an-universal-virtual-touch-joystick-working-for-all-touch-models-thanks-to-hand-js.aspx
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"virtualJoystick.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/virtualJoystick.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Nullable } from \"../types\";\r\nimport { Vector3, Vector2 } from \"../Maths/math.vector\";\r\nimport { StringDictionary } from \"./stringDictionary\";\r\n\r\n// Mainly based on these 2 articles :\r\n// Creating an universal virtual touch joystick working for all Touch models thanks to Hand.JS : http://blogs.msdn.com/b/davrous/archive/2013/02/22/creating-an-universal-virtual-touch-joystick-working-for-all-touch-models-thanks-to-hand-js.aspx\r\n// & on Seb Lee-Delisle original work: http://seb.ly/2011/04/multi-touch-game-controller-in-javascripthtml5-for-ipad/\r\n\r\n/**\r\n * Defines the potential axis of a Joystick\r\n */\r\nexport const enum JoystickAxis {\r\n /** X axis */\r\n X,\r\n /** Y axis */\r\n Y,\r\n /** Z axis */\r\n Z,\r\n}\r\n\r\n/**\r\n * Represents the different customization options available\r\n * for VirtualJoystick\r\n */\r\ninterface IVirtualJoystickCustomizations {\r\n /**\r\n * Size of the joystick's puck\r\n */\r\n puckSize: number;\r\n /**\r\n * Size of the joystick's container\r\n */\r\n containerSize: number;\r\n /**\r\n * Color of the joystick && puck\r\n */\r\n color: string;\r\n /**\r\n * Image URL for the joystick's puck\r\n */\r\n puckImage?: string;\r\n /**\r\n * Image URL for the joystick's container\r\n */\r\n containerImage?: string;\r\n /**\r\n * Defines the unmoving position of the joystick container\r\n */\r\n position?: { x: number; y: number };\r\n /**\r\n * Defines whether or not the joystick container is always visible\r\n */\r\n alwaysVisible: boolean;\r\n /**\r\n * Defines whether or not to limit the movement of the puck to the joystick's container\r\n */\r\n limitToContainer: boolean;\r\n}\r\n\r\n/**\r\n * Class used to define virtual joystick (used in touch mode)\r\n */\r\nexport class VirtualJoystick {\r\n /**\r\n * Gets or sets a boolean indicating that left and right values must be inverted\r\n */\r\n public reverseLeftRight: boolean;\r\n /**\r\n * Gets or sets a boolean indicating that up and down values must be inverted\r\n */\r\n public reverseUpDown: boolean;\r\n /**\r\n * Gets the offset value for the position (ie. the change of the position value)\r\n */\r\n public deltaPosition: Vector3;\r\n /**\r\n * Gets a boolean indicating if the virtual joystick was pressed\r\n */\r\n public pressed: boolean;\r\n /**\r\n * Canvas the virtual joystick will render onto, default z-index of this is 5\r\n */\r\n public static Canvas: Nullable<HTMLCanvasElement>;\r\n\r\n /**\r\n * boolean indicating whether or not the joystick's puck's movement should be limited to the joystick's container area\r\n */\r\n public limitToContainer: boolean;\r\n\r\n // Used to draw the virtual joystick inside a 2D canvas on top of the WebGL rendering canvas\r\n private static _GlobalJoystickIndex: number = 0;\r\n private static _AlwaysVisibleSticks: number = 0;\r\n private static _VjCanvasContext: CanvasRenderingContext2D;\r\n private static _VjCanvasWidth: number;\r\n private static _VjCanvasHeight: number;\r\n private static _HalfWidth: number;\r\n private static _GetDefaultOptions(): IVirtualJoystickCustomizations {\r\n return {\r\n puckSize: 40,\r\n containerSize: 60,\r\n color: \"cyan\",\r\n puckImage: undefined,\r\n containerImage: undefined,\r\n position: undefined,\r\n alwaysVisible: false,\r\n limitToContainer: false,\r\n };\r\n }\r\n\r\n private _action: () => any;\r\n private _axisTargetedByLeftAndRight: JoystickAxis;\r\n private _axisTargetedByUpAndDown: JoystickAxis;\r\n private _joystickSensibility: number;\r\n private _inversedSensibility: number;\r\n private _joystickPointerId: number;\r\n private _joystickColor: string;\r\n private _joystickPointerPos: Vector2;\r\n private _joystickPreviousPointerPos: Vector2;\r\n private _joystickPointerStartPos: Vector2;\r\n private _deltaJoystickVector: Vector2;\r\n private _leftJoystick: boolean;\r\n private _touches: StringDictionary<{ x: number; y: number; prevX: number; prevY: number } | PointerEvent>;\r\n private _joystickPosition: Nullable<Vector2>;\r\n private _alwaysVisible: boolean;\r\n private _puckImage: HTMLImageElement;\r\n private _containerImage: HTMLImageElement;\r\n private _released = false;\r\n\r\n // size properties\r\n private _joystickPuckSize: number;\r\n private _joystickContainerSize: number;\r\n private _clearPuckSize: number;\r\n private _clearContainerSize: number;\r\n private _clearPuckSizeOffset: number;\r\n private _clearContainerSizeOffset: number;\r\n\r\n private _onPointerDownHandlerRef: (e: PointerEvent) => any;\r\n private _onPointerMoveHandlerRef: (e: PointerEvent) => any;\r\n private _onPointerUpHandlerRef: (e: PointerEvent) => any;\r\n private _onResize: (e: any) => any;\r\n\r\n /**\r\n * Creates a new virtual joystick\r\n * @param leftJoystick defines that the joystick is for left hand (false by default)\r\n * @param customizations Defines the options we want to customize the VirtualJoystick\r\n */\r\n constructor(leftJoystick?: boolean, customizations?: Partial<IVirtualJoystickCustomizations>) {\r\n const options = {\r\n ...VirtualJoystick._GetDefaultOptions(),\r\n ...customizations,\r\n };\r\n\r\n if (leftJoystick) {\r\n this._leftJoystick = true;\r\n } else {\r\n this._leftJoystick = false;\r\n }\r\n\r\n VirtualJoystick._GlobalJoystickIndex++;\r\n\r\n // By default left & right arrow keys are moving the X\r\n // and up & down keys are moving the Y\r\n this._axisTargetedByLeftAndRight = JoystickAxis.X;\r\n this._axisTargetedByUpAndDown = JoystickAxis.Y;\r\n\r\n this.reverseLeftRight = false;\r\n this.reverseUpDown = false;\r\n\r\n // collections of pointers\r\n this._touches = new StringDictionary<{ x: number; y: number; prevX: number; prevY: number } | PointerEvent>();\r\n this.deltaPosition = Vector3.Zero();\r\n\r\n this._joystickSensibility = 25;\r\n this._inversedSensibility = 1 / (this._joystickSensibility / 1000);\r\n\r\n this._onResize = () => {\r\n VirtualJoystick._VjCanvasWidth = window.innerWidth;\r\n VirtualJoystick._VjCanvasHeight = window.innerHeight;\r\n if (VirtualJoystick.Canvas) {\r\n VirtualJoystick.Canvas.width = VirtualJoystick._VjCanvasWidth;\r\n VirtualJoystick.Canvas.height = VirtualJoystick._VjCanvasHeight;\r\n }\r\n VirtualJoystick._HalfWidth = VirtualJoystick._VjCanvasWidth / 2;\r\n };\r\n\r\n // injecting a canvas element on top of the canvas 3D game\r\n if (!VirtualJoystick.Canvas) {\r\n window.addEventListener(\"resize\", this._onResize, false);\r\n VirtualJoystick.Canvas = document.createElement(\"canvas\");\r\n VirtualJoystick._VjCanvasWidth = window.innerWidth;\r\n VirtualJoystick._VjCanvasHeight = window.innerHeight;\r\n VirtualJoystick.Canvas.width = window.innerWidth;\r\n VirtualJoystick.Canvas.height = window.innerHeight;\r\n VirtualJoystick.Canvas.style.width = \"100%\";\r\n VirtualJoystick.Canvas.style.height = \"100%\";\r\n VirtualJoystick.Canvas.style.position = \"absolute\";\r\n VirtualJoystick.Canvas.style.backgroundColor = \"transparent\";\r\n VirtualJoystick.Canvas.style.top = \"0px\";\r\n VirtualJoystick.Canvas.style.left = \"0px\";\r\n VirtualJoystick.Canvas.style.zIndex = \"5\";\r\n VirtualJoystick.Canvas.style.touchAction = \"none\"; // fix https://forum.babylonjs.com/t/virtualjoystick-needs-to-set-style-touch-action-none-explicitly/9562\r\n // Support for jQuery PEP polyfill\r\n VirtualJoystick.Canvas.setAttribute(\"touch-action\", \"none\");\r\n const context = VirtualJoystick.Canvas.getContext(\"2d\");\r\n\r\n if (!context) {\r\n throw new Error(\"Unable to create canvas for virtual joystick\");\r\n }\r\n\r\n VirtualJoystick._VjCanvasContext = context;\r\n VirtualJoystick._VjCanvasContext.strokeStyle = \"#ffffff\";\r\n VirtualJoystick._VjCanvasContext.lineWidth = 2;\r\n document.body.appendChild(VirtualJoystick.Canvas);\r\n }\r\n VirtualJoystick._HalfWidth = VirtualJoystick.Canvas.width / 2;\r\n this.pressed = false;\r\n this.limitToContainer = options.limitToContainer;\r\n\r\n // default joystick color\r\n this._joystickColor = options.color;\r\n\r\n // default joystick size\r\n this.containerSize = options.containerSize;\r\n this.puckSize = options.puckSize;\r\n\r\n if (options.position) {\r\n this.setPosition(options.position.x, options.position.y);\r\n }\r\n if (options.puckImage) {\r\n this.setPuckImage(options.puckImage);\r\n }\r\n if (options.containerImage) {\r\n this.setContainerImage(options.containerImage);\r\n }\r\n if (options.alwaysVisible) {\r\n VirtualJoystick._AlwaysVisibleSticks++;\r\n }\r\n\r\n // must come after position potentially set\r\n this.alwaysVisible = options.alwaysVisible;\r\n\r\n this._joystickPointerId = -1;\r\n // current joystick position\r\n this._joystickPointerPos = new Vector2(0, 0);\r\n this._joystickPreviousPointerPos = new Vector2(0, 0);\r\n // origin joystick position\r\n this._joystickPointerStartPos = new Vector2(0, 0);\r\n this._deltaJoystickVector = new Vector2(0, 0);\r\n\r\n this._onPointerDownHandlerRef = (evt) => {\r\n this._onPointerDown(evt);\r\n };\r\n this._onPointerMoveHandlerRef = (evt) => {\r\n this._onPointerMove(evt);\r\n };\r\n this._onPointerUpHandlerRef = (evt) => {\r\n this._onPointerUp(evt);\r\n };\r\n\r\n VirtualJoystick.Canvas.addEventListener(\"pointerdown\", this._onPointerDownHandlerRef, false);\r\n VirtualJoystick.Canvas.addEventListener(\"pointermove\", this._onPointerMoveHandlerRef, false);\r\n VirtualJoystick.Canvas.addEventListener(\"pointerup\", this._onPointerUpHandlerRef, false);\r\n VirtualJoystick.Canvas.addEventListener(\"pointerout\", this._onPointerUpHandlerRef, false);\r\n VirtualJoystick.Canvas.addEventListener(\"pointercancel\", this._onPointerUpHandlerRef, false);\r\n VirtualJoystick.Canvas.addEventListener(\r\n \"contextmenu\",\r\n (evt) => {\r\n evt.preventDefault(); // Disables system menu\r\n },\r\n false\r\n );\r\n requestAnimationFrame(() => {\r\n this._drawVirtualJoystick();\r\n });\r\n }\r\n\r\n /**\r\n * Defines joystick sensibility (ie. the ratio between a physical move and virtual joystick position change)\r\n * @param newJoystickSensibility defines the new sensibility\r\n */\r\n public setJoystickSensibility(newJoystickSensibility: number) {\r\n this._joystickSensibility = newJoystickSensibility;\r\n this._inversedSensibility = 1 / (this._joystickSensibility / 1000);\r\n }\r\n\r\n private _onPointerDown(e: PointerEvent) {\r\n let positionOnScreenCondition: boolean;\r\n\r\n e.preventDefault();\r\n\r\n if (this._leftJoystick === true) {\r\n positionOnScreenCondition = e.clientX < VirtualJoystick._HalfWidth;\r\n } else {\r\n positionOnScreenCondition = e.clientX > VirtualJoystick._HalfWidth;\r\n }\r\n\r\n if (positionOnScreenCondition && this._joystickPointerId < 0) {\r\n // First contact will be dedicated to the virtual joystick\r\n this._joystickPointerId = e.pointerId;\r\n\r\n if (this._joystickPosition) {\r\n this._joystickPointerStartPos = this._joystickPosition.clone();\r\n this._joystickPointerPos = this._joystickPosition.clone();\r\n this._joystickPreviousPointerPos = this._joystickPosition.clone();\r\n\r\n // in case the user only clicks down && doesn't move:\r\n // this ensures the delta is properly set\r\n this._onPointerMove(e);\r\n } else {\r\n this._joystickPointerStartPos.x = e.clientX;\r\n this._joystickPointerStartPos.y = e.clientY;\r\n this._joystickPointerPos = this._joystickPointerStartPos.clone();\r\n this._joystickPreviousPointerPos = this._joystickPointerStartPos.clone();\r\n }\r\n\r\n this._deltaJoystickVector.x = 0;\r\n this._deltaJoystickVector.y = 0;\r\n this.pressed = true;\r\n this._touches.add(e.pointerId.toString(), e);\r\n } else {\r\n // You can only trigger the action buttons with a joystick declared\r\n if (VirtualJoystick._GlobalJoystickIndex < 2 && this._action) {\r\n this._action();\r\n this._touches.add(e.pointerId.toString(), { x: e.clientX, y: e.clientY, prevX: e.clientX, prevY: e.clientY });\r\n }\r\n }\r\n }\r\n\r\n private _onPointerMove(e: PointerEvent) {\r\n // If the current pointer is the one associated to the joystick (first touch contact)\r\n if (this._joystickPointerId == e.pointerId) {\r\n // limit to container if need be\r\n if (this.limitToContainer) {\r\n const vector = new Vector2(e.clientX - this._joystickPointerStartPos.x, e.clientY - this._joystickPointerStartPos.y);\r\n const distance = vector.length();\r\n\r\n if (distance > this.containerSize) {\r\n vector.scaleInPlace(this.containerSize / distance);\r\n }\r\n\r\n this._joystickPointerPos.x = this._joystickPointerStartPos.x + vector.x;\r\n this._joystickPointerPos.y = this._joystickPointerStartPos.y + vector.y;\r\n } else {\r\n this._joystickPointerPos.x = e.clientX;\r\n this._joystickPointerPos.y = e.clientY;\r\n }\r\n\r\n // create delta vector\r\n this._deltaJoystickVector = this._joystickPointerPos.clone();\r\n this._deltaJoystickVector = this._deltaJoystickVector.subtract(this._joystickPointerStartPos);\r\n\r\n // if a joystick is always visible, there will be clipping issues if\r\n // you drag the puck from one over the container of the other\r\n if (0 < VirtualJoystick._AlwaysVisibleSticks) {\r\n if (this._leftJoystick) {\r\n this._joystickPointerPos.x = Math.min(VirtualJoystick._HalfWidth, this._joystickPointerPos.x);\r\n } else {\r\n this._joystickPointerPos.x = Math.max(VirtualJoystick._HalfWidth, this._joystickPointerPos.x);\r\n }\r\n }\r\n\r\n const directionLeftRight = this.reverseLeftRight ? -1 : 1;\r\n const deltaJoystickX = (directionLeftRight * this._deltaJoystickVector.x) / this._inversedSensibility;\r\n switch (this._axisTargetedByLeftAndRight) {\r\n case JoystickAxis.X:\r\n this.deltaPosition.x = Math.min(1, Math.max(-1, deltaJoystickX));\r\n break;\r\n case JoystickAxis.Y:\r\n this.deltaPosition.y = Math.min(1, Math.max(-1, deltaJoystickX));\r\n break;\r\n case JoystickAxis.Z:\r\n this.deltaPosition.z = Math.min(1, Math.max(-1, deltaJoystickX));\r\n break;\r\n }\r\n const directionUpDown = this.reverseUpDown ? 1 : -1;\r\n const deltaJoystickY = (directionUpDown * this._deltaJoystickVector.y) / this._inversedSensibility;\r\n switch (this._axisTargetedByUpAndDown) {\r\n case JoystickAxis.X:\r\n this.deltaPosition.x = Math.min(1, Math.max(-1, deltaJoystickY));\r\n break;\r\n case JoystickAxis.Y:\r\n this.deltaPosition.y = Math.min(1, Math.max(-1, deltaJoystickY));\r\n break;\r\n case JoystickAxis.Z:\r\n this.deltaPosition.z = Math.min(1, Math.max(-1, deltaJoystickY));\r\n break;\r\n }\r\n } else {\r\n const data = this._touches.get(e.pointerId.toString());\r\n if (data) {\r\n (data as any).x = e.clientX;\r\n (data as any).y = e.clientY;\r\n }\r\n }\r\n }\r\n\r\n private _onPointerUp(e: PointerEvent) {\r\n if (this._joystickPointerId == e.pointerId) {\r\n this._clearPreviousDraw();\r\n\r\n this._joystickPointerId = -1;\r\n this.pressed = false;\r\n } else {\r\n const touch = <{ x: number; y: number; prevX: number; prevY: number }>this._touches.get(e.pointerId.toString());\r\n if (touch) {\r\n VirtualJoystick._VjCanvasContext.clearRect(touch.prevX - 44, touch.prevY - 44, 88, 88);\r\n }\r\n }\r\n this._deltaJoystickVector.x = 0;\r\n this._deltaJoystickVector.y = 0;\r\n\r\n this._touches.remove(e.pointerId.toString());\r\n }\r\n\r\n /**\r\n * Change the color of the virtual joystick\r\n * @param newColor a string that must be a CSS color value (like \"red\") or the hexa value (like \"#FF0000\")\r\n */\r\n public setJoystickColor(newColor: string) {\r\n this._joystickColor = newColor;\r\n }\r\n\r\n /**\r\n * Size of the joystick's container\r\n */\r\n public set containerSize(newSize: number) {\r\n this._joystickContainerSize = newSize;\r\n this._clearContainerSize = ~~(this._joystickContainerSize * 2.1);\r\n this._clearContainerSizeOffset = ~~(this._clearContainerSize / 2);\r\n }\r\n public get containerSize() {\r\n return this._joystickContainerSize;\r\n }\r\n\r\n /**\r\n * Size of the joystick's puck\r\n */\r\n public set puckSize(newSize: number) {\r\n this._joystickPuckSize = newSize;\r\n this._clearPuckSize = ~~(this._joystickPuckSize * 2.1);\r\n this._clearPuckSizeOffset = ~~(this._clearPuckSize / 2);\r\n }\r\n public get puckSize() {\r\n return this._joystickPuckSize;\r\n }\r\n\r\n /**\r\n * Clears the set position of the joystick\r\n */\r\n public clearPosition() {\r\n this.alwaysVisible = false;\r\n\r\n this._joystickPosition = null;\r\n }\r\n\r\n /**\r\n * Defines whether or not the joystick container is always visible\r\n */\r\n public set alwaysVisible(value: boolean) {\r\n if (this._alwaysVisible === value) {\r\n return;\r\n }\r\n\r\n if (value && this._joystickPosition) {\r\n VirtualJoystick._AlwaysVisibleSticks++;\r\n\r\n this._alwaysVisible = true;\r\n } else {\r\n VirtualJoystick._AlwaysVisibleSticks--;\r\n\r\n this._alwaysVisible = false;\r\n }\r\n }\r\n public get alwaysVisible() {\r\n return this._alwaysVisible;\r\n }\r\n\r\n /**\r\n * Sets the constant position of the Joystick container\r\n * @param x X axis coordinate\r\n * @param y Y axis coordinate\r\n */\r\n public setPosition(x: number, y: number) {\r\n // just in case position is moved while the container is visible\r\n if (this._joystickPointerStartPos) {\r\n this._clearPreviousDraw();\r\n }\r\n\r\n this._joystickPosition = new Vector2(x, y);\r\n }\r\n\r\n /**\r\n * Defines a callback to call when the joystick is touched\r\n * @param action defines the callback\r\n */\r\n public setActionOnTouch(action: () => any) {\r\n this._action = action;\r\n }\r\n\r\n /**\r\n * Defines which axis you'd like to control for left & right\r\n * @param axis defines the axis to use\r\n */\r\n public setAxisForLeftRight(axis: JoystickAxis) {\r\n switch (axis) {\r\n case JoystickAxis.X:\r\n case JoystickAxis.Y:\r\n case JoystickAxis.Z:\r\n this._axisTargetedByLeftAndRight = axis;\r\n break;\r\n default:\r\n this._axisTargetedByLeftAndRight = JoystickAxis.X;\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Defines which axis you'd like to control for up & down\r\n * @param axis defines the axis to use\r\n */\r\n public setAxisForUpDown(axis: JoystickAxis) {\r\n switch (axis) {\r\n case JoystickAxis.X:\r\n case JoystickAxis.Y:\r\n case JoystickAxis.Z:\r\n this._axisTargetedByUpAndDown = axis;\r\n break;\r\n default:\r\n this._axisTargetedByUpAndDown = JoystickAxis.Y;\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Clears the canvas from the previous puck / container draw\r\n */\r\n private _clearPreviousDraw() {\r\n const jp = this._joystickPosition || this._joystickPointerStartPos;\r\n\r\n // clear container pixels\r\n VirtualJoystick._VjCanvasContext.clearRect(\r\n jp.x - this._clearContainerSizeOffset,\r\n jp.y - this._clearContainerSizeOffset,\r\n this._clearContainerSize,\r\n this._clearContainerSize\r\n );\r\n\r\n // clear puck pixels + 1 pixel for the change made before it moved\r\n VirtualJoystick._VjCanvasContext.clearRect(\r\n this._joystickPreviousPointerPos.x - this._clearPuckSizeOffset - 1,\r\n this._joystickPreviousPointerPos.y - this._clearPuckSizeOffset - 1,\r\n this._clearPuckSize + 2,\r\n this._clearPuckSize + 2\r\n );\r\n }\r\n\r\n /**\r\n * Loads `urlPath` to be used for the container's image\r\n * @param urlPath defines the urlPath of an image to use\r\n */\r\n public setContainerImage(urlPath: string) {\r\n const image = new Image();\r\n image.src = urlPath;\r\n\r\n image.onload = () => (this._containerImage = image);\r\n }\r\n\r\n /**\r\n * Loads `urlPath` to be used for the puck's image\r\n * @param urlPath defines the urlPath of an image to use\r\n */\r\n public setPuckImage(urlPath: string) {\r\n const image = new Image();\r\n image.src = urlPath;\r\n\r\n image.onload = () => (this._puckImage = image);\r\n }\r\n\r\n /**\r\n * Draws the Virtual Joystick's container\r\n */\r\n private _drawContainer() {\r\n const jp = this._joystickPosition || this._joystickPointerStartPos;\r\n\r\n this._clearPreviousDraw();\r\n\r\n if (this._containerImage) {\r\n VirtualJoystick._VjCanvasContext.drawImage(this._containerImage, jp.x - this.containerSize, jp.y - this.containerSize, this.containerSize * 2, this.containerSize * 2);\r\n } else {\r\n // outer container\r\n VirtualJoystick._VjCanvasContext.beginPath();\r\n VirtualJoystick._VjCanvasContext.strokeStyle = this._joystickColor;\r\n VirtualJoystick._VjCanvasContext.lineWidth = 2;\r\n VirtualJoystick._VjCanvasContext.arc(jp.x, jp.y, this.containerSize, 0, Math.PI * 2, true);\r\n VirtualJoystick._VjCanvasContext.stroke();\r\n VirtualJoystick._VjCanvasContext.closePath();\r\n\r\n // inner container\r\n VirtualJoystick._VjCanvasContext.beginPath();\r\n VirtualJoystick._VjCanvasContext.lineWidth = 6;\r\n VirtualJoystick._VjCanvasContext.strokeStyle = this._joystickColor;\r\n VirtualJoystick._VjCanvasContext.arc(jp.x, jp.y, this.puckSize, 0, Math.PI * 2, true);\r\n VirtualJoystick._VjCanvasContext.stroke();\r\n VirtualJoystick._VjCanvasContext.closePath();\r\n }\r\n }\r\n\r\n /**\r\n * Draws the Virtual Joystick's puck\r\n */\r\n private _drawPuck() {\r\n if (this._puckImage) {\r\n VirtualJoystick._VjCanvasContext.drawImage(\r\n this._puckImage,\r\n this._joystickPointerPos.x - this.puckSize,\r\n this._joystickPointerPos.y - this.puckSize,\r\n this.puckSize * 2,\r\n this.puckSize * 2\r\n );\r\n } else {\r\n VirtualJoystick._VjCanvasContext.beginPath();\r\n VirtualJoystick._VjCanvasContext.strokeStyle = this._joystickColor;\r\n VirtualJoystick._VjCanvasContext.lineWidth = 2;\r\n VirtualJoystick._VjCanvasContext.arc(this._joystickPointerPos.x, this._joystickPointerPos.y, this.puckSize, 0, Math.PI * 2, true);\r\n VirtualJoystick._VjCanvasContext.stroke();\r\n VirtualJoystick._VjCanvasContext.closePath();\r\n }\r\n }\r\n\r\n private _drawVirtualJoystick() {\r\n // canvas released? don't continue iterating\r\n if (this._released) {\r\n return;\r\n }\r\n if (this.alwaysVisible) {\r\n this._drawContainer();\r\n }\r\n\r\n if (this.pressed) {\r\n this._touches.forEach((key, touch) => {\r\n if ((<PointerEvent>touch).pointerId === this._joystickPointerId) {\r\n if (!this.alwaysVisible) {\r\n this._drawContainer();\r\n }\r\n\r\n this._drawPuck();\r\n\r\n // store current pointer for next clear\r\n this._joystickPreviousPointerPos = this._joystickPointerPos.clone();\r\n } else {\r\n VirtualJoystick._VjCanvasContext.clearRect((<any>touch).prevX - 44, (<any>touch).prevY - 44, 88, 88);\r\n VirtualJoystick._VjCanvasContext.beginPath();\r\n VirtualJoystick._VjCanvasContext.fillStyle = \"white\";\r\n VirtualJoystick._VjCanvasContext.beginPath();\r\n VirtualJoystick._VjCanvasContext.strokeStyle = \"red\";\r\n VirtualJoystick._VjCanvasContext.lineWidth = 6;\r\n VirtualJoystick._VjCanvasContext.arc(touch.x, touch.y, 40, 0, Math.PI * 2, true);\r\n VirtualJoystick._VjCanvasContext.stroke();\r\n VirtualJoystick._VjCanvasContext.closePath();\r\n (<any>touch).prevX = touch.x;\r\n (<any>touch).prevY = touch.y;\r\n }\r\n });\r\n }\r\n requestAnimationFrame(() => {\r\n this._drawVirtualJoystick();\r\n });\r\n }\r\n\r\n /**\r\n * Release internal HTML canvas\r\n */\r\n public releaseCanvas() {\r\n if (VirtualJoystick.Canvas) {\r\n VirtualJoystick.Canvas.removeEventListener(\"pointerdown\", this._onPointerDownHandlerRef);\r\n VirtualJoystick.Canvas.removeEventListener(\"pointermove\", this._onPointerMoveHandlerRef);\r\n VirtualJoystick.Canvas.removeEventListener(\"pointerup\", this._onPointerUpHandlerRef);\r\n VirtualJoystick.Canvas.removeEventListener(\"pointerout\", this._onPointerUpHandlerRef);\r\n VirtualJoystick.Canvas.removeEventListener(\"pointercancel\", this._onPointerUpHandlerRef);\r\n window.removeEventListener(\"resize\", this._onResize);\r\n document.body.removeChild(VirtualJoystick.Canvas);\r\n VirtualJoystick.Canvas = null;\r\n }\r\n this._released = true;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"virtualJoystick.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/virtualJoystick.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Nullable } from \"../types\";\r\nimport { Vector3, Vector2 } from \"../Maths/math.vector.pure\";\r\nimport { StringDictionary } from \"./stringDictionary\";\r\n\r\n// Mainly based on these 2 articles :\r\n// Creating an universal virtual touch joystick working for all Touch models thanks to Hand.JS : http://blogs.msdn.com/b/davrous/archive/2013/02/22/creating-an-universal-virtual-touch-joystick-working-for-all-touch-models-thanks-to-hand-js.aspx\r\n// & on Seb Lee-Delisle original work: http://seb.ly/2011/04/multi-touch-game-controller-in-javascripthtml5-for-ipad/\r\n\r\n/**\r\n * Defines the potential axis of a Joystick\r\n */\r\nexport const enum JoystickAxis {\r\n /** X axis */\r\n X,\r\n /** Y axis */\r\n Y,\r\n /** Z axis */\r\n Z,\r\n}\r\n\r\n/**\r\n * Represents the different customization options available\r\n * for VirtualJoystick\r\n */\r\ninterface IVirtualJoystickCustomizations {\r\n /**\r\n * Size of the joystick's puck\r\n */\r\n puckSize: number;\r\n /**\r\n * Size of the joystick's container\r\n */\r\n containerSize: number;\r\n /**\r\n * Color of the joystick && puck\r\n */\r\n color: string;\r\n /**\r\n * Image URL for the joystick's puck\r\n */\r\n puckImage?: string;\r\n /**\r\n * Image URL for the joystick's container\r\n */\r\n containerImage?: string;\r\n /**\r\n * Defines the unmoving position of the joystick container\r\n */\r\n position?: { x: number; y: number };\r\n /**\r\n * Defines whether or not the joystick container is always visible\r\n */\r\n alwaysVisible: boolean;\r\n /**\r\n * Defines whether or not to limit the movement of the puck to the joystick's container\r\n */\r\n limitToContainer: boolean;\r\n}\r\n\r\n/**\r\n * Class used to define virtual joystick (used in touch mode)\r\n */\r\nexport class VirtualJoystick {\r\n /**\r\n * Gets or sets a boolean indicating that left and right values must be inverted\r\n */\r\n public reverseLeftRight: boolean;\r\n /**\r\n * Gets or sets a boolean indicating that up and down values must be inverted\r\n */\r\n public reverseUpDown: boolean;\r\n /**\r\n * Gets the offset value for the position (ie. the change of the position value)\r\n */\r\n public deltaPosition: Vector3;\r\n /**\r\n * Gets a boolean indicating if the virtual joystick was pressed\r\n */\r\n public pressed: boolean;\r\n /**\r\n * Canvas the virtual joystick will render onto, default z-index of this is 5\r\n */\r\n public static Canvas: Nullable<HTMLCanvasElement>;\r\n\r\n /**\r\n * boolean indicating whether or not the joystick's puck's movement should be limited to the joystick's container area\r\n */\r\n public limitToContainer: boolean;\r\n\r\n // Used to draw the virtual joystick inside a 2D canvas on top of the WebGL rendering canvas\r\n private static _GlobalJoystickIndex: number = 0;\r\n private static _AlwaysVisibleSticks: number = 0;\r\n private static _VjCanvasContext: CanvasRenderingContext2D;\r\n private static _VjCanvasWidth: number;\r\n private static _VjCanvasHeight: number;\r\n private static _HalfWidth: number;\r\n private static _GetDefaultOptions(): IVirtualJoystickCustomizations {\r\n return {\r\n puckSize: 40,\r\n containerSize: 60,\r\n color: \"cyan\",\r\n puckImage: undefined,\r\n containerImage: undefined,\r\n position: undefined,\r\n alwaysVisible: false,\r\n limitToContainer: false,\r\n };\r\n }\r\n\r\n private _action: () => any;\r\n private _axisTargetedByLeftAndRight: JoystickAxis;\r\n private _axisTargetedByUpAndDown: JoystickAxis;\r\n private _joystickSensibility: number;\r\n private _inversedSensibility: number;\r\n private _joystickPointerId: number;\r\n private _joystickColor: string;\r\n private _joystickPointerPos: Vector2;\r\n private _joystickPreviousPointerPos: Vector2;\r\n private _joystickPointerStartPos: Vector2;\r\n private _deltaJoystickVector: Vector2;\r\n private _leftJoystick: boolean;\r\n private _touches: StringDictionary<{ x: number; y: number; prevX: number; prevY: number } | PointerEvent>;\r\n private _joystickPosition: Nullable<Vector2>;\r\n private _alwaysVisible: boolean;\r\n private _puckImage: HTMLImageElement;\r\n private _containerImage: HTMLImageElement;\r\n private _released = false;\r\n\r\n // size properties\r\n private _joystickPuckSize: number;\r\n private _joystickContainerSize: number;\r\n private _clearPuckSize: number;\r\n private _clearContainerSize: number;\r\n private _clearPuckSizeOffset: number;\r\n private _clearContainerSizeOffset: number;\r\n\r\n private _onPointerDownHandlerRef: (e: PointerEvent) => any;\r\n private _onPointerMoveHandlerRef: (e: PointerEvent) => any;\r\n private _onPointerUpHandlerRef: (e: PointerEvent) => any;\r\n private _onResize: (e: any) => any;\r\n\r\n /**\r\n * Creates a new virtual joystick\r\n * @param leftJoystick defines that the joystick is for left hand (false by default)\r\n * @param customizations Defines the options we want to customize the VirtualJoystick\r\n */\r\n constructor(leftJoystick?: boolean, customizations?: Partial<IVirtualJoystickCustomizations>) {\r\n const options = {\r\n ...VirtualJoystick._GetDefaultOptions(),\r\n ...customizations,\r\n };\r\n\r\n if (leftJoystick) {\r\n this._leftJoystick = true;\r\n } else {\r\n this._leftJoystick = false;\r\n }\r\n\r\n VirtualJoystick._GlobalJoystickIndex++;\r\n\r\n // By default left & right arrow keys are moving the X\r\n // and up & down keys are moving the Y\r\n this._axisTargetedByLeftAndRight = JoystickAxis.X;\r\n this._axisTargetedByUpAndDown = JoystickAxis.Y;\r\n\r\n this.reverseLeftRight = false;\r\n this.reverseUpDown = false;\r\n\r\n // collections of pointers\r\n this._touches = new StringDictionary<{ x: number; y: number; prevX: number; prevY: number } | PointerEvent>();\r\n this.deltaPosition = Vector3.Zero();\r\n\r\n this._joystickSensibility = 25;\r\n this._inversedSensibility = 1 / (this._joystickSensibility / 1000);\r\n\r\n this._onResize = () => {\r\n VirtualJoystick._VjCanvasWidth = window.innerWidth;\r\n VirtualJoystick._VjCanvasHeight = window.innerHeight;\r\n if (VirtualJoystick.Canvas) {\r\n VirtualJoystick.Canvas.width = VirtualJoystick._VjCanvasWidth;\r\n VirtualJoystick.Canvas.height = VirtualJoystick._VjCanvasHeight;\r\n }\r\n VirtualJoystick._HalfWidth = VirtualJoystick._VjCanvasWidth / 2;\r\n };\r\n\r\n // injecting a canvas element on top of the canvas 3D game\r\n if (!VirtualJoystick.Canvas) {\r\n window.addEventListener(\"resize\", this._onResize, false);\r\n VirtualJoystick.Canvas = document.createElement(\"canvas\");\r\n VirtualJoystick._VjCanvasWidth = window.innerWidth;\r\n VirtualJoystick._VjCanvasHeight = window.innerHeight;\r\n VirtualJoystick.Canvas.width = window.innerWidth;\r\n VirtualJoystick.Canvas.height = window.innerHeight;\r\n VirtualJoystick.Canvas.style.width = \"100%\";\r\n VirtualJoystick.Canvas.style.height = \"100%\";\r\n VirtualJoystick.Canvas.style.position = \"absolute\";\r\n VirtualJoystick.Canvas.style.backgroundColor = \"transparent\";\r\n VirtualJoystick.Canvas.style.top = \"0px\";\r\n VirtualJoystick.Canvas.style.left = \"0px\";\r\n VirtualJoystick.Canvas.style.zIndex = \"5\";\r\n VirtualJoystick.Canvas.style.touchAction = \"none\"; // fix https://forum.babylonjs.com/t/virtualjoystick-needs-to-set-style-touch-action-none-explicitly/9562\r\n // Support for jQuery PEP polyfill\r\n VirtualJoystick.Canvas.setAttribute(\"touch-action\", \"none\");\r\n const context = VirtualJoystick.Canvas.getContext(\"2d\");\r\n\r\n if (!context) {\r\n throw new Error(\"Unable to create canvas for virtual joystick\");\r\n }\r\n\r\n VirtualJoystick._VjCanvasContext = context;\r\n VirtualJoystick._VjCanvasContext.strokeStyle = \"#ffffff\";\r\n VirtualJoystick._VjCanvasContext.lineWidth = 2;\r\n document.body.appendChild(VirtualJoystick.Canvas);\r\n }\r\n VirtualJoystick._HalfWidth = VirtualJoystick.Canvas.width / 2;\r\n this.pressed = false;\r\n this.limitToContainer = options.limitToContainer;\r\n\r\n // default joystick color\r\n this._joystickColor = options.color;\r\n\r\n // default joystick size\r\n this.containerSize = options.containerSize;\r\n this.puckSize = options.puckSize;\r\n\r\n if (options.position) {\r\n this.setPosition(options.position.x, options.position.y);\r\n }\r\n if (options.puckImage) {\r\n this.setPuckImage(options.puckImage);\r\n }\r\n if (options.containerImage) {\r\n this.setContainerImage(options.containerImage);\r\n }\r\n if (options.alwaysVisible) {\r\n VirtualJoystick._AlwaysVisibleSticks++;\r\n }\r\n\r\n // must come after position potentially set\r\n this.alwaysVisible = options.alwaysVisible;\r\n\r\n this._joystickPointerId = -1;\r\n // current joystick position\r\n this._joystickPointerPos = new Vector2(0, 0);\r\n this._joystickPreviousPointerPos = new Vector2(0, 0);\r\n // origin joystick position\r\n this._joystickPointerStartPos = new Vector2(0, 0);\r\n this._deltaJoystickVector = new Vector2(0, 0);\r\n\r\n this._onPointerDownHandlerRef = (evt) => {\r\n this._onPointerDown(evt);\r\n };\r\n this._onPointerMoveHandlerRef = (evt) => {\r\n this._onPointerMove(evt);\r\n };\r\n this._onPointerUpHandlerRef = (evt) => {\r\n this._onPointerUp(evt);\r\n };\r\n\r\n VirtualJoystick.Canvas.addEventListener(\"pointerdown\", this._onPointerDownHandlerRef, false);\r\n VirtualJoystick.Canvas.addEventListener(\"pointermove\", this._onPointerMoveHandlerRef, false);\r\n VirtualJoystick.Canvas.addEventListener(\"pointerup\", this._onPointerUpHandlerRef, false);\r\n VirtualJoystick.Canvas.addEventListener(\"pointerout\", this._onPointerUpHandlerRef, false);\r\n VirtualJoystick.Canvas.addEventListener(\"pointercancel\", this._onPointerUpHandlerRef, false);\r\n VirtualJoystick.Canvas.addEventListener(\r\n \"contextmenu\",\r\n (evt) => {\r\n evt.preventDefault(); // Disables system menu\r\n },\r\n false\r\n );\r\n requestAnimationFrame(() => {\r\n this._drawVirtualJoystick();\r\n });\r\n }\r\n\r\n /**\r\n * Defines joystick sensibility (ie. the ratio between a physical move and virtual joystick position change)\r\n * @param newJoystickSensibility defines the new sensibility\r\n */\r\n public setJoystickSensibility(newJoystickSensibility: number) {\r\n this._joystickSensibility = newJoystickSensibility;\r\n this._inversedSensibility = 1 / (this._joystickSensibility / 1000);\r\n }\r\n\r\n private _onPointerDown(e: PointerEvent) {\r\n let positionOnScreenCondition: boolean;\r\n\r\n e.preventDefault();\r\n\r\n if (this._leftJoystick === true) {\r\n positionOnScreenCondition = e.clientX < VirtualJoystick._HalfWidth;\r\n } else {\r\n positionOnScreenCondition = e.clientX > VirtualJoystick._HalfWidth;\r\n }\r\n\r\n if (positionOnScreenCondition && this._joystickPointerId < 0) {\r\n // First contact will be dedicated to the virtual joystick\r\n this._joystickPointerId = e.pointerId;\r\n\r\n if (this._joystickPosition) {\r\n this._joystickPointerStartPos = this._joystickPosition.clone();\r\n this._joystickPointerPos = this._joystickPosition.clone();\r\n this._joystickPreviousPointerPos = this._joystickPosition.clone();\r\n\r\n // in case the user only clicks down && doesn't move:\r\n // this ensures the delta is properly set\r\n this._onPointerMove(e);\r\n } else {\r\n this._joystickPointerStartPos.x = e.clientX;\r\n this._joystickPointerStartPos.y = e.clientY;\r\n this._joystickPointerPos = this._joystickPointerStartPos.clone();\r\n this._joystickPreviousPointerPos = this._joystickPointerStartPos.clone();\r\n }\r\n\r\n this._deltaJoystickVector.x = 0;\r\n this._deltaJoystickVector.y = 0;\r\n this.pressed = true;\r\n this._touches.add(e.pointerId.toString(), e);\r\n } else {\r\n // You can only trigger the action buttons with a joystick declared\r\n if (VirtualJoystick._GlobalJoystickIndex < 2 && this._action) {\r\n this._action();\r\n this._touches.add(e.pointerId.toString(), { x: e.clientX, y: e.clientY, prevX: e.clientX, prevY: e.clientY });\r\n }\r\n }\r\n }\r\n\r\n private _onPointerMove(e: PointerEvent) {\r\n // If the current pointer is the one associated to the joystick (first touch contact)\r\n if (this._joystickPointerId == e.pointerId) {\r\n // limit to container if need be\r\n if (this.limitToContainer) {\r\n const vector = new Vector2(e.clientX - this._joystickPointerStartPos.x, e.clientY - this._joystickPointerStartPos.y);\r\n const distance = vector.length();\r\n\r\n if (distance > this.containerSize) {\r\n vector.scaleInPlace(this.containerSize / distance);\r\n }\r\n\r\n this._joystickPointerPos.x = this._joystickPointerStartPos.x + vector.x;\r\n this._joystickPointerPos.y = this._joystickPointerStartPos.y + vector.y;\r\n } else {\r\n this._joystickPointerPos.x = e.clientX;\r\n this._joystickPointerPos.y = e.clientY;\r\n }\r\n\r\n // create delta vector\r\n this._deltaJoystickVector = this._joystickPointerPos.clone();\r\n this._deltaJoystickVector = this._deltaJoystickVector.subtract(this._joystickPointerStartPos);\r\n\r\n // if a joystick is always visible, there will be clipping issues if\r\n // you drag the puck from one over the container of the other\r\n if (0 < VirtualJoystick._AlwaysVisibleSticks) {\r\n if (this._leftJoystick) {\r\n this._joystickPointerPos.x = Math.min(VirtualJoystick._HalfWidth, this._joystickPointerPos.x);\r\n } else {\r\n this._joystickPointerPos.x = Math.max(VirtualJoystick._HalfWidth, this._joystickPointerPos.x);\r\n }\r\n }\r\n\r\n const directionLeftRight = this.reverseLeftRight ? -1 : 1;\r\n const deltaJoystickX = (directionLeftRight * this._deltaJoystickVector.x) / this._inversedSensibility;\r\n switch (this._axisTargetedByLeftAndRight) {\r\n case JoystickAxis.X:\r\n this.deltaPosition.x = Math.min(1, Math.max(-1, deltaJoystickX));\r\n break;\r\n case JoystickAxis.Y:\r\n this.deltaPosition.y = Math.min(1, Math.max(-1, deltaJoystickX));\r\n break;\r\n case JoystickAxis.Z:\r\n this.deltaPosition.z = Math.min(1, Math.max(-1, deltaJoystickX));\r\n break;\r\n }\r\n const directionUpDown = this.reverseUpDown ? 1 : -1;\r\n const deltaJoystickY = (directionUpDown * this._deltaJoystickVector.y) / this._inversedSensibility;\r\n switch (this._axisTargetedByUpAndDown) {\r\n case JoystickAxis.X:\r\n this.deltaPosition.x = Math.min(1, Math.max(-1, deltaJoystickY));\r\n break;\r\n case JoystickAxis.Y:\r\n this.deltaPosition.y = Math.min(1, Math.max(-1, deltaJoystickY));\r\n break;\r\n case JoystickAxis.Z:\r\n this.deltaPosition.z = Math.min(1, Math.max(-1, deltaJoystickY));\r\n break;\r\n }\r\n } else {\r\n const data = this._touches.get(e.pointerId.toString());\r\n if (data) {\r\n (data as any).x = e.clientX;\r\n (data as any).y = e.clientY;\r\n }\r\n }\r\n }\r\n\r\n private _onPointerUp(e: PointerEvent) {\r\n if (this._joystickPointerId == e.pointerId) {\r\n this._clearPreviousDraw();\r\n\r\n this._joystickPointerId = -1;\r\n this.pressed = false;\r\n } else {\r\n const touch = <{ x: number; y: number; prevX: number; prevY: number }>this._touches.get(e.pointerId.toString());\r\n if (touch) {\r\n VirtualJoystick._VjCanvasContext.clearRect(touch.prevX - 44, touch.prevY - 44, 88, 88);\r\n }\r\n }\r\n this._deltaJoystickVector.x = 0;\r\n this._deltaJoystickVector.y = 0;\r\n\r\n this._touches.remove(e.pointerId.toString());\r\n }\r\n\r\n /**\r\n * Change the color of the virtual joystick\r\n * @param newColor a string that must be a CSS color value (like \"red\") or the hexa value (like \"#FF0000\")\r\n */\r\n public setJoystickColor(newColor: string) {\r\n this._joystickColor = newColor;\r\n }\r\n\r\n /**\r\n * Size of the joystick's container\r\n */\r\n public set containerSize(newSize: number) {\r\n this._joystickContainerSize = newSize;\r\n this._clearContainerSize = ~~(this._joystickContainerSize * 2.1);\r\n this._clearContainerSizeOffset = ~~(this._clearContainerSize / 2);\r\n }\r\n public get containerSize() {\r\n return this._joystickContainerSize;\r\n }\r\n\r\n /**\r\n * Size of the joystick's puck\r\n */\r\n public set puckSize(newSize: number) {\r\n this._joystickPuckSize = newSize;\r\n this._clearPuckSize = ~~(this._joystickPuckSize * 2.1);\r\n this._clearPuckSizeOffset = ~~(this._clearPuckSize / 2);\r\n }\r\n public get puckSize() {\r\n return this._joystickPuckSize;\r\n }\r\n\r\n /**\r\n * Clears the set position of the joystick\r\n */\r\n public clearPosition() {\r\n this.alwaysVisible = false;\r\n\r\n this._joystickPosition = null;\r\n }\r\n\r\n /**\r\n * Defines whether or not the joystick container is always visible\r\n */\r\n public set alwaysVisible(value: boolean) {\r\n if (this._alwaysVisible === value) {\r\n return;\r\n }\r\n\r\n if (value && this._joystickPosition) {\r\n VirtualJoystick._AlwaysVisibleSticks++;\r\n\r\n this._alwaysVisible = true;\r\n } else {\r\n VirtualJoystick._AlwaysVisibleSticks--;\r\n\r\n this._alwaysVisible = false;\r\n }\r\n }\r\n public get alwaysVisible() {\r\n return this._alwaysVisible;\r\n }\r\n\r\n /**\r\n * Sets the constant position of the Joystick container\r\n * @param x X axis coordinate\r\n * @param y Y axis coordinate\r\n */\r\n public setPosition(x: number, y: number) {\r\n // just in case position is moved while the container is visible\r\n if (this._joystickPointerStartPos) {\r\n this._clearPreviousDraw();\r\n }\r\n\r\n this._joystickPosition = new Vector2(x, y);\r\n }\r\n\r\n /**\r\n * Defines a callback to call when the joystick is touched\r\n * @param action defines the callback\r\n */\r\n public setActionOnTouch(action: () => any) {\r\n this._action = action;\r\n }\r\n\r\n /**\r\n * Defines which axis you'd like to control for left & right\r\n * @param axis defines the axis to use\r\n */\r\n public setAxisForLeftRight(axis: JoystickAxis) {\r\n switch (axis) {\r\n case JoystickAxis.X:\r\n case JoystickAxis.Y:\r\n case JoystickAxis.Z:\r\n this._axisTargetedByLeftAndRight = axis;\r\n break;\r\n default:\r\n this._axisTargetedByLeftAndRight = JoystickAxis.X;\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Defines which axis you'd like to control for up & down\r\n * @param axis defines the axis to use\r\n */\r\n public setAxisForUpDown(axis: JoystickAxis) {\r\n switch (axis) {\r\n case JoystickAxis.X:\r\n case JoystickAxis.Y:\r\n case JoystickAxis.Z:\r\n this._axisTargetedByUpAndDown = axis;\r\n break;\r\n default:\r\n this._axisTargetedByUpAndDown = JoystickAxis.Y;\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Clears the canvas from the previous puck / container draw\r\n */\r\n private _clearPreviousDraw() {\r\n const jp = this._joystickPosition || this._joystickPointerStartPos;\r\n\r\n // clear container pixels\r\n VirtualJoystick._VjCanvasContext.clearRect(\r\n jp.x - this._clearContainerSizeOffset,\r\n jp.y - this._clearContainerSizeOffset,\r\n this._clearContainerSize,\r\n this._clearContainerSize\r\n );\r\n\r\n // clear puck pixels + 1 pixel for the change made before it moved\r\n VirtualJoystick._VjCanvasContext.clearRect(\r\n this._joystickPreviousPointerPos.x - this._clearPuckSizeOffset - 1,\r\n this._joystickPreviousPointerPos.y - this._clearPuckSizeOffset - 1,\r\n this._clearPuckSize + 2,\r\n this._clearPuckSize + 2\r\n );\r\n }\r\n\r\n /**\r\n * Loads `urlPath` to be used for the container's image\r\n * @param urlPath defines the urlPath of an image to use\r\n */\r\n public setContainerImage(urlPath: string) {\r\n const image = new Image();\r\n image.src = urlPath;\r\n\r\n image.onload = () => (this._containerImage = image);\r\n }\r\n\r\n /**\r\n * Loads `urlPath` to be used for the puck's image\r\n * @param urlPath defines the urlPath of an image to use\r\n */\r\n public setPuckImage(urlPath: string) {\r\n const image = new Image();\r\n image.src = urlPath;\r\n\r\n image.onload = () => (this._puckImage = image);\r\n }\r\n\r\n /**\r\n * Draws the Virtual Joystick's container\r\n */\r\n private _drawContainer() {\r\n const jp = this._joystickPosition || this._joystickPointerStartPos;\r\n\r\n this._clearPreviousDraw();\r\n\r\n if (this._containerImage) {\r\n VirtualJoystick._VjCanvasContext.drawImage(this._containerImage, jp.x - this.containerSize, jp.y - this.containerSize, this.containerSize * 2, this.containerSize * 2);\r\n } else {\r\n // outer container\r\n VirtualJoystick._VjCanvasContext.beginPath();\r\n VirtualJoystick._VjCanvasContext.strokeStyle = this._joystickColor;\r\n VirtualJoystick._VjCanvasContext.lineWidth = 2;\r\n VirtualJoystick._VjCanvasContext.arc(jp.x, jp.y, this.containerSize, 0, Math.PI * 2, true);\r\n VirtualJoystick._VjCanvasContext.stroke();\r\n VirtualJoystick._VjCanvasContext.closePath();\r\n\r\n // inner container\r\n VirtualJoystick._VjCanvasContext.beginPath();\r\n VirtualJoystick._VjCanvasContext.lineWidth = 6;\r\n VirtualJoystick._VjCanvasContext.strokeStyle = this._joystickColor;\r\n VirtualJoystick._VjCanvasContext.arc(jp.x, jp.y, this.puckSize, 0, Math.PI * 2, true);\r\n VirtualJoystick._VjCanvasContext.stroke();\r\n VirtualJoystick._VjCanvasContext.closePath();\r\n }\r\n }\r\n\r\n /**\r\n * Draws the Virtual Joystick's puck\r\n */\r\n private _drawPuck() {\r\n if (this._puckImage) {\r\n VirtualJoystick._VjCanvasContext.drawImage(\r\n this._puckImage,\r\n this._joystickPointerPos.x - this.puckSize,\r\n this._joystickPointerPos.y - this.puckSize,\r\n this.puckSize * 2,\r\n this.puckSize * 2\r\n );\r\n } else {\r\n VirtualJoystick._VjCanvasContext.beginPath();\r\n VirtualJoystick._VjCanvasContext.strokeStyle = this._joystickColor;\r\n VirtualJoystick._VjCanvasContext.lineWidth = 2;\r\n VirtualJoystick._VjCanvasContext.arc(this._joystickPointerPos.x, this._joystickPointerPos.y, this.puckSize, 0, Math.PI * 2, true);\r\n VirtualJoystick._VjCanvasContext.stroke();\r\n VirtualJoystick._VjCanvasContext.closePath();\r\n }\r\n }\r\n\r\n private _drawVirtualJoystick() {\r\n // canvas released? don't continue iterating\r\n if (this._released) {\r\n return;\r\n }\r\n if (this.alwaysVisible) {\r\n this._drawContainer();\r\n }\r\n\r\n if (this.pressed) {\r\n this._touches.forEach((key, touch) => {\r\n if ((<PointerEvent>touch).pointerId === this._joystickPointerId) {\r\n if (!this.alwaysVisible) {\r\n this._drawContainer();\r\n }\r\n\r\n this._drawPuck();\r\n\r\n // store current pointer for next clear\r\n this._joystickPreviousPointerPos = this._joystickPointerPos.clone();\r\n } else {\r\n VirtualJoystick._VjCanvasContext.clearRect((<any>touch).prevX - 44, (<any>touch).prevY - 44, 88, 88);\r\n VirtualJoystick._VjCanvasContext.beginPath();\r\n VirtualJoystick._VjCanvasContext.fillStyle = \"white\";\r\n VirtualJoystick._VjCanvasContext.beginPath();\r\n VirtualJoystick._VjCanvasContext.strokeStyle = \"red\";\r\n VirtualJoystick._VjCanvasContext.lineWidth = 6;\r\n VirtualJoystick._VjCanvasContext.arc(touch.x, touch.y, 40, 0, Math.PI * 2, true);\r\n VirtualJoystick._VjCanvasContext.stroke();\r\n VirtualJoystick._VjCanvasContext.closePath();\r\n (<any>touch).prevX = touch.x;\r\n (<any>touch).prevY = touch.y;\r\n }\r\n });\r\n }\r\n requestAnimationFrame(() => {\r\n this._drawVirtualJoystick();\r\n });\r\n }\r\n\r\n /**\r\n * Release internal HTML canvas\r\n */\r\n public releaseCanvas() {\r\n if (VirtualJoystick.Canvas) {\r\n VirtualJoystick.Canvas.removeEventListener(\"pointerdown\", this._onPointerDownHandlerRef);\r\n VirtualJoystick.Canvas.removeEventListener(\"pointermove\", this._onPointerMoveHandlerRef);\r\n VirtualJoystick.Canvas.removeEventListener(\"pointerup\", this._onPointerUpHandlerRef);\r\n VirtualJoystick.Canvas.removeEventListener(\"pointerout\", this._onPointerUpHandlerRef);\r\n VirtualJoystick.Canvas.removeEventListener(\"pointercancel\", this._onPointerUpHandlerRef);\r\n window.removeEventListener(\"resize\", this._onResize);\r\n document.body.removeChild(VirtualJoystick.Canvas);\r\n VirtualJoystick.Canvas = null;\r\n }\r\n this._released = true;\r\n }\r\n}\r\n"]}
|
package/Morph/morphTarget.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { __decorate } from "../tslib.es6.js";
|
|
2
2
|
import { Observable } from "../Misc/observable.js";
|
|
3
3
|
import { EngineStore } from "../Engines/engineStore.js";
|
|
4
|
-
import { VertexBuffer } from "../Buffers/buffer.js";
|
|
4
|
+
import { VertexBuffer } from "../Buffers/buffer.pure.js";
|
|
5
5
|
import { serialize } from "../Misc/decorators.js";
|
|
6
6
|
import { SerializationHelper } from "../Misc/decorators.serialization.js";
|
|
7
7
|
import { GetClass } from "../Misc/typeStore.js";
|