[Bf-blender-cvs] [50b8e605d4c] builtin-simulation-nodes: Store pointer to object data block in object socket
Jacques Lucke
noreply at git.blender.org
Thu Mar 12 13:20:43 CET 2020
Commit: 50b8e605d4c2ad5f4167b7630119855493eff63c
Author: Jacques Lucke
Date: Thu Mar 12 13:20:21 2020 +0100
Branches: builtin-simulation-nodes
https://developer.blender.org/rB50b8e605d4c2ad5f4167b7630119855493eff63c
Store pointer to object data block in object socket
===================================================================
M source/blender/blenkernel/intern/lib_query.c
M source/blender/blenkernel/intern/node.c
M source/blender/blenloader/intern/readfile.c
M source/blender/blenloader/intern/writefile.c
M source/blender/editors/space_node/drawnode.c
M source/blender/makesdna/DNA_node_types.h
M source/blender/makesrna/intern/rna_nodetree.c
M source/blender/nodes/intern/node_socket.c
===================================================================
diff --git a/source/blender/blenkernel/intern/lib_query.c b/source/blender/blenkernel/intern/lib_query.c
index 41d938e897d..9f8c6514add 100644
--- a/source/blender/blenkernel/intern/lib_query.c
+++ b/source/blender/blenkernel/intern/lib_query.c
@@ -200,6 +200,17 @@ static void library_foreach_idproperty_ID_link(LibraryForeachIDData *data,
FOREACH_FINALIZE_VOID;
}
+static void library_foreach_node_socket(LibraryForeachIDData *data, bNodeSocket *sock)
+{
+ library_foreach_idproperty_ID_link(data, sock->prop, IDWALK_CB_USER);
+
+ if (sock->type == SOCK_OBJECT) {
+ bNodeSocketValueObject *default_value = sock->default_value;
+ FOREACH_CALLBACK_INVOKE_ID_PP(data, (ID **)&default_value->object, IDWALK_CB_USER);
+ FOREACH_FINALIZE_VOID;
+ }
+}
+
static void library_foreach_rigidbodyworldSceneLooper(struct RigidBodyWorld *UNUSED(rbw),
ID **id_pointer,
void *user_data,
@@ -1023,18 +1034,18 @@ static void library_foreach_ID_link(Main *bmain,
library_foreach_idproperty_ID_link(&data, node->prop, IDWALK_CB_USER);
for (sock = node->inputs.first; sock; sock = sock->next) {
- library_foreach_idproperty_ID_link(&data, sock->prop, IDWALK_CB_USER);
+ library_foreach_node_socket(&data, sock);
}
for (sock = node->outputs.first; sock; sock = sock->next) {
- library_foreach_idproperty_ID_link(&data, sock->prop, IDWALK_CB_USER);
+ library_foreach_node_socket(&data, sock);
}
}
for (sock = ntree->inputs.first; sock; sock = sock->next) {
- library_foreach_idproperty_ID_link(&data, sock->prop, IDWALK_CB_USER);
+ library_foreach_node_socket(&data, sock);
}
for (sock = ntree->outputs.first; sock; sock = sock->next) {
- library_foreach_idproperty_ID_link(&data, sock->prop, IDWALK_CB_USER);
+ library_foreach_node_socket(&data, sock);
}
break;
}
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index 6dccad16ff0..e90062e3611 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -759,6 +759,10 @@ void nodeModifySocketType(
}
if (sock->default_value) {
+ if (sock->type == SOCK_OBJECT) {
+ bNodeSocketValueObject *default_value = sock->default_value;
+ id_us_min(&default_value->object->id);
+ }
MEM_freeN(sock->default_value);
sock->default_value = NULL;
}
@@ -1009,6 +1013,10 @@ static void node_socket_free(bNodeTree *UNUSED(ntree),
}
if (sock->default_value) {
+ if (sock->type == SOCK_OBJECT && do_id_user) {
+ bNodeSocketValueObject *default_value = sock->default_value;
+ id_us_min(&default_value->object->id);
+ }
MEM_freeN(sock->default_value);
}
}
@@ -1295,6 +1303,13 @@ static void node_socket_copy(bNodeSocket *sock_dst, const bNodeSocket *sock_src,
if (sock_src->default_value) {
sock_dst->default_value = MEM_dupallocN(sock_src->default_value);
+
+ if (sock_dst->type == SOCK_OBJECT) {
+ if ((flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0) {
+ bNodeSocketValueObject *default_value = sock_dst->default_value;
+ id_us_plus(&default_value->object->id);
+ }
+ }
}
sock_dst->stack_index = 0;
@@ -2130,6 +2145,19 @@ void nodeRemoveNode(Main *bmain, bNodeTree *ntree, bNode *node, bool do_id_user)
if (node->id) {
id_us_min(node->id);
}
+
+ LISTBASE_FOREACH (bNodeSocket *, sock, &node->inputs) {
+ if (sock->default_value && sock->type == SOCK_OBJECT) {
+ bNodeSocketValueObject *default_value = sock->default_value;
+ id_us_min(&default_value->object->id);
+ }
+ }
+ LISTBASE_FOREACH (bNodeSocket *, sock, &node->outputs) {
+ if (sock->default_value && sock->type == SOCK_OBJECT) {
+ bNodeSocketValueObject *default_value = sock->default_value;
+ id_us_min(&default_value->object->id);
+ }
+ }
}
/* Remove animation data. */
@@ -2156,6 +2184,11 @@ static void node_socket_interface_free(bNodeTree *UNUSED(ntree), bNodeSocket *so
}
if (sock->default_value) {
+ if (sock->type == SOCK_OBJECT) {
+ bNodeSocketValueObject *default_value = sock->default_value;
+ id_us_min(&default_value->object->id);
+ }
+
MEM_freeN(sock->default_value);
}
}
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index ee7cfe4f599..dab03976943 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -3411,6 +3411,16 @@ static void lib_link_workspace_instance_hook(FileData *fd, WorkSpaceInstanceHook
/** \name Read ID: Node Tree
* \{ */
+static void lib_link_node_socket(FileData *fd, Library *lib, bNodeSocket *sock)
+{
+ IDP_LibLinkProperty(sock->prop, fd);
+
+ if (sock->type == SOCK_OBJECT) {
+ bNodeSocketValueObject *default_value = sock->default_value;
+ default_value->object = newlibadr(fd, lib, default_value->object);
+ }
+}
+
/* Single node tree (also used for material/scene trees), ntree is not NULL */
static void lib_link_ntree(FileData *fd, Library *lib, bNodeTree *ntree)
{
@@ -3426,18 +3436,18 @@ static void lib_link_ntree(FileData *fd, Library *lib, bNodeTree *ntree)
node->id = newlibadr(fd, lib, node->id);
for (bNodeSocket *sock = node->inputs.first; sock; sock = sock->next) {
- IDP_LibLinkProperty(sock->prop, fd);
+ lib_link_node_socket(fd, lib, sock);
}
for (bNodeSocket *sock = node->outputs.first; sock; sock = sock->next) {
- IDP_LibLinkProperty(sock->prop, fd);
+ lib_link_node_socket(fd, lib, sock);
}
}
for (bNodeSocket *sock = ntree->inputs.first; sock; sock = sock->next) {
- IDP_LibLinkProperty(sock->prop, fd);
+ lib_link_node_socket(fd, lib, sock);
}
for (bNodeSocket *sock = ntree->outputs.first; sock; sock = sock->next) {
- IDP_LibLinkProperty(sock->prop, fd);
+ lib_link_node_socket(fd, lib, sock);
}
/* Set node->typeinfo pointers. This is done in lib linking, after the
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index d6ad28adb1b..8d68ec6bc0e 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -988,6 +988,9 @@ static void write_node_socket_default_value(WriteData *wd, bNodeSocket *sock)
case SOCK_STRING:
writestruct(wd, DATA, bNodeSocketValueString, 1, sock->default_value);
break;
+ case SOCK_OBJECT:
+ writestruct(wd, DATA, bNodeSocketValueObject, 1, sock->default_value);
+ break;
case __SOCK_MESH:
case SOCK_CUSTOM:
case SOCK_SHADER:
@@ -995,7 +998,6 @@ static void write_node_socket_default_value(WriteData *wd, bNodeSocket *sock)
case SOCK_EVENTS:
case SOCK_FORCES:
case SOCK_CONTROL_FLOW:
- case SOCK_OBJECT:
case SOCK_IMAGE:
case SOCK_SURFACE_HOOK:
BLI_assert(false);
diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c
index 14d8ffa35fc..92107e61a3c 100644
--- a/source/blender/editors/space_node/drawnode.c
+++ b/source/blender/editors/space_node/drawnode.c
@@ -3413,6 +3413,10 @@ static void std_node_socket_draw(
uiItemR(row, ptr, "default_value", 0, "", 0);
break;
}
+ case SOCK_OBJECT: {
+ uiItemR(layout, ptr, "default_value", 0, text, 0);
+ break;
+ }
default:
node_socket_button_label(C, layout, ptr, node_ptr, text);
break;
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index 15daaf93fb7..1a57684f17d 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -573,6 +573,10 @@ typedef struct bNodeSocketValueString {
char value[1024];
} bNodeSocketValueString;
+typedef struct bNodeSocketValueObject {
+ struct Object *object;
+} bNodeSocketValueObject;
+
/* data structs, for node->storage */
enum {
CMP_NODE_MASKTYPE_ADD = 0,
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index 9b34b726ea0..5d80da32306 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -8618,15 +8618,33 @@ static void rna_def_node_socket_object(BlenderRNA *brna,
const char *interface_idname)
{
StructRNA *srna;
+ PropertyRNA *prop;
srna = RNA_def_struct(brna, identifier, "NodeSocketStandard");
RNA_def_struct_ui_text(srna, "Object Node Socket", "Object socket of a node");
RNA_def_struct_sdna(srna, "bNodeSocket");
+ RNA_def_struct_sdna_from(srna, "bNodeSocketValueObject", "default_value");
+
+ prop = RNA_def_property(srna, "default_value", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "object");
+ RNA_def_property_struct_type(prop, "Object");
+ RNA_def_property_ui_text(prop, "Default Value", "Input value used for unconnected socket");
+ RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_NodeSocketStandard_value_update");
+ RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_REFCOUNT | PROP_CONTEXT_UPDATE);
+
/* socket interface */
srna = RNA_def_struct(brna, interface_idname, "NodeSocketInterfaceStandard");
RNA_def_struct_ui_text(srna, "Object Node Socket Interface", "Object socket of a node");
RNA_def_struct_sdna(srna, "bNodeSocket");
+
+ RNA_def_struct_sdna_from(srna, "bNodeSocketValueObject", "default_value");
+
+ prop = RNA_def_property(srna, "default_value", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "object");
+ RNA_def_property_struct_type(prop, "Object");
+ RNA_def_property_ui_text(prop, "Default Value", "Input value used for unconnected socket");
+ RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_NodeSocketInterface_update");
}
static void rna_def_node_socket_image(BlenderRNA *brna,
diff --git a/source/blender/nodes/intern/
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list