[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44569] trunk/blender/source/blender: A number of improvements for the file output node(s).

Lukas Toenne lukas.toenne at googlemail.com
Thu Mar 1 08:56:24 CET 2012


Revision: 44569
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44569
Author:   lukastoenne
Date:     2012-03-01 07:56:15 +0000 (Thu, 01 Mar 2012)
Log Message:
-----------
A number of improvements for the file output node(s).

1) Old CMP_NODE_OUTPUT_FILE and CMP_NODE_OUTPUT_MULTI_FILE have been merged,
only CMP_NODE_OUTPUT_FILE remains. All functions renamed accordingly.

2) do_versions code for converting single-file output nodes into multi-file
output nodes. If a Z buffer input is used, the node is made into a multilayer
exr with two inputs. (see below). Also re-identifies multi-file output nodes
with the CMP_NODE_OUTPUT_FILE type.

3) "Global" format is stored in node now. By default this overrides any
per-socket settings.

4) Multilayer EXR output implemented. When M.EXR format is selected for node
format, all socket format details are ignored. Socket names are used for layer
names.

5) Input buffer types are used as-is when possible, i.e. stored as B/W, RGB or
RGBA. In regular file output the format dictates the number of actual channels,
so the CompBuf is typechecked to the right type first. For multilayer EXR the
number of channels is more flexible, so an input buffer will store only the
channels it actually uses.

6) The editor socket type is updated from linked sockets as an indicator of the
actual data written to files. This may not be totally accurate for regular file
output though, due to restrictions of format setting.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_blender.h
    trunk/blender/source/blender/blenkernel/BKE_node.h
    trunk/blender/source/blender/blenkernel/intern/node.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/blenloader/intern/writefile.c
    trunk/blender/source/blender/editors/space_node/drawnode.c
    trunk/blender/source/blender/editors/space_node/node_edit.c
    trunk/blender/source/blender/editors/space_node/node_intern.h
    trunk/blender/source/blender/editors/space_node/node_ops.c
    trunk/blender/source/blender/makesdna/DNA_node_types.h
    trunk/blender/source/blender/makesrna/RNA_access.h
    trunk/blender/source/blender/makesrna/intern/rna_nodetree.c
    trunk/blender/source/blender/makesrna/intern/rna_nodetree_types.h
    trunk/blender/source/blender/nodes/CMakeLists.txt
    trunk/blender/source/blender/nodes/NOD_composite.h
    trunk/blender/source/blender/nodes/composite/nodes/node_composite_outputFile.c

Modified: trunk/blender/source/blender/blenkernel/BKE_blender.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_blender.h	2012-03-01 07:38:02 UTC (rev 44568)
+++ trunk/blender/source/blender/blenkernel/BKE_blender.h	2012-03-01 07:56:15 UTC (rev 44569)
@@ -42,7 +42,7 @@
  * and keep comment above the defines.
  * Use STRINGIFY() rather than defining with quotes */
 #define BLENDER_VERSION			262
-#define BLENDER_SUBVERSION		0
+#define BLENDER_SUBVERSION		1
 
 #define BLENDER_MINVERSION		250
 #define BLENDER_MINSUBVERSION	0

Modified: trunk/blender/source/blender/blenkernel/BKE_node.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_node.h	2012-03-01 07:38:02 UTC (rev 44568)
+++ trunk/blender/source/blender/blenkernel/BKE_node.h	2012-03-01 07:56:15 UTC (rev 44569)
@@ -364,6 +364,7 @@
 void			nodeFreePreview(struct bNode *node);
 
 int				nodeSocketIsHidden(struct bNodeSocket *sock);
+void			nodeSocketSetType(struct bNodeSocket *sock, int type);
 
 /* ************** NODE TYPE ACCESS *************** */
 
@@ -636,7 +637,7 @@
 #define CMP_NODE_TRANSFORM	264
 #define CMP_NODE_MOVIEDISTORTION	265
 #define CMP_NODE_DOUBLEEDGEMASK    266
-#define CMP_NODE_OUTPUT_MULTI_FILE	267
+#define CMP_NODE_OUTPUT_MULTI_FILE__DEPRECATED	267	/* DEPRECATED multi file node has been merged into regular CMP_NODE_OUTPUT_FILE */
 
 #define CMP_NODE_GLARE		301
 #define CMP_NODE_TONEMAP	302
@@ -676,8 +677,9 @@
 void ntreeCompositForceHidden(struct bNodeTree *ntree, struct Scene *scene);
 void ntreeCompositClearTags(struct bNodeTree *ntree);
 
-void ntreeCompositOutputMultiFileAddSocket(struct bNodeTree *ntree, struct bNode *node, struct ImageFormatData *im_format);
-int ntreeCompositOutputMultiFileRemoveActiveSocket(struct bNodeTree *ntree, struct bNode *node);
+struct bNodeSocket *ntreeCompositOutputFileAddSocket(struct bNodeTree *ntree, struct bNode *node,
+                                                     const char *name, struct ImageFormatData *im_format);
+int ntreeCompositOutputFileRemoveActiveSocket(struct bNodeTree *ntree, struct bNode *node);
 
 /* ************** TEXTURE NODES *************** */
 

