From 801c45898ffd4a23e5a738d5540d0c59ce2bc33e Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Thu, 6 Jul 2017 18:41:11 -0700 Subject: [PATCH] dry up some code --- .../src/avatars-renderer/Avatar.cpp | 71 ++++++++----------- .../src/avatars-renderer/Avatar.h | 2 +- 2 files changed, 30 insertions(+), 43 deletions(-) diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 2206d67c2c..4ffacf9fa6 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -1008,64 +1008,51 @@ glm::vec3 Avatar::getAbsoluteJointTranslationInObjectFrame(int index) const { } } -void Avatar::cacheJoints() const { - // _jointIndicesCacheLock should be locked for write before calling this. - if (_jointsCached) { - return; - } - _jointIndicesCache.clear(); - if (_skeletonModel && _skeletonModel->isActive()) { - _jointIndicesCache = _skeletonModel->getFBXGeometry().jointIndices; - _jointsCached = true; - } -} - void Avatar::invalidateJointIndicesCache() const { QWriteLocker writeLock(&_jointIndicesCacheLock); _jointsCached = false; } +void Avatar::withValidCache(std::function const& worker) const { + QReadLocker readLock(&_jointIndicesCacheLock); + if (_jointsCached) { + worker(); + } else { + readLock.unlock(); + { + QWriteLocker writeLock(&_jointIndicesCacheLock); + if (!_jointsCached) { + _jointIndicesCache.clear(); + if (_skeletonModel && _skeletonModel->isActive()) { + _jointIndicesCache = _skeletonModel->getFBXGeometry().jointIndices; + _jointsCached = true; + } + } + worker(); + } + } +} + int Avatar::getJointIndex(const QString& name) const { int result = getFauxJointIndex(name); if (result != -1) { return result; } - auto getJointIndexWorker = [&]() { + withValidCache([&]() { if (_jointIndicesCache.contains(name)) { - return _jointIndicesCache[name]; - } else { - return -1; + result = _jointIndicesCache[name]; } - }; - QReadLocker readLock(&_jointIndicesCacheLock); - if (_jointsCached) { - return getJointIndexWorker(); - } else { - readLock.unlock(); - { - QWriteLocker writeLock(&_jointIndicesCacheLock); - Avatar::cacheJoints(); - return getJointIndexWorker(); - } - } + }); + return result; } QStringList Avatar::getJointNames() const { - auto getJointNamesWorker = [&]() { - return _jointIndicesCache.keys(); - }; - QReadLocker readLock(&_jointIndicesCacheLock); - if (_jointsCached) { - return getJointNamesWorker(); - } else { - readLock.unlock(); - { - QWriteLocker writeLock(&_jointIndicesCacheLock); - Avatar::cacheJoints(); - return getJointNamesWorker(); - } - } + QStringList result; + withValidCache([&]() { + result = _jointIndicesCache.keys(); + }); + return result; } glm::vec3 Avatar::getJointPosition(int index) const { diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index 2069e36998..6566e79d79 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -268,8 +268,8 @@ protected: SkeletonModelPointer _skeletonModel; - void cacheJoints() const; void invalidateJointIndicesCache() const; + void withValidCache(std::function const& worker) const; mutable QHash _jointIndicesCache; mutable QReadWriteLock _jointIndicesCacheLock; mutable bool _jointsCached { false };