From d5bc1d996a85398de5eefe142870a345b3e30cd7 Mon Sep 17 00:00:00 2001 From: Beq Date: Tue, 1 Nov 2022 15:27:17 +0000 Subject: [PATCH] [FIRE-32218] [Local Mesh] Crash when creating surrogate mesh after closing local mesh floater don't rely on cached this pointer in the callback. Use the explictly stored floater_pointer instead --- indra/newview/vjfloaterlocalmesh.cpp | 57 +++++++++++++++------------- indra/newview/vjlocalmesh.h | 1 + 2 files changed, 31 insertions(+), 27 deletions(-) diff --git a/indra/newview/vjfloaterlocalmesh.cpp b/indra/newview/vjfloaterlocalmesh.cpp index 786119281d..b2d672af17 100644 --- a/indra/newview/vjfloaterlocalmesh.cpp +++ b/indra/newview/vjfloaterlocalmesh.cpp @@ -367,12 +367,10 @@ bool LLFloaterLocalMesh::processPrimCreated(LLViewerObject* object) // Select the new object LLSelectMgr::getInstance()->selectObjectAndFamily(object, TRUE); - update_selected_target( object->getID() ); // LLUUID local_id{"aee92334-90e9-110b-7c03-0ff3bc19de63"}; LLUUID local_id{}; - auto* volp = object->getVolume(); if(!volp) { @@ -393,37 +391,42 @@ bool LLFloaterLocalMesh::processPrimCreated(LLViewerObject* object) { return false; } - auto scroll_ctrl_selected_item = this->mScrollCtrl->getFirstSelected(); - if(!scroll_ctrl_selected_item){return true;}; // at this point we have a valid object even if we can't fill it. - auto scroll_ctrl_selected_column = scroll_ctrl_selected_item->getColumn(LOCAL_TRACKING_ID_COLUMN); - if(!scroll_ctrl_selected_column){return true;}; // at this point we have a valid object even if we can't fill it. - - auto objectlist_combo_box = this->getChild("object_apply_list"); - if(!objectlist_combo_box){return true;}; // at this point we have a valid object even if we can't fill it. - - // TODO: replace this with check box. "apply selected" - bool apply_local { scroll_ctrl_selected_item && scroll_ctrl_selected_column && objectlist_combo_box }; - - if ( apply_local ) + if(auto floater_ptr = LLLocalMeshSystem::getInstance()->getFloaterPointer()) { - local_id = scroll_ctrl_selected_column->getValue().asUUID(); - // fill it up with local goodness - static const bool use_scale {true}; + floater_ptr->update_selected_target( object->getID() ); + auto scroll_ctrl_selected_item = floater_ptr->mScrollCtrl->getFirstSelected(); + if(!scroll_ctrl_selected_item){return true;}; // at this point we have a valid object even if we can't fill it. - // // make sure the selection is still valid, and if so - get id. + auto scroll_ctrl_selected_column = scroll_ctrl_selected_item->getColumn(LOCAL_TRACKING_ID_COLUMN); + if(!scroll_ctrl_selected_column){return true;}; // at this point we have a valid object even if we can't fill it. - // get selected local file id, object idx and use_scale boolean - int object_idx = objectlist_combo_box->getFirstSelectedIndex(); - LLLocalMeshSystem::getInstance()->applyVObject(object->getID(), local_id, object_idx, use_scale); - volp = object->getVolume(); - if(!volp) + auto objectlist_combo_box = floater_ptr->getChild("object_apply_list"); + if(!objectlist_combo_box){return true;}; // at this point we have a valid object even if we can't fill it. + + // TODO: replace this with check box. "apply selected" + bool apply_local { scroll_ctrl_selected_item && scroll_ctrl_selected_column && objectlist_combo_box }; + + if ( apply_local ) { - return true; + local_id = scroll_ctrl_selected_column->getValue().asUUID(); + // fill it up with local goodness + static const bool use_scale {true}; + + // // make sure the selection is still valid, and if so - get id. + + // get selected local file id, object idx and use_scale boolean + int object_idx = objectlist_combo_box->getFirstSelectedIndex(); + LLLocalMeshSystem::getInstance()->applyVObject(object->getID(), local_id, object_idx, use_scale); + volp = object->getVolume(); + if(!volp) + { + return true; + } + volume_params = volp->getParams(); + object->updateVolume(volume_params); + object->markForUpdate(true); } - volume_params = volp->getParams(); - object->updateVolume(volume_params); - object->markForUpdate(true); } return true; } diff --git a/indra/newview/vjlocalmesh.h b/indra/newview/vjlocalmesh.h index e50ac6ba43..aa4ce2e8ee 100644 --- a/indra/newview/vjlocalmesh.h +++ b/indra/newview/vjlocalmesh.h @@ -244,6 +244,7 @@ class LLLocalMeshSystem : public LLSingleton // floater two-way communication void registerFloaterPointer(LLFloaterLocalMesh* floater_ptr); + LLFloaterLocalMesh* getFloaterPointer(){return mFloaterPtr;}; void triggerFloaterRefresh( bool keep_selection=true ); std::vector getFileInfoVector() const; std::vector getFileLog(LLUUID local_file_id) const;