Revision: 46542
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46542
Author:   lukastoenne
Date:     2012-05-11 08:06:01 +0000 (Fri, 11 May 2012)
Log Message:
-----------
A couple more changes to the file and image nodes to improve access to layers 
that don't follow Blender's rlayer.rpass naming scheme.

--- Changes to File Output node ---
* Flat layer names in EXR multilayer files.

 For a socket with name "AAA" the previous resulting EXR layer name would be 
"AAA.AAA", i.e. the render layer as well as render pass would use the socket 
name.

 Now the "render_layer.render_pass" scheme is ignored in multilayer files, 
socket names are directly written to EXR layers (EXR layer name is "AAA" in 
this example). If sockets should have a notion of "render layer" this can still 
be achieved by explicitly adding a separator, e.g. "AAA.BBB". When loading such 
layers into a Blender Image struct, the name is interpreted as a 
"render_layer.render_pass" again (although the image node does not care about 
it, see below).

* Socket sub-paths (for singlelayer) or layer names (for multilayer) are stored 
in dedicated string variables in the socket storage data. This way the RNA can 
define precise string subtypes (PROP_FILEPATH) and length. The file/layer slots 
are defined as separate structs with own name properties in the RNA as well, so 
they can be used nicely with the list template.

* Ensure unique socket paths/layer names to prevent overwriting of files and 
layers respectively.

--- Changes to Image node ---
* Loading multilayer OpenEXR files has improved layer name splitting into 
render layer + render pass names now. This properly supports arbitrary EXR 
layer names now.
  Example:

 OpenEXR layer name:   AAA.BBB.CCC

 is split into

 Render layer name:    AAA.BBB
 Render pass name:     CCC

 If the layer name has no '.' separators the render layer name is empty.

* Image node ignores the selected render layer in the image user data. Instead 
all existing layers are displayed at the same time by combining the render 
layer names with render pass names again, to reconstruct the original EXR layer 
name. This avoids the problem that render layers with empty name are not 
selectetable in the dropdown and allows using all image layers at the same time 
without duplicating the node.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_blender.h
    trunk/blender/source/blender/blenkernel/BKE_node.h
    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/imbuf/intern/openexr/openexr_api.cpp
    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/nodes/composite/nodes/node_composite_image.c
    
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-05-11 
08:05:47 UTC (rev 46541)
+++ trunk/blender/source/blender/blenkernel/BKE_blender.h       2012-05-11 
08:06:01 UTC (rev 46542)
@@ -42,7 +42,7 @@
  * and keep comment above the defines.
  * Use STRINGIFY() rather than defining with quotes */
 #define BLENDER_VERSION                        263
-#define BLENDER_SUBVERSION             4
+#define BLENDER_SUBVERSION             5
 
 #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-05-11 08:05:47 UTC 
(rev 46541)
+++ trunk/blender/source/blender/blenkernel/BKE_node.h  2012-05-11 08:06:01 UTC 
(rev 46542)
@@ -684,6 +684,11 @@
 struct bNodeSocket *ntreeCompositOutputFileAddSocket(struct bNodeTree *ntree, 
struct bNode *node,
                                                      const char *name, struct 
ImageFormatData *im_format);
 int ntreeCompositOutputFileRemoveActiveSocket(struct bNodeTree *ntree, struct 
bNode *node);
+void ntreeCompositOutputFileSetPath(struct bNode *node, struct bNodeSocket 
*sock, const char *name);
+void ntreeCompositOutputFileSetLayer(struct bNode *node, struct bNodeSocket 
*sock, const char *name);
+/* needed in do_versions */
+void ntreeCompositOutputFileUniquePath(struct ListBase *list, struct 
bNodeSocket *sock, const char defname[], char delim);
+void ntreeCompositOutputFileUniqueLayer(struct ListBase *list, struct 
bNodeSocket *sock, const char defname[], char delim);
 
 /* ************** TEXTURE NODES *************** */
 

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c   2012-05-11 
08:05:47 UTC (rev 46541)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c   2012-05-11 
08:06:01 UTC (rev 46542)
@@ -6840,6 +6840,52 @@
        }
 }
 
