41 Q_DECLARE_PUBLIC(QQuick3DObject)
43 using Type = QSSGRenderGraphObject::Type;
47 using Handle =
void (QQuick3DObject::*)(QObject *);
48 QObject *context =
nullptr;
49 Handle unusable =
nullptr;
50 friend bool operator==(
const ConnectionKey &a,
const ConnectionKey &b)
noexcept {
return (a.context == b.context) && (a.unusable == b.unusable); }
52 using ConnectionMap = QHash<ConnectionKey, QMetaObject::Connection>;
54 template<
typename SceneContext,
typename CallContext,
typename Setter>
55 static void attachWatcherPriv(SceneContext *sceneContext, CallContext *callContext, Setter setter, QQuick3DObject *newO, QObject *oldO)
57 static_assert(std::is_base_of_v<QQuick3DObject, SceneContext>,
"The scene context must be a QQuick3DObject");
58 static_assert(std::is_member_function_pointer_v<Setter>,
"The assumption is that the setter is a member function!");
59 static_assert(
sizeof(ConnectionKey::Handle) >=
sizeof(Setter),
"The handle needs to be able to store the value of the setter");
63 const bool validContext =
static_cast<QObject *>(sceneContext) !=
static_cast<QObject *>(callContext) ? qobject_cast<QQuick3DObject *>(sceneContext) !=
nullptr :
true;
65 auto sceneManager = QQuick3DObjectPrivate::get(sceneContext)->sceneManager;
66 auto &connectionMap = QQuick3DObjectPrivate::get(sceneContext)->connectionMap;
70 ConnectionKey::Handle h;
72 ConnectionKey key{
static_cast<QObject *>(callContext), h};
77 if (
auto old3dO = qobject_cast<QQuick3DObject *>(oldO))
78 QQuick3DObjectPrivate::derefSceneManager(old3dO);
80 auto it = connectionMap.constFind(key);
81 if (it != connectionMap.cend()) {
82 QObject::disconnect(*it);
83 connectionMap.erase(it);
90 QQuick3DObjectPrivate::refSceneManager(newO, *sceneManager);
91 auto connection = QObject::connect(newO, &QObject::destroyed, callContext, [callContext, setter](){ (callContext->*setter)(
nullptr); });
92 connectionMap.insert(key, connection);
98
99
100
101
102
103
104
105
106
107
108
109
110
111 template<
typename Context,
typename Setter,
typename Object3D>
112 static void attachWatcher(Context *context, Setter setter, Object3D *newO, Object3D *oldO)
114 attachWatcherPriv(context, context, setter, newO, oldO);
117 static QQuick3DObjectPrivate *get(QQuick3DObject *item) {
return item->d_func(); }
118 static const QQuick3DObjectPrivate *get(
const QQuick3DObject *item) {
return item->d_func(); }
119 static QSSGRenderGraphObject *updateSpatialNode(QQuick3DObject *o, QSSGRenderGraphObject *n) {
return o->updateSpatialNode(n); }
121 explicit QQuick3DObjectPrivate(Type t);
122 ~QQuick3DObjectPrivate() override;
123 void init(QQuick3DObject *parent);
125 QQmlListProperty<QObject> data();
126 QQmlListProperty<QObject> resources();
127 QQmlListProperty<QQuick3DObject> children();
129 QQmlListProperty<QQuickState> states();
130 QQmlListProperty<QQuickTransition> transitions();
132 QString state()
const;
133 void setState(
const QString &);
136 static void data_append(QQmlListProperty<QObject> *, QObject *);
137 static qsizetype data_count(QQmlListProperty<QObject> *);
138 static QObject *data_at(QQmlListProperty<QObject> *, qsizetype);
139 static void data_clear(QQmlListProperty<QObject> *);
142 static QObject *resources_at(QQmlListProperty<QObject> *, qsizetype);
143 static void resources_append(QQmlListProperty<QObject> *, QObject *);
144 static qsizetype resources_count(QQmlListProperty<QObject> *);
145 static void resources_clear(QQmlListProperty<QObject> *);
148 static void children_append(QQmlListProperty<QQuick3DObject> *, QQuick3DObject *);
149 static qsizetype children_count(QQmlListProperty<QQuick3DObject> *);
150 static QQuick3DObject *children_at(QQmlListProperty<QQuick3DObject> *, qsizetype);
151 static void children_clear(QQmlListProperty<QQuick3DObject> *);
153 void _q_resourceObjectDeleted(QObject *);
154 void _q_cleanupContentItem2D();
155 quint64 _q_createJSWrapper(QQmlV4ExecutionEnginePtr engine);
166 ImplicitWidth = 0x100,
167 ImplicitHeight = 0x200,
171 Q_DECLARE_FLAGS(ChangeTypes, ChangeType)
173 struct ChangeListener
175 using ChangeTypes = QQuick3DObjectPrivate::ChangeTypes;
177 ChangeListener(QQuick3DObjectChangeListener *l =
nullptr, ChangeTypes t = {}) : listener(l), types(t) {}
179 ChangeListener(QQuick3DObjectChangeListener *l) : listener(l), types(Geometry) {}
181 bool operator==(
const ChangeListener &other)
const
183 return listener == other.listener && types == other.types;
186 QQuick3DObjectChangeListener *listener;
195 QObjectList resourcesList;
198 QLazilyAllocated<ExtraData> extra;
200 QVector<QQuick3DObjectPrivate::ChangeListener> changeListeners;
202 void addItemChangeListener(QQuick3DObjectChangeListener *listener, ChangeTypes types);
203 void updateOrAddItemChangeListener(QQuick3DObjectChangeListener *listener, ChangeTypes types);
204 void removeItemChangeListener(QQuick3DObjectChangeListener *, ChangeTypes types);
206 QQuickStateGroup *_states();
207 QQuickStateGroup *_stateGroup;
210 TransformOrigin = 0x00000001,
211 Transform = 0x00000002,
212 BasicTransform = 0x00000004,
213 Position = 0x00000008,
217 Content = 0x00000040,
219 OpacityValue = 0x00000100,
220 ChildrenChanged = 0x00000200,
221 ChildrenStackingChanged = 0x00000400,
222 ParentChanged = 0x00000800,
227 EffectReference = 0x00008000,
228 Visible = 0x00010000,
229 HideReference = 0x00020000,
230 Antialiasing = 0x00040000,
232 InstanceRootChanged = 0x00080000,
236 TransformUpdateMask = TransformOrigin | Transform | BasicTransform | Position | Window,
237 ComplexTransformUpdateMask = Transform | Window,
238 ContentUpdateMask = Size | Content | Smooth | Window | Antialiasing,
239 ChildrenUpdateMask = ChildrenChanged | ChildrenStackingChanged | EffectReference | Window
242 quint32 dirtyAttributes;
243 QString dirtyToString()
const;
244 void dirty(DirtyType);
245 void addToDirtyList();
246 void removeFromDirtyList();
247 QQuick3DObject *nextDirtyItem;
248 QQuick3DObject **prevDirtyItem;
250 void setCulled(
bool);
252 QPointer<QQuick3DSceneManager> sceneManager;
255 QQuick3DObject *parentItem;
257 QList<QQuick3DObject *> childItems;
258 void addChild(QQuick3DObject *);
259 void removeChild(QQuick3DObject *);
260 void siblingOrderChanged();
262 void refSceneManager(QQuick3DSceneManager &);
263 void derefSceneManager();
265 static void refSceneManager(QQuick3DObject *obj, QQuick3DSceneManager &mgr)
268 QQuick3DObjectPrivate::get(obj)->refSceneManager(mgr);
270 static void derefSceneManager(QQuick3DObject *obj)
273 QQuick3DObjectPrivate::get(obj)->derefSceneManager();
276 QQuick3DObject *subFocusItem;
277 void updateSubFocusItem(QQuick3DObject *scope,
bool focus);
279 void itemChange(QQuick3DObject::ItemChange,
const QQuick3DObject::ItemChangeData &);
281 virtual void updatePolish() {}
283 QSSGRenderGraphObject *spatialNode =
nullptr;
285 Type type = Type::Unknown;
286 bool componentComplete =
true;
287 bool preSyncNeeded =
false;
289 bool sharedResource =
false;
290 QQuick3DItem2D *contentItem2d =
nullptr;
291 ConnectionMap connectionMap;