Use the shared buildFovDetails function

This commit is contained in:
wheaney 2026-05-28 15:14:40 -07:00
parent 851d972da5
commit 00ec9ed593
4 changed files with 23 additions and 85 deletions

@ -1 +1 @@
Subproject commit 6cc1d97ece687b2d71dfdb51c94eaf11c82c7fe5 Subproject commit 65376ad92e0cecfc0bf77ced15ed0d32e33c6f82

View File

@ -7,8 +7,8 @@ import Shell from 'gi://Shell';
import St from 'gi://St'; import St from 'gi://St';
import { VirtualDisplayEffect, SMOOTH_FOLLOW_SLERP_TIMELINE_MS } from './virtualdisplayeffect.js'; import { VirtualDisplayEffect, SMOOTH_FOLLOW_SLERP_TIMELINE_MS } from './virtualdisplayeffect.js';
import { degreeToRadian, diagonalToCrossFOVs, fovConversionFns } from './shared/math.js'; import { degreeToRadian } from './shared/math.js';
import { findFocusedMonitor, monitorsToPlacements } from './shared/displayPlacement.js'; import { buildFovDetails, findFocusedMonitor, monitorsToPlacements } from './shared/displayPlacement.js';
import * as Main from 'resource:///org/gnome/shell/ui/main.js'; import * as Main from 'resource:///org/gnome/shell/ui/main.js';
@ -487,54 +487,19 @@ export const VirtualDisplaysActor = GObject.registerClass({
} }
_fov_details() { _fov_details() {
const aspect = this.target_monitor.width / this.target_monitor.height;
const fovLengths = diagonalToCrossFOVs(degreeToRadian(Globals.data_stream.device_data.displayFov), aspect);
const monitorWrappingScheme = this._actual_wrap_scheme(); const monitorWrappingScheme = this._actual_wrap_scheme();
const defaultDistance = this._display_distance_default(); const defaultDistance = this._display_distance_default();
const lensDistanceComplement = 1.0 - Globals.data_stream.device_data.lensDistanceRatio; const fovDetails = buildFovDetails(
const lensDistanceFactor = (1.0 / lensDistanceComplement) - 1.0; this.target_monitor.width, this.target_monitor.height,
const horizontalConversions = this.curved_display && monitorWrappingScheme === 'horizontal' ? fovConversionFns.curved : fovConversionFns.flat; degreeToRadian(Globals.data_stream.device_data.displayFov),
const verticalConversions = this.curved_display && monitorWrappingScheme === 'vertical' ? fovConversionFns.curved : fovConversionFns.flat; Globals.data_stream.device_data.lensDistanceRatio,
defaultDistance,
// adjust FOV to a new focal point distance while keeping screens the same size monitorWrappingScheme, this.curved_display
// i.e. focus from pivot point to new screen distance, adjusted from lens at unit distance
const defaultDistanceVerticalRadians = verticalConversions.fovRadiansAtDistance(
fovLengths.verticalRadians,
fovLengths.heightUnitDistance,
defaultDistance
); );
const defaultDistanceHorizontalRadians = horizontalConversions.fovRadiansAtDistance( fovDetails.distanceAdjustedSize = this._distance_adjusted_size;
fovLengths.horizontalRadians, fovDetails.sizeAdjustedWidthPixels = this.target_monitor.width * this._distance_adjusted_size;
fovLengths.widthUnitDistance, fovDetails.sizeAdjustedHeightPixels = this.target_monitor.height * this._distance_adjusted_size;
defaultDistance return fovDetails;
);
// distance needed for the FOV-sized monitor to fill up the screen, as measured from the lenses
const lensToUnitDistancePixels = this.target_monitor.width / fovLengths.widthUnitDistance;
// distance from pivot point to lens
const lensDistancePixels = lensToUnitDistancePixels * lensDistanceFactor;
// distance from pivot point to full screen (monitor at unit distance from lens)
const fullScreenDistancePixels = lensToUnitDistancePixels + lensDistancePixels;
// distance of a display at the default (most zoomed out) distance from the pivot point
const completeScreenDistancePixels = fullScreenDistancePixels * defaultDistance;
return {
widthPixels: this.target_monitor.width,
distanceAdjustedSize: this._distance_adjusted_size,
sizeAdjustedWidthPixels: this.target_monitor.width * this._distance_adjusted_size,
heightPixels: this.target_monitor.height,
sizeAdjustedHeightPixels: this.target_monitor.height * this._distance_adjusted_size,
defaultDistanceVerticalRadians,
defaultDistanceHorizontalRadians,
lensDistancePixels,
fullScreenDistancePixels,
completeScreenDistancePixels,
monitorWrappingScheme,
curvedDisplay: this.curved_display
};
} }
_actual_wrap_scheme() { _actual_wrap_scheme() {

View File

@ -55,49 +55,22 @@ QtObject {
} }
function buildFovDetails(screens, viewportWidth, viewportHeight, viewportDiagonalFOV, lensDistanceRatio, defaultDisplayDistance, wrappingChoice, distanceAdjustedSize) { function buildFovDetails(screens, viewportWidth, viewportHeight, viewportDiagonalFOV, lensDistanceRatio, defaultDisplayDistance, wrappingChoice, distanceAdjustedSize) {
const aspect = viewportWidth / viewportHeight;
const fovLengths = SharedMath.diagonalToCrossFOVs(SharedMath.degreeToRadian(viewportDiagonalFOV), aspect);
let monitorWrappingScheme = actualWrapScheme(screens, viewportWidth, viewportHeight); let monitorWrappingScheme = actualWrapScheme(screens, viewportWidth, viewportHeight);
if (wrappingChoice === 1) monitorWrappingScheme = 'horizontal'; if (wrappingChoice === 1) monitorWrappingScheme = 'horizontal';
else if (wrappingChoice === 2) monitorWrappingScheme = 'vertical'; else if (wrappingChoice === 2) monitorWrappingScheme = 'vertical';
else if (wrappingChoice === 3) monitorWrappingScheme = 'flat'; else if (wrappingChoice === 3) monitorWrappingScheme = 'flat';
const lensDistanceComplement = 1.0 - lensDistanceRatio; const fovDetails = SharedPlacement.buildFovDetails(
const lensDistanceFactor = (1.0 / lensDistanceComplement) - 1.0; viewportWidth, viewportHeight,
const horizontalConversions = effect.curvedDisplay && monitorWrappingScheme === 'horizontal' ? SharedMath.fovConversionFns.curved : SharedMath.fovConversionFns.flat; SharedMath.degreeToRadian(viewportDiagonalFOV),
const verticalConversions = effect.curvedDisplay && monitorWrappingScheme === 'vertical' ? SharedMath.fovConversionFns.curved : SharedMath.fovConversionFns.flat; lensDistanceRatio, defaultDisplayDistance,
monitorWrappingScheme, effect.curvedDisplay
const defaultDistanceVerticalRadians = verticalConversions.fovRadiansAtDistance(
fovLengths.verticalRadians,
fovLengths.heightUnitDistance,
defaultDisplayDistance
);
const defaultDistanceHorizontalRadians = horizontalConversions.fovRadiansAtDistance(
fovLengths.horizontalRadians,
fovLengths.widthUnitDistance,
defaultDisplayDistance
); );
const lensToUnitDistancePixels = viewportWidth / fovLengths.widthUnitDistance; fovDetails.distanceAdjustedSize = distanceAdjustedSize;
const lensDistancePixels = lensToUnitDistancePixels * lensDistanceFactor; fovDetails.sizeAdjustedWidthPixels = viewportWidth * distanceAdjustedSize;
const fullScreenDistancePixels = lensToUnitDistancePixels + lensDistancePixels; fovDetails.sizeAdjustedHeightPixels = viewportHeight * distanceAdjustedSize;
const completeScreenDistancePixels = fullScreenDistancePixels * defaultDisplayDistance; return fovDetails;
return {
widthPixels: viewportWidth,
distanceAdjustedSize,
sizeAdjustedWidthPixels: viewportWidth * distanceAdjustedSize,
heightPixels: viewportHeight,
sizeAdjustedHeightPixels: viewportHeight * distanceAdjustedSize,
defaultDistanceVerticalRadians,
defaultDistanceHorizontalRadians,
lensDistancePixels,
fullScreenDistancePixels,
completeScreenDistancePixels,
monitorWrappingScheme,
curvedDisplay: effect.curvedDisplay
};
} }
// Wraps SharedPlacement.monitorsToPlacements, converting plain-array vectors to Qt.vector3d. // Wraps SharedPlacement.monitorsToPlacements, converting plain-array vectors to Qt.vector3d.

@ -1 +1 @@
Subproject commit 6cc1d97ece687b2d71dfdb51c94eaf11c82c7fe5 Subproject commit 65376ad92e0cecfc0bf77ced15ed0d32e33c6f82