Source code

Revision control

Copy as Markdown

// Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB).
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qspritesheet.h"
#include "qspritesheetitem.h"
#include "qspritesheet_p.h"
#include <Qt3DRender/qabstracttexture.h>
QT_BEGIN_NAMESPACE
namespace Qt3DExtras {
using namespace Qt3DCore;
QSpriteSheetPrivate::QSpriteSheetPrivate()
: QAbstractSpriteSheetPrivate()
{
}
int QSpriteSheetPrivate::maxIndex() const
{
return m_sprites.size() - 1;
}
void QSpriteSheetPrivate::updateSizes()
{
Q_Q(QSpriteSheet);
if (m_texture)
m_textureSize = QSize(m_texture->width(), m_texture->height());
else
m_textureSize = QSize();
if (m_textureSize.isEmpty() || m_sprites.isEmpty()) {
if (m_currentIndex != -1) {
m_currentIndex = -1;
emit q->currentIndexChanged(m_currentIndex);
}
m_textureTransform.setToIdentity();
emit q->textureTransformChanged(m_textureTransform);
return;
}
if (m_currentIndex < 0 || m_currentIndex >= m_sprites.size()) {
m_currentIndex = 0;
emit q->currentIndexChanged(m_currentIndex);
}
updateTransform();
}
void QSpriteSheetPrivate::updateTransform()
{
Q_Q(QSpriteSheet);
if (m_currentIndex < 0 || m_currentIndex >= m_sprites.size())
return;
const QSpriteSheetItem *r = m_sprites.at(m_currentIndex);
const float xScale = static_cast<float>(r->width()) / static_cast<float>(m_textureSize.width());
const float yScale = static_cast<float>(r->height()) / static_cast<float>(m_textureSize.height());
const float xTranslate = static_cast<float>(r->x()) / static_cast<float>(m_textureSize.width());
const float yTranslate = static_cast<float>(r->y()) / static_cast<float>(m_textureSize.height());
m_textureTransform.setToIdentity();
m_textureTransform(0, 0) = xScale;
m_textureTransform(1, 1) = yScale;
m_textureTransform(0, 2) = xTranslate;
m_textureTransform(1, 2) = yTranslate;
emit q->textureTransformChanged(m_textureTransform);
}
/*!
Constructs a new QSpriteSheet instance with parent object \a parent.
*/
QSpriteSheet::QSpriteSheet(QNode *parent)
: QAbstractSpriteSheet(*new QSpriteSheetPrivate, parent)
{
}
QSpriteSheet::~QSpriteSheet()
{
}
/*!
\property Qt3DExtras::QSpriteSheet::sprites
\brief Holds the list of sprites in the sprite sheet.
Contains all QSpriteSheetItem instances that define individual sprite regions
within the sprite sheet texture. Each sprite item specifies its position and
dimensions within the texture.
*/
QList<QSpriteSheetItem *> QSpriteSheet::sprites() const
{
Q_D(const QSpriteSheet);
return d->m_sprites;
}
QSpriteSheetItem *QSpriteSheet::addSprite(int x, int y, int width, int height)
{
QSpriteSheetItem *item = new QSpriteSheetItem(this);
item->setX(x);
item->setX(y);
item->setWidth(width);
item->setHeight(height);
addSprite(item);
return item;
}
void QSpriteSheet::addSprite(QSpriteSheetItem *sprite)
{
Q_ASSERT(sprite);
Q_D(QSpriteSheet);
if (!d->m_sprites.contains(sprite)) {
d->m_sprites << sprite;
// Ensures proper bookkeeping
d->registerDestructionHelper(sprite, &QSpriteSheet::removeSprite, d->m_sprites);
if (!sprite->parent())
sprite->setParent(this);
emit spritesChanged(d->m_sprites);
d->updateSizes();
}
}
void QSpriteSheet::removeSprite(QSpriteSheetItem *sprite)
{
Q_ASSERT(sprite);
Q_D(QSpriteSheet);
d->m_sprites.removeOne(sprite);
// Remove bookkeeping connection
d->unregisterDestructionHelper(sprite);
}
void QSpriteSheet::setSprites(QList<QSpriteSheetItem *> sprites)
{
Q_D(QSpriteSheet);
d->m_sprites = sprites;
emit spritesChanged(sprites);
d->updateSizes();
}
} // namespace Qt3DExtras
QT_END_NAMESPACE
#include "moc_qspritesheet.cpp"