@babylonjs/core 6.43.0 → 6.45.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Animations/animatable.js +2 -2
- package/Animations/animatable.js.map +1 -1
- package/Animations/animationGroup.d.ts +4 -2
- package/Animations/animationGroup.js +22 -2
- package/Animations/animationGroup.js.map +1 -1
- package/Buffers/buffer.d.ts +22 -22
- package/Buffers/buffer.js +16 -15
- package/Buffers/buffer.js.map +1 -1
- package/Cameras/camera.d.ts +5 -5
- package/Cameras/camera.js +19 -19
- package/Cameras/camera.js.map +1 -1
- package/Culling/ray.d.ts +12 -1
- package/Culling/ray.js +20 -3
- package/Culling/ray.js.map +1 -1
- package/Debug/skeletonViewer.d.ts +2 -0
- package/Debug/skeletonViewer.js +111 -50
- package/Debug/skeletonViewer.js.map +1 -1
- package/Engines/ICanvas.d.ts +2 -1
- package/Engines/ICanvas.js.map +1 -1
- package/Engines/constants.d.ts +96 -0
- package/Engines/constants.js +96 -0
- package/Engines/constants.js.map +1 -1
- package/Engines/engine.d.ts +14 -3
- package/Engines/engine.js +11 -0
- package/Engines/engine.js.map +1 -1
- package/Engines/nullEngine.d.ts +2 -0
- package/Engines/nullEngine.js +3 -0
- package/Engines/nullEngine.js.map +1 -1
- package/Engines/thinEngine.d.ts +4 -1
- package/Engines/thinEngine.js +2 -2
- package/Engines/thinEngine.js.map +1 -1
- package/Gizmos/gizmo.d.ts +14 -0
- package/Gizmos/gizmo.js +16 -0
- package/Gizmos/gizmo.js.map +1 -1
- package/Gizmos/gizmoManager.d.ts +12 -0
- package/Gizmos/gizmoManager.js +26 -0
- package/Gizmos/gizmoManager.js.map +1 -1
- package/Gizmos/positionGizmo.d.ts +16 -2
- package/Gizmos/positionGizmo.js +12 -2
- package/Gizmos/positionGizmo.js.map +1 -1
- package/Gizmos/rotationGizmo.d.ts +8 -0
- package/Gizmos/rotationGizmo.js +9 -0
- package/Gizmos/rotationGizmo.js.map +1 -1
- package/Gizmos/scaleGizmo.d.ts +15 -1
- package/Gizmos/scaleGizmo.js +11 -1
- package/Gizmos/scaleGizmo.js.map +1 -1
- package/Inputs/scene.inputManager.js +2 -2
- package/Inputs/scene.inputManager.js.map +1 -1
- package/Layers/effectLayer.js +4 -4
- package/Layers/effectLayer.js.map +1 -1
- package/Lights/Shadows/shadowGenerator.js +5 -5
- package/Lights/Shadows/shadowGenerator.js.map +1 -1
- package/Materials/Background/backgroundMaterial.js +16 -16
- package/Materials/Background/backgroundMaterial.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.js +8 -8
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.js.map +1 -1
- package/Materials/Node/Blocks/Dual/fogBlock.js +2 -2
- package/Materials/Node/Blocks/Dual/fogBlock.js.map +1 -1
- package/Materials/Node/Blocks/Dual/lightBlock.js +6 -6
- package/Materials/Node/Blocks/Dual/lightBlock.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js +2 -2
- package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js +7 -7
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
- package/Materials/Node/Blocks/Vertex/bonesBlock.js +3 -3
- package/Materials/Node/Blocks/Vertex/bonesBlock.js.map +1 -1
- package/Materials/Node/Blocks/Vertex/morphTargetsBlock.js +3 -3
- package/Materials/Node/Blocks/Vertex/morphTargetsBlock.js.map +1 -1
- package/Materials/Node/nodeMaterial.d.ts +50 -0
- package/Materials/Node/nodeMaterial.js +53 -3
- package/Materials/Node/nodeMaterial.js.map +1 -1
- package/Materials/PBR/pbrAnisotropicConfiguration.js +3 -3
- package/Materials/PBR/pbrAnisotropicConfiguration.js.map +1 -1
- package/Materials/PBR/pbrBaseMaterial.js +41 -41
- package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
- package/Materials/PBR/pbrClearCoatConfiguration.js +10 -10
- package/Materials/PBR/pbrClearCoatConfiguration.js.map +1 -1
- package/Materials/PBR/pbrIridescenceConfiguration.js +6 -6
- package/Materials/PBR/pbrIridescenceConfiguration.js.map +1 -1
- package/Materials/PBR/pbrSheenConfiguration.js +6 -6
- package/Materials/PBR/pbrSheenConfiguration.js.map +1 -1
- package/Materials/PBR/pbrSubSurfaceConfiguration.js +7 -7
- package/Materials/PBR/pbrSubSurfaceConfiguration.js.map +1 -1
- package/Materials/Textures/Loaders/ktxTextureLoader.js +1 -1
- package/Materials/Textures/Loaders/ktxTextureLoader.js.map +1 -1
- package/Materials/Textures/dynamicTexture.js +1 -1
- package/Materials/Textures/dynamicTexture.js.map +1 -1
- package/Materials/Textures/texture.js +1 -1
- package/Materials/Textures/texture.js.map +1 -1
- package/Materials/index.d.ts +1 -0
- package/Materials/index.js +1 -0
- package/Materials/index.js.map +1 -1
- package/Materials/material.decalMapConfiguration.js +3 -3
- package/Materials/material.decalMapConfiguration.js.map +1 -1
- package/Materials/material.detailMapConfiguration.js +3 -3
- package/Materials/material.detailMapConfiguration.js.map +1 -1
- package/Materials/material.js +2 -2
- package/Materials/material.js.map +1 -1
- package/Materials/materialHelper.d.ts +1 -4
- package/Materials/materialHelper.functions.d.ts +275 -0
- package/Materials/materialHelper.functions.js +823 -0
- package/Materials/materialHelper.functions.js.map +1 -0
- package/Materials/materialHelper.js +64 -589
- package/Materials/materialHelper.js.map +1 -1
- package/Materials/materialPluginBase.d.ts +1 -1
- package/Materials/materialPluginBase.js +1 -1
- package/Materials/materialPluginBase.js.map +1 -1
- package/Materials/shaderMaterial.js +8 -8
- package/Materials/shaderMaterial.js.map +1 -1
- package/Materials/standardMaterial.js +33 -33
- package/Materials/standardMaterial.js.map +1 -1
- package/Meshes/Compression/dracoCompression.d.ts +23 -2
- package/Meshes/Compression/dracoCompression.js +76 -236
- package/Meshes/Compression/dracoCompression.js.map +1 -1
- package/Meshes/Compression/dracoCompressionWorker.d.ts +44 -0
- package/Meshes/Compression/dracoCompressionWorker.js +189 -0
- package/Meshes/Compression/dracoCompressionWorker.js.map +1 -0
- package/Meshes/GreasedLine/greasedLineBaseMesh.d.ts +3 -1
- package/Meshes/GreasedLine/greasedLineBaseMesh.js +4 -2
- package/Meshes/GreasedLine/greasedLineBaseMesh.js.map +1 -1
- package/Meshes/Node/Blocks/geometryDistanceBlock.d.ts +30 -0
- package/Meshes/Node/Blocks/geometryDistanceBlock.js +63 -0
- package/Meshes/Node/Blocks/geometryDistanceBlock.js.map +1 -0
- package/Meshes/Node/Blocks/geometryDotBlock.d.ts +30 -0
- package/Meshes/Node/Blocks/geometryDotBlock.js +63 -0
- package/Meshes/Node/Blocks/geometryDotBlock.js.map +1 -0
- package/Meshes/Node/Blocks/geometryLengthBlock.d.ts +26 -0
- package/Meshes/Node/Blocks/geometryLengthBlock.js +52 -0
- package/Meshes/Node/Blocks/geometryLengthBlock.js.map +1 -0
- package/Meshes/Node/Blocks/geometryPosterizeBlock.d.ts +31 -0
- package/Meshes/Node/Blocks/geometryPosterizeBlock.js +63 -0
- package/Meshes/Node/Blocks/geometryPosterizeBlock.js.map +1 -0
- package/Meshes/Node/Blocks/geometryReplaceColorBlock.d.ts +38 -0
- package/Meshes/Node/Blocks/geometryReplaceColorBlock.js +88 -0
- package/Meshes/Node/Blocks/geometryReplaceColorBlock.js.map +1 -0
- package/Meshes/Node/Blocks/geometryRotate2dBlock.d.ts +30 -0
- package/Meshes/Node/Blocks/geometryRotate2dBlock.js +59 -0
- package/Meshes/Node/Blocks/geometryRotate2dBlock.js.map +1 -0
- package/Meshes/Node/index.d.ts +6 -0
- package/Meshes/Node/index.js +6 -0
- package/Meshes/Node/index.js.map +1 -1
- package/Meshes/trailMesh.js +1 -1
- package/Meshes/trailMesh.js.map +1 -1
- package/Misc/basis.d.ts +6 -1
- package/Misc/basis.js +11 -231
- package/Misc/basis.js.map +1 -1
- package/Misc/basisWorker.d.ts +13 -0
- package/Misc/basisWorker.js +249 -0
- package/Misc/basisWorker.js.map +1 -0
- package/Misc/khronosTextureContainer2.d.ts +25 -3
- package/Misc/khronosTextureContainer2.js +35 -106
- package/Misc/khronosTextureContainer2.js.map +1 -1
- package/Misc/khronosTextureContainer2Worker.d.ts +12 -0
- package/Misc/khronosTextureContainer2Worker.js +136 -0
- package/Misc/khronosTextureContainer2Worker.js.map +1 -0
- package/Navigation/Plugins/recastJSPlugin.d.ts +1 -1
- package/Navigation/Plugins/recastJSPlugin.js.map +1 -1
- package/Particles/gpuParticleSystem.js +3 -3
- package/Particles/gpuParticleSystem.js.map +1 -1
- package/Particles/particleSystem.js +7 -3
- package/Particles/particleSystem.js.map +1 -1
- package/Physics/v2/IPhysicsEnginePlugin.d.ts +8 -0
- package/Physics/v2/IPhysicsEnginePlugin.js +9 -0
- package/Physics/v2/IPhysicsEnginePlugin.js.map +1 -1
- package/Physics/v2/Plugins/havokPlugin.d.ts +7 -1
- package/Physics/v2/Plugins/havokPlugin.js +19 -1
- package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
- package/PostProcesses/volumetricLightScatteringPostProcess.js +2 -2
- package/PostProcesses/volumetricLightScatteringPostProcess.js.map +1 -1
- package/Rendering/depthRenderer.js +4 -4
- package/Rendering/depthRenderer.js.map +1 -1
- package/Rendering/geometryBufferRenderer.js +5 -5
- package/Rendering/geometryBufferRenderer.js.map +1 -1
- package/Rendering/outlineRenderer.js +4 -4
- package/Rendering/outlineRenderer.js.map +1 -1
- package/XR/features/Layers/WebXRCompositionLayer.d.ts +48 -0
- package/XR/features/Layers/WebXRCompositionLayer.js +94 -0
- package/XR/features/Layers/WebXRCompositionLayer.js.map +1 -0
- package/XR/features/Layers/WebXRProjectionLayer.d.ts +10 -0
- package/XR/features/Layers/WebXRProjectionLayer.js +51 -0
- package/XR/features/Layers/WebXRProjectionLayer.js.map +1 -0
- package/XR/features/WebXRControllerPointerSelection.js +4 -1
- package/XR/features/WebXRControllerPointerSelection.js.map +1 -1
- package/XR/features/WebXRControllerTeleportation.js +11 -10
- package/XR/features/WebXRControllerTeleportation.js.map +1 -1
- package/XR/features/WebXRHandTracking.d.ts +7 -1
- package/XR/features/WebXRHandTracking.js +28 -26
- package/XR/features/WebXRHandTracking.js.map +1 -1
- package/XR/features/WebXRLayers.d.ts +44 -26
- package/XR/features/WebXRLayers.js +204 -153
- package/XR/features/WebXRLayers.js.map +1 -1
- package/XR/features/WebXRNearInteraction.js +16 -1
- package/XR/features/WebXRNearInteraction.js.map +1 -1
- package/XR/webXRCamera.js +10 -0
- package/XR/webXRCamera.js.map +1 -1
- package/XR/webXRDefaultExperience.d.ts +9 -0
- package/XR/webXRDefaultExperience.js +8 -0
- package/XR/webXRDefaultExperience.js.map +1 -1
- package/XR/webXRExperienceHelper.js +1 -1
- package/XR/webXRExperienceHelper.js.map +1 -1
- package/XR/webXRFeaturesManager.js +8 -2
- package/XR/webXRFeaturesManager.js.map +1 -1
- package/XR/webXRLayerWrapper.d.ts +12 -3
- package/XR/webXRLayerWrapper.js +18 -2
- package/XR/webXRLayerWrapper.js.map +1 -1
- package/XR/webXRRenderTargetTextureProvider.js +0 -5
- package/XR/webXRRenderTargetTextureProvider.js.map +1 -1
- package/XR/webXRSessionManager.d.ts +9 -1
- package/XR/webXRSessionManager.js +24 -5
- package/XR/webXRSessionManager.js.map +1 -1
- package/package.json +1 -1
- package/scene.d.ts +13 -5
- package/scene.js +4 -4
- package/scene.js.map +1 -1
|
@@ -1,141 +1,10 @@
|
|
|
1
1
|
import { WebXRFeatureName, WebXRFeaturesManager } from "../webXRFeaturesManager.js";
|
|
2
2
|
import { WebXRAbstractFeature } from "./WebXRAbstractFeature.js";
|
|
3
|
-
import { WebXRLayerRenderTargetTextureProvider } from "../webXRRenderTargetTextureProvider.js";
|
|
4
|
-
import { WebXRLayerWrapper } from "../webXRLayerWrapper.js";
|
|
5
3
|
import { WebXRWebGLLayerWrapper } from "../webXRWebGLLayer.js";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
*/
|
|
10
|
-
export class WebXRCompositionLayerWrapper extends WebXRLayerWrapper {
|
|
11
|
-
constructor(getWidth, getHeight, layer, layerType, isMultiview, createRTTProvider) {
|
|
12
|
-
super(getWidth, getHeight, layer, layerType, createRTTProvider);
|
|
13
|
-
this.getWidth = getWidth;
|
|
14
|
-
this.getHeight = getHeight;
|
|
15
|
-
this.layer = layer;
|
|
16
|
-
this.layerType = layerType;
|
|
17
|
-
this.isMultiview = isMultiview;
|
|
18
|
-
this.createRTTProvider = createRTTProvider;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Provides render target textures and other important rendering information for a given XRCompositionLayer.
|
|
23
|
-
* @internal
|
|
24
|
-
*/
|
|
25
|
-
class WebXRCompositionLayerRenderTargetTextureProvider extends WebXRLayerRenderTargetTextureProvider {
|
|
26
|
-
constructor(_xrSessionManager, _xrWebGLBinding, layerWrapper) {
|
|
27
|
-
super(_xrSessionManager.scene, layerWrapper);
|
|
28
|
-
this._xrSessionManager = _xrSessionManager;
|
|
29
|
-
this._xrWebGLBinding = _xrWebGLBinding;
|
|
30
|
-
this.layerWrapper = layerWrapper;
|
|
31
|
-
this._lastSubImages = new Map();
|
|
32
|
-
this._compositionLayer = layerWrapper.layer;
|
|
33
|
-
}
|
|
34
|
-
_getRenderTargetForSubImage(subImage, eye) {
|
|
35
|
-
const lastSubImage = this._lastSubImages.get(eye);
|
|
36
|
-
const eyeIndex = eye == "left" ? 0 : 1;
|
|
37
|
-
const colorTextureWidth = subImage.colorTextureWidth ?? subImage.textureWidth;
|
|
38
|
-
const colorTextureHeight = subImage.colorTextureHeight ?? subImage.textureHeight;
|
|
39
|
-
if (!this._renderTargetTextures[eyeIndex] || lastSubImage?.textureWidth !== colorTextureWidth || lastSubImage?.textureHeight !== colorTextureHeight) {
|
|
40
|
-
let depthStencilTexture;
|
|
41
|
-
const depthStencilTextureWidth = subImage.depthStencilTextureWidth ?? colorTextureWidth;
|
|
42
|
-
const depthStencilTextureHeight = subImage.depthStencilTextureHeight ?? colorTextureHeight;
|
|
43
|
-
if (colorTextureWidth === depthStencilTextureWidth || colorTextureHeight === depthStencilTextureHeight) {
|
|
44
|
-
depthStencilTexture = subImage.depthStencilTexture;
|
|
45
|
-
}
|
|
46
|
-
this._renderTargetTextures[eyeIndex] = this._createRenderTargetTexture(colorTextureWidth, colorTextureHeight, null, subImage.colorTexture, depthStencilTexture, this.layerWrapper.isMultiview);
|
|
47
|
-
this._framebufferDimensions = {
|
|
48
|
-
framebufferWidth: colorTextureWidth,
|
|
49
|
-
framebufferHeight: colorTextureHeight,
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
this._lastSubImages.set(eye, subImage);
|
|
53
|
-
return this._renderTargetTextures[eyeIndex];
|
|
54
|
-
}
|
|
55
|
-
_getSubImageForEye(eye) {
|
|
56
|
-
const currentFrame = this._xrSessionManager.currentFrame;
|
|
57
|
-
if (currentFrame) {
|
|
58
|
-
return this._xrWebGLBinding.getSubImage(this._compositionLayer, currentFrame, eye);
|
|
59
|
-
}
|
|
60
|
-
return null;
|
|
61
|
-
}
|
|
62
|
-
getRenderTargetTextureForEye(eye) {
|
|
63
|
-
const subImage = this._getSubImageForEye(eye);
|
|
64
|
-
if (subImage) {
|
|
65
|
-
return this._getRenderTargetForSubImage(subImage, eye);
|
|
66
|
-
}
|
|
67
|
-
return null;
|
|
68
|
-
}
|
|
69
|
-
getRenderTargetTextureForView(view) {
|
|
70
|
-
return this.getRenderTargetTextureForEye(view.eye);
|
|
71
|
-
}
|
|
72
|
-
_setViewportForSubImage(viewport, subImage) {
|
|
73
|
-
const textureWidth = subImage.colorTextureWidth ?? subImage.textureWidth;
|
|
74
|
-
const textureHeight = subImage.colorTextureWidth ?? subImage.textureHeight;
|
|
75
|
-
const xrViewport = subImage.viewport;
|
|
76
|
-
viewport.x = xrViewport.x / textureWidth;
|
|
77
|
-
viewport.y = xrViewport.y / textureHeight;
|
|
78
|
-
viewport.width = xrViewport.width / textureWidth;
|
|
79
|
-
viewport.height = xrViewport.height / textureHeight;
|
|
80
|
-
}
|
|
81
|
-
trySetViewportForView(viewport, view) {
|
|
82
|
-
const subImage = this._lastSubImages.get(view.eye) || this._getSubImageForEye(view.eye);
|
|
83
|
-
if (subImage) {
|
|
84
|
-
this._setViewportForSubImage(viewport, subImage);
|
|
85
|
-
return true;
|
|
86
|
-
}
|
|
87
|
-
return false;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Wraps xr projection layers.
|
|
92
|
-
* @internal
|
|
93
|
-
*/
|
|
94
|
-
export class WebXRProjectionLayerWrapper extends WebXRCompositionLayerWrapper {
|
|
95
|
-
constructor(layer, isMultiview, xrGLBinding) {
|
|
96
|
-
super(() => layer.textureWidth, () => layer.textureHeight, layer, "XRProjectionLayer", isMultiview, (sessionManager) => new WebXRProjectionLayerRenderTargetTextureProvider(sessionManager, xrGLBinding, this));
|
|
97
|
-
this.layer = layer;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Provides render target textures and other important rendering information for a given XRProjectionLayer.
|
|
102
|
-
* @internal
|
|
103
|
-
*/
|
|
104
|
-
class WebXRProjectionLayerRenderTargetTextureProvider extends WebXRCompositionLayerRenderTargetTextureProvider {
|
|
105
|
-
constructor(_xrSessionManager, _xrWebGLBinding, layerWrapper) {
|
|
106
|
-
super(_xrSessionManager, _xrWebGLBinding, layerWrapper);
|
|
107
|
-
this.layerWrapper = layerWrapper;
|
|
108
|
-
this._projectionLayer = layerWrapper.layer;
|
|
109
|
-
}
|
|
110
|
-
_getSubImageForView(view) {
|
|
111
|
-
return this._xrWebGLBinding.getViewSubImage(this._projectionLayer, view);
|
|
112
|
-
}
|
|
113
|
-
getRenderTargetTextureForView(view) {
|
|
114
|
-
return this._getRenderTargetForSubImage(this._getSubImageForView(view), view.eye);
|
|
115
|
-
}
|
|
116
|
-
getRenderTargetTextureForEye(eye) {
|
|
117
|
-
const lastSubImage = this._lastSubImages.get(eye);
|
|
118
|
-
if (lastSubImage) {
|
|
119
|
-
return this._getRenderTargetForSubImage(lastSubImage, eye);
|
|
120
|
-
}
|
|
121
|
-
return null;
|
|
122
|
-
}
|
|
123
|
-
trySetViewportForView(viewport, view) {
|
|
124
|
-
const subImage = this._lastSubImages.get(view.eye) || this._getSubImageForView(view);
|
|
125
|
-
if (subImage) {
|
|
126
|
-
this._setViewportForSubImage(viewport, subImage);
|
|
127
|
-
return true;
|
|
128
|
-
}
|
|
129
|
-
return false;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
4
|
+
import { WebXRProjectionLayerWrapper, defaultXRProjectionLayerInit } from "./Layers/WebXRProjectionLayer.js";
|
|
5
|
+
import { WebXRCompositionLayerRenderTargetTextureProvider, WebXRCompositionLayerWrapper } from "./Layers/WebXRCompositionLayer.js";
|
|
6
|
+
import { Color4 } from "../../Maths/math.color.js";
|
|
132
7
|
const defaultXRWebGLLayerInit = {};
|
|
133
|
-
const defaultXRProjectionLayerInit = {
|
|
134
|
-
textureType: "texture",
|
|
135
|
-
colorFormat: 0x1908 /* WebGLRenderingContext.RGBA */,
|
|
136
|
-
depthFormat: 0x88f0 /* WebGLRenderingContext.DEPTH24_STENCIL8 */,
|
|
137
|
-
scaleFactor: 1.0,
|
|
138
|
-
};
|
|
139
8
|
/**
|
|
140
9
|
* Exposes the WebXR Layers API.
|
|
141
10
|
*/
|
|
@@ -147,6 +16,10 @@ export class WebXRLayers extends WebXRAbstractFeature {
|
|
|
147
16
|
* Already-created layers
|
|
148
17
|
*/
|
|
149
18
|
this._existingLayers = [];
|
|
19
|
+
this._isMultiviewEnabled = false;
|
|
20
|
+
this._projectionLayerInitialized = false;
|
|
21
|
+
this._compositionLayerTextureMapping = new WeakMap();
|
|
22
|
+
this._layerToRTTProviderMapping = new WeakMap();
|
|
150
23
|
this.xrNativeFeatureName = "layers";
|
|
151
24
|
}
|
|
152
25
|
/**
|
|
@@ -163,19 +36,21 @@ export class WebXRLayers extends WebXRAbstractFeature {
|
|
|
163
36
|
this._glContext = engine._gl;
|
|
164
37
|
this._xrWebGLBinding = new XRWebGLBinding(this._xrSessionManager.session, this._glContext);
|
|
165
38
|
this._existingLayers.length = 0;
|
|
166
|
-
const projectionLayerInit = { ...defaultXRProjectionLayerInit };
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
}
|
|
171
|
-
this.addXRSessionLayer(this.createProjectionLayer(projectionLayerInit, projectionLayerMultiview));
|
|
39
|
+
const projectionLayerInit = { ...defaultXRProjectionLayerInit, ...this._options.projectionLayerInit };
|
|
40
|
+
this._isMultiviewEnabled = this._options.preferMultiviewOnInit && engine.getCaps().multiview;
|
|
41
|
+
this.createProjectionLayer(projectionLayerInit /*, projectionLayerMultiview*/);
|
|
42
|
+
this._projectionLayerInitialized = true;
|
|
172
43
|
return true;
|
|
173
44
|
}
|
|
174
45
|
detach() {
|
|
175
46
|
if (!super.detach()) {
|
|
176
47
|
return false;
|
|
177
48
|
}
|
|
49
|
+
this._existingLayers.forEach((layer) => {
|
|
50
|
+
layer.dispose();
|
|
51
|
+
});
|
|
178
52
|
this._existingLayers.length = 0;
|
|
53
|
+
this._projectionLayerInitialized = false;
|
|
179
54
|
return true;
|
|
180
55
|
}
|
|
181
56
|
/**
|
|
@@ -187,13 +62,11 @@ export class WebXRLayers extends WebXRAbstractFeature {
|
|
|
187
62
|
const layer = new XRWebGLLayer(this._xrSessionManager.session, this._glContext, params);
|
|
188
63
|
return new WebXRWebGLLayerWrapper(layer);
|
|
189
64
|
}
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
*/
|
|
196
|
-
createProjectionLayer(params = defaultXRProjectionLayerInit, multiview = false) {
|
|
65
|
+
_validateLayerInit(params, multiview = this._isMultiviewEnabled) {
|
|
66
|
+
// check if we are in session
|
|
67
|
+
if (!this._xrSessionManager.inXRSession) {
|
|
68
|
+
throw new Error("Cannot create a layer outside of a WebXR session. Make sure the session has started before creating layers.");
|
|
69
|
+
}
|
|
197
70
|
if (multiview && params.textureType !== "texture-array") {
|
|
198
71
|
throw new Error("Projection layers can only be made multiview if they use texture arrays. Set the textureType parameter to 'texture-array'.");
|
|
199
72
|
}
|
|
@@ -201,15 +74,166 @@ export class WebXRLayers extends WebXRAbstractFeature {
|
|
|
201
74
|
if (!multiview && params.textureType === "texture-array") {
|
|
202
75
|
throw new Error("We currently only support multiview rendering when the textureType parameter is set to 'texture-array'.");
|
|
203
76
|
}
|
|
77
|
+
}
|
|
78
|
+
_extendXRLayerInit(params, multiview = this._isMultiviewEnabled) {
|
|
79
|
+
if (multiview) {
|
|
80
|
+
params.textureType = "texture-array";
|
|
81
|
+
}
|
|
82
|
+
return params;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Creates a new XRProjectionLayer.
|
|
86
|
+
* @param params an object providing configuration options for the new XRProjectionLayer.
|
|
87
|
+
* @param multiview whether the projection layer should render with multiview. Will be tru automatically if the extension initialized with multiview.
|
|
88
|
+
* @returns the projection layer
|
|
89
|
+
*/
|
|
90
|
+
createProjectionLayer(params = defaultXRProjectionLayerInit, multiview = this._isMultiviewEnabled) {
|
|
91
|
+
this._extendXRLayerInit(params, multiview);
|
|
92
|
+
this._validateLayerInit(params, multiview);
|
|
204
93
|
const projLayer = this._xrWebGLBinding.createProjectionLayer(params);
|
|
205
|
-
|
|
94
|
+
const layer = new WebXRProjectionLayerWrapper(projLayer, multiview, this._xrWebGLBinding);
|
|
95
|
+
this.addXRSessionLayer(layer);
|
|
96
|
+
return layer;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Note about making it private - this function will be exposed once I decide on a proper API to support all of the XR layers' options
|
|
100
|
+
* @param options an object providing configuration options for the new XRQuadLayer.
|
|
101
|
+
* @param babylonTexture the texture to display in the layer
|
|
102
|
+
* @returns the quad layer
|
|
103
|
+
*/
|
|
104
|
+
_createQuadLayer(options = { params: {} }, babylonTexture) {
|
|
105
|
+
this._extendXRLayerInit(options.params, false);
|
|
106
|
+
const width = this._existingLayers[0].layer.textureWidth;
|
|
107
|
+
const height = this._existingLayers[0].layer.textureHeight;
|
|
108
|
+
const populatedParams = {
|
|
109
|
+
space: this._xrSessionManager.referenceSpace,
|
|
110
|
+
viewPixelWidth: width,
|
|
111
|
+
viewPixelHeight: height,
|
|
112
|
+
clearOnAccess: true,
|
|
113
|
+
...options.params,
|
|
114
|
+
};
|
|
115
|
+
this._validateLayerInit(populatedParams, false);
|
|
116
|
+
const quadLayer = this._xrWebGLBinding.createQuadLayer(populatedParams);
|
|
117
|
+
quadLayer.width = this._isMultiviewEnabled ? 1 : 2;
|
|
118
|
+
quadLayer.height = 1;
|
|
119
|
+
// this wrapper is not really needed, but it's here for consistency
|
|
120
|
+
const wrapper = new WebXRCompositionLayerWrapper(() => quadLayer.width, () => quadLayer.height, quadLayer, "XRQuadLayer", false, (sessionManager) => new WebXRCompositionLayerRenderTargetTextureProvider(sessionManager, this._xrWebGLBinding, wrapper));
|
|
121
|
+
if (babylonTexture) {
|
|
122
|
+
this._compositionLayerTextureMapping.set(quadLayer, babylonTexture);
|
|
123
|
+
}
|
|
124
|
+
const rtt = wrapper.createRenderTargetTextureProvider(this._xrSessionManager);
|
|
125
|
+
this._layerToRTTProviderMapping.set(quadLayer, rtt);
|
|
126
|
+
this.addXRSessionLayer(wrapper);
|
|
127
|
+
return wrapper;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* @experimental
|
|
131
|
+
* This will support full screen ADT when used with WebXR Layers. This API might change in the future.
|
|
132
|
+
* Note that no interaction will be available with the ADT when using this method
|
|
133
|
+
* @param texture the texture to display in the layer
|
|
134
|
+
* @param options optional parameters for the layer
|
|
135
|
+
* @returns a composition layer containing the texture
|
|
136
|
+
*/
|
|
137
|
+
addFullscreenAdvancedDynamicTexture(texture, options = { distanceFromHeadset: 1.5 }) {
|
|
138
|
+
const wrapper = this._createQuadLayer({
|
|
139
|
+
params: {
|
|
140
|
+
space: this._xrSessionManager.viewerReferenceSpace,
|
|
141
|
+
textureType: "texture",
|
|
142
|
+
layout: "mono",
|
|
143
|
+
},
|
|
144
|
+
}, texture);
|
|
145
|
+
const layer = wrapper.layer;
|
|
146
|
+
const distance = Math.max(0.1, options.distanceFromHeadset);
|
|
147
|
+
const pos = { x: 0, y: 0, z: -distance };
|
|
148
|
+
const orient = { x: 0, y: 0, z: 0, w: 1 };
|
|
149
|
+
layer.transform = new XRRigidTransform(pos, orient);
|
|
150
|
+
const rttProvider = this._layerToRTTProviderMapping.get(layer);
|
|
151
|
+
if (!rttProvider) {
|
|
152
|
+
throw new Error("Could not find the RTT provider for the layer");
|
|
153
|
+
}
|
|
154
|
+
const babylonLayer = this._xrSessionManager.scene.layers.find((babylonLayer) => {
|
|
155
|
+
return babylonLayer.texture === texture;
|
|
156
|
+
});
|
|
157
|
+
if (!babylonLayer) {
|
|
158
|
+
throw new Error("Could not find the babylon layer for the texture");
|
|
159
|
+
}
|
|
160
|
+
rttProvider.onRenderTargetTextureCreatedObservable.add((data) => {
|
|
161
|
+
if (data.eye && data.eye === "right") {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
data.texture.clearColor = new Color4(0, 0, 0, 0);
|
|
165
|
+
babylonLayer.renderTargetTextures.push(data.texture);
|
|
166
|
+
babylonLayer.renderOnlyInRenderTargetTextures = true;
|
|
167
|
+
// for stereo (not for gui) it should be onBeforeCameraRenderObservable
|
|
168
|
+
this._xrSessionManager.scene.onBeforeRenderObservable.add(() => {
|
|
169
|
+
data.texture.render();
|
|
170
|
+
});
|
|
171
|
+
babylonLayer.renderTargetTextures.push(data.texture);
|
|
172
|
+
babylonLayer.renderOnlyInRenderTargetTextures = true;
|
|
173
|
+
// add it back when the session ends
|
|
174
|
+
this._xrSessionManager.onXRSessionEnded.addOnce(() => {
|
|
175
|
+
babylonLayer.renderTargetTextures.splice(babylonLayer.renderTargetTextures.indexOf(data.texture), 1);
|
|
176
|
+
babylonLayer.renderOnlyInRenderTargetTextures = false;
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
return wrapper;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* @experimental
|
|
183
|
+
* This functions allows you to add a lens flare system to the XR scene.
|
|
184
|
+
* Note - this will remove the lens flare system from the scene and add it to the XR scene.
|
|
185
|
+
* This feature is experimental and might change in the future.
|
|
186
|
+
* @param flareSystem the flare system to add
|
|
187
|
+
* @returns a composition layer containing the flare system
|
|
188
|
+
*/
|
|
189
|
+
_addLensFlareSystem(flareSystem) {
|
|
190
|
+
const wrapper = this._createQuadLayer({
|
|
191
|
+
params: {
|
|
192
|
+
space: this._xrSessionManager.viewerReferenceSpace,
|
|
193
|
+
textureType: "texture",
|
|
194
|
+
layout: "mono",
|
|
195
|
+
},
|
|
196
|
+
});
|
|
197
|
+
const layer = wrapper.layer;
|
|
198
|
+
layer.width = 2;
|
|
199
|
+
layer.height = 1;
|
|
200
|
+
const distance = 10;
|
|
201
|
+
const pos = { x: 0, y: 0, z: -distance };
|
|
202
|
+
const orient = { x: 0, y: 0, z: 0, w: 1 };
|
|
203
|
+
layer.transform = new XRRigidTransform(pos, orient);
|
|
204
|
+
// get the rtt wrapper
|
|
205
|
+
const rttProvider = this._layerToRTTProviderMapping.get(layer);
|
|
206
|
+
if (!rttProvider) {
|
|
207
|
+
throw new Error("Could not find the RTT provider for the layer");
|
|
208
|
+
}
|
|
209
|
+
// render the flare system to the rtt
|
|
210
|
+
rttProvider.onRenderTargetTextureCreatedObservable.add((data) => {
|
|
211
|
+
data.texture.clearColor = new Color4(0, 0, 0, 0);
|
|
212
|
+
data.texture.customRenderFunction = () => {
|
|
213
|
+
flareSystem.render();
|
|
214
|
+
};
|
|
215
|
+
// add to the scene's render targets
|
|
216
|
+
// this._xrSessionManager.scene.onBeforeCameraRenderObservable.add(() => {
|
|
217
|
+
// data.texture.render();
|
|
218
|
+
// });
|
|
219
|
+
});
|
|
220
|
+
// remove the lens flare system from the scene
|
|
221
|
+
this._xrSessionManager.onXRSessionInit.add(() => {
|
|
222
|
+
this._xrSessionManager.scene.lensFlareSystems.splice(this._xrSessionManager.scene.lensFlareSystems.indexOf(flareSystem), 1);
|
|
223
|
+
});
|
|
224
|
+
// add it back when the session ends
|
|
225
|
+
this._xrSessionManager.onXRSessionEnded.add(() => {
|
|
226
|
+
this._xrSessionManager.scene.lensFlareSystems.push(flareSystem);
|
|
227
|
+
});
|
|
228
|
+
return wrapper;
|
|
206
229
|
}
|
|
207
230
|
/**
|
|
208
231
|
* Add a new layer to the already-existing list of layers
|
|
209
232
|
* @param wrappedLayer the new layer to add to the existing ones
|
|
210
233
|
*/
|
|
211
234
|
addXRSessionLayer(wrappedLayer) {
|
|
212
|
-
this.
|
|
235
|
+
this._existingLayers.push(wrappedLayer);
|
|
236
|
+
this.setXRSessionLayers(this._existingLayers);
|
|
213
237
|
}
|
|
214
238
|
/**
|
|
215
239
|
* Sets the layers to be used by the XR session.
|
|
@@ -220,14 +244,16 @@ export class WebXRLayers extends WebXRAbstractFeature {
|
|
|
220
244
|
* as the first layer in the array, which feeds the WebXR camera(s) attached to the session.
|
|
221
245
|
* @param wrappedLayers An array of WebXRLayerWrapper, usually returned from the WebXRLayers createLayer functions.
|
|
222
246
|
*/
|
|
223
|
-
setXRSessionLayers(wrappedLayers) {
|
|
224
|
-
this._existingLayers = wrappedLayers;
|
|
247
|
+
setXRSessionLayers(wrappedLayers = this._existingLayers) {
|
|
248
|
+
// this._existingLayers = wrappedLayers;
|
|
225
249
|
const renderStateInit = { ...this._xrSessionManager.session.renderState };
|
|
226
250
|
// Clear out the layer-related fields.
|
|
227
251
|
renderStateInit.baseLayer = undefined;
|
|
228
252
|
renderStateInit.layers = wrappedLayers.map((wrappedLayer) => wrappedLayer.layer);
|
|
229
253
|
this._xrSessionManager.updateRenderState(renderStateInit);
|
|
230
|
-
this.
|
|
254
|
+
if (!this._projectionLayerInitialized) {
|
|
255
|
+
this._xrSessionManager._setBaseLayerWrapper(wrappedLayers.length > 0 ? wrappedLayers.at(0) : null);
|
|
256
|
+
}
|
|
231
257
|
}
|
|
232
258
|
isCompatible() {
|
|
233
259
|
// TODO (rgerd): Add native support.
|
|
@@ -240,7 +266,32 @@ export class WebXRLayers extends WebXRAbstractFeature {
|
|
|
240
266
|
super.dispose();
|
|
241
267
|
}
|
|
242
268
|
_onXRFrame(_xrFrame) {
|
|
243
|
-
|
|
269
|
+
// Replace once the mapped internal texture of each available composition layer, apart from the last one, which is the projection layer that needs an RTT
|
|
270
|
+
const layers = this._existingLayers;
|
|
271
|
+
for (let i = 0; i < layers.length; ++i) {
|
|
272
|
+
const layer = layers[i];
|
|
273
|
+
if (layer.layerType !== "XRProjectionLayer") {
|
|
274
|
+
// get the rtt provider
|
|
275
|
+
const rttProvider = this._layerToRTTProviderMapping.get(layer.layer);
|
|
276
|
+
if (!rttProvider) {
|
|
277
|
+
continue;
|
|
278
|
+
}
|
|
279
|
+
if (rttProvider.layerWrapper.isMultiview) {
|
|
280
|
+
// get the views, if we are in multiview
|
|
281
|
+
const pose = _xrFrame.getViewerPose(this._xrSessionManager.referenceSpace);
|
|
282
|
+
if (pose) {
|
|
283
|
+
const views = pose.views;
|
|
284
|
+
for (let j = 0; j < views.length; ++j) {
|
|
285
|
+
const view = views[j];
|
|
286
|
+
rttProvider.getRenderTargetTextureForView(view);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
rttProvider.getRenderTargetTextureForView();
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
244
295
|
}
|
|
245
296
|
}
|
|
246
297
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebXRLayers.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRLayers.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 type { Nullable } from \"../../types\";\r\nimport { WebXRLayerRenderTargetTextureProvider } from \"../webXRRenderTargetTextureProvider\";\r\nimport type { RenderTargetTexture } from \"../../Materials/Textures/renderTargetTexture\";\r\nimport type { WebXRLayerType } from \"../webXRLayerWrapper\";\r\nimport { WebXRLayerWrapper } from \"../webXRLayerWrapper\";\r\nimport type { Viewport } from \"../../Maths/math.viewport\";\r\nimport { WebXRWebGLLayerWrapper } from \"../webXRWebGLLayer\";\r\n\r\n/**\r\n * Wraps xr composition layers.\r\n * @internal\r\n */\r\nexport class WebXRCompositionLayerWrapper extends WebXRLayerWrapper {\r\n constructor(\r\n public getWidth: () => number,\r\n public getHeight: () => number,\r\n public readonly layer: XRCompositionLayer,\r\n public readonly layerType: WebXRLayerType,\r\n public readonly isMultiview: boolean,\r\n public createRTTProvider: (xrSessionManager: WebXRSessionManager) => WebXRLayerRenderTargetTextureProvider\r\n ) {\r\n super(getWidth, getHeight, layer, layerType, createRTTProvider);\r\n }\r\n}\r\n\r\n/**\r\n * Provides render target textures and other important rendering information for a given XRCompositionLayer.\r\n * @internal\r\n */\r\nclass WebXRCompositionLayerRenderTargetTextureProvider extends WebXRLayerRenderTargetTextureProvider {\r\n protected _lastSubImages = new Map<XREye, XRWebGLSubImage>();\r\n private _compositionLayer: XRCompositionLayer;\r\n\r\n constructor(\r\n protected readonly _xrSessionManager: WebXRSessionManager,\r\n protected readonly _xrWebGLBinding: XRWebGLBinding,\r\n public readonly layerWrapper: WebXRCompositionLayerWrapper\r\n ) {\r\n super(_xrSessionManager.scene, layerWrapper);\r\n this._compositionLayer = layerWrapper.layer;\r\n }\r\n\r\n protected _getRenderTargetForSubImage(subImage: XRWebGLSubImage, eye: XREye) {\r\n const lastSubImage = this._lastSubImages.get(eye);\r\n const eyeIndex = eye == \"left\" ? 0 : 1;\r\n\r\n const colorTextureWidth = subImage.colorTextureWidth ?? subImage.textureWidth;\r\n const colorTextureHeight = subImage.colorTextureHeight ?? subImage.textureHeight;\r\n\r\n if (!this._renderTargetTextures[eyeIndex] || lastSubImage?.textureWidth !== colorTextureWidth || lastSubImage?.textureHeight !== colorTextureHeight) {\r\n let depthStencilTexture;\r\n const depthStencilTextureWidth = subImage.depthStencilTextureWidth ?? colorTextureWidth;\r\n const depthStencilTextureHeight = subImage.depthStencilTextureHeight ?? colorTextureHeight;\r\n if (colorTextureWidth === depthStencilTextureWidth || colorTextureHeight === depthStencilTextureHeight) {\r\n depthStencilTexture = subImage.depthStencilTexture;\r\n }\r\n\r\n this._renderTargetTextures[eyeIndex] = this._createRenderTargetTexture(\r\n colorTextureWidth,\r\n colorTextureHeight,\r\n null,\r\n subImage.colorTexture,\r\n depthStencilTexture,\r\n this.layerWrapper.isMultiview\r\n );\r\n\r\n this._framebufferDimensions = {\r\n framebufferWidth: colorTextureWidth,\r\n framebufferHeight: colorTextureHeight,\r\n };\r\n }\r\n\r\n this._lastSubImages.set(eye, subImage);\r\n return this._renderTargetTextures[eyeIndex];\r\n }\r\n private _getSubImageForEye(eye: XREye): Nullable<XRWebGLSubImage> {\r\n const currentFrame = this._xrSessionManager.currentFrame;\r\n if (currentFrame) {\r\n return this._xrWebGLBinding.getSubImage(this._compositionLayer, currentFrame, eye);\r\n }\r\n return null;\r\n }\r\n public getRenderTargetTextureForEye(eye: XREye): Nullable<RenderTargetTexture> {\r\n const subImage = this._getSubImageForEye(eye);\r\n if (subImage) {\r\n return this._getRenderTargetForSubImage(subImage, eye);\r\n }\r\n return null;\r\n }\r\n public getRenderTargetTextureForView(view: XRView): Nullable<RenderTargetTexture> {\r\n return this.getRenderTargetTextureForEye(view.eye);\r\n }\r\n\r\n protected _setViewportForSubImage(viewport: Viewport, subImage: XRWebGLSubImage) {\r\n const textureWidth = subImage.colorTextureWidth ?? subImage.textureWidth;\r\n const textureHeight = subImage.colorTextureWidth ?? subImage.textureHeight;\r\n const xrViewport = subImage.viewport;\r\n viewport.x = xrViewport.x / textureWidth;\r\n viewport.y = xrViewport.y / textureHeight;\r\n viewport.width = xrViewport.width / textureWidth;\r\n viewport.height = xrViewport.height / textureHeight;\r\n }\r\n\r\n public trySetViewportForView(viewport: Viewport, view: XRView): boolean {\r\n const subImage = this._lastSubImages.get(view.eye) || this._getSubImageForEye(view.eye);\r\n if (subImage) {\r\n this._setViewportForSubImage(viewport, subImage);\r\n return true;\r\n }\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Wraps xr projection layers.\r\n * @internal\r\n */\r\nexport class WebXRProjectionLayerWrapper extends WebXRCompositionLayerWrapper {\r\n constructor(\r\n public readonly layer: XRProjectionLayer,\r\n isMultiview: boolean,\r\n xrGLBinding: XRWebGLBinding\r\n ) {\r\n super(\r\n () => layer.textureWidth,\r\n () => layer.textureHeight,\r\n layer,\r\n \"XRProjectionLayer\",\r\n isMultiview,\r\n (sessionManager) => new WebXRProjectionLayerRenderTargetTextureProvider(sessionManager, xrGLBinding, this)\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Provides render target textures and other important rendering information for a given XRProjectionLayer.\r\n * @internal\r\n */\r\nclass WebXRProjectionLayerRenderTargetTextureProvider extends WebXRCompositionLayerRenderTargetTextureProvider {\r\n private readonly _projectionLayer: XRProjectionLayer;\r\n\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n _xrWebGLBinding: XRWebGLBinding,\r\n public readonly layerWrapper: WebXRProjectionLayerWrapper\r\n ) {\r\n super(_xrSessionManager, _xrWebGLBinding, layerWrapper);\r\n this._projectionLayer = layerWrapper.layer;\r\n }\r\n\r\n private _getSubImageForView(view: XRView): XRWebGLSubImage {\r\n return this._xrWebGLBinding.getViewSubImage(this._projectionLayer, view);\r\n }\r\n\r\n public getRenderTargetTextureForView(view: XRView): Nullable<RenderTargetTexture> {\r\n return this._getRenderTargetForSubImage(this._getSubImageForView(view), view.eye);\r\n }\r\n\r\n public getRenderTargetTextureForEye(eye: XREye): Nullable<RenderTargetTexture> {\r\n const lastSubImage = this._lastSubImages.get(eye);\r\n if (lastSubImage) {\r\n return this._getRenderTargetForSubImage(lastSubImage, eye);\r\n }\r\n return null;\r\n }\r\n\r\n public trySetViewportForView(viewport: Viewport, view: XRView): boolean {\r\n const subImage = this._lastSubImages.get(view.eye) || this._getSubImageForView(view);\r\n if (subImage) {\r\n this._setViewportForSubImage(viewport, subImage);\r\n return true;\r\n }\r\n return false;\r\n }\r\n}\r\n\r\nconst defaultXRWebGLLayerInit: XRWebGLLayerInit = {};\r\n\r\nconst defaultXRProjectionLayerInit: XRProjectionLayerInit = {\r\n textureType: \"texture\",\r\n colorFormat: 0x1908 /* WebGLRenderingContext.RGBA */,\r\n depthFormat: 0x88f0 /* WebGLRenderingContext.DEPTH24_STENCIL8 */,\r\n scaleFactor: 1.0,\r\n};\r\n\r\n/**\r\n * Configuration options of the layers feature\r\n */\r\nexport interface IWebXRLayersOptions {\r\n /**\r\n * Whether to try initializing the base projection layer as a multiview render target, if multiview is supported.\r\n * Defaults to false.\r\n */\r\n preferMultiviewOnInit?: boolean;\r\n}\r\n\r\n/**\r\n * Exposes the WebXR Layers API.\r\n */\r\nexport class WebXRLayers extends WebXRAbstractFeature {\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.LAYERS;\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 * Already-created layers\r\n */\r\n private _existingLayers: WebXRLayerWrapper[] = [];\r\n\r\n private _glContext: WebGLRenderingContext | WebGL2RenderingContext;\r\n private _xrWebGLBinding: XRWebGLBinding;\r\n\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n private readonly _options: IWebXRLayersOptions = {}\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"layers\";\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 attach(): boolean {\r\n if (!super.attach()) {\r\n return false;\r\n }\r\n\r\n const engine = this._xrSessionManager.scene.getEngine();\r\n this._glContext = engine._gl;\r\n this._xrWebGLBinding = new XRWebGLBinding(this._xrSessionManager.session, this._glContext);\r\n this._existingLayers.length = 0;\r\n\r\n const projectionLayerInit = { ...defaultXRProjectionLayerInit };\r\n const projectionLayerMultiview = this._options.preferMultiviewOnInit && engine.getCaps().multiview;\r\n if (projectionLayerMultiview) {\r\n projectionLayerInit.textureType = \"texture-array\";\r\n }\r\n this.addXRSessionLayer(this.createProjectionLayer(projectionLayerInit, projectionLayerMultiview));\r\n\r\n return true;\r\n }\r\n\r\n public detach(): boolean {\r\n if (!super.detach()) {\r\n return false;\r\n }\r\n this._existingLayers.length = 0;\r\n return true;\r\n }\r\n\r\n /**\r\n * Creates a new XRWebGLLayer.\r\n * @param params an object providing configuration options for the new XRWebGLLayer\r\n * @returns the XRWebGLLayer\r\n */\r\n public createXRWebGLLayer(params = defaultXRWebGLLayerInit): WebXRWebGLLayerWrapper {\r\n const layer = new XRWebGLLayer(this._xrSessionManager.session, this._glContext, params);\r\n return new WebXRWebGLLayerWrapper(layer);\r\n }\r\n\r\n /**\r\n * Creates a new XRProjectionLayer.\r\n * @param params an object providing configuration options for the new XRProjectionLayer.\r\n * @param multiview whether the projection layer should render with multiview.\r\n * @returns the projection layer\r\n */\r\n public createProjectionLayer(params = defaultXRProjectionLayerInit, multiview = false): WebXRProjectionLayerWrapper {\r\n if (multiview && params.textureType !== \"texture-array\") {\r\n throw new Error(\"Projection layers can only be made multiview if they use texture arrays. Set the textureType parameter to 'texture-array'.\");\r\n }\r\n\r\n // TODO (rgerd): Support RTT's that are bound to sub-images in the texture array.\r\n if (!multiview && params.textureType === \"texture-array\") {\r\n throw new Error(\"We currently only support multiview rendering when the textureType parameter is set to 'texture-array'.\");\r\n }\r\n\r\n const projLayer = this._xrWebGLBinding.createProjectionLayer(params);\r\n return new WebXRProjectionLayerWrapper(projLayer, multiview, this._xrWebGLBinding);\r\n }\r\n\r\n /**\r\n * Add a new layer to the already-existing list of layers\r\n * @param wrappedLayer the new layer to add to the existing ones\r\n */\r\n public addXRSessionLayer(wrappedLayer: WebXRLayerWrapper) {\r\n this.setXRSessionLayers([...this._existingLayers, wrappedLayer]);\r\n }\r\n\r\n /**\r\n * Sets the layers to be used by the XR session.\r\n * Note that you must call this function with any layers you wish to render to\r\n * since it adds them to the XR session's render state\r\n * (replacing any layers that were added in a previous call to setXRSessionLayers or updateRenderState).\r\n * This method also sets up the session manager's render target texture provider\r\n * as the first layer in the array, which feeds the WebXR camera(s) attached to the session.\r\n * @param wrappedLayers An array of WebXRLayerWrapper, usually returned from the WebXRLayers createLayer functions.\r\n */\r\n public setXRSessionLayers(wrappedLayers: Array<WebXRLayerWrapper>): void {\r\n this._existingLayers = wrappedLayers;\r\n const renderStateInit: XRRenderStateInit = { ...this._xrSessionManager.session.renderState };\r\n // Clear out the layer-related fields.\r\n renderStateInit.baseLayer = undefined;\r\n renderStateInit.layers = wrappedLayers.map((wrappedLayer) => wrappedLayer.layer);\r\n this._xrSessionManager.updateRenderState(renderStateInit);\r\n this._xrSessionManager._setBaseLayerWrapper(wrappedLayers.length > 0 ? wrappedLayers[0] : null);\r\n }\r\n\r\n public isCompatible(): boolean {\r\n // TODO (rgerd): Add native support.\r\n return !this._xrSessionManager.isNative && typeof XRWebGLBinding !== \"undefined\" && !!XRWebGLBinding.prototype.createProjectionLayer;\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached.\r\n */\r\n public dispose(): void {\r\n super.dispose();\r\n }\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame): void {\r\n /* empty */\r\n }\r\n}\r\n\r\n//register the plugin\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRLayers.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRLayers(xrSessionManager, options);\r\n },\r\n WebXRLayers.Version,\r\n false\r\n);\r\n"]}
|
|
1
|
+
{"version":3,"file":"WebXRLayers.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRLayers.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 type { WebXRLayerWrapper } from \"../webXRLayerWrapper\";\r\nimport { WebXRWebGLLayerWrapper } from \"../webXRWebGLLayer\";\r\nimport { WebXRProjectionLayerWrapper, defaultXRProjectionLayerInit } from \"./Layers/WebXRProjectionLayer\";\r\nimport { WebXRCompositionLayerRenderTargetTextureProvider, WebXRCompositionLayerWrapper } from \"./Layers/WebXRCompositionLayer\";\r\nimport type { ThinTexture } from \"core/Materials/Textures/thinTexture\";\r\nimport type { DynamicTexture } from \"core/Materials/Textures/dynamicTexture\";\r\nimport { Color4 } from \"core/Maths/math.color\";\r\nimport type { LensFlareSystem } from \"core/LensFlares/lensFlareSystem\";\r\n\r\nconst defaultXRWebGLLayerInit: XRWebGLLayerInit = {};\r\n\r\n/**\r\n * Configuration options of the layers feature\r\n */\r\nexport interface IWebXRLayersOptions {\r\n /**\r\n * Whether to try initializing the base projection layer as a multiview render target, if multiview is supported.\r\n * Defaults to false.\r\n */\r\n preferMultiviewOnInit?: boolean;\r\n\r\n /**\r\n * Optional configuration for the base projection layer.\r\n */\r\n projectionLayerInit?: Partial<XRProjectionLayerInit>;\r\n}\r\n\r\n/**\r\n * Exposes the WebXR Layers API.\r\n */\r\nexport class WebXRLayers extends WebXRAbstractFeature {\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.LAYERS;\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 * Already-created layers\r\n */\r\n private _existingLayers: WebXRLayerWrapper[] = [];\r\n\r\n private _glContext: WebGLRenderingContext | WebGL2RenderingContext;\r\n private _xrWebGLBinding: XRWebGLBinding;\r\n private _isMultiviewEnabled = false;\r\n private _projectionLayerInitialized = false;\r\n\r\n private _compositionLayerTextureMapping: WeakMap<XRCompositionLayer, ThinTexture> = new WeakMap();\r\n private _layerToRTTProviderMapping: WeakMap<XRCompositionLayer, WebXRCompositionLayerRenderTargetTextureProvider> = new WeakMap();\r\n\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n private readonly _options: IWebXRLayersOptions = {}\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"layers\";\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 attach(): boolean {\r\n if (!super.attach()) {\r\n return false;\r\n }\r\n\r\n const engine = this._xrSessionManager.scene.getEngine();\r\n this._glContext = engine._gl;\r\n this._xrWebGLBinding = new XRWebGLBinding(this._xrSessionManager.session, this._glContext);\r\n this._existingLayers.length = 0;\r\n\r\n const projectionLayerInit = { ...defaultXRProjectionLayerInit, ...this._options.projectionLayerInit };\r\n this._isMultiviewEnabled = this._options.preferMultiviewOnInit && engine.getCaps().multiview;\r\n this.createProjectionLayer(projectionLayerInit /*, projectionLayerMultiview*/);\r\n this._projectionLayerInitialized = true;\r\n\r\n return true;\r\n }\r\n\r\n public detach(): boolean {\r\n if (!super.detach()) {\r\n return false;\r\n }\r\n this._existingLayers.forEach((layer) => {\r\n layer.dispose();\r\n });\r\n this._existingLayers.length = 0;\r\n this._projectionLayerInitialized = false;\r\n return true;\r\n }\r\n\r\n /**\r\n * Creates a new XRWebGLLayer.\r\n * @param params an object providing configuration options for the new XRWebGLLayer\r\n * @returns the XRWebGLLayer\r\n */\r\n public createXRWebGLLayer(params = defaultXRWebGLLayerInit): WebXRWebGLLayerWrapper {\r\n const layer = new XRWebGLLayer(this._xrSessionManager.session, this._glContext, params);\r\n return new WebXRWebGLLayerWrapper(layer);\r\n }\r\n\r\n private _validateLayerInit(params: XRProjectionLayerInit | XRQuadLayerInit, multiview = this._isMultiviewEnabled): void {\r\n // check if we are in session\r\n if (!this._xrSessionManager.inXRSession) {\r\n throw new Error(\"Cannot create a layer outside of a WebXR session. Make sure the session has started before creating layers.\");\r\n }\r\n if (multiview && params.textureType !== \"texture-array\") {\r\n throw new Error(\"Projection layers can only be made multiview if they use texture arrays. Set the textureType parameter to 'texture-array'.\");\r\n }\r\n\r\n // TODO (rgerd): Support RTT's that are bound to sub-images in the texture array.\r\n if (!multiview && params.textureType === \"texture-array\") {\r\n throw new Error(\"We currently only support multiview rendering when the textureType parameter is set to 'texture-array'.\");\r\n }\r\n }\r\n\r\n private _extendXRLayerInit(params: XRProjectionLayerInit | XRQuadLayerInit, multiview = this._isMultiviewEnabled): XRProjectionLayerInit | XRQuadLayerInit {\r\n if (multiview) {\r\n params.textureType = \"texture-array\";\r\n }\r\n return params;\r\n }\r\n\r\n /**\r\n * Creates a new XRProjectionLayer.\r\n * @param params an object providing configuration options for the new XRProjectionLayer.\r\n * @param multiview whether the projection layer should render with multiview. Will be tru automatically if the extension initialized with multiview.\r\n * @returns the projection layer\r\n */\r\n public createProjectionLayer(params = defaultXRProjectionLayerInit, multiview = this._isMultiviewEnabled): WebXRProjectionLayerWrapper {\r\n this._extendXRLayerInit(params, multiview);\r\n this._validateLayerInit(params, multiview);\r\n\r\n const projLayer = this._xrWebGLBinding.createProjectionLayer(params);\r\n const layer = new WebXRProjectionLayerWrapper(projLayer, multiview, this._xrWebGLBinding);\r\n this.addXRSessionLayer(layer);\r\n return layer;\r\n }\r\n\r\n /**\r\n * Note about making it private - this function will be exposed once I decide on a proper API to support all of the XR layers' options\r\n * @param options an object providing configuration options for the new XRQuadLayer.\r\n * @param babylonTexture the texture to display in the layer\r\n * @returns the quad layer\r\n */\r\n private _createQuadLayer(options: { params: Partial<XRQuadLayerInit> } = { params: {} }, babylonTexture?: ThinTexture): WebXRCompositionLayerWrapper {\r\n this._extendXRLayerInit(options.params, false);\r\n const width = (this._existingLayers[0].layer as XRProjectionLayer).textureWidth;\r\n const height = (this._existingLayers[0].layer as XRProjectionLayer).textureHeight;\r\n const populatedParams: XRQuadLayerInit = {\r\n space: this._xrSessionManager.referenceSpace,\r\n viewPixelWidth: width,\r\n viewPixelHeight: height,\r\n clearOnAccess: true,\r\n ...options.params,\r\n };\r\n this._validateLayerInit(populatedParams, false);\r\n const quadLayer = this._xrWebGLBinding.createQuadLayer(populatedParams);\r\n\r\n quadLayer.width = this._isMultiviewEnabled ? 1 : 2;\r\n quadLayer.height = 1;\r\n // this wrapper is not really needed, but it's here for consistency\r\n const wrapper: WebXRCompositionLayerWrapper = new WebXRCompositionLayerWrapper(\r\n () => quadLayer.width,\r\n () => quadLayer.height,\r\n quadLayer,\r\n \"XRQuadLayer\",\r\n false,\r\n (sessionManager) => new WebXRCompositionLayerRenderTargetTextureProvider(sessionManager, this._xrWebGLBinding, wrapper)\r\n );\r\n\r\n if (babylonTexture) {\r\n this._compositionLayerTextureMapping.set(quadLayer, babylonTexture);\r\n }\r\n const rtt = wrapper.createRenderTargetTextureProvider(this._xrSessionManager) as WebXRCompositionLayerRenderTargetTextureProvider;\r\n this._layerToRTTProviderMapping.set(quadLayer, rtt);\r\n this.addXRSessionLayer(wrapper);\r\n return wrapper;\r\n }\r\n\r\n /**\r\n * @experimental\r\n * This will support full screen ADT when used with WebXR Layers. This API might change in the future.\r\n * Note that no interaction will be available with the ADT when using this method\r\n * @param texture the texture to display in the layer\r\n * @param options optional parameters for the layer\r\n * @returns a composition layer containing the texture\r\n */\r\n public addFullscreenAdvancedDynamicTexture(texture: DynamicTexture, options: { distanceFromHeadset: number } = { distanceFromHeadset: 1.5 }): WebXRCompositionLayerWrapper {\r\n const wrapper = this._createQuadLayer(\r\n {\r\n params: {\r\n space: this._xrSessionManager.viewerReferenceSpace,\r\n textureType: \"texture\",\r\n layout: \"mono\",\r\n },\r\n },\r\n texture\r\n );\r\n\r\n const layer = wrapper.layer as XRQuadLayer;\r\n const distance = Math.max(0.1, options.distanceFromHeadset);\r\n const pos = { x: 0, y: 0, z: -distance };\r\n const orient = { x: 0, y: 0, z: 0, w: 1 };\r\n layer.transform = new XRRigidTransform(pos, orient);\r\n\r\n const rttProvider = this._layerToRTTProviderMapping.get(layer);\r\n if (!rttProvider) {\r\n throw new Error(\"Could not find the RTT provider for the layer\");\r\n }\r\n const babylonLayer = this._xrSessionManager.scene.layers.find((babylonLayer) => {\r\n return babylonLayer.texture === texture;\r\n });\r\n if (!babylonLayer) {\r\n throw new Error(\"Could not find the babylon layer for the texture\");\r\n }\r\n rttProvider.onRenderTargetTextureCreatedObservable.add((data) => {\r\n if (data.eye && data.eye === \"right\") {\r\n return;\r\n }\r\n data.texture.clearColor = new Color4(0, 0, 0, 0);\r\n babylonLayer.renderTargetTextures.push(data.texture);\r\n babylonLayer.renderOnlyInRenderTargetTextures = true;\r\n // for stereo (not for gui) it should be onBeforeCameraRenderObservable\r\n this._xrSessionManager.scene.onBeforeRenderObservable.add(() => {\r\n data.texture.render();\r\n });\r\n babylonLayer.renderTargetTextures.push(data.texture);\r\n babylonLayer.renderOnlyInRenderTargetTextures = true;\r\n // add it back when the session ends\r\n this._xrSessionManager.onXRSessionEnded.addOnce(() => {\r\n babylonLayer.renderTargetTextures.splice(babylonLayer.renderTargetTextures.indexOf(data.texture), 1);\r\n babylonLayer.renderOnlyInRenderTargetTextures = false;\r\n });\r\n });\r\n return wrapper;\r\n }\r\n\r\n /**\r\n * @experimental\r\n * This functions allows you to add a lens flare system to the XR scene.\r\n * Note - this will remove the lens flare system from the scene and add it to the XR scene.\r\n * This feature is experimental and might change in the future.\r\n * @param flareSystem the flare system to add\r\n * @returns a composition layer containing the flare system\r\n */\r\n protected _addLensFlareSystem(flareSystem: LensFlareSystem): WebXRCompositionLayerWrapper {\r\n const wrapper = this._createQuadLayer({\r\n params: {\r\n space: this._xrSessionManager.viewerReferenceSpace,\r\n textureType: \"texture\",\r\n layout: \"mono\",\r\n },\r\n });\r\n\r\n const layer = wrapper.layer as XRQuadLayer;\r\n layer.width = 2;\r\n layer.height = 1;\r\n const distance = 10;\r\n const pos = { x: 0, y: 0, z: -distance };\r\n const orient = { x: 0, y: 0, z: 0, w: 1 };\r\n layer.transform = new XRRigidTransform(pos, orient);\r\n\r\n // get the rtt wrapper\r\n const rttProvider = this._layerToRTTProviderMapping.get(layer);\r\n if (!rttProvider) {\r\n throw new Error(\"Could not find the RTT provider for the layer\");\r\n }\r\n // render the flare system to the rtt\r\n rttProvider.onRenderTargetTextureCreatedObservable.add((data) => {\r\n data.texture.clearColor = new Color4(0, 0, 0, 0);\r\n data.texture.customRenderFunction = () => {\r\n flareSystem.render();\r\n };\r\n\r\n // add to the scene's render targets\r\n // this._xrSessionManager.scene.onBeforeCameraRenderObservable.add(() => {\r\n // data.texture.render();\r\n // });\r\n });\r\n // remove the lens flare system from the scene\r\n this._xrSessionManager.onXRSessionInit.add(() => {\r\n this._xrSessionManager.scene.lensFlareSystems.splice(this._xrSessionManager.scene.lensFlareSystems.indexOf(flareSystem), 1);\r\n });\r\n // add it back when the session ends\r\n this._xrSessionManager.onXRSessionEnded.add(() => {\r\n this._xrSessionManager.scene.lensFlareSystems.push(flareSystem);\r\n });\r\n\r\n return wrapper;\r\n }\r\n\r\n /**\r\n * Add a new layer to the already-existing list of layers\r\n * @param wrappedLayer the new layer to add to the existing ones\r\n */\r\n public addXRSessionLayer(wrappedLayer: WebXRLayerWrapper) {\r\n this._existingLayers.push(wrappedLayer);\r\n this.setXRSessionLayers(this._existingLayers);\r\n }\r\n\r\n /**\r\n * Sets the layers to be used by the XR session.\r\n * Note that you must call this function with any layers you wish to render to\r\n * since it adds them to the XR session's render state\r\n * (replacing any layers that were added in a previous call to setXRSessionLayers or updateRenderState).\r\n * This method also sets up the session manager's render target texture provider\r\n * as the first layer in the array, which feeds the WebXR camera(s) attached to the session.\r\n * @param wrappedLayers An array of WebXRLayerWrapper, usually returned from the WebXRLayers createLayer functions.\r\n */\r\n public setXRSessionLayers(wrappedLayers: Array<WebXRLayerWrapper> = this._existingLayers): void {\r\n // this._existingLayers = wrappedLayers;\r\n const renderStateInit: XRRenderStateInit = { ...this._xrSessionManager.session.renderState };\r\n // Clear out the layer-related fields.\r\n renderStateInit.baseLayer = undefined;\r\n renderStateInit.layers = wrappedLayers.map((wrappedLayer) => wrappedLayer.layer);\r\n this._xrSessionManager.updateRenderState(renderStateInit);\r\n if (!this._projectionLayerInitialized) {\r\n this._xrSessionManager._setBaseLayerWrapper(wrappedLayers.length > 0 ? wrappedLayers.at(0)! : null);\r\n }\r\n }\r\n\r\n public isCompatible(): boolean {\r\n // TODO (rgerd): Add native support.\r\n return !this._xrSessionManager.isNative && typeof XRWebGLBinding !== \"undefined\" && !!XRWebGLBinding.prototype.createProjectionLayer;\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached.\r\n */\r\n public dispose(): void {\r\n super.dispose();\r\n }\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame): void {\r\n // Replace once the mapped internal texture of each available composition layer, apart from the last one, which is the projection layer that needs an RTT\r\n const layers = this._existingLayers;\r\n for (let i = 0; i < layers.length; ++i) {\r\n const layer = layers[i];\r\n if (layer.layerType !== \"XRProjectionLayer\") {\r\n // get the rtt provider\r\n const rttProvider = this._layerToRTTProviderMapping.get(layer.layer as XRCompositionLayer);\r\n if (!rttProvider) {\r\n continue;\r\n }\r\n\r\n if (rttProvider.layerWrapper.isMultiview) {\r\n // get the views, if we are in multiview\r\n const pose = _xrFrame.getViewerPose(this._xrSessionManager.referenceSpace);\r\n if (pose) {\r\n const views = pose.views;\r\n for (let j = 0; j < views.length; ++j) {\r\n const view = views[j];\r\n rttProvider.getRenderTargetTextureForView(view);\r\n }\r\n }\r\n } else {\r\n rttProvider.getRenderTargetTextureForView();\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n//register the plugin\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRLayers.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRLayers(xrSessionManager, options);\r\n },\r\n WebXRLayers.Version,\r\n false\r\n);\r\n"]}
|
|
@@ -728,6 +728,10 @@ export class WebXRNearInteraction extends WebXRAbstractFeature {
|
|
|
728
728
|
pickingInfo.gripTransform = controllerData.xrController.grip || null;
|
|
729
729
|
pickingInfo.originMesh = controllerData.touchCollisionMesh;
|
|
730
730
|
pickingInfo.distance = result.distance;
|
|
731
|
+
pickingInfo.bu = result.bu;
|
|
732
|
+
pickingInfo.bv = result.bv;
|
|
733
|
+
pickingInfo.faceId = result.faceId;
|
|
734
|
+
pickingInfo.subMeshId = result.subMeshId;
|
|
731
735
|
}
|
|
732
736
|
}
|
|
733
737
|
}
|
|
@@ -755,8 +759,9 @@ export class WebXRNearInteraction extends WebXRAbstractFeature {
|
|
|
755
759
|
}
|
|
756
760
|
const result = TmpVectors.Vector3[0];
|
|
757
761
|
const tmpVec = TmpVectors.Vector3[1];
|
|
762
|
+
const tmpRay = new Ray(Vector3.Zero(), Vector3.Zero(), 1);
|
|
758
763
|
let distance = +Infinity;
|
|
759
|
-
let tmp, tmpDistanceSphereToCenter, tmpDistanceSurfaceToCenter;
|
|
764
|
+
let tmp, tmpDistanceSphereToCenter, tmpDistanceSurfaceToCenter, intersectionInfo;
|
|
760
765
|
const center = TmpVectors.Vector3[2];
|
|
761
766
|
const worldToMesh = TmpVectors.Matrix[0];
|
|
762
767
|
worldToMesh.copyFrom(mesh.getWorldMatrix());
|
|
@@ -776,6 +781,10 @@ export class WebXRNearInteraction extends WebXRAbstractFeature {
|
|
|
776
781
|
}
|
|
777
782
|
if (tmp !== -1 && tmp < distance) {
|
|
778
783
|
distance = tmp;
|
|
784
|
+
// ray between the sphere center and the point on the mesh
|
|
785
|
+
Ray.CreateFromToToRef(sphere.center, tmpVec, tmpRay);
|
|
786
|
+
tmpRay.length = distance * 2;
|
|
787
|
+
intersectionInfo = tmpRay.intersectsMesh(mesh);
|
|
779
788
|
result.copyFrom(tmpVec);
|
|
780
789
|
}
|
|
781
790
|
}
|
|
@@ -784,6 +793,12 @@ export class WebXRNearInteraction extends WebXRAbstractFeature {
|
|
|
784
793
|
pi.distance = distance;
|
|
785
794
|
pi.pickedMesh = mesh;
|
|
786
795
|
pi.pickedPoint = result.clone();
|
|
796
|
+
if (intersectionInfo && intersectionInfo.bu !== null && intersectionInfo.bv !== null) {
|
|
797
|
+
pi.faceId = intersectionInfo.faceId;
|
|
798
|
+
pi.subMeshId = intersectionInfo.subMeshId;
|
|
799
|
+
pi.bu = intersectionInfo.bu;
|
|
800
|
+
pi.bv = intersectionInfo.bv;
|
|
801
|
+
}
|
|
787
802
|
}
|
|
788
803
|
return pi;
|
|
789
804
|
}
|