WIP
This commit is contained in:
parent
0ddcce9494
commit
f2d448e513
|
|
@ -58,6 +58,7 @@ function getMonitorConfig(displayConfigProxy, callback) {
|
||||||
if (error) {
|
if (error) {
|
||||||
callback(null, `GetResourcesRemote failed: ${error}`);
|
callback(null, `GetResourcesRemote failed: ${error}`);
|
||||||
} else {
|
} else {
|
||||||
|
Globals.logger.log_debug(`monitormanager.js getMonitorConfig GetResources result: ${JSON.stringify(result)}`);
|
||||||
const monitors = [];
|
const monitors = [];
|
||||||
for (let i = 0; i < result[2].length; i++) {
|
for (let i = 0; i < result[2].length; i++) {
|
||||||
const output = result[2][i];
|
const output = result[2][i];
|
||||||
|
|
|
||||||
|
|
@ -132,21 +132,22 @@ function monitorsToPlacements(fovDetails, monitorDetailsList, monitorWrappingSch
|
||||||
const edgeRadius = fovDetails.widthPixels / 2 / Math.sin(fovHorizontalRadians / 2);
|
const edgeRadius = fovDetails.widthPixels / 2 / Math.sin(fovHorizontalRadians / 2);
|
||||||
|
|
||||||
cachedMonitorWrap.push({ pixel: 0, radians: -fovHorizontalRadians / 2 });
|
cachedMonitorWrap.push({ pixel: 0, radians: -fovHorizontalRadians / 2 });
|
||||||
monitorDetailsList.forEach(monitorDetails => {
|
monitorDetailsList.sort((a, b) => a.x - b.x).forEach(monitorDetails => {
|
||||||
const monitorWrapDetails = monitorWrap(cachedMonitorWrap, edgeRadius, monitorDetails.x, monitorDetails.width);
|
const monitorWrapDetails = monitorWrap(cachedMonitorWrap, edgeRadius, monitorDetails.x, monitorDetails.width);
|
||||||
|
const monitorCenterRadius = Math.sqrt(Math.pow(edgeRadius, 2) - Math.pow(monitorDetails.width / 2, 2))
|
||||||
|
|
||||||
monitorPlacements.push({
|
monitorPlacements.push({
|
||||||
topLeftNoRotate: [
|
topLeftNoRotate: [
|
||||||
centerRadius,
|
monitorCenterRadius,
|
||||||
fovDetails.widthPixels / 2,
|
fovDetails.widthPixels / 2,
|
||||||
-(monitorDetails.y - fovDetails.heightPixels / 2)
|
-(monitorDetails.y - fovDetails.heightPixels / 2)
|
||||||
],
|
],
|
||||||
center: [
|
center: [
|
||||||
// north is adjacent where radius is the hypotenuse, using monitorWrapDetails.center as the radians
|
// north is adjacent where radius is the hypotenuse, using monitorWrapDetails.center as the radians
|
||||||
centerRadius * Math.cos(monitorWrapDetails.center),
|
monitorCenterRadius * Math.cos(monitorWrapDetails.center),
|
||||||
|
|
||||||
// west is opposite where radius is the hypotenuse, using monitorWrapDetails.center as the radians
|
// west is opposite where radius is the hypotenuse, using monitorWrapDetails.center as the radians
|
||||||
-centerRadius * Math.sin(monitorWrapDetails.center),
|
-monitorCenterRadius * Math.sin(monitorWrapDetails.center),
|
||||||
|
|
||||||
// up is flat when wrapping horizontally
|
// up is flat when wrapping horizontally
|
||||||
-(monitorDetails.y + monitorDetails.height / 2 - fovDetails.heightPixels / 2)
|
-(monitorDetails.y + monitorDetails.height / 2 - fovDetails.heightPixels / 2)
|
||||||
|
|
@ -161,24 +162,25 @@ function monitorsToPlacements(fovDetails, monitorDetailsList, monitorWrappingSch
|
||||||
const edgeRadius = fovDetails.heightPixels / 2 / Math.sin(fovVerticalRadians / 2);
|
const edgeRadius = fovDetails.heightPixels / 2 / Math.sin(fovVerticalRadians / 2);
|
||||||
|
|
||||||
cachedMonitorWrap.push({ pixel: 0, radians: -fovVerticalRadians / 2 });
|
cachedMonitorWrap.push({ pixel: 0, radians: -fovVerticalRadians / 2 });
|
||||||
monitorDetailsList.forEach(monitorDetails => {
|
monitorDetailsList.sort((a, b) => a.y - b.y).forEach(monitorDetails => {
|
||||||
const monitorWrapDetails = monitorWrap(cachedMonitorWrap, edgeRadius, monitorDetails.y, monitorDetails.height);
|
const monitorWrapDetails = monitorWrap(cachedMonitorWrap, edgeRadius, monitorDetails.y, monitorDetails.height);
|
||||||
|
const monitorCenterRadius = Math.sqrt(Math.pow(edgeRadius, 2) - Math.pow(monitorDetails.height / 2, 2)) ;
|
||||||
|
|
||||||
monitorPlacements.push({
|
monitorPlacements.push({
|
||||||
topLeftNoRotate: [
|
topLeftNoRotate: [
|
||||||
centerRadius,
|
monitorCenterRadius,
|
||||||
-(monitorDetails.x - fovDetails.widthPixels / 2),
|
-(monitorDetails.x - fovDetails.widthPixels / 2),
|
||||||
fovDetails.heightPixels / 2
|
fovDetails.heightPixels / 2
|
||||||
],
|
],
|
||||||
center: [
|
center: [
|
||||||
// north is adjacent where radius is the hypotenuse, using monitorWrapDetails.center as the radians
|
// north is adjacent where radius is the hypotenuse, using monitorWrapDetails.center as the radians
|
||||||
centerRadius * Math.cos(monitorWrapDetails.center),
|
monitorCenterRadius * Math.cos(monitorWrapDetails.center),
|
||||||
|
|
||||||
// west is flat when wrapping vertically
|
// west is flat when wrapping vertically
|
||||||
-(monitorDetails.x + monitorDetails.width / 2 - fovDetails.widthPixels / 2),
|
-(monitorDetails.x + monitorDetails.width / 2 - fovDetails.widthPixels / 2),
|
||||||
|
|
||||||
// up is opposite where radius is the hypotenuse, using monitorWrapDetails.center as the radians
|
// up is opposite where radius is the hypotenuse, using monitorWrapDetails.center as the radians
|
||||||
-centerRadius * Math.sin(monitorWrapDetails.center)
|
-monitorCenterRadius * Math.sin(monitorWrapDetails.center)
|
||||||
],
|
],
|
||||||
rotationAngleRadians: -monitorWrapDetails.center
|
rotationAngleRadians: -monitorWrapDetails.center
|
||||||
});
|
});
|
||||||
|
|
@ -201,6 +203,7 @@ function monitorsToPlacements(fovDetails, monitorDetailsList, monitorWrappingSch
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
Globals.logger.log_debug(`\t\t\tCached monitor wrap: ${JSON.stringify(cachedMonitorWrap)}`);
|
||||||
|
|
||||||
return monitorPlacements;
|
return monitorPlacements;
|
||||||
}
|
}
|
||||||
|
|
@ -421,8 +424,7 @@ export const VirtualMonitorEffect = GObject.registerClass({
|
||||||
uniform vec2 u_actor_to_display_ratios;
|
uniform vec2 u_actor_to_display_ratios;
|
||||||
|
|
||||||
// constants that help me adjust CoGL vector positions so their components are at the ratios intended, for proper rotation
|
// constants that help me adjust CoGL vector positions so their components are at the ratios intended, for proper rotation
|
||||||
float cogl_position_width_factor = 29.09; // no idea...
|
float cogl_position_mystery_factor = 29.09; // no idea...
|
||||||
float cogl_z_factor = 55.41; // no idea...
|
|
||||||
|
|
||||||
float vectorLength(vec3 v) {
|
float vectorLength(vec3 v) {
|
||||||
return sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
|
return sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
|
||||||
|
|
@ -534,12 +536,12 @@ export const VirtualMonitorEffect = GObject.registerClass({
|
||||||
vec4 look_ahead_quaternion = nwuToESU(imuDataToLookAheadQuaternion(u_imu_data, u_look_ahead_ms));
|
vec4 look_ahead_quaternion = nwuToESU(imuDataToLookAheadQuaternion(u_imu_data, u_look_ahead_ms));
|
||||||
float aspect_ratio = u_display_resolution.x / u_display_resolution.y;
|
float aspect_ratio = u_display_resolution.x / u_display_resolution.y;
|
||||||
|
|
||||||
float cogl_position_width = cogl_position_width_factor * aspect_ratio;
|
float cogl_position_width = cogl_position_mystery_factor * aspect_ratio;
|
||||||
float cogl_position_height = cogl_position_width / aspect_ratio;
|
float cogl_position_height = cogl_position_width / aspect_ratio;
|
||||||
float position_width_adjustment_count = u_actor_to_display_ratios.x - 1.0;
|
float position_width_adjustment_count = u_actor_to_display_ratios.x - 1.0;
|
||||||
float position_height_adjustment_count = u_actor_to_display_ratios.y - 1.0;
|
float position_height_adjustment_count = u_actor_to_display_ratios.y - 1.0;
|
||||||
|
|
||||||
world_pos.z = - u_display_distance * cogl_z_factor / u_display_resolution.x;
|
world_pos.z = - u_display_distance * cogl_position_mystery_factor * 2 / u_display_resolution.x;
|
||||||
|
|
||||||
// if the perspective includes more than just our actor, move vertices towards the center of the perspective so they'll be properly rotated
|
// if the perspective includes more than just our actor, move vertices towards the center of the perspective so they'll be properly rotated
|
||||||
world_pos.x += position_width_adjustment_count * cogl_position_width;
|
world_pos.x += position_width_adjustment_count * cogl_position_width;
|
||||||
|
|
@ -689,13 +691,18 @@ export const VirtualMonitorsActor = GObject.registerClass({
|
||||||
const length = Math.sqrt(vector[0] * vector[0] + vector[1] * vector[1] + vector[2] * vector[2]);
|
const length = Math.sqrt(vector[0] * vector[0] + vector[1] * vector[1] + vector[2] * vector[2]);
|
||||||
return [vector[0] / length, vector[1] / length, vector[2] / length];
|
return [vector[0] / length, vector[1] / length, vector[2] / length];
|
||||||
});
|
});
|
||||||
|
const monitors = Main.layoutManager.monitors;
|
||||||
|
const minMonitorX = Math.min(...monitors.map(monitor => monitor.x));
|
||||||
|
const maxMonitorX = Math.max(...monitors.map(monitor => monitor.x + monitor.width));
|
||||||
|
const minMonitorY = Math.min(...monitors.map(monitor => monitor.y));
|
||||||
|
const maxMonitorY = Math.max(...monitors.map(monitor => monitor.y + monitor.height));
|
||||||
|
|
||||||
const actorToDisplayRatios = [
|
const actorToDisplayRatios = [
|
||||||
Main.layoutManager.uiGroup.width / this.width,
|
(maxMonitorX - minMonitorX) / this.width,
|
||||||
Main.layoutManager.uiGroup.height / this.height
|
(maxMonitorY - minMonitorY) / this.height
|
||||||
];
|
];
|
||||||
|
|
||||||
Main.layoutManager.monitors.forEach(((monitor, index) => {
|
monitors.forEach(((monitor, index) => {
|
||||||
// if (index === 0) return;
|
// if (index === 0) return;
|
||||||
Globals.logger.log(`\t\t\tMonitor ${index}: ${monitor.x}, ${monitor.y}, ${monitor.width}, ${monitor.height}`);
|
Globals.logger.log(`\t\t\tMonitor ${index}: ${monitor.x}, ${monitor.y}, ${monitor.width}, ${monitor.height}`);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue