104void QQuick3DJoint::setSkeletonRoot(QQuick3DSkeleton *skeleton)
106 if (skeleton == m_skeletonRoot)
109 QQuick3DObjectPrivate::attachWatcher(
this, &QQuick3DJoint::setSkeletonRoot, skeleton, m_skeletonRoot);
111 QObject::disconnect(m_skeletonConnection);
113 m_skeletonRoot = skeleton;
115 if (m_skeletonRoot) {
116 m_skeletonConnection = connect(
this, &QQuick3DJoint::sceneTransformChanged,
117 skeleton, [skeleton]() {
118 auto skeletonNode =
static_cast<QSSGRenderSkeleton *>(QQuick3DNodePrivate::get(skeleton)->spatialNode);
120 skeletonNode->skinningDirty =
true;
123 m_skeletonRootDirty =
true;
124 emit skeletonRootChanged();
135QSSGRenderGraphObject *QQuick3DJoint::updateSpatialNode(QSSGRenderGraphObject *node)
142 node =
new QSSGRenderJoint();
145 QQuick3DNode::updateSpatialNode(node);
147 auto jointNode =
static_cast<QSSGRenderJoint *>(node);
149 QQuick3DObjectPrivate *skeletonPriv = QQuick3DObjectPrivate::get(m_skeletonRoot);
151 if (m_skeletonRootDirty) {
152 if (skeletonPriv && skeletonPriv->spatialNode)
153 jointNode->skeletonRoot =
static_cast<QSSGRenderSkeleton *>(skeletonPriv->spatialNode);
157 jointNode->index = m_index;
158 m_indexDirty =
false;
160 if (jointNode->skeletonRoot) {
161 Q_ASSERT(m_skeletonRoot);
162 m_skeletonRoot->skeletonNodeDirty();
164 if (jointNode->skeletonRoot->maxIndex < m_index) {
165 jointNode->skeletonRoot->maxIndex = m_index;