85#include <fmt/format.h>
170 compute_context_cache);
172 r_socket_log_contexts.
add(
hash);
182 if (layer_index == -1) {
185 return mesh.vert_data.layers[layer_index].sharing_info;
199 if (
mesh.runtime->face_offsets_sharing_info) {
235 switch (
object.type) {
246 const Mesh *
mesh =
static_cast<const Mesh *
>(
object.data);
247 if (std::shared_ptr<BMEditMesh> &em =
mesh->runtime->edit_mesh) {
291 switch (
object.type) {
296 curves.geometry.wrap() = {};
301 new_curves->
geometry.wrap().attributes_for_write().remove_anonymous();
319 new_points->attributes_for_write().remove_anonymous();
329 const bool has_shape_keys =
mesh.key !=
nullptr;
334 new_mesh->attributes_for_write().remove_anonymous();
355 if (has_shape_keys && !
mesh.key) {
365 for (
const int layer_i : grease_pencil.layers().index_range()) {
367 if (!layer.is_editable()) {
370 editable_layer_indices.
append(layer_i);
373 bool inserted_new_keyframe =
false;
374 for (
const int layer_i : editable_layer_indices) {
378 const bool duplicate_previous_key =
false;
380 scene, grease_pencil, layer, duplicate_previous_key, inserted_new_keyframe);
384 if (!new_grease_pencil) {
386 for (
const int layer_i : editable_layer_indices) {
391 drawing_orig->strokes_for_write() = {};
392 drawing_orig->tag_topology_changed();
401 *new_grease_pencil, eval_frame, editable_layers, grease_pencil);
409 if (inserted_new_keyframe) {
423 const int orig_size = ids.
size();
425 for (
ID *
id : node_tree.
runtime->geometry_nodes_eval_dependencies->ids.values()) {
428 if (ids.
size() != orig_size) {
431 ids.
add(
const_cast<ID *
>(&node_tree.
id));
439 if (
input->identifier == identifier) {
448 switch (socket_type) {
496 input->socket_typeinfo()->type);
567 if (
object->mode != mode) {
570 if (!unique_object_data.
add(
static_cast<const ID *
>(
object->data))) {
581 handle_object(
object);
590 if (v3d && active_object) {
605 if (!active_object) {
611 if (!node_tree_orig) {
640 if (depsgraphs.
extra) {
644 node_tree = node_tree_orig;
649 if (lf_graph_info ==
nullptr) {
654 if (!node_tree->group_output_node()) {
658 if (node_tree->interface_outputs().is_empty() ||
659 !
STREQ(node_tree->interface_outputs()[0]->socket_type,
"NodeSocketGeometry"))
668 eval_log.
log = std::make_unique<geo_log::GeoNodesLog>();
676 for (
Object *
object : objects) {
678 operator_eval_data.
mode = mode;
691 "viewport_is_perspective");
696 if (
object == active_object) {
702 *depsgraph_active, *
object, operator_eval_data, orig_mesh_states);
709 std::move(geometry_orig));
712 *
C, *op, *depsgraph_active, *bmain, *scene, *
object, rv3d, std::move(new_geometry));
765 "viewport_projection_matrix",
768 "viewport_view_matrix",
782 nodes ::update_input_properties_from_node_tree(
798 if (!
asset->get_metadata().description) {
801 return asset->get_metadata().description;
821 *
C, *op,
const_cast<bNodeTree &
>(*node_tree), &tree_log);
844 return std::string(local_name,
len);
847 ptr,
"relative_asset_identifier",
nullptr, 0, &
len);
850 return ref.drop_prefix(ref.find_last_of(
SEP_STR) + 1);
862 return group->geometry_node_asset_traits &&
872 &
asset->get_metadata(),
"geometry_node_asset_traits_flag");
882 ot->name =
"Run Node Group";
883 ot->idname = __func__;
884 ot->description =
"Execute a node group on geometry";
908 "Mouse coordinates in region space",
913 ot->srna,
"region_size", 2,
nullptr, 0, INT_MAX,
"Region Size",
"", 0, INT_MAX);
921 "3D Cursor Position",
932 "3D Cursor Rotation",
938 "viewport_projection_matrix",
943 "Viewport Projection Transform",
949 "viewport_view_matrix",
954 "Viewport View Transform",
960 ot->srna,
"viewport_is_perspective",
false,
"Viewport Is Perspective",
"");
1149 auto meta_data_filter = [&](
const AssetMetaData &meta_data) {
1155 &meta_data,
"geometry_node_asset_traits_flag");
1156 if (traits_flag ==
nullptr || (
IDP_Int(traits_flag) &
flag) !=
flag) {
1174 switch (object_type) {
1192 menus.
add_new(
"Object/Apply");
1193 menus.
add_new(
"Object/Convert");
1194 menus.
add_new(
"Object/Quick Effects");
1201 menus.
add_new(
"Mesh/Extrude");
1202 menus.
add_new(
"Mesh/Clean Up");
1205 menus.
add_new(
"Mesh/Normals");
1206 menus.
add_new(
"Mesh/Shading");
1208 menus.
add_new(
"Mesh/Weights");
1212 menus.
add_new(
"Face/Face Data");
1241 menus.
add_new(
"Object/Apply");
1242 menus.
add_new(
"Object/Convert");
1243 menus.
add_new(
"Object/Quick Effects");
1248 menus.
add_new(
"Grease Pencil");
1272 if (!active_object) {
1290 bool add_separator =
true;
1294 if (add_separator) {
1296 add_separator =
false;
1316 if (add_separator) {
1318 add_separator =
false;
1327 STRNCPY(type.
idname,
"GEO_MT_node_operator_catalog_assets");
1339 if (!active_object) {
1345 if (group->id.library_weak_reference || group->id.asset_data) {
1348 if (!group->geometry_node_asset_traits ||
1349 (group->geometry_node_asset_traits->flag &
flag) !=
flag)
1361 if (!active_object) {
1379 bool add_separator = !
tree->unassigned_assets.is_empty();
1383 if (group->id.library_weak_reference || group->id.asset_data) {
1386 if (!group->geometry_node_asset_traits ||
1387 (group->geometry_node_asset_traits->flag &
flag) !=
flag)
1392 if (add_separator) {
1394 add_separator =
false;
1419 "Tool node group assets not assigned to a catalog.\n"
1420 "Catalogs can be assigned in the Asset Browser");
1429 if (!active_object) {
1453 if (!active_object) {
1474 layout.
menu(
"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 CustomData_get_layer_index(const CustomData *data, eCustomDataType type)
void BKE_editmesh_looptris_and_normals_calc(BMEditMesh *em)
Low-level operations for grease pencil.
GreasePencil * BKE_grease_pencil_copy_for_eval(const GreasePencil *grease_pencil_src)
void IDP_foreach_property(IDProperty *id_property_root, int type_filter, blender::FunctionRef< void(IDProperty *id_property)> callback)
bool IDP_AddToGroup(IDProperty *group, IDProperty *prop) ATTR_NONNULL()
IDProperty * IDP_CopyProperty(const IDProperty *prop) 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(Main *bmain, Object *ob_orig, const ID *data_eval)
Mesh * BKE_mesh_new_nomain(int verts_num, int edges_num, int faces_num, int corners_num)
void BKE_mesh_nomain_to_mesh(Mesh *mesh_src, Mesh *mesh_dst, Object *ob)
Mesh * BKE_mesh_copy_for_eval(const Mesh &source)
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.
A BVH for high poly meshes.
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)
char * STRNCPY(char(&dst)[N], const char *src)
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)
float DEG_get_ctime(const Depsgraph *graph)
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)
T * DEG_get_evaluated(const Depsgraph *depsgraph, T *id)
GeometryNodeAssetTraitFlag
@ GEO_NODE_ASSET_WAIT_FOR_CURSOR
@ GEO_NODE_ASSET_GREASE_PENCIL
@ GEO_NODE_ASSET_POINTCLOUD
@ OB_MODE_PAINT_GREASE_PENCIL
@ OB_MODE_SCULPT_GREASE_PENCIL
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 uiLayoutSetContextString(uiLayout *layout, blender::StringRef name, blender::StringRef value)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
void uiLayoutSetPropDecorate(uiLayout *layout, bool is_sep)
void uiItemMContents(uiLayout *layout, blender::StringRef menuname)
@ WM_OP_INVOKE_REGION_WIN
BMesh const char void * data
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)
BPy_StructRNA * depsgraph
const ComputeContextHash & hash() const
static IndexMask from_indices(Span< T > indices, IndexMaskMemory &memory)
ValueIterator values() const &
bool add(const Key &key, const Value &value)
Value lookup_default(const Key &key, const Value &default_value) const
bool contains_as(const ForwardKey &key) const
void add_new(const Key &key)
void append(const T &value)
Span< T > as_span() const
void append_as(ForwardValue &&...value)
const std::string & str() const
void foreach_child(ItemIterFn callback) const
AssetCatalogPath catalog_path() const
GAttributeReader get() const
void freeze_shared_state(const ImplicitSharingInfo &sharing_info)
MeshState(const Mesh &mesh)
static Map< const bke::bNodeTreeZone *, ComputeContextHash > get_context_hash_by_zone_for_node_editor(const SpaceNode &snode, bke::ComputeContextCache &compute_context_cache)
void ensure_node_warnings(const NodesModifierData &nmd)
VectorSet< NodeWarning > all_warnings
std::string id_name(void *id)
#define ID_TYPE_USE_COPY_ON_EVAL(_id_type)
AssetLibraryReference all_library_reference()
void all_library_reload_catalogs_if_dirty()
void ensure_non_empty_layer_names(Main &bmain, GreasePencil &grease_pencil)
std::unique_ptr< IDProperty, IDPropertyDeleter > create(StringRef prop_name, int32_t value, eIDPropertyFlag flags={})
Allocate a new IDProperty of type IDP_INT, set its name and value.
std::unique_ptr< IDProperty, IDPropertyDeleter > create_group(StringRef prop_name, eIDPropertyFlag flags={})
Allocate a new IDProperty of type IDP_GROUP.
pbvh::Tree * pbvh_get(Object &object)
void update_normals(const Depsgraph &depsgraph, Object &object_orig, Tree &pbvh)
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 wmOperatorStatus run_node_group_exec(bContext *C, wmOperator *op)
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)
static const ImplicitSharingInfo * get_vertex_group_sharing_info(const Mesh &mesh)
MenuType node_group_operator_assets_menu()
MenuType node_group_operator_assets_menu_unassigned()
static bke::GeometrySet get_original_geometry_eval_copy(Depsgraph &depsgraph, Object &object, nodes::GeoNodesOperatorData &operator_data, Vector< MeshState > &orig_mesh_states)
const GeoOperatorLog & node_group_operator_static_eval_log()
static asset::AssetItemTree * get_static_item_tree(const ObjectType type, const eObjectMode mode)
static IDProperty * replace_strings_with_id_pointers(const IDProperty &op_properties, const Map< StringRef, ID * > &input_ids)
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 bool object_has_editable_data(const Main &bmain, const Object &object)
static void store_result_geometry(const bContext &C, const wmOperator &op, const Depsgraph &depsgraph, Main &bmain, Scene &scene, Object &object, const RegionView3D *rv3d, bke::GeometrySet geometry)
static wmOperatorStatus run_node_group_invoke(bContext *C, wmOperator *op, const wmEvent *event)
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 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)
bool ensure_active_keyframe(const Scene &scene, GreasePencil &grease_pencil, bke::greasepencil::Layer &layer, const bool duplicate_previous_key, bool &r_inserted_keyframe)
void apply_eval_grease_pencil_data(const GreasePencil &eval_grease_pencil, const int eval_frame, const IndexMask &orig_layers, GreasePencil &orig_grease_pencil)
void store_mesh_from_eval(const wmOperator &op, const Scene &scene, const Depsgraph &depsgraph, const RegionView3D *rv3d, Object &object, Mesh *new_mesh)
QuaternionBase< float > Quaternion
bke::GeometrySet execute_geometry_nodes_on_geometry(const bNodeTree &btree, const PropertiesVectorSet &properties_set, const ComputeContext &base_compute_context, GeoNodesCallData &call_data, bke::GeometrySet input_geometry)
PropertiesVectorSet build_properties_vector_set(const IDProperty *properties)
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)
void draw_geometry_nodes_operator_redo_ui(const bContext &C, wmOperator &op, bNodeTree &tree, geo_eval_log::GeoTreeLog *tree_log)
MatBase< float, 4, 4 > float4x4
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)
GreasePencilRuntimeHandle * runtime
MeshRuntimeHandle * runtime
struct ToolSettings * toolsettings
struct bNodeTree * edittree
bNodeTreeRuntimeHandle * runtime
const T * base_ptr() const
static MatBase identity()
const ImplicitSharingInfo * sharing_info
static GeometrySet from_grease_pencil(GreasePencil *grease_pencil, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)
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::GeoNodesLog > log
std::string node_group_name
const Set< ComputeContextHash > * socket_log_contexts
GeoNodesOperatorData * operator_data
geo_eval_log::GeoNodesLog * eval_log
math::Quaternion cursor_rotation
float4x4 viewport_viewmat
const GeoNodesOperatorDepsgraphs * depsgraphs
const Object * self_object_orig
bool viewport_is_perspective
const ID * get_evaluated_id(const ID &id_orig) const
PointerRNA op(wmOperatorType *ot, std::optional< blender::StringRef > name, int icon, wmOperatorCallContext context, eUI_Item_Flag flag)
void label(blender::StringRef name, int icon)
uiLayout & column(bool align)
void separator(float factor=1.0f, LayoutSeparatorType type=LayoutSeparatorType::Auto)
void menu(MenuType *mt, std::optional< blender::StringRef > name, int icon)
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)