forked from EXT/VR180-Web-Player
81 lines
2.2 KiB
TypeScript
81 lines
2.2 KiB
TypeScript
export function isLeftEyeCamera(renderingRenderer: any, activeCamera: any): boolean {
|
|
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: any,
|
|
activeCamera: any,
|
|
material: any,
|
|
is2DMode: boolean
|
|
): void {
|
|
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: any, planeMesh: any): void {
|
|
if (vr180Mesh) vr180Mesh.visible = false;
|
|
if (planeMesh) planeMesh.visible = false;
|
|
}
|
|
|
|
export function showActiveContentMesh(vr180Mesh: any, planeMesh: any, activeContentMesh: any): void {
|
|
hideContentMeshes(vr180Mesh, planeMesh);
|
|
if (activeContentMesh) {
|
|
activeContentMesh.visible = true;
|
|
}
|
|
}
|
|
|
|
export function positionPlaneForPresentation(
|
|
planeMesh: any,
|
|
camera2D: any,
|
|
isFallback2D: boolean,
|
|
planeDistance: number,
|
|
plane2DDistance: number
|
|
): void {
|
|
if (!planeMesh) return;
|
|
const zPosition = isFallback2D && camera2D ? camera2D.position.z - plane2DDistance : -planeDistance;
|
|
planeMesh.position.set(0, 1.6, zPosition);
|
|
}
|