8static inline void qskRemoveChildNode( QSGNode* parent, QSGNode* child )
10 parent->removeChildNode( child );
12 if ( child->flags() & QSGNode::OwnedByParent )
17static inline void qskRemoveAllChildNodesAfter( QSGNode* parent, QSGNode* child )
19 while (
auto sibling = parent->lastChild() )
21 if ( sibling == child )
24 qskRemoveChildNode( parent, sibling );
28static void qskInsertChildSorted( QSGNode* parent, QSGNode* child,
29 const QVector< quint8 >& roles )
31 QSGNode* sibling =
nullptr;
33 if ( parent->childCount() > 0 )
35 using namespace QskSGNode;
37 const int nodePos = roles.indexOf( nodeRole( child ) );
41 for (
auto childNode = parent->lastChild();
42 childNode !=
nullptr; childNode = childNode->previousSibling() )
44 const auto childNodeRole = nodeRole( childNode );
45 if ( childNodeRole == BackgroundRole )
56 const int index = roles.indexOf( nodeRole( childNode ) );
57 if ( index >= 0 && index < nodePos )
61 if ( sibling !=
nullptr )
67 parent->insertChildNodeAfter( child, sibling );
69 parent->prependChildNode( child );
72void QskSGNode::setParentNode( QSGNode* node, QSGNode* parent )
76 auto oldParent = node->parent();
78 if ( oldParent != parent )
81 oldParent->removeChildNode( node );
84 parent->appendChildNode( node );
89QSGNode* QskSGNode::findChildNode( QSGNode* parent, quint8 role )
93 auto node = parent->firstChild();
96 if ( nodeRole( node ) == role )
99 node = node->nextSibling();
106bool QskSGNode::removeChildNode( QSGNode* parent, quint8 role )
108 if (
auto node = findChildNode( parent, role ) )
110 qskRemoveChildNode( parent, node );
117void QskSGNode::removeAllChildNodesAfter( QSGNode* parent, QSGNode* child )
119 if ( parent && child && child->parent() == parent )
120 qskRemoveAllChildNodesAfter( parent, child );
123void QskSGNode::removeAllChildNodesFrom( QSGNode* parent, QSGNode* child )
125 if ( parent && child && child->parent() == parent )
127 qskRemoveAllChildNodesAfter( parent, child );
128 qskRemoveChildNode( parent, child );
132void QskSGNode::replaceChildNode(
133 const QVector< quint8 >& roles, quint8 role,
134 QSGNode* parentNode, QSGNode* oldNode, QSGNode* newNode )
136 if ( newNode && newNode->parent() != parentNode )
138 setNodeRole( newNode, role );
144 parentNode->prependChildNode( newNode );
149 auto firstNode = parentNode->firstChild();
151 if ( firstNode && ( nodeRole( firstNode ) == BackgroundRole ) )
152 parentNode->insertChildNodeAfter( newNode, firstNode );
154 parentNode->prependChildNode( newNode );
160 qskInsertChildSorted( parentNode, newNode, roles );
165 if ( oldNode && oldNode != newNode )
167 parentNode->removeChildNode( oldNode );
168 if ( oldNode->flags() & QSGNode::OwnedByParent )
173void QskSGNode::resetGeometry( QSGGeometryNode* node )
177 if (
auto g = node->geometry() )
179 const bool hasVertices = g->vertexCount() > 0;
180 const bool hasIndexes = g->indexCount() > 0;
182 if ( hasVertices || hasIndexes )
187 g->markVertexDataDirty();
190 g->markIndexDataDirty();
192 node->markDirty( QSGNode::DirtyGeometry );