Fix T89313: Attribute search crash with animation playback

rBc473b2ce8bdbf8fa42 improved the situation somewhat, but
attribute search still crashes during animation playback, because
the UI search data references stale memory. The proper solution
is to allow the search to own data rather than just referencing it,
but I would prefer not to do that for 3.0. In the meantime, just
disable attribute search when animation is playing.

Differential Revision: https://developer.blender.org/D13179
This commit is contained in:
Hans Goudey 2021-11-10 15:43:18 -06:00
parent 040630bb9a
commit 22ffd69a91
Notes: blender-bot 2023-02-14 08:24:03 +01:00
Referenced by issue #93082, [3.0] Baking materials with alpha transparency makes background objects bleed through
Referenced by issue #89313, Crashing during animation with Geometry Nodes ( when clicked on Attribute Randomize - Attribute field )
2 changed files with 21 additions and 3 deletions

View File

@ -33,6 +33,7 @@
#include "RNA_access.h"
#include "RNA_enum_types.h"
#include "ED_screen.h"
#include "ED_undo.h"
#include "BLT_translation.h"
@ -64,6 +65,10 @@ BLI_STATIC_ASSERT(std::is_trivially_destructible_v<AttributeSearchData>, "");
static void attribute_search_update_fn(
const bContext *C, void *arg, const char *str, uiSearchItems *items, const bool is_first)
{
if (ED_screen_animation_playing(CTX_wm_manager(C))) {
return;
}
AttributeSearchData *data = static_cast<AttributeSearchData *>(arg);
SpaceNode *snode = CTX_wm_space_node(C);
@ -79,6 +84,9 @@ static void attribute_search_update_fn(
static void attribute_search_exec_fn(bContext *C, void *data_v, void *item_v)
{
if (ED_screen_animation_playing(CTX_wm_manager(C))) {
return;
}
if (item_v == nullptr) {
return;
}

View File

@ -88,6 +88,7 @@
#include "MOD_ui_common.h"
#include "ED_object.h"
#include "ED_screen.h"
#include "ED_spreadsheet.h"
#include "ED_undo.h"
@ -1128,8 +1129,17 @@ struct AttributeSearchData {
/* This class must not have a destructor, since it is used by buttons and freed with #MEM_freeN. */
BLI_STATIC_ASSERT(std::is_trivially_destructible_v<AttributeSearchData>, "");
static NodesModifierData *get_modifier_data(Main &bmain, const AttributeSearchData &data)
static NodesModifierData *get_modifier_data(Main &bmain,
const wmWindowManager &wm,
const AttributeSearchData &data)
{
if (ED_screen_animation_playing(&wm)) {
/* Work around an issue where the attribute search exec function has stale pointers when data
* is reallocated when evaluating the node tree, causing a crash. This would be solved by
* allowing the UI search data to own arbitrary memory rather than just referencing it. */
return nullptr;
}
const Object *object = (Object *)BKE_libblock_find_session_uuid(
&bmain, ID_OB, data.object_session_uid);
if (object == nullptr) {
@ -1147,7 +1157,7 @@ static void attribute_search_update_fn(
const bContext *C, void *arg, const char *str, uiSearchItems *items, const bool is_first)
{
AttributeSearchData &data = *static_cast<AttributeSearchData *>(arg);
const NodesModifierData *nmd = get_modifier_data(*CTX_data_main(C), data);
const NodesModifierData *nmd = get_modifier_data(*CTX_data_main(C), *CTX_wm_manager(C), data);
if (nmd == nullptr) {
return;
}
@ -1181,7 +1191,7 @@ static void attribute_search_exec_fn(bContext *C, void *data_v, void *item_v)
}
AttributeSearchData &data = *static_cast<AttributeSearchData *>(data_v);
const GeometryAttributeInfo &item = *static_cast<const GeometryAttributeInfo *>(item_v);
const NodesModifierData *nmd = get_modifier_data(*CTX_data_main(C), data);
const NodesModifierData *nmd = get_modifier_data(*CTX_data_main(C), *CTX_wm_manager(C), data);
if (nmd == nullptr) {
return;
}