Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/editors/space_node/node_geometry_attribute_search.cc8
-rw-r--r--source/blender/modifiers/intern/MOD_nodes.cc16
2 files changed, 21 insertions, 3 deletions
diff --git a/source/blender/editors/space_node/node_geometry_attribute_search.cc b/source/blender/editors/space_node/node_geometry_attribute_search.cc
index d0ccbb03107..063e6348123 100644
--- a/source/blender/editors/space_node/node_geometry_attribute_search.cc
+++ b/source/blender/editors/space_node/node_geometry_attribute_search.cc
@@ -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;
}
diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc
index 7740fe891e3..3444be40a59 100644
--- a/source/blender/modifiers/intern/MOD_nodes.cc
+++ b/source/blender/modifiers/intern/MOD_nodes.cc
@@ -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;
}