summaryrefslogtreecommitdiff
path: root/indra/newview/llmeshrepository.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llmeshrepository.cpp')
-rw-r--r--indra/newview/llmeshrepository.cpp81
1 files changed, 55 insertions, 26 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));
}
}
}