[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60065] trunk/blender/source/blender: Fix #36706: Added complementary API functions for the FileOutput node so file/ layer slots (input sockets) can be added without using the operator.

Lukas Toenne lukas.toenne at googlemail.com
Thu Sep 12 10:43:26 CEST 2013


Revision: 60065
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60065
Author:   lukastoenne
Date:     2013-09-12 08:43:25 +0000 (Thu, 12 Sep 2013)
Log Message:
-----------
Fix #36706: Added complementary API functions for the FileOutput node so file/layer slots (input sockets) can be added without using the operator. Instead of adding sockets to these node using the
node.inputs collection, the node.file_slots or node.layer_slots collections should be used. Both of them work, they just provide slightly different properties for use with simple files or multi-layer
EXR.

The FileOutput node design is cumbersome and should be considered broken. It should eventually be replaced, the problem with that is backward/forward compatibility.

Modified Paths:
--------------
    trunk/blender/source/blender/makesrna/intern/rna_nodetree.c
    trunk/blender/source/blender/nodes/NOD_static_types.h

Modified: trunk/blender/source/blender/makesrna/intern/rna_nodetree.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_nodetree.c	2013-09-12 08:43:24 UTC (rev 60064)
+++ trunk/blender/source/blender/makesrna/intern/rna_nodetree.c	2013-09-12 08:43:25 UTC (rev 60065)
@@ -2726,6 +2726,23 @@
 	}
 }
 
+static bNodeSocket *rna_NodeOutputFile_slots_new(ID *id, bNode *node, bContext *C, ReportList *UNUSED(reports), const char *name)
+{
+	bNodeTree *ntree = (bNodeTree *)id;
+	Scene *scene = CTX_data_scene(C);
+	ImageFormatData *im_format = NULL;
+	bNodeSocket *sock;
+	if (scene)
+		im_format = &scene->r.im_format;
+	
+	sock = ntreeCompositOutputFileAddSocket(ntree, node, name, im_format);
+	
+	ntreeUpdateTree(CTX_data_main(C), ntree);
+	WM_main_add_notifier(NC_NODE | NA_EDITED, ntree);
+	
+	return sock;
+}
+
 static void rna_ShaderNodeScript_mode_set(PointerRNA *ptr, int value)
 {
 	bNode *node = (bNode *)ptr->data;
@@ -4111,8 +4128,50 @@
 	RNA_def_property_ui_text(prop, "Name", "OpenEXR layer name used for this slot");
 	RNA_def_property_update(prop, NC_NODE | NA_EDITED, NULL);
 }
-static void def_cmp_output_file(StructRNA *srna)
+static void rna_def_cmp_output_file_slots_api(BlenderRNA *brna, PropertyRNA *cprop, const char *struct_name)
 {
+	StructRNA *srna;
+	PropertyRNA *parm;
+	FunctionRNA *func;
+
+	RNA_def_property_srna(cprop, struct_name);
+	srna = RNA_def_struct(brna, struct_name, NULL);
+	RNA_def_struct_sdna(srna, "bNode");
+	RNA_def_struct_ui_text(srna, "File Output Slots", "Collection of File Output node slots");
+
+	func = RNA_def_function(srna, "new", "rna_NodeOutputFile_slots_new");
+	RNA_def_function_ui_description(func, "Add a file slot to this node");
+	RNA_def_function_flag(func, FUNC_USE_SELF_ID | FUNC_USE_REPORTS | FUNC_USE_CONTEXT);
+	parm = RNA_def_string(func, "name", "", MAX_NAME, "Name", "");
+	RNA_def_property_flag(parm, PROP_REQUIRED);
+	/* return value */
+	parm = RNA_def_pointer(func, "socket", "NodeSocket", "", "New socket");
+	RNA_def_function_return(func, parm);
+
+	/* NB: methods below can use the standard node socket API functions,
+	 * included here for completeness.
+	 */
+
+	func = RNA_def_function(srna, "remove", "rna_Node_socket_remove");
+	RNA_def_function_ui_description(func, "Remove a file slot from this node");
+	RNA_def_function_flag(func, FUNC_USE_SELF_ID | FUNC_USE_REPORTS);
+	parm = RNA_def_pointer(func, "socket", "NodeSocket", "", "The socket to remove");
+	RNA_def_property_flag(parm, PROP_REQUIRED);
+
+	func = RNA_def_function(srna, "clear", "rna_Node_inputs_clear");
+	RNA_def_function_ui_description(func, "Remove all file slots from this node");
+	RNA_def_function_flag(func, FUNC_USE_SELF_ID);
+
+	func = RNA_def_function(srna, "move", "rna_Node_inputs_move");
+	RNA_def_function_ui_description(func, "Move a file slot to another position");
+	RNA_def_function_flag(func, FUNC_USE_SELF_ID);
+	parm = RNA_def_int(func, "from_index", -1, 0, INT_MAX, "From Index", "Index of the socket to move", 0, 10000);
+	RNA_def_property_flag(parm, PROP_REQUIRED);
+	parm = RNA_def_int(func, "to_index", -1, 0, INT_MAX, "To Index", "Target index for the socket", 0, 10000);
+	RNA_def_property_flag(parm, PROP_REQUIRED);
+}
+static void def_cmp_output_file(BlenderRNA *brna, StructRNA *srna)
+{
 	PropertyRNA *prop;
 	
 	RNA_def_struct_sdna_from(srna, "NodeImageMultiFile", "storage");
@@ -4139,12 +4198,14 @@
 	                                  "rna_NodeOutputFile_slot_file_get", NULL, NULL, NULL, NULL);
 	RNA_def_property_struct_type(prop, "NodeOutputFileSlotFile");
 	RNA_def_property_ui_text(prop, "File Slots", "");
