diff options
| author | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2022-10-24 19:49:36 +0300 | 
|---|---|---|
| committer | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2022-10-24 19:49:36 +0300 | 
| commit | 4b37414dc0963a9db344c493055f501265f4e59a (patch) | |
| tree | 107ba5bb692621b98ad614cc7ae8b35042f63541 | |
| parent | 620d2f4ee595ec013784a374e9136a43b99a355f (diff) | |
Re-merged llvovolume.cpp
Too many issue were detected after merge, so did a clean remerge of the file.
| -rw-r--r-- | indra/newview/llvovolume.cpp | 44 | 
1 files changed, 33 insertions, 11 deletions
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 9c25606ce9..7c58d23d0e 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -1994,7 +1994,7 @@ BOOL LLVOVolume::updateGeometry(LLDrawable *drawable)  	if (mDrawable->isState(LLDrawable::REBUILD_RIGGED))  	{ -		updateRiggedVolume(false); +        updateRiggedVolume(false);  		genBBoxes(FALSE);  		mDrawable->clearState(LLDrawable::REBUILD_RIGGED);  	} @@ -5704,7 +5704,7 @@ static inline void add_face(T*** list, U32* count, T* face)      {          if (count[1] < MAX_FACE_COUNT)          { -            face->setDrawOrderIndex(count[1]); +            //face->setDrawOrderIndex(count[1]);              list[1][count[1]++] = face;          }      } @@ -5712,12 +5712,36 @@ static inline void add_face(T*** list, U32* count, T* face)      {          if (count[0] < MAX_FACE_COUNT)          { -            face->setDrawOrderIndex(count[0]); +            //face->setDrawOrderIndex(count[0]);              list[0][count[0]++] = face;          }      }  } +// return index into linkset for given object (0 for root prim) +U32 get_linkset_index(LLVOVolume* vobj) +{ +    LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE; +    if (vobj->isRootEdit()) +    { +        return 0; +    } + +    LLViewerObject* root = vobj->getRootEdit(); +    U32 idx = 1; +    for (const auto& child : root->getChildren()) +    { +        if (child == vobj) +        { +            return idx; +        } +        ++idx; +    } + +    llassert(false); +    return idx; //should never get here +} +  void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  {      LL_PROFILE_ZONE_SCOPED_CATEGORY_VOLUME; @@ -5881,6 +5905,8 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)                  avatar->addAttachmentOverridesForObject(vobj, NULL, false);              } +            U32 linkset_index = get_linkset_index(vobj); +              // Standard rigged mesh attachments:   			bool rigged = !vobj->isAnimatedObject() && skinInfo && vobj->isAttachment();              // Animated objects. Have to check for isRiggedMesh() to @@ -5900,6 +5926,9 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  					continue;  				} +                // order by linkset index first and face index second +                facep->setDrawOrderIndex(linkset_index * 100 + i); +                                  // HACK -- brute force this check every time a drawable gets rebuilt                  vobj->updateTEMaterialTextures(i);  #if 0 @@ -5939,11 +5968,6 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)                      if (facep->isState(LLFace::RIGGED))                      {                           //face is not rigged but used to be, remove from rigged face pool -                        LLDrawPoolAvatar* pool = (LLDrawPoolAvatar*) facep->getPool(); -                        if (pool) -                        { -                            pool->removeFace(facep); -                        }                          facep->clearState(LLFace::RIGGED);                          facep->mAvatar = NULL;                          facep->mSkinInfo = NULL; @@ -6251,7 +6275,7 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)  			{  				LLDrawable* drawablep = (LLDrawable*)(*drawable_iter)->getDrawable(); -				if (drawablep && !drawablep->isDead() && drawablep->isState(LLDrawable::REBUILD_ALL) && !drawablep->isState(LLDrawable::RIGGED) ) +				if (drawablep && !drawablep->isDead() && drawablep->isState(LLDrawable::REBUILD_ALL))  				{  					LLVOVolume* vobj = drawablep->getVOVolume(); @@ -6285,8 +6309,6 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)  							LLVertexBuffer* buff = face->getVertexBuffer();  							if (buff)  							{ -								llassert(!face->isState(LLFace::RIGGED)); -  								if (!face->getGeometryVolume(*volume, face->getTEOffset(),   									vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), face->getGeomIndex()))  								{ //something's gone wrong with the vertex buffer accounting, rebuild this group   | 
