SL-17372 Fix viewer crashing when switching models

mDefaultPhysicsShapeP could reference a dead model if scene changes
meow-7.2.2
Andrey Kleshchev 2024-01-27 00:35:30 +02:00 committed by Andrey Kleshchev
parent 08cf926d3b
commit e0c604c5f6
2 changed files with 6 additions and 5 deletions

View File

@ -440,13 +440,13 @@ void LLModelPreview::rebuildUploadData()
// That's ok, but might not what they wanted. Use default_physics_shape if found.
std::ostringstream out;
out << "No physics model specified for " << instance.mLabel;
if (mDefaultPhysicsShapeP)
if (mDefaultPhysicsShapeP.notNull())
{
out << " - using: " << DEFAULT_PHYSICS_MESH_NAME;
lod_model = mDefaultPhysicsShapeP;
}
LL_WARNS() << out.str() << LL_ENDL;
LLFloaterModelPreview::addStringToLog(out, !mDefaultPhysicsShapeP); // Flash log tab if no default.
LLFloaterModelPreview::addStringToLog(out, mDefaultPhysicsShapeP.isNull()); // Flash log tab if no default.
}
if (lod_model)
@ -1076,8 +1076,9 @@ void LLModelPreview::loadModelCallback(S32 loaded_lod)
if (loaded_lod == LLModel::LOD_PHYSICS)
{ // Explicitly loading physics. See if there is a default mesh.
LLMatrix4 ignored_transform; // Each mesh that uses this will supply their own.
mDefaultPhysicsShapeP = nullptr;
FindModel(mScene[loaded_lod], DEFAULT_PHYSICS_MESH_NAME + getLodSuffix(loaded_lod), mDefaultPhysicsShapeP, ignored_transform);
LLModel* out_model = nullptr;
FindModel(mScene[loaded_lod], DEFAULT_PHYSICS_MESH_NAME + getLodSuffix(loaded_lod), out_model, ignored_transform);
mDefaultPhysicsShapeP = out_model;
mWarnOfUnmatchedPhyicsMeshes = true;
}
BOOL legacyMatching = gSavedSettings.getBOOL("ImporterLegacyMatching");

View File

@ -240,7 +240,7 @@ private:
/// It is set only when the user chooses a physics shape file that contains a mesh with a name that matches DEFAULT_PHYSICS_MESH_NAME.
/// It is reset when such a name is not found, and when resetting the modelpreview.
/// Not read unless mWarnOfUnmatchedPhyicsMeshes is true.
LLModel* mDefaultPhysicsShapeP{};
LLPointer<LLModel> mDefaultPhysicsShapeP;
typedef enum
{