diff --git a/assignment-client/src/avatars/AvatarMixerSlave.cpp b/assignment-client/src/avatars/AvatarMixerSlave.cpp index 9b501a5e31..0004afa97c 100644 --- a/assignment-client/src/avatars/AvatarMixerSlave.cpp +++ b/assignment-client/src/avatars/AvatarMixerSlave.cpp @@ -217,6 +217,11 @@ void AvatarMixerSlave::broadcastAvatarData(const SharedNodePointer& node) { return 0; }, + [&](AvatarSharedPointer avatar)->float{ + glm::vec3 nodeBoxHalfScale = (avatar->getPosition() - avatar->getGlobalBoundingBoxCorner()); + return glm::max(nodeBoxHalfScale.x, glm::max(nodeBoxHalfScale.y, nodeBoxHalfScale.z)); + }, + [thisAvatar](AvatarSharedPointer avatar)->bool{ return (avatar == thisAvatar); // ignore ourselves... }); diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index af9f915fec..b1a09b46ce 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -171,6 +171,10 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { return std::static_pointer_cast(avatar)->getLastRenderUpdateTime(); }, + [](AvatarSharedPointer avatar)->float{ + return std::static_pointer_cast(avatar)->getBoundingRadius(); + }, + [this](AvatarSharedPointer avatar)->bool{ const auto& castedAvatar = std::static_pointer_cast(avatar); if (castedAvatar == _myAvatar || !castedAvatar->isInitialized()) { diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index e2574683a2..0c145a6a30 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -2319,7 +2319,8 @@ float AvatarData::_avatarSortCoefficientAge { 1.0f }; std::priority_queue AvatarData::sortAvatars( QList avatarList, const ViewFrustum& cameraView, - std::function lastUpdated, + std::function getLastUpdated, + std::function getBoundingRadius, std::function shouldIgnore) { uint64_t startTime = usecTimestampNow(); @@ -2346,12 +2347,12 @@ std::priority_queue AvatarData::sortAvatars( float distance = glm::length(offset) + 0.001f; // add 1mm to avoid divide by zero // FIXME - AvatarData has something equivolent to this - float radius = 1.0f; // avatar->getBoundingRadius(); + float radius = getBoundingRadius(avatar); const glm::vec3& forward = cameraView.getDirection(); float apparentSize = 2.0f * radius / distance; float cosineAngle = glm::length(glm::dot(offset, forward) * forward) / distance; - float age = (float)(startTime - lastUpdated(avatar)) / (float)(USECS_PER_SECOND); + float age = (float)(startTime - getLastUpdated(avatar)) / (float)(USECS_PER_SECOND); // NOTE: we are adding values of different units to get a single measure of "priority". // Thus we multiply each component by a conversion "weight" that scales its units relative to the others. diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 8608137b20..0eddc29cda 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -597,7 +597,8 @@ public: static std::priority_queue sortAvatars( QList avatarList, const ViewFrustum& cameraView, - std::function lastUpdated, + std::function getLastUpdated, + std::function getBoundingRadius, std::function shouldIgnore); // TODO: remove this HACK once we settle on optimal sort coefficients