diff options
author | Jacques Lucke <jacques@blender.org> | 2021-11-11 14:51:20 +0300 |
---|---|---|
committer | Jacques Lucke <jacques@blender.org> | 2021-11-11 14:51:20 +0300 |
commit | d57ec78e6ec4c4669296a6b837d8cd86123b30cc (patch) | |
tree | a1048f2c21e60a8339281f7f9b058ab33bea3503 /source | |
parent | 1d614fcfb1e723fa0940a567d39ae73290f1526c (diff) |
progress
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/BKE_node_tree_update.h | 9 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/node_tree_update.cc | 28 | ||||
-rw-r--r-- | source/blender/editors/space_node/CMakeLists.txt | 1 | ||||
-rw-r--r-- | source/blender/editors/space_node/node_edit.cc | 78 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_node_types.h | 27 |
5 files changed, 120 insertions, 23 deletions
diff --git a/source/blender/blenkernel/BKE_node_tree_update.h b/source/blender/blenkernel/BKE_node_tree_update.h index d43e1ba88b2..e54fef2c31e 100644 --- a/source/blender/blenkernel/BKE_node_tree_update.h +++ b/source/blender/blenkernel/BKE_node_tree_update.h @@ -24,6 +24,7 @@ struct bNode; struct bNodeSocket; struct bNodeTree; struct Main; +struct ID; #ifdef __cplusplus extern "C" { @@ -50,23 +51,25 @@ typedef struct NodeTreeUpdateExtraParams { */ struct bNodeTree *only_tagged_tree; + void *user_data; + /** * Called for every tree that has been changed during the update. This can be used to send * notifiers to trigger redraws or depsgraph updates. */ - void (*tree_changed_fn)(struct bNodeTree *); + void (*tree_changed_fn)(struct ID *, struct bNodeTree *, void *user_data); /** * Called for every tree whose interface (e.g. input sockets) changed in some way. Other * (non-node-tree) data blocks may have to update when that happens. */ - void (*tree_interface_changed_fn)(struct bNodeTree *); + void (*tree_interface_changed_fn)(struct ID *, struct bNodeTree *, void *user_data); /** * Called for every tree whose output value may have changed based on the provided update tags. * This can be used to tag the depsgraph if necessary. */ - void (*tree_output_changed_fn)(struct bNodeTree *); + void (*tree_output_changed_fn)(struct ID *, struct bNodeTree *, void *user_data); } NodeTreeUpdateExtraParams; void BKE_node_tree_update(struct Main *bmain, struct NodeTreeUpdateExtraParams *params); diff --git a/source/blender/blenkernel/intern/node_tree_update.cc b/source/blender/blenkernel/intern/node_tree_update.cc index fe275e50087..0079628945e 100644 --- a/source/blender/blenkernel/intern/node_tree_update.cc +++ b/source/blender/blenkernel/intern/node_tree_update.cc @@ -16,34 +16,52 @@ #include "BLI_map.hh" +#include "DNA_node_types.h" + +#include "BKE_node.h" #include "BKE_node_tree_update.h" void BKE_node_tree_update_tag(bNodeTree *tree) { + tree->changed_flag |= NTREE_CHANGED_ANY; UNUSED_VARS(tree); } void BKE_node_tree_update_tag_node(bNodeTree *tree, bNode *node) { - UNUSED_VARS(tree, node); + tree->changed_flag |= NTREE_CHANGED_NODE; + node->changed_flag |= NODE_CHANGED_ANY; } void BKE_node_tree_update_tag_socket(bNodeTree *tree, bNodeSocket *socket) { - UNUSED_VARS(tree, socket); + tree->changed_flag |= NTREE_CHANGED_SOCKET; + socket->changed_flag |= SOCK_CHANGED_ANY; } void BKE_node_tree_update_tag_node_removed(bNodeTree *tree) { - UNUSED_VARS(tree); + tree->changed_flag |= NTREE_CHANGED_REMOVED_ANY; } void BKE_node_tree_update_tag_link_removed(bNodeTree *tree) { - UNUSED_VARS(tree); + tree->changed_flag |= NTREE_CHANGED_REMOVED_ANY; } void BKE_node_tree_update(Main *bmain, NodeTreeUpdateExtraParams *params) { - UNUSED_VARS(bmain, params); + FOREACH_NODETREE_BEGIN (bmain, ntree, id) { + ntreeUpdateTree(bmain, ntree); + if (params->tree_changed_fn) { + params->tree_changed_fn(id, ntree, params->user_data); + } + if (params->tree_interface_changed_fn) { + params->tree_interface_changed_fn(id, ntree, params->user_data); + } + if (params->tree_output_changed_fn) { + params->tree_output_changed_fn(id, ntree, params->user_data); + } + } + FOREACH_NODETREE_END; } diff --git a/source/blender/editors/space_node/CMakeLists.txt b/source/blender/editors/space_node/CMakeLists.txt index 600309c2c86..677032d42bf 100644 --- a/source/blender/editors/space_node/CMakeLists.txt +++ b/source/blender/editors/space_node/CMakeLists.txt @@ -29,6 +29,7 @@ set(INC ../../imbuf ../../makesdna ../../makesrna + ../../modifiers ../../nodes ../../render ../../windowmanager diff --git a/source/blender/editors/space_node/node_edit.cc b/source/blender/editors/space_node/node_edit.cc index 1a4903e2cfe..d746f703cc6 100644 --- a/source/blender/editors/space_node/node_edit.cc +++ b/source/blender/editors/space_node/node_edit.cc @@ -27,6 +27,7 @@ #include "DNA_light_types.h" #include "DNA_material_types.h" +#include "DNA_modifier_types.h" #include "DNA_node_types.h" #include "DNA_text_types.h" #include "DNA_world_types.h" @@ -41,6 +42,7 @@ #include "BKE_main.h" #include "BKE_material.h" #include "BKE_node.h" +#include "BKE_node_tree_update.h" #include "BKE_report.h" #include "BKE_scene.h" #include "BKE_workspace.h" @@ -63,6 +65,8 @@ #include "RNA_define.h" #include "RNA_enum_types.h" +#include "MOD_nodes.h" + #include "WM_api.h" #include "WM_types.h" @@ -440,27 +444,75 @@ void snode_notify(bContext *C, SpaceNode *snode) } } -void ED_node_tree_propagate_change(bContext *C, Main *bmain, bNodeTree *only_tagged_tree) +static void handle_tree_change(ID *id, bNodeTree *ntree) { - if (C != nullptr) { - SpaceNode *snode = CTX_wm_space_node(C); - if (snode != nullptr) { - snode_notify(C, snode); - snode_dag_update(C, snode); + WM_main_add_notifier(NC_NODE | NA_EDITED, nullptr); + + if (ntree->type == NTREE_SHADER) { + if (GS(id->name) == ID_MA) { + WM_main_add_notifier(NC_MATERIAL | ND_SHADING, id); + } + else if (GS(id->name) == ID_LA) { + WM_main_add_notifier(NC_LAMP | ND_LIGHTING, id); + } + else if (GS(id->name) == ID_WO) { + WM_main_add_notifier(NC_WORLD | ND_WORLD, id); } } - if (only_tagged_tree != nullptr) { - ntreeUpdateTree(bmain, only_tagged_tree); - ED_node_tag_update_nodetree(bmain, only_tagged_tree, nullptr); + else if (ntree->type == NTREE_COMPOSIT) { + WM_main_add_notifier(NC_SCENE | ND_NODES, id); } - else { - FOREACH_NODETREE_BEGIN (bmain, tree, id) { - ntreeUpdateTree(bmain, tree); + else if (ntree->type == NTREE_TEXTURE) { + WM_main_add_notifier(NC_TEXTURE | ND_NODES, id); + } + else if (ntree->type == NTREE_GEOMETRY) { + WM_main_add_notifier(NC_OBJECT | ND_MODIFIER, id); + } +} + +static void handle_tree_interface_change(Main *bmain, bNodeTree *ntree) +{ + if (ntree->type != NTREE_GEOMETRY) { + return; + } + LISTBASE_FOREACH (Object *, object, &bmain->objects) { + LISTBASE_FOREACH (ModifierData *, md, &object->modifiers) { + if (md->type == eModifierType_Nodes) { + NodesModifierData *nmd = (NodesModifierData *)md; + if (nmd->node_group == ntree) { + MOD_nodes_update_interface(object, nmd); + } + } } - FOREACH_NODETREE_END; } } +void ED_node_tree_propagate_change(bContext *UNUSED(C), Main *bmain, bNodeTree *only_tagged_tree) +{ + struct UserData { + Main *bmain; + } user_data = {bmain}; + + NodeTreeUpdateExtraParams params = {0}; + params.only_tagged_tree = only_tagged_tree; + params.user_data = &user_data; + params.tree_changed_fn = [](ID *id, bNodeTree *ntree, void *UNUSED(user_data)) { + handle_tree_change(id, ntree); + }; + params.tree_interface_changed_fn = [](ID *UNUSED(id), bNodeTree *ntree, void *user_data) { + UserData *data = (UserData *)user_data; + handle_tree_interface_change(data->bmain, ntree); + }; + params.tree_output_changed_fn = [](ID *id, bNodeTree *ntree, void *UNUSED(user_data)) { + if (id != nullptr) { + DEG_id_tag_update(id, 0); + } + DEG_id_tag_update(&ntree->id, 0); + }; + + BKE_node_tree_update(bmain, ¶ms); +} + void ED_node_set_tree_type(SpaceNode *snode, bNodeTreeType *typeinfo) { if (typeinfo) { diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index cfe34d83586..c275e2aacc6 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -172,6 +172,9 @@ typedef struct bNodeSocket { * data. It has to be updated when the node declaration changes. */ const SocketDeclarationHandle *declaration; + + uint8_t changed_flag; + char _pad[7]; } bNodeSocket; /* sock->type */ @@ -261,7 +264,7 @@ typedef struct bNode { /** Used as a boolean for execution. */ uint8_t need_exec; - char _pad[1]; + uint8_t changed_flag; /** Custom user-defined color. */ float color[3]; @@ -551,7 +554,8 @@ typedef struct bNodeTree { * in case multiple different editors are used and make context ambiguous. */ bNodeInstanceKey active_viewer_key; - char _pad[4]; + char _pad[3]; + uint8_t changed_flag; /** Execution data. * @@ -576,6 +580,25 @@ typedef struct bNodeTree { struct PreviewImage *preview; } bNodeTree; +/** bNodeSocket->changed_flag */ +typedef enum eNodeSocketChangedFlag { + SOCK_CHANGED_NONE = 0, + SOCK_CHANGED_ANY = (1 << 0), +} eNodeSocketChangedFlag; + +typedef enum eNodeChangedFlag { + NODE_CHANGED_NONE = 0, + NODE_CHANGED_ANY = (1 << 0), +} eNodeChangedFlag; + +typedef enum eNodeTreeChangedFlag { + NTREE_CHANGED_None = 0, + NTREE_CHANGED_ANY = (1 << 0), + NTREE_CHANGED_SOCKET = (1 << 1), + NTREE_CHANGED_NODE = (1 << 2), + NTREE_CHANGED_REMOVED_ANY = (1 << 3), +} eNodeTreeChangedFlag; + /* ntree->type, index */ #define NTREE_UNDEFINED -2 /* Represents #NodeTreeTypeUndefined type. */ |