+	rna_def_cmp_output_file_slots_api(brna, prop, "CompositorNodeOutputFileFileSlots");
 	
 	prop = RNA_def_property(srna, "layer_slots", PROP_COLLECTION, PROP_NONE);
 	RNA_def_property_collection_funcs(prop, "rna_NodeOutputFile_slots_begin", "rna_iterator_listbase_next", "rna_iterator_listbase_end",
 	                                  "rna_NodeOutputFile_slot_layer_get", NULL, NULL, NULL, NULL);
 	RNA_def_property_struct_type(prop, "NodeOutputFileSlotLayer");
 	RNA_def_property_ui_text(prop, "EXR Layer Slots", "");
+	rna_def_cmp_output_file_slots_api(brna, prop, "CompositorNodeOutputFileLayerSlots");
 }
 
 static void def_cmp_dilate_erode(StructRNA *srna)
@@ -7386,8 +7447,8 @@
 	RNA_def_struct_ui_icon(srna, ICON_TEXTURE);
 }
 
-static void define_specific_node(BlenderRNA *brna, const char *struct_name, const char *base_name,
-                                 const char *ui_name, const char *ui_desc, void (*def_func)(StructRNA *))
+static StructRNA *define_specific_node(BlenderRNA *brna, const char *struct_name, const char *base_name,
+                                       const char *ui_name, const char *ui_desc, void (*def_func)(StructRNA *))
 {
 	StructRNA *srna;
 	FunctionRNA *func;
@@ -7434,6 +7495,8 @@
 
 	if (def_func)
 		def_func(srna);
+
+	return srna;
 }
 
 static void rna_def_node_instance_hash(BlenderRNA *brna)
@@ -7451,6 +7514,8 @@
 
 void RNA_def_nodetree(BlenderRNA *brna)
 {
+	StructRNA *srna;
+	
 	rna_def_node_socket(brna);
 	rna_def_node_socket_interface(brna);
 	
@@ -7471,7 +7536,13 @@
 	rna_def_texture_nodetree(brna);
 	
 	#define DefNode(Category, ID, DefFunc, EnumName, StructName, UIName, UIDesc) \
-		define_specific_node(brna, #Category #StructName, #Category, UIName, UIDesc, DefFunc);
+	{ \
+		srna = define_specific_node(brna, #Category #StructName, #Category, UIName, UIDesc, DefFunc); \
+		if (ID == CMP_NODE_OUTPUT_FILE) { \
+			/* needs brna argument, can't use NOD_static_types.h */ \
+			def_cmp_output_file(brna, srna); \
+		} \
+	}
 	
 	/* hack, don't want to add include path to RNA just for this, since in the future RNA types
 	 * for nodes should be defined locally at runtime anyway ...

Modified: trunk/blender/source/blender/nodes/NOD_static_types.h
===================================================================
--- trunk/blender/source/blender/nodes/NOD_static_types.h	2013-09-12 08:43:24 UTC (rev 60064)
+++ trunk/blender/source/blender/nodes/NOD_static_types.h	2013-09-12 08:43:25 UTC (rev 60065)
@@ -142,7 +142,8 @@
 DefNode( CompositorNode, CMP_NODE_IMAGE,          def_cmp_image,          "IMAGE",          Image,            "Image",             ""              )
 DefNode( CompositorNode, CMP_NODE_R_LAYERS,       def_cmp_render_layers,  "R_LAYERS",       RLayers,          "Render Layers",     ""              )
 DefNode( CompositorNode, CMP_NODE_COMPOSITE,      def_cmp_composite,      "COMPOSITE",      Composite,        "Composite",         ""              )
-DefNode( CompositorNode, CMP_NODE_OUTPUT_FILE,    def_cmp_output_file,    "OUTPUT_FILE",    OutputFile,       "File Output",       ""              )
+/* NB: OutputFile node has special rna setup function called in rna_nodetree.c */
+DefNode( CompositorNode, CMP_NODE_OUTPUT_FILE,    0,                      "OUTPUT_FILE",    OutputFile,       "File Output",       ""              )
 DefNode( CompositorNode, CMP_NODE_TEXTURE,        def_texture,            "TEXTURE",        Texture,          "Texture",           ""              )
 DefNode( CompositorNode, CMP_NODE_TRANSLATE,      def_cmp_translate,      "TRANSLATE",      Translate,        "Translate",         ""              )
 DefNode( CompositorNode, CMP_NODE_ZCOMBINE,       def_cmp_zcombine,       "ZCOMBINE",       Zcombine,         "Z Combine",         ""              )




More information about the Bf-blender-cvs mailing list