FIRE-14261 / FIRE-19412: Proposed fix for invalid mesh crashes, based on a fix by Henri Beauchamp (Cool VL)
parent
7a69b2b353
commit
0219d27fc1
|
|
@ -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>
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Reference in New Issue