Revision control
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
pragma ComponentBehavior: Bound
import QtQuick
import QtQuick3D
import QtQuick3D.Helpers
import QtQuick.Controls
Item {
id: mainView
required property Loader loader
readonly property real listItemWidth: 180
readonly property real listItemHeight: 40
// Enable this when only want to list the demos
// Tweak the demos list as needed
readonly property bool showOnlyDemos: false
anchors.fill: parent
ListModel {
id: demosModel
ListElement {
name: "Particles"
file: "Particles.qml"
}
ListElement {
name: "Instancing"
file: "Instancing.qml"
}
ListElement {
name: "Blend Value correctness"
file: "BlendValueTest.qml"
}
}
View3D {
id: view3D
anchors.fill: parent
//! [scene environment]
environment: SceneEnvironment {
clearColor: "#000000"
backgroundMode: SceneEnvironment.Color
antialiasingMode: AppSettings.antialiasingMode
antialiasingQuality: AppSettings.antialiasingQuality
oitMethod: SceneEnvironment.OITWeightedBlended
}
//! [scene environment]
camera: PerspectiveCamera {
position: Qt.vector3d(0, 0, 600)
clipFar: 2000
}
PointLight {
id: pointLight
position: Qt.vector3d(400, 200, 400)
brightness: 50
ambientColor: Qt.rgba(0.5, 0.3, 0.1, 1.0)
SequentialAnimation {
loops: Animation.Infinite
running: true
NumberAnimation {
target: pointLight
property: "brightness"
to: 400
duration: 2000
easing.type: Easing.OutElastic
}
NumberAnimation {
target: pointLight
property: "brightness"
to: 50
duration: 6000
easing.type: Easing.InOutQuad
}
}
}
- // Qt Cube model
- Model {
+ component QtCubeModel : Model {
+ property alias xRotationDuration: cubeXAnim.duration
+ property alias yRotationDuration: cubeYAnim.duration
+ property alias materialOpacity: cubeMaterial.opacity
+
source: "#Cube"
position: Qt.vector3d(0, 0, 100)
+ NumberAnimation on eulerRotation.y {
+ id: cubeYAnim
+ loops: Animation.Infinite
+ from: 0
+ to: 360
+ }
+ NumberAnimation on eulerRotation.x {
+ id: cubeXAnim
+ loops: Animation.Infinite
+ from: 0
+ to: 360
+ }
+ materials: PrincipledMaterial {
+ id: cubeMaterial
+ baseColorMap: Texture {
+ source: "images/qt_logo2.png"
+ }
+ normalMap: Texture {
+ source: "images/qt_logo2_n.png"
+ }
+ cullMode: Material.NoCulling
+ }
+ }
+ QtCubeModel {
scale: Qt.vector3d(2.0, 2.0, 2.0)
- NumberAnimation on eulerRotation.y {
- loops: Animation.Infinite
- from: 0
- to: 360
- duration: 10000
- }
- NumberAnimation on eulerRotation.x {
- loops: Animation.Infinite
- from: 0
- to: 360
- duration: 8000
- }
- materials: PrincipledMaterial {
- baseColorMap: Texture {
- source: "images/qt_logo2.png"
- }
- normalMap: Texture {
- source: "images/qt_logo2_n.png"
- }
- opacity: 0.5
- cullMode: Material.NoCulling
- }
+ xRotationDuration: 8000
+ yRotationDuration: 10000
+ materialOpacity: 0.5
}
- Model {
- source: "#Cube"
- position: Qt.vector3d(0, 0, 100)
+ QtCubeModel {
scale: Qt.vector3d(1.0, 1.0, 1.0)
- NumberAnimation on eulerRotation.y {
- loops: Animation.Infinite
- from: 0
- to: 360
- duration: 20000
- }
- NumberAnimation on eulerRotation.x {
- loops: Animation.Infinite
- from: 0
- to: 360
- duration: 14000
- }
- materials: PrincipledMaterial {
- baseColorMap: Texture {
- source: "images/qt_logo2.png"
- }
- normalMap: Texture {
- source: "images/qt_logo2_n.png"
- }
- opacity: 0.7
- cullMode: Material.NoCulling
- }
+ xRotationDuration: 14000
+ yRotationDuration: 20000
+ materialOpacity: 0.7
}
}
Component {
id: listComponent
Button {
id: button
required property string name
required property string file
width: mainView.listItemWidth
height: mainView.listItemHeight
background: Rectangle {
id: buttonBackground
border.width: 0.5
border.color: "#d0808080"
color: "#d0404040"
opacity: button.hovered ? 1.0 : 0.5
}
contentItem: Text {
anchors.centerIn: parent
color: "#f0f0f0"
font.pointSize: AppSettings.fontSizeSmall
text: button.name
}
onClicked: {
mainView.loader.source = button.file
}
}
}
Text {
id: topLabel
anchors.horizontalCenter: parent.horizontalCenter
anchors.top: parent.top
anchors.topMargin: 20
text: qsTr("Qt Quick 3D - Order Independent Transparency")
color: "#f0f0f0"
font.pointSize: AppSettings.fontSizeLarge
}
Row {
anchors.top: topLabel.bottom
anchors.topMargin: 20
anchors.rightMargin: 50
anchors.right: parent.right
spacing: 20
ListView {
id: demosListView
width: mainView.listItemWidth
height: count * mainView.listItemHeight
model: demosModel
delegate: listComponent
}
}
Pane {
anchors.top: view3D.top
anchors.right: parent.right
Label {
id: debugViewToggleText
text: dbg.visible ? "Hide DebugView" : "Show DebugView"
anchors.right: parent.right
anchors.top: parent.top
MouseArea {
anchors.fill: parent
onClicked: dbg.visible = !dbg.visible
DebugView {
y: debugViewToggleText.height * 2
anchors.right: parent.right
source: view3D
id: dbg
visible: false
}
}
}
}
}