Changeset View
Changeset View
Standalone View
Standalone View
source/blender/modifiers/intern/MOD_nodes.cc
| Show First 20 Lines • Show All 82 Lines • ▼ Show 20 Lines | |||||
| #include "DEG_depsgraph_query.h" | #include "DEG_depsgraph_query.h" | ||||
| #include "MOD_modifiertypes.h" | #include "MOD_modifiertypes.h" | ||||
| #include "MOD_nodes.h" | #include "MOD_nodes.h" | ||||
| #include "MOD_nodes_evaluator.hh" | #include "MOD_nodes_evaluator.hh" | ||||
| #include "MOD_ui_common.h" | #include "MOD_ui_common.h" | ||||
| #include "ED_object.h" | #include "ED_object.h" | ||||
| #include "ED_screen.h" | |||||
| #include "ED_spreadsheet.h" | #include "ED_spreadsheet.h" | ||||
| #include "ED_undo.h" | #include "ED_undo.h" | ||||
| #include "NOD_derived_node_tree.hh" | #include "NOD_derived_node_tree.hh" | ||||
| #include "NOD_geometry.h" | #include "NOD_geometry.h" | ||||
| #include "NOD_geometry_nodes_eval_log.hh" | #include "NOD_geometry_nodes_eval_log.hh" | ||||
| #include "NOD_node_declaration.hh" | #include "NOD_node_declaration.hh" | ||||
| ▲ Show 20 Lines • Show All 1,024 Lines • ▼ Show 20 Lines | struct AttributeSearchData { | ||||
| uint32_t object_session_uid; | uint32_t object_session_uid; | ||||
| char modifier_name[MAX_NAME]; | char modifier_name[MAX_NAME]; | ||||
| char socket_identifier[MAX_NAME]; | char socket_identifier[MAX_NAME]; | ||||
| bool is_output; | bool is_output; | ||||
| }; | }; | ||||
| /* This class must not have a destructor, since it is used by buttons and freed with #MEM_freeN. */ | /* 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>, ""); | 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( | const Object *object = (Object *)BKE_libblock_find_session_uuid( | ||||
| &bmain, ID_OB, data.object_session_uid); | &bmain, ID_OB, data.object_session_uid); | ||||
| if (object == nullptr) { | if (object == nullptr) { | ||||
| return nullptr; | return nullptr; | ||||
| } | } | ||||
| ModifierData *md = BKE_modifiers_findby_name(object, data.modifier_name); | ModifierData *md = BKE_modifiers_findby_name(object, data.modifier_name); | ||||
| if (md == nullptr) { | if (md == nullptr) { | ||||
| return nullptr; | return nullptr; | ||||
| } | } | ||||
| BLI_assert(md->type == eModifierType_Nodes); | BLI_assert(md->type == eModifierType_Nodes); | ||||
| return reinterpret_cast<NodesModifierData *>(md); | return reinterpret_cast<NodesModifierData *>(md); | ||||
| } | } | ||||
| static void attribute_search_update_fn( | static void attribute_search_update_fn( | ||||
| const bContext *C, void *arg, const char *str, uiSearchItems *items, const bool is_first) | const bContext *C, void *arg, const char *str, uiSearchItems *items, const bool is_first) | ||||
| { | { | ||||
| AttributeSearchData &data = *static_cast<AttributeSearchData *>(arg); | 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) { | if (nmd == nullptr) { | ||||
| return; | return; | ||||
| } | } | ||||
| const geo_log::ModifierLog *modifier_log = static_cast<const geo_log::ModifierLog *>( | const geo_log::ModifierLog *modifier_log = static_cast<const geo_log::ModifierLog *>( | ||||
| nmd->runtime_eval_log); | nmd->runtime_eval_log); | ||||
| if (modifier_log == nullptr) { | if (modifier_log == nullptr) { | ||||
| return; | return; | ||||
| } | } | ||||
| Show All 17 Lines | |||||
| static void attribute_search_exec_fn(bContext *C, void *data_v, void *item_v) | static void attribute_search_exec_fn(bContext *C, void *data_v, void *item_v) | ||||
| { | { | ||||
| if (item_v == nullptr) { | if (item_v == nullptr) { | ||||
| return; | return; | ||||
| } | } | ||||
| AttributeSearchData &data = *static_cast<AttributeSearchData *>(data_v); | AttributeSearchData &data = *static_cast<AttributeSearchData *>(data_v); | ||||
| const GeometryAttributeInfo &item = *static_cast<const GeometryAttributeInfo *>(item_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) { | if (nmd == nullptr) { | ||||
| return; | return; | ||||
| } | } | ||||
| const std::string attribute_prop_name = data.socket_identifier + attribute_name_suffix; | const std::string attribute_prop_name = data.socket_identifier + attribute_name_suffix; | ||||
| IDProperty &name_property = *IDP_GetPropertyFromGroup(nmd->settings.properties, | IDProperty &name_property = *IDP_GetPropertyFromGroup(nmd->settings.properties, | ||||
| attribute_prop_name.c_str()); | attribute_prop_name.c_str()); | ||||
| IDP_AssignString(&name_property, item.name.c_str(), 0); | IDP_AssignString(&name_property, item.name.c_str(), 0); | ||||
| ▲ Show 20 Lines • Show All 381 Lines • Show Last 20 Lines | |||||