Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/node.cc
| Show First 20 Lines • Show All 992 Lines • ▼ Show 20 Lines | |||||
| case __SOCK_MESH: | case __SOCK_MESH: | ||||
| case SOCK_CUSTOM: | case SOCK_CUSTOM: | ||||
| case SOCK_SHADER: | case SOCK_SHADER: | ||||
| case SOCK_GEOMETRY: | case SOCK_GEOMETRY: | ||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| static void socket_id_user_decrement(bNodeSocket *sock) | /** \return True if the socket had an ID default value. */ | ||||
| static bool socket_id_user_decrement(bNodeSocket *sock) | |||||
| { | { | ||||
| switch ((eNodeSocketDatatype)sock->type) { | switch ((eNodeSocketDatatype)sock->type) { | ||||
| case SOCK_OBJECT: { | case SOCK_OBJECT: { | ||||
| bNodeSocketValueObject *default_value = (bNodeSocketValueObject *)sock->default_value; | bNodeSocketValueObject *default_value = (bNodeSocketValueObject *)sock->default_value; | ||||
| if (default_value->value != nullptr) { | if (default_value->value != nullptr) { | ||||
| id_us_min(&default_value->value->id); | id_us_min(&default_value->value->id); | ||||
| return true; | |||||
| } | } | ||||
| break; | break; | ||||
| } | } | ||||
| case SOCK_IMAGE: { | case SOCK_IMAGE: { | ||||
| bNodeSocketValueImage *default_value = (bNodeSocketValueImage *)sock->default_value; | bNodeSocketValueImage *default_value = (bNodeSocketValueImage *)sock->default_value; | ||||
| if (default_value->value != nullptr) { | if (default_value->value != nullptr) { | ||||
| id_us_min(&default_value->value->id); | id_us_min(&default_value->value->id); | ||||
| return true; | |||||
| } | } | ||||
| break; | break; | ||||
| } | } | ||||
| case SOCK_COLLECTION: { | case SOCK_COLLECTION: { | ||||
| bNodeSocketValueCollection *default_value = (bNodeSocketValueCollection *) | bNodeSocketValueCollection *default_value = (bNodeSocketValueCollection *) | ||||
| sock->default_value; | sock->default_value; | ||||
| if (default_value->value != nullptr) { | if (default_value->value != nullptr) { | ||||
| id_us_min(&default_value->value->id); | id_us_min(&default_value->value->id); | ||||
| return true; | |||||
| } | } | ||||
| break; | break; | ||||
| } | } | ||||
| case SOCK_TEXTURE: { | case SOCK_TEXTURE: { | ||||
| bNodeSocketValueTexture *default_value = (bNodeSocketValueTexture *)sock->default_value; | bNodeSocketValueTexture *default_value = (bNodeSocketValueTexture *)sock->default_value; | ||||
| if (default_value->value != nullptr) { | if (default_value->value != nullptr) { | ||||
| id_us_min(&default_value->value->id); | id_us_min(&default_value->value->id); | ||||
| return true; | |||||
| } | } | ||||
| break; | break; | ||||
| } | } | ||||
| case SOCK_MATERIAL: { | case SOCK_MATERIAL: { | ||||
| bNodeSocketValueMaterial *default_value = (bNodeSocketValueMaterial *)sock->default_value; | bNodeSocketValueMaterial *default_value = (bNodeSocketValueMaterial *)sock->default_value; | ||||
| if (default_value->value != nullptr) { | if (default_value->value != nullptr) { | ||||
| id_us_min(&default_value->value->id); | id_us_min(&default_value->value->id); | ||||
| return true; | |||||
| } | } | ||||
| break; | break; | ||||
| } | } | ||||
| case SOCK_FLOAT: | case SOCK_FLOAT: | ||||
| case SOCK_VECTOR: | case SOCK_VECTOR: | ||||
| case SOCK_RGBA: | case SOCK_RGBA: | ||||
| case SOCK_BOOLEAN: | case SOCK_BOOLEAN: | ||||
| case SOCK_INT: | case SOCK_INT: | ||||
| case SOCK_STRING: | case SOCK_STRING: | ||||
| case __SOCK_MESH: | case __SOCK_MESH: | ||||
| case SOCK_CUSTOM: | case SOCK_CUSTOM: | ||||
| case SOCK_SHADER: | case SOCK_SHADER: | ||||
| case SOCK_GEOMETRY: | case SOCK_GEOMETRY: | ||||
| break; | break; | ||||
| } | } | ||||
| return false; | |||||
| } | } | ||||
| void nodeModifySocketType(bNodeTree *ntree, | void nodeModifySocketType(bNodeTree *ntree, | ||||
| bNode *UNUSED(node), | bNode *UNUSED(node), | ||||
| bNodeSocket *sock, | bNodeSocket *sock, | ||||
| const char *idname) | const char *idname) | ||||
| { | { | ||||
| bNodeSocketType *socktype = nodeSocketTypeFind(idname); | bNodeSocketType *socktype = nodeSocketTypeFind(idname); | ||||
| ▲ Show 20 Lines • Show All 1,343 Lines • ▼ Show 20 Lines | |||||
| } | } | ||||
| void nodeRemoveNode(Main *bmain, bNodeTree *ntree, bNode *node, bool do_id_user) | void nodeRemoveNode(Main *bmain, bNodeTree *ntree, bNode *node, bool do_id_user) | ||||
| { | { | ||||
| /* This function is not for localized node trees, we do not want | /* This function is not for localized node trees, we do not want | ||||
| * do to ID user refcounting and removal of animdation data then. */ | * do to ID user refcounting and removal of animdation data then. */ | ||||
| BLI_assert((ntree->id.tag & LIB_TAG_LOCALIZED) == 0); | BLI_assert((ntree->id.tag & LIB_TAG_LOCALIZED) == 0); | ||||
| bool has_id_in_socket = false; | |||||
JacquesLucke: Now this name is outdated. | |||||
| if (do_id_user) { | if (do_id_user) { | ||||
| /* Free callback for NodeCustomGroup. */ | /* Free callback for NodeCustomGroup. */ | ||||
| if (node->typeinfo->freefunc_api) { | if (node->typeinfo->freefunc_api) { | ||||
| PointerRNA ptr; | PointerRNA ptr; | ||||
| RNA_pointer_create((ID *)ntree, &RNA_Node, node, &ptr); | RNA_pointer_create((ID *)ntree, &RNA_Node, node, &ptr); | ||||
| node->typeinfo->freefunc_api(&ptr); | node->typeinfo->freefunc_api(&ptr); | ||||
| } | } | ||||
| /* Do user counting. */ | /* Do user counting. */ | ||||
| if (node->id) { | if (node->id) { | ||||
| id_us_min(node->id); | id_us_min(node->id); | ||||
JacquesLuckeUnsubmitted Not Done Inline ActionsShould node->id be taken into account as well? JacquesLucke: Should `node->id` be taken into account as well? | |||||
| } | } | ||||
| LISTBASE_FOREACH (bNodeSocket *, sock, &node->inputs) { | LISTBASE_FOREACH (bNodeSocket *, sock, &node->inputs) { | ||||
| socket_id_user_decrement(sock); | has_id_in_socket |= socket_id_user_decrement(sock); | ||||
| } | } | ||||
| LISTBASE_FOREACH (bNodeSocket *, sock, &node->outputs) { | LISTBASE_FOREACH (bNodeSocket *, sock, &node->outputs) { | ||||
| socket_id_user_decrement(sock); | has_id_in_socket |= socket_id_user_decrement(sock); | ||||
| } | } | ||||
| } | } | ||||
| /* Remove animation data. */ | /* Remove animation data. */ | ||||
| char propname_esc[MAX_IDPROP_NAME * 2]; | char propname_esc[MAX_IDPROP_NAME * 2]; | ||||
| char prefix[MAX_IDPROP_NAME * 2]; | char prefix[MAX_IDPROP_NAME * 2]; | ||||
| BLI_str_escape(propname_esc, node->name, sizeof(propname_esc)); | BLI_str_escape(propname_esc, node->name, sizeof(propname_esc)); | ||||
| BLI_snprintf(prefix, sizeof(prefix), "nodes[\"%s\"]", propname_esc); | BLI_snprintf(prefix, sizeof(prefix), "nodes[\"%s\"]", propname_esc); | ||||
| if (BKE_animdata_fix_paths_remove((ID *)ntree, prefix)) { | if (BKE_animdata_fix_paths_remove((ID *)ntree, prefix)) { | ||||
| if (bmain != nullptr) { | if (bmain != nullptr) { | ||||
| DEG_relations_tag_update(bmain); | DEG_relations_tag_update(bmain); | ||||
| } | } | ||||
| } | } | ||||
| if (has_id_in_socket) { | |||||
| if (bmain != nullptr) { | |||||
| DEG_relations_tag_update(bmain); | |||||
| } | |||||
| } | |||||
| nodeUnlinkNode(ntree, node); | nodeUnlinkNode(ntree, node); | ||||
| node_unlink_attached(ntree, node); | node_unlink_attached(ntree, node); | ||||
| /* Free node itself. */ | /* Free node itself. */ | ||||
| node_free_node(ntree, node); | node_free_node(ntree, node); | ||||
| } | } | ||||
| static void node_socket_interface_free(bNodeTree *UNUSED(ntree), | static void node_socket_interface_free(bNodeTree *UNUSED(ntree), | ||||
| ▲ Show 20 Lines • Show All 992 Lines • Show Last 20 Lines | |||||
Now this name is outdated.