Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qquick3dparticlescaleaffector.cpp
Go to the documentation of this file.
1// Copyright (C) 2022 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
5#include <qmath.h>
6
8
24
32{
33 return m_minSize;
34}
35
43{
44 return m_maxSize;
45}
46
54{
55 return m_duration;
56}
57
90
99{
100 return m_easing;
101}
102
104{
105 if (qFuzzyCompare(size, m_minSize))
106 return;
107 m_minSize = size;
109}
110
112{
113 if (qFuzzyCompare(size, m_maxSize))
114 return;
115 m_maxSize = size;
117}
118
120{
121 duration = qMax(0, duration);
122 if (duration == m_duration)
123 return;
124 m_duration = duration;
126}
127
129{
130 if (m_type == type)
131 return;
132 m_type = type;
134}
135
137{
138 if (m_easing == curve)
139 return;
140 m_easing = curve;
142}
143
148
150{
151 float scale = 1.0f;
152
153 const auto fract = [](const float v) -> float {
154 return v - qFloor(v);
155 };
156 const auto lerp = [](const float a, const float b, const float f) -> float {
157 return a + (b - a) * f;
158 };
159 const auto smoothstep = [](const float a, const float b, const float f) -> float {
160 return a + (b - a) * f * f * (3.0f - 2.0f * f);
161 };
162
163 float pos = fract(time / float(m_duration * 0.001f));
164 switch (m_type) {
165 case Linear:
166 scale = lerp(m_minSize, m_maxSize, m_easing.valueForProgress(pos));
167 scale = qMax(scale, 0.0f);
168 break;
169 case SewSaw:
170 if (pos < 0.5f)
171 scale = lerp(m_minSize, m_maxSize, m_easing.valueForProgress(pos * 2.0f));
172 else
173 scale = lerp(m_maxSize, m_minSize, m_easing.valueForProgress((pos - 0.5) * 2.0f));
174 scale = qMax(scale, 0.0f);
175 break;
176 case SineWave:
177 scale = m_minSize + (m_maxSize - m_minSize) * (1.0f + qSin(2.0f * M_PI * pos)) * 0.5f;
178 break;
179 case AbsSineWave:
180 scale = m_minSize + (m_maxSize - m_minSize) * qAbs(qSin(2.0f * M_PI * pos));
181 break;
182 case Step:
183 if (pos < 0.5f)
184 scale = m_minSize;
185 else
186 scale = m_maxSize;
187 break;
188 case SmoothStep:
189 scale = smoothstep(m_minSize, m_maxSize, pos);
190 break;
191 }
192
193 d->scale *= scale;
194}
195
\inmodule QtCore
qreal valueForProgress(qreal progress) const
Return the effective progress for the easing curve at progress.
QVector3D scale
QQuick3DParticleScaleAffector(QQuick3DNode *parent=nullptr)
\qmltype ScaleAffector3D \inherits Affector3D \inqmlmodule QtQuick3D.Particles3D
void setEasingCurve(const QEasingCurve &curve)
void affectParticle(const QQuick3DParticleData &, QQuick3DParticleDataCurrent *d, float time) override
Combined button and popup list for selecting options.
bool qFuzzyCompare(qfloat16 p1, qfloat16 p2) noexcept
Definition qfloat16.h:333
int qFloor(T v)
Definition qmath.h:42
#define M_PI
Definition qmath.h:209
auto qSin(T v)
Definition qmath.h:54
constexpr const T & qMax(const T &a, const T &b)
Definition qminmax.h:42
constexpr T qAbs(const T &t)
Definition qnumeric.h:328
GLboolean GLboolean GLboolean b
GLsizei const GLfloat * v
[13]
GLboolean GLboolean GLboolean GLboolean a
[7]
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLfloat GLfloat f
GLenum type
GLenum GLenum GLenum GLenum GLenum scale
#define Q_EMIT