9#define DNA_DEPRECATED_ALLOW
58 switch (id_code_new) {
70 int link_after_region_type)
72 ARegion *link_after_region =
nullptr;
74 if (region->regiontype == region_type) {
77 if (region->regiontype == link_after_region_type) {
78 link_after_region = region;
91 int link_after_region_type)
93 ARegion *link_after_region =
nullptr;
95 if (region->regiontype == region_type) {
98 if (region->regiontype == link_after_region_type) {
99 link_after_region = region;
111 const char *name_src,
112 const char *name_dst)
119 if (
STREQ(idtest->name + 2, name_src)) {
122 if (
STREQ(idtest->name + 2, name_dst)) {
136 if (
STREQ(socket->name, old_name)) {
139 if (
STREQ(socket->identifier, old_name)) {
156 if (!
id.startswith(
name)) {
174 const char *old_name,
175 const char *new_name)
177 for (
bNode *node : ntree->all_nodes()) {
178 if (node->type_legacy == node_type) {
187 const char *old_name,
188 const char *new_name)
190 for (
bNode *node : ntree->all_nodes()) {
191 if (node->type_legacy == node_type) {
199 const char *old_name,
200 const char *new_name)
202 for (
bNode *node : ntree->all_nodes()) {
203 if (node->type_legacy == node_type) {
211 using string_pair = std::pair<const char *, const char *>;
212 static const string_pair subtypes_map[] = {{
"NodeSocketFloatUnsigned",
"NodeSocketFloat"},
213 {
"NodeSocketFloatPercentage",
"NodeSocketFloat"},
214 {
"NodeSocketFloatFactor",
"NodeSocketFloat"},
215 {
"NodeSocketFloatAngle",
"NodeSocketFloat"},
216 {
"NodeSocketFloatTime",
"NodeSocketFloat"},
217 {
"NodeSocketFloatTimeAbsolute",
"NodeSocketFloat"},
218 {
"NodeSocketFloatDistance",
"NodeSocketFloat"},
219 {
"NodeSocketIntUnsigned",
"NodeSocketInt"},
220 {
"NodeSocketIntPercentage",
"NodeSocketInt"},
221 {
"NodeSocketIntFactor",
"NodeSocketInt"},
222 {
"NodeSocketVectorTranslation",
"NodeSocketVector"},
223 {
"NodeSocketVectorDirection",
"NodeSocketVector"},
224 {
"NodeSocketVectorVelocity",
"NodeSocketVector"},
225 {
"NodeSocketVectorAcceleration",
"NodeSocketVector"},
226 {
"NodeSocketVectorEuler",
"NodeSocketVector"},
227 {
"NodeSocketVectorXYZ",
"NodeSocketVector"}};
228 for (
const string_pair &pair : subtypes_map) {
229 if (pair.first == idname) {
242 node->
runtime = MEM_new<blender::bke::bNodeRuntime>(__func__);
274 const char *identifier)
279 socket->
runtime = MEM_new<blender::bke::bNodeSocketRuntime>(__func__);
308 bNode &node_from = node_a;
310 bNode &node_to = node_b;
317 link->
tosock = &socket_to;
330 const char *identifier,
334 if (sock !=
nullptr) {
348 for (
bNode *node : ntree->all_nodes()) {
349 if (node->type_legacy == node_type) {
350 if (!
STREQ(node->idname, new_name)) {
351 STRNCPY(node->idname, new_name);
358 const int node_tree_type,
360 const int socket_index_orig,
361 const int socket_index_offset,
362 const int total_number_of_sockets)
368 for (
int input_index = total_number_of_sockets - 1; input_index >= socket_index_orig;
372 if (ntree->type != node_tree_type) {
376 for (
bNode *node : ntree->all_nodes()) {
377 if (node->type_legacy != node_type) {
381 char node_name_escaped[
sizeof(node->name) * 2];
382 BLI_str_escape(node_name_escaped, node->name,
sizeof(node_name_escaped));
383 char *rna_path_prefix =
BLI_sprintfN(
"nodes[\"%s\"].inputs", node_name_escaped);
385 const int new_index = input_index + socket_index_offset;
387 bmain, owner_id, rna_path_prefix,
nullptr,
nullptr, input_index, new_index,
false);
397 for (
bNode *node : ntree->all_nodes()) {
424 if (link->tonode == &old_node) {
426 if (old_socket->is_available()) {
429 *&new_node,
SOCK_IN, *new_identifier);
430 link->tonode = &new_node;
431 link->tosock = new_socket;
432 old_socket->
link =
nullptr;
436 if (link->fromnode == &old_node) {
438 if (old_socket->is_available()) {
441 *&new_node,
SOCK_OUT, *new_identifier);
442 link->fromnode = &new_node;
443 link->fromsock = new_socket;
444 old_socket->
link =
nullptr;
455 if (link->tosock == in_socket) {
484 link->fromnode = realize_node;
492 return &socket_data->
value;
498 return socket_data->
value;
505 return socket_data->
value;
567 const char *socket_identifier,
571 bool need_update =
false;
576 bNode *fromnode = link->fromnode;
578 bNode *tonode = link->tonode;
581 if (!(tonode !=
nullptr && check_node(tonode) &&
STREQ(tosock->
identifier, socket_identifier)))
588 update_input_link(fromnode, fromsock, tonode, tosock);
596 if (check_node(node)) {
598 if (
input !=
nullptr) {
599 update_input(node,
input);
611 bNode *output_node =
nullptr;
615 if (node->type_legacy != node_type) {
619 if (output_node ==
nullptr) {
629 if (output_node ==
nullptr) {
649 for (
const char *engine : engines) {
650 if (
STREQ(scene->r.engine, engine)) {
665 return scene->nodetree;
672 const short versionfile,
673 const short subversionfile)
774 scene->compositing_node_group = ntree;
775 scene->nodetree =
nullptr;
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)
#define IDP_float_get(prop)
IDProperty * IDP_ID_system_properties_get(ID *id) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
IDProperty * IDP_GetPropertyTypeFromGroup(const IDProperty *prop, blender::StringRef name, char type) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
#define IDP_int_get(prop)
#define IDP_int_set(prop, value)
bool IDP_AddToGroup(IDProperty *group, IDProperty *prop) ATTR_NONNULL()
IDNewNameResult BKE_libblock_rename(Main &bmain, ID &id, blender::StringRefNull name, const IDNewNameMode mode=IDNewNameMode::RenameExistingNever)
void BKE_libblock_management_main_add(Main *bmain, void *idv)
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
#define STRNCPY_UTF8(dst, src)
external readfile function prototypes.
#define ID_IS_LINKED(_id)
#define ID_LINK_PLACEHOLDER
Read Guarded memory(de)allocation.
const Value * lookup_ptr_as(const ForwardKey &key) const
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_callocN(size_t len, 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.
void node_unlink_node(bNodeTree &ntree, bNode &node)
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)
void node_unlink_attached(bNodeTree *ntree, const bNode *parent)
void node_free_node(bNodeTree *tree, bNode &node)
void node_rebuild_id_vector(bNodeTree &node_tree)
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)
bool pre_animato_file_loaded
struct bNodeTree * compositing_node_group
struct IDProperty * system_properties
bNodeSocketRuntimeHandle * runtime
bNodeTreeInterface tree_interface
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)
void version_node_remove(bNodeTree &ntree, bNode &node)
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)
void version_node_tree_clear_interface(bNodeTree &ntree)
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)
bNodeTree * version_get_scene_compositor_node_tree(Main *bmain, Scene *scene)
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)