@@ -3783,7 +3783,7 @@ S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_para
3783
3783
{
3784
3784
// first request for this mesh
3785
3785
mLoadingMeshes [detail][mesh_id].push_back (vobj);
3786
- mPendingRequests .push_back ( PendingRequestLOD (mesh_params, detail));
3786
+ mPendingRequests .emplace_back ( new PendingRequestLOD (mesh_params, detail));
3787
3787
LLMeshRepository::sLODPending ++;
3788
3788
}
3789
3789
}
@@ -3842,6 +3842,44 @@ S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_para
3842
3842
return detail;
3843
3843
}
3844
3844
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
+
3845
3883
void LLMeshRepository::notifyLoadedMeshes ()
3846
3884
{ // called from main thread
3847
3885
LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK; // LL_RECORD_BLOCK_TIME(FTM_MESH_FETCH);
@@ -4041,15 +4079,10 @@ void LLMeshRepository::notifyLoadedMeshes()
4041
4079
F32 max_score = 0 .f ;
4042
4080
for (auto obj_iter = iter->second .begin (); obj_iter != iter->second .end (); ++obj_iter)
4043
4081
{
4044
- LLVOVolume* object = *obj_iter;
4045
- if (object )
4082
+ F32 cur_score = calculate_score ( *obj_iter) ;
4083
+ if (cur_score >= 0 . f )
4046
4084
{
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);
4053
4086
}
4054
4087
}
4055
4088
@@ -4061,25 +4094,20 @@ void LLMeshRepository::notifyLoadedMeshes()
4061
4094
F32 max_score = 0 .f ;
4062
4095
for (auto obj_iter = iter->second .begin (); obj_iter != iter->second .end (); ++obj_iter)
4063
4096
{
4064
- LLVOVolume* object = *obj_iter;
4065
- if (object )
4097
+ F32 cur_score = calculate_score ( *obj_iter) ;
4098
+ if (cur_score >= 0 . f )
4066
4099
{
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);
4073
4101
}
4074
4102
}
4075
4103
4076
4104
score_map[iter->first ] = max_score;
4077
4105
}
4078
4106
4079
4107
// 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 )
4081
4109
{
4082
- iter ->setScore (score_map[iter ->getId ()]);
4110
+ req_p ->setScore (score_map[req_p ->getId ()]);
4083
4111
}
4084
4112
4085
4113
// sort by "score"
@@ -4089,24 +4117,25 @@ void LLMeshRepository::notifyLoadedMeshes()
4089
4117
4090
4118
while (!mPendingRequests .empty () && push_count > 0 )
4091
4119
{
4092
- PendingRequestBase& request = mPendingRequests .front ();
4093
- switch (request. getRequestType ())
4120
+ std::unique_ptr< PendingRequestBase>& req_p = mPendingRequests .front ();
4121
+ switch (req_p-> getRequestType ())
4094
4122
{
4095
4123
case MESH_REQUEST_LOD:
4096
4124
{
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 );
4099
4127
LLMeshRepository::sLODPending --;
4100
4128
break ;
4101
4129
}
4102
4130
case MESH_REQUEST_SKIN:
4103
4131
{
4104
- PendingRequestUUID& skin = (PendingRequestUUID&)request ;
4105
- mThread ->loadMeshSkinInfo (skin. getId ());
4132
+ PendingRequestUUID* skin = (PendingRequestUUID*)req_p. get () ;
4133
+ mThread ->loadMeshSkinInfo (skin-> getId ());
4106
4134
break ;
4107
4135
}
4108
4136
4109
4137
default :
4138
+ LL_ERRS () << " Unknown request type in LLMeshRepository::notifyLoadedMeshes" << LL_ENDL;
4110
4139
break ;
4111
4140
}
4112
4141
mPendingRequests .erase (mPendingRequests .begin ());
@@ -4305,7 +4334,7 @@ const LLMeshSkinInfo* LLMeshRepository::getSkinInfo(const LLUUID& mesh_id, LLVOV
4305
4334
{
4306
4335
// first request for this mesh
4307
4336
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));
4309
4338
}
4310
4339
}
4311
4340
}
0 commit comments