+static void do_versions_nodetree_file_output_layers_2_64_5(bNodeTree *ntree)
+{
+       bNode *node;
+       
+       for (node=ntree->nodes.first; node; node=node->next) {
+               if (node->type==CMP_NODE_OUTPUT_FILE) {
+                       bNodeSocket *sock;
+                       for (sock=node->inputs.first; sock; sock=sock->next) {
+                               NodeImageMultiFileSocket *input = sock->storage;
+                               
+                               /* multilayer names are stored as separate 
strings now,
+                                * used the path string before, so copy it over.
+                                */
+                               BLI_strncpy(input->layer, input->path, 
sizeof(input->layer));
+                               
+                               /* paths/layer names also have to be unique 
now, initial check */
+                               
ntreeCompositOutputFileUniquePath(&node->inputs, sock, input->path, '_');
+                               
ntreeCompositOutputFileUniqueLayer(&node->inputs, sock, input->layer, '_');
+                       }
+               }
+       }
+}
+
+static void do_versions_nodetree_image_layer_2_64_5(bNodeTree *ntree)
+{
+       bNode *node;
+       
+       for (node=ntree->nodes.first; node; node=node->next) {
+               if (node->type==CMP_NODE_IMAGE) {
+                       ImageUser *iuser= (ImageUser *)node->storage;
+                       bNodeSocket *sock;
+                       for (sock=node->outputs.first; sock; sock=sock->next) {
+                               NodeImageLayer *output = 
MEM_callocN(sizeof(NodeImageLayer), "node image layer");
+                               
+                               /* take layer index from image user (this is 
ignored from now on) */
+                               output->layer_index = iuser->layer;
+                               /* take pass index both from current storage 
ptr (actually an int) */
+                               output->pass_index = 
GET_INT_FROM_POINTER(sock->storage);
+                               
+                               /* replace socket data pointer */
+                               sock->storage = output;
+                       }
+               }
+       }
+}
+
 static void do_versions(FileData *fd, Library *lib, Main *main)
 {
        /* WATCH IT!!!: pointers from libdata have not been converted */
@@ -7456,6 +7502,26 @@
                }
        }
 
+       if (main->versionfile < 263 || (main->versionfile == 263 && 
main->subversionfile < 5))
+       {
+               {
+                       /* file output node paths are now stored in the file 
info struct instead socket name */
+                       Scene *sce;
+                       bNodeTree *ntree;
+                       
+                       for (sce = main->scene.first; sce; sce=sce->id.next) {
+                               if (sce->nodetree) {
+                                       
do_versions_nodetree_file_output_layers_2_64_5(sce->nodetree);
+                                       
do_versions_nodetree_image_layer_2_64_5(sce->nodetree);
+                               }
+                       }
+                       for (ntree = main->nodetree.first; ntree; 
ntree=ntree->id.next) {
+                               
do_versions_nodetree_file_output_layers_2_64_5(ntree);
+                               do_versions_nodetree_image_layer_2_64_5(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-05-11 
08:05:47 UTC (rev 46541)
+++ trunk/blender/source/blender/blenloader/intern/writefile.c  2012-05-11 
08:06:01 UTC (rev 46542)
@@ -734,6 +734,11 @@
                        for (sock=node->inputs.first; sock; sock=sock->next)
                                writestruct(wd, DATA, 
"NodeImageMultiFileSocket", 1, sock->storage);
                }
+               if (node->type==CMP_NODE_IMAGE) {
+                       /* write extra socket info */
+                       for (sock=node->outputs.first; sock; sock=sock->next)
+                               writestruct(wd, DATA, "NodeImageLayer", 1, 
sock->storage);
+               }
        }
        
        for (link= ntree->links.first; link; link= link->next)

Modified: trunk/blender/source/blender/editors/space_node/drawnode.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/drawnode.c  2012-05-11 
08:05:47 UTC (rev 46541)
+++ trunk/blender/source/blender/editors/space_node/drawnode.c  2012-05-11 
08:06:01 UTC (rev 46542)
@@ -1262,9 +1262,6 @@
        }
 
        col= uiLayoutColumn(layout, 0);
-       
-       if (RNA_enum_get(&imaptr, "type")== IMA_TYPE_MULTILAYER)
-               uiItemR(col, ptr, "layer", 0, NULL, ICON_NONE);
 }
 
 static void node_composit_buts_renderlayers(uiLayout *layout, bContext *C, 
PointerRNA *ptr)
@@ -1709,26 +1706,31 @@
                                          bNodeTree *ntree, bNode *node, 
bNodeSocket *sock,
                                          const char *UNUSED(name), int x, int 
y, int width)
 {
-       NodeImageMultiFileSocket *input = sock->storage;
        uiLayout *layout, *row;
        PointerRNA nodeptr, inputptr, imfptr;
        int imtype;
        int rx, ry;
        RNA_pointer_create(&ntree->id, &RNA_Node, node, &nodeptr);
-       RNA_pointer_create(&ntree->id, &RNA_NodeImageFileSocket, input, 
&inputptr);
        
        layout = uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, x, 
y+NODE_DY, width, 20, UI_GetStyle());
-       row = uiLayoutRow(layout, 0);           
+       row = uiLayoutRow(layout, 0);
        
