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
qquickspritesequence.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
6#include "qquicksprite_p.h"
8#include <QtQuick/private/qsgcontext_p.h>
9#include <private/qsgadaptationlayer_p.h>
10#include <QtQuick/qsgnode.h>
11#include <QtQuick/qsgtexturematerial.h>
12#include <QtQuick/qsgtexture.h>
13#include <QtQuick/qquickwindow.h>
14#include <QtQml/qqmlinfo.h>
15#include <QFile>
16#include <cmath>
17#include <qmath.h>
18#include <QDebug>
19
21
80//TODO: Implicitly size element to size of first sprite?
88
90{
92 if (!d->m_spriteEngine)
93 return;
94 d->m_spriteEngine->setGoal(d->m_spriteEngine->stateIndex(sprite), 0, true);
95}
96
98{
100 if (d->m_goalState != sprite){
101 d->m_goalState = sprite;
102 emit goalSpriteChanged(sprite);
103 if (d->m_spriteEngine)
104 d->m_spriteEngine->setGoal(d->m_spriteEngine->stateIndex(sprite));
105 }
106}
107
109{
111 if (d->m_running != arg) {
112 d->m_running = arg;
114 }
115}
116
118{
120 if (d->m_interpolate != arg) {
121 d->m_interpolate = arg;
123 }
124}
125
126QQmlListProperty<QQuickSprite> QQuickSpriteSequence::sprites()
127{
129 return QQmlListProperty<QQuickSprite>(this, &d->m_sprites,
132}
133
135{
136 Q_D(const QQuickSpriteSequence);
137 return d->m_running;
138}
139
141{
142 Q_D(const QQuickSpriteSequence);
143 return d->m_interpolate;
144}
145
147{
148 Q_D(const QQuickSpriteSequence);
149 return d->m_goalState;
150}
151
153{
154 Q_D(const QQuickSpriteSequence);
155 return d->m_curState;
156}
157
158void QQuickSpriteSequence::createEngine()
159{
161 //TODO: delay until component complete
162 if (d->m_spriteEngine)
163 delete d->m_spriteEngine;
164 if (d->m_sprites.size()) {
165 d->m_spriteEngine = new QQuickSpriteEngine(d->m_sprites, this);
166 if (!d->m_goalState.isEmpty())
167 d->m_spriteEngine->setGoal(d->m_spriteEngine->stateIndex(d->m_goalState));
168 } else {
169 d->m_spriteEngine = nullptr;
170 }
171 reset();
172}
173
174QSGSpriteNode *QQuickSpriteSequence::initNode()
175{
177
178 if (!d->m_spriteEngine) {
179 qmlWarning(this) << "No sprite engine...";
180 return nullptr;
181 } else if (d->m_spriteEngine->status() == QQuickPixmap::Null) {
182 d->m_spriteEngine->startAssemblingImage();
183 update();//Schedule another update, where we will check again
184 return nullptr;
185 } else if (d->m_spriteEngine->status() == QQuickPixmap::Loading) {
186 update();//Schedule another update, where we will check again
187 return nullptr;
188 }
189
190 QImage image = d->m_spriteEngine->assembledImage(d->sceneGraphRenderContext()->maxTextureSize());
191 if (image.isNull())
192 return nullptr;
193
194 QSGSpriteNode *node = d->sceneGraphContext()->createSpriteNode();
195
196 d->m_sheetSize = QSize(image.size() / image.devicePixelRatio());
197 node->setTexture(window()->createTextureFromImage(image));
198 d->m_spriteEngine->start(0);
199 node->setTime(0.0f);
200 node->setSourceA(QPoint(d->m_spriteEngine->spriteX(), d->m_spriteEngine->spriteY()));
201 node->setSourceB(QPoint(d->m_spriteEngine->spriteX(), d->m_spriteEngine->spriteY()));
202 node->setSpriteSize(QSize(d->m_spriteEngine->spriteWidth(), d->m_spriteEngine->spriteHeight()));
203 node->setSheetSize(d->m_sheetSize);
204 node->setSize(QSizeF(width(), height()));
205
206 d->m_curState = d->m_spriteEngine->state(d->m_spriteEngine->curState())->name();
207 emit currentSpriteChanged(d->m_curState);
208 d->m_timestamp.start();
209 return node;
210}
211
213{
215 d->m_pleaseReset = true;
216}
217
219{
221
222 if (d->m_pleaseReset) {
223 delete oldNode;
224
225 oldNode = nullptr;
226 d->m_pleaseReset = false;
227 }
228
229 QSGSpriteNode *node = static_cast<QSGSpriteNode *>(oldNode);
230 if (!node)
231 node = initNode();
232
233 if (node)
234 prepareNextFrame(node);
235
236 if (d->m_running) {
237 update();
238 }
239
240 return node;
241}
242
243void QQuickSpriteSequence::prepareNextFrame(QSGSpriteNode *node)
244{
246
247 uint timeInt = d->m_timestamp.elapsed();
248 qreal time = timeInt / 1000.;
249
250 //Advance State
251 d->m_spriteEngine->updateSprites(timeInt);
252 if (d->m_curStateIdx != d->m_spriteEngine->curState()) {
253 d->m_curStateIdx = d->m_spriteEngine->curState();
254 d->m_curState = d->m_spriteEngine->state(d->m_spriteEngine->curState())->name();
255 emit currentSpriteChanged(d->m_curState);
256 d->m_curFrame= -1;
257 }
258
259 //Advance Sprite
260 qreal animT = d->m_spriteEngine->spriteStart()/1000.0;
261 qreal frameCount = d->m_spriteEngine->spriteFrames();
262 qreal frameDuration = d->m_spriteEngine->spriteDuration()/frameCount;
263 double frameAt;
264 qreal progress;
265 if (frameDuration > 0) {
266 qreal frame = (time - animT)/(frameDuration / 1000.0);
267 frame = qBound(qreal(0.0), frame, frameCount - qreal(1.0));//Stop at count-1 frames until we have between anim interpolation
268 progress = std::modf(frame,&frameAt);
269 } else {
270 d->m_curFrame++;
271 if (d->m_curFrame >= frameCount){
272 d->m_curFrame = 0;
273 d->m_spriteEngine->advance();
274 }
275 frameAt = d->m_curFrame;
276 progress = 0;
277 }
278 if (d->m_spriteEngine->sprite()->reverse())
279 frameAt = (d->m_spriteEngine->spriteFrames() - 1) - frameAt;
280 int y = d->m_spriteEngine->spriteY();
281 int w = d->m_spriteEngine->spriteWidth();
282 int h = d->m_spriteEngine->spriteHeight();
283 int x1 = d->m_spriteEngine->spriteX();
284 x1 += frameAt * w;
285 int x2 = x1;
286 if (frameAt < (frameCount-1))
287 x2 += w;
288
289 node->setSourceA(QPoint(x1, y));
290 node->setSourceB(QPoint(x2, y));
291 node->setSpriteSize(QSize(w, h));
292 node->setTime(d->m_interpolate ? progress : 0.0);
293 node->setSize(QSizeF(width(), height()));
294 node->setFiltering(smooth() ? QSGTexture::Linear : QSGTexture::Nearest);
295 node->update();
296}
297
299
300#include "moc_qquickspritesequence_p.cpp"
\inmodule QtGui
Definition qimage.h:37
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
Definition qobject.cpp:2960
\inmodule QtCore\reentrant
Definition qpoint.h:25
The QQuickItem class provides the most basic of all visual items in \l {Qt Quick}.
Definition qquickitem.h:63
void setFlag(Flag flag, bool enabled=true)
Enables the specified flag for this item if enabled is true; if enabled is false, the flag is disable...
QQuickWindow * window() const
Returns the window in which this item is rendered.
qreal width
This property holds the width of this item.
Definition qquickitem.h:75
bool smooth
\qmlproperty bool QtQuick::Item::smooth
Definition qquickitem.h:112
qreal height
This property holds the height of this item.
Definition qquickitem.h:76
void update()
Schedules a call to updatePaintNode() for this item.
void goalSpriteChanged(const QString &arg)
void jumpTo(const QString &sprite)
void setGoalSprite(const QString &sprite)
QQuickSpriteSequence(QQuickItem *parent=nullptr)
\qmltype SpriteSequence \instantiates QQuickSpriteSequence \inqmlmodule QtQuick\inherits Item
QSGNode * updatePaintNode(QSGNode *, UpdatePaintNodeData *) override
Called on the render thread when it is time to sync the state of the item with the scene graph.
void interpolateChanged(bool arg)
void currentSpriteChanged(const QString &arg)
QQmlListProperty< QQuickSprite > sprites
void runningChanged(bool arg)
\group qtquick-scenegraph-nodes \title Qt Quick Scene Graph Node classes
Definition qsgnode.h:37
\inmodule QtQuick
Definition qsgtexture.h:20
\inmodule QtCore
Definition qsize.h:208
\inmodule QtCore
Definition qsize.h:25
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
Combined button and popup list for selecting options.
Definition image.cpp:4
constexpr const T & qBound(const T &min, const T &val, const T &max)
Definition qminmax.h:44
#define SLOT(a)
Definition qobjectdefs.h:52
#define SIGNAL(a)
Definition qobjectdefs.h:53
GLfloat GLfloat GLfloat w
[0]
GLuint GLfloat GLfloat GLfloat x1
GLint y
GLfloat GLfloat GLfloat GLfloat h
GLfixed GLfixed x2
Q_QML_EXPORT QQmlInfo qmlWarning(const QObject *me)
void spriteReplace(QQmlListProperty< QQuickSprite > *p, qsizetype idx, QQuickSprite *s)
void spriteAppend(QQmlListProperty< QQuickSprite > *p, QQuickSprite *s)
void spriteRemoveLast(QQmlListProperty< QQuickSprite > *p)
qsizetype spriteCount(QQmlListProperty< QQuickSprite > *p)
QQuickSprite * spriteAt(QQmlListProperty< QQuickSprite > *p, qsizetype idx)
void spriteClear(QQmlListProperty< QQuickSprite > *p)
SSL_CTX int void * arg
#define Q_EMIT
#define emit
unsigned int uint
Definition qtypes.h:34
double qreal
Definition qtypes.h:187
QFrame frame
[0]