diff --git a/examples/files.json b/examples/files.json
index 58600f57308e9e..25f1220fba090d 100644
--- a/examples/files.json
+++ b/examples/files.json
@@ -469,6 +469,7 @@
"webgpu_water",
"webgpu_xr_rollercoaster",
"webgpu_xr_cubes",
+ "webgpu_xr_media_layer",
"webgpu_xr_native_layers"
],
"webaudio": [
diff --git a/examples/screenshots/webgpu_xr_media_layer.jpg b/examples/screenshots/webgpu_xr_media_layer.jpg
new file mode 100644
index 00000000000000..7e5e745ac5f4d7
Binary files /dev/null and b/examples/screenshots/webgpu_xr_media_layer.jpg differ
diff --git a/examples/webgpu_xr_media_layer.html b/examples/webgpu_xr_media_layer.html
new file mode 100644
index 00000000000000..40524483539bb2
--- /dev/null
+++ b/examples/webgpu_xr_media_layer.html
@@ -0,0 +1,311 @@
+
+
+
+ three.js vr - 360 stereo video
+
+
+
+
+
+
+
+
+
three.js vr - 360 stereo/mono video native media layers
+ stereoscopic panoramic render by
pedrofe. scene from
mery project.
+ Choose Layout:
+
+
+
+
+
+
+
+
+
diff --git a/src/renderers/common/XRManager.js b/src/renderers/common/XRManager.js
index c4d52dc76b78fb..f6e7f9efc19254 100644
--- a/src/renderers/common/XRManager.js
+++ b/src/renderers/common/XRManager.js
@@ -14,12 +14,25 @@ import { CylinderGeometry } from '../../geometries/CylinderGeometry.js';
import QuadMesh from './QuadMesh.js';
import NodeMaterial from '../../materials/nodes/NodeMaterial.js';
import { PlaneGeometry } from '../../geometries/PlaneGeometry.js';
+import { SphereGeometry } from '../../geometries/SphereGeometry.js';
import { MeshBasicMaterial } from '../../materials/MeshBasicMaterial.js';
import { Mesh } from '../../objects/Mesh.js';
+import { Group } from '../../objects/Group.js';
const _cameraLPos = /*@__PURE__*/ new Vector3();
const _cameraRPos = /*@__PURE__*/ new Vector3();
+const UVMapFactors = {
+ 'stereo-top-bottom': [
+ { yMult: 0.5, yPhase: 0, xMult: 1.0, xPhase: 0 },
+ { yMult: 0.5, yPhase: 0.5, xMult: 1.0, xPhase: 0 }
+ ],
+ 'stereo-left-right': [
+ { yMult: 1.0, yPhase: 0, xMult: 0.5, xPhase: 0 },
+ { yMult: 1.0, yPhase: 0, xMult: 0.5, xPhase: 0.5 }
+ ]
+};
+
/**
* The XR manager is built on top of the WebXR Device API to
* manage XR sessions with `WebGPURenderer`.
@@ -391,6 +404,22 @@ class XRManager extends EventDispatcher {
*/
this._useMultiview = false;
+ /**
+ * Stores params and video elements for equirect layers.
+ *
+ * @private
+ * @type {Array