aboutsummaryrefslogtreecommitdiffstats
path: root/examples/quick3d/customgeometry/CustomGeometryExample/Main.qml
diff options
context:
space:
mode:
Diffstat (limited to 'examples/quick3d/customgeometry/CustomGeometryExample/Main.qml')
-rw-r--r--examples/quick3d/customgeometry/CustomGeometryExample/Main.qml398
1 files changed, 398 insertions, 0 deletions
diff --git a/examples/quick3d/customgeometry/CustomGeometryExample/Main.qml b/examples/quick3d/customgeometry/CustomGeometryExample/Main.qml
new file mode 100644
index 000000000..ced493e1f
--- /dev/null
+++ b/examples/quick3d/customgeometry/CustomGeometryExample/Main.qml
@@ -0,0 +1,398 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
+import QtQuick3D
+import QtQuick3D.Helpers
+
+import CustomGeometryExample
+
+ApplicationWindow {
+ id: window
+ width: 1280
+ height: 720
+ visible: true
+ title: "Custom Geometry Example"
+
+ property bool isLandscape: width > height
+
+ View3D {
+ id: v3d
+ anchors.left: window.isLandscape ? controlsPane.right : parent.left
+ anchors.top: window.isLandscape ? parent.top : controlsPane.bottom
+ anchors.right: parent.right
+ anchors.bottom: parent.bottom
+
+ camera: camera
+
+ environment: SceneEnvironment {
+ id: env
+ backgroundMode: SceneEnvironment.Color
+ clearColor: "#002b36"
+ }
+
+ Node {
+ id: originNode
+ PerspectiveCamera {
+ id: cameraNode
+ z: 600
+ }
+ }
+
+ DirectionalLight {
+ id: directionalLight
+ color: Qt.rgba(0.4, 0.2, 0.6, 1.0)
+ ambientColor: Qt.rgba(0.1, 0.1, 0.1, 1.0)
+ }
+
+ PointLight {
+ id: pointLight
+ position: Qt.vector3d(0, 0, 100)
+ color: Qt.rgba(0.1, 1.0, 0.1, 1.0)
+ ambientColor: Qt.rgba(0.2, 0.2, 0.2, 1.0)
+ }
+
+ Model {
+ id: gridModel
+ visible: false
+ scale: Qt.vector3d(100, 100, 100)
+ geometry: GridGeometry {
+ id: grid
+ horizontalLines: 20
+ verticalLines: 20
+ }
+ materials: [
+ PrincipledMaterial {
+ lineWidth: sliderLineWidth.value
+ }
+ ]
+ }
+
+ //! [model triangle]
+ Model {
+ id: triangleModel
+ visible: false
+ scale: Qt.vector3d(100, 100, 100)
+ geometry: ExampleTriangleGeometry {
+ normals: cbNorm.checked
+ normalXY: sliderNorm.value
+ uv: cbUV.checked
+ uvAdjust: sliderUV.value
+ }
+ materials: [
+ PrincipledMaterial {
+ Texture {
+ id: baseColorMap
+ source: "qt_logo_rect.png"
+ }
+ cullMode: PrincipledMaterial.NoCulling
+ baseColorMap: cbTexture.checked ? baseColorMap : null
+ specularAmount: 0.5
+ }
+ ]
+ }
+ //! [model triangle]
+
+ Model {
+ id: pointModel
+ visible: false
+ scale: Qt.vector3d(100, 100, 100)
+ geometry: ExamplePointGeometry { }
+ materials: [
+ PrincipledMaterial {
+ lighting: PrincipledMaterial.NoLighting
+ cullMode: PrincipledMaterial.NoCulling
+ baseColor: "yellow"
+ pointSize: sliderPointSize.value
+ }
+ ]
+ }
+
+ Model {
+ id: torusModel
+ visible: false
+ geometry: TorusMesh {
+ radius: radiusSlider.value
+ tubeRadius: tubeRadiusSlider.value
+ segments: segmentsSlider.value
+ rings: ringsSlider.value
+ }
+ materials: [
+ PrincipledMaterial {
+ id: torusMaterial
+ baseColor: "#dc322f"
+ metalness: 0.0
+ roughness: 0.1
+ }
+ ]
+ }
+
+ OrbitCameraController {
+ origin: originNode
+ camera: cameraNode
+ }
+ }
+
+ Pane {
+ id: controlsPane
+ width: window.isLandscape ? implicitWidth : window.width
+ height: window.isLandscape ? window.height : implicitHeight
+ ColumnLayout {
+ GroupBox {
+ title: "Mode"
+ ButtonGroup {
+ id: modeGroup
+ buttons: [ radioGridGeom, radioCustGeom, radioPointGeom, radioQMLGeom ]
+ }
+ ColumnLayout {
+ RadioButton {
+ id: radioGridGeom
+ text: "GridGeometry"
+ checked: true
+ }
+ RadioButton {
+ id: radioCustGeom
+ text: "Custom geometry from application (triangle)"
+ checked: false
+ }
+ RadioButton {
+ id: radioPointGeom
+ text: "Custom geometry from application (points)"
+ checked: false
+ }
+ RadioButton {
+ id: radioQMLGeom
+ text: "Custom geometry from QML"
+ checked: false
+ }
+ }
+ }
+
+ Pane {
+ id: gridSettings
+ visible: false
+ ColumnLayout {
+ Button {
+ text: "+ Y Cells"
+ onClicked: grid.horizontalLines += 1
+ Layout.alignment: Qt.AlignHCenter
+
+ }
+ RowLayout {
+ Layout.alignment: Qt.AlignHCenter
+ Button {
+ text: "- X Cells"
+ onClicked: grid.verticalLines -= 1
+ }
+ Button {
+ text: "+ X Cells"
+ onClicked: grid.verticalLines += 1
+ }
+ }
+ Button {
+ text: "- Y Cells"
+ onClicked: grid.horizontalLines -= 1
+ Layout.alignment: Qt.AlignHCenter
+ }
+
+ Label {
+ text: "Line width (if supported)"
+ }
+ Slider {
+ Layout.fillWidth: true
+ id: sliderLineWidth
+ from: 1.0
+ to: 10.0
+ stepSize: 0.5
+ value: 1.0
+ }
+ }
+ }
+ Pane {
+ id: triangleSettings
+ visible: false
+ ColumnLayout {
+ CheckBox {
+ id: cbNorm
+ text: "provide normals in geometry"
+ checked: false
+ }
+ RowLayout {
+ enabled: cbNorm.checked
+ Label {
+ Layout.fillWidth: true
+ text: "Normal adjust: "
+ }
+ Slider {
+ id: sliderNorm
+
+ from: 0.0
+ to: 1.0
+ stepSize: 0.01
+ value: 0.0
+ }
+ }
+ CheckBox {
+ id: cbTexture
+ text: "enable base color map"
+ checked: false
+ }
+ CheckBox {
+ id: cbUV
+ text: "provide UV in geometry"
+ checked: false
+ }
+ RowLayout {
+ enabled: cbUV.checked
+ Label {
+ Layout.fillWidth: true
+ text: "UV adjust:"
+ }
+ Slider {
+ id: sliderUV
+ from: 0.0
+ to: 1.0
+ stepSize: 0.01
+ value: 0.0
+ }
+ }
+ }
+
+ }
+ Pane {
+ id: pointSettings
+ visible: false
+ RowLayout {
+ ColumnLayout {
+ RowLayout {
+ Label {
+ text: "Point size (if supported)"
+ }
+ Slider {
+ id: sliderPointSize
+ from: 1.0
+ to: 16.0
+ stepSize: 1.0
+ value: 1.0
+ }
+ }
+ }
+ }
+ }
+ Pane {
+ id: torusSettings
+ visible: false
+ ColumnLayout {
+ Label {
+ text: "Radius: (" + radiusSlider.value + ")"
+ }
+ Slider {
+ id: radiusSlider
+ from: 1.0
+ to: 1000.0
+ stepSize: 1.0
+ value: 200
+ }
+ Label {
+ text: "Tube Radius: (" + tubeRadiusSlider.value + ")"
+ }
+ Slider {
+ id: tubeRadiusSlider
+ from: 1.0
+ to: 500.0
+ stepSize: 1.0
+ value: 50
+ }
+ Label {
+ text: "Rings: (" + ringsSlider.value + ")"
+ }
+ Slider {
+ id: ringsSlider
+ from: 3
+ to: 35
+ stepSize: 1.0
+ value: 20
+ }
+ Label {
+ text: "Segments: (" + segmentsSlider.value + ")"
+ }
+ Slider {
+ id: segmentsSlider
+ from: 3
+ to: 35
+ stepSize: 1.0
+ value: 20
+ }
+ CheckBox {
+ id: wireFrameCheckbox
+ text: "Wireframe Mode"
+ checked: false
+ onCheckedChanged: {
+ env.debugSettings.wireframeEnabled = checked
+ torusMaterial.cullMode = checked ? Material.NoCulling : Material.BackFaceCulling
+
+
+ }
+ }
+ }
+
+ }
+ }
+ states: [
+ State {
+ name: "gridMode"
+ when: radioGridGeom.checked
+ PropertyChanges {
+ gridModel.visible: true
+ gridSettings.visible: true
+ env.debugSettings.wireframeEnabled: false
+ originNode.position: Qt.vector3d(0, 0, 0)
+ originNode.rotation: Qt.quaternion(1, 0, 0, 0)
+ cameraNode.z: 600
+
+ }
+ },
+ State {
+ name: "triangleMode"
+ when: radioCustGeom.checked
+ PropertyChanges {
+ triangleModel.visible: true
+ triangleSettings.visible: true
+ env.debugSettings.wireframeEnabled: false
+ originNode.position: Qt.vector3d(0, 0, 0)
+ originNode.rotation: Qt.quaternion(1, 0, 0, 0)
+ cameraNode.z: 600
+ }
+ },
+ State {
+ name: "pointMode"
+ when: radioPointGeom.checked
+ PropertyChanges {
+ pointModel.visible: true
+ pointSettings.visible: true
+ env.debugSettings.wireframeEnabled: false
+ originNode.position: Qt.vector3d(0, 0, 0)
+ originNode.rotation: Qt.quaternion(1, 0, 0, 0)
+ cameraNode.z: 600
+ }
+ },
+ State {
+ name: "qmlMode"
+ when: radioQMLGeom.checked
+ PropertyChanges {
+ torusModel.visible: true
+ torusSettings.visible: true
+ directionalLight.eulerRotation: Qt.vector3d(-40, 0, 0)
+ directionalLight.color: "white"
+ pointLight.color: "white"
+ pointLight.position: Qt.vector3d(0, 0, 0)
+ originNode.position: Qt.vector3d(0, 0, 0)
+ originNode.eulerRotation: Qt.vector3d(-40, 0, 0)
+ cameraNode.z: 600
+ }
+ }
+ ]
+ }
+}