Modified: trunk/blender/source/blender/blenkernel/intern/node.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/node.c	2012-03-01 07:38:02 UTC (rev 44568)
+++ trunk/blender/source/blender/blenkernel/intern/node.c	2012-03-01 07:56:15 UTC (rev 44569)
@@ -1369,6 +1369,19 @@
 	return ((sock->flag & (SOCK_HIDDEN | SOCK_AUTO_HIDDEN | SOCK_UNAVAIL)) != 0);
 }
 
+void nodeSocketSetType(bNodeSocket *sock, int type)
+{
+	int old_type = sock->type;
+	void *old_default_value = sock->default_value;
+	
+	sock->type = type;
+	
+	sock->default_value = node_socket_make_default_value(sock->type);
+	node_socket_init_default_value(type, sock->default_value);
+	node_socket_convert_default_value(sock->type, sock->default_value, old_type, old_default_value);
+	node_socket_free_default_value(old_type, old_default_value);
+}
+
 /* ************** dependency stuff *********** */
 
 /* node is guaranteed to be not checked before */
@@ -1839,7 +1852,6 @@
 	register_node_type_cmp_viewer(ttype);
 	register_node_type_cmp_splitviewer(ttype);
 	register_node_type_cmp_output_file(ttype);
-	register_node_type_cmp_output_multi_file(ttype);
 	register_node_type_cmp_view_levels(ttype);
 	
 	register_node_type_cmp_curve_rgb(ttype);

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2012-03-01 07:38:02 UTC (rev 44568)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2012-03-01 07:56:15 UTC (rev 44569)
@@ -7685,6 +7685,77 @@
 	}
 }
 
+static void do_versions_nodetree_multi_file_output_format_2_62_1(Scene *sce, bNodeTree *ntree)
+{
+	bNode *node;
+	bNodeSocket *sock;
+	
+	for (node=ntree->nodes.first; node; node=node->next) {
+		if (node->type==CMP_NODE_OUTPUT_FILE) {
+			/* previous CMP_NODE_OUTPUT_FILE nodes get converted to multi-file outputs */
+			NodeImageFile *old_data = node->storage;
+			NodeImageMultiFile *nimf= MEM_callocN(sizeof(NodeImageMultiFile), "node image multi file");
+			bNodeSocket *old_image = BLI_findlink(&node->inputs, 0);
+			bNodeSocket *old_z = BLI_findlink(&node->inputs, 1);
+			bNodeSocket *sock;
+			
+			node->storage= nimf;
+			
+			BLI_strncpy(nimf->base_path, old_data->name, sizeof(nimf->base_path));
+			nimf->format = old_data->im_format;
+			
+			/* if z buffer is saved, change the image type to multilayer exr.
+			 * XXX this is slightly messy, Z buffer was ignored before for anything but EXR and IRIS ...
+			 * i'm just assuming here that IRIZ means IRIS with z buffer ...
+			 */
+			if (ELEM(old_data->im_format.imtype, R_IMF_IMTYPE_IRIZ, R_IMF_IMTYPE_OPENEXR)) {
+				nimf->format.imtype = R_IMF_IMTYPE_MULTILAYER;
+				sock = ntreeCompositOutputFileAddSocket(ntree, node, old_image->name, &nimf->format);
+				if (old_image->link) {
+					old_image->link->tosock = sock;
+					sock->link = old_image->link;
+				}
+				sock = ntreeCompositOutputFileAddSocket(ntree, node, old_z->name, &nimf->format);
+				if (old_z->link) {
+					old_z->link->tosock = sock;
+					sock->link = old_z->link;
+				}
+			}
+			else {
+				/* saves directly to base path, which is the old image output path */
+				sock = ntreeCompositOutputFileAddSocket(ntree, node, "", &nimf->format);
+				if (old_image->link) {
+					old_image->link->tosock = sock;
+					sock->link = old_image->link;
+				}
+			}
+			
+			nodeRemoveSocket(ntree, node, old_image);
+			nodeRemoveSocket(ntree, node, old_z);
+			MEM_freeN(old_data);
+		}
+		else if (node->type==CMP_NODE_OUTPUT_MULTI_FILE__DEPRECATED) {
+			NodeImageMultiFile *nimf = node->storage;
+			
+			/* CMP_NODE_OUTPUT_MULTI_FILE has been redeclared as CMP_NODE_OUTPUT_FILE */
+			node->type = CMP_NODE_OUTPUT_FILE;
+			
+			/* initialize the node-wide image format from render data, if available */
+			if (sce)
+				nimf->format = sce->r.im_format;
+			
+			/* transfer render format toggle to node format toggle */
+			for (sock=node->inputs.first; sock; sock=sock->next) {
+				NodeImageMultiFileSocket *simf = sock->storage;
+				simf->use_node_format = simf->use_render_format;
+			}
+			
+			/* we do have preview now */
+			node->flag |= NODE_PREVIEW;
+		}
+	}
+}
+
 static void do_versions(FileData *fd, Library *lib, Main *main)
 {
 	/* WATCH IT!!!: pointers from libdata have not been converted */
@@ -13164,7 +13235,22 @@
 		}
 	}
 
