122 if (
object !=
nullptr) {
123 ids.
add(&object->
id);
128 if (collection !=
nullptr) {
129 ids.
add(&collection->
id);
145 if (group !=
nullptr && handled_groups.
add(group)) {
158 Set<ID *> *ids = (Set<ID *> *)user_data;
159 ID *id = IDP_Id(property);
185 if (
object.
type ==
OB_EMPTY &&
object.instance_collection !=
nullptr) {
205 for (
ID *
id : used_ids) {
225 struct ForeachSettingData {
229 } settings = {walk, userData, ob};
235 ForeachSettingData *settings = (ForeachSettingData *)user_data;
237 settings->userData, settings->ob, (ID **)&id_prop->data.pointer, IDWALK_CB_USER);
244 walk(userData, ob, md,
"texture");
249 bool UNUSED(useRenderParams))
282 const Object *self_object_;
292 const Object *self_object,
296 : group_outputs_(
std::move(group_outputs)),
297 mf_by_node_(mf_by_node),
299 handle_map_(handle_map),
300 self_object_(self_object),
303 log_socket_value_fn_(
std::move(log_socket_value_fn))
305 for (
auto item : group_input_data.
items()) {
306 this->log_socket_value(item.key, item.value);
307 this->forward_to_inputs(item.key, item.value);
314 for (
const DInputSocket &group_output : group_outputs_) {
316 this->log_socket_value(group_output,
result);
334 return {get_unlinked_input_value(socket_to_compute,
type)};
339 return this->get_inputs_from_incoming_links(socket_to_compute, from_sockets);
342 const DSocket from_socket = from_sockets[0];
343 GMutablePointer value = this->get_input_from_incoming_link(socket_to_compute, from_socket);
352 const DSocket from_socket = from_sockets[i];
354 if (first_occurence == -1) {
355 values.
append(this->get_input_from_incoming_link(socket_to_compute, from_socket));
363 type->copy_to_uninitialized(value.
get(), copy_buffer);
375 const std::pair<DInputSocket, DOutputSocket> key = std::make_pair(socket_to_compute,
377 std::optional<GMutablePointer> value = value_by_input_.
pop_try(key);
378 if (value.has_value()) {
384 this->compute_output_and_forward(from_output_socket);
385 return {value_by_input_.
pop(key)};
391 return {get_unlinked_input_value(from_input_socket,
type)};
394 void compute_output_and_forward(
const DOutputSocket socket_to_compute)
403 this->forward_to_inputs(socket_to_compute, {
type,
buffer});
410 if (input_socket->is_available()) {
413 this->log_socket_value(dsocket, values);
414 for (
int i = 0; i < values.
size(); ++i) {
418 input_socket->identifier() + (i > 0 ? (
"[" +
std::to_string(i)) +
"]" :
""));
419 node_inputs_map.add_new_direct(key, std::move(values[i]));
427 node, node_inputs_map, node_outputs_map, handle_map_, self_object_, modifier_, depsgraph_};
432 if (output_socket->is_available()) {
434 GMutablePointer value = node_outputs_map.extract(output_socket->identifier());
435 this->log_socket_value(dsocket, value);
436 this->forward_to_inputs(dsocket, value);
443 if (log_socket_value_fn_) {
444 log_socket_value_fn_(socket, values);
450 this->log_socket_value(socket, values.
cast<
GPointer>());
470 if (multi_function !=
nullptr) {
471 this->execute_multi_function_node(
node,
params, *multi_function);
479 void execute_multi_function_node(
const DNode node,
487 if (socket_ref->is_available()) {
489 fn_params.add_readonly_single_input(
GSpan(*
data.type(),
data.get(), 1));
495 if (socket_ref->is_available()) {
506 int output_index = 0;
507 for (
const int i :
node->outputs().index_range()) {
508 if (
node->output(i).is_available()) {
510 params.set_output_by_move(
node->output(i).identifier(), value);
522 params.set_output_by_copy(socket->
identifier(), {type, type.default_value()});
532 auto handle_target_socket_fn = [&](
DInputSocket to_socket) {
535 auto handle_skipped_socket_fn = [&,
this](
DSocket socket) {
536 this->log_socket_value(socket, value_to_forward);
541 const CPPType &from_type = *value_to_forward.
type();
545 const std::pair<DInputSocket, DOutputSocket> key = std::make_pair(to_socket, from_socket);
546 if (from_type == to_type) {
547 to_sockets_same_type.
append(to_socket);
553 from_type, to_type, value_to_forward.
get(),
buffer);
562 if (to_sockets_same_type.
size() == 0) {
566 else if (to_sockets_same_type.
size() == 1) {
569 const std::pair<DInputSocket, DOutputSocket> key = std::make_pair(to_socket, from_socket);
571 add_value_to_input_socket(key, value_to_forward);
575 const DInputSocket first_to_socket = to_sockets_same_type[0];
578 const std::pair<DInputSocket, DOutputSocket> first_key = std::make_pair(first_to_socket,
580 add_value_to_input_socket(first_key, value_to_forward);
581 for (
const DInputSocket &to_socket : other_to_sockets) {
582 const std::pair<DInputSocket, DOutputSocket> key = std::make_pair(to_socket, from_socket);
590 void add_value_to_input_socket(
const std::pair<DInputSocket, DOutputSocket> key,
593 value_by_input_.
add_new(key, value);
617 if (
type == required_type) {
621 void *converted_buffer = allocator_.
allocate(required_type.
size(),
625 return {required_type, converted_buffer};
629 return {required_type, default_buffer};
662 const char *new_prop_name = socket.
identifier;
698 const char *subtype_identifier =
nullptr;
701 &subtype_identifier);
703 if (subtype_identifier !=
nullptr) {
716 switch (bsocket.
type) {
722 idprop.
f = value->value;
728 idprop.
d = value->min;
734 idprop.
d = value->max;
740 idprop.
d = value->value;
751 *(
float *)r_value =
IDP_Float(&property);
754 *(
float *)r_value = (
float)
IDP_Double(&property);
765 idprop.
i = value->value;
771 idprop.
i = value->min;
777 idprop.
i = value->max;
783 idprop.
i = value->value;
792 void *r_value) { *(
int *)r_value =
IDP_Int(&property); },
810 idprop.
d = value->min;
816 idprop.
d = value->max;
846 idprop.
i = value->value != 0;
862 idprop.
i = value->value != 0;
869 void *r_value) { *(
bool *)r_value =
IDP_Int(&property) != 0; },
871 return &boolean_type;
891 void *r_value) {
new (r_value) std::string(
IDP_String(&property)); },
935 return &collection_type;
970 if (property_type ==
nullptr) {
977 if (old_properties !=
nullptr) {
979 if (old_prop !=
nullptr && property_type->
is_correct_type(*old_prop)) {
985 if (old_properties !=
nullptr) {
1006 group_input_node->
locx = -200 - group_input_node->
width;
1007 group_output_node->
locx = 200;
1026 if (property_type ==
nullptr) {
1036 if (property ==
nullptr) {
1055 int current_handle = 0;
1056 for (
ID *
id : used_ids) {
1057 handle_map.
add(current_handle, *
id);
1078 if (wm ==
nullptr) {
1091 return spreadsheets;
1100 return {
node.context(), socket};
1106 return {
node.context(), socket};
1118 if (context_path.
size() < 3) {
1148 const NodeRef *found_node =
nullptr;
1151 found_node = node_ref;
1155 if (found_node ==
nullptr) {
1166 if (node_ref->name() == last_context->node_name) {
1216 if (
data.type() == &CPPType::get<GeometrySet>()) {
1256 for (
const NodeRef *group_input_node : group_input_nodes) {
1258 if (group_input_sockets.
is_empty()) {
1270 group_inputs.
add_new({root_context, first_input_socket}, geometry_set_in);
1271 remaining_input_sockets = remaining_input_sockets.
drop_front(1);
1279 group_inputs.
add_new({root_context, socket}, {cpp_type, value_in});
1284 input_geometry_set.
clear();
1287 group_outputs.
append({root_context, &socket_to_compute});
1336 if (property ==
nullptr) {
1349 ob, md,
"Property type does not match input socket \"(%s)\"", socket->
name);
1354 bool has_geometry_output =
false;
1357 has_geometry_output =
true;
1361 if (!has_geometry_output) {
1380 if (
tree.has_link_cycles()) {
1384 if (
tree.has_undefined_nodes_or_sockets()) {
1393 if (output_nodes.
size() != 1) {
1399 if (group_outputs.
size() == 0) {
1404 if (group_output->
idname() !=
"NodeSocketGeometry") {
1413 tree, input_nodes, *group_outputs[0], std::move(geometry_set), nmd, ctx);
1430 if (new_mesh ==
nullptr) {
1453 if (property_type ==
nullptr) {
1462 if (property !=
nullptr && property_type->
is_correct_type(*property)) {
1464 char socket_id_esc[
sizeof(socket.
identifier) * 2];
1467 char rna_path[
sizeof(socket_id_esc) + 4];
1473 switch (socket.
type) {
1476 layout, md_ptr, rna_path, bmain_ptr,
"objects", socket.
name, ICON_OBJECT_DATA);
1486 ICON_OUTLINER_COLLECTION);
1490 uiItemR(layout, md_ptr, rna_path, 0, socket.
name, ICON_NONE);
1510 "node.new_geometry_node_group_assign",
1584 "NodesModifierData",
struct Main * CTX_data_main(const bContext *C)
CustomData interface, see also DNA_customdata_types.h.
void IDP_FreeProperty_ex(struct IDProperty *prop, const bool do_id_user)
void IDP_BlendWrite(struct BlendWriter *writer, const struct IDProperty *prop)
void IDP_CopyPropertyContent(struct IDProperty *dst, struct IDProperty *src) ATTR_NONNULL()
#define IDP_BlendDataRead(reader, prop)
struct IDProperty * IDP_NewString(const char *st, const char *name, int maxlen) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(2)
void IDP_foreach_property(struct IDProperty *id_property_root, const int type_filter, IDPForeachPropertyCallback callback, void *user_data)
void IDP_FreeProperty(struct IDProperty *prop)
bool IDP_AddToGroup(struct IDProperty *group, struct IDProperty *prop) ATTR_NONNULL()
struct IDProperty * IDP_GetPropertyFromGroup(const struct IDProperty *prop, const char *name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
struct IDProperty * IDP_New(const char type, const IDPropertyTemplate *val, const char *name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
struct IDProperty * IDP_CopyProperty_ex(const struct IDProperty *prop, const int flag) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
struct Mesh * BKE_mesh_new_nomain(int verts_len, int edges_len, int tessface_len, int loops_len, int polys_len)
void(* IDWalkFunc)(void *userData, struct Object *ob, struct ID **idpoin, int cb_flag)
@ eModifierTypeFlag_SupportsMapping
@ eModifierTypeFlag_EnableInEditmode
@ eModifierTypeFlag_SupportsEditmode
@ eModifierTypeFlag_AcceptsMesh
void(* TexWalkFunc)(void *userData, struct Object *ob, struct ModifierData *md, const char *propname)
void BKE_modifier_copydata_generic(const struct ModifierData *md, struct ModifierData *md_dst, const int flag)
@ eModifierTypeType_Constructive
void BKE_modifier_set_error(const struct Object *ob, struct ModifierData *md, const char *format,...) ATTR_PRINTF_FORMAT(3
#define NODE_CUSTOM_GROUP
void ntreeUpdateTree(struct Main *main, struct bNodeTree *ntree)
struct bNodeLink * nodeAddLink(struct bNodeTree *ntree, struct bNode *fromnode, struct bNodeSocket *fromsock, struct bNode *tonode, struct bNodeSocket *tosock)
void nodeSetSelected(struct bNode *node, bool select)
struct bNodeTree * ntreeAddTree(struct Main *bmain, const char *name, const char *idname)
struct bNodeSocket * ntreeAddSocketInterface(struct bNodeTree *ntree, eNodeSocketInOut in_out, const char *idname, const char *name)
struct bNode * nodeAddStaticNode(const struct bContext *C, struct bNodeTree *ntree, int type)
void BKE_nodetree_ui_storage_free_for_context(bNodeTree &ntree, const NodeTreeEvaluationContext &context)
void BKE_nodetree_attribute_hint_add(bNodeTree &ntree, const NodeTreeEvaluationContext &context, const bNode &node, const blender::StringRef attribute_name, const AttributeDomain domain, const CustomDataType data_type)
General operations, lookup, etc. for blender objects.
void BKE_object_preview_geometry_set_add(struct Object *ob, const uint64_t key, struct GeometrySet *geometry_set)
General operations for point-clouds.
struct bScreen * BKE_workspace_active_screen_get(const struct WorkSpaceInstanceHook *hook) GETTER_ATTRS
#define LISTBASE_FOREACH(type, var, list)
#define LISTBASE_FOREACH_INDEX(type, var, list, index_var)
MINLINE void copy_v3_v3(float r[3], const float a[3])
size_t size_t char size_t BLI_str_escape(char *__restrict dst, const char *__restrict src, const size_t dst_maxncpy) ATTR_NONNULL()
size_t BLI_strnlen(const char *str, const size_t maxlen) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
size_t BLI_snprintf(char *__restrict dst, size_t maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
#define BLO_read_data_address(reader, ptr_p)
struct Depsgraph Depsgraph
bool DEG_is_active(const struct Depsgraph *depsgraph)
void DEG_id_tag_update(struct ID *id, int flag)
void DEG_add_node_tree_relation(struct DepsNodeHandle *node_handle, struct bNodeTree *node_tree, const char *description)
void DEG_add_object_relation(struct DepsNodeHandle *node_handle, struct Object *object, eDepsObjectComponentType component, const char *description)
void DEG_add_modifier_to_transform_relation(struct DepsNodeHandle *node_handle, const char *description)
void DEG_add_collection_geometry_customdata_mask(struct DepsNodeHandle *node_handle, struct Collection *collection, const struct CustomData_MeshMasks *masks)
void DEG_add_customdata_mask(struct DepsNodeHandle *handle, struct Object *object, const struct CustomData_MeshMasks *masks)
void DEG_add_collection_geometry_relation(struct DepsNodeHandle *node_handle, struct Collection *collection, const char *description)
bool DEG_object_has_geometry_component(struct Object *object)
struct Object * DEG_get_original_object(struct Object *object)
struct ID * DEG_get_original_id(struct ID *id)
struct Main * DEG_get_bmain(const Depsgraph *graph)
@ IDP_FLAG_OVERRIDABLE_LIBRARY
Object groups, one object can be in many groups at once.
#define CD_MASK_MDEFORMVERT
#define DNA_struct_default_get(struct_name)
struct NodesModifierData NodesModifierData
Object is a sort of wrapper for general info.
@ SPREADSHEET_CONTEXT_OBJECT
@ SPREADSHEET_CONTEXT_MODIFIER
@ SPREADSHEET_CONTEXT_NODE
uint64_t ED_spreadsheet_context_path_hash(struct SpaceSpreadsheet *sspreadsheet)
static void output_geometry(void *data, struct wl_output *, int32_t, int32_t, int32_t, int32_t, int32_t, const char *make, const char *model, int32_t transform)
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
Read Guarded memory(de)allocation.
static void copyData(const ModifierData *md, ModifierData *target, const int flag)
static Vector< SpaceSpreadsheet * > find_spreadsheet_editors(Main *bmain)
static Mesh * modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
static IDProperty * socket_add_property(IDProperty *settings_prop_group, IDProperty *ui_container, const SocketPropertyType &property_type, const bNodeSocket &socket)
static GeometrySet compute_geometry(const DerivedNodeTree &tree, Span< const NodeRef * > group_input_nodes, const InputSocketRef &socket_to_compute, GeometrySet input_geometry_set, NodesModifierData *nmd, const ModifierEvalContext *ctx)
static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
static void initialize_group_input(NodesModifierData &nmd, const PersistentDataHandleMap &handle_map, const bNodeSocket &socket, const CPPType &cpp_type, void *r_value)
void MOD_nodes_update_interface(Object *object, NodesModifierData *nmd)
static void find_sockets_to_preview(NodesModifierData *nmd, const ModifierEvalContext *ctx, const DerivedNodeTree &tree, PreviewSocketMap &r_sockets_to_preview)
static bool isDisabled(const struct Scene *UNUSED(scene), ModifierData *md, bool UNUSED(useRenderParams))
static void log_ui_hints(const DSocket socket, const Span< GPointer > values, Object *self_object, NodesModifierData *nmd)
void MOD_nodes_init(Main *bmain, NodesModifierData *nmd)
static void blendWrite(BlendWriter *writer, const ModifierData *md)
static void check_property_socket_sync(const Object *ob, ModifierData *md)
static void add_collection_relation(const ModifierUpdateDepsgraphContext *ctx, Collection &collection)
static void blendRead(BlendDataReader *reader, ModifierData *md)
static void fill_data_handle_map(const NodesModifierSettings &settings, const DerivedNodeTree &tree, PersistentDataHandleMap &handle_map)
static void requiredDataMask(Object *UNUSED(ob), ModifierData *UNUSED(md), CustomData_MeshMasks *r_cddata_masks)
static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
static DSocket try_find_preview_socket_in_node(const DNode node)
static void add_object_relation(const ModifierUpdateDepsgraphContext *ctx, Object &object)
static void modifyGeometry(ModifierData *md, const ModifierEvalContext *ctx, GeometrySet &geometry_set)
static void find_used_ids_from_nodes(const bNodeTree &tree, Set< ID * > &ids)
static DSocket try_get_socket_to_preview_for_spreadsheet(SpaceSpreadsheet *sspreadsheet, NodesModifierData *nmd, const ModifierEvalContext *ctx, const DerivedNodeTree &tree)
static void reset_tree_ui_storage(Span< const blender::nodes::NodeTreeRef * > trees, const Object &object, const ModifierData &modifier)
static void modifyGeometrySet(ModifierData *md, const ModifierEvalContext *ctx, GeometrySet *geometry_set)
static bool logging_enabled(const ModifierEvalContext *ctx)
static void initData(ModifierData *md)
static void draw_property_for_socket(uiLayout *layout, PointerRNA *bmain_ptr, PointerRNA *md_ptr, const IDProperty *modifier_props, const bNodeSocket &socket)
static void panelRegister(ARegionType *region_type)
static void foreachTexLink(ModifierData *md, Object *ob, TexWalkFunc walk, void *userData)
static void log_preview_socket_value(const Span< GPointer > values, Object *object, Span< uint64_t > keys)
static void find_used_ids_from_settings(const NodesModifierSettings &settings, Set< ID * > &ids)
ModifierTypeInfo modifierType_Nodes
static void addIdsUsedBySocket(const ListBase *sockets, Set< ID * > &ids)
static const CustomData_MeshMasks dependency_data_mask
static void freeData(ModifierData *md)
static const SocketPropertyType * get_socket_property_type(const bNodeSocket &bsocket)
static void panel_draw(const bContext *C, Panel *panel)
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void modifier_panel_end(uiLayout *layout, PointerRNA *ptr)
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
StructRNA RNA_NodesModifier
void uiTemplateID(uiLayout *layout, const struct bContext *C, struct PointerRNA *ptr, const char *propname, const char *newop, const char *openop, const char *unlinkop, int filter, const bool live_icon, const char *text)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
void uiItemR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int flag, const char *name, int icon)
void uiLayoutSetPropDecorate(uiLayout *layout, bool is_sep)
void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, struct PointerRNA *searchptr, const char *searchpropname, const char *name, int icon)
GeometryNodesEvaluator(const Map< DOutputSocket, GMutablePointer > &group_input_data, Vector< DInputSocket > group_outputs, blender::nodes::MultiFunctionByNode &mf_by_node, const PersistentDataHandleMap &handle_map, const Object *self_object, const ModifierData *modifier, Depsgraph *depsgraph, LogSocketValueFn log_socket_value_fn)
Vector< GMutablePointer > execute()
std::function< void(DSocket, Span< GPointer >)> LogSocketValueFn
StringRefNull copy_string(StringRef str)
void * allocate(const int64_t size, const int64_t alignment)
destruct_ptr< T > construct(Args &&... args)
Value pop(const Key &key)
Value lookup_default(const Key &key, const Value &default_value) const
ValueIterator values() const
void add_new(const Key &key, const Value &value)
ItemIterator items() const
std::optional< Value > pop_try(const Key &key)
Span< Value > lookup(const Key &key) const
void add_non_duplicates(const Key &key, const Value &value)
LinearAllocator & linear_allocator()
constexpr Span drop_front(int64_t n) const
constexpr int64_t first_index_try(const T &search_value) const
constexpr Span drop_back(int64_t n) const
constexpr int64_t size() const
constexpr Span< NewT > cast() const
constexpr IndexRange index_range() const
constexpr Span take_front(int64_t n) const
constexpr bool is_empty() const
void append(const T &value)
Span< T > as_span() const
void append_non_duplicates(const T &value)
PersistentIDHandle lookup(ID *id) const
void add(int32_t handle, ID &id)
int64_t alignment() const
void copy_to_uninitialized(const void *src, void *dst) const
const void * default_value() const
const CPPType * type() const
virtual void call(IndexMask mask, MFParams params, MFContext context) const =0
void foreach_target_socket(FunctionRef< void(DInputSocket)> target_fn, FunctionRef< void(DSocket)> skipped_fn) const
const DTreeContext * context() const
bool is_convertible(const CPPType &from_type, const CPPType &to_type) const
void convert_to_uninitialized(const CPPType &from_type, const CPPType &to_type, const void *from_value, void *to_value) const
Span< const NodeRef * > nodes() const
Span< const NodeRef * > nodes_by_type(StringRefNull idname) const
const NodeRef & node() const
void * default_value() const
bNodeSocketType * typeinfo() const
StringRefNull idname() const
bNodeSocket * bsocket() const
bool is_available() const
StringRefNull identifier() const
const Depsgraph * depsgraph
__kernel void ccl_constant KernelData ccl_global void ccl_global char ccl_global int ccl_global char ccl_global unsigned int ccl_global float * buffer
GeometrySet geometry_set_realize_mesh_for_modifier(const GeometrySet &geometry_set)
void geometry_set_instances_attribute_foreach(const GeometrySet &geometry_set, const AttributeForeachCallback callback, const int limit)
static void area(int d1, int d2, int e1, int e2, float weights[2])
Map< bNodeTree *, std::unique_ptr< const NodeTreeRef > > NodeTreeRefMap
MultiFunctionByNode get_multi_function_per_node(const DerivedNodeTree &tree, ResourceScope &scope)
const DataTypeConversions & get_implicit_type_conversions()
const CPPType * socket_cpp_type_get(const bNodeSocketType &stype)
bool socket_cpp_value_get(const bNodeSocket &socket, void *r_value)
std::string to_string(const T &n)
bNodeTreeType * ntreeType_Geometry
bool RNA_enum_identifier(const EnumPropertyItem *item, const int value, const char **r_identifier)
void RNA_main_pointer_create(struct Main *main, PointerRNA *r_ptr)
const EnumPropertyItem rna_enum_property_subtype_items[]
struct SELECTID_Context context
static int node_context(const bContext *C, const char *member, bContextDataResult *result)
unsigned __int64 uint64_t
GeometryComponent & get_component_for_write(GeometryComponentType component_type)
void ensure_owns_direct_data()
static GeometrySet create_with_mesh(Mesh *mesh, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)
struct Depsgraph * depsgraph
struct DepsNodeHandle * node
struct bNodeTree * node_group
struct NodesModifierSettings settings
struct IDProperty * properties
IDProperty *(* create_prop)(const bNodeSocket &socket, const char *name)
PropertyType(* rna_subtype_get)(const bNodeSocket &socket)
IDProperty *(* create_default_ui_prop)(const bNodeSocket &socket, const char *name)
IDProperty *(* create_min_ui_prop)(const bNodeSocket &socket, const char *name)
IDProperty *(* create_max_ui_prop)(const bNodeSocket &socket, const char *name)
void(* init_cpp_value)(const IDProperty &property, const PersistentDataHandleMap &handles, void *r_value)
bool(* is_correct_type)(const IDProperty &property)
struct bNodeSocketType * typeinfo
NodeGeometryExecFunction geometry_node_execute
struct bNodeType * typeinfo
struct IDPropertyTemplate::@28 array
struct IDPropertyTemplate::@27 string