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 "qspritegrid.h"
5#include "qspritegrid_p.h"
6
7#include <Qt3DRender/qabstracttexture.h>
8
9QT_BEGIN_NAMESPACE
10
11
12namespace Qt3DExtras {
13
14using namespace Qt3DCore;
15
16QSpriteGridPrivate::QSpriteGridPrivate()
17 : QAbstractSpriteSheetPrivate()
18 , m_numColumns(1)
19 , m_numRows(1)
20{
21}
22
23int QSpriteGridPrivate::maxIndex() const
24{
25 return m_numColumns * m_numRows - 1;
26}
27
28void QSpriteGridPrivate::updateSizes()
29{
30 Q_Q(QSpriteGrid);
31 if (m_texture && m_numColumns && m_numRows) {
32 m_textureSize = QSize(m_texture->width(), m_texture->height());
33 m_cellSize = QSizeF((float) m_texture->width() / m_numColumns, (float) m_texture->height() / m_numRows);
34 } else {
35 m_textureSize = QSize();
36 m_cellSize = QSizeF();
37 }
38
39 if (m_cellSize.isEmpty() || m_numColumns == 0 || m_numRows == 0) {
40 if (m_currentIndex != -1) {
41 m_currentIndex = -1;
42 emit q->currentIndexChanged(currentIndex: m_currentIndex);
43 }
44 m_textureTransform.setToIdentity();
45 emit q->textureTransformChanged(textureTransform: m_textureTransform);
46 return;
47 }
48
49 if (m_currentIndex == -1) {
50 m_currentIndex = 0;
51 emit q->currentIndexChanged(currentIndex: m_currentIndex);
52 }
53 updateTransform();
54}
55
56void QSpriteGridPrivate::updateTransform()
57{
58 Q_Q(QSpriteGrid);
59 const float xScale = (float) m_cellSize.width() / (float) m_textureSize.width();
60 const float yScale = (float) m_cellSize.height() / (float) m_textureSize.height();
61
62 const int currentRow = m_currentIndex / m_numColumns;
63 const int currentColumn = m_currentIndex % m_numColumns;
64 const float xTranslate = currentColumn * xScale;
65 const float yTranslate = currentRow * yScale;
66
67 m_textureTransform.setToIdentity();
68 m_textureTransform(0, 0) = xScale;
69 m_textureTransform(1, 1) = yScale;
70 m_textureTransform(0, 2) = xTranslate;
71 m_textureTransform(1, 2) = yTranslate;
72 emit q->textureTransformChanged(textureTransform: m_textureTransform);
73}
74
75/*!
76 Constructs a new QSpriteGrid instance with parent object \a parent.
77 */
78QSpriteGrid::QSpriteGrid(QNode *parent)
79 : QAbstractSpriteSheet(*new QSpriteGridPrivate, parent)
80{
81}
82
83QSpriteGrid::~QSpriteGrid()
84{
85}
86
87int QSpriteGrid::rows() const
88{
89 Q_D(const QSpriteGrid);
90 return d->m_numRows;
91}
92
93void QSpriteGrid::setRows(int rows)
94{
95 Q_D(QSpriteGrid);
96 if (d->m_numRows != rows) {
97 d->m_numRows = rows;
98 d->updateSizes();
99 emit rowsChanged(rows);
100 }
101}
102
103int QSpriteGrid::columns() const
104{
105 Q_D(const QSpriteGrid);
106 return d->m_numColumns;
107}
108
109void QSpriteGrid::setColumns(int columns)
110{
111 Q_D(QSpriteGrid);
112 if (d->m_numColumns != columns) {
113 d->m_numColumns = columns;
114 d->updateSizes();
115 emit columnsChanged(columns);
116 }
117}
118
119} // namespace Qt3DExtras
120
121QT_END_NAMESPACE
122
123#include "moc_qspritegrid.cpp"
124

Provided by KDAB

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

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