FIRE-14261 / FIRE-19412: Proposed fix for invalid mesh crashes, based on a fix by Henri Beauchamp (Cool VL)

meow-7.2.2
Ansariel 2018-01-30 12:33:13 +01:00
parent 7a69b2b353
commit 0219d27fc1
2 changed files with 39 additions and 10 deletions

View File

@ -1603,7 +1603,10 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
}
}
void LLDrawPoolAvatar::getRiggedGeometry(
// <FS> Fix bogus rigged mesh crash
//void LLDrawPoolAvatar::getRiggedGeometry(
bool LLDrawPoolAvatar::getRiggedGeometry(
// </FS>
LLFace* face,
LLPointer<LLVertexBuffer>& buffer,
U32 data_mask,
@ -1612,13 +1615,13 @@ void LLDrawPoolAvatar::getRiggedGeometry(
const LLVolumeFace& vol_face)
{
// <FS:ND> 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;
}
// </FS:ND>
@ -1719,6 +1722,9 @@ void LLDrawPoolAvatar::getRiggedGeometry(
face->getGeometryVolume(*volume, face->getTEOffset(), mat_vert, mat_normal, offset, true);
buffer->flush();
// <FS> Fix bogus rigged mesh crash
return true;
}
void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(
@ -1733,6 +1739,14 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(
{
return;
}
// <FS> Fix bogus rigged mesh crash
if (vol_face.mNumVertices > 65536 || vol_face.mNumVertices < 0 || vol_face.mNumIndices < 0)
{
return;
}
// </FS>
// FIXME ugly const cast
LLSkinningUtil::scrubInvalidJoints(avatar, const_cast<LLMeshSkinInfo*>(skin));
@ -1764,7 +1778,13 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(
{
LLPointer<LLVertexBuffer> cur_buffer = facep->getVertexBuffer();
const LLVolumeFace& cur_vol_face = volume->getVolumeFace(i);
getRiggedGeometry(facep, cur_buffer, face_data_mask, skin, volume, cur_vol_face);
// <FS> 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;
}
// </FS>
}
}
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);
// <FS> 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;
}
// </FS>
}
}

View File

@ -133,7 +133,10 @@ public:
void endDeferredRiggedSimple();
void endDeferredRiggedBump();
void getRiggedGeometry(LLFace* face, LLPointer<LLVertexBuffer>& buffer, U32 data_mask, const LLMeshSkinInfo* skin, LLVolume* volume, const LLVolumeFace& vol_face);
// <FS> Fix bogus rigged mesh crash
//void getRiggedGeometry(LLFace* face, LLPointer<LLVertexBuffer>& buffer, U32 data_mask, const LLMeshSkinInfo* skin, LLVolume* volume, const LLVolumeFace& vol_face);
bool getRiggedGeometry(LLFace* face, LLPointer<LLVertexBuffer>& buffer, U32 data_mask, const LLMeshSkinInfo* skin, LLVolume* volume, const LLVolumeFace& vol_face);
// </FS>
void updateRiggedFaceVertexBuffer(LLVOAvatar* avatar,
LLFace* facep,
const LLMeshSkinInfo* skin,