diff options
| -rw-r--r-- | indra/newview/llmeshrepository.cpp | 81 | ||||
| -rw-r--r-- | indra/newview/llmeshrepository.h | 9 | 
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;  | 
