@onerjs/core 8.42.3 → 8.42.4
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/animatorAvatar.d.ts +31 -16
- package/Animations/animatorAvatar.js +138 -86
- package/Animations/animatorAvatar.js.map +1 -1
- package/AudioV2/abstractAudio/abstractSound.js +3 -4
- package/AudioV2/abstractAudio/abstractSound.js.map +1 -1
- package/AudioV2/abstractAudio/audioBus.js +3 -0
- package/AudioV2/abstractAudio/audioBus.js.map +1 -1
- package/AudioV2/abstractAudio/streamingSoundInstance.d.ts +1 -1
- package/AudioV2/abstractAudio/streamingSoundInstance.js +2 -2
- package/AudioV2/abstractAudio/streamingSoundInstance.js.map +1 -1
- package/AudioV2/webAudio/components/spatialWebAudioUpdaterComponent.d.ts +4 -1
- package/AudioV2/webAudio/components/spatialWebAudioUpdaterComponent.js +5 -2
- package/AudioV2/webAudio/components/spatialWebAudioUpdaterComponent.js.map +1 -1
- package/AudioV2/webAudio/webAudioStaticSound.js +3 -3
- package/AudioV2/webAudio/webAudioStaticSound.js.map +1 -1
- package/AudioV2/webAudio/webAudioStreamingSound.js +2 -4
- package/AudioV2/webAudio/webAudioStreamingSound.js.map +1 -1
- package/Cameras/Inputs/geospatialCameraKeyboardInput.js +6 -3
- package/Cameras/Inputs/geospatialCameraKeyboardInput.js.map +1 -1
- package/Cameras/geospatialCamera.d.ts +4 -2
- package/Cameras/geospatialCamera.js +10 -8
- package/Cameras/geospatialCamera.js.map +1 -1
- package/Cameras/geospatialCameraMovement.d.ts +11 -1
- package/Cameras/geospatialCameraMovement.js +26 -6
- package/Cameras/geospatialCameraMovement.js.map +1 -1
- package/Debug/physicsViewer.d.ts +1 -0
- package/Debug/physicsViewer.js +1 -0
- package/Debug/physicsViewer.js.map +1 -1
- package/Engines/WebGPU/webgpuBufferManager.js +3 -1
- package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
- package/Engines/abstractEngine.js +2 -2
- package/Engines/abstractEngine.js.map +1 -1
- package/Engines/nullEngine.js +4 -0
- package/Engines/nullEngine.js.map +1 -1
- package/Engines/webgpuEngine.js +2 -2
- package/Engines/webgpuEngine.js.map +1 -1
- package/Layers/highlightLayer.d.ts +14 -0
- package/Layers/highlightLayer.js +20 -0
- package/Layers/highlightLayer.js.map +1 -1
- package/Layers/selectionOutlineLayer.d.ts +1 -0
- package/Layers/selectionOutlineLayer.js +1 -0
- package/Layers/selectionOutlineLayer.js.map +1 -1
- package/Layers/thinEffectLayer.js +25 -1
- package/Layers/thinEffectLayer.js.map +1 -1
- package/Layers/thinHighlightLayer.d.ts +9 -0
- package/Layers/thinHighlightLayer.js +19 -3
- package/Layers/thinHighlightLayer.js.map +1 -1
- package/Lights/Clustered/clusteredLightContainer.js +4 -0
- package/Lights/Clustered/clusteredLightContainer.js.map +1 -1
- package/Loading/Plugins/babylonFileLoader.d.ts +2 -0
- package/Loading/Plugins/babylonFileLoader.js +2 -0
- package/Loading/Plugins/babylonFileLoader.js.map +1 -1
- package/Materials/Node/Blocks/Dual/depthSourceBlock.d.ts +1 -0
- package/Materials/Node/Blocks/Dual/depthSourceBlock.js +1 -0
- package/Materials/Node/Blocks/Dual/depthSourceBlock.js.map +1 -1
- package/Materials/Node/Blocks/Dual/sceneDepthBlock.d.ts +1 -0
- package/Materials/Node/Blocks/Dual/sceneDepthBlock.js +1 -0
- package/Materials/Node/Blocks/Dual/sceneDepthBlock.js.map +1 -1
- package/Materials/Node/Blocks/Teleport/teleportOutBlock.js +10 -4
- package/Materials/Node/Blocks/Teleport/teleportOutBlock.js.map +1 -1
- package/Materials/Textures/renderTargetTexture.js +6 -4
- package/Materials/Textures/renderTargetTexture.js.map +1 -1
- package/Meshes/abstractMesh.d.ts +9 -0
- package/Meshes/abstractMesh.js +16 -0
- package/Meshes/abstractMesh.js.map +1 -1
- package/Meshes/mesh.js +2 -0
- package/Meshes/mesh.js.map +1 -1
- package/Meshes/thinInstanceMesh.d.ts +7 -3
- package/Meshes/thinInstanceMesh.js +15 -3
- package/Meshes/thinInstanceMesh.js.map +1 -1
- package/Misc/snapshotRenderingHelper.d.ts +5 -3
- package/Misc/snapshotRenderingHelper.js +9 -5
- package/Misc/snapshotRenderingHelper.js.map +1 -1
- package/Particles/EmitterTypes/coneParticleEmitter.js +3 -3
- package/Particles/EmitterTypes/coneParticleEmitter.js.map +1 -1
- package/Particles/EmitterTypes/sphereParticleEmitter.js +2 -2
- package/Particles/EmitterTypes/sphereParticleEmitter.js.map +1 -1
- package/Particles/Node/Blocks/index.d.ts +0 -2
- package/Particles/Node/Blocks/index.js +0 -2
- package/Particles/Node/Blocks/index.js.map +1 -1
- package/Particles/Node/Blocks/particleNumberMathBlock.js +16 -0
- package/Particles/Node/Blocks/particleNumberMathBlock.js.map +1 -1
- package/Particles/Node/Blocks/systemBlock.d.ts +0 -4
- package/Particles/Node/Blocks/systemBlock.js +1 -32
- package/Particles/Node/Blocks/systemBlock.js.map +1 -1
- package/Particles/Node/nodeParticleSystemSet.helper.js +2 -89
- package/Particles/Node/nodeParticleSystemSet.helper.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline.d.ts +1 -0
- package/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline.js +1 -0
- package/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline.d.ts +1 -0
- package/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline.js +1 -0
- package/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.d.ts +6 -0
- package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js +8 -0
- package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/ssaoRenderingPipeline.d.ts +1 -0
- package/PostProcesses/RenderPipeline/Pipelines/ssaoRenderingPipeline.js +1 -0
- package/PostProcesses/RenderPipeline/Pipelines/ssaoRenderingPipeline.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.d.ts +6 -0
- package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js +8 -0
- package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.d.ts +1 -0
- package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js +1 -0
- package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js.map +1 -1
- package/PostProcesses/screenSpaceReflectionPostProcess.d.ts +1 -0
- package/PostProcesses/screenSpaceReflectionPostProcess.js +1 -0
- package/PostProcesses/screenSpaceReflectionPostProcess.js.map +1 -1
- package/Rendering/GlobalIllumination/giRSMManager.d.ts +1 -0
- package/Rendering/GlobalIllumination/giRSMManager.js +1 -0
- package/Rendering/GlobalIllumination/giRSMManager.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsAccumulationPass.js +7 -3
- package/Rendering/IBLShadows/iblShadowsAccumulationPass.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsSpatialBlurPass.js +3 -1
- package/Rendering/IBLShadows/iblShadowsSpatialBlurPass.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js +3 -1
- package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js.map +1 -1
- package/Rendering/geometryBufferRenderer.js +3 -0
- package/Rendering/geometryBufferRenderer.js.map +1 -1
- package/Rendering/prePassRenderer.d.ts +1 -0
- package/Rendering/prePassRenderer.js +1 -0
- package/Rendering/prePassRenderer.js.map +1 -1
- package/Shaders/gpuUpdateParticles.vertex.js +1 -1
- package/Shaders/gpuUpdateParticles.vertex.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/depthPrePass.js +4 -1
- package/ShadersWGSL/ShadersInclude/depthPrePass.js.map +1 -1
- package/ShadersWGSL/background.fragment.js +1 -1
- package/ShadersWGSL/background.fragment.js.map +1 -1
- package/ShadersWGSL/default.fragment.js +1 -1
- package/ShadersWGSL/default.fragment.js.map +1 -1
- package/ShadersWGSL/gpuUpdateParticles.compute.js +1 -1
- package/ShadersWGSL/gpuUpdateParticles.compute.js.map +1 -1
- package/XR/features/WebXRControllerPhysics.d.ts +1 -0
- package/XR/features/WebXRControllerPhysics.js +1 -0
- package/XR/features/WebXRControllerPhysics.js.map +1 -1
- package/XR/features/WebXRHandTracking.d.ts +1 -0
- package/XR/features/WebXRHandTracking.js +1 -0
- package/XR/features/WebXRHandTracking.js.map +1 -1
- package/package.json +1 -1
- package/Particles/Node/Blocks/Update/updateRemapBlock.d.ts +0 -39
- package/Particles/Node/Blocks/Update/updateRemapBlock.js +0 -93
- package/Particles/Node/Blocks/Update/updateRemapBlock.js.map +0 -1
- package/Particles/Node/Blocks/particleFresnelBlock.d.ts +0 -34
- package/Particles/Node/Blocks/particleFresnelBlock.js +0 -74
- package/Particles/Node/Blocks/particleFresnelBlock.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gpuUpdateParticles.compute.js","sourceRoot":"","sources":["../../../../dev/core/src/ShadersWGSL/gpuUpdateParticles.compute.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,IAAI,GAAG,iCAAiC,CAAC;AAC/C,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgSd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;IACtC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAChD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,mCAAmC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\n\nconst name = \"gpuUpdateParticlesComputeShader\";\nconst shader = `struct Particle {position : vec3<f32>,\nage : f32,\nsize : vec3<f32>,\nlife : f32,\nseed : vec4<f32>,\ndirection : vec3<f32>,\ndummy0: f32,\n#ifdef CUSTOMEMITTER\ninitialPosition : vec3<f32>,\ndummy1: f32,\n#endif\n#ifndef COLORGRADIENTS\ncolor : vec4<f32>,\n#endif\n#ifndef BILLBOARD\ninitialDirection : vec3<f32>,\ndummy2: f32,\n#endif\n#ifdef NOISE\nnoiseCoordinates1 : vec3<f32>,\ndummy3: f32,\nnoiseCoordinates2 : vec3<f32>,\ndummy4: f32,\n#endif\n#ifdef ANGULARSPEEDGRADIENTS\nangle : f32,\n#else\nangle : vec2<f32>,\n#endif\n#ifdef ANIMATESHEET\ncellIndex : f32,\n#ifdef ANIMATESHEETRANDOMSTART\ncellStartOffset : f32,\n#endif\n#endif\n};struct Particles {particles : array<Particle>,};struct SimParams {currentCount : f32,\ntimeDelta : f32,\nstopFactor : f32,\nrandomTextureSize: i32,\nlifeTime : vec2<f32>,\nemitPower : vec2<f32>,\n#ifndef COLORGRADIENTS\ncolor1 : vec4<f32>,\ncolor2 : vec4<f32>,\n#endif\nsizeRange : vec2<f32>,\nscaleRange : vec4<f32>,\nangleRange : vec4<f32>,\ngravity : vec3<f32>,\n#ifdef LIMITVELOCITYGRADIENTS\nlimitVelocityDamping : f32,\n#endif\n#ifdef ANIMATESHEET\ncellInfos : vec4<f32>,\n#endif\n#ifdef NOISE\nnoiseStrength : vec3<f32>,\n#endif\n#ifdef FLOWMAP\nflowMapProjection : mat4x4<f32>,\nflowMapStrength : f32,\n#endif\n#ifndef LOCAL\nemitterWM : mat4x4<f32>,\n#endif\n#ifdef BOXEMITTER\ndirection1 : vec3<f32>,\ndirection2 : vec3<f32>,\nminEmitBox : vec3<f32>,\nmaxEmitBox : vec3<f32>,\n#endif\n#ifdef CONEEMITTER\nradius : vec2<f32>,\nconeAngle : f32,\nheight : vec2<f32>,\n#ifdef DIRECTEDCONEEMITTER\ndirection1 : vec3<f32>,\ndirection2 : vec3<f32>,\n#else\ndirectionRandomizer : f32,\n#endif\n#endif\n#ifdef CYLINDEREMITTER\nradius : f32,\nheight : f32,\nradiusRange : f32,\n#ifdef DIRECTEDCYLINDEREMITTER\ndirection1 : vec3<f32>,\ndirection2 : vec3<f32>,\n#else\ndirectionRandomizer : f32,\n#endif\n#endif\n#ifdef HEMISPHERICEMITTER\nradius : f32,\nradiusRange : f32,\ndirectionRandomizer : f32,\n#endif\n#ifdef POINTEMITTER\ndirection1 : vec3<f32>,\ndirection2 : vec3<f32>,\n#endif\n#ifdef SPHEREEMITTER\nradius : f32,\nradiusRange : f32,\n#ifdef DIRECTEDSPHEREEMITTER\ndirection1 : vec3<f32>,\ndirection2 : vec3<f32>,\n#else\ndirectionRandomizer : f32,\n#endif\n#endif\n};@binding(0) @group(0) var<uniform> params : SimParams;@binding(1) @group(0) var<storage,read> particlesIn : Particles;@binding(2) @group(0) var<storage,read_write> particlesOut : Particles;@binding(3) @group(0) var randomTexture : texture_2d<f32>;@binding(4) @group(0) var randomTexture2 : texture_2d<f32>;\n#ifdef SIZEGRADIENTS\n@binding(0) @group(1) var sizeGradientSampler : sampler;@binding(1) @group(1) var sizeGradientTexture : texture_2d<f32>;\n#endif \n#ifdef ANGULARSPEEDGRADIENTS\n@binding(2) @group(1) var angularSpeedGradientSampler : sampler;@binding(3) @group(1) var angularSpeedGradientTexture : texture_2d<f32>;\n#endif \n#ifdef VELOCITYGRADIENTS\n@binding(4) @group(1) var velocityGradientSampler : sampler;@binding(5) @group(1) var velocityGradientTexture : texture_2d<f32>;\n#endif\n#ifdef LIMITVELOCITYGRADIENTS\n@binding(6) @group(1) var limitVelocityGradientSampler : sampler;@binding(7) @group(1) var limitVelocityGradientTexture : texture_2d<f32>;\n#endif\n#ifdef DRAGGRADIENTS\n@binding(8) @group(1) var dragGradientSampler : sampler;@binding(9) @group(1) var dragGradientTexture : texture_2d<f32>;\n#endif\n#ifdef NOISE\n@binding(10) @group(1) var noiseSampler : sampler;@binding(11) @group(1) var noiseTexture : texture_2d<f32>;\n#endif\n#ifdef FLOWMAP\n@binding(12) @group(1) var flowMapSampler : sampler;@binding(13) @group(1) var flowMapTexture : texture_2d<f32>;\n#endif\nfn getRandomVec3(offset : f32,vertexID : f32)->vec3<f32> {return textureLoad(randomTexture2,vec2<i32>(i32(vertexID*offset/params.currentCount*f32(params.randomTextureSize)) % params.randomTextureSize,0),0).rgb;}\nfn getRandomVec4(offset : f32,vertexID : f32)->vec4<f32> {return textureLoad(randomTexture,vec2<i32>(i32(vertexID*offset/params.currentCount*f32(params.randomTextureSize)) % params.randomTextureSize,0),0);}\n@compute @workgroup_size(64)\nfn main(@builtin(global_invocation_id) GlobalInvocationID : vec3<u32>) {let index : u32=GlobalInvocationID.x;let vertexID : f32=f32(index);if (index>=u32(params.currentCount)) {return;}\nlet PI : f32=3.14159;let timeDelta : f32=params.timeDelta;let newAge : f32=particlesIn.particles[index].age+timeDelta;let life : f32=particlesIn.particles[index].life;let seed : vec4<f32>=particlesIn.particles[index].seed;let direction : vec3<f32>=particlesIn.particles[index].direction;if (newAge>=life && params.stopFactor != 0.) {var newPosition : vec3<f32>;var newDirection : vec3<f32>;let randoms : vec4<f32>=getRandomVec4(seed.x,vertexID);let outLife : f32=params.lifeTime.x+(params.lifeTime.y-params.lifeTime.x)*randoms.r;particlesOut.particles[index].life=outLife;particlesOut.particles[index].age=newAge-life;particlesOut.particles[index].seed=seed;var sizex : f32;\n#ifdef SIZEGRADIENTS \nsizex=textureSampleLevel(sizeGradientTexture,sizeGradientSampler,vec2<f32>(0.,0.),0.).r;\n#else\nsizex=params.sizeRange.x+(params.sizeRange.y-params.sizeRange.x)*randoms.g;\n#endif\nparticlesOut.particles[index].size=vec3<f32>(\nsizex,\nparams.scaleRange.x+(params.scaleRange.y-params.scaleRange.x)*randoms.b,\nparams.scaleRange.z+(params.scaleRange.w-params.scaleRange.z)*randoms.a);\n#ifndef COLORGRADIENTS\nparticlesOut.particles[index].color=params.color1+(params.color2-params.color1)*randoms.b;\n#endif\n#ifndef ANGULARSPEEDGRADIENTS \nparticlesOut.particles[index].angle=vec2<f32>(\nparams.angleRange.z+(params.angleRange.w-params.angleRange.z)*randoms.r,\nparams.angleRange.x+(params.angleRange.y-params.angleRange.x)*randoms.a);\n#else\nparticlesOut.particles[index].angle=params.angleRange.z+(params.angleRange.w-params.angleRange.z)*randoms.r;\n#endif \n#if defined(POINTEMITTER)\nlet randoms2 : vec3<f32>=getRandomVec3(seed.y,vertexID);let randoms3 : vec3<f32>=getRandomVec3(seed.z,vertexID);newPosition=vec3<f32>(0.,0.,0.);newDirection=params.direction1+(params.direction2-params.direction1)*randoms3;\n#elif defined(BOXEMITTER)\nlet randoms2 : vec3<f32>=getRandomVec3(seed.y,vertexID);let randoms3 : vec3<f32>=getRandomVec3(seed.z,vertexID);newPosition=params.minEmitBox+(params.maxEmitBox-params.minEmitBox)*randoms2;newDirection=params.direction1+(params.direction2-params.direction1)*randoms3; \n#elif defined(HEMISPHERICEMITTER)\nlet randoms2 : vec3<f32>=getRandomVec3(seed.y,vertexID);let randoms3 : vec3<f32>=getRandomVec3(seed.z,vertexID);let phi : f32=2.0*PI*randoms2.x;let theta : f32=acos(-1.0+2.0*randoms2.y);let randX : f32=cos(phi)*sin(theta);let randY : f32=cos(theta);let randZ : f32=sin(phi)*sin(theta);newPosition=(params.radius-(params.radius*params.radiusRange*randoms2.z))*vec3<f32>(randX,abs(randY),randZ);newDirection=normalize(newPosition+params.directionRandomizer*randoms3);\n#elif defined(SPHEREEMITTER)\nlet randoms2 : vec3<f32>=getRandomVec3(seed.y,vertexID);let randoms3 : vec3<f32>=getRandomVec3(seed.z,vertexID);let phi : f32=2.0*PI*randoms2.x;let theta : f32=acos(-1.0+2.0*randoms2.y);let randX : f32=cos(phi)*sin(theta);let randY : f32=cos(theta);let randZ : f32=sin(phi)*sin(theta);newPosition=(params.radius-(params.radius*params.radiusRange*randoms2.z))*vec3<f32>(randX,randY,randZ);\n#ifdef DIRECTEDSPHEREEMITTER\nnewDirection=normalize(params.direction1+(params.direction2-params.direction1)*randoms3);\n#else\nnewDirection=normalize(newPosition+params.directionRandomizer*randoms3);\n#endif\n#elif defined(CYLINDEREMITTER)\nlet randoms2 : vec3<f32>=getRandomVec3(seed.y,vertexID);let randoms3 : vec3<f32>=getRandomVec3(seed.z,vertexID);let yPos : f32=(-0.5+randoms2.x)*params.height;var angle : f32=randoms2.y*PI*2.;let inverseRadiusRangeSquared : f32=(1.-params.radiusRange)*(1.-params.radiusRange);let positionRadius : f32=params.radius*sqrt(inverseRadiusRangeSquared+randoms2.z*(1.-inverseRadiusRangeSquared));let xPos : f32=positionRadius*cos(angle);let zPos : f32=positionRadius*sin(angle);newPosition=vec3<f32>(xPos,yPos,zPos);\n#ifdef DIRECTEDCYLINDEREMITTER\nnewDirection=params.direction1+(params.direction2-params.direction1)*randoms3;\n#else\nangle=angle+(-0.5+randoms3.x)*PI*params.directionRandomizer;newDirection=vec3<f32>(cos(angle),(-0.5+randoms3.y)*params.directionRandomizer,sin(angle));newDirection=normalize(newDirection);\n#endif\n#elif defined(CONEEMITTER)\nlet randoms2 : vec3<f32>=getRandomVec3(seed.y,vertexID);let s : f32=2.0*PI*randoms2.x;\n#ifdef CONEEMITTERSPAWNPOINT\nlet h : f32=0.0001;\n#else\nvar h : f32=randoms2.y*params.height.y;h=1.-h*h; \n#endif\nvar lRadius : f32=params.radius.x-params.radius.x*randoms2.z*params.radius.y;lRadius=lRadius*h;let randX : f32=lRadius*sin(s);let randZ : f32=lRadius*cos(s);let randY : f32=h *params.height.x;newPosition=vec3<f32>(randX,randY,randZ); \nlet randoms3 : vec3<f32>=getRandomVec3(seed.z,vertexID);\n#ifdef DIRECTEDCONEEMITTER\nnewDirection=params.direction1+(params.direction2-params.direction1)*randoms3;\n#else\nif (abs(cos(params.coneAngle))==1.0) {newDirection=vec3<f32>(0.,1.0,0.);} else {newDirection=normalize(newPosition+params.directionRandomizer*randoms3); }\n#endif\n#elif defined(CUSTOMEMITTER)\nnewPosition=particlesIn.particles[index].initialPosition;particlesOut.particles[index].initialPosition=newPosition;\n#else \nnewPosition=vec3<f32>(0.,0.,0.);newDirection=2.0*(getRandomVec3(seed.w,vertexID)-vec3<f32>(0.5,0.5,0.5));\n#endif\nlet power : f32=params.emitPower.x+(params.emitPower.y-params.emitPower.x)*randoms.a;\n#ifdef LOCAL\nparticlesOut.particles[index].position=newPosition;\n#else\nparticlesOut.particles[index].position=(params.emitterWM*vec4<f32>(newPosition,1.)).xyz;\n#endif\n#ifdef CUSTOMEMITTER\nparticlesOut.particles[index].direction=direction;\n#ifndef BILLBOARD \nparticlesOut.particles[index].initialDirection=direction;\n#endif\n#else\n#ifdef LOCAL\nlet initial : vec3<f32>=newDirection;\n#else \nlet initial : vec3<f32>=(params.emitterWM*vec4<f32>(newDirection,0.)).xyz;\n#endif\nparticlesOut.particles[index].direction=initial*power;\n#ifndef BILLBOARD \nparticlesOut.particles[index].initialDirection=initial;\n#endif\n#endif\n#ifdef ANIMATESHEET \nparticlesOut.particles[index].cellIndex=params.cellInfos.x;\n#ifdef ANIMATESHEETRANDOMSTART\nparticlesOut.particles[index].cellStartOffset=randoms.a*outLife;\n#endif \n#endif\n#ifdef NOISE\nparticlesOut.particles[index].noiseCoordinates1=particlesIn.particles[index].noiseCoordinates1;particlesOut.particles[index].noiseCoordinates2=particlesIn.particles[index].noiseCoordinates2;\n#endif\n} else {var directionScale : f32=timeDelta;particlesOut.particles[index].age=newAge;let ageGradient : f32=newAge/life;\n#ifdef VELOCITYGRADIENTS\ndirectionScale=directionScale*textureSampleLevel(velocityGradientTexture,velocityGradientSampler,vec2<f32>(ageGradient,0.),0.).r;\n#endif\n#ifdef DRAGGRADIENTS\ndirectionScale=directionScale*(1.0-textureSampleLevel(dragGradientTexture,dragGradientSampler,vec2<f32>(ageGradient,0.),0.).r);\n#endif\nlet position : vec3<f32>=particlesIn.particles[index].position;\n#if defined(CUSTOMEMITTER)\nparticlesOut.particles[index].position=position+(direction-position)*ageGradient; \nparticlesOut.particles[index].initialPosition=particlesIn.particles[index].initialPosition;\n#else\nparticlesOut.particles[index].position=position+direction*directionScale;\n#endif\nparticlesOut.particles[index].life=life;particlesOut.particles[index].seed=seed;\n#ifndef COLORGRADIENTS \nparticlesOut.particles[index].color=particlesIn.particles[index].color;\n#endif\n#ifdef SIZEGRADIENTS\nparticlesOut.particles[index].size=vec3<f32>(\ntextureSampleLevel(sizeGradientTexture,sizeGradientSampler,vec2<f32>(ageGradient,0.),0.).r,\nparticlesIn.particles[index].size.yz);\n#else\nparticlesOut.particles[index].size=particlesIn.particles[index].size;\n#endif \n#ifndef BILLBOARD \nparticlesOut.particles[index].initialDirection=particlesIn.particles[index].initialDirection;\n#endif\n#ifdef CUSTOMEMITTER\nparticlesOut.particles[index].direction=direction;\n#else\nvar updatedDirection : vec3<f32>=direction+params.gravity*timeDelta;\n#ifdef FLOWMAP\nvar clipSpace=(params.flowMapProjection*vec4f(position,1.));var ndcSpace=clipSpace.xyz/clipSpace.w;var flowMapUV=ndcSpace.xy*0.5+0.5;var flowMapValue=textureSampleLevel(flowMapTexture,flowMapSampler,flowMapUV,0.);var flowMapDirection=(flowMapValue.xyz*2.0-1.0)*flowMapValue.w;updatedDirection+=flowMapDirection*timeDelta*params.flowMapStrength;\n#endif\n#ifdef LIMITVELOCITYGRADIENTS\nlet limitVelocity : f32=textureSampleLevel(limitVelocityGradientTexture,limitVelocityGradientSampler,vec2<f32>(ageGradient,0.),0.).r;let currentVelocity : f32=length(updatedDirection);if (currentVelocity>limitVelocity) {updatedDirection=updatedDirection*params.limitVelocityDamping;}\n#endif\nparticlesOut.particles[index].direction=updatedDirection;\n#ifdef NOISE\nlet noiseCoordinates1 : vec3<f32>=particlesIn.particles[index].noiseCoordinates1;let noiseCoordinates2 : vec3<f32>=particlesIn.particles[index].noiseCoordinates2;let fetchedR : f32=textureSampleLevel(noiseTexture,noiseSampler,vec2<f32>(noiseCoordinates1.x,noiseCoordinates1.y)*vec2<f32>(0.5,0.5)+vec2<f32>(0.5,0.5),0.).r;let fetchedG : f32=textureSampleLevel(noiseTexture,noiseSampler,vec2<f32>(noiseCoordinates1.z,noiseCoordinates2.x)*vec2<f32>(0.5,0.5)+vec2<f32>(0.5,0.5),0.).r;let fetchedB : f32=textureSampleLevel(noiseTexture,noiseSampler,vec2<f32>(noiseCoordinates2.y,noiseCoordinates2.z)*vec2<f32>(0.5,0.5)+vec2<f32>(0.5,0.5),0.).r;let force : vec3<f32>=vec3<f32>(-1.+2.*fetchedR,-1.+2.*fetchedG,-1.+2.*fetchedB)*params.noiseStrength;particlesOut.particles[index].direction=particlesOut.particles[index].direction+force*timeDelta;particlesOut.particles[index].noiseCoordinates1=noiseCoordinates1;particlesOut.particles[index].noiseCoordinates2=noiseCoordinates2;\n#endif \n#endif \n#ifdef ANGULARSPEEDGRADIENTS\nlet angularSpeed : f32=textureSampleLevel(angularSpeedGradientTexture,angularSpeedGradientSampler,vec2<f32>(ageGradient,0.),0.).r;particlesOut.particles[index].angle=particlesIn.particles[index].angle+angularSpeed*timeDelta;\n#else\nlet angle : vec2<f32>=particlesIn.particles[index].angle;particlesOut.particles[index].angle=vec2<f32>(angle.x+angle.y*timeDelta,angle.y);\n#endif\n#ifdef ANIMATESHEET \nvar offsetAge : f32=particlesOut.particles[index].age;let dist : f32=params.cellInfos.y-params.cellInfos.x;\n#ifdef ANIMATESHEETRANDOMSTART\nlet cellStartOffset : f32=particlesIn.particles[index].cellStartOffset;particlesOut.particles[index].cellStartOffset=cellStartOffset;offsetAge=offsetAge+cellStartOffset;\n#else\nlet cellStartOffset : f32=0.;\n#endif \nvar ratio : f32;if (params.cellInfos.w==1.0) {ratio=clamp(((cellStartOffset+params.cellInfos.z*offsetAge) % life)/life,0.,1.0);}\nelse {ratio=clamp((cellStartOffset+params.cellInfos.z*offsetAge)/life,0.,1.0);}\nparticlesOut.particles[index].cellIndex=f32(i32(params.cellInfos.x+ratio*dist));\n#endif\n}}\n`;\n// Sideeffect\nif (!ShaderStore.ShadersStoreWGSL[name]) {\n ShaderStore.ShadersStoreWGSL[name] = shader;\n}\n/** @internal */\nexport const gpuUpdateParticlesComputeShaderWGSL = { name, shader };\n"]}
|
|
1
|
+
{"version":3,"file":"gpuUpdateParticles.compute.js","sourceRoot":"","sources":["../../../../dev/core/src/ShadersWGSL/gpuUpdateParticles.compute.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,IAAI,GAAG,iCAAiC,CAAC;AAC/C,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgSd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;IACtC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAChD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,mCAAmC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\n\nconst name = \"gpuUpdateParticlesComputeShader\";\nconst shader = `struct Particle {position : vec3<f32>,\nage : f32,\nsize : vec3<f32>,\nlife : f32,\nseed : vec4<f32>,\ndirection : vec3<f32>,\ndummy0: f32,\n#ifdef CUSTOMEMITTER\ninitialPosition : vec3<f32>,\ndummy1: f32,\n#endif\n#ifndef COLORGRADIENTS\ncolor : vec4<f32>,\n#endif\n#ifndef BILLBOARD\ninitialDirection : vec3<f32>,\ndummy2: f32,\n#endif\n#ifdef NOISE\nnoiseCoordinates1 : vec3<f32>,\ndummy3: f32,\nnoiseCoordinates2 : vec3<f32>,\ndummy4: f32,\n#endif\n#ifdef ANGULARSPEEDGRADIENTS\nangle : f32,\n#else\nangle : vec2<f32>,\n#endif\n#ifdef ANIMATESHEET\ncellIndex : f32,\n#ifdef ANIMATESHEETRANDOMSTART\ncellStartOffset : f32,\n#endif\n#endif\n};struct Particles {particles : array<Particle>,};struct SimParams {currentCount : f32,\ntimeDelta : f32,\nstopFactor : f32,\nrandomTextureSize: i32,\nlifeTime : vec2<f32>,\nemitPower : vec2<f32>,\n#ifndef COLORGRADIENTS\ncolor1 : vec4<f32>,\ncolor2 : vec4<f32>,\n#endif\nsizeRange : vec2<f32>,\nscaleRange : vec4<f32>,\nangleRange : vec4<f32>,\ngravity : vec3<f32>,\n#ifdef LIMITVELOCITYGRADIENTS\nlimitVelocityDamping : f32,\n#endif\n#ifdef ANIMATESHEET\ncellInfos : vec4<f32>,\n#endif\n#ifdef NOISE\nnoiseStrength : vec3<f32>,\n#endif\n#ifdef FLOWMAP\nflowMapProjection : mat4x4<f32>,\nflowMapStrength : f32,\n#endif\n#ifndef LOCAL\nemitterWM : mat4x4<f32>,\n#endif\n#ifdef BOXEMITTER\ndirection1 : vec3<f32>,\ndirection2 : vec3<f32>,\nminEmitBox : vec3<f32>,\nmaxEmitBox : vec3<f32>,\n#endif\n#ifdef CONEEMITTER\nradius : vec2<f32>,\nconeAngle : f32,\nheight : vec2<f32>,\n#ifdef DIRECTEDCONEEMITTER\ndirection1 : vec3<f32>,\ndirection2 : vec3<f32>,\n#else\ndirectionRandomizer : f32,\n#endif\n#endif\n#ifdef CYLINDEREMITTER\nradius : f32,\nheight : f32,\nradiusRange : f32,\n#ifdef DIRECTEDCYLINDEREMITTER\ndirection1 : vec3<f32>,\ndirection2 : vec3<f32>,\n#else\ndirectionRandomizer : f32,\n#endif\n#endif\n#ifdef HEMISPHERICEMITTER\nradius : f32,\nradiusRange : f32,\ndirectionRandomizer : f32,\n#endif\n#ifdef POINTEMITTER\ndirection1 : vec3<f32>,\ndirection2 : vec3<f32>,\n#endif\n#ifdef SPHEREEMITTER\nradius : f32,\nradiusRange : f32,\n#ifdef DIRECTEDSPHEREEMITTER\ndirection1 : vec3<f32>,\ndirection2 : vec3<f32>,\n#else\ndirectionRandomizer : f32,\n#endif\n#endif\n};@binding(0) @group(0) var<uniform> params : SimParams;@binding(1) @group(0) var<storage,read> particlesIn : Particles;@binding(2) @group(0) var<storage,read_write> particlesOut : Particles;@binding(3) @group(0) var randomTexture : texture_2d<f32>;@binding(4) @group(0) var randomTexture2 : texture_2d<f32>;\n#ifdef SIZEGRADIENTS\n@binding(0) @group(1) var sizeGradientSampler : sampler;@binding(1) @group(1) var sizeGradientTexture : texture_2d<f32>;\n#endif \n#ifdef ANGULARSPEEDGRADIENTS\n@binding(2) @group(1) var angularSpeedGradientSampler : sampler;@binding(3) @group(1) var angularSpeedGradientTexture : texture_2d<f32>;\n#endif \n#ifdef VELOCITYGRADIENTS\n@binding(4) @group(1) var velocityGradientSampler : sampler;@binding(5) @group(1) var velocityGradientTexture : texture_2d<f32>;\n#endif\n#ifdef LIMITVELOCITYGRADIENTS\n@binding(6) @group(1) var limitVelocityGradientSampler : sampler;@binding(7) @group(1) var limitVelocityGradientTexture : texture_2d<f32>;\n#endif\n#ifdef DRAGGRADIENTS\n@binding(8) @group(1) var dragGradientSampler : sampler;@binding(9) @group(1) var dragGradientTexture : texture_2d<f32>;\n#endif\n#ifdef NOISE\n@binding(10) @group(1) var noiseSampler : sampler;@binding(11) @group(1) var noiseTexture : texture_2d<f32>;\n#endif\n#ifdef FLOWMAP\n@binding(12) @group(1) var flowMapSampler : sampler;@binding(13) @group(1) var flowMapTexture : texture_2d<f32>;\n#endif\nfn getRandomVec3(offset : f32,vertexID : f32)->vec3<f32> {return textureLoad(randomTexture2,vec2<i32>(i32(vertexID*offset/params.currentCount*f32(params.randomTextureSize)) % params.randomTextureSize,0),0).rgb;}\nfn getRandomVec4(offset : f32,vertexID : f32)->vec4<f32> {return textureLoad(randomTexture,vec2<i32>(i32(vertexID*offset/params.currentCount*f32(params.randomTextureSize)) % params.randomTextureSize,0),0);}\n@compute @workgroup_size(64)\nfn main(@builtin(global_invocation_id) GlobalInvocationID : vec3<u32>) {let index : u32=GlobalInvocationID.x;let vertexID : f32=f32(index);if (index>=u32(params.currentCount)) {return;}\nlet PI : f32=3.14159;let timeDelta : f32=params.timeDelta;let newAge : f32=particlesIn.particles[index].age+timeDelta;let life : f32=particlesIn.particles[index].life;let seed : vec4<f32>=particlesIn.particles[index].seed;let direction : vec3<f32>=particlesIn.particles[index].direction;if (newAge>=life && params.stopFactor != 0.) {var newPosition : vec3<f32>;var newDirection : vec3<f32>;let randoms : vec4<f32>=getRandomVec4(seed.x,vertexID);let outLife : f32=params.lifeTime.x+(params.lifeTime.y-params.lifeTime.x)*randoms.r;particlesOut.particles[index].life=outLife;particlesOut.particles[index].age=newAge-life;particlesOut.particles[index].seed=seed;var sizex : f32;\n#ifdef SIZEGRADIENTS \nsizex=textureSampleLevel(sizeGradientTexture,sizeGradientSampler,vec2<f32>(0.,0.),0.).r;\n#else\nsizex=params.sizeRange.x+(params.sizeRange.y-params.sizeRange.x)*randoms.g;\n#endif\nparticlesOut.particles[index].size=vec3<f32>(\nsizex,\nparams.scaleRange.x+(params.scaleRange.y-params.scaleRange.x)*randoms.b,\nparams.scaleRange.z+(params.scaleRange.w-params.scaleRange.z)*randoms.a);\n#ifndef COLORGRADIENTS\nparticlesOut.particles[index].color=params.color1+(params.color2-params.color1)*randoms.b;\n#endif\n#ifndef ANGULARSPEEDGRADIENTS \nparticlesOut.particles[index].angle=vec2<f32>(\nparams.angleRange.z+(params.angleRange.w-params.angleRange.z)*randoms.r,\nparams.angleRange.x+(params.angleRange.y-params.angleRange.x)*randoms.a);\n#else\nparticlesOut.particles[index].angle=params.angleRange.z+(params.angleRange.w-params.angleRange.z)*randoms.r;\n#endif \n#if defined(POINTEMITTER)\nlet randoms2 : vec3<f32>=getRandomVec3(seed.y,vertexID);let randoms3 : vec3<f32>=getRandomVec3(seed.z,vertexID);newPosition=vec3<f32>(0.,0.,0.);newDirection=params.direction1+(params.direction2-params.direction1)*randoms3;\n#elif defined(BOXEMITTER)\nlet randoms2 : vec3<f32>=getRandomVec3(seed.y,vertexID);let randoms3 : vec3<f32>=getRandomVec3(seed.z,vertexID);newPosition=params.minEmitBox+(params.maxEmitBox-params.minEmitBox)*randoms2;newDirection=params.direction1+(params.direction2-params.direction1)*randoms3; \n#elif defined(HEMISPHERICEMITTER)\nlet randoms2 : vec3<f32>=getRandomVec3(seed.y,vertexID);let randoms3 : vec3<f32>=getRandomVec3(seed.z,vertexID);let phi : f32=2.0*PI*randoms2.x;let theta : f32=acos(-1.0+2.0*randoms2.y);let randX : f32=cos(phi)*sin(theta);let randY : f32=cos(theta);let randZ : f32=sin(phi)*sin(theta);newPosition=(params.radius-(params.radius*params.radiusRange*randoms2.z))*vec3<f32>(randX,abs(randY),randZ);newDirection=normalize(newPosition+params.directionRandomizer*randoms3);\n#elif defined(SPHEREEMITTER)\nlet randoms2 : vec3<f32>=getRandomVec3(seed.y,vertexID);let randoms3 : vec3<f32>=getRandomVec3(seed.z,vertexID);let phi : f32=2.0*PI*randoms2.x;let theta : f32=acos(-1.0+2.0*randoms2.y);let randX : f32=cos(phi)*sin(theta);let randY : f32=cos(theta);let randZ : f32=sin(phi)*sin(theta);newPosition=(params.radius-(params.radius*params.radiusRange*randoms2.z))*vec3<f32>(randX,randY,randZ);\n#ifdef DIRECTEDSPHEREEMITTER\nnewDirection=params.direction1+(params.direction2-params.direction1)*randoms3;\n#else\nnewDirection=normalize(newPosition+params.directionRandomizer*randoms3);\n#endif\n#elif defined(CYLINDEREMITTER)\nlet randoms2 : vec3<f32>=getRandomVec3(seed.y,vertexID);let randoms3 : vec3<f32>=getRandomVec3(seed.z,vertexID);let yPos : f32=(-0.5+randoms2.x)*params.height;var angle : f32=randoms2.y*PI*2.;let inverseRadiusRangeSquared : f32=(1.-params.radiusRange)*(1.-params.radiusRange);let positionRadius : f32=params.radius*sqrt(inverseRadiusRangeSquared+randoms2.z*(1.-inverseRadiusRangeSquared));let xPos : f32=positionRadius*cos(angle);let zPos : f32=positionRadius*sin(angle);newPosition=vec3<f32>(xPos,yPos,zPos);\n#ifdef DIRECTEDCYLINDEREMITTER\nnewDirection=params.direction1+(params.direction2-params.direction1)*randoms3;\n#else\nangle=angle+(-0.5+randoms3.x)*PI*params.directionRandomizer;newDirection=vec3<f32>(cos(angle),(-0.5+randoms3.y)*params.directionRandomizer,sin(angle));newDirection=normalize(newDirection);\n#endif\n#elif defined(CONEEMITTER)\nlet randoms2 : vec3<f32>=getRandomVec3(seed.y,vertexID);let s : f32=2.0*PI*randoms2.x;\n#ifdef CONEEMITTERSPAWNPOINT\nlet h : f32=0.0001;\n#else\nvar h : f32=randoms2.y*params.height.y;h=1.-h*h; \n#endif\nvar lRadius : f32=params.radius.x-params.radius.x*randoms2.z*params.radius.y;lRadius=lRadius*h;let randX : f32=lRadius*sin(s);let randZ : f32=lRadius*cos(s);let randY : f32=h *params.height.x;newPosition=vec3<f32>(randX,randY,randZ); \nlet randoms3 : vec3<f32>=getRandomVec3(seed.z,vertexID);\n#ifdef DIRECTEDCONEEMITTER\nnewDirection=params.direction1+(params.direction2-params.direction1)*randoms3;\n#else\nif (abs(cos(params.coneAngle))==1.0) {newDirection=vec3<f32>(0.,1.0,0.);} else {newDirection=normalize(newPosition+params.directionRandomizer*randoms3); }\n#endif\n#elif defined(CUSTOMEMITTER)\nnewPosition=particlesIn.particles[index].initialPosition;particlesOut.particles[index].initialPosition=newPosition;\n#else \nnewPosition=vec3<f32>(0.,0.,0.);newDirection=2.0*(getRandomVec3(seed.w,vertexID)-vec3<f32>(0.5,0.5,0.5));\n#endif\nlet power : f32=params.emitPower.x+(params.emitPower.y-params.emitPower.x)*randoms.a;\n#ifdef LOCAL\nparticlesOut.particles[index].position=newPosition;\n#else\nparticlesOut.particles[index].position=(params.emitterWM*vec4<f32>(newPosition,1.)).xyz;\n#endif\n#ifdef CUSTOMEMITTER\nparticlesOut.particles[index].direction=direction;\n#ifndef BILLBOARD \nparticlesOut.particles[index].initialDirection=direction;\n#endif\n#else\n#ifdef LOCAL\nlet initial : vec3<f32>=newDirection;\n#else \nlet initial : vec3<f32>=(params.emitterWM*vec4<f32>(newDirection,0.)).xyz;\n#endif\nparticlesOut.particles[index].direction=initial*power;\n#ifndef BILLBOARD \nparticlesOut.particles[index].initialDirection=initial;\n#endif\n#endif\n#ifdef ANIMATESHEET \nparticlesOut.particles[index].cellIndex=params.cellInfos.x;\n#ifdef ANIMATESHEETRANDOMSTART\nparticlesOut.particles[index].cellStartOffset=randoms.a*outLife;\n#endif \n#endif\n#ifdef NOISE\nparticlesOut.particles[index].noiseCoordinates1=particlesIn.particles[index].noiseCoordinates1;particlesOut.particles[index].noiseCoordinates2=particlesIn.particles[index].noiseCoordinates2;\n#endif\n} else {var directionScale : f32=timeDelta;particlesOut.particles[index].age=newAge;let ageGradient : f32=newAge/life;\n#ifdef VELOCITYGRADIENTS\ndirectionScale=directionScale*textureSampleLevel(velocityGradientTexture,velocityGradientSampler,vec2<f32>(ageGradient,0.),0.).r;\n#endif\n#ifdef DRAGGRADIENTS\ndirectionScale=directionScale*(1.0-textureSampleLevel(dragGradientTexture,dragGradientSampler,vec2<f32>(ageGradient,0.),0.).r);\n#endif\nlet position : vec3<f32>=particlesIn.particles[index].position;\n#if defined(CUSTOMEMITTER)\nparticlesOut.particles[index].position=position+(direction-position)*ageGradient; \nparticlesOut.particles[index].initialPosition=particlesIn.particles[index].initialPosition;\n#else\nparticlesOut.particles[index].position=position+direction*directionScale;\n#endif\nparticlesOut.particles[index].life=life;particlesOut.particles[index].seed=seed;\n#ifndef COLORGRADIENTS \nparticlesOut.particles[index].color=particlesIn.particles[index].color;\n#endif\n#ifdef SIZEGRADIENTS\nparticlesOut.particles[index].size=vec3<f32>(\ntextureSampleLevel(sizeGradientTexture,sizeGradientSampler,vec2<f32>(ageGradient,0.),0.).r,\nparticlesIn.particles[index].size.yz);\n#else\nparticlesOut.particles[index].size=particlesIn.particles[index].size;\n#endif \n#ifndef BILLBOARD \nparticlesOut.particles[index].initialDirection=particlesIn.particles[index].initialDirection;\n#endif\n#ifdef CUSTOMEMITTER\nparticlesOut.particles[index].direction=direction;\n#else\nvar updatedDirection : vec3<f32>=direction+params.gravity*timeDelta;\n#ifdef FLOWMAP\nvar clipSpace=(params.flowMapProjection*vec4f(position,1.));var ndcSpace=clipSpace.xyz/clipSpace.w;var flowMapUV=ndcSpace.xy*0.5+0.5;var flowMapValue=textureSampleLevel(flowMapTexture,flowMapSampler,flowMapUV,0.);var flowMapDirection=(flowMapValue.xyz*2.0-1.0)*flowMapValue.w;updatedDirection+=flowMapDirection*timeDelta*params.flowMapStrength;\n#endif\n#ifdef LIMITVELOCITYGRADIENTS\nlet limitVelocity : f32=textureSampleLevel(limitVelocityGradientTexture,limitVelocityGradientSampler,vec2<f32>(ageGradient,0.),0.).r;let currentVelocity : f32=length(updatedDirection);if (currentVelocity>limitVelocity) {updatedDirection=updatedDirection*params.limitVelocityDamping;}\n#endif\nparticlesOut.particles[index].direction=updatedDirection;\n#ifdef NOISE\nlet noiseCoordinates1 : vec3<f32>=particlesIn.particles[index].noiseCoordinates1;let noiseCoordinates2 : vec3<f32>=particlesIn.particles[index].noiseCoordinates2;let fetchedR : f32=textureSampleLevel(noiseTexture,noiseSampler,vec2<f32>(noiseCoordinates1.x,noiseCoordinates1.y)*vec2<f32>(0.5,0.5)+vec2<f32>(0.5,0.5),0.).r;let fetchedG : f32=textureSampleLevel(noiseTexture,noiseSampler,vec2<f32>(noiseCoordinates1.z,noiseCoordinates2.x)*vec2<f32>(0.5,0.5)+vec2<f32>(0.5,0.5),0.).r;let fetchedB : f32=textureSampleLevel(noiseTexture,noiseSampler,vec2<f32>(noiseCoordinates2.y,noiseCoordinates2.z)*vec2<f32>(0.5,0.5)+vec2<f32>(0.5,0.5),0.).r;let force : vec3<f32>=vec3<f32>(-1.+2.*fetchedR,-1.+2.*fetchedG,-1.+2.*fetchedB)*params.noiseStrength;particlesOut.particles[index].direction=particlesOut.particles[index].direction+force*timeDelta;particlesOut.particles[index].noiseCoordinates1=noiseCoordinates1;particlesOut.particles[index].noiseCoordinates2=noiseCoordinates2;\n#endif \n#endif \n#ifdef ANGULARSPEEDGRADIENTS\nlet angularSpeed : f32=textureSampleLevel(angularSpeedGradientTexture,angularSpeedGradientSampler,vec2<f32>(ageGradient,0.),0.).r;particlesOut.particles[index].angle=particlesIn.particles[index].angle+angularSpeed*timeDelta;\n#else\nlet angle : vec2<f32>=particlesIn.particles[index].angle;particlesOut.particles[index].angle=vec2<f32>(angle.x+angle.y*timeDelta,angle.y);\n#endif\n#ifdef ANIMATESHEET \nvar offsetAge : f32=particlesOut.particles[index].age;let dist : f32=params.cellInfos.y-params.cellInfos.x;\n#ifdef ANIMATESHEETRANDOMSTART\nlet cellStartOffset : f32=particlesIn.particles[index].cellStartOffset;particlesOut.particles[index].cellStartOffset=cellStartOffset;offsetAge=offsetAge+cellStartOffset;\n#else\nlet cellStartOffset : f32=0.;\n#endif \nvar ratio : f32;if (params.cellInfos.w==1.0) {ratio=clamp(((cellStartOffset+params.cellInfos.z*offsetAge) % life)/life,0.,1.0);}\nelse {ratio=clamp((cellStartOffset+params.cellInfos.z*offsetAge)/life,0.,1.0);}\nparticlesOut.particles[index].cellIndex=f32(i32(params.cellInfos.x+ratio*dist));\n#endif\n}}\n`;\n// Sideeffect\nif (!ShaderStore.ShadersStoreWGSL[name]) {\n ShaderStore.ShadersStoreWGSL[name] = shader;\n}\n/** @internal */\nexport const gpuUpdateParticlesComputeShaderWGSL = { name, shader };\n"]}
|
|
@@ -6,6 +6,7 @@ import type { WebXRSessionManager } from "../webXRSessionManager.js";
|
|
|
6
6
|
import type { Nullable } from "../../types.js";
|
|
7
7
|
import { PhysicsAggregate } from "../../Physics/v2/physicsAggregate.js";
|
|
8
8
|
import type { PhysicsBody } from "../../Physics/v2/physicsBody.js";
|
|
9
|
+
import "../../Physics/joinedPhysicsEngineComponent.js";
|
|
9
10
|
/**
|
|
10
11
|
* Options for the controller physics feature
|
|
11
12
|
*/
|
|
@@ -5,6 +5,7 @@ import { CreateSphere } from "../../Meshes/Builders/sphereBuilder.js";
|
|
|
5
5
|
import { WebXRFeatureName, WebXRFeaturesManager } from "../webXRFeaturesManager.js";
|
|
6
6
|
import { Logger } from "../../Misc/logger.js";
|
|
7
7
|
import { PhysicsAggregate } from "../../Physics/v2/physicsAggregate.js";
|
|
8
|
+
import "../../Physics/joinedPhysicsEngineComponent.js";
|
|
8
9
|
/**
|
|
9
10
|
* Options for the controller physics feature
|
|
10
11
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebXRControllerPhysics.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRControllerPhysics.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport { Vector3, Quaternion } from \"../../Maths/math.vector\";\r\nimport type { WebXRInputSource } from \"../webXRInputSource\";\r\nimport { PhysicsImpostor } from \"../../Physics/v1/physicsImpostor\";\r\nimport type { WebXRInput } from \"../webXRInput\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport { CreateSphere } from \"../../Meshes/Builders/sphereBuilder\";\r\nimport { WebXRFeatureName, WebXRFeaturesManager } from \"../webXRFeaturesManager\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { PhysicsAggregate } from \"../../Physics/v2/physicsAggregate\";\r\nimport type { PhysicsBody } from \"../../Physics/v2/physicsBody\";\r\nimport { PhysicsMotionType, PhysicsShapeType } from \"../../Physics/v2/IPhysicsEnginePlugin\";\r\n\r\n/**\r\n * Options for the controller physics feature\r\n */\r\nexport class IWebXRControllerPhysicsOptions {\r\n /**\r\n * Should the headset get its own impostor\r\n */\r\n enableHeadsetImpostor?: boolean;\r\n /**\r\n * Optional parameters for the headset impostor\r\n */\r\n headsetImpostorParams?: {\r\n /**\r\n * The type of impostor to create. Default is sphere\r\n */\r\n impostorType: number;\r\n /**\r\n * the size of the impostor. Defaults to 10cm\r\n */\r\n impostorSize?: number | { width: number; height: number; depth: number };\r\n /**\r\n * Friction definitions\r\n */\r\n friction?: number;\r\n /**\r\n * Restitution\r\n */\r\n restitution?: number;\r\n };\r\n /**\r\n * The physics properties of the future impostors\r\n */\r\n physicsProperties?: {\r\n /**\r\n * If set to true, a mesh impostor will be created when the controller mesh was loaded\r\n * Note that this requires a physics engine that supports mesh impostors!\r\n */\r\n useControllerMesh?: boolean;\r\n /**\r\n * The type of impostor to create. Default is sphere\r\n */\r\n impostorType?: number;\r\n /**\r\n * the size of the impostor. Defaults to 10cm\r\n */\r\n impostorSize?: number | { width: number; height: number; depth: number };\r\n /**\r\n * Friction definitions\r\n */\r\n friction?: number;\r\n /**\r\n * Restitution\r\n */\r\n restitution?: number;\r\n };\r\n /**\r\n * the xr input to use with this pointer selection\r\n */\r\n public xrInput: WebXRInput;\r\n}\r\n\r\n/**\r\n * Add physics impostor to your webxr controllers,\r\n * including naive calculation of their linear and angular velocity\r\n */\r\nexport class WebXRControllerPhysics extends WebXRAbstractFeature {\r\n private _attachController = (xrController: WebXRInputSource) => {\r\n if (this._controllers[xrController.uniqueId]) {\r\n // already attached\r\n return;\r\n }\r\n if (!this._xrSessionManager.scene.isPhysicsEnabled()) {\r\n Logger.Warn(\"physics engine not enabled, skipped. Please add this controller manually.\");\r\n }\r\n\r\n if (this._physicsVersion === 2) {\r\n this._attachControllerV2(xrController);\r\n } else {\r\n this._attachControllerV1(xrController);\r\n }\r\n };\r\n\r\n private _attachControllerV1 = (xrController: WebXRInputSource) => {\r\n // if no motion controller available, create impostors!\r\n if (this._options.physicsProperties!.useControllerMesh && xrController.inputSource.gamepad) {\r\n xrController.onMotionControllerInitObservable.addOnce((motionController) => {\r\n if (!motionController._doNotLoadControllerMesh) {\r\n motionController.onModelLoadedObservable.addOnce(() => {\r\n const impostor = new PhysicsImpostor(motionController.rootMesh!, PhysicsImpostor.MeshImpostor, {\r\n mass: 0,\r\n ...this._options.physicsProperties,\r\n });\r\n\r\n const controllerMesh = xrController.grip || xrController.pointer;\r\n this._controllers[xrController.uniqueId] = {\r\n xrController,\r\n impostor,\r\n oldPos: controllerMesh.position.clone(),\r\n oldRotation: controllerMesh.rotationQuaternion!.clone(),\r\n };\r\n });\r\n } else {\r\n // This controller isn't using a model, create impostors instead\r\n this._createPhysicsImpostor(xrController);\r\n }\r\n });\r\n } else {\r\n this._createPhysicsImpostor(xrController);\r\n }\r\n };\r\n\r\n private _attachControllerV2 = (xrController: WebXRInputSource) => {\r\n // if no motion controller available, create physics aggregates!\r\n if (this._options.physicsProperties!.useControllerMesh && xrController.inputSource.gamepad) {\r\n xrController.onMotionControllerInitObservable.addOnce((motionController) => {\r\n if (!motionController._doNotLoadControllerMesh) {\r\n motionController.onModelLoadedObservable.addOnce(() => {\r\n const shapeType = this._mapImpostorTypeToShapeType(PhysicsImpostor.MeshImpostor);\r\n const aggregate = new PhysicsAggregate(\r\n motionController.rootMesh!,\r\n shapeType,\r\n {\r\n mass: 0,\r\n friction: this._options.physicsProperties?.friction ?? 0.2,\r\n restitution: this._options.physicsProperties?.restitution ?? 0.2,\r\n },\r\n this._xrSessionManager.scene\r\n );\r\n\r\n aggregate.body.setMotionType(PhysicsMotionType.ANIMATED);\r\n aggregate.body.disableSync = true;\r\n\r\n const controllerMesh = xrController.grip || xrController.pointer;\r\n this._controllers[xrController.uniqueId] = {\r\n xrController,\r\n physicsAggregate: aggregate,\r\n physicsBody: aggregate.body,\r\n isPhysicsV2: true,\r\n oldPos: controllerMesh.position.clone(),\r\n oldRotation: controllerMesh.rotationQuaternion!.clone(),\r\n };\r\n });\r\n } else {\r\n // This controller isn't using a model, create physics aggregate instead\r\n this._createPhysicsAggregate(xrController);\r\n }\r\n });\r\n } else {\r\n this._createPhysicsAggregate(xrController);\r\n }\r\n };\r\n\r\n private _mapImpostorTypeToShapeType(impostorType: number): PhysicsShapeType {\r\n // Map v1 PhysicsImpostor types to v2 PhysicsShapeType\r\n switch (impostorType) {\r\n case PhysicsImpostor.SphereImpostor:\r\n return PhysicsShapeType.SPHERE;\r\n case PhysicsImpostor.BoxImpostor:\r\n return PhysicsShapeType.BOX;\r\n case PhysicsImpostor.CapsuleImpostor:\r\n return PhysicsShapeType.CAPSULE;\r\n case PhysicsImpostor.CylinderImpostor:\r\n return PhysicsShapeType.CYLINDER;\r\n case PhysicsImpostor.MeshImpostor:\r\n return PhysicsShapeType.MESH;\r\n case PhysicsImpostor.ConvexHullImpostor:\r\n return PhysicsShapeType.CONVEX_HULL;\r\n default:\r\n Logger.Warn(`Unsupported impostor type ${impostorType} for v2 physics, defaulting to SPHERE`);\r\n return PhysicsShapeType.SPHERE;\r\n }\r\n }\r\n\r\n private _createPhysicsImpostor(xrController: WebXRInputSource) {\r\n const impostorType: number = this._options.physicsProperties!.impostorType || PhysicsImpostor.SphereImpostor;\r\n const impostorSize: number | { width: number; height: number; depth: number } = this._options.physicsProperties!.impostorSize || 0.1;\r\n const impostorMesh = CreateSphere(\"impostor-mesh-\" + xrController.uniqueId, {\r\n diameterX: typeof impostorSize === \"number\" ? impostorSize : impostorSize.width,\r\n diameterY: typeof impostorSize === \"number\" ? impostorSize : impostorSize.height,\r\n diameterZ: typeof impostorSize === \"number\" ? impostorSize : impostorSize.depth,\r\n });\r\n impostorMesh.isVisible = this._debugMode;\r\n impostorMesh.isPickable = false;\r\n impostorMesh.rotationQuaternion = new Quaternion();\r\n const controllerMesh = xrController.grip || xrController.pointer;\r\n impostorMesh.position.copyFrom(controllerMesh.position);\r\n impostorMesh.rotationQuaternion.copyFrom(controllerMesh.rotationQuaternion!);\r\n const impostor = new PhysicsImpostor(impostorMesh, impostorType, {\r\n mass: 0,\r\n ...this._options.physicsProperties,\r\n });\r\n this._controllers[xrController.uniqueId] = {\r\n xrController,\r\n impostor,\r\n impostorMesh,\r\n };\r\n }\r\n\r\n private _createPhysicsAggregate(xrController: WebXRInputSource) {\r\n const impostorType: number = this._options.physicsProperties!.impostorType || PhysicsImpostor.SphereImpostor;\r\n const impostorSize: number | { width: number; height: number; depth: number } = this._options.physicsProperties!.impostorSize || 0.1;\r\n const impostorMesh = CreateSphere(\"impostor-mesh-\" + xrController.uniqueId, {\r\n diameterX: typeof impostorSize === \"number\" ? impostorSize : impostorSize.width,\r\n diameterY: typeof impostorSize === \"number\" ? impostorSize : impostorSize.height,\r\n diameterZ: typeof impostorSize === \"number\" ? impostorSize : impostorSize.depth,\r\n });\r\n impostorMesh.isVisible = this._debugMode;\r\n impostorMesh.isPickable = false;\r\n impostorMesh.rotationQuaternion = new Quaternion();\r\n const controllerMesh = xrController.grip || xrController.pointer;\r\n impostorMesh.position.copyFrom(controllerMesh.position);\r\n impostorMesh.rotationQuaternion.copyFrom(controllerMesh.rotationQuaternion!);\r\n\r\n const shapeType = this._mapImpostorTypeToShapeType(impostorType);\r\n const aggregate = new PhysicsAggregate(\r\n impostorMesh,\r\n shapeType,\r\n {\r\n mass: 0,\r\n friction: this._options.physicsProperties?.friction ?? 0.2,\r\n restitution: this._options.physicsProperties?.restitution ?? 0.2,\r\n },\r\n this._xrSessionManager.scene\r\n );\r\n\r\n aggregate.body.setMotionType(PhysicsMotionType.ANIMATED);\r\n aggregate.body.disableSync = true;\r\n\r\n this._controllers[xrController.uniqueId] = {\r\n xrController,\r\n physicsAggregate: aggregate,\r\n physicsBody: aggregate.body,\r\n isPhysicsV2: true,\r\n impostorMesh,\r\n };\r\n }\r\n\r\n private _controllers: {\r\n [id: string]: {\r\n xrController: WebXRInputSource;\r\n impostorMesh?: AbstractMesh;\r\n impostor?: PhysicsImpostor;\r\n physicsAggregate?: PhysicsAggregate;\r\n physicsBody?: PhysicsBody;\r\n isPhysicsV2?: boolean;\r\n oldPos?: Vector3;\r\n oldSpeed?: Vector3;\r\n oldRotation?: Quaternion;\r\n };\r\n } = {};\r\n private _debugMode = false;\r\n private _delta: number = 0;\r\n private _headsetImpostor?: PhysicsImpostor;\r\n private _headsetMesh?: AbstractMesh;\r\n private _headsetAggregateV2?: PhysicsAggregate;\r\n private _lastTimestamp: number = 0;\r\n private _physicsVersion: 1 | 2 = 1;\r\n private _tmpQuaternion: Quaternion = new Quaternion();\r\n private _tmpVector: Vector3 = new Vector3();\r\n\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.PHYSICS_CONTROLLERS;\r\n /**\r\n * The (Babylon) version of this module.\r\n * This is an integer representing the implementation version.\r\n * This number does not correspond to the webxr specs version\r\n */\r\n public static readonly Version = 2;\r\n\r\n /**\r\n * Construct a new Controller Physics Feature\r\n * @param _xrSessionManager the corresponding xr session manager\r\n * @param _options options to create this feature with\r\n */\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n private readonly _options: IWebXRControllerPhysicsOptions\r\n ) {\r\n super(_xrSessionManager);\r\n if (!this._options.physicsProperties) {\r\n this._options.physicsProperties = {};\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n * enable debugging - will show console outputs and the impostor mesh\r\n */\r\n public _enablePhysicsDebug() {\r\n this._debugMode = true;\r\n const keys = Object.keys(this._controllers);\r\n for (const controllerId of keys) {\r\n const controllerData = this._controllers[controllerId];\r\n if (controllerData.impostorMesh) {\r\n controllerData.impostorMesh.isVisible = true;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Manually add a controller (if no xrInput was provided or physics engine was not enabled)\r\n * @param xrController the controller to add\r\n */\r\n public addController(xrController: WebXRInputSource) {\r\n this._attachController(xrController);\r\n }\r\n\r\n /**\r\n * attach this feature\r\n * Will usually be called by the features manager\r\n *\r\n * @returns true if successful.\r\n */\r\n public override attach(): boolean {\r\n if (!super.attach()) {\r\n return false;\r\n }\r\n\r\n // Detect physics version\r\n const physicsEngine = this._xrSessionManager.scene.getPhysicsEngine();\r\n if (physicsEngine) {\r\n this._physicsVersion = (physicsEngine.getPluginVersion() as 1 | 2) || 1;\r\n } else {\r\n // Default to v1 if no physics engine (warning will be shown later)\r\n this._physicsVersion = 1;\r\n }\r\n\r\n if (!this._options.xrInput) {\r\n return true;\r\n }\r\n\r\n for (const controller of this._options.xrInput.controllers) {\r\n this._attachController(controller);\r\n }\r\n this._addNewAttachObserver(this._options.xrInput.onControllerAddedObservable, this._attachController);\r\n this._addNewAttachObserver(this._options.xrInput.onControllerRemovedObservable, (controller) => {\r\n // REMOVE the controller\r\n this._detachController(controller.uniqueId);\r\n });\r\n\r\n if (this._options.enableHeadsetImpostor) {\r\n if (this._physicsVersion === 2) {\r\n this._enableHeadsetPhysicsV2();\r\n } else {\r\n this._enableHeadsetPhysicsV1();\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * detach this feature.\r\n * Will usually be called by the features manager\r\n *\r\n * @returns true if successful.\r\n */\r\n public override detach(): boolean {\r\n if (!super.detach()) {\r\n return false;\r\n }\r\n\r\n const keys = Object.keys(this._controllers);\r\n for (const controllerId of keys) {\r\n this._detachController(controllerId);\r\n }\r\n\r\n if (this._headsetMesh) {\r\n this._headsetMesh.dispose();\r\n }\r\n\r\n // Dispose v2 aggregate if present\r\n if (this._headsetAggregateV2) {\r\n this._headsetAggregateV2.dispose();\r\n this._headsetAggregateV2 = undefined;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Get the headset impostor, if enabled\r\n * @returns the impostor\r\n */\r\n public getHeadsetImpostor() {\r\n return this._headsetImpostor;\r\n }\r\n\r\n /**\r\n * Get the physics impostor of a specific controller.\r\n * The impostor is not attached to a mesh because a mesh for each controller is not obligatory\r\n * @param controller the controller or the controller id of which to get the impostor\r\n * @returns the impostor or null\r\n */\r\n public getImpostorForController(controller: WebXRInputSource | string): Nullable<PhysicsImpostor> {\r\n const id = typeof controller === \"string\" ? controller : controller.uniqueId;\r\n if (this._controllers[id]) {\r\n return this._controllers[id].impostor || null;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Get the physics aggregate for a controller (v2 only)\r\n * @param controller the controller or the controller id\r\n * @returns the aggregate or null\r\n */\r\n public getPhysicsAggregateForController(controller: WebXRInputSource | string): Nullable<PhysicsAggregate> {\r\n const id = typeof controller === \"string\" ? controller : controller.uniqueId;\r\n if (this._controllers[id]) {\r\n return this._controllers[id].physicsAggregate || null;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Get the physics body for a controller (v2 only)\r\n * @param controller the controller or the controller id\r\n * @returns the physics body or null\r\n */\r\n public getPhysicsBodyForController(controller: WebXRInputSource | string): Nullable<PhysicsBody> {\r\n const id = typeof controller === \"string\" ? controller : controller.uniqueId;\r\n if (this._controllers[id]) {\r\n return this._controllers[id].physicsBody || null;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Get the headset physics aggregate (v2 only)\r\n * @returns the physics aggregate or null\r\n */\r\n public getHeadsetPhysicsAggregate(): Nullable<PhysicsAggregate> {\r\n return this._headsetAggregateV2 || null;\r\n }\r\n\r\n /**\r\n * Update the physics properties provided in the constructor\r\n * @param newProperties the new properties object\r\n * @param newProperties.impostorType\r\n * @param newProperties.impostorSize\r\n * @param newProperties.friction\r\n * @param newProperties.restitution\r\n */\r\n public setPhysicsProperties(newProperties: {\r\n impostorType?: number;\r\n impostorSize?: number | { width: number; height: number; depth: number };\r\n friction?: number;\r\n restitution?: number;\r\n }) {\r\n this._options.physicsProperties = {\r\n ...this._options.physicsProperties,\r\n ...newProperties,\r\n };\r\n }\r\n\r\n protected _onXRFrame(_xrFrame: any): void {\r\n this._delta = this._xrSessionManager.currentTimestamp - this._lastTimestamp;\r\n this._lastTimestamp = this._xrSessionManager.currentTimestamp;\r\n\r\n if (this._physicsVersion === 2) {\r\n this._onXRFrameV2();\r\n } else {\r\n this._onXRFrameV1();\r\n }\r\n }\r\n\r\n private _onXRFrameV1(): void {\r\n if (this._headsetMesh && this._headsetImpostor) {\r\n this._headsetMesh.position.copyFrom(this._options.xrInput.xrCamera.globalPosition);\r\n this._headsetMesh.rotationQuaternion!.copyFrom(this._options.xrInput.xrCamera.absoluteRotation);\r\n if (this._options.xrInput.xrCamera._lastXRViewerPose?.linearVelocity) {\r\n const lv = this._options.xrInput.xrCamera._lastXRViewerPose.linearVelocity;\r\n this._tmpVector.set(lv.x, lv.y, lv.z);\r\n this._headsetImpostor.setLinearVelocity(this._tmpVector);\r\n }\r\n if (this._options.xrInput.xrCamera._lastXRViewerPose?.angularVelocity) {\r\n const av = this._options.xrInput.xrCamera._lastXRViewerPose.angularVelocity;\r\n this._tmpVector.set(av.x, av.y, av.z);\r\n this._headsetImpostor.setAngularVelocity(this._tmpVector);\r\n }\r\n }\r\n const keys = Object.keys(this._controllers);\r\n for (const controllerId of keys) {\r\n const controllerData = this._controllers[controllerId];\r\n const controllerMesh = controllerData.xrController.grip || controllerData.xrController.pointer;\r\n const comparedPosition = controllerData.oldPos || controllerData.impostorMesh!.position;\r\n if (controllerData.xrController._lastXRPose?.linearVelocity) {\r\n const lv = controllerData.xrController._lastXRPose.linearVelocity;\r\n this._tmpVector.set(lv.x, lv.y, lv.z);\r\n controllerData.impostor!.setLinearVelocity(this._tmpVector);\r\n } else {\r\n controllerMesh.position.subtractToRef(comparedPosition, this._tmpVector);\r\n this._tmpVector.scaleInPlace(1000 / this._delta);\r\n controllerData.impostor!.setLinearVelocity(this._tmpVector);\r\n }\r\n comparedPosition.copyFrom(controllerMesh.position);\r\n if (this._debugMode) {\r\n Logger.Log([this._tmpVector, \"linear\"]);\r\n }\r\n\r\n const comparedQuaternion = controllerData.oldRotation || controllerData.impostorMesh!.rotationQuaternion!;\r\n if (controllerData.xrController._lastXRPose?.angularVelocity) {\r\n const av = controllerData.xrController._lastXRPose.angularVelocity;\r\n this._tmpVector.set(av.x, av.y, av.z);\r\n controllerData.impostor!.setAngularVelocity(this._tmpVector);\r\n } else {\r\n if (!comparedQuaternion.equalsWithEpsilon(controllerMesh.rotationQuaternion!)) {\r\n // roughly based on this - https://www.gamedev.net/forums/topic/347752-quaternion-and-angular-velocity/\r\n comparedQuaternion.conjugateInPlace().multiplyToRef(controllerMesh.rotationQuaternion!, this._tmpQuaternion);\r\n const len = Math.sqrt(\r\n this._tmpQuaternion.x * this._tmpQuaternion.x + this._tmpQuaternion.y * this._tmpQuaternion.y + this._tmpQuaternion.z * this._tmpQuaternion.z\r\n );\r\n this._tmpVector.set(this._tmpQuaternion.x, this._tmpQuaternion.y, this._tmpQuaternion.z);\r\n // define a better epsilon\r\n if (len < 0.001) {\r\n this._tmpVector.scaleInPlace(2);\r\n } else {\r\n const angle = 2 * Math.atan2(len, this._tmpQuaternion.w);\r\n this._tmpVector.scaleInPlace(angle / (len * (this._delta / 1000)));\r\n }\r\n controllerData.impostor!.setAngularVelocity(this._tmpVector);\r\n }\r\n }\r\n comparedQuaternion.copyFrom(controllerMesh.rotationQuaternion!);\r\n if (this._debugMode) {\r\n Logger.Log([this._tmpVector, this._tmpQuaternion, \"angular\"]);\r\n }\r\n }\r\n }\r\n\r\n private _onXRFrameV2(): void {\r\n if (this._headsetMesh && this._headsetAggregateV2) {\r\n this._headsetMesh.position.copyFrom(this._options.xrInput.xrCamera.globalPosition);\r\n this._headsetMesh.rotationQuaternion!.copyFrom(this._options.xrInput.xrCamera.absoluteRotation);\r\n if (this._options.xrInput.xrCamera._lastXRViewerPose?.linearVelocity) {\r\n const lv = this._options.xrInput.xrCamera._lastXRViewerPose.linearVelocity;\r\n this._tmpVector.set(lv.x, lv.y, lv.z);\r\n this._headsetAggregateV2.body.setLinearVelocity(this._tmpVector);\r\n }\r\n if (this._options.xrInput.xrCamera._lastXRViewerPose?.angularVelocity) {\r\n const av = this._options.xrInput.xrCamera._lastXRViewerPose.angularVelocity;\r\n this._tmpVector.set(av.x, av.y, av.z);\r\n this._headsetAggregateV2.body.setAngularVelocity(this._tmpVector);\r\n }\r\n }\r\n const keys = Object.keys(this._controllers);\r\n for (const controllerId of keys) {\r\n const controllerData = this._controllers[controllerId];\r\n if (!controllerData.isPhysicsV2) {\r\n continue;\r\n }\r\n\r\n const controllerMesh = controllerData.xrController.grip || controllerData.xrController.pointer;\r\n const comparedPosition = controllerData.oldPos || controllerData.impostorMesh!.position;\r\n if (controllerData.xrController._lastXRPose?.linearVelocity) {\r\n const lv = controllerData.xrController._lastXRPose.linearVelocity;\r\n this._tmpVector.set(lv.x, lv.y, lv.z);\r\n controllerData.physicsBody!.setLinearVelocity(this._tmpVector);\r\n } else {\r\n controllerMesh.position.subtractToRef(comparedPosition, this._tmpVector);\r\n this._tmpVector.scaleInPlace(1000 / this._delta);\r\n controllerData.physicsBody!.setLinearVelocity(this._tmpVector);\r\n }\r\n comparedPosition.copyFrom(controllerMesh.position);\r\n if (this._debugMode) {\r\n Logger.Log([this._tmpVector, \"linear\"]);\r\n }\r\n\r\n const comparedQuaternion = controllerData.oldRotation || controllerData.impostorMesh!.rotationQuaternion!;\r\n if (controllerData.xrController._lastXRPose?.angularVelocity) {\r\n const av = controllerData.xrController._lastXRPose.angularVelocity;\r\n this._tmpVector.set(av.x, av.y, av.z);\r\n controllerData.physicsBody!.setAngularVelocity(this._tmpVector);\r\n } else {\r\n if (!comparedQuaternion.equalsWithEpsilon(controllerMesh.rotationQuaternion!)) {\r\n // roughly based on this - https://www.gamedev.net/forums/topic/347752-quaternion-and-angular-velocity/\r\n comparedQuaternion.conjugateInPlace().multiplyToRef(controllerMesh.rotationQuaternion!, this._tmpQuaternion);\r\n const len = Math.sqrt(\r\n this._tmpQuaternion.x * this._tmpQuaternion.x + this._tmpQuaternion.y * this._tmpQuaternion.y + this._tmpQuaternion.z * this._tmpQuaternion.z\r\n );\r\n this._tmpVector.set(this._tmpQuaternion.x, this._tmpQuaternion.y, this._tmpQuaternion.z);\r\n // define a better epsilon\r\n if (len < 0.001) {\r\n this._tmpVector.scaleInPlace(2);\r\n } else {\r\n const angle = 2 * Math.atan2(len, this._tmpQuaternion.w);\r\n this._tmpVector.scaleInPlace(angle / (len * (this._delta / 1000)));\r\n }\r\n controllerData.physicsBody!.setAngularVelocity(this._tmpVector);\r\n }\r\n }\r\n comparedQuaternion.copyFrom(controllerMesh.rotationQuaternion!);\r\n if (this._debugMode) {\r\n Logger.Log([this._tmpVector, this._tmpQuaternion, \"angular\"]);\r\n }\r\n }\r\n }\r\n\r\n private _enableHeadsetPhysicsV1(): void {\r\n const params = this._options.headsetImpostorParams || {\r\n impostorType: PhysicsImpostor.SphereImpostor,\r\n restitution: 0.8,\r\n impostorSize: 0.3,\r\n };\r\n const impostorSize = params.impostorSize || 0.3;\r\n this._headsetMesh = CreateSphere(\"headset-mesh\", {\r\n diameterX: typeof impostorSize === \"number\" ? impostorSize : impostorSize.width,\r\n diameterY: typeof impostorSize === \"number\" ? impostorSize : impostorSize.height,\r\n diameterZ: typeof impostorSize === \"number\" ? impostorSize : impostorSize.depth,\r\n });\r\n this._headsetMesh.rotationQuaternion = new Quaternion();\r\n this._headsetMesh.isVisible = false;\r\n this._headsetImpostor = new PhysicsImpostor(this._headsetMesh, params.impostorType, { mass: 0, ...params });\r\n }\r\n\r\n private _enableHeadsetPhysicsV2(): void {\r\n const params = this._options.headsetImpostorParams || {\r\n impostorType: PhysicsImpostor.SphereImpostor,\r\n restitution: 0.8,\r\n impostorSize: 0.3,\r\n };\r\n const impostorSize = params.impostorSize || 0.3;\r\n this._headsetMesh = CreateSphere(\"headset-mesh\", {\r\n diameterX: typeof impostorSize === \"number\" ? impostorSize : impostorSize.width,\r\n diameterY: typeof impostorSize === \"number\" ? impostorSize : impostorSize.height,\r\n diameterZ: typeof impostorSize === \"number\" ? impostorSize : impostorSize.depth,\r\n });\r\n this._headsetMesh.rotationQuaternion = new Quaternion();\r\n this._headsetMesh.isVisible = false;\r\n\r\n const shapeType = this._mapImpostorTypeToShapeType(params.impostorType);\r\n this._headsetAggregateV2 = new PhysicsAggregate(\r\n this._headsetMesh,\r\n shapeType,\r\n {\r\n mass: 0,\r\n friction: params.friction ?? 0.2,\r\n restitution: params.restitution ?? 0.8,\r\n },\r\n this._xrSessionManager.scene\r\n );\r\n\r\n this._headsetAggregateV2.body.setMotionType(PhysicsMotionType.ANIMATED);\r\n this._headsetAggregateV2.body.disableSync = true;\r\n }\r\n\r\n private _detachController(xrControllerUniqueId: string) {\r\n const controllerData = this._controllers[xrControllerUniqueId];\r\n if (!controllerData) {\r\n return;\r\n }\r\n if (controllerData.impostorMesh) {\r\n controllerData.impostorMesh.dispose();\r\n }\r\n\r\n // Dispose v2 aggregate if present\r\n if (controllerData.physicsAggregate) {\r\n controllerData.physicsAggregate.dispose();\r\n }\r\n\r\n // remove from the map\r\n delete this._controllers[xrControllerUniqueId];\r\n }\r\n}\r\n\r\n//register the plugin\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRControllerPhysics.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRControllerPhysics(xrSessionManager, options);\r\n },\r\n WebXRControllerPhysics.Version,\r\n true\r\n);\r\n"]}
|
|
1
|
+
{"version":3,"file":"WebXRControllerPhysics.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRControllerPhysics.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport { Vector3, Quaternion } from \"../../Maths/math.vector\";\r\nimport type { WebXRInputSource } from \"../webXRInputSource\";\r\nimport { PhysicsImpostor } from \"../../Physics/v1/physicsImpostor\";\r\nimport type { WebXRInput } from \"../webXRInput\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport { CreateSphere } from \"../../Meshes/Builders/sphereBuilder\";\r\nimport { WebXRFeatureName, WebXRFeaturesManager } from \"../webXRFeaturesManager\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { PhysicsAggregate } from \"../../Physics/v2/physicsAggregate\";\r\nimport type { PhysicsBody } from \"../../Physics/v2/physicsBody\";\r\nimport { PhysicsMotionType, PhysicsShapeType } from \"../../Physics/v2/IPhysicsEnginePlugin\";\r\n\r\nimport \"../../Physics/joinedPhysicsEngineComponent\";\r\n\r\n/**\r\n * Options for the controller physics feature\r\n */\r\nexport class IWebXRControllerPhysicsOptions {\r\n /**\r\n * Should the headset get its own impostor\r\n */\r\n enableHeadsetImpostor?: boolean;\r\n /**\r\n * Optional parameters for the headset impostor\r\n */\r\n headsetImpostorParams?: {\r\n /**\r\n * The type of impostor to create. Default is sphere\r\n */\r\n impostorType: number;\r\n /**\r\n * the size of the impostor. Defaults to 10cm\r\n */\r\n impostorSize?: number | { width: number; height: number; depth: number };\r\n /**\r\n * Friction definitions\r\n */\r\n friction?: number;\r\n /**\r\n * Restitution\r\n */\r\n restitution?: number;\r\n };\r\n /**\r\n * The physics properties of the future impostors\r\n */\r\n physicsProperties?: {\r\n /**\r\n * If set to true, a mesh impostor will be created when the controller mesh was loaded\r\n * Note that this requires a physics engine that supports mesh impostors!\r\n */\r\n useControllerMesh?: boolean;\r\n /**\r\n * The type of impostor to create. Default is sphere\r\n */\r\n impostorType?: number;\r\n /**\r\n * the size of the impostor. Defaults to 10cm\r\n */\r\n impostorSize?: number | { width: number; height: number; depth: number };\r\n /**\r\n * Friction definitions\r\n */\r\n friction?: number;\r\n /**\r\n * Restitution\r\n */\r\n restitution?: number;\r\n };\r\n /**\r\n * the xr input to use with this pointer selection\r\n */\r\n public xrInput: WebXRInput;\r\n}\r\n\r\n/**\r\n * Add physics impostor to your webxr controllers,\r\n * including naive calculation of their linear and angular velocity\r\n */\r\nexport class WebXRControllerPhysics extends WebXRAbstractFeature {\r\n private _attachController = (xrController: WebXRInputSource) => {\r\n if (this._controllers[xrController.uniqueId]) {\r\n // already attached\r\n return;\r\n }\r\n if (!this._xrSessionManager.scene.isPhysicsEnabled()) {\r\n Logger.Warn(\"physics engine not enabled, skipped. Please add this controller manually.\");\r\n }\r\n\r\n if (this._physicsVersion === 2) {\r\n this._attachControllerV2(xrController);\r\n } else {\r\n this._attachControllerV1(xrController);\r\n }\r\n };\r\n\r\n private _attachControllerV1 = (xrController: WebXRInputSource) => {\r\n // if no motion controller available, create impostors!\r\n if (this._options.physicsProperties!.useControllerMesh && xrController.inputSource.gamepad) {\r\n xrController.onMotionControllerInitObservable.addOnce((motionController) => {\r\n if (!motionController._doNotLoadControllerMesh) {\r\n motionController.onModelLoadedObservable.addOnce(() => {\r\n const impostor = new PhysicsImpostor(motionController.rootMesh!, PhysicsImpostor.MeshImpostor, {\r\n mass: 0,\r\n ...this._options.physicsProperties,\r\n });\r\n\r\n const controllerMesh = xrController.grip || xrController.pointer;\r\n this._controllers[xrController.uniqueId] = {\r\n xrController,\r\n impostor,\r\n oldPos: controllerMesh.position.clone(),\r\n oldRotation: controllerMesh.rotationQuaternion!.clone(),\r\n };\r\n });\r\n } else {\r\n // This controller isn't using a model, create impostors instead\r\n this._createPhysicsImpostor(xrController);\r\n }\r\n });\r\n } else {\r\n this._createPhysicsImpostor(xrController);\r\n }\r\n };\r\n\r\n private _attachControllerV2 = (xrController: WebXRInputSource) => {\r\n // if no motion controller available, create physics aggregates!\r\n if (this._options.physicsProperties!.useControllerMesh && xrController.inputSource.gamepad) {\r\n xrController.onMotionControllerInitObservable.addOnce((motionController) => {\r\n if (!motionController._doNotLoadControllerMesh) {\r\n motionController.onModelLoadedObservable.addOnce(() => {\r\n const shapeType = this._mapImpostorTypeToShapeType(PhysicsImpostor.MeshImpostor);\r\n const aggregate = new PhysicsAggregate(\r\n motionController.rootMesh!,\r\n shapeType,\r\n {\r\n mass: 0,\r\n friction: this._options.physicsProperties?.friction ?? 0.2,\r\n restitution: this._options.physicsProperties?.restitution ?? 0.2,\r\n },\r\n this._xrSessionManager.scene\r\n );\r\n\r\n aggregate.body.setMotionType(PhysicsMotionType.ANIMATED);\r\n aggregate.body.disableSync = true;\r\n\r\n const controllerMesh = xrController.grip || xrController.pointer;\r\n this._controllers[xrController.uniqueId] = {\r\n xrController,\r\n physicsAggregate: aggregate,\r\n physicsBody: aggregate.body,\r\n isPhysicsV2: true,\r\n oldPos: controllerMesh.position.clone(),\r\n oldRotation: controllerMesh.rotationQuaternion!.clone(),\r\n };\r\n });\r\n } else {\r\n // This controller isn't using a model, create physics aggregate instead\r\n this._createPhysicsAggregate(xrController);\r\n }\r\n });\r\n } else {\r\n this._createPhysicsAggregate(xrController);\r\n }\r\n };\r\n\r\n private _mapImpostorTypeToShapeType(impostorType: number): PhysicsShapeType {\r\n // Map v1 PhysicsImpostor types to v2 PhysicsShapeType\r\n switch (impostorType) {\r\n case PhysicsImpostor.SphereImpostor:\r\n return PhysicsShapeType.SPHERE;\r\n case PhysicsImpostor.BoxImpostor:\r\n return PhysicsShapeType.BOX;\r\n case PhysicsImpostor.CapsuleImpostor:\r\n return PhysicsShapeType.CAPSULE;\r\n case PhysicsImpostor.CylinderImpostor:\r\n return PhysicsShapeType.CYLINDER;\r\n case PhysicsImpostor.MeshImpostor:\r\n return PhysicsShapeType.MESH;\r\n case PhysicsImpostor.ConvexHullImpostor:\r\n return PhysicsShapeType.CONVEX_HULL;\r\n default:\r\n Logger.Warn(`Unsupported impostor type ${impostorType} for v2 physics, defaulting to SPHERE`);\r\n return PhysicsShapeType.SPHERE;\r\n }\r\n }\r\n\r\n private _createPhysicsImpostor(xrController: WebXRInputSource) {\r\n const impostorType: number = this._options.physicsProperties!.impostorType || PhysicsImpostor.SphereImpostor;\r\n const impostorSize: number | { width: number; height: number; depth: number } = this._options.physicsProperties!.impostorSize || 0.1;\r\n const impostorMesh = CreateSphere(\"impostor-mesh-\" + xrController.uniqueId, {\r\n diameterX: typeof impostorSize === \"number\" ? impostorSize : impostorSize.width,\r\n diameterY: typeof impostorSize === \"number\" ? impostorSize : impostorSize.height,\r\n diameterZ: typeof impostorSize === \"number\" ? impostorSize : impostorSize.depth,\r\n });\r\n impostorMesh.isVisible = this._debugMode;\r\n impostorMesh.isPickable = false;\r\n impostorMesh.rotationQuaternion = new Quaternion();\r\n const controllerMesh = xrController.grip || xrController.pointer;\r\n impostorMesh.position.copyFrom(controllerMesh.position);\r\n impostorMesh.rotationQuaternion.copyFrom(controllerMesh.rotationQuaternion!);\r\n const impostor = new PhysicsImpostor(impostorMesh, impostorType, {\r\n mass: 0,\r\n ...this._options.physicsProperties,\r\n });\r\n this._controllers[xrController.uniqueId] = {\r\n xrController,\r\n impostor,\r\n impostorMesh,\r\n };\r\n }\r\n\r\n private _createPhysicsAggregate(xrController: WebXRInputSource) {\r\n const impostorType: number = this._options.physicsProperties!.impostorType || PhysicsImpostor.SphereImpostor;\r\n const impostorSize: number | { width: number; height: number; depth: number } = this._options.physicsProperties!.impostorSize || 0.1;\r\n const impostorMesh = CreateSphere(\"impostor-mesh-\" + xrController.uniqueId, {\r\n diameterX: typeof impostorSize === \"number\" ? impostorSize : impostorSize.width,\r\n diameterY: typeof impostorSize === \"number\" ? impostorSize : impostorSize.height,\r\n diameterZ: typeof impostorSize === \"number\" ? impostorSize : impostorSize.depth,\r\n });\r\n impostorMesh.isVisible = this._debugMode;\r\n impostorMesh.isPickable = false;\r\n impostorMesh.rotationQuaternion = new Quaternion();\r\n const controllerMesh = xrController.grip || xrController.pointer;\r\n impostorMesh.position.copyFrom(controllerMesh.position);\r\n impostorMesh.rotationQuaternion.copyFrom(controllerMesh.rotationQuaternion!);\r\n\r\n const shapeType = this._mapImpostorTypeToShapeType(impostorType);\r\n const aggregate = new PhysicsAggregate(\r\n impostorMesh,\r\n shapeType,\r\n {\r\n mass: 0,\r\n friction: this._options.physicsProperties?.friction ?? 0.2,\r\n restitution: this._options.physicsProperties?.restitution ?? 0.2,\r\n },\r\n this._xrSessionManager.scene\r\n );\r\n\r\n aggregate.body.setMotionType(PhysicsMotionType.ANIMATED);\r\n aggregate.body.disableSync = true;\r\n\r\n this._controllers[xrController.uniqueId] = {\r\n xrController,\r\n physicsAggregate: aggregate,\r\n physicsBody: aggregate.body,\r\n isPhysicsV2: true,\r\n impostorMesh,\r\n };\r\n }\r\n\r\n private _controllers: {\r\n [id: string]: {\r\n xrController: WebXRInputSource;\r\n impostorMesh?: AbstractMesh;\r\n impostor?: PhysicsImpostor;\r\n physicsAggregate?: PhysicsAggregate;\r\n physicsBody?: PhysicsBody;\r\n isPhysicsV2?: boolean;\r\n oldPos?: Vector3;\r\n oldSpeed?: Vector3;\r\n oldRotation?: Quaternion;\r\n };\r\n } = {};\r\n private _debugMode = false;\r\n private _delta: number = 0;\r\n private _headsetImpostor?: PhysicsImpostor;\r\n private _headsetMesh?: AbstractMesh;\r\n private _headsetAggregateV2?: PhysicsAggregate;\r\n private _lastTimestamp: number = 0;\r\n private _physicsVersion: 1 | 2 = 1;\r\n private _tmpQuaternion: Quaternion = new Quaternion();\r\n private _tmpVector: Vector3 = new Vector3();\r\n\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.PHYSICS_CONTROLLERS;\r\n /**\r\n * The (Babylon) version of this module.\r\n * This is an integer representing the implementation version.\r\n * This number does not correspond to the webxr specs version\r\n */\r\n public static readonly Version = 2;\r\n\r\n /**\r\n * Construct a new Controller Physics Feature\r\n * @param _xrSessionManager the corresponding xr session manager\r\n * @param _options options to create this feature with\r\n */\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n private readonly _options: IWebXRControllerPhysicsOptions\r\n ) {\r\n super(_xrSessionManager);\r\n if (!this._options.physicsProperties) {\r\n this._options.physicsProperties = {};\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n * enable debugging - will show console outputs and the impostor mesh\r\n */\r\n public _enablePhysicsDebug() {\r\n this._debugMode = true;\r\n const keys = Object.keys(this._controllers);\r\n for (const controllerId of keys) {\r\n const controllerData = this._controllers[controllerId];\r\n if (controllerData.impostorMesh) {\r\n controllerData.impostorMesh.isVisible = true;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Manually add a controller (if no xrInput was provided or physics engine was not enabled)\r\n * @param xrController the controller to add\r\n */\r\n public addController(xrController: WebXRInputSource) {\r\n this._attachController(xrController);\r\n }\r\n\r\n /**\r\n * attach this feature\r\n * Will usually be called by the features manager\r\n *\r\n * @returns true if successful.\r\n */\r\n public override attach(): boolean {\r\n if (!super.attach()) {\r\n return false;\r\n }\r\n\r\n // Detect physics version\r\n const physicsEngine = this._xrSessionManager.scene.getPhysicsEngine();\r\n if (physicsEngine) {\r\n this._physicsVersion = (physicsEngine.getPluginVersion() as 1 | 2) || 1;\r\n } else {\r\n // Default to v1 if no physics engine (warning will be shown later)\r\n this._physicsVersion = 1;\r\n }\r\n\r\n if (!this._options.xrInput) {\r\n return true;\r\n }\r\n\r\n for (const controller of this._options.xrInput.controllers) {\r\n this._attachController(controller);\r\n }\r\n this._addNewAttachObserver(this._options.xrInput.onControllerAddedObservable, this._attachController);\r\n this._addNewAttachObserver(this._options.xrInput.onControllerRemovedObservable, (controller) => {\r\n // REMOVE the controller\r\n this._detachController(controller.uniqueId);\r\n });\r\n\r\n if (this._options.enableHeadsetImpostor) {\r\n if (this._physicsVersion === 2) {\r\n this._enableHeadsetPhysicsV2();\r\n } else {\r\n this._enableHeadsetPhysicsV1();\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * detach this feature.\r\n * Will usually be called by the features manager\r\n *\r\n * @returns true if successful.\r\n */\r\n public override detach(): boolean {\r\n if (!super.detach()) {\r\n return false;\r\n }\r\n\r\n const keys = Object.keys(this._controllers);\r\n for (const controllerId of keys) {\r\n this._detachController(controllerId);\r\n }\r\n\r\n if (this._headsetMesh) {\r\n this._headsetMesh.dispose();\r\n }\r\n\r\n // Dispose v2 aggregate if present\r\n if (this._headsetAggregateV2) {\r\n this._headsetAggregateV2.dispose();\r\n this._headsetAggregateV2 = undefined;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Get the headset impostor, if enabled\r\n * @returns the impostor\r\n */\r\n public getHeadsetImpostor() {\r\n return this._headsetImpostor;\r\n }\r\n\r\n /**\r\n * Get the physics impostor of a specific controller.\r\n * The impostor is not attached to a mesh because a mesh for each controller is not obligatory\r\n * @param controller the controller or the controller id of which to get the impostor\r\n * @returns the impostor or null\r\n */\r\n public getImpostorForController(controller: WebXRInputSource | string): Nullable<PhysicsImpostor> {\r\n const id = typeof controller === \"string\" ? controller : controller.uniqueId;\r\n if (this._controllers[id]) {\r\n return this._controllers[id].impostor || null;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Get the physics aggregate for a controller (v2 only)\r\n * @param controller the controller or the controller id\r\n * @returns the aggregate or null\r\n */\r\n public getPhysicsAggregateForController(controller: WebXRInputSource | string): Nullable<PhysicsAggregate> {\r\n const id = typeof controller === \"string\" ? controller : controller.uniqueId;\r\n if (this._controllers[id]) {\r\n return this._controllers[id].physicsAggregate || null;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Get the physics body for a controller (v2 only)\r\n * @param controller the controller or the controller id\r\n * @returns the physics body or null\r\n */\r\n public getPhysicsBodyForController(controller: WebXRInputSource | string): Nullable<PhysicsBody> {\r\n const id = typeof controller === \"string\" ? controller : controller.uniqueId;\r\n if (this._controllers[id]) {\r\n return this._controllers[id].physicsBody || null;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Get the headset physics aggregate (v2 only)\r\n * @returns the physics aggregate or null\r\n */\r\n public getHeadsetPhysicsAggregate(): Nullable<PhysicsAggregate> {\r\n return this._headsetAggregateV2 || null;\r\n }\r\n\r\n /**\r\n * Update the physics properties provided in the constructor\r\n * @param newProperties the new properties object\r\n * @param newProperties.impostorType\r\n * @param newProperties.impostorSize\r\n * @param newProperties.friction\r\n * @param newProperties.restitution\r\n */\r\n public setPhysicsProperties(newProperties: {\r\n impostorType?: number;\r\n impostorSize?: number | { width: number; height: number; depth: number };\r\n friction?: number;\r\n restitution?: number;\r\n }) {\r\n this._options.physicsProperties = {\r\n ...this._options.physicsProperties,\r\n ...newProperties,\r\n };\r\n }\r\n\r\n protected _onXRFrame(_xrFrame: any): void {\r\n this._delta = this._xrSessionManager.currentTimestamp - this._lastTimestamp;\r\n this._lastTimestamp = this._xrSessionManager.currentTimestamp;\r\n\r\n if (this._physicsVersion === 2) {\r\n this._onXRFrameV2();\r\n } else {\r\n this._onXRFrameV1();\r\n }\r\n }\r\n\r\n private _onXRFrameV1(): void {\r\n if (this._headsetMesh && this._headsetImpostor) {\r\n this._headsetMesh.position.copyFrom(this._options.xrInput.xrCamera.globalPosition);\r\n this._headsetMesh.rotationQuaternion!.copyFrom(this._options.xrInput.xrCamera.absoluteRotation);\r\n if (this._options.xrInput.xrCamera._lastXRViewerPose?.linearVelocity) {\r\n const lv = this._options.xrInput.xrCamera._lastXRViewerPose.linearVelocity;\r\n this._tmpVector.set(lv.x, lv.y, lv.z);\r\n this._headsetImpostor.setLinearVelocity(this._tmpVector);\r\n }\r\n if (this._options.xrInput.xrCamera._lastXRViewerPose?.angularVelocity) {\r\n const av = this._options.xrInput.xrCamera._lastXRViewerPose.angularVelocity;\r\n this._tmpVector.set(av.x, av.y, av.z);\r\n this._headsetImpostor.setAngularVelocity(this._tmpVector);\r\n }\r\n }\r\n const keys = Object.keys(this._controllers);\r\n for (const controllerId of keys) {\r\n const controllerData = this._controllers[controllerId];\r\n const controllerMesh = controllerData.xrController.grip || controllerData.xrController.pointer;\r\n const comparedPosition = controllerData.oldPos || controllerData.impostorMesh!.position;\r\n if (controllerData.xrController._lastXRPose?.linearVelocity) {\r\n const lv = controllerData.xrController._lastXRPose.linearVelocity;\r\n this._tmpVector.set(lv.x, lv.y, lv.z);\r\n controllerData.impostor!.setLinearVelocity(this._tmpVector);\r\n } else {\r\n controllerMesh.position.subtractToRef(comparedPosition, this._tmpVector);\r\n this._tmpVector.scaleInPlace(1000 / this._delta);\r\n controllerData.impostor!.setLinearVelocity(this._tmpVector);\r\n }\r\n comparedPosition.copyFrom(controllerMesh.position);\r\n if (this._debugMode) {\r\n Logger.Log([this._tmpVector, \"linear\"]);\r\n }\r\n\r\n const comparedQuaternion = controllerData.oldRotation || controllerData.impostorMesh!.rotationQuaternion!;\r\n if (controllerData.xrController._lastXRPose?.angularVelocity) {\r\n const av = controllerData.xrController._lastXRPose.angularVelocity;\r\n this._tmpVector.set(av.x, av.y, av.z);\r\n controllerData.impostor!.setAngularVelocity(this._tmpVector);\r\n } else {\r\n if (!comparedQuaternion.equalsWithEpsilon(controllerMesh.rotationQuaternion!)) {\r\n // roughly based on this - https://www.gamedev.net/forums/topic/347752-quaternion-and-angular-velocity/\r\n comparedQuaternion.conjugateInPlace().multiplyToRef(controllerMesh.rotationQuaternion!, this._tmpQuaternion);\r\n const len = Math.sqrt(\r\n this._tmpQuaternion.x * this._tmpQuaternion.x + this._tmpQuaternion.y * this._tmpQuaternion.y + this._tmpQuaternion.z * this._tmpQuaternion.z\r\n );\r\n this._tmpVector.set(this._tmpQuaternion.x, this._tmpQuaternion.y, this._tmpQuaternion.z);\r\n // define a better epsilon\r\n if (len < 0.001) {\r\n this._tmpVector.scaleInPlace(2);\r\n } else {\r\n const angle = 2 * Math.atan2(len, this._tmpQuaternion.w);\r\n this._tmpVector.scaleInPlace(angle / (len * (this._delta / 1000)));\r\n }\r\n controllerData.impostor!.setAngularVelocity(this._tmpVector);\r\n }\r\n }\r\n comparedQuaternion.copyFrom(controllerMesh.rotationQuaternion!);\r\n if (this._debugMode) {\r\n Logger.Log([this._tmpVector, this._tmpQuaternion, \"angular\"]);\r\n }\r\n }\r\n }\r\n\r\n private _onXRFrameV2(): void {\r\n if (this._headsetMesh && this._headsetAggregateV2) {\r\n this._headsetMesh.position.copyFrom(this._options.xrInput.xrCamera.globalPosition);\r\n this._headsetMesh.rotationQuaternion!.copyFrom(this._options.xrInput.xrCamera.absoluteRotation);\r\n if (this._options.xrInput.xrCamera._lastXRViewerPose?.linearVelocity) {\r\n const lv = this._options.xrInput.xrCamera._lastXRViewerPose.linearVelocity;\r\n this._tmpVector.set(lv.x, lv.y, lv.z);\r\n this._headsetAggregateV2.body.setLinearVelocity(this._tmpVector);\r\n }\r\n if (this._options.xrInput.xrCamera._lastXRViewerPose?.angularVelocity) {\r\n const av = this._options.xrInput.xrCamera._lastXRViewerPose.angularVelocity;\r\n this._tmpVector.set(av.x, av.y, av.z);\r\n this._headsetAggregateV2.body.setAngularVelocity(this._tmpVector);\r\n }\r\n }\r\n const keys = Object.keys(this._controllers);\r\n for (const controllerId of keys) {\r\n const controllerData = this._controllers[controllerId];\r\n if (!controllerData.isPhysicsV2) {\r\n continue;\r\n }\r\n\r\n const controllerMesh = controllerData.xrController.grip || controllerData.xrController.pointer;\r\n const comparedPosition = controllerData.oldPos || controllerData.impostorMesh!.position;\r\n if (controllerData.xrController._lastXRPose?.linearVelocity) {\r\n const lv = controllerData.xrController._lastXRPose.linearVelocity;\r\n this._tmpVector.set(lv.x, lv.y, lv.z);\r\n controllerData.physicsBody!.setLinearVelocity(this._tmpVector);\r\n } else {\r\n controllerMesh.position.subtractToRef(comparedPosition, this._tmpVector);\r\n this._tmpVector.scaleInPlace(1000 / this._delta);\r\n controllerData.physicsBody!.setLinearVelocity(this._tmpVector);\r\n }\r\n comparedPosition.copyFrom(controllerMesh.position);\r\n if (this._debugMode) {\r\n Logger.Log([this._tmpVector, \"linear\"]);\r\n }\r\n\r\n const comparedQuaternion = controllerData.oldRotation || controllerData.impostorMesh!.rotationQuaternion!;\r\n if (controllerData.xrController._lastXRPose?.angularVelocity) {\r\n const av = controllerData.xrController._lastXRPose.angularVelocity;\r\n this._tmpVector.set(av.x, av.y, av.z);\r\n controllerData.physicsBody!.setAngularVelocity(this._tmpVector);\r\n } else {\r\n if (!comparedQuaternion.equalsWithEpsilon(controllerMesh.rotationQuaternion!)) {\r\n // roughly based on this - https://www.gamedev.net/forums/topic/347752-quaternion-and-angular-velocity/\r\n comparedQuaternion.conjugateInPlace().multiplyToRef(controllerMesh.rotationQuaternion!, this._tmpQuaternion);\r\n const len = Math.sqrt(\r\n this._tmpQuaternion.x * this._tmpQuaternion.x + this._tmpQuaternion.y * this._tmpQuaternion.y + this._tmpQuaternion.z * this._tmpQuaternion.z\r\n );\r\n this._tmpVector.set(this._tmpQuaternion.x, this._tmpQuaternion.y, this._tmpQuaternion.z);\r\n // define a better epsilon\r\n if (len < 0.001) {\r\n this._tmpVector.scaleInPlace(2);\r\n } else {\r\n const angle = 2 * Math.atan2(len, this._tmpQuaternion.w);\r\n this._tmpVector.scaleInPlace(angle / (len * (this._delta / 1000)));\r\n }\r\n controllerData.physicsBody!.setAngularVelocity(this._tmpVector);\r\n }\r\n }\r\n comparedQuaternion.copyFrom(controllerMesh.rotationQuaternion!);\r\n if (this._debugMode) {\r\n Logger.Log([this._tmpVector, this._tmpQuaternion, \"angular\"]);\r\n }\r\n }\r\n }\r\n\r\n private _enableHeadsetPhysicsV1(): void {\r\n const params = this._options.headsetImpostorParams || {\r\n impostorType: PhysicsImpostor.SphereImpostor,\r\n restitution: 0.8,\r\n impostorSize: 0.3,\r\n };\r\n const impostorSize = params.impostorSize || 0.3;\r\n this._headsetMesh = CreateSphere(\"headset-mesh\", {\r\n diameterX: typeof impostorSize === \"number\" ? impostorSize : impostorSize.width,\r\n diameterY: typeof impostorSize === \"number\" ? impostorSize : impostorSize.height,\r\n diameterZ: typeof impostorSize === \"number\" ? impostorSize : impostorSize.depth,\r\n });\r\n this._headsetMesh.rotationQuaternion = new Quaternion();\r\n this._headsetMesh.isVisible = false;\r\n this._headsetImpostor = new PhysicsImpostor(this._headsetMesh, params.impostorType, { mass: 0, ...params });\r\n }\r\n\r\n private _enableHeadsetPhysicsV2(): void {\r\n const params = this._options.headsetImpostorParams || {\r\n impostorType: PhysicsImpostor.SphereImpostor,\r\n restitution: 0.8,\r\n impostorSize: 0.3,\r\n };\r\n const impostorSize = params.impostorSize || 0.3;\r\n this._headsetMesh = CreateSphere(\"headset-mesh\", {\r\n diameterX: typeof impostorSize === \"number\" ? impostorSize : impostorSize.width,\r\n diameterY: typeof impostorSize === \"number\" ? impostorSize : impostorSize.height,\r\n diameterZ: typeof impostorSize === \"number\" ? impostorSize : impostorSize.depth,\r\n });\r\n this._headsetMesh.rotationQuaternion = new Quaternion();\r\n this._headsetMesh.isVisible = false;\r\n\r\n const shapeType = this._mapImpostorTypeToShapeType(params.impostorType);\r\n this._headsetAggregateV2 = new PhysicsAggregate(\r\n this._headsetMesh,\r\n shapeType,\r\n {\r\n mass: 0,\r\n friction: params.friction ?? 0.2,\r\n restitution: params.restitution ?? 0.8,\r\n },\r\n this._xrSessionManager.scene\r\n );\r\n\r\n this._headsetAggregateV2.body.setMotionType(PhysicsMotionType.ANIMATED);\r\n this._headsetAggregateV2.body.disableSync = true;\r\n }\r\n\r\n private _detachController(xrControllerUniqueId: string) {\r\n const controllerData = this._controllers[xrControllerUniqueId];\r\n if (!controllerData) {\r\n return;\r\n }\r\n if (controllerData.impostorMesh) {\r\n controllerData.impostorMesh.dispose();\r\n }\r\n\r\n // Dispose v2 aggregate if present\r\n if (controllerData.physicsAggregate) {\r\n controllerData.physicsAggregate.dispose();\r\n }\r\n\r\n // remove from the map\r\n delete this._controllers[xrControllerUniqueId];\r\n }\r\n}\r\n\r\n//register the plugin\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRControllerPhysics.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRControllerPhysics(xrSessionManager, options);\r\n },\r\n WebXRControllerPhysics.Version,\r\n true\r\n);\r\n"]}
|
|
@@ -10,6 +10,7 @@ import { Observable } from "../../Misc/observable.js";
|
|
|
10
10
|
import type { InstancedMesh } from "../../Meshes/instancedMesh.js";
|
|
11
11
|
import { Color3 } from "../../Maths/math.color.js";
|
|
12
12
|
import type { WebXRCamera } from "../webXRCamera.js";
|
|
13
|
+
import "../../Physics/joinedPhysicsEngineComponent.js";
|
|
13
14
|
/**
|
|
14
15
|
* Configuration interface for the hand tracking feature
|
|
15
16
|
*/
|
|
@@ -14,6 +14,7 @@ import { TransformNode } from "../../Meshes/transformNode.js";
|
|
|
14
14
|
import { Axis } from "../../Maths/math.axis.js";
|
|
15
15
|
|
|
16
16
|
import { Tools } from "../../Misc/tools.js";
|
|
17
|
+
import "../../Physics/joinedPhysicsEngineComponent.js";
|
|
17
18
|
/**
|
|
18
19
|
* Parts of the hands divided to writs and finger names
|
|
19
20
|
*/
|