Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
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
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
216
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
280
282{
283 Q_Q(QQuick3DObject);
284
285 if (parent)
286 q->setParentItem(parent);
287}
288
328QQmlListProperty<QObject> QQuick3DObjectPrivate::data()
329{
330 return QQmlListProperty<QObject>(q_func(),
331 nullptr,
336}
337
342QQmlListProperty<QObject> QQuick3DObjectPrivate::resources()
343{
344 return QQmlListProperty<QObject>(q_func(),
345 nullptr,
350}
351
375QQmlListProperty<QQuick3DObject> QQuick3DObjectPrivate::children()
376{
377 return QQmlListProperty<QQuick3DObject>(q_func(),
378 nullptr,
383}
384
430QQmlListProperty<QQuickState> QQuick3DObjectPrivate::states()
431{
432 return _states()->statesProperty();
433}
434
472QQmlListProperty<QQuickTransition> QQuick3DObjectPrivate::transitions()
473{
474 return _states()->transitionsProperty();
475}
476
504
509
510void QQuick3DObjectPrivate::data_append(QQmlListProperty<QObject> *prop, QObject *o)
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
566void QQuick3DObjectPrivate::data_clear(QQmlListProperty<QObject> *property)
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
583void QQuick3DObjectPrivate::resources_append(QQmlListProperty<QObject> *prop, QObject *object)
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
596qsizetype QQuick3DObjectPrivate::resources_count(QQmlListProperty<QObject> *prop)
597{
598 QQuick3DObjectPrivate *quickItemPrivate = QQuick3DObjectPrivate::get(static_cast<QQuick3DObject *>(prop->object));
599 return quickItemPrivate->extra.isAllocated() ? quickItemPrivate->extra->resourcesList.size() : 0;
600}
601
602void QQuick3DObjectPrivate::resources_clear(QQmlListProperty<QObject> *prop)
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
617void QQuick3DObjectPrivate::children_append(QQmlListProperty<QQuick3DObject> *prop, QQuick3DObject *o)
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
629qsizetype QQuick3DObjectPrivate::children_count(QQmlListProperty<QQuick3DObject> *prop)
630{
631 QQuick3DObjectPrivate *p = QQuick3DObjectPrivate::get(static_cast<QQuick3DObject *>(prop->object));
632 return p->childItems.size();
633}
634
635QQuick3DObject *QQuick3DObjectPrivate::children_at(QQmlListProperty<QQuick3DObject> *prop, qsizetype index)
636{
637 QQuick3DObjectPrivate *p = QQuick3DObjectPrivate::get(static_cast<QQuick3DObject *>(prop->object));
638 if (index >= p->childItems.size() || index < 0)
639 return nullptr;
640
641 return p->childItems.at(index);
642}
643
644void QQuick3DObjectPrivate::children_clear(QQmlListProperty<QQuick3DObject> *prop)
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
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);
720 DIRTY_TO_STRING(Size);
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
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)
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 for (int ii = 0; ii < childItems.size(); ++ii) {
938 }
939
940 if (!parentItem)
942
943 if (spatialNode) {
945 spatialNode = nullptr;
946 }
947
948 sceneManager = nullptr;
949
950 dirty(Window);
951
952 itemChange(QQuick3DObject::ItemSceneChange, sceneManager.data());
953}
954
956{
957 Q_Q(QQuick3DObject);
958 Q_ASSERT(scope);
959
961
962 QQuick3DObject *oldSubFocusItem = scopePrivate->subFocusItem;
963 // Correct focus chain in scope
964 if (oldSubFocusItem) {
965 QQuick3DObject *sfi = scopePrivate->subFocusItem->parentItem();
966 while (sfi && sfi != scope) {
967 QQuick3DObjectPrivate::get(sfi)->subFocusItem = nullptr;
968 sfi = sfi->parentItem();
969 }
970 }
971
972 if (focus) {
973 scopePrivate->subFocusItem = q;
974 QQuick3DObject *sfi = scopePrivate->subFocusItem->parentItem();
975 while (sfi && sfi != scope) {
976 QQuick3DObjectPrivate::get(sfi)->subFocusItem = q;
977 sfi = sfi->parentItem();
978 }
979 } else {
980 scopePrivate->subFocusItem = nullptr;
981 }
982}
983
984void QQuick3DObjectPrivate::itemChange(QQuick3DObject::ItemChange change, const QQuick3DObject::ItemChangeData &data)
985{
986 Q_Q(QQuick3DObject);
987 switch (change) {
988 case QQuick3DObject::ItemRotationHasChanged:
989 // TODO:
990 qWarning("ItemRoationHasChange is unhandled!!!!");
991 break;
992 case QQuick3DObject::ItemChildAddedChange: {
993 q->itemChange(change, data);
994 if (!changeListeners.isEmpty()) {
995 const auto listeners = changeListeners; // NOTE: intentional copy (QTBUG-54732)
997 if (change.types & QQuick3DObjectPrivate::Children) {
998 change.listener->itemChildAdded(q, data.item);
999 }
1000 }
1001 }
1002 break;
1003 }
1004 case QQuick3DObject::ItemChildRemovedChange: {
1005 q->itemChange(change, data);
1006 if (!changeListeners.isEmpty()) {
1007 const auto listeners = changeListeners; // NOTE: intentional copy (QTBUG-54732)
1008 for (const QQuick3DObjectPrivate::ChangeListener &change : listeners) {
1009 if (change.types & QQuick3DObjectPrivate::Children) {
1010 change.listener->itemChildRemoved(q, data.item);
1011 }
1012 }
1013 }
1014 break;
1015 }
1016 case QQuick3DObject::ItemSceneChange:
1017 q->itemChange(change, data);
1018 break;
1019 case QQuick3DObject::ItemVisibleHasChanged: {
1020 q->itemChange(change, data);
1021 if (!changeListeners.isEmpty()) {
1022 const auto listeners = changeListeners; // NOTE: intentional copy (QTBUG-54732)
1023 for (const QQuick3DObjectPrivate::ChangeListener &change : listeners) {
1024 if (change.types & QQuick3DObjectPrivate::Visibility) {
1025 change.listener->itemVisibilityChanged(q);
1026 }
1027 }
1028 }
1029 break;
1030 }
1031 case QQuick3DObject::ItemEnabledHasChanged: {
1032 q->itemChange(change, data);
1033 if (!changeListeners.isEmpty()) {
1034 const auto listeners = changeListeners; // NOTE: intentional copy (QTBUG-54732)
1035 for (const QQuick3DObjectPrivate::ChangeListener &change : listeners) {
1036 if (change.types & QQuick3DObjectPrivate::Enabled) {
1037 change.listener->itemEnabledChanged(q);
1038 }
1039 }
1040 }
1041 break;
1042 }
1043 case QQuick3DObject::ItemParentHasChanged: {
1044 q->itemChange(change, data);
1045 if (!changeListeners.isEmpty()) {
1046 const auto listeners = changeListeners; // NOTE: intentional copy (QTBUG-54732)
1047 for (const QQuick3DObjectPrivate::ChangeListener &change : listeners) {
1048 if (change.types & QQuick3DObjectPrivate::Parent) {
1049 change.listener->itemParentChanged(q, data.item);
1050 }
1051 }
1052 }
1053 break;
1054 }
1055 case QQuick3DObject::ItemOpacityHasChanged: {
1056 q->itemChange(change, data);
1057 if (!changeListeners.isEmpty()) {
1058 const auto listeners = changeListeners; // NOTE: intentional copy (QTBUG-54732)
1059 for (const QQuick3DObjectPrivate::ChangeListener &change : listeners) {
1060 if (change.types & QQuick3DObjectPrivate::Opacity) {
1061 change.listener->itemOpacityChanged(q);
1062 }
1063 }
1064 }
1065 break;
1066 }
1067 case QQuick3DObject::ItemActiveFocusHasChanged:
1068 q->itemChange(change, data);
1069 break;
1070 case QQuick3DObject::ItemAntialiasingHasChanged:
1071 // fall through
1072 case QQuick3DObject::ItemDevicePixelRatioHasChanged:
1073 q->itemChange(change, data);
1074 break;
1075 }
1076}
1077
1078namespace QV4 {
1079namespace Heap {
1081{
1082 static void markObjects(QV4::Heap::Base *that, QV4::MarkStack *markStack);
1083};
1084}
1085}
1086
1091
1093
1095{
1096 QObjectWrapper *This = static_cast<QObjectWrapper *>(that);
1097 if (QQuick3DObject *item = static_cast<QQuick3DObject *>(This->object())) {
1098 for (QQuick3DObject *child : std::as_const(QQuick3DObjectPrivate::get(item)->childItems))
1100 }
1101 QObjectWrapper::markObjects(that, markStack);
1102}
1103
1105{
1106 return (engine->memoryManager->allocate<QSSGItemWrapper>(q_func()))->asReturnedValue();
1107}
1108
1110
1112
1113#include "moc_qquick3dobject.cpp"
QList< QtAndroidInput::GenericMotionEventListener * > listeners
void setParentItem(QGraphicsItem *parent)
Sets this item's parent item to newParent.
qsizetype size() const noexcept
Definition qlist.h:397
bool removeOne(const AT &t)
Definition qlist.h:598
const_reference at(qsizetype i) const noexcept
Definition qlist.h:446
qsizetype removeAll(const AT &t)
Definition qlist.h:592
void append(parameter_type t)
Definition qlist.h:458
QObject * parent
Definition qobject.h:73
\inmodule QtCore
Definition qobject.h:103
void deleteLater()
\threadsafe
Definition qobject.cpp:2435
T * data() const noexcept
Definition qpointer.h:73
bool isNull() const noexcept
Definition qpointer.h:84
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)
static qsizetype resources_count(QQmlListProperty< QObject > *)
quint64 _q_createJSWrapper(QQmlV4ExecutionEnginePtr engine)
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()
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:63
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.
static constexpr bool isNodeType(Type type) noexcept
static constexpr bool isExtension(Type type) noexcept
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:129
[Window class with invokable method]
Definition window.h:11
bool focus
[0]
else opt state
[0]
Combined button and popup list for selecting options.
#define Q_UNLIKELY(x)
#define qWarning
Definition qlogging.h:166
#define SLOT(a)
Definition qobjectdefs.h:52
#define SIGNAL(a)
Definition qobjectdefs.h:53
GLuint index
[2]
GLsizei GLenum GLenum * types
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum type
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:492
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
#define emit
unsigned long long quint64
Definition qtypes.h:61
ptrdiff_t qsizetype
Definition qtypes.h:165
#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:45
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:23