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
diff options
context:
space:
mode:
authorLukas Toenne <lukas.toenne@googlemail.com>2011-10-19 21:08:35 +0400
committerLukas Toenne <lukas.toenne@googlemail.com>2011-10-19 21:08:35 +0400
commit0d7bd0f9b63db4c7891137d18ae6a40e652e190f (patch)
treec0bebf306abc77c7ae35ccbb8672b862bd088cd5 /source/blender/blenkernel
parent408a2c62b974c10c7d19ad419dfca479dec59f65 (diff)
Adds an update flag to the bNode struct (similar to bNodeTree->update).
This prevents access to non-existent typeinfo during type initialization, when node types have been removed and such nodes are deleted from older files. All blenkernel functions now only set the node->update flag instead of directly calling the update function. All operators, etc. calling blenkernel functions to modify nodes should make a ntreeUpdate call afterward (they already did that anyway). Editor/RNA/renderer/etc. high-level functions still can do immediate updates by using nodeUpdate and nodeUpdateID (replacing NodeTagChanged/NodeTagIDChanged respectively). These old functions were previously used only for setting compositor node needexec flags and clearing cached data, but have become generic update functions that require type-specific functionality (i.e. a valid typeinfo struct).
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r--source/blender/blenkernel/BKE_node.h7
-rw-r--r--source/blender/blenkernel/intern/depsgraph.c2
-rw-r--r--source/blender/blenkernel/intern/image.c2
-rw-r--r--source/blender/blenkernel/intern/node.c52
4 files changed, 35 insertions, 28 deletions
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 1de3c295f4d..b75a8cb29ec 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -346,9 +346,8 @@ struct bNode *nodeGetActiveID(struct bNodeTree *ntree, short idtype);
int nodeSetActiveID(struct bNodeTree *ntree, short idtype, struct ID *id);
void nodeClearActiveID(struct bNodeTree *ntree, short idtype);
-void NodeTagChanged(struct bNodeTree *ntree, struct bNode *node);
-int NodeTagIDChanged(struct bNodeTree *ntree, struct ID *id);
-void ntreeClearTags(struct bNodeTree *ntree);
+void nodeUpdate(struct bNodeTree *ntree, struct bNode *node);
+int nodeUpdateID(struct bNodeTree *ntree, struct ID *id);
void nodeFreePreview(struct bNode *node);
@@ -601,7 +600,7 @@ void ntreeCompositTagRender(struct Scene *sce);
int ntreeCompositTagAnimated(struct bNodeTree *ntree);
void ntreeCompositTagGenerators(struct bNodeTree *ntree);
void ntreeCompositForceHidden(struct bNodeTree *ntree, struct Scene *scene);
-
+void ntreeCompositClearTags(struct bNodeTree *ntree);
/* ************** TEXTURE NODES *************** */
diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c
index 80a40c0a3a3..8d0c20ecc52 100644
--- a/source/blender/blenkernel/intern/depsgraph.c
+++ b/source/blender/blenkernel/intern/depsgraph.c
@@ -1962,7 +1962,7 @@ static void dag_tag_renderlayers(Scene *sce, unsigned int lay)
if(node->id==(ID *)sce) {
SceneRenderLayer *srl= BLI_findlink(&sce->r.layers, node->custom1);
if(srl && (srl->lay & lay_changed))
- NodeTagChanged(sce->nodetree, node);
+ nodeUpdate(sce->nodetree, node);
}
}
}
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index cf8f96c143a..1de581034a4 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -1514,7 +1514,7 @@ void BKE_image_signal(Image *ima, ImageUser *iuser, int signal)
Scene *scene;
for(scene= G.main->scene.first; scene; scene= scene->id.next) {
if(scene->nodetree) {
- NodeTagIDChanged(scene->nodetree, &ima->id);
+ nodeUpdateID(scene->nodetree, &ima->id);
}
}
}
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index f0be3c99f13..a46b358798a 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -184,7 +184,7 @@ bNodeSocket *nodeAddSocket(bNodeTree *ntree, bNode *node, int in_out, const char
else if (in_out==SOCK_OUT)
BLI_addtail(&node->outputs, sock);
- ntree->update |= NTREE_UPDATE_NODES;
+ node->update |= NODE_UPDATE;
return sock;
}
@@ -197,7 +197,7 @@ bNodeSocket *nodeInsertSocket(bNodeTree *ntree, bNode *node, int in_out, bNodeSo
else if (in_out==SOCK_OUT)
BLI_insertlinkbefore(&node->outputs, next_sock, sock);
- ntree->update |= NTREE_UPDATE_NODES;
+ node->update |= NODE_UPDATE;
return sock;
}
@@ -221,7 +221,7 @@ void nodeRemoveSocket(bNodeTree *ntree, bNode *node, bNodeSocket *sock)
MEM_freeN(sock->default_value);
MEM_freeN(sock);
- ntree->update |= NTREE_UPDATE_NODES;
+ node->update |= NODE_UPDATE;
}
void nodeRemoveAllSockets(bNodeTree *ntree, bNode *node)
@@ -246,7 +246,7 @@ void nodeRemoveAllSockets(bNodeTree *ntree, bNode *node)
BLI_freelistN(&node->outputs);
- ntree->update |= NTREE_UPDATE_NODES;
+ node->update |= NODE_UPDATE;
}
/* finds a node based on its name */
@@ -823,7 +823,7 @@ void nodeUnlinkNode(bNodeTree *ntree, bNode *node)
if(link->fromnode==node) {
lb= &node->outputs;
if (link->tonode)
- NodeTagChanged(ntree, link->tonode);
+ link->tonode->update |= NODE_UPDATE;
}
else if(link->tonode==node)
lb= &node->inputs;
@@ -1495,18 +1495,19 @@ void ntreeUpdateTree(bNodeTree *ntree)
/* update individual nodes */
for (n=0; n < totnodes; ++n) {
node = deplist[n];
- if (ntreetype->update_node)
- ntreetype->update_node(ntree, node);
- else if (node->typeinfo->updatefunc)
- node->typeinfo->updatefunc(ntree, node);
+
+ /* node tree update tags override individual node update flags */
+ if ((node->update & NODE_UPDATE) || (ntree->update & NTREE_UPDATE)) {
+ if (ntreetype->update_node)
+ ntreetype->update_node(ntree, node);
+ else if (node->typeinfo->updatefunc)
+ node->typeinfo->updatefunc(ntree, node);
+ }
+ /* clear update flag */
+ node->update = 0;
}
MEM_freeN(deplist);
-
- /* ensures only a single output node is enabled, texnode allows multiple though */
- if(ntree->type!=NTREE_TEXTURE)
- ntreeSetOutput(ntree);
-
}
/* general tree updates */
@@ -1518,6 +1519,9 @@ void ntreeUpdateTree(bNodeTree *ntree)
if (ntreetype->update)
ntreetype->update(ntree);
else {
+ /* Trees can be associated with a specific node type (i.e. group nodes),
+ * in that case a tree update function may be defined by that node type.
+ */
bNodeType *ntype= node_get_type(ntree, ntree->nodetype);
if (ntype && ntype->updatetreefunc)
ntype->updatetreefunc(ntree);
@@ -1530,24 +1534,24 @@ void ntreeUpdateTree(bNodeTree *ntree)
ntree->update = 0;
}
-void NodeTagChanged(bNodeTree *ntree, bNode *node)
+void nodeUpdate(bNodeTree *ntree, bNode *node)
{
- bNodeTreeType *ntreetype = ntreeGetType(ntree->type);
+ bNodeTreeType *ntreetype= ntreeGetType(ntree->type);
- /* extra null pointer checks here because this is called when unlinking
- unknown nodes on file load, so typeinfo pointers may not be set */
- if (ntreetype && ntreetype->update_node)
+ if (ntreetype->update_node)
ntreetype->update_node(ntree, node);
- else if (node->typeinfo && node->typeinfo->updatefunc)
+ else if (node->typeinfo->updatefunc)
node->typeinfo->updatefunc(ntree, node);
+ /* clear update flag */
+ node->update = 0;
}
-int NodeTagIDChanged(bNodeTree *ntree, ID *id)
+int nodeUpdateID(bNodeTree *ntree, ID *id)
{
bNodeTreeType *ntreetype;
bNode *node;
int change = FALSE;
-
+
if(ELEM(NULL, id, ntree))
return change;
@@ -1558,6 +1562,8 @@ int NodeTagIDChanged(bNodeTree *ntree, ID *id)
if(node->id==id) {
change = TRUE;
ntreetype->update_node(ntree, node);
+ /* clear update flag */
+ node->update = 0;
}
}
}
@@ -1567,6 +1573,8 @@ int NodeTagIDChanged(bNodeTree *ntree, ID *id)
change = TRUE;
if (node->typeinfo->updatefunc)
node->typeinfo->updatefunc(ntree, node);
+ /* clear update flag */
+ node->update = 0;
}
}
}