summaryrefslogtreecommitdiffstats
path: root/tests/manual/qmlperf/qml
diff options
context:
space:
mode:
Diffstat (limited to 'tests/manual/qmlperf/qml')
-rw-r--r--tests/manual/qmlperf/qml/qmlperf/AutoTest.qml219
-rw-r--r--tests/manual/qmlperf/qml/qmlperf/Tests.qml184
-rw-r--r--tests/manual/qmlperf/qml/qmlperf/main.qml587
3 files changed, 829 insertions, 161 deletions
diff --git a/tests/manual/qmlperf/qml/qmlperf/AutoTest.qml b/tests/manual/qmlperf/qml/qmlperf/AutoTest.qml
new file mode 100644
index 00000000..d860b99a
--- /dev/null
+++ b/tests/manual/qmlperf/qml/qmlperf/AutoTest.qml
@@ -0,0 +1,219 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import QtQuick
+import QtQuick.Layouts
+import QtQuick.Controls
+import QtDataVisualization
+import "."
+
+Item {
+
+ height: 150
+
+ property list<string> graphTypes: ["Surface", "Scatter", "Bars"]
+ property int currentGraph: 0
+
+ property list<int>dataPoints: [10, 100, 300, 500]
+ property int currentPoints: 0
+
+ property list<string> optimization: ["Default", "Static"]
+ property int currentOptimization: 0
+
+ property list<int> sampleCounts: [0,2,4,8]
+ property int currentSamples: 0
+
+
+ property int shadowQuality
+
+ property bool finished: true
+
+ property int initTime: 0
+
+ function initAutoTest() {
+ //go through each graph iterating over all the variables
+ liveDataCB.checked = true
+ rotateCB.checked = true
+
+ tests.onTestFinished.connect(test)
+ dataGenerator.onCaptureInit.connect(setInitTime)
+
+ finished = false
+
+ currentGraph = 0
+ currentPoints = 0
+ currentOptimization = 0
+ currentSamples= 0
+ shadowQuality = 0
+
+ setParameters()
+ tests.startTest()
+ }
+
+ function test() {
+ //write previous test results
+ var averageFps = tests.averageFps
+ // graph type, num points, optimization, msaa, init time, averagefps
+ var csvLine = graphTypes[currentGraph] + ","
+ + (dataPoints[currentPoints] * dataPoints[currentPoints])+ ","
+ + optimization[currentOptimization] + ","
+ + sampleCounts[currentSamples] + ","
+ + shadowQuality + ","
+ + initTime + ","
+ + averageFps
+
+ dataGenerator.writeCSV(csvLine)
+ increment()
+ setParameters()
+ if (!finished) {
+ tests.startTest()
+ } else {
+ tests.onTestFinished.disconnect(test)
+ dataGenerator.onCaptureInit.disconnect(setInitTime)
+ }
+ }
+
+ function increment() {
+ if (varyShadow.checked) {
+ if (shadowQuality < 6) {
+ shadowQuality++
+ return
+ }
+ shadowQuality = 0
+ }
+
+ if (varySamples.checked) {
+ if (currentSamples < sampleCounts.length -1) {
+ currentSamples ++
+ return
+ }
+ currentSamples = 0
+ }
+
+ if (varyOptimization.checked) {
+ if (currentOptimization < optimization.length -1
+ && tabBar.currentIndex !== 0) {
+ currentOptimization++
+ return
+ }
+ currentOptimization = 0
+ }
+
+ if (varyPoints.checked) {
+ if (currentPoints < dataPoints.length -1) {
+ currentPoints ++
+ return
+ }
+ currentPoints = 0
+ }
+
+ if (varyGraphs.checked) {
+ if (currentGraph < graphTypes.length - 1) {
+ currentGraph++
+ console.log("Switching to " + graphTypes[currentGraph])
+ return
+ }
+ currentGraph = 0
+ }
+
+ dataGenerator.writeLine("Finished all tests!")
+ finished = true
+ }
+
+
+ function setParameters() {
+ if (varyShadow.checked) {
+ surfaceGraph.shadowQuality = shadowQuality
+ scatterGraph.shadowQuality = shadowQuality
+ barGraph.shadowQuality = shadowQuality
+ }
+
+ if (varySamples.checked) {
+ surfaceGraph.msaaSamples = sampleCounts[currentSamples]
+ scatterGraph.msaaSamples = sampleCounts[currentSamples]
+ barGraph.msaaSamples = sampleCounts[currentSamples]
+ }
+
+ if (varyOptimization.checked) {
+ if (optimization[currentOptimization] === "Legacy") {
+ scatterGraph.optimizationHint = AbstractGraph3D.OptimizationHint.Default
+ barGraph.optimizationHint = AbstractGraph3D.OptimizationHint.Default
+ } else {
+ scatterGraph.optimizationHint = AbstractGraph3D.OptimizationHint.Legacy
+ barGraph.optimizationHint = AbstractGraph3D.OptimizationHint.Legacy
+ }
+ }
+
+ if (varyGraphs.checked)
+ tabBar.setCurrentIndex(currentGraph)
+
+ if (varyPoints.checked) {
+ if (tabBar.currentIndex === 0)
+ dataGenerator.generateSurfaceData(surfaceSeries, dataPoints[currentPoints])
+ else if (tabBar.currentIndex === 1)
+ dataGenerator.generateScatterData(scatterSeries, dataPoints[currentPoints])
+ else
+ dataGenerator.generateBarData(barSeries, dataPoints[currentPoints])
+ }
+ }
+
+ function setInitTime(nsecs) {
+ initTime = nsecs
+ }
+
+ Button {
+ id: autoButton
+ text: finished? "Auto Test" : "End test"
+ width: parent.width - 20
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.top: parent.top
+ height: 50
+ onClicked: {
+ if (finished) {
+ dataGenerator.writeLine("Testing configurations...")
+ initAutoTest()
+ } else {
+ finished = true
+ }
+
+ }
+ }
+
+ GridLayout {
+ id: autoTestParams
+ anchors.top: autoButton.bottom
+ anchors.topMargin: 10
+ width: parent.width - 50
+ enabled: finished
+ anchors.horizontalCenter: parent.Center
+ height: 50
+ columns: 2
+ CheckBox {
+ id: varyGraphs
+ text: qsTr("Vary graphs")
+ Layout.alignment: Qt.AlignCenter
+ checked: true
+ }
+ CheckBox {
+ id: varyPoints
+ text: qsTr("Vary points")
+ Layout.alignment: Qt.AlignCenter
+ checked: true
+ }
+ CheckBox {
+ id: varyOptimization
+ text: qsTr("Vary optimization")
+ Layout.alignment: Qt.AlignCenter
+ }
+ CheckBox {
+ id: varySamples
+ text: qsTr("Vary MSAA ")
+ Layout.alignment: Qt.AlignCenter
+ }
+ CheckBox {
+ id: varyShadow
+ text: qsTr("Vary Shadow ")
+ Layout.alignment: Qt.AlignCenter
+ }
+ }
+}
diff --git a/tests/manual/qmlperf/qml/qmlperf/Tests.qml b/tests/manual/qmlperf/qml/qmlperf/Tests.qml
new file mode 100644
index 00000000..dc533641
--- /dev/null
+++ b/tests/manual/qmlperf/qml/qmlperf/Tests.qml
@@ -0,0 +1,184 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import QtQuick
+import QtQuick.Layouts
+import QtQuick.Controls
+import QtDataVisualization
+import "."
+
+Item {
+ id: tests
+
+ property alias currentFps: fpsText.fps
+ property alias dataPoints: dataPointText.dataPoints
+ property alias buttonVisible: testButton.visible
+ property real averageFps: 0
+
+ signal onTestFinished
+
+ property list<real> fpsCounts: []
+ Component.onCompleted: {
+ dataGenerator.onMessage.connect(addLine)
+ }
+
+ function addLine(line) {
+ logModel.append({'logText':line});
+ }
+
+
+ function startTest() {
+ // logModel.clear()
+ fpsCounts = []
+ dataGenerator.writeLine(" ")
+ switch (tabBar.currentIndex) {
+ case 0:
+ dataGenerator.writeLine("Started surface test with configuration:")
+ break
+ case 1:
+ dataGenerator.writeLine("Started scatter test with configuration:")
+ break
+ case 2:
+ dataGenerator.writeLine("Started bars test with configuration:")
+ break
+ default:
+ break
+ }
+
+ if (tabBar.currentIndex === 0) {
+ dataGenerator.writeLine("Shadow Quality: " + surfaceGraph.shadowQuality)
+ dataGenerator.writeLine("MSAA samples: "
+ + surfaceGraph.msaaSamples)
+ } else if (tabBar.currentIndex === 1) {
+ dataGenerator.writeLine("Shadow Quality: " + scatterGraph.shadowQuality)
+ var optimizationString = scatterGraph.optimizationHint? "Static" : "Default"
+ dataGenerator.writeLine("Optimization: " + optimizationString)
+ dataGenerator.writeLine("MSAA samples: "
+ + scatterGraph.msaaSamples)
+ } else {
+ dataGenerator.writeLine("Shadow Quality: " + scatterGraph.shadowQuality)
+ optimizationString = barGraph.optimizationHint? "Static" : "Default"
+ dataGenerator.writeLine("Optimization: " + optimizationString)
+ dataGenerator.writeLine("MSAA samples: "
+ + barGraph.msaaSamples)
+
+ }
+
+ testTimer.start()
+ }
+
+ Button {
+ id: testButton
+ text: "Test current"
+ onClicked: startTest()
+ height: 50
+ width: parent.width - 20
+ anchors.horizontalCenter: parent.horizontalCenter
+ }
+
+
+ ColumnLayout {
+ id: statsPanel
+ anchors.top: testButton.bottom
+ anchors.topMargin: 20
+ width: parent.width
+ Text {
+ id: statsBanner
+ text: "Statistics"
+ font.bold: true
+ font.pixelSize: 16
+ Layout.fillWidth: true
+ verticalAlignment: Text.AlignVCenter
+ horizontalAlignment: Text.AlignHCenter
+ }
+
+ Text {
+ id: fpsText
+ property real fps: 0
+ text: qsTr("FPS: %1").arg(fps)
+ Layout.fillWidth: true
+ horizontalAlignment: Text.AlignHCenter
+
+ }
+
+ Text {
+ id: dataPointText
+ property int dataPoints: 0
+ text : qsTr("Data Points: %1").arg(dataPoints)
+ Layout.fillWidth: true
+ horizontalAlignment: Text.AlignHCenter
+ }
+
+ Text {
+ id: logBanner
+ text: "Log"
+ font.bold: true
+ font.pixelSize: 16
+ Layout.fillWidth: true
+ verticalAlignment: Text.AlignVCenter
+ horizontalAlignment: Text.AlignHCenter
+ }
+
+
+ Rectangle {
+ id: logBackground
+ Layout.fillWidth: true
+ Layout.preferredHeight: 170
+ Layout.margins: 10
+ color: "forestgreen"
+ ListView {
+ id: logView
+ anchors.fill: parent
+ highlightFollowsCurrentItem: true
+ clip: true
+ delegate: Text {
+ text: logText
+ verticalAlignment: Text.AlignVCenter
+ horizontalAlignment: Text.AlignHCenter
+ width: logView.width
+ wrapMode: Text.Wrap
+ }
+
+ model: ListModel {
+ id: logModel
+ }
+
+ onCountChanged: {
+ logView.currentIndex = count - 1
+ }
+ }
+ }
+ }
+
+ Timer {
+ id: testTimer
+ interval: 1000
+ repeat: true
+ onTriggered: {
+ var fps = 0
+ if (tabBar.currentIndex === 0)
+ fps = surfaceGraph.currentFps
+ else if (tabBar.currentIndex === 1)
+ fps = scatterGraph.currentFps
+ else
+ fps = barGraph.currentFps
+
+ if (fps != -1) {
+ fpsCounts.push(fps)
+ dataGenerator.writeLine("FPS: " + fps)
+ }
+ else {
+ dataGenerator.writeLine("Invalid fps reading")
+ }
+
+ if (fpsCounts.length >= 5) {
+ var sum = 0
+ fpsCounts.forEach((element) => sum+=element);
+ averageFps = sum / fpsCounts.length
+ dataGenerator.writeLine("Average FPS: " + averageFps)
+ testTimer.stop()
+ onTestFinished()
+ }
+ }
+ }
+}
diff --git a/tests/manual/qmlperf/qml/qmlperf/main.qml b/tests/manual/qmlperf/qml/qmlperf/main.qml
index 60930606..ce282e87 100644
--- a/tests/manual/qmlperf/qml/qmlperf/main.qml
+++ b/tests/manual/qmlperf/qml/qmlperf/main.qml
@@ -1,202 +1,467 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+import QtCore
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
-import QtDataVisualization 1.2
+import QtQuick3D.Helpers
+import QtQuick.Dialogs
+import QtDataVisualization
import "."
Item {
- id: mainview
+ id: mainView
width: 1280
height: 1024
- property var itemCount: 1000.0
- property var addItems: 500.0
-
- Button {
- id: changeButton
- width: parent.width / 7
- height: 50
+ TabBar {
+ id: tabBar
+ anchors.top: parent.top
+ anchors.right: panels.left
anchors.left: parent.left
- enabled: true
- text: "Change"
- onClicked: {
- console.log("changeButton clicked");
- if (graphView.state == "meshsphere") {
- graphView.state = "meshcube"
- } else if (graphView.state == "meshcube") {
- graphView.state = "meshpyramid"
- } else if (graphView.state == "meshpyramid") {
- graphView.state = "meshpoint"
- } else if (graphView.state == "meshpoint") {
- graphView.state = "meshsphere"
- }
+ contentHeight: 50
+ TabButton {
+ text: qsTr("Surface")
+ }
+ TabButton {
+ text: qsTr("Scatter")
+ }
+ TabButton {
+ text: qsTr("Bars")
}
}
- Text {
- id: fpsText
- text: "Reading"
- width: (parent.width / 7) * 3
- height: 50
- anchors.left: changeButton.right
- verticalAlignment: Text.AlignVCenter
- horizontalAlignment: Text.AlignHCenter
- }
+ Rectangle {
+ id: panels
+ anchors.top: parent.top
+ anchors.right: parent.right
+ anchors.bottom: parent.bottom
+ width: parent.width / 5
+ color: "green"
+
+ ColumnLayout {
+ id: buttonPanel
+ anchors.top: parent.top
+ width: parent.width
+ spacing: 10
+ visible: autoTest.finished
- Button {
- id: optimization
- width: parent.width / 7
- height: 50
- anchors.left: fpsText.right
- enabled: true
- text: scatterPlot.optimizationHints === AbstractGraph3D.OptimizationDefault ? "To Static" : "To Default"
- onClicked: {
- console.log("Optimization");
- if (scatterPlot.optimizationHints === AbstractGraph3D.OptimizationDefault) {
- scatterPlot.optimizationHints = AbstractGraph3D.OptimizationStatic;
- optimization.text = "To Default";
- } else {
- scatterPlot.optimizationHints = AbstractGraph3D.OptimizationDefault;
- optimization.text = "To Static";
+ Button {
+ id: shadowToggle
+ property int shadowQuality: 0
+ property string qualityName: "None"
+ text: qsTr("Shadow Quality : %1").arg(qualityName)
+ Layout.fillWidth: true
+ Layout.preferredHeight: 50
+ Layout.margins: 10
+ Layout.alignment: Qt.AlignCenter
+ onClicked: {
+ var nextQuality = (shadowQuality + 1) % 7
+ surfaceGraph.shadowQuality = nextQuality
+ scatterGraph.shadowQuality = nextQuality
+ barGraph.shadowQuality = nextQuality
+ shadowQuality = nextQuality
+ qualityName = barGraph.shadowQuality.toString()
+ console.log("Set shadow quality to " + qualityName)
+ }
+ }
+
+ Button {
+ id: optimizationToggle
+ visible: tabBar.currentIndex > 0
+ property string optimization: "Default"
+ text: qsTr("Optimization: %1").arg(optimization)
+ Layout.fillWidth: true
+ Layout.preferredHeight: 50
+ Layout.margins: 10
+ Layout.alignment: Qt.AlignCenter
+ onClicked: {
+ if (optimization === "Static") {
+ scatterGraph.optimizationHints = AbstractGraph3D.OptimizationDefault
+ barGraph.optimizationHints = AbstractGraph3D.OptimizationDefault
+ optimization= "Default"
+ } else {
+ scatterGraph.optimizationHints = AbstractGraph3D.OptimizationStatic
+ barGraph.optimizationHints = AbstractGraph3D.OptimizationStatic
+ optimization = "Static"
+ }
+ console.log("Set optimization to " + optimization)
+ }
+ }
+
+ Button {
+ id: samplesButton
+ property list<int> samples: [0,2,4,8]
+ property int index: 0
+ text: qsTr("MSAA samples: %1").arg(samples[index])
+
+ Layout.fillWidth: true
+ Layout.preferredHeight: 50
+ Layout.margins: 10
+ Layout.alignment: Qt.AlignCenter
+ onClicked: {
+ index = (index + 1) % 4
+ surfaceGraph.msaaSamples = samples[index]
+ scatterGraph.msaaSamples = samples[index]
+ barGraph.msaaSamples = samples[index]
+ console.log("Set msaa samples to " + samples[index])
+ }
+ }
+
+ Button {
+ id: scatterMesh
+ visible: tabBar.currentIndex === 1
+ property string mesh: "Sphere"
+ text: qsTr("Mesh: %1").arg(mesh)
+ Layout.fillWidth: true
+ Layout.preferredHeight: 50
+ Layout.margins: 10
+ Layout.alignment: Qt.AlignCenter
+ onClicked: {
+ if (mesh === "Sphere") {
+ scatterSeries.mesh = Abstract3DSeries.MeshCube
+ mesh = "Cube"
+ } else if (mesh === "Cube") {
+ scatterSeries.mesh = Abstract3DSeries.MeshPyramid
+ mesh = "Pyramid"
+ } else if (mesh === "Pyramid") {
+ scatterSeries.mesh = Abstract3DSeries.MeshPoint
+ mesh = "Point"
+ } else {
+ scatterSeries.mesh = Abstract3DSeries.MeshSphere
+ mesh = "Sphere"
+ }
+ }
+ }
+
+
+ Button {
+ id: surfaceShadingToggle
+ visible: tabBar.currentIndex <= 2
+ text: qsTr("Flat shading: %1").arg(surfaceSeries.flatShadingEnabled.toString())
+ Layout.fillWidth: true
+ Layout.preferredHeight: 50
+ Layout.margins: 10
+ Layout.alignment: Qt.AlignCenter
+ onClicked: {
+ surfaceSeries.flatShadingEnabled =
+ !surfaceSeries.flatShadingEnabled
+ scatterSeries.meshSmooth = !scatterSeries.meshSmooth
+ }
+ }
+
+ Button {
+ id: gridToggle
+ visible: tabBar.currentIndex === 0
+ property bool gridEnabled
+ text: qsTr("Show grid: %1").arg(gridEnabled.toString())
+ Layout.fillWidth: true
+ Layout.preferredHeight: 50
+ Layout.margins: 10
+ Layout.alignment: Qt.AlignCenter
+ onClicked: {
+ if (surfaceSeries.drawMode & Surface3DSeries.DrawWireframe)
+ surfaceSeries.drawMode &= ~Surface3DSeries.DrawWireframe;
+ else
+ surfaceSeries.drawMode |= Surface3DSeries.DrawWireframe;
+
+ gridEnabled = surfaceSeries.drawMode & Surface3DSeries.DrawWireframe
+ }
+
+ }
+
+ ColumnLayout {
+ id: pointSetContainer
+ Layout.fillWidth: true
+ Layout.preferredHeight: 50
+ Layout.margins: 10
+ Layout.alignment: Qt.AlignCenter
+
+
+ Text {
+ id: spinboxTitle
+ text: "Side length"
+ Layout.fillWidth: true
+ horizontalAlignment: Text.AlignHCenter
+ }
+
+ SpinBox {
+ id: sizeField
+ from: 2
+ to: 500
+ stepSize: 20
+ value: 10
+ editable: true
+ Layout.preferredWidth: parent.width
+ }
+
+ Button {
+ id: pointSetButton
+ text: qsTr("Place points");
+ Layout.preferredWidth: parent.width
+ Layout.bottomMargin: 10
+ onClicked: {
+ switch (tabBar.currentIndex) {
+ case 0:
+ dataGenerator.generateSurfaceData(surfaceSeries, sizeField.value)
+ break;
+ case 1:
+ dataGenerator.generateScatterData(scatterSeries, sizeField.value)
+ break;
+ case 2:
+ dataGenerator.generateBarData(barSeries, sizeField.value)
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ GridLayout {
+ id: checkBoxPanel
+ anchors.top: buttonPanel.bottom
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.margins: 10
+ visible: autoTest.finished
+ columns: 2
+
+ CheckBox {
+ id: liveDataCB
+ text: qsTr("Live Data")
+ Layout.fillWidth: true
+ Layout.margins: 10
+ Layout.alignment: Qt.AlignCenter
+ }
+ CheckBox {
+ id: rotateCB
+ text: qsTr("Rotation")
+ Layout.fillWidth: true
+ Layout.margins: 10
+ Layout.alignment: Qt.AlignCenter
+ }
+
+ ColumnLayout {
+ id: freqContainer
+ Layout.columnSpan: 2
+ Text {
+ text: qsTr("Frequency: %1").arg(frequencySlider.value)
+ Layout.fillWidth: true
+ verticalAlignment: Text.AlignVCenter
+ horizontalAlignment: Text.AlignHCenter
+ }
+ Slider {
+ id: frequencySlider
+ from: 1
+ to: 60
+ stepSize: 1
+ value: 30
+ snapMode: Slider.SnapAlways
+ Layout.alignment: Qt.AlignCenter
+ }
}
}
- }
- Button {
- id: itemAdd
- width: parent.width / 7
- height: 50
- anchors.left: optimization.right
- enabled: true
- text: "Add"
- onClicked: {
- itemCount = itemCount + addItems;
- dataGenerator.add(scatterSeries, addItems);
+ AutoTest {
+ id: autoTest
+ width: parent.width
+ anchors.top: checkBoxPanel.bottom
+ anchors.left: parent.left
+ anchors.topMargin: 10
+ }
+
+ Tests {
+ id: tests
+ width: parent.width
+ anchors.top: autoTest.bottom
+ anchors.left: parent.left
+ buttonVisible: autoTest.finished
+ }
+
+ Button {
+ id: pathButton
+ anchors.bottom: parent.bottom
+ anchors.left: parent.left
+ anchors.right: parent.right
+ text: "Set logfile path"
+ anchors.margins: 10
+ onClicked: folderDialog.open()
}
}
- Button {
- id: writeLine
- width: parent.width / 7
- height: 50
- anchors.left: itemAdd.right
- enabled: true
- text: "Write"
- onClicked: {
- dataGenerator.writeLine(itemCount, scatterPlot.currentFps.toFixed(1));
+ FolderDialog {
+ id: folderDialog
+ currentFolder: StandardPaths.standardLocations(StandardPaths.DocumentsLocation)[0]
+ onAccepted: dataGenerator.setFilePath(currentFolder)
+ }
+
+ Timer {
+ id: rotationTimer
+ interval: 15
+ running: rotateCB.checked
+ repeat: true
+ onTriggered: {
+ switch (tabBar.currentIndex) {
+ case 0:
+ if (++surfaceGraph.scene.activeCamera.xRotation == 360)
+ surfaceGraph.cameraXRotation = 0;
+ break
+ case 1:
+ if (++scatterGraph.scene.activeCamera.xRotation == 360)
+ scatterGraph.cameraXRotation = 0;
+ break
+ case 2:
+ if (++barGraph.scene.activeCamera.xRotation == 360)
+ barGraph.cameraXRotation = 0;
+ break
+ }
}
}
- Item {
- id: graphView
- width: mainview.width
- height: mainview.height
- anchors.top: changeButton.bottom
- anchors.left: mainview.left
- state: "meshsphere"
-
- Scatter3D {
- id: scatterPlot
- width: graphView.width
- height: graphView.height
- shadowQuality: AbstractGraph3D.ShadowQualityNone
- optimizationHints: AbstractGraph3D.OptimizationDefault
- scene.activeCamera.yRotation: 45.0
- measureFps: true
- onCurrentFpsChanged: {
- fpsText.text = itemCount + " : " + scatterPlot.currentFps.toFixed(1);
+ Timer {
+ id: updateTimer
+ interval: 1000 / frequencySlider.value
+ running: liveDataCB.checked
+ repeat: true
+ onTriggered: {
+ switch (tabBar.currentIndex) {
+ case 0:
+ dataGenerator.updateSurfaceData(surfaceSeries)
+ break
+ case 1:
+ dataGenerator.updateScatterData(scatterSeries)
+ break
+ case 2:
+ dataGenerator.updateBarData(barSeries)
+ break
}
+ }
+ }
+
+
+ StackLayout {
+ anchors.top: tabBar.bottom
+ anchors.bottom: parent.bottom
+ anchors.left: parent.left
+ anchors.right: panels.left
+ currentIndex: tabBar.currentIndex
+
+ Item {
+ id: surfaceTab
+ Surface3D {
+ id: surfaceGraph
+ anchors.fill: parent
+ shadowQuality: AbstractGraph3D.ShadowQualityNone
+ scene.activeCamera.yRotation: 45.0
+ measureFps: true
+
+ axisX.min: 0
+ axisX.max: 1
+ axisY.min: 0
+ axisY.max: 1
+ horizontalAspectRatio: 1.0
+
- theme: Theme3D {
- type: Theme3D.ThemeRetro
- colorStyle: Theme3D.ColorStyleRangeGradient
- baseGradients: customGradient
+ theme : Theme3D {
+ type: Theme3D.ThemeQt
+ colorStyle: Theme3D.ColorStyleRangeGradient
+ baseGradients: surfaceGradient
- ColorGradient {
- id: customGradient
- ColorGradientStop { position: 1.0; color: "red" }
- ColorGradientStop { position: 0.0; color: "blue" }
+ ColorGradient {
+ id: surfaceGradient
+ ColorGradientStop { position: 1.0; color: "red" }
+ ColorGradientStop { position: 0.0; color: "blue" }
+ }
}
- }
- Scatter3DSeries {
- id: scatterSeries
- mesh: Abstract3DSeries.MeshSphere
- }
+ Surface3DSeries {
+ id: surfaceSeries
+ dataProxy.onArrayReset: tests.dataPoints = dataProxy.columnCount * dataProxy.rowCount
+ }
- Component.onCompleted: dataGenerator.generateData(scatterSeries, itemCount);
+ onCurrentFpsChanged: {
+ tests.currentFps = currentFps
+ }
+ }
}
+ Item {
+ id: scatterTab
+ Scatter3D {
+ id: scatterGraph
+ anchors.fill: parent
+ shadowQuality: AbstractGraph3D.ShadowQualityNone
+ scene.activeCamera.yRotation: 45.0
+ aspectRatio: 1.0
+ horizontalAspectRatio: 1.0
+
+ axisY.min: -1
+ axisY.max: 1
+ axisX.min: -1
+ axisX.max: 1
+ axisZ.min: -1
+ axisZ.max: 1
+
+ measureFps: true
+ theme : Theme3D {
+ type: Theme3D.ThemeQt
+ colorStyle: Theme3D.ColorStyleRangeGradient
+ baseGradients: scatterGradient
- states: [
- State {
- name: "meshsphere"
- StateChangeScript {
- name: "doSphere"
- script: {
- console.log("Do the sphere");
- scatterSeries.mesh = Abstract3DSeries.MeshSphere;
+ ColorGradient {
+ id: scatterGradient
+ ColorGradientStop { position: 1.0; color: "yellow" }
+ ColorGradientStop { position: 0.6; color: "red" }
+ ColorGradientStop { position: 0.4; color: "blue" }
+ ColorGradientStop { position: 0.0; color: "green" }
}
}
- },
- State {
- name: "meshcube"
- StateChangeScript {
- name: "doCube"
- script: {
- console.log("Do the cube");
- scatterSeries.mesh = Abstract3DSeries.MeshCube;
- }
+ Scatter3DSeries {
+ id: scatterSeries
+ dataProxy.onArrayReset: tests.dataPoints = dataProxy.itemCount
+ itemSize: 0.1
}
- },
- State {
- name: "meshpyramid"
- StateChangeScript {
- name: "doPyramid"
- script: {
- console.log("Do the pyramid");
- scatterSeries.mesh = Abstract3DSeries.MeshPyramid;
- }
+ onCurrentFpsChanged: {
+ tests.currentFps = currentFps
}
- },
- State {
- name: "meshpoint"
- StateChangeScript {
- name: "doPoint"
- script: {
- console.log("Do the point");
- scatterSeries.mesh = Abstract3DSeries.MeshPoint;
+ }
+ }
+ Item {
+ id: barTab
+ Bars3D {
+ id: barGraph
+ anchors.fill: parent
+ shadowQuality: AbstractGraph3D.ShadowQualityNone
+ scene.activeCamera.yRotation: 45.0
+ measureFps: true
+ valueAxis.min: 0
+ valueAxis.max: 1
+
+ theme : Theme3D {
+ type: Theme3D.ThemeQt
+ colorStyle: Theme3D.ColorStyleRangeGradient
+ baseGradients: barGradient
+
+ ColorGradient{
+ id: barGradient
+ ColorGradientStop { position: 1.0; color: "red" }
+ ColorGradientStop { position: 0.0; color: "blue" }
}
}
+
+ Bar3DSeries {
+ id: barSeries
+ dataProxy.onArrayReset: tests.dataPoints
+ = dataProxy.colCount * dataProxy.rowCount
+
+ }
+
+ onCurrentFpsChanged: {
+ tests.currentFps = currentFps
+ }
}
- ]
+ }
}
}