summaryrefslogtreecommitdiffstats
path: root/doc/src/snippets/qtcluster/qml/CarModelSports.qml
diff options
context:
space:
mode:
Diffstat (limited to 'doc/src/snippets/qtcluster/qml/CarModelSports.qml')
-rw-r--r--doc/src/snippets/qtcluster/qml/CarModelSports.qml569
1 files changed, 569 insertions, 0 deletions
diff --git a/doc/src/snippets/qtcluster/qml/CarModelSports.qml b/doc/src/snippets/qtcluster/qml/CarModelSports.qml
new file mode 100644
index 000000000..1977da28b
--- /dev/null
+++ b/doc/src/snippets/qtcluster/qml/CarModelSports.qml
@@ -0,0 +1,569 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt3D module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** 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 http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import Qt3D.Core 2.0
+import Qt3D.Render 2.0
+import Qt3D.Extras 2.0
+import Qt3D.Examples 2.0
+import QtQuick 2.5 as Quick
+import QtQuick.Scene3D 2.0
+
+Entity
+{
+ id: carModelEntity
+
+ property bool hidden: true
+ property Scene3D scene
+ property real carRotation: 0.0
+ property var previousComponent: undefined
+ property var previousMaterial
+ property vector3d defaultCameraPosition: Qt.vector3d(0.0, 10.0, 30.0)
+ property vector3d defaultLightPosition: Qt.vector3d(0.0, 30.0, 11.0)
+ property vector3d lightPosition: defaultLightPosition
+ property vector3d cameraPos: defaultCameraPosition
+ property vector3d lightPos: defaultLightPosition
+
+ property real lightPosMultiplier: 1.75
+
+ property int door_left: 1
+ property int door_right: 2
+ property int door_trunk: 4
+ property int door_hood: 8
+
+ property bool highlighting: false
+ property bool doorAction: false
+
+ property int highlightType: 0
+ property int defaultHighlight: 99
+
+ // Preset camera positions for highlights
+ // Light positions can use the same vectors, but with a multiplier to move it further or closer
+ // Lamp highlights
+ property vector3d positionFrontLeftHigh: Qt.vector3d(5.0, 4.0, 15.0) // Left headlight
+ property vector3d positionFrontRightHigh: Qt.vector3d(-5.0, 4.0, 15.0) // Right headlight
+ property vector3d positionFrontLeftLow: Qt.vector3d(3.0, 2.0, 15.0) // Left day light
+ property vector3d positionFrontRightLow: Qt.vector3d(-3.0, 2.0, 15.0) // Right day light
+ property vector3d positionRearLeft: Qt.vector3d(5.0, 5.0, -15.0) // Left tail light
+ property vector3d positionRearRight: Qt.vector3d(-5.0, 5.0, -15.0) // Right tail light
+ // Tire highlights
+ property vector3d positionLeftRear: Qt.vector3d(10.0, 2.0, -12.5)
+ property vector3d positionLeftFront: Qt.vector3d(10.0, 2.0, 12.5)
+ property vector3d positionRightRear: Qt.vector3d(-10.0, 2.0, -12.5)
+ property vector3d positionRightFront: Qt.vector3d(-10.0, 2.0, 12.5)
+ // Door highlights
+ property vector3d positionLeft: Qt.vector3d(35.0, 10.0, 0.0) // Doors on the left
+ property vector3d positionRight: Qt.vector3d(-35.0, 10.0, 0.0) // Doors on the right
+ property vector3d positionTop: Qt.vector3d(0.0, 40.0, 1.0) // Doors on both sides
+ property vector3d positionBack: Qt.vector3d(0.0, 20.0, -20.0) // Trunk
+ property vector3d positionFront: Qt.vector3d(0.0, 20.0, 20.0) // Hood
+
+ // Original
+ property color bodyColor: Qt.rgba(0.6270588, 0.04137255, 0.04137255, 1.0)
+ property color interiorColor: Qt.rgba(0.17, 0.17, 0.18, 1.0)
+ property color highlightColor: "orange"
+ // Blue
+// property color bodyColor: "navy"
+// property color interiorColor: "darkslateblue"
+// property color highlightColor: "orange"
+ // Perky
+// property color bodyColor: "chartreuse"
+// property color interiorColor: "orangered"
+// property color highlightColor: "yellow"
+ // Pink
+// property color bodyColor: "deeppink"
+// property color interiorColor: "thistle"
+// property color highlightColor: "orange"
+ // Orange
+// property color bodyColor: "orangered"
+// property color interiorColor: "saddlebrown"
+// property color highlightColor: "yellow"
+ // Yellow
+// property color bodyColor: "gold"
+// property color interiorColor: "dimgray"
+// property color highlightColor: "red"
+
+ Camera {
+ id: camera
+ projectionType: CameraLens.PerspectiveProjection
+ fieldOfView: 45
+ aspectRatio: scene.width / scene.height
+ nearPlane: 0.1
+ farPlane: 100.0
+ position: defaultCameraPosition
+ upVector: Qt.vector3d(0.0, 1.0, 0.0)
+ viewCenter: Qt.vector3d(0.0, 0.0, 0.0)
+ }
+
+ Entity {
+ components: [
+ Transform {
+ translation: lightPosition
+ },
+ PointLight {
+ color: "white"
+ intensity: 1.0
+ }
+ ]
+ }
+
+ RenderSettings {
+ Viewport {
+ RenderSurfaceSelector {
+ ClearBuffers {
+ buffers: ClearBuffers.ColorDepthBuffer
+ NoDraw { } // Just clear
+ }
+ CameraSelector {
+ camera: camera
+ NoDraw {
+ enabled: hidden
+ }
+ }
+ }
+ }
+ }
+
+ // Materials for the parts that need highlighting
+ PhongMaterial {
+ id: bodyMaterial
+ ambient: Qt.rgba(0.05, 0.05, 0.05, 1.0)
+ diffuse: bodyColor
+ specular: Qt.rgba(0.7686275, 0.6196079, 0.3568628, 1.0)
+ shininess: 164
+ }
+
+ PhongMaterial {
+ id: bodyMaterialHighlight
+ ambient: Qt.rgba(0.05, 0.05, 0.05, 1.0)
+ diffuse: highlightColor
+ shininess: 164
+ }
+
+ PhongMaterial {
+ id: tireMaterial
+ ambient: Qt.rgba(0.05, 0.05, 0.05, 1.0)
+ specular: Qt.rgba(0.594, 0.594, 0.594, 1.0)
+ diffuse: "black"
+ shininess: 51
+ }
+
+ PhongMaterial {
+ id: tireMaterialHighlight
+ ambient: Qt.rgba(0.05, 0.05, 0.05, 1.0)
+ specular: Qt.rgba(0.594, 0.594, 0.594, 1.0)
+ diffuse: highlightColor
+ shininess: 51
+ }
+
+ DiffuseMapMaterial {
+ id: lampsMaterial
+ ambient: Qt.rgba(0.75, 0.75, 0.75, 1.0)
+ specular: Qt.rgba(0.279, 0.279, 0.279, 1.0)
+ diffuse: TextureLoader { source: "qrc:/Map11.jpg" }
+ shininess: 31
+ }
+
+ // bodyMaterialHighlight is used for lamp highlight
+
+ // Materials for the parts that do not otherwise work correctly
+// Material {
+// id: transparentGlassMaterial
+
+// parameters: [
+// Parameter { name: "alpha"; value: 0.95 },
+// Parameter { name: "ka"; value: Qt.vector3d(0.2, 0.2, 0.2) },
+// Parameter { name: "kd"; value: Qt.vector3d(0.1608937, 0.16512, 0.154057) },
+// Parameter { name: "ks"; value: Qt.vector3d(1.0, 1.0, 1.0) },
+// Parameter { name: "shininess"; value: 15 }
+// ]
+
+// effect: DefaultAlphaEffect {
+// sourceRgbArg: BlendEquationArguments.SourceColor
+// destinationRgbArg: BlendEquationArguments.OneMinusSourceColor
+// }
+// }
+
+ PhongAlphaMaterial {
+ id: transparentGlassMaterial
+ diffuse: Qt.rgba(0.1608937, 0.16512, 0.154057, 1.0)
+ specular: Qt.rgba(1.0, 1.0, 1.0, 1.0)
+ alpha: 0.75
+ shininess: 33
+ }
+
+ PhongMaterial {
+ id: interiorMaterial
+ ambient: "black"
+ diffuse: interiorColor
+ shininess: 30
+ }
+
+ SceneHelper {
+ id: sceneHelper
+ }
+
+ Entity {
+ id: carModel
+
+ Transform {
+ id: carTransform
+ matrix: {
+ var m = Qt.matrix4x4()
+ m.rotate(carRotation, Qt.vector3d(0, 1, 0))
+ m.rotate(-90, Qt.vector3d(1, 0, 0))
+ m.scale(1.35)
+ return m
+ }
+ }
+
+ SceneLoader {
+ id: modelLoader
+ source: "qrc:/sportscar.qgltf"
+ property var lampParts: [ "headlight_right", "headlight_left", "daylight_right",
+ "daylight_left", "taillight_left", "taillight_right" ]
+ property var bodyParts: [ "body", "door_left", "door_right",
+ "trunk", "hood" ]
+ property var transparentGlassParts: [ "d_glass" ]
+ property var tireParts: [ "tire_front_left", "tire_front_right",
+ "tire_rear_left", "tire_rear_right" ]
+ property var interiorParts: [ "interior" ]
+
+ // Note: If there are problems with transparent materials etc. check that you have
+ // exported the Collada file used to create the qgltf binary files using the following
+ // options in Blender (in Collada options category):
+ // - Triangulate (off)
+ // - Use Object Instances (on)
+ // - Sort by Object name (on)
+ // If just setting those is not enough, try changing the object names so that the
+ // object will be loaded in a different order.
+ // Use the following syntax for qgltf.exe:
+ // qgltf.exe file.dae -b -S
+
+ onStatusChanged: {
+ if (status === SceneLoader.Ready) {
+ sceneHelper.addBasicMaterials(modelLoader, bodyMaterial, bodyParts)
+ sceneHelper.addBasicMaterials(modelLoader, transparentGlassMaterial,
+ transparentGlassParts)
+ sceneHelper.addBasicMaterials(modelLoader, interiorMaterial, interiorParts)
+ sceneHelper.addTextureMaterial(modelLoader, lampsMaterial, lampParts[0])
+ sceneHelper.addTextureMaterial(modelLoader, lampsMaterial, lampParts[1])
+ sceneHelper.addTextureMaterial(modelLoader, lampsMaterial, lampParts[2])
+ sceneHelper.addTextureMaterial(modelLoader, lampsMaterial, lampParts[3])
+ sceneHelper.addTextureMaterial(modelLoader, lampsMaterial, lampParts[4])
+ sceneHelper.addTextureMaterial(modelLoader, lampsMaterial, lampParts[5])
+ sceneHelper.addTextureMaterial(modelLoader, tireMaterial, tireParts[0])
+ sceneHelper.addTextureMaterial(modelLoader, tireMaterial, tireParts[1])
+ sceneHelper.addTextureMaterial(modelLoader, tireMaterial, tireParts[2])
+ sceneHelper.addTextureMaterial(modelLoader, tireMaterial, tireParts[3])
+ floorPlane.enabled = true
+ }
+ }
+ }
+
+ components : [carTransform, modelLoader]
+ }
+
+ Entity {
+ id: floorPlane
+ enabled: false
+
+ DiffuseMapMaterial {
+ id: planeMaterial
+ ambient: Qt.rgba(0, 0, 0, 1.0)
+ specular: Qt.rgba(0, 0, 0, 1.0)
+ diffuse: TextureLoader { source: "qrc:/images/SportCarFloorShadow.png" }
+ }
+
+ Transform {
+ id: planeRotation
+ matrix: {
+ var m = Qt.matrix4x4()
+ m.rotate(carRotation, Qt.vector3d(0, 1, 0))
+ m.scale(1.35)
+ return m
+ }
+ }
+
+ PlaneMesh {
+ id: planeMesh
+ width: 70
+ height: 70
+ }
+
+ components : [planeMesh, planeMaterial, planeRotation]
+ }
+
+ function highlightItem(idx) {
+ carRotationAnimation.stop()
+ carResetRotationAnimation.start()
+ highlighting = true
+ var highlightComponent
+ var highlightMaterial
+ var originalMaterial
+
+ switch (idx) {
+ case 1:
+ highlightComponent = "tire_front_left"
+ highlightMaterial = tireMaterialHighlight
+ originalMaterial = tireMaterial
+ lightPos = positionLeftFront.times(lightPosMultiplier)
+ cameraPos = positionLeftFront
+ break
+ case 2:
+ highlightComponent = "tire_front_right"
+ highlightMaterial = tireMaterialHighlight
+ originalMaterial = tireMaterial
+ lightPos = positionRightFront.times(lightPosMultiplier)
+ cameraPos = positionRightFront
+ break
+ case 3:
+ highlightComponent = "tire_rear_right"
+ highlightMaterial = tireMaterialHighlight
+ originalMaterial = tireMaterial
+ lightPos = positionRightRear.times(lightPosMultiplier)
+ cameraPos = positionRightRear
+ break
+ case 4:
+ highlightComponent = "tire_rear_left"
+ highlightMaterial = tireMaterialHighlight
+ originalMaterial = tireMaterial
+ lightPos = positionLeftRear.times(lightPosMultiplier)
+ cameraPos = positionLeftRear
+ break
+ case 5:
+ highlightComponent = "headlight_left"
+ highlightMaterial = bodyMaterialHighlight
+ originalMaterial = lampsMaterial
+ lightPos = positionFrontLeftHigh.times(lightPosMultiplier)
+ cameraPos = positionFrontLeftHigh
+ break
+ case 6:
+ highlightComponent = "headlight_right"
+ highlightMaterial = bodyMaterialHighlight
+ originalMaterial = lampsMaterial
+ lightPos = positionFrontRightHigh.times(lightPosMultiplier)
+ cameraPos = positionFrontRightHigh
+ break
+ case 7:
+ highlightComponent = "daylight_right"
+ highlightMaterial = bodyMaterialHighlight
+ originalMaterial = lampsMaterial
+ lightPos = positionFrontRightLow.times(lightPosMultiplier)
+ cameraPos = positionFrontRightLow
+ break
+ case 8:
+ highlightComponent = "daylight_left"
+ highlightMaterial = bodyMaterialHighlight
+ originalMaterial = lampsMaterial
+ lightPos = positionFrontLeftLow.times(lightPosMultiplier)
+ cameraPos = positionFrontLeftLow
+ break
+ case 9:
+ highlightComponent = "taillight_left"
+ highlightMaterial = bodyMaterialHighlight
+ originalMaterial = lampsMaterial
+ lightPos = positionRearLeft.times(lightPosMultiplier)
+ cameraPos = positionRearLeft
+ break
+ case 10:
+ highlightComponent = "taillight_right"
+ highlightMaterial = bodyMaterialHighlight
+ originalMaterial = lampsMaterial
+ lightPos = positionRearRight.times(lightPosMultiplier)
+ cameraPos = positionRearRight
+ break
+ default:
+ lightPos = defaultLightPosition
+ cameraPos = defaultCameraPosition
+ }
+
+ if (previousComponent !== undefined)
+ sceneHelper.replaceMaterial(modelLoader, previousComponent, previousMaterial)
+
+ if (highlightComponent !== undefined)
+ sceneHelper.replaceMaterial(modelLoader, highlightComponent, highlightMaterial)
+
+ previousComponent = highlightComponent
+ previousMaterial = originalMaterial
+ }
+
+ function highlightOpenDoors(openDoors) {
+ carRotationAnimation.stop()
+ carResetRotationAnimation.start()
+ highlighting = true
+ var openLeft = false
+ var openRight = false
+ var openBack = false
+ var openFront = false
+
+ // Check with bitwise operators, as they can be open in any combination
+ if (openDoors & door_left) {
+ sceneHelper.replaceMaterial(modelLoader, "door_left", bodyMaterialHighlight)
+ openLeft = true
+ } else {
+ sceneHelper.replaceMaterial(modelLoader, "door_left", bodyMaterial)
+ }
+
+ if (openDoors & door_right) {
+ sceneHelper.replaceMaterial(modelLoader, "door_right", bodyMaterialHighlight)
+ openRight = true
+ } else {
+ sceneHelper.replaceMaterial(modelLoader, "door_right", bodyMaterial)
+ }
+
+ if (openDoors & door_trunk) {
+ sceneHelper.replaceMaterial(modelLoader, "trunk", bodyMaterialHighlight)
+ openBack = true
+ } else {
+ sceneHelper.replaceMaterial(modelLoader, "trunk", bodyMaterial)
+ }
+
+ if (openDoors & door_hood) {
+ openFront = true
+ sceneHelper.replaceMaterial(modelLoader, "hood", bodyMaterialHighlight)
+ } else {
+ sceneHelper.replaceMaterial(modelLoader, "hood", bodyMaterial)
+ }
+
+ if (openRight && openLeft || openBack && openFront) {
+ lightPos = positionTop.times(0.5)
+ cameraPos = positionTop
+ } else if (openRight) {
+ lightPos = positionRight.times(0.33)
+ lightPos.y += 15.0
+ cameraPos = positionRight
+ } else if (openLeft) {
+ lightPos = positionLeft.times(0.33)
+ lightPos.y += 15.0
+ cameraPos = positionLeft
+ } else if (openBack) {
+ lightPos = positionBack.times(0.75)
+ cameraPos = positionBack
+ } else if (openFront) {
+ lightPos = positionFront.times(1.0)
+ cameraPos = positionFront
+ } else {
+ lightPos = defaultLightPosition
+ cameraPos = defaultCameraPosition
+ }
+ }
+
+ onCameraPosChanged: {
+ if (!highlighting)
+ return
+
+ // Update both camera and light positions
+ cameraAnimation.to = cameraPos
+ lightAnimation.to = lightPos
+ cameraAnimation.restart()
+ lightAnimation.restart()
+ highlighting = false
+ }
+
+ Quick.PropertyAnimation {
+ running: false
+ id: cameraAnimation
+ target: camera
+ property: "position"
+ duration: 1000
+ easing.type: Easing.InOutQuad
+ }
+
+ Quick.PropertyAnimation {
+ running: false
+ id: lightAnimation
+ target: carModelEntity
+ property: "lightPosition"
+ duration: 1000
+ easing.type: Easing.Linear
+ }
+
+ Quick.RotationAnimation on carRotation {
+ id: carRotationAnimation
+ running: false
+ from: 0.0
+ to: 360.0
+ duration: 15000
+ loops: -1
+ }
+
+ Quick.RotationAnimation on carRotation {
+ id: carResetRotationAnimation
+ running: false
+ to: (carRotation > 180.0) ? 360.0 : 0.0 // TODO: Try to make animation "natural". Still works weirdly sometimes.
+ duration: 1000
+ loops: -1
+ easing.type: Easing.InOutQuad
+ }
+
+ function resetHighlight() {
+ if (doorAction)
+ highlightOpenDoors(0)
+ else
+ highlightItem(defaultHighlight)
+ doorAction = false
+ }
+
+ function highlightLamp() {
+ highlightType = Math.floor(Math.random() * 6) + 5
+ highlightItem(highlightType)
+ return highlightType
+ }
+
+ function highlightTire() {
+ highlightType = Math.floor(Math.random() * 4) + 1
+ highlightItem(highlightType)
+ return highlightType
+ }
+
+ function toggleIdleTimer(isVisible) {
+ if (isVisible) {
+ idleTimer.restart()
+ } else {
+ carRotationAnimation.stop()
+ carRotation = 0.0
+ idleTimer.stop()
+ }
+ }
+
+ Quick.Timer {
+ id: idleTimer
+ interval: 10000
+ onTriggered: {
+ carRotationAnimation.restart()
+ }
+ }
+}