[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57410] trunk/blender/source/blender: Fix #35703, Viewer node doesn't updates image sometimes.

Lukas Toenne lukas.toenne at googlemail.com
Wed Jun 12 13:26:45 CEST 2013


Revision: 57410
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57410
Author:   lukastoenne
Date:     2013-06-12 11:26:44 +0000 (Wed, 12 Jun 2013)
Log Message:
-----------
Fix #35703, Viewer node doesn't updates image sometimes. The viewer node was not getting correctly initialized node->id pointer to the Viewer image (thanks to Sergey for figuring that out). The original
proposal was to add another special init hack for the viewer node->id, but rather would do it right and so moved all the special init hacks for constant ID backpointers (Scene for RenderLayer, Composite,
Defocus, FileOutput and MovieClip for MovieClip, MovieDistortion and Stabilization nodes). These are now part of the local init callbacks functions of the appropriate nodes, using the new initfunc_api
callback which takes a Context pointer, so they have access to Scene.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_node.h
    trunk/blender/source/blender/blenkernel/intern/node.c
    trunk/blender/source/blender/editors/space_node/node_add.c
    trunk/blender/source/blender/makesrna/intern/rna_nodetree.c
    trunk/blender/source/blender/makesrna/intern/rna_scene.c
    trunk/blender/source/blender/nodes/NOD_composite.h
    trunk/blender/source/blender/nodes/composite/node_composite_tree.c
    trunk/blender/source/blender/nodes/composite/nodes/node_composite_composite.c
    trunk/blender/source/blender/nodes/composite/nodes/node_composite_defocus.c
    trunk/blender/source/blender/nodes/composite/nodes/node_composite_image.c
    trunk/blender/source/blender/nodes/composite/nodes/node_composite_movieclip.c
    trunk/blender/source/blender/nodes/composite/nodes/node_composite_moviedistortion.c
    trunk/blender/source/blender/nodes/composite/nodes/node_composite_outputFile.c
    trunk/blender/source/blender/nodes/composite/nodes/node_composite_splitViewer.c
    trunk/blender/source/blender/nodes/composite/nodes/node_composite_stabilize2d.c
    trunk/blender/source/blender/nodes/composite/nodes/node_composite_viewer.c

Modified: trunk/blender/source/blender/blenkernel/BKE_node.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_node.h	2013-06-12 10:39:27 UTC (rev 57409)
+++ trunk/blender/source/blender/blenkernel/BKE_node.h	2013-06-12 11:26:44 UTC (rev 57410)
@@ -925,7 +925,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 ntreeCompositForceHidden(struct bNodeTree *ntree);
 void ntreeCompositClearTags(struct bNodeTree *ntree);
 
 struct bNodeSocket *ntreeCompositOutputFileAddSocket(struct bNodeTree *ntree, struct bNode *node,

Modified: trunk/blender/source/blender/blenkernel/intern/node.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/node.c	2013-06-12 10:39:27 UTC (rev 57409)
+++ trunk/blender/source/blender/blenkernel/intern/node.c	2013-06-12 11:26:44 UTC (rev 57410)
@@ -150,6 +150,9 @@
 		ntype->initfunc_api(C, &ptr);
 	}
 	
+	if (node->id)
+		id_us_plus(node->id);
+	
 	node->flag |= NODE_INIT;
 }
 

