9#define DNA_DEPRECATED_ALLOW
52 const char *allocname,
53 int link_after_region_type)
55 ARegion *link_after_region =
nullptr;
57 if (region->regiontype == region_type) {
60 if (region->regiontype == link_after_region_type) {
61 link_after_region = region;
73 const char *allocname,
74 int link_after_region_type)
76 ARegion *link_after_region =
nullptr;
78 if (region->regiontype == region_type) {
81 if (region->regiontype == link_after_region_type) {
82 link_after_region = region;
86 ARegion *new_region = MEM_cnew<ARegion>(allocname);
102 if (
STREQ(idtest->name + 2, name_src)) {
105 if (
STREQ(idtest->name + 2, name_dst)) {
119 if (
STREQ(socket->name, old_name)) {
120 STRNCPY(socket->name, new_name);
122 if (
STREQ(socket->identifier, old_name)) {
123 STRNCPY(socket->identifier, new_name);
138 if (!
id.startswith(name)) {
156 const char *old_name,
157 const char *new_name)
159 for (
bNode *node : ntree->all_nodes()) {
160 if (node->type == node_type) {
169 const char *old_name,
170 const char *new_name)
172 for (
bNode *node : ntree->all_nodes()) {
173 if (node->type == node_type) {
181 const char *old_name,
182 const char *new_name)
184 for (
bNode *node : ntree->all_nodes()) {
185 if (node->type == node_type) {
195 bNode *node = MEM_cnew<bNode>(__func__);
196 node->runtime = MEM_new<blender::bke::bNodeRuntime>(__func__);
205 node->width = ntype->
width;
206 node->height = ntype->
height;
207 node->color[0] = node->color[1] = node->color[2] = 0.608;
209 node->type = ntype->
type;
219 const char *identifier)
223 bNodeSocket *socket = MEM_cnew<bNodeSocket>(__func__);
224 socket->
runtime = MEM_new<blender::bke::bNodeSocketRuntime>(__func__);
254 bNode &node_from = node_a;
256 bNode &node_to = node_b;
259 bNodeLink *link = MEM_cnew<bNodeLink>(__func__);
263 link->
tosock = &socket_to;
276 const char *identifier,
280 if (sock !=
nullptr) {
289 for (
bNode *node : ntree->all_nodes()) {
290 if (node->type == node_type) {
291 if (!
STREQ(node->idname, new_name)) {
292 STRNCPY(node->idname, new_name);
299 const int node_tree_type,
301 const int socket_index_orig,
302 const int socket_index_offset,
303 const int total_number_of_sockets)
309 for (
int input_index = total_number_of_sockets - 1; input_index >= socket_index_orig;
313 if (ntree->type != node_tree_type) {
317 for (
bNode *node : ntree->all_nodes()) {
318 if (node->type != node_type) {
322 const size_t node_name_length = strlen(node->name);
323 const size_t node_name_escaped_max_length = (node_name_length * 2);
324 char *node_name_escaped = (
char *)
MEM_mallocN(node_name_escaped_max_length + 1,
326 BLI_str_escape(node_name_escaped, node->name, node_name_escaped_max_length);
327 char *rna_path_prefix =
BLI_sprintfN(
"nodes[\"%s\"].inputs", node_name_escaped);
329 const int new_index = input_index + socket_index_offset;
331 bmain, owner_id, rna_path_prefix,
nullptr,
nullptr, input_index, new_index,
false);
342 for (
bNode *node : ntree->all_nodes()) {
344 socket->flag &= ~SOCK_IS_LINKED;
347 socket->flag &= ~SOCK_IS_LINKED;
369 if (link->tonode == &old_node) {
371 if (old_socket->is_available()) {
372 if (
const std::string *new_identifier = map.lookup_ptr_as(old_socket->
identifier)) {
374 &new_node,
SOCK_IN, *new_identifier);
375 link->tonode = &new_node;
376 link->tosock = new_socket;
377 old_socket->
link =
nullptr;
381 if (link->fromnode == &old_node) {
383 if (old_socket->is_available()) {
384 if (
const std::string *new_identifier = map.lookup_ptr_as(old_socket->
identifier)) {
386 &new_node,
SOCK_OUT, *new_identifier);
387 link->fromnode = &new_node;
388 link->fromsock = new_socket;
389 old_socket->
link =
nullptr;
400 if (link->tosock == in_socket) {
415 if (link->fromnode->type == GEO_NODE_REALIZE_INSTANCES) {
420 nullptr, ntree, GEO_NODE_REALIZE_INSTANCES);
422 realize_node->
locx = node->locx - 100;
423 realize_node->
locy = node->locy;
429 link->fromnode = realize_node;
437 return &socket_data->
value;
443 return socket_data->
value;
450 return socket_data->
value;
474 return (prop) ?
IDP_Float(prop) : default_value;
480 return (prop) ?
IDP_Int(prop) : default_value;
512 const char *socket_identifier,
516 bool need_update =
false;
521 bNode *fromnode = link->fromnode;
523 bNode *tonode = link->tonode;
526 if (!(tonode !=
nullptr && check_node(tonode) &&
STREQ(tosock->
identifier, socket_identifier)))
533 update_input_link(fromnode, fromsock, tonode, tosock);
541 if (check_node(node)) {
543 if (input !=
nullptr) {
544 update_input(node, input);
556 bNode *output_node =
nullptr;
560 if (node->type != node_type) {
564 if (output_node ==
nullptr) {
574 if (output_node ==
nullptr) {
587 const short versionfile,
588 const short subversionfile)
void BKE_animdata_fix_paths_rename_all_ex(struct Main *bmain, struct ID *ref_id, const char *prefix, const char *oldName, const char *newName, int oldSubscript, int newSubscript, bool verify_paths)
IDProperty * IDP_GetPropertyTypeFromGroup(const IDProperty *prop, const char *name, char type) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
bool IDP_AddToGroup(IDProperty *group, IDProperty *prop) ATTR_NONNULL()
IDProperty * IDP_GetProperties(ID *id) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void do_versions_ipos_to_animato(struct Main *bmain)
IDNewNameResult BKE_libblock_rename(Main &bmain, ID &id, blender::StringRefNull name, const IDNewNameMode mode=IDNewNameMode::RenameExistingNever)
void BKE_lib_override_library_main_hierarchy_root_ensure(Main *bmain)
void BKE_lib_override_library_main_proxy_convert(Main *bmain, BlendFileReadReport *reports)
ListBase * which_libbase(Main *bmain, short type)
#define MAIN_VERSION_FILE_ATLEAST(main, ver, subver)
#define LIBRARY_VERSION_FILE_ATLEAST(lib, ver, subver)
bool BKE_main_namemap_validate_and_fix(Main *bmain) ATTR_NONNULL()
void BKE_main_mesh_legacy_convert_auto_smooth(Main &bmain)
#define FOREACH_NODETREE_END
#define FOREACH_NODETREE_BEGIN(bmain, _nodetree, _id)
void BKE_ntree_update_tag_node_new(bNodeTree *ntree, bNode *node)
void BKE_ntree_update_tag_socket_new(bNodeTree *ntree, bNodeSocket *socket)
void BKE_ntree_update_tag_link_added(bNodeTree *ntree, bNodeLink *link)
#define LISTBASE_FOREACH(type, var, list)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
void BLI_insertlinkafter(struct ListBase *listbase, void *vprevlink, void *vnewlink) ATTR_NONNULL(1)
#define LISTBASE_FOREACH_BACKWARD_MUTABLE(type, var, list)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
char * BLI_sprintfN(const char *__restrict format,...) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC ATTR_PRINTF_FORMAT(1
#define STRNCPY(dst, src)
size_t BLI_str_escape(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
#define STRNCPY_UTF8(dst, src)
external readfile function prototypes.
#define ID_IS_LINKED(_id)
Read Guarded memory(de)allocation.
constexpr bool is_empty() const
constexpr bool startswith(StringRef prefix) const
constexpr StringRef drop_known_prefix(StringRef prefix) const
void append(const T &value)
void *(* MEM_mallocN)(size_t len, const char *str)
void MEM_freeN(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void legacy_main(Main &bmain, BlendfileLinkAppendContext *lapp_context, BlendFileReadReport &reports)
std::unique_ptr< IDProperty, IDPropertyDeleter > create(StringRefNull prop_name, int32_t value, eIDPropertyFlag flags={})
Allocate a new IDProperty of type IDP_INT, set its name and value.
bNode * node_add_static_node(const bContext *C, bNodeTree *ntree, int type)
bNodeLink * node_add_link(bNodeTree *ntree, bNode *fromnode, bNodeSocket *fromsock, bNode *tonode, bNodeSocket *tosock)
bNodeSocket * node_add_static_socket(bNodeTree *ntree, bNode *node, eNodeSocketInOut in_out, int type, int subtype, const char *identifier, const char *name)
bNodeType * node_type_find(const char *idname)
bNodeSocketType * node_socket_type_find(const char *idname)
void node_remove_link(bNodeTree *ntree, bNodeLink *link)
void node_unique_id(bNodeTree *ntree, bNode *node)
bNodeSocket * node_find_socket(bNode *node, eNodeSocketInOut in_out, StringRef identifier)
void node_unique_name(bNodeTree *ntree, bNode *node)
void node_socket_init_default_value_data(eNodeSocketDatatype datatype, int subtype, void **data)
void SEQ_doversion_250_sound_proxy_update(Main *bmain, Editing *ed)
struct IDProperty * id_properties
bNodeSocketRuntimeHandle * runtime
void add_realize_instances_before_socket(bNodeTree *ntree, bNode *node, bNodeSocket *geometry_socket)
ID * do_versions_rename_id(Main *bmain, const short id_type, const char *name_src, const char *name_dst)
bNode * version_eevee_output_node_get(bNodeTree *ntree, int16_t node_type)
ARegion * do_versions_add_region(int regiontype, const char *name)
static blender::Vector< bNodeLink * > find_connected_links(bNodeTree *ntree, bNodeSocket *in_socket)
float * version_cycles_node_socket_float_value(bNodeSocket *socket)
void version_cycles_property_int_set(IDProperty *idprop, const char *name, int value)
IDProperty * version_cycles_properties_from_ID(ID *id)
int version_cycles_property_int(IDProperty *idprop, const char *name, int default_value)
IDProperty * version_cycles_properties_from_render_layer(SceneRenderLayer *render_layer)
ARegion * do_versions_add_region_if_not_found(ListBase *regionbase, int region_type, const char *allocname, int link_after_region_type)
bool version_node_socket_is_used(bNodeSocket *sock)
bNodeSocket & version_node_add_socket(bNodeTree &ntree, bNode &node, const eNodeSocketInOut in_out, const char *idname, const char *identifier)
void version_update_node_input(bNodeTree *ntree, FunctionRef< bool(bNode *)> check_node, const char *socket_identifier, FunctionRef< void(bNode *, bNodeSocket *)> update_input, FunctionRef< void(bNode *, bNodeSocket *, bNode *, bNodeSocket *)> update_input_link)
void version_node_socket_id_delim(bNodeSocket *socket)
float * version_cycles_node_socket_rgba_value(bNodeSocket *socket)
void version_node_socket_index_animdata(Main *bmain, const int node_tree_type, const int node_type, const int socket_index_orig, const int socket_index_offset, const int total_number_of_sockets)
void version_node_input_socket_name(bNodeTree *ntree, const int node_type, const char *old_name, const char *new_name)
bNode & version_node_add_empty(bNodeTree &ntree, const char *idname)
void version_node_socket_name(bNodeTree *ntree, const int node_type, const char *old_name, const char *new_name)
float * version_cycles_node_socket_vector_value(bNodeSocket *socket)
bool version_cycles_property_boolean(IDProperty *idprop, const char *name, bool default_value)
void version_socket_update_is_used(bNodeTree *ntree)
IDProperty * version_cycles_visibility_properties_from_ID(ID *id)
void node_tree_relink_with_socket_id_map(bNodeTree &ntree, bNode &old_node, bNode &new_node, const Map< std::string, std::string > &map)
void do_versions_after_setup(Main *new_bmain, BlendfileLinkAppendContext *lapp_context, BlendFileReadReport *reports)
bNodeLink & version_node_add_link(bNodeTree &ntree, bNode &node_a, bNodeSocket &socket_a, bNode &node_b, bNodeSocket &socket_b)
IDProperty * version_cycles_properties_from_view_layer(ViewLayer *view_layer)
bNodeSocket * version_node_add_socket_if_not_exist(bNodeTree *ntree, bNode *node, int in_out, int type, int subtype, const char *identifier, const char *name)
float version_cycles_property_float(IDProperty *idprop, const char *name, float default_value)
static bool blendfile_or_libraries_versions_atleast(Main *bmain, const short versionfile, const short subversionfile)
static void change_node_socket_name(ListBase *sockets, const char *old_name, const char *new_name)
void version_cycles_property_boolean_set(IDProperty *idprop, const char *name, bool value)
ARegion * do_versions_ensure_region(ListBase *regionbase, int region_type, const char *allocname, int link_after_region_type)
void version_node_output_socket_name(bNodeTree *ntree, const int node_type, const char *old_name, const char *new_name)
void version_node_id(bNodeTree *ntree, const int node_type, const char *new_name)