1// Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB).
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "qspritesheet.h"
5#include "qspritesheetitem.h"
6#include "qspritesheet_p.h"
7
8#include <Qt3DRender/qabstracttexture.h>
9
10QT_BEGIN_NAMESPACE
11
12
13namespace Qt3DExtras {
14
15using namespace Qt3DCore;
16
17QSpriteSheetPrivate::QSpriteSheetPrivate()
18 : QAbstractSpriteSheetPrivate()
19{
20}
21
22int QSpriteSheetPrivate::maxIndex() const
23{
24 return m_sprites.size() - 1;
25}
26
27void QSpriteSheetPrivate::updateSizes()
28{
29 Q_Q(QSpriteSheet);
30 if (m_texture)
31 m_textureSize = QSize(m_texture->width(), m_texture->height());
32 else
33 m_textureSize = QSize();
34
35 if (m_textureSize.isEmpty() || m_sprites.isEmpty()) {
36 if (m_currentIndex != -1) {
37 m_currentIndex = -1;
38 emit q->currentIndexChanged(currentIndex: m_currentIndex);
39 }
40 m_textureTransform.setToIdentity();
41 emit q->textureTransformChanged(textureTransform: m_textureTransform);
42 return;
43 }
44
45 if (m_currentIndex < 0 || m_currentIndex >= m_sprites.size()) {
46 m_currentIndex = 0;
47 emit q->currentIndexChanged(currentIndex: m_currentIndex);
48 }
49 updateTransform();
50}
51
52void QSpriteSheetPrivate::updateTransform()
53{
54 Q_Q(QSpriteSheet);
55 if (m_currentIndex < 0 || m_currentIndex >= m_sprites.size())
56 return;
57
58 const QSpriteSheetItem *r = m_sprites.at(i: m_currentIndex);
59 const float xScale = static_cast<float>(r->width()) / static_cast<float>(m_textureSize.width());
60 const float yScale = static_cast<float>(r->height()) / static_cast<float>(m_textureSize.height());
61
62 const float xTranslate = static_cast<float>(r->x()) / static_cast<float>(m_textureSize.width());
63 const float yTranslate = static_cast<float>(r->y()) / static_cast<float>(m_textureSize.height());
64
65 m_textureTransform.setToIdentity();
66 m_textureTransform(0, 0) = xScale;
67 m_textureTransform(1, 1) = yScale;
68 m_textureTransform(0, 2) = xTranslate;
69 m_textureTransform(1, 2) = yTranslate;
70 emit q->textureTransformChanged(textureTransform: m_textureTransform);
71}
72
73/*!
74 Constructs a new QSpriteSheet instance with parent object \a parent.
75 */
76QSpriteSheet::QSpriteSheet(QNode *parent)
77 : QAbstractSpriteSheet(*new QSpriteSheetPrivate, parent)
78{
79}
80
81QSpriteSheet::~QSpriteSheet()
82{
83}
84
85QList<QSpriteSheetItem *> QSpriteSheet::sprites() const
86{
87 Q_D(const QSpriteSheet);
88 return d->m_sprites;
89}
90
91QSpriteSheetItem *QSpriteSheet::addSprite(int x, int y, int width, int height)
92{
93 QSpriteSheetItem *item = new QSpriteSheetItem(this);
94 item->setX(x);
95 item->setX(y);
96 item->setWidth(width);
97 item->setHeight(height);
98 addSprite(sprite: item);
99 return item;
100}
101
102void QSpriteSheet::addSprite(QSpriteSheetItem *sprite)
103{
104 Q_ASSERT(sprite);
105 Q_D(QSpriteSheet);
106 if (!d->m_sprites.contains(t: sprite)) {
107 d->m_sprites << sprite;
108
109 // Ensures proper bookkeeping
110 d->registerDestructionHelper(node: sprite, func: &QSpriteSheet::removeSprite, d->m_sprites);
111 if (!sprite->parent())
112 sprite->setParent(this);
113
114 emit spritesChanged(sprites: d->m_sprites);
115 d->updateSizes();
116 }
117}
118
119void QSpriteSheet::removeSprite(QSpriteSheetItem *sprite)
120{
121 Q_ASSERT(sprite);
122 Q_D(QSpriteSheet);
123 d->m_sprites.removeOne(t: sprite);
124 // Remove bookkeeping connection
125 d->unregisterDestructionHelper(node: sprite);
126}
127
128void QSpriteSheet::setSprites(QList<QSpriteSheetItem *> sprites)
129{
130 Q_D(QSpriteSheet);
131 d->m_sprites = sprites;
132 emit spritesChanged(sprites);
133 d->updateSizes();
134}
135
136} // namespace Qt3DExtras
137
138QT_END_NAMESPACE
139
140#include "moc_qspritesheet.cpp"
141

Provided by KDAB

Privacy Policy
Learn to use CMake with our Intro Training
Find out more

source code of qt3d/src/extras/defaults/qspritesheet.cpp