Qt Quick 3D - Particles 3D Testbed Example
// Copyright (C) 2021 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
import QtQuick
import QtQuick3D.Particles3D
import QtQuick.Controls
Frame {
property var particleSystems
readonly property bool loggingEnabled: settings.showLoggingView
property bool intervalInstant: false
property real itemWidth: (width - loggingButton.width - intervalButton.width) / 7
width: parent.width
height: tableContent.height + 30
Component.onCompleted: {
for (const psystem of particleSystems)
psystem.logging = settings.showLoggingView;
}
// Background
background: Rectangle {
color: "#80000000"
visible: loggingEnabled
}
Button {
id: loggingButton
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
anchors.rightMargin: 10
opacity: loggingEnabled ? 1.0 : 0.4
icon.source: "qrc:/qml/images/icon_logging.png"
icon.width: 32
icon.height: 32
icon.color: "transparent"
background: Rectangle {
color: "transparent"
}
onClicked: {
settings.showLoggingView = !settings.showLoggingView
for (const psystem of particleSystems) {
psystem.logging = settings.showLoggingView;
}
}
}
Button {
id: intervalButton
anchors.verticalCenter: parent.verticalCenter
anchors.right: loggingButton.left
anchors.rightMargin: 0
visible: loggingEnabled
opacity: intervalInstant ? 1.0 : 0.2
icon.source: "qrc:/qml/images/icon_interval.png"
icon.width: 32
icon.height: 32
icon.color: "transparent"
background: Rectangle {
color: "transparent"
}
onClicked: {
intervalInstant = !intervalInstant;
var interval = intervalInstant ? 0 : 1000;
for (const psystem of particleSystems)
psystem.loggingData.loggingInterval = interval;
}
}
Component {
id: systemItem
Row {
Text {
width: itemWidth
horizontalAlignment: Text.AlignHCenter
color: "#ffffff"
font.pointSize: settings.fontSizeSmall
text: modelData.seed
}
Text {
width: itemWidth
horizontalAlignment: Text.AlignHCenter
color: "#ffffff"
font.pointSize: settings.fontSizeSmall
text: modelData.loggingData.updates
}
Text {
width: itemWidth
horizontalAlignment: Text.AlignHCenter
color: "#ffffff"
font.pointSize: settings.fontSizeSmall
text: modelData.loggingData.particlesMax
}
Text {
width: itemWidth
horizontalAlignment: Text.AlignHCenter
color: "#ffffff"
font.pointSize: settings.fontSizeSmall
text: modelData.loggingData.particlesUsed
}
Text {
width: itemWidth
horizontalAlignment: Text.AlignHCenter
color: "#ffffff"
font.pointSize: settings.fontSizeSmall
text: modelData.loggingData.time.toFixed(4)
}
Text {
width: itemWidth
horizontalAlignment: Text.AlignHCenter
color: "#ffffff"
font.pointSize: settings.fontSizeSmall
text: modelData.loggingData.timeAverage.toFixed(4)
}
Text {
width: itemWidth
horizontalAlignment: Text.AlignHCenter
color: "#ffffff"
font.pointSize: settings.fontSizeSmall
text: modelData.loggingData.timeDeviation.toFixed(4)
}
}
}
Column {
id: tableContent
width: parent.width
anchors.verticalCenter: parent.verticalCenter
visible: loggingEnabled
Row {
Text {
width: itemWidth
horizontalAlignment: Text.AlignHCenter
color: "#ffffff"
font.pointSize: settings.fontSizeSmall
text: qsTr("SEED")
}
Text {
width: itemWidth
horizontalAlignment: Text.AlignHCenter
color: "#ffffff"
font.pointSize: settings.fontSizeSmall
text: qsTr("UPDATES")
}
Text {
width: itemWidth
horizontalAlignment: Text.AlignHCenter
color: "#ffffff"
font.pointSize: settings.fontSizeSmall
text: qsTr("P. MAX")
}
Text {
width: itemWidth
horizontalAlignment: Text.AlignHCenter
color: "#ffffff"
font.pointSize: settings.fontSizeSmall
text: qsTr("P. USED")
}
Text {
width: itemWidth
horizontalAlignment: Text.AlignHCenter
color: "#ffffff"
font.pointSize: settings.fontSizeSmall
text: qsTr("TIME")
}
Text {
width: itemWidth
horizontalAlignment: Text.AlignHCenter
color: "#ffffff"
font.pointSize: settings.fontSizeSmall
text: qsTr("TIME AVG.")
}
Text {
width: itemWidth
horizontalAlignment: Text.AlignHCenter
color: "#ffffff"
font.pointSize: settings.fontSizeSmall
text: qsTr("TIME DEV.")
}
}
Repeater {
model: particleSystems
delegate: systemItem
}
}
}