Modified: trunk/blender/source/blender/editors/space_node/node_add.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/node_add.c	2013-06-12 10:39:27 UTC (rev 57409)
+++ trunk/blender/source/blender/editors/space_node/node_add.c	2013-06-12 11:26:44 UTC (rev 57410)
@@ -64,13 +64,11 @@
 
 /* XXX Does some additional initialization on top of nodeAddNode
  * Can be used with both custom and static nodes, if idname==NULL the static int type will be used instead.
- * Can be called from menus too, but they should do own undopush and redraws.
  */
 bNode *node_add_node(const bContext *C, const char *idname, int type, float locx, float locy)
 {
 	SpaceNode *snode = CTX_wm_space_node(C);
 	Main *bmain = CTX_data_main(C);
-	Scene *scene = CTX_data_scene(C);
 	bNode *node = NULL;
 	
 	node_deselect_all(snode);
@@ -96,20 +94,6 @@
 	ntreeUpdateTree(bmain, snode->edittree);
 	ED_node_set_active(bmain, snode->edittree, node);
 	
-	if (snode->nodetree->type == NTREE_COMPOSIT) {
-		if (ELEM4(node->type, CMP_NODE_R_LAYERS, CMP_NODE_COMPOSITE, CMP_NODE_DEFOCUS, CMP_NODE_OUTPUT_FILE)) {
-			node->id = &scene->id;
-		}
-		else if (ELEM3(node->type, CMP_NODE_MOVIECLIP, CMP_NODE_MOVIEDISTORTION, CMP_NODE_STABILIZE2D)) {
-			node->id = (ID *)scene->clip;
-		}
-		
-		ntreeCompositForceHidden(snode->edittree, scene);
-	}
-	
-	if (node->id)
-		id_us_plus(node->id);
-	
 	if (snode->flag & SNODE_USE_HIDDEN_PREVIEW)
 		node->flag &= ~NODE_PREVIEW;
 	

Modified: trunk/blender/source/blender/makesrna/intern/rna_nodetree.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_nodetree.c	2013-06-12 10:39:27 UTC (rev 57409)
+++ trunk/blender/source/blender/makesrna/intern/rna_nodetree.c	2013-06-12 11:26:44 UTC (rev 57410)
@@ -724,23 +724,7 @@
 	node = nodeAddNode(C, ntree, type);
 	BLI_assert(node && node->typeinfo);
 	
-	/* XXX ugly stuff, should be done with specialized operators (after actual node creation)! */
-	if (ntree->type == NTREE_COMPOSIT) {
-		if (ELEM4(node->type, CMP_NODE_COMPOSITE, CMP_NODE_DEFOCUS, CMP_NODE_OUTPUT_FILE, CMP_NODE_R_LAYERS)) {
-			/* annoying, find the node tree we are in, scene can be NULL */
-			Scene *scene;
-			for (scene = CTX_data_main(C)->scene.first; scene; scene = scene->id.next) {
-				if (scene->nodetree == ntree) {
-					break;
-				}
-			}
-			node->id = (ID *)scene;
-			id_us_plus(node->id);
-		}
-		
-		ntreeCompositForceHidden(ntree, CTX_data_scene(C));
-	}
-	else if (ntree->type == NTREE_TEXTURE) {
+	if (ntree->type == NTREE_TEXTURE) {
 		ntreeTexCheckCyclics(ntree);
 	}
 	

Modified: trunk/blender/source/blender/makesrna/intern/rna_scene.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_scene.c	2013-06-12 10:39:27 UTC (rev 57409)
+++ trunk/blender/source/blender/makesrna/intern/rna_scene.c	2013-06-12 11:26:44 UTC (rev 57410)
@@ -1195,7 +1195,7 @@
 	Scene *scene = (Scene *)ptr->id.data;
 
 	if (scene->nodetree)
-		ntreeCompositForceHidden(scene->nodetree, scene);
+		ntreeCompositForceHidden(scene->nodetree);
 	
 	rna_Scene_glsl_update(bmain, activescene, ptr);
 }

Modified: trunk/blender/source/blender/nodes/NOD_composite.h
===================================================================
--- trunk/blender/source/blender/nodes/NOD_composite.h	2013-06-12 10:39:27 UTC (rev 57409)
+++ trunk/blender/source/blender/nodes/NOD_composite.h	2013-06-12 11:26:44 UTC (rev 57410)
@@ -138,4 +138,6 @@
 void register_node_type_cmp_pixelate(void);
 void register_node_type_cmp_trackpos(void);
 
+void node_cmp_rlayers_force_hidden_passes(struct bNode *node);
+
 #endif

Modified: trunk/blender/source/blender/nodes/composite/node_composite_tree.c
===================================================================
--- trunk/blender/source/blender/nodes/composite/node_composite_tree.c	2013-06-12 10:39:27 UTC (rev 57409)
+++ trunk/blender/source/blender/nodes/composite/node_composite_tree.c	2013-06-12 11:26:44 UTC (rev 57410)
@@ -74,7 +74,7 @@
 	*r_ntree = scene->nodetree;
 	
 	/* update output sockets based on available layers */
-	ntreeCompositForceHidden(scene->nodetree, scene);
+	ntreeCompositForceHidden(scene->nodetree);
 	
 }
 
@@ -262,69 +262,17 @@
 
 /* *********************************************** */
 
