diff options
author | Mike Krus <mike.krus@kdab.com> | 2017-06-28 23:13:41 +0200 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2017-07-08 09:08:40 +0000 |
commit | a61bc1bd653559637146d9e0ba0884de3e3f1a12 (patch) | |
tree | 1e08702bfc4aaa779c26bc1e0d25703818ddcb44 /src/quick3d/quick3dextras | |
parent | 55844801dc09da2d05e6f581ce7ad3d4d334b5c1 (diff) |
Introduce QSpriteSheet
a generalised non-regular grid sprite sheet. Sprites are
defined by a list of QSpriteSheetItem, essentially QRect
for now (may introduce rotation later)
Uses wrapper class to expose qml property list.
Change-Id: I5a8d6804c32d59c27e1dc823c61d56bb169ca498
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/quick3d/quick3dextras')
-rw-r--r-- | src/quick3d/quick3dextras/items/items.pri | 6 | ||||
-rw-r--r-- | src/quick3d/quick3dextras/items/quick3dspritesheet.cpp | 100 | ||||
-rw-r--r-- | src/quick3d/quick3dextras/items/quick3dspritesheet_p.h | 89 | ||||
-rw-r--r-- | src/quick3d/quick3dextras/qt3dquickextras_global.cpp | 63 | ||||
-rw-r--r-- | src/quick3d/quick3dextras/qt3dquickextras_global_p.h | 16 | ||||
-rw-r--r-- | src/quick3d/quick3dextras/qt3dquickextrasnodefactory.cpp | 76 | ||||
-rw-r--r-- | src/quick3d/quick3dextras/qt3dquickextrasnodefactory_p.h | 89 | ||||
-rw-r--r-- | src/quick3d/quick3dextras/quick3dextras.pro | 3 |
8 files changed, 440 insertions, 2 deletions
diff --git a/src/quick3d/quick3dextras/items/items.pri b/src/quick3d/quick3dextras/items/items.pri index b6f5d1877..f2fe09dcb 100644 --- a/src/quick3d/quick3dextras/items/items.pri +++ b/src/quick3d/quick3dextras/items/items.pri @@ -1,8 +1,10 @@ HEADERS += \ $$PWD/quick3dlevelofdetailloader_p.h \ - $$PWD/quick3dlevelofdetailloader_p_p.h + $$PWD/quick3dlevelofdetailloader_p_p.h \ + $$PWD/quick3dspritesheet_p.h SOURCES += \ - $$PWD/quick3dlevelofdetailloader.cpp + $$PWD/quick3dlevelofdetailloader.cpp \ + $$PWD/quick3dspritesheet.cpp INCLUDEPATH += $$PWD diff --git a/src/quick3d/quick3dextras/items/quick3dspritesheet.cpp b/src/quick3d/quick3dextras/items/quick3dspritesheet.cpp new file mode 100644 index 000000000..a38581cc7 --- /dev/null +++ b/src/quick3d/quick3dextras/items/quick3dspritesheet.cpp @@ -0,0 +1,100 @@ +/**************************************************************************** +** +** Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB). +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "quick3dspritesheet_p.h" +#include <Qt3DExtras/qspritesheetitem.h> + +QT_BEGIN_NAMESPACE + +namespace Qt3DExtras { +namespace Extras { +namespace Quick { + +Quick3DSpriteSheet::Quick3DSpriteSheet(QObject *parent) + : QObject(parent) +{ +} + +Quick3DSpriteSheet::~Quick3DSpriteSheet() +{ +} + +QQmlListProperty<Qt3DExtras::QSpriteSheetItem> Quick3DSpriteSheet::sprites() +{ + return QQmlListProperty<Qt3DExtras::QSpriteSheetItem>(this, 0, + &Quick3DSpriteSheet::appendSprite, + &Quick3DSpriteSheet::spriteCount, + &Quick3DSpriteSheet::spriteAt, + &Quick3DSpriteSheet::clearSprites); + +} + +void Quick3DSpriteSheet::appendSprite(QQmlListProperty<Qt3DExtras::QSpriteSheetItem> *list, + Qt3DExtras::QSpriteSheetItem *sprite) +{ + Quick3DSpriteSheet *spritesheet = qobject_cast<Quick3DSpriteSheet *>(list->object); + spritesheet->parentSpriteSheet()->addSprite(sprite); +} + +Qt3DExtras::QSpriteSheetItem *Quick3DSpriteSheet::spriteAt(QQmlListProperty<Qt3DExtras::QSpriteSheetItem> *list, int index) +{ + Quick3DSpriteSheet *spritesheet = qobject_cast<Quick3DSpriteSheet *>(list->object); + return spritesheet->parentSpriteSheet()->sprites().at(index); +} + +int Quick3DSpriteSheet::spriteCount(QQmlListProperty<Qt3DExtras::QSpriteSheetItem> *list) +{ + Quick3DSpriteSheet *spritesheet = qobject_cast<Quick3DSpriteSheet *>(list->object); + return spritesheet->parentSpriteSheet()->sprites().count(); +} + +void Quick3DSpriteSheet::clearSprites(QQmlListProperty<Qt3DExtras::QSpriteSheetItem> *list) +{ + Quick3DSpriteSheet *spritesheet = qobject_cast<Quick3DSpriteSheet *>(list->object); + const auto sprites = spritesheet->parentSpriteSheet()->sprites(); + for (QSpriteSheetItem *sprite : sprites) + spritesheet->parentSpriteSheet()->removeSprite(sprite); +} + +} // namespace Quick +} // namespace Extras +} // namespace Qt3DExtras + +QT_END_NAMESPACE + diff --git a/src/quick3d/quick3dextras/items/quick3dspritesheet_p.h b/src/quick3d/quick3dextras/items/quick3dspritesheet_p.h new file mode 100644 index 000000000..38a92dd2a --- /dev/null +++ b/src/quick3d/quick3dextras/items/quick3dspritesheet_p.h @@ -0,0 +1,89 @@ +/**************************************************************************** +** +** Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB). +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QT3DEXTRAS_EXTRAS_QUICK_QUICK3DSPRITESHEET_P_H +#define QT3DEXTRAS_EXTRAS_QUICK_QUICK3DSPRITESHEET_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists for the convenience +// of other Qt classes. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <Qt3DQuickExtras/qt3dquickextras_global.h> +#include <Qt3DExtras/qspritesheet.h> +#include <QtQml/QQmlListProperty> + +QT_BEGIN_NAMESPACE + +namespace Qt3DExtras { +namespace Extras { +namespace Quick { + +class QT3DQUICKEXTRASSHARED_EXPORT Quick3DSpriteSheet : public QObject +{ + Q_OBJECT + Q_PROPERTY(QQmlListProperty<Qt3DExtras::QSpriteSheetItem> sprites READ sprites CONSTANT) + Q_CLASSINFO("DefaultProperty", "sprites") +public: + explicit Quick3DSpriteSheet(QObject *parent = 0); + ~Quick3DSpriteSheet(); + + QQmlListProperty<Qt3DExtras::QSpriteSheetItem> sprites(); + inline QSpriteSheet *parentSpriteSheet() const { return qobject_cast<QSpriteSheet *>(parent()); } + +private: + static void appendSprite(QQmlListProperty<Qt3DExtras::QSpriteSheetItem> *list, Qt3DExtras::QSpriteSheetItem *state); + static Qt3DExtras::QSpriteSheetItem *spriteAt(QQmlListProperty<Qt3DExtras::QSpriteSheetItem> *list, int index); + static int spriteCount(QQmlListProperty<Qt3DExtras::QSpriteSheetItem> *list); + static void clearSprites(QQmlListProperty<Qt3DExtras::QSpriteSheetItem> *list); +}; + +} // namespace Quick +} // namespace Extras +} // namespace Qt3DExtras + +QT_END_NAMESPACE + +#endif // QT3DEXTRAS_EXTRAS_QUICK_QUICK3DSPRITESHEET_P_H diff --git a/src/quick3d/quick3dextras/qt3dquickextras_global.cpp b/src/quick3d/quick3dextras/qt3dquickextras_global.cpp new file mode 100644 index 000000000..e9b71e081 --- /dev/null +++ b/src/quick3d/quick3dextras/qt3dquickextras_global.cpp @@ -0,0 +1,63 @@ +/**************************************************************************** +** +** Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB). +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qt3dquickextras_global_p.h" + +#include <Qt3DQuickExtras/private/qt3dquickextrasnodefactory_p.h> +#include <QtQml/private/qqmlglobal_p.h> + +QT_BEGIN_NAMESPACE + +namespace Qt3DExtras { +namespace Quick { + +void Quick3DExtras_initialize() +{ + Qt3DCore::QAbstractNodeFactory::registerNodeFactory(QuickExtrasNodeFactory::instance()); +} + +void Quick3DExtras_registerType(const char *className, const char *quickName, int major, int minor) +{ + QuickExtrasNodeFactory::instance()->registerType(className, quickName, major, minor); +} + +} // namespace Quick +} // namespace Qt3DExtras + +QT_END_NAMESPACE diff --git a/src/quick3d/quick3dextras/qt3dquickextras_global_p.h b/src/quick3d/quick3dextras/qt3dquickextras_global_p.h index 524393743..a27533517 100644 --- a/src/quick3d/quick3dextras/qt3dquickextras_global_p.h +++ b/src/quick3d/quick3dextras/qt3dquickextras_global_p.h @@ -58,6 +58,22 @@ QT_BEGIN_NAMESPACE +namespace Qt3DExtras { +namespace Quick { + +QT3DQUICKEXTRASSHARED_PRIVATE_EXPORT void Quick3DExtras_initialize(); +QT3DQUICKEXTRASSHARED_PRIVATE_EXPORT void Quick3DExtras_registerType(const char *className, const char *quickName, int major, int minor); + +template<class T, class E> void registerExtendedType(const char *className, const char *quickName, + const char *uri, int major, int minor, const char *name) +{ + qmlRegisterExtendedType<T, E>(uri, major, minor, name); + Quick3DExtras_registerType(className, quickName, major, minor); +} + +} // Quick +} // Qt3DExtras + QT_END_NAMESPACE #endif // QT3DQUICKEXTRAS_GLOBAL_P_H diff --git a/src/quick3d/quick3dextras/qt3dquickextrasnodefactory.cpp b/src/quick3d/quick3dextras/qt3dquickextrasnodefactory.cpp new file mode 100644 index 000000000..073a3ec44 --- /dev/null +++ b/src/quick3d/quick3dextras/qt3dquickextrasnodefactory.cpp @@ -0,0 +1,76 @@ +/**************************************************************************** +** +** Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB). +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qt3dquickextrasnodefactory_p.h" +#include <private/qqmlmetatype_p.h> + +QT_BEGIN_NAMESPACE + +namespace Qt3DExtras { + +Q_GLOBAL_STATIC(QuickExtrasNodeFactory, quick_extras_node_factory) + +QuickExtrasNodeFactory *QuickExtrasNodeFactory::instance() +{ + return quick_extras_node_factory(); +} + +void QuickExtrasNodeFactory::registerType(const char *className, const char *quickName, int major, int minor) +{ + m_types.insert(className, Type(quickName, major, minor)); +} + +Qt3DCore::QNode *QuickExtrasNodeFactory::createNode(const char *type) +{ + if (!m_types.contains(type)) + return nullptr; + + Type &typeInfo(m_types[type]); + + if (!typeInfo.resolved) { + typeInfo.resolved = true; + typeInfo.t = QQmlMetaType::qmlType(QString::fromLatin1(typeInfo.quickName), typeInfo.version.first, typeInfo.version.second); + } + + return typeInfo.t ? qobject_cast<Qt3DCore::QNode *>(typeInfo.t->create()) : nullptr; +} + +} // namespace Qt3DExtras + +QT_END_NAMESPACE diff --git a/src/quick3d/quick3dextras/qt3dquickextrasnodefactory_p.h b/src/quick3d/quick3dextras/qt3dquickextrasnodefactory_p.h new file mode 100644 index 000000000..03769c397 --- /dev/null +++ b/src/quick3d/quick3dextras/qt3dquickextrasnodefactory_p.h @@ -0,0 +1,89 @@ +/**************************************************************************** +** +** Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB). +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QUICKEXTRASERNODEFACTORY_H +#define QUICKEXTRASERNODEFACTORY_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists for the convenience +// of other Qt classes. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <private/qabstractnodefactory_p.h> +#include <QtCore/qhash.h> + +QT_BEGIN_NAMESPACE + +class QQmlType; + +namespace Qt3DExtras { + +class QuickExtrasNodeFactory : public Qt3DCore::QAbstractNodeFactory +{ +public: + Qt3DCore::QNode *createNode(const char *type) Q_DECL_OVERRIDE; + + void registerType(const char *className, const char *quickName, int major, int minor); + + static QuickExtrasNodeFactory *instance(); + +private: + struct Type { + Type() : t(nullptr), resolved(false) { } + Type(const char *quickName, int major, int minor) + : quickName(quickName), version(major, minor), t(nullptr), resolved(false) { } + QByteArray quickName; + QPair<int, int> version; + QQmlType *t; + bool resolved; + }; + QHash<QByteArray, Type> m_types; +}; + +} // namespace Qt3DExtras + +QT_END_NAMESPACE + +#endif // QUICKEXTRASERNODEFACTORY_H diff --git a/src/quick3d/quick3dextras/quick3dextras.pro b/src/quick3d/quick3dextras/quick3dextras.pro index 976430eba..f89a93e8e 100644 --- a/src/quick3d/quick3dextras/quick3dextras.pro +++ b/src/quick3d/quick3dextras/quick3dextras.pro @@ -14,12 +14,15 @@ gcov { } SOURCES += \ + qt3dquickextras_global.cpp \ + qt3dquickextrasnodefactory.cpp \ qt3dquickwindow.cpp \ qt3dquickwindowlogging.cpp HEADERS += \ qt3dquickextras_global.h \ qt3dquickextras_global_p.h \ + qt3dquickextrasnodefactory_p.h \ qt3dquickwindow.h \ qt3dquickwindow_p.h \ qt3dquickwindowlogging_p.h |