[Bf-blender-cvs] [843d9c8dff3] simulation-tree: add a second test node
Jacques Lucke
noreply at git.blender.org
Wed Feb 19 16:12:12 CET 2020
Commit: 843d9c8dff3342d802d7ede9520ef49fef14866d
Author: Jacques Lucke
Date: Wed Feb 19 12:59:43 2020 +0100
Branches: simulation-tree
https://developer.blender.org/rB843d9c8dff3342d802d7ede9520ef49fef14866d
add a second test node
===================================================================
M source/blender/simulations/nodes/my_test_node.cc
===================================================================
diff --git a/source/blender/simulations/nodes/my_test_node.cc b/source/blender/simulations/nodes/my_test_node.cc
index fb3d4b36037..e023423ab48 100644
--- a/source/blender/simulations/nodes/my_test_node.cc
+++ b/source/blender/simulations/nodes/my_test_node.cc
@@ -279,8 +279,6 @@ class NodeBuilder {
}
};
-using DeclareNodeFunc = void (*)(NodeBuilder &builder);
-
static void declare_test_node(NodeBuilder &builder)
{
MyTestNodeStorage *storage = builder.node_storage<MyTestNodeStorage>();
@@ -296,23 +294,48 @@ static void declare_test_node(NodeBuilder &builder)
}
}
+using DeclareNodeFunc = std::function<void(NodeBuilder &node_builder)>;
+using InitStorageFunc = std::function<void *()>;
+using FreeStorageFunc = std::function<void(void *)>;
+using DrawFunc =
+ std::function<void(struct uiLayout *layout, struct bContext *C, struct PointerRNA *ptr)>;
+
+struct NodeTypeCallbacks {
+ DeclareNodeFunc m_declare_node;
+ InitStorageFunc m_init_storage;
+ FreeStorageFunc m_free_storage;
+ DrawFunc m_draw;
+};
+
static void init_node(bNodeTree *ntree, bNode *node)
{
+ NodeTypeCallbacks &callbacks = *(NodeTypeCallbacks *)node->typeinfo->userdata;
+
LinearAllocator<> allocator;
NodeDecl node_decl{*ntree, *node};
NodeBuilder node_builder{allocator, node_decl};
/* TODO: free storage */
- node->storage = MEM_callocN(sizeof(MyTestNodeStorage), __func__);
- declare_test_node(node_builder);
+ node->storage = callbacks.m_init_storage();
+ callbacks.m_declare_node(node_builder);
node_decl.build();
}
-static void setup_managed_node_type(bNodeType *ntype,
- StringRef idname,
- StringRef ui_name,
- StringRef ui_description,
- StringRef storage_name,
- DeclareNodeFunc declare_fn)
+static void setup_node_storage(bNodeType *ntype,
+ StringRef storage_name,
+ InitStorageFunc init_storage_fn,
+ FreeStorageFunc free_storage_fn)
+{
+ storage_name.copy(ntype->storagename);
+ NodeTypeCallbacks *callbacks = (NodeTypeCallbacks *)ntype->userdata;
+ callbacks->m_init_storage = init_storage_fn;
+ callbacks->m_free_storage = free_storage_fn;
+}
+
+static void setup_node_base(bNodeType *ntype,
+ StringRef idname,
+ StringRef ui_name,
+ StringRef ui_description,
+ DeclareNodeFunc declare_fn)
{
memset(ntype, 0, sizeof(bNodeType));
ntype->minwidth = 20;
@@ -326,10 +349,15 @@ static void setup_managed_node_type(bNodeType *ntype,
idname.copy(ntype->idname);
ui_name.copy(ntype->ui_name);
ui_description.copy(ntype->ui_description);
- storage_name.copy(ntype->storagename);
+
+ NodeTypeCallbacks *callbacks = new NodeTypeCallbacks();
+ ntype->userdata = (void *)callbacks;
+ ntype->free_userdata = [](void *userdata) { delete (NodeTypeCallbacks *)userdata; };
+
+ callbacks->m_declare_node = declare_fn;
+ callbacks->m_init_storage = []() { return nullptr; };
ntype->poll = [](bNodeType *UNUSED(ntype), bNodeTree *UNUSED(ntree)) { return true; };
- ntype->userdata = (void *)declare_fn;
ntype->initfunc = init_node;
ntype->draw_nodetype = node_draw_default;
@@ -343,44 +371,55 @@ static void setup_managed_node_type(bNodeType *ntype,
void register_node_type_my_test_node()
{
- static bNodeType ntype = {0};
- setup_managed_node_type(&ntype,
- "MyTestNode",
- "My Test Node",
- "My Description",
- "MyTestNodeStorage",
- declare_test_node);
-
- ntype.draw_buttons = [](uiLayout *layout, struct bContext *UNUSED(C), struct PointerRNA *ptr) {
- bNode *node = (bNode *)ptr->data;
- MyTestNodeStorage *storage = (MyTestNodeStorage *)node->storage;
- uiBut *but = uiDefButI(uiLayoutGetBlock(layout),
- UI_BTYPE_NUM,
- 0,
- "X value",
- 0,
- 0,
- 50,
- 50,
- &storage->x,
- -1000,
- 1000,
- 3,
- 20,
- "my x value");
- uiItemL(layout, "Hello World", 0);
- UI_but_func_set(
- but,
- [](bContext *C, void *UNUSED(arg1), void *UNUSED(arg2)) {
- bNodeTree *ntree = CTX_wm_space_node(C)->edittree;
- ntree->update = NTREE_UPDATE;
- ntreeUpdateTree(CTX_data_main(C), ntree);
- },
- nullptr,
- nullptr);
- };
-
- nodeRegisterType(&ntype);
+ {
+ static bNodeType ntype;
+ setup_node_base(&ntype, "MyTestNode", "My Test Node", "My Description", declare_test_node);
+ setup_node_storage(
+ &ntype,
+ "MyTestNodeStorage",
+ []() { return MEM_callocN(sizeof(MyTestNodeStorage), __func__); },
+ [](void *storage) { MEM_freeN(storage); });
+
+ ntype.draw_buttons = [](uiLayout *layout, struct bContext *UNUSED(C), struct PointerRNA *ptr) {
+ bNode *node = (bNode *)ptr->data;
+ MyTestNodeStorage *storage = (MyTestNodeStorage *)node->storage;
+ uiBut *but = uiDefButI(uiLayoutGetBlock(layout),
+ UI_BTYPE_NUM,
+ 0,
+ "X value",
+ 0,
+ 0,
+ 50,
+ 50,
+ &storage->x,
+ -1000,
+ 1000,
+ 3,
+ 20,
+ "my x value");
+ uiItemL(layout, "Hello World", 0);
+ UI_but_func_set(
+ but,
+ [](bContext *C, void *UNUSED(arg1), void *UNUSED(arg2)) {
+ bNodeTree *ntree = CTX_wm_space_node(C)->edittree;
+ ntree->update = NTREE_UPDATE;
+ ntreeUpdateTree(CTX_data_main(C), ntree);
+ },
+ nullptr,
+ nullptr);
+ };
+
+ nodeRegisterType(&ntype);
+ }
+ {
+ static bNodeType ntype;
+ setup_node_base(&ntype, "MyTestNode2", "Node 2", "Description", [](NodeBuilder &node_builder) {
+ node_builder.fixed_input("a", "A", *data_socket_float);
+ node_builder.fixed_input("b", "B", *data_socket_float);
+ node_builder.fixed_output("result", "Result", *data_socket_float);
+ });
+ nodeRegisterType(&ntype);
+ }
}
static bNodeSocketType *register_new_simple_socket_type(StringRefNull idname, rgba_f color)
@@ -454,8 +493,8 @@ void update_sim_node_tree(bNodeTree *ntree)
for (bNode *node : nodes) {
NodeDecl node_decl{*ntree, *node};
NodeBuilder builder{allocator, node_decl};
- DeclareNodeFunc fn = (DeclareNodeFunc)node->typeinfo->userdata;
- fn(builder);
+ NodeTypeCallbacks *callbacks = (NodeTypeCallbacks *)node->typeinfo->userdata;
+ callbacks->m_declare_node(builder);
if (!node_decl.sockets_are_correct()) {
std::cout << "Rebuild\n";
More information about the Bf-blender-cvs
mailing list