@babylonjs/core 5.49.0 → 5.49.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Engines/Native/nativeInterfaces.d.ts +1 -0
- package/Engines/Native/nativeInterfaces.js.map +1 -1
- package/Engines/Native/nativePipelineContext.d.ts +6 -2
- package/Engines/Native/nativePipelineContext.js +12 -3
- package/Engines/Native/nativePipelineContext.js.map +1 -1
- package/Engines/WebGPU/webgpuTextureHelper.js +2 -2
- package/Engines/WebGPU/webgpuTextureHelper.js.map +1 -1
- package/Engines/WebGPU/webgpuTintWASM.js +1 -1
- package/Engines/WebGPU/webgpuTintWASM.js.map +1 -1
- package/Engines/engine.d.ts +53 -0
- package/Engines/nativeEngine.d.ts +2 -5
- package/Engines/nativeEngine.js +44 -12
- package/Engines/nativeEngine.js.map +1 -1
- package/Engines/thinEngine.js +2 -2
- package/Engines/thinEngine.js.map +1 -1
- package/Materials/PBR/pbrBaseMaterial.js +1 -0
- package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
- package/Materials/PBR/pbrMaterial.decalMap.d.ts +12 -0
- package/Materials/PBR/pbrMaterial.decalMap.js +18 -0
- package/Materials/PBR/pbrMaterial.decalMap.js.map +1 -0
- package/Materials/Textures/renderTargetTexture.js +2 -4
- package/Materials/Textures/renderTargetTexture.js.map +1 -1
- package/Materials/index.d.ts +2 -0
- package/Materials/index.js +2 -0
- package/Materials/index.js.map +1 -1
- package/Materials/material.decalMap.d.ts +3 -0
- package/Materials/material.decalMap.js +4 -0
- package/Materials/material.decalMap.js.map +1 -0
- package/Materials/material.decalMapConfiguration.d.ts +63 -0
- package/Materials/material.decalMapConfiguration.js +119 -0
- package/Materials/material.decalMapConfiguration.js.map +1 -0
- package/Materials/materialFlags.d.ts +6 -0
- package/Materials/materialFlags.js +14 -0
- package/Materials/materialFlags.js.map +1 -1
- package/Materials/standardMaterial.decalMap.d.ts +12 -0
- package/Materials/standardMaterial.decalMap.js +18 -0
- package/Materials/standardMaterial.decalMap.js.map +1 -0
- package/Materials/standardMaterial.js +1 -0
- package/Materials/standardMaterial.js.map +1 -1
- package/Maths/math.vector.d.ts +10 -0
- package/Maths/math.vector.js +14 -0
- package/Maths/math.vector.js.map +1 -1
- package/Meshes/abstractMesh.decalMap.d.ts +12 -0
- package/Meshes/abstractMesh.decalMap.js +12 -0
- package/Meshes/abstractMesh.decalMap.js.map +1 -0
- package/Meshes/index.d.ts +2 -0
- package/Meshes/index.js +2 -0
- package/Meshes/index.js.map +1 -1
- package/Meshes/meshUVSpaceRenderer.d.ts +94 -0
- package/Meshes/meshUVSpaceRenderer.js +141 -0
- package/Meshes/meshUVSpaceRenderer.js.map +1 -0
- package/Particles/gpuParticleSystem.js +1 -1
- package/Particles/gpuParticleSystem.js.map +1 -1
- package/Physics/v2/physicsAggregate.d.ts +4 -0
- package/Physics/v2/physicsAggregate.js +4 -4
- package/Physics/v2/physicsAggregate.js.map +1 -1
- package/Physics/v2/physicsBody.d.ts +18 -2
- package/Physics/v2/physicsBody.js +66 -1
- package/Physics/v2/physicsBody.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderer.js +2 -1
- package/Rendering/fluidRenderer/fluidRenderer.js.map +1 -1
- package/Rendering/renderingManager.js +4 -2
- package/Rendering/renderingManager.js.map +1 -1
- package/Shaders/ShadersInclude/decalFragment.d.ts +5 -0
- package/Shaders/ShadersInclude/decalFragment.js +15 -0
- package/Shaders/ShadersInclude/decalFragment.js.map +1 -0
- package/Shaders/ShadersInclude/decalFragmentDeclaration.d.ts +5 -0
- package/Shaders/ShadersInclude/decalFragmentDeclaration.js +11 -0
- package/Shaders/ShadersInclude/decalFragmentDeclaration.js.map +1 -0
- package/Shaders/ShadersInclude/decalVertexDeclaration.d.ts +5 -0
- package/Shaders/ShadersInclude/decalVertexDeclaration.js +11 -0
- package/Shaders/ShadersInclude/decalVertexDeclaration.js.map +1 -0
- package/Shaders/ShadersInclude/defaultFragmentDeclaration.d.ts +1 -0
- package/Shaders/ShadersInclude/defaultFragmentDeclaration.js +2 -0
- package/Shaders/ShadersInclude/defaultFragmentDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/defaultVertexDeclaration.d.ts +1 -0
- package/Shaders/ShadersInclude/defaultVertexDeclaration.js +2 -0
- package/Shaders/ShadersInclude/defaultVertexDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBlockAlbedoOpacity.d.ts +1 -0
- package/Shaders/ShadersInclude/pbrBlockAlbedoOpacity.js +4 -0
- package/Shaders/ShadersInclude/pbrBlockAlbedoOpacity.js.map +1 -1
- package/Shaders/ShadersInclude/pbrFragmentDeclaration.d.ts +1 -0
- package/Shaders/ShadersInclude/pbrFragmentDeclaration.js +2 -0
- package/Shaders/ShadersInclude/pbrFragmentDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.js +1 -0
- package/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/pbrVertexDeclaration.d.ts +1 -0
- package/Shaders/ShadersInclude/pbrVertexDeclaration.js +2 -0
- package/Shaders/ShadersInclude/pbrVertexDeclaration.js.map +1 -1
- package/Shaders/default.fragment.d.ts +1 -0
- package/Shaders/default.fragment.js +5 -0
- package/Shaders/default.fragment.js.map +1 -1
- package/Shaders/default.vertex.js +2 -0
- package/Shaders/default.vertex.js.map +1 -1
- package/Shaders/geometry.fragment.js +1 -1
- package/Shaders/geometry.fragment.js.map +1 -1
- package/Shaders/meshUVSpaceRenderer.fragment.d.ts +5 -0
- package/Shaders/meshUVSpaceRenderer.fragment.js +9 -0
- package/Shaders/meshUVSpaceRenderer.fragment.js.map +1 -0
- package/Shaders/meshUVSpaceRenderer.vertex.d.ts +15 -0
- package/Shaders/meshUVSpaceRenderer.vertex.js +34 -0
- package/Shaders/meshUVSpaceRenderer.vertex.js.map +1 -0
- package/Shaders/pbr.fragment.js +4 -0
- package/Shaders/pbr.fragment.js.map +1 -1
- package/Shaders/pbr.vertex.js +2 -0
- package/Shaders/pbr.vertex.js.map +1 -1
- package/Shaders/screenSpaceReflection2.fragment.js +1 -1
- package/Shaders/screenSpaceReflection2.fragment.js.map +1 -1
- package/ShadersWGSL/gpuUpdateParticles.compute.js +1 -1
- package/ShadersWGSL/gpuUpdateParticles.compute.js.map +1 -1
- package/Sprites/spriteManager.js +5 -3
- package/Sprites/spriteManager.js.map +1 -1
- package/Sprites/spriteSceneComponent.d.ts +1 -1
- package/Sprites/spriteSceneComponent.js +7 -4
- package/Sprites/spriteSceneComponent.js.map +1 -1
- package/XR/features/WebXRDepthSensing.d.ts +118 -0
- package/XR/features/WebXRDepthSensing.js +268 -0
- package/XR/features/WebXRDepthSensing.js.map +1 -0
- package/XR/features/index.d.ts +1 -0
- package/XR/features/index.js +1 -0
- package/XR/features/index.js.map +1 -1
- package/XR/native/nativeXRFrame.d.ts +1 -0
- package/XR/native/nativeXRFrame.js +4 -0
- package/XR/native/nativeXRFrame.js.map +1 -1
- package/XR/webXRCamera.d.ts +1 -0
- package/XR/webXRCamera.js +4 -0
- package/XR/webXRCamera.js.map +1 -1
- package/XR/webXRFeaturesManager.d.ts +4 -0
- package/XR/webXRFeaturesManager.js +4 -0
- package/XR/webXRFeaturesManager.js.map +1 -1
- package/assetContainer.js +13 -5
- package/assetContainer.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
import { RawTexture } from "../../Materials/Textures/rawTexture.js";
|
|
2
|
+
import { WebXRFeatureName, WebXRFeaturesManager } from "../webXRFeaturesManager.js";
|
|
3
|
+
import { WebXRAbstractFeature } from "./WebXRAbstractFeature.js";
|
|
4
|
+
import { Tools } from "../../Misc/tools.js";
|
|
5
|
+
import { Texture } from "../../Materials/Textures/texture.js";
|
|
6
|
+
import { Engine } from "../../Engines/engine.js";
|
|
7
|
+
import { Observable } from "../../Misc/observable.js";
|
|
8
|
+
|
|
9
|
+
import { WebGLHardwareTexture } from "../../Engines/WebGL/webGLHardwareTexture.js";
|
|
10
|
+
import { InternalTexture, InternalTextureSource } from "../../Materials/Textures/internalTexture.js";
|
|
11
|
+
/**
|
|
12
|
+
* WebXR Feature for WebXR Depth Sensing Module
|
|
13
|
+
* @since 5.49.1
|
|
14
|
+
*/
|
|
15
|
+
export class WebXRDepthSensing extends WebXRAbstractFeature {
|
|
16
|
+
/**
|
|
17
|
+
* Width of depth data. If depth data is not exist, returns null.
|
|
18
|
+
*/
|
|
19
|
+
get width() {
|
|
20
|
+
return this._width;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Height of depth data. If depth data is not exist, returns null.
|
|
24
|
+
*/
|
|
25
|
+
get height() {
|
|
26
|
+
return this._height;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Scale factor by which the raw depth values must be multiplied in order to get the depths in meters.
|
|
30
|
+
*/
|
|
31
|
+
get rawValueToMeters() {
|
|
32
|
+
return this._rawValueToMeters;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* An XRRigidTransform that needs to be applied when indexing into the depth buffer.
|
|
36
|
+
*/
|
|
37
|
+
get normDepthBufferFromNormView() {
|
|
38
|
+
return this._normDepthBufferFromNormView;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Describes which depth-sensing usage ("cpu" or "gpu") is used.
|
|
42
|
+
*/
|
|
43
|
+
get depthUsage() {
|
|
44
|
+
switch (this._xrSessionManager.session.depthUsage) {
|
|
45
|
+
case "cpu-optimized":
|
|
46
|
+
return "cpu";
|
|
47
|
+
case "gpu-optimized":
|
|
48
|
+
return "gpu";
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Describes which depth sensing data format ("ushort" or "float") is used.
|
|
53
|
+
*/
|
|
54
|
+
get depthDataFormat() {
|
|
55
|
+
switch (this._xrSessionManager.session.depthDataFormat) {
|
|
56
|
+
case "luminance-alpha":
|
|
57
|
+
return "ushort";
|
|
58
|
+
case "float32":
|
|
59
|
+
return "float";
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Latest cached InternalTexture which containing depth buffer information.
|
|
64
|
+
* This can be used when the depth usage is "gpu".
|
|
65
|
+
*/
|
|
66
|
+
get latestInternalTexture() {
|
|
67
|
+
var _a, _b;
|
|
68
|
+
if (!this._cachedWebGLTexture) {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
const engine = this._xrSessionManager.scene.getEngine();
|
|
72
|
+
const internalTexture = new InternalTexture(engine, InternalTextureSource.Unknown);
|
|
73
|
+
internalTexture.isCube = false;
|
|
74
|
+
internalTexture.invertY = false;
|
|
75
|
+
internalTexture._useSRGBBuffer = false;
|
|
76
|
+
internalTexture.format = this.depthDataFormat === "ushort" ? 2 : 5;
|
|
77
|
+
internalTexture.generateMipMaps = false;
|
|
78
|
+
internalTexture.type = this.depthDataFormat === "ushort" ? 5 : 1;
|
|
79
|
+
internalTexture.samplingMode = 7;
|
|
80
|
+
internalTexture.width = (_a = this.width) !== null && _a !== void 0 ? _a : 0;
|
|
81
|
+
internalTexture.height = (_b = this.height) !== null && _b !== void 0 ? _b : 0;
|
|
82
|
+
internalTexture._cachedWrapU = 1;
|
|
83
|
+
internalTexture._cachedWrapV = 1;
|
|
84
|
+
internalTexture._hardwareTexture = new WebGLHardwareTexture(this._cachedWebGLTexture, engine._gl);
|
|
85
|
+
return internalTexture;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* cached depth buffer
|
|
89
|
+
*/
|
|
90
|
+
get latestDepthBuffer() {
|
|
91
|
+
if (!this._cachedDepthBuffer) {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
return this.depthDataFormat === "ushort" ? new Uint16Array(this._cachedDepthBuffer) : new Float32Array(this._cachedDepthBuffer);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Latest cached Texture of depth image which is made from the depth buffer data.
|
|
98
|
+
*/
|
|
99
|
+
get latestDepthImageTexture() {
|
|
100
|
+
return this._cachedDepthImageTexture;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Creates a new instance of the depth sensing feature
|
|
104
|
+
* @param _xrSessionManager the WebXRSessionManager
|
|
105
|
+
* @param options options for WebXR Depth Sensing Feature
|
|
106
|
+
*/
|
|
107
|
+
constructor(_xrSessionManager, options) {
|
|
108
|
+
super(_xrSessionManager);
|
|
109
|
+
this.options = options;
|
|
110
|
+
this._width = null;
|
|
111
|
+
this._height = null;
|
|
112
|
+
this._rawValueToMeters = null;
|
|
113
|
+
this._normDepthBufferFromNormView = null;
|
|
114
|
+
this._cachedDepthBuffer = null;
|
|
115
|
+
this._cachedWebGLTexture = null;
|
|
116
|
+
this._cachedDepthImageTexture = null;
|
|
117
|
+
/**
|
|
118
|
+
* Event that notify when `DepthInformation.getDepthInMeters` is available.
|
|
119
|
+
* `getDepthInMeters` method needs active XRFrame (not available for cached XRFrame)
|
|
120
|
+
*/
|
|
121
|
+
this.onGetDepthInMetersAvailable = new Observable();
|
|
122
|
+
this.xrNativeFeatureName = "depth-sensing";
|
|
123
|
+
// https://immersive-web.github.io/depth-sensing/
|
|
124
|
+
Tools.Warn("depth-sensing is an experimental and unstable feature.");
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* attach this feature
|
|
128
|
+
* Will usually be called by the features manager
|
|
129
|
+
*
|
|
130
|
+
* @returns true if successful.
|
|
131
|
+
*/
|
|
132
|
+
attach(force) {
|
|
133
|
+
if (!super.attach(force)) {
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
const isBothDepthUsageAndFormatNull = this._xrSessionManager.session.depthDataFormat == null || this._xrSessionManager.session.depthUsage == null;
|
|
137
|
+
if (isBothDepthUsageAndFormatNull) {
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
this._glBinding = new XRWebGLBinding(this._xrSessionManager.session, this._xrSessionManager.scene.getEngine()._gl);
|
|
141
|
+
return true;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Dispose this feature and all of the resources attached
|
|
145
|
+
*/
|
|
146
|
+
dispose() {
|
|
147
|
+
var _a;
|
|
148
|
+
(_a = this._cachedDepthImageTexture) === null || _a === void 0 ? void 0 : _a.dispose();
|
|
149
|
+
}
|
|
150
|
+
_onXRFrame(_xrFrame) {
|
|
151
|
+
const referenceSPace = this._xrSessionManager.referenceSpace;
|
|
152
|
+
const pose = _xrFrame.getViewerPose(referenceSPace);
|
|
153
|
+
if (pose == null) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
for (const view of pose.views) {
|
|
157
|
+
switch (this.depthUsage) {
|
|
158
|
+
case "cpu":
|
|
159
|
+
this._updateDepthInformationAndTextureCPUDepthUsage(_xrFrame, view, this.depthDataFormat);
|
|
160
|
+
break;
|
|
161
|
+
case "gpu":
|
|
162
|
+
if (!this._glBinding) {
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
this._updateDepthInformationAndTextureWebGLDepthUsage(this._glBinding, view, this.depthDataFormat);
|
|
166
|
+
break;
|
|
167
|
+
default:
|
|
168
|
+
Tools.Error("Unknown depth usage");
|
|
169
|
+
this.detach();
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
_updateDepthInformationAndTextureCPUDepthUsage(frame, view, dataFormat) {
|
|
175
|
+
const depthInfo = frame.getDepthInformation(view);
|
|
176
|
+
if (depthInfo === null) {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
const { data, width, height, rawValueToMeters, getDepthInMeters } = depthInfo;
|
|
180
|
+
this._width = width;
|
|
181
|
+
this._height = height;
|
|
182
|
+
this._rawValueToMeters = rawValueToMeters;
|
|
183
|
+
this._cachedDepthBuffer = data;
|
|
184
|
+
// to avoid Illegal Invocation error, bind `this`
|
|
185
|
+
this.onGetDepthInMetersAvailable.notifyObservers(getDepthInMeters.bind(depthInfo));
|
|
186
|
+
if (!this._cachedDepthImageTexture) {
|
|
187
|
+
this._cachedDepthImageTexture = RawTexture.CreateRTexture(null, width, height, this._xrSessionManager.scene, false, true, Texture.NEAREST_SAMPLINGMODE, Engine.TEXTURETYPE_FLOAT);
|
|
188
|
+
}
|
|
189
|
+
switch (dataFormat) {
|
|
190
|
+
case "ushort":
|
|
191
|
+
this._cachedDepthImageTexture.update(Float32Array.from(new Uint16Array(data)).map((value) => value * rawValueToMeters));
|
|
192
|
+
break;
|
|
193
|
+
case "float":
|
|
194
|
+
this._cachedDepthImageTexture.update(new Float32Array(data).map((value) => value * rawValueToMeters));
|
|
195
|
+
break;
|
|
196
|
+
default:
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
_updateDepthInformationAndTextureWebGLDepthUsage(webglBinding, view, dataFormat) {
|
|
201
|
+
const depthInfo = webglBinding.getDepthInformation(view);
|
|
202
|
+
if (depthInfo === null) {
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
const { texture, width, height } = depthInfo;
|
|
206
|
+
this._width = width;
|
|
207
|
+
this._height = height;
|
|
208
|
+
this._cachedWebGLTexture = texture;
|
|
209
|
+
const scene = this._xrSessionManager.scene;
|
|
210
|
+
const engine = scene.getEngine();
|
|
211
|
+
const internalTexture = engine.wrapWebGLTexture(texture);
|
|
212
|
+
if (!this._cachedDepthImageTexture) {
|
|
213
|
+
this._cachedDepthImageTexture = RawTexture.CreateRTexture(null, width, height, scene, false, true, Texture.NEAREST_SAMPLINGMODE, dataFormat === "ushort" ? Engine.TEXTURETYPE_UNSIGNED_BYTE : Engine.TEXTURETYPE_FLOAT);
|
|
214
|
+
}
|
|
215
|
+
this._cachedDepthImageTexture._texture = internalTexture;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Extends the session init object if needed
|
|
219
|
+
* @returns augmentation object for the xr session init object.
|
|
220
|
+
*/
|
|
221
|
+
getXRSessionInitExtension() {
|
|
222
|
+
const isDepthUsageDeclared = this.options.usagePreference != null && this.options.usagePreference.length !== 0;
|
|
223
|
+
const isDataFormatDeclared = this.options.dataFormatPreference != null && this.options.dataFormatPreference.length !== 0;
|
|
224
|
+
return new Promise((resolve) => {
|
|
225
|
+
if (isDepthUsageDeclared && isDataFormatDeclared) {
|
|
226
|
+
const usages = this.options.usagePreference.map((usage) => {
|
|
227
|
+
switch (usage) {
|
|
228
|
+
case "cpu":
|
|
229
|
+
return "cpu-optimized";
|
|
230
|
+
case "gpu":
|
|
231
|
+
return "gpu-optimized";
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
const dataFormats = this.options.dataFormatPreference.map((format) => {
|
|
235
|
+
switch (format) {
|
|
236
|
+
case "ushort":
|
|
237
|
+
return "luminance-alpha";
|
|
238
|
+
case "float":
|
|
239
|
+
return "float32";
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
resolve({
|
|
243
|
+
depthSensing: {
|
|
244
|
+
usagePreference: usages,
|
|
245
|
+
dataFormatPreference: dataFormats,
|
|
246
|
+
},
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
resolve({});
|
|
251
|
+
}
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* The module's name
|
|
257
|
+
*/
|
|
258
|
+
WebXRDepthSensing.Name = WebXRFeatureName.DEPTH_SENSING;
|
|
259
|
+
/**
|
|
260
|
+
* The (Babylon) version of this module.
|
|
261
|
+
* This is an integer representing the implementation version.
|
|
262
|
+
* This number does not correspond to the WebXR specs version
|
|
263
|
+
*/
|
|
264
|
+
WebXRDepthSensing.Version = 1;
|
|
265
|
+
WebXRFeaturesManager.AddWebXRFeature(WebXRDepthSensing.Name, (xrSessionManager, options) => {
|
|
266
|
+
return () => new WebXRDepthSensing(xrSessionManager, options);
|
|
267
|
+
}, WebXRDepthSensing.Version, false);
|
|
268
|
+
//# sourceMappingURL=WebXRDepthSensing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebXRDepthSensing.js","sourceRoot":"","sources":["../../../../../lts/core/generated/XR/features/WebXRDepthSensing.ts"],"names":[],"mappings":"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","sourcesContent":["import { RawTexture } from \"../../Materials/Textures/rawTexture\";\r\nimport { WebXRFeatureName, WebXRFeaturesManager } from \"../webXRFeaturesManager\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport { Tools } from \"../../Misc/tools\";\r\nimport { Texture } from \"../../Materials/Textures/texture\";\r\nimport { Engine } from \"../../Engines/engine\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport { WebGLHardwareTexture } from \"../../Engines/WebGL/webGLHardwareTexture\";\r\nimport { InternalTexture, InternalTextureSource } from \"../../Materials/Textures/internalTexture\";\r\n\r\nexport type WebXRDepthUsage = \"cpu\" | \"gpu\";\r\nexport type WebXRDepthDataFormat = \"ushort\" | \"float\";\r\n\r\n/**\r\n * Options for Depth Sensing feature\r\n */\r\nexport interface IWebXRDepthSensingOptions {\r\n /**\r\n * The desired depth sensing usage for the session\r\n */\r\n usagePreference: WebXRDepthUsage[];\r\n /**\r\n * The desired depth sensing data format for the session\r\n */\r\n dataFormatPreference: WebXRDepthDataFormat[];\r\n}\r\n\r\ntype GetDepthInMetersType = (x: number, y: number) => number;\r\n\r\n/**\r\n * WebXR Feature for WebXR Depth Sensing Module\r\n * @since 5.49.1\r\n */\r\nexport class WebXRDepthSensing extends WebXRAbstractFeature {\r\n private _width: Nullable<number> = null;\r\n private _height: Nullable<number> = null;\r\n private _rawValueToMeters: Nullable<number> = null;\r\n private _normDepthBufferFromNormView: Nullable<XRRigidTransform> = null;\r\n private _cachedDepthBuffer: Nullable<ArrayBuffer> = null;\r\n private _cachedWebGLTexture: Nullable<WebGLTexture> = null;\r\n private _cachedDepthImageTexture: Nullable<RawTexture> = null;\r\n\r\n /**\r\n * Width of depth data. If depth data is not exist, returns null.\r\n */\r\n public get width(): Nullable<number> {\r\n return this._width;\r\n }\r\n\r\n /**\r\n * Height of depth data. If depth data is not exist, returns null.\r\n */\r\n public get height(): Nullable<number> {\r\n return this._height;\r\n }\r\n\r\n /**\r\n * Scale factor by which the raw depth values must be multiplied in order to get the depths in meters.\r\n */\r\n public get rawValueToMeters(): Nullable<number> {\r\n return this._rawValueToMeters;\r\n }\r\n\r\n /**\r\n * An XRRigidTransform that needs to be applied when indexing into the depth buffer.\r\n */\r\n public get normDepthBufferFromNormView(): Nullable<XRRigidTransform> {\r\n return this._normDepthBufferFromNormView;\r\n }\r\n\r\n /**\r\n * Describes which depth-sensing usage (\"cpu\" or \"gpu\") is used.\r\n */\r\n public get depthUsage(): WebXRDepthUsage {\r\n switch (this._xrSessionManager.session.depthUsage) {\r\n case \"cpu-optimized\":\r\n return \"cpu\";\r\n case \"gpu-optimized\":\r\n return \"gpu\";\r\n }\r\n }\r\n\r\n /**\r\n * Describes which depth sensing data format (\"ushort\" or \"float\") is used.\r\n */\r\n public get depthDataFormat(): WebXRDepthDataFormat {\r\n switch (this._xrSessionManager.session.depthDataFormat) {\r\n case \"luminance-alpha\":\r\n return \"ushort\";\r\n case \"float32\":\r\n return \"float\";\r\n }\r\n }\r\n\r\n /**\r\n * Latest cached InternalTexture which containing depth buffer information.\r\n * This can be used when the depth usage is \"gpu\".\r\n */\r\n public get latestInternalTexture(): Nullable<InternalTexture> {\r\n if (!this._cachedWebGLTexture) {\r\n return null;\r\n }\r\n\r\n const engine = this._xrSessionManager.scene.getEngine();\r\n const internalTexture = new InternalTexture(engine, InternalTextureSource.Unknown);\r\n internalTexture.isCube = false;\r\n internalTexture.invertY = false;\r\n internalTexture._useSRGBBuffer = false;\r\n internalTexture.format = this.depthDataFormat === \"ushort\" ? Constants.TEXTUREFORMAT_LUMINANCE_ALPHA : Constants.TEXTUREFORMAT_RGBA;\r\n internalTexture.generateMipMaps = false;\r\n internalTexture.type = this.depthDataFormat === \"ushort\" ? Constants.TEXTURETYPE_UNSIGNED_SHORT : Constants.TEXTURETYPE_FLOAT;\r\n internalTexture.samplingMode = Constants.TEXTURE_NEAREST_LINEAR;\r\n internalTexture.width = this.width ?? 0;\r\n internalTexture.height = this.height ?? 0;\r\n internalTexture._cachedWrapU = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n internalTexture._cachedWrapV = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n internalTexture._hardwareTexture = new WebGLHardwareTexture(this._cachedWebGLTexture, engine._gl);\r\n\r\n return internalTexture;\r\n }\r\n\r\n /**\r\n * cached depth buffer\r\n */\r\n public get latestDepthBuffer(): Nullable<ArrayBufferView> {\r\n if (!this._cachedDepthBuffer) {\r\n return null;\r\n }\r\n\r\n return this.depthDataFormat === \"ushort\" ? new Uint16Array(this._cachedDepthBuffer) : new Float32Array(this._cachedDepthBuffer);\r\n }\r\n\r\n /**\r\n * Event that notify when `DepthInformation.getDepthInMeters` is available.\r\n * `getDepthInMeters` method needs active XRFrame (not available for cached XRFrame)\r\n */\r\n public onGetDepthInMetersAvailable: Observable<GetDepthInMetersType> = new Observable<GetDepthInMetersType>();\r\n\r\n /**\r\n * Latest cached Texture of depth image which is made from the depth buffer data.\r\n */\r\n public get latestDepthImageTexture(): Nullable<RawTexture> {\r\n return this._cachedDepthImageTexture;\r\n }\r\n\r\n /**\r\n * XRWebGLBinding which is used for acquiring WebGLDepthInformation\r\n */\r\n private _glBinding?: XRWebGLBinding;\r\n\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.DEPTH_SENSING;\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 depth sensing feature\r\n * @param _xrSessionManager the WebXRSessionManager\r\n * @param options options for WebXR Depth Sensing Feature\r\n */\r\n constructor(_xrSessionManager: WebXRSessionManager, public readonly options: IWebXRDepthSensingOptions) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"depth-sensing\";\r\n\r\n // https://immersive-web.github.io/depth-sensing/\r\n Tools.Warn(\"depth-sensing 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 attach(force?: boolean | undefined): boolean {\r\n if (!super.attach(force)) {\r\n return false;\r\n }\r\n\r\n const isBothDepthUsageAndFormatNull = this._xrSessionManager.session.depthDataFormat == null || this._xrSessionManager.session.depthUsage == null;\r\n if (isBothDepthUsageAndFormatNull) {\r\n return false;\r\n }\r\n\r\n this._glBinding = new XRWebGLBinding(this._xrSessionManager.session, this._xrSessionManager.scene.getEngine()._gl);\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 dispose(): void {\r\n this._cachedDepthImageTexture?.dispose();\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 == null) {\r\n return;\r\n }\r\n\r\n for (const view of pose.views) {\r\n switch (this.depthUsage) {\r\n case \"cpu\":\r\n this._updateDepthInformationAndTextureCPUDepthUsage(_xrFrame, view, this.depthDataFormat);\r\n break;\r\n\r\n case \"gpu\":\r\n if (!this._glBinding) {\r\n break;\r\n }\r\n\r\n this._updateDepthInformationAndTextureWebGLDepthUsage(this._glBinding, view, this.depthDataFormat);\r\n break;\r\n\r\n default:\r\n Tools.Error(\"Unknown depth usage\");\r\n this.detach();\r\n break;\r\n }\r\n }\r\n }\r\n\r\n private _updateDepthInformationAndTextureCPUDepthUsage(frame: XRFrame, view: XRView, dataFormat: WebXRDepthDataFormat): void {\r\n const depthInfo = frame.getDepthInformation(view);\r\n if (depthInfo === null) {\r\n return;\r\n }\r\n\r\n const { data, width, height, rawValueToMeters, getDepthInMeters } = depthInfo as XRCPUDepthInformation;\r\n\r\n this._width = width;\r\n this._height = height;\r\n this._rawValueToMeters = rawValueToMeters;\r\n this._cachedDepthBuffer = data;\r\n\r\n // to avoid Illegal Invocation error, bind `this`\r\n this.onGetDepthInMetersAvailable.notifyObservers(getDepthInMeters.bind(depthInfo));\r\n\r\n if (!this._cachedDepthImageTexture) {\r\n this._cachedDepthImageTexture = RawTexture.CreateRTexture(\r\n null,\r\n width,\r\n height,\r\n this._xrSessionManager.scene,\r\n false,\r\n true,\r\n Texture.NEAREST_SAMPLINGMODE,\r\n Engine.TEXTURETYPE_FLOAT\r\n );\r\n }\r\n\r\n switch (dataFormat) {\r\n case \"ushort\":\r\n this._cachedDepthImageTexture.update(Float32Array.from(new Uint16Array(data)).map((value) => value * rawValueToMeters));\r\n break;\r\n\r\n case \"float\":\r\n this._cachedDepthImageTexture.update(new Float32Array(data).map((value) => value * rawValueToMeters));\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n private _updateDepthInformationAndTextureWebGLDepthUsage(webglBinding: XRWebGLBinding, view: XRView, dataFormat: WebXRDepthDataFormat): void {\r\n const depthInfo = webglBinding.getDepthInformation(view);\r\n if (depthInfo === null) {\r\n return;\r\n }\r\n\r\n const { texture, width, height } = depthInfo as XRWebGLDepthInformation;\r\n\r\n this._width = width;\r\n this._height = height;\r\n this._cachedWebGLTexture = texture;\r\n\r\n const scene = this._xrSessionManager.scene;\r\n const engine = scene.getEngine();\r\n const internalTexture = engine.wrapWebGLTexture(texture);\r\n\r\n if (!this._cachedDepthImageTexture) {\r\n this._cachedDepthImageTexture = RawTexture.CreateRTexture(\r\n null,\r\n width,\r\n height,\r\n scene,\r\n false,\r\n true,\r\n Texture.NEAREST_SAMPLINGMODE,\r\n dataFormat === \"ushort\" ? Engine.TEXTURETYPE_UNSIGNED_BYTE : Engine.TEXTURETYPE_FLOAT\r\n );\r\n }\r\n\r\n this._cachedDepthImageTexture._texture = internalTexture;\r\n }\r\n\r\n /**\r\n * Extends the session init object if needed\r\n * @returns augmentation object for the xr session init object.\r\n */\r\n public getXRSessionInitExtension(): Promise<Partial<XRSessionInit>> {\r\n const isDepthUsageDeclared = this.options.usagePreference != null && this.options.usagePreference.length !== 0;\r\n const isDataFormatDeclared = this.options.dataFormatPreference != null && this.options.dataFormatPreference.length !== 0;\r\n\r\n return new Promise((resolve) => {\r\n if (isDepthUsageDeclared && isDataFormatDeclared) {\r\n const usages: XRDepthUsage[] = this.options.usagePreference.map((usage) => {\r\n switch (usage) {\r\n case \"cpu\":\r\n return \"cpu-optimized\";\r\n case \"gpu\":\r\n return \"gpu-optimized\";\r\n }\r\n });\r\n const dataFormats: XRDepthDataFormat[] = this.options.dataFormatPreference.map((format) => {\r\n switch (format) {\r\n case \"ushort\":\r\n return \"luminance-alpha\";\r\n case \"float\":\r\n return \"float32\";\r\n }\r\n });\r\n\r\n resolve({\r\n depthSensing: {\r\n usagePreference: usages,\r\n dataFormatPreference: dataFormats,\r\n },\r\n });\r\n } else {\r\n resolve({});\r\n }\r\n });\r\n }\r\n}\r\n\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRDepthSensing.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRDepthSensing(xrSessionManager, options);\r\n },\r\n WebXRDepthSensing.Version,\r\n false\r\n);\r\n"]}
|
package/XR/features/index.d.ts
CHANGED
package/XR/features/index.js
CHANGED
package/XR/features/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../lts/core/generated/XR/features/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mCAAmC,CAAC;AAClD,cAAc,0BAA0B,CAAC;AACzC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC","sourcesContent":["export * from \"./WebXRAbstractFeature\";\r\nexport * from \"./WebXRHitTestLegacy\";\r\nexport * from \"./WebXRAnchorSystem\";\r\nexport * from \"./WebXRPlaneDetector\";\r\nexport * from \"./WebXRBackgroundRemover\";\r\nexport * from \"./WebXRControllerTeleportation\";\r\nexport * from \"./WebXRControllerPointerSelection\";\r\nexport * from \"./WebXRControllerPhysics\";\r\nexport * from \"./WebXRHitTest\";\r\nexport * from \"./WebXRFeaturePointSystem\";\r\nexport * from \"./WebXRHandTracking\";\r\nexport * from \"./WebXRMeshDetector\";\r\nexport * from \"./WebXRImageTracking\";\r\nexport * from \"./WebXRNearInteraction\";\r\nexport * from \"./WebXRDOMOverlay\";\r\nexport * from \"./WebXRControllerMovement\";\r\nexport * from \"./WebXRLightEstimation\";\r\nexport * from \"./WebXREyeTracking\";\r\nexport * from \"./WebXRWalkingLocomotion\";\r\nexport * from \"./WebXRLayers\";\r\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../lts/core/generated/XR/features/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mCAAmC,CAAC;AAClD,cAAc,0BAA0B,CAAC;AACzC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC","sourcesContent":["export * from \"./WebXRAbstractFeature\";\r\nexport * from \"./WebXRHitTestLegacy\";\r\nexport * from \"./WebXRAnchorSystem\";\r\nexport * from \"./WebXRPlaneDetector\";\r\nexport * from \"./WebXRBackgroundRemover\";\r\nexport * from \"./WebXRControllerTeleportation\";\r\nexport * from \"./WebXRControllerPointerSelection\";\r\nexport * from \"./WebXRControllerPhysics\";\r\nexport * from \"./WebXRHitTest\";\r\nexport * from \"./WebXRFeaturePointSystem\";\r\nexport * from \"./WebXRHandTracking\";\r\nexport * from \"./WebXRMeshDetector\";\r\nexport * from \"./WebXRImageTracking\";\r\nexport * from \"./WebXRNearInteraction\";\r\nexport * from \"./WebXRDOMOverlay\";\r\nexport * from \"./WebXRControllerMovement\";\r\nexport * from \"./WebXRLightEstimation\";\r\nexport * from \"./WebXREyeTracking\";\r\nexport * from \"./WebXRWalkingLocomotion\";\r\nexport * from \"./WebXRLayers\";\r\nexport * from \"./WebXRDepthSensing\";\r\n"]}
|
|
@@ -25,5 +25,6 @@ export declare class NativeXRFrame implements XRFrame {
|
|
|
25
25
|
readonly getLightEstimate: () => never;
|
|
26
26
|
get featurePointCloud(): number[] | undefined;
|
|
27
27
|
readonly getImageTrackingResults: () => XRImageTrackingResult[];
|
|
28
|
+
getDepthInformation(view: XRView): XRCPUDepthInformation | null;
|
|
28
29
|
}
|
|
29
30
|
export {};
|
|
@@ -58,6 +58,10 @@ export class NativeXRFrame {
|
|
|
58
58
|
get featurePointCloud() {
|
|
59
59
|
return this._nativeImpl.featurePointCloud;
|
|
60
60
|
}
|
|
61
|
+
getDepthInformation(view) {
|
|
62
|
+
throw new Error("This function is not available in Babylon Native");
|
|
63
|
+
// return this._nativeImpl.getDepthInformation(view);
|
|
64
|
+
}
|
|
61
65
|
}
|
|
62
66
|
RegisterNativeTypeAsync("NativeXRFrame", NativeXRFrame);
|
|
63
67
|
//# sourceMappingURL=nativeXRFrame.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nativeXRFrame.js","sourceRoot":"","sources":["../../../../../lts/core/generated/XR/native/nativeXRFrame.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"nativeXRFrame.js","sourceRoot":"","sources":["../../../../../lts/core/generated/XR/native/nativeXRFrame.ts"],"names":[],"mappings":"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","sourcesContent":["import { RegisterNativeTypeAsync } from \"../../Engines/nativeEngine\";\r\n\r\n/** @internal */\r\ninterface INativeXRFrame extends XRFrame {\r\n // Native-only helper functions\r\n getPoseData: (space: XRSpace, baseSpace: XRReferenceSpace, vectorBuffer: ArrayBuffer, matrixBuffer: ArrayBuffer) => XRPose;\r\n _imageTrackingResults?: XRImageTrackingResult[];\r\n}\r\n\r\n/** @internal */\r\nexport class NativeXRFrame implements XRFrame {\r\n private readonly _xrTransform = new XRRigidTransform();\r\n private readonly _xrPose: XRPose = {\r\n transform: this._xrTransform,\r\n emulatedPosition: false,\r\n };\r\n // Enough space for position, orientation\r\n private readonly _xrPoseVectorData = new Float32Array(4 + 4);\r\n\r\n public get session(): XRSession {\r\n return this._nativeImpl.session;\r\n }\r\n\r\n constructor(private _nativeImpl: INativeXRFrame) {}\r\n\r\n public getPose(space: XRSpace, baseSpace: XRReferenceSpace): XRPose | undefined {\r\n if (!this._nativeImpl.getPoseData(space, baseSpace, this._xrPoseVectorData.buffer, this._xrTransform.matrix.buffer)) {\r\n return undefined;\r\n }\r\n const position = this._xrTransform.position as DOMPoint;\r\n position.x = this._xrPoseVectorData[0];\r\n position.y = this._xrPoseVectorData[1];\r\n position.z = this._xrPoseVectorData[2];\r\n position.w = this._xrPoseVectorData[3];\r\n\r\n const orientation = this._xrTransform.orientation as DOMPoint;\r\n orientation.x = this._xrPoseVectorData[4];\r\n orientation.y = this._xrPoseVectorData[5];\r\n orientation.z = this._xrPoseVectorData[6];\r\n orientation.w = this._xrPoseVectorData[7];\r\n return this._xrPose;\r\n }\r\n\r\n public readonly fillPoses = this._nativeImpl.fillPoses!.bind(this._nativeImpl);\r\n\r\n public readonly getViewerPose = this._nativeImpl.getViewerPose.bind(this._nativeImpl);\r\n\r\n public readonly getHitTestResults = this._nativeImpl.getHitTestResults.bind(this._nativeImpl);\r\n\r\n public readonly getHitTestResultsForTransientInput = () => {\r\n throw new Error(\"XRFrame.getHitTestResultsForTransientInput not supported on native.\");\r\n };\r\n\r\n public get trackedAnchors(): XRAnchorSet | undefined {\r\n return this._nativeImpl.trackedAnchors;\r\n }\r\n\r\n public readonly createAnchor = this._nativeImpl.createAnchor!.bind(this._nativeImpl);\r\n\r\n public get worldInformation(): XRWorldInformation | undefined {\r\n return this._nativeImpl.worldInformation;\r\n }\r\n\r\n public get detectedPlanes(): XRPlaneSet | undefined {\r\n return this._nativeImpl.detectedPlanes;\r\n }\r\n\r\n public readonly getJointPose = this._nativeImpl.getJointPose!.bind(this._nativeImpl);\r\n\r\n public readonly fillJointRadii = this._nativeImpl.fillJointRadii!.bind(this._nativeImpl);\r\n\r\n public readonly getLightEstimate = () => {\r\n throw new Error(\"XRFrame.getLightEstimate not supported on native.\");\r\n };\r\n\r\n public get featurePointCloud(): number[] | undefined {\r\n return this._nativeImpl.featurePointCloud;\r\n }\r\n\r\n public readonly getImageTrackingResults = (): XRImageTrackingResult[] => {\r\n return this._nativeImpl._imageTrackingResults ?? [];\r\n };\r\n\r\n public getDepthInformation(view: XRView): XRCPUDepthInformation | null {\r\n throw new Error(\"This function is not available in Babylon Native\");\r\n // return this._nativeImpl.getDepthInformation(view);\r\n }\r\n}\r\n\r\nRegisterNativeTypeAsync(\"NativeXRFrame\", NativeXRFrame);\r\n"]}
|
package/XR/webXRCamera.d.ts
CHANGED
package/XR/webXRCamera.js
CHANGED
|
@@ -41,6 +41,7 @@ export class WebXRCamera extends FreeCamera {
|
|
|
41
41
|
* This is used when copying the position from a native (non XR) camera
|
|
42
42
|
*/
|
|
43
43
|
this.compensateOnFirstFrame = true;
|
|
44
|
+
this._rotate180 = new Quaternion(0, 1, 0, 0);
|
|
44
45
|
// Initial camera configuration
|
|
45
46
|
this.minZ = 0.1;
|
|
46
47
|
this.rotationQuaternion = new Quaternion();
|
|
@@ -224,6 +225,9 @@ export class WebXRCamera extends FreeCamera {
|
|
|
224
225
|
currentRig.rotationQuaternion.z *= -1;
|
|
225
226
|
currentRig.rotationQuaternion.w *= -1;
|
|
226
227
|
}
|
|
228
|
+
else {
|
|
229
|
+
currentRig.rotationQuaternion.multiplyInPlace(this._rotate180);
|
|
230
|
+
}
|
|
227
231
|
Matrix.FromFloat32ArrayToRefScaled(view.projectionMatrix, 0, 1, currentRig._projectionMatrix);
|
|
228
232
|
if (!this._scene.useRightHandedSystem) {
|
|
229
233
|
currentRig._projectionMatrix.toggleProjectionMatrixHandInPlace();
|
package/XR/webXRCamera.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webXRCamera.js","sourceRoot":"","sources":["../../../../lts/core/generated/XR/webXRCamera.ts"],"names":[],"mappings":"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","sourcesContent":["import { Vector3, Matrix, Quaternion, TmpVectors } from \"../Maths/math.vector\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Camera } from \"../Cameras/camera\";\r\nimport { FreeCamera } from \"../Cameras/freeCamera\";\r\nimport { TargetCamera } from \"../Cameras/targetCamera\";\r\nimport type { WebXRSessionManager } from \"./webXRSessionManager\";\r\nimport { Viewport } from \"../Maths/math.viewport\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { WebXRTrackingState } from \"./webXRTypes\";\r\n\r\n/**\r\n * WebXR Camera which holds the views for the xrSession\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/webXR/webXRCamera\r\n */\r\nexport class WebXRCamera extends FreeCamera {\r\n private static _ScaleReadOnly = Vector3.One();\r\n\r\n private _firstFrame = false;\r\n private _referenceQuaternion: Quaternion = Quaternion.Identity();\r\n private _referencedPosition: Vector3 = new Vector3();\r\n private _trackingState: WebXRTrackingState = WebXRTrackingState.NOT_TRACKING;\r\n\r\n /**\r\n * Observable raised before camera teleportation\r\n */\r\n public onBeforeCameraTeleport = new Observable<Vector3>();\r\n\r\n /**\r\n * Observable raised after camera teleportation\r\n */\r\n public onAfterCameraTeleport = new Observable<Vector3>();\r\n\r\n /**\r\n * Notifies when the camera's tracking state has changed.\r\n * Notice - will also be triggered when tracking has started (at the beginning of the session)\r\n */\r\n public onTrackingStateChanged = new Observable<WebXRTrackingState>();\r\n /**\r\n * Should position compensation execute on first frame.\r\n * This is used when copying the position from a native (non XR) camera\r\n */\r\n public compensateOnFirstFrame: boolean = true;\r\n\r\n /**\r\n * The last XRViewerPose from the current XRFrame\r\n * @internal\r\n */\r\n public _lastXRViewerPose?: XRViewerPose;\r\n\r\n /**\r\n * Creates a new webXRCamera, this should only be set at the camera after it has been updated by the xrSessionManager\r\n * @param name the name of the camera\r\n * @param scene the scene to add the camera to\r\n * @param _xrSessionManager a constructed xr session manager\r\n */\r\n constructor(name: string, scene: Scene, private _xrSessionManager: WebXRSessionManager) {\r\n super(name, Vector3.Zero(), scene);\r\n\r\n // Initial camera configuration\r\n this.minZ = 0.1;\r\n this.rotationQuaternion = new Quaternion();\r\n this.cameraRigMode = Camera.RIG_MODE_CUSTOM;\r\n this.updateUpVectorFromRotation = true;\r\n this._updateNumberOfRigCameras(1);\r\n // freeze projection matrix, which will be copied later\r\n this.freezeProjectionMatrix();\r\n\r\n this._xrSessionManager.onXRSessionInit.add(() => {\r\n this._referencedPosition.copyFromFloats(0, 0, 0);\r\n this._referenceQuaternion.copyFromFloats(0, 0, 0, 1);\r\n // first frame - camera's y position should be 0 for the correct offset\r\n this._firstFrame = this.compensateOnFirstFrame;\r\n });\r\n\r\n // Check transformation changes on each frame. Callback is added to be first so that the transformation will be\r\n // applied to the rest of the elements using the referenceSpace object\r\n this._xrSessionManager.onXRFrameObservable.add(\r\n () => {\r\n if (this._firstFrame) {\r\n this._updateFromXRSession();\r\n }\r\n this._updateReferenceSpace();\r\n this._updateFromXRSession();\r\n },\r\n undefined,\r\n true\r\n );\r\n }\r\n\r\n /**\r\n * Get the current XR tracking state of the camera\r\n */\r\n public get trackingState(): WebXRTrackingState {\r\n return this._trackingState;\r\n }\r\n\r\n private _setTrackingState(newState: WebXRTrackingState) {\r\n if (this._trackingState !== newState) {\r\n this._trackingState = newState;\r\n this.onTrackingStateChanged.notifyObservers(newState);\r\n }\r\n }\r\n\r\n /**\r\n * Return the user's height, unrelated to the current ground.\r\n * This will be the y position of this camera, when ground level is 0.\r\n */\r\n public get realWorldHeight(): number {\r\n const basePose = this._xrSessionManager.currentFrame && this._xrSessionManager.currentFrame.getViewerPose(this._xrSessionManager.baseReferenceSpace);\r\n if (basePose && basePose.transform) {\r\n return basePose.transform.position.y;\r\n } else {\r\n return 0;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _updateForDualEyeDebugging(/*pupilDistance = 0.01*/) {\r\n // Create initial camera rigs\r\n this._updateNumberOfRigCameras(2);\r\n this.rigCameras[0].viewport = new Viewport(0, 0, 0.5, 1.0);\r\n // this.rigCameras[0].position.x = -pupilDistance / 2;\r\n this.rigCameras[0].outputRenderTarget = null;\r\n this.rigCameras[1].viewport = new Viewport(0.5, 0, 0.5, 1.0);\r\n // this.rigCameras[1].position.x = pupilDistance / 2;\r\n this.rigCameras[1].outputRenderTarget = null;\r\n }\r\n\r\n /**\r\n * Sets this camera's transformation based on a non-vr camera\r\n * @param otherCamera the non-vr camera to copy the transformation from\r\n * @param resetToBaseReferenceSpace should XR reset to the base reference space\r\n */\r\n public setTransformationFromNonVRCamera(otherCamera: Camera = this.getScene().activeCamera!, resetToBaseReferenceSpace: boolean = true) {\r\n if (!otherCamera || otherCamera === this) {\r\n return;\r\n }\r\n const mat = otherCamera.computeWorldMatrix();\r\n mat.decompose(undefined, this.rotationQuaternion, this.position);\r\n // set the ground level\r\n this.position.y = 0;\r\n Quaternion.FromEulerAnglesToRef(0, this.rotationQuaternion.toEulerAngles().y, 0, this.rotationQuaternion);\r\n this._firstFrame = true;\r\n if (resetToBaseReferenceSpace) {\r\n this._xrSessionManager.resetReferenceSpace();\r\n }\r\n }\r\n\r\n /**\r\n * Gets the current instance class name (\"WebXRCamera\").\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"WebXRCamera\";\r\n }\r\n\r\n /**\r\n * Set the target for the camera to look at.\r\n * Note that this only rotates around the Y axis, as opposed to the default behavior of other cameras\r\n * @param target the target to set the camera to look at\r\n */\r\n public setTarget(target: Vector3): void {\r\n // only rotate around the y axis!\r\n const tmpVector = TmpVectors.Vector3[1];\r\n target.subtractToRef(this.position, tmpVector);\r\n tmpVector.y = 0;\r\n tmpVector.normalize();\r\n const yRotation = Math.atan2(tmpVector.x, tmpVector.z);\r\n this.rotationQuaternion.toEulerAnglesToRef(tmpVector);\r\n Quaternion.FromEulerAnglesToRef(tmpVector.x, yRotation, tmpVector.z, this.rotationQuaternion);\r\n }\r\n\r\n public dispose() {\r\n super.dispose();\r\n this._lastXRViewerPose = undefined;\r\n }\r\n\r\n private _updateFromXRSession() {\r\n const pose = this._xrSessionManager.currentFrame && this._xrSessionManager.currentFrame.getViewerPose(this._xrSessionManager.referenceSpace);\r\n this._lastXRViewerPose = pose || undefined;\r\n if (!pose) {\r\n this._setTrackingState(WebXRTrackingState.NOT_TRACKING);\r\n return;\r\n }\r\n\r\n // Set the tracking state. if it didn't change it is a no-op\r\n const trackingState = pose.emulatedPosition ? WebXRTrackingState.TRACKING_LOST : WebXRTrackingState.TRACKING;\r\n this._setTrackingState(trackingState);\r\n\r\n // check min/max Z and update if not the same as in cache\r\n if (this.minZ !== this._cache.minZ || this.maxZ !== this._cache.maxZ) {\r\n const xrRenderState: XRRenderStateInit = {\r\n // if maxZ is 0 it should be \"Infinity\", but it doesn't work with the WebXR API. Setting to a large number.\r\n depthFar: this.maxZ || 10000,\r\n depthNear: this.minZ,\r\n };\r\n\r\n this._xrSessionManager.updateRenderState(xrRenderState);\r\n this._cache.minZ = this.minZ;\r\n this._cache.maxZ = this.maxZ;\r\n }\r\n\r\n if (pose.transform) {\r\n const orientation = pose.transform.orientation;\r\n if (pose.transform.orientation.x === undefined) {\r\n // Babylon native polyfill can return an undefined orientation value\r\n // When not initialized\r\n return;\r\n }\r\n const pos = pose.transform.position;\r\n this._referencedPosition.set(pos.x, pos.y, pos.z);\r\n\r\n this._referenceQuaternion.set(orientation.x, orientation.y, orientation.z, orientation.w);\r\n if (!this._scene.useRightHandedSystem) {\r\n this._referencedPosition.z *= -1;\r\n this._referenceQuaternion.z *= -1;\r\n this._referenceQuaternion.w *= -1;\r\n }\r\n\r\n if (this._firstFrame) {\r\n this._firstFrame = false;\r\n // we have the XR reference, now use this to find the offset to get the camera to be\r\n // in the right position\r\n\r\n // set the height to correlate to the current height\r\n this.position.y += this._referencedPosition.y;\r\n // avoid using the head rotation on the first frame.\r\n this._referenceQuaternion.copyFromFloats(0, 0, 0, 1);\r\n } else {\r\n // update position and rotation as reference\r\n this.rotationQuaternion.copyFrom(this._referenceQuaternion);\r\n this.position.copyFrom(this._referencedPosition);\r\n }\r\n }\r\n\r\n // Update camera rigs\r\n if (this.rigCameras.length !== pose.views.length) {\r\n this._updateNumberOfRigCameras(pose.views.length);\r\n }\r\n\r\n pose.views.forEach((view: XRView, i: number) => {\r\n const currentRig = <TargetCamera>this.rigCameras[i];\r\n // update right and left, where applicable\r\n if (!currentRig.isLeftCamera && !currentRig.isRightCamera) {\r\n if (view.eye === \"right\") {\r\n currentRig._isRightCamera = true;\r\n } else if (view.eye === \"left\") {\r\n currentRig._isLeftCamera = true;\r\n }\r\n }\r\n // Update view/projection matrix\r\n const pos = view.transform.position;\r\n const orientation = view.transform.orientation;\r\n\r\n currentRig.parent = this.parent;\r\n\r\n currentRig.position.set(pos.x, pos.y, pos.z);\r\n currentRig.rotationQuaternion.set(orientation.x, orientation.y, orientation.z, orientation.w);\r\n if (!this._scene.useRightHandedSystem) {\r\n currentRig.position.z *= -1;\r\n currentRig.rotationQuaternion.z *= -1;\r\n currentRig.rotationQuaternion.w *= -1;\r\n }\r\n Matrix.FromFloat32ArrayToRefScaled(view.projectionMatrix, 0, 1, currentRig._projectionMatrix);\r\n\r\n if (!this._scene.useRightHandedSystem) {\r\n currentRig._projectionMatrix.toggleProjectionMatrixHandInPlace();\r\n }\r\n\r\n // first camera?\r\n if (i === 0) {\r\n this._projectionMatrix.copyFrom(currentRig._projectionMatrix);\r\n }\r\n\r\n const renderTargetTexture = this._xrSessionManager.getRenderTargetTextureForView(view);\r\n this._renderingMultiview = renderTargetTexture?._texture?.isMultiview || false;\r\n if (this._renderingMultiview) {\r\n // For multiview, the render target texture is the same per-view (just the slice index is different),\r\n // so we only need to set the output render target once for the rig parent.\r\n if (i == 0) {\r\n this._xrSessionManager.trySetViewportForView(this.viewport, view);\r\n this.outputRenderTarget = renderTargetTexture;\r\n }\r\n } else {\r\n // Update viewport\r\n this._xrSessionManager.trySetViewportForView(currentRig.viewport, view);\r\n\r\n // Set cameras to render to the session's render target\r\n currentRig.outputRenderTarget = renderTargetTexture || this._xrSessionManager.getRenderTargetTextureForView(view);\r\n }\r\n\r\n // Replicate parent rig camera behavior\r\n currentRig.layerMask = this.layerMask;\r\n });\r\n }\r\n\r\n private _updateNumberOfRigCameras(viewCount = 1) {\r\n while (this.rigCameras.length < viewCount) {\r\n const newCamera = new TargetCamera(\"XR-RigCamera: \" + this.rigCameras.length, Vector3.Zero(), this.getScene());\r\n newCamera.minZ = 0.1;\r\n newCamera.rotationQuaternion = new Quaternion();\r\n newCamera.updateUpVectorFromRotation = true;\r\n newCamera.isRigCamera = true;\r\n newCamera.rigParent = this;\r\n // do not compute projection matrix, provided by XR\r\n newCamera.freezeProjectionMatrix();\r\n this.rigCameras.push(newCamera);\r\n }\r\n while (this.rigCameras.length > viewCount) {\r\n const removedCamera = this.rigCameras.pop();\r\n if (removedCamera) {\r\n removedCamera.dispose();\r\n }\r\n }\r\n }\r\n\r\n private _updateReferenceSpace() {\r\n // were position & rotation updated OUTSIDE of the xr update loop\r\n if (!this.position.equals(this._referencedPosition) || !this.rotationQuaternion.equals(this._referenceQuaternion)) {\r\n const referencedMat = TmpVectors.Matrix[0];\r\n const poseMat = TmpVectors.Matrix[1];\r\n const transformMat = TmpVectors.Matrix[2];\r\n\r\n Matrix.ComposeToRef(WebXRCamera._ScaleReadOnly, this._referenceQuaternion, this._referencedPosition, referencedMat);\r\n Matrix.ComposeToRef(WebXRCamera._ScaleReadOnly, this.rotationQuaternion, this.position, poseMat);\r\n referencedMat.invert().multiplyToRef(poseMat, transformMat);\r\n transformMat.invert();\r\n\r\n if (!this._scene.useRightHandedSystem) {\r\n transformMat.toggleModelMatrixHandInPlace();\r\n }\r\n\r\n transformMat.decompose(undefined, this._referenceQuaternion, this._referencedPosition);\r\n const transform = new XRRigidTransform(\r\n {\r\n x: this._referencedPosition.x,\r\n y: this._referencedPosition.y,\r\n z: this._referencedPosition.z,\r\n },\r\n {\r\n x: this._referenceQuaternion.x,\r\n y: this._referenceQuaternion.y,\r\n z: this._referenceQuaternion.z,\r\n w: this._referenceQuaternion.w,\r\n }\r\n );\r\n this._xrSessionManager.referenceSpace = this._xrSessionManager.referenceSpace.getOffsetReferenceSpace(transform);\r\n }\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"webXRCamera.js","sourceRoot":"","sources":["../../../../lts/core/generated/XR/webXRCamera.ts"],"names":[],"mappings":"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","sourcesContent":["import { Vector3, Matrix, Quaternion, TmpVectors } from \"../Maths/math.vector\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Camera } from \"../Cameras/camera\";\r\nimport { FreeCamera } from \"../Cameras/freeCamera\";\r\nimport { TargetCamera } from \"../Cameras/targetCamera\";\r\nimport type { WebXRSessionManager } from \"./webXRSessionManager\";\r\nimport { Viewport } from \"../Maths/math.viewport\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { WebXRTrackingState } from \"./webXRTypes\";\r\n\r\n/**\r\n * WebXR Camera which holds the views for the xrSession\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/webXR/webXRCamera\r\n */\r\nexport class WebXRCamera extends FreeCamera {\r\n private static _ScaleReadOnly = Vector3.One();\r\n\r\n private _firstFrame = false;\r\n private _referenceQuaternion: Quaternion = Quaternion.Identity();\r\n private _referencedPosition: Vector3 = new Vector3();\r\n private _trackingState: WebXRTrackingState = WebXRTrackingState.NOT_TRACKING;\r\n\r\n /**\r\n * Observable raised before camera teleportation\r\n */\r\n public onBeforeCameraTeleport = new Observable<Vector3>();\r\n\r\n /**\r\n * Observable raised after camera teleportation\r\n */\r\n public onAfterCameraTeleport = new Observable<Vector3>();\r\n\r\n /**\r\n * Notifies when the camera's tracking state has changed.\r\n * Notice - will also be triggered when tracking has started (at the beginning of the session)\r\n */\r\n public onTrackingStateChanged = new Observable<WebXRTrackingState>();\r\n /**\r\n * Should position compensation execute on first frame.\r\n * This is used when copying the position from a native (non XR) camera\r\n */\r\n public compensateOnFirstFrame: boolean = true;\r\n\r\n /**\r\n * The last XRViewerPose from the current XRFrame\r\n * @internal\r\n */\r\n public _lastXRViewerPose?: XRViewerPose;\r\n\r\n /**\r\n * Creates a new webXRCamera, this should only be set at the camera after it has been updated by the xrSessionManager\r\n * @param name the name of the camera\r\n * @param scene the scene to add the camera to\r\n * @param _xrSessionManager a constructed xr session manager\r\n */\r\n constructor(name: string, scene: Scene, private _xrSessionManager: WebXRSessionManager) {\r\n super(name, Vector3.Zero(), scene);\r\n\r\n // Initial camera configuration\r\n this.minZ = 0.1;\r\n this.rotationQuaternion = new Quaternion();\r\n this.cameraRigMode = Camera.RIG_MODE_CUSTOM;\r\n this.updateUpVectorFromRotation = true;\r\n this._updateNumberOfRigCameras(1);\r\n // freeze projection matrix, which will be copied later\r\n this.freezeProjectionMatrix();\r\n\r\n this._xrSessionManager.onXRSessionInit.add(() => {\r\n this._referencedPosition.copyFromFloats(0, 0, 0);\r\n this._referenceQuaternion.copyFromFloats(0, 0, 0, 1);\r\n // first frame - camera's y position should be 0 for the correct offset\r\n this._firstFrame = this.compensateOnFirstFrame;\r\n });\r\n\r\n // Check transformation changes on each frame. Callback is added to be first so that the transformation will be\r\n // applied to the rest of the elements using the referenceSpace object\r\n this._xrSessionManager.onXRFrameObservable.add(\r\n () => {\r\n if (this._firstFrame) {\r\n this._updateFromXRSession();\r\n }\r\n this._updateReferenceSpace();\r\n this._updateFromXRSession();\r\n },\r\n undefined,\r\n true\r\n );\r\n }\r\n\r\n /**\r\n * Get the current XR tracking state of the camera\r\n */\r\n public get trackingState(): WebXRTrackingState {\r\n return this._trackingState;\r\n }\r\n\r\n private _setTrackingState(newState: WebXRTrackingState) {\r\n if (this._trackingState !== newState) {\r\n this._trackingState = newState;\r\n this.onTrackingStateChanged.notifyObservers(newState);\r\n }\r\n }\r\n\r\n /**\r\n * Return the user's height, unrelated to the current ground.\r\n * This will be the y position of this camera, when ground level is 0.\r\n */\r\n public get realWorldHeight(): number {\r\n const basePose = this._xrSessionManager.currentFrame && this._xrSessionManager.currentFrame.getViewerPose(this._xrSessionManager.baseReferenceSpace);\r\n if (basePose && basePose.transform) {\r\n return basePose.transform.position.y;\r\n } else {\r\n return 0;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _updateForDualEyeDebugging(/*pupilDistance = 0.01*/) {\r\n // Create initial camera rigs\r\n this._updateNumberOfRigCameras(2);\r\n this.rigCameras[0].viewport = new Viewport(0, 0, 0.5, 1.0);\r\n // this.rigCameras[0].position.x = -pupilDistance / 2;\r\n this.rigCameras[0].outputRenderTarget = null;\r\n this.rigCameras[1].viewport = new Viewport(0.5, 0, 0.5, 1.0);\r\n // this.rigCameras[1].position.x = pupilDistance / 2;\r\n this.rigCameras[1].outputRenderTarget = null;\r\n }\r\n\r\n /**\r\n * Sets this camera's transformation based on a non-vr camera\r\n * @param otherCamera the non-vr camera to copy the transformation from\r\n * @param resetToBaseReferenceSpace should XR reset to the base reference space\r\n */\r\n public setTransformationFromNonVRCamera(otherCamera: Camera = this.getScene().activeCamera!, resetToBaseReferenceSpace: boolean = true) {\r\n if (!otherCamera || otherCamera === this) {\r\n return;\r\n }\r\n const mat = otherCamera.computeWorldMatrix();\r\n mat.decompose(undefined, this.rotationQuaternion, this.position);\r\n // set the ground level\r\n this.position.y = 0;\r\n Quaternion.FromEulerAnglesToRef(0, this.rotationQuaternion.toEulerAngles().y, 0, this.rotationQuaternion);\r\n this._firstFrame = true;\r\n if (resetToBaseReferenceSpace) {\r\n this._xrSessionManager.resetReferenceSpace();\r\n }\r\n }\r\n\r\n /**\r\n * Gets the current instance class name (\"WebXRCamera\").\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"WebXRCamera\";\r\n }\r\n\r\n /**\r\n * Set the target for the camera to look at.\r\n * Note that this only rotates around the Y axis, as opposed to the default behavior of other cameras\r\n * @param target the target to set the camera to look at\r\n */\r\n public setTarget(target: Vector3): void {\r\n // only rotate around the y axis!\r\n const tmpVector = TmpVectors.Vector3[1];\r\n target.subtractToRef(this.position, tmpVector);\r\n tmpVector.y = 0;\r\n tmpVector.normalize();\r\n const yRotation = Math.atan2(tmpVector.x, tmpVector.z);\r\n this.rotationQuaternion.toEulerAnglesToRef(tmpVector);\r\n Quaternion.FromEulerAnglesToRef(tmpVector.x, yRotation, tmpVector.z, this.rotationQuaternion);\r\n }\r\n\r\n public dispose() {\r\n super.dispose();\r\n this._lastXRViewerPose = undefined;\r\n }\r\n\r\n private _rotate180 = new Quaternion(0, 1, 0, 0);\r\n\r\n private _updateFromXRSession() {\r\n const pose = this._xrSessionManager.currentFrame && this._xrSessionManager.currentFrame.getViewerPose(this._xrSessionManager.referenceSpace);\r\n this._lastXRViewerPose = pose || undefined;\r\n if (!pose) {\r\n this._setTrackingState(WebXRTrackingState.NOT_TRACKING);\r\n return;\r\n }\r\n\r\n // Set the tracking state. if it didn't change it is a no-op\r\n const trackingState = pose.emulatedPosition ? WebXRTrackingState.TRACKING_LOST : WebXRTrackingState.TRACKING;\r\n this._setTrackingState(trackingState);\r\n\r\n // check min/max Z and update if not the same as in cache\r\n if (this.minZ !== this._cache.minZ || this.maxZ !== this._cache.maxZ) {\r\n const xrRenderState: XRRenderStateInit = {\r\n // if maxZ is 0 it should be \"Infinity\", but it doesn't work with the WebXR API. Setting to a large number.\r\n depthFar: this.maxZ || 10000,\r\n depthNear: this.minZ,\r\n };\r\n\r\n this._xrSessionManager.updateRenderState(xrRenderState);\r\n this._cache.minZ = this.minZ;\r\n this._cache.maxZ = this.maxZ;\r\n }\r\n\r\n if (pose.transform) {\r\n const orientation = pose.transform.orientation;\r\n if (pose.transform.orientation.x === undefined) {\r\n // Babylon native polyfill can return an undefined orientation value\r\n // When not initialized\r\n return;\r\n }\r\n const pos = pose.transform.position;\r\n this._referencedPosition.set(pos.x, pos.y, pos.z);\r\n\r\n this._referenceQuaternion.set(orientation.x, orientation.y, orientation.z, orientation.w);\r\n if (!this._scene.useRightHandedSystem) {\r\n this._referencedPosition.z *= -1;\r\n this._referenceQuaternion.z *= -1;\r\n this._referenceQuaternion.w *= -1;\r\n }\r\n\r\n if (this._firstFrame) {\r\n this._firstFrame = false;\r\n // we have the XR reference, now use this to find the offset to get the camera to be\r\n // in the right position\r\n\r\n // set the height to correlate to the current height\r\n this.position.y += this._referencedPosition.y;\r\n // avoid using the head rotation on the first frame.\r\n this._referenceQuaternion.copyFromFloats(0, 0, 0, 1);\r\n } else {\r\n // update position and rotation as reference\r\n this.rotationQuaternion.copyFrom(this._referenceQuaternion);\r\n this.position.copyFrom(this._referencedPosition);\r\n }\r\n }\r\n\r\n // Update camera rigs\r\n if (this.rigCameras.length !== pose.views.length) {\r\n this._updateNumberOfRigCameras(pose.views.length);\r\n }\r\n\r\n pose.views.forEach((view: XRView, i: number) => {\r\n const currentRig = <TargetCamera>this.rigCameras[i];\r\n // update right and left, where applicable\r\n if (!currentRig.isLeftCamera && !currentRig.isRightCamera) {\r\n if (view.eye === \"right\") {\r\n currentRig._isRightCamera = true;\r\n } else if (view.eye === \"left\") {\r\n currentRig._isLeftCamera = true;\r\n }\r\n }\r\n // Update view/projection matrix\r\n const pos = view.transform.position;\r\n const orientation = view.transform.orientation;\r\n\r\n currentRig.parent = this.parent;\r\n\r\n currentRig.position.set(pos.x, pos.y, pos.z);\r\n currentRig.rotationQuaternion.set(orientation.x, orientation.y, orientation.z, orientation.w);\r\n if (!this._scene.useRightHandedSystem) {\r\n currentRig.position.z *= -1;\r\n currentRig.rotationQuaternion.z *= -1;\r\n currentRig.rotationQuaternion.w *= -1;\r\n } else {\r\n currentRig.rotationQuaternion.multiplyInPlace(this._rotate180);\r\n }\r\n Matrix.FromFloat32ArrayToRefScaled(view.projectionMatrix, 0, 1, currentRig._projectionMatrix);\r\n\r\n if (!this._scene.useRightHandedSystem) {\r\n currentRig._projectionMatrix.toggleProjectionMatrixHandInPlace();\r\n }\r\n\r\n // first camera?\r\n if (i === 0) {\r\n this._projectionMatrix.copyFrom(currentRig._projectionMatrix);\r\n }\r\n\r\n const renderTargetTexture = this._xrSessionManager.getRenderTargetTextureForView(view);\r\n this._renderingMultiview = renderTargetTexture?._texture?.isMultiview || false;\r\n if (this._renderingMultiview) {\r\n // For multiview, the render target texture is the same per-view (just the slice index is different),\r\n // so we only need to set the output render target once for the rig parent.\r\n if (i == 0) {\r\n this._xrSessionManager.trySetViewportForView(this.viewport, view);\r\n this.outputRenderTarget = renderTargetTexture;\r\n }\r\n } else {\r\n // Update viewport\r\n this._xrSessionManager.trySetViewportForView(currentRig.viewport, view);\r\n\r\n // Set cameras to render to the session's render target\r\n currentRig.outputRenderTarget = renderTargetTexture || this._xrSessionManager.getRenderTargetTextureForView(view);\r\n }\r\n\r\n // Replicate parent rig camera behavior\r\n currentRig.layerMask = this.layerMask;\r\n });\r\n }\r\n\r\n private _updateNumberOfRigCameras(viewCount = 1) {\r\n while (this.rigCameras.length < viewCount) {\r\n const newCamera = new TargetCamera(\"XR-RigCamera: \" + this.rigCameras.length, Vector3.Zero(), this.getScene());\r\n newCamera.minZ = 0.1;\r\n newCamera.rotationQuaternion = new Quaternion();\r\n newCamera.updateUpVectorFromRotation = true;\r\n newCamera.isRigCamera = true;\r\n newCamera.rigParent = this;\r\n // do not compute projection matrix, provided by XR\r\n newCamera.freezeProjectionMatrix();\r\n this.rigCameras.push(newCamera);\r\n }\r\n while (this.rigCameras.length > viewCount) {\r\n const removedCamera = this.rigCameras.pop();\r\n if (removedCamera) {\r\n removedCamera.dispose();\r\n }\r\n }\r\n }\r\n\r\n private _updateReferenceSpace() {\r\n // were position & rotation updated OUTSIDE of the xr update loop\r\n if (!this.position.equals(this._referencedPosition) || !this.rotationQuaternion.equals(this._referenceQuaternion)) {\r\n const referencedMat = TmpVectors.Matrix[0];\r\n const poseMat = TmpVectors.Matrix[1];\r\n const transformMat = TmpVectors.Matrix[2];\r\n\r\n Matrix.ComposeToRef(WebXRCamera._ScaleReadOnly, this._referenceQuaternion, this._referencedPosition, referencedMat);\r\n Matrix.ComposeToRef(WebXRCamera._ScaleReadOnly, this.rotationQuaternion, this.position, poseMat);\r\n referencedMat.invert().multiplyToRef(poseMat, transformMat);\r\n transformMat.invert();\r\n\r\n if (!this._scene.useRightHandedSystem) {\r\n transformMat.toggleModelMatrixHandInPlace();\r\n }\r\n\r\n transformMat.decompose(undefined, this._referenceQuaternion, this._referencedPosition);\r\n const transform = new XRRigidTransform(\r\n {\r\n x: this._referencedPosition.x,\r\n y: this._referencedPosition.y,\r\n z: this._referencedPosition.z,\r\n },\r\n {\r\n x: this._referenceQuaternion.x,\r\n y: this._referenceQuaternion.y,\r\n z: this._referenceQuaternion.z,\r\n w: this._referenceQuaternion.w,\r\n }\r\n );\r\n this._xrSessionManager.referenceSpace = this._xrSessionManager.referenceSpace.getOffsetReferenceSpace(transform);\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -127,6 +127,10 @@ export declare class WebXRFeatureName {
|
|
|
127
127
|
* The name of the composition layers feature
|
|
128
128
|
*/
|
|
129
129
|
static readonly LAYERS = "xr-layers";
|
|
130
|
+
/**
|
|
131
|
+
* The name of the depth sensing feature
|
|
132
|
+
*/
|
|
133
|
+
static readonly DEPTH_SENSING = "xr-depth-sensing";
|
|
130
134
|
}
|
|
131
135
|
/**
|
|
132
136
|
* Defining the constructor of a feature. Used to register the modules.
|
|
@@ -76,6 +76,10 @@ WebXRFeatureName.WALKING_LOCOMOTION = "xr-walking-locomotion";
|
|
|
76
76
|
* The name of the composition layers feature
|
|
77
77
|
*/
|
|
78
78
|
WebXRFeatureName.LAYERS = "xr-layers";
|
|
79
|
+
/**
|
|
80
|
+
* The name of the depth sensing feature
|
|
81
|
+
*/
|
|
82
|
+
WebXRFeatureName.DEPTH_SENSING = "xr-depth-sensing";
|
|
79
83
|
/**
|
|
80
84
|
* The WebXR features manager is responsible of enabling or disabling features required for the current XR session.
|
|
81
85
|
* It is mainly used in AR sessions.
|