[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [45696] trunk/blender/source/blender: Dynamic output sockets for the image input node.

Lukas Toenne lukas.toenne at googlemail.com
Mon Apr 16 15:49:33 CEST 2012


Revision: 45696
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45696
Author:   lukastoenne
Date:     2012-04-16 13:49:33 +0000 (Mon, 16 Apr 2012)
Log Message:
-----------
Dynamic output sockets for the image input node. This is needed to enable the node to read arbitrary multilayer exr files. Output sockets of this node are now generated dynamically when the image is updated. The image buffer has to be loaded to detect multilayer files on update.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/node.c
    trunk/blender/source/blender/makesrna/intern/rna_nodetree.c
    trunk/blender/source/blender/nodes/composite/node_composite_tree.c
    trunk/blender/source/blender/nodes/composite/nodes/node_composite_image.c

Modified: trunk/blender/source/blender/blenkernel/intern/node.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/node.c	2012-04-16 13:49:04 UTC (rev 45695)
+++ trunk/blender/source/blender/blenkernel/intern/node.c	2012-04-16 13:49:33 UTC (rev 45696)
@@ -1616,6 +1616,7 @@
 		for (node= ntree->nodes.first; node; node= node->next) {
 			if (node->id==id) {
 				change = TRUE;
+				node->update |= NODE_UPDATE_ID;
 				ntreetype->update_node(ntree, node);
 				/* clear update flag */
 				node->update = 0;
@@ -1626,6 +1627,7 @@
 		for (node= ntree->nodes.first; node; node= node->next) {
 			if (node->id==id) {
 				change = TRUE;
+				node->update |= NODE_UPDATE_ID;
 				if (node->typeinfo->updatefunc)
 					node->typeinfo->updatefunc(ntree, node);
 				/* clear update flag */

Modified: trunk/blender/source/blender/makesrna/intern/rna_nodetree.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_nodetree.c	2012-04-16 13:49:04 UTC (rev 45695)
+++ trunk/blender/source/blender/makesrna/intern/rna_nodetree.c	2012-04-16 13:49:33 UTC (rev 45696)
@@ -357,7 +357,7 @@
 	node_update(bmain, scene, ntree, node);
 }
 
-static void rna_Node_image_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+static void rna_Node_tex_image_update(Main *bmain, Scene *scene, PointerRNA *ptr)
 {
 	bNodeTree *ntree = (bNodeTree*)ptr->id.data;
 	bNode *node = (bNode*)ptr->data;
@@ -1299,7 +1299,7 @@
 	RNA_def_property_struct_type(prop, "Image");
 	RNA_def_property_flag(prop, PROP_EDITABLE);
 	RNA_def_property_ui_text(prop, "Image", "");
-	RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_image_update");
+	RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_tex_image_update");
 
 	RNA_def_struct_sdna_from(srna, "NodeTexEnvironment", "storage");
 	def_sh_tex(srna);
@@ -1333,7 +1333,7 @@
 	RNA_def_property_struct_type(prop, "Image");
 	RNA_def_property_flag(prop, PROP_EDITABLE);
 	RNA_def_property_ui_text(prop, "Image", "");
-	RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_image_update");
+	RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_tex_image_update");
 
 	RNA_def_struct_sdna_from(srna, "NodeTexImage", "storage");
 	def_sh_tex(srna);

Modified: trunk/blender/source/blender/nodes/composite/node_composite_tree.c
===================================================================
--- trunk/blender/source/blender/nodes/composite/node_composite_tree.c	2012-04-16 13:49:04 UTC (rev 45695)
+++ trunk/blender/source/blender/nodes/composite/node_composite_tree.c	2012-04-16 13:49:33 UTC (rev 45696)
@@ -757,26 +757,14 @@
 			if (srl)
 				force_hidden_passes(node, srl->passflag);
 		}
+		/* XXX this stuff is called all the time, don't want that.
+		 * Updates should only happen when actually necessary.
+		 */
+		#if 0
 		else if ( node->type==CMP_NODE_IMAGE) {
-			Image *ima= (Image *)node->id;
-			if (ima) {
-				if (ima->rr) {
-					ImageUser *iuser= node->storage;
-					RenderLayer *rl= BLI_findlink(&ima->rr->layers, iuser->layer);
-					if (rl)
-						force_hidden_passes(node, rl->passflag);
-					else
-						force_hidden_passes(node, RRES_OUT_IMAGE|RRES_OUT_ALPHA);
-				}
-				else if (ima->type!=IMA_TYPE_MULTILAYER) {	/* if ->rr not yet read we keep inputs */
-					force_hidden_passes(node, RRES_OUT_IMAGE|RRES_OUT_ALPHA|RRES_OUT_Z);
-				}
-				else
-					force_hidden_passes(node, RRES_OUT_IMAGE|RRES_OUT_ALPHA);
-			}
-			else
-				force_hidden_passes(node, RRES_OUT_IMAGE|RRES_OUT_ALPHA);
+			nodeUpdate(ntree, node);
 		}
+		#endif
 	}
 
 }

Modified: trunk/blender/source/blender/nodes/composite/nodes/node_composite_image.c
===================================================================
--- trunk/blender/source/blender/nodes/composite/nodes/node_composite_image.c	2012-04-16 13:49:04 UTC (rev 45695)
+++ trunk/blender/source/blender/nodes/composite/nodes/node_composite_image.c	2012-04-16 13:49:33 UTC (rev 45696)
@@ -32,7 +32,6 @@
 
 #include "node_composite_util.h"
 
-
 /* **************** IMAGE (and RenderResult, multilayer image) ******************** */
 
 static bNodeSocketTemplate cmp_node_rlayers_out[]= {
@@ -67,6 +66,212 @@
 	{	-1, 0, ""	}
 };
 
+static bNodeSocket *cmp_node_image_add_render_pass_output(bNodeTree *ntree, bNode *node, int UNUSED(pass), int rres_index)
+{
+	bNodeSocket *sock;
+	
+	sock = node_add_output_from_template(ntree, node, &cmp_node_rlayers_out[rres_index]);
+	/* for render pass outputs store the pass type index as a lookup key */
+	sock->storage = SET_INT_IN_POINTER(rres_index);
+	
+	return sock;
+}
+
+static void cmp_node_image_add_render_pass_outputs(bNodeTree *ntree, bNode *node, int passflag)
+{
+	if (passflag & SCE_PASS_COMBINED) {
+		cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_COMBINED, RRES_OUT_IMAGE);
+		cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_COMBINED, RRES_OUT_ALPHA);
+	}
+	
+	if (passflag & SCE_PASS_Z)
+		cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_Z, RRES_OUT_Z);
+	if (passflag & SCE_PASS_NORMAL)
+		cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_NORMAL, RRES_OUT_NORMAL);
+	if (passflag & SCE_PASS_VECTOR)
+		cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_VECTOR, RRES_OUT_VEC);
+	if (passflag & SCE_PASS_UV)
+		cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_UV, RRES_OUT_UV);
+	if (passflag & SCE_PASS_RGBA)
+		cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_RGBA, RRES_OUT_RGBA);
+	if (passflag & SCE_PASS_DIFFUSE)
+		cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_DIFFUSE, RRES_OUT_DIFF);
+	if (passflag & SCE_PASS_SPEC)
+		cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_SPEC, RRES_OUT_SPEC);
+	if (passflag & SCE_PASS_SHADOW)
+		cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_SHADOW, RRES_OUT_SHADOW);
+	if (passflag & SCE_PASS_AO)
+		cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_AO, RRES_OUT_AO);
+	if (passflag & SCE_PASS_REFLECT)
+		cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_REFLECT, RRES_OUT_REFLECT);
+	if (passflag & SCE_PASS_REFRACT)
+		cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_REFRACT, RRES_OUT_REFRACT);
+	if (passflag & SCE_PASS_INDIRECT)
+		cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_INDIRECT, RRES_OUT_INDIRECT);
+	if (passflag & SCE_PASS_INDEXOB)
+		cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_INDEXOB, RRES_OUT_INDEXOB);
+	if (passflag & SCE_PASS_INDEXMA)
+		cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_INDEXMA, RRES_OUT_INDEXMA);
+	if (passflag & SCE_PASS_MIST)
+		cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_MIST, RRES_OUT_MIST);
+	if (passflag & SCE_PASS_EMIT)
+		cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_EMIT, RRES_OUT_EMIT);
+	if (passflag & SCE_PASS_ENVIRONMENT)
+		cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_ENVIRONMENT, RRES_OUT_ENV);
+	
+	if (passflag & SCE_PASS_DIFFUSE_DIRECT)
+		cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_DIFFUSE_DIRECT, RRES_OUT_DIFF_DIRECT);
+	if (passflag & SCE_PASS_DIFFUSE_INDIRECT)
+		cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_DIFFUSE_INDIRECT, RRES_OUT_DIFF_INDIRECT);
+	if (passflag & SCE_PASS_DIFFUSE_COLOR)
+		cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_DIFFUSE_COLOR, RRES_OUT_DIFF_COLOR);
+	
+	if (passflag & SCE_PASS_GLOSSY_DIRECT)
+		cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_GLOSSY_DIRECT, RRES_OUT_GLOSSY_DIRECT);
+	if (passflag & SCE_PASS_GLOSSY_INDIRECT)
+		cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_GLOSSY_INDIRECT, RRES_OUT_GLOSSY_INDIRECT);
+	if (passflag & SCE_PASS_GLOSSY_COLOR)
+		cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_GLOSSY_COLOR, RRES_OUT_GLOSSY_COLOR);
+	
+	if (passflag & SCE_PASS_TRANSM_DIRECT)
+		cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_TRANSM_DIRECT, RRES_OUT_TRANSM_DIRECT);
+	if (passflag & SCE_PASS_TRANSM_INDIRECT)
+		cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_TRANSM_INDIRECT, RRES_OUT_TRANSM_INDIRECT);
+	if (passflag & SCE_PASS_TRANSM_COLOR)
+		cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_TRANSM_COLOR, RRES_OUT_TRANSM_COLOR);
+}
+
+static void cmp_node_image_add_multilayer_outputs(bNodeTree *ntree, bNode *node, RenderLayer *rl)
+{
+	bNodeSocket *sock;
+	RenderPass *rpass;
+	int index;
+	for (rpass=rl->passes.first, index=0; rpass; rpass=rpass->next, ++index) {
+		int type;
+		if (rpass->channels == 1)
+			type = SOCK_FLOAT;
+		else
+			type = SOCK_RGBA;
+		
+		sock = nodeAddSocket(ntree, node, SOCK_OUT, rpass->name, type);
+		/* for multilayer image use pass index directly as key */
+		sock->storage = SET_INT_IN_POINTER(index);
+	}
+}
+
+static void cmp_node_image_create_outputs(bNodeTree *ntree, bNode *node)
+{
+	Image *ima= (Image *)node->id;
+	if (ima) {
+		ImageUser *iuser= node->storage;
+		
+		/* make sure ima->type is correct */
+		BKE_image_get_ibuf(ima, iuser);
+		
+		if (ima->rr) {
+			RenderLayer *rl= BLI_findlink(&ima->rr->layers, iuser->layer);
+			
+			if (rl) {
+				if (ima->type!=IMA_TYPE_MULTILAYER)
+					cmp_node_image_add_render_pass_outputs(ntree, node, rl->passflag);
+				else
+					cmp_node_image_add_multilayer_outputs(ntree, node, rl);
+			}
+			else
+				cmp_node_image_add_render_pass_outputs(ntree, node, RRES_OUT_IMAGE|RRES_OUT_ALPHA);
+		}
+		else
+			cmp_node_image_add_render_pass_outputs(ntree, node, RRES_OUT_IMAGE|RRES_OUT_ALPHA|RRES_OUT_Z);
+	}
+	else
+		cmp_node_image_add_render_pass_outputs(ntree, node, RRES_OUT_IMAGE|RRES_OUT_ALPHA);
+}
+
+static bNodeSocket *cmp_node_image_output_find_match(bNode *UNUSED(node), bNodeSocket *newsock, ListBase *oldsocklist)
+{
+	bNodeSocket *sock;
+	
+	for (sock=oldsocklist->first; sock; sock=sock->next)
+		if (strcmp(sock->name, newsock->name)==0)
+			return sock;
+	return NULL;
+}
+
+static bNodeSocket *cmp_node_image_output_relink(bNode *node, bNodeSocket *oldsock, int oldindex)
+{
+	bNodeSocket *sock;
+	
+	/* first try to find matching socket name */
+	for (sock=node->outputs.first; sock; sock=sock->next)
+		if (strcmp(sock->name, oldsock->name)==0)
+			return sock;
+	
+	/* no matching name, simply link to same index */
+	return BLI_findlink(&node->outputs, oldindex);
+}
+

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list