diff options
Diffstat (limited to 'tests/manual/qmlperf/qml')
-rw-r--r-- | tests/manual/qmlperf/qml/qmlperf/AutoTest.qml | 219 | ||||
-rw-r--r-- | tests/manual/qmlperf/qml/qmlperf/Tests.qml | 184 | ||||
-rw-r--r-- | tests/manual/qmlperf/qml/qmlperf/main.qml | 587 |
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 + } } - ] + } } } |