87#include <fmt/format.h>
172 compute_context_cache);
174 r_socket_log_contexts.
add(
hash);
184 if (layer_index == -1) {
187 return mesh.vert_data.layers[layer_index].sharing_info;
201 if (
mesh.runtime->face_offsets_sharing_info) {
228 return fmt::format(
".kb:{}", kb.
name);
259 kb->totelem = attr.
size();
266 kb->totelem = positions.
size();
290 switch (
object.type) {
303 if (std::shared_ptr<BMEditMesh> &em =
mesh->runtime->edit_mesh) {
354 switch (
object.type) {
359 curves.geometry.wrap() = {};
364 new_curves->
geometry.wrap().attributes_for_write().remove_anonymous();
382 new_points->attributes_for_write().remove_anonymous();
395 new_mesh->attributes_for_write().remove_anonymous();
441 for (
const int layer_i : grease_pencil.layers().index_range()) {
443 if (!layer.is_editable()) {
446 editable_layer_indices.
append(layer_i);
449 bool inserted_new_keyframe =
false;
450 for (
const int layer_i : editable_layer_indices) {
454 const bool duplicate_previous_key =
false;
456 scene, grease_pencil, layer, duplicate_previous_key, inserted_new_keyframe);
460 if (!new_grease_pencil) {
462 for (
const int layer_i : editable_layer_indices) {
467 drawing_orig->strokes_for_write() = {};
468 drawing_orig->tag_topology_changed();
477 *new_grease_pencil, eval_frame, editable_layers, grease_pencil);
485 if (inserted_new_keyframe) {
499 const int orig_size = ids.
size();
501 for (
ID *
id : node_tree.
runtime->geometry_nodes_eval_dependencies->ids.values()) {
504 if (ids.
size() != orig_size) {
507 ids.
add(
const_cast<ID *
>(&node_tree.
id));
515 if (
input->identifier == identifier) {
524 switch (socket_type) {
572 input->socket_typeinfo()->type);
643 if (
object->mode != mode) {
646 if (!unique_object_data.
add(
static_cast<const ID *
>(
object->data))) {
657 handle_object(
object);
666 if (v3d && active_object) {
681 if (!active_object) {
687 if (!node_tree_orig) {
716 if (depsgraphs.
extra) {
720 node_tree = node_tree_orig;
725 if (lf_graph_info ==
nullptr) {
730 if (!node_tree->group_output_node()) {
734 if (node_tree->interface_outputs().is_empty() ||
735 !
STREQ(node_tree->interface_outputs()[0]->socket_type,
"NodeSocketGeometry"))
744 eval_log.
log = std::make_unique<geo_log::GeoNodesLog>();
752 for (
Object *
object : objects) {
754 operator_eval_data.
mode = mode;
767 "viewport_is_perspective");
772 if (
object == active_object) {
778 *depsgraph_active, *
object, operator_eval_data, orig_mesh_states);
781 *node_tree, properties, compute_context, call_data, std::move(geometry_orig));
784 *
C, *op, *depsgraph_active, *bmain, *scene, *
object, rv3d, std::move(new_geometry));
837 "viewport_projection_matrix",
840 "viewport_view_matrix",
854 nodes ::update_input_properties_from_node_tree(
870 if (!
asset->get_metadata().description) {
873 return asset->get_metadata().description;
893 &eval_log.
log->get_tree_log(compute_context.
hash()) :
896 *
C, *op,
const_cast<bNodeTree &
>(*node_tree), tree_log);
916 if (!local_name.empty()) {
919 std::string library_asset_identifier =
RNA_string_get(
ptr,
"relative_asset_identifier");
933 return group->geometry_node_asset_traits &&
943 &
asset->get_metadata(),
"geometry_node_asset_traits_flag");
953 ot->name =
"Run Node Group";
954 ot->idname = __func__;
955 ot->description =
"Execute a node group on geometry";
979 "Mouse coordinates in region space",
984 ot->srna,
"region_size", 2,
nullptr, 0, INT_MAX,
"Region Size",
"", 0, INT_MAX);
992 "3D Cursor Position",
1003 "3D Cursor Rotation",
1009 "viewport_projection_matrix",
1014 "Viewport Projection Transform",
1020 "viewport_view_matrix",
1025 "Viewport View Transform",
1031 ot->srna,
"viewport_is_perspective",
false,
"Viewport Is Perspective",
"");
1220 auto meta_data_filter = [&](
const AssetMetaData &meta_data) {
1226 &meta_data,
"geometry_node_asset_traits_flag");
1245 switch (object_type) {
1263 menus.
add_new(
"Object/Apply");
1264 menus.
add_new(
"Object/Convert");
1265 menus.
add_new(
"Object/Quick Effects");
1272 menus.
add_new(
"Mesh/Extrude");
1273 menus.
add_new(
"Mesh/Clean Up");
1276 menus.
add_new(
"Mesh/Normals");
1277 menus.
add_new(
"Mesh/Shading");
1279 menus.
add_new(
"Mesh/Weights");
1283 menus.
add_new(
"Face/Face Data");
1312 menus.
add_new(
"Object/Apply");
1313 menus.
add_new(
"Object/Convert");
1314 menus.
add_new(
"Object/Quick Effects");
1319 menus.
add_new(
"Grease Pencil");
1343 if (!active_object) {
1361 bool add_separator =
true;
1365 if (add_separator) {
1367 add_separator =
false;
1390 if (add_separator) {
1392 add_separator =
false;
1413 if (!active_object) {
1419 if (group->id.library_weak_reference || group->id.asset_data) {
1422 if (!group->geometry_node_asset_traits ||
1423 (group->geometry_node_asset_traits->flag &
flag) !=
flag)
1435 if (!active_object) {
1456 bool add_separator = !
tree->unassigned_assets.is_empty();
1460 if (group->id.library_weak_reference || group->id.asset_data) {
1463 if (!group->geometry_node_asset_traits ||
1464 (group->geometry_node_asset_traits->flag &
flag) !=
flag)
1469 if (add_separator) {
1471 add_separator =
false;
1496 "Tool node group assets not assigned to a catalog.\n"
1497 "Catalogs can be assigned in the Asset Browser");
1506 if (!active_object) {
1524 col->menu_contents(
"GEO_MT_node_operator_catalog_assets");
1530 if (!active_object) {
1551 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.
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)
#define IDP_int_get(prop)
#define IDP_string_get(prop)
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, bool process_shape_keys=true)
Mesh * BKE_mesh_copy_for_eval(const Mesh &source)
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)
#define STRNCPY_UTF8(dst, 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)
#define ID_TYPE_USE_COPY_ON_EVAL(_id_type)
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_load_ex(Main *bmain, Object *ob, bool free_data)
void EDBM_mesh_free_data(BMEditMesh *em)
void EDBM_mesh_make_from_mesh(Object *ob, Mesh *src_mesh, int select_mode, bool add_key_index)
#define RNA_STRUCT_BEGIN(sptr, prop)
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)
constexpr int64_t size() const
constexpr int64_t find_last_of(StringRef chars, int64_t pos=INT64_MAX) const
constexpr StringRef drop_prefix(int64_t n) const
void materialize(MutableSpan< T > r_span) const
static VArray from_span(Span< T > values)
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 lookup(const StringRef attribute_id) const
GAttributeReader get() const
bool add(const StringRef attribute_id, const AttrDomain domain, const AttrType data_type, const AttributeInit &initializer)
bool remove(const StringRef attribute_id)
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
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
void copy(const GVArray &src, GMutableSpan dst, int64_t grain_size=4096)
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={})
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)
ID * asset_local_id_ensure_imported(Main &bmain, const asset_system::AssetRepresentation &asset, const std::optional< eAssetImportMethod > import_method=std::nullopt)
static void remove_shape_key_attributes(Mesh &mesh, const Key &key)
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 std::string shape_key_attribute_name(const KeyBlock &kb)
static Vector< Object * > gather_supported_objects(const bContext &C, const Main &bmain, const eObjectMode mode)
static void add_shape_keys_as_attributes(Mesh &mesh, const Key &key)
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 void store_attributes_to_shape_keys(const Mesh &mesh, Key &key)
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 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)
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
VecBase< float, 3 > float3
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)
std::string RNA_string_get(PointerRNA *ptr, const char *name)
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 AttributeStorage attribute_storage
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
void use_property_decorate_set(bool is_sep)
void label(blender::StringRef name, int icon)
uiLayout & column(bool align)
void separator(float factor=1.0f, LayoutSeparatorType type=LayoutSeparatorType::Auto)
PointerRNA op(wmOperatorType *ot, std::optional< blender::StringRef > name, int icon, blender::wm::OpCallContext context, eUI_Item_Flag flag)
void menu(MenuType *mt, std::optional< blender::StringRef > name, int icon)
void use_property_split_set(bool value)
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)