-       uiItemL(row, input->path, 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) {
+       if (imtype == R_IMF_IMTYPE_MULTILAYER) {
+               NodeImageMultiFileSocket *input = sock->storage;
+               RNA_pointer_create(&ntree->id, &RNA_NodeOutputFileSlotLayer, 
input, &inputptr);
+               
+               uiItemL(row, input->layer, 0);
+       }
+       else {
+               NodeImageMultiFileSocket *input = sock->storage;
                PropertyRNA *imtype_prop;
                const char *imtype_name;
+               RNA_pointer_create(&ntree->id, &RNA_NodeOutputFileSlotFile, 
input, &inputptr);
                
+               uiItemL(row, input->path, 0);
+               
                if (!RNA_boolean_get(&inputptr, "use_node_format"))
                        imfptr = RNA_pointer_get(&inputptr, "format");
                
@@ -1767,10 +1769,18 @@
        
        uiItemO(layout, "Add Input", ICON_ZOOMIN, 
"NODE_OT_output_file_add_socket");
        
-       uiTemplateList(layout, C, ptr, "file_inputs", ptr, 
"active_input_index", NULL, 0, 0, 0);
-       
        active_index = RNA_int_get(ptr, "active_input_index");
-       RNA_property_collection_lookup_int(ptr, RNA_struct_find_property(ptr, 
"file_inputs"), active_index, &active_input_ptr);
+       /* using different collection properties if multilayer format is 
enabled */
+       if (multilayer) {
+               uiTemplateList(layout, C, ptr, "layer_slots", ptr, 
"active_input_index", NULL, 0, 0, 0);
+               RNA_property_collection_lookup_int(ptr, 
RNA_struct_find_property(ptr, "layer_slots"), active_index, &active_input_ptr);
+       }
+       else {
+               uiTemplateList(layout, C, ptr, "file_slots", ptr, 
"active_input_index", NULL, 0, 0, 0);
+               RNA_property_collection_lookup_int(ptr, 
RNA_struct_find_property(ptr, "file_slots"), active_index, &active_input_ptr);
+       }
+       /* XXX collection lookup does not return the ID part of the pointer, 
setting this manually here */
+       active_input_ptr.id.data = ptr->id.data;
        
        row = uiLayoutRow(layout, 1);
        op_ptr = uiItemFullO(row, "NODE_OT_output_file_move_active_socket", "", 
ICON_TRIA_UP, NULL, WM_OP_INVOKE_DEFAULT, UI_ITEM_O_RETURN_PROPS);
@@ -1779,19 +1789,25 @@
        RNA_enum_set(&op_ptr, "direction", 2);
        
        if (active_input_ptr.data) {
-               uiLayout *row, *col;
-               
-               col = uiLayoutColumn(layout, 1);
-               if (multilayer)
-                       uiItemL(col, "Layer Name:", 0);
-               else
+               if (multilayer) {
+                       uiLayout *row, *col;
+                       col = uiLayoutColumn(layout, 1);
+                       
+                       uiItemL(col, "Layer:", 0);
+                       row = uiLayoutRow(col, 0);
+                       uiItemR(row, &active_input_ptr, "name", 0, "", 0);
+                       uiItemFullO(row, 
"NODE_OT_output_file_remove_active_socket", "", ICON_X, NULL, 
WM_OP_EXEC_DEFAULT, UI_ITEM_R_ICON_ONLY);
+               }
+               else {
+                       uiLayout *row, *col;
+                       col = uiLayoutColumn(layout, 1);
+                       
                        uiItemL(col, "File Path:", 0);
-               row = uiLayoutRow(col, 0);
-               uiItemR(row, &active_input_ptr, "path", 0, "", 0);
-               uiItemFullO(row, "NODE_OT_output_file_remove_active_socket", 
"", ICON_X, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_R_ICON_ONLY);
-               
-               /* in multilayer format all socket format details are ignored */
-               if (!multilayer) {
+                       row = uiLayoutRow(col, 0);
+                       uiItemR(row, &active_input_ptr, "path", 0, "", 0);
+                       uiItemFullO(row, 
"NODE_OT_output_file_remove_active_socket", "", ICON_X, NULL, 
WM_OP_EXEC_DEFAULT, UI_ITEM_R_ICON_ONLY);
+                       
+                       /* format details for individual files */
                        imfptr = RNA_pointer_get(&active_input_ptr, "format");
                        
                        col = uiLayoutColumn(layout, 1);

Modified: trunk/blender/source/blender/imbuf/intern/openexr/openexr_api.cpp
===================================================================
--- trunk/blender/source/blender/imbuf/intern/openexr/openexr_api.cpp   
2012-05-11 08:05:47 UTC (rev 46541)
+++ trunk/blender/source/blender/imbuf/intern/openexr/openexr_api.cpp   
2012-05-11 08:06:01 UTC (rev 46542)

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to