@babylonjs/core 6.41.0 → 6.41.2
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/Animations/animatable.js +1 -2
- package/Animations/animatable.js.map +1 -1
- package/Animations/animation.js +4 -6
- package/Animations/animation.js.map +1 -1
- package/Animations/animationGroup.js +3 -3
- package/Animations/animationGroup.js.map +1 -1
- package/Animations/runtimeAnimation.js +1 -1
- package/Animations/runtimeAnimation.js.map +1 -1
- package/Audio/audioEngine.js +3 -5
- package/Audio/audioEngine.js.map +1 -1
- package/Audio/audioSceneComponent.js +1 -2
- package/Audio/audioSceneComponent.js.map +1 -1
- package/Audio/sound.js +48 -74
- package/Audio/sound.js.map +1 -1
- package/Audio/soundTrack.js +6 -12
- package/Audio/soundTrack.js.map +1 -1
- package/BakedVertexAnimation/bakedVertexAnimationManager.js +1 -2
- package/BakedVertexAnimation/bakedVertexAnimationManager.js.map +1 -1
- package/Behaviors/Cameras/autoRotationBehavior.js +1 -1
- package/Behaviors/Cameras/autoRotationBehavior.js.map +1 -1
- package/Behaviors/Meshes/fadeInOutBehavior.js +2 -4
- package/Behaviors/Meshes/fadeInOutBehavior.js.map +1 -1
- package/Behaviors/Meshes/followBehavior.js +1 -2
- package/Behaviors/Meshes/followBehavior.js.map +1 -1
- package/Behaviors/Meshes/handConstraintBehavior.js +2 -2
- package/Behaviors/Meshes/handConstraintBehavior.js.map +1 -1
- package/Bones/bone.js +4 -6
- package/Bones/bone.js.map +1 -1
- package/Bones/skeleton.js +2 -3
- package/Bones/skeleton.js.map +1 -1
- package/Buffers/buffer.align.js +5 -8
- package/Buffers/buffer.align.js.map +1 -1
- package/Buffers/buffer.js +6 -8
- package/Buffers/buffer.js.map +1 -1
- package/Cameras/Inputs/BaseCameraPointersInput.js +3 -4
- package/Cameras/Inputs/BaseCameraPointersInput.js.map +1 -1
- package/Cameras/Inputs/arcRotateCameraMouseWheelInput.js +3 -5
- package/Cameras/Inputs/arcRotateCameraMouseWheelInput.js.map +1 -1
- package/Cameras/Inputs/flyCameraMouseInput.js +2 -2
- package/Cameras/Inputs/flyCameraMouseInput.js.map +1 -1
- package/Cameras/Inputs/freeCameraMouseInput.js +2 -2
- package/Cameras/Inputs/freeCameraMouseInput.js.map +1 -1
- package/Cameras/arcRotateCamera.js +1 -2
- package/Cameras/arcRotateCamera.js.map +1 -1
- package/Cameras/camera.d.ts +5 -0
- package/Cameras/camera.js +18 -11
- package/Cameras/camera.js.map +1 -1
- package/Collisions/pickingInfo.js +1 -1
- package/Collisions/pickingInfo.js.map +1 -1
- package/Compute/computeEffect.js +5 -8
- package/Compute/computeEffect.js.map +1 -1
- package/Compute/computeShader.js +12 -9
- package/Compute/computeShader.js.map +1 -1
- package/Culling/Octrees/octreeSceneComponent.js +1 -2
- package/Culling/Octrees/octreeSceneComponent.js.map +1 -1
- package/Culling/boundingBox.js +2 -3
- package/Culling/boundingBox.js.map +1 -1
- package/Culling/ray.d.ts +6 -1
- package/Culling/ray.js +9 -4
- package/Culling/ray.js.map +1 -1
- package/Debug/debugLayer.js +4 -1
- package/Debug/debugLayer.js.map +1 -1
- package/Debug/directionalLightFrustumViewer.js +7 -9
- package/Debug/directionalLightFrustumViewer.js.map +1 -1
- package/Debug/physicsViewer.js +5 -7
- package/Debug/physicsViewer.js.map +1 -1
- package/Debug/rayHelper.js +1 -2
- package/Debug/rayHelper.js.map +1 -1
- package/Debug/skeletonViewer.js +26 -31
- package/Debug/skeletonViewer.js.map +1 -1
- package/Decorators/nodeDecorator.js +1 -1
- package/Decorators/nodeDecorator.js.map +1 -1
- package/DeviceInput/InputDevices/deviceSourceManager.js +3 -5
- package/DeviceInput/InputDevices/deviceSourceManager.js.map +1 -1
- package/DeviceInput/eventFactory.js +1 -1
- package/DeviceInput/eventFactory.js.map +1 -1
- package/DeviceInput/internalDeviceSourceManager.js +1 -2
- package/DeviceInput/internalDeviceSourceManager.js.map +1 -1
- package/DeviceInput/webDeviceInputSystem.js +9 -12
- package/DeviceInput/webDeviceInputSystem.js.map +1 -1
- package/Engines/Extensions/engine.cubeTexture.js +6 -1
- package/Engines/Extensions/engine.cubeTexture.js.map +1 -1
- package/Engines/Extensions/engine.multiRender.js +3 -4
- package/Engines/Extensions/engine.multiRender.js.map +1 -1
- package/Engines/Extensions/engine.rawTexture.js +4 -4
- package/Engines/Extensions/engine.rawTexture.js.map +1 -1
- package/Engines/Extensions/engine.readTexture.js +2 -3
- package/Engines/Extensions/engine.readTexture.js.map +1 -1
- package/Engines/Extensions/engine.renderTarget.js +9 -5
- package/Engines/Extensions/engine.renderTarget.js.map +1 -1
- package/Engines/Extensions/engine.renderTargetCube.js +9 -1
- package/Engines/Extensions/engine.renderTargetCube.js.map +1 -1
- package/Engines/Extensions/engine.views.js +1 -2
- package/Engines/Extensions/engine.views.js.map +1 -1
- package/Engines/Processors/shaderCodeNode.js +6 -7
- package/Engines/Processors/shaderCodeNode.js.map +1 -1
- package/Engines/Processors/shaderProcessor.js +6 -11
- package/Engines/Processors/shaderProcessor.js.map +1 -1
- package/Engines/WebGL/webGLHardwareTexture.js +1 -2
- package/Engines/WebGL/webGLHardwareTexture.js.map +1 -1
- package/Engines/WebGL/webGLRenderTargetWrapper.js +3 -5
- package/Engines/WebGL/webGLRenderTargetWrapper.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.cubeTexture.js +9 -2
- package/Engines/WebGPU/Extensions/engine.cubeTexture.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.dynamicTexture.js +1 -2
- package/Engines/WebGPU/Extensions/engine.dynamicTexture.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.multiRender.js +5 -6
- package/Engines/WebGPU/Extensions/engine.multiRender.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.query.js +2 -4
- package/Engines/WebGPU/Extensions/engine.query.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.rawTexture.js +4 -4
- package/Engines/WebGPU/Extensions/engine.rawTexture.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.renderTarget.js +11 -5
- package/Engines/WebGPU/Extensions/engine.renderTarget.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.renderTargetCube.js +11 -3
- package/Engines/WebGPU/Extensions/engine.renderTargetCube.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.storageBuffer.js +2 -3
- package/Engines/WebGPU/Extensions/engine.storageBuffer.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.textureSampler.js +1 -2
- package/Engines/WebGPU/Extensions/engine.textureSampler.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.videoTexture.js +1 -2
- package/Engines/WebGPU/Extensions/engine.videoTexture.js.map +1 -1
- package/Engines/WebGPU/webgpuBufferManager.js +1 -1
- package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
- package/Engines/WebGPU/webgpuCacheBindGroups.js +6 -7
- package/Engines/WebGPU/webgpuCacheBindGroups.js.map +1 -1
- package/Engines/WebGPU/webgpuCacheRenderPipeline.js +15 -20
- package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
- package/Engines/WebGPU/webgpuCacheSampler.js +10 -5
- package/Engines/WebGPU/webgpuCacheSampler.js.map +1 -1
- package/Engines/WebGPU/webgpuClearQuad.js +2 -3
- package/Engines/WebGPU/webgpuClearQuad.js.map +1 -1
- package/Engines/WebGPU/webgpuComputePipelineContext.js +1 -2
- package/Engines/WebGPU/webgpuComputePipelineContext.js.map +1 -1
- package/Engines/WebGPU/webgpuDepthCullingState.js +2 -2
- package/Engines/WebGPU/webgpuDepthCullingState.js.map +1 -1
- package/Engines/WebGPU/webgpuDrawContext.js +1 -2
- package/Engines/WebGPU/webgpuDrawContext.js.map +1 -1
- package/Engines/WebGPU/webgpuHardwareTexture.js +4 -6
- package/Engines/WebGPU/webgpuHardwareTexture.js.map +1 -1
- package/Engines/WebGPU/webgpuMaterialContext.js +2 -3
- package/Engines/WebGPU/webgpuMaterialContext.js.map +1 -1
- package/Engines/WebGPU/webgpuOcclusionQuery.js +3 -5
- package/Engines/WebGPU/webgpuOcclusionQuery.js.map +1 -1
- package/Engines/WebGPU/webgpuPipelineContext.js +2 -4
- package/Engines/WebGPU/webgpuPipelineContext.js.map +1 -1
- package/Engines/WebGPU/webgpuQuerySet.js +1 -1
- package/Engines/WebGPU/webgpuQuerySet.js.map +1 -1
- package/Engines/WebGPU/webgpuShaderProcessingContext.js +2 -4
- package/Engines/WebGPU/webgpuShaderProcessingContext.js.map +1 -1
- package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js +2 -4
- package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js.map +1 -1
- package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +5 -4
- package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
- package/Engines/WebGPU/webgpuStencilStateComposer.js +1 -2
- package/Engines/WebGPU/webgpuStencilStateComposer.js.map +1 -1
- package/Engines/WebGPU/webgpuTextureManager.js +40 -43
- package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
- package/Engines/WebGPU/webgpuTimestampQuery.js +12 -7
- package/Engines/WebGPU/webgpuTimestampQuery.js.map +1 -1
- package/Engines/WebGPU/webgpuTintWASM.js +4 -1
- package/Engines/WebGPU/webgpuTintWASM.js.map +1 -1
- package/Engines/engine.js +4 -7
- package/Engines/engine.js.map +1 -1
- package/Engines/nativeEngine.js +16 -22
- package/Engines/nativeEngine.js.map +1 -1
- package/Engines/nullEngine.js +9 -1
- package/Engines/nullEngine.js.map +1 -1
- package/Engines/renderTargetWrapper.js +11 -16
- package/Engines/renderTargetWrapper.js.map +1 -1
- package/Engines/thinEngine.js +32 -44
- package/Engines/thinEngine.js.map +1 -1
- package/Engines/webgpuEngine.js +77 -95
- package/Engines/webgpuEngine.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphMeshPickEventBlock.js +2 -3
- package/FlowGraph/Blocks/Event/flowGraphMeshPickEventBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.js +3 -6
- package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCounterBlock.js +1 -2
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCounterBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphMultiGateBlock.js +1 -2
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphMultiGateBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphWhileLoopBlock.js +2 -4
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphWhileLoopBlock.js.map +1 -1
- package/FlowGraph/flowGraph.js +1 -2
- package/FlowGraph/flowGraph.js.map +1 -1
- package/FlowGraph/flowGraphBlock.js +2 -4
- package/FlowGraph/flowGraphBlock.js.map +1 -1
- package/FlowGraph/flowGraphContext.js +1 -2
- package/FlowGraph/flowGraphContext.js.map +1 -1
- package/FlowGraph/flowGraphCoordinator.js +4 -7
- package/FlowGraph/flowGraphCoordinator.js.map +1 -1
- package/FlowGraph/flowGraphSignalConnection.js +1 -2
- package/FlowGraph/flowGraphSignalConnection.js.map +1 -1
- package/FlowGraph/serialization.js +2 -3
- package/FlowGraph/serialization.js.map +1 -1
- package/Gamepads/gamepadManager.js +1 -1
- package/Gamepads/gamepadManager.js.map +1 -1
- package/Gizmos/axisDragGizmo.js +2 -4
- package/Gizmos/axisDragGizmo.js.map +1 -1
- package/Gizmos/axisScaleGizmo.js +5 -8
- package/Gizmos/axisScaleGizmo.js.map +1 -1
- package/Gizmos/boundingBoxGizmo.js +1 -1
- package/Gizmos/boundingBoxGizmo.js.map +1 -1
- package/Gizmos/cameraGizmo.js +2 -3
- package/Gizmos/cameraGizmo.js.map +1 -1
- package/Gizmos/gizmo.js +4 -7
- package/Gizmos/gizmo.js.map +1 -1
- package/Gizmos/gizmoManager.js +3 -4
- package/Gizmos/gizmoManager.js.map +1 -1
- package/Gizmos/planeDragGizmo.js +2 -4
- package/Gizmos/planeDragGizmo.js.map +1 -1
- package/Gizmos/planeRotationGizmo.js +2 -4
- package/Gizmos/planeRotationGizmo.js.map +1 -1
- package/Helpers/environmentHelper.js +8 -2
- package/Helpers/environmentHelper.js.map +1 -1
- package/Helpers/videoDome.js +1 -2
- package/Helpers/videoDome.js.map +1 -1
- package/Inputs/scene.inputManager.js +8 -10
- package/Inputs/scene.inputManager.js.map +1 -1
- package/Layers/effectLayer.js +16 -10
- package/Layers/effectLayer.js.map +1 -1
- package/Layers/glowLayer.js +16 -6
- package/Layers/glowLayer.js.map +1 -1
- package/Layers/highlightLayer.js +12 -3
- package/Layers/highlightLayer.js.map +1 -1
- package/Layers/layer.js +1 -2
- package/Layers/layer.js.map +1 -1
- package/LensFlares/lensFlareSystem.js +1 -2
- package/LensFlares/lensFlareSystem.js.map +1 -1
- package/Lights/Shadows/cascadedShadowGenerator.js +21 -25
- package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
- package/Lights/Shadows/shadowGenerator.js +18 -21
- package/Lights/Shadows/shadowGenerator.js.map +1 -1
- package/Lights/light.js +2 -4
- package/Lights/light.js.map +1 -1
- package/Lights/shadowLight.js +1 -1
- package/Lights/shadowLight.js.map +1 -1
- package/Loading/Plugins/babylonFileLoader.js +1 -2
- package/Loading/Plugins/babylonFileLoader.js.map +1 -1
- package/Loading/sceneLoader.js +1 -1
- package/Loading/sceneLoader.js.map +1 -1
- package/Materials/GreasedLine/greasedLinePluginMaterial.js +26 -32
- package/Materials/GreasedLine/greasedLinePluginMaterial.js.map +1 -1
- package/Materials/GreasedLine/greasedLineSimpleMaterial.js +22 -27
- package/Materials/GreasedLine/greasedLineSimpleMaterial.js.map +1 -1
- package/Materials/Node/Blocks/Dual/clipPlanesBlock.js +6 -7
- package/Materials/Node/Blocks/Dual/clipPlanesBlock.js.map +1 -1
- package/Materials/Node/Blocks/Dual/imageSourceBlock.js +1 -2
- package/Materials/Node/Blocks/Dual/imageSourceBlock.js.map +1 -1
- package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.js +1 -2
- package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.js.map +1 -1
- package/Materials/Node/Blocks/Dual/sceneDepthBlock.js +1 -1
- package/Materials/Node/Blocks/Dual/sceneDepthBlock.js.map +1 -1
- package/Materials/Node/Blocks/Dual/textureBlock.js +10 -16
- package/Materials/Node/Blocks/Dual/textureBlock.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/TBNBlock.js +2 -3
- package/Materials/Node/Blocks/Fragment/TBNBlock.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js +1 -2
- package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/imageProcessingBlock.js +2 -4
- package/Materials/Node/Blocks/Fragment/imageProcessingBlock.js.map +1 -1
- package/Materials/Node/Blocks/Input/inputBlock.js +1 -2
- package/Materials/Node/Blocks/Input/inputBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/clearCoatBlock.js +24 -26
- package/Materials/Node/Blocks/PBR/clearCoatBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/iridescenceBlock.js +3 -3
- package/Materials/Node/Blocks/PBR/iridescenceBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js +45 -49
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/reflectionBlock.js +1 -2
- package/Materials/Node/Blocks/PBR/reflectionBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/refractionBlock.js +1 -2
- package/Materials/Node/Blocks/PBR/refractionBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/sheenBlock.js +13 -13
- package/Materials/Node/Blocks/PBR/sheenBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/subSurfaceBlock.js +27 -28
- package/Materials/Node/Blocks/PBR/subSurfaceBlock.js.map +1 -1
- package/Materials/Node/Blocks/Teleport/teleportOutBlock.js +1 -2
- package/Materials/Node/Blocks/Teleport/teleportOutBlock.js.map +1 -1
- package/Materials/Node/Blocks/Vertex/instancesBlock.js +2 -2
- package/Materials/Node/Blocks/Vertex/instancesBlock.js.map +1 -1
- package/Materials/Node/Blocks/Vertex/morphTargetsBlock.js +43 -33
- package/Materials/Node/Blocks/Vertex/morphTargetsBlock.js.map +1 -1
- package/Materials/Node/Blocks/biPlanarBlock.js +1 -2
- package/Materials/Node/Blocks/biPlanarBlock.js.map +1 -1
- package/Materials/Node/Blocks/cloudBlock.js +2 -3
- package/Materials/Node/Blocks/cloudBlock.js.map +1 -1
- package/Materials/Node/Blocks/colorMergerBlock.js +4 -5
- package/Materials/Node/Blocks/colorMergerBlock.js.map +1 -1
- package/Materials/Node/Blocks/customBlock.js +4 -6
- package/Materials/Node/Blocks/customBlock.js.map +1 -1
- package/Materials/Node/Blocks/meshAttributeExistsBlock.js +2 -4
- package/Materials/Node/Blocks/meshAttributeExistsBlock.js.map +1 -1
- package/Materials/Node/Blocks/triPlanarBlock.js +14 -23
- package/Materials/Node/Blocks/triPlanarBlock.js.map +1 -1
- package/Materials/Node/Blocks/vectorMergerBlock.js +4 -5
- package/Materials/Node/Blocks/vectorMergerBlock.js.map +1 -1
- package/Materials/Node/nodeMaterial.js +16 -11
- package/Materials/Node/nodeMaterial.js.map +1 -1
- package/Materials/Node/nodeMaterialBlock.js +3 -4
- package/Materials/Node/nodeMaterialBlock.js.map +1 -1
- package/Materials/Node/nodeMaterialBuildState.js +1 -1
- package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
- package/Materials/PBR/pbrBaseMaterial.js +25 -28
- package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
- package/Materials/PBR/pbrClearCoatConfiguration.js +6 -9
- package/Materials/PBR/pbrClearCoatConfiguration.js.map +1 -1
- package/Materials/PBR/pbrIridescenceConfiguration.js +4 -7
- package/Materials/PBR/pbrIridescenceConfiguration.js.map +1 -1
- package/Materials/PBR/pbrSheenConfiguration.js +4 -7
- package/Materials/PBR/pbrSheenConfiguration.js.map +1 -1
- package/Materials/Textures/Loaders/envTextureLoader.js +2 -2
- package/Materials/Textures/Loaders/envTextureLoader.js.map +1 -1
- package/Materials/Textures/Packer/packer.js +13 -14
- package/Materials/Textures/Packer/packer.js.map +1 -1
- package/Materials/Textures/Procedurals/noiseProceduralTexture.js +1 -2
- package/Materials/Textures/Procedurals/noiseProceduralTexture.js.map +1 -1
- package/Materials/Textures/Procedurals/proceduralTexture.js +19 -11
- package/Materials/Textures/Procedurals/proceduralTexture.js.map +1 -1
- package/Materials/Textures/baseTexture.js +2 -4
- package/Materials/Textures/baseTexture.js.map +1 -1
- package/Materials/Textures/cubeTexture.js +7 -13
- package/Materials/Textures/cubeTexture.js.map +1 -1
- package/Materials/Textures/dynamicTexture.js +1 -2
- package/Materials/Textures/dynamicTexture.js.map +1 -1
- package/Materials/Textures/hdrCubeTexture.js +2 -4
- package/Materials/Textures/hdrCubeTexture.js.map +1 -1
- package/Materials/Textures/htmlElementTexture.js +5 -3
- package/Materials/Textures/htmlElementTexture.js.map +1 -1
- package/Materials/Textures/internalTexture.js +3 -5
- package/Materials/Textures/internalTexture.js.map +1 -1
- package/Materials/Textures/mirrorTexture.js +3 -6
- package/Materials/Textures/mirrorTexture.js.map +1 -1
- package/Materials/Textures/multiRenderTarget.js +5 -8
- package/Materials/Textures/multiRenderTarget.js.map +1 -1
- package/Materials/Textures/rawTexture.js +1 -1
- package/Materials/Textures/rawTexture.js.map +1 -1
- package/Materials/Textures/renderTargetTexture.js +22 -34
- package/Materials/Textures/renderTargetTexture.js.map +1 -1
- package/Materials/Textures/texture.js +16 -21
- package/Materials/Textures/texture.js.map +1 -1
- package/Materials/Textures/thinRenderTargetTexture.js +2 -4
- package/Materials/Textures/thinRenderTargetTexture.js.map +1 -1
- package/Materials/Textures/thinTexture.js +1 -1
- package/Materials/Textures/thinTexture.js.map +1 -1
- package/Materials/Textures/videoTexture.js +12 -10
- package/Materials/Textures/videoTexture.js.map +1 -1
- package/Materials/clipPlaneMaterialHelper.js +18 -21
- package/Materials/clipPlaneMaterialHelper.js.map +1 -1
- package/Materials/drawWrapper.js +2 -4
- package/Materials/drawWrapper.js.map +1 -1
- package/Materials/effect.d.ts +4 -0
- package/Materials/effect.js +18 -18
- package/Materials/effect.js.map +1 -1
- package/Materials/effectRenderer.js +2 -3
- package/Materials/effectRenderer.js.map +1 -1
- package/Materials/material.decalMapConfiguration.js +3 -3
- package/Materials/material.decalMapConfiguration.js.map +1 -1
- package/Materials/material.detailMapConfiguration.js +1 -2
- package/Materials/material.detailMapConfiguration.js.map +1 -1
- package/Materials/material.js +7 -4
- package/Materials/material.js.map +1 -1
- package/Materials/materialDefines.js +5 -6
- package/Materials/materialDefines.js.map +1 -1
- package/Materials/materialHelper.d.ts +1 -1
- package/Materials/materialHelper.js +3 -4
- package/Materials/materialHelper.js.map +1 -1
- package/Materials/materialPluginManager.js +3 -5
- package/Materials/materialPluginManager.js.map +1 -1
- package/Materials/meshDebugPluginMaterial.js +13 -14
- package/Materials/meshDebugPluginMaterial.js.map +1 -1
- package/Materials/multiMaterial.js +1 -2
- package/Materials/multiMaterial.js.map +1 -1
- package/Materials/shaderMaterial.d.ts +1 -1
- package/Materials/shaderMaterial.js +64 -32
- package/Materials/shaderMaterial.js.map +1 -1
- package/Materials/shadowDepthWrapper.js +24 -23
- package/Materials/shadowDepthWrapper.js.map +1 -1
- package/Materials/standardMaterial.js +10 -12
- package/Materials/standardMaterial.js.map +1 -1
- package/Materials/uniformBuffer.js +1 -1
- package/Materials/uniformBuffer.js.map +1 -1
- package/Maths/math.vector.js +1 -2
- package/Maths/math.vector.js.map +1 -1
- package/Meshes/Builders/decalBuilder.js +26 -29
- package/Meshes/Builders/decalBuilder.js.map +1 -1
- package/Meshes/Builders/greasedLineBuilder.js +16 -16
- package/Meshes/Builders/greasedLineBuilder.js.map +1 -1
- package/Meshes/Builders/groundBuilder.d.ts +5 -1
- package/Meshes/Builders/groundBuilder.js +13 -2
- package/Meshes/Builders/groundBuilder.js.map +1 -1
- package/Meshes/Builders/textBuilder.js +2 -3
- package/Meshes/Builders/textBuilder.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.d.ts +9 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +141 -12
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
- package/Meshes/GreasedLine/greasedLineBaseMesh.js +8 -11
- package/Meshes/GreasedLine/greasedLineBaseMesh.js.map +1 -1
- package/Meshes/GreasedLine/greasedLineMesh.js +3 -5
- package/Meshes/GreasedLine/greasedLineMesh.js.map +1 -1
- package/Meshes/GreasedLine/greasedLineRibbonMesh.js +13 -18
- package/Meshes/GreasedLine/greasedLineRibbonMesh.js.map +1 -1
- package/Meshes/Node/Blocks/Teleport/teleportOutBlock.js +1 -2
- package/Meshes/Node/Blocks/Teleport/teleportOutBlock.js.map +1 -1
- package/Meshes/Node/Blocks/geometryTrigonometryBlock.d.ts +18 -18
- package/Meshes/Node/Blocks/geometryTrigonometryBlock.js +18 -18
- package/Meshes/Node/Blocks/geometryTrigonometryBlock.js.map +1 -1
- package/Meshes/Node/nodeGeometry.js +6 -3
- package/Meshes/Node/nodeGeometry.js.map +1 -1
- package/Meshes/Node/nodeGeometryBlock.js +1 -1
- package/Meshes/Node/nodeGeometryBlock.js.map +1 -1
- package/Meshes/Node/nodeGeometryBlockConnectionPoint.js +1 -2
- package/Meshes/Node/nodeGeometryBlockConnectionPoint.js.map +1 -1
- package/Meshes/Node/nodeGeometryBuildState.js +1 -2
- package/Meshes/Node/nodeGeometryBuildState.js.map +1 -1
- package/Meshes/abstractMesh.js +6 -10
- package/Meshes/abstractMesh.js.map +1 -1
- package/Meshes/csg.js +1 -2
- package/Meshes/csg.js.map +1 -1
- package/Meshes/geometry.js +1 -1
- package/Meshes/geometry.js.map +1 -1
- package/Meshes/instancedMesh.js +5 -10
- package/Meshes/instancedMesh.js.map +1 -1
- package/Meshes/mesh.js +13 -22
- package/Meshes/mesh.js.map +1 -1
- package/Meshes/mesh.vertexData.js +3 -4
- package/Meshes/mesh.vertexData.js.map +1 -1
- package/Meshes/meshUVSpaceRenderer.js +18 -15
- package/Meshes/meshUVSpaceRenderer.js.map +1 -1
- package/Meshes/subMesh.js +8 -14
- package/Meshes/subMesh.js.map +1 -1
- package/Meshes/thinInstanceMesh.js +12 -18
- package/Meshes/thinInstanceMesh.js.map +1 -1
- package/Meshes/trailMesh.js +2 -3
- package/Meshes/trailMesh.js.map +1 -1
- package/Misc/HighDynamicRange/cubemapToSphericalPolynomial.js +1 -2
- package/Misc/HighDynamicRange/cubemapToSphericalPolynomial.js.map +1 -1
- package/Misc/PerformanceViewer/performanceViewerCollectionStrategies.js +9 -14
- package/Misc/PerformanceViewer/performanceViewerCollectionStrategies.js.map +1 -1
- package/Misc/PerformanceViewer/performanceViewerCollector.js +2 -3
- package/Misc/PerformanceViewer/performanceViewerCollector.js.map +1 -1
- package/Misc/arrayTools.js +1 -1
- package/Misc/arrayTools.js.map +1 -1
- package/Misc/basis.js +2 -3
- package/Misc/basis.js.map +1 -1
- package/Misc/dataStorage.js +1 -1
- package/Misc/dataStorage.js.map +1 -1
- package/Misc/deepCopier.js +1 -1
- package/Misc/deepCopier.js.map +1 -1
- package/Misc/environmentTextureTools.js +3 -4
- package/Misc/environmentTextureTools.js.map +1 -1
- package/Misc/equirectangularCapture.js +2 -3
- package/Misc/equirectangularCapture.js.map +1 -1
- package/Misc/fileTools.js +4 -4
- package/Misc/fileTools.js.map +1 -1
- package/Misc/greasedLineTools.js +3 -5
- package/Misc/greasedLineTools.js.map +1 -1
- package/Misc/logger.js +1 -2
- package/Misc/logger.js.map +1 -1
- package/Misc/minMaxReducer.js +2 -3
- package/Misc/minMaxReducer.js.map +1 -1
- package/Misc/pressureObserverWrapper.js +5 -8
- package/Misc/pressureObserverWrapper.js.map +1 -1
- package/Misc/sceneRecorder.js +1 -1
- package/Misc/sceneRecorder.js.map +1 -1
- package/Misc/screenshotTools.js +1 -1
- package/Misc/screenshotTools.js.map +1 -1
- package/Misc/textureTools.js +5 -5
- package/Misc/textureTools.js.map +1 -1
- package/Misc/timer.js +3 -5
- package/Misc/timer.js.map +1 -1
- package/Misc/tools.d.ts +3 -2
- package/Misc/tools.js +6 -5
- package/Misc/tools.js.map +1 -1
- package/Misc/trajectoryClassifier.js +3 -3
- package/Misc/trajectoryClassifier.js.map +1 -1
- package/Misc/videoRecorder.js +6 -4
- package/Misc/videoRecorder.js.map +1 -1
- package/Misc/virtualJoystick.js +4 -1
- package/Misc/virtualJoystick.js.map +1 -1
- package/Morph/morphTargetManager.js +1 -2
- package/Morph/morphTargetManager.js.map +1 -1
- package/Particles/EmitterTypes/meshParticleEmitter.js +1 -2
- package/Particles/EmitterTypes/meshParticleEmitter.js.map +1 -1
- package/Particles/baseParticleSystem.d.ts +4 -0
- package/Particles/baseParticleSystem.js +4 -0
- package/Particles/baseParticleSystem.js.map +1 -1
- package/Particles/computeShaderParticleSystem.js +3 -6
- package/Particles/computeShaderParticleSystem.js.map +1 -1
- package/Particles/gpuParticleSystem.d.ts +2 -2
- package/Particles/gpuParticleSystem.js +30 -20
- package/Particles/gpuParticleSystem.js.map +1 -1
- package/Particles/particleSystem.d.ts +3 -2
- package/Particles/particleSystem.js +33 -30
- package/Particles/particleSystem.js.map +1 -1
- package/Particles/particleSystemComponent.js +2 -3
- package/Particles/particleSystemComponent.js.map +1 -1
- package/Particles/pointsCloudSystem.js +5 -8
- package/Particles/pointsCloudSystem.js.map +1 -1
- package/Particles/solidParticleSystem.js +5 -7
- package/Particles/solidParticleSystem.js.map +1 -1
- package/Particles/webgl2ParticleSystem.js +1 -2
- package/Particles/webgl2ParticleSystem.js.map +1 -1
- package/Physics/castingResult.js +1 -1
- package/Physics/castingResult.js.map +1 -1
- package/Physics/joinedPhysicsEngineComponent.js +2 -2
- package/Physics/joinedPhysicsEngineComponent.js.map +1 -1
- package/Physics/physicsHelper.js +19 -21
- package/Physics/physicsHelper.js.map +1 -1
- package/Physics/v2/IPhysicsEnginePlugin.d.ts +20 -0
- package/Physics/v2/IPhysicsEnginePlugin.js.map +1 -1
- package/Physics/v2/Plugins/havokPlugin.js +48 -35
- package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
- package/Physics/v2/physicsAggregate.js +10 -12
- package/Physics/v2/physicsAggregate.js.map +1 -1
- package/Physics/v2/physicsBody.js +2 -4
- package/Physics/v2/physicsBody.js.map +1 -1
- package/Physics/v2/physicsShape.js +1 -2
- package/Physics/v2/physicsShape.js.map +1 -1
- package/Physics/v2/ragdoll.js +6 -8
- package/Physics/v2/ragdoll.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js +6 -8
- package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js +14 -22
- package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js.map +1 -1
- package/PostProcesses/colorCorrectionPostProcess.js +1 -1
- package/PostProcesses/colorCorrectionPostProcess.js.map +1 -1
- package/PostProcesses/postProcess.js +28 -34
- package/PostProcesses/postProcess.js.map +1 -1
- package/PostProcesses/postProcessManager.js +4 -6
- package/PostProcesses/postProcessManager.js.map +1 -1
- package/PostProcesses/screenSpaceReflectionPostProcess.js +2 -2
- package/PostProcesses/screenSpaceReflectionPostProcess.js.map +1 -1
- package/PostProcesses/volumetricLightScatteringPostProcess.js +4 -7
- package/PostProcesses/volumetricLightScatteringPostProcess.js.map +1 -1
- package/PostProcesses/vrMultiviewToSingleviewPostProcess.js +1 -1
- package/PostProcesses/vrMultiviewToSingleviewPostProcess.js.map +1 -1
- package/Probes/reflectionProbe.js +2 -4
- package/Probes/reflectionProbe.js.map +1 -1
- package/Rendering/GlobalIllumination/giRSMManager.js +22 -19
- package/Rendering/GlobalIllumination/giRSMManager.js.map +1 -1
- package/Rendering/boundingBoxRenderer.js +2 -3
- package/Rendering/boundingBoxRenderer.js.map +1 -1
- package/Rendering/depthPeelingRenderer.js +2 -4
- package/Rendering/depthPeelingRenderer.js.map +1 -1
- package/Rendering/depthPeelingSceneComponent.js +2 -4
- package/Rendering/depthPeelingSceneComponent.js.map +1 -1
- package/Rendering/depthRenderer.js +10 -13
- package/Rendering/depthRenderer.js.map +1 -1
- package/Rendering/edgesRenderer.js +8 -11
- package/Rendering/edgesRenderer.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderer.js +6 -11
- package/Rendering/fluidRenderer/fluidRenderer.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingObject.js +3 -5
- package/Rendering/fluidRenderer/fluidRenderingObject.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.js +2 -4
- package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js +30 -36
- package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingTextures.js +5 -7
- package/Rendering/fluidRenderer/fluidRenderingTextures.js.map +1 -1
- package/Rendering/geometryBufferRenderer.js +3 -2
- package/Rendering/geometryBufferRenderer.js.map +1 -1
- package/Rendering/outlineRenderer.js +5 -4
- package/Rendering/outlineRenderer.js.map +1 -1
- package/Rendering/prePassRenderer.js +3 -6
- package/Rendering/prePassRenderer.js.map +1 -1
- package/Rendering/reflectiveShadowMap.d.ts +1 -0
- package/Rendering/reflectiveShadowMap.js +5 -5
- package/Rendering/reflectiveShadowMap.js.map +1 -1
- package/Shaders/color.fragment.d.ts +2 -0
- package/Shaders/color.fragment.js +4 -0
- package/Shaders/color.fragment.js.map +1 -1
- package/Shaders/color.vertex.d.ts +2 -0
- package/Shaders/color.vertex.js +7 -0
- package/Shaders/color.vertex.js.map +1 -1
- package/Shaders/gpuRenderParticles.fragment.d.ts +2 -0
- package/Shaders/gpuRenderParticles.fragment.js +4 -0
- package/Shaders/gpuRenderParticles.fragment.js.map +1 -1
- package/Shaders/gpuRenderParticles.vertex.d.ts +2 -0
- package/Shaders/gpuRenderParticles.vertex.js +5 -1
- package/Shaders/gpuRenderParticles.vertex.js.map +1 -1
- package/Shaders/particles.fragment.d.ts +2 -0
- package/Shaders/particles.fragment.js +4 -0
- package/Shaders/particles.fragment.js.map +1 -1
- package/Shaders/particles.vertex.d.ts +2 -0
- package/Shaders/particles.vertex.js +5 -1
- package/Shaders/particles.vertex.js.map +1 -1
- package/Sprites/spriteManager.js +1 -2
- package/Sprites/spriteManager.js.map +1 -1
- package/Sprites/spriteRenderer.js +5 -7
- package/Sprites/spriteRenderer.js.map +1 -1
- package/States/stencilStateComposer.js +2 -4
- package/States/stencilStateComposer.js.map +1 -1
- package/XR/features/WebXRAbstractFeature.js +6 -2
- package/XR/features/WebXRAbstractFeature.js.map +1 -1
- package/XR/features/WebXRAnchorSystem.js +1 -2
- package/XR/features/WebXRAnchorSystem.js.map +1 -1
- package/XR/features/WebXRControllerMovement.js +6 -7
- package/XR/features/WebXRControllerMovement.js.map +1 -1
- package/XR/features/WebXRControllerPhysics.js +17 -10
- package/XR/features/WebXRControllerPhysics.js.map +1 -1
- package/XR/features/WebXRControllerPointerSelection.js +1 -2
- package/XR/features/WebXRControllerPointerSelection.js.map +1 -1
- package/XR/features/WebXRControllerTeleportation.d.ts +1 -0
- package/XR/features/WebXRControllerTeleportation.js +6 -3
- package/XR/features/WebXRControllerTeleportation.js.map +1 -1
- package/XR/features/WebXRDepthSensing.js +3 -5
- package/XR/features/WebXRDepthSensing.js.map +1 -1
- package/XR/features/WebXRHandTracking.d.ts +1 -0
- package/XR/features/WebXRHandTracking.js +31 -28
- package/XR/features/WebXRHandTracking.js.map +1 -1
- package/XR/features/WebXRLayers.js +9 -11
- package/XR/features/WebXRLayers.js.map +1 -1
- package/XR/features/WebXRLightEstimation.js +3 -6
- package/XR/features/WebXRLightEstimation.js.map +1 -1
- package/XR/features/WebXRMeshDetector.js +2 -4
- package/XR/features/WebXRMeshDetector.js.map +1 -1
- package/XR/features/WebXRNearInteraction.js +21 -18
- package/XR/features/WebXRNearInteraction.js.map +1 -1
- package/XR/features/WebXRPlaneDetector.js +1 -2
- package/XR/features/WebXRPlaneDetector.js.map +1 -1
- package/XR/features/WebXRRawCameraAccess.js +2 -3
- package/XR/features/WebXRRawCameraAccess.js.map +1 -1
- package/XR/features/WebXRSpaceWarp.js +1 -1
- package/XR/features/WebXRSpaceWarp.js.map +1 -1
- package/XR/motionController/webXRAbstractMotionController.js +4 -1
- package/XR/motionController/webXRAbstractMotionController.js.map +1 -1
- package/XR/native/nativeXRFrame.js +1 -2
- package/XR/native/nativeXRFrame.js.map +1 -1
- package/XR/webXRCamera.js +1 -2
- package/XR/webXRCamera.js.map +1 -1
- package/XR/webXRDefaultExperience.js +28 -6
- package/XR/webXRDefaultExperience.js.map +1 -1
- package/XR/webXRExperienceHelper.js +5 -7
- package/XR/webXRExperienceHelper.js.map +1 -1
- package/XR/webXRFeaturesManager.js +4 -1
- package/XR/webXRFeaturesManager.js.map +1 -1
- package/XR/webXRInput.js +6 -1
- package/XR/webXRInput.js.map +1 -1
- package/XR/webXRInputSource.js +1 -2
- package/XR/webXRInputSource.js.map +1 -1
- package/XR/webXRSessionManager.js +16 -29
- package/XR/webXRSessionManager.js.map +1 -1
- package/assetContainer.js +4 -1
- package/assetContainer.js.map +1 -1
- package/package.json +1 -1
- package/scene.js +18 -17
- package/scene.js.map +1 -1
|
@@ -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 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 VirtualJoystickCustomizations {\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(): VirtualJoystickCustomizations {\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<VirtualJoystickCustomizations>) {\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(\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 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\";\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 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 VirtualJoystickCustomizations {\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(): VirtualJoystickCustomizations {\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<VirtualJoystickCustomizations>) {\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(\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 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"]}
|
|
@@ -159,11 +159,10 @@ export class MorphTargetManager {
|
|
|
159
159
|
* Gets a boolean indicating that the targets are stored into a texture (instead of as attributes)
|
|
160
160
|
*/
|
|
161
161
|
get isUsingTextureForTargets() {
|
|
162
|
-
var _a;
|
|
163
162
|
return (MorphTargetManager.EnableTextureStorage &&
|
|
164
163
|
this.useTextureToStoreTargets &&
|
|
165
164
|
this._canUseTextureForTargets &&
|
|
166
|
-
!
|
|
165
|
+
!this._scene?.getEngine().getCaps().disableMorphTargetTexture);
|
|
167
166
|
}
|
|
168
167
|
/**
|
|
169
168
|
* Gets the active target at specified index. An active target is a target with an influence > 0
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"morphTargetManager.js","sourceRoot":"","sources":["../../../../dev/core/src/Morph/morphTargetManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Observer } from \"../Misc/observable\";\r\nimport { SmartArray } from \"../Misc/smartArray\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { IDisposable, Scene } from \"../scene\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport { MorphTarget } from \"./morphTarget\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { RawTexture2DArray } from \"../Materials/Textures/rawTexture2DArray\";\r\nimport type { AbstractScene } from \"../abstractScene\";\r\n/**\r\n * This class is used to deform meshes using morphing between different targets\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/morphTargets\r\n */\r\nexport class MorphTargetManager implements IDisposable {\r\n /** Enable storing morph target data into textures when set to true (true by default) */\r\n public static EnableTextureStorage = true;\r\n\r\n /** Maximum number of active morph targets supported in the \"vertex attribute\" mode (i.e., not the \"texture\" mode) */\r\n public static MaxActiveMorphTargetsInVertexAttributeMode = 8;\r\n\r\n private _targets = new Array<MorphTarget>();\r\n private _targetInfluenceChangedObservers = new Array<Nullable<Observer<boolean>>>();\r\n private _targetDataLayoutChangedObservers = new Array<Nullable<Observer<void>>>();\r\n private _activeTargets = new SmartArray<MorphTarget>(16);\r\n private _scene: Nullable<Scene>;\r\n private _influences: Float32Array;\r\n private _morphTargetTextureIndices: Float32Array;\r\n private _supportsNormals = false;\r\n private _supportsTangents = false;\r\n private _supportsUVs = false;\r\n private _vertexCount = 0;\r\n private _textureVertexStride = 0;\r\n private _textureWidth = 0;\r\n private _textureHeight = 1;\r\n private _uniqueId = 0;\r\n private _tempInfluences = new Array<number>();\r\n private _canUseTextureForTargets = false;\r\n private _blockCounter = 0;\r\n\r\n /** @internal */\r\n public _parentContainer: Nullable<AbstractScene> = null;\r\n\r\n /** @internal */\r\n public _targetStoreTexture: Nullable<RawTexture2DArray>;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if influencers must be optimized (eg. recompiling the shader if less influencers are used)\r\n */\r\n public optimizeInfluencers = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if normals must be morphed\r\n */\r\n public enableNormalMorphing = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if tangents must be morphed\r\n */\r\n public enableTangentMorphing = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if UV must be morphed\r\n */\r\n public enableUVMorphing = true;\r\n\r\n /**\r\n * Sets a boolean indicating that adding new target or updating an existing target will not update the underlying data buffers\r\n */\r\n public set areUpdatesFrozen(block: boolean) {\r\n if (block) {\r\n this._blockCounter++;\r\n } else {\r\n this._blockCounter--;\r\n if (this._blockCounter <= 0) {\r\n this._blockCounter = 0;\r\n\r\n this._syncActiveTargets(true);\r\n }\r\n }\r\n }\r\n\r\n public get areUpdatesFrozen() {\r\n return this._blockCounter > 0;\r\n }\r\n\r\n /**\r\n * Creates a new MorphTargetManager\r\n * @param scene defines the current scene\r\n */\r\n public constructor(scene: Nullable<Scene> = null) {\r\n if (!scene) {\r\n scene = EngineStore.LastCreatedScene;\r\n }\r\n\r\n this._scene = scene;\r\n\r\n if (this._scene) {\r\n this._scene.addMorphTargetManager(this);\r\n\r\n this._uniqueId = this._scene.getUniqueId();\r\n\r\n const engineCaps = this._scene.getEngine().getCaps();\r\n this._canUseTextureForTargets =\r\n engineCaps.canUseGLVertexID && engineCaps.textureFloat && engineCaps.maxVertexTextureImageUnits > 0 && engineCaps.texture2DArrayMaxLayerCount > 1;\r\n }\r\n }\r\n\r\n private _numMaxInfluencers = 0;\r\n\r\n /**\r\n * Gets or sets the maximum number of influencers (targets) (default value: 0).\r\n * Setting a value for this property can lead to a smoother experience, as only one shader will be compiled, which will use this value as the maximum number of influencers.\r\n * If you leave the value at 0 (default), a new shader will be compiled every time the number of active influencers changes. This can cause problems, as compiling a shader takes time.\r\n * If you assign a non-zero value to this property, you need to ensure that this value is greater than the maximum number of (active) influencers you'll need for this morph manager.\r\n * Otherwise, the number of active influencers will be truncated at the value you set for this property, which can lead to unexpected results.\r\n * Note that this property has no effect if \"useTextureToStoreTargets\" is false.\r\n */\r\n public get numMaxInfluencers(): number {\r\n return this._numMaxInfluencers;\r\n }\r\n\r\n public set numMaxInfluencers(value: number) {\r\n if (this._numMaxInfluencers === value) {\r\n return;\r\n }\r\n\r\n this._numMaxInfluencers = value;\r\n this._syncActiveTargets(true);\r\n }\r\n\r\n /**\r\n * Gets the unique ID of this manager\r\n */\r\n public get uniqueId(): number {\r\n return this._uniqueId;\r\n }\r\n\r\n /**\r\n * Gets the number of vertices handled by this manager\r\n */\r\n public get vertexCount(): number {\r\n return this._vertexCount;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this manager supports morphing of normals\r\n */\r\n public get supportsNormals(): boolean {\r\n return this._supportsNormals && this.enableNormalMorphing;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this manager supports morphing of tangents\r\n */\r\n public get supportsTangents(): boolean {\r\n return this._supportsTangents && this.enableTangentMorphing;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this manager supports morphing of texture coordinates\r\n */\r\n public get supportsUVs(): boolean {\r\n return this._supportsUVs && this.enableUVMorphing;\r\n }\r\n\r\n /**\r\n * Gets the number of targets stored in this manager\r\n */\r\n public get numTargets(): number {\r\n return this._targets.length;\r\n }\r\n\r\n /**\r\n * Gets the number of influencers (ie. the number of targets with influences > 0)\r\n */\r\n public get numInfluencers(): number {\r\n return this._activeTargets.length;\r\n }\r\n\r\n /**\r\n * Gets the list of influences (one per target)\r\n */\r\n public get influences(): Float32Array {\r\n return this._influences;\r\n }\r\n\r\n private _useTextureToStoreTargets = true;\r\n /**\r\n * Gets or sets a boolean indicating that targets should be stored as a texture instead of using vertex attributes (default is true).\r\n * Please note that this option is not available if the hardware does not support it\r\n */\r\n public get useTextureToStoreTargets(): boolean {\r\n return this._useTextureToStoreTargets;\r\n }\r\n\r\n public set useTextureToStoreTargets(value: boolean) {\r\n this._useTextureToStoreTargets = value;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that the targets are stored into a texture (instead of as attributes)\r\n */\r\n public get isUsingTextureForTargets() {\r\n return (\r\n MorphTargetManager.EnableTextureStorage &&\r\n this.useTextureToStoreTargets &&\r\n this._canUseTextureForTargets &&\r\n !this._scene?.getEngine().getCaps().disableMorphTargetTexture\r\n );\r\n }\r\n\r\n /**\r\n * Gets the active target at specified index. An active target is a target with an influence > 0\r\n * @param index defines the index to check\r\n * @returns the requested target\r\n */\r\n public getActiveTarget(index: number): MorphTarget {\r\n return this._activeTargets.data[index];\r\n }\r\n\r\n /**\r\n * Gets the target at specified index\r\n * @param index defines the index to check\r\n * @returns the requested target\r\n */\r\n public getTarget(index: number): MorphTarget {\r\n return this._targets[index];\r\n }\r\n\r\n /**\r\n * Add a new target to this manager\r\n * @param target defines the target to add\r\n */\r\n public addTarget(target: MorphTarget): void {\r\n this._targets.push(target);\r\n this._targetInfluenceChangedObservers.push(\r\n target.onInfluenceChanged.add((needUpdate) => {\r\n this._syncActiveTargets(needUpdate);\r\n })\r\n );\r\n this._targetDataLayoutChangedObservers.push(\r\n target._onDataLayoutChanged.add(() => {\r\n this._syncActiveTargets(true);\r\n })\r\n );\r\n this._syncActiveTargets(true);\r\n }\r\n\r\n /**\r\n * Removes a target from the manager\r\n * @param target defines the target to remove\r\n */\r\n public removeTarget(target: MorphTarget): void {\r\n const index = this._targets.indexOf(target);\r\n if (index >= 0) {\r\n this._targets.splice(index, 1);\r\n\r\n target.onInfluenceChanged.remove(this._targetInfluenceChangedObservers.splice(index, 1)[0]);\r\n target._onDataLayoutChanged.remove(this._targetDataLayoutChangedObservers.splice(index, 1)[0]);\r\n this._syncActiveTargets(true);\r\n }\r\n\r\n if (this._scene) {\r\n this._scene.stopAnimation(target);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _bind(effect: Effect) {\r\n effect.setFloat3(\"morphTargetTextureInfo\", this._textureVertexStride, this._textureWidth, this._textureHeight);\r\n effect.setFloatArray(\"morphTargetTextureIndices\", this._morphTargetTextureIndices);\r\n effect.setTexture(\"morphTargets\", this._targetStoreTexture);\r\n effect.setInt(\"morphTargetCount\", this.numInfluencers);\r\n }\r\n\r\n /**\r\n * Clone the current manager\r\n * @returns a new MorphTargetManager\r\n */\r\n public clone(): MorphTargetManager {\r\n const copy = new MorphTargetManager(this._scene);\r\n\r\n for (const target of this._targets) {\r\n copy.addTarget(target.clone());\r\n }\r\n\r\n copy.enableNormalMorphing = this.enableNormalMorphing;\r\n copy.enableTangentMorphing = this.enableTangentMorphing;\r\n copy.enableUVMorphing = this.enableUVMorphing;\r\n\r\n return copy;\r\n }\r\n\r\n /**\r\n * Serializes the current manager into a Serialization object\r\n * @returns the serialized object\r\n */\r\n public serialize(): any {\r\n const serializationObject: any = {};\r\n\r\n serializationObject.id = this.uniqueId;\r\n\r\n serializationObject.targets = [];\r\n for (const target of this._targets) {\r\n serializationObject.targets.push(target.serialize());\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n private _syncActiveTargets(needUpdate: boolean): void {\r\n if (this.areUpdatesFrozen) {\r\n return;\r\n }\r\n\r\n let influenceCount = 0;\r\n this._activeTargets.reset();\r\n this._supportsNormals = true;\r\n this._supportsTangents = true;\r\n this._supportsUVs = true;\r\n this._vertexCount = 0;\r\n\r\n if (this._scene && this._targets.length > this._scene.getEngine().getCaps().texture2DArrayMaxLayerCount) {\r\n this.useTextureToStoreTargets = false;\r\n }\r\n\r\n if (!this._morphTargetTextureIndices || this._morphTargetTextureIndices.length !== this._targets.length) {\r\n this._morphTargetTextureIndices = new Float32Array(this._targets.length);\r\n }\r\n\r\n let targetIndex = -1;\r\n for (const target of this._targets) {\r\n targetIndex++;\r\n if (target.influence === 0 && this.optimizeInfluencers) {\r\n continue;\r\n }\r\n\r\n if (this._activeTargets.length >= MorphTargetManager.MaxActiveMorphTargetsInVertexAttributeMode && !this.isUsingTextureForTargets) {\r\n break;\r\n }\r\n\r\n this._activeTargets.push(target);\r\n this._morphTargetTextureIndices[influenceCount] = targetIndex;\r\n this._tempInfluences[influenceCount++] = target.influence;\r\n\r\n this._supportsNormals = this._supportsNormals && target.hasNormals;\r\n this._supportsTangents = this._supportsTangents && target.hasTangents;\r\n this._supportsUVs = this._supportsUVs && target.hasUVs;\r\n\r\n const positions = target.getPositions();\r\n if (positions) {\r\n const vertexCount = positions.length / 3;\r\n if (this._vertexCount === 0) {\r\n this._vertexCount = vertexCount;\r\n } else if (this._vertexCount !== vertexCount) {\r\n Logger.Error(\"Incompatible target. Targets must all have the same vertices count.\");\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if (this._morphTargetTextureIndices.length !== influenceCount) {\r\n this._morphTargetTextureIndices = this._morphTargetTextureIndices.slice(0, influenceCount);\r\n }\r\n\r\n if (!this._influences || this._influences.length !== influenceCount) {\r\n this._influences = new Float32Array(influenceCount);\r\n }\r\n\r\n for (let index = 0; index < influenceCount; index++) {\r\n this._influences[index] = this._tempInfluences[index];\r\n }\r\n\r\n if (needUpdate) {\r\n this.synchronize();\r\n }\r\n }\r\n\r\n /**\r\n * Synchronize the targets with all the meshes using this morph target manager\r\n */\r\n public synchronize(): void {\r\n if (!this._scene || this.areUpdatesFrozen) {\r\n return;\r\n }\r\n\r\n if (this.isUsingTextureForTargets && (this._vertexCount || this.numMaxInfluencers > 0)) {\r\n this._textureVertexStride = 1;\r\n\r\n if (this._supportsNormals) {\r\n this._textureVertexStride++;\r\n }\r\n\r\n if (this._supportsTangents) {\r\n this._textureVertexStride++;\r\n }\r\n\r\n if (this._supportsUVs) {\r\n this._textureVertexStride++;\r\n }\r\n\r\n this._textureWidth = this._vertexCount * this._textureVertexStride || 1;\r\n this._textureHeight = 1;\r\n\r\n const maxTextureSize = this._scene.getEngine().getCaps().maxTextureSize;\r\n if (this._textureWidth > maxTextureSize) {\r\n this._textureHeight = Math.ceil(this._textureWidth / maxTextureSize);\r\n this._textureWidth = maxTextureSize;\r\n }\r\n\r\n let mustUpdateTexture = true;\r\n if (this._targetStoreTexture) {\r\n const textureSize = this._targetStoreTexture.getSize();\r\n if (textureSize.width === this._textureWidth && textureSize.height === this._textureHeight && this._targetStoreTexture.depth === this._targets.length) {\r\n mustUpdateTexture = false;\r\n }\r\n }\r\n\r\n if (mustUpdateTexture) {\r\n if (this._targetStoreTexture) {\r\n this._targetStoreTexture.dispose();\r\n }\r\n\r\n const targetCount = this._targets.length;\r\n const data = new Float32Array(targetCount * this._textureWidth * this._textureHeight * 4);\r\n\r\n let offset = 0;\r\n for (let index = 0; index < targetCount; index++) {\r\n const target = this._targets[index];\r\n\r\n const positions = target.getPositions();\r\n const normals = target.getNormals();\r\n const uvs = target.getUVs();\r\n const tangents = target.getTangents();\r\n\r\n if (!positions) {\r\n if (index === 0) {\r\n Logger.Error(\"Invalid morph target. Target must have positions.\");\r\n }\r\n return;\r\n }\r\n\r\n offset = index * this._textureWidth * this._textureHeight * 4;\r\n for (let vertex = 0; vertex < this._vertexCount; vertex++) {\r\n data[offset] = positions[vertex * 3];\r\n data[offset + 1] = positions[vertex * 3 + 1];\r\n data[offset + 2] = positions[vertex * 3 + 2];\r\n\r\n offset += 4;\r\n\r\n if (this._supportsNormals && normals) {\r\n data[offset] = normals[vertex * 3];\r\n data[offset + 1] = normals[vertex * 3 + 1];\r\n data[offset + 2] = normals[vertex * 3 + 2];\r\n offset += 4;\r\n }\r\n\r\n if (this._supportsUVs && uvs) {\r\n data[offset] = uvs[vertex * 2];\r\n data[offset + 1] = uvs[vertex * 2 + 1];\r\n offset += 4;\r\n }\r\n\r\n if (this._supportsTangents && tangents) {\r\n data[offset] = tangents[vertex * 3];\r\n data[offset + 1] = tangents[vertex * 3 + 1];\r\n data[offset + 2] = tangents[vertex * 3 + 2];\r\n offset += 4;\r\n }\r\n }\r\n }\r\n\r\n this._targetStoreTexture = RawTexture2DArray.CreateRGBATexture(\r\n data,\r\n this._textureWidth,\r\n this._textureHeight,\r\n targetCount,\r\n this._scene,\r\n false,\r\n false,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n Constants.TEXTURETYPE_FLOAT\r\n );\r\n }\r\n }\r\n\r\n // Flag meshes as dirty to resync with the active targets\r\n for (const mesh of this._scene.meshes) {\r\n if ((<any>mesh).morphTargetManager === this) {\r\n (<Mesh>mesh)._syncGeometryWithMorphTargetManager();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Release all resources\r\n */\r\n public dispose() {\r\n if (this._targetStoreTexture) {\r\n this._targetStoreTexture.dispose();\r\n }\r\n\r\n this._targetStoreTexture = null;\r\n\r\n // Remove from scene\r\n if (this._scene) {\r\n this._scene.removeMorphTargetManager(this);\r\n\r\n if (this._parentContainer) {\r\n const index = this._parentContainer.morphTargetManagers.indexOf(this);\r\n if (index > -1) {\r\n this._parentContainer.morphTargetManagers.splice(index, 1);\r\n }\r\n this._parentContainer = null;\r\n }\r\n\r\n for (const morph of this._targets) {\r\n this._scene.stopAnimation(morph);\r\n }\r\n }\r\n }\r\n\r\n // Statics\r\n\r\n /**\r\n * Creates a new MorphTargetManager from serialized data\r\n * @param serializationObject defines the serialized data\r\n * @param scene defines the hosting scene\r\n * @returns the new MorphTargetManager\r\n */\r\n public static Parse(serializationObject: any, scene: Scene): MorphTargetManager {\r\n const result = new MorphTargetManager(scene);\r\n\r\n result._uniqueId = serializationObject.id;\r\n\r\n for (const targetData of serializationObject.targets) {\r\n result.addTarget(MorphTarget.Parse(targetData, scene));\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"morphTargetManager.js","sourceRoot":"","sources":["../../../../dev/core/src/Morph/morphTargetManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Observer } from \"../Misc/observable\";\r\nimport { SmartArray } from \"../Misc/smartArray\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { IDisposable, Scene } from \"../scene\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport { MorphTarget } from \"./morphTarget\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { RawTexture2DArray } from \"../Materials/Textures/rawTexture2DArray\";\r\nimport type { AbstractScene } from \"../abstractScene\";\r\n/**\r\n * This class is used to deform meshes using morphing between different targets\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/morphTargets\r\n */\r\nexport class MorphTargetManager implements IDisposable {\r\n /** Enable storing morph target data into textures when set to true (true by default) */\r\n public static EnableTextureStorage = true;\r\n\r\n /** Maximum number of active morph targets supported in the \"vertex attribute\" mode (i.e., not the \"texture\" mode) */\r\n public static MaxActiveMorphTargetsInVertexAttributeMode = 8;\r\n\r\n private _targets = new Array<MorphTarget>();\r\n private _targetInfluenceChangedObservers = new Array<Nullable<Observer<boolean>>>();\r\n private _targetDataLayoutChangedObservers = new Array<Nullable<Observer<void>>>();\r\n private _activeTargets = new SmartArray<MorphTarget>(16);\r\n private _scene: Nullable<Scene>;\r\n private _influences: Float32Array;\r\n private _morphTargetTextureIndices: Float32Array;\r\n private _supportsNormals = false;\r\n private _supportsTangents = false;\r\n private _supportsUVs = false;\r\n private _vertexCount = 0;\r\n private _textureVertexStride = 0;\r\n private _textureWidth = 0;\r\n private _textureHeight = 1;\r\n private _uniqueId = 0;\r\n private _tempInfluences = new Array<number>();\r\n private _canUseTextureForTargets = false;\r\n private _blockCounter = 0;\r\n\r\n /** @internal */\r\n public _parentContainer: Nullable<AbstractScene> = null;\r\n\r\n /** @internal */\r\n public _targetStoreTexture: Nullable<RawTexture2DArray>;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if influencers must be optimized (eg. recompiling the shader if less influencers are used)\r\n */\r\n public optimizeInfluencers = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if normals must be morphed\r\n */\r\n public enableNormalMorphing = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if tangents must be morphed\r\n */\r\n public enableTangentMorphing = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if UV must be morphed\r\n */\r\n public enableUVMorphing = true;\r\n\r\n /**\r\n * Sets a boolean indicating that adding new target or updating an existing target will not update the underlying data buffers\r\n */\r\n public set areUpdatesFrozen(block: boolean) {\r\n if (block) {\r\n this._blockCounter++;\r\n } else {\r\n this._blockCounter--;\r\n if (this._blockCounter <= 0) {\r\n this._blockCounter = 0;\r\n\r\n this._syncActiveTargets(true);\r\n }\r\n }\r\n }\r\n\r\n public get areUpdatesFrozen() {\r\n return this._blockCounter > 0;\r\n }\r\n\r\n /**\r\n * Creates a new MorphTargetManager\r\n * @param scene defines the current scene\r\n */\r\n public constructor(scene: Nullable<Scene> = null) {\r\n if (!scene) {\r\n scene = EngineStore.LastCreatedScene;\r\n }\r\n\r\n this._scene = scene;\r\n\r\n if (this._scene) {\r\n this._scene.addMorphTargetManager(this);\r\n\r\n this._uniqueId = this._scene.getUniqueId();\r\n\r\n const engineCaps = this._scene.getEngine().getCaps();\r\n this._canUseTextureForTargets =\r\n engineCaps.canUseGLVertexID && engineCaps.textureFloat && engineCaps.maxVertexTextureImageUnits > 0 && engineCaps.texture2DArrayMaxLayerCount > 1;\r\n }\r\n }\r\n\r\n private _numMaxInfluencers = 0;\r\n\r\n /**\r\n * Gets or sets the maximum number of influencers (targets) (default value: 0).\r\n * Setting a value for this property can lead to a smoother experience, as only one shader will be compiled, which will use this value as the maximum number of influencers.\r\n * If you leave the value at 0 (default), a new shader will be compiled every time the number of active influencers changes. This can cause problems, as compiling a shader takes time.\r\n * If you assign a non-zero value to this property, you need to ensure that this value is greater than the maximum number of (active) influencers you'll need for this morph manager.\r\n * Otherwise, the number of active influencers will be truncated at the value you set for this property, which can lead to unexpected results.\r\n * Note that this property has no effect if \"useTextureToStoreTargets\" is false.\r\n */\r\n public get numMaxInfluencers(): number {\r\n return this._numMaxInfluencers;\r\n }\r\n\r\n public set numMaxInfluencers(value: number) {\r\n if (this._numMaxInfluencers === value) {\r\n return;\r\n }\r\n\r\n this._numMaxInfluencers = value;\r\n this._syncActiveTargets(true);\r\n }\r\n\r\n /**\r\n * Gets the unique ID of this manager\r\n */\r\n public get uniqueId(): number {\r\n return this._uniqueId;\r\n }\r\n\r\n /**\r\n * Gets the number of vertices handled by this manager\r\n */\r\n public get vertexCount(): number {\r\n return this._vertexCount;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this manager supports morphing of normals\r\n */\r\n public get supportsNormals(): boolean {\r\n return this._supportsNormals && this.enableNormalMorphing;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this manager supports morphing of tangents\r\n */\r\n public get supportsTangents(): boolean {\r\n return this._supportsTangents && this.enableTangentMorphing;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this manager supports morphing of texture coordinates\r\n */\r\n public get supportsUVs(): boolean {\r\n return this._supportsUVs && this.enableUVMorphing;\r\n }\r\n\r\n /**\r\n * Gets the number of targets stored in this manager\r\n */\r\n public get numTargets(): number {\r\n return this._targets.length;\r\n }\r\n\r\n /**\r\n * Gets the number of influencers (ie. the number of targets with influences > 0)\r\n */\r\n public get numInfluencers(): number {\r\n return this._activeTargets.length;\r\n }\r\n\r\n /**\r\n * Gets the list of influences (one per target)\r\n */\r\n public get influences(): Float32Array {\r\n return this._influences;\r\n }\r\n\r\n private _useTextureToStoreTargets = true;\r\n /**\r\n * Gets or sets a boolean indicating that targets should be stored as a texture instead of using vertex attributes (default is true).\r\n * Please note that this option is not available if the hardware does not support it\r\n */\r\n public get useTextureToStoreTargets(): boolean {\r\n return this._useTextureToStoreTargets;\r\n }\r\n\r\n public set useTextureToStoreTargets(value: boolean) {\r\n this._useTextureToStoreTargets = value;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that the targets are stored into a texture (instead of as attributes)\r\n */\r\n public get isUsingTextureForTargets() {\r\n return (\r\n MorphTargetManager.EnableTextureStorage &&\r\n this.useTextureToStoreTargets &&\r\n this._canUseTextureForTargets &&\r\n !this._scene?.getEngine().getCaps().disableMorphTargetTexture\r\n );\r\n }\r\n\r\n /**\r\n * Gets the active target at specified index. An active target is a target with an influence > 0\r\n * @param index defines the index to check\r\n * @returns the requested target\r\n */\r\n public getActiveTarget(index: number): MorphTarget {\r\n return this._activeTargets.data[index];\r\n }\r\n\r\n /**\r\n * Gets the target at specified index\r\n * @param index defines the index to check\r\n * @returns the requested target\r\n */\r\n public getTarget(index: number): MorphTarget {\r\n return this._targets[index];\r\n }\r\n\r\n /**\r\n * Add a new target to this manager\r\n * @param target defines the target to add\r\n */\r\n public addTarget(target: MorphTarget): void {\r\n this._targets.push(target);\r\n this._targetInfluenceChangedObservers.push(\r\n target.onInfluenceChanged.add((needUpdate) => {\r\n this._syncActiveTargets(needUpdate);\r\n })\r\n );\r\n this._targetDataLayoutChangedObservers.push(\r\n target._onDataLayoutChanged.add(() => {\r\n this._syncActiveTargets(true);\r\n })\r\n );\r\n this._syncActiveTargets(true);\r\n }\r\n\r\n /**\r\n * Removes a target from the manager\r\n * @param target defines the target to remove\r\n */\r\n public removeTarget(target: MorphTarget): void {\r\n const index = this._targets.indexOf(target);\r\n if (index >= 0) {\r\n this._targets.splice(index, 1);\r\n\r\n target.onInfluenceChanged.remove(this._targetInfluenceChangedObservers.splice(index, 1)[0]);\r\n target._onDataLayoutChanged.remove(this._targetDataLayoutChangedObservers.splice(index, 1)[0]);\r\n this._syncActiveTargets(true);\r\n }\r\n\r\n if (this._scene) {\r\n this._scene.stopAnimation(target);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _bind(effect: Effect) {\r\n effect.setFloat3(\"morphTargetTextureInfo\", this._textureVertexStride, this._textureWidth, this._textureHeight);\r\n effect.setFloatArray(\"morphTargetTextureIndices\", this._morphTargetTextureIndices);\r\n effect.setTexture(\"morphTargets\", this._targetStoreTexture);\r\n effect.setInt(\"morphTargetCount\", this.numInfluencers);\r\n }\r\n\r\n /**\r\n * Clone the current manager\r\n * @returns a new MorphTargetManager\r\n */\r\n public clone(): MorphTargetManager {\r\n const copy = new MorphTargetManager(this._scene);\r\n\r\n for (const target of this._targets) {\r\n copy.addTarget(target.clone());\r\n }\r\n\r\n copy.enableNormalMorphing = this.enableNormalMorphing;\r\n copy.enableTangentMorphing = this.enableTangentMorphing;\r\n copy.enableUVMorphing = this.enableUVMorphing;\r\n\r\n return copy;\r\n }\r\n\r\n /**\r\n * Serializes the current manager into a Serialization object\r\n * @returns the serialized object\r\n */\r\n public serialize(): any {\r\n const serializationObject: any = {};\r\n\r\n serializationObject.id = this.uniqueId;\r\n\r\n serializationObject.targets = [];\r\n for (const target of this._targets) {\r\n serializationObject.targets.push(target.serialize());\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n private _syncActiveTargets(needUpdate: boolean): void {\r\n if (this.areUpdatesFrozen) {\r\n return;\r\n }\r\n\r\n let influenceCount = 0;\r\n this._activeTargets.reset();\r\n this._supportsNormals = true;\r\n this._supportsTangents = true;\r\n this._supportsUVs = true;\r\n this._vertexCount = 0;\r\n\r\n if (this._scene && this._targets.length > this._scene.getEngine().getCaps().texture2DArrayMaxLayerCount) {\r\n this.useTextureToStoreTargets = false;\r\n }\r\n\r\n if (!this._morphTargetTextureIndices || this._morphTargetTextureIndices.length !== this._targets.length) {\r\n this._morphTargetTextureIndices = new Float32Array(this._targets.length);\r\n }\r\n\r\n let targetIndex = -1;\r\n for (const target of this._targets) {\r\n targetIndex++;\r\n if (target.influence === 0 && this.optimizeInfluencers) {\r\n continue;\r\n }\r\n\r\n if (this._activeTargets.length >= MorphTargetManager.MaxActiveMorphTargetsInVertexAttributeMode && !this.isUsingTextureForTargets) {\r\n break;\r\n }\r\n\r\n this._activeTargets.push(target);\r\n this._morphTargetTextureIndices[influenceCount] = targetIndex;\r\n this._tempInfluences[influenceCount++] = target.influence;\r\n\r\n this._supportsNormals = this._supportsNormals && target.hasNormals;\r\n this._supportsTangents = this._supportsTangents && target.hasTangents;\r\n this._supportsUVs = this._supportsUVs && target.hasUVs;\r\n\r\n const positions = target.getPositions();\r\n if (positions) {\r\n const vertexCount = positions.length / 3;\r\n if (this._vertexCount === 0) {\r\n this._vertexCount = vertexCount;\r\n } else if (this._vertexCount !== vertexCount) {\r\n Logger.Error(\"Incompatible target. Targets must all have the same vertices count.\");\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if (this._morphTargetTextureIndices.length !== influenceCount) {\r\n this._morphTargetTextureIndices = this._morphTargetTextureIndices.slice(0, influenceCount);\r\n }\r\n\r\n if (!this._influences || this._influences.length !== influenceCount) {\r\n this._influences = new Float32Array(influenceCount);\r\n }\r\n\r\n for (let index = 0; index < influenceCount; index++) {\r\n this._influences[index] = this._tempInfluences[index];\r\n }\r\n\r\n if (needUpdate) {\r\n this.synchronize();\r\n }\r\n }\r\n\r\n /**\r\n * Synchronize the targets with all the meshes using this morph target manager\r\n */\r\n public synchronize(): void {\r\n if (!this._scene || this.areUpdatesFrozen) {\r\n return;\r\n }\r\n\r\n if (this.isUsingTextureForTargets && (this._vertexCount || this.numMaxInfluencers > 0)) {\r\n this._textureVertexStride = 1;\r\n\r\n if (this._supportsNormals) {\r\n this._textureVertexStride++;\r\n }\r\n\r\n if (this._supportsTangents) {\r\n this._textureVertexStride++;\r\n }\r\n\r\n if (this._supportsUVs) {\r\n this._textureVertexStride++;\r\n }\r\n\r\n this._textureWidth = this._vertexCount * this._textureVertexStride || 1;\r\n this._textureHeight = 1;\r\n\r\n const maxTextureSize = this._scene.getEngine().getCaps().maxTextureSize;\r\n if (this._textureWidth > maxTextureSize) {\r\n this._textureHeight = Math.ceil(this._textureWidth / maxTextureSize);\r\n this._textureWidth = maxTextureSize;\r\n }\r\n\r\n let mustUpdateTexture = true;\r\n if (this._targetStoreTexture) {\r\n const textureSize = this._targetStoreTexture.getSize();\r\n if (textureSize.width === this._textureWidth && textureSize.height === this._textureHeight && this._targetStoreTexture.depth === this._targets.length) {\r\n mustUpdateTexture = false;\r\n }\r\n }\r\n\r\n if (mustUpdateTexture) {\r\n if (this._targetStoreTexture) {\r\n this._targetStoreTexture.dispose();\r\n }\r\n\r\n const targetCount = this._targets.length;\r\n const data = new Float32Array(targetCount * this._textureWidth * this._textureHeight * 4);\r\n\r\n let offset = 0;\r\n for (let index = 0; index < targetCount; index++) {\r\n const target = this._targets[index];\r\n\r\n const positions = target.getPositions();\r\n const normals = target.getNormals();\r\n const uvs = target.getUVs();\r\n const tangents = target.getTangents();\r\n\r\n if (!positions) {\r\n if (index === 0) {\r\n Logger.Error(\"Invalid morph target. Target must have positions.\");\r\n }\r\n return;\r\n }\r\n\r\n offset = index * this._textureWidth * this._textureHeight * 4;\r\n for (let vertex = 0; vertex < this._vertexCount; vertex++) {\r\n data[offset] = positions[vertex * 3];\r\n data[offset + 1] = positions[vertex * 3 + 1];\r\n data[offset + 2] = positions[vertex * 3 + 2];\r\n\r\n offset += 4;\r\n\r\n if (this._supportsNormals && normals) {\r\n data[offset] = normals[vertex * 3];\r\n data[offset + 1] = normals[vertex * 3 + 1];\r\n data[offset + 2] = normals[vertex * 3 + 2];\r\n offset += 4;\r\n }\r\n\r\n if (this._supportsUVs && uvs) {\r\n data[offset] = uvs[vertex * 2];\r\n data[offset + 1] = uvs[vertex * 2 + 1];\r\n offset += 4;\r\n }\r\n\r\n if (this._supportsTangents && tangents) {\r\n data[offset] = tangents[vertex * 3];\r\n data[offset + 1] = tangents[vertex * 3 + 1];\r\n data[offset + 2] = tangents[vertex * 3 + 2];\r\n offset += 4;\r\n }\r\n }\r\n }\r\n\r\n this._targetStoreTexture = RawTexture2DArray.CreateRGBATexture(\r\n data,\r\n this._textureWidth,\r\n this._textureHeight,\r\n targetCount,\r\n this._scene,\r\n false,\r\n false,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n Constants.TEXTURETYPE_FLOAT\r\n );\r\n }\r\n }\r\n\r\n // Flag meshes as dirty to resync with the active targets\r\n for (const mesh of this._scene.meshes) {\r\n if ((<any>mesh).morphTargetManager === this) {\r\n (<Mesh>mesh)._syncGeometryWithMorphTargetManager();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Release all resources\r\n */\r\n public dispose() {\r\n if (this._targetStoreTexture) {\r\n this._targetStoreTexture.dispose();\r\n }\r\n\r\n this._targetStoreTexture = null;\r\n\r\n // Remove from scene\r\n if (this._scene) {\r\n this._scene.removeMorphTargetManager(this);\r\n\r\n if (this._parentContainer) {\r\n const index = this._parentContainer.morphTargetManagers.indexOf(this);\r\n if (index > -1) {\r\n this._parentContainer.morphTargetManagers.splice(index, 1);\r\n }\r\n this._parentContainer = null;\r\n }\r\n\r\n for (const morph of this._targets) {\r\n this._scene.stopAnimation(morph);\r\n }\r\n }\r\n }\r\n\r\n // Statics\r\n\r\n /**\r\n * Creates a new MorphTargetManager from serialized data\r\n * @param serializationObject defines the serialized data\r\n * @param scene defines the hosting scene\r\n * @returns the new MorphTargetManager\r\n */\r\n public static Parse(serializationObject: any, scene: Scene): MorphTargetManager {\r\n const result = new MorphTargetManager(scene);\r\n\r\n result._uniqueId = serializationObject.id;\r\n\r\n for (const targetData of serializationObject.targets) {\r\n result.addTarget(MorphTarget.Parse(targetData, scene));\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n"]}
|
|
@@ -159,12 +159,11 @@ export class MeshParticleEmitter {
|
|
|
159
159
|
* @returns the JSON object
|
|
160
160
|
*/
|
|
161
161
|
serialize() {
|
|
162
|
-
var _a;
|
|
163
162
|
const serializationObject = {};
|
|
164
163
|
serializationObject.type = this.getClassName();
|
|
165
164
|
serializationObject.direction1 = this.direction1.asArray();
|
|
166
165
|
serializationObject.direction2 = this.direction2.asArray();
|
|
167
|
-
serializationObject.meshId =
|
|
166
|
+
serializationObject.meshId = this.mesh?.id;
|
|
168
167
|
serializationObject.useMeshNormalsForDirection = this.useMeshNormalsForDirection;
|
|
169
168
|
return serializationObject;
|
|
170
169
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meshParticleEmitter.js","sourceRoot":"","sources":["../../../../../dev/core/src/Particles/EmitterTypes/meshParticleEmitter.ts"],"names":[],"mappings":"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","sourcesContent":["import { DeepCopier } from \"../../Misc/deepCopier\";\r\nimport type { Matrix } from \"../../Maths/math.vector\";\r\nimport { Vector3, TmpVectors } from \"../../Maths/math.vector\";\r\nimport { Scalar } from \"../../Maths/math.scalar\";\r\nimport type { Particle } from \"../../Particles/particle\";\r\nimport type { IParticleEmitterType } from \"./IParticleEmitterType\";\r\nimport type { IndicesArray, Nullable, FloatArray } from \"../../types\";\r\nimport { VertexBuffer } from \"../../Buffers/buffer\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport type { UniformBufferEffectCommonAccessor } from \"../../Materials/uniformBufferEffectCommonAccessor\";\r\nimport type { UniformBuffer } from \"../../Materials/uniformBuffer\";\r\n/**\r\n * Particle emitter emitting particles from the inside of a box.\r\n * It emits the particles randomly between 2 given directions.\r\n */\r\nexport class MeshParticleEmitter implements IParticleEmitterType {\r\n private _indices: Nullable<IndicesArray> = null;\r\n private _positions: Nullable<FloatArray> = null;\r\n private _normals: Nullable<FloatArray> = null;\r\n private _storedNormal = Vector3.Zero();\r\n private _mesh: Nullable<AbstractMesh> = null;\r\n\r\n /**\r\n * Random direction of each particle after it has been emitted, between direction1 and direction2 vectors.\r\n */\r\n public direction1 = new Vector3(0, 1.0, 0);\r\n /**\r\n * Random direction of each particle after it has been emitted, between direction1 and direction2 vectors.\r\n */\r\n public direction2 = new Vector3(0, 1.0, 0);\r\n\r\n /**\r\n * Gets or sets a boolean indicating that particle directions must be built from mesh face normals\r\n */\r\n public useMeshNormalsForDirection = true;\r\n\r\n /** Defines the mesh to use as source */\r\n public get mesh(): Nullable<AbstractMesh> {\r\n return this._mesh;\r\n }\r\n\r\n public set mesh(value: Nullable<AbstractMesh>) {\r\n if (this._mesh === value) {\r\n return;\r\n }\r\n\r\n this._mesh = value;\r\n\r\n if (value) {\r\n this._indices = value.getIndices();\r\n this._positions = value.getVerticesData(VertexBuffer.PositionKind);\r\n this._normals = value.getVerticesData(VertexBuffer.NormalKind);\r\n } else {\r\n this._indices = null;\r\n this._positions = null;\r\n this._normals = null;\r\n }\r\n }\r\n\r\n /**\r\n * Creates a new instance MeshParticleEmitter\r\n * @param mesh defines the mesh to use as source\r\n */\r\n constructor(mesh: Nullable<AbstractMesh> = null) {\r\n this.mesh = mesh;\r\n }\r\n\r\n /**\r\n * Called by the particle System when the direction is computed for the created particle.\r\n * @param worldMatrix is the world matrix of the particle system\r\n * @param directionToUpdate is the direction vector to update with the result\r\n * @param particle is the particle we are computed the direction for\r\n * @param isLocal defines if the direction should be set in local space\r\n */\r\n public startDirectionFunction(worldMatrix: Matrix, directionToUpdate: Vector3, particle: Particle, isLocal: boolean): void {\r\n if (this.useMeshNormalsForDirection && this._normals) {\r\n Vector3.TransformNormalToRef(this._storedNormal, worldMatrix, directionToUpdate);\r\n return;\r\n }\r\n\r\n const randX = Scalar.RandomRange(this.direction1.x, this.direction2.x);\r\n const randY = Scalar.RandomRange(this.direction1.y, this.direction2.y);\r\n const randZ = Scalar.RandomRange(this.direction1.z, this.direction2.z);\r\n\r\n if (isLocal) {\r\n directionToUpdate.copyFromFloats(randX, randY, randZ);\r\n return;\r\n }\r\n\r\n Vector3.TransformNormalFromFloatsToRef(randX, randY, randZ, worldMatrix, directionToUpdate);\r\n }\r\n\r\n /**\r\n * Called by the particle System when the position is computed for the created particle.\r\n * @param worldMatrix is the world matrix of the particle system\r\n * @param positionToUpdate is the position vector to update with the result\r\n * @param particle is the particle we are computed the position for\r\n * @param isLocal defines if the position should be set in local space\r\n */\r\n public startPositionFunction(worldMatrix: Matrix, positionToUpdate: Vector3, particle: Particle, isLocal: boolean): void {\r\n if (!this._indices || !this._positions) {\r\n return;\r\n }\r\n\r\n const randomFaceIndex = (3 * Math.random() * (this._indices.length / 3)) | 0;\r\n const bu = Math.random();\r\n const bv = Math.random() * (1.0 - bu);\r\n const bw = 1.0 - bu - bv;\r\n\r\n const faceIndexA = this._indices[randomFaceIndex];\r\n const faceIndexB = this._indices[randomFaceIndex + 1];\r\n const faceIndexC = this._indices[randomFaceIndex + 2];\r\n const vertexA = TmpVectors.Vector3[0];\r\n const vertexB = TmpVectors.Vector3[1];\r\n const vertexC = TmpVectors.Vector3[2];\r\n const randomVertex = TmpVectors.Vector3[3];\r\n\r\n Vector3.FromArrayToRef(this._positions, faceIndexA * 3, vertexA);\r\n Vector3.FromArrayToRef(this._positions, faceIndexB * 3, vertexB);\r\n Vector3.FromArrayToRef(this._positions, faceIndexC * 3, vertexC);\r\n\r\n randomVertex.x = bu * vertexA.x + bv * vertexB.x + bw * vertexC.x;\r\n randomVertex.y = bu * vertexA.y + bv * vertexB.y + bw * vertexC.y;\r\n randomVertex.z = bu * vertexA.z + bv * vertexB.z + bw * vertexC.z;\r\n\r\n if (isLocal) {\r\n positionToUpdate.copyFromFloats(randomVertex.x, randomVertex.y, randomVertex.z);\r\n } else {\r\n Vector3.TransformCoordinatesFromFloatsToRef(randomVertex.x, randomVertex.y, randomVertex.z, worldMatrix, positionToUpdate);\r\n }\r\n\r\n if (this.useMeshNormalsForDirection && this._normals) {\r\n Vector3.FromArrayToRef(this._normals, faceIndexA * 3, vertexA);\r\n Vector3.FromArrayToRef(this._normals, faceIndexB * 3, vertexB);\r\n Vector3.FromArrayToRef(this._normals, faceIndexC * 3, vertexC);\r\n\r\n this._storedNormal.x = bu * vertexA.x + bv * vertexB.x + bw * vertexC.x;\r\n this._storedNormal.y = bu * vertexA.y + bv * vertexB.y + bw * vertexC.y;\r\n this._storedNormal.z = bu * vertexA.z + bv * vertexB.z + bw * vertexC.z;\r\n }\r\n }\r\n\r\n /**\r\n * Clones the current emitter and returns a copy of it\r\n * @returns the new emitter\r\n */\r\n public clone(): MeshParticleEmitter {\r\n const newOne = new MeshParticleEmitter(this.mesh);\r\n\r\n DeepCopier.DeepCopy(this, newOne);\r\n\r\n return newOne;\r\n }\r\n\r\n /**\r\n * Called by the GPUParticleSystem to setup the update shader\r\n * @param uboOrEffect defines the update shader\r\n */\r\n public applyToShader(uboOrEffect: UniformBufferEffectCommonAccessor): void {\r\n uboOrEffect.setVector3(\"direction1\", this.direction1);\r\n uboOrEffect.setVector3(\"direction2\", this.direction2);\r\n }\r\n\r\n /**\r\n * Creates the structure of the ubo for this particle emitter\r\n * @param ubo ubo to create the structure for\r\n */\r\n public buildUniformLayout(ubo: UniformBuffer): void {\r\n ubo.addUniform(\"direction1\", 3);\r\n ubo.addUniform(\"direction2\", 3);\r\n }\r\n\r\n /**\r\n * Returns a string to use to update the GPU particles update shader\r\n * @returns a string containing the defines string\r\n */\r\n public getEffectDefines(): string {\r\n return \"\";\r\n }\r\n\r\n /**\r\n * Returns the string \"BoxParticleEmitter\"\r\n * @returns a string containing the class name\r\n */\r\n public getClassName(): string {\r\n return \"MeshParticleEmitter\";\r\n }\r\n\r\n /**\r\n * Serializes the particle system to a JSON object.\r\n * @returns the JSON object\r\n */\r\n public serialize(): any {\r\n const serializationObject: any = {};\r\n\r\n serializationObject.type = this.getClassName();\r\n serializationObject.direction1 = this.direction1.asArray();\r\n serializationObject.direction2 = this.direction2.asArray();\r\n serializationObject.meshId = this.mesh?.id;\r\n serializationObject.useMeshNormalsForDirection = this.useMeshNormalsForDirection;\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Parse properties from a JSON object\r\n * @param serializationObject defines the JSON object\r\n * @param scene defines the hosting scene\r\n */\r\n public parse(serializationObject: any, scene: Nullable<Scene>): void {\r\n Vector3.FromArrayToRef(serializationObject.direction1, 0, this.direction1);\r\n Vector3.FromArrayToRef(serializationObject.direction2, 0, this.direction2);\r\n\r\n if (serializationObject.meshId && scene) {\r\n this.mesh = scene.getLastMeshById(serializationObject.meshId);\r\n }\r\n\r\n this.useMeshNormalsForDirection = serializationObject.useMeshNormalsForDirection;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"meshParticleEmitter.js","sourceRoot":"","sources":["../../../../../dev/core/src/Particles/EmitterTypes/meshParticleEmitter.ts"],"names":[],"mappings":"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","sourcesContent":["import { DeepCopier } from \"../../Misc/deepCopier\";\r\nimport type { Matrix } from \"../../Maths/math.vector\";\r\nimport { Vector3, TmpVectors } from \"../../Maths/math.vector\";\r\nimport { Scalar } from \"../../Maths/math.scalar\";\r\nimport type { Particle } from \"../../Particles/particle\";\r\nimport type { IParticleEmitterType } from \"./IParticleEmitterType\";\r\nimport type { IndicesArray, Nullable, FloatArray } from \"../../types\";\r\nimport { VertexBuffer } from \"../../Buffers/buffer\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport type { UniformBufferEffectCommonAccessor } from \"../../Materials/uniformBufferEffectCommonAccessor\";\r\nimport type { UniformBuffer } from \"../../Materials/uniformBuffer\";\r\n/**\r\n * Particle emitter emitting particles from the inside of a box.\r\n * It emits the particles randomly between 2 given directions.\r\n */\r\nexport class MeshParticleEmitter implements IParticleEmitterType {\r\n private _indices: Nullable<IndicesArray> = null;\r\n private _positions: Nullable<FloatArray> = null;\r\n private _normals: Nullable<FloatArray> = null;\r\n private _storedNormal = Vector3.Zero();\r\n private _mesh: Nullable<AbstractMesh> = null;\r\n\r\n /**\r\n * Random direction of each particle after it has been emitted, between direction1 and direction2 vectors.\r\n */\r\n public direction1 = new Vector3(0, 1.0, 0);\r\n /**\r\n * Random direction of each particle after it has been emitted, between direction1 and direction2 vectors.\r\n */\r\n public direction2 = new Vector3(0, 1.0, 0);\r\n\r\n /**\r\n * Gets or sets a boolean indicating that particle directions must be built from mesh face normals\r\n */\r\n public useMeshNormalsForDirection = true;\r\n\r\n /** Defines the mesh to use as source */\r\n public get mesh(): Nullable<AbstractMesh> {\r\n return this._mesh;\r\n }\r\n\r\n public set mesh(value: Nullable<AbstractMesh>) {\r\n if (this._mesh === value) {\r\n return;\r\n }\r\n\r\n this._mesh = value;\r\n\r\n if (value) {\r\n this._indices = value.getIndices();\r\n this._positions = value.getVerticesData(VertexBuffer.PositionKind);\r\n this._normals = value.getVerticesData(VertexBuffer.NormalKind);\r\n } else {\r\n this._indices = null;\r\n this._positions = null;\r\n this._normals = null;\r\n }\r\n }\r\n\r\n /**\r\n * Creates a new instance MeshParticleEmitter\r\n * @param mesh defines the mesh to use as source\r\n */\r\n constructor(mesh: Nullable<AbstractMesh> = null) {\r\n this.mesh = mesh;\r\n }\r\n\r\n /**\r\n * Called by the particle System when the direction is computed for the created particle.\r\n * @param worldMatrix is the world matrix of the particle system\r\n * @param directionToUpdate is the direction vector to update with the result\r\n * @param particle is the particle we are computed the direction for\r\n * @param isLocal defines if the direction should be set in local space\r\n */\r\n public startDirectionFunction(worldMatrix: Matrix, directionToUpdate: Vector3, particle: Particle, isLocal: boolean): void {\r\n if (this.useMeshNormalsForDirection && this._normals) {\r\n Vector3.TransformNormalToRef(this._storedNormal, worldMatrix, directionToUpdate);\r\n return;\r\n }\r\n\r\n const randX = Scalar.RandomRange(this.direction1.x, this.direction2.x);\r\n const randY = Scalar.RandomRange(this.direction1.y, this.direction2.y);\r\n const randZ = Scalar.RandomRange(this.direction1.z, this.direction2.z);\r\n\r\n if (isLocal) {\r\n directionToUpdate.copyFromFloats(randX, randY, randZ);\r\n return;\r\n }\r\n\r\n Vector3.TransformNormalFromFloatsToRef(randX, randY, randZ, worldMatrix, directionToUpdate);\r\n }\r\n\r\n /**\r\n * Called by the particle System when the position is computed for the created particle.\r\n * @param worldMatrix is the world matrix of the particle system\r\n * @param positionToUpdate is the position vector to update with the result\r\n * @param particle is the particle we are computed the position for\r\n * @param isLocal defines if the position should be set in local space\r\n */\r\n public startPositionFunction(worldMatrix: Matrix, positionToUpdate: Vector3, particle: Particle, isLocal: boolean): void {\r\n if (!this._indices || !this._positions) {\r\n return;\r\n }\r\n\r\n const randomFaceIndex = (3 * Math.random() * (this._indices.length / 3)) | 0;\r\n const bu = Math.random();\r\n const bv = Math.random() * (1.0 - bu);\r\n const bw = 1.0 - bu - bv;\r\n\r\n const faceIndexA = this._indices[randomFaceIndex];\r\n const faceIndexB = this._indices[randomFaceIndex + 1];\r\n const faceIndexC = this._indices[randomFaceIndex + 2];\r\n const vertexA = TmpVectors.Vector3[0];\r\n const vertexB = TmpVectors.Vector3[1];\r\n const vertexC = TmpVectors.Vector3[2];\r\n const randomVertex = TmpVectors.Vector3[3];\r\n\r\n Vector3.FromArrayToRef(this._positions, faceIndexA * 3, vertexA);\r\n Vector3.FromArrayToRef(this._positions, faceIndexB * 3, vertexB);\r\n Vector3.FromArrayToRef(this._positions, faceIndexC * 3, vertexC);\r\n\r\n randomVertex.x = bu * vertexA.x + bv * vertexB.x + bw * vertexC.x;\r\n randomVertex.y = bu * vertexA.y + bv * vertexB.y + bw * vertexC.y;\r\n randomVertex.z = bu * vertexA.z + bv * vertexB.z + bw * vertexC.z;\r\n\r\n if (isLocal) {\r\n positionToUpdate.copyFromFloats(randomVertex.x, randomVertex.y, randomVertex.z);\r\n } else {\r\n Vector3.TransformCoordinatesFromFloatsToRef(randomVertex.x, randomVertex.y, randomVertex.z, worldMatrix, positionToUpdate);\r\n }\r\n\r\n if (this.useMeshNormalsForDirection && this._normals) {\r\n Vector3.FromArrayToRef(this._normals, faceIndexA * 3, vertexA);\r\n Vector3.FromArrayToRef(this._normals, faceIndexB * 3, vertexB);\r\n Vector3.FromArrayToRef(this._normals, faceIndexC * 3, vertexC);\r\n\r\n this._storedNormal.x = bu * vertexA.x + bv * vertexB.x + bw * vertexC.x;\r\n this._storedNormal.y = bu * vertexA.y + bv * vertexB.y + bw * vertexC.y;\r\n this._storedNormal.z = bu * vertexA.z + bv * vertexB.z + bw * vertexC.z;\r\n }\r\n }\r\n\r\n /**\r\n * Clones the current emitter and returns a copy of it\r\n * @returns the new emitter\r\n */\r\n public clone(): MeshParticleEmitter {\r\n const newOne = new MeshParticleEmitter(this.mesh);\r\n\r\n DeepCopier.DeepCopy(this, newOne);\r\n\r\n return newOne;\r\n }\r\n\r\n /**\r\n * Called by the GPUParticleSystem to setup the update shader\r\n * @param uboOrEffect defines the update shader\r\n */\r\n public applyToShader(uboOrEffect: UniformBufferEffectCommonAccessor): void {\r\n uboOrEffect.setVector3(\"direction1\", this.direction1);\r\n uboOrEffect.setVector3(\"direction2\", this.direction2);\r\n }\r\n\r\n /**\r\n * Creates the structure of the ubo for this particle emitter\r\n * @param ubo ubo to create the structure for\r\n */\r\n public buildUniformLayout(ubo: UniformBuffer): void {\r\n ubo.addUniform(\"direction1\", 3);\r\n ubo.addUniform(\"direction2\", 3);\r\n }\r\n\r\n /**\r\n * Returns a string to use to update the GPU particles update shader\r\n * @returns a string containing the defines string\r\n */\r\n public getEffectDefines(): string {\r\n return \"\";\r\n }\r\n\r\n /**\r\n * Returns the string \"BoxParticleEmitter\"\r\n * @returns a string containing the class name\r\n */\r\n public getClassName(): string {\r\n return \"MeshParticleEmitter\";\r\n }\r\n\r\n /**\r\n * Serializes the particle system to a JSON object.\r\n * @returns the JSON object\r\n */\r\n public serialize(): any {\r\n const serializationObject: any = {};\r\n\r\n serializationObject.type = this.getClassName();\r\n serializationObject.direction1 = this.direction1.asArray();\r\n serializationObject.direction2 = this.direction2.asArray();\r\n serializationObject.meshId = this.mesh?.id;\r\n serializationObject.useMeshNormalsForDirection = this.useMeshNormalsForDirection;\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Parse properties from a JSON object\r\n * @param serializationObject defines the JSON object\r\n * @param scene defines the hosting scene\r\n */\r\n public parse(serializationObject: any, scene: Nullable<Scene>): void {\r\n Vector3.FromArrayToRef(serializationObject.direction1, 0, this.direction1);\r\n Vector3.FromArrayToRef(serializationObject.direction2, 0, this.direction2);\r\n\r\n if (serializationObject.meshId && scene) {\r\n this.mesh = scene.getLastMeshById(serializationObject.meshId);\r\n }\r\n\r\n this.useMeshNormalsForDirection = serializationObject.useMeshNormalsForDirection;\r\n }\r\n}\r\n"]}
|
|
@@ -165,6 +165,10 @@ export declare class BaseParticleSystem implements IClipPlanesHolder {
|
|
|
165
165
|
* automatic start to happen and let you decide when to start emitting particles.
|
|
166
166
|
*/
|
|
167
167
|
preventAutoStart: boolean;
|
|
168
|
+
/**
|
|
169
|
+
* Gets or sets a boolean indicating that this particle system will allow fog to be rendered on it (false by default)
|
|
170
|
+
*/
|
|
171
|
+
applyFog: boolean;
|
|
168
172
|
/** @internal */
|
|
169
173
|
_wasDispatched: boolean;
|
|
170
174
|
protected _rootUrl: string;
|
|
@@ -393,6 +393,10 @@ export class BaseParticleSystem {
|
|
|
393
393
|
* automatic start to happen and let you decide when to start emitting particles.
|
|
394
394
|
*/
|
|
395
395
|
this.preventAutoStart = false;
|
|
396
|
+
/**
|
|
397
|
+
* Gets or sets a boolean indicating that this particle system will allow fog to be rendered on it (false by default)
|
|
398
|
+
*/
|
|
399
|
+
this.applyFog = false;
|
|
396
400
|
/** @internal */
|
|
397
401
|
this._wasDispatched = false;
|
|
398
402
|
this._rootUrl = "";
|