Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorJacques Lucke <jacques@blender.org>2021-11-11 14:51:20 +0300
committerJacques Lucke <jacques@blender.org>2021-11-11 14:51:20 +0300
commitd57ec78e6ec4c4669296a6b837d8cd86123b30cc (patch)
treea1048f2c21e60a8339281f7f9b058ab33bea3503 /source
parent1d614fcfb1e723fa0940a567d39ae73290f1526c (diff)
progress
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/BKE_node_tree_update.h9
-rw-r--r--source/blender/blenkernel/intern/node_tree_update.cc28
-rw-r--r--source/blender/editors/space_node/CMakeLists.txt1
-rw-r--r--source/blender/editors/space_node/node_edit.cc78
-rw-r--r--source/blender/makesdna/DNA_node_types.h27
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, &params);
+}
+
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. */