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 auto it = connectionMap.constFind(key);
102 if (it != connectionMap.cend()) {
103 QObject::disconnect(*it);
104 connectionMap.erase(it);
111 QQuick3DObjectPrivate::refSceneManager(newO, *sceneManager);
112 auto connection = QObject::connect(newO, &QObject::destroyed, callContext, [callContext, setter](){ (callContext->*setter)(
nullptr); });
113 connectionMap.insert(key, connection);
119
120
121
122
123
124
125
126
127
128
129
130
131
132 template<
typename Context,
typename Setter,
typename Object3D>
133 static void attachWatcher(Context *context, Setter setter, Object3D *newO, Object3D *oldO)
135 attachWatcherPriv(context, context, setter, newO, oldO);
138 static QQuick3DObjectPrivate *get(QQuick3DObject *item) {
return item->d_func(); }
139 static const QQuick3DObjectPrivate *get(
const QQuick3DObject *item) {
return item->d_func(); }
140 static QSSGRenderGraphObject *updateSpatialNode(QQuick3DObject *o, QSSGRenderGraphObject *n) {
return o->updateSpatialNode(n); }
142 explicit QQuick3DObjectPrivate(Type t, FlagsT f);
143 explicit QQuick3DObjectPrivate(Type t, Flags f);
144 explicit QQuick3DObjectPrivate(Type t);
145 ~QQuick3DObjectPrivate() override;
146 void init(QQuick3DObject *parent);
148 QQmlListProperty<QObject> data();
149 QQmlListProperty<QObject> resources();
150 QQmlListProperty<QQuick3DObject> children();
152 QQmlListProperty<QQuickState> states();
153 QQmlListProperty<QQuickTransition> transitions();
155 QString state()
const;
156 void setState(
const QString &);
159 static void data_append(QQmlListProperty<QObject> *, QObject *);
160 static qsizetype data_count(QQmlListProperty<QObject> *);
161 static QObject *data_at(QQmlListProperty<QObject> *, qsizetype);
162 static void data_clear(QQmlListProperty<QObject> *);
165 static QObject *resources_at(QQmlListProperty<QObject> *, qsizetype);
166 static void resources_append(QQmlListProperty<QObject> *, QObject *);
167 static qsizetype resources_count(QQmlListProperty<QObject> *);
168 static void resources_clear(QQmlListProperty<QObject> *);
171 static void children_append(QQmlListProperty<QQuick3DObject> *, QQuick3DObject *);
172 static qsizetype children_count(QQmlListProperty<QQuick3DObject> *);
173 static QQuick3DObject *children_at(QQmlListProperty<QQuick3DObject> *, qsizetype);
174 static void children_clear(QQmlListProperty<QQuick3DObject> *);
176 void _q_resourceObjectDeleted(QObject *);
177 void _q_cleanupContentItem2D();
178 quint64 _q_createJSWrapper(QQmlV4ExecutionEnginePtr engine);
189 ImplicitWidth = 0x100,
190 ImplicitHeight = 0x200,
194 Q_DECLARE_FLAGS(ChangeTypes, ChangeType)
196 struct ChangeListener
198 using ChangeTypes = QQuick3DObjectPrivate::ChangeTypes;
200 ChangeListener(QQuick3DObjectChangeListener *l =
nullptr, ChangeTypes t = {}) : listener(l), types(t) {}
202 ChangeListener(QQuick3DObjectChangeListener *l) : listener(l), types(Geometry) {}
204 bool operator==(
const ChangeListener &other)
const
206 return listener == other.listener && types == other.types;
209 QQuick3DObjectChangeListener *listener;
218 QObjectList resourcesList;
221 QLazilyAllocated<ExtraData> extra;
223 QVector<QQuick3DObjectPrivate::ChangeListener> changeListeners;
225 void addItemChangeListener(QQuick3DObjectChangeListener *listener, ChangeTypes types);
226 void updateOrAddItemChangeListener(QQuick3DObjectChangeListener *listener, ChangeTypes types);
227 void removeItemChangeListener(QQuick3DObjectChangeListener *, ChangeTypes types);
229 QQuickStateGroup *_states();
230 QQuickStateGroup *_stateGroup;
233 TransformOrigin = 0x00000001,
234 Transform = 0x00000002,
235 BasicTransform = 0x00000004,
236 Position = 0x00000008,
240 Content = 0x00000040,
242 OpacityValue = 0x00000100,
243 ChildrenChanged = 0x00000200,
244 ChildrenStackingChanged = 0x00000400,
245 ParentChanged = 0x00000800,
250 EffectReference = 0x00008000,
251 Visible = 0x00010000,
252 HideReference = 0x00020000,
253 Antialiasing = 0x00040000,
255 InstanceRootChanged = 0x00080000,
259 TransformUpdateMask = TransformOrigin | Transform | BasicTransform | Position | Window,
260 ComplexTransformUpdateMask = Transform | Window,
261 ContentUpdateMask = Size | Content | Smooth | Window | Antialiasing,
262 ChildrenUpdateMask = ChildrenChanged | ChildrenStackingChanged | EffectReference | Window
265 quint32 dirtyAttributes;
266 QString dirtyToString()
const;
267 void dirty(DirtyType);
268 void addToDirtyList();
269 void removeFromDirtyList();
270 QQuick3DObject *nextDirtyItem;
271 QQuick3DObject **prevDirtyItem;
273 bool hasFlag(Flags flag) {
return (flags & FlagsT(flag)) != 0; }
275 void setCulled(
bool);
277 QPointer<QQuick3DSceneManager> sceneManager;
280 QQuick3DObject *parentItem;
282 QList<QQuick3DObject *> childItems;
283 void addChild(QQuick3DObject *);
284 void removeChild(QQuick3DObject *);
285 void siblingOrderChanged();
287 void refSceneManager(QQuick3DSceneManager &);
288 void derefSceneManager();
290 static void refSceneManager(QQuick3DObject *obj, QQuick3DSceneManager &mgr)
293 QQuick3DObjectPrivate::get(obj)->refSceneManager(mgr);
295 static void derefSceneManager(QQuick3DObject *obj)
298 QQuick3DObjectPrivate::get(obj)->derefSceneManager();
301 QQuick3DObject *subFocusItem;
302 void updateSubFocusItem(QQuick3DObject *scope,
bool focus);
304 void itemChange(QQuick3DObject::ItemChange,
const QQuick3DObject::ItemChangeData &);
306 virtual void updatePolish() {}
308 void requestSecondaryUpdate() { secondaryUpdateRequested =
true; }
310 QSSGRenderGraphObject *spatialNode =
nullptr;
312 Type type = Type::Unknown;
313 FlagsT flags = FlagsT(Flags::None);
314 bool secondaryUpdateRequested =
false;
315 bool componentComplete =
true;
316 bool preSyncNeeded =
false;
318 bool sharedResource =
false;
319 QQuick3DItem2D *contentItem2d =
nullptr;
320 ConnectionMap connectionMap;