Revision control

Copy as Markdown

// Copyright (C) 2019 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
import QtQuick
import QtQuick3D
Item {
Component.onCompleted: {
console.log("Keys:\n[L] - toggle lighting\n[N] - add a new point light\n[R] - remove a point light\n[T] - toggle directional light");
}
id: root
Text {
color: "#ffffff"
style: Text.Outline
styleColor: "#606060"
font.pixelSize: 28
property int api: GraphicsInfo.api
text: {
if (GraphicsInfo.api === GraphicsInfo.OpenGL)
"OpenGL";
else if (GraphicsInfo.api === GraphicsInfo.Software)
"Software";
else if (GraphicsInfo.api === GraphicsInfo.Direct3D12)
"D3D12";
else if (GraphicsInfo.api === GraphicsInfo.OpenVG)
"OpenVG";
else if (GraphicsInfo.api === GraphicsInfo.OpenGLRhi)
"OpenGL via QRhi";
else if (GraphicsInfo.api === GraphicsInfo.Direct3D11Rhi)
"D3D11 via QRhi";
else if (GraphicsInfo.api === GraphicsInfo.VulkanRhi)
"Vulkan via QRhi";
else if (GraphicsInfo.api === GraphicsInfo.MetalRhi)
"Metal via QRhi";
else if (GraphicsInfo.api === GraphicsInfo.Null)
"Null via QRhi";
else
"Unknown API";
}
}
Image {
source: "qt_logo.png"
x: 50
NumberAnimation on y { from: 50; to: 400; duration: 3000; loops: -1 }
}
property bool useLighting: false;
property var lights: []
focus: true
Keys.onPressed: {
if (event.key === Qt.Key_L) {
useLighting = !useLighting;
} else if (event.key === Qt.Key_N && lights.length + 2 <= 7) {
var colors = [ "yellow", "red", "green", "blue", "purple", "magenta" ];
var lightColor = colors[lights.length];
console.log("Adding new point light: " + (lights.length + 1) + " color: " + lightColor);
var component = Qt.createComponent("qrc:/SomePointLight.qml");
var newLight = component.createObject(pointLightContainer, { color: lightColor });
lights.push(newLight);
} else if (event.key === Qt.Key_R && lights.length > 0) {
console.log("Removing last point light. Remaining: " + (lights.length - 1));
var dyingLight = lights.pop();
dyingLight.destroy();
} else if (event.key === Qt.Key_T) {
console.log("Toggling visibility of directional light: " + !dirLight.visible);
dirLight.visible = !dirLight.visible
}
}
Rectangle {
color: "transparent"
border.color: "lightGray"
border.width: 2
anchors.fill: parent
transform: [
Rotation { id: rotation; axis.x: 0; axis.z: 0; axis.y: 1; angle: 0; origin.x: v3d.width / 2; origin.y: v3d.height / 2; },
Translate { id: txOut; x: -v3d.width / 2; y: -v3d.height / 2 },
Scale { id: scale; },
Translate { id: txIn; x: v3d.width / 2; y: v3d.height / 2 }
]
SequentialAnimation {
PauseAnimation { duration: 2000 }
ParallelAnimation {
NumberAnimation { target: scale; property: "xScale"; to: 0.6; duration: 1000; easing.type: Easing.InOutBack }
NumberAnimation { target: scale; property: "yScale"; to: 0.6; duration: 1000; easing.type: Easing.InOutBack }
}
NumberAnimation { target: rotation; property: "angle"; to: 80; duration: 1000; easing.type: Easing.InOutCubic }
NumberAnimation { target: rotation; property: "angle"; to: -80; duration: 1000; easing.type: Easing.InOutCubic }
NumberAnimation { target: rotation; property: "angle"; to: 0; duration: 1000; easing.type: Easing.InOutCubic }
PauseAnimation { duration: 1000 }
ParallelAnimation {
NumberAnimation { target: scale; property: "xScale"; to: 1; duration: 1000; easing.type: Easing.InOutBack }
NumberAnimation { target: scale; property: "yScale"; to: 1; duration: 1000; easing.type: Easing.InOutBack }
}
running: true
loops: Animation.Infinite
}
View3D {
id: v3d
anchors.fill: parent
camera: camera
renderMode: View3D.Offscreen
PerspectiveCamera {
id: camera
position: Qt.vector3d(0, 200, 300)
eulerRotation: Qt.vector3d(-30, 0, 0)
}
Model {
source: "#Cube"
materials: [ DefaultMaterial {
lighting: root.useLighting ? DefaultMaterial.FragmentLighting : DefaultMaterial.NoLighting
} ]
eulerRotation: Qt.vector3d(0, -90, 0)
PropertyAnimation on eulerRotation.y { from: 0; to: -360; duration: 5000; loops: -1 }
}
Model {
source: "teapot.mesh"
x: 100
y: 100
scale: Qt.vector3d(15, 15, 15)
materials: [ DefaultMaterial {
lighting: root.useLighting ? DefaultMaterial.FragmentLighting : DefaultMaterial.NoLighting
diffuseColor: "salmon"
} ]
PropertyAnimation on eulerRotation.y { from: 0; to: 360; duration: 2000; loops: -1 }
PropertyAnimation on eulerRotation.z { from: 0; to: 360; duration: 2000; loops: -1 }
}
DirectionalLight {
id: dirLight
ambientColor: Qt.rgba(0.1, 0.1, 0.1, 1.0);
}
Node {
id: pointLightContainer
}
}
}
}