43 Q_DECLARE_PUBLIC(QQuick3DObject)
45 using Type = QSSGRenderGraphObject::Type;
47 enum class Flags : quint32
50 RequiresSecondaryUpdate = 0x1,
54
55
56
57
58
59
60
61
62
64 using FlagsT = std::underlying_type_t<Flags>;
68 using Handle =
void (QQuick3DObject::*)(QObject *);
69 QObject *context =
nullptr;
70 Handle unusable =
nullptr;
71 friend bool operator==(
const ConnectionKey &a,
const ConnectionKey &b)
noexcept {
return (a.context == b.context) && (a.unusable == b.unusable); }
73 using ConnectionMap = QHash<ConnectionKey, QMetaObject::Connection>;
75 template<
typename SceneContext,
typename CallContext,
typename Setter>
76 static void attachWatcherPriv(SceneContext *sceneContext, CallContext *callContext, Setter setter, QQuick3DObject *newO, QObject *oldO)
78 static_assert(std::is_base_of_v<QQuick3DObject, SceneContext>,
"The scene context must be a QQuick3DObject");
79 static_assert(std::is_member_function_pointer_v<Setter>,
"The assumption is that the setter is a member function!");
80 static_assert(
sizeof(ConnectionKey::Handle) >=
sizeof(Setter),
"The handle needs to be able to store the value of the setter");
84 const bool validContext =
static_cast<QObject *>(sceneContext) !=
static_cast<QObject *>(callContext) ? qobject_cast<QQuick3DObject *>(sceneContext) !=
nullptr :
true;
86 auto sceneManager = QQuick3DObjectPrivate::get(sceneContext)->sceneManager;
87 auto &connectionMap = QQuick3DObjectPrivate::get(sceneContext)->connectionMap;
91 ConnectionKey::Handle h;
93 ConnectionKey key{
static_cast<QObject *>(callContext), h};
98 if (
auto old3dO = qobject_cast<QQuick3DObject *>(oldO))
99 QQuick3DObjectPrivate::derefSceneManager(old3dO);
101 QObject::disconnect(connectionMap.take(key));
107 QQuick3DObjectPrivate::refSceneManager(newO, *sceneManager);
108 auto connection = QObject::connect(newO, &QObject::destroyed, callContext, [callContext, setter](){ (callContext->*setter)(
nullptr); });
109 connectionMap.insert(key, connection);
115
116
117
118
119
120
121
122
123
124
125
126
127
128 template<
typename Context,
typename Setter,
typename Object3D>
129 static void attachWatcher(Context *context, Setter setter, Object3D *newO, Object3D *oldO)
131 attachWatcherPriv(context, context, setter, newO, oldO);
134 static QQuick3DObjectPrivate *get(QQuick3DObject *item) {
return item->d_func(); }
135 static const QQuick3DObjectPrivate *get(
const QQuick3DObject *item) {
return item->d_func(); }
136 static QSSGRenderGraphObject *updateSpatialNode(QQuick3DObject *o, QSSGRenderGraphObject *n) {
return o->updateSpatialNode(n); }
138 explicit QQuick3DObjectPrivate(Type t, FlagsT f);
139 explicit QQuick3DObjectPrivate(Type t, Flags f);
140 explicit QQuick3DObjectPrivate(Type t);
141 ~QQuick3DObjectPrivate() override;
142 void init(QQuick3DObject *parent);
144 QQmlListProperty<QObject> data();
145 QQmlListProperty<QObject> resources();
146 QQmlListProperty<QQuick3DObject> children();
148 QQmlListProperty<QQuickState> states();
149 QQmlListProperty<QQuickTransition> transitions();
151 QString state()
const;
152 void setState(
const QString &);
155 static void data_append(QQmlListProperty<QObject> *, QObject *);
156 static qsizetype data_count(QQmlListProperty<QObject> *);
157 static QObject *data_at(QQmlListProperty<QObject> *, qsizetype);
158 static void data_clear(QQmlListProperty<QObject> *);
161 static QObject *resources_at(QQmlListProperty<QObject> *, qsizetype);
162 static void resources_append(QQmlListProperty<QObject> *, QObject *);
163 static qsizetype resources_count(QQmlListProperty<QObject> *);
164 static void resources_clear(QQmlListProperty<QObject> *);
167 static void children_append(QQmlListProperty<QQuick3DObject> *, QQuick3DObject *);
168 static qsizetype children_count(QQmlListProperty<QQuick3DObject> *);
169 static QQuick3DObject *children_at(QQmlListProperty<QQuick3DObject> *, qsizetype);
170 static void children_clear(QQmlListProperty<QQuick3DObject> *);
172 void _q_resourceObjectDeleted(QObject *);
173 void _q_cleanupContentItem2D();
174 quint64 _q_createJSWrapper(QQmlV4ExecutionEnginePtr engine);
185 ImplicitWidth = 0x100,
186 ImplicitHeight = 0x200,
190 Q_DECLARE_FLAGS(ChangeTypes, ChangeType)
192 struct ChangeListener
194 using ChangeTypes = QQuick3DObjectPrivate::ChangeTypes;
196 ChangeListener(QQuick3DObjectChangeListener *l =
nullptr, ChangeTypes t = {}) : listener(l), types(t) {}
198 ChangeListener(QQuick3DObjectChangeListener *l) : listener(l), types(Geometry) {}
200 bool operator==(
const ChangeListener &other)
const
202 return listener == other.listener && types == other.types;
205 QQuick3DObjectChangeListener *listener;
214 QObjectList resourcesList;
217 QLazilyAllocated<ExtraData> extra;
219 QVector<QQuick3DObjectPrivate::ChangeListener> changeListeners;
221 void addItemChangeListener(QQuick3DObjectChangeListener *listener, ChangeTypes types);
222 void updateOrAddItemChangeListener(QQuick3DObjectChangeListener *listener, ChangeTypes types);
223 void removeItemChangeListener(QQuick3DObjectChangeListener *, ChangeTypes types);
225 QQuickStateGroup *_states();
226 QQuickStateGroup *_stateGroup;
229 TransformOrigin = 0x00000001,
230 Transform = 0x00000002,
231 BasicTransform = 0x00000004,
232 Position = 0x00000008,
236 Content = 0x00000040,
238 OpacityValue = 0x00000100,
239 ChildrenChanged = 0x00000200,
240 ChildrenStackingChanged = 0x00000400,
241 ParentChanged = 0x00000800,
246 EffectReference = 0x00008000,
247 Visible = 0x00010000,
248 HideReference = 0x00020000,
249 Antialiasing = 0x00040000,
251 InstanceRootChanged = 0x00080000,
255 TransformUpdateMask = TransformOrigin | Transform | BasicTransform | Position | Window,
256 ComplexTransformUpdateMask = Transform | Window,
257 ContentUpdateMask = Size | Content | Smooth | Window | Antialiasing,
258 ChildrenUpdateMask = ChildrenChanged | ChildrenStackingChanged | EffectReference | Window
261 quint32 dirtyAttributes;
262 QString dirtyToString()
const;
263 void dirty(DirtyType);
264 void addToDirtyList();
265 void removeFromDirtyList();
266 QQuick3DObject *nextDirtyItem;
267 QQuick3DObject **prevDirtyItem;
269 bool hasFlag(Flags flag) {
return (flags & FlagsT(flag)) != 0; }
271 void setCulled(
bool);
273 QPointer<QQuick3DSceneManager> sceneManager;
276 QQuick3DObject *parentItem;
278 QList<QQuick3DObject *> childItems;
279 void addChild(QQuick3DObject *);
280 void removeChild(QQuick3DObject *);
281 void siblingOrderChanged();
283 void refSceneManager(QQuick3DSceneManager &);
284 void derefSceneManager();
286 static void refSceneManager(QQuick3DObject *obj, QQuick3DSceneManager &mgr)
289 QQuick3DObjectPrivate::get(obj)->refSceneManager(mgr);
291 static void derefSceneManager(QQuick3DObject *obj)
294 QQuick3DObjectPrivate::get(obj)->derefSceneManager();
297 QQuick3DObject *subFocusItem;
298 void updateSubFocusItem(QQuick3DObject *scope,
bool focus);
300 void itemChange(QQuick3DObject::ItemChange,
const QQuick3DObject::ItemChangeData &);
302 virtual void updatePolish() {}
304 void requestSecondaryUpdate() { secondaryUpdateRequested =
true; }
306 QSSGRenderGraphObject *spatialNode =
nullptr;
308 Type type = Type::Unknown;
309 FlagsT flags = FlagsT(Flags::None);
310 bool secondaryUpdateRequested =
false;
311 bool componentComplete =
true;
312 bool preSyncNeeded =
false;
314 bool sharedResource =
false;
315 QQuick3DItem2D *contentItem2d =
nullptr;
316 ConnectionMap connectionMap;