From e03b902a157be8ef74d7cdc680374cf359716ec6 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Thu, 6 Jul 2017 15:42:24 -0700 Subject: [PATCH] change when joint cache is copied --- .../src/avatars-renderer/Avatar.cpp | 49 ++++++++++++++----- .../src/avatars-renderer/Avatar.h | 4 +- 2 files changed, 41 insertions(+), 12 deletions(-) diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 3674c003a1..445396870f 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -1008,17 +1008,48 @@ glm::vec3 Avatar::getAbsoluteJointTranslationInObjectFrame(int index) const { } } -int Avatar::getJointIndex(const QString& name) const { - QReadLocker readLock(&_jointIndicesCacheLock); - if (_jointIndicesCache.contains(name)) { - return _jointIndicesCache[name]; +void Avatar::cacheJoints() const { + // _jointIndicesCacheLock should be locked for write before calling this. + _jointIndicesCache.clear(); + if (_skeletonModel && _skeletonModel->isActive()) { + _jointIndicesCache = _skeletonModel->getFBXGeometry().jointIndices; + _jointsCached = true; } - return -1; +} + +int Avatar::getJointIndex(const QString& name) const { + auto getJointIndexWorker = [&]() { + if (_jointIndicesCache.contains(name)) { + return _jointIndicesCache[name]; + } + return -1; + }; + QReadLocker readLock(&_jointIndicesCacheLock); + if (!_jointsCached) { + readLock.unlock(); + { + QWriteLocker writeLock(&_jointIndicesCacheLock); + Avatar::cacheJoints(); + return getJointIndexWorker(); + } + } + return getJointIndexWorker(); } QStringList Avatar::getJointNames() const { + auto getJointNamesWorker = [&]() { + return _jointIndicesCache.keys(); + }; QReadLocker readLock(&_jointIndicesCacheLock); - return _jointIndicesCache.keys(); + if (!_jointsCached) { + readLock.unlock(); + { + QWriteLocker writeLock(&_jointIndicesCacheLock); + Avatar::cacheJoints(); + return getJointNamesWorker(); + } + } + return getJointNamesWorker(); } glm::vec3 Avatar::getJointPosition(int index) const { @@ -1050,12 +1081,8 @@ void Avatar::setSkeletonModelURL(const QUrl& skeletonModelURL) { void Avatar::setModelURLFinished(bool success) { { QWriteLocker writeLock(&_jointIndicesCacheLock); - _jointIndicesCache.clear(); - if (_skeletonModel && _skeletonModel->isActive()) { - _jointIndicesCache = _skeletonModel->getFBXGeometry().jointIndices; - } + _jointsCached = false; } - 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 d2c7756257..f19feab9c6 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -268,8 +268,10 @@ protected: SkeletonModelPointer _skeletonModel; - QHash _jointIndicesCache; + void cacheJoints() const; + mutable QHash _jointIndicesCache; mutable QReadWriteLock _jointIndicesCacheLock; + mutable bool _jointsCached { false }; glm::vec3 _skeletonOffset; std::vector> _attachmentModels;