159 geo_log::GeoModifierLog::get_context_hash_by_zone_for_node_editor(
160 snode, compute_context_builder);
162 r_socket_log_contexts.
add(
hash);
178 switch (
object.type) {
185 static_cast<const PointCloud *
>(
object.data));
189 const Mesh *mesh =
static_cast<const Mesh *
>(
object.data);
190 if (std::shared_ptr<BMEditMesh> &em = mesh->runtime->edit_mesh) {
210 geometry.ensure_owns_direct_data();
211 switch (
object.type) {
214 Curves *new_curves = geometry.get_curves_for_write();
221 new_curves->
geometry.wrap().attributes_for_write().remove_anonymous();
223 curves.geometry.wrap() = std::move(new_curves->
geometry.wrap());
238 new_points->attributes_for_write().remove_anonymous();
245 Mesh &mesh = *
static_cast<Mesh *
>(
object.data);
247 const bool has_shape_keys = mesh.
key !=
nullptr;
259 new_mesh->attributes_for_write().remove_anonymous();
272 if (has_shape_keys && !mesh.key) {
292 const int orig_size = ids.
size();
294 bool needs_own_transform_relation =
false;
295 bool needs_scene_camera_relation =
false;
297 node_tree, ids, needs_own_transform_relation, needs_scene_camera_relation);
298 if (ids.
size() != orig_size) {
309 if (input->identifier == identifier) {
318 switch (socket_type) {
395 IDP_AddToGroup(properties, bke::idprop::create(prop->name, id).release());
398 IDP_AddToGroup(properties, IDP_CopyProperty(prop));
432 auto handle_object = [&](
Object *object) {
433 if (object->mode != mode) {
436 if (!unique_object_data.
add(
static_cast<const ID *
>(object->data))) {
442 objects.append(
object);
447 handle_object(
object);
456 if (v3d && active_object) {
471 if (!active_object) {
477 if (!node_tree_orig) {
506 if (depsgraphs.extra) {
516 if (lf_graph_info ==
nullptr) {
525 if (
node_tree->interface_outputs().is_empty() ||
526 !
STREQ(
node_tree->interface_outputs()[0]->socket_type,
"NodeSocketGeometry"))
535 eval_log.
log = std::make_unique<geo_log::GeoModifierLog>();
539 for (
Object *
object : objects) {
541 operator_eval_data.
mode = mode;
542 operator_eval_data.depsgraphs = &depsgraphs;
543 operator_eval_data.self_object_orig = object;
544 operator_eval_data.scene_orig =
scene;
550 op->
ptr,
"viewport_projection_matrix", operator_eval_data.viewport_winmat.base_ptr());
552 op->
ptr,
"viewport_view_matrix", operator_eval_data.viewport_viewmat.base_ptr());
554 "viewport_is_perspective");
558 call_data.eval_log = eval_log.
log.get();
559 if (
object == active_object) {
561 call_data.socket_log_contexts = &socket_log_contexts;
567 *
node_tree, properties, compute_context, call_data, std::move(geometry_orig));
578 if (warning.type == geo_log::NodeWarningType::Info) {
624 "viewport_projection_matrix",
627 "viewport_view_matrix",
641 nodes ::update_input_properties_from_node_tree(
672 const std::string rna_path =
"[\"" + std::string(socket_id_esc) +
"\"]";
673 const std::string rna_path_use_attribute =
"[\"" + std::string(socket_id_esc) +
675 const std::string rna_path_attribute_name =
"[\"" + std::string(socket_id_esc) +
685 const bool use_attribute =
RNA_boolean_get(md_ptr, rna_path_use_attribute.c_str());
687 uiItemL(name_row,
"", ICON_NONE);
709 prop_row, md_ptr, rna_path_use_attribute.c_str(),
UI_ITEM_R_ICON_ONLY,
"", ICON_SPREADSHEET);
718 const int socket_index)
735 char rna_path[
sizeof(socket_id_esc) + 4];
736 SNPRINTF(rna_path,
"[\"%s\"]", socket_id_esc);
744 const char *name = socket.
name ? socket.
name :
"";
745 switch (socket_type) {
747 uiItemPointerR(row, op_ptr, rna_path, bmain_ptr,
"objects", name, ICON_OBJECT_DATA);
751 row, op_ptr, rna_path, bmain_ptr,
"collections", name, ICON_OUTLINER_COLLECTION);
754 uiItemPointerR(row, op_ptr, rna_path, bmain_ptr,
"materials", name, ICON_MATERIAL);
757 uiItemPointerR(row, op_ptr, rna_path, bmain_ptr,
"textures", name, ICON_TEXTURE);
760 uiItemPointerR(row, op_ptr, rna_path, bmain_ptr,
"images", name, ICON_IMAGE);
817 return std::string(local_name,
len);
820 ptr,
"relative_asset_identifier",
nullptr, 0, &
len);
823 return ref.drop_prefix(ref.find_last_of(
SEP_STR) + 1);
835 return group->geometry_node_asset_traits &&
845 &asset->
get_metadata(),
"geometry_node_asset_traits_flag");
855 ot->
name =
"Run Node Group";
881 "Mouse coordinates in region space",
886 ot->
srna,
"region_size", 2,
nullptr, 0, INT_MAX,
"Region Size",
"", 0, INT_MAX);
894 "3D Cursor Position",
905 "3D Cursor Rotation",
911 "viewport_projection_matrix",
916 "Viewport Projection Transform",
922 "viewport_view_matrix",
927 "Viewport View Transform",
933 ot->
srna,
"viewport_is_perspective",
false,
"Viewport Is Perspective",
"");
1082 auto meta_data_filter = [&](
const AssetMetaData &meta_data) {
1088 &meta_data,
"geometry_node_asset_traits_flag");
1089 if (traits_flag ==
nullptr || (
IDP_Int(traits_flag) &
flag) !=
flag) {
1107 switch (object_type) {
1125 menus.
add_new(
"Object/Apply");
1126 menus.
add_new(
"Object/Convert");
1127 menus.
add_new(
"Object/Quick Effects");
1134 menus.
add_new(
"Mesh/Extrude");
1135 menus.
add_new(
"Mesh/Clean Up");
1138 menus.
add_new(
"Mesh/Normals");
1139 menus.
add_new(
"Mesh/Shading");
1141 menus.
add_new(
"Mesh/Weights");
1145 menus.
add_new(
"Face/Face Data");
1175 if (!active_object) {
1182 const std::optional<StringRefNull> menu_path =
CTX_data_string_get(C,
"asset_catalog_path");
1193 bool add_separator =
true;
1197 if (add_separator) {
1199 add_separator =
false;
1204 IFACE_(asset->get_name().c_str()),
1226 if (add_separator) {
1228 add_separator =
false;
1237 STRNCPY(type.idname,
"GEO_MT_node_operator_catalog_assets");
1249 if (!active_object) {
1255 if (group->id.library_weak_reference || group->id.asset_data) {
1258 if (!group->geometry_node_asset_traits ||
1259 (group->geometry_node_asset_traits->flag &
flag) !=
flag)
1271 if (!active_object) {
1284 IFACE_(asset->get_name().c_str()),
1296 bool add_separator = !
tree->unassigned_assets.is_empty();
1300 if (group->id.library_weak_reference || group->id.asset_data) {
1303 if (!group->geometry_node_asset_traits ||
1304 (group->geometry_node_asset_traits->flag &
flag) !=
flag)
1309 if (add_separator) {
1311 add_separator =
false;
1336 STRNCPY(type.idname,
"GEO_MT_node_operator_unassigned");
1341 type.description =
N_(
1342 "Tool node group assets not assigned to a catalog.\n"
1343 "Catalogs can be assigned in the Asset Browser");
1352 if (!active_object) {
1376 if (!active_object) {
1392 asset::draw_menu_for_catalog(item,
"GEO_MT_node_operator_catalog_assets", layout);
1397 uiItemM(&layout,
"GEO_MT_node_operator_unassigned",
"", ICON_FILE_HIDDEN);
Main runtime representation of an asset.
IDProperty * BKE_asset_metadata_idprop_find(const AssetMetaData *asset_data, const char *name) ATTR_WARN_UNUSED_RESULT
#define CTX_DATA_BEGIN(C, Type, instance, member)
Depsgraph * CTX_data_ensure_evaluated_depsgraph(const bContext *C)
Object * CTX_data_active_object(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
Main * CTX_data_main(const bContext *C)
RegionView3D * CTX_wm_region_view3d(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
std::optional< blender::StringRefNull > CTX_data_string_get(const bContext *C, const char *member)
View3D * CTX_wm_view3d(const bContext *C)
ViewLayer * CTX_data_view_layer(const bContext *C)
struct Curves * BKE_curves_copy_for_eval(const struct Curves *curves_src)
Low-level operations for curves.
CustomData interface, see also DNA_customdata_types.h.
void CustomData_free(CustomData *data, int totelem)
void BKE_editmesh_looptris_and_normals_calc(BMEditMesh *em)
void IDP_foreach_property(IDProperty *id_property_root, int type_filter, blender::FunctionRef< void(IDProperty *id_property)> callback)
IDProperty * IDP_GetPropertyFromGroup(const IDProperty *prop, const char *name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void IDP_FreeProperty_ex(IDProperty *prop, bool do_id_user)
#define FOREACH_OBJECT_IN_MODE_END
#define FOREACH_OBJECT_IN_MODE_BEGIN(_scene, _view_layer, _v3d, _object_type, _object_mode, _instance)
ID * BKE_libblock_find_name(Main *bmain, short type, const char *name, const std::optional< Library * > lib=std::nullopt) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
bool BKE_id_is_editable(const Main *bmain, const ID *id)
void BKE_id_free(Main *bmain, void *idv)
General operations, lookup, etc. for materials.
void BKE_object_material_from_eval_data(struct Main *bmain, struct Object *ob_orig, const struct ID *data_eval)
void BKE_mesh_nomain_to_mesh(Mesh *mesh_src, Mesh *mesh_dst, Object *ob)
Mesh * BKE_mesh_copy_for_eval(const Mesh &source)
void BKE_mesh_clear_geometry(Mesh *mesh)
Mesh * BKE_mesh_wrapper_from_editmesh(std::shared_ptr< BMEditMesh > em, const CustomData_MeshMasks *cd_mask_extra, const Mesh *me_settings)
void BKE_mesh_wrapper_ensure_mdata(Mesh *mesh)
General operations, lookup, etc. for blender objects.
void BKE_sculptsession_free_pbvh(Object &object)
General operations for point clouds.
PointCloud * BKE_pointcloud_copy_for_eval(const PointCloud *pointcloud_src)
void BKE_pointcloud_nomain_to_pointcloud(PointCloud *pointcloud_src, PointCloud *pointcloud_dst)
void BKE_report(ReportList *reports, eReportType type, const char *message)
bScreen * BKE_workspace_active_screen_get(const WorkSpaceInstanceHook *hook) GETTER_ATTRS
#define BLI_assert_unreachable()
#define LISTBASE_FOREACH(type, var, list)
#define BLI_SCOPED_DEFER(function_to_defer)
BLI_INLINE int BLI_rcti_size_y(const struct rcti *rct)
BLI_INLINE int BLI_rcti_size_x(const struct rcti *rct)
#define STRNCPY(dst, src)
#define SNPRINTF(dst, format,...)
size_t BLI_str_escape(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
void DEG_id_tag_update(ID *id, unsigned int flags)
Depsgraph * DEG_graph_new(Main *bmain, Scene *scene, ViewLayer *view_layer, eEvaluationMode mode)
void DEG_evaluate_on_refresh(Depsgraph *graph, DepsgraphEvaluateSyncWriteback sync_writeback=DEG_EVALUATE_SYNC_WRITEBACK_NO)
void DEG_graph_build_from_ids(Depsgraph *graph, blender::Span< ID * > ids)
bool DEG_id_is_fully_evaluated(const Depsgraph *depsgraph, const ID *id_eval)
eEvaluationMode DEG_get_mode(const Depsgraph *graph)
ViewLayer * DEG_get_input_view_layer(const Depsgraph *graph)
Main * DEG_get_bmain(const Depsgraph *graph)
Scene * DEG_get_input_scene(const Depsgraph *graph)
ID * DEG_get_evaluated_id(const Depsgraph *depsgraph, ID *id)
GeometryNodeAssetTraitFlag
@ GEO_NODE_ASSET_POINT_CLOUD
@ GEO_NODE_ASSET_WAIT_FOR_CURSOR
Object is a sort of wrapper for general info.
void EDBM_mesh_make_from_mesh(Object *ob, Mesh *src_mesh, int select_mode, bool add_key_index)
#define RNA_STRUCT_BEGIN(sptr, prop)
void uiItemL(uiLayout *layout, const char *name, int icon)
uiLayout * uiLayoutRow(uiLayout *layout, bool align)
void uiLayoutSetAlignment(uiLayout *layout, char alignment)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
void uiItemS(uiLayout *layout)
void uiItemFullO_ptr(uiLayout *layout, wmOperatorType *ot, const char *name, int icon, IDProperty *properties, wmOperatorCallContext context, eUI_Item_Flag flag, PointerRNA *r_opptr)
void uiItemPointerR(uiLayout *layout, PointerRNA *ptr, const char *propname, PointerRNA *searchptr, const char *searchpropname, const char *name, int icon)
void uiItemMContents(uiLayout *layout, const char *menuname)
void uiLayoutSetPropDecorate(uiLayout *layout, bool is_sep)
uiLayout * uiLayoutColumn(uiLayout *layout, bool align)
uiLayout * uiLayoutSplit(uiLayout *layout, float percentage, bool align)
void uiLayoutSetContextString(uiLayout *layout, const char *name, blender::StringRef value)
void uiItemM(uiLayout *layout, const char *menuname, const char *name, int icon)
void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, eUI_Item_Flag flag, const char *name, int icon)
@ WM_OP_INVOKE_REGION_WIN
int BM_mesh_active_face_index_get(BMesh *bm, bool is_sloppy, bool is_selected)
int BM_mesh_active_edge_index_get(BMesh *bm)
int BM_mesh_active_vert_index_get(BMesh *bm)
void push(Args &&...args)
const ComputeContextHash & hash() const
bool add(const Key &key, const Value &value)
Value lookup_default(const Key &key, const Value &default_value) const
ValueIterator values() const
bool contains_as(const ForwardKey &key) const
void add_new(const Key &key)
const std::string & str() const
void foreach_child(ItemIterFn callback) const
AssetCatalogPath catalog_path() const
AssetMetaData & get_metadata() const
VectorSet< NodeWarning > all_warnings
void ensure_node_warnings(const bNodeTree *tree)
std::string id_name(void *id)
const Depsgraph * depsgraph
ccl_device_inline float3 log(float3 v)
AssetLibraryReference all_library_reference()
void all_library_reload_catalogs_if_dirty()
std::unique_ptr< IDProperty, IDPropertyDeleter > create_group(StringRefNull prop_name, eIDPropertyFlag flags={})
Allocate a new IDProperty of type IDP_GROUP.
bNodeSocketType * node_socket_type_find(const char *idname)
asset_system::AssetLibrary * library_get_once_available(const AssetLibraryReference &library_reference)
void asset_reading_region_listen_fn(const wmRegionListenerParams *params)
AssetItemTree build_filtered_all_catalog_tree(const AssetLibraryReference &library_ref, const bContext &C, const AssetFilterSettings &filter_settings, FunctionRef< bool(const AssetMetaData &)> meta_data_filter={})
ID * asset_local_id_ensure_imported(Main &bmain, const asset_system::AssetRepresentation &asset)
void operator_asset_reference_props_register(StructRNA &srna)
void draw_menu_for_catalog(const asset_system::AssetCatalogTreeItem &item, const StringRefNull menu_name, uiLayout &layout)
const asset_system::AssetRepresentation * operator_asset_reference_props_get_asset_from_all_library(const bContext &C, PointerRNA &ptr, ReportList *reports)
void operator_asset_reference_props_set(const asset_system::AssetRepresentation &asset, PointerRNA &ptr)
void GEOMETRY_OT_execute_node_group(wmOperatorType *ot)
static void find_socket_log_contexts(const Main &bmain, Set< ComputeContextHash > &r_socket_log_contexts)
static bool asset_menu_poll(const bContext *C, MenuType *)
static void add_attribute_search_or_value_buttons(uiLayout *layout, PointerRNA *md_ptr, const bNodeTreeInterfaceSocket &socket)
static GeometryNodeAssetTraitFlag asset_flag_for_context(const ObjectType type, const eObjectMode mode)
static bool unassigned_local_poll(const bContext &C)
static Vector< Object * > gather_supported_objects(const bContext &C, const Main &bmain, const eObjectMode mode)
MenuType node_group_operator_assets_menu()
MenuType node_group_operator_assets_menu_unassigned()
static int run_node_group_invoke(bContext *C, wmOperator *op, const wmEvent *event)
const GeoOperatorLog & node_group_operator_static_eval_log()
static asset::AssetItemTree * get_static_item_tree(const ObjectType type, const eObjectMode mode)
static void store_result_geometry(const wmOperator &op, Main &bmain, Scene &scene, Object &object, bke::GeometrySet geometry)
static IDProperty * replace_strings_with_id_pointers(const IDProperty &op_properties, const Map< StringRef, ID * > &input_ids)
static int run_node_group_exec(bContext *C, wmOperator *op)
static Map< StringRef, ID * > gather_input_ids(const Main &bmain, const bNodeTree &node_group, const IDProperty &properties)
static void catalog_assets_draw(const bContext *C, Menu *menu)
static void catalog_assets_draw_unassigned(const bContext *C, Menu *menu)
static bke::GeometrySet get_original_geometry_eval_copy(Object &object, nodes::GeoNodesOperatorData &operator_data)
static bool object_has_editable_data(const Main &bmain, const Object &object)
static void store_input_node_values_rna_props(const bContext &C, wmOperator &op, const wmEvent &event)
void clear_operator_asset_trees()
static std::string run_node_group_get_description(bContext *C, wmOperatorType *, PointerRNA *ptr)
static Depsgraph * build_extra_depsgraph(const Depsgraph &depsgraph_active, const Set< ID * > &ids)
static std::string run_node_group_get_name(wmOperatorType *, PointerRNA *ptr)
static asset::AssetItemTree build_catalog_tree(const bContext &C, const Object &active_object)
static bool run_node_group_depends_on_cursor(bContext &C, wmOperatorType &, PointerRNA *ptr)
static void run_node_group_ui(bContext *C, wmOperator *op)
static GeoOperatorLog & get_static_eval_log()
static std::optional< ID_Type > socket_type_to_id_type(const eNodeSocketDatatype socket_type)
static const bNodeTree * get_node_group(const bContext &C, PointerRNA &ptr, ReportList *reports)
void ui_template_node_operator_asset_menu_items(uiLayout &layout, const bContext &C, const StringRef catalog_path)
static void draw_property_for_socket(const bNodeTree &node_tree, uiLayout *layout, IDProperty *op_properties, PointerRNA *bmain_ptr, PointerRNA *op_ptr, const bNodeTreeInterfaceSocket &socket, const int socket_index)
static Set< std::string > get_builtin_menus(const ObjectType object_type, const eObjectMode mode)
static const bNodeTreeInterfaceSocket * find_group_input_by_identifier(const bNodeTree &node_group, const StringRef identifier)
static const bNodeTree * get_asset_or_local_node_group(const bContext &C, PointerRNA &ptr, ReportList *reports)
void ui_template_node_operator_asset_root_items(uiLayout &layout, const bContext &C)
static bool run_node_ui_poll(wmOperatorType *, PointerRNA *ptr)
static void gather_node_group_ids(const bNodeTree &node_tree, Set< ID * > &ids)
static void replace_inputs_evaluated_data_blocks(IDProperty &properties, const nodes::GeoNodesOperatorDepsgraphs &depsgraphs)
void geometry_begin(const Scene &scene, Object &ob, const wmOperator *op)
void geometry_end(Object &ob)
StringRef input_attribute_name_suffix()
StringRef input_use_attribute_suffix()
bool input_has_attribute_toggle(const bNodeTree &node_tree, const int socket_index)
void find_node_tree_dependencies(const bNodeTree &tree, Set< ID * > &r_ids, bool &r_needs_own_transform_relation, bool &r_needs_scene_camera_relation)
bool id_property_type_matches_socket(const bNodeTreeInterfaceSocket &socket, const IDProperty &property, const bool use_name_for_ids)
bke::GeometrySet execute_geometry_nodes_on_geometry(const bNodeTree &btree, const IDProperty *properties, const ComputeContext &base_compute_context, GeoNodesCallData &call_data, bke::GeometrySet input_geometry)
const GeometryNodesLazyFunctionGraphInfo * ensure_geometry_nodes_lazy_function_graph(const bNodeTree &btree)
void update_output_properties_from_node_tree(const bNodeTree &tree, const IDProperty *old_properties, IDProperty &properties)
VecBase< int32_t, 2 > int2
void RNA_int_set_array(PointerRNA *ptr, const char *name, const int *values)
void RNA_int_get_array(PointerRNA *ptr, const char *name, int *values)
void RNA_string_set(PointerRNA *ptr, const char *name, const char *value)
void RNA_boolean_set(PointerRNA *ptr, const char *name, bool value)
void RNA_float_get_array(PointerRNA *ptr, const char *name, float *values)
int RNA_property_flag(PropertyRNA *prop)
char * RNA_string_get_alloc(PointerRNA *ptr, const char *name, char *fixedbuf, int fixedlen, int *r_len)
PointerRNA RNA_main_pointer_create(Main *main)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
void RNA_float_set_array(PointerRNA *ptr, const char *name, const float *values)
PropertyRNA * RNA_def_int_array(StructOrFunctionRNA *cont_, const char *identifier, const int len, const int *default_value, const int hardmin, const int hardmax, const char *ui_name, const char *ui_description, const int softmin, const int softmax)
PropertyRNA * RNA_def_float_array(StructOrFunctionRNA *cont_, const char *identifier, const int len, const float *default_value, const float hardmin, const float hardmax, const char *ui_name, const char *ui_description, const float softmin, const float softmax)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, const bool default_value, const char *ui_name, const char *ui_description)
void RNA_def_property_flag(PropertyRNA *prop, PropertyFlag flag)
struct bNodeTree * edittree
const T * base_ptr() const
static MatBase identity()
static GeometrySet from_curves(Curves *curves, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)
static GeometrySet from_mesh(Mesh *mesh, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)
static GeometrySet from_pointcloud(PointCloud *pointcloud, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)
std::unique_ptr< nodes::geo_eval_log::GeoModifierLog > log
std::string node_group_name
GeoNodesOperatorData * operator_data
const ID * get_evaluated_id(const ID &id_orig) const
std::string(* get_description)(bContext *C, wmOperatorType *ot, PointerRNA *ptr)
bool(* depends_on_cursor)(bContext &C, wmOperatorType &ot, PointerRNA *ptr)
std::string(* get_name)(wmOperatorType *ot, PointerRNA *ptr)
int(* invoke)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
int(* exec)(bContext *C, wmOperator *op) ATTR_WARN_UNUSED_RESULT
bool(* ui_poll)(wmOperatorType *ot, PointerRNA *ptr)
void(* ui)(bContext *C, wmOperator *op)
struct ReportList * reports
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
ID * WM_operator_properties_id_lookup_from_name_or_session_uid(Main *bmain, PointerRNA *ptr, const ID_Type type)
void WM_operator_properties_id_lookup(wmOperatorType *ot, const bool add_name_prop)
void WM_operator_properties_id_lookup_set_from_id(PointerRNA *ptr, const ID *id)
wmOperatorType * WM_operatortype_find(const char *idname, bool quiet)