diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index 63e5872d20..842f569402 100644
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -1603,7 +1603,10 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
}
}
-void LLDrawPoolAvatar::getRiggedGeometry(
+// Fix bogus rigged mesh crash
+//void LLDrawPoolAvatar::getRiggedGeometry(
+bool LLDrawPoolAvatar::getRiggedGeometry(
+//
LLFace* face,
LLPointer& buffer,
U32 data_mask,
@@ -1612,13 +1615,13 @@ void LLDrawPoolAvatar::getRiggedGeometry(
const LLVolumeFace& vol_face)
{
// FIRE-14261 try to skip broken or out of bounds faces
- if( vol_face.mNumVertices > 0x10000 || vol_face.mNumVertices < 0 || vol_face.mNumIndices < 0 )
+ if (vol_face.mNumVertices > 65536 || vol_face.mNumVertices < 0 || vol_face.mNumIndices < 0)
{
- LL_WARNS() << "Skipping face - "
- << " vertices " << vol_face.mNumVertices << " indices " << vol_face.mNumIndices
- << " face is possibly corrupted"
- << LL_ENDL;
- return;
+ LL_WARNS_ONCE() << "Skipping face - "
+ << " vertices " << vol_face.mNumVertices << " indices " << vol_face.mNumIndices
+ << " face is possibly corrupted"
+ << LL_ENDL;
+ return false;
}
//
@@ -1719,6 +1722,9 @@ void LLDrawPoolAvatar::getRiggedGeometry(
face->getGeometryVolume(*volume, face->getTEOffset(), mat_vert, mat_normal, offset, true);
buffer->flush();
+
+ // Fix bogus rigged mesh crash
+ return true;
}
void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(
@@ -1733,6 +1739,14 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(
{
return;
}
+
+ // Fix bogus rigged mesh crash
+ if (vol_face.mNumVertices > 65536 || vol_face.mNumVertices < 0 || vol_face.mNumIndices < 0)
+ {
+ return;
+ }
+ //
+
// FIXME ugly const cast
LLSkinningUtil::scrubInvalidJoints(avatar, const_cast(skin));
@@ -1764,7 +1778,13 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(
{
LLPointer cur_buffer = facep->getVertexBuffer();
const LLVolumeFace& cur_vol_face = volume->getVolumeFace(i);
- getRiggedGeometry(facep, cur_buffer, face_data_mask, skin, volume, cur_vol_face);
+ // Fix bogus rigged mesh crash
+ //getRiggedGeometry(facep, cur_buffer, face_data_mask, skin, volume, cur_vol_face);
+ if (!getRiggedGeometry(facep, cur_buffer, face_data_mask, skin, volume, cur_vol_face))
+ {
+ return;
+ }
+ //
}
}
drawable->clearState(LLDrawable::REBUILD_ALL);
@@ -1774,7 +1794,13 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(
else
{
//just rebuild this face
- getRiggedGeometry(face, buffer, data_mask, skin, volume, vol_face);
+ // Fix bogus rigged mesh crash
+ //getRiggedGeometry(face, buffer, data_mask, skin, volume, vol_face);
+ if (!getRiggedGeometry(face, buffer, data_mask, skin, volume, vol_face))
+ {
+ return;
+ }
+ //
}
}
diff --git a/indra/newview/lldrawpoolavatar.h b/indra/newview/lldrawpoolavatar.h
index 2002fe3451..cd18190b1e 100644
--- a/indra/newview/lldrawpoolavatar.h
+++ b/indra/newview/lldrawpoolavatar.h
@@ -133,7 +133,10 @@ public:
void endDeferredRiggedSimple();
void endDeferredRiggedBump();
- void getRiggedGeometry(LLFace* face, LLPointer& buffer, U32 data_mask, const LLMeshSkinInfo* skin, LLVolume* volume, const LLVolumeFace& vol_face);
+ // Fix bogus rigged mesh crash
+ //void getRiggedGeometry(LLFace* face, LLPointer& buffer, U32 data_mask, const LLMeshSkinInfo* skin, LLVolume* volume, const LLVolumeFace& vol_face);
+ bool getRiggedGeometry(LLFace* face, LLPointer& buffer, U32 data_mask, const LLMeshSkinInfo* skin, LLVolume* volume, const LLVolumeFace& vol_face);
+ //
void updateRiggedFaceVertexBuffer(LLVOAvatar* avatar,
LLFace* facep,
const LLMeshSkinInfo* skin,