From b201fd6dd6eae2ce29c91dcba692c734b4d44abb Mon Sep 17 00:00:00 2001 From: rtw1x1 Date: Wed, 31 Dec 2025 09:05:58 +0000 Subject: [PATCH] Stop crashing on bad meshes like it's the end of the world Pushing this on behalf of savis --- src/EterGrnLib/Model.cpp | 23 ++++++++++++++++--- .../ModelInstanceCollisionDetection.cpp | 4 ++++ src/EterGrnLib/ModelInstanceUpdate.cpp | 3 +++ 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/EterGrnLib/Model.cpp b/src/EterGrnLib/Model.cpp index 968f838..28f6c09 100644 --- a/src/EterGrnLib/Model.cpp +++ b/src/EterGrnLib/Model.cpp @@ -14,16 +14,33 @@ const CGrannyModel::TMeshNode* CGrannyModel::GetMeshNodeList(CGrannyMesh::EType CGrannyMesh * CGrannyModel::GetMeshPointer(int iMesh) { - assert(CheckMeshIndex(iMesh)); + if (!CheckMeshIndex(iMesh)) assert(m_meshs != NULL); + { + TraceError("CGrannyModel::GetMeshPointer - Invalid mesh index: %d (max: %d)", iMesh, m_meshNodeSize); + return nullptr; + } + if (m_meshs == NULL) + { + TraceError("CGrannyModel::GetMeshPointer - m_meshs is NULL"); + return nullptr; + } return m_meshs + iMesh; } const CGrannyMesh* CGrannyModel::GetMeshPointer(int iMesh) const { - assert(CheckMeshIndex(iMesh)); - assert(m_meshs != NULL); + if (!CheckMeshIndex(iMesh)) + { + TraceError("CGrannyModel::GetMeshPointer(const) - Invalid mesh index: %d (max: %d)", iMesh, m_meshNodeSize); + return nullptr; + } + if (m_meshs == NULL) + { + TraceError("CGrannyModel::GetMeshPointer(const) - m_meshs is NULL"); + return nullptr; + } return m_meshs + iMesh; } diff --git a/src/EterGrnLib/ModelInstanceCollisionDetection.cpp b/src/EterGrnLib/ModelInstanceCollisionDetection.cpp index 44ff77e..7f6e8f0 100644 --- a/src/EterGrnLib/ModelInstanceCollisionDetection.cpp +++ b/src/EterGrnLib/ModelInstanceCollisionDetection.cpp @@ -101,6 +101,10 @@ bool CGrannyModelInstance::Intersect(const D3DXMATRIX * c_pMatrix, granny_matrix_4x4* pgrnMatCompositeBuffer = GrannyGetWorldPoseComposite4x4Array(m_pgrnWorldPose); const CGrannyMesh* c_pMesh = m_pModel->GetMeshPointer(rcurBoundBox.meshIndex); + + if (!c_pMesh) + continue; + const granny_mesh* c_pgrnMesh = c_pMesh->GetGrannyMeshPointer(); if (!GrannyMeshIsRigid(c_pgrnMesh)) diff --git a/src/EterGrnLib/ModelInstanceUpdate.cpp b/src/EterGrnLib/ModelInstanceUpdate.cpp index 3e634c6..a3ea1b9 100644 --- a/src/EterGrnLib/ModelInstanceUpdate.cpp +++ b/src/EterGrnLib/ModelInstanceUpdate.cpp @@ -177,6 +177,9 @@ void CGrannyModelInstance::UpdateWorldMatrices(const D3DXMATRIX* c_pWorldMatrix) const CGrannyMesh * pMesh = m_pModel->GetMeshPointer(i); + if (!pMesh) + continue; + // WORK int * boneIndices = __GetMeshBoneIndices(i); // END_OF_WORK