102void QQuick3DJoint::setSkeletonRoot(QQuick3DSkeleton *skeleton)
104 if (skeleton == m_skeletonRoot)
107 QQuick3DObjectPrivate::attachWatcher(
this, &QQuick3DJoint::setSkeletonRoot, skeleton, m_skeletonRoot);
109 QObject::disconnect(m_skeletonConnection);
111 m_skeletonRoot = skeleton;
113 if (m_skeletonRoot) {
114 m_skeletonConnection = connect(
this, &QQuick3DJoint::sceneTransformChanged,
115 skeleton, [skeleton]() {
116 auto skeletonNode =
static_cast<QSSGRenderSkeleton *>(QQuick3DNodePrivate::get(skeleton)->spatialNode);
118 skeletonNode->skinningDirty =
true;
121 m_skeletonRootDirty =
true;
122 emit skeletonRootChanged();
133QSSGRenderGraphObject *QQuick3DJoint::updateSpatialNode(QSSGRenderGraphObject *node)
140 node =
new QSSGRenderJoint();
143 QQuick3DNode::updateSpatialNode(node);
145 auto jointNode =
static_cast<QSSGRenderJoint *>(node);
147 QQuick3DObjectPrivate *skeletonPriv = QQuick3DObjectPrivate::get(m_skeletonRoot);
149 if (m_skeletonRootDirty) {
150 if (skeletonPriv && skeletonPriv->spatialNode)
151 jointNode->skeletonRoot =
static_cast<QSSGRenderSkeleton *>(skeletonPriv->spatialNode);
155 jointNode->index = m_index;
156 m_indexDirty =
false;
158 if (jointNode->skeletonRoot) {
159 Q_ASSERT(m_skeletonRoot);
160 m_skeletonRoot->skeletonNodeDirty();
162 if (jointNode->skeletonRoot->maxIndex < m_index) {
163 jointNode->skeletonRoot->maxIndex = m_index;