1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
4#include "qquick3dparticlevectordirection_p.h"
5#include "qquick3dparticlerandomizer_p.h"
6#include "qquick3dparticlesystem_p.h"
7
8QT_BEGIN_NAMESPACE
9
10/*!
11 \qmltype VectorDirection3D
12 \inherits Direction3D
13 \inqmlmodule QtQuick3D.Particles3D
14 \brief For specifying a direction towards the target direction.
15 \since 6.2
16
17 This element sets emitted particle velocity towards the target direction vector.
18 The length of the direction vector is used as the velocity magnitude.
19
20 For example, to emit particles towards some random direction within
21 x: 50..150, y: -20..20, z: 0:
22
23 \qml
24 ParticleEmitter3D {
25 ...
26 velocity: VectorDirection3D {
27 direction: Qt.vector3d(100, 0, 0)
28 directionVariation: Qt.vector3d(50, 20, 0)
29 }
30 }
31 \endqml
32
33*/
34
35QQuick3DParticleVectorDirection::QQuick3DParticleVectorDirection(QObject *parent)
36 : QQuick3DParticleDirection(parent)
37{
38}
39
40/*!
41 \qmlproperty vector3d VectorDirection3D::direction
42
43 This property defines the direction for particles target.
44
45 The default value is \c (0, 100, 0) (upwards on the y-axis).
46
47 \sa directionVariation
48*/
49QVector3D QQuick3DParticleVectorDirection::direction() const
50{
51 return m_direction;
52}
53
54/*!
55 \qmlproperty vector3d VectorDirection3D::directionVariation
56
57 This property defines the direction variation for particles target.
58
59 The default value is \c (0, 0, 0) (no variation).
60
61 \sa direction
62*/
63QVector3D QQuick3DParticleVectorDirection::directionVariation() const
64{
65 return m_directionVariation;
66}
67
68/*!
69 \qmlproperty bool VectorDirection3D::normalized
70
71 This property defines if the direction should be normalized after applying the variation.
72 When this is false, variation affects the magnitude of the particles velocity.
73 When set to true, variation affects the direction, but the magnitude is determined
74 by the original direction length.
75
76 The default value is \c false.
77*/
78bool QQuick3DParticleVectorDirection::normalized() const
79{
80 return m_normalized;
81}
82
83void QQuick3DParticleVectorDirection::setDirection(const QVector3D &direction)
84{
85 if (m_direction == direction)
86 return;
87
88 m_direction = direction;
89 Q_EMIT directionChanged();
90}
91
92void QQuick3DParticleVectorDirection::setDirectionVariation(const QVector3D &directionVariation)
93{
94 if (m_directionVariation == directionVariation)
95 return;
96
97 m_directionVariation = directionVariation;
98 Q_EMIT directionVariationChanged();
99}
100
101void QQuick3DParticleVectorDirection::setNormalized(bool normalized)
102{
103 if (m_normalized == normalized)
104 return;
105
106 m_normalized = normalized;
107 Q_EMIT normalizedChanged();
108}
109
110QVector3D QQuick3DParticleVectorDirection::sample(const QQuick3DParticleData &d)
111{
112 QVector3D ret;
113 if (!m_system)
114 return ret;
115 auto rand = m_system->rand();
116 ret.setX(m_direction.x() - m_directionVariation.x() + rand->get(particleIndex: d.index, user: QPRand::VDirXV) * m_directionVariation.x() * 2.0f);
117 ret.setY(m_direction.y() - m_directionVariation.y() + rand->get(particleIndex: d.index, user: QPRand::VDirYV) * m_directionVariation.y() * 2.0f);
118 ret.setZ(m_direction.z() - m_directionVariation.z() + rand->get(particleIndex: d.index, user: QPRand::VDirZV) * m_directionVariation.z() * 2.0f);
119 if (m_normalized)
120 ret = m_direction.length() * ret.normalized();
121 return ret;
122}
123
124QT_END_NAMESPACE
125

source code of qtquick3d/src/quick3dparticles/qquick3dparticlevectordirection.cpp