Revision control
Copy as Markdown
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Controls
import QtQuick3D
import QtQuick3D.Particles3D
import QtQuick3D.Helpers
Item {
id: mainWindow
anchors.fill: parent
property color fireColor: "#fdb597"
View3D {
id: view3D
anchors.fill: parent
camera: PerspectiveCamera {
position: Qt.vector3d(0, 100, 300)
}
environment: SceneEnvironment {
clearColor: "#000000"
backgroundMode: SceneEnvironment.Color
antialiasingMode: AppSettings.antialiasingMode
antialiasingQuality: AppSettings.antialiasingQuality
oitMethod: SceneEnvironment.OITLinkedList
}
Node {
id: sceneRoot
PointLight {
id: pointLight
position: Qt.vector3d(0, 100, 0)
color: mainWindow.fireColor
brightness: 60
castsShadow: true
SequentialAnimation {
loops: NumberAnimation.Infinite
running: true
NumberAnimation {
target: pointLight
property: "brightness"
from: 60
to: 80
duration: 400
}
NumberAnimation {
target: pointLight
property: "brightness"
from: 80
to: 60
duration: 400
}
}
SequentialAnimation {
loops: NumberAnimation.Infinite
running: true
NumberAnimation {
target: pointLight
property: "position.x"
from: -1
to: 1
duration: 100
}
NumberAnimation {
target: pointLight
property: "position.x"
from: 1
to: -1
duration: 100
}
}
}
Model {
source: "#Rectangle"
scale: Qt.vector3d(10, 10, 1)
position: Qt.vector3d(0,-10, -200)
eulerRotation.x: -89
materials: PrincipledMaterial {
baseColor: "gray"
}
}
Model {
source: "#Sphere"
scale: Qt.vector3d(3, 0.01, 3)
position: Qt.vector3d(0, -9, -30)
materials: PrincipledMaterial {
baseColor: "#979797"
lighting: PrincipledMaterial.NoLighting
baseColorMap: Texture {
source: "images/firestone.png"
}
}
}
FireStone {
stoneSize: 3
position: Qt.vector3d(-0, 0, -200)
}
FireStone {
stoneSize: 3
position: Qt.vector3d(-100, 20, -175)
stoneRotationZ: 45
stoneRotationY: 160
}
FireStone {
stoneSize: 3
position: Qt.vector3d(-150, 0, -10)
stoneRotationZ: 90
}
FireStone {
stoneSize: 3
position: Qt.vector3d(-100, -20, 80)
stoneRotationZ: 45
}
FireStone {
stoneSize: 3
position: Qt.vector3d(80, -20, 80)
stoneRotationZ: -35
}
FireStone {
stoneSize: 3
position: Qt.vector3d(150, 0, -40)
stoneRotationZ: 90
}
FireStick {
id: fs1
stickSize: 3
stickRotationZ: 20
stickRotationX: 10
position: Qt.vector3d(-50, 0, 0)
}
FireStick {
id: fs2
stickSize: 2.5
stickRotationZ: 170
stickRotationX: 10
position: Qt.vector3d(50, 0, 0)
glowFactor: 1.0 + Math.random() * 1.5
}
FireStick {
id: fs3
stickSize: 3
stickRotationZ: 0
stickRotationY: 90
position: Qt.vector3d(0, 0, -50)
glowFactor: 1.0 + Math.random() * 1.5
}
FireStick {
stickSize: 2.3
stickRotationZ: 0
stickRotationY: 85
position: Qt.vector3d(0, 0, 50)
glowFactor: 1.0 + Math.random() * 1.5
}
FireStick {
stickSize: 2
stickRotationZ: -20
stickRotationY: 145
position: Qt.vector3d(25, 0, 25)
glowFactor: 1.0 + Math.random() * 1.5
}
FireStick {
id: fs4
stickSize: 2
stickRotationZ: 40
stickRotationY: 65
position: Qt.vector3d(-25, 10, 25)
glowFactor: 1.0 + Math.random() * 1.5
}
FireStick {
stickSize: 1
stickRotationZ: 0
stickRotationY: 65
position: Qt.vector3d(-15, 0, 55)
glowFactor: 1.0 + Math.random() * 1.5
}
}
Model {
id: rm
source: "#Sphere"
position: test.position
scale: Qt.vector3d(test.outerRadius / 100, test.outerRadius / 100, test.outerRadius / 100)
materials : [
PrincipledMaterial {
}
]
}
ParticleSystem3D {
id: system
running: true
startTime: 1000
Repeller3D {
id: rp1
position: Qt.vector3d(-10, 15, 5)
radius: 5
outerRadius: 10
strength: 20
}
Repeller3D {
id: rp2
position: Qt.vector3d(-15, 28, 5)
radius: 5
outerRadius: 10
strength: 20
}
Repeller3D {
id: rp3
position: Qt.vector3d(5, 5, 0)
radius: 5
outerRadius: 10
strength: 20
}
Repeller3D {
id: rp4
position: Qt.vector3d(3, 0, 20)
radius: 5
outerRadius: 10
strength: 20
}
Repeller3D {
id: rp5
position: Qt.vector3d(20, 5, 0)
radius: 5
outerRadius: 10
strength: 20
}
Repeller3D {
id: test
position: Qt.vector3d(35, 2, 0)
radius: 5
outerRadius: 10
strength: 20
}
SpriteParticle3D {
id: sparkle
particleScale: 1
maxAmount: 20
fadeInEffect: Particle3D.FadeNone
fadeOutEffect: Particle3D.FadeNone
color: mainWindow.fireColor
}
RandomEmitter {
particle: sparkle
lifeSpan: 500
minTime: 500
timeVariance: 2500
running: true
positionVariance: Qt.vector3d(40, 0, 40)
velocity: VectorDirection3D {
direction: Qt.vector3d(0, 200, 0)
directionVariation: Qt.vector3d(40, 20, 40)
}
position: Qt.vector3d(0, 0, 0)
}
SpriteParticle3D {
id: fire
sprite: Texture {
source: "images/flame.png"
}
colorTable: Texture {
source: "images/color_table3.png"
}
maxAmount: 7000
particleScale: 3
color: mainWindow.fireColor
colorVariation: Qt.vector4d(0.0, 0.0, 0.0, 0.4)
}
function firePos(idx)
{
var r = idx * 0.4;
var a = 2.0 * Math.PI * (idx % 10) / 10.0
var x = r * Math.cos(a)
var z = r * Math.sin(a)
return Qt.vector3d(x, 0, z)
}
function fireSize(idx, total)
{
var r = idx * 0.4;
var maxR = total * 0.4
return 1.0 - (r / maxR) + 0.5
}
Repeater3D {
model: 120
FireParticles {
required property int index
ps: system
particle: fire
size: system.fireSize(index, 120)
position: system.firePos(index)
}
}
}
}
Pane {
anchors.top: view3D.top
anchors.right: parent.right
Label {
id: debugViewToggleText
text: dbg.visible ? "Hide DebugView" : "Show DebugView"
anchors.right: parent.right
anchors.top: parent.top
MouseArea {
anchors.fill: parent
onClicked: dbg.visible = !dbg.visible
DebugView {
y: debugViewToggleText.height * 2
anchors.right: parent.right
source: view3D
id: dbg
visible: false
}
}
}
}
}