Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qquick3dobject.cpp
Go to the documentation of this file.
1// Copyright (C) 2019 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
4#include "qquick3dobject.h"
5#include "qquick3dobject_p.h"
7#include "qquick3ditem2d_p.h"
8#include "qquick3dmodel_p.h"
9
10#include <QtQuick3DRuntimeRender/private/qssgrendergraphobject_p.h>
11
12#include <QtQml/private/qqmlglobal_p.h>
13#include <QtQuick/private/qquickstategroup_p.h>
14#include <QtQuick/private/qquickstate_p.h>
15#include <QtQuick/private/qquickitem_p.h>
16
17#include <private/qv4object_p.h>
18#include <private/qv4qobjectwrapper_p.h>
19
21
22
72QQuick3DObject::QQuick3DObject(QQuick3DObject *parent)
74{
75 Q_D(QQuick3DObject);
76 d->init(parent);
77}
78
80{
81 Q_D(QQuick3DObject);
82 // XXX todo - optimize
83 while (!d->childItems.isEmpty())
84 d->childItems.constFirst()->setParentItem(nullptr);
85
86 delete d->_stateGroup;
87 d->_stateGroup = nullptr;
88 delete d->contentItem2d;
89 d->contentItem2d = nullptr;
90
91 if (d->parentItem)
92 setParentItem(nullptr);
93
94 if (d->sceneRefCount > 1)
95 d->sceneRefCount = 1; // Make sure the scene is set to null in next call to derefSceneManager().
96
97 if (!d->parentItem && d->sceneManager)
99}
100
102{
103 Q_D(QQuick3DObject);
105}
106
135{
136 Q_D(QQuick3DObject);
137 if (parentItem == d->parentItem)
138 return;
139
140 if (parentItem) {
141 QQuick3DObject *itemAncestor = parentItem;
142 while (itemAncestor != nullptr) {
143 if (Q_UNLIKELY(itemAncestor == this)) {
144 qWarning() << "QSSGObject::setParentItem: Parent" << parentItem << "is already part of the subtree of" << this;
145 return;
146 }
147 itemAncestor = itemAncestor->parentItem();
148 }
149 }
150
151 d->removeFromDirtyList();
152
153 QQuick3DObject *oldParentItem = d->parentItem;
154
155 if (oldParentItem) {
157
158 op->removeChild(this);
159 } else if (d->sceneManager) {
160 d->sceneManager->parentlessItems.remove(this);
161 }
162
163 const auto parentSceneManager = parentItem ? QQuick3DObjectPrivate::get(parentItem)->sceneManager : nullptr;
164 if (d->sceneManager == parentSceneManager) {
165 // Avoid freeing and reallocating resources if the window stays the same.
166 d->parentItem = parentItem;
167 } else {
168 if (d->sceneManager)
170 d->parentItem = parentItem;
171 if (parentSceneManager)
172 QQuick3DObjectPrivate::refSceneManager(this, *parentSceneManager);
173 }
174
176
177 if (d->parentItem)
178 QQuick3DObjectPrivate::get(d->parentItem)->addChild(this);
179 else if (d->sceneManager)
180 d->sceneManager->parentlessItems.insert(this);
181
182 d->itemChange(ItemParentHasChanged, d->parentItem);
183
185}
186
187QString QQuick3DObject::state() const
188{
189 Q_D(const QQuick3DObject);
190 return d->state();
191}
192
193void QQuick3DObject::setState(const QString &state)
194{
195 Q_D(QQuick3DObject);
196 d->setState(state);
197}
198
199QList<QQuick3DObject *> QQuick3DObject::childItems() const
200{
201 Q_D(const QQuick3DObject);
202 return d->childItems;
203}
204
205QQuick3DObject *QQuick3DObject::parentItem() const
206{
207 Q_D(const QQuick3DObject);
208 return d->parentItem;
209}
210
212{
214 return node;
215}
216
218{
219}
220
221void QQuick3DObject::itemChange(QQuick3DObject::ItemChange, const QQuick3DObject::ItemChangeData &)
222{
223}
224
225QQuick3DObject::QQuick3DObject(QQuick3DObjectPrivate &dd, QQuick3DObject *parent)
226 : QObject(dd, parent)
227{
228 Q_D(QQuick3DObject);
229 d->init(parent);
230}
231
233{
234 Q_D(QQuick3DObject);
235 d->componentComplete = false;
236 if (d->_stateGroup)
237 d->_stateGroup->classBegin();
238}
239
241{
242 Q_D(QQuick3DObject);
243 d->componentComplete = true;
244 if (d->_stateGroup)
245 d->_stateGroup->componentComplete();
246
247 if (d->sceneManager && d->dirtyAttributes) {
248 d->addToDirtyList();
249 }
251}
252
254{
255 Q_D(const QQuick3DObject);
256 return d->componentComplete;
257}
258
260{
261
262}
263
265 : _stateGroup(nullptr)
266 , dirtyAttributes(0)
267 , nextDirtyItem(nullptr)
268 , prevDirtyItem(nullptr)
269 , sceneManager(nullptr)
270 , sceneRefCount(0)
271 , parentItem(nullptr)
272 , subFocusItem(nullptr)
273 , type(t)
274{
275}
276
278{
279}
280
282{
283 Q_Q(QQuick3DObject);
284
285 if (parent)
286 q->setParentItem(parent);
287}
288
329{
330 return QQmlListProperty<QObject>(q_func(),
331 nullptr,
336}
337
343{
344 return QQmlListProperty<QObject>(q_func(),
345 nullptr,
350}
351
376{
377 return QQmlListProperty<QQuick3DObject>(q_func(),
378 nullptr,
383}
384
431{
432 return _states()->statesProperty();
433}
434
473{
474 return _states()->transitionsProperty();
475}
476
501{
502 return _stateGroup ? _stateGroup->state() : QString();
503}
504
506{
508}
509
511{
512 if (!o)
513 return;
514
515 QQuick3DObject *that = static_cast<QQuick3DObject *>(prop->object);
517
518 if (QQuick3DObject *item = qmlobject_cast<QQuick3DObject *>(o)) {
519 item->setParentItem(that);
520
521 } else {
523 if (quickItem) {
524 if (!privateItem->contentItem2d) {
525 privateItem->contentItem2d = new QQuick3DItem2D(quickItem);
526 privateItem->contentItem2d->setParent(that);
527 privateItem->contentItem2d->setParentItem(that);
528 } else {
529 privateItem->contentItem2d->addChildItem(quickItem);
530 }
531 qmlobject_connect(privateItem->contentItem2d, QQuick3DItem2D, SIGNAL(allChildrenRemoved()),
533 } else {
534 o->setParent(that);
535 }
536 }
537 resources_append(prop, o);
538}
539
541{
542 QQuick3DObject *item = static_cast<QQuick3DObject *>(property->object);
544 QQmlListProperty<QObject> resourcesProperty = privateItem->resources();
545 QQmlListProperty<QQuick3DObject> childrenProperty = privateItem->children();
546
547 return resources_count(&resourcesProperty) + children_count(&childrenProperty);
548}
549
551{
552 QQuick3DObject *item = static_cast<QQuick3DObject *>(property->object);
554 QQmlListProperty<QObject> resourcesProperty = privateItem->resources();
555 QQmlListProperty<QQuick3DObject> childrenProperty = privateItem->children();
556
557 int resourcesCount = resources_count(&resourcesProperty);
558 if (i < resourcesCount)
559 return resources_at(&resourcesProperty, i);
560 const int j = i - resourcesCount;
561 if (j < children_count(&childrenProperty))
562 return children_at(&childrenProperty, j);
563 return nullptr;
564}
565
567{
568 QQuick3DObject *item = static_cast<QQuick3DObject *>(property->object);
570 QQmlListProperty<QObject> resourcesProperty = privateItem->resources();
571 QQmlListProperty<QQuick3DObject> childrenProperty = privateItem->children();
572
573 resources_clear(&resourcesProperty);
574 children_clear(&childrenProperty);
575}
576
578{
579 QQuick3DObjectPrivate *quickItemPrivate = QQuick3DObjectPrivate::get(static_cast<QQuick3DObject *>(prop->object));
580 return quickItemPrivate->extra.isAllocated() ? quickItemPrivate->extra->resourcesList.value(index) : 0;
581}
582
584{
585 QQuick3DObject *quickItem = static_cast<QQuick3DObject *>(prop->object);
586 QQuick3DObjectPrivate *quickItemPrivate = QQuick3DObjectPrivate::get(quickItem);
587 if (!quickItemPrivate->extra.value().resourcesList.contains(object)) {
588 quickItemPrivate->extra.value().resourcesList.append(object);
589 // clang-format off
590 qmlobject_connect(object, QObject, SIGNAL(destroyed(QObject*)),
592 // clang-format on
593 }
594}
595
597{
598 QQuick3DObjectPrivate *quickItemPrivate = QQuick3DObjectPrivate::get(static_cast<QQuick3DObject *>(prop->object));
599 return quickItemPrivate->extra.isAllocated() ? quickItemPrivate->extra->resourcesList.size() : 0;
600}
601
603{
604 QQuick3DObject *quickItem = static_cast<QQuick3DObject *>(prop->object);
605 QQuick3DObjectPrivate *quickItemPrivate = QQuick3DObjectPrivate::get(quickItem);
606 if (quickItemPrivate->extra.isAllocated()) { // If extra is not allocated resources is empty.
607 for (QObject *object : std::as_const(quickItemPrivate->extra->resourcesList)) {
608 // clang-format off
609 qmlobject_disconnect(object, QObject, SIGNAL(destroyed(QObject*)),
611 // clang-format on
612 }
613 quickItemPrivate->extra->resourcesList.clear();
614 }
615}
616
618{
619 if (!o)
620 return;
621
622 QQuick3DObject *that = static_cast<QQuick3DObject *>(prop->object);
623 if (o->parentItem() == that)
624 o->setParentItem(nullptr);
625
626 o->setParentItem(that);
627}
628
630{
632 return p->childItems.size();
633}
634
636{
638 if (index >= p->childItems.size() || index < 0)
639 return nullptr;
640
641 return p->childItems.at(index);
642}
643
645{
646 QQuick3DObject *that = static_cast<QQuick3DObject *>(prop->object);
648 while (!p->childItems.isEmpty())
649 p->childItems.at(0)->setParentItem(nullptr);
650}
651
653{
654 if (extra.isAllocated() && extra->resourcesList.contains(object))
655 extra->resourcesList.removeAll(object);
656}
657
659{
660 // Only Schedule the item for deletion, as this may get called
661 // as a result of teardown as well leading to a double delete
662 if (contentItem2d)
664 contentItem2d = nullptr;
665}
666
668{
669 changeListeners.append(ChangeListener(listener, types));
670}
671
673{
674 const ChangeListener changeListener(listener, types);
675 const int index = changeListeners.indexOf(changeListener);
676 if (index > -1)
677 changeListeners[index].types = changeListener.types;
678 else
679 changeListeners.append(changeListener);
680}
681
683{
684 ChangeListener change(listener, types);
685 changeListeners.removeOne(change);
686}
687
689{
690 Q_Q(QQuick3DObject);
691 if (!_stateGroup) {
695 // clang-format off
697 q, QQuick3DObject, SIGNAL(stateChanged()));
698 // clang-format on
699 }
700
701 return _stateGroup;
702}
703
705{
706#define DIRTY_TO_STRING(value) \
707 if (dirtyAttributes & value) { \
708 if (!rv.isEmpty()) \
709 rv.append(QLatin1Char('|')); \
710 rv.append(QLatin1String(#value)); \
711 }
712
713 // QString rv = QLatin1String("0x") + QString::number(dirtyAttributes, 16);
714 QString rv;
715
719 DIRTY_TO_STRING(Position);
735
736 return rv;
737}
738
740{
741 // NOTE: Models that get an instance root has an "external" node that affects its transform
742 // we therefore give models with an instance root a lower priority in the update list (See: addToDirtyList()).
743 // For this to work we need to re-evaluate models priority when the instance root changes.
744 if ((type & InstanceRootChanged) != 0)
746
751 }
752 }
753}
754
756{
757 Q_Q(QQuick3DObject);
758
760 if (!prevDirtyItem) {
762
764 // NOTE: We do special handling of models with an instance root (that is not itself...)
765 // to ensure those models are processed after instance root nodes.
766 const bool hasInstanceRoot = (type == Type::Model && static_cast<QQuick3DModel *>(q)->instanceRoot() && static_cast<QQuick3DModel *>(q)->instanceRoot() != q);
767 const auto dirtyListIdx = !hasInstanceRoot ? QQuick3DSceneManager::nodeListIndex(type)
769 nextDirtyItem = sceneManager->dirtyNodes[dirtyListIdx];
770 if (nextDirtyItem)
772 prevDirtyItem = &sceneManager->dirtyNodes[dirtyListIdx];
773 sceneManager->dirtyNodes[dirtyListIdx] = q;
775 const auto dirtyListIdx = QQuick3DSceneManager::extensionListIndex(type);
777 if (nextDirtyItem)
780 sceneManager->dirtyExtensions[dirtyListIdx] = q;
781 } else {
782 const auto dirtyListIdx = QQuick3DSceneManager::resourceListIndex(type);
784 if (nextDirtyItem)
786 prevDirtyItem = &sceneManager->dirtyResources[dirtyListIdx];
787 sceneManager->dirtyResources[dirtyListIdx] = q;
788 }
789 }
792}
793
795{
796 if (prevDirtyItem) {
797 if (nextDirtyItem)
800 prevDirtyItem = nullptr;
801 nextDirtyItem = nullptr;
802 }
805}
806
808{
809 if (cull == culled)
810 return;
811
812 culled = cull;
813 if ((cull && ++extra.value().hideRefCount == 1) || (!cull && --extra.value().hideRefCount == 0))
815}
816
818{
819 Q_Q(QQuick3DObject);
820
822
824
826
827 itemChange(QQuick3DObject::ItemChildAddedChange, child);
828
829 emit q->childrenChanged();
830}
831
833{
834 Q_Q(QQuick3DObject);
835
840
842
843 itemChange(QQuick3DObject::ItemChildRemovedChange, child);
844
845 emit q->childrenChanged();
846}
847
849{
850 Q_Q(QQuick3DObject);
851 if (!changeListeners.isEmpty()) {
852 const auto listeners = changeListeners; // NOTE: intentional copy (QTBUG-54732)
853 for (const QQuick3DObjectPrivate::ChangeListener &change : listeners) {
854 if (change.types & QQuick3DObjectPrivate::SiblingOrder) {
855 change.listener->itemSiblingOrderChanged(q);
856 }
857 }
858 }
859}
860
862{
863 // An item needs a scene manager if it is referenced by another item which has a scene manager.
864 // Typically the item is referenced by a parent, but can also be referenced by a
865 // ShaderEffect or ShaderEffectSource. 'sceneRefCount' counts how many items with
866 // a scene manager is referencing this item. When the reference count goes from zero to one,
867 // or one to zero, the scene manager of this item is updated and propagated to the children.
868 // As long as the reference count stays above zero, the scene manager is unchanged.
869 // refSceneManager() increments the reference count.
870 // derefSceneManager() decrements the reference count.
871
872 Q_Q(QQuick3DObject);
873
874 // Handle the case where the view has been deleted while the object lives on.
875 if (sceneManager.isNull() && sceneRefCount == 1)
876 sceneRefCount = 0;
877
878 Q_ASSERT((sceneManager != nullptr) == (sceneRefCount > 0));
879 if (++sceneRefCount > 1) {
880 // Sanity check. Even if there's a different scene manager the window should be the same.
881 if (c.window() != sceneManager->window()) {
882 qWarning("QSSGObject: Cannot use same item on different windows at the same time.");
883 return;
884 }
885
886 // NOTE: Simple tracking for resources that are shared between scenes.
887 if (&c != sceneManager) {
888 sharedResource = true;
889 for (int ii = 0; ii < childItems.size(); ++ii) {
893 }
894 }
895
896 return; // Scene manager already set.
897 }
898
899 Q_ASSERT(sceneManager == nullptr);
900 sceneManager = &c;
901
902 // if (polishScheduled)
903 // QSSGWindowPrivate::get(window)->itemsToPolish.append(q);
904
905 if (!parentItem)
907 else
909
910 for (int ii = 0; ii < childItems.size(); ++ii) {
914 }
915
916 dirty(Window);
917
918 itemChange(QQuick3DObject::ItemSceneChange, &c);
919}
920
922{
923 Q_Q(QQuick3DObject);
924
925 if (!sceneManager)
926 return; // This can happen when destroying recursive shader effect sources.
927
928 if (--sceneRefCount > 0)
929 return; // There are still other references, so don't set the scene manager to null yet.
930
932 if (sceneManager)
934
935 if (spatialNode)
937 if (!parentItem)
939
940 spatialNode = nullptr;
941
942 for (int ii = 0; ii < childItems.size(); ++ii) {
945 }
946
947 sceneManager = nullptr;
948
949 dirty(Window);
950
951 itemChange(QQuick3DObject::ItemSceneChange, sceneManager.data());
952}
953
955{
956 Q_Q(QQuick3DObject);
957 Q_ASSERT(scope);
958
960
961 QQuick3DObject *oldSubFocusItem = scopePrivate->subFocusItem;
962 // Correct focus chain in scope
963 if (oldSubFocusItem) {
964 QQuick3DObject *sfi = scopePrivate->subFocusItem->parentItem();
965 while (sfi && sfi != scope) {
967 sfi = sfi->parentItem();
968 }
969 }
970
971 if (focus) {
972 scopePrivate->subFocusItem = q;
973 QQuick3DObject *sfi = scopePrivate->subFocusItem->parentItem();
974 while (sfi && sfi != scope) {
976 sfi = sfi->parentItem();
977 }
978 } else {
979 scopePrivate->subFocusItem = nullptr;
980 }
981}
982
983void QQuick3DObjectPrivate::itemChange(QQuick3DObject::ItemChange change, const QQuick3DObject::ItemChangeData &data)
984{
985 Q_Q(QQuick3DObject);
986 switch (change) {
987 case QQuick3DObject::ItemRotationHasChanged:
988 // TODO:
989 qWarning("ItemRoationHasChange is unhandled!!!!");
990 break;
991 case QQuick3DObject::ItemChildAddedChange: {
992 q->itemChange(change, data);
993 if (!changeListeners.isEmpty()) {
994 const auto listeners = changeListeners; // NOTE: intentional copy (QTBUG-54732)
995 for (const QQuick3DObjectPrivate::ChangeListener &change : listeners) {
996 if (change.types & QQuick3DObjectPrivate::Children) {
997 change.listener->itemChildAdded(q, data.item);
998 }
999 }
1000 }
1001 break;
1002 }
1003 case QQuick3DObject::ItemChildRemovedChange: {
1004 q->itemChange(change, data);
1005 if (!changeListeners.isEmpty()) {
1006 const auto listeners = changeListeners; // NOTE: intentional copy (QTBUG-54732)
1007 for (const QQuick3DObjectPrivate::ChangeListener &change : listeners) {
1008 if (change.types & QQuick3DObjectPrivate::Children) {
1009 change.listener->itemChildRemoved(q, data.item);
1010 }
1011 }
1012 }
1013 break;
1014 }
1015 case QQuick3DObject::ItemSceneChange:
1016 q->itemChange(change, data);
1017 break;
1018 case QQuick3DObject::ItemVisibleHasChanged: {
1019 q->itemChange(change, data);
1020 if (!changeListeners.isEmpty()) {
1021 const auto listeners = changeListeners; // NOTE: intentional copy (QTBUG-54732)
1022 for (const QQuick3DObjectPrivate::ChangeListener &change : listeners) {
1023 if (change.types & QQuick3DObjectPrivate::Visibility) {
1024 change.listener->itemVisibilityChanged(q);
1025 }
1026 }
1027 }
1028 break;
1029 }
1030 case QQuick3DObject::ItemEnabledHasChanged: {
1031 q->itemChange(change, data);
1032 if (!changeListeners.isEmpty()) {
1033 const auto listeners = changeListeners; // NOTE: intentional copy (QTBUG-54732)
1034 for (const QQuick3DObjectPrivate::ChangeListener &change : listeners) {
1035 if (change.types & QQuick3DObjectPrivate::Enabled) {
1036 change.listener->itemEnabledChanged(q);
1037 }
1038 }
1039 }
1040 break;
1041 }
1042 case QQuick3DObject::ItemParentHasChanged: {
1043 q->itemChange(change, data);
1044 if (!changeListeners.isEmpty()) {
1045 const auto listeners = changeListeners; // NOTE: intentional copy (QTBUG-54732)
1046 for (const QQuick3DObjectPrivate::ChangeListener &change : listeners) {
1047 if (change.types & QQuick3DObjectPrivate::Parent) {
1048 change.listener->itemParentChanged(q, data.item);
1049 }
1050 }
1051 }
1052 break;
1053 }
1054 case QQuick3DObject::ItemOpacityHasChanged: {
1055 q->itemChange(change, data);
1056 if (!changeListeners.isEmpty()) {
1057 const auto listeners = changeListeners; // NOTE: intentional copy (QTBUG-54732)
1058 for (const QQuick3DObjectPrivate::ChangeListener &change : listeners) {
1059 if (change.types & QQuick3DObjectPrivate::Opacity) {
1060 change.listener->itemOpacityChanged(q);
1061 }
1062 }
1063 }
1064 break;
1065 }
1066 case QQuick3DObject::ItemActiveFocusHasChanged:
1067 q->itemChange(change, data);
1068 break;
1069 case QQuick3DObject::ItemAntialiasingHasChanged:
1070 // fall through
1071 case QQuick3DObject::ItemDevicePixelRatioHasChanged:
1072 q->itemChange(change, data);
1073 break;
1074 }
1075}
1076
1077namespace QV4 {
1078namespace Heap {
1080{
1081 static void markObjects(QV4::Heap::Base *that, QV4::MarkStack *markStack);
1082};
1083}
1084}
1085
1087{
1089};
1090
1092
1094{
1095 QObjectWrapper *This = static_cast<QObjectWrapper *>(that);
1096 if (QQuick3DObject *item = static_cast<QQuick3DObject *>(This->object())) {
1097 for (QQuick3DObject *child : std::as_const(QQuick3DObjectPrivate::get(item)->childItems))
1099 }
1100 QObjectWrapper::markObjects(that, markStack);
1101}
1102
1104{
1105 return (engine->memoryManager->allocate<QSSGItemWrapper>(q_func()))->asReturnedValue();
1106}
1107
1109
1111
1112#include "moc_qquick3dobject.cpp"
void setParentItem(QGraphicsItem *parent)
Sets this item's parent item to newParent.
Definition qlist.h:74
qsizetype size() const noexcept
Definition qlist.h:386
bool removeOne(const AT &t)
Definition qlist.h:581
const_reference at(qsizetype i) const noexcept
Definition qlist.h:429
qsizetype removeAll(const AT &t)
Definition qlist.h:575
void append(parameter_type t)
Definition qlist.h:441
QObject * parent
Definition qobject.h:61
\inmodule QtCore
Definition qobject.h:90
void setParent(QObject *parent)
Makes the object a child of parent.
Definition qobject.cpp:2142
void deleteLater()
\threadsafe
Definition qobject.cpp:2352
T * data() const
Definition qpointer.h:56
bool isNull() const
Returns true if the referenced object has been destroyed or if there is no referenced object; otherwi...
Definition qpointer.h:67
The QQmlListProperty class allows applications to expose list-like properties of QObject-derived clas...
Definition qqmllist.h:24
QObject * object
Definition qqmllist.h:81
void addChildItem(QQuickItem *item)
static void children_append(QQmlListProperty< QQuick3DObject > *, QQuick3DObject *)
QQuick3DObject * parentItem
void addItemChangeListener(QQuick3DObjectChangeListener *listener, ChangeTypes types)
QList< QQuick3DObject * > childItems
void updateOrAddItemChangeListener(QQuick3DObjectChangeListener *listener, ChangeTypes types)
QQmlListProperty< QQuick3DObject > children()
QQuickStateGroup * _stateGroup
QQmlListProperty< QObject > resources()
QPointer< QQuick3DSceneManager > sceneManager
QQuick3DObject ** prevDirtyItem
void removeItemChangeListener(QQuick3DObjectChangeListener *, ChangeTypes types)
static void resources_append(QQmlListProperty< QObject > *, QObject *)
void updateSubFocusItem(QQuick3DObject *scope, bool focus)
QQuick3DObject * subFocusItem
static qsizetype resources_count(QQmlListProperty< QObject > *)
static void data_clear(QQmlListProperty< QObject > *)
static void data_append(QQmlListProperty< QObject > *, QObject *)
static QObject * data_at(QQmlListProperty< QObject > *, qsizetype)
QQuick3DObject * nextDirtyItem
static QQuick3DObject * children_at(QQmlListProperty< QQuick3DObject > *, qsizetype)
static QObject * resources_at(QQmlListProperty< QObject > *, qsizetype)
void refSceneManager(QQuick3DSceneManager &)
static void resources_clear(QQmlListProperty< QObject > *)
static qsizetype data_count(QQmlListProperty< QObject > *)
QQmlListProperty< QQuickTransition > transitions()
void _q_resourceObjectDeleted(QObject *)
void removeChild(QQuick3DObject *)
void addChild(QQuick3DObject *)
void itemChange(QQuick3DObject::ItemChange, const QQuick3DObject::ItemChangeData &)
QVector< QQuick3DObjectPrivate::ChangeListener > changeListeners
QQuickStateGroup * _states()
QLazilyAllocated< ExtraData > extra
static QQuick3DObjectPrivate * get(QQuick3DObject *item)
QQmlListProperty< QQuickState > states()
quint64 _q_createJSWrapper(QV4::ExecutionEngine *engine)
static void children_clear(QQmlListProperty< QQuick3DObject > *)
void init(QQuick3DObject *parent)
QSSGRenderGraphObject * spatialNode
void setState(const QString &)
static qsizetype children_count(QQmlListProperty< QQuick3DObject > *)
QQuick3DItem2D * contentItem2d
QString dirtyToString() const
QQmlListProperty< QObject > data()
\qmltype Object3D \inqmlmodule QtQuick3D \instantiates QQuick3DObject \inherits QtObject
void componentComplete() override
Invoked after the root component that caused this instantiation has completed construction.
QQuick3DObject * parent
\qmlproperty Object3D QtQuick3D::Object3D::parent This property holds the parent of the Object3D in a...
void setParentItem(QQuick3DObject *parentItem)
virtual QSSGRenderGraphObject * updateSpatialNode(QSSGRenderGraphObject *node)
virtual void itemChange(ItemChange, const ItemChangeData &)
void parentChanged()
~QQuick3DObject() override
virtual void preSync()
bool isComponentComplete() const
virtual void markAllDirty()
void classBegin() override
Invoked after class creation, but before any properties have been set.
static size_t nodeListIndex(QSSGRenderGraphObject::Type type)
QList< QQuick3DObject * > dirtyBoundingBoxList
QQuick3DObject * dirtyNodes[size_t(NodePriority::Count)]
QQuick3DObject * dirtyExtensions[size_t(ExtensionPriority::Count)]
void dirtyItem(QQuick3DObject *item)
QSet< QQuick3DObject * > parentlessItems
QQuick3DObject * dirtyResources[size_t(ResourcePriority::Count)]
static size_t resourceListIndex(QSSGRenderGraphObject::Type type)
static constexpr size_t extensionListIndex(QSSGRenderGraphObject::Type type)
void cleanup(QSSGRenderGraphObject *item)
The QQuickItem class provides the most basic of all visual items in \l {Qt Quick}.
Definition qquickitem.h:64
QQmlListProperty< QQuickTransition > transitionsProperty()
\qmlproperty list<Transition> QtQuick::StateGroup::transitions This property holds a list of transiti...
void setState(const QString &)
QQmlListProperty< QQuickState > statesProperty()
\qmlproperty list<State> QtQuick::StateGroup::states This property holds a list of states defined by ...
void classBegin() override
Invoked after class creation, but before any properties have been set.
bool remove(const T &value)
Definition qset.h:63
iterator insert(const T &value)
Definition qset.h:155
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:127
[Window class with invokable method]
Definition window.h:11
bool focus
[0]
else opt state
[0]
Combined button and popup list for selecting options.
\qmltype Particle \inqmlmodule QtQuick.Particles
#define Q_UNLIKELY(x)
#define qWarning
Definition qlogging.h:162
#define SLOT(a)
Definition qobjectdefs.h:51
#define SIGNAL(a)
Definition qobjectdefs.h:52
GLuint index
[2]
GLsizei GLenum GLenum * types
GLenum type
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
const GLubyte * c
GLdouble GLdouble t
Definition qopenglext.h:243
GLdouble GLdouble GLdouble GLdouble q
Definition qopenglext.h:259
GLfloat GLfloat p
[1]
#define qmlobject_disconnect(Sender, SenderType, Signal, Receiver, ReceiverType, Method)
Disconnect Signal of Sender from Method of Receiver.
#define qmlobject_connect(Sender, SenderType, Signal, Receiver, ReceiverType, Method)
Connect Signal of Sender to Method of Receiver.
#define Q_QUICK3D_PROFILE_REGISTER_D(obj)
#define Q_QUICK3D_PROFILE_ASSIGN_ID_SG(obj, bgnode)
#define DIRTY_TO_STRING(value)
QQuickItem * qobject_cast< QQuickItem * >(QObject *o)
Definition qquickitem.h:483
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
#define emit
unsigned long long quint64
Definition qtypes.h:56
ptrdiff_t qsizetype
Definition qtypes.h:70
#define DEFINE_OBJECT_VTABLE(classname)
#define V4_OBJECT2(DataClass, superClass)
const char property[13]
Definition qwizard.cpp:101
QObject::connect nullptr
QGraphicsItem * item
QLayoutItem * child
[0]
QJSEngine engine
[0]
bool contains(const AT &t) const noexcept
Definition qlist.h:44
static Q_REQUIRED_RESULT constexpr bool isNodeType(Type type) Q_DECL_NOTHROW
static constexpr bool isExtension(Type type) noexcept
static void markObjects(Heap::Base *that, MarkStack *markStack)
static void markObjects(QV4::Heap::Base *that, QV4::MarkStack *markStack)
static void markWrapper(QObject *object, MarkStack *markStack)
Definition moc.h:24
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent