Attempt to make mesh loading a little less choppy.

This commit is contained in:
Shyotl
2018-08-11 01:09:04 -05:00
parent dcc13b447c
commit 38c6302f11
4 changed files with 37 additions and 36 deletions

View File

@@ -2413,6 +2413,17 @@ void LLMeshRepository::shutdown()
LLConvexDecomposition::quitSystem();
}
void LLMeshRepository::unregisterMesh(LLVOVolume* vobj)
{
for (auto& lod : mLoadingMeshes)
{
for (auto& param : lod)
{
vector_replace_with_last(param.second, vobj);
}
}
}
S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_params, S32 detail, S32 last_lod)
{
if (detail < 0 || detail > 4)
@@ -2426,12 +2437,15 @@ S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_para
mesh_load_map::iterator iter = mLoadingMeshes[detail].find(mesh_params);
if (iter != mLoadingMeshes[detail].end())
{ //request pending for this mesh, append volume id to list
iter->second.insert(vobj->getID());
auto it = std::find(iter->second.begin(), iter->second.end(), vobj);
if (it == iter->second.end()) {
iter->second.push_back(vobj);
}
}
else
{
//first request for this mesh
mLoadingMeshes[detail][mesh_params].insert(vobj->getID());
mLoadingMeshes[detail][mesh_params].push_back(vobj);
mPendingRequests.push_back(LLMeshRepoThread::LODRequest(mesh_params, detail));
LLMeshRepository::sLODPending++;
}
@@ -2598,29 +2612,23 @@ void LLMeshRepository::notifyLoadedMeshes()
//calculate "score" for pending requests
//create score map
std::map<LLUUID, F32> score_map;
boost::unordered_map<LLUUID, F32> score_map;
for (U32 i = 0; i < 4; ++i)
for (auto& lod : mLoadingMeshes)
{
for (mesh_load_map::iterator iter = mLoadingMeshes[i].begin(); iter != mLoadingMeshes[i].end(); ++iter)
for (auto& param : lod)
{
F32 max_score = 0.f;
for (std::set<LLUUID>::iterator obj_iter = iter->second.begin(); obj_iter != iter->second.end(); ++obj_iter)
for (auto& vobj : param.second)
{
LLViewerObject* object = gObjectList.findObject(*obj_iter);
if (object)
if (LLDrawable* drawable = vobj->mDrawable)
{
LLDrawable* drawable = object->mDrawable;
if (drawable)
{
F32 cur_score = drawable->getRadius()/llmax(drawable->mDistanceWRTCamera, 1.f);
max_score = llmax(max_score, cur_score);
}
F32 cur_score = drawable->getRadius() / llmax(drawable->mDistanceWRTCamera, 1.f);
max_score = llmax(max_score, cur_score);
}
}
score_map[iter->first.getSculptID()] = max_score;
score_map[param.first.getSculptID()] = max_score;
}
}
@@ -2738,13 +2746,9 @@ void LLMeshRepository::notifyMeshLoaded(const LLVolumeParams& mesh_params, LLVol
}
//notify waiting LLVOVolume instances that their requested mesh is available
for (std::set<LLUUID>::iterator vobj_iter = obj_iter->second.begin(); vobj_iter != obj_iter->second.end(); ++vobj_iter)
for (auto& vobj : obj_iter->second)
{
LLVOVolume* vobj = (LLVOVolume*) gObjectList.findObject(*vobj_iter);
if (vobj)
{
vobj->notifyMeshLoaded();
}
vobj->notifyMeshLoaded();
}
mLoadingMeshes[detail].erase(mesh_params);
@@ -2760,19 +2764,14 @@ void LLMeshRepository::notifyMeshUnavailable(const LLVolumeParams& mesh_params,
if (obj_iter != mLoadingMeshes[lod].end())
{
for (std::set<LLUUID>::iterator vobj_iter = obj_iter->second.begin(); vobj_iter != obj_iter->second.end(); ++vobj_iter)
for (auto& vobj : obj_iter->second)
{
LLVOVolume* vobj = (LLVOVolume*) gObjectList.findObject(*vobj_iter);
if (vobj)
{
LLVolume* obj_volume = vobj->getVolume();
if (obj_volume &&
obj_volume->getDetail() == detail &&
obj_volume->getParams() == mesh_params)
{ //should force volume to find most appropriate LOD
LLVolume* obj_volume = vobj->getVolume();
if (obj_volume &&
obj_volume->getDetail() == detail &&
obj_volume->getParams() == mesh_params)
{ //should force volume to find most appropriate LOD
vobj->setVolume(obj_volume->getParams(), lod);
}
}
}