aboutsummaryrefslogtreecommitdiffstats
path: root/apps/com.luxoft.vehicle/panels/Vehicle3DPanel.qml
diff options
context:
space:
mode:
Diffstat (limited to 'apps/com.luxoft.vehicle/panels/Vehicle3DPanel.qml')
-rw-r--r--apps/com.luxoft.vehicle/panels/Vehicle3DPanel.qml118
1 files changed, 85 insertions, 33 deletions
diff --git a/apps/com.luxoft.vehicle/panels/Vehicle3DPanel.qml b/apps/com.luxoft.vehicle/panels/Vehicle3DPanel.qml
index da1b1db5..1c0068ff 100644
--- a/apps/com.luxoft.vehicle/panels/Vehicle3DPanel.qml
+++ b/apps/com.luxoft.vehicle/panels/Vehicle3DPanel.qml
@@ -30,14 +30,14 @@
**
****************************************************************************/
-import QtQuick 2.0
-import Qt3D.Core 2.0
-import Qt3D.Render 2.9
-import Qt3D.Extras 2.9
-import Qt3D.Input 2.0
-import Qt3D.Logic 2.0
-import QtQuick.Scene3D 2.0
-import QtQuick.Controls 2.3
+import QtQuick 2.14
+import Qt3D.Core 2.14
+import Qt3D.Render 2.14
+import Qt3D.Extras 2.14
+import Qt3D.Input 2.14
+import Qt3D.Logic 2.14
+import QtQuick.Scene3D 2.14
+import QtQuick.Controls 2.14
import shared.Sizes 1.0
@@ -54,16 +54,70 @@ Item {
property string modelVersion
//ToDo: This is a part of a work around for the Scene3D windows&macOS bug
- property real roofOpenProgress: 0.0
+ property alias roofOpenProgress: roof.openProgress
property bool leftDoorOpen: false
property bool rightDoorOpen: false
property bool trunkOpen: false
property bool readyToChanges: false
- // in some cases Scene3D doesn't create anything, such cases are really hard to reproduce
- // but we need to have some flag to verify
- property bool renderStarted: false
+ QtObject {
+ id: d
+ readonly property vector2d base2d : Qt.vector2d(0.0, -15.0)
+ property real pixelAndTimeMagicCoeff: 0.5
+ property var trajectory: []
+ property var trajectoryV: []
+ }
+
+ function getCurrentAngle() {
+ var cameraPos = camera.position;
+ var vec2d = Qt.vector2d(-cameraPos.x, cameraPos.z);
+ var angle = 0.0;
+ angle = -Math.atan2(vec2d.x, vec2d.y);
+ angle = angle < 0 ? angle + 2*Math.PI : angle;
+ return angle * 180 / Math.PI;
+ }
+
+ function forceRedraw() {
+ // force scene to redraw (workaround for AUTOSUITE-1598)
+ // see FrameAction below: we force render policy to be 'Always' for at least 5 seconds
+ // this time should be enough to make model shown
+ // after this we set renderPolicy back to OnDemand to reduce cpu consuming
+ renderSettings.renderPolicy = RenderSettings.Always;
+ }
+
+ MouseArea {
+ anchors.top: parent.top
+ anchors.left: parent.left
+ anchors.right: parent.right
+ height: Sizes.dp(652)
+ z: 40
+
+ onReleased: {
+ d.trajectory = []
+ }
+
+ onPositionChanged: {
+ if (pressed) {
+ d.trajectory.push(mouseX);
+ d.trajectoryV.push(mouseY);
+ if (d.trajectory.length > 2) {
+ var dx = 0
+ for (var i = 1; i < d.trajectory.length; ++i) {
+ dx += d.trajectory[i] - d.trajectory[i - 1];
+ }
+
+ if (dx !== 0) {
+ camera.panAboutViewCenter(-dx * d.pixelAndTimeMagicCoeff
+ , Qt.vector3d(0, 1, 0));
+ root.lastCameraAngle = getCurrentAngle();
+ }
+
+ d.trajectory = []
+ }
+ }
+ }
+ }
Scene3D {
@@ -91,27 +145,29 @@ Item {
FrameAction {
id: frameCounter
+ property real dtime: 0.0
+ onTriggered: {
+ if (renderSettings.renderPolicy === RenderSettings.Always) {
+ dtime += dt;
+ if (dtime > 5.0) {
+ dtime = 0;
+ renderSettings.renderPolicy = RenderSettings.OnDemand;
+ }
+ }
+ }
}
components: [inputSettings, renderSettings, frameCounter]
-
Connections {
id: readyToChangeConnection
target: frameCounter
+ enabled: !root.readyToChanges
property int fc: 0
- onTriggered: {
- if (!root.renderStarted) {
- root.renderStarted = true;
- }
-
- if (body.bodyLoaded) {
- fc += 1;
- // skip first 5 frames to be sure that all content is ready
- if (fc > 5) {
- readyToChangeConnection.target = null;
- root.readyToChanges = true;
- }
+ function onTriggered() {
+ if (++fc == 3) {
+ root.readyToChanges = true;
+ root.forceRedraw();
}
}
}
@@ -127,12 +183,6 @@ Item {
upVector: Qt.vector3d(0.0, 1.0, 0.0)
}
- CameraController {
- camera: camera
- enabled: true
- onCameraPanAngleChanged: root.lastCameraAngle = cameraPanAngle
- }
-
CookTorranceMaterial {
id: rubberMaterial
albedo: "black"
@@ -225,7 +275,6 @@ Item {
}
Roof {
id: roof
- openProgress: root.roofOpenProgress
version: root.modelVersion
}
Body {
@@ -233,7 +282,10 @@ Item {
version: root.modelVersion
onBodyLoadedChanged: {
if (bodyLoaded) {
- camera.panAboutViewCenter(lastCameraAngle, Qt.vector3d(0, 1, 0));
+ var angle = getCurrentAngle()
+ if (angle !== lastCameraAngle) {
+ camera.panAboutViewCenter(angle - lastCameraAngle, Qt.vector3d(0, 1, 0));
+ }
}
}
}