@babylonjs/core 7.11.2 → 7.11.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/animatable.d.ts +10 -10
- package/Animations/animatable.js +5 -5
- package/Animations/animatable.js.map +1 -1
- package/Animations/animationGroupMask.d.ts +2 -2
- package/Animations/animationGroupMask.js +1 -1
- package/Animations/animationGroupMask.js.map +1 -1
- package/Animations/easing.d.ts +2 -2
- package/Animations/easing.js +1 -1
- package/Animations/easing.js.map +1 -1
- package/Behaviors/Meshes/attachToBoxBehavior.d.ts +3 -3
- package/Behaviors/Meshes/attachToBoxBehavior.js +3 -3
- package/Behaviors/Meshes/attachToBoxBehavior.js.map +1 -1
- package/Cameras/Inputs/freeCameraMouseInput.d.ts +2 -2
- package/Cameras/Inputs/freeCameraMouseInput.js +1 -1
- package/Cameras/Inputs/freeCameraMouseInput.js.map +1 -1
- package/Cameras/Inputs/freeCameraTouchInput.d.ts +2 -2
- package/Cameras/Inputs/freeCameraTouchInput.js +1 -1
- package/Cameras/Inputs/freeCameraTouchInput.js.map +1 -1
- package/Compute/computeEffect.js +21 -3
- package/Compute/computeEffect.js.map +1 -1
- package/Culling/Helper/IBoundingInfoHelperPlatform.d.ts +8 -0
- package/Culling/Helper/IBoundingInfoHelperPlatform.js +2 -0
- package/Culling/Helper/IBoundingInfoHelperPlatform.js.map +1 -0
- package/Culling/Helper/boundingInfoHelper.d.ts +32 -0
- package/Culling/Helper/boundingInfoHelper.js +48 -0
- package/Culling/Helper/boundingInfoHelper.js.map +1 -0
- package/Culling/Helper/computeShaderBoundingHelper.d.ts +34 -0
- package/Culling/Helper/computeShaderBoundingHelper.js +209 -0
- package/Culling/Helper/computeShaderBoundingHelper.js.map +1 -0
- package/Culling/Helper/transformFeedbackBoundingHelper.d.ts +21 -0
- package/Culling/Helper/transformFeedbackBoundingHelper.js +197 -0
- package/Culling/Helper/transformFeedbackBoundingHelper.js.map +1 -0
- package/Culling/Octrees/octree.d.ts +2 -2
- package/Culling/Octrees/octree.js +1 -1
- package/Culling/Octrees/octree.js.map +1 -1
- package/Culling/index.d.ts +3 -0
- package/Culling/index.js +3 -0
- package/Culling/index.js.map +1 -1
- package/Culling/ray.d.ts +4 -4
- package/Culling/ray.js +2 -2
- package/Culling/ray.js.map +1 -1
- package/Debug/skeletonViewer.d.ts +6 -6
- package/Debug/skeletonViewer.js +3 -3
- package/Debug/skeletonViewer.js.map +1 -1
- package/DeviceInput/InputDevices/deviceSource.d.ts +2 -2
- package/DeviceInput/InputDevices/deviceSource.js +1 -1
- package/DeviceInput/InputDevices/deviceSource.js.map +1 -1
- package/Engines/Extensions/engine.transformFeedback.d.ts +5 -0
- package/Engines/Extensions/engine.transformFeedback.js +3 -0
- package/Engines/Extensions/engine.transformFeedback.js.map +1 -1
- package/Engines/Processors/shaderProcessingOptions.d.ts +1 -1
- package/Engines/Processors/shaderProcessingOptions.js.map +1 -1
- package/Engines/Processors/shaderProcessor.js +2 -2
- package/Engines/Processors/shaderProcessor.js.map +1 -1
- package/Engines/abstractEngine.js +2 -2
- package/Engines/abstractEngine.js.map +1 -1
- package/Engines/nativeEngine.d.ts +7 -0
- package/Engines/nativeEngine.js +4 -1
- package/Engines/nativeEngine.js.map +1 -1
- package/Maths/math.color.d.ts +14 -14
- package/Maths/math.color.js +7 -7
- package/Maths/math.color.js.map +1 -1
- package/Maths/math.isovector.d.ts +4 -4
- package/Maths/math.isovector.js +2 -2
- package/Maths/math.isovector.js.map +1 -1
- package/Maths/math.vector.d.ts +12 -12
- package/Maths/math.vector.js +6 -6
- package/Maths/math.vector.js.map +1 -1
- package/Maths/math.vertexFormat.d.ts +10 -10
- package/Maths/math.vertexFormat.js +5 -5
- package/Maths/math.vertexFormat.js.map +1 -1
- package/Meshes/abstractMesh.d.ts +7 -0
- package/Meshes/abstractMesh.js +17 -0
- package/Meshes/abstractMesh.js.map +1 -1
- package/Meshes/mesh.d.ts +4 -0
- package/Meshes/mesh.js +13 -4
- package/Meshes/mesh.js.map +1 -1
- package/Misc/observable.d.ts +6 -6
- package/Misc/observable.js +4 -4
- package/Misc/observable.js.map +1 -1
- package/Misc/sceneOptimizer.d.ts +3 -3
- package/Misc/sceneOptimizer.js +2 -2
- package/Misc/sceneOptimizer.js.map +1 -1
- package/Morph/morphTargetManager.d.ts +8 -4
- package/Morph/morphTargetManager.js +6 -3
- package/Morph/morphTargetManager.js.map +1 -1
- package/Particles/EmitterTypes/coneParticleEmitter.d.ts +2 -2
- package/Particles/EmitterTypes/coneParticleEmitter.js +1 -1
- package/Particles/EmitterTypes/coneParticleEmitter.js.map +1 -1
- package/Particles/EmitterTypes/cylinderParticleEmitter.d.ts +8 -8
- package/Particles/EmitterTypes/cylinderParticleEmitter.js +4 -4
- package/Particles/EmitterTypes/cylinderParticleEmitter.js.map +1 -1
- package/Particles/EmitterTypes/hemisphericParticleEmitter.d.ts +6 -6
- package/Particles/EmitterTypes/hemisphericParticleEmitter.js +3 -3
- package/Particles/EmitterTypes/hemisphericParticleEmitter.js.map +1 -1
- package/Particles/EmitterTypes/sphereParticleEmitter.d.ts +6 -6
- package/Particles/EmitterTypes/sphereParticleEmitter.js +3 -3
- package/Particles/EmitterTypes/sphereParticleEmitter.js.map +1 -1
- package/Particles/pointsCloudSystem.d.ts +0 -1
- package/Particles/pointsCloudSystem.js +0 -1
- package/Particles/pointsCloudSystem.js.map +1 -1
- package/Shaders/gpuTransform.fragment.d.ts +5 -0
- package/Shaders/gpuTransform.fragment.js +11 -0
- package/Shaders/gpuTransform.fragment.js.map +1 -0
- package/Shaders/gpuTransform.vertex.d.ts +13 -0
- package/Shaders/gpuTransform.vertex.js +33 -0
- package/Shaders/gpuTransform.vertex.js.map +1 -0
- package/ShadersWGSL/boundingInfo.compute.d.ts +5 -0
- package/ShadersWGSL/boundingInfo.compute.js +80 -0
- package/ShadersWGSL/boundingInfo.compute.js.map +1 -0
- package/XR/features/WebXRBackgroundRemover.d.ts +2 -2
- package/XR/features/WebXRBackgroundRemover.js +1 -1
- package/XR/features/WebXRBackgroundRemover.js.map +1 -1
- package/XR/features/WebXRHitTest.d.ts +2 -2
- package/XR/features/WebXRHitTest.js +1 -1
- package/XR/features/WebXRHitTest.js.map +1 -1
- package/XR/features/WebXRHitTestLegacy.d.ts +2 -2
- package/XR/features/WebXRHitTestLegacy.js +1 -1
- package/XR/features/WebXRHitTestLegacy.js.map +1 -1
- package/XR/features/WebXRRawCameraAccess.js +0 -2
- package/XR/features/WebXRRawCameraAccess.js.map +1 -1
- package/XR/motionController/webXRAbstractMotionController.d.ts +2 -0
- package/XR/motionController/webXRAbstractMotionController.js +1 -0
- package/XR/motionController/webXRAbstractMotionController.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// Do not edit.
|
|
2
|
+
import { ShaderStore } from "../Engines/shaderStore.js";
|
|
3
|
+
import "./ShadersInclude/bonesDeclaration.js";
|
|
4
|
+
import "./ShadersInclude/bakedVertexAnimationDeclaration.js";
|
|
5
|
+
import "./ShadersInclude/morphTargetsVertexGlobalDeclaration.js";
|
|
6
|
+
import "./ShadersInclude/morphTargetsVertexDeclaration.js";
|
|
7
|
+
import "./ShadersInclude/morphTargetsVertexGlobal.js";
|
|
8
|
+
import "./ShadersInclude/morphTargetsVertex.js";
|
|
9
|
+
import "./ShadersInclude/bonesVertex.js";
|
|
10
|
+
import "./ShadersInclude/bakedVertexAnimation.js";
|
|
11
|
+
const name = "gpuTransformVertexShader";
|
|
12
|
+
const shader = `attribute vec3 position;
|
|
13
|
+
#include<bonesDeclaration>
|
|
14
|
+
#include<bakedVertexAnimationDeclaration>
|
|
15
|
+
#include<morphTargetsVertexGlobalDeclaration>
|
|
16
|
+
#include<morphTargetsVertexDeclaration>[0..maxSimultaneousMorphTargets]
|
|
17
|
+
out vec3 outPosition;const mat4 identity=mat4(
|
|
18
|
+
vec4(1.0,0.0,0.0,0.0),
|
|
19
|
+
vec4(0.0,1.0,0.0,0.0),
|
|
20
|
+
vec4(0.0,0.0,1.0,0.0),
|
|
21
|
+
vec4(0.0,0.0,0.0,1.0)
|
|
22
|
+
);void main(void) {vec3 positionUpdated=position;
|
|
23
|
+
#include<morphTargetsVertexGlobal>
|
|
24
|
+
#include<morphTargetsVertex>[0..maxSimultaneousMorphTargets]
|
|
25
|
+
mat4 finalWorld=identity;
|
|
26
|
+
#include<bonesVertex>
|
|
27
|
+
#include<bakedVertexAnimation>
|
|
28
|
+
vec4 worldPos=finalWorld*vec4(positionUpdated,1.0);outPosition=worldPos.xyz;}`;
|
|
29
|
+
// Sideeffect
|
|
30
|
+
ShaderStore.ShadersStore[name] = shader;
|
|
31
|
+
/** @internal */
|
|
32
|
+
export const gpuTransformVertexShader = { name, shader };
|
|
33
|
+
//# sourceMappingURL=gpuTransform.vertex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gpuTransform.vertex.js","sourceRoot":"","sources":["../../../../dev/core/src/Shaders/gpuTransform.vertex.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,mCAAmC,CAAC;AAC3C,OAAO,kDAAkD,CAAC;AAC1D,OAAO,sDAAsD,CAAC;AAC9D,OAAO,gDAAgD,CAAC;AACxD,OAAO,2CAA2C,CAAC;AACnD,OAAO,qCAAqC,CAAC;AAC7C,OAAO,8BAA8B,CAAC;AACtC,OAAO,uCAAuC,CAAC;AAE/C,MAAM,IAAI,GAAG,0BAA0B,CAAC;AACxC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;8EAgB+D,CAAC;AAC/E,aAAa;AACb,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACxC,gBAAgB;AAChB,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\nimport \"./ShadersInclude/bonesDeclaration\";\nimport \"./ShadersInclude/bakedVertexAnimationDeclaration\";\nimport \"./ShadersInclude/morphTargetsVertexGlobalDeclaration\";\nimport \"./ShadersInclude/morphTargetsVertexDeclaration\";\nimport \"./ShadersInclude/morphTargetsVertexGlobal\";\nimport \"./ShadersInclude/morphTargetsVertex\";\nimport \"./ShadersInclude/bonesVertex\";\nimport \"./ShadersInclude/bakedVertexAnimation\";\n\nconst name = \"gpuTransformVertexShader\";\nconst shader = `attribute vec3 position;\n#include<bonesDeclaration>\n#include<bakedVertexAnimationDeclaration>\n#include<morphTargetsVertexGlobalDeclaration>\n#include<morphTargetsVertexDeclaration>[0..maxSimultaneousMorphTargets]\nout vec3 outPosition;const mat4 identity=mat4(\nvec4(1.0,0.0,0.0,0.0),\nvec4(0.0,1.0,0.0,0.0),\nvec4(0.0,0.0,1.0,0.0),\nvec4(0.0,0.0,0.0,1.0)\n);void main(void) {vec3 positionUpdated=position;\n#include<morphTargetsVertexGlobal>\n#include<morphTargetsVertex>[0..maxSimultaneousMorphTargets]\nmat4 finalWorld=identity;\n#include<bonesVertex>\n#include<bakedVertexAnimation>\nvec4 worldPos=finalWorld*vec4(positionUpdated,1.0);outPosition=worldPos.xyz;}`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @internal */\nexport const gpuTransformVertexShader = { name, shader };\n"]}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// Do not edit.
|
|
2
|
+
import { ShaderStore } from "../Engines/shaderStore.js";
|
|
3
|
+
const name = "boundingInfoComputeShader";
|
|
4
|
+
const shader = `struct Results {minX : atomic<i32>,
|
|
5
|
+
minY : atomic<i32>,
|
|
6
|
+
minZ : atomic<i32>,
|
|
7
|
+
maxX : atomic<i32>,
|
|
8
|
+
maxY : atomic<i32>,
|
|
9
|
+
maxZ : atomic<i32>,
|
|
10
|
+
dummy1 : i32,
|
|
11
|
+
dummy2 : i32,};fn floatToBits(value: f32)->i32 {return bitcast<i32>(value);}
|
|
12
|
+
fn bitsToFloat(value: i32)->f32 {return bitcast<f32>(value);}
|
|
13
|
+
fn atomicMinFloat(atomicVar: ptr<storage,atomic<i32>,read_write>,value: f32) {let intValue=floatToBits(value);loop {let oldIntValue=atomicLoad(atomicVar);let oldValue=bitsToFloat(oldIntValue);if (value>=oldValue) {break;}
|
|
14
|
+
if (atomicCompareExchangeWeak(atomicVar,oldIntValue,intValue).old_value==oldIntValue) {break;}}}
|
|
15
|
+
fn atomicMaxFloat(atomicVar: ptr<storage,atomic<i32>,read_write>,value: f32) {let intValue=floatToBits(value);loop {let oldIntValue=atomicLoad(atomicVar);let oldValue=bitsToFloat(oldIntValue);if (value<=oldValue) {break;}
|
|
16
|
+
if (atomicCompareExchangeWeak(atomicVar,oldIntValue,intValue).old_value==oldIntValue) {break;}}}
|
|
17
|
+
fn readMatrixFromRawSampler(smp : texture_2d<f32>,index : f32)->mat4x4<f32>
|
|
18
|
+
{let offset=i32(index) *4;
|
|
19
|
+
let m0=textureLoad(smp,vec2<i32>(offset+0,0),0);let m1=textureLoad(smp,vec2<i32>(offset+1,0),0);let m2=textureLoad(smp,vec2<i32>(offset+2,0),0);let m3=textureLoad(smp,vec2<i32>(offset+3,0),0);return mat4x4<f32>(m0,m1,m2,m3);}
|
|
20
|
+
const identity=mat4x4f(
|
|
21
|
+
vec4f(1.0,0.0,0.0,0.0),
|
|
22
|
+
vec4f(0.0,1.0,0.0,0.0),
|
|
23
|
+
vec4f(0.0,0.0,1.0,0.0),
|
|
24
|
+
vec4f(0.0,0.0,0.0,1.0)
|
|
25
|
+
);struct Settings {indexResult : u32,
|
|
26
|
+
#ifdef MORPHTARGETS
|
|
27
|
+
morphTargetTextureInfo: vec3f,
|
|
28
|
+
#endif
|
|
29
|
+
};@group(0) @binding(0) var<storage,read> positionBuffer : array<f32>;@group(0) @binding(1) var<storage,read_write> resultBuffer : array<Results>;@group(0) @binding(7) var<uniform> settings : Settings;
|
|
30
|
+
#if NUM_BONE_INFLUENCERS>0
|
|
31
|
+
@group(0) @binding(2) var boneSampler : texture_2d<f32>;@group(0) @binding(3) var<storage,read> indexBuffer : array<vec4f>;@group(0) @binding(4) var<storage,read> weightBuffer : array<vec4f>;
|
|
32
|
+
#if NUM_BONE_INFLUENCERS>4
|
|
33
|
+
@group(0) @binding(5) var<storage,read> indexExtraBuffer : array<vec4f>;@group(0) @binding(6) var<storage,read> weightExtraBuffer : array<vec4f>;
|
|
34
|
+
#endif
|
|
35
|
+
#endif
|
|
36
|
+
#ifdef MORPHTARGETS
|
|
37
|
+
@group(0) @binding(8) var morphTargets : texture_2d_array<f32>;@group(0) @binding(9) var<storage,read> morphTargetInfluences : array<f32>;@group(0) @binding(10) var<storage,read> morphTargetTextureIndices : array<f32>;
|
|
38
|
+
#endif
|
|
39
|
+
#ifdef MORPHTARGETS
|
|
40
|
+
fn readVector3FromRawSampler(targetIndex : i32,vertexIndex : u32)->vec3f
|
|
41
|
+
{
|
|
42
|
+
let vertexID=f32(vertexIndex)*settings.morphTargetTextureInfo.x;let y=floor(vertexID/settings.morphTargetTextureInfo.y);let x=vertexID-y*settings.morphTargetTextureInfo.y;let textureUV=vec2<i32>(i32(x),i32(y));return textureLoad(morphTargets,textureUV,i32(morphTargetTextureIndices[targetIndex]),0).xyz;}
|
|
43
|
+
#endif
|
|
44
|
+
@compute @workgroup_size(64,1,1)
|
|
45
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {let index=global_id.x;if (index>=arrayLength(&positionBuffer)/3) {return;}
|
|
46
|
+
let position=vec3f(positionBuffer[index*3],positionBuffer[index*3+1],positionBuffer[index*3+2]);var finalWorld=identity;var positionUpdated=position;
|
|
47
|
+
#if NUM_BONE_INFLUENCERS>0
|
|
48
|
+
var influence : mat4x4<f32>;let matricesIndices=indexBuffer[index];let matricesWeights=weightBuffer[index];influence=readMatrixFromRawSampler(boneSampler,matricesIndices[0])*matricesWeights[0];
|
|
49
|
+
#if NUM_BONE_INFLUENCERS>1
|
|
50
|
+
influence=influence+readMatrixFromRawSampler(boneSampler,matricesIndices[1])*matricesWeights[1];
|
|
51
|
+
#endif
|
|
52
|
+
#if NUM_BONE_INFLUENCERS>2
|
|
53
|
+
influence=influence+readMatrixFromRawSampler(boneSampler,matricesIndices[2])*matricesWeights[2];
|
|
54
|
+
#endif
|
|
55
|
+
#if NUM_BONE_INFLUENCERS>3
|
|
56
|
+
influence=influence+readMatrixFromRawSampler(boneSampler,matricesIndices[3])*matricesWeights[3];
|
|
57
|
+
#endif
|
|
58
|
+
#if NUM_BONE_INFLUENCERS>4
|
|
59
|
+
let matricesIndicesExtra=indexExtraBuffer[index];let matricesWeightsExtra=weightExtraBuffer[index];influence=influence+readMatrixFromRawSampler(boneSampler,matricesIndicesExtra.x)*matricesWeightsExtra.x;
|
|
60
|
+
#if NUM_BONE_INFLUENCERS>5
|
|
61
|
+
influence=influence+readMatrixFromRawSampler(boneSampler,matricesIndicesExtra.y)*matricesWeightsExtra.y;
|
|
62
|
+
#endif
|
|
63
|
+
#if NUM_BONE_INFLUENCERS>6
|
|
64
|
+
influence=influence+readMatrixFromRawSampler(boneSampler,matricesIndicesExtra.z)*matricesWeightsExtra.z;
|
|
65
|
+
#endif
|
|
66
|
+
#if NUM_BONE_INFLUENCERS>7
|
|
67
|
+
influence=influence+readMatrixFromRawSampler(boneSampler,matricesIndicesExtra.w)*matricesWeightsExtra.w;
|
|
68
|
+
#endif
|
|
69
|
+
#endif
|
|
70
|
+
finalWorld=finalWorld*influence;
|
|
71
|
+
#endif
|
|
72
|
+
#ifdef MORPHTARGETS
|
|
73
|
+
for (var i=0; i<NUM_MORPH_INFLUENCERS; i=i+1) {positionUpdated=positionUpdated+(readVector3FromRawSampler(i,index)-position)*morphTargetInfluences[i];}
|
|
74
|
+
#endif
|
|
75
|
+
var worldPos=finalWorld*vec4f(positionUpdated.x,positionUpdated.y,positionUpdated.z,1.0);atomicMinFloat(&resultBuffer[settings.indexResult].minX,worldPos.x);atomicMinFloat(&resultBuffer[settings.indexResult].minY,worldPos.y);atomicMinFloat(&resultBuffer[settings.indexResult].minZ,worldPos.z);atomicMaxFloat(&resultBuffer[settings.indexResult].maxX,worldPos.x);atomicMaxFloat(&resultBuffer[settings.indexResult].maxY,worldPos.y);atomicMaxFloat(&resultBuffer[settings.indexResult].maxZ,worldPos.z);}`;
|
|
76
|
+
// Sideeffect
|
|
77
|
+
ShaderStore.ShadersStoreWGSL[name] = shader;
|
|
78
|
+
/** @internal */
|
|
79
|
+
export const boundingInfoComputeShader = { name, shader };
|
|
80
|
+
//# sourceMappingURL=boundingInfo.compute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boundingInfo.compute.js","sourceRoot":"","sources":["../../../../dev/core/src/ShadersWGSL/boundingInfo.compute.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,IAAI,GAAG,2BAA2B,CAAC;AACzC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mfAuEoe,CAAC;AACpf,aAAa;AACb,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAC5C,gBAAgB;AAChB,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\n\nconst name = \"boundingInfoComputeShader\";\nconst shader = `struct Results {minX : atomic<i32>,\nminY : atomic<i32>,\nminZ : atomic<i32>,\nmaxX : atomic<i32>,\nmaxY : atomic<i32>,\nmaxZ : atomic<i32>,\ndummy1 : i32,\ndummy2 : i32,};fn floatToBits(value: f32)->i32 {return bitcast<i32>(value);}\nfn bitsToFloat(value: i32)->f32 {return bitcast<f32>(value);}\nfn atomicMinFloat(atomicVar: ptr<storage,atomic<i32>,read_write>,value: f32) {let intValue=floatToBits(value);loop {let oldIntValue=atomicLoad(atomicVar);let oldValue=bitsToFloat(oldIntValue);if (value>=oldValue) {break;}\nif (atomicCompareExchangeWeak(atomicVar,oldIntValue,intValue).old_value==oldIntValue) {break;}}}\nfn atomicMaxFloat(atomicVar: ptr<storage,atomic<i32>,read_write>,value: f32) {let intValue=floatToBits(value);loop {let oldIntValue=atomicLoad(atomicVar);let oldValue=bitsToFloat(oldIntValue);if (value<=oldValue) {break;}\nif (atomicCompareExchangeWeak(atomicVar,oldIntValue,intValue).old_value==oldIntValue) {break;}}}\nfn readMatrixFromRawSampler(smp : texture_2d<f32>,index : f32)->mat4x4<f32>\n{let offset=i32(index) *4; \nlet m0=textureLoad(smp,vec2<i32>(offset+0,0),0);let m1=textureLoad(smp,vec2<i32>(offset+1,0),0);let m2=textureLoad(smp,vec2<i32>(offset+2,0),0);let m3=textureLoad(smp,vec2<i32>(offset+3,0),0);return mat4x4<f32>(m0,m1,m2,m3);}\nconst identity=mat4x4f(\nvec4f(1.0,0.0,0.0,0.0),\nvec4f(0.0,1.0,0.0,0.0),\nvec4f(0.0,0.0,1.0,0.0),\nvec4f(0.0,0.0,0.0,1.0)\n);struct Settings {indexResult : u32,\n#ifdef MORPHTARGETS\nmorphTargetTextureInfo: vec3f,\n#endif\n};@group(0) @binding(0) var<storage,read> positionBuffer : array<f32>;@group(0) @binding(1) var<storage,read_write> resultBuffer : array<Results>;@group(0) @binding(7) var<uniform> settings : Settings;\n#if NUM_BONE_INFLUENCERS>0\n@group(0) @binding(2) var boneSampler : texture_2d<f32>;@group(0) @binding(3) var<storage,read> indexBuffer : array<vec4f>;@group(0) @binding(4) var<storage,read> weightBuffer : array<vec4f>;\n#if NUM_BONE_INFLUENCERS>4\n@group(0) @binding(5) var<storage,read> indexExtraBuffer : array<vec4f>;@group(0) @binding(6) var<storage,read> weightExtraBuffer : array<vec4f>;\n#endif\n#endif\n#ifdef MORPHTARGETS\n@group(0) @binding(8) var morphTargets : texture_2d_array<f32>;@group(0) @binding(9) var<storage,read> morphTargetInfluences : array<f32>;@group(0) @binding(10) var<storage,read> morphTargetTextureIndices : array<f32>;\n#endif\n#ifdef MORPHTARGETS\nfn readVector3FromRawSampler(targetIndex : i32,vertexIndex : u32)->vec3f\n{ \nlet vertexID=f32(vertexIndex)*settings.morphTargetTextureInfo.x;let y=floor(vertexID/settings.morphTargetTextureInfo.y);let x=vertexID-y*settings.morphTargetTextureInfo.y;let textureUV=vec2<i32>(i32(x),i32(y));return textureLoad(morphTargets,textureUV,i32(morphTargetTextureIndices[targetIndex]),0).xyz;}\n#endif\n@compute @workgroup_size(64,1,1)\nfn main(@builtin(global_invocation_id) global_id : vec3<u32>) {let index=global_id.x;if (index>=arrayLength(&positionBuffer)/3) {return;}\nlet position=vec3f(positionBuffer[index*3],positionBuffer[index*3+1],positionBuffer[index*3+2]);var finalWorld=identity;var positionUpdated=position;\n#if NUM_BONE_INFLUENCERS>0\nvar influence : mat4x4<f32>;let matricesIndices=indexBuffer[index];let matricesWeights=weightBuffer[index];influence=readMatrixFromRawSampler(boneSampler,matricesIndices[0])*matricesWeights[0];\n#if NUM_BONE_INFLUENCERS>1\ninfluence=influence+readMatrixFromRawSampler(boneSampler,matricesIndices[1])*matricesWeights[1];\n#endif \n#if NUM_BONE_INFLUENCERS>2\ninfluence=influence+readMatrixFromRawSampler(boneSampler,matricesIndices[2])*matricesWeights[2];\n#endif \n#if NUM_BONE_INFLUENCERS>3\ninfluence=influence+readMatrixFromRawSampler(boneSampler,matricesIndices[3])*matricesWeights[3];\n#endif \n#if NUM_BONE_INFLUENCERS>4\nlet matricesIndicesExtra=indexExtraBuffer[index];let matricesWeightsExtra=weightExtraBuffer[index];influence=influence+readMatrixFromRawSampler(boneSampler,matricesIndicesExtra.x)*matricesWeightsExtra.x;\n#if NUM_BONE_INFLUENCERS>5\ninfluence=influence+readMatrixFromRawSampler(boneSampler,matricesIndicesExtra.y)*matricesWeightsExtra.y;\n#endif \n#if NUM_BONE_INFLUENCERS>6\ninfluence=influence+readMatrixFromRawSampler(boneSampler,matricesIndicesExtra.z)*matricesWeightsExtra.z;\n#endif \n#if NUM_BONE_INFLUENCERS>7\ninfluence=influence+readMatrixFromRawSampler(boneSampler,matricesIndicesExtra.w)*matricesWeightsExtra.w;\n#endif \n#endif \nfinalWorld=finalWorld*influence;\n#endif\n#ifdef MORPHTARGETS\nfor (var i=0; i<NUM_MORPH_INFLUENCERS; i=i+1) {positionUpdated=positionUpdated+(readVector3FromRawSampler(i,index)-position)*morphTargetInfluences[i];}\n#endif\nvar worldPos=finalWorld*vec4f(positionUpdated.x,positionUpdated.y,positionUpdated.z,1.0);atomicMinFloat(&resultBuffer[settings.indexResult].minX,worldPos.x);atomicMinFloat(&resultBuffer[settings.indexResult].minY,worldPos.y);atomicMinFloat(&resultBuffer[settings.indexResult].minZ,worldPos.z);atomicMaxFloat(&resultBuffer[settings.indexResult].maxX,worldPos.x);atomicMaxFloat(&resultBuffer[settings.indexResult].maxY,worldPos.y);atomicMaxFloat(&resultBuffer[settings.indexResult].maxZ,worldPos.z);}`;\n// Sideeffect\nShaderStore.ShadersStoreWGSL[name] = shader;\n/** @internal */\nexport const boundingInfoComputeShader = { name, shader };\n"]}
|
|
@@ -34,7 +34,7 @@ export interface IWebXRBackgroundRemoverOptions {
|
|
|
34
34
|
*/
|
|
35
35
|
export declare class WebXRBackgroundRemover extends WebXRAbstractFeature {
|
|
36
36
|
/**
|
|
37
|
-
* read-only options to be used in this module
|
|
37
|
+
* [Empty Object] read-only options to be used in this module
|
|
38
38
|
*/
|
|
39
39
|
readonly options: IWebXRBackgroundRemoverOptions;
|
|
40
40
|
/**
|
|
@@ -58,7 +58,7 @@ export declare class WebXRBackgroundRemover extends WebXRAbstractFeature {
|
|
|
58
58
|
*/
|
|
59
59
|
constructor(_xrSessionManager: WebXRSessionManager,
|
|
60
60
|
/**
|
|
61
|
-
* read-only options to be used in this module
|
|
61
|
+
* [Empty Object] read-only options to be used in this module
|
|
62
62
|
*/
|
|
63
63
|
options?: IWebXRBackgroundRemoverOptions);
|
|
64
64
|
/**
|
|
@@ -12,7 +12,7 @@ export class WebXRBackgroundRemover extends WebXRAbstractFeature {
|
|
|
12
12
|
*/
|
|
13
13
|
constructor(_xrSessionManager,
|
|
14
14
|
/**
|
|
15
|
-
* read-only options to be used in this module
|
|
15
|
+
* [Empty Object] read-only options to be used in this module
|
|
16
16
|
*/
|
|
17
17
|
options = {}) {
|
|
18
18
|
super(_xrSessionManager);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebXRBackgroundRemover.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRBackgroundRemover.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebXRFeaturesManager, WebXRFeatureName } from \"../webXRFeaturesManager\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\n\r\n/**\r\n * Options interface for the background remover plugin\r\n */\r\nexport interface IWebXRBackgroundRemoverOptions {\r\n /**\r\n * Further background meshes to disable when entering AR\r\n */\r\n backgroundMeshes?: AbstractMesh[];\r\n /**\r\n * flags to configure the removal of the environment helper.\r\n * If not set, the entire background will be removed. If set, flags should be set as well.\r\n */\r\n environmentHelperRemovalFlags?: {\r\n /**\r\n * Should the skybox be removed (default false)\r\n */\r\n skyBox?: boolean;\r\n /**\r\n * Should the ground be removed (default false)\r\n */\r\n ground?: boolean;\r\n };\r\n /**\r\n * don't disable the environment helper\r\n */\r\n ignoreEnvironmentHelper?: boolean;\r\n}\r\n\r\n/**\r\n * A module that will automatically disable background meshes when entering AR and will enable them when leaving AR.\r\n */\r\nexport class WebXRBackgroundRemover extends WebXRAbstractFeature {\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.BACKGROUND_REMOVER;\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 = 1;\r\n\r\n /**\r\n * registered observers will be triggered when the background state changes\r\n */\r\n public onBackgroundStateChangedObservable: Observable<boolean> = new Observable();\r\n\r\n /**\r\n * constructs a new background remover module\r\n * @param _xrSessionManager the session manager for this module\r\n * @param options read-only options to be used in this module\r\n */\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n /**\r\n * read-only options to be used in this module\r\n */\r\n public readonly options: IWebXRBackgroundRemoverOptions = {}\r\n ) {\r\n super(_xrSessionManager);\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 this._setBackgroundState(false);\r\n return super.attach();\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 this._setBackgroundState(true);\r\n return super.detach();\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached\r\n */\r\n public override dispose(): void {\r\n super.dispose();\r\n this.onBackgroundStateChangedObservable.clear();\r\n }\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame) {\r\n // no-op\r\n }\r\n\r\n private _setBackgroundState(newState: boolean) {\r\n const scene = this._xrSessionManager.scene;\r\n if (!this.options.ignoreEnvironmentHelper) {\r\n if (this.options.environmentHelperRemovalFlags) {\r\n if (this.options.environmentHelperRemovalFlags.skyBox) {\r\n const backgroundSkybox = scene.getMeshByName(\"BackgroundSkybox\");\r\n if (backgroundSkybox) {\r\n backgroundSkybox.setEnabled(newState);\r\n }\r\n }\r\n if (this.options.environmentHelperRemovalFlags.ground) {\r\n const backgroundPlane = scene.getMeshByName(\"BackgroundPlane\");\r\n if (backgroundPlane) {\r\n backgroundPlane.setEnabled(newState);\r\n }\r\n }\r\n } else {\r\n const backgroundHelper = scene.getMeshByName(\"BackgroundHelper\");\r\n if (backgroundHelper) {\r\n backgroundHelper.setEnabled(newState);\r\n }\r\n }\r\n }\r\n\r\n if (this.options.backgroundMeshes) {\r\n this.options.backgroundMeshes.forEach((mesh) => mesh.setEnabled(newState));\r\n }\r\n\r\n this.onBackgroundStateChangedObservable.notifyObservers(newState);\r\n }\r\n}\r\n\r\n//register the plugin\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRBackgroundRemover.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRBackgroundRemover(xrSessionManager, options);\r\n },\r\n WebXRBackgroundRemover.Version,\r\n true\r\n);\r\n"]}
|
|
1
|
+
{"version":3,"file":"WebXRBackgroundRemover.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRBackgroundRemover.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebXRFeaturesManager, WebXRFeatureName } from \"../webXRFeaturesManager\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\n\r\n/**\r\n * Options interface for the background remover plugin\r\n */\r\nexport interface IWebXRBackgroundRemoverOptions {\r\n /**\r\n * Further background meshes to disable when entering AR\r\n */\r\n backgroundMeshes?: AbstractMesh[];\r\n /**\r\n * flags to configure the removal of the environment helper.\r\n * If not set, the entire background will be removed. If set, flags should be set as well.\r\n */\r\n environmentHelperRemovalFlags?: {\r\n /**\r\n * Should the skybox be removed (default false)\r\n */\r\n skyBox?: boolean;\r\n /**\r\n * Should the ground be removed (default false)\r\n */\r\n ground?: boolean;\r\n };\r\n /**\r\n * don't disable the environment helper\r\n */\r\n ignoreEnvironmentHelper?: boolean;\r\n}\r\n\r\n/**\r\n * A module that will automatically disable background meshes when entering AR and will enable them when leaving AR.\r\n */\r\nexport class WebXRBackgroundRemover extends WebXRAbstractFeature {\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.BACKGROUND_REMOVER;\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 = 1;\r\n\r\n /**\r\n * registered observers will be triggered when the background state changes\r\n */\r\n public onBackgroundStateChangedObservable: Observable<boolean> = new Observable();\r\n\r\n /**\r\n * constructs a new background remover module\r\n * @param _xrSessionManager the session manager for this module\r\n * @param options read-only options to be used in this module\r\n */\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n /**\r\n * [Empty Object] read-only options to be used in this module\r\n */\r\n public readonly options: IWebXRBackgroundRemoverOptions = {}\r\n ) {\r\n super(_xrSessionManager);\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 this._setBackgroundState(false);\r\n return super.attach();\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 this._setBackgroundState(true);\r\n return super.detach();\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached\r\n */\r\n public override dispose(): void {\r\n super.dispose();\r\n this.onBackgroundStateChangedObservable.clear();\r\n }\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame) {\r\n // no-op\r\n }\r\n\r\n private _setBackgroundState(newState: boolean) {\r\n const scene = this._xrSessionManager.scene;\r\n if (!this.options.ignoreEnvironmentHelper) {\r\n if (this.options.environmentHelperRemovalFlags) {\r\n if (this.options.environmentHelperRemovalFlags.skyBox) {\r\n const backgroundSkybox = scene.getMeshByName(\"BackgroundSkybox\");\r\n if (backgroundSkybox) {\r\n backgroundSkybox.setEnabled(newState);\r\n }\r\n }\r\n if (this.options.environmentHelperRemovalFlags.ground) {\r\n const backgroundPlane = scene.getMeshByName(\"BackgroundPlane\");\r\n if (backgroundPlane) {\r\n backgroundPlane.setEnabled(newState);\r\n }\r\n }\r\n } else {\r\n const backgroundHelper = scene.getMeshByName(\"BackgroundHelper\");\r\n if (backgroundHelper) {\r\n backgroundHelper.setEnabled(newState);\r\n }\r\n }\r\n }\r\n\r\n if (this.options.backgroundMeshes) {\r\n this.options.backgroundMeshes.forEach((mesh) => mesh.setEnabled(newState));\r\n }\r\n\r\n this.onBackgroundStateChangedObservable.notifyObservers(newState);\r\n }\r\n}\r\n\r\n//register the plugin\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRBackgroundRemover.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRBackgroundRemover(xrSessionManager, options);\r\n },\r\n WebXRBackgroundRemover.Version,\r\n true\r\n);\r\n"]}
|
|
@@ -71,7 +71,7 @@ export interface IWebXRHitResult extends IWebXRLegacyHitResult {
|
|
|
71
71
|
*/
|
|
72
72
|
export declare class WebXRHitTest extends WebXRAbstractFeature implements IWebXRHitTestFeature<IWebXRHitResult> {
|
|
73
73
|
/**
|
|
74
|
-
* options to use when constructing this feature
|
|
74
|
+
* [Empty Object] options to use when constructing this feature
|
|
75
75
|
*/
|
|
76
76
|
readonly options: IWebXRHitTestOptions;
|
|
77
77
|
private _tmpMat;
|
|
@@ -112,7 +112,7 @@ export declare class WebXRHitTest extends WebXRAbstractFeature implements IWebXR
|
|
|
112
112
|
*/
|
|
113
113
|
constructor(_xrSessionManager: WebXRSessionManager,
|
|
114
114
|
/**
|
|
115
|
-
* options to use when constructing this feature
|
|
115
|
+
* [Empty Object] options to use when constructing this feature
|
|
116
116
|
*/
|
|
117
117
|
options?: IWebXRHitTestOptions);
|
|
118
118
|
/**
|
|
@@ -18,7 +18,7 @@ export class WebXRHitTest extends WebXRAbstractFeature {
|
|
|
18
18
|
*/
|
|
19
19
|
constructor(_xrSessionManager,
|
|
20
20
|
/**
|
|
21
|
-
* options to use when constructing this feature
|
|
21
|
+
* [Empty Object] options to use when constructing this feature
|
|
22
22
|
*/
|
|
23
23
|
options = {}) {
|
|
24
24
|
super(_xrSessionManager);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebXRHitTest.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRHitTest.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebXRFeaturesManager, WebXRFeatureName } from \"../webXRFeaturesManager\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport { Vector3, Matrix, Quaternion } from \"../../Maths/math.vector\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport type { IWebXRLegacyHitTestOptions, IWebXRLegacyHitResult, IWebXRHitTestFeature } from \"./WebXRHitTestLegacy\";\r\nimport { Tools } from \"../../Misc/tools\";\r\nimport type { Nullable } from \"../../types\";\r\n\r\n/**\r\n * Options used for hit testing (version 2)\r\n */\r\nexport interface IWebXRHitTestOptions extends IWebXRLegacyHitTestOptions {\r\n /**\r\n * Do not create a permanent hit test. Will usually be used when only\r\n * transient inputs are needed.\r\n */\r\n disablePermanentHitTest?: boolean;\r\n /**\r\n * Enable transient (for example touch-based) hit test inspections\r\n */\r\n enableTransientHitTest?: boolean;\r\n /**\r\n * Override the default transient hit test profile (generic-touchscreen).\r\n */\r\n transientHitTestProfile?: string;\r\n /**\r\n * Offset ray for the permanent hit test\r\n */\r\n offsetRay?: Vector3;\r\n /**\r\n * Offset ray for the transient hit test\r\n */\r\n transientOffsetRay?: Vector3;\r\n /**\r\n * Instead of using viewer space for hit tests, use the reference space defined in the session manager\r\n */\r\n useReferenceSpace?: boolean;\r\n\r\n /**\r\n * Override the default entity type(s) of the hit-test result\r\n */\r\n entityTypes?: XRHitTestTrackableType[];\r\n}\r\n\r\n/**\r\n * Interface defining the babylon result of hit-test\r\n */\r\nexport interface IWebXRHitResult extends IWebXRLegacyHitResult {\r\n /**\r\n * The input source that generated this hit test (if transient)\r\n */\r\n inputSource?: XRInputSource;\r\n /**\r\n * Is this a transient hit test\r\n */\r\n isTransient?: boolean;\r\n /**\r\n * Position of the hit test result\r\n */\r\n position: Vector3;\r\n /**\r\n * Rotation of the hit test result\r\n */\r\n rotationQuaternion: Quaternion;\r\n\r\n /**\r\n * The native hit test result\r\n */\r\n xrHitResult: XRHitTestResult;\r\n}\r\n\r\n/**\r\n * The currently-working hit-test module.\r\n * Hit test (or Ray-casting) is used to interact with the real world.\r\n * For further information read here - https://github.com/immersive-web/hit-test\r\n *\r\n * Tested on chrome (mobile) 80.\r\n */\r\nexport class WebXRHitTest extends WebXRAbstractFeature implements IWebXRHitTestFeature<IWebXRHitResult> {\r\n private _tmpMat: Matrix = new Matrix();\r\n private _tmpPos: Vector3 = new Vector3();\r\n private _tmpQuat: Quaternion = new Quaternion();\r\n private _transientXrHitTestSource: Nullable<XRTransientInputHitTestSource>;\r\n // in XR space z-forward is negative\r\n private _xrHitTestSource: Nullable<XRHitTestSource>;\r\n private _initHitTestSource = (referenceSpace: XRReferenceSpace) => {\r\n if (!referenceSpace) {\r\n return;\r\n }\r\n const offsetRay = new XRRay(this.options.offsetRay || {});\r\n const hitTestOptions: XRHitTestOptionsInit = {\r\n space: this.options.useReferenceSpace ? referenceSpace : this._xrSessionManager.viewerReferenceSpace,\r\n offsetRay: offsetRay,\r\n };\r\n if (this.options.entityTypes) {\r\n hitTestOptions.entityTypes = this.options.entityTypes;\r\n }\r\n if (!hitTestOptions.space) {\r\n Tools.Warn(\"waiting for viewer reference space to initialize\");\r\n return;\r\n }\r\n this._xrSessionManager.session.requestHitTestSource!(hitTestOptions).then((hitTestSource) => {\r\n if (this._xrHitTestSource) {\r\n this._xrHitTestSource.cancel();\r\n }\r\n this._xrHitTestSource = hitTestSource;\r\n });\r\n };\r\n\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.HIT_TEST;\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 * When set to true, each hit test will have its own position/rotation objects\r\n * When set to false, position and rotation objects will be reused for each hit test. It is expected that\r\n * the developers will clone them or copy them as they see fit.\r\n */\r\n public autoCloneTransformation: boolean = false;\r\n /**\r\n * Triggered when new babylon (transformed) hit test results are available\r\n * Note - this will be called when results come back from the device. It can be an empty array!!\r\n */\r\n public onHitTestResultObservable: Observable<IWebXRHitResult[]> = new Observable();\r\n /**\r\n * Use this to temporarily pause hit test checks.\r\n */\r\n public paused: boolean = false;\r\n\r\n /**\r\n * Creates a new instance of the hit test feature\r\n * @param _xrSessionManager an instance of WebXRSessionManager\r\n * @param options options to use when constructing this feature\r\n */\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n /**\r\n * options to use when constructing this feature\r\n */\r\n public readonly options: IWebXRHitTestOptions = {}\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"hit-test\";\r\n Tools.Warn(\"Hit test is an experimental and unstable feature.\");\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 // Feature enabled, but not available\r\n if (!this._xrSessionManager.session.requestHitTestSource) {\r\n return false;\r\n }\r\n\r\n if (!this.options.disablePermanentHitTest) {\r\n if (this._xrSessionManager.referenceSpace) {\r\n this._initHitTestSource(this._xrSessionManager.referenceSpace);\r\n }\r\n this._xrSessionManager.onXRReferenceSpaceChanged.add(this._initHitTestSource);\r\n }\r\n if (this.options.enableTransientHitTest) {\r\n const offsetRay = new XRRay(this.options.transientOffsetRay || {});\r\n this._xrSessionManager.session.requestHitTestSourceForTransientInput!({\r\n profile: this.options.transientHitTestProfile || \"generic-touchscreen\",\r\n offsetRay,\r\n entityTypes: this.options.entityTypes,\r\n }).then((hitSource) => {\r\n this._transientXrHitTestSource = hitSource;\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 if (this._xrHitTestSource) {\r\n this._xrHitTestSource.cancel();\r\n this._xrHitTestSource = null;\r\n }\r\n this._xrSessionManager.onXRReferenceSpaceChanged.removeCallback(this._initHitTestSource);\r\n if (this._transientXrHitTestSource) {\r\n this._transientXrHitTestSource.cancel();\r\n this._transientXrHitTestSource = null;\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached\r\n */\r\n public override dispose(): void {\r\n super.dispose();\r\n this.onHitTestResultObservable.clear();\r\n }\r\n\r\n protected _onXRFrame(frame: XRFrame) {\r\n // make sure we do nothing if (async) not attached\r\n if (!this.attached || this.paused) {\r\n return;\r\n }\r\n\r\n if (this._xrHitTestSource) {\r\n const results = frame.getHitTestResults(this._xrHitTestSource);\r\n this._processWebXRHitTestResult(results);\r\n }\r\n if (this._transientXrHitTestSource) {\r\n const hitTestResultsPerInputSource = frame.getHitTestResultsForTransientInput(this._transientXrHitTestSource);\r\n\r\n hitTestResultsPerInputSource.forEach((resultsPerInputSource) => {\r\n this._processWebXRHitTestResult(resultsPerInputSource.results, resultsPerInputSource.inputSource);\r\n });\r\n }\r\n }\r\n\r\n private _processWebXRHitTestResult(hitTestResults: readonly XRHitTestResult[], inputSource?: XRInputSource) {\r\n const results: IWebXRHitResult[] = [];\r\n hitTestResults.forEach((hitTestResult) => {\r\n const pose = hitTestResult.getPose(this._xrSessionManager.referenceSpace);\r\n if (!pose) {\r\n return;\r\n }\r\n const pos = pose.transform.position;\r\n const quat = pose.transform.orientation;\r\n this._tmpPos.set(pos.x, pos.y, pos.z).scaleInPlace(this._xrSessionManager.worldScalingFactor);\r\n this._tmpQuat.set(quat.x, quat.y, quat.z, quat.w);\r\n Matrix.FromFloat32ArrayToRefScaled(pose.transform.matrix, 0, 1, this._tmpMat);\r\n if (!this._xrSessionManager.scene.useRightHandedSystem) {\r\n this._tmpPos.z *= -1;\r\n this._tmpQuat.z *= -1;\r\n this._tmpQuat.w *= -1;\r\n this._tmpMat.toggleModelMatrixHandInPlace();\r\n }\r\n\r\n const result: IWebXRHitResult = {\r\n position: this.autoCloneTransformation ? this._tmpPos.clone() : this._tmpPos,\r\n rotationQuaternion: this.autoCloneTransformation ? this._tmpQuat.clone() : this._tmpQuat,\r\n transformationMatrix: this.autoCloneTransformation ? this._tmpMat.clone() : this._tmpMat,\r\n inputSource: inputSource,\r\n isTransient: !!inputSource,\r\n xrHitResult: hitTestResult,\r\n };\r\n results.push(result);\r\n });\r\n\r\n this.onHitTestResultObservable.notifyObservers(results);\r\n }\r\n}\r\n\r\n//register the plugin versions\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRHitTest.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRHitTest(xrSessionManager, options);\r\n },\r\n WebXRHitTest.Version,\r\n false\r\n);\r\n"]}
|
|
1
|
+
{"version":3,"file":"WebXRHitTest.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRHitTest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEjF,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAkEzC;;;;;;GAMG;AACH,MAAM,OAAO,YAAa,SAAQ,oBAAoB;IA0DlD;;;;OAIG;IACH,YACI,iBAAsC;IACtC;;OAEG;IACa,UAAgC,EAAE;QAElD,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAFT,YAAO,GAAP,OAAO,CAA2B;QAnE9C,YAAO,GAAW,IAAI,MAAM,EAAE,CAAC;QAC/B,YAAO,GAAY,IAAI,OAAO,EAAE,CAAC;QACjC,aAAQ,GAAe,IAAI,UAAU,EAAE,CAAC;QAIxC,uBAAkB,GAAG,CAAC,cAAgC,EAAE,EAAE;YAC9D,IAAI,CAAC,cAAc,EAAE;gBACjB,OAAO;aACV;YACD,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;YAC1D,MAAM,cAAc,GAAyB;gBACzC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,oBAAoB;gBACpG,SAAS,EAAE,SAAS;aACvB,CAAC;YACF,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;gBAC1B,cAAc,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;aACzD;YACD,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE;gBACvB,KAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;gBAC/D,OAAO;aACV;YACD,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,oBAAqB,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,EAAE;gBACxF,IAAI,IAAI,CAAC,gBAAgB,EAAE;oBACvB,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC;iBAClC;gBACD,IAAI,CAAC,gBAAgB,GAAG,aAAa,CAAC;YAC1C,CAAC,CAAC,CAAC;QACP,CAAC,CAAC;QAaF;;;;WAIG;QACI,4BAAuB,GAAY,KAAK,CAAC;QAChD;;;WAGG;QACI,8BAAyB,GAAkC,IAAI,UAAU,EAAE,CAAC;QACnF;;WAEG;QACI,WAAM,GAAY,KAAK,CAAC;QAe3B,IAAI,CAAC,mBAAmB,GAAG,UAAU,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;IACpE,CAAC;IAED;;;;;OAKG;IACa,MAAM;QAClB,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE;YACjB,OAAO,KAAK,CAAC;SAChB;QAED,qCAAqC;QACrC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,oBAAoB,EAAE;YACtD,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE;YACvC,IAAI,IAAI,CAAC,iBAAiB,CAAC,cAAc,EAAE;gBACvC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;aAClE;YACD,IAAI,CAAC,iBAAiB,CAAC,yBAAyB,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;SACjF;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE;YACrC,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;YACnE,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,qCAAsC,CAAC;gBAClE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,uBAAuB,IAAI,qBAAqB;gBACtE,SAAS;gBACT,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW;aACxC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE;gBAClB,IAAI,CAAC,yBAAyB,GAAG,SAAS,CAAC;YAC/C,CAAC,CAAC,CAAC;SACN;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;OAKG;IACa,MAAM;QAClB,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE;YACjB,OAAO,KAAK,CAAC;SAChB;QACD,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACvB,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC;YAC/B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;SAChC;QACD,IAAI,CAAC,iBAAiB,CAAC,yBAAyB,CAAC,cAAc,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACzF,IAAI,IAAI,CAAC,yBAAyB,EAAE;YAChC,IAAI,CAAC,yBAAyB,CAAC,MAAM,EAAE,CAAC;YACxC,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC;SACzC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACa,OAAO;QACnB,KAAK,CAAC,OAAO,EAAE,CAAC;QAChB,IAAI,CAAC,yBAAyB,CAAC,KAAK,EAAE,CAAC;IAC3C,CAAC;IAES,UAAU,CAAC,KAAc;QAC/B,kDAAkD;QAClD,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,EAAE;YAC/B,OAAO;SACV;QAED,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACvB,MAAM,OAAO,GAAG,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC/D,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC;SAC5C;QACD,IAAI,IAAI,CAAC,yBAAyB,EAAE;YAChC,MAAM,4BAA4B,GAAG,KAAK,CAAC,kCAAkC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YAE9G,4BAA4B,CAAC,OAAO,CAAC,CAAC,qBAAqB,EAAE,EAAE;gBAC3D,IAAI,CAAC,0BAA0B,CAAC,qBAAqB,CAAC,OAAO,EAAE,qBAAqB,CAAC,WAAW,CAAC,CAAC;YACtG,CAAC,CAAC,CAAC;SACN;IACL,CAAC;IAEO,0BAA0B,CAAC,cAA0C,EAAE,WAA2B;QACtG,MAAM,OAAO,GAAsB,EAAE,CAAC;QACtC,cAAc,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,EAAE;YACrC,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;YAC1E,IAAI,CAAC,IAAI,EAAE;gBACP,OAAO;aACV;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;YACpC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;YACxC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;YAC9F,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;YAClD,MAAM,CAAC,2BAA2B,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9E,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,oBAAoB,EAAE;gBACpD,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBACrB,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBACtB,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBACtB,IAAI,CAAC,OAAO,CAAC,4BAA4B,EAAE,CAAC;aAC/C;YAED,MAAM,MAAM,GAAoB;gBAC5B,QAAQ,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO;gBAC5E,kBAAkB,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ;gBACxF,oBAAoB,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO;gBACxF,WAAW,EAAE,WAAW;gBACxB,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,WAAW,EAAE,aAAa;aAC7B,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,yBAAyB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IAC5D,CAAC;;AAhKD;;GAEG;AACoB,iBAAI,GAAG,gBAAgB,CAAC,QAAQ,AAA5B,CAA6B;AACxD;;;;GAIG;AACoB,oBAAO,GAAG,CAAC,AAAJ,CAAK;AA0JvC,8BAA8B;AAC9B,oBAAoB,CAAC,eAAe,CAChC,YAAY,CAAC,IAAI,EACjB,CAAC,gBAAgB,EAAE,OAAO,EAAE,EAAE;IAC1B,OAAO,GAAG,EAAE,CAAC,IAAI,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;AAC7D,CAAC,EACD,YAAY,CAAC,OAAO,EACpB,KAAK,CACR,CAAC","sourcesContent":["import { WebXRFeaturesManager, WebXRFeatureName } from \"../webXRFeaturesManager\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport { Vector3, Matrix, Quaternion } from \"../../Maths/math.vector\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport type { IWebXRLegacyHitTestOptions, IWebXRLegacyHitResult, IWebXRHitTestFeature } from \"./WebXRHitTestLegacy\";\r\nimport { Tools } from \"../../Misc/tools\";\r\nimport type { Nullable } from \"../../types\";\r\n\r\n/**\r\n * Options used for hit testing (version 2)\r\n */\r\nexport interface IWebXRHitTestOptions extends IWebXRLegacyHitTestOptions {\r\n /**\r\n * Do not create a permanent hit test. Will usually be used when only\r\n * transient inputs are needed.\r\n */\r\n disablePermanentHitTest?: boolean;\r\n /**\r\n * Enable transient (for example touch-based) hit test inspections\r\n */\r\n enableTransientHitTest?: boolean;\r\n /**\r\n * Override the default transient hit test profile (generic-touchscreen).\r\n */\r\n transientHitTestProfile?: string;\r\n /**\r\n * Offset ray for the permanent hit test\r\n */\r\n offsetRay?: Vector3;\r\n /**\r\n * Offset ray for the transient hit test\r\n */\r\n transientOffsetRay?: Vector3;\r\n /**\r\n * Instead of using viewer space for hit tests, use the reference space defined in the session manager\r\n */\r\n useReferenceSpace?: boolean;\r\n\r\n /**\r\n * Override the default entity type(s) of the hit-test result\r\n */\r\n entityTypes?: XRHitTestTrackableType[];\r\n}\r\n\r\n/**\r\n * Interface defining the babylon result of hit-test\r\n */\r\nexport interface IWebXRHitResult extends IWebXRLegacyHitResult {\r\n /**\r\n * The input source that generated this hit test (if transient)\r\n */\r\n inputSource?: XRInputSource;\r\n /**\r\n * Is this a transient hit test\r\n */\r\n isTransient?: boolean;\r\n /**\r\n * Position of the hit test result\r\n */\r\n position: Vector3;\r\n /**\r\n * Rotation of the hit test result\r\n */\r\n rotationQuaternion: Quaternion;\r\n\r\n /**\r\n * The native hit test result\r\n */\r\n xrHitResult: XRHitTestResult;\r\n}\r\n\r\n/**\r\n * The currently-working hit-test module.\r\n * Hit test (or Ray-casting) is used to interact with the real world.\r\n * For further information read here - https://github.com/immersive-web/hit-test\r\n *\r\n * Tested on chrome (mobile) 80.\r\n */\r\nexport class WebXRHitTest extends WebXRAbstractFeature implements IWebXRHitTestFeature<IWebXRHitResult> {\r\n private _tmpMat: Matrix = new Matrix();\r\n private _tmpPos: Vector3 = new Vector3();\r\n private _tmpQuat: Quaternion = new Quaternion();\r\n private _transientXrHitTestSource: Nullable<XRTransientInputHitTestSource>;\r\n // in XR space z-forward is negative\r\n private _xrHitTestSource: Nullable<XRHitTestSource>;\r\n private _initHitTestSource = (referenceSpace: XRReferenceSpace) => {\r\n if (!referenceSpace) {\r\n return;\r\n }\r\n const offsetRay = new XRRay(this.options.offsetRay || {});\r\n const hitTestOptions: XRHitTestOptionsInit = {\r\n space: this.options.useReferenceSpace ? referenceSpace : this._xrSessionManager.viewerReferenceSpace,\r\n offsetRay: offsetRay,\r\n };\r\n if (this.options.entityTypes) {\r\n hitTestOptions.entityTypes = this.options.entityTypes;\r\n }\r\n if (!hitTestOptions.space) {\r\n Tools.Warn(\"waiting for viewer reference space to initialize\");\r\n return;\r\n }\r\n this._xrSessionManager.session.requestHitTestSource!(hitTestOptions).then((hitTestSource) => {\r\n if (this._xrHitTestSource) {\r\n this._xrHitTestSource.cancel();\r\n }\r\n this._xrHitTestSource = hitTestSource;\r\n });\r\n };\r\n\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.HIT_TEST;\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 * When set to true, each hit test will have its own position/rotation objects\r\n * When set to false, position and rotation objects will be reused for each hit test. It is expected that\r\n * the developers will clone them or copy them as they see fit.\r\n */\r\n public autoCloneTransformation: boolean = false;\r\n /**\r\n * Triggered when new babylon (transformed) hit test results are available\r\n * Note - this will be called when results come back from the device. It can be an empty array!!\r\n */\r\n public onHitTestResultObservable: Observable<IWebXRHitResult[]> = new Observable();\r\n /**\r\n * Use this to temporarily pause hit test checks.\r\n */\r\n public paused: boolean = false;\r\n\r\n /**\r\n * Creates a new instance of the hit test feature\r\n * @param _xrSessionManager an instance of WebXRSessionManager\r\n * @param options options to use when constructing this feature\r\n */\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n /**\r\n * [Empty Object] options to use when constructing this feature\r\n */\r\n public readonly options: IWebXRHitTestOptions = {}\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"hit-test\";\r\n Tools.Warn(\"Hit test is an experimental and unstable feature.\");\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 // Feature enabled, but not available\r\n if (!this._xrSessionManager.session.requestHitTestSource) {\r\n return false;\r\n }\r\n\r\n if (!this.options.disablePermanentHitTest) {\r\n if (this._xrSessionManager.referenceSpace) {\r\n this._initHitTestSource(this._xrSessionManager.referenceSpace);\r\n }\r\n this._xrSessionManager.onXRReferenceSpaceChanged.add(this._initHitTestSource);\r\n }\r\n if (this.options.enableTransientHitTest) {\r\n const offsetRay = new XRRay(this.options.transientOffsetRay || {});\r\n this._xrSessionManager.session.requestHitTestSourceForTransientInput!({\r\n profile: this.options.transientHitTestProfile || \"generic-touchscreen\",\r\n offsetRay,\r\n entityTypes: this.options.entityTypes,\r\n }).then((hitSource) => {\r\n this._transientXrHitTestSource = hitSource;\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 if (this._xrHitTestSource) {\r\n this._xrHitTestSource.cancel();\r\n this._xrHitTestSource = null;\r\n }\r\n this._xrSessionManager.onXRReferenceSpaceChanged.removeCallback(this._initHitTestSource);\r\n if (this._transientXrHitTestSource) {\r\n this._transientXrHitTestSource.cancel();\r\n this._transientXrHitTestSource = null;\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached\r\n */\r\n public override dispose(): void {\r\n super.dispose();\r\n this.onHitTestResultObservable.clear();\r\n }\r\n\r\n protected _onXRFrame(frame: XRFrame) {\r\n // make sure we do nothing if (async) not attached\r\n if (!this.attached || this.paused) {\r\n return;\r\n }\r\n\r\n if (this._xrHitTestSource) {\r\n const results = frame.getHitTestResults(this._xrHitTestSource);\r\n this._processWebXRHitTestResult(results);\r\n }\r\n if (this._transientXrHitTestSource) {\r\n const hitTestResultsPerInputSource = frame.getHitTestResultsForTransientInput(this._transientXrHitTestSource);\r\n\r\n hitTestResultsPerInputSource.forEach((resultsPerInputSource) => {\r\n this._processWebXRHitTestResult(resultsPerInputSource.results, resultsPerInputSource.inputSource);\r\n });\r\n }\r\n }\r\n\r\n private _processWebXRHitTestResult(hitTestResults: readonly XRHitTestResult[], inputSource?: XRInputSource) {\r\n const results: IWebXRHitResult[] = [];\r\n hitTestResults.forEach((hitTestResult) => {\r\n const pose = hitTestResult.getPose(this._xrSessionManager.referenceSpace);\r\n if (!pose) {\r\n return;\r\n }\r\n const pos = pose.transform.position;\r\n const quat = pose.transform.orientation;\r\n this._tmpPos.set(pos.x, pos.y, pos.z).scaleInPlace(this._xrSessionManager.worldScalingFactor);\r\n this._tmpQuat.set(quat.x, quat.y, quat.z, quat.w);\r\n Matrix.FromFloat32ArrayToRefScaled(pose.transform.matrix, 0, 1, this._tmpMat);\r\n if (!this._xrSessionManager.scene.useRightHandedSystem) {\r\n this._tmpPos.z *= -1;\r\n this._tmpQuat.z *= -1;\r\n this._tmpQuat.w *= -1;\r\n this._tmpMat.toggleModelMatrixHandInPlace();\r\n }\r\n\r\n const result: IWebXRHitResult = {\r\n position: this.autoCloneTransformation ? this._tmpPos.clone() : this._tmpPos,\r\n rotationQuaternion: this.autoCloneTransformation ? this._tmpQuat.clone() : this._tmpQuat,\r\n transformationMatrix: this.autoCloneTransformation ? this._tmpMat.clone() : this._tmpMat,\r\n inputSource: inputSource,\r\n isTransient: !!inputSource,\r\n xrHitResult: hitTestResult,\r\n };\r\n results.push(result);\r\n });\r\n\r\n this.onHitTestResultObservable.notifyObservers(results);\r\n }\r\n}\r\n\r\n//register the plugin versions\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRHitTest.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRHitTest(xrSessionManager, options);\r\n },\r\n WebXRHitTest.Version,\r\n false\r\n);\r\n"]}
|
|
@@ -46,7 +46,7 @@ export interface IWebXRLegacyHitResult {
|
|
|
46
46
|
*/
|
|
47
47
|
export declare class WebXRHitTestLegacy extends WebXRAbstractFeature implements IWebXRHitTestFeature<IWebXRLegacyHitResult> {
|
|
48
48
|
/**
|
|
49
|
-
* options to use when constructing this feature
|
|
49
|
+
* [Empty Object] options to use when constructing this feature
|
|
50
50
|
*/
|
|
51
51
|
readonly options: IWebXRLegacyHitTestOptions;
|
|
52
52
|
private _direction;
|
|
@@ -78,7 +78,7 @@ export declare class WebXRHitTestLegacy extends WebXRAbstractFeature implements
|
|
|
78
78
|
*/
|
|
79
79
|
constructor(_xrSessionManager: WebXRSessionManager,
|
|
80
80
|
/**
|
|
81
|
-
* options to use when constructing this feature
|
|
81
|
+
* [Empty Object] options to use when constructing this feature
|
|
82
82
|
*/
|
|
83
83
|
options?: IWebXRLegacyHitTestOptions);
|
|
84
84
|
/**
|
|
@@ -16,7 +16,7 @@ export class WebXRHitTestLegacy extends WebXRAbstractFeature {
|
|
|
16
16
|
*/
|
|
17
17
|
constructor(_xrSessionManager,
|
|
18
18
|
/**
|
|
19
|
-
* options to use when constructing this feature
|
|
19
|
+
* [Empty Object] options to use when constructing this feature
|
|
20
20
|
*/
|
|
21
21
|
options = {}) {
|
|
22
22
|
super(_xrSessionManager);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebXRHitTestLegacy.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRHitTestLegacy.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IWebXRFeature } from \"../webXRFeaturesManager\";\r\nimport { WebXRFeaturesManager, WebXRFeatureName } from \"../webXRFeaturesManager\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport { Vector3, Matrix } from \"../../Maths/math.vector\";\r\nimport type { TransformNode } from \"../../Meshes/transformNode\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport { Tools } from \"../../Misc/tools\";\r\n\r\n// the plugin is registered at the end of the file\r\n\r\n/**\r\n * An interface for all Hit test features\r\n */\r\nexport interface IWebXRHitTestFeature<T extends IWebXRLegacyHitResult> extends IWebXRFeature {\r\n /**\r\n * Triggered when new babylon (transformed) hit test results are available\r\n */\r\n onHitTestResultObservable: Observable<T[]>;\r\n}\r\n\r\n/**\r\n * Options used for hit testing\r\n */\r\nexport interface IWebXRLegacyHitTestOptions {\r\n /**\r\n * Only test when user interacted with the scene. Default - hit test every frame\r\n */\r\n testOnPointerDownOnly?: boolean;\r\n /**\r\n * The node to use to transform the local results to world coordinates\r\n */\r\n worldParentNode?: TransformNode;\r\n}\r\n\r\n/**\r\n * Interface defining the babylon result of raycasting/hit-test\r\n */\r\nexport interface IWebXRLegacyHitResult {\r\n /**\r\n * Transformation matrix that can be applied to a node that will put it in the hit point location\r\n */\r\n transformationMatrix: Matrix;\r\n /**\r\n * The native hit test result\r\n */\r\n xrHitResult: XRHitResult | XRHitTestResult;\r\n}\r\n\r\n/**\r\n * The currently-working hit-test module.\r\n * Hit test (or Ray-casting) is used to interact with the real world.\r\n * For further information read here - https://github.com/immersive-web/hit-test\r\n */\r\nexport class WebXRHitTestLegacy extends WebXRAbstractFeature implements IWebXRHitTestFeature<IWebXRLegacyHitResult> {\r\n // in XR space z-forward is negative\r\n private _direction = new Vector3(0, 0, -1);\r\n private _mat = new Matrix();\r\n private _onSelectEnabled = false;\r\n private _origin = new Vector3(0, 0, 0);\r\n\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.HIT_TEST;\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 = 1;\r\n\r\n /**\r\n * Populated with the last native XR Hit Results\r\n */\r\n public lastNativeXRHitResults: XRHitResult[] = [];\r\n /**\r\n * Triggered when new babylon (transformed) hit test results are available\r\n */\r\n public onHitTestResultObservable: Observable<IWebXRLegacyHitResult[]> = new Observable();\r\n\r\n /**\r\n * Creates a new instance of the (legacy version) hit test feature\r\n * @param _xrSessionManager an instance of WebXRSessionManager\r\n * @param options options to use when constructing this feature\r\n */\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n /**\r\n * options to use when constructing this feature\r\n */\r\n public readonly options: IWebXRLegacyHitTestOptions = {}\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"hit-test\";\r\n Tools.Warn(\"A newer version of this plugin is available\");\r\n }\r\n\r\n /**\r\n * execute a hit test with an XR Ray\r\n *\r\n * @param xrSession a native xrSession that will execute this hit test\r\n * @param xrRay the ray (position and direction) to use for ray-casting\r\n * @param referenceSpace native XR reference space to use for the hit-test\r\n * @param filter filter function that will filter the results\r\n * @returns a promise that resolves with an array of native XR hit result in xr coordinates system\r\n */\r\n public static XRHitTestWithRay(xrSession: XRSession, xrRay: XRRay, referenceSpace: XRReferenceSpace, filter?: (result: XRHitResult) => boolean): Promise<XRHitResult[]> {\r\n return xrSession.requestHitTest!(xrRay, referenceSpace).then((results) => {\r\n const filterFunction = filter || ((result) => !!result.hitMatrix);\r\n return results.filter(filterFunction);\r\n });\r\n }\r\n\r\n /**\r\n * Execute a hit test on the current running session using a select event returned from a transient input (such as touch)\r\n * @param event the (select) event to use to select with\r\n * @param referenceSpace the reference space to use for this hit test\r\n * @returns a promise that resolves with an array of native XR hit result in xr coordinates system\r\n */\r\n public static XRHitTestWithSelectEvent(event: XRInputSourceEvent, referenceSpace: XRReferenceSpace): Promise<XRHitResult[]> {\r\n const targetRayPose = event.frame.getPose(event.inputSource.targetRaySpace, referenceSpace);\r\n if (!targetRayPose) {\r\n return Promise.resolve([]);\r\n }\r\n const targetRay = new XRRay(targetRayPose.transform);\r\n\r\n return this.XRHitTestWithRay(event.frame.session, targetRay, referenceSpace);\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 if (this.options.testOnPointerDownOnly) {\r\n this._xrSessionManager.session.addEventListener(\"select\", this._onSelect, false);\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 // disable select\r\n this._onSelectEnabled = false;\r\n this._xrSessionManager.session.removeEventListener(\"select\", this._onSelect);\r\n return true;\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached\r\n */\r\n public override dispose(): void {\r\n super.dispose();\r\n this.onHitTestResultObservable.clear();\r\n }\r\n\r\n protected _onXRFrame(frame: XRFrame) {\r\n // make sure we do nothing if (async) not attached\r\n if (!this.attached || this.options.testOnPointerDownOnly) {\r\n return;\r\n }\r\n const pose = frame.getViewerPose(this._xrSessionManager.referenceSpace);\r\n if (!pose) {\r\n return;\r\n }\r\n Matrix.FromArrayToRef(pose.transform.matrix, 0, this._mat);\r\n Vector3.TransformCoordinatesFromFloatsToRef(0, 0, 0, this._mat, this._origin);\r\n Vector3.TransformCoordinatesFromFloatsToRef(0, 0, -1, this._mat, this._direction);\r\n this._direction.subtractInPlace(this._origin);\r\n this._direction.normalize();\r\n const ray = new XRRay(\r\n <DOMPointReadOnly>{ x: this._origin.x, y: this._origin.y, z: this._origin.z, w: 0 },\r\n <DOMPointReadOnly>{ x: this._direction.x, y: this._direction.y, z: this._direction.z, w: 0 }\r\n );\r\n WebXRHitTestLegacy.XRHitTestWithRay(this._xrSessionManager.session, ray, this._xrSessionManager.referenceSpace).then(this._onHitTestResults);\r\n }\r\n\r\n private _onHitTestResults = (xrResults: XRHitResult[]) => {\r\n const mats = xrResults.map((result) => {\r\n const mat = Matrix.FromArray(result.hitMatrix);\r\n if (!this._xrSessionManager.scene.useRightHandedSystem) {\r\n mat.toggleModelMatrixHandInPlace();\r\n }\r\n // if (this.options.coordinatesSpace === Space.WORLD) {\r\n if (this.options.worldParentNode) {\r\n mat.multiplyToRef(this.options.worldParentNode.getWorldMatrix(), mat);\r\n }\r\n return {\r\n xrHitResult: result,\r\n transformationMatrix: mat,\r\n };\r\n });\r\n\r\n this.lastNativeXRHitResults = xrResults;\r\n this.onHitTestResultObservable.notifyObservers(mats);\r\n };\r\n\r\n // can be done using pointerdown event, and xrSessionManager.currentFrame\r\n private _onSelect = (event: XRInputSourceEvent) => {\r\n if (!this._onSelectEnabled) {\r\n return;\r\n }\r\n WebXRHitTestLegacy.XRHitTestWithSelectEvent(event, this._xrSessionManager.referenceSpace);\r\n };\r\n}\r\n\r\n//register the plugin versions\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRHitTestLegacy.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRHitTestLegacy(xrSessionManager, options);\r\n },\r\n WebXRHitTestLegacy.Version,\r\n false\r\n);\r\n"]}
|
|
1
|
+
{"version":3,"file":"WebXRHitTestLegacy.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRHitTestLegacy.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IWebXRFeature } from \"../webXRFeaturesManager\";\r\nimport { WebXRFeaturesManager, WebXRFeatureName } from \"../webXRFeaturesManager\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport { Vector3, Matrix } from \"../../Maths/math.vector\";\r\nimport type { TransformNode } from \"../../Meshes/transformNode\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport { Tools } from \"../../Misc/tools\";\r\n\r\n// the plugin is registered at the end of the file\r\n\r\n/**\r\n * An interface for all Hit test features\r\n */\r\nexport interface IWebXRHitTestFeature<T extends IWebXRLegacyHitResult> extends IWebXRFeature {\r\n /**\r\n * Triggered when new babylon (transformed) hit test results are available\r\n */\r\n onHitTestResultObservable: Observable<T[]>;\r\n}\r\n\r\n/**\r\n * Options used for hit testing\r\n */\r\nexport interface IWebXRLegacyHitTestOptions {\r\n /**\r\n * Only test when user interacted with the scene. Default - hit test every frame\r\n */\r\n testOnPointerDownOnly?: boolean;\r\n /**\r\n * The node to use to transform the local results to world coordinates\r\n */\r\n worldParentNode?: TransformNode;\r\n}\r\n\r\n/**\r\n * Interface defining the babylon result of raycasting/hit-test\r\n */\r\nexport interface IWebXRLegacyHitResult {\r\n /**\r\n * Transformation matrix that can be applied to a node that will put it in the hit point location\r\n */\r\n transformationMatrix: Matrix;\r\n /**\r\n * The native hit test result\r\n */\r\n xrHitResult: XRHitResult | XRHitTestResult;\r\n}\r\n\r\n/**\r\n * The currently-working hit-test module.\r\n * Hit test (or Ray-casting) is used to interact with the real world.\r\n * For further information read here - https://github.com/immersive-web/hit-test\r\n */\r\nexport class WebXRHitTestLegacy extends WebXRAbstractFeature implements IWebXRHitTestFeature<IWebXRLegacyHitResult> {\r\n // in XR space z-forward is negative\r\n private _direction = new Vector3(0, 0, -1);\r\n private _mat = new Matrix();\r\n private _onSelectEnabled = false;\r\n private _origin = new Vector3(0, 0, 0);\r\n\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.HIT_TEST;\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 = 1;\r\n\r\n /**\r\n * Populated with the last native XR Hit Results\r\n */\r\n public lastNativeXRHitResults: XRHitResult[] = [];\r\n /**\r\n * Triggered when new babylon (transformed) hit test results are available\r\n */\r\n public onHitTestResultObservable: Observable<IWebXRLegacyHitResult[]> = new Observable();\r\n\r\n /**\r\n * Creates a new instance of the (legacy version) hit test feature\r\n * @param _xrSessionManager an instance of WebXRSessionManager\r\n * @param options options to use when constructing this feature\r\n */\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n /**\r\n * [Empty Object] options to use when constructing this feature\r\n */\r\n public readonly options: IWebXRLegacyHitTestOptions = {}\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"hit-test\";\r\n Tools.Warn(\"A newer version of this plugin is available\");\r\n }\r\n\r\n /**\r\n * execute a hit test with an XR Ray\r\n *\r\n * @param xrSession a native xrSession that will execute this hit test\r\n * @param xrRay the ray (position and direction) to use for ray-casting\r\n * @param referenceSpace native XR reference space to use for the hit-test\r\n * @param filter filter function that will filter the results\r\n * @returns a promise that resolves with an array of native XR hit result in xr coordinates system\r\n */\r\n public static XRHitTestWithRay(xrSession: XRSession, xrRay: XRRay, referenceSpace: XRReferenceSpace, filter?: (result: XRHitResult) => boolean): Promise<XRHitResult[]> {\r\n return xrSession.requestHitTest!(xrRay, referenceSpace).then((results) => {\r\n const filterFunction = filter || ((result) => !!result.hitMatrix);\r\n return results.filter(filterFunction);\r\n });\r\n }\r\n\r\n /**\r\n * Execute a hit test on the current running session using a select event returned from a transient input (such as touch)\r\n * @param event the (select) event to use to select with\r\n * @param referenceSpace the reference space to use for this hit test\r\n * @returns a promise that resolves with an array of native XR hit result in xr coordinates system\r\n */\r\n public static XRHitTestWithSelectEvent(event: XRInputSourceEvent, referenceSpace: XRReferenceSpace): Promise<XRHitResult[]> {\r\n const targetRayPose = event.frame.getPose(event.inputSource.targetRaySpace, referenceSpace);\r\n if (!targetRayPose) {\r\n return Promise.resolve([]);\r\n }\r\n const targetRay = new XRRay(targetRayPose.transform);\r\n\r\n return this.XRHitTestWithRay(event.frame.session, targetRay, referenceSpace);\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 if (this.options.testOnPointerDownOnly) {\r\n this._xrSessionManager.session.addEventListener(\"select\", this._onSelect, false);\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 // disable select\r\n this._onSelectEnabled = false;\r\n this._xrSessionManager.session.removeEventListener(\"select\", this._onSelect);\r\n return true;\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached\r\n */\r\n public override dispose(): void {\r\n super.dispose();\r\n this.onHitTestResultObservable.clear();\r\n }\r\n\r\n protected _onXRFrame(frame: XRFrame) {\r\n // make sure we do nothing if (async) not attached\r\n if (!this.attached || this.options.testOnPointerDownOnly) {\r\n return;\r\n }\r\n const pose = frame.getViewerPose(this._xrSessionManager.referenceSpace);\r\n if (!pose) {\r\n return;\r\n }\r\n Matrix.FromArrayToRef(pose.transform.matrix, 0, this._mat);\r\n Vector3.TransformCoordinatesFromFloatsToRef(0, 0, 0, this._mat, this._origin);\r\n Vector3.TransformCoordinatesFromFloatsToRef(0, 0, -1, this._mat, this._direction);\r\n this._direction.subtractInPlace(this._origin);\r\n this._direction.normalize();\r\n const ray = new XRRay(\r\n <DOMPointReadOnly>{ x: this._origin.x, y: this._origin.y, z: this._origin.z, w: 0 },\r\n <DOMPointReadOnly>{ x: this._direction.x, y: this._direction.y, z: this._direction.z, w: 0 }\r\n );\r\n WebXRHitTestLegacy.XRHitTestWithRay(this._xrSessionManager.session, ray, this._xrSessionManager.referenceSpace).then(this._onHitTestResults);\r\n }\r\n\r\n private _onHitTestResults = (xrResults: XRHitResult[]) => {\r\n const mats = xrResults.map((result) => {\r\n const mat = Matrix.FromArray(result.hitMatrix);\r\n if (!this._xrSessionManager.scene.useRightHandedSystem) {\r\n mat.toggleModelMatrixHandInPlace();\r\n }\r\n // if (this.options.coordinatesSpace === Space.WORLD) {\r\n if (this.options.worldParentNode) {\r\n mat.multiplyToRef(this.options.worldParentNode.getWorldMatrix(), mat);\r\n }\r\n return {\r\n xrHitResult: result,\r\n transformationMatrix: mat,\r\n };\r\n });\r\n\r\n this.lastNativeXRHitResults = xrResults;\r\n this.onHitTestResultObservable.notifyObservers(mats);\r\n };\r\n\r\n // can be done using pointerdown event, and xrSessionManager.currentFrame\r\n private _onSelect = (event: XRInputSourceEvent) => {\r\n if (!this._onSelectEnabled) {\r\n return;\r\n }\r\n WebXRHitTestLegacy.XRHitTestWithSelectEvent(event, this._xrSessionManager.referenceSpace);\r\n };\r\n}\r\n\r\n//register the plugin versions\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRHitTestLegacy.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRHitTestLegacy(xrSessionManager, options);\r\n },\r\n WebXRHitTestLegacy.Version,\r\n false\r\n);\r\n"]}
|
|
@@ -111,9 +111,7 @@ export class WebXRRawCameraAccess extends WebXRAbstractFeature {
|
|
|
111
111
|
const lp = this._glBinding?.getCameraImage(view.camera);
|
|
112
112
|
if (!this._cachedInternalTextures[index]) {
|
|
113
113
|
const internalTexture = new InternalTexture(this._xrSessionManager.scene.getEngine(), InternalTextureSource.Unknown, true);
|
|
114
|
-
internalTexture.isCube = true;
|
|
115
114
|
internalTexture.invertY = false;
|
|
116
|
-
// internalTexture._useSRGBBuffer = this.options.reflectionFormat === "srgba8";
|
|
117
115
|
internalTexture.format = 5;
|
|
118
116
|
internalTexture.generateMipMaps = true;
|
|
119
117
|
internalTexture.type = 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebXRRawCameraAccess.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRRawCameraAccess.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebXRFeatureName, WebXRFeaturesManager } from \"../webXRFeaturesManager\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport { WebGLHardwareTexture } from \"../../Engines/WebGL/webGLHardwareTexture\";\r\nimport { InternalTexture, InternalTextureSource } from \"../../Materials/Textures/internalTexture\";\r\nimport { BaseTexture } from \"../../Materials/Textures/baseTexture\";\r\nimport type { ThinEngine } from \"../../Engines\";\r\n\r\n/**\r\n * Options for raw camera access\r\n */\r\nexport interface IWebXRRawCameraAccessOptions {\r\n /**\r\n * Keep the created textures and metadata when detaching the feature.\r\n */\r\n doNotDisposeOnDetach?: boolean;\r\n}\r\n\r\n/**\r\n * WebXR Feature for WebXR raw camera access\r\n * @since 6.31.0\r\n * @see https://immersive-web.github.io/raw-camera-access/\r\n */\r\nexport class WebXRRawCameraAccess extends WebXRAbstractFeature {\r\n private _cachedInternalTextures: InternalTexture[] = [];\r\n /**\r\n * This is an array of camera views\r\n * Note that mostly the array will contain a single view\r\n * If you want to know the order of the views, use the `viewIndex` array\r\n */\r\n public texturesData: BaseTexture[] = [];\r\n /**\r\n * If needed, this array will contain the eye definition of each texture in `texturesArray`\r\n */\r\n public viewIndex: string[] = [];\r\n\r\n /**\r\n * If needed, this array will contain the camera's intrinsics\r\n * You can use this data to convert from camera space to screen space and vice versa\r\n */\r\n public cameraIntrinsics: {\r\n u0: number;\r\n v0: number;\r\n ax: number;\r\n ay: number;\r\n gamma: number;\r\n width: number;\r\n height: number;\r\n viewportX: number;\r\n viewportY: number;\r\n }[] = [];\r\n\r\n /**\r\n * An observable that will notify when the camera's textures are updated\r\n */\r\n public onTexturesUpdatedObservable: Observable<BaseTexture[]> = new Observable();\r\n\r\n private _glBinding?: XRWebGLBinding;\r\n private _glContext: WebGLRenderingContext;\r\n\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.RAW_CAMERA_ACCESS;\r\n\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 = 1;\r\n\r\n /**\r\n * Creates a new instance of the feature\r\n * @param _xrSessionManager the WebXRSessionManager\r\n * @param options options for the Feature\r\n */\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n public readonly options: IWebXRRawCameraAccessOptions = {}\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"camera-access\";\r\n }\r\n\r\n public override attach(force?: boolean | undefined): boolean {\r\n if (!super.attach(force)) {\r\n return false;\r\n }\r\n\r\n this._glContext = (this._xrSessionManager.scene.getEngine() as ThinEngine)._gl;\r\n this._glBinding = new XRWebGLBinding(this._xrSessionManager.session, this._glContext);\r\n\r\n return true;\r\n }\r\n\r\n public override detach(): boolean {\r\n if (!super.detach()) {\r\n return false;\r\n }\r\n this._glBinding = undefined;\r\n if (!this.options.doNotDisposeOnDetach) {\r\n this._cachedInternalTextures.forEach((t) => t.dispose());\r\n this.texturesData.forEach((t) => t.dispose());\r\n this._cachedInternalTextures.length = 0;\r\n this.texturesData.length = 0;\r\n this.cameraIntrinsics.length = 0;\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached\r\n */\r\n public override dispose(): void {\r\n super.dispose();\r\n this.onTexturesUpdatedObservable.clear();\r\n }\r\n\r\n /**\r\n * @see https://github.com/immersive-web/raw-camera-access/blob/main/explainer.md\r\n * @param view the XRView to update\r\n * @param index the index of the view in the views array\r\n */\r\n private _updateCameraIntrinsics(view: XRView, index: number): void {\r\n const cameraViewport = {\r\n width: view.camera!.width,\r\n height: view.camera!.height,\r\n x: 0,\r\n y: 0,\r\n };\r\n const p = view.projectionMatrix;\r\n\r\n // Principal point in pixels (typically at or near the center of the viewport)\r\n const u0 = ((1 - p[8]) * cameraViewport.width) / 2 + cameraViewport.x;\r\n const v0 = ((1 - p[9]) * cameraViewport.height) / 2 + cameraViewport.y;\r\n\r\n // Focal lengths in pixels (these are equal for square pixels)\r\n const ax = (cameraViewport.width / 2) * p[0];\r\n const ay = (cameraViewport.height / 2) * p[5];\r\n\r\n // Skew factor in pixels (nonzero for rhomboid pixels)\r\n const gamma = (cameraViewport.width / 2) * p[4];\r\n this.cameraIntrinsics[index] = {\r\n u0,\r\n v0,\r\n ax,\r\n ay,\r\n gamma,\r\n width: cameraViewport.width,\r\n height: cameraViewport.height,\r\n viewportX: cameraViewport.x,\r\n viewportY: cameraViewport.y,\r\n };\r\n }\r\n\r\n private _updateInternalTextures(view: XRView, index = 0): boolean {\r\n if (!view.camera) {\r\n return false;\r\n }\r\n this.viewIndex[index] = view.eye;\r\n const lp = this._glBinding?.getCameraImage(view.camera);\r\n\r\n if (!this._cachedInternalTextures[index]) {\r\n const internalTexture = new InternalTexture(this._xrSessionManager.scene.getEngine(), InternalTextureSource.Unknown, true);\r\n internalTexture.isCube = true;\r\n internalTexture.invertY = false;\r\n // internalTexture._useSRGBBuffer = this.options.reflectionFormat === \"srgba8\";\r\n internalTexture.format = Constants.TEXTUREFORMAT_RGBA;\r\n internalTexture.generateMipMaps = true;\r\n internalTexture.type = Constants.TEXTURETYPE_FLOAT;\r\n internalTexture.samplingMode = Constants.TEXTURE_LINEAR_LINEAR_MIPLINEAR;\r\n internalTexture.width = view.camera.width;\r\n internalTexture.height = view.camera.height;\r\n internalTexture._cachedWrapU = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n internalTexture._cachedWrapV = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n internalTexture._hardwareTexture = new WebGLHardwareTexture(lp, this._glContext);\r\n this._cachedInternalTextures[index] = internalTexture;\r\n // create the base texture\r\n const texture = new BaseTexture(this._xrSessionManager.scene);\r\n texture.name = `WebXR Raw Camera Access (${index})`;\r\n texture._texture = this._cachedInternalTextures[index];\r\n this.texturesData[index] = texture;\r\n // get the camera intrinsics\r\n this._updateCameraIntrinsics(view, index);\r\n } else {\r\n // make sure the webgl texture is updated. Should happen automatically\r\n this._cachedInternalTextures[index]._hardwareTexture?.set(lp);\r\n }\r\n this._cachedInternalTextures[index].isReady = true;\r\n return true;\r\n }\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame): void {\r\n const referenceSPace = this._xrSessionManager.referenceSpace;\r\n\r\n const pose = _xrFrame.getViewerPose(referenceSPace);\r\n if (!pose || !pose.views) {\r\n return;\r\n }\r\n let updated = true;\r\n pose.views.forEach((view, index) => {\r\n updated = updated && this._updateInternalTextures(view, index);\r\n });\r\n if (updated) {\r\n this.onTexturesUpdatedObservable.notifyObservers(this.texturesData);\r\n }\r\n }\r\n}\r\n\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRRawCameraAccess.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRRawCameraAccess(xrSessionManager, options);\r\n },\r\n WebXRRawCameraAccess.Version,\r\n false\r\n);\r\n"]}
|
|
1
|
+
{"version":3,"file":"WebXRRawCameraAccess.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRRawCameraAccess.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebXRFeatureName, WebXRFeaturesManager } from \"../webXRFeaturesManager\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport { WebGLHardwareTexture } from \"../../Engines/WebGL/webGLHardwareTexture\";\r\nimport { InternalTexture, InternalTextureSource } from \"../../Materials/Textures/internalTexture\";\r\nimport { BaseTexture } from \"../../Materials/Textures/baseTexture\";\r\nimport type { ThinEngine } from \"../../Engines\";\r\n\r\n/**\r\n * Options for raw camera access\r\n */\r\nexport interface IWebXRRawCameraAccessOptions {\r\n /**\r\n * Keep the created textures and metadata when detaching the feature.\r\n */\r\n doNotDisposeOnDetach?: boolean;\r\n}\r\n\r\n/**\r\n * WebXR Feature for WebXR raw camera access\r\n * @since 6.31.0\r\n * @see https://immersive-web.github.io/raw-camera-access/\r\n */\r\nexport class WebXRRawCameraAccess extends WebXRAbstractFeature {\r\n private _cachedInternalTextures: InternalTexture[] = [];\r\n /**\r\n * This is an array of camera views\r\n * Note that mostly the array will contain a single view\r\n * If you want to know the order of the views, use the `viewIndex` array\r\n */\r\n public texturesData: BaseTexture[] = [];\r\n /**\r\n * If needed, this array will contain the eye definition of each texture in `texturesArray`\r\n */\r\n public viewIndex: string[] = [];\r\n\r\n /**\r\n * If needed, this array will contain the camera's intrinsics\r\n * You can use this data to convert from camera space to screen space and vice versa\r\n */\r\n public cameraIntrinsics: {\r\n u0: number;\r\n v0: number;\r\n ax: number;\r\n ay: number;\r\n gamma: number;\r\n width: number;\r\n height: number;\r\n viewportX: number;\r\n viewportY: number;\r\n }[] = [];\r\n\r\n /**\r\n * An observable that will notify when the camera's textures are updated\r\n */\r\n public onTexturesUpdatedObservable: Observable<BaseTexture[]> = new Observable();\r\n\r\n private _glBinding?: XRWebGLBinding;\r\n private _glContext: WebGLRenderingContext;\r\n\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.RAW_CAMERA_ACCESS;\r\n\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 = 1;\r\n\r\n /**\r\n * Creates a new instance of the feature\r\n * @param _xrSessionManager the WebXRSessionManager\r\n * @param options options for the Feature\r\n */\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n public readonly options: IWebXRRawCameraAccessOptions = {}\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"camera-access\";\r\n }\r\n\r\n public override attach(force?: boolean | undefined): boolean {\r\n if (!super.attach(force)) {\r\n return false;\r\n }\r\n\r\n this._glContext = (this._xrSessionManager.scene.getEngine() as ThinEngine)._gl;\r\n this._glBinding = new XRWebGLBinding(this._xrSessionManager.session, this._glContext);\r\n\r\n return true;\r\n }\r\n\r\n public override detach(): boolean {\r\n if (!super.detach()) {\r\n return false;\r\n }\r\n this._glBinding = undefined;\r\n if (!this.options.doNotDisposeOnDetach) {\r\n this._cachedInternalTextures.forEach((t) => t.dispose());\r\n this.texturesData.forEach((t) => t.dispose());\r\n this._cachedInternalTextures.length = 0;\r\n this.texturesData.length = 0;\r\n this.cameraIntrinsics.length = 0;\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached\r\n */\r\n public override dispose(): void {\r\n super.dispose();\r\n this.onTexturesUpdatedObservable.clear();\r\n }\r\n\r\n /**\r\n * @see https://github.com/immersive-web/raw-camera-access/blob/main/explainer.md\r\n * @param view the XRView to update\r\n * @param index the index of the view in the views array\r\n */\r\n private _updateCameraIntrinsics(view: XRView, index: number): void {\r\n const cameraViewport = {\r\n width: view.camera!.width,\r\n height: view.camera!.height,\r\n x: 0,\r\n y: 0,\r\n };\r\n const p = view.projectionMatrix;\r\n\r\n // Principal point in pixels (typically at or near the center of the viewport)\r\n const u0 = ((1 - p[8]) * cameraViewport.width) / 2 + cameraViewport.x;\r\n const v0 = ((1 - p[9]) * cameraViewport.height) / 2 + cameraViewport.y;\r\n\r\n // Focal lengths in pixels (these are equal for square pixels)\r\n const ax = (cameraViewport.width / 2) * p[0];\r\n const ay = (cameraViewport.height / 2) * p[5];\r\n\r\n // Skew factor in pixels (nonzero for rhomboid pixels)\r\n const gamma = (cameraViewport.width / 2) * p[4];\r\n this.cameraIntrinsics[index] = {\r\n u0,\r\n v0,\r\n ax,\r\n ay,\r\n gamma,\r\n width: cameraViewport.width,\r\n height: cameraViewport.height,\r\n viewportX: cameraViewport.x,\r\n viewportY: cameraViewport.y,\r\n };\r\n }\r\n\r\n private _updateInternalTextures(view: XRView, index = 0): boolean {\r\n if (!view.camera) {\r\n return false;\r\n }\r\n this.viewIndex[index] = view.eye;\r\n const lp = this._glBinding?.getCameraImage(view.camera);\r\n\r\n if (!this._cachedInternalTextures[index]) {\r\n const internalTexture = new InternalTexture(this._xrSessionManager.scene.getEngine(), InternalTextureSource.Unknown, true);\r\n internalTexture.invertY = false;\r\n internalTexture.format = Constants.TEXTUREFORMAT_RGBA;\r\n internalTexture.generateMipMaps = true;\r\n internalTexture.type = Constants.TEXTURETYPE_FLOAT;\r\n internalTexture.samplingMode = Constants.TEXTURE_LINEAR_LINEAR_MIPLINEAR;\r\n internalTexture.width = view.camera.width;\r\n internalTexture.height = view.camera.height;\r\n internalTexture._cachedWrapU = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n internalTexture._cachedWrapV = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n internalTexture._hardwareTexture = new WebGLHardwareTexture(lp, this._glContext);\r\n this._cachedInternalTextures[index] = internalTexture;\r\n // create the base texture\r\n const texture = new BaseTexture(this._xrSessionManager.scene);\r\n texture.name = `WebXR Raw Camera Access (${index})`;\r\n texture._texture = this._cachedInternalTextures[index];\r\n this.texturesData[index] = texture;\r\n // get the camera intrinsics\r\n this._updateCameraIntrinsics(view, index);\r\n } else {\r\n // make sure the webgl texture is updated. Should happen automatically\r\n this._cachedInternalTextures[index]._hardwareTexture?.set(lp);\r\n }\r\n this._cachedInternalTextures[index].isReady = true;\r\n return true;\r\n }\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame): void {\r\n const referenceSPace = this._xrSessionManager.referenceSpace;\r\n\r\n const pose = _xrFrame.getViewerPose(referenceSPace);\r\n if (!pose || !pose.views) {\r\n return;\r\n }\r\n let updated = true;\r\n pose.views.forEach((view, index) => {\r\n updated = updated && this._updateInternalTextures(view, index);\r\n });\r\n if (updated) {\r\n this.onTexturesUpdatedObservable.notifyObservers(this.texturesData);\r\n }\r\n }\r\n}\r\n\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRRawCameraAccess.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRRawCameraAccess(xrSessionManager, options);\r\n },\r\n WebXRRawCameraAccess.Version,\r\n false\r\n);\r\n"]}
|
|
@@ -227,6 +227,7 @@ export declare abstract class WebXRAbstractMotionController implements IDisposab
|
|
|
227
227
|
handedness: MotionControllerHandedness;
|
|
228
228
|
/**
|
|
229
229
|
* @internal
|
|
230
|
+
* [false]
|
|
230
231
|
*/
|
|
231
232
|
_doNotLoadControllerMesh: boolean;
|
|
232
233
|
private _controllerCache?;
|
|
@@ -275,6 +276,7 @@ export declare abstract class WebXRAbstractMotionController implements IDisposab
|
|
|
275
276
|
handedness: MotionControllerHandedness,
|
|
276
277
|
/**
|
|
277
278
|
* @internal
|
|
279
|
+
* [false]
|
|
278
280
|
*/
|
|
279
281
|
_doNotLoadControllerMesh?: boolean, _controllerCache?: {
|
|
280
282
|
filename: string;
|