QVector<QUuid> EntityScriptingInterface::getChildrenIDsOfJoint(const QUuid& parentID, int jointIndex) { QVector<QUuid> result; if (!_entityTree) { return result; } _entityTree->withReadLock([&] { QSharedPointer<SpatialParentFinder> parentFinder = DependencyManager::get<SpatialParentFinder>(); if (!parentFinder) { return; } bool success; SpatiallyNestableWeakPointer parentWP = parentFinder->find(parentID, success); if (!success) { return; } SpatiallyNestablePointer parent = parentWP.lock(); if (!parent) { return; } parent->forEachChild([&](SpatiallyNestablePointer child) { if (child->getParentJointIndex() == jointIndex) { result.push_back(child->getID()); } }); }); return result; }
SpatiallyNestableWeakPointer InterfaceParentFinder::find(QUuid parentID, bool& success, SpatialParentTree* entityTree) const { SpatiallyNestableWeakPointer parent; if (parentID.isNull()) { success = true; return parent; } // search entities if (entityTree) { parent = entityTree->findByID(parentID); } else { auto treeRenderer = qApp->getEntities(); EntityTreePointer tree = treeRenderer ? treeRenderer->getTree() : nullptr; parent = tree ? tree->findEntityByEntityItemID(parentID) : nullptr; } if (!parent.expired()) { success = true; return parent; } // search avatars QSharedPointer<AvatarManager> avatarManager = DependencyManager::get<AvatarManager>(); parent = avatarManager->getAvatarBySessionID(parentID); if (!parent.expired()) { success = true; return parent; } if (parentID == AVATAR_SELF_ID) { success = true; return avatarManager->getMyAvatar(); } // search overlays auto& overlays = qApp->getOverlays(); auto overlay = overlays.getOverlay(parentID); parent = std::dynamic_pointer_cast<SpatiallyNestable>(overlay); // this will return nullptr for non-3d overlays if (!parent.expired()) { success = true; return parent; } success = false; return parent; }
SpatiallyNestableWeakPointer AssignmentParentFinder::find(QUuid parentID, bool& success, SpatialParentTree* entityTree) const { SpatiallyNestableWeakPointer parent; if (parentID.isNull()) { success = true; return parent; } // search entities if (entityTree) { parent = entityTree->findByID(parentID); } else { parent = _tree->findEntityByEntityItemID(parentID); } if (parent.expired()) { success = false; } else { success = true; } return parent; }
SpatiallyNestableWeakPointer find(QUuid parentID, bool& success, SpatialParentTree* entityTree = nullptr) const override { SpatiallyNestableWeakPointer parent; if (parentID.isNull()) { success = true; return parent; } // search entities if (entityTree) { parent = entityTree->findByID(parentID); } else { parent = _tree ? _tree->findEntityByEntityItemID(parentID) : nullptr; } if (!parent.expired()) { success = true; return parent; } success = false; return parent; }