diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 5d4d7af493..3674c003a1 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -1009,48 +1009,25 @@ glm::vec3 Avatar::getAbsoluteJointTranslationInObjectFrame(int index) const { } int Avatar::getJointIndex(const QString& name) const { - /* if (QThread::currentThread() != thread()) { - int result; - BLOCKING_INVOKE_METHOD(const_cast(this), "getJointIndex", - Q_RETURN_ARG(int, result), Q_ARG(const QString&, name)); - return result; - } */ - int result = getFauxJointIndex(name); - if (result != -1) { - return result; + QReadLocker readLock(&_jointIndicesCacheLock); + if (_jointIndicesCache.contains(name)) { + return _jointIndicesCache[name]; } - return _skeletonModel->isActive() ? _skeletonModel->getFBXGeometry().getJointIndex(name) : -1; + return -1; } QStringList Avatar::getJointNames() const { -/* if (QThread::currentThread() != thread()) { - QStringList result; - BLOCKING_INVOKE_METHOD(const_cast(this), "getJointNames", - Q_RETURN_ARG(QStringList, result)); - return result; - }*/ - return _skeletonModel->isActive() ? _skeletonModel->getFBXGeometry().getJointNames() : QStringList(); + QReadLocker readLock(&_jointIndicesCacheLock); + return _jointIndicesCache.keys(); } glm::vec3 Avatar::getJointPosition(int index) const { -/* if (QThread::currentThread() != thread()) { - glm::vec3 position; - BLOCKING_INVOKE_METHOD(const_cast(this), "getJointPosition", - Q_RETURN_ARG(glm::vec3, position), Q_ARG(const int, index)); - return position; - }*/ glm::vec3 position; _skeletonModel->getJointPositionInWorldFrame(index, position); return position; } glm::vec3 Avatar::getJointPosition(const QString& name) const { -/* if (QThread::currentThread() != thread()) { - glm::vec3 position; - BLOCKING_INVOKE_METHOD(const_cast(this), "getJointPosition", - Q_RETURN_ARG(glm::vec3, position), Q_ARG(const QString&, name)); - return position; - }*/ glm::vec3 position; _skeletonModel->getJointPositionInWorldFrame(getJointIndex(name), position); return position; @@ -1071,6 +1048,14 @@ void Avatar::setSkeletonModelURL(const QUrl& skeletonModelURL) { } void Avatar::setModelURLFinished(bool success) { + { + QWriteLocker writeLock(&_jointIndicesCacheLock); + _jointIndicesCache.clear(); + if (_skeletonModel && _skeletonModel->isActive()) { + _jointIndicesCache = _skeletonModel->getFBXGeometry().jointIndices; + } + } + if (!success && _skeletonModelURL != AvatarData::defaultFullAvatarModelUrl()) { const int MAX_SKELETON_DOWNLOAD_ATTEMPTS = 4; // NOTE: we don't want to be as generous as ResourceCache is, we only want 4 attempts if (_skeletonModel->getResourceDownloadAttemptsRemaining() <= 0 || diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index 1724d42510..d2c7756257 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -267,6 +267,10 @@ protected: virtual void maybeUpdateSessionDisplayNameFromTransport(const QString& sessionDisplayName) override { _sessionDisplayName = sessionDisplayName; } // don't use no-op setter! SkeletonModelPointer _skeletonModel; + + QHash _jointIndicesCache; + mutable QReadWriteLock _jointIndicesCacheLock; + glm::vec3 _skeletonOffset; std::vector> _attachmentModels; std::vector> _attachmentsToRemove;