1
0

Merge pull request #3 from Verdi/revert-1-fix/quest-stereo-rendering

Revert "Fix stereo rendering glitches on Meta Quest browsers"
This commit is contained in:
Michael Verdi
2026-01-26 23:14:47 -06:00
committed by GitHub

View File

@@ -411,7 +411,7 @@ function init() {
vr180Mesh.onBeforeRender = function (renderer, scene, activeCamera, geometry, material, group) { vr180Mesh.onBeforeRender = function (renderer, scene, activeCamera, geometry, material, group) {
if (!material.map) return; if (!material.map) return;
const isPresentingXR = renderer.xr.isPresenting; const isPresentingXR = renderer.xr.isPresenting;
// Handle 2D mode - show only left eye view // Handle 2D mode - show only left eye view
if (is2DMode && !isPresentingXR) { if (is2DMode && !isPresentingXR) {
material.map.offset.x = 0; material.map.offset.x = 0;
@@ -420,7 +420,7 @@ function init() {
material.map.repeat.y = 1; material.map.repeat.y = 1;
return; return;
} }
// Default to full texture for non-VR, non-2D mode // Default to full texture for non-VR, non-2D mode
material.map.offset.x = 0; material.map.repeat.x = 1; material.map.offset.x = 0; material.map.repeat.x = 1;
material.map.offset.y = 0; material.map.repeat.y = 1; material.map.offset.y = 0; material.map.repeat.y = 1;
@@ -428,20 +428,25 @@ function init() {
return; return;
} }
// Use view matrix eye offset for reliable stereo detection const xrCamera = renderer.xr.getCamera();
// This works consistently across Quest Browser updates and Safari/VisionOS
// Left eye has negative X offset, right eye has positive X offset
const viewMatrix = activeCamera.matrixWorldInverse;
const eyeOffsetX = viewMatrix.elements[12];
if (eyeOffsetX < 0) { if (xrCamera && xrCamera.cameras && xrCamera.cameras.length >= 2) {
// Left eye - show left half of SBS video if (activeCamera === xrCamera.cameras[0]) {
material.map.offset.x = 0; material.map.offset.x = 0;
} else if (activeCamera === xrCamera.cameras[1]) {
material.map.offset.x = 0.5;
} else {
material.map.offset.x = 0;
}
material.map.repeat.x = 0.5;
} else { } else {
// Right eye - show right half of SBS video const projMatrixEl8 = activeCamera.projectionMatrix.elements[8];
material.map.offset.x = 0.5; if (projMatrixEl8 < -0.0001) {
material.map.offset.x = 0; material.map.repeat.x = 0.5;
} else if (projMatrixEl8 > 0.0001) {
material.map.offset.x = 0.5; material.map.repeat.x = 0.5;
}
} }
material.map.repeat.x = 0.5;
}; };
// Initialize 2D camera // Initialize 2D camera
@@ -1726,12 +1731,6 @@ function renderXR(timestamp, frame) {
} }
} }
try { try {
// Ensure video texture is synchronized with render loop
// This prevents glitches from texture update timing issues on Quest browsers
if (videoTexture && video && !video.paused && !video.ended) {
videoTexture.needsUpdate = true;
}
handleControllerInteractions(); handleControllerInteractions();
renderer.render(scene, camera); renderer.render(scene, camera);
} catch (error) { } catch (error) {