[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [41115] trunk/blender/source/blender: Adds an update flag to the bNode struct (similar to bNodeTree->update).
Lukas Toenne
lukas.toenne at googlemail.com
Wed Oct 19 19:08:36 CEST 2011
Revision: 41115
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41115
Author: lukastoenne
Date: 2011-10-19 17:08:35 +0000 (Wed, 19 Oct 2011)
Log Message:
-----------
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).
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/BKE_node.h
trunk/blender/source/blender/blenkernel/intern/depsgraph.c
trunk/blender/source/blender/blenkernel/intern/image.c
trunk/blender/source/blender/blenkernel/intern/node.c
trunk/blender/source/blender/editors/render/render_internal.c
trunk/blender/source/blender/editors/space_node/node_draw.c
trunk/blender/source/blender/editors/space_node/node_edit.c
trunk/blender/source/blender/editors/space_node/space_node.c
trunk/blender/source/blender/makesdna/DNA_node_types.h
trunk/blender/source/blender/makesrna/intern/rna_nodetree.c
trunk/blender/source/blender/nodes/composite/node_composite_tree.c
trunk/blender/source/blender/nodes/intern/node_common.c
trunk/blender/source/blender/nodes/shader/node_shader_tree.c
trunk/blender/source/blender/nodes/texture/node_texture_tree.c
trunk/blender/source/blender/render/intern/source/pipeline.c
Modified: trunk/blender/source/blender/blenkernel/BKE_node.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_node.h 2011-10-19 12:46:30 UTC (rev 41114)
+++ trunk/blender/source/blender/blenkernel/BKE_node.h 2011-10-19 17:08:35 UTC (rev 41115)
@@ -346,9 +346,8 @@
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,9 +600,9 @@
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 *************** */
struct TexResult;
Modified: trunk/blender/source/blender/blenkernel/intern/depsgraph.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/depsgraph.c 2011-10-19 12:46:30 UTC (rev 41114)
+++ trunk/blender/source/blender/blenkernel/intern/depsgraph.c 2011-10-19 17:08:35 UTC (rev 41115)
@@ -1962,7 +1962,7 @@
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);
}
}
}
Modified: trunk/blender/source/blender/blenkernel/intern/image.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/image.c 2011-10-19 12:46:30 UTC (rev 41114)
+++ trunk/blender/source/blender/blenkernel/intern/image.c 2011-10-19 17:08:35 UTC (rev 41115)
@@ -1514,7 +1514,7 @@
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);
}
}
}
Modified: trunk/blender/source/blender/blenkernel/intern/node.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/node.c 2011-10-19 12:46:30 UTC (rev 41114)
+++ trunk/blender/source/blender/blenkernel/intern/node.c 2011-10-19 17:08:35 UTC (rev 41115)
@@ -184,7 +184,7 @@
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 @@
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 @@
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 @@
BLI_freelistN(&node->outputs);
- ntree->update |= NTREE_UPDATE_NODES;
+ node->update |= NODE_UPDATE;
}
/* finds a node based on its name */
@@ -823,7 +823,7 @@
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 @@
/* 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 @@
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 @@
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 @@
if(node->id==id) {
change = TRUE;
ntreetype->update_node(ntree, node);
+ /* clear update flag */
+ node->update = 0;
}
}
}
@@ -1567,6 +1573,8 @@
change = TRUE;
if (node->typeinfo->updatefunc)
node->typeinfo->updatefunc(ntree, node);
+ /* clear update flag */
+ node->update = 0;
}
}
}
Modified: trunk/blender/source/blender/editors/render/render_internal.c
===================================================================
--- trunk/blender/source/blender/editors/render/render_internal.c 2011-10-19 12:46:30 UTC (rev 41114)
+++ trunk/blender/source/blender/editors/render/render_internal.c 2011-10-19 17:08:35 UTC (rev 41115)
@@ -398,13 +398,13 @@
ED_update_for_newframe(G.main, rj->scene, rj->win->screen, 1);
/* XXX above function sets all tags in nodes */
- ntreeClearTags(rj->scene->nodetree);
+ ntreeCompositClearTags(rj->scene->nodetree);
/* potentially set by caller */
rj->scene->r.scemode &= ~R_NO_FRAME_UPDATE;
if(rj->srl) {
- NodeTagIDChanged(rj->scene->nodetree, &rj->scene->id);
+ nodeUpdateID(rj->scene->nodetree, &rj->scene->id);
WM_main_add_notifier(NC_NODE|NA_EDITED, rj->scene);
}
Modified: trunk/blender/source/blender/editors/space_node/node_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/node_draw.c 2011-10-19 12:46:30 UTC (rev 41114)
+++ trunk/blender/source/blender/editors/space_node/node_draw.c 2011-10-19 17:08:35 UTC (rev 41115)
@@ -102,12 +102,12 @@
WM_main_add_notifier(NC_MATERIAL|ND_SHADING_DRAW, id);
}
else if(treetype==NTREE_COMPOSIT) {
- NodeTagChanged(edittree, node);
+ nodeUpdate(edittree, node);
/* don't use NodeTagIDChanged, it gives far too many recomposites for image, scene layers, ... */
node= node_tree_get_editgroup(nodetree);
if(node)
- NodeTagIDChanged(nodetree, node->id);
+ nodeUpdateID(nodetree, node->id);
WM_main_add_notifier(NC_SCENE|ND_NODES, id);
}
Modified: trunk/blender/source/blender/editors/space_node/node_edit.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/node_edit.c 2011-10-19 12:46:30 UTC (rev 41114)
+++ trunk/blender/source/blender/editors/space_node/node_edit.c 2011-10-19 17:08:35 UTC (rev 41115)
@@ -496,17 +496,17 @@
node_tree_from_ID(snode->id, &snode->nodetree, &snode->edittree, NULL);
}
-static void snode_tag_changed(SpaceNode *snode, bNode *node)
+static void snode_update(SpaceNode *snode, bNode *node)
{
bNode *gnode;
if (node)
- NodeTagChanged(snode->edittree, node);
+ nodeUpdate(snode->edittree, node);
/* if inside group, tag entire group */
gnode= node_tree_get_editgroup(snode->nodetree);
if(gnode)
- NodeTagIDChanged(snode->nodetree, gnode->id);
+ nodeUpdateID(snode->nodetree, gnode->id);
}
static int has_nodetree(bNodeTree *ntree, bNodeTree *lookup)
@@ -1775,7 +1775,7 @@
link->fromsock= sock;
}
ntreeUpdateTree(snode->edittree);
- snode_tag_changed(snode, node);
+ snode_update(snode, node);
}
}
}
@@ -2127,7 +2127,7 @@
continue;
}
- snode_tag_changed(snode, node_to);
+ snode_update(snode, node_to);
++numlinks;
break;
}
@@ -2175,7 +2175,7 @@
if(node->id)
id_us_plus(node->id);
- snode_tag_changed(snode, node);
+ snode_update(snode, node);
}
if(snode->nodetree->type==NTREE_TEXTURE) {
@@ -2412,7 +2412,7 @@
case MIDDLEMOUSE:
if(link->tosock && link->fromsock) {
/* send changed events for original tonode and new */
- snode_tag_changed(snode, link->tonode);
+ snode_update(snode, link->tonode);
/* we might need to remove a link */
if(in_out==SOCK_OUT)
@@ -2495,7 +2495,7 @@
if(link) {
/* send changed event to original tonode */
if(link->tonode)
- snode_tag_changed(snode, link->tonode);
+ snode_update(snode, link->tonode);
nldrag->node= link->fromnode;
nldrag->sock= link->fromsock;
@@ -2663,7 +2663,7 @@
next= link->next;
if(cut_links_intersect(link, mcoords, i)) {
- snode_tag_changed(snode, link->tonode);
+ snode_update(snode, link->tonode);
nodeRemLink(snode->edittree, link);
}
}
@@ -2794,7 +2794,7 @@
nodeAddLink(snode->edittree, select, socket_best_match(&select->outputs, sockto->type), node, sockto);
ntreeUpdateTree(snode->edittree); /* needed for pointers */
- snode_tag_changed(snode, select);
+ snode_update(snode, select);
ED_node_changed_update(snode->id, select);
}
}
@@ -3198,7 +3198,7 @@
/* Be able to mute in-/output nodes as well. - DingTo
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list