1/****************************************************************************
2**
3** Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB).
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the Qt3D module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU Lesser General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU Lesser
19** General Public License version 3 as published by the Free Software
20** Foundation and appearing in the file LICENSE.LGPL3 included in the
21** packaging of this file. Please review the following information to
22** ensure the GNU Lesser General Public License version 3 requirements
23** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24**
25** GNU General Public License Usage
26** Alternatively, this file may be used under the terms of the GNU
27** General Public License version 2.0 or (at your option) the GNU General
28** Public license version 3 or any later version approved by the KDE Free
29** Qt Foundation. The licenses are as published by the Free Software
30** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31** included in the packaging of this file. Please review the following
32** information to ensure the GNU General Public License requirements will
33** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34** https://www.gnu.org/licenses/gpl-3.0.html.
35**
36** $QT_END_LICENSE$
37**
38****************************************************************************/
39
40#include "qspritegrid.h"
41#include "qspritegrid_p.h"
42
43#include <Qt3DRender/qabstracttexture.h>
44
45QT_BEGIN_NAMESPACE
46
47using namespace Qt3DCore;
48
49namespace Qt3DExtras {
50
51QSpriteGridPrivate::QSpriteGridPrivate()
52 : QAbstractSpriteSheetPrivate()
53 , m_numColumns(1)
54 , m_numRows(1)
55{
56}
57
58int QSpriteGridPrivate::maxIndex() const
59{
60 return m_numColumns * m_numRows - 1;
61}
62
63void QSpriteGridPrivate::updateSizes()
64{
65 Q_Q(QSpriteGrid);
66 if (m_texture && m_numColumns && m_numRows) {
67 m_textureSize = QSize(m_texture->width(), m_texture->height());
68 m_cellSize = QSizeF((float) m_texture->width() / m_numColumns, (float) m_texture->height() / m_numRows);
69 } else {
70 m_textureSize = QSize();
71 m_cellSize = QSizeF();
72 }
73
74 if (m_cellSize.isEmpty() || m_numColumns == 0 || m_numRows == 0) {
75 if (m_currentIndex != -1) {
76 m_currentIndex = -1;
77 emit q->currentIndexChanged(currentIndex: m_currentIndex);
78 }
79 m_textureTransform.setToIdentity();
80 emit q->textureTransformChanged(textureTransform: m_textureTransform);
81 return;
82 }
83
84 if (m_currentIndex == -1) {
85 m_currentIndex = 0;
86 emit q->currentIndexChanged(currentIndex: m_currentIndex);
87 }
88 updateTransform();
89}
90
91void QSpriteGridPrivate::updateTransform()
92{
93 Q_Q(QSpriteGrid);
94 const float xScale = (float) m_cellSize.width() / (float) m_textureSize.width();
95 const float yScale = (float) m_cellSize.height() / (float) m_textureSize.height();
96
97 const int currentRow = m_currentIndex / m_numColumns;
98 const int currentColumn = m_currentIndex % m_numColumns;
99 const float xTranslate = currentColumn * xScale;
100 const float yTranslate = currentRow * yScale;
101
102 m_textureTransform.setToIdentity();
103 m_textureTransform(0, 0) = xScale;
104 m_textureTransform(1, 1) = yScale;
105 m_textureTransform(0, 2) = xTranslate;
106 m_textureTransform(1, 2) = yTranslate;
107 emit q->textureTransformChanged(textureTransform: m_textureTransform);
108}
109
110/*!
111 Constructs a new QSpriteGrid instance with parent object \a parent.
112 */
113QSpriteGrid::QSpriteGrid(QNode *parent)
114 : QAbstractSpriteSheet(*new QSpriteGridPrivate, parent)
115{
116}
117
118QSpriteGrid::~QSpriteGrid()
119{
120}
121
122int QSpriteGrid::rows() const
123{
124 Q_D(const QSpriteGrid);
125 return d->m_numRows;
126}
127
128void QSpriteGrid::setRows(int rows)
129{
130 Q_D(QSpriteGrid);
131 if (d->m_numRows != rows) {
132 d->m_numRows = rows;
133 d->updateSizes();
134 emit rowsChanged(rows);
135 }
136}
137
138int QSpriteGrid::columns() const
139{
140 Q_D(const QSpriteGrid);
141 return d->m_numColumns;
142}
143
144void QSpriteGrid::setColumns(int columns)
145{
146 Q_D(QSpriteGrid);
147 if (d->m_numColumns != columns) {
148 d->m_numColumns = columns;
149 d->updateSizes();
150 emit columnsChanged(columns);
151 }
152}
153
154} // namespace Qt3DExtras
155
156QT_END_NAMESPACE
157

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