Skip to content

Commit 97324f4

Browse files
committed
viewer#3070 Make mesh repository account for avatars
when calculating priority
1 parent 40d7644 commit 97324f4

File tree

2 files changed

+60
-30
lines changed

2 files changed

+60
-30
lines changed

indra/newview/llmeshrepository.cpp

Lines changed: 55 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3783,7 +3783,7 @@ S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_para
37833783
{
37843784
//first request for this mesh
37853785
mLoadingMeshes[detail][mesh_id].push_back(vobj);
3786-
mPendingRequests.push_back(PendingRequestLOD(mesh_params, detail));
3786+
mPendingRequests.emplace_back(new PendingRequestLOD(mesh_params, detail));
37873787
LLMeshRepository::sLODPending++;
37883788
}
37893789
}
@@ -3842,6 +3842,44 @@ S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_para
38423842
return detail;
38433843
}
38443844

3845+
F32 calculate_score(LLVOVolume* object)
3846+
{
3847+
if (!object)
3848+
{
3849+
return -1.f;
3850+
}
3851+
LLDrawable* drawable = object->mDrawable;
3852+
if (!drawable)
3853+
{
3854+
return -1;
3855+
}
3856+
if (drawable->isState(LLDrawable::RIGGED) || object->isAttachment())
3857+
{
3858+
LLVOAvatar* avatar = object->getAvatar();
3859+
LLDrawable* av_drawable = avatar ? avatar->mDrawable : nullptr;
3860+
if (avatar && av_drawable)
3861+
{
3862+
// See LLVOVolume::calcLOD()
3863+
F32 radius;
3864+
if (avatar->isControlAvatar())
3865+
{
3866+
const LLVector3* box = avatar->getLastAnimExtents();
3867+
LLVector3 diag = box[1] - box[0];
3868+
radius = diag.magVec() * 0.5f;
3869+
}
3870+
else
3871+
{
3872+
// Volume in a rigged mesh attached to a regular avatar.
3873+
const LLVector3* box = avatar->getLastAnimExtents();
3874+
LLVector3 diag = box[1] - box[0];
3875+
radius = diag.magVec();
3876+
}
3877+
return radius / llmax(av_drawable->mDistanceWRTCamera, 1.f);
3878+
}
3879+
}
3880+
return drawable->getRadius() / llmax(drawable->mDistanceWRTCamera, 1.f);
3881+
}
3882+
38453883
void LLMeshRepository::notifyLoadedMeshes()
38463884
{ //called from main thread
38473885
LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK; //LL_RECORD_BLOCK_TIME(FTM_MESH_FETCH);
@@ -4041,15 +4079,10 @@ void LLMeshRepository::notifyLoadedMeshes()
40414079
F32 max_score = 0.f;
40424080
for (auto obj_iter = iter->second.begin(); obj_iter != iter->second.end(); ++obj_iter)
40434081
{
4044-
LLVOVolume* object = *obj_iter;
4045-
if (object)
4082+
F32 cur_score = calculate_score(*obj_iter);
4083+
if (cur_score >= 0.f)
40464084
{
4047-
LLDrawable* drawable = object->mDrawable;
4048-
if (drawable)
4049-
{
4050-
F32 cur_score = drawable->getRadius()/llmax(drawable->mDistanceWRTCamera, 1.f);
4051-
max_score = llmax(max_score, cur_score);
4052-
}
4085+
max_score = llmax(max_score, cur_score);
40534086
}
40544087
}
40554088

@@ -4061,25 +4094,20 @@ void LLMeshRepository::notifyLoadedMeshes()
40614094
F32 max_score = 0.f;
40624095
for (auto obj_iter = iter->second.begin(); obj_iter != iter->second.end(); ++obj_iter)
40634096
{
4064-
LLVOVolume* object = *obj_iter;
4065-
if (object)
4097+
F32 cur_score = calculate_score(*obj_iter);
4098+
if (cur_score >= 0.f)
40664099
{
4067-
LLDrawable* drawable = object->mDrawable;
4068-
if (drawable)
4069-
{
4070-
F32 cur_score = drawable->getRadius() / llmax(drawable->mDistanceWRTCamera, 1.f);
4071-
max_score = llmax(max_score, cur_score);
4072-
}
4100+
max_score = llmax(max_score, cur_score);
40734101
}
40744102
}
40754103

40764104
score_map[iter->first] = max_score;
40774105
}
40784106

