1 /****************************************************************************
2 **
3 ** Copyright (C) 2020 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of Qt Quick 3D.
7 **
8 ** $QT_BEGIN_LICENSE:GPL$
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 General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU
19 ** General Public License version 3 or (at your option) any later version
20 ** approved by the KDE Free Qt Foundation. The licenses are as published by
21 ** the Free Software Foundation and appearing in the file LICENSE.GPL3
22 ** included in the packaging of this file. Please review the following
23 ** information to ensure the GNU General Public License requirements will
24 ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
25 **
26 ** $QT_END_LICENSE$
27 **
28 ****************************************************************************/
29 
30 #ifndef Q_QUICK3D_OBJECT_H
31 #define Q_QUICK3D_OBJECT_H
32 
33 #include <QtQuick3D/qtquick3dglobal.h>
34 
35 #include <QtQml/qqml.h>
36 #include <QtQml/qqmlcomponent.h>
37 
38 #include <QtCore/QObject>
39 #include <QtCore/qsharedpointer.h>
40 
41 QT_BEGIN_NAMESPACE
42 
43 class QQuick3DObjectPrivate;
44 class QQuick3DSceneManager;
45 struct QSSGRenderGraphObject;
46 
47 class Q_QUICK3D_EXPORT QQuick3DObject : public QObject, public QQmlParserStatus
48 {
49     Q_OBJECT
50     Q_INTERFACES(QQmlParserStatus)
51     Q_DECLARE_PRIVATE(QQuick3DObject)
52     Q_DISABLE_COPY(QQuick3DObject)
53 
54     Q_PROPERTY(QQuick3DObject *parent READ parentItem WRITE setParentItem NOTIFY parentChanged DESIGNABLE false FINAL)
55     Q_PRIVATE_PROPERTY(QQuick3DObject::d_func(), QQmlListProperty<QObject> data READ data DESIGNABLE false)
56     Q_PRIVATE_PROPERTY(QQuick3DObject::d_func(), QQmlListProperty<QObject> resources READ resources DESIGNABLE false)
57     Q_PRIVATE_PROPERTY(QQuick3DObject::d_func(),
58                        QQmlListProperty<QQuick3DObject> children READ children NOTIFY childrenChanged DESIGNABLE false)
59 
60     Q_PRIVATE_PROPERTY(QQuick3DObject::d_func(), QQmlListProperty<QQuickState> states READ states DESIGNABLE false)
61     Q_PRIVATE_PROPERTY(QQuick3DObject::d_func(), QQmlListProperty<QQuickTransition> transitions READ transitions DESIGNABLE false)
62     Q_PROPERTY(QString state READ state WRITE setState NOTIFY stateChanged)
63 
64     Q_CLASSINFO("DefaultProperty", "data")
65     Q_CLASSINFO("qt_QmlJSWrapperFactoryMethod", "_q_createJSWrapper(QV4::ExecutionEngine*)")
66 public:
67     enum ItemChange {
68         ItemChildAddedChange, // value.item
69         ItemChildRemovedChange, // value.item
70         ItemSceneChange, // value.window
71         ItemVisibleHasChanged, // value.boolValue
72         ItemParentHasChanged, // value.item
73         ItemOpacityHasChanged, // value.realValue
74         ItemActiveFocusHasChanged, // value.boolValue
75         ItemRotationHasChanged, // value.realValue
76         ItemAntialiasingHasChanged, // value.boolValue
77         ItemDevicePixelRatioHasChanged, // value.realValue
78         ItemEnabledHasChanged // value.boolValue
79     };
80 
81     struct ItemChangeData {
ItemChangeDataItemChangeData82         ItemChangeData(QQuick3DObject *v) : item(v) {}
ItemChangeDataItemChangeData83         ItemChangeData(const QSharedPointer<QQuick3DSceneManager> &v) : sceneManager(v) {}
ItemChangeDataItemChangeData84         ItemChangeData(qreal v) : realValue(v) {}
ItemChangeDataItemChangeData85         ItemChangeData(bool v) : boolValue(v) {}
~ItemChangeDataItemChangeData86         ~ItemChangeData() {}
87 
88         QSharedPointer<QQuick3DSceneManager> sceneManager;
89         union {
90             QQuick3DObject *item;
91             qreal realValue;
92             bool boolValue;
93         };
94     };
95 
96     explicit QQuick3DObject(QQuick3DObject *parent = nullptr);
97     ~QQuick3DObject() override;
98 
99     QString state() const;
100     void setState(const QString &state);
101 
102     QList<QQuick3DObject *> childItems() const;
103 
104     QQuick3DObject *parentItem() const;
105 
106 public Q_SLOTS:
107     void update();
108 
109     void setParentItem(QQuick3DObject *parentItem);
110 
111 Q_SIGNALS:
112     void parentChanged();
113     void childrenChanged();
114     void stateChanged();
115 
116 protected:
117     using ConnectionMap = QHash<QByteArray, QMetaObject::Connection>;
118     virtual QSSGRenderGraphObject *updateSpatialNode(QSSGRenderGraphObject *node) = 0;
119     virtual void markAllDirty();
120     virtual void itemChange(ItemChange, const ItemChangeData &);
121     explicit QQuick3DObject(QQuick3DObjectPrivate &dd, QQuick3DObject *parent = nullptr);
122 
123     void classBegin() override;
124     void componentComplete() override;
125 
126     bool isComponentComplete() const;
127 
128     static void updatePropertyListener(QQuick3DObject *newO,
129                                        QQuick3DObject *oldO,
130                                        const QSharedPointer<QQuick3DSceneManager> &window,
131                                        const QByteArray &propertyKey,
132                                        ConnectionMap &connections,
133                                        const std::function<void(QQuick3DObject *o)> &callFn);
134 
135 private:
136     Q_PRIVATE_SLOT(d_func(), void _q_resourceObjectDeleted(QObject *))
137     Q_PRIVATE_SLOT(d_func(), quint64 _q_createJSWrapper(QV4::ExecutionEngine *))
138 
139     friend class QQuick3DSceneManager;
140 };
141 
142 QT_END_NAMESPACE
143 
144 QML_DECLARE_TYPE(QQuick3DObject)
145 
146 #endif // Q_QUICK3D_OBJECT_H
147