9#define DNA_DEPRECATED_ALLOW
57 switch (id_code_new) {
69 int link_after_region_type)
71 ARegion *link_after_region =
nullptr;
73 if (region->regiontype == region_type) {
76 if (region->regiontype == link_after_region_type) {
77 link_after_region = region;
90 int link_after_region_type)
92 ARegion *link_after_region =
nullptr;
94 if (region->regiontype == region_type) {
97 if (region->regiontype == link_after_region_type) {
98 link_after_region = region;
110 const char *name_src,
111 const char *name_dst)
118 if (
STREQ(idtest->name + 2, name_src)) {
121 if (
STREQ(idtest->name + 2, name_dst)) {
135 if (
STREQ(socket->name, old_name)) {
136 STRNCPY(socket->name, new_name);
138 if (
STREQ(socket->identifier, old_name)) {
139 STRNCPY(socket->identifier, new_name);
155 if (!
id.startswith(name)) {
173 const char *old_name,
174 const char *new_name)
176 for (
bNode *node : ntree->all_nodes()) {
177 if (node->type_legacy == node_type) {
186 const char *old_name,
187 const char *new_name)
189 for (
bNode *node : ntree->all_nodes()) {
190 if (node->type_legacy == node_type) {
198 const char *old_name,
199 const char *new_name)
201 for (
bNode *node : ntree->all_nodes()) {
202 if (node->type_legacy == node_type) {
210 using string_pair = std::pair<const char *, const char *>;
211 static const string_pair subtypes_map[] = {{
"NodeSocketFloatUnsigned",
"NodeSocketFloat"},
212 {
"NodeSocketFloatPercentage",
"NodeSocketFloat"},
213 {
"NodeSocketFloatFactor",
"NodeSocketFloat"},
214 {
"NodeSocketFloatAngle",
"NodeSocketFloat"},
215 {
"NodeSocketFloatTime",
"NodeSocketFloat"},
216 {
"NodeSocketFloatTimeAbsolute",
"NodeSocketFloat"},
217 {
"NodeSocketFloatDistance",
"NodeSocketFloat"},
218 {
"NodeSocketIntUnsigned",
"NodeSocketInt"},
219 {
"NodeSocketIntPercentage",
"NodeSocketInt"},
220 {
"NodeSocketIntFactor",
"NodeSocketInt"},
221 {
"NodeSocketVectorTranslation",
"NodeSocketVector"},
222 {
"NodeSocketVectorDirection",
"NodeSocketVector"},
223 {
"NodeSocketVectorVelocity",
"NodeSocketVector"},
224 {
"NodeSocketVectorAcceleration",
"NodeSocketVector"},
225 {
"NodeSocketVectorEuler",
"NodeSocketVector"},
226 {
"NodeSocketVectorXYZ",
"NodeSocketVector"}};
227 for (
const string_pair &pair : subtypes_map) {
228 if (pair.first == idname) {
241 node->
runtime = MEM_new<blender::bke::bNodeRuntime>(__func__);
264 const char *identifier)
269 socket->
runtime = MEM_new<blender::bke::bNodeSocketRuntime>(__func__);
298 bNode &node_from = node_a;
300 bNode &node_to = node_b;
307 link->
tosock = &socket_to;
320 const char *identifier,
324 if (sock !=
nullptr) {
333 for (
bNode *node : ntree->all_nodes()) {
334 if (node->type_legacy == node_type) {
335 if (!
STREQ(node->idname, new_name)) {
336 STRNCPY(node->idname, new_name);
343 const int node_tree_type,
345 const int socket_index_orig,
346 const int socket_index_offset,
347 const int total_number_of_sockets)
353 for (
int input_index = total_number_of_sockets - 1; input_index >= socket_index_orig;
357 if (ntree->type != node_tree_type) {
361 for (
bNode *node : ntree->all_nodes()) {
362 if (node->type_legacy != node_type) {
366 const size_t node_name_length = strlen(node->name);
367 const size_t node_name_escaped_max_length = (node_name_length * 2);
370 BLI_str_escape(node_name_escaped, node->name, node_name_escaped_max_length);
371 char *rna_path_prefix =
BLI_sprintfN(
"nodes[\"%s\"].inputs", node_name_escaped);
373 const int new_index = input_index + socket_index_offset;
375 bmain, owner_id, rna_path_prefix,
nullptr,
nullptr, input_index, new_index,
false);
386 for (
bNode *node : ntree->all_nodes()) {
413 if (link->tonode == &old_node) {
415 if (old_socket->is_available()) {
418 *&new_node,
SOCK_IN, *new_identifier);
419 link->tonode = &new_node;
420 link->tosock = new_socket;
421 old_socket->
link =
nullptr;
425 if (link->fromnode == &old_node) {
427 if (old_socket->is_available()) {
430 *&new_node,
SOCK_OUT, *new_identifier);
431 link->fromnode = &new_node;
432 link->fromsock = new_socket;
433 old_socket->
link =
nullptr;
444 if (link->tosock == in_socket) {
473 link->fromnode = realize_node;
481 return &socket_data->
value;
487 return socket_data->
value;
494 return socket_data->
value;
518 return (prop) ?
IDP_Float(prop) : default_value;
524 return (prop) ?
IDP_Int(prop) : default_value;
556 const char *socket_identifier,
560 bool need_update =
false;
565 bNode *fromnode = link->fromnode;
567 bNode *tonode = link->tonode;
570 if (!(tonode !=
nullptr && check_node(tonode) &&
STREQ(tosock->
identifier, socket_identifier)))
577 update_input_link(fromnode, fromsock, tonode, tosock);
585 if (check_node(node)) {
587 if (
input !=
nullptr) {
588 update_input(node,
input);
600 bNode *output_node =
nullptr;
604 if (node->type_legacy != node_type) {
608 if (output_node ==
nullptr) {
618 if (output_node ==
nullptr) {
638 for (
const char *engine : engines) {
639 if (
STREQ(scene->r.engine, engine)) {
652 const short versionfile,
653 const short subversionfile)
Versioning of old animation data. Most animation versioning code lives in the versioning_xxx....
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, blender::StringRef 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_layered_actions(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)
void BKE_main_mesh_legacy_convert_auto_smooth(Main &bmain)
#define FOREACH_NODETREE_END
#define FOREACH_NODETREE_BEGIN(bmain, _nodetree, _id)
#define GEO_NODE_REALIZE_INSTANCES
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)
ARegion * BKE_area_region_new()
#define LISTBASE_FOREACH(type, var, list)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_insertlinkafter(ListBase *listbase, void *vprevlink, void *vnewlink) ATTR_NONNULL(1)
#define LISTBASE_FOREACH_BACKWARD_MUTABLE(type, var, list)
char * BLI_sprintfN(const char *__restrict format,...) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC ATTR_PRINTF_FORMAT(1
char * STRNCPY(char(&dst)[N], const char *src)
size_t BLI_str_escape(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
external readfile function prototypes.
Read Guarded memory(de)allocation.
BKE_main_namemap_clear * new_bmain
const Value * lookup_ptr_as(const ForwardKey &key) const
constexpr bool is_empty() const
constexpr bool startswith(StringRef prefix) const
constexpr int64_t size() const
constexpr StringRef drop_known_prefix(StringRef prefix) const
void append(const T &value)
#define ID_IS_LINKED(_id)
#define ID_LINK_PLACEHOLDER
void * MEM_callocN(size_t len, const char *str)
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
void convert_legacy_action_assignments(Main &bmain, ReportList *reports)
void legacy_main(Main &bmain, BlendfileLinkAppendContext *lapp_context, BlendFileReadReport &reports)
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.
bNodeSocket * node_find_socket(bNode &node, eNodeSocketInOut in_out, StringRef identifier)
void node_unique_id(bNodeTree &ntree, bNode &node)
void node_remove_link(bNodeTree *ntree, bNodeLink &link)
bNodeSocketType * node_socket_type_find(StringRef idname)
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, StringRefNull identifier, StringRefNull name)
bNodeType * node_type_find(StringRef idname)
void node_unique_name(bNodeTree &ntree, bNode &node)
void doversion_250_sound_proxy_update(Main *bmain, Editing *ed)
void node_socket_init_default_value_data(eNodeSocketDatatype datatype, int subtype, void **data)
struct IDProperty * id_properties
bNodeSocketRuntimeHandle * runtime
bNodeRuntimeHandle * 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)
bool all_scenes_use(Main *bmain, const blender::Span< const char * > engines)
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)
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)
StringRef legacy_socket_idname_to_socket_type(StringRef idname)
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)
ARegion * do_versions_add_region(int regiontype, const char *)
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)
ARegion * do_versions_ensure_region(ListBase *regionbase, int region_type, const char *, int link_after_region_type)
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_add_region_if_not_found(ListBase *regionbase, int region_type, const char *, 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)
short do_versions_new_to_old_idcode_get(const short id_code_new)
void version_node_id(bNodeTree *ntree, const int node_type, const char *new_name)