forked from EXT/VR180-Web-Player
63 lines
2.3 KiB
JavaScript
63 lines
2.3 KiB
JavaScript
export function isLeftEyeCamera(renderingRenderer, activeCamera) {
|
|
const xrCamera = renderingRenderer.xr.getCamera();
|
|
if (xrCamera && xrCamera.cameras && xrCamera.cameras.length >= 2) {
|
|
if (activeCamera === xrCamera.cameras[0]) {
|
|
return true;
|
|
}
|
|
if (activeCamera === xrCamera.cameras[1]) {
|
|
return false;
|
|
}
|
|
const viewMatrixX = activeCamera.matrixWorldInverse.elements[12];
|
|
const leftCamX = xrCamera.cameras[0].matrixWorldInverse.elements[12];
|
|
const rightCamX = xrCamera.cameras[1].matrixWorldInverse.elements[12];
|
|
const diffToLeft = Math.abs(viewMatrixX - leftCamX);
|
|
const diffToRight = Math.abs(viewMatrixX - rightCamX);
|
|
if (diffToLeft < 0.001 || diffToLeft < diffToRight) {
|
|
return true;
|
|
}
|
|
if (diffToRight < 0.001) {
|
|
return false;
|
|
}
|
|
}
|
|
return activeCamera.projectionMatrix.elements[8] <= 0;
|
|
}
|
|
export function applySbsTextureWindow(renderingRenderer, activeCamera, material, is2DMode) {
|
|
if (!material.map)
|
|
return;
|
|
const isPresentingXR = renderingRenderer.xr.isPresenting;
|
|
if (is2DMode && !isPresentingXR) {
|
|
material.map.offset.x = 0;
|
|
material.map.repeat.x = 0.5;
|
|
material.map.offset.y = 0;
|
|
material.map.repeat.y = 1;
|
|
return;
|
|
}
|
|
material.map.offset.x = 0;
|
|
material.map.repeat.x = 1;
|
|
material.map.offset.y = 0;
|
|
material.map.repeat.y = 1;
|
|
if (!isPresentingXR) {
|
|
return;
|
|
}
|
|
material.map.offset.x = isLeftEyeCamera(renderingRenderer, activeCamera) ? 0 : 0.5;
|
|
material.map.repeat.x = 0.5;
|
|
}
|
|
export function hideContentMeshes(vr180Mesh, planeMesh) {
|
|
if (vr180Mesh)
|
|
vr180Mesh.visible = false;
|
|
if (planeMesh)
|
|
planeMesh.visible = false;
|
|
}
|
|
export function showActiveContentMesh(vr180Mesh, planeMesh, activeContentMesh) {
|
|
hideContentMeshes(vr180Mesh, planeMesh);
|
|
if (activeContentMesh) {
|
|
activeContentMesh.visible = true;
|
|
}
|
|
}
|
|
export function positionPlaneForPresentation(planeMesh, camera2D, isFallback2D, planeDistance, plane2DDistance) {
|
|
if (!planeMesh)
|
|
return;
|
|
const zPosition = isFallback2D && camera2D ? camera2D.position.z - plane2DDistance : -planeDistance;
|
|
planeMesh.position.set(0, 1.6, zPosition);
|
|
}
|