From 0219d27fc1ff4e29651c0c1720057f6ec1f7fdf7 Mon Sep 17 00:00:00 2001 From: Ansariel Date: Tue, 30 Jan 2018 12:33:13 +0100 Subject: [PATCH] FIRE-14261 / FIRE-19412: Proposed fix for invalid mesh crashes, based on a fix by Henri Beauchamp (Cool VL) --- indra/newview/lldrawpoolavatar.cpp | 44 ++++++++++++++++++++++++------ indra/newview/lldrawpoolavatar.h | 5 +++- 2 files changed, 39 insertions(+), 10 deletions(-) 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,