qtdoc/examples/demos/xr_physicsbase_teleportation/Fire.qml

86 lines
2.2 KiB
QML
Raw Normal View History

// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
import QtQuick
import QtQuick3D
import QtQuick3D.Helpers
import QtMultimedia
Node {
id: fire
scale: Qt.vector3d(1, 1, 1)
property alias windDir: material.windDir
property alias windstrength: material.windstrength
property alias fireColor: material.color
property alias lightColor: light.color
property alias baseSize: material.baseSize
property real brightness: 10
property real life: 0
readonly property bool isOn: (life > 0)
function start() {
life = 1
}
function stop() {
life = 0
}
Behavior on life {
NumberAnimation {
duration: 500
easing.type: Easing.OutBack
}
}
CustomMaterial {
id: material
shadingMode: CustomMaterial.Unshaded
sourceBlend: CustomMaterial.One
destinationBlend: CustomMaterial.OneMinusSrcColor
sourceAlphaBlend: CustomMaterial.One
destinationAlphaBlend: CustomMaterial.OneMinusSrcColor
cullMode: Material.NoCulling
vertexShader: "media/shaders/fire.vert"
fragmentShader: "media/shaders/fire.frag"
property real time: 0
property color color: "white"
property real baseSize: 0
FrameAnimation {
id: frameAnimation
running: true
onTriggered: {
material.time += 0.1 * frameTime
}
}
property real windstrength: 1.0
property vector2d windDir: Qt.vector2d(0.5, 0.5);
property TextureInput fireTexture : TextureInput {
texture: Texture {
sourceItem: FireResources.fireVideo
}
}
property TextureInput turbulence : TextureInput {
texture: CommonResources.turbulenceTexture
}
}
PointLight {
id: light
brightness:fire.brightness * fire.life + 0.01
color: "orange"
}
Model {
visible: fire.isOn
materials: [
material
]
opacity: Math.min(1., fire.life)
scale: Qt.vector3d(fire.life, fire.life, fire.life)
geometry: FireResources.fireMesh
}
}