[Bf-blender-cvs] [dc9858eb521] simulation-tree: make per socket storage work
Jacques Lucke
noreply at git.blender.org
Thu Feb 20 13:20:14 CET 2020
Commit: dc9858eb521524d30ffe871fad6ca277089b3ec5
Author: Jacques Lucke
Date: Thu Feb 20 13:00:39 2020 +0100
Branches: simulation-tree
https://developer.blender.org/rBdc9858eb521524d30ffe871fad6ca277089b3ec5
make per socket storage work
===================================================================
M source/blender/blenkernel/intern/node.c
M source/blender/simulations/nodes/my_test_node.cc
===================================================================
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index 17f4af36043..2005e28303a 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -796,14 +796,13 @@ static void node_socket_free(bNodeTree *ntree,
MEM_freeN(sock->prop);
}
- if (sock->default_value) {
- MEM_freeN(sock->default_value);
- }
-
bNodeSocketType *stype = sock->typeinfo;
if (stype->free_fn) {
stype->free_fn(ntree, node, sock);
}
+ else if (sock->default_value) {
+ MEM_freeN(sock->default_value);
+ }
}
void nodeRemoveSocket(bNodeTree *ntree, bNode *node, bNodeSocket *sock)
@@ -1086,7 +1085,11 @@ static void node_socket_copy(bNodeSocket *sock_dst, const bNodeSocket *sock_src,
sock_dst->prop = IDP_CopyProperty_ex(sock_src->prop, flag);
}
- if (sock_src->default_value) {
+ bNodeSocketType *stype = sock_dst->typeinfo;
+ if (stype->copy_fn) {
+ stype->copy_fn(NULL, NULL, sock_dst, sock_src);
+ }
+ else if (sock_src->default_value) {
sock_dst->default_value = MEM_dupallocN(sock_src->default_value);
}
@@ -1095,11 +1098,6 @@ static void node_socket_copy(bNodeSocket *sock_dst, const bNodeSocket *sock_src,
* some persistent buffer data here, need to clear this to avoid dangling pointers.
*/
sock_dst->cache = NULL;
-
- bNodeSocketType *stype = sock_dst->typeinfo;
- if (stype->copy_fn) {
- stype->copy_fn(NULL, NULL, sock_dst, sock_src);
- }
}
/* keep socket listorder identical, for copying links */
diff --git a/source/blender/simulations/nodes/my_test_node.cc b/source/blender/simulations/nodes/my_test_node.cc
index 7753481f79c..66884d65907 100644
--- a/source/blender/simulations/nodes/my_test_node.cc
+++ b/source/blender/simulations/nodes/my_test_node.cc
@@ -233,25 +233,9 @@ class NodeDecl {
}
};
-template<typename T> static T *get_node_storage(bNode *node)
-{
-#ifdef DEBUG
- const char *type_name = typeid(T).name();
- const char *expected_name = node->typeinfo->storagename;
- BLI_assert(strstr(type_name, expected_name));
-#endif
- return (T *)node->storage;
-}
-
-template<typename T> static const T *get_node_storage(const bNode *node)
-{
-#ifdef DEBUG
- const char *type_name = typeid(T).name();
- const char *expected_name = node->typeinfo->storagename;
- BLI_assert(strstr(type_name, expected_name));
-#endif
- return (const T *)node->storage;
-}
+template<typename T> static T *get_node_storage(bNode *node);
+template<typename T> static const T *get_node_storage(const bNode *node);
+template<typename T> static T *get_socket_storage(bNodeSocket *socket);
class NodeBuilder {
private:
@@ -337,7 +321,7 @@ class SocketTypeDefinition {
struct PointerRNA *node_ptr,
const char *text)>;
using InitStorageFn = std::function<void *()>;
- using CopyStorageFn = std::function<void *(void *)>;
+ using CopyStorageFn = std::function<void *(const void *)>;
using FreeStorageFn = std::function<void(void *)>;
template<typename T> using TypedInitStorageFn = std::function<void(T *)>;
@@ -367,7 +351,7 @@ class SocketTypeDefinition {
m_stype.free_self = [](bNodeSocketType *UNUSED(stype)) {};
m_init_storage_fn = []() { return nullptr; };
- m_copy_storage_fn = [](void *storage) {
+ m_copy_storage_fn = [](const void *storage) {
BLI_assert(storage == nullptr);
UNUSED_VARS_NDEBUG(storage);
return nullptr;
@@ -377,14 +361,9 @@ class SocketTypeDefinition {
UNUSED_VARS_NDEBUG(storage);
};
- m_stype.init_fn =
- [](bNodeTree *UNUSED(ntree), bNode *UNUSED(node), bNodeSocket *UNUSED(socket)) {};
- m_stype.copy_fn = [](bNodeTree *UNUSED(dst_ntree),
- bNode *UNUSED(dst_node),
- bNodeSocket *UNUSED(dst_socket),
- const bNodeSocket *UNUSED(src_socket)) {};
- m_stype.free_fn =
- [](bNodeTree *UNUSED(ntree), bNode *UNUSED(node), bNodeSocket *UNUSED(socket)) {};
+ m_stype.init_fn = SocketTypeDefinition::init_socket;
+ m_stype.copy_fn = SocketTypeDefinition::copy_socket;
+ m_stype.free_fn = SocketTypeDefinition::free_socket;
m_stype.userdata = (void *)this;
}
@@ -415,7 +394,7 @@ class SocketTypeDefinition {
init_storage_fn((T *)buffer);
return buffer;
},
- [](void *buffer) {
+ [](const void *buffer) {
void *new_buffer = MEM_callocN(sizeof(T), __func__);
memcpy(new_buffer, buffer, sizeof(T));
return new_buffer;
@@ -428,17 +407,44 @@ class SocketTypeDefinition {
m_draw_in_node_fn = draw_in_node_fn;
}
+ StringRefNull storage_struct_name() const
+ {
+ return m_storage_struct_name;
+ }
+
void register_type()
{
nodeRegisterSocketType(&m_stype);
}
- private:
static SocketTypeDefinition *get_from_socket(bNodeSocket *socket)
{
return (SocketTypeDefinition *)socket->typeinfo->userdata;
}
+ private:
+ static void init_socket(bNodeTree *UNUSED(ntree), bNode *UNUSED(node), bNodeSocket *socket)
+ {
+ SocketTypeDefinition *def = get_from_socket(socket);
+ socket->default_value = def->m_init_storage_fn();
+ }
+
+ static void copy_socket(bNodeTree *UNUSED(dst_ntree),
+ bNode *UNUSED(dst_node),
+ bNodeSocket *dst_socket,
+ const bNodeSocket *src_socket)
+ {
+ SocketTypeDefinition *def = get_from_socket(dst_socket);
+ dst_socket->default_value = def->m_copy_storage_fn(src_socket->default_value);
+ }
+
+ static void free_socket(bNodeTree *UNUSED(ntree), bNode *UNUSED(node), bNodeSocket *socket)
+ {
+ SocketTypeDefinition *def = get_from_socket(socket);
+ def->m_free_storage_fn(socket->default_value);
+ socket->default_value = nullptr;
+ }
+
static void draw_in_node(struct bContext *C,
struct uiLayout *layout,
struct PointerRNA *ptr,
@@ -640,6 +646,7 @@ class NodeTypeDefinition {
{
NodeTypeDefinition *def = type_from_node(node);
def->m_free_storage_fn(node->storage);
+ node->storage = nullptr;
}
static void node_label(bNodeTree *ntree, bNode *node, char *r_label, int maxlen)
@@ -649,6 +656,37 @@ class NodeTypeDefinition {
}
};
+template<typename T> static T *get_node_storage(bNode *node)
+{
+#ifdef DEBUG
+ const char *type_name = typeid(T).name();
+ const char *expected_name = node->typeinfo->storagename;
+ BLI_assert(strstr(type_name, expected_name));
+#endif
+ return (T *)node->storage;
+}
+
+template<typename T> static const T *get_node_storage(const bNode *node)
+{
+#ifdef DEBUG
+ const char *type_name = typeid(T).name();
+ const char *expected_name = node->typeinfo->storagename;
+ BLI_assert(strstr(type_name, expected_name));
+#endif
+ return (const T *)node->storage;
+}
+
+template<typename T> static T *get_socket_storage(bNodeSocket *socket)
+{
+#ifdef DEBUG
+ const char *type_name = typeid(T).name();
+ const char *expected_name =
+ SocketTypeDefinition::get_from_socket(socket)->storage_struct_name().data();
+ BLI_assert(strstr(type_name, expected_name));
+#endif
+ return (T *)socket->default_value;
+}
+
void register_node_type_my_test_node()
{
{
@@ -726,9 +764,13 @@ void init_socket_data_types()
"bNodeSocketValueFloat", [](bNodeSocketValueFloat *storage) { storage->value = 11.5f; });
stype.add_draw_fn([](bContext *UNUSED(C),
uiLayout *layout,
- PointerRNA *UNUSED(ptr),
+ PointerRNA *ptr,
PointerRNA *UNUSED(node_ptr),
- const char *UNUSED(text)) { uiItemL(layout, "Hello World", 0); });
+ const char *UNUSED(text)) {
+ bNodeSocket *socket = (bNodeSocket *)ptr->data;
+ bNodeSocketValueFloat *storage = get_socket_storage<bNodeSocketValueFloat>(socket);
+ uiItemL(layout, std::to_string(storage->value).c_str(), 0);
+ });
stype.register_type();
}
More information about the Bf-blender-cvs
mailing list