40794107
//set "score" for pending requests
4080-
for (std::vector<PendingRequestBase>::iterator iter = mPendingRequests.begin(); iter != mPendingRequests.end(); ++iter)
4108+
for (std::unique_ptr<PendingRequestBase>& req_p : mPendingRequests)
40814109
{
4082-
iter->setScore(score_map[iter->getId()]);
4110+
req_p->setScore(score_map[req_p->getId()]);
40834111
}
40844112

40854113
//sort by "score"
@@ -4089,24 +4117,25 @@ void LLMeshRepository::notifyLoadedMeshes()
40894117

40904118
while (!mPendingRequests.empty() && push_count > 0)
40914119
{
4092-
PendingRequestBase& request = mPendingRequests.front();
4093-
switch (request.getRequestType())
4120+
std::unique_ptr<PendingRequestBase>& req_p = mPendingRequests.front();
4121+
switch (req_p->getRequestType())
40944122
{
40954123
case MESH_REQUEST_LOD:
40964124
{
4097-
PendingRequestLOD& lod = (PendingRequestLOD&)request;
4098-
mThread->loadMeshLOD(lod.mMeshParams, lod.mLOD);
4125+
PendingRequestLOD* lod = (PendingRequestLOD*)req_p.get();
4126+
mThread->loadMeshLOD(lod->mMeshParams, lod->mLOD);
40994127
LLMeshRepository::sLODPending--;
41004128
break;
41014129
}
41024130
case MESH_REQUEST_SKIN:
41034131
{
4104-
PendingRequestUUID& skin = (PendingRequestUUID&)request;
4105-
mThread->loadMeshSkinInfo(skin.getId());
4132+
PendingRequestUUID* skin = (PendingRequestUUID*)req_p.get();
4133+
mThread->loadMeshSkinInfo(skin->getId());
41064134
break;
41074135
}
41084136

41094137
default:
4138+
LL_ERRS() << "Unknown request type in LLMeshRepository::notifyLoadedMeshes" << LL_ENDL;
41104139
break;
41114140
}
41124141
mPendingRequests.erase(mPendingRequests.begin());
@@ -4305,7 +4334,7 @@ const LLMeshSkinInfo* LLMeshRepository::getSkinInfo(const LLUUID& mesh_id, LLVOV
43054334
{
43064335
//first request for this mesh
43074336
mLoadingSkins[mesh_id].push_back(requesting_obj);
4308-
mPendingRequests.push_back(PendingRequestUUID(mesh_id, MESH_REQUEST_SKIN));
4337+
mPendingRequests.emplace_back(new PendingRequestUUID(mesh_id, MESH_REQUEST_SKIN));
43094338
}
43104339
}
43114340
}

indra/newview/llmeshrepository.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -212,9 +212,9 @@ class PendingRequestBase
212212
public:
213213
struct CompareScoreGreater
214214
{
215-
bool operator()(const PendingRequestBase& lhs, const PendingRequestBase& rhs)
215+
bool operator()(const std::unique_ptr<PendingRequestBase>& lhs, const std::unique_ptr<PendingRequestBase>& rhs)
216216
{
217-
return lhs.mScore > rhs.mScore; // greatest = first
217+
return lhs->mScore > rhs->mScore; // greatest = first
218218
}
219219
};
220220

@@ -229,7 +229,7 @@ class PendingRequestBase
229229
void setScore(F32 score) { mScore = score; }
230230
F32 getScore() const { return mScore; }
231231
LLUUID getId() const { return mId; }
232-
virtual EMeshRequestType getRequestType() const { return MESH_REQUEST_UKNOWN; }
232+
virtual EMeshRequestType getRequestType() const = 0;
233233

234234
protected:
235235
F32 mScore;
@@ -760,7 +760,8 @@ class LLMeshRepository
760760

761761
LLMutex* mMeshMutex;
762762

763-
std::vector<PendingRequestBase> mPendingRequests;
763+
typedef std::vector <std::unique_ptr<PendingRequestBase> > pending_requests_vec;
764+
pending_requests_vec mPendingRequests;
764765

765766
//list of mesh ids awaiting skin info
766767
typedef boost::unordered_map<LLUUID, std::vector<LLVOVolume*> > skin_load_map;

0 commit comments

Comments
 (0)