diff options
Diffstat (limited to 'doc/src/snippets/qtcluster/qml/CarModelSports.qml')
-rw-r--r-- | doc/src/snippets/qtcluster/qml/CarModelSports.qml | 569 |
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() + } + } +} |