-static void set_output_visible(bNode *node, int passflag, int index, int pass)
-{
-	bNodeSocket *sock = BLI_findlink(&node->outputs, index);
-	/* clear the SOCK_HIDDEN flag as well, in case a socket was hidden before */
-	if (passflag & pass)
-		sock->flag &= ~(SOCK_HIDDEN | SOCK_UNAVAIL);
-	else
-		sock->flag |= SOCK_UNAVAIL;
-}
-
-/* clumsy checking... should do dynamic outputs once */
-static void force_hidden_passes(bNode *node, int passflag)
-{
-	bNodeSocket *sock;
-	
-	for (sock = node->outputs.first; sock; sock = sock->next)
-		sock->flag &= ~SOCK_UNAVAIL;
-	
-	set_output_visible(node, passflag, RRES_OUT_IMAGE,            SCE_PASS_COMBINED);
-	set_output_visible(node, passflag, RRES_OUT_ALPHA,            SCE_PASS_COMBINED);
-	
-	set_output_visible(node, passflag, RRES_OUT_Z,                SCE_PASS_Z);
-	set_output_visible(node, passflag, RRES_OUT_NORMAL,           SCE_PASS_NORMAL);
-	set_output_visible(node, passflag, RRES_OUT_VEC,              SCE_PASS_VECTOR);
-	set_output_visible(node, passflag, RRES_OUT_UV,               SCE_PASS_UV);
-	set_output_visible(node, passflag, RRES_OUT_RGBA,             SCE_PASS_RGBA);
-	set_output_visible(node, passflag, RRES_OUT_DIFF,             SCE_PASS_DIFFUSE);
-	set_output_visible(node, passflag, RRES_OUT_SPEC,             SCE_PASS_SPEC);
-	set_output_visible(node, passflag, RRES_OUT_SHADOW,           SCE_PASS_SHADOW);
-	set_output_visible(node, passflag, RRES_OUT_AO,               SCE_PASS_AO);
-	set_output_visible(node, passflag, RRES_OUT_REFLECT,          SCE_PASS_REFLECT);
-	set_output_visible(node, passflag, RRES_OUT_REFRACT,          SCE_PASS_REFRACT);
-	set_output_visible(node, passflag, RRES_OUT_INDIRECT,         SCE_PASS_INDIRECT);
-	set_output_visible(node, passflag, RRES_OUT_INDEXOB,          SCE_PASS_INDEXOB);
-	set_output_visible(node, passflag, RRES_OUT_INDEXMA,          SCE_PASS_INDEXMA);
-	set_output_visible(node, passflag, RRES_OUT_MIST,             SCE_PASS_MIST);
-	set_output_visible(node, passflag, RRES_OUT_EMIT,             SCE_PASS_EMIT);
-	set_output_visible(node, passflag, RRES_OUT_ENV,              SCE_PASS_ENVIRONMENT);
-	set_output_visible(node, passflag, RRES_OUT_DIFF_DIRECT,      SCE_PASS_DIFFUSE_DIRECT);
-	set_output_visible(node, passflag, RRES_OUT_DIFF_INDIRECT,    SCE_PASS_DIFFUSE_INDIRECT);
-	set_output_visible(node, passflag, RRES_OUT_DIFF_COLOR,       SCE_PASS_DIFFUSE_COLOR);
-	set_output_visible(node, passflag, RRES_OUT_GLOSSY_DIRECT,    SCE_PASS_GLOSSY_DIRECT);
-	set_output_visible(node, passflag, RRES_OUT_GLOSSY_INDIRECT,  SCE_PASS_GLOSSY_INDIRECT);
-	set_output_visible(node, passflag, RRES_OUT_GLOSSY_COLOR,     SCE_PASS_GLOSSY_COLOR);
-	set_output_visible(node, passflag, RRES_OUT_TRANSM_DIRECT,    SCE_PASS_TRANSM_DIRECT);
-	set_output_visible(node, passflag, RRES_OUT_TRANSM_INDIRECT,  SCE_PASS_TRANSM_INDIRECT);
-	set_output_visible(node, passflag, RRES_OUT_TRANSM_COLOR,     SCE_PASS_TRANSM_COLOR);
-}
-
 /* based on rules, force sockets hidden always */
-void ntreeCompositForceHidden(bNodeTree *ntree, Scene *curscene)
+void ntreeCompositForceHidden(bNodeTree *ntree)
 {
 	bNode *node;
 
 	if (ntree == NULL) return;
 
 	for (node = ntree->nodes.first; node; node = node->next) {
-		if (node->type == CMP_NODE_R_LAYERS) {
-			Scene *sce = node->id ? (Scene *)node->id : curscene;
-			SceneRenderLayer *srl = BLI_findlink(&sce->r.layers, node->custom1);
-			if (srl)
-				force_hidden_passes(node, srl->passflag);
-		}
+		if (node->type == CMP_NODE_R_LAYERS)
+			node_cmp_rlayers_force_hidden_passes(node);
+		
 		/* XXX this stuff is called all the time, don't want that.
 		 * Updates should only happen when actually necessary.
 		 */

Modified: trunk/blender/source/blender/nodes/composite/nodes/node_composite_composite.c
===================================================================
--- trunk/blender/source/blender/nodes/composite/nodes/node_composite_composite.c	2013-06-12 10:39:27 UTC (rev 57409)
+++ trunk/blender/source/blender/nodes/composite/nodes/node_composite_composite.c	2013-06-12 11:26:44 UTC (rev 57410)
@@ -31,6 +31,10 @@
 
 #include "node_composite_util.h"
 
+#include "BKE_context.h"
+
+#include "RNA_access.h"
+
 /* **************** COMPOSITE ******************** */
 static bNodeSocketTemplate cmp_node_composite_in[] = {
 	{	SOCK_RGBA, 1, N_("Image"),		0.0f, 0.0f, 0.0f, 1.0f},
@@ -39,12 +43,21 @@
 	{	-1, 0, ""	}
 };
 
+static void init(const bContext *C, PointerRNA *ptr)
+{
+	Scene *scene = CTX_data_scene(C);
+	bNode *node = ptr->data;
+	
+	node->id = &scene->id;
+}
+
 void register_node_type_cmp_composite(void)
 {
 	static bNodeType ntype;
 
 	cmp_node_type_base(&ntype, CMP_NODE_COMPOSITE, "Composite", NODE_CLASS_OUTPUT, NODE_PREVIEW);
 	node_type_socket_templates(&ntype, cmp_node_composite_in, NULL);
+	ntype.initfunc_api = init;
 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list