summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorAndrey Kleshchev <andreykproductengine@lindenlab.com>2024-11-11 22:48:18 +0200
committerAndrey Kleshchev <andreykproductengine@lindenlab.com>2025-01-28 20:47:46 +0200
commit3271408650f080281609c2704c80b6c31c62b3a5 (patch)
tree35b882fdc1d2c056a5d09a21cf37e38eb73dce74 /indra
parent8f274bfdf9683895a2245b531dc45f4d047d69d6 (diff)
#1186 Make mesh repository account for avatars
when calculating priority
Diffstat (limited to 'indra')
-rw-r--r--indra/newview/llmeshrepository.cpp81
-rw-r--r--indra/newview/llmeshrepository.h9
2 files changed, 60 insertions, 30 deletions
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index 4eb1fdc8de..edb1680eb7 100644
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -3740,7 +3740,7 @@ S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_para
{
//first request for this mesh
mLoadingMeshes[detail][mesh_id].push_back(vobj);
- mPendingRequests.push_back(PendingRequestLOD(mesh_params, detail));
+ mPendingRequests.emplace_back(new PendingRequestLOD(mesh_params, detail));
LLMeshRepository::sLODPending++;
}
}
@@ -3799,6 +3799,44 @@ S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_para
return detail;
}
+F32 calculate_score(LLVOVolume* object)
+{
+ if (!object)
+ {
+ return -1.f;
+ }
+ LLDrawable* drawable = object->mDrawable;
+ if (!drawable)
+ {
+ return -1;
+ }
+ if (drawable->isState(LLDrawable::RIGGED) || object->isAttachment())
+ {
+ LLVOAvatar* avatar = object->getAvatar();
+ LLDrawable* av_drawable = avatar ? avatar->mDrawable : nullptr;
+ if (avatar && av_drawable)
+ {
+ // See LLVOVolume::calcLOD()
+ F32 radius;
+ if (avatar->isControlAvatar())
+ {
+ const LLVector3* box = avatar->getLastAnimExtents();
+ LLVector3 diag = box[1] - box[0];
+ radius = diag.magVec() * 0.5f;
+ }
+ else
+ {
+ // Volume in a rigged mesh attached to a regular avatar.
+ const LLVector3* box = avatar->getLastAnimExtents();
+ LLVector3 diag = box[1] - box[0];
+ radius = diag.magVec();
+ }
+ return radius / llmax(av_drawable->mDistanceWRTCamera, 1.f);
+ }
+ }
+ return drawable->getRadius() / llmax(drawable->mDistanceWRTCamera, 1.f);
+}
+
void LLMeshRepository::notifyLoadedMeshes()
{ //called from main thread
LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK; //LL_RECORD_BLOCK_TIME(FTM_MESH_FETCH);
@@ -3998,15 +4036,10 @@ void LLMeshRepository::notifyLoadedMeshes()
F32 max_score = 0.f;
for (auto obj_iter = iter->second.begin(); obj_iter != iter->second.end(); ++obj_iter)
{
- LLVOVolume* object = *obj_iter;
- if (object)
+ F32 cur_score = calculate_score(*obj_iter);
+ if (cur_score >= 0.f)
{
- LLDrawable* drawable = object->mDrawable;
- if (drawable)
- {
- F32 cur_score = drawable->getRadius()/llmax(drawable->mDistanceWRTCamera, 1.f);
- max_score = llmax(max_score, cur_score);
- }
+ max_score = llmax(max_score, cur_score);
}
}
@@ -4018,15 +4051,10 @@ void LLMeshRepository::notifyLoadedMeshes()
F32 max_score = 0.f;
for (auto obj_iter = iter->second.begin(); obj_iter != iter->second.end(); ++obj_iter)
{
- LLVOVolume* object = *obj_iter;
- if (object)
+ F32 cur_score = calculate_score(*obj_iter);
+ if (cur_score >= 0.f)
{
- LLDrawable* drawable = object->mDrawable;
- if (drawable)
- {
- F32 cur_score = drawable->getRadius() / llmax(drawable->mDistanceWRTCamera, 1.f);
- max_score = llmax(max_score, cur_score);
- }
+ max_score = llmax(max_score, cur_score);
}
}
@@ -4034,9 +4062,9 @@ void LLMeshRepository::notifyLoadedMeshes()
}
//set "score" for pending requests
- for (std::vector<PendingRequestBase>::iterator iter = mPendingRequests.begin(); iter != mPendingRequests.end(); ++iter)
+ for (std::unique_ptr<PendingRequestBase>& req_p : mPendingRequests)
{
- iter->setScore(score_map[iter->getId()]);
+ req_p->setScore(score_map[req_p->getId()]);
}
//sort by "score"
@@ -4046,24 +4074,25 @@ void LLMeshRepository::notifyLoadedMeshes()
while (!mPendingRequests.empty() && push_count > 0)
{
- PendingRequestBase& request = mPendingRequests.front();
- switch (request.getRequestType())
+ std::unique_ptr<PendingRequestBase>& req_p = mPendingRequests.front();
+ switch (req_p->getRequestType())
{
case MESH_REQUEST_LOD:
{
- PendingRequestLOD& lod = (PendingRequestLOD&)request;
- mThread->loadMeshLOD(lod.mMeshParams, lod.mLOD);
+ PendingRequestLOD* lod = (PendingRequestLOD*)req_p.get();
+ mThread->loadMeshLOD(lod->mMeshParams, lod->mLOD);
LLMeshRepository::sLODPending--;
break;
}
case MESH_REQUEST_SKIN:
{
- PendingRequestUUID& skin = (PendingRequestUUID&)request;
- mThread->loadMeshSkinInfo(skin.getId());
+ PendingRequestUUID* skin = (PendingRequestUUID*)req_p.get();
+ mThread->loadMeshSkinInfo(skin->getId());
break;
}
default:
+ LL_ERRS() << "Unknown request type in LLMeshRepository::notifyLoadedMeshes" << LL_ENDL;
break;
}
mPendingRequests.erase(mPendingRequests.begin());
@@ -4262,7 +4291,7 @@ const LLMeshSkinInfo* LLMeshRepository::getSkinInfo(const LLUUID& mesh_id, LLVOV
{
//first request for this mesh
mLoadingSkins[mesh_id].push_back(requesting_obj);
- mPendingRequests.push_back(PendingRequestUUID(mesh_id, MESH_REQUEST_SKIN));
+ mPendingRequests.emplace_back(new PendingRequestUUID(mesh_id, MESH_REQUEST_SKIN));
}
}
}
diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h
index c5b2a910ce..449708779b 100644
--- a/indra/newview/llmeshrepository.h
+++ b/indra/newview/llmeshrepository.h
@@ -212,9 +212,9 @@ class PendingRequestBase
public:
struct CompareScoreGreater
{
- bool operator()(const PendingRequestBase& lhs, const PendingRequestBase& rhs)
+ bool operator()(const std::unique_ptr<PendingRequestBase>& lhs, const std::unique_ptr<PendingRequestBase>& rhs)
{
- return lhs.mScore > rhs.mScore; // greatest = first
+ return lhs->mScore > rhs->mScore; // greatest = first
}
};
@@ -229,7 +229,7 @@ public:
void setScore(F32 score) { mScore = score; }
F32 getScore() const { return mScore; }
LLUUID getId() const { return mId; }
- virtual EMeshRequestType getRequestType() const { return MESH_REQUEST_UKNOWN; }
+ virtual EMeshRequestType getRequestType() const = 0;
protected:
F32 mScore;
@@ -758,7 +758,8 @@ public:
LLMutex* mMeshMutex;
- std::vector<PendingRequestBase> mPendingRequests;
+ typedef std::vector <std::unique_ptr<PendingRequestBase> > pending_requests_vec;
+ pending_requests_vec mPendingRequests;
//list of mesh ids awaiting skin info
typedef boost::unordered_map<LLUUID, std::vector<LLVOVolume*> > skin_load_map;