summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/llvovolume.cpp31
-rw-r--r--indra/newview/llvovolume.h1
-rw-r--r--indra/newview/pipeline.cpp50
-rw-r--r--indra/newview/pipeline.h6
4 files changed, 48 insertions, 40 deletions
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 4c126d8fd9..64c2e9e8ec 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -163,7 +163,6 @@ LLVOVolume::LLVOVolume(const LLUUID &id, const LLPCode pcode, LLViewerRegion *re
mRelativeXformInvTrans.setIdentity();
mLOD = MIN_LOD;
- mMeshSculptLevel = -2;
mTextureAnimp = NULL;
mVObjRadius = LLVector3(1,1,0.5f).length();
mNumFaces = 0;
@@ -682,25 +681,7 @@ void LLVOVolume::updateTextureVirtualSize()
LLUUID id = sculpt_params->getSculptTexture();
U8 sculpt_type = sculpt_params->getSculptType();
- if ((sculpt_type & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH)
- // mesh is a mesh
- {
- if (mMeshSculptLevel == -2)
- {
- // get the asset please
- gPipeline.loadMesh(this, id);
- /*gAssetStorage->getAssetData(id, LLAssetType::AT_MESH, (LLGetAssetCallback)NULL, NULL, TRUE);
-
- if (gAssetStorage->hasLocalAsset(id, LLAssetType::AT_MESH))
- {
- gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, FALSE);
- mSculptChanged = TRUE;
- }*/
- }
- }
-
- else
- // mesh is a sculptie
+ if ((sculpt_type & LL_SCULPT_TYPE_MASK) != LL_SCULPT_TYPE_MESH)
{
mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
@@ -902,14 +883,10 @@ BOOL LLVOVolume::setVolume(const LLVolumeParams &params, const S32 detail, bool
if ((volume_params.getSculptType() & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH)
{
if (getVolume()->getNumVolumeFaces() == 0)
- {
- //mesh is not loaded, request pipeline load this mesh
+ {
+ //load request not yet issued, request pipeline load this mesh
LLUUID asset_id = volume_params.getSculptID();
- gPipeline.loadMesh(this, asset_id, detail);
- }
- else
- {
- mMeshSculptLevel = 1;
+ gPipeline.loadMesh(this, asset_id, LLVolumeLODGroup::getVolumeDetailFromScale(getVolume()->getDetail()));
}
}
else // otherwise is sculptie
diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h
index 4b247f3778..f14a71130b 100644
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -298,7 +298,6 @@ private:
LLFrameTimer mTextureUpdateTimer;
S32 mLOD;
BOOL mLODChanged;
- S32 mMeshSculptLevel;
BOOL mSculptChanged;
F32 mSpotLightPriority;
LLMatrix4 mRelativeXform;
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 3410ad6559..0ee619244b 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -8913,23 +8913,29 @@ LLCullResult::sg_list_t::iterator LLPipeline::endAlphaGroups()
void LLPipeline::loadMesh(LLVOVolume* vobj, LLUUID mesh_id, S32 detail)
{
+
+ if (detail < 0 || detail > 4)
+ {
+ return;
+ }
+
{
LLMutexLock lock(mMeshMutex);
//add volume to list of loading meshes
- mesh_load_map::iterator iter = mLoadingMeshes.find(mesh_id);
- if (iter != mLoadingMeshes.end())
+ mesh_load_map::iterator iter = mLoadingMeshes[detail].find(mesh_id);
+ if (iter != mLoadingMeshes[detail].end())
{ //request pending for this mesh, append volume id to list
iter->second.insert(vobj->getID());
return;
}
//first request for this mesh
- mLoadingMeshes[mesh_id].insert(vobj->getID());
+ mLoadingMeshes[detail][mesh_id].insert(vobj->getID());
}
if (gAssetStorage->hasLocalAsset(mesh_id, LLAssetType::AT_MESH))
{ //already have asset, load desired LOD in background
- mPendingMeshes.push_back(new LLMeshThread(mesh_id, vobj->getVolume()));
+ mPendingMeshes.push_back(new LLMeshThread(mesh_id, vobj->getVolume(), detail));
}
else
{ //fetch asset and load when done
@@ -8952,7 +8958,7 @@ void LLPipeline::loadMesh(LLVOVolume* vobj, LLUUID mesh_id, S32 detail)
for (S32 i = detail-1; i >= 0; --i)
{
LLVolume* lod = group->refLOD(i);
- if (lod && lod->getNumVolumeFaces() > 0)
+ if (lod && !lod->isTetrahedron() && lod->getNumVolumeFaces() > 0)
{
volume->copyVolumeFaces(lod);
group->derefLOD(lod);
@@ -8966,7 +8972,7 @@ void LLPipeline::loadMesh(LLVOVolume* vobj, LLUUID mesh_id, S32 detail)
for (S32 i = detail+1; i < 4; ++i)
{
LLVolume* lod = group->refLOD(i);
- if (lod && lod->getNumVolumeFaces() > 0)
+ if (lod && !lod->isTetrahedron() && lod->getNumVolumeFaces() > 0)
{
volume->copyVolumeFaces(lod);
group->derefLOD(lod);
@@ -8976,6 +8982,10 @@ void LLPipeline::loadMesh(LLVOVolume* vobj, LLUUID mesh_id, S32 detail)
group->derefLOD(lod);
}
}
+ else
+ {
+ llerrs << "WTF?" << llendl;
+ }
//nothing found, so make a tetrahedron
volume->makeTetrahedron();
@@ -8992,12 +9002,22 @@ void LLPipeline::getMeshAssetCallback(LLVFS *vfs,
}
-LLPipeline::LLMeshThread::LLMeshThread(LLUUID mesh_id, LLVolume* target)
+LLPipeline::LLMeshThread::LLMeshThread(LLUUID mesh_id, LLVolume* target, S32 detail)
: LLThread("mesh_loading_thread")
{
mMeshID = mesh_id;
mVolume = NULL;
mDetail = target->getDetail();
+
+ if (detail == -1)
+ {
+ mDetailIndex = LLVolumeLODGroup::getVolumeDetailFromScale(target->getDetail());
+ }
+ else
+ {
+ mDetailIndex = detail;
+ }
+
mTargetVolume = target;
}
@@ -9073,6 +9093,10 @@ void LLPipeline::notifyLoadedMeshes()
for (std::list<LLMeshThread*>::iterator iter = mLoadedMeshes.begin(); iter != mLoadedMeshes.end(); ++iter)
{ //for each mesh done loading
+
+
+
+
LLMeshThread* mesh = *iter;
if (!mesh->isStopped())
@@ -9081,10 +9105,12 @@ void LLPipeline::notifyLoadedMeshes()
continue;
}
+ S32 detail = mesh->mDetailIndex;
+
//get list of objects waiting to be notified this mesh is loaded
- mesh_load_map::iterator obj_iter = mLoadingMeshes.find(mesh->mMeshID);
+ mesh_load_map::iterator obj_iter = mLoadingMeshes[detail].find(mesh->mMeshID);
- if (mesh->mVolume && obj_iter != mLoadingMeshes.end())
+ if (mesh->mVolume && obj_iter != mLoadingMeshes[detail].end())
{
//make sure target volume is still valid
BOOL valid = FALSE;
@@ -9109,6 +9135,10 @@ void LLPipeline::notifyLoadedMeshes()
{
mesh->mTargetVolume->copyVolumeFaces(mesh->mVolume);
}
+ else
+ {
+ llwarns << "Mesh loading returned empty volume." << llendl;
+ }
for (std::set<LLUUID>::iterator vobj_iter = obj_iter->second.begin(); vobj_iter != obj_iter->second.end(); ++vobj_iter)
{
@@ -9120,7 +9150,7 @@ void LLPipeline::notifyLoadedMeshes()
}
}
- mLoadingMeshes.erase(mesh->mMeshID);
+ mLoadingMeshes[detail].erase(mesh->mMeshID);
}
delete mesh;
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index 23e98aa0d6..a31379a209 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -676,8 +676,9 @@ public:
protected:
std::vector<LLFace*> mSelectedFaces;
+
typedef std::map<LLUUID, std::set<LLUUID> > mesh_load_map;
- mesh_load_map mLoadingMeshes;
+ mesh_load_map mLoadingMeshes[4];
LLMutex* mMeshMutex;
@@ -688,7 +689,8 @@ protected:
LLVolume* mTargetVolume;
LLUUID mMeshID;
F32 mDetail;
- LLMeshThread(LLUUID mesh_id, LLVolume* target);
+ S32 mDetailIndex;
+ LLMeshThread(LLUUID mesh_id, LLVolume* target, S32 detail = -1);
~LLMeshThread();
void run();
};