Fix the main component so it doesn't load the View3D instance unless it'll actually be rendered

This commit is contained in:
wheaney 2025-07-31 21:50:01 -07:00
parent cceed0f856
commit 0cbc54bd04
2 changed files with 64 additions and 55 deletions

View File

@ -1,33 +1,11 @@
import QtQuick
import QtQuick3D
import org.kde.kwin as KWinComponents
Node {
readonly property var supportedModels: [
"VITURE",
"nreal air",
"Air",
"Air 2",
"Air 2 Pro",
"Air 2 Ultra",
"SmartGlasses", // TCL/RayNeo
"Rokid Max",
"Rokid Air"
]
property real viewportDiagonalFOVDegrees: effect.diagonalFOV
property var viewportResolution: effect.displayResolution
property QtObject targetScreen
property bool targetScreenSupported: {
return supportedModels.some(function(model) {
return targetScreen.model.endsWith(model);
});
}
property var screens: KWinComponents.Workspace.screens
// .filter(function(screen) {
// return supportedModels.includes(screen.model);
// })
property var screens: root.screens
property var monitorPlacements: root.monitorPlacements
// x value for placing the viewport in the middle of all screens
property real screensXMid: {
@ -61,11 +39,6 @@ Node {
id: displays
}
property var monitorPlacements: {
const fovDetails = displays.fovDetails(screens, viewportResolution[0], viewportResolution[1], viewportDiagonalFOVDegrees, effect.lensDistanceRatio);
const monitorSpacing = 0.0;
return displays.monitorsToPlacements(fovDetails, screens.map(screen => screen.geometry), monitorSpacing);
}
Repeater3D {
model: screens.length

View File

@ -8,44 +8,80 @@ Item {
antialiasing: true
focus: false
readonly property var supportedModels: [
"VITURE",
"nreal air",
"Air",
"Air 2",
"Air 2 Pro",
"Air 2 Ultra",
"SmartGlasses", // TCL/RayNeo
"Rokid Max",
"Rokid Air"
]
required property QtObject effect
required property QtObject targetScreen
DesktopView {
id: desktopView
screen: root.targetScreen
width: root.targetScreen.geometry.width
height: root.targetScreen.geometry.height
property real viewportDiagonalFOVDegrees: effect.diagonalFOV
property var viewportResolution: effect.displayResolution
property var screens: KWinComponents.Workspace.screens
// .filter(function(screen) {
// return supportedModels.includes(screen.model);
// })
Displays {
id: displays
}
View3D {
id: view3D
anchors.fill: parent
environment: SceneEnvironment {
antialiasingMode: SceneEnvironment.MSAA
}
PerspectiveCamera {
id: camera
frustumCullingEnabled: false
}
property var monitorPlacements: {
const fovDetails = displays.fovDetails(screens, viewportResolution[0], viewportResolution[1], viewportDiagonalFOVDegrees, effect.lensDistanceRatio);
const monitorSpacing = 0.0;
return displays.monitorsToPlacements(fovDetails, screens.map(screen => screen.geometry), monitorSpacing);
}
BreezyDesktop {
id: breezyDesktop
targetScreen: root.targetScreen
Component {
id: desktopViewComponent
DesktopView {
screen: root.targetScreen
width: root.targetScreen.geometry.width
height: root.targetScreen.geometry.height
}
}
CameraController {
id: cameraController
Component {
id: view3DComponent
View3D {
anchors.fill: parent
camera: camera
environment: SceneEnvironment {
antialiasingMode: SceneEnvironment.MSAA
}
PerspectiveCamera {
id: camera
frustumCullingEnabled: false
}
BreezyDesktop {
id: breezyDesktop
}
CameraController {
id: cameraController
anchors.fill: parent
camera: camera
}
}
}
Loader {
id: viewLoader
anchors.fill: parent
}
// TODO - make it so the View3D isn't loaded unless it's a supported screen
Component.onCompleted: {
console.log(`Breezy - initialized with target screen: ${breezyDesktop.targetScreen.model}, supported: ${breezyDesktop.targetScreenSupported}`);
view3D.opacity = breezyDesktop.targetScreenSupported ? 1.0 : 0.0;
desktopView.opacity = breezyDesktop.targetScreenSupported ? 0.0 : 1.0;
const targetScreenSupported = supportedModels.some(model => root.targetScreen.model.endsWith(model));
console.log(`Breezy - initialized with target screen: ${root.targetScreen.model}, supported: ${targetScreenSupported}`);
viewLoader.sourceComponent = targetScreenSupported ? view3DComponent : desktopViewComponent;
}
}