From ad25455f868608909f6114ef0776c0cc440d9232 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Wed, 5 Mar 2014 18:06:14 -0800 Subject: [PATCH] Track hysteresis for next model separately, but just in case, don't use recursion to fall back on hysteresis value. Closes #2209. --- interface/src/renderer/GeometryCache.cpp | 9 ++++++++- interface/src/renderer/Model.cpp | 5 +++-- interface/src/renderer/Model.h | 1 + 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/interface/src/renderer/GeometryCache.cpp b/interface/src/renderer/GeometryCache.cpp index 5b13e2da42..88d2a8962d 100644 --- a/interface/src/renderer/GeometryCache.cpp +++ b/interface/src/renderer/GeometryCache.cpp @@ -343,7 +343,14 @@ QSharedPointer NetworkGeometry::getLODOrFallback(float distance // if we previously selected a different distance, make sure we've moved far enough to justify switching const float HYSTERESIS_PROPORTION = 0.1f; if (glm::abs(distance - qMax(hysteresis, lodDistance)) / fabsf(hysteresis - lodDistance) < HYSTERESIS_PROPORTION) { - return getLODOrFallback(hysteresis, hysteresis); + lod = _lodParent; + lodDistance = 0.0f; + it = _lods.upperBound(hysteresis); + if (it != _lods.constBegin()) { + it = it - 1; + lod = it.value(); + lodDistance = it.key(); + } } } if (lod->isLoaded()) { diff --git a/interface/src/renderer/Model.cpp b/interface/src/renderer/Model.cpp index 1aab0a4dab..0cff3aaa87 100644 --- a/interface/src/renderer/Model.cpp +++ b/interface/src/renderer/Model.cpp @@ -416,6 +416,7 @@ void Model::setURL(const QUrl& url, const QUrl& fallback, bool retainCurrent, bo // if so instructed, keep the current geometry until the new one is loaded _nextBaseGeometry = _nextGeometry = Application::getInstance()->getGeometryCache()->getGeometry(url, fallback, delayLoad); + _nextLODHysteresis = NetworkGeometry::NO_HYSTERESIS; if (!retainCurrent || !isActive() || _nextGeometry->isLoaded()) { applyNextGeometry(); } @@ -784,7 +785,7 @@ void Model::applyCollision(CollisionInfo& collision) { QVector Model::updateGeometry(bool delayLoad) { QVector newJointStates; if (_nextGeometry) { - _nextGeometry = _nextGeometry->getLODOrFallback(_lodDistance, _lodHysteresis, delayLoad); + _nextGeometry = _nextGeometry->getLODOrFallback(_lodDistance, _nextLODHysteresis, delayLoad); if (!delayLoad) { _nextGeometry->setLoadPriority(this, -_lodDistance); _nextGeometry->ensureLoading(); @@ -827,7 +828,7 @@ void Model::applyNextGeometry() { // delete our local geometry and custom textures deleteGeometry(); _dilatedTextures.clear(); - _lodHysteresis = NetworkGeometry::NO_HYSTERESIS; + _lodHysteresis = _nextLODHysteresis; // we retain a reference to the base geometry so that its reference count doesn't fall to zero _baseGeometry = _nextBaseGeometry; diff --git a/interface/src/renderer/Model.h b/interface/src/renderer/Model.h index 524bd9dc79..ae28a8e4fe 100644 --- a/interface/src/renderer/Model.h +++ b/interface/src/renderer/Model.h @@ -247,6 +247,7 @@ private: QSharedPointer _nextGeometry; float _lodDistance; float _lodHysteresis; + float _nextLODHysteresis; float _pupilDilation; std::vector _blendshapeCoefficients;