qtdoc/examples/demos/xr_physicsbase_teleportation/FireResources.qml

104 lines
2.9 KiB
QML

// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
pragma Singleton
import QtQuick
import QtQuick3D
import QtMultimedia
import QtQuick3D.Helpers
Node {
property alias fireVideo: video_out
property alias fireMesh: fire_mesh
VideoOutput {
id: video_out
fillMode: VideoOutput.Stretch
width: 512
height: 512
visible: false
MediaPlayer {
id: player
source: "media/textures/fire.mp4"
loops: MediaPlayer.Infinite
autoPlay: true
videoOutput: FireResources.fireVideo
}
}
ProceduralMesh {
id: fire_mesh
Component.onCompleted: {
generateMesh()
}
function generateMesh() {
let verts = []
let uvs = []
let indices = []
let colrs = []
const xOffset = 0.
const zOffset = 0.
const countX = 5.
const countZ = 5.
const segments = 30.
const height = 100.
const thickness = 100.
const thicknessHalf = thickness * 0.5
const segmentHeight = height / segments
let pos = Qt.vector3d(0, 0, 0)
let index = 0
let blade = 0.0;
for (var xx = 0.; xx < countX; ++xx) {
for (var zz = 0.; zz < countZ; ++zz) {
pos.x = xx * xOffset
pos.z = zz * zOffset
const xxNorm = xx / countX
const zzNorm = zz / countZ
const fBlade = blade / (countX*countZ)
++blade
for (var ss = 0.; ss <= segments; ++ss) {
const uvY = ss / segments
const posLX = pos.x - thicknessHalf
const posLY = segmentHeight * ss + pos.y
const posLZ = pos.z
verts.push(Qt.vector3d(posLX, posLY, posLZ));
uvs.push(Qt.vector2d(0, uvY))
colrs.push(Qt.vector4d(fBlade, 0, xxNorm, zzNorm))
const posRX = pos.x + thicknessHalf
const posRY = segmentHeight * ss + pos.y
const posRZ = pos.z
verts.push(Qt.vector3d(posRX, posRY, posRZ));
uvs.push(Qt.vector2d(1.0, uvY))
colrs.push(Qt.vector4d(fBlade, 0, xxNorm, zzNorm))
if (ss < segments) {
indices.push(index, index + 1, index + 2)
indices.push(index + 2, index + 1, index + 3)
}
index += 2
}
}
}
positions = verts
uv0s = uvs
colors = colrs
indexes = indices
}
}
}