+	if (main->versionfile < 262 || (main->versionfile == 262 && main->subversionfile < 1))
+	{
+		/* update use flags for node sockets (was only temporary before) */
+		Scene *sce;
+		bNodeTree *ntree;
+		
+		for (sce=main->scene.first; sce; sce=sce->id.next)
+			if (sce->nodetree)
+				do_versions_nodetree_multi_file_output_format_2_62_1(sce, sce->nodetree);
+		
+		/* XXX can't associate with scene for group nodes, image format will stay uninitialized */
+		for (ntree=main->nodetree.first; ntree; ntree=ntree->id.next)
+			do_versions_nodetree_multi_file_output_format_2_62_1(NULL, ntree);
+	}
 
+
 	/* WATCH IT!!!: pointers from libdata have not been converted yet here! */
 	/* WATCH IT 2!: Userdef struct init has to be in editors/interface/resources.c! */
 

Modified: trunk/blender/source/blender/blenloader/intern/writefile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/writefile.c	2012-03-01 07:38:02 UTC (rev 44568)
+++ trunk/blender/source/blender/blenloader/intern/writefile.c	2012-03-01 07:56:15 UTC (rev 44569)
@@ -727,7 +727,7 @@
 				writestruct(wd, DATA, node->typeinfo->storagename, 1, node->storage);
 		}
 		
-		if (node->type==CMP_NODE_OUTPUT_MULTI_FILE) {
+		if (node->type==CMP_NODE_OUTPUT_FILE) {
 			/* inputs have own storage data */
 			for (sock=node->inputs.first; sock; sock=sock->next)
 				writestruct(wd, DATA, "NodeImageMultiFileSocket", 1, sock->storage);

Modified: trunk/blender/source/blender/editors/space_node/drawnode.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/drawnode.c	2012-03-01 07:38:02 UTC (rev 44568)
+++ trunk/blender/source/blender/editors/space_node/drawnode.c	2012-03-01 07:56:15 UTC (rev 44569)
@@ -102,25 +102,72 @@
 	uiDefBut(block, LABEL, 0, sock->name, x, y, width, NODE_DY, NULL, 0, 0, 0, 0, "");
 }
 
+/* draw function for file output node sockets.
+ * XXX a bit ugly use atm, called from datatype button functions,
+ * since all node types and callbacks only use data type without struct_type.
+ */
+static void node_socket_button_output_file(const bContext *C, uiBlock *block,
+                                           bNodeTree *ntree, bNode *node, bNodeSocket *sock,
+                                           const char *UNUSED(name), int x, int y, int width)
+{
+	uiLayout *layout, *row;
+	PointerRNA nodeptr, sockptr, imfptr;
+	int imtype;
+	int rx, ry;
+	RNA_pointer_create(&ntree->id, &RNA_Node, node, &nodeptr);
+	RNA_pointer_create(&ntree->id, &RNA_NodeSocket, sock, &sockptr);
+	
+	layout = uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, x, y+NODE_DY, width, 20, UI_GetStyle());
+	row = uiLayoutRow(layout, 0);		
+	
+	uiItemL(row, sock->name, 0);
+	
+	imfptr = RNA_pointer_get(&nodeptr, "format");
+	imtype = RNA_enum_get(&imfptr, "file_format");
+	/* in multilayer format all socket format details are ignored */
+	if (imtype != R_IMF_IMTYPE_MULTILAYER) {
+		PropertyRNA *imtype_prop;
+		const char *imtype_name;
+		
+		if (!RNA_boolean_get(&sockptr, "use_node_format"))
+			imfptr = RNA_pointer_get(&sockptr, "format");
+		
+		imtype_prop = RNA_struct_find_property(&imfptr, "file_format");
+		RNA_property_enum_name((bContext*)C, &imfptr, imtype_prop, RNA_property_enum_get(&imfptr, imtype_prop), &imtype_name);
+		uiBlockSetEmboss(block, UI_EMBOSSP);
+		uiItemL(row, imtype_name, 0);
+		uiBlockSetEmboss(block, UI_EMBOSSN);
+	}
+	
+	uiBlockLayoutResolve(block, &rx, &ry);
+}
 
 static void node_socket_button_default(const bContext *C, uiBlock *block,
 								bNodeTree *ntree, bNode *node, bNodeSocket *sock,
 								const char *name, int x, int y, int width)
 {
-	if (sock->link || (sock->flag & SOCK_HIDE_VALUE))

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list