blob: 66911b77b05f17cb4613e50082728ed6a36648bd [file] [log] [blame]
import QtQuick 2.15
import QtQuick.Window 2.12
import QtQuick3D 1.15
Window {
id: window
visible: true
width: 640
height: 480
title: qsTr("10,000 Cubes (draw call overhead)")
property int frames: 0
property int fps: 0
onFrameSwapped: {
frames++;
}
property vector3d cubeRotation: Qt.vector3d(0, 0, 0)
// Uncomment to see performance when animating 10,000 cubes individually
// NumberAnimation {
// target: window
// property: "cubeRotation.x"
// duration: 1000
// from: 0
// to: 360
// running: true
// loops: -1
// }
Rectangle {
anchors.fill: parent
gradient: Gradient {
GradientStop { position: 0.0; color: "#d2ff52" }
GradientStop { position: 1.0; color: "#91e842" }
}
Text {
anchors.fill: parent
text: fps
fontSizeMode: Text.Fit
color: "white"
minimumPointSize: 128
font.pointSize: 512
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
renderType: Text.NativeRendering
}
}
Component {
id: simpleCube
Model {
source: "#Cube"
scale: Qt.vector3d(0.1, 0.1, 0.1)
eulerRotation: window.cubeRotation
materials: DefaultMaterial {
diffuseColor: "white"
}
}
}
View3D {
id: view
anchors.fill: parent
environment: SceneEnvironment {
depthPrePassEnabled: false
}
DirectionalLight {
color: "red"
}
DirectionalLight {
color: "green"
eulerRotation: Qt.vector3d(0, 180, 0)
}
Node {
id: cameraSpinner
position: Qt.vector3d(0, 0, 0);
PerspectiveCamera {
id: camera
position: Qt.vector3d(0, 0, 700)
}
eulerRotation: Qt.vector3d(0, 90, 0)
SequentialAnimation on eulerRotation.y {
loops: Animation.Infinite
PropertyAnimation {
duration: 10000;
from: 0
to: 360
}
}
}
}
Timer {
interval: 500
running: true
onTriggered: {
let spacing = 25.0;
let countX = 25
let countY = 20
let countZ = 20
let offsetX = -spacing * countX * 0.5;
let offsetY = -spacing * countY * 0.5;
let offsetZ = spacing * countZ * 0.5;
for(var x = 0; x < countX; ++x)
{
for(var y = 0; y < countY; ++y)
{
for(var z = 0; z < countZ; ++z)
{
let posX = offsetX + x * spacing;
let posY = offsetY + y * spacing;
let posZ = offsetZ - z * spacing;
simpleCube.createObject(view.scene, {"x": posX, "y": posY, "z": posZ })
}
}
}
}
}
Timer {
id: fpsTimer
interval: 1000
repeat: true
running: true
onTriggered: {
fps = frames;
frames = 0;
}
}
Text {
anchors.top: parent.top
anchors.right: parent.right
text: "fps: " + fps
}
Rectangle {
id: greenRect
anchors.bottom: parent.bottom
anchors.right: parent.right
color: "green"
height: 50
width: 50
Text {
anchors.centerIn: parent
text: fps
font.pointSize: 20
}
NumberAnimation {
target: greenRect
property: "eulerRotation"
duration: 2000
easing.type: Easing.InOutQuad
from: 0
to: 360
running: true
loops: